ZGlmZiAtLWdpdCBhL1JFQURNRS5nb29nbGUubWQgYi9SRUFETUUuZ29vZ2xlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjdiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuZ29vZ2xlLm1kCkBAIC0wLDAgKzEsNyBAQAorVGhpcyBpcyBHTVAsIHRoZSBHTlUgTXVsdGlwbGUgUHJlY2lzaW9uIEFyaXRobWV0aWMgTGlicmFyeS4gSXQgaXMgdGhlIHByaW1hcnkKK2JpZ251bSBsaWJyYXJ5IHVzZWQgaW4gZ29vZ2xlMyBDKysuCisKK0dvb2dsZSB0b29scyBnZW5lcmFsbHkgdHJlYXQgR01QIGFzIGlmIGl0IHdlcmUgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHUEwuCitIb3dldmVyLCBpdCBpcyBhY3R1YWxseSBsaWNlbnNlZCB1bmRlciB0aGUgTEdQTC0tb25seSBpdHMgdW5pdCB0ZXN0cyBhcmUgY292ZXJlZAorYnkgdGhlIEdQTC4gWW91IG1heSB0aHVzIHVzZSBHTVAgaW4geW91ciBwcm9kdWN0IGp1c3QgYXMgeW91IHdvdWxkIHVzZSBhbnkgb3RoZXIKK0xHUEwnZCBsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvYXNsLmggYi9hc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRlZWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXNsLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGFzbC5oIC0tIGFydGlmaWNpYWxseSBzbWFsbCBsaW1icyBzdXBwb3J0IGJ5IG1lYW5zIG9mIEMrKyBvcGVyYXRvcgorICAgb3ZlcmxvYWRpbmcuCisKK0NvcHlyaWdodCAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorLy8gI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2lmbmRlZiBHTVBfQVNTRVJUX0FMV0FZUworI2RlZmluZSBHTVBfQVNTRVJUX0FMV0FZUyhjYykgZG8ge2lmICghKGNjKSkgYWJvcnQoKTt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8vIE1pc3Npbmc6IHBvc3QrKyBwb3N0LS0gKytwcmUgLS1wcmVjIGJvb2wobGltYikgIWxpbWIKKworI2lmbmRlZiBHTVBfTElNQl9CSVRTCisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgNAorI2VuZGlmCisKKyNkZWZpbmUgR01QX05VTUJfTUFTSyAoMiAqICgxdWwgPDwgKEdNUF9MSU1CX0JJVFMgLSAxKSkgLSAxKQorCisjZGVmaW5lIEJJTk9QX01BU0sob3AsIHR5cGUpCQkJCVwKKyAgbXBfbGltYl90JiBvcGVyYXRvciBvcCMjPShjb25zdCB0eXBlJiByaHMpIHsJCVwKKyAgICBsaW1ibyA9IChsaW1ibyBvcCByaHMubGltYm8pICYgR01QX05VTUJfTUFTSzsJXAorICAgIHJldHVybiAqdGhpczsJCQkJCVwKKyAgfQorI2RlZmluZSBCSU5PUF9OT01BU0sob3AsIHR5cGUpCQkJCVwKKyAgbXBfbGltYl90JiBvcGVyYXRvciBvcCMjPShjb25zdCB0eXBlJiByaHMpIHsJCVwKKyAgICBsaW1ibyA9IGxpbWJvIG9wIHJocy5saW1ibzsJCQkJXAorICAgIHJldHVybiAqdGhpczsJCQkJCVwKKyAgfQorCit0eXBlZGVmIHN0ZDo6Y29uZGl0aW9uYWw8KEdNUF9OVU1CX01BU0sgPD0gMHhmZmZmKSwgdWludDE2X3QsIHVpbnQzMl90ID46OnR5cGUgdHlwZTI0OwordHlwZWRlZiBzdGQ6OmNvbmRpdGlvbmFsPChHTVBfTlVNQl9NQVNLIDw9IDB4ZmYpLCB1aW50OF90LCB0eXBlMjQ+Ojp0eXBlIG10eXBlOworCitjbGFzcyBtcF9saW1iX3QgeworcHVibGljOgorICBtcF9saW1iX3QoKSB7fQkvLyBwdXQgcmFuZG9tIGdhcmJhZ2UgaW4gbGltYm8/CisgIG1wX2xpbWJfdChjb25zdCB1bnNpZ25lZCBpbnQgcmhzKSB7IGxpbWJvID0gcmhzICYgR01QX05VTUJfTUFTSzsgfQorICAvLyBtcF9saW1iX3QoY29uc3QgbXBfbGltYl90JiByaHMpIHsgbGltYm8gPSByaHMubGltYm87IH0gLy8gQ2F1c2VzIGhhdm9jCisgIEJJTk9QX01BU0soKywgbXBfbGltYl90KQorICBCSU5PUF9NQVNLKC0sIG1wX2xpbWJfdCkKKyAgQklOT1BfTUFTSygqLCBtcF9saW1iX3QpCisgIEJJTk9QX05PTUFTSygvLCBtcF9saW1iX3QpCisgIEJJTk9QX05PTUFTSyglLCBtcF9saW1iX3QpCisgIEJJTk9QX05PTUFTSygmLCBtcF9saW1iX3QpCisgIEJJTk9QX05PTUFTSyh8LCBtcF9saW1iX3QpCisgIEJJTk9QX05PTUFTSyheLCBtcF9saW1iX3QpCisgIG1wX2xpbWJfdCYgb3BlcmF0b3I8PD0oY29uc3QgdW5zaWduZWQgaW50IHJocykgeworICAgIEdNUF9BU1NFUlRfQUxXQVlTIChyaHMgPCBHTVBfTElNQl9CSVRTKTsKKyAgICBsaW1ibyA9IChsaW1ibyA8PCByaHMpICYgR01QX05VTUJfTUFTSzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgbXBfbGltYl90JiBvcGVyYXRvcj4+PShjb25zdCB1bnNpZ25lZCBpbnQgcmhzKSB7CisgICAgR01QX0FTU0VSVF9BTFdBWVMgKHJocyA8IEdNUF9MSU1CX0JJVFMpOworICAgIGxpbWJvID0gbGltYm8gPj4gcmhzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBtcF9saW1iX3Qgb3BlcmF0b3ItKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxtcF9saW1iX3Q+KCgtbGltYm8pICYgR01QX05VTUJfTUFTSyk7CisgICAgLy8gbXBfbGltYl90IHg7ICB4LmxpbWJvID0gKC1saW1ibykgJiBHTVBfTlVNQl9NQVNLOyAgcmV0dXJuIHg7CisgIH0KKyAgbXBfbGltYl90IG9wZXJhdG9yfigpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bXBfbGltYl90PigofmxpbWJvKSAmIEdNUF9OVU1CX01BU0spOworICAgIC8vIG1wX2xpbWJfdCB4OyAgeC5saW1ibyA9ICh+bGltYm8pICYgR01QX05VTUJfTUFTSzsgIHJldHVybiB4OworICB9CisgIG9wZXJhdG9yIHVuc2lnbmVkIGludCgpIGNvbnN0IHsgcmV0dXJuIGxpbWJvOyB9CisgIG9wZXJhdG9yICAgICAgICAgIGludCgpIGNvbnN0IHsgcmV0dXJuIGxpbWJvOyB9CisKKyNkZWZpbmUgUkVMT1Aob3ApCQkJCQkJCVwKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3Igb3AoY29uc3QgbXBfbGltYl90IHJocykgewkJCVwKKyAgICByZXR1cm4gbGltYm8gb3AgcmhzLmxpbWJvOwkJCQkJCVwKKyAgfQorICBSRUxPUCg9PSkKKyAgUkVMT1AoIT0pCisgIFJFTE9QKDwpCisgIFJFTE9QKD4pCisgIFJFTE9QKDw9KQorICBSRUxPUCg+PSkKKworcHJpdmF0ZToKKyAgbXR5cGUgbGltYm87Cit9OworCisjZGVmaW5lIEJJTk9QMihvcCwgdHlwZSkJCQkJCQlcCisgIGlubGluZSBtcF9saW1iX3Qgb3BlcmF0b3Igb3AobXBfbGltYl90IGxocywgY29uc3QgdHlwZSYgcmhzKSB7CVwKKyAgICBsaHMgb3AjIz0gcmhzOwkJCQkJCQlcCisgICAgcmV0dXJuIGxoczsJCQkJCQkJCVwKKyAgfQorCitCSU5PUDIoKywgbXBfbGltYl90KQorQklOT1AyKC0sIG1wX2xpbWJfdCkKK0JJTk9QMigqLCBtcF9saW1iX3QpCitCSU5PUDIoLywgbXBfbGltYl90KQorQklOT1AyKCUsIG1wX2xpbWJfdCkKK0JJTk9QMigmLCBtcF9saW1iX3QpCitCSU5PUDIofCwgbXBfbGltYl90KQorQklOT1AyKF4sIG1wX2xpbWJfdCkKK0JJTk9QMig8PCwgdW5zaWduZWQgaW50KQorQklOT1AyKD4+LCB1bnNpZ25lZCBpbnQpCmRpZmYgLS1naXQgYS9hc3NlcnQuYyBiL2Fzc2VydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjk1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hc3NlcnQuYwpAQCAtMCwwICsxLDU4IEBACisvKiBHTVAgYXNzZXJ0aW9uIGZhaWx1cmUgaGFuZGxlci4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK19fZ21wX2Fzc2VydF9oZWFkZXIgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW51bSkKK3sKKyAgaWYgKGZpbGVuYW1lICE9IE5VTEwgJiYgZmlsZW5hbWVbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczoiLCBmaWxlbmFtZSk7CisgICAgICBpZiAobGluZW51bSAhPSAtMSkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICIsIGxpbmVudW0pOworICAgIH0KK30KKwordm9pZAorX19nbXBfYXNzZXJ0X2ZhaWwgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW51bSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHByKQoreworICBfX2dtcF9hc3NlcnRfaGVhZGVyIChmaWxlbmFtZSwgbGluZW51bSk7CisgIGZwcmludGYgKHN0ZGVyciwgIkdOVSBNUCBhc3NlcnRpb24gZmFpbGVkOiAlc1xuIiwgZXhwcik7CisgIGFib3J0KCk7Cit9CmRpZmYgLS1naXQgYS9ib290c3RyYXAuYyBiL2Jvb3RzdHJhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWI0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9ib290c3RyYXAuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogRnVuY3Rpb25zIG5lZWRlZCBmb3IgYm9vdHN0cmFwcGluZyB0aGUgZ21wIGJ1aWxkLCBiYXNlZCBvbiBtaW5pLWdtcC4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQsIDIwMTEsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2RlZmluZSBNSU5JX0dNUF9ET05UX1VTRV9GTE9BVF9IIDEKKyNpbmNsdWRlICJtaW5pLWdtcC9taW5pLWdtcC5jIgorCisjZGVmaW5lIE1JTihsLG8pICgobCkgPCAobykgPyAobCkgOiAobykpCisjZGVmaW5lIFBUUih4KSAgICgoeCktPl9tcF9kKQorI2RlZmluZSBTSVooeCkgICAoKHgpLT5fbXBfc2l6ZSkKKworI2RlZmluZSB4bWFsbG9jIGdtcF9kZWZhdWx0X2FsbG9jCisKK2ludAoraXNwcmltZSAodW5zaWduZWQgbG9uZyBpbnQgdCkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcSwgciwgZDsKKworICBpZiAodCA8IDMyKQorICAgIHJldHVybiAoMHhhMDhhMjhhY1VMID4+IHQpICYgMTsKKyAgaWYgKCh0ICYgMSkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAodCAlIDMgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHQgJSA1ID09IDApCisgICAgcmV0dXJuIDA7CisgIGlmICh0ICUgNyA9PSAwKQorICAgIHJldHVybiAwOworCisgIGZvciAoZCA9IDExOzspCisgICAgeworICAgICAgcSA9IHQgLyBkOworICAgICAgciA9IHQgLSBxICogZDsKKyAgICAgIGlmIChxIDwgZCkKKwlyZXR1cm4gMTsKKyAgICAgIGlmIChyID09IDApCisJYnJlYWs7CisgICAgICBkICs9IDI7CisgICAgICBxID0gdCAvIGQ7CisgICAgICByID0gdCAtIHEgKiBkOworICAgICAgaWYgKHEgPCBkKQorCXJldHVybiAxOworICAgICAgaWYgKHIgPT0gMCkKKwlicmVhazsKKyAgICAgIGQgKz0gNDsKKyAgICB9CisgIHJldHVybiAwOworfQorCitpbnQKK2xvZzJfY2VpbCAoaW50IG4pCit7CisgIGludCAgZTsKKyAgYXNzZXJ0IChuID49IDEpOworICBmb3IgKGUgPSAwOyA7IGUrKykKKyAgICBpZiAoKDEgPDwgZSkgPj0gbikKKyAgICAgIGJyZWFrOworICByZXR1cm4gZTsKK30KKworLyogU2V0IGludiB0byB0aGUgaW52ZXJzZSBvZiBkLCBpbiB0aGUgc3R5bGUgb2YgaW52ZXJ0X2xpbWIsIGllLiBmb3IKKyAgIHVkaXZfcXJubmRfcHJlaW52LiAgKi8KK3ZvaWQKK21wel9wcmVpbnZfaW52ZXJ0IChtcHpfdCBpbnYsIGNvbnN0IG1wel90IGQsIGludCBudW1iX2JpdHMpCit7CisgIG1wel90ICB0OworICBpbnQgICAgbm9ybTsKKyAgYXNzZXJ0IChTSVooZCkgPiAwKTsKKworICBub3JtID0gbnVtYl9iaXRzIC0gbXB6X3NpemVpbmJhc2UgKGQsIDIpOworICBhc3NlcnQgKG5vcm0gPj0gMCk7CisgIG1wel9pbml0ICh0KTsKKyAgbXB6X3NldGJpdCAodCwgMipudW1iX2JpdHMgLSBub3JtKTsKKyAgbXB6X3RkaXZfcSAoaW52LCB0LCBkKTsKKyAgbXB6X2NscmJpdCAoaW52LCBudW1iX2JpdHMpOworCisgIG1wel9jbGVhciAodCk7Cit9CisKKy8qIENhbGN1bGF0ZSByIHNhdGlzZnlpbmcgciphID09IDEgbW9kIDJebi4gKi8KK3ZvaWQKK21wel9pbnZlcnRfMmV4cCAobXB6X3QgciwgY29uc3QgbXB6X3QgYSwgdW5zaWduZWQgbG9uZyBuKQoreworICBtcHpfdCAgbW9kOworCisgIGFzc2VydCAobXB6X29kZF9wIChhKSk7CisKKyAgbXB6X2luaXQgKG1vZCk7CisgIG1wel9zZXRiaXQgKG1vZCwgbik7CisKKyAgbXB6X2ludmVydCAociwgYSwgbW9kKTsKKworICBtcHpfY2xlYXIgKG1vZCk7Cit9CisKKy8qIENhbGN1bGF0ZSBpbnYgc2F0aXNmeWluZyByKmEgPT0gMSBtb2QgMl5uLiAqLwordm9pZAorbXB6X2ludmVydF91aV8yZXhwIChtcHpfdCByLCB1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgbXB6X3QgIGF6OworCisgIG1wel9pbml0X3NldF91aSAoYXosIGEpOworICBtcHpfaW52ZXJ0XzJleHAgKHIsIGF6LCBuKTsKKyAgbXB6X2NsZWFyIChheik7Cit9CmRpZmYgLS1naXQgYS9idWlsZF9kZWZzLmJ6bCBiL2J1aWxkX2RlZnMuYnpsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWE1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZF9kZWZzLmJ6bApAQCAtMCwwICsxLDE0NCBAQAorIiIiQnVpbGQgZXh0ZW5zaW9ucyBmb3IgLy90aGlyZF9wYXJ0eS9nbXAuCisKK0FyY2hpdGVjdHVyZXM6IFNldmVyYWwgbWFjcm9zIGluIHRoaXMgZmlsZSByZWZlciB0byAiYXJjaGl0ZWN0dXJlIG5hbWVzIi4gVGhlc2UKK2FyZSB0aGUgbmFtZXMgZm9yIGFyY2hpdGVjdHVyZXMgdXNlZCBieSBHTVAsIG5vdCB0aGUgbmFtZXMgZm9yIGFyY2hpdGVjdHVyZXMKK3VzZWQgYXQgR29vZ2xlLiBBdmFpbGFibGUgbmFtZXMgYXJlIGRlZmluZWQgYnkgZGlyZWN0b3JpZXMgaW4KK3RoaXJkX3BhcnR5L2dtcC9tcG4uCisiIiIKKworZGVmIGdtcF9hc3NlbWJseShzcmMsIG91dCwgYXJjaGl0ZWN0dXJlcywgb3BlcmF0aW9uID0gTm9uZSwgaW5jbHVkZWRfc3JjcyA9IFtdKToKKyAgICAiIiJDb252ZXJ0cyBhIEdNUCAuYXNtIGZpbGUgaW50byBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgLnMgZmlsZXMuCisKKyAgICBHTVAncyBhc3NlbWJseSBjb2RlIGlzIG5vdCB3cml0dGVuIGRpcmVjdGx5IGluIGFzc2VtYmx5IChmaWxlcyBlbmRpbmcgaW4gLnMpCisgICAgYnV0IHJhdGhlciBpbiBhIHNsaWdodGx5IGhpZ2hlci1sZXZlbCBtaXh0dXJlIG9mIGFzc2VtYmx5IGFuZCBNNCAoZmlsZXMKKyAgICBlbmRpbmcgaW4gLmFzbSkuIFRoZSBNNCBpcyByZWFsbHkganVzdCBmb3IgY29uZmlndXJhdGlvbiB0d2Vha3MgYW5kIHNvbWUKKyAgICBxdWFsaXR5LW9mLWxpZmUgaW1wcm92ZW1lbnRzOyBpdCBkb2Vzbid0IG1ha2UgdGhlIGFzc2VtYmx5IGFueSBsZXNzCisgICAgYXJjaGl0ZWN0dXJlLXNwZWNpZmljLiBUaGlzIFN0YXJsYXJrIG1hY3JvIGNyZWF0ZXMgZ2VucnVsZXMgdG8gcHJlcHJvY2VzcworICAgIHRoZSAuYXNtIGZpbGVzIHdpdGggTTQuCisKKyAgICBBcmdzOgorICAgICAgc3JjOiBUaGUgcGF0aCB0byB0aGUgaW5wdXQgLmFzbSBmaWxlLgorICAgICAgb3V0OiBUaGUgcGF0aCB0byB0aGUgb3V0cHV0IC5zIGZpbGUuCisgICAgICBhcmNoaXRlY3R1cmVzOiBUaGUgbGlzdCBvZiBhcmNoaXRlY3R1cmUgbmFtZXMgKHN0cmluZ3MpIGZvciB3aGljaCAucyBmaWxlcworICAgICAgICBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICAgICAgb3BlcmF0aW9uOiBPcHRpb25hbC4gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlIC5hc20gZmlsZS4gSWYKKyAgICAgICAgc3BlY2lmaWVkLCBNNCB3aWxsIGJlIGludm9rZWQgd2l0aCBgLURPUEVSQVRJT05fe29wZXJhdGlvbn1gLiAoVGhpcyBpcworICAgICAgICBuZWNlc3NhcnkgYmVjYXVzZSBHTVAgY2FuIGdlbmVyYXRlIG11bHRpcGxlIGZ1bmN0aW9ucyBmcm9tIHRoZSBzYW1lCisgICAgICAgIGFzc2VtYmx5IHNrZWxldG9uLikKKyAgICAgIGluY2x1ZGVkX3NyY3M6IE9wdGlvbmFsLiBBIGxpc3Qgb2YgYWxsIC5hc20gZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgKHZpYQorICAgICAgICBNNCBpbmNsdXNpb24pIGJ5IHRoZSAuYXNtIGZpbGUgaW4gYHNyY2AuIEZpbGVzIGluIHRoaXMgbGlzdCBhcmUgY29waWVkCisgICAgICAgIGludG8gdGhlIGdlbnJ1bGUgc2FuZGJveCBidXQgYXJlIG5vdCBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0byBNNC4KKyAgICAgICAgU3BlY2lmeSB0aGlzIGlmIC5zIGdlbmVyYXRpb24gZmFpbHMgd2l0aCBNNCBjb21wbGFpbmluZyBhYm91dCBtaXNzaW5nCisgICAgICAgIGZpbGVzLgorCisgICAgRXhhbXBsZToKKyAgICAgIGdtcF9hc3NlbWJseSgKKyAgICAgICAgICBzcmMgPSAibXBuL3thcmNoaXRlY3R1cmV9L2FvcnNfbi5hc20iLAorICAgICAgICAgIG91dCA9ICJtcG4ve2FyY2hpdGVjdHVyZX0vYWRkX24ucyIsCisgICAgICAgICAgYXJjaGl0ZWN0dXJlcyA9IFsKKyAgICAgICAgICAgICAgImFybSIsCisgICAgICAgICAgICAgICJhcm02NCIsCisgICAgICAgICAgICAgICJ4ODYiLAorICAgICAgICAgICAgICAieDg2XzY0IiwKKyAgICAgICAgICBdLAorICAgICAgICAgIG9wZXJhdGlvbiA9ICJhZGRfbiIsCisgICAgICApCisgICAgIiIiCisgICAgZm9yIGFyY2hpdGVjdHVyZSBpbiBhcmNoaXRlY3R1cmVzOgorICAgICAgICBmdWxsX3NyYyA9IHNyYy5mb3JtYXQoYXJjaGl0ZWN0dXJlID0gYXJjaGl0ZWN0dXJlKQorICAgICAgICBuYXRpdmUuZ2VucnVsZSgKKyAgICAgICAgICAgIG5hbWUgPSBvdXQuZm9ybWF0KGFyY2hpdGVjdHVyZSA9IGFyY2hpdGVjdHVyZSkucmVwbGFjZSgiLyIsICJfIikucmVwbGFjZSgiLiIsICJfIiksCisgICAgICAgICAgICBzcmNzID0gWworICAgICAgICAgICAgICAgIGZ1bGxfc3JjLAorICAgICAgICAgICAgICAgICJnb29nbGUtY29uZmlnLSVzL2NvbmZpZy5tNCIgJSBhcmNoaXRlY3R1cmUsCisgICAgICAgICAgICAgICAgIm1wbi9hc20tZGVmcy5tNCIsCisgICAgICAgICAgICAgICAgIm1wbi8lcy8lcy1kZWZzLm00IiAlIChhcmNoaXRlY3R1cmUsIGFyY2hpdGVjdHVyZSksCisgICAgICAgICAgICBdICsgW3NyYy5mb3JtYXQoYXJjaGl0ZWN0dXJlID0gYXJjaGl0ZWN0dXJlKSBmb3Igc3JjIGluIGluY2x1ZGVkX3NyY3NdLAorICAgICAgICAgICAgb3V0cyA9IFtvdXQuZm9ybWF0KGFyY2hpdGVjdHVyZSA9IGFyY2hpdGVjdHVyZSldLAorICAgICAgICAgICAgdG9vbHMgPSBbIi8vdGhpcmRfcGFydHkvbTQiXSwKKyAgICAgICAgICAgIGNtZCA9ICIiIgorICAgICAgICAgICAgICAgICQobG9jYXRpb24gLy90aGlyZF9wYXJ0eS9tNCkgLURIQVZFX0NPTkZJR19IIC1EX19HTVBfV0lUSElOX0dNUCB7b3BlcmF0aW9ufSAtRFBJQyAtSSAkKFJVTEVESVIpL21wbi97YXJjaGl0ZWN0dXJlfSAtSSB0aGlyZF9wYXJ0eS9nbXAvbXBuL3thcmNoaXRlY3R1cmV9IC1JICQoUlVMRURJUikvbXBuIC1JIHRoaXJkX3BhcnR5L2dtcC9tcG4gLUkgJChSVUxFRElSKS9nb29nbGUtY29uZmlnLXthcmNoaXRlY3R1cmV9IHtmdWxsX3NyY30gPiRACisgICAgICAgICAgICAiIiIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGFyY2hpdGVjdHVyZSA9IGFyY2hpdGVjdHVyZSwKKyAgICAgICAgICAgICAgICBmdWxsX3NyYyA9IGZ1bGxfc3JjLAorICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICItRE9QRVJBVElPTl8iICsgb3BlcmF0aW9uIGlmIG9wZXJhdGlvbiBlbHNlICIiLAorICAgICAgICAgICAgKSArIHNlbGVjdCh7CisgICAgICAgICAgICAgICAgIyBBZGQgbm9leGVjIHN0YWNrIG5vdGUgdG8gdGhlIGdlbmVyYXRlZCBhc3NlbWJseQorICAgICAgICAgICAgICAgICIvL3RoaXJkX3BhcnR5L2JhemVsX3BsYXRmb3Jtcy9jcHU6YXJtdjciOiAiIiJwcmludGYgJ1x0LnNlY3Rpb25cdC5ub3RlLkdOVS1zdGFjaywiIiwlJXByb2diaXRzXG4nID4+JEAiIiIsCisgICAgICAgICAgICAgICAgIi8vY29uZGl0aW9uczpkZWZhdWx0IjogIiIicHJpbnRmICdcdC5zZWN0aW9uXHQubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzXG4nID4+JEAiIiIsCisgICAgICAgICAgICB9KSwKKyAgICAgICAgKQorCitkZWYgZ21wX21wbl9hc3NlbWJseShzcmMsIG91dCwgYXJjaGl0ZWN0dXJlcywgaW5jbHVkZWRfc3JjcyA9IFtdKToKKyAgICAiIiJDb252ZXJ0cyBhIEdNUCBNUE4gLmFzbSBmaWxlIGludG8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIC5zIGZpbGVzLgorCisgICAgTVBOIGlzIEdNUCdzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBsYXllciBhbmQgd2hlcmUgbW9zdCBvZiBpdHMgYXNzZW1ibHkgY29kZQorICAgIGV4aXN0cy4gVGhpcyBtYWNybyBpcyBhIGNvbnZlbmllbmNlIG1hY3JvIGZvciBpbnZva2luZyBgZ21wX2Fzc2VtYmx5YCBvbiBNUE4KKyAgICBmaWxlcy4gSXQgYWxsb3dzIHlvdSB0byBzaW1wbHkgc3BlY2lmeSB0aGUgYmFzZW5hbWVzIG9mIHRoZSAuYXNtIGFuZCAucworICAgIGZpbGVzLCBhbmQgaXQgaW5mZXJzIHRoZSBkZXNpcmVkIG9wZXJhdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZSBuYW1lLgorCisgICAgQXJnczoKKyAgICAgIHNyYzogVGhlIGJhc2VuYW1lIG9mIHRoZSBpbnB1dCAuYXNtIGZpbGUgKGluc2lkZSBgbXBuL3thcmNoaXRlY3R1cmV9YCkuCisgICAgICBvdXQ6IFRoZSBiYXNlbmFtZSBvZiB0aGUgb3V0cHV0IC5zIGZpbGUgKGluc2lkZSBgbXBuL3thcmNoaXRlY3R1cmV9YCkuCisgICAgICBhcmNoaXRlY3R1cmVzOiBUaGUgbGlzdCBvZiBhcmNoaXRlY3R1cmUgbmFtZXMgKHN0cmluZ3MpIGZvciB3aGljaCAucyBmaWxlcworICAgICAgICBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICAgICAgaW5jbHVkZWRfc3JjczogT3B0aW9uYWwuIEJhc2VuYW1lcyBvZiBhbGwgLmFzbSBmaWxlcyAoaW5zaWRlCisgICAgICAgIGBtcG4ve2FyY2hpdGVjdHVyZX1gKSB0aGF0IGFyZSBpbmNsdWRlZCAodmlhIE00IGluY2x1c2lvbikgYnkgdGhlIC5hc20KKyAgICAgICAgZmlsZSBpbiBgc3JjYC4gRmlsZXMgaW4gdGhpcyBsaXN0IGFyZSBjb3BpZWQgaW50byB0aGUgZ2VucnVsZSBzYW5kYm94CisgICAgICAgIGJ1dCBhcmUgbm90IHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIE00LiBTcGVjaWZ5IHRoaXMgaWYgLnMKKyAgICAgICAgZ2VuZXJhdGlvbiBmYWlscyB3aXRoIE00IGNvbXBsYWluaW5nIGFib3V0IG1pc3NpbmcgZmlsZXMuCisKKyAgICBFeGFtcGxlOgorICAgICAgZ21wX21wbl9hc3NlbWJseSgKKyAgICAgICAgICBzcmMgPSAiYW9yc19uLmFzbSIsCisgICAgICAgICAgb3V0ID0gImFkZF9uLnMiLAorICAgICAgICAgIGFyY2hpdGVjdHVyZXMgPSBbCisgICAgICAgICAgICAgICJhcm0iLAorICAgICAgICAgICAgICAiYXJtNjQiLAorICAgICAgICAgICAgICAieDg2IiwKKyAgICAgICAgICAgICAgIng4Nl82NCIsCisgICAgICAgICAgXSwKKyAgICAgICkKKyAgICAiIiIKKyAgICBnbXBfYXNzZW1ibHkoCisgICAgICAgIHNyYyA9ICJtcG4ve2FyY2hpdGVjdHVyZX0vJXMiICUgc3JjLAorICAgICAgICBvdXQgPSAibXBuL3thcmNoaXRlY3R1cmV9LyVzIiAlIG91dCwKKyAgICAgICAgYXJjaGl0ZWN0dXJlcyA9IGFyY2hpdGVjdHVyZXMsCisgICAgICAgIG9wZXJhdGlvbiA9IG91dFs6b3V0LnJmaW5kKCIuIildLAorICAgICAgICBpbmNsdWRlZF9zcmNzID0gWyJtcG4ve2FyY2hpdGVjdHVyZX0vJXMiICUgc3JjIGZvciBzcmMgaW4gaW5jbHVkZWRfc3Jjc10sCisgICAgKQorCitkZWYgZ21wX21wbl9saWJyYXJ5KG5hbWUsIHNyY3MsIG9wZXJhdGlvbiwgZGVwcyA9IFtdKToKKyAgICAiIiJSdW5zIHRoZSBDKysgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYSBHTVAgTVBOIG9iamVjdC4KKworICAgIE1QTiBpcyBHTVAncyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgbGF5ZXIuIE1QTiBsaWJyYXJpZXMgcmVxdWlyZSBzb21lIHNwZWNpYWwKKyAgICBjb21waWxlciBmbGFnczsgdGhpcyBtYWNybyB3cmFwcyBgY2NfbGlicmFyeWAgdG8gYWRkIHRoZW0uIFVzZSBpdCBpbnN0ZWFkIG9mCisgICAgYGNjX2xpYnJhcnlgIHRvIGNvbXBpbGUgbGlicmFyaWVzIGluc2lkZSB0aGlyZF9wYXJ0eS9nbXAvbXBuLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgdGFyZ2V0LgorICAgICAgc3JjczogVGhlIGxpc3Qgb2YgQyBhbmQgYXNzZW1ibHkgZmlsZXMgdGhhdCBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgbGlicmFyeSB0YXJnZXQuCisgICAgICBvcGVyYXRpb246IFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBDIG9yIGFzc2VtYmx5IGZpbGUuIFRoZQorICAgICAgICBDIHByZXByb2Nlc3NvciB3aWxsIGJlIGludm9rZWQgd2l0aCBgLURPUEVSQVRJT05fe29wZXJhdGlvbn1gLiAoVGhpcyBpcworICAgICAgICBuZWNlc3NhcnkgYmVjYXVzZSBHTVAgY2FuIGdlbmVyYXRlIG11bHRpcGxlIGZ1bmN0aW9ucyBmcm9tIHRoZSBzYW1lCisgICAgICAgIHNrZWxldG9uLikKKyAgICAgIGRlcHM6IFRoZSBsaXN0IG9mIG90aGVyIGxpYnJhcmllcyB0aGF0IHRoZSBsaWJyYXJ5IHRhcmdldCBkZXBlbmRzIG9uLgorICAgICIiIgorICAgIG5hdGl2ZS5jY19saWJyYXJ5KAorICAgICAgICBuYW1lID0gbmFtZSwKKyAgICAgICAgc3JjcyA9IFsKKyAgICAgICAgICAgICJsb25nbG9uZy5oIiwKKyAgICAgICAgXSArIHNyY3MsCisgICAgICAgIGxvY2FsX2RlZmluZXMgPSBbCisgICAgICAgICAgICAiSEFWRV9DT05GSUdfSCIsCisgICAgICAgICAgICAiX19HTVBfV0lUSElOX0dNUCIsCisgICAgICAgICAgICAiT1BFUkFUSU9OXyIgKyBvcGVyYXRpb24sCisgICAgICAgIF0sCisgICAgICAgIGRlcHMgPSBbIjpnbXAtc3RhZ2UyIl0gKyBkZXBzLAorICAgICAgICBpbmNsdWRlcyA9IFsKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIm1wbiIsCisgICAgICAgIF0sCisgICAgICAgIGNvcHRzID0gWyItdyJdLAorICAgICkKZGlmZiAtLWdpdCBhL2NvbXBhdC5jIGIvY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNDRjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIE9sZCBmdW5jdGlvbiBlbnRyeXBvaW50cyByZXRhaW5lZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIG1wbl9kaXZleGFjdF9ieTMgd2FzIGEgZnVuY3Rpb24gaW4gZ21wIDMuMC4xLCBidXQgYXMgb2YgZ21wIDMuMSBpdCdzIGEKKyAgIG1hY3JvIGNhbGxpbmcgbXBuX2RpdmV4YWN0X2J5M2MuICAqLworbXBfbGltYl90CitfX01QTiAoZGl2ZXhhY3RfYnkzKSAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBtcG5fZGl2ZXhhY3RfYnkzIChkc3QsIHNyYywgc2l6ZSk7Cit9CisKKworLyogbXBuX2Rpdm1vZF8xIHdhcyBhIGZ1bmN0aW9uIGluIGdtcCAzLjAuMSBhbmQgZWFybGllciwgYnV0IG1hcmtlZCBvYnNvbGV0ZQorICAgaW4gYm90aCBnbXAgMiBhbmQgMy4gIEFzIG9mIGdtcCAzLjEgaXQncyBhIG1hY3JvIGNhbGxpbmcgbXBuX2RpdnJlbV8xLiAqLworbXBfbGltYl90CitfX01QTiAoZGl2bW9kXzEpIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRpdmlzb3IpCit7CisgIHJldHVybiBtcG5fZGl2bW9kXzEgKGRzdCwgc3JjLCBzaXplLCBkaXZpc29yKTsKK30KKworCisvKiBtcHpfbGVnZW5kcmUgd2FzIGEgc2VwYXJhdGUgZnVuY3Rpb24gaW4gZ21wIDMuMS4xIGFuZCBlYXJsaWVyLCBidXQgYXMgb2YKKyAgIDQuMCBpdCdzIGEgI2RlZmluZSBhbGlhcyBmb3IgbXB6X2phY29iaS4gICovCitpbnQKK19fZ21wel9sZWdlbmRyZSAobXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGIpCit7CisgIHJldHVybiBtcHpfamFjb2JpIChhLCBiKTsKK30KZGlmZiAtLWdpdCBhL2NvbmZpZy5pbiBiL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTFlZjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmluCkBAIC0wLDAgKzEsNjcxIEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qCisKK0NvcHlyaWdodCAxOTk2LTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyovCisKKy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KKyN1bmRlZiBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKworLyogVGhlIGdtcC1tcGFyYW0uaCBmaWxlIChhIHN0cmluZykgdGhlIHR1bmUgcHJvZ3JhbSBzaG91bGQgc3VnZ2VzdCB1cGRhdGluZy4KKyAgICovCisjdW5kZWYgR01QX01QQVJBTV9IX1NVR0dFU1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BTEFSTQorCisvKiBEZWZpbmUgdG8gMSBpZiBhbGxvY2EoKSB3b3JrcyAodmlhIGdtcC1pbXBsLmgpLiAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4KKyAgICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgY29tcGlsZXIgYWNjZXB0cyBnY2Mgc3R5bGUgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSkgKi8KKyN1bmRlZiBIQVZFX0FUVFJJQlVURV9DT05TVAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgY29tcGlsZXIgYWNjZXB0cyBnY2Mgc3R5bGUgX19hdHRyaWJ1dGVfXyAoKG1hbGxvYykpICovCisjdW5kZWYgSEFWRV9BVFRSSUJVVEVfTUFMTE9DCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBjb21waWxlciBhY2NlcHRzIGdjYyBzdHlsZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoWFgpKSkKKyAgICovCisjdW5kZWYgSEFWRV9BVFRSSUJVVEVfTU9ERQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgY29tcGlsZXIgYWNjZXB0cyBnY2Mgc3R5bGUgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgKi8KKyN1bmRlZiBIQVZFX0FUVFJJQlVURV9OT1JFVFVSTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0dHJfZ2V0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0FUVFJfR0VUCisKKy8qIERlZmluZSB0byAxIGlmIHRlc3RzL2xpYnRlc3RzIGhhcyBjYWxsaW5nIGNvbnZlbnRpb25zIGNoZWNraW5nIGZvciB0aGUgQ1BVCisgICAqLworI3VuZGVmIEhBVkVfQ0FMTElOR19DT05WRU5USU9OUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNsb2NrJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NMT0NLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2xvY2tfZ2V0dGltZScgZnVuY3Rpb24gKi8KKyN1bmRlZiBIQVZFX0NMT0NLX0dFVFRJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcHV0aW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NQVVRJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBmZ2V0YycsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KKyAgICovCisjdW5kZWYgSEFWRV9ERUNMX0ZHRVRDCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZnNjYW5mJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgorICAgKi8KKyN1bmRlZiBIQVZFX0RFQ0xfRlNDQU5GCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgb3B0YXJnJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgorICAgKi8KKyN1bmRlZiBIQVZFX0RFQ0xfT1BUQVJHCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgc3lzX2Vycmxpc3QnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9TWVNfRVJSTElTVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHN5c19uZXJyJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfU1lTX05FUlIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGB1bmdldGMnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworI3VuZGVmIEhBVkVfREVDTF9VTkdFVEMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGB2ZnByaW50ZicsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1ZGUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byAxIGZvciB0aGUgZm9ybWF0IG9mIGEgYGRvdWJsZScuCisgICBJZiB5b3VyIGZvcm1hdCBpcyBub3QgYW1vbmcgdGhlc2UgY2hvaWNlcywgb3IgeW91IGRvbid0IGtub3cgd2hhdCBpdCBpcywKKyAgIHRoZW4gbGVhdmUgYWxsIHVuZGVmaW5lZC4KKyAgIElFRUVfTElUVExFX1NXQVBQRUQgbWVhbnMgbGl0dGxlIGVuZGlhbiwgYnV0IHdpdGggdGhlIHR3byA0LWJ5dGUgaGFsdmVzCisgICBzd2FwcGVkLCBhcyB1c2VkIGJ5IEFSTSBDUFVzIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4gICovCisjdW5kZWYgSEFWRV9ET1VCTEVfSUVFRV9CSUdfRU5ESUFOCisjdW5kZWYgSEFWRV9ET1VCTEVfSUVFRV9MSVRUTEVfRU5ESUFOCisjdW5kZWYgSEFWRV9ET1VCTEVfSUVFRV9MSVRUTEVfU1dBUFBFRAorI3VuZGVmIEhBVkVfRE9VQkxFX1ZBWF9ECisjdW5kZWYgSEFWRV9ET1VCTEVfVkFYX0cKKyN1bmRlZiBIQVZFX0RPVUJMRV9DUkFZX0NGUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZsb2F0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRkxPQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBhZ2VzaXplJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cnVzYWdlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVFJVU0FHRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHN5c2luZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUU1lTSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHRpbWVvZmRheScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIGNvbXBpbGVyIGFjY2VwdHMgZ2NjIHN0eWxlIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KSkKKyAgIGFuZCBfX2F0dHJpYnV0ZV9fICgoYWxpYXMpKSAqLworI3VuZGVmIEhBVkVfSElEREVOX0FMSUFTCisKKy8qIERlZmluZSBvbmUgb2YgdGhlc2UgdG8gMSBmb3IgdGhlIGhvc3QgQ1BVIGZhbWlseS4KKyAgIElmIHlvdXIgQ1BVIGlzIG5vdCBpbiBhbnkgb2YgdGhlc2UgZmFtaWxpZXMsIGxlYXZlIGFsbCB1bmRlZmluZWQuCisgICBGb3IgYW4gQU1ENjQgY2hpcCwgZGVmaW5lICJ4ODYiIGluIEFCST0zMiwgYnV0IG5vdCBpbiBBQkk9NjQuICovCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfYWxwaGEKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9tNjhrCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXIKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2CisjdW5kZWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2XzY0CisKKy8qIERlZmluZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0byAxIGZvciB0aGUgaG9zdCBDUFUsIGFzIHBlciB0aGUgb3V0cHV0IG9mCisgICAuL2NvbmZpZy5ndWVzcy4gIElmIHlvdXIgQ1BVIGlzIG5vdCBsaXN0ZWQgaGVyZSwgbGVhdmUgYWxsIHVuZGVmaW5lZC4gICovCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9hbHBoYWV2NjcKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2FscGhhZXY2OAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfYWxwaGFldjcKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX202ODAyMAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfbTY4MDMwCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9tNjgwNDAKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX202ODA2MAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfbTY4MzYwCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9wb3dlcnBjNjA0CisjdW5kZWYgSEFWRV9IT1NUX0NQVV9wb3dlcnBjNjA0ZQorI3VuZGVmIEhBVkVfSE9TVF9DUFVfcG93ZXJwYzc1MAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfcG93ZXJwYzc0MDAKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3N1cGVyc3BhcmMKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2kzODYKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2k1ODYKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2k2ODYKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3BlbnRpdW0KKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3BlbnRpdW1tbXgKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3BlbnRpdW1wcm8KKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3BlbnRpdW0yCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9wZW50aXVtMworI3VuZGVmIEhBVkVfSE9TVF9DUFVfcGVudGl1bTQKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2NvcmUyCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9uZWhhbGVtCisjdW5kZWYgSEFWRV9IT1NUX0NQVV93ZXN0bWVyZQorI3VuZGVmIEhBVkVfSE9TVF9DUFVfc2FuZHlicmlkZ2UKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2l2eWJyaWRnZQorI3VuZGVmIEhBVkVfSE9TVF9DUFVfaGFzd2VsbAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfYnJvYWR3ZWxsCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9za3lsYWtlCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9zaWx2ZXJtb250CisjdW5kZWYgSEFWRV9IT1NUX0NQVV9nb2xkbW9udAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfdHJlbW9udAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfazgKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2sxMAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfYnVsbGRvemVyCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9waWxlZHJpdmVyCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9zdGVhbXJvbGxlcgorI3VuZGVmIEhBVkVfSE9TVF9DUFVfZXhjYXZhdG9yCisjdW5kZWYgSEFWRV9IT1NUX0NQVV96ZW4KKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX2JvYmNhdAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfamFndWFyCisjdW5kZWYgSEFWRV9IT1NUX0NQVV9zMzkwX3o5MDAKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3MzOTBfejk5MAorI3VuZGVmIEhBVkVfSE9TVF9DUFVfczM5MF96OQorI3VuZGVmIEhBVkVfSE9TVF9DUFVfczM5MF96MTAKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3MzOTBfejE5NgorI3VuZGVmIEhBVkVfSE9TVF9DUFVfczM5MF96MTMKKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3MzOTBfejE0CisjdW5kZWYgSEFWRV9IT1NUX0NQVV9zMzkwX3oxNQorCisvKiBEZWZpbmUgdG8gMSBpZmYgd2UgaGF2ZSBhIHMzOTAgd2l0aCA2NC1iaXQgcmVnaXN0ZXJzLiAgKi8KKyN1bmRlZiBIQVZFX0hPU1RfQ1BVX3MzOTBfemFyY2gKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGludG1heF90Jy4gKi8KKyN1bmRlZiBIQVZFX0lOVE1BWF9UCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBpbnRwdHJfdCcuICovCisjdW5kZWYgSEFWRV9JTlRQVFJfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVkVOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGFuZ2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MQU5HSU5GT19ICisKKy8qIERlZmluZSBvbmUgb2YgdGhlc2UgdG8gMSBmb3IgdGhlIGVuZGlhbm5lc3Mgb2YgYG1wX2xpbWJfdCcuCisgICBJZiB0aGUgZW5kaWFubmVzcyBpcyBub3QgYSBzaW1wbGUgYmlnIG9yIGxpdHRsZSwgb3IgeW91IGRvbid0IGtub3cgd2hhdAorICAgaXQgaXMsIHRoZW4gbGVhdmUgYm90aCB1bmRlZmluZWQuICovCisjdW5kZWYgSEFWRV9MSU1CX0JJR19FTkRJQU4KKyN1bmRlZiBIQVZFX0xJTUJfTElUVExFX0VORElBTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvY2FsZWNvbnYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTE9DQUxFQ09OVgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBsb25nIGRvdWJsZScuICovCisjdW5kZWYgSEFWRV9MT05HX0RPVUJMRQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgbG9uZyBsb25nJy4gKi8KKyN1bmRlZiBIQVZFX0xPTkdfTE9ORworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hY2hpbmUvaGFsX3N5c2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NQUNISU5FX0hBTF9TWVNJTkZPX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbXNldCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NRU1TRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtbWFwJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtcHJvdGVjdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9NUFJPVEVDVAorCisvKiBEZWZpbmUgdG8gMSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZm9yIHdoaWNoIGEgbmF0aXZlIChpZS4gQ1BVIHNwZWNpZmljKQorICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRpbmUgZXhpc3RzLiAgKi8KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkX25jCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FkZGFkZG11bF8xbXNiMAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uYworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25faXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uX2lwMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25jX2lwMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25jX2lwMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbmNfaXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbl9pcDIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uX2lwMgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbl9pcDIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uY19pcDIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uY19pcDIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX25jX2lwMgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRtdWxfMWMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzQKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzUKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzYKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzcKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzgKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzJzCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FuZF9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2FuZG5fbgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9iZGl2X2RibTFjCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2JkaXZfcV8xCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9jbmRfYWRkX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fY25kX3N1Yl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2NvbQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9jb3B5ZAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9jb3B5aQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9kaXZfcXJfMW5fcGkxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2Rpdl9xcl8yCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2RpdmV4YWN0XzEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fZGl2ZXhhY3RfYnkzYworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9kaXZyZW1fMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9kaXZyZW1fMWMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fZGl2cmVtXzIKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fZ2NkXzEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fZ2NkXzExCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2djZF8yMgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9oYW1kaXN0CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2ludmVydF9saW1iCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2lvcl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX2lvcm5fbgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9sc2hpZnQKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fbHNoaWZ0YworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9sc2hzdWJfbgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RfMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RfMV8xcAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RfMWMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fbW9kXzFzXzJwCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX21vZF8xc180cAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RfMzRsc3ViMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RleGFjdF8xX29kZAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tb2RleGFjdF8xY19vZGQKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fbXVsXzEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fbXVsXzFjCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF8yCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF8zCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF80CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF81CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF82CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX211bF9iYXNlY2FzZQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9tdWxsb19iYXNlY2FzZQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9uYW5kX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fbmlvcl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3BvcGNvdW50CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3ByZWludl9kaXZyZW1fMQorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9wcmVpbnZfbW9kXzEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcmVkY18xCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3JlZGNfMgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaF9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uYworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2hfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcnNoMWFkZF9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbmMKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fcnNoaWZ0CisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3NicGkxX2JkaXZfcgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9zcXJfYmFzZWNhc2UKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3FyX2RpYWdvbmFsCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3Nxcl9kaWFnX2FkZGxzaDEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3ViX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3ViX25jCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3VibHNoX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uYworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX25jCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uYworI3VuZGVmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX25faXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbl9pcDEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3VibHNoX25faXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbmNfaXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbmNfaXAxCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uY19pcDEKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fc3VibXVsXzFjCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3RhYnNlbGVjdAorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl91ZGl2X3Fybm5kCisjdW5kZWYgSEFWRV9OQVRJVkVfbXBuX3VkaXZfcXJubmRfcgorI3VuZGVmIEhBVkVfTkFUSVZFX21wbl91bXVsX3BwbW0KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5fdW11bF9wcG1tX3IKKyN1bmRlZiBIQVZFX05BVElWRV9tcG5feG9yX24KKyN1bmRlZiBIQVZFX05BVElWRV9tcG5feG5vcl9uCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmxfbGFuZ2luZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTkxfTEFOR0lORk8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05MX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvYnN0YWNrX3ZwcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfT0JTVEFDS19WUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9wZW4nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUE9QRU4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwcm9jZXNzb3JfaW5mbycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QUk9DRVNTT1JfSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiA8c3lzL3BzdGF0Lmg+IGBzdHJ1Y3QgcHN0X3Byb2Nlc3NvcicgZXhpc3RzIGFuZCBjb250YWlucworICAgYHBzcF9pdGlja3NwZXJjbGt0aWNrJy4gKi8KKyN1bmRlZiBIQVZFX1BTUF9JVElDS1NQRVJDTEtUSUNLCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHN0YXRfZ2V0cHJvY2Vzc29yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BTVEFUX0dFVFBST0NFU1NPUgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgcHRyZGlmZl90Jy4gKi8KKyN1bmRlZiBIQVZFX1BUUkRJRkZfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgcXVhZF90Jy4gKi8KKyN1bmRlZiBIQVZFX1FVQURfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJhaXNlJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1JBSVNFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhZF9yZWFsX3RpbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVBRF9SRUFMX1RJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnYWx0c3RhY2snIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0lHQUxUU1RBQ0sKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdzdGFjaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TSUdTVEFDSworCisvKiBUdW5lIGRpcmVjdG9yeSBzcGVlZF9jeWNsZWNvdW50ZXIsIHVuZGVmPW5vbmUsIDE9MzJiaXRzLCAyPTY0Yml0cykgKi8KKyN1bmRlZiBIQVZFX1NQRUVEX0NZQ0xFQ09VTlRFUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNzdHJlYW0+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1NUUkVBTQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RhY2tfdCcuICovCisjdW5kZWYgSEFWRV9TVEFDS19UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RkOjpsb2NhbGUnLiAqLworI3VuZGVmIEhBVkVfU1REX19MT0NBTEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjaHInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJubGVuJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUk5MRU4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2wnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSVE9MCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG91bCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT1VMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3lzY29uZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TWVNDT05GCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3lzY3RsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NZU0NUTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2N0bGJ5bmFtZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TWVNDVExCWU5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNzZ2knIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1lTU0dJCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2F0dHJpYnV0ZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQVRUUklCVVRFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvZ3JhcGguaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfSU9HUkFQSF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21tYW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfTU1BTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcHJvY2Vzc29yLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1BST0NFU1NPUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BzdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1BTVEFUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNjdGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1lTQ1RMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzaW5mby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TWVNJTkZPX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3lzc2dpLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NZU1NHSV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c3RlbWNmZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TWVNURU1DRkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1lcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9USU1FUworCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdWludF9sZWFzdDMyX3QnLiAqLworI3VuZGVmIEhBVkVfVUlOVF9MRUFTVDMyX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24gYW5kIGl0IHdvcmtzIHByb3Blcmx5LiAqLworI3VuZGVmIEhBVkVfVlNOUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGZvciBXaW5kb3MvNjQgKi8KKyN1bmRlZiBIT1NUX0RPUzY0CisKKy8qIEFzc2VtYmxlciBsb2NhbCBsYWJlbCBwcmVmaXggKi8KKyN1bmRlZiBMU1lNX1BSRUZJWAorCisvKiBEZWZpbmUgdG8gdGhlIHN1Yi1kaXJlY3Rvcnkgd2hlcmUgbGlidG9vbCBzdG9yZXMgdW5pbnN0YWxsZWQgbGlicmFyaWVzLiAqLworI3VuZGVmIExUX09CSkRJUgorCisvKiBEZWZpbmUgdG8gMSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgaW5saW5lIGFzc2VtYmx5ICovCisjdW5kZWYgTk9fQVNNCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVVJMCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50JyBvciBgdm9pZCcpLiAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogVGhlIHNpemUgb2YgYG1wX2xpbWJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTVBfTElNQl9UCisKKy8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfVU5TSUdORUQKKworLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1VOU0lHTkVEX0xPTkcKKworLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9VTlNJR05FRF9TSE9SVAorCisvKiBUaGUgc2l6ZSBvZiBgdm9pZCAqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9WT0lEX1AKKworLyogRGVmaW5lIHRvIDEgaWYgc3NjYW5mIHJlcXVpcmVzIHdyaXRhYmxlIGlucHV0cyAqLworI3VuZGVmIFNTQ0FORl9XUklUQUJMRV9JTlBVVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCisjdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCisKKy8qIE1heGltdW0gc2l6ZSB0aGUgdHVuZSBwcm9ncmFtIGNhbiB0ZXN0IGZvciBTUVJfVE9PTTJfVEhSRVNIT0xEICovCisjdW5kZWYgVFVORV9TUVJfVE9PTTJfTUFYCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSBBU1NFUlQgY2hlY2tpbmcsIHBlciAtLWVuYWJsZS1hc3NlcnQgKi8KKyN1bmRlZiBXQU5UX0FTU0VSVAorCisvKiBEZWZpbmUgdG8gMSB0byBlbmFibGUgR01QX0NQVV9UWVBFIGZha2luZyBjcHVpZCwgcGVyIC0tZW5hYmxlLWZha2UtY3B1aWQgKi8KKyN1bmRlZiBXQU5UX0ZBS0VfQ1BVSUQKKworLyogRGVmaW5lIHRvIDEgd2hlbiBidWlsZGluZyBhIGZhdCBiaW5hcnkuICovCisjdW5kZWYgV0FOVF9GQVRfQklOQVJZCisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSBGRlRzIGZvciBtdWx0aXBsaWNhdGlvbiwgcGVyIC0tZW5hYmxlLWZmdCAqLworI3VuZGVmIFdBTlRfRkZUCisKKy8qIERlZmluZSB0byAxIHRvIGVuYWJsZSBvbGQgbXBuX211bF9mZnRfZnVsbCBmb3IgbXVsdGlwbGljYXRpb24sIHBlcgorICAgLS1lbmFibGUtb2xkLWZmdC1mdWxsICovCisjdW5kZWYgV0FOVF9PTERfRkZUX0ZVTEwKKworLyogRGVmaW5lIHRvIDEgaWYgLS1lbmFibGUtcHJvZmlsaW5nPWdwcm9mICovCisjdW5kZWYgV0FOVF9QUk9GSUxJTkdfR1BST0YKKworLyogRGVmaW5lIHRvIDEgaWYgLS1lbmFibGUtcHJvZmlsaW5nPWluc3RydW1lbnQgKi8KKyN1bmRlZiBXQU5UX1BST0ZJTElOR19JTlNUUlVNRU5UCisKKy8qIERlZmluZSB0byAxIGlmIC0tZW5hYmxlLXByb2ZpbGluZz1wcm9mICovCisjdW5kZWYgV0FOVF9QUk9GSUxJTkdfUFJPRgorCisvKiBEZWZpbmUgb25lIG9mIHRoZXNlIHRvIDEgZm9yIHRoZSBkZXNpcmVkIHRlbXBvcmFyeSBtZW1vcnkgYWxsb2NhdGlvbgorICAgbWV0aG9kLCBwZXIgLS1lbmFibGUtYWxsb2NhLiAqLworI3VuZGVmIFdBTlRfVE1QX0FMTE9DQQorI3VuZGVmIFdBTlRfVE1QX1JFRU5UUkFOVAorI3VuZGVmIFdBTlRfVE1QX05PVFJFRU5UUkFOVAorI3VuZGVmIFdBTlRfVE1QX0RFQlVHCisKKy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgYXNzZW1ibGVyIHVuZGVyc3RhbmRzIHRoZSBtdWx4IGluc3RydWN0aW9uICovCisjdW5kZWYgWDg2X0FTTV9NVUxYCisKKy8qIERlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwgbm90IGEKKyAgIGBjaGFyW10nLiAqLworI3VuZGVmIFlZVEVYVF9QT0lOVEVSCisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjdW5kZWYgaW5saW5lCisjZW5kaWYKKworLyogRGVmaW5lIHRvIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBDOTkgJ3Jlc3RyaWN0JyBrZXl3b3JkLCBvciB0bworICAgbm90aGluZyBpZiB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICBEbyBub3QgZGVmaW5lIGlmIHJlc3RyaWN0IGlzCisgICBzdXBwb3J0ZWQgZGlyZWN0bHkuICAqLworI3VuZGVmIHJlc3RyaWN0CisvKiBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBTdW4gQysrOiBpdCBkb2VzIG5vdCBzdXBwb3J0IF9SZXN0cmljdCBvcgorICAgX19yZXN0cmljdF9fLCBldmVuIHRob3VnaCB0aGUgY29ycmVzcG9uZGluZyBTdW4gQyBjb21waWxlciBlbmRzIHVwIHdpdGgKKyAgICIjZGVmaW5lIHJlc3RyaWN0IF9SZXN0cmljdCIgb3IgIiNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdF9fIiBpbiB0aGUKKyAgIHByZXZpb3VzIGxpbmUuICBQZXJoYXBzIHNvbWUgZnV0dXJlIHZlcnNpb24gb2YgU3VuIEMrKyB3aWxsIHdvcmsgd2l0aAorICAgcmVzdHJpY3Q7IGlmIHNvLCBob3BlZnVsbHkgaXQgZGVmaW5lcyBfX1JFU1RSSUNUIGxpa2UgU3VuIEMgZG9lcy4gICovCisjaWYgZGVmaW5lZCBfX1NVTlBST19DQyAmJiAhZGVmaW5lZCBfX1JFU1RSSUNUCisjIGRlZmluZSBfUmVzdHJpY3QKKyMgZGVmaW5lIF9fcmVzdHJpY3RfXworI2VuZGlmCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBgdm9sYXRpbGUnIGRvZXMgbm90IHdvcmsuIFdhcm5pbmc6IHZhbGlkCisgICBjb2RlIHVzaW5nIGB2b2xhdGlsZScgY2FuIGJlY29tZSBpbmNvcnJlY3Qgd2l0aG91dC4gRGlzYWJsZSB3aXRoIGNhcmUuICovCisjdW5kZWYgdm9sYXRpbGUKZGlmZiAtLWdpdCBhL2N4eC9kdW1teS5jYyBiL2N4eC9kdW1teS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjcyOGNhCi0tLSAvZGV2L251bGwKKysrIGIvY3h4L2R1bW15LmNjCkBAIC0wLDAgKzEsMzMgQEAKKy8qIER1bW15IGZpbGUgdG8gbWFrZSBhdXRvbWFrZSB0cmVhdCBsaWJnbXB4eC5sYSBhcyBDKysuCisKK0NvcHlyaWdodCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIHNvbWUgY29tcGlsZXJzIHJlcHV0ZWRseSBkaXNsaWtlIGNvbXBsZXRlbHkgZW1wdHkgZmlsZXMgKi8KK3R5cGVkZWYgaW50ICBmb287CmRpZmYgLS1naXQgYS9jeHgvaXNmdW5zLmNjIGIvY3h4L2lzZnVucy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MwZGIwCi0tLSAvZGV2L251bGwKKysrIGIvY3h4L2lzZnVucy5jYwpAQCAtMCwwICsxLDExNSBAQAorLyogQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgQysrLXN0eWxlIGlucHV0IG9mIEdNUCB0eXBlcy4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworaW50CitfX2dtcF9pc3RyZWFtX3NldF9iYXNlIChpc3RyZWFtICZpLCBjaGFyICZjLCBib29sICZ6ZXJvLCBib29sICZzaG93YmFzZSkKK3sKKyAgaW50IGJhc2U7CisKKyAgemVybyA9IHNob3diYXNlID0gZmFsc2U7CisgIHN3aXRjaCAoaS5mbGFncygpICYgaW9zOjpiYXNlZmllbGQpCisgICAgeworICAgIGNhc2UgaW9zOjpkZWM6CisgICAgICBiYXNlID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlvczo6aGV4OgorICAgICAgYmFzZSA9IDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBpb3M6Om9jdDoKKyAgICAgIGJhc2UgPSA4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNob3diYXNlID0gdHJ1ZTsgLy8gbG9vayBmb3IgaW5pdGlhbCAiMCIgb3IgIjB4IiBvciAiMFgiCisgICAgICBpZiAoYyA9PSAnMCcpCisJeworCSAgaWYgKCEgaS5nZXQoYykpCisJICAgIGMgPSAwOyAvLyByZXNldCBvciB3ZSBtaWdodCBsb29wIGluZGVmaW5pdGVseQorCisJICBpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpCisJICAgIHsKKwkgICAgICBiYXNlID0gMTY7CisJICAgICAgaS5nZXQoYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJhc2UgPSA4OworCSAgICAgIHplcm8gPSB0cnVlOyAvLyBpZiBubyBvdGhlciBkaWdpdCBpcyByZWFkLCB0aGUgIjAiIGNvdW50cworCSAgICB9CisJfQorICAgICAgZWxzZQorCWJhc2UgPSAxMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gYmFzZTsKK30KKwordm9pZAorX19nbXBfaXN0cmVhbV9zZXRfZGlnaXRzIChzdHJpbmcgJnMsIGlzdHJlYW0gJmksIGNoYXIgJmMsIGJvb2wgJm9rLCBpbnQgYmFzZSkKK3sKKyAgc3dpdGNoIChiYXNlKQorICAgIHsKKyAgICBjYXNlIDEwOgorICAgICAgd2hpbGUgKGlzZGlnaXQoYykpCisJeworCSAgb2sgPSB0cnVlOyAvLyBhdCBsZWFzdCBhIHZhbGlkIGRpZ2l0IHdhcyByZWFkCisJICBzICs9IGM7CisJICBpZiAoISBpLmdldChjKSkKKwkgICAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgd2hpbGUgKGlzZGlnaXQoYykgJiYgYyAhPSAnOCcgJiYgYyAhPSAnOScpCisJeworCSAgb2sgPSB0cnVlOyAvLyBhdCBsZWFzdCBhIHZhbGlkIGRpZ2l0IHdhcyByZWFkCisJICBzICs9IGM7CisJICBpZiAoISBpLmdldChjKSkKKwkgICAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIHdoaWxlIChpc3hkaWdpdChjKSkKKwl7CisJICBvayA9IHRydWU7IC8vIGF0IGxlYXN0IGEgdmFsaWQgZGlnaXQgd2FzIHJlYWQKKwkgIHMgKz0gYzsKKwkgIGlmICghIGkuZ2V0KGMpKQorCSAgICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jeHgvaXNtcGYuY2MgYi9jeHgvaXNtcGYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmMjVlYgotLS0gL2Rldi9udWxsCisrKyBiL2N4eC9pc21wZi5jYwpAQCAtMCwwICsxLDE0NCBAQAorLyogb3BlcmF0b3I+PiAtLSBDKystc3R5bGUgaW5wdXQgb2YgbXBmX3QuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjbG9jYWxlPiAgICAvLyBmb3IgbG9jYWxlY29udgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvLyBGb3IgZysrIGxpYnN0ZGMrKyBwYXJzaW5nIHNlZSBudW1fZ2V0PGNoYXJ0eXBlLGluaXRlcj46Ol9NX2V4dHJhY3RfZmxvYXQKKy8vIGluIGluY2x1ZGUvYml0cy9sb2NhbGVfZmFjZXRzLnRjYy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gcGxhbnMgdG8gYWNjZXB0IGhleCBvciBvY3RhbCBmbG9hdHMsIG5vdCB1bmxlc3MgdGhlIHN0YW5kYXJkCisvLyBDKysgbGlicmFyeSBkb2VzIHNvLiAgQWx0aG91Z2ggc3VjaCBmb3JtYXRzIG1pZ2h0IGJlIG9mIHVzZSwgaXQncworLy8gY29uc2lkZXJlZCBtb3JlIGltcG9ydGFudCB0byBiZSBjb21wYXRpYmxlIHdpdGggd2hhdCB0aGUgbm9ybWFsCisvLyBvcGVyYXRvcj4+IGRvZXMgb24gImRvdWJsZSJzIGV0Yy4KKworaXN0cmVhbSAmCitvcGVyYXRvcj4+IChpc3RyZWFtICZpLCBtcGZfcHRyIGYpCit7CisgIGludCBiYXNlOworICBjaGFyIGMgPSAwOworICBzdHJpbmcgczsKKyAgYm9vbCBvayA9IGZhbHNlOworCisgIC8vIEMgZGVjaW1hbCBwb2ludCwgYXMgZXhwZWN0ZWQgYnkgbXBmX3NldF9zdHIKKyAgY29uc3QgY2hhciAqbGNvbnZfcG9pbnQgPSBHTVBfREVDSU1BTF9QT0lOVDsKKworICAvLyBDKysgZGVjaW1hbCBwb2ludAorI2lmIEhBVkVfU1REX19MT0NBTEUKKyAgY29uc3QgbG9jYWxlJiBsb2MgPSBpLmdldGxvYygpOworICBjaGFyIHBvaW50X2NoYXIgPSB1c2VfZmFjZXQ8IG51bXB1bmN0PGNoYXI+ID4obG9jKS5kZWNpbWFsX3BvaW50KCk7CisjZWxzZQorICBjb25zdCBjaGFyICpwb2ludCA9IGxjb252X3BvaW50OworICBjaGFyIHBvaW50X2NoYXIgPSAqcG9pbnQ7CisjZW5kaWYKKworICBpLmdldChjKTsgLy8gc3RhcnQgcmVhZGluZworCisgIGlmIChpLmZsYWdzKCkgJiBpb3M6OnNraXB3cykgLy8gc2tpcCBpbml0aWFsIHdoaXRlc3BhY2UKKyAgICB7CisgICAgICAvLyBDKysgaXNzcGFjZQorI2lmIEhBVkVfU1REX19MT0NBTEUKKyAgICAgIGNvbnN0IGN0eXBlPGNoYXI+JiBjdCA9IHVzZV9mYWNldDwgY3R5cGU8Y2hhcj4gPihsb2MpOworI2RlZmluZSBjeHhfaXNzcGFjZShjKSAgKGN0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLChjKSkpCisjZWxzZQorI2RlZmluZSBjeHhfaXNzcGFjZShjKSAgaXNzcGFjZShjKQorI2VuZGlmCisKKyAgICAgIHdoaWxlIChjeHhfaXNzcGFjZShjKSAmJiBpLmdldChjKSkKKyAgICAgICAgOworICAgIH0KKworICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpIC8vIHNpZ24KKyAgICB7CisgICAgICBpZiAoYyA9PSAnLScpCisJcyA9ICItIjsKKyAgICAgIGkuZ2V0KGMpOworICAgIH0KKworICBiYXNlID0gMTA7CisgIF9fZ21wX2lzdHJlYW1fc2V0X2RpZ2l0cyhzLCBpLCBjLCBvaywgYmFzZSk7IC8vIHJlYWQgdGhlIG51bWJlcgorCisgIC8vIGxvb2sgZm9yIHRoZSBDKysgcmFkaXggcG9pbnQsIGJ1dCBwdXQgdGhlIEMgb25lIGluIGZvciBtcGZfc2V0X3N0cgorICBpZiAoYyA9PSBwb2ludF9jaGFyKQorICAgIHsKKyNpZiBIQVZFX1NURF9fTE9DQUxFCisgICAgICBpLmdldChjKTsKKyNlbHNlIC8vIGxjb252IHBvaW50IGNhbiBiZSBtdWx0aS1jaGFyCisgICAgICBmb3IgKDs7KQorICAgICAgICB7CisgICAgICAgICAgaS5nZXQoYyk7CisgICAgICAgICAgcG9pbnQrKzsKKyAgICAgICAgICBpZiAoKnBvaW50ID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoYyAhPSAqcG9pbnQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgcyArPSBsY29udl9wb2ludDsKKyAgICAgIF9fZ21wX2lzdHJlYW1fc2V0X2RpZ2l0cyhzLCBpLCBjLCBvaywgYmFzZSk7IC8vIHJlYWQgdGhlIG1hbnRpc3NhCisgICAgfQorCisgIGlmIChvayAmJiAoYyA9PSAnZScgfHwgYyA9PSAnRScpKSAvLyBleHBvbmVudAorICAgIHsKKyAgICAgIHMgKz0gYzsKKyAgICAgIGkuZ2V0KGMpOworICAgICAgb2sgPSBmYWxzZTsgLy8gZXhwb25lbnQgaXMgbWFuZGF0b3J5CisKKyAgICAgIGlmIChjID09ICctJyB8fCBjID09ICcrJykgLy8gc2lnbgorCXsKKwkgIHMgKz0gYzsKKwkgIGkuZ2V0KGMpOworCX0KKworICAgICAgX19nbXBfaXN0cmVhbV9zZXRfZGlnaXRzKHMsIGksIGMsIG9rLCBiYXNlKTsgLy8gcmVhZCB0aGUgZXhwb25lbnQKKyAgICB9CisKKyAgaWYgKGkuZ29vZCgpKSAvLyBsYXN0IGNoYXJhY3RlciByZWFkIHdhcyBub24tbnVtZXJpYworICAgIGkucHV0YmFjayhjKTsKKyAgZWxzZSBpZiAoaS5lb2YoKSAmJiBvaykgLy8gc3RvcHBlZCBqdXN0IGJlZm9yZSBlb2YKKyAgICBpLmNsZWFyKGlvczo6ZW9mYml0KTsKKworICBpZiAob2spCisgICAgQVNTRVJUX05PQ0FSUlkgKG1wZl9zZXRfc3RyKGYsIHMuY19zdHIoKSwgYmFzZSkpOyAvLyBleHRyYWN0IHRoZSBudW1iZXIKKyAgZWxzZQorICAgIHsKKyAgICBmYWlsOgorICAgICAgaS5zZXRzdGF0ZShpb3M6OmZhaWxiaXQpOyAvLyByZWFkIGZhaWxlZAorICAgIH0KKworICByZXR1cm4gaTsKK30KZGlmZiAtLWdpdCBhL2N4eC9pc21wcS5jYyBiL2N4eC9pc21wcS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2Q1MTIxCi0tLSAvZGV2L251bGwKKysrIGIvY3h4L2lzbXBxLmNjCkBAIC0wLDAgKzEsNjYgQEAKKy8qIG9wZXJhdG9yPj4gLS0gQysrLXN0eWxlIGlucHV0IG9mIG1wcV90LgorCitDb3B5cmlnaHQgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCitpc3RyZWFtICYKK29wZXJhdG9yPj4gKGlzdHJlYW0gJmksIG1wcV9wdHIgcSkKK3sKKyAgaWYgKCEgKGkgPj4gbXBxX251bXJlZihxKSkpCisgICAgcmV0dXJuIGk7CisKKyAgY2hhciAgYyA9IDA7CisgIGkuZ2V0KGMpOyAvLyBzdGFydCByZWFkaW5nCisKKyAgaWYgKGMgPT0gJy8nKQorICAgIHsKKyAgICAgIC8vIHNraXAgc2xhc2gsIHJlYWQgZGVub21pbmF0b3IKKyAgICAgIGkuZ2V0KGMpOworICAgICAgcmV0dXJuIF9fZ21wel9vcGVyYXRvcl9pbl9ub3doaXRlIChpLCBtcHFfZGVucmVmKHEpLCBjKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvLyBubyBkZW5vbWluYXRvciwgc2V0IDEKKyAgICAgIHEtPl9tcF9kZW4uX21wX3NpemUgPSAxOworICAgICAgcS0+X21wX2Rlbi5fbXBfZFswXSA9IDE7CisgICAgICBpZiAoaS5nb29kKCkpCisgICAgICAgIGkucHV0YmFjayhjKTsKKyAgICAgIGVsc2UgaWYgKGkuZW9mKCkpCisgICAgICAgIGkuY2xlYXIoaW9zOjplb2ZiaXQpOworICAgIH0KKworICByZXR1cm4gaTsKK30KZGlmZiAtLWdpdCBhL2N4eC9pc21wei5jYyBiL2N4eC9pc21wei5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNjZWQxCi0tLSAvZGV2L251bGwKKysrIGIvY3h4L2lzbXB6LmNjCkBAIC0wLDAgKzEsNjIgQEAKKy8qIG9wZXJhdG9yPj4gLS0gQysrLXN0eWxlIGlucHV0IG9mIG1wel90LgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvLyBGb3IgZysrIGxpYnN0ZGMrKyBwYXJzaW5nIHNlZSBudW1fZ2V0PGNoYXJ0eXBlLGluaXRlcj46Ol9NX2V4dHJhY3RfaW50IGluCisvLyBpbmNsdWRlL2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2MuCisKK2lzdHJlYW0gJgorb3BlcmF0b3I+PiAoaXN0cmVhbSAmaSwgbXB6X3B0ciB6KQoreworICBjaGFyIGMgPSAwOworICBpLmdldChjKTsgLy8gc3RhcnQgcmVhZGluZworCisgIGlmIChpLmZsYWdzKCkgJiBpb3M6OnNraXB3cykgLy8gc2tpcCBpbml0aWFsIHdoaXRlc3BhY2UKKyAgICB7CisjaWYgSEFWRV9TVERfX0xPQ0FMRQorICAgICAgY29uc3QgY3R5cGU8Y2hhcj4mIGN0ID0gdXNlX2ZhY2V0PCBjdHlwZTxjaGFyPiA+KGkuZ2V0bG9jKCkpOworI2RlZmluZSBjeHhfaXNzcGFjZShjKSAgKGN0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLChjKSkpCisjZWxzZQorI2RlZmluZSBjeHhfaXNzcGFjZShjKSAgaXNzcGFjZShjKQorI2VuZGlmCisKKyAgICAgIHdoaWxlIChjeHhfaXNzcGFjZShjKSAmJiBpLmdldChjKSkKKyAgICAgICAgOworICAgIH0KKworICByZXR1cm4gX19nbXB6X29wZXJhdG9yX2luX25vd2hpdGUgKGksIHosIGMpOworfQpkaWZmIC0tZ2l0IGEvY3h4L2lzbXB6bncuY2MgYi9jeHgvaXNtcHpudy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYyODA2Ci0tLSAvZGV2L251bGwKKysrIGIvY3h4L2lzbXB6bncuY2MKQEAgLTAsMCArMSw3MiBAQAorLyogX19nbXB6X29wZXJhdG9yX2luX25vd2hpdGUgLS0gQysrLXN0eWxlIGlucHV0IG9mIG1wel90LCBubyB3aGl0ZXNwYWNlIHNraXAuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKy8vIEZvciBnKysgbGlic3RkYysrIHBhcnNpbmcgc2VlIG51bV9nZXQ8Y2hhcnR5cGUsaW5pdGVyPjo6X01fZXh0cmFjdF9pbnQgaW4KKy8vIGluY2x1ZGUvYml0cy9sb2NhbGVfZmFjZXRzLnRjYy4KKworaXN0cmVhbSAmCitfX2dtcHpfb3BlcmF0b3JfaW5fbm93aGl0ZSAoaXN0cmVhbSAmaSwgbXB6X3B0ciB6LCBjaGFyIGMpCit7CisgIGludCBiYXNlOworICBzdHJpbmcgczsKKyAgYm9vbCBvayA9IGZhbHNlLCB6ZXJvLCBzaG93YmFzZTsKKworICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpIC8vIHNpZ24KKyAgICB7CisgICAgICBpZiAoYyA9PSAnLScpIC8vIG1wel9zZXRfc3RyIGRvZXNuJ3QgYWNjZXB0ICcrJworCXMgPSAiLSI7CisgICAgICBpLmdldChjKTsKKyAgICB9CisKKyAgYmFzZSA9IF9fZ21wX2lzdHJlYW1fc2V0X2Jhc2UoaSwgYywgemVybywgc2hvd2Jhc2UpOyAvLyBzZWxlY3QgdGhlIGJhc2UKKyAgX19nbXBfaXN0cmVhbV9zZXRfZGlnaXRzKHMsIGksIGMsIG9rLCBiYXNlKTsgICAgICAgICAvLyByZWFkIHRoZSBudW1iZXIKKworICBpZiAoaS5nb29kKCkpIC8vIGxhc3QgY2hhcmFjdGVyIHJlYWQgd2FzIG5vbi1udW1lcmljCisgICAgaS5wdXRiYWNrKGMpOworICBlbHNlIGlmIChpLmVvZigpICYmIChvayB8fCB6ZXJvKSkgLy8gc3RvcHBlZCBqdXN0IGJlZm9yZSBlb2YKKyAgICBpLmNsZWFyKGlvczo6ZW9mYml0KTsKKworICBpZiAob2spCisgICAgQVNTRVJUX05PQ0FSUlkgKG1wel9zZXRfc3RyICh6LCBzLmNfc3RyKCksIGJhc2UpKTsgLy8gZXh0cmFjdCB0aGUgbnVtYmVyCisgIGVsc2UgaWYgKHplcm8pCisgICAgbXB6X3NldF91aSh6LCAwKTsKKyAgZWxzZQorICAgIGkuc2V0c3RhdGUoaW9zOjpmYWlsYml0KTsgLy8gcmVhZCBmYWlsZWQKKworICByZXR1cm4gaTsKK30KZGlmZiAtLWdpdCBhL2N4eC9saW1pdHMuY2MgYi9jeHgvbGltaXRzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDRlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jeHgvbGltaXRzLmNjCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGluc3RhbnRpYXRpb24gb2YgbnVtZXJpY19saW1pdHMgc3BlY2lhbGl6YXRpb25zLgorCitDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcHh4LmgiCisKK25hbWVzcGFjZSBzdGQgeworI2RlZmluZSBHTVBYWF9JTlNUQU5USUFURV9MSU1JVFMoVCkgXAorICBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPFQ+Ojppc19zcGVjaWFsaXplZDsgXAorICBjb25zdCBpbnQgIG51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHM7IFwKKyAgY29uc3QgaW50ICBudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzMTA7IFwKKyAgY29uc3QgaW50ICBudW1lcmljX2xpbWl0czxUPjo6bWF4X2RpZ2l0czEwOyBcCisgIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZDsgXAorICBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyOyBcCisgIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8VD46OmlzX2V4YWN0OyBcCisgIGNvbnN0IGludCAgbnVtZXJpY19saW1pdHM8VD46OnJhZGl4OyBcCisgIGNvbnN0IGludCAgbnVtZXJpY19saW1pdHM8VD46Om1pbl9leHBvbmVudDsgXAorICBjb25zdCBpbnQgIG51bWVyaWNfbGltaXRzPFQ+OjptaW5fZXhwb25lbnQxMDsgXAorICBjb25zdCBpbnQgIG51bWVyaWNfbGltaXRzPFQ+OjptYXhfZXhwb25lbnQ7IFwKKyAgY29uc3QgaW50ICBudW1lcmljX2xpbWl0czxUPjo6bWF4X2V4cG9uZW50MTA7IFwKKyAgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxUPjo6aGFzX2luZmluaXR5OyBcCisgIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8VD46Omhhc19xdWlldF9OYU47IFwKKyAgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxUPjo6aGFzX3NpZ25hbGluZ19OYU47IFwKKyAgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIG51bWVyaWNfbGltaXRzPFQ+OjpoYXNfZGVub3JtOyBcCisgIGNvbnN0IGJvb2wgbnVtZXJpY19saW1pdHM8VD46Omhhc19kZW5vcm1fbG9zczsgXAorICBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPFQ+Ojppc19pZWM1NTk7IFwKKyAgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxUPjo6aXNfYm91bmRlZDsgXAorICBjb25zdCBib29sIG51bWVyaWNfbGltaXRzPFQ+Ojppc19tb2R1bG87IFwKKyAgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxUPjo6dHJhcHM7IFwKKyAgY29uc3QgYm9vbCBudW1lcmljX2xpbWl0czxUPjo6dGlueW5lc3NfYmVmb3JlOyBcCisgIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIG51bWVyaWNfbGltaXRzPFQ+Ojpyb3VuZF9zdHlsZQorCisgIEdNUFhYX0lOU1RBTlRJQVRFX0xJTUlUUyhtcHpfY2xhc3MpOworICBHTVBYWF9JTlNUQU5USUFURV9MSU1JVFMobXBxX2NsYXNzKTsKKyAgR01QWFhfSU5TVEFOVElBVEVfTElNSVRTKG1wZl9jbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9jeHgvb3Nkb3BybnRpLmNjIGIvY3h4L29zZG9wcm50aS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRlZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvY3h4L29zZG9wcm50aS5jYwpAQCAtMCwwICsxLDY3IEBACisvKiBfX2dtcF9kb3BybnRfaW50ZWdlcl9pb3MgLS0gaW50ZWdlciBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIG9zdHJlYW0uCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGFyZy5oPiAgIC8qIGZvciB2YV9saXN0IGFuZCBoZW5jZSBkb3BybnRfZnVuc190ICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLyogZm9yIHN0cmxlbiAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvKiBUaGUgZ21wX2FzcHJpbnRmIHN1cHBvcnQgcm91dGluZXMgbmV2ZXIgZ2l2ZSBhbiBlcnJvciwgc28KKyAgIF9fZ21wX2RvcHJudF9pbnRlZ2VyIHNob3VsZG4ndCBmYWlsIGFuZCBpdCdzIHJldHVybiBjYW4ganVzdCBiZSBjaGVja2VkCisgICB3aXRoIGFuIEFTU0VSVC4gICovCisKK29zdHJlYW0mCitfX2dtcF9kb3BybnRfaW50ZWdlcl9vc3RyZWFtIChvc3RyZWFtICZvLCBzdHJ1Y3QgZG9wcm50X3BhcmFtc190ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcykKK3sKKyAgc3RydWN0IGdtcF9hc3ByaW50Zl90ICAgZDsKKyAgY2hhciAgKnJlc3VsdDsKKyAgaW50ICAgcmV0OworCisgIC8qIGRvbid0IHNob3cgbGVhZGluZyB6ZXJvcyB0aGUgd2F5IHByaW50ZiBkb2VzICovCisgIHAtPnByZWMgPSAtMTsKKworICBHTVBfQVNQUklOVEZfVF9JTklUIChkLCAmcmVzdWx0KTsKKyAgcmV0ID0gX19nbXBfZG9wcm50X2ludGVnZXIgKCZfX2dtcF9hc3ByaW50Zl9mdW5zX25vZm9ybWF0LCAmZCwgcCwgcyk7CisgIEFTU0VSVCAocmV0ICE9IC0xKTsKKyAgX19nbXBfYXNwcmludGZfZmluYWwgKCZkKTsKKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzLCBzdHJsZW4ocykrMSk7CisKKyAgZ21wX2FsbG9jYXRlZF9zdHJpbmcgIHQgKHJlc3VsdCk7CisgIHJldHVybiBvLndyaXRlICh0LnN0ciwgdC5sZW4pOworfQpkaWZmIC0tZ2l0IGEvY3h4L29zZnVucy5jYyBiL2N4eC9vc2Z1bnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1OTBhOAotLS0gL2Rldi9udWxsCisrKyBiL2N4eC9vc2Z1bnMuY2MKQEAgLTAsMCArMSwxMjMgQEAKKy8qIFN1cHBvcnQgZm9yIG9wZXJhdG9yPDwgcm91dGluZXMuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvKiBmb3IgdmFfbGlzdCBhbmQgaGVuY2UgZG9wcm50X2Z1bnNfdCAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvKiBEb24ndCBuZWVkICJmb3JtYXQiIGZvciBvcGVyYXRvcjw8IHJvdXRpbmVzLCBqdXN0ICJtZW1vcnkiIGFuZCAicmVwcyIuCisgICBPbWl0dGluZyBnbXBfYXNwcmludGZfZm9ybWF0IGxldHMgdXMgYXZvaWQgZHJhZ2dpbmcgdnNucHJpbnRmIGludG8gdGhlCisgICBsaW5rLiAgX19nbXBfYXNwcmludGZfZmluYWwgd2lsbCBiZSBjYWxsZWQgZGlyZWN0bHkgYW5kIGRvZXNuJ3QgbmVlZCB0bworICAgYmUgaW4gdGhlIHN0cnVjdC4gICovCisKK2NvbnN0IHN0cnVjdCBkb3BybnRfZnVuc190ICBfX2dtcF9hc3ByaW50Zl9mdW5zX25vZm9ybWF0ID0geworICBOVUxMLAorICAoZG9wcm50X21lbW9yeV90KSBfX2dtcF9hc3ByaW50Zl9tZW1vcnksCisgIChkb3BybnRfcmVwc190KSAgIF9fZ21wX2FzcHJpbnRmX3JlcHMsCisgIE5VTEwKK307CisKKwordm9pZAorX19nbXBfZG9wcm50X3BhcmFtc19mcm9tX2lvcyAoc3RydWN0IGRvcHJudF9wYXJhbXNfdCAqcCwgaW9zICZvKQoreworICBpZiAoKG8uZmxhZ3MoKSAmIGlvczo6YmFzZWZpZWxkKSA9PSBpb3M6OmhleCkKKyAgICB7CisgICAgICBwLT5leHBmbXQgPSAiQCVjJTAyZCI7CisgICAgICBwLT5iYXNlID0gKG8uZmxhZ3MoKSAmIGlvczo6dXBwZXJjYXNlID8gLTE2IDogMTYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHAtPmV4cGZtdCA9IChvLmZsYWdzKCkgJiBpb3M6OnVwcGVyY2FzZSA/ICJFJWMlMDJkIiA6ICJlJWMlMDJkIik7CisgICAgICBpZiAoKG8uZmxhZ3MoKSAmIGlvczo6YmFzZWZpZWxkKSA9PSBpb3M6Om9jdCkKKyAgICAgICAgcC0+YmFzZSA9IDg7CisgICAgICBlbHNlCisgICAgICAgIHAtPmJhc2UgPSAxMDsKKyAgICB9CisKKyAgLyogImdlbmVyYWwiIGlmIG5vbmUgb3IgbW9yZSB0aGFuIG9uZSBiaXQgc2V0ICovCisgIGlmICgoby5mbGFncygpICYgaW9zOjpmbG9hdGZpZWxkKSA9PSBpb3M6OmZpeGVkKQorICAgIHAtPmNvbnYgPSBET1BSTlRfQ09OVl9GSVhFRDsKKyAgZWxzZSBpZiAoKG8uZmxhZ3MoKSAmIGlvczo6ZmxvYXRmaWVsZCkgPT0gaW9zOjpzY2llbnRpZmljKQorICAgIHAtPmNvbnYgPSBET1BSTlRfQ09OVl9TQ0lFTlRJRklDOworICBlbHNlCisgICAgcC0+Y29udiA9IERPUFJOVF9DT05WX0dFTkVSQUw7CisKKyAgcC0+ZXhwdGltZXM0ID0gMDsKKworICBwLT5maWxsID0gby5maWxsKCk7CisKKyAgLyogInJpZ2h0IiBpZiBtb3JlIHRoYW4gb25lIGJpdCBzZXQgKi8KKyAgaWYgKChvLmZsYWdzKCkgJiBpb3M6OmFkanVzdGZpZWxkKSA9PSBpb3M6OmxlZnQpCisgICAgcC0+anVzdGlmeSA9IERPUFJOVF9KVVNUSUZZX0xFRlQ7CisgIGVsc2UgaWYgKChvLmZsYWdzKCkgJiBpb3M6OmFkanVzdGZpZWxkKSA9PSBpb3M6OmludGVybmFsKQorICAgIHAtPmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9JTlRFUk5BTDsKKyAgZWxzZQorICAgIHAtPmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9SSUdIVDsKKworICAvKiBpb3M6OmZpeGVkIGFsbG93cyBwcmVjPT0wLCBvdGhlcnMgdGFrZSAwIGFzIHRoZSBkZWZhdWx0IDYuCisgICAgIERvbid0IGFsbG93IG5lZ2F0aXZlcyAodGhleSBkbyBiYWQgdGhpbmdzIHRvIF9fZ21wX2RvcHJudF9mbG9hdF9jeHgpLiAgKi8KKyAgcC0+cHJlYyA9IE1BWCAoMCwgby5wcmVjaXNpb24oKSk7CisgIGlmIChwLT5wcmVjID09IDAgJiYgcC0+Y29udiAhPSBET1BSTlRfQ09OVl9GSVhFRCkKKyAgICBwLT5wcmVjID0gNjsKKworICAvKiBmb3IgaGV4IHNob3diYXNlIGlzIGFsd2F5cywgZm9yIG9jdGFsIG9ubHkgbm9uLXplcm8gKi8KKyAgaWYgKG8uZmxhZ3MoKSAmIGlvczo6c2hvd2Jhc2UpCisgICAgcC0+c2hvd2Jhc2UgPSAoKG8uZmxhZ3MoKSAmIGlvczo6YmFzZWZpZWxkKSA9PSBpb3M6OmhleAorICAgICAgICAgICAgICAgICAgID8gRE9QUk5UX1NIT1dCQVNFX1lFUyA6IERPUFJOVF9TSE9XQkFTRV9OT05aRVJPKTsKKyAgZWxzZQorICAgIHAtPnNob3diYXNlID0gRE9QUk5UX1NIT1dCQVNFX05POworCisgIHAtPnNob3dwb2ludCA9ICgoby5mbGFncygpICYgaW9zOjpzaG93cG9pbnQpICE9IDApOworCisgIC8qIGluIGZpeGVkIGFuZCBzY2llbnRpZmljIGFsd2F5cyBzaG93IHRyYWlsaW5nIHplcm9zLCBpbiBnZW5lcmFsIGZvcm1hdAorICAgICBzaG93IHRoZW0gaWYgc2hvd3BvaW50IGlzIHNldCAob3Igc28gaXQgc2VlbXMpICovCisgIGlmICgoby5mbGFncygpICYgaW9zOjpmbG9hdGZpZWxkKSA9PSBpb3M6OmZpeGVkCisgICAgICB8fCAoby5mbGFncygpICYgaW9zOjpmbG9hdGZpZWxkKSA9PSBpb3M6OnNjaWVudGlmaWMpCisgICAgcC0+c2hvd3RyYWlsaW5nID0gMTsKKyAgZWxzZQorICAgIHAtPnNob3d0cmFpbGluZyA9IHAtPnNob3dwb2ludDsKKworICBwLT5zaWduID0gKG8uZmxhZ3MoKSAmIGlvczo6c2hvd3BvcyA/ICcrJyA6ICdcMCcpOworCisgIHAtPndpZHRoID0gby53aWR0aCgpOworCisgIC8qIHJlc2V0IG9uIGVhY2ggb3V0cHV0ICovCisgIG8ud2lkdGggKDApOworfQpkaWZmIC0tZ2l0IGEvY3h4L29zbXBmLmNjIGIvY3h4L29zbXBmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODc1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jeHgvb3NtcGYuY2MKQEAgLTAsMCArMSw3MCBAQAorLyogb3BlcmF0b3I8PCAtLSBtcGYgZm9ybWF0dGVkIG91dHB1dCB0byBhbiBvc3RyZWFtLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8qIGZvciB2YV9saXN0IGFuZCBoZW5jZSBkb3BybnRfZnVuc190ICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKy8qIFRoZSBnbXBfYXNwcmludGYgc3VwcG9ydCByb3V0aW5lcyBuZXZlciBnaXZlIGFuIGVycm9yLCBzbworICAgX19nbXBfZG9wcm50X21wZiBzaG91bGRuJ3QgZmFpbCBhbmQgaXQncyByZXR1cm4gY2FuIGp1c3QgYmUgY2hlY2tlZCB3aXRoCisgICBhbiBBU1NFUlQuICAqLworCitvc3RyZWFtJgorb3BlcmF0b3I8PCAob3N0cmVhbSAmbywgbXBmX3NyY3B0ciBmKQoreworICBzdHJ1Y3QgZG9wcm50X3BhcmFtc190ICBwYXJhbTsKKyAgc3RydWN0IGdtcF9hc3ByaW50Zl90ICAgZDsKKyAgY2hhciAgKnJlc3VsdDsKKyAgaW50ICAgcmV0OworCisgIF9fZ21wX2RvcHJudF9wYXJhbXNfZnJvbV9pb3MgKCZwYXJhbSwgbyk7CisKKyNpZiBIQVZFX1NURF9fTE9DQUxFCisgIGNoYXIgIHBvaW50WzJdOworICBwb2ludFswXSA9IHVzZV9mYWNldDwgbnVtcHVuY3Q8Y2hhcj4gPihvLmdldGxvYygpKS5kZWNpbWFsX3BvaW50KCk7CisgIHBvaW50WzFdID0gJ1wwJzsKKyNlbHNlCisgIGNvbnN0IGNoYXIgKnBvaW50ID0gR01QX0RFQ0lNQUxfUE9JTlQ7CisjZW5kaWYKKworICBHTVBfQVNQUklOVEZfVF9JTklUIChkLCAmcmVzdWx0KTsKKyAgcmV0ID0gX19nbXBfZG9wcm50X21wZiAoJl9fZ21wX2FzcHJpbnRmX2Z1bnNfbm9mb3JtYXQsICZkLCAmcGFyYW0sIHBvaW50LCBmKTsKKyAgQVNTRVJUIChyZXQgIT0gLTEpOworICBfX2dtcF9hc3ByaW50Zl9maW5hbCAoJmQpOworCisgIGdtcF9hbGxvY2F0ZWRfc3RyaW5nICB0IChyZXN1bHQpOworICByZXR1cm4gby53cml0ZSAodC5zdHIsIHQubGVuKTsKK30KZGlmZiAtLWdpdCBhL2N4eC9vc21wcS5jYyBiL2N4eC9vc21wcS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk3NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY3h4L29zbXBxLmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8qIG9wZXJhdG9yPDwgLS0gbXBxIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gb3N0cmVhbS4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgLyogZm9yIHZhX2xpc3QgYW5kIGhlbmNlIGRvcHJudF9mdW5zX3QgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworb3N0cmVhbSYKK29wZXJhdG9yPDwgKG9zdHJlYW0gJm8sIG1wcV9zcmNwdHIgcSkKK3sKKyAgc3RydWN0IGRvcHJudF9wYXJhbXNfdCAgcGFyYW07CisgIF9fZ21wX2RvcHJudF9wYXJhbXNfZnJvbV9pb3MgKCZwYXJhbSwgbyk7CisgIHJldHVybiBfX2dtcF9kb3BybnRfaW50ZWdlcl9vc3RyZWFtIChvLCAmcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfZ2V0X3N0ciAoTlVMTCwgcGFyYW0uYmFzZSwgcSkpOworfQpkaWZmIC0tZ2l0IGEvY3h4L29zbXB6LmNjIGIvY3h4L29zbXB6LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTcxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jeHgvb3NtcHouY2MKQEAgLTAsMCArMSw0NyBAQAorLyogb3BlcmF0b3I8PCAtLSBtcHogZm9ybWF0dGVkIG91dHB1dCB0byBhbiBvc3RyZWFtLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvKiBmb3IgdmFfbGlzdCBhbmQgaGVuY2UgZG9wcm50X2Z1bnNfdCAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCitvc3RyZWFtJgorb3BlcmF0b3I8PCAob3N0cmVhbSAmbywgbXB6X3NyY3B0ciB6KQoreworICBzdHJ1Y3QgZG9wcm50X3BhcmFtc190ICBwYXJhbTsKKyAgX19nbXBfZG9wcm50X3BhcmFtc19mcm9tX2lvcyAoJnBhcmFtLCBvKTsKKyAgcmV0dXJuIF9fZ21wX2RvcHJudF9pbnRlZ2VyX29zdHJlYW0gKG8sICZwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9nZXRfc3RyIChOVUxMLCBwYXJhbS5iYXNlLCB6KSk7Cit9CmRpZmYgLS1naXQgYS9lcnJuby5jIGIvZXJybm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFjMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXJybm8uYwpAQCAtMCwwICsxLDc3IEBACisvKiBnbXBfZXJybm8sIF9fZ21wX2V4Y2VwdGlvbiAtLSBleGNlcHRpb24gaGFuZGxpbmcgYW5kIHJlcG9ydGluZy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUsIEFQQVJUIEZST00gZ21wX2Vycm5vLCBBUkUgRk9SIElOVEVSTkFMIFVTRQorICAgT05MWS4gIFRIRVknUkUgQUxNT1NUIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUgorICAgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4gRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDMsIDIwMjEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50IGdtcF9lcnJubyA9IDA7CisKKworLyogVXNlIFNJR0ZQRSBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgaXQuIE90aGVyd2lzZSwgZGVsaWJlcmF0ZSBkaXZpZGUKKyAgIGJ5IHplcm8sIHdoaWNoIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbiBvbiBtb3N0IHN5c3RlbXMuIE9uIHRob3NlCisgICB3aGVyZSBpdCBkb2Vzbid0LCBmb3IgZXhhbXBsZSBwb3dlciBhbmQgcG93ZXJwYywgdXNlIGFib3J0IGluc3RlYWQuICovCit2b2lkCitfX2dtcF9leGNlcHRpb24gKGludCBlcnJvcl9iaXQpCit7CisgIGdtcF9lcnJubyB8PSBlcnJvcl9iaXQ7CisjaWZkZWYgU0lHRlBFCisgIHJhaXNlIChTSUdGUEUpOworI2Vsc2UKKyAgX19nbXBfanVuayA9IDEwIC8gX19nbXBfMDsKKyNlbmRpZgorICBhYm9ydCAoKTsKK30KKworCisvKiBUaGVzZSBmdW5jdGlvbnMgbWluaW1pemUgdGhlIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIGluIGZ1bmN0aW9ucyByYWlzaW5nCisgICBleGNlcHRpb25zLiAgU2luY2UgdGhleSdyZSAibm9yZXR1cm4iIGFuZCBkb24ndCB0YWtlIGFueSBwYXJhbWV0ZXJzLCBhCisgICB0ZXN0IGFuZCBjYWxsIG1pZ2h0IGV2ZW4gY29tZSBvdXQgYXMgYSBzaW1wbGUgY29uZGl0aW9uYWwganVtcC4gICovCit2b2lkCitfX2dtcF9zcXJ0X29mX25lZ2F0aXZlICh2b2lkKQoreworICBfX2dtcF9leGNlcHRpb24gKEdNUF9FUlJPUl9TUVJUX09GX05FR0FUSVZFKTsKK30KK3ZvaWQKK19fZ21wX2RpdmlkZV9ieV96ZXJvICh2b2lkKQoreworICBfX2dtcF9leGNlcHRpb24gKEdNUF9FUlJPUl9ESVZJU0lPTl9CWV9aRVJPKTsKK30KK3ZvaWQKK19fZ21wX292ZXJmbG93X2luX21weiAodm9pZCkKK3sKKyAgX19nbXBfZXhjZXB0aW9uIChHTVBfRVJST1JfTVBaX09WRVJGTE9XKTsKK30KZGlmZiAtLWdpdCBhL2V4dHJhY3QtZGJsLmMgYi9leHRyYWN0LWRibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NGQ2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYWN0LWRibC5jCkBAIC0wLDAgKzEsMzEwIEBACisvKiBfX2dtcF9leHRyYWN0X2RvdWJsZSAtLSBjb252ZXJ0IGZyb20gZG91YmxlIHRvIGFycmF5IG9mIG1wX2xpbWJfdC4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTktMjAwMiwgMjAwNiwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZmRlZiBYREVCVUcKKyN1bmRlZiBfR01QX0lFRUVfRkxPQVRTCisjZW5kaWYKKworI2lmbmRlZiBfR01QX0lFRUVfRkxPQVRTCisjZGVmaW5lIF9HTVBfSUVFRV9GTE9BVFMgMAorI2VuZGlmCisKKy8qIEV4dHJhY3QgYSBub24tbmVnYXRpdmUgZG91YmxlIGluIGQuICAqLworCitpbnQKK19fZ21wX2V4dHJhY3RfZG91YmxlIChtcF9wdHIgcnAsIGRvdWJsZSBkKQoreworICBsb25nIGV4cDsKKyAgdW5zaWduZWQgc2M7CisjaWZkZWYgX0xPTkdfTE9OR19MSU1CCisjZGVmaW5lIEJJVFNfUEVSX1BBUlQgNjQJLyogc29tZXdoYXQgYm9ndXMgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIGludCBtYW5sOworI2Vsc2UKKyNkZWZpbmUgQklUU19QRVJfUEFSVCBHTVBfTElNQl9CSVRTCisgIHVuc2lnbmVkIGxvbmcgaW50IG1hbmgsIG1hbmw7CisjZW5kaWYKKworICAvKiBCVUdTCisKKyAgICAgMS4gU2hvdWxkIGhhbmRsZSBJbmYgYW5kIE5hTiBpbiBJRUVFIHNwZWNpZmljIGNvZGUuCisgICAgIDIuIEhhbmRsZSBJbmYgYW5kIE5hTiBhbHNvIGluIGRlZmF1bHQgY29kZSwgdG8gYXZvaWQgaGFuZ3MuCisgICAgIDMuIEdlbmVyYWxpemUgdG8gaGFuZGxlIGFsbCBHTVBfTElNQl9CSVRTID49IDMyLgorICAgICA0LiBUaGlzIGxpdHMgaXMgaW5jb21wbGV0ZSBhbmQgbWlzc3BlbGxlZC4KKyAgICovCisKKyAgQVNTRVJUIChkID49IDAuMCk7CisKKyAgaWYgKGQgPT0gMC4wKQorICAgIHsKKyAgICAgIE1QTl9aRVJPIChycCwgTElNQlNfUEVSX0RPVUJMRSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZiBfR01QX0lFRUVfRkxPQVRTCisgIHsKKyNpZiBkZWZpbmVkIChfX2FscGhhKSAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID09IDgKKyAgICAvKiBXb3JrIGFyb3VuZCBhbHBoYS1zcGVjaWZpYyBidWcgaW4gR0NDIDIuOC54LiAgKi8KKyAgICB2b2xhdGlsZQorI2VuZGlmCisgICAgdW5pb24gaWVlZV9kb3VibGVfZXh0cmFjdCB4OworICAgIHguZCA9IGQ7CisgICAgZXhwID0geC5zLmV4cDsKKyNpZiBCSVRTX1BFUl9QQVJUID09IDY0CQkvKiBnZW5lcmFsaXplIHRoaXMgdG8gQklUU19QRVJfUEFSVCA+IEJJVFNfSU5fTUFOVElTU0EgKi8KKyAgICBtYW5sID0gKCgobXBfbGltYl90KSAxIDw8IDYzKQorCSAgICB8ICgobXBfbGltYl90KSB4LnMubWFuaCA8PCA0MykgfCAoKG1wX2xpbWJfdCkgeC5zLm1hbmwgPDwgMTEpKTsKKyAgICBpZiAoZXhwID09IDApCisgICAgICB7CisJLyogRGVub3JtYWxpemVkIG51bWJlci4gIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgYWJvdXQgdGhpcywKKwkgICBzaW5jZSBpdCBpcyBub3QgYW4gaW1wb3J0YW50IGNhc2UgdG8gbWFrZSBmYXN0LiAgKi8KKwlleHAgPSAxOworCWRvCisJICB7CisJICAgIG1hbmwgPSBtYW5sIDw8IDE7CisJICAgIGV4cC0tOworCSAgfQorCXdoaWxlICgobWFubCAmIEdNUF9MSU1CX0hJR0hCSVQpID09IDApOworICAgICAgfQorI2VuZGlmCisjaWYgQklUU19QRVJfUEFSVCA9PSAzMgorICAgIG1hbmggPSAoKG1wX2xpbWJfdCkgMSA8PCAzMSkgfCAoeC5zLm1hbmggPDwgMTEpIHwgKHgucy5tYW5sID4+IDIxKTsKKyAgICBtYW5sID0geC5zLm1hbmwgPDwgMTE7CisgICAgaWYgKGV4cCA9PSAwKQorICAgICAgeworCS8qIERlbm9ybWFsaXplZCBudW1iZXIuICBEb24ndCB0cnkgdG8gYmUgY2xldmVyIGFib3V0IHRoaXMsCisJICAgc2luY2UgaXQgaXMgbm90IGFuIGltcG9ydGFudCBjYXNlIHRvIG1ha2UgZmFzdC4gICovCisJZXhwID0gMTsKKwlkbworCSAgeworCSAgICBtYW5oID0gKG1hbmggPDwgMSkgfCAobWFubCA+PiAzMSk7CisJICAgIG1hbmwgPSBtYW5sIDw8IDE7CisJICAgIGV4cC0tOworCSAgfQorCXdoaWxlICgobWFuaCAmIEdNUF9MSU1CX0hJR0hCSVQpID09IDApOworICAgICAgfQorI2VuZGlmCisjaWYgQklUU19QRVJfUEFSVCAhPSAzMiAmJiBCSVRTX1BFUl9QQVJUICE9IDY0CisgIFlvdSBuZWVkIHRvIGdlbmVyYWxpemUgdGhlIGNvZGUgYWJvdmUgdG8gaGFuZGxlIHRoaXMuCisjZW5kaWYKKyAgICBleHAgLT0gMTAyMjsJCS8qIFJlbW92ZSBJRUVFIGJpYXMuICAqLworICB9CisjZWxzZQorICB7CisgICAgLyogVW5rbm93biAob3Iga25vd24gdG8gYmUgbm9uLUlFRUUpIGRvdWJsZSBmb3JtYXQuICAqLworICAgIGV4cCA9IDA7CisgICAgaWYgKGQgPj0gMS4wKQorICAgICAgeworCUFTU0VSVF9BTFdBWVMgKGQgKiAwLjUgIT0gZCk7CisKKwl3aGlsZSAoZCA+PSAzMjc2OC4wKQorCSAgeworCSAgICBkICo9ICgxLjAgLyA2NTUzNi4wKTsKKwkgICAgZXhwICs9IDE2OworCSAgfQorCXdoaWxlIChkID49IDEuMCkKKwkgIHsKKwkgICAgZCAqPSAwLjU7CisJICAgIGV4cCArPSAxOworCSAgfQorICAgICAgfQorICAgIGVsc2UgaWYgKGQgPCAwLjUpCisgICAgICB7CisJd2hpbGUgKGQgPCAoMS4wIC8gNjU1MzYuMCkpCisJICB7CisJICAgIGQgKj0gIDY1NTM2LjA7CisJICAgIGV4cCAtPSAxNjsKKwkgIH0KKwl3aGlsZSAoZCA8IDAuNSkKKwkgIHsKKwkgICAgZCAqPSAyLjA7CisJICAgIGV4cCAtPSAxOworCSAgfQorICAgICAgfQorCisgICAgZCAqPSAoNC4wICogKCh1bnNpZ25lZCBsb25nIGludCkgMSA8PCAoQklUU19QRVJfUEFSVCAtIDIpKSk7CisjaWYgQklUU19QRVJfUEFSVCA9PSA2NAorICAgIG1hbmwgPSBkOworI2VuZGlmCisjaWYgQklUU19QRVJfUEFSVCA9PSAzMgorICAgIG1hbmggPSBkOworICAgIG1hbmwgPSAoZCAtIG1hbmgpICogKDQuMCAqICgodW5zaWduZWQgbG9uZyBpbnQpIDEgPDwgKEJJVFNfUEVSX1BBUlQgLSAyKSkpOworI2VuZGlmCisgIH0KKyNlbmRpZiAvKiBJRUVFICovCisKKyAgc2MgPSAodW5zaWduZWQpIChleHAgKyA2NCAqIEdNUF9OVU1CX0JJVFMpICUgR01QX05VTUJfQklUUzsKKworICAvKiBXZSBhZGQgc29tZXRoaW5nIGhlcmUgdG8gZ2V0IHJvdW5kaW5nIHJpZ2h0LiAgKi8KKyAgZXhwID0gKGV4cCArIDY0ICogR01QX05VTUJfQklUUykgLyBHTVBfTlVNQl9CSVRTIC0gNjQgKiBHTVBfTlVNQl9CSVRTIC8gR01QX05VTUJfQklUUyArIDE7CisKKyNpZiBCSVRTX1BFUl9QQVJUID09IDY0ICYmIExJTUJTX1BFUl9ET1VCTEUgPT0gMgorI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICBpZiAoc2MgIT0gMCkKKyAgICB7CisgICAgICBycFsxXSA9IG1hbmwgPj4gKEdNUF9MSU1CX0JJVFMgLSBzYyk7CisgICAgICBycFswXSA9IG1hbmwgPDwgc2M7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcnBbMV0gPSBtYW5sOworICAgICAgcnBbMF0gPSAwOworICAgICAgZXhwLS07CisgICAgfQorI2Vsc2UKKyAgaWYgKHNjID4gR01QX05BSUxfQklUUykKKyAgICB7CisgICAgICBycFsxXSA9IG1hbmwgPj4gKEdNUF9MSU1CX0JJVFMgLSBzYyk7CisgICAgICBycFswXSA9IChtYW5sIDw8IChzYyAtIEdNUF9OQUlMX0JJVFMpKSAmIEdNUF9OVU1CX01BU0s7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHNjID09IDApCisJeworCSAgcnBbMV0gPSBtYW5sID4+IEdNUF9OQUlMX0JJVFM7CisJICBycFswXSA9IChtYW5sIDw8IEdNUF9OVU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTKSAmIEdNUF9OVU1CX01BU0s7CisJICBleHAtLTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcnBbMV0gPSBtYW5sID4+IChHTVBfTElNQl9CSVRTIC0gc2MpOworCSAgcnBbMF0gPSAobWFubCA+PiAoR01QX05BSUxfQklUUyAtIHNjKSkgJiBHTVBfTlVNQl9NQVNLOworCX0KKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgQklUU19QRVJfUEFSVCA9PSA2NCAmJiBMSU1CU19QRVJfRE9VQkxFID09IDMKKyAgaWYgKHNjID4gR01QX05BSUxfQklUUykKKyAgICB7CisgICAgICBycFsyXSA9IG1hbmwgPj4gKEdNUF9MSU1CX0JJVFMgLSBzYyk7CisgICAgICBycFsxXSA9IChtYW5sIDw8IHNjIC0gR01QX05BSUxfQklUUykgJiBHTVBfTlVNQl9NQVNLOworICAgICAgaWYgKHNjID49IDIgKiBHTVBfTkFJTF9CSVRTKQorCXJwWzBdID0gMDsKKyAgICAgIGVsc2UKKwlycFswXSA9IChtYW5sIDw8IEdNUF9OVU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTICsgc2MpICYgR01QX05VTUJfTUFTSzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2MgPT0gMCkKKwl7CisJICBycFsyXSA9IG1hbmwgPj4gR01QX05BSUxfQklUUzsKKwkgIHJwWzFdID0gKG1hbmwgPDwgR01QX05VTUJfQklUUyAtIEdNUF9OQUlMX0JJVFMpICYgR01QX05VTUJfTUFTSzsKKwkgIHJwWzBdID0gMDsKKwkgIGV4cC0tOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBycFsyXSA9IG1hbmwgPj4gKEdNUF9MSU1CX0JJVFMgLSBzYyk7CisJICBycFsxXSA9IChtYW5sID4+IEdNUF9OQUlMX0JJVFMgLSBzYykgJiBHTVBfTlVNQl9NQVNLOworCSAgcnBbMF0gPSAobWFubCA8PCBHTVBfTlVNQl9CSVRTIC0gR01QX05BSUxfQklUUyArIHNjKSAmIEdNUF9OVU1CX01BU0s7CisJfQorICAgIH0KKyNlbmRpZgorCisjaWYgQklUU19QRVJfUEFSVCA9PSAzMiAmJiBMSU1CU19QRVJfRE9VQkxFID09IDMKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyAgaWYgKHNjICE9IDApCisgICAgeworICAgICAgcnBbMl0gPSBtYW5oID4+IChHTVBfTElNQl9CSVRTIC0gc2MpOworICAgICAgcnBbMV0gPSAobWFuaCA8PCBzYykgfCAobWFubCA+PiAoR01QX0xJTUJfQklUUyAtIHNjKSk7CisgICAgICBycFswXSA9IG1hbmwgPDwgc2M7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcnBbMl0gPSBtYW5oOworICAgICAgcnBbMV0gPSBtYW5sOworICAgICAgcnBbMF0gPSAwOworICAgICAgZXhwLS07CisgICAgfQorI2Vsc2UKKyAgaWYgKHNjID4gR01QX05BSUxfQklUUykKKyAgICB7CisgICAgICBycFsyXSA9IChtYW5oID4+IChHTVBfTElNQl9CSVRTIC0gc2MpKTsKKyAgICAgIHJwWzFdID0gKChtYW5oIDw8IChzYyAtIEdNUF9OQUlMX0JJVFMpKSB8CisJICAgICAgIChtYW5sID4+IChHTVBfTElNQl9CSVRTIC0gc2MgKyBHTVBfTkFJTF9CSVRTKSkpICYgR01QX05VTUJfTUFTSzsKKyAgICAgIGlmIChzYyA+PSAyICogR01QX05BSUxfQklUUykKKwlycFswXSA9IChtYW5sIDw8IHNjIC0gMiAqIEdNUF9OQUlMX0JJVFMpICYgR01QX05VTUJfTUFTSzsKKyAgICAgIGVsc2UKKwlycFswXSA9IG1hbmwgPj4gKDIgKiBHTVBfTkFJTF9CSVRTIC0gc2MpICYgR01QX05VTUJfTUFTSzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc2MgPT0gMCkKKwl7CisJICBycFsyXSA9IG1hbmggPj4gR01QX05BSUxfQklUUzsKKwkgIHJwWzFdID0gKChtYW5oIDw8IEdNUF9OVU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTKSB8IChtYW5sID4+IDIgKiBHTVBfTkFJTF9CSVRTKSkgJiBHTVBfTlVNQl9NQVNLOworCSAgcnBbMF0gPSAobWFubCA8PCBHTVBfTlVNQl9CSVRTIC0gMiAqIEdNUF9OQUlMX0JJVFMpICYgR01QX05VTUJfTUFTSzsKKwkgIGV4cC0tOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBycFsyXSA9IChtYW5oID4+IChHTVBfTElNQl9CSVRTIC0gc2MpKTsKKwkgIHJwWzFdID0gKG1hbmggPj4gKEdNUF9OQUlMX0JJVFMgLSBzYykpICYgR01QX05VTUJfTUFTSzsKKwkgIHJwWzBdID0gKChtYW5oIDw8IChHTVBfTlVNQl9CSVRTIC0gR01QX05BSUxfQklUUyArIHNjKSkKKwkJICAgfCAobWFubCA+PiAoR01QX0xJTUJfQklUUyAtIChHTVBfTlVNQl9CSVRTIC0gR01QX05BSUxfQklUUyArIHNjKSkpKSAmIEdNUF9OVU1CX01BU0s7CisJfQorICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBCSVRTX1BFUl9QQVJUID09IDMyICYmIExJTUJTX1BFUl9ET1VCTEUgPiAzCisgIGlmIChzYyA9PSAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSBMSU1CU19QRVJfRE9VQkxFIC0gMTsgaSA+PSAwOyBpLS0pCisJeworCSAgcnBbaV0gPSBtYW5oID4+IChCSVRTX1BFUl9VTE9ORyAtIEdNUF9OVU1CX0JJVFMpOworCSAgbWFuaCA9ICgobWFuaCA8PCBHTVBfTlVNQl9CSVRTKQorCQkgIHwgKG1hbmwgPj4gKEJJVFNfUEVSX1VMT05HIC0gR01QX05VTUJfQklUUykpKTsKKwkgIG1hbmwgPSBtYW5sIDw8IEdNUF9OVU1CX0JJVFM7CisJfQorICAgICAgZXhwLS07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIHJwW0xJTUJTX1BFUl9ET1VCTEUgLSAxXSA9IChtYW5oID4+IChHTVBfTElNQl9CSVRTIC0gc2MpKTsKKyAgICAgIG1hbmggPSAobWFuaCA8PCBzYykgfCAobWFubCA+PiAoR01QX0xJTUJfQklUUyAtIHNjKSk7CisgICAgICBtYW5sID0gKG1hbmwgPDwgc2MpOworICAgICAgZm9yIChpID0gTElNQlNfUEVSX0RPVUJMRSAtIDI7IGkgPj0gMDsgaS0tKQorCXsKKwkgIHJwW2ldID0gbWFuaCA+PiAoQklUU19QRVJfVUxPTkcgLSBHTVBfTlVNQl9CSVRTKTsKKwkgIG1hbmggPSAoKG1hbmggPDwgR01QX05VTUJfQklUUykKKwkJICB8IChtYW5sID4+IChCSVRTX1BFUl9VTE9ORyAtIEdNUF9OVU1CX0JJVFMpKSk7CisJICBtYW5sID0gbWFubCA8PCBHTVBfTlVNQl9CSVRTOworCX0KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIGV4cDsKK30KZGlmZiAtLWdpdCBhL2dlbi1iYXNlcy5jIGIvZ2VuLWJhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZTdlZAotLS0gL2Rldi9udWxsCisrKyBiL2dlbi1iYXNlcy5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBHZW5lcmF0ZSBtcF9iYXNlcyBkYXRhLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMCwgMjAwMiwgMjAwNCwgMjAxMSwgMjAxMiwKKzIwMTUtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImJvb3RzdHJhcC5jIgorCisKK2ludCAgICBjaGFyc19wZXJfbGltYjsKK2ludCAgICBiaWdfYmFzZV9jdHo7CittcHpfdCAgYmlnX2Jhc2U7CitpbnQgICAgbm9ybWFsaXphdGlvbl9zdGVwczsKK21wel90ICBiaWdfYmFzZV9pbnZlcnRlZDsKK21wel90ICBiaWdfYmFzZV9iaW52ZXJ0ZWQ7CisKK21wel90ICB0OworCisjZGVmaW5lIFBPVzJfUChuKSAgKCgobikgJiAoKG4pIC0gMSkpID09IDApCisKK3Vuc2lnbmVkIGludAordWxvZzIgKHVuc2lnbmVkIGludCB4KQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgIHggIT0gMDsgIGkrKykKKyAgICB4ID4+PSAxOworICByZXR1cm4gaTsKK30KKwordm9pZAorYmludmVydCAoaW50IG51bWJfYml0cykKK3sKKyAgbXB6X3QgYmJvOworCisgIG1wel9pbml0X3NldCAoYmJvLCBiaWdfYmFzZSk7CisgIGJpZ19iYXNlX2N0eiA9IG1wel9tYWtlX29kZCAoYmJvKTsKKyAgbXB6X2ludmVydF8yZXhwIChiaWdfYmFzZV9iaW52ZXJ0ZWQsIGJibywgbnVtYl9iaXRzKTsKK30KKwordm9pZAorZ2VuZXJhdGUgKGludCBsaW1iX2JpdHMsIGludCBuYWlsX2JpdHMsIGludCBiYXNlKQoreworICBpbnQgIG51bWJfYml0cyA9IGxpbWJfYml0cyAtIG5haWxfYml0czsKKworICBtcHpfc2V0X3VpICh0LCAxTCk7CisgIG1wel9tdWxfMmV4cCAodCwgdCwgbnVtYl9iaXRzKTsKKyAgbXB6X3NldF91aSAoYmlnX2Jhc2UsIChsb25nKSBiYXNlKTsKKyAgY2hhcnNfcGVyX2xpbWIgPSAwOworICB3aGlsZSAobXB6X2NtcCAoYmlnX2Jhc2UsIHQpIDw9IDApCisgICAgeworICAgICAgbXB6X211bF91aSAoYmlnX2Jhc2UsIGJpZ19iYXNlLCAobG9uZykgYmFzZSk7CisgICAgICBjaGFyc19wZXJfbGltYisrOworICAgIH0KKworICBtcHpfdWlfcG93X3VpIChiaWdfYmFzZSwgKGxvbmcpIGJhc2UsIChsb25nKSBjaGFyc19wZXJfbGltYik7CisKKyAgbm9ybWFsaXphdGlvbl9zdGVwcyA9IGxpbWJfYml0cyAtIG1wel9zaXplaW5iYXNlIChiaWdfYmFzZSwgMik7CisKKyAgbXB6X3NldF91aSAodCwgMUwpOworICBtcHpfbXVsXzJleHAgKHQsIHQsIDIqbGltYl9iaXRzIC0gbm9ybWFsaXphdGlvbl9zdGVwcyk7CisgIG1wel90ZGl2X3EgKGJpZ19iYXNlX2ludmVydGVkLCB0LCBiaWdfYmFzZSk7CisgIG1wel9jbHJiaXQgKGJpZ19iYXNlX2ludmVydGVkLCBsaW1iX2JpdHMpOworCisgIGJpbnZlcnQgKG51bWJfYml0cyk7Cit9CisKK3ZvaWQKK2hlYWRlciAoaW50IGxpbWJfYml0cywgaW50IG5haWxfYml0cykKK3sKKyAgaW50ICBudW1iX2JpdHMgPSBsaW1iX2JpdHMgLSBuYWlsX2JpdHM7CisKKyAgZ2VuZXJhdGUgKGxpbWJfYml0cywgbmFpbF9iaXRzLCAxMCk7CisKKyAgcHJpbnRmICgiLyogVGhpcyBmaWxlIGdlbmVyYXRlZCBieSBnZW4tYmFzZXMuYyAtIERPIE5PVCBFRElULiAqL1xuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIiNpZiBHTVBfTlVNQl9CSVRTICE9ICVkXG4iLCBudW1iX2JpdHMpOworICBwcmludGYgKCJFcnJvciwgZXJyb3IsIHRoaXMgZGF0YSBpcyBmb3IgJWQgYml0c1xuIiwgbnVtYl9iaXRzKTsKKyAgcHJpbnRmICgiI2VuZGlmXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiLyogbXBfYmFzZXNbMTBdIGRhdGEsIGFzIGxpdGVyYWwgdmFsdWVzICovXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBNUF9CQVNFU19DSEFSU19QRVJfTElNQl8xMCAgICAgICVkXG4iLCBjaGFyc19wZXJfbGltYik7CisgIHByaW50ZiAoIiNkZWZpbmUgTVBfQkFTRVNfQklHX0JBU0VfQ1RaXzEwICAgICAgICAlZFxuIiwgYmlnX2Jhc2VfY3R6KTsKKyAgcHJpbnRmICgiI2RlZmluZSBNUF9CQVNFU19CSUdfQkFTRV8xMCAgICAgICAgICAgIENOU1RfTElNQigweCIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgYmlnX2Jhc2UpOworICBwcmludGYgKCIpXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBNUF9CQVNFU19CSUdfQkFTRV9JTlZFUlRFRF8xMCAgIENOU1RfTElNQigweCIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgYmlnX2Jhc2VfaW52ZXJ0ZWQpOworICBwcmludGYgKCIpXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBNUF9CQVNFU19CSUdfQkFTRV9CSU5WRVJURURfMTAgIENOU1RfTElNQigweCIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgYmlnX2Jhc2VfYmludmVydGVkKTsKKyAgcHJpbnRmICgiKVxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgTVBfQkFTRVNfTk9STUFMSVpBVElPTl9TVEVQU18xMCAlZFxuIiwgbm9ybWFsaXphdGlvbl9zdGVwcyk7Cit9CisKKworI2RlZmluZSBFWFRSQSAxNgorCisvKiBDb21wdXRlIGxvZygyKS9sb2coYikgYXMgYSBmaXhudW0uICovCit2b2lkCittcF8ybG9nYiAobXB6X3QgciwgaW50IGJpLCBpbnQgcHJlYykKK3sKKyAgbXB6X3QgdCwgdDIsIHR3bywgYjsKKyAgaW50IGk7CisKKyAgbXB6X2luaXQgKHQpOworICBtcHpfc2V0Yml0ICh0LCBwcmVjICsgRVhUUkEpOworCisgIG1wel9pbml0ICh0Mik7CisKKyAgbXB6X2luaXQgKHR3byk7CisgIG1wel9zZXRiaXQgKHR3bywgcHJlYyArIEVYVFJBICsgMSk7CisKKyAgbXB6X3NldF91aSAociwgMCk7CisKKyAgbXB6X2luaXRfc2V0X3VpIChiLCBiaSk7CisgIG1wel9tdWxfMmV4cCAoYiwgYiwgcHJlYytFWFRSQSk7CisKKyAgZm9yIChpID0gcHJlYy0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBtcHpfbXVsXzJleHAgKGIsIGIsIHByZWMrRVhUUkEpOworICAgICAgbXB6X3NxcnQgKGIsIGIpOworCisgICAgICBtcHpfbXVsICh0MiwgdCwgYik7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKHQyLCB0MiwgcHJlYytFWFRSQSk7CisKKyAgICAgIGlmIChtcHpfY21wICh0MiwgdHdvKSA8IDApCS8qIG5vdCB0b28gbGFyZ2U/ICovCisJeworCSAgbXB6X3NldGJpdCAociwgaSk7CQkvKiBzZXQgbmV4dCBsZXNzIHNpZ25pZmljYW50IGJpdCAqLworCSAgbXB6X3N3YXAgKHQsIHQyKTsJCS8qIG5ldyB2YWx1ZSBhY2NlcHRhYmxlICovCisJfQorICAgIH0KKworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKHQyKTsKKyAgbXB6X2NsZWFyICh0d28pOworICBtcHpfY2xlYXIgKGIpOworfQorCit2b2lkCit0YWJsZSAoaW50IGxpbWJfYml0cywgaW50IG5haWxfYml0cykKK3sKKyAgaW50ICBudW1iX2JpdHMgPSBsaW1iX2JpdHMgLSBuYWlsX2JpdHM7CisgIGludCAgYmFzZTsKKyAgbXB6X3QgciwgdCwgbG9nYjIsIGxvZzJiOworCisgIG1wel9pbml0IChyKTsKKyAgbXB6X2luaXQgKHQpOworICBtcHpfaW5pdCAobG9nYjIpOworICBtcHpfaW5pdCAobG9nMmIpOworCisgIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgZ2VuLWJhc2VzLmMgLSBETyBOT1QgRURJVC4gKi9cbiIpOworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcImdtcC1pbXBsLmhcIlxuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIiNpZiBHTVBfTlVNQl9CSVRTICE9ICVkXG4iLCBudW1iX2JpdHMpOworICBwcmludGYgKCJFcnJvciwgZXJyb3IsIHRoaXMgZGF0YSBpcyBmb3IgJWQgYml0c1xuIiwgbnVtYl9iaXRzKTsKKyAgcHJpbnRmICgiI2VuZGlmXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHV0cyAoImNvbnN0IHN0cnVjdCBiYXNlcyBtcF9iYXNlc1syNTddID1cbnsiKTsKKyAgcHV0cyAoIiAgLyogICAwICovIHsgMCwgMCwgMCwgMCwgMCB9LCIpOworICBwdXRzICgiICAvKiAgIDEgKi8geyAwLCAwLCAwLCAwLCAwIH0sIik7CisgIGZvciAoYmFzZSA9IDI7IGJhc2UgPD0gMjU2OyBiYXNlKyspCisgICAgeworICAgICAgZ2VuZXJhdGUgKGxpbWJfYml0cywgbmFpbF9iaXRzLCBiYXNlKTsKKyAgICAgIG1wXzJsb2diIChyLCBiYXNlLCBsaW1iX2JpdHMgKyA4KTsKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAobG9nYjIsIHIsIDgpOworICAgICAgbXB6X3NldF91aSAodCwgMSk7CisgICAgICBtcHpfbXVsXzJleHAgKHQsIHQsIDIqbGltYl9iaXRzICsgNSk7CisgICAgICBtcHpfc3ViX3VpICh0LCB0LCAxKTsKKyAgICAgIG1wel9hZGRfdWkgKHIsIHIsIDEpOworICAgICAgbXB6X3RkaXZfcSAobG9nMmIsIHQsIHIpOworCisgICAgICBwcmludGYgKCIgIC8qICUzdSAqLyB7ICIsIGJhc2UpOworICAgICAgaWYgKFBPVzJfUCAoYmFzZSkpCisJeworICAgICAgICAgIG1wel9zZXRfdWkgKGJpZ19iYXNlLCB1bG9nMiAoYmFzZSkgLSAxKTsKKwkgIG1wel9zZXRfdWkgKGJpZ19iYXNlX2ludmVydGVkLCAwKTsKKwl9CisKKyAgICAgIHByaW50ZiAoIiV1LCIsIGNoYXJzX3Blcl9saW1iKTsKKyAgICAgIHByaW50ZiAoIiBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBsb2diMik7CisgICAgICBwcmludGYgKCIpLCBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBsb2cyYik7CisgICAgICBwcmludGYgKCIpLCBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBiaWdfYmFzZSk7CisgICAgICBwcmludGYgKCIpLCBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBiaWdfYmFzZV9pbnZlcnRlZCk7CisgICAgICBwcmludGYgKCIpIH0sXG4iKTsKKyAgICB9CisKKyAgcHV0cyAoIn07Iik7CisKKyAgbXB6X2NsZWFyIChyKTsKKyAgbXB6X2NsZWFyICh0KTsKKyAgbXB6X2NsZWFyIChsb2diMik7CisgIG1wel9jbGVhciAobG9nMmIpOworCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgIGxpbWJfYml0cywgbmFpbF9iaXRzOworCisgIG1wel9pbml0IChiaWdfYmFzZSk7CisgIG1wel9pbml0IChiaWdfYmFzZV9pbnZlcnRlZCk7CisgIG1wel9pbml0IChiaWdfYmFzZV9iaW52ZXJ0ZWQpOworICBtcHpfaW5pdCAodCk7CisKKyAgaWYgKGFyZ2MgIT0gNCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogZ2VuLWJhc2VzIDxoZWFkZXJ8dGFibGU+IDxsaW1iYml0cz4gPG5haWxiaXRzPlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbGltYl9iaXRzID0gYXRvaSAoYXJndlsyXSk7CisgIG5haWxfYml0cyA9IGF0b2kgKGFyZ3ZbM10pOworCisgIGlmIChsaW1iX2JpdHMgPD0gMAorICAgICAgfHwgbmFpbF9iaXRzIDwgMAorICAgICAgfHwgbmFpbF9iaXRzID49IGxpbWJfYml0cykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGxpbWIvbmFpbCBiaXRzOiAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgIGxpbWJfYml0cywgbmFpbF9iaXRzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAoc3RyY21wIChhcmd2WzFdLCAiaGVhZGVyIikgPT0gMCkKKyAgICBoZWFkZXIgKGxpbWJfYml0cywgbmFpbF9iaXRzKTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAidGFibGUiKSA9PSAwKQorICAgIHRhYmxlIChsaW1iX2JpdHMsIG5haWxfYml0cyk7CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGhlYWRlci90YWJsZSBjaG9pY2U6ICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dlbi1mYWMuYyBiL2dlbi1mYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ViZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ2VuLWZhYy5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiBHZW5lcmF0ZSBkYXRhIGZvciBjb21iaW5hdG9yaWNzOiBmYWNfdWksIGJpbl91aXVpLCAuLi4KKworQ29weXJpZ2h0IDIwMDIsIDIwMTEtMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJib290c3RyYXAuYyIKKworaW50CittcHpfcmVtb3ZlX3R3b3MgKG1wel90IHgpCit7CisgIG1wX2JpdGNudF90IHIgPSBtcHpfc2NhbjEoeCwgMCk7CisgIG1wel90ZGl2X3FfMmV4cCAoeCwgeCwgcik7CisgIHJldHVybiByOworfQorCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcwkJKi8KK2ludAorZ2VuX2NvbnN0cyAodW5zaWduZWQgbnVtYiwgdW5zaWduZWQgbGltYikKK3sKKyAgbXB6X3QgeCwgbWFzaywgeSwgbGFzdDsKKyAgdW5zaWduZWQgbG9uZyBhLCBiOworICB1bnNpZ25lZCBsb25nIG9mbCwgb2ZlOworCisgIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBnZW4tZmFjLmMgKi9cblxuIik7CisgIHByaW50ZiAoIiNpZiBHTVBfTlVNQl9CSVRTICE9ICV1XG4iLCBudW1iKTsKKyAgcHJpbnRmICgiRXJyb3IgLCBlcnJvciB0aGlzIGRhdGEgaXMgZm9yICV1IEdNUF9OVU1CX0JJVFMgb25seVxuIiwgbnVtYik7CisgIHByaW50ZiAoIiNlbmRpZlxuIik7CisjaWYgMAorICBwcmludGYgKCIjaWYgR01QX0xJTUJfQklUUyAhPSAldVxuIiwgbGltYik7CisgIHByaW50ZiAoIkVycm9yICwgZXJyb3IgdGhpcyBkYXRhIGlzIGZvciAldSBHTVBfTElNQl9CSVRTIG9ubHlcbiIsIGxpbWIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworI2VuZGlmCisKKyAgcHJpbnRmCisgICAgKCIvKiBUaGlzIHRhYmxlIGlzIDAhLDEhLDIhLDMhLC4uLixuISB3aGVyZSBuISBoYXMgPD0gR01QX05VTUJfQklUUyBiaXRzICovXG4iKTsKKyAgcHJpbnRmCisgICAgKCIjZGVmaW5lIE9ORV9MSU1CX0ZBQ1RPUklBTF9UQUJMRSBDTlNUX0xJTUIoMHgxKSxDTlNUX0xJTUIoMHgxIik7CisgIG1wel9pbml0X3NldF91aSAoeCwgMSk7CisgIG1wel9pbml0IChsYXN0KTsKKyAgZm9yIChiID0gMjs7IGIrKykKKyAgICB7CisgICAgICBtcHpfbXVsX3VpICh4LCB4LCBiKTsJLyogc28gYiE9YSAgICAgICAqLworICAgICAgaWYgKG1wel9zaXplaW5iYXNlICh4LCAyKSA+IG51bWIpCisJYnJlYWs7CisgICAgICBwcmludGYgKCIpLENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIHgpOworICAgIH0KKyAgcHJpbnRmICgiKVxuIik7CisKKyAgcHJpbnRmCisgICAgKCJcbi8qIFRoaXMgdGFibGUgaXMgMCEsMSEsMiEvMiwzIS8yLC4uLixuIS8yXnNuIHdoZXJlIG4hLzJec24gaXMgYW4gKi9cbiIpOworICBwcmludGYKKyAgICAoIi8qIG9kZCBpbnRlZ2VyIGZvciBlYWNoIG4sIGFuZCBuIS8yXnNuIGhhcyA8PSBHTVBfTlVNQl9CSVRTIGJpdHMgKi9cbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgT05FX0xJTUJfT0REX0ZBQ1RPUklBTF9UQUJMRSBDTlNUX0xJTUIoMHgxKSxDTlNUX0xJTUIoMHgxKSxDTlNUX0xJTUIoMHgxIik7CisgIG1wel9zZXRfdWkgKHgsIDEpOworICBmb3IgKGIgPSAzOzsgYisrKQorICAgIHsKKyAgICAgIGZvciAoYSA9IGI7IChhICYgMSkgPT0gMDsgYSA+Pj0gMSk7CisgICAgICBtcHpfc3dhcCAobGFzdCwgeCk7CisgICAgICBtcHpfbXVsX3VpICh4LCBsYXN0LCBhKTsKKyAgICAgIGlmIChtcHpfc2l6ZWluYmFzZSAoeCwgMikgPiBudW1iKQorCWJyZWFrOworICAgICAgcHJpbnRmICgiKSxDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCB4KTsKKyAgICB9CisgIHByaW50ZiAoIilcbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgT0REX0ZBQ1RPUklBTF9UQUJMRV9NQVggQ05TVF9MSU1CKDB4Iik7CisgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBsYXN0KTsKKyAgcHJpbnRmICgiKVxuIik7CisKKyAgb2ZsID0gYiAtIDE7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUICglbHUpXG4iLCBvZmwpOworICBtcHpfaW5pdCAobWFzayk7CisgIG1wel9zZXRiaXQgKG1hc2ssIG51bWIpOworICBtcHpfc3ViX3VpIChtYXNrLCBtYXNrLCAxKTsKKyAgcHJpbnRmCisgICAgKCJcbi8qIFByZXZpb3VzIHRhYmxlLCBjb250aW51ZWQsIHZhbHVlcyBtb2R1bG8gMl5HTVBfTlVNQl9CSVRTICovXG4iKTsKKyAgcHJpbnRmCisgICAgKCIjZGVmaW5lIE9ORV9MSU1CX09ERF9GQUNUT1JJQUxfRVhUVEFCTEUgQ05TVF9MSU1CKDB4Iik7CisgIG1wel9hbmQgKHgsIHgsIG1hc2spOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgeCk7CisgIG1wel9pbml0ICh5KTsKKyAgbXB6X2Jpbl91aXVpICh5LCBiLCBiLzIpOworICBiKys7CisgIGZvciAoOzsgYisrKQorICAgIHsKKyAgICAgIGZvciAoYSA9IGI7IChhICYgMSkgPT0gMDsgYSA+Pj0gMSk7CisgICAgICBpZiAoYSA9PSBiKSB7CisJbXB6X2RpdmV4YWN0X3VpICh5LCB5LCBhLzIrMSk7CisJbXB6X211bF91aSAoeSwgeSwgYSk7CisgICAgICB9IGVsc2UKKwltcHpfbXVsXzJleHAgKHksIHksIDEpOworICAgICAgaWYgKG1wel9zaXplaW5iYXNlICh5LCAyKSA+IG51bWIpCisJYnJlYWs7CisgICAgICBtcHpfbXVsX3VpICh4LCB4LCBhKTsKKyAgICAgIG1wel9hbmQgKHgsIHgsIG1hc2spOworICAgICAgcHJpbnRmICgiKSxDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCB4KTsKKyAgICB9CisgIHByaW50ZiAoIilcbiIpOworICBvZmUgPSBiIC0gMTsKKyAgcHJpbnRmCisgICAgKCIjZGVmaW5lIE9ERF9GQUNUT1JJQUxfRVhUVEFCTEVfTElNSVQgKCVsdSlcbiIsIG9mZSk7CisKKyAgcHJpbnRmCisgICAgKCJcbi8qIFRoaXMgdGFibGUgaXMgMSEhLDMhISwuLi4sKDJuKzEpISEgd2hlcmUgKDJuKzEpISEgaGFzIDw9IEdNUF9OVU1CX0JJVFMgYml0cyAqL1xuIik7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPTkVfTElNQl9PRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFIENOU1RfTElNQigweDEiKTsKKyAgbXB6X3NldF91aSAoeCwgMSk7CisgIGZvciAoYiA9IDM7OyBiKz0yKQorICAgIHsKKyAgICAgIG1wel9zd2FwIChsYXN0LCB4KTsKKyAgICAgIG1wel9tdWxfdWkgKHgsIGxhc3QsIGIpOworICAgICAgaWYgKG1wel9zaXplaW5iYXNlICh4LCAyKSA+IG51bWIpCisJYnJlYWs7CisgICAgICBwcmludGYgKCIpLENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIHgpOworICAgIH0KKyAgcHJpbnRmICgiKVxuIik7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX01BWCBDTlNUX0xJTUIoMHgiKTsKKyAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIGxhc3QpOworICBwcmludGYgKCIpXG4iKTsKKworICBwcmludGYKKyAgICAoIiNkZWZpbmUgT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCAoJWx1KVxuIiwgYiAtIDIpOworCisgIHByaW50ZgorICAgICgiXG4vKiBUaGlzIHRhYmxlIHhfMSwgeF8yLC4uLiBjb250YWlucyB2YWx1ZXMgcy50LiB4X25ebiBoYXMgPD0gR01QX05VTUJfQklUUyBiaXRzICovXG4iKTsKKyAgcHJpbnRmCisgICAgKCIjZGVmaW5lIE5USF9ST09UX05VTUJfTUFTS19UQUJMRSAoR01QX05VTUJfTUFTSyIpOworICBmb3IgKGIgPSAyO2IgPD0gODsgYisrKQorICAgIHsKKyAgICAgIG1wel9yb290ICh4LCBtYXNrLCBiKTsKKyAgICAgIHByaW50ZiAoIiksQ05TVF9MSU1CKDB4Iik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgeCk7CisgICAgfQorICBwcmludGYgKCIpXG4iKTsKKworICBtcHpfYWRkX3VpIChtYXNrLCBtYXNrLCAxKTsKKyAgcHJpbnRmCisgICAgKCJcbi8qIFRoaXMgdGFibGUgY29udGFpbnMgaW52ZXJzZXMgb2Ygb2RkIGZhY3RvcmlhbHMsIG1vZHVsbyAyXkdNUF9OVU1CX0JJVFMgKi9cbiIpOworICBwcmludGYKKyAgICAoIlxuLyogSXQgYmVnaW5zIHdpdGggKDIhLzIpXi0xPTEgKi9cbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgT05FX0xJTUJfT0REX0ZBQ1RPUklBTF9JTlZFUlNFU19UQUJMRSBDTlNUX0xJTUIoMHgxIik7CisgIG1wel9zZXRfdWkgKHgsIDEpOworICBmb3IgKGIgPSAzO2IgPD0gb2ZlIC0gMjsgYisrKQorICAgIHsKKyAgICAgIGZvciAoYSA9IGI7IChhICYgMSkgPT0gMDsgYSA+Pj0gMSk7CisgICAgICBtcHpfbXVsX3VpICh4LCB4LCBhKTsKKyAgICAgIG1wel9pbnZlcnQgKHksIHgsIG1hc2spOworICAgICAgcHJpbnRmICgiKSxDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCB5KTsKKyAgICB9CisgIHByaW50ZiAoIilcbiIpOworCisgIG9mZSA9IChvZmUgLyAxNiArIDEpICogMTY7CisKKyAgcHJpbnRmCisgICAgKCJcbi8qIFRoaXMgdGFibGUgY29udGFpbnMgMm4tcG9wYygybikgZm9yIHNtYWxsIG4gKi9cbiIpOworICBwcmludGYKKyAgICAoIlxuLyogSXQgYmVnaW5zIHdpdGggMi0xPTEgKG49MSkgKi9cbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgVEFCTEVfMk5fTUlOVVNfUE9QQ18yTiAxIik7CisgIGZvciAoYiA9IDQ7IGIgPD0gb2ZlOyBiICs9IDIpCisgICAgeworICAgICAgbXB6X3NldF91aSAoeCwgYik7CisgICAgICBwcmludGYgKCIsJWx1IixiIC0gbXB6X3BvcGNvdW50ICh4KSk7CisgICAgfQorICBwcmludGYgKCJcbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgVEFCTEVfTElNSVRfMk5fTUlOVVNfUE9QQ18yTiAlbHVcbiIsIG9mZSArIDEpOworCisKKyAgb2ZsID0gKG9mbCArIDEpIC8gMjsKKyAgcHJpbnRmCisgICAgKCIjZGVmaW5lIE9ERF9DRU5UUkFMX0JJTk9NSUFMX09GRlNFVCAoJWx1KVxuIiwgb2ZsKTsKKyAgcHJpbnRmCisgICAgKCJcbi8qIFRoaXMgdGFibGUgY29udGFpbnMgYmlub21pYWwoMmssaykvMl50ICovXG4iKTsKKyAgcHJpbnRmCisgICAgKCJcbi8qIEl0IGJlZ2lucyB3aXRoIE9ERF9DRU5UUkFMX0JJTk9NSUFMX1RBQkxFX01JTiAqL1xuIik7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPTkVfTElNQl9PRERfQ0VOVFJBTF9CSU5PTUlBTF9UQUJMRSAiKTsKKyAgZm9yIChiID0gb2ZsOzsgYisrKQorICAgIHsKKyAgICAgIG1wel9iaW5fdWl1aSAoeCwgMiAqIGIsIGIpOworICAgICAgbXB6X3JlbW92ZV90d29zICh4KTsKKyAgICAgIGlmIChtcHpfc2l6ZWluYmFzZSAoeCwgMikgPiBudW1iKQorCWJyZWFrOworICAgICAgaWYgKGIgIT0gb2ZsKQorCXByaW50ZiAoIiksIik7CisgICAgICBwcmludGYoIkNOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIHgpOworICAgIH0KKyAgcHJpbnRmICgiKVxuIik7CisKKyAgb2ZlID0gYiAtIDE7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPRERfQ0VOVFJBTF9CSU5PTUlBTF9UQUJMRV9MSU1JVCAoJWx1KVxuIiwgb2ZlKTsKKworICBwcmludGYKKyAgICAoIlxuLyogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52ZXJzZXMgb2YgZWxlbWVudHMgaW4gdGhlIHByZXZpb3VzIHRhYmxlLiAqL1xuIik7CisgIHByaW50ZgorICAgICgiI2RlZmluZSBPTkVfTElNQl9PRERfQ0VOVFJBTF9CSU5PTUlBTF9JTlZFUlNFX1RBQkxFIENOU1RfTElNQigweCIpOworICBmb3IgKGIgPSBvZmw7IGIgPD0gb2ZlOyBiKyspCisgICAgeworICAgICAgbXB6X2Jpbl91aXVpICh4LCAyICogYiwgYik7CisgICAgICBtcHpfcmVtb3ZlX3R3b3MgKHgpOworICAgICAgbXB6X2ludmVydCAoeCwgeCwgbWFzayk7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgeCk7CisgICAgICBpZiAoYiAhPSBvZmUpCisJcHJpbnRmICgiKSxDTlNUX0xJTUIoMHgiKTsKKyAgICB9CisgIHByaW50ZiAoIilcbiIpOworCisgIHByaW50ZgorICAgICgiXG4vKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSB2YWx1ZXMgdCBpbiB0aGUgZm9ybXVsYSBiaW5vbWlhbCgyayxrKS8yXnQgKi9cbiIpOworICBwcmludGYKKyAgICAoIiNkZWZpbmUgQ0VOVFJBTF9CSU5PTUlBTF8yRkFDX1RBQkxFICIpOworICBmb3IgKGIgPSBvZmw7IGIgPD0gb2ZlOyBiKyspCisgICAgeworICAgICAgbXB6X2Jpbl91aXVpICh4LCAyICogYiwgYik7CisgICAgICBwcmludGYgKCIlZCIsIG1wel9yZW1vdmVfdHdvcyAoeCkpOworICAgICAgaWYgKGIgIT0gb2ZlKQorCXByaW50ZiAoIiwiKTsKKyAgICB9CisgIHByaW50ZiAoIlxuIik7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IG5haWxfYml0cywgbGltYl9iaXRzLCBudW1iX2JpdHM7CisKKyAgaWYgKGFyZ2MgIT0gMykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogZ2VuLWZhYyBsaW1iYml0cyBuYWlsYml0c1xuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGxpbWJfYml0cyA9IGF0b2kgKGFyZ3ZbMV0pOworICBuYWlsX2JpdHMgPSBhdG9pIChhcmd2WzJdKTsKKyAgbnVtYl9iaXRzID0gbGltYl9iaXRzIC0gbmFpbF9iaXRzOworICBpZiAobGltYl9iaXRzIDwgMiB8fCBuYWlsX2JpdHMgPCAwIHx8IG51bWJfYml0cyA8IDEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCBsaW1iL25haWwgYml0cyAlZCwlZFxuIiwgbGltYl9iaXRzLAorCSAgICAgICBuYWlsX2JpdHMpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBnZW5fY29uc3RzIChudW1iX2JpdHMsIGxpbWJfYml0cyk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2VuLWZpYi5jIGIvZ2VuLWZpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2E2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZW4tZmliLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIEdlbmVyYXRlIEZpYm9uYWNjaSB0YWJsZSBkYXRhLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNCwgMjAxMiwgMjAxNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiYm9vdHN0cmFwLmMiCisKK21wel90ICAqZjsKK2ludCAgICBmbnVtLCBmaWJfbGltaXQsIGx1Y19saW1pdDsKKwordm9pZAorZ2VuZXJhdGUgKGludCBudW1iX2JpdHMpCit7CisgIG1wel90ICBsaW1pdCwgbDsKKyAgaW50ICAgIGZhbGxvYywgaTsKKworICBtcHpfaW5pdDIgKGxpbWl0LCBudW1iX2JpdHMgKyAxKTsKKyAgbXB6X3NldGJpdCAobGltaXQsIG51bWJfYml0cyk7CisKKyAgLyogZmliKDJuKSA+IDJebiwgc28gdXNlIDJuIGFzIGEgbGltaXQgZm9yIHRoZSB0YWJsZSBzaXplICovCisgIGZhbGxvYyA9IDIgKiBudW1iX2JpdHM7CisgIGYgPSAobXB6X3QqKSB4bWFsbG9jIChmYWxsb2MgKiBzaXplb2YgKCpmKSk7CisKKyAgbXB6X2luaXRfc2V0X3VpIChmWzBdLCAxTCk7ICAvKiBGWy0xXSAqLworICBtcHpfaW5pdF9zZXRfdWkgKGZbMV0sIDBMKTsgIC8qIEZbMF0gKi8KKworICBtcHpfaW5pdCAobCk7CisKKyAgZm9yIChpID0gMjsgOyBpKyspCisgICAgeworICAgICAgYXNzZXJ0IChpIDwgZmFsbG9jKTsKKworICAgICAgLyogRltpXSA9IEZbaS0xXSArIEZbaS0yXSAqLworICAgICAgbXB6X2luaXQgKGZbaV0pOworICAgICAgbXB6X2FkZCAoZltpXSwgZltpLTFdLCBmW2ktMl0pOworICAgICAgaWYgKG1wel9jbXAgKGZbaV0sIGxpbWl0KSA+PSAwKQorICAgICAgICBicmVhazsKKworICAgICAgZm51bSA9IGkrMTsKKyAgICAgIGZpYl9saW1pdCA9IGktMTsKKworICAgICAgLyogTFtpXSA9IEZbaV0rMipGW2ktMV0gKi8KKyAgICAgIG1wel9hZGQgKGwsIGZbaV0sIGZbaS0xXSk7CisgICAgICBtcHpfYWRkIChsLCBsLCBmW2ktMV0pOworCisgICAgICBpZiAobXB6X2NtcCAobCwgbGltaXQpIDwgMCkKKyAgICAgICAgbHVjX2xpbWl0ID0gaS0xOworICAgIH0KKworICBtcHpfY2xlYXIgKGxpbWl0KTsKK30KKworCit2b2lkCitoZWFkZXIgKGludCBudW1iX2JpdHMpCit7CisgIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgZ2VuLWZpYi5jIC0gRE8gTk9UIEVESVQuICovXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiI2lmIEdNUF9OVU1CX0JJVFMgIT0gJWRcbiIsIG51bWJfYml0cyk7CisgIHByaW50ZiAoIkVycm9yLCBlcnJvciwgdGhpcyBkYXRhIGlzIGZvciAlZCBiaXRzXG4iLCBudW1iX2JpdHMpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIEZJQl9UQUJMRV9MSU1JVCAgICAgICAgICVkXG4iLCBmaWJfbGltaXQpOworICBwcmludGYgKCIjZGVmaW5lIEZJQl9UQUJMRV9MVUNOVU1fTElNSVQgICVkXG4iLCBsdWNfbGltaXQpOworfQorCit2b2lkCit0YWJsZSAoaW50IG51bWJfYml0cykKK3sKKyAgaW50ICBpOworCisgIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgZ2VuLWZpYi5jIC0gRE8gTk9UIEVESVQuICovXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJnbXAuaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJnbXAtaW1wbC5oXCJcbiIpOworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjaWYgR01QX05VTUJfQklUUyAhPSAlZFxuIiwgbnVtYl9iaXRzKTsKKyAgcHJpbnRmICgiRXJyb3IsIGVycm9yLCB0aGlzIGRhdGEgaXMgZm9yICVkIGJpdHNcbiIsIG51bWJfYml0cyk7CisgIHByaW50ZiAoIiNlbmRpZlxuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoImNvbnN0IG1wX2xpbWJfdFxuIik7CisgIHByaW50ZiAoIl9fZ21wX2ZpYl90YWJsZVtGSUJfVEFCTEVfTElNSVQrMl0gPSB7XG4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZm51bTsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgQ05TVF9MSU1CICgweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIGZbaV0pOworICAgICAgcHJpbnRmICgiKSwgIC8qICVkICovXG4iLCBpLTEpOworICAgIH0KKyAgcHJpbnRmICgifTtcbiIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCAgbGltYl9iaXRzLCBuYWlsX2JpdHMsIG51bWJfYml0czsKKworICBpZiAoYXJnYyAhPSA0KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBnZW4tZmliIDxoZWFkZXJ8dGFibGU+IDxsaW1iYml0cz4gPG5haWxiaXRzPlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbGltYl9iaXRzID0gYXRvaSAoYXJndlsyXSk7CisgIG5haWxfYml0cyA9IGF0b2kgKGFyZ3ZbM10pOworCisgIGlmIChsaW1iX2JpdHMgPD0gMAorICAgICAgfHwgbmFpbF9iaXRzIDwgMAorICAgICAgfHwgbmFpbF9iaXRzID49IGxpbWJfYml0cykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGxpbWIvbmFpbCBiaXRzOiAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgIGxpbWJfYml0cywgbmFpbF9iaXRzKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgbnVtYl9iaXRzID0gbGltYl9iaXRzIC0gbmFpbF9iaXRzOworCisgIGdlbmVyYXRlIChudW1iX2JpdHMpOworCisgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICJoZWFkZXIiKSA9PSAwKQorICAgIGhlYWRlciAobnVtYl9iaXRzKTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAidGFibGUiKSA9PSAwKQorICAgIHRhYmxlIChudW1iX2JpdHMpOworICBlbHNlCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCBoZWFkZXIvdGFibGUgY2hvaWNlOiAlc1xuIiwgYXJndlsxXSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZW4tamFjb2JpdGFiLmMgYi9nZW4tamFjb2JpdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3OTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2dlbi1qYWNvYml0YWIuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogZ2VuLWphY29iaS5jCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBOaWVscyBNw7ZsbGVyLgorCitDb3B5cmlnaHQgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyogR2VuZXJhdGUgdGhlIGxvb2t1cCB0YWJsZSBuZWVkZWQgZm9yIGZhc3QgbGVmdC10by1yaWdodCBjb21wdXRhdGlvbgorICAgb2YgdGhlIEphY29iaSBzeW1ib2wuICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfSBkZWNvZGVfdGFibGVbMTNdID0geworICAvKiAgMCAqLyB7IDAsIDEgfSwKKyAgLyogIDEgKi8geyAwLCAzIH0sCisgIC8qICAyICovIHsgMSwgMSB9LAorICAvKiAgMyAqLyB7IDEsIDMgfSwKKyAgLyogIDQgKi8geyAyLCAxIH0sCisgIC8qICA1ICovIHsgMiwgMyB9LAorICAvKiAgNiAqLyB7IDMsIDEgfSwKKyAgLyogIDcgKi8geyAzLCAzIH0sIC8qIGQgPSAxICovCisgIC8qICA4ICovIHsgMSwgMCB9LAorICAvKiAgOSAqLyB7IDEsIDIgfSwKKyAgLyogMTAgKi8geyAzLCAwIH0sCisgIC8qIDExICovIHsgMywgMiB9LAorICAvKiAxMiAqLyB7IDMsIDMgfSwgLyogZCA9IDAgKi8KKworfTsKKyNkZWZpbmUgSkFDT0JJX0EoYml0cykgKGRlY29kZV90YWJsZVsoYml0cyk+PjFdLmEpCisjZGVmaW5lIEpBQ09CSV9CKGJpdHMpIChkZWNvZGVfdGFibGVbKGJpdHMpPj4xXS5iKQorCisjZGVmaW5lIEpBQ09CSV9FKGJpdHMpICgoYml0cykgJiAxKQorI2RlZmluZSBKQUNPQklfRChiaXRzKSAoKChiaXRzKT4+MSkgPT0gNykgLyogR2l2ZXMgMCBmb3IgZG9uJ3QgY2FyZSBzdGF0ZXMuICovCisKK3N0YXRpYyB1bnNpZ25lZAorZW5jb2RlICh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiLCB1bnNpZ25lZCBkKQoreworICB1bnNpZ25lZCBpOworCisgIGFzc2VydCAoZCA8IDIpOworICBhc3NlcnQgKGEgPCA0KTsKKyAgYXNzZXJ0IChiIDwgNCk7CisgIGFzc2VydCAoIChhIHwgYiApICYgMSk7CisKKyAgaWYgKGEgPT0gMyAmJiBiID09IDMpCisgICAgcmV0dXJuIGQgPyA3IDogMTI7CisKKyAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgaWYgKGRlY29kZV90YWJsZVtpXS5hID09IGEKKwkmJiBkZWNvZGVfdGFibGVbaV0uYiA9PSBiKQorICAgICAgcmV0dXJuIGk7CisKKyAgYWJvcnQgKCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB1bnNpZ25lZCBiaXRzOworCisgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAyMDg7IGJpdHMrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBlLCBhLCBiLCBkX29sZCwgZCwgcTsKKworICAgICAgaWYgKGJpdHMgJiYgIShiaXRzICYgMHhmKSkKKwlwcmludGYoIlxuIik7CisKKyAgICAgIHEgPSBiaXRzICYgMzsKKyAgICAgIGQgPSAoYml0cyA+PiAyKSAmIDE7CisKKyAgICAgIGUgPSBKQUNPQklfRSAoYml0cyA+PiAzKTsKKyAgICAgIGEgPSBKQUNPQklfQSAoYml0cyA+PiAzKTsKKyAgICAgIGIgPSBKQUNPQklfQiAoYml0cyA+PiAzKTsKKyAgICAgIGRfb2xkID0gSkFDT0JJX0QgKGJpdHMgPj4gMyk7CisKKyAgICAgIGlmIChkICE9IGRfb2xkICYmIGEgPT0gMyAmJiBiID09IDMpCisJZSBePSAxOworCisgICAgICBpZiAoZCA9PSAxKQorCXsKKwkgIGlmIChiID09IDIpCisJICAgIGUgXj0gKHEgJiAoYSA+PiAxKSkgXiAocSA+PiAxKTsKKwkgIGEgPSAoYSAtIHEgKiBiKSAmIDM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChhID09IDIpCisJICAgIGUgXj0gKHEgJiAoYiA+PiAxKSkgXiAocSA+PiAxKTsKKwkgIGIgPSAoYiAtIHEgKiBhKSAmIDM7CisJfQorCisgICAgICBwcmludGYoIiUyZCwiLCAoZW5jb2RlIChhLCBiLCBkKSA8PCAxKSB8IGUpOworICAgIH0KKyAgcHJpbnRmKCJcbiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2VuLXBzcXIuYyBiL2dlbi1wc3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwNTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2dlbi1wc3FyLmMKQEAgLTAsMCArMSw1ODUgQEAKKy8qIEdlbmVyYXRlIHBlcmZlY3Qgc3F1YXJlIHRlc3RpbmcgZGF0YS4KKworQ29weXJpZ2h0IDIwMDItMjAwNCwgMjAxMiwgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJib290c3RyYXAuYyIKKworCisvKiBUaGUgYWltIG9mIHRoaXMgcHJvZ3JhbSBpcyB0byBjaG9vc2UgZWl0aGVyIG1wbl9tb2RfMzRsc3ViMSBvciBtcG5fbW9kXzEKKyAgIChwbHVzIGEgUEVSRlNRUl9QUCBtb2R1bHVzKSwgYW5kIGdlbmVyYXRlIHRhYmxlcyBpbmRpY2F0aW5nIHF1YWRyYXRpYworICAgcmVzaWR1ZXMgYW5kIG5vbi1yZXNpZHVlcyBtb2R1bG8gc21hbGwgZmFjdG9ycyBvZiB0aGF0IG1vZHVsdXMuCisKKyAgIEZvciB0aGUgdXN1YWwgMzIgb3IgNjQgYml0IGNhc2VzIG1wbl9tb2RfMzRsc3ViMSBnZXRzIHVzZWQuICBUaGF0CisgICBmdW5jdGlvbiBleGlzdHMgc3BlY2lmaWNhbGx5IGJlY2F1c2UgMl4yNC0xIGFuZCAyXjQ4LTEgaGF2ZSBuaWNlIHNldHMgb2YKKyAgIHByaW1lIGZhY3RvcnMuICBGb3Igb3RoZXIgbGltYiBzaXplcyBpdCdzIGNvbnNpZGVyZWQsIGJ1dCBpZiBpdCBkb2Vzbid0CisgICBoYXZlIGdvb2QgZmFjdG9ycyB0aGVuIG1wbl9tb2RfMSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKworICAgV2hlbiBtcG5fbW9kXzEgaXMgdXNlZCwgdGhlIG1vZHVsdXMgUEVSRlNRUl9QUCBpcyBjcmVhdGVkIGZyb20gYQorICAgc2VsZWN0aW9uIG9mIHNtYWxsIHByaW1lcywgY2hvc2VuIHRvIGZpbGwgUEVSRlNRUl9NT0RfQklUUyBvZiBhIGxpbWIsCisgICB3aXRoIHRoYXQgYml0IGNvdW50IGNob3NlbiBzbyAoMipHTVBfTElNQl9CSVRTKSoyXlBFUkZTUVJfTU9EX0JJVFMgPD0KKyAgIEdNUF9MSU1CX01BWCwgYWxsb3dpbmcgUEVSRlNRUl9NT0RfSURYIGluIG1wbi9nZW5lcmljL3BlcmZzcXIuYyB0byBkbyBpdHMKKyAgIGNhbGN1bGF0aW9uIHdpdGhpbiBhIHNpbmdsZSBsaW1iLgorCisgICBJbiBlaXRoZXIgY2FzZSBwcmltZXMgY2FuIGJlIGNvbWJpbmVkIHRvIG1ha2UgZGl2aXNvcnMuICBUaGUgdGFibGUgZGF0YQorICAgdGhlbiBlZmZlY3RpdmVseSBpbmRpY2F0ZXMgcmVtYWluZGVycyB3aGljaCBhcmUgcXVhZHJhdGljIHJlc2lkdWVzIG1vZAorICAgYWxsIHRoZSBwcmltZXMuICBUaGlzIHNvcnQgb2YgY29tYmluaW5nIHJlZHVjZXMgdGhlIG51bWJlciBvZiBzdGVwcworICAgbmVlZGVkIGFmdGVyIG1wbl9tb2RfMzRsc3ViMSBvciBtcG5fbW9kXzEsIHNhdmluZyBjb2RlIHNpemUgYW5kIHRpbWUuCisgICBOb3RoaW5nIGlzIGdhaW5lZCBvciBsb3N0IGluIHRlcm1zIG9mIGRldGVjdGlvbnMsIHRoZSBzYW1lIHRvdGFsIGZyYWN0aW9uCisgICBvZiBub24tcmVzaWR1ZXMgd2lsbCBiZSBpZGVudGlmaWVkLgorCisgICBOb3RoaW5nIHBhcnRpY3VsYXJseSBzb3BoaXN0aWNhdGVkIGlzIGF0dGVtcHRlZCBmb3IgY29tYmluaW5nIGZhY3RvcnMgdG8KKyAgIG1ha2UgZGl2aXNvcnMuICBUaGlzIGlzIHByb2JhYmx5IGEga2luZCBvZiBrbmFwc2FjayBwcm9ibGVtIHNvIGl0J2QgYmUKKyAgIHRvbyBoYXJkIHRvIGF0dGVtcHQgYW55dGhpbmcgY29tcGxldGVseSBnZW5lcmFsLiAgRm9yIHRoZSB1c3VhbCAzMiBhbmQgNjQKKyAgIGJpdCBsaW1icyB3ZSBnZXQgYSBnb29kIGVub3VnaCByZXN1bHQganVzdCBwYWlyaW5nIHRoZSBiaWdnZXN0IGFuZAorICAgc21hbGxlc3Qgd2hpY2ggZml0IHRvZ2V0aGVyLCByZXBlYXRlZGx5LgorCisgICBBbm90aGVyIGFpbSBpcyB0byBnZXQgcG93ZXJmdWwgY29tYmluYXRpb25zLCBpZS4gZGl2aXNvcnMgd2hpY2ggaWRlbnRpZnkKKyAgIGJpZ2dlc3QgZnJhY3Rpb24gb2Ygbm9uLXJlc2lkdWVzLCBhbmQgaGF2ZSB0aG9zZSBydW4gZmlyc3QuICBBZ2FpbiBmb3IKKyAgIHRoZSB1c3VhbCAzMiBhbmQgNjQgYml0cyBpdCBzZWVtcyBnb29kIGVub3VnaCBqdXN0IHRvIHBhaXIgZm9yIGJpZworICAgZGl2aXNvcnMgdGhlbiBzb3J0IGFjY29yZGluZyB0byB0aGUgcmVzdWx0aW5nIGZyYWN0aW9uIG9mIG5vbi1yZXNpZHVlcworICAgaWRlbnRpZmllZC4KKworICAgQWxzbyBpbiB0aGlzIHByb2dyYW0sIGEgdGFibGUgc3FfcmVzXzB4MTAwIG9mIHJlc2lkdWVzIG1vZHVsbyAyNTYgaXMKKyAgIGdlbmVyYXRlZC4gIFRoaXMgc2ltcGx5IGZpbGxzIGJpdHMgaW50byBsaW1icyBvZiB0aGUgYXBwcm9wcmlhdGUKKyAgIGJ1aWxkLXRpbWUgR01QX0xJTUJfQklUUyBlYWNoLgorCisqLworCisKKy8qIE5vcm1hbGx5IHdlIGFyZW4ndCB1c2luZyBjb25zdCBpbiBnZW4qLmMgcHJvZ3JhbXMsIHNvIGFzIG5vdCB0byBoYXZlIHRvCisgICBib3RoZXIgZmlndXJpbmcgb3V0IGlmIGl0IHdvcmtzLCBidXQgdXNpbmcgaXQgd2l0aCBmX2NtcF9kaXZpc29yIGFuZAorICAgZl9jbXBfZnJhY3Rpb24gYXZvaWRzIHdhcm5pbmdzIGZyb20gdGhlIHFzb3J0IGNhbGxzLiAqLworCisvKiBTYW1lIHRlc3RzIGFzIGdtcC5oLiAqLworI2lmICBkZWZpbmVkIChfX1NURENfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0FJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX0RFQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IChkZWZpbmVkIChfX21pcHMpICYmIGRlZmluZWQgKF9TWVNUWVBFX1NWUjQpKSAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TQ19WRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfV0lOMzIpCisjZGVmaW5lIEhBVkVfQ09OU1QgICAgICAgIDEKKyNlbmRpZgorCisjaWYgISBIQVZFX0NPTlNUCisjZGVmaW5lIGNvbnN0CisjZW5kaWYKKworCittcHpfdCAgKnNxX3Jlc18weDEwMDsgICAgICAgICAgLyogdGFibGUgb2YgbGltYnMgKi8KK2ludCAgICBuc3FfcmVzXzB4MTAwOyAgICAgICAgICAvKiBlbGVtZW50cyBpbiBzcV9yZXNfMHgxMDAgYXJyYXkgKi8KK2ludCAgICBzcV9yZXNfMHgxMDBfbnVtOyAgICAgICAvKiBzcXVhcmVzIGluIHNxX3Jlc18weDEwMCAqLworZG91YmxlIHNxX3Jlc18weDEwMF9mcmFjdGlvbjsgIC8qIHNxX3Jlc18weDEwMF9udW0gLyAyNTYgKi8KKworaW50ICAgICBtb2QzNF9iaXRzOyAgICAgICAgLyogMypHTVBfTlVNQl9CSVRTLzQgKi8KK2ludCAgICAgbW9kX2JpdHM7ICAgICAgICAgIC8qIGJpdHMgZnJvbSBQRVJGU1FSX01PRF8zNCBvciBNT0RfUFAgKi8KK2ludCAgICAgbWF4X2Rpdmlzb3I7ICAgICAgIC8qIGFsbCBkaXZpc29ycyA8PSBtYXhfZGl2aXNvciAqLworaW50ICAgICBtYXhfZGl2aXNvcl9iaXRzOyAgLyogY2VpbChsb2cyKG1heF9kaXZpc29yKSkgKi8KK2RvdWJsZSAgdG90YWxfZnJhY3Rpb247ICAgIC8qIG9mIHNxdWFyZXMgKi8KK21wel90ICAgcHA7ICAgICAgICAgICAgICAgIC8qIHByb2R1Y3Qgb2YgcHJpbWVzLCBvciAwIGlmIG1vZF8zNGxzdWIxIHVzZWQgKi8KK21wel90ICAgcHBfbm9ybTsgICAgICAgICAgIC8qIHBwIHNoaWZ0ZWQgc28gTlVNQiBoaWdoIGJpdCBzZXQgKi8KK21wel90ICAgcHBfaW52ZXJ0ZWQ7ICAgICAgIC8qIGludmVydF9saW1iIHN0eWxlIGludmVyc2UgKi8KK21wel90ICAgbW9kX21hc2s7ICAgICAgICAgIC8qIDJebW9kX2JpdHMtMSAqLworY2hhciAgICBtb2QzNF9leGN1c2VbMTI4XTsgLyogd2h5IG1vZF8zNGxzdWIxIG5vdCB1c2VkIChpZiBpdCdzIG5vdCkgKi8KKworLyogcmF3IGxpc3Qgb2YgZGl2aXNvcnMgb2YgMl5tb2QzNF9iaXRzLTEgb3IgcHAsIGp1c3QgdG8gc2hvdyBpbiBhIGNvbW1lbnQgKi8KK3N0cnVjdCByYXdmYWN0b3JfdCB7CisgIGludCAgICAgZGl2aXNvcjsKKyAgaW50ICAgICBtdWx0aXBsaWNpdHk7Cit9Oworc3RydWN0IHJhd2ZhY3Rvcl90ICAqcmF3ZmFjdG9yOworaW50ICAgICAgICAgICAgICAgICBucmF3ZmFjdG9yOworCisvKiBmYWN0b3JzIG9mIDJebW9kMzRfYml0cy0xIG9yIHBwIGFuZCBhc3NvY2lhdGVkIGRhdGEsIGFmdGVyIGNvbWJpbmluZyBldGMgKi8KK3N0cnVjdCBmYWN0b3JfdCB7CisgIGludCAgICAgZGl2aXNvcjsKKyAgbXB6X3QgICBpbnZlcnNlOyAgIC8qIDEvZGl2aXNvciBtb2QgMl5tb2RfYml0cyAqLworICBtcHpfdCAgIG1hc2s7ICAgICAgLyogaW5kaWNhdGluZyBzcXVhcmVzIG1vZCBkaXZpc29yICovCisgIGRvdWJsZSAgZnJhY3Rpb247ICAvKiBzcXVhcmVzL3RvdGFsICovCit9Oworc3RydWN0IGZhY3Rvcl90ICAqZmFjdG9yOworaW50ICAgICAgICAgICAgICBuZmFjdG9yOyAgICAgICAvKiBlbnRyaWVzIGluIHVzZSBpbiBmYWN0b3IgYXJyYXkgKi8KK2ludCAgICAgICAgICAgICAgZmFjdG9yX2FsbG9jOyAgLyogZW50cmllcyBhbGxvY2F0ZWQgdG8gZmFjdG9yIGFycmF5ICovCisKKworaW50CitmX2NtcF9kaXZpc29yIChjb25zdCB2b2lkICpwYXJnLCBjb25zdCB2b2lkICpxYXJnKQoreworICBjb25zdCBzdHJ1Y3QgZmFjdG9yX3QgKnAsICpxOworICBwID0gKGNvbnN0IHN0cnVjdCBmYWN0b3JfdCAqKSBwYXJnOworICBxID0gKGNvbnN0IHN0cnVjdCBmYWN0b3JfdCAqKSBxYXJnOworICBpZiAocC0+ZGl2aXNvciA+IHEtPmRpdmlzb3IpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKHAtPmRpdmlzb3IgPCBxLT5kaXZpc29yKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK2ZfY21wX2ZyYWN0aW9uIChjb25zdCB2b2lkICpwYXJnLCBjb25zdCB2b2lkICpxYXJnKQoreworICBjb25zdCBzdHJ1Y3QgZmFjdG9yX3QgKnAsICpxOworICBwID0gKGNvbnN0IHN0cnVjdCBmYWN0b3JfdCAqKSBwYXJnOworICBxID0gKGNvbnN0IHN0cnVjdCBmYWN0b3JfdCAqKSBxYXJnOworICBpZiAocC0+ZnJhY3Rpb24gPiBxLT5mcmFjdGlvbikKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAocC0+ZnJhY3Rpb24gPCBxLT5mcmFjdGlvbikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIGFycmF5W2lkeF0gYnkgY29weWluZyB0aGUgcmVtYWluZGVyIGRvd24sIGFuZCBhZGp1c3QgbmFycmF5CisgICBhY2NvcmRpbmdseS4gICovCisjZGVmaW5lIENPTExBUFNFX0VMRU1FTlQoYXJyYXksIGlkeCwgbmFycmF5KSAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1tb3ZlICgmKGFycmF5KVtpZHhdLAkJCQkJXAorCSAgICAgJihhcnJheSlbaWR4KzFdLAkJCQkJXAorCSAgICAgKChuYXJyYXkpLSgoaWR4KSsxKSkgKiBzaXplb2YgKGFycmF5WzBdKSk7CQlcCisgICAgKG5hcnJheSktLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKy8qIHJldHVybiBuKjJecCBtb2QgbSAqLworaW50CittdWxfMmV4cF9tb2QgKGludCBuLCBpbnQgcCwgaW50IG0pCit7CisgIHdoaWxlICgtLXAgPj0gMCkKKyAgICBuID0gKDIgKiBuKSAlIG07CisgIHJldHVybiBuOworfQorCisvKiByZXR1cm4gLW4gbW9kIG0gKi8KK2ludAorbmVnX21vZCAoaW50IG4sIGludCBtKQoreworICBhc3NlcnQgKG4gPj0gMCAmJiBuIDwgbSk7CisgIHJldHVybiAobiA9PSAwID8gMCA6IG0tbik7Cit9CisKKy8qIFNldCAibWFzayIgdG8gYSB2YWx1ZSBzdWNoIHRoYXQgIm1hc2sgJiAoMTw8aWR4KSIgaXMgbm9uLXplcm8gaWYKKyAgICItKGlkeDw8bW9kX2JpdHMpIiBjYW4gYmUgYSBzcXVhcmUgbW9kdWxvIG0uICAqLwordm9pZAorc3F1YXJlX21hc2sgKG1wel90IG1hc2ssIGludCBtKQoreworICBpbnQgICAgcCwgaSwgciwgaWR4OworCisgIHAgPSBtdWxfMmV4cF9tb2QgKDEsIG1vZF9iaXRzLCBtKTsKKyAgcCA9IG5lZ19tb2QgKHAsIG0pOworCisgIG1wel9zZXRfdWkgKG1hc2ssIDBMKTsKKyAgZm9yIChpID0gMDsgaSA8IG07IGkrKykKKyAgICB7CisgICAgICByID0gKGkgKiBpKSAlIG07CisgICAgICBpZHggPSAociAqIHApICUgbTsKKyAgICAgIG1wel9zZXRiaXQgKG1hc2ssICh1bnNpZ25lZCBsb25nKSBpZHgpOworICAgIH0KK30KKwordm9pZAorZ2VuZXJhdGVfc3FfcmVzXzB4MTAwIChpbnQgbGltYl9iaXRzKQoreworICBpbnQgIGksIHJlczsKKworICBuc3FfcmVzXzB4MTAwID0gKDB4MTAwICsgbGltYl9iaXRzIC0gMSkgLyBsaW1iX2JpdHM7CisgIHNxX3Jlc18weDEwMCA9IChtcHpfdCAqKSB4bWFsbG9jIChuc3FfcmVzXzB4MTAwICogc2l6ZW9mICgqc3FfcmVzXzB4MTAwKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5zcV9yZXNfMHgxMDA7IGkrKykKKyAgICBtcHpfaW5pdF9zZXRfdWkgKHNxX3Jlc18weDEwMFtpXSwgMEwpOworCisgIGZvciAoaSA9IDA7IGkgPCAweDEwMDsgaSsrKQorICAgIHsKKyAgICAgIHJlcyA9IChpICogaSkgJSAweDEwMDsKKyAgICAgIG1wel9zZXRiaXQgKHNxX3Jlc18weDEwMFtyZXMgLyBsaW1iX2JpdHNdLAorICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChyZXMgJSBsaW1iX2JpdHMpKTsKKyAgICB9CisKKyAgc3FfcmVzXzB4MTAwX251bSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBuc3FfcmVzXzB4MTAwOyBpKyspCisgICAgc3FfcmVzXzB4MTAwX251bSArPSBtcHpfcG9wY291bnQgKHNxX3Jlc18weDEwMFtpXSk7CisgIHNxX3Jlc18weDEwMF9mcmFjdGlvbiA9IChkb3VibGUpIHNxX3Jlc18weDEwMF9udW0gLyAyNTYuMDsKK30KKwordm9pZAorZ2VuZXJhdGVfbW9kIChpbnQgbGltYl9iaXRzLCBpbnQgbmFpbF9iaXRzKQoreworICBpbnQgICAgbnVtYl9iaXRzID0gbGltYl9iaXRzIC0gbmFpbF9iaXRzOworICBpbnQgICAgaSwgZGl2aXNvcjsKKworICBtcHpfaW5pdF9zZXRfdWkgKHBwLCAwTCk7CisgIG1wel9pbml0X3NldF91aSAocHBfbm9ybSwgMEwpOworICBtcHpfaW5pdF9zZXRfdWkgKHBwX2ludmVydGVkLCAwTCk7CisKKyAgLyogbm8gbW9yZSB0aGFuIGxpbWJfYml0cyBtYW55IGZhY3RvcnMgaW4gYSBvbmUgbGltYiBtb2R1bHVzIChhbmQgb2YKKyAgICAgY291cnNlIGluIHJlYWxpdHkgbm90aGluZyBsaWtlIHRoYXQgbWFueSkgKi8KKyAgZmFjdG9yX2FsbG9jID0gbGltYl9iaXRzOworICBmYWN0b3IgPSAoc3RydWN0IGZhY3Rvcl90ICopIHhtYWxsb2MgKGZhY3Rvcl9hbGxvYyAqIHNpemVvZiAoKmZhY3RvcikpOworICByYXdmYWN0b3IgPSAoc3RydWN0IHJhd2ZhY3Rvcl90ICopIHhtYWxsb2MgKGZhY3Rvcl9hbGxvYyAqIHNpemVvZiAoKnJhd2ZhY3RvcikpOworCisgIGlmIChudW1iX2JpdHMgJSA0ICE9IDApCisgICAgeworICAgICAgc3RyY3B5IChtb2QzNF9leGN1c2UsICJHTVBfTlVNQl9CSVRTICUgNCAhPSAwIik7CisgICAgICBnb3RvIHVzZV9wcDsKKyAgICB9CisKKyAgbWF4X2Rpdmlzb3IgPSAyKmxpbWJfYml0czsKKyAgbWF4X2Rpdmlzb3JfYml0cyA9IGxvZzJfY2VpbCAobWF4X2Rpdmlzb3IpOworCisgIGlmIChudW1iX2JpdHMgLyA0IDwgbWF4X2Rpdmlzb3JfYml0cykKKyAgICB7CisgICAgICAvKiBXaW5kIGJhY2sgdG8gb25lIGxpbWIgd29ydGggb2YgbWF4X2Rpdmlzb3IsIGlmIHRoYXQgd2lsbCBsZXQgdXMgdXNlCisgICAgICAgICBtcG5fbW9kXzM0bHN1YjEuICAqLworICAgICAgbWF4X2Rpdmlzb3IgPSBsaW1iX2JpdHM7CisgICAgICBtYXhfZGl2aXNvcl9iaXRzID0gbG9nMl9jZWlsIChtYXhfZGl2aXNvcik7CisKKyAgICAgIGlmIChudW1iX2JpdHMgLyA0IDwgbWF4X2Rpdmlzb3JfYml0cykKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobW9kMzRfZXhjdXNlLCAiR01QX05VTUJfQklUUyAvIDQgdG9vIHNtYWxsIik7CisgICAgICAgICAgZ290byB1c2VfcHA7CisgICAgICAgIH0KKyAgICB9CisKKyAgeworICAgIC8qIENhbiB1c2UgbXBuX21vZF8zNGxzdWIxLCBmaW5kIHNtYWxsIGZhY3RvcnMgb2YgMl5tb2QzNF9iaXRzLTEuICovCisgICAgbXB6X3QgIG0sIHEsIHI7CisgICAgaW50ICAgIG11bHRpcGxpY2l0eTsKKworICAgIG1vZDM0X2JpdHMgPSAobnVtYl9iaXRzIC8gNCkgKiAzOworCisgICAgLyogbXBuX21vZF8zNGxzdWIxIHJldHVybnMgYSBmdWxsIGxpbWIgdmFsdWUsIFBFUkZTUVJfTU9EXzM0IGZvbGRzIGl0IGF0CisgICAgICAgdGhlIG1vZDM0X2JpdHMgbWFyaywgYWRkaW5nIHRoZSB0d28gaGFsdmVzIGZvciBhIHJlbWFpbmRlciBvZiBhdCBtb3N0CisgICAgICAgbW9kMzRfYml0cysxIG1hbnkgYml0cyAqLworICAgIG1vZF9iaXRzID0gbW9kMzRfYml0cyArIDE7CisKKyAgICBtcHpfaW5pdF9zZXRfdWkgKG0sIDFMKTsKKyAgICBtcHpfbXVsXzJleHAgKG0sIG0sIG1vZDM0X2JpdHMpOworICAgIG1wel9zdWJfdWkgKG0sIG0sIDFMKTsKKworICAgIG1wel9pbml0IChxKTsKKyAgICBtcHpfaW5pdCAocik7CisKKyAgICBmb3IgKGkgPSAzOyBpIDw9IG1heF9kaXZpc29yOyBpKz0yKQorICAgICAgeworICAgICAgICBpZiAoISBpc3ByaW1lIChpKSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtcHpfdGRpdl9xcl91aSAocSwgciwgbSwgKHVuc2lnbmVkIGxvbmcpIGkpOworICAgICAgICBpZiAobXB6X3NnbiAocikgIT0gMCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBpZiBhIHJlcGVhdGVkIHByaW1lIGlzIGZvdW5kIGl0J3MgdXNlZCBhcyBhbiBpXm4gaW4gb25lIGZhY3RvciAqLworICAgICAgICBkaXZpc29yID0gMTsKKyAgICAgICAgbXVsdGlwbGljaXR5ID0gMDsKKyAgICAgICAgZG8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGl2aXNvciA+IG1heF9kaXZpc29yIC8gaSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtdWx0aXBsaWNpdHkrKzsKKyAgICAgICAgICAgIG1wel9zZXQgKG0sIHEpOworICAgICAgICAgICAgbXB6X3RkaXZfcXJfdWkgKHEsIHIsIG0sICh1bnNpZ25lZCBsb25nKSBpKTsKKyAgICAgICAgICB9CisgICAgICAgIHdoaWxlIChtcHpfc2duIChyKSA9PSAwKTsKKworICAgICAgICBhc3NlcnQgKG5yYXdmYWN0b3IgPCBmYWN0b3JfYWxsb2MpOworICAgICAgICByYXdmYWN0b3JbbnJhd2ZhY3Rvcl0uZGl2aXNvciA9IGk7CisgICAgICAgIHJhd2ZhY3RvcltucmF3ZmFjdG9yXS5tdWx0aXBsaWNpdHkgPSBtdWx0aXBsaWNpdHk7CisgICAgICAgIG5yYXdmYWN0b3IrKzsKKyAgICAgIH0KKworICAgIG1wel9jbGVhciAobSk7CisgICAgbXB6X2NsZWFyIChxKTsKKyAgICBtcHpfY2xlYXIgKHIpOworICB9CisKKyAgaWYgKG5yYXdmYWN0b3IgPD0gMikKKyAgICB7CisgICAgICBtcHpfdCAgbmV3X3BwOworCisgICAgICBzcHJpbnRmIChtb2QzNF9leGN1c2UsICJvbmx5ICVkIHNtYWxsIGZhY3RvciVzIiwKKyAgICAgICAgICAgICAgIG5yYXdmYWN0b3IsIG5yYXdmYWN0b3IgPT0gMSA/ICIiIDogInMiKTsKKworICAgIHVzZV9wcDoKKyAgICAgIC8qIHJlc2V0IHRvIHR3byBsaW1icyBvZiBtYXhfZGl2aXNvciwgaW4gY2FzZSB0aGUgbXBuX21vZF8zNGxzdWIxIGNvZGUKKyAgICAgICAgIHRyaWVkIHdpdGgganVzdCBvbmUgKi8KKyAgICAgIG1heF9kaXZpc29yID0gMipsaW1iX2JpdHM7CisgICAgICBtYXhfZGl2aXNvcl9iaXRzID0gbG9nMl9jZWlsIChtYXhfZGl2aXNvcik7CisKKyAgICAgIG1wel9pbml0IChuZXdfcHApOworICAgICAgbnJhd2ZhY3RvciA9IDA7CisgICAgICBtb2RfYml0cyA9IE1JTiAobnVtYl9iaXRzLCBsaW1iX2JpdHMgLSBtYXhfZGl2aXNvcl9iaXRzKTsKKworICAgICAgLyogb25lIGNvcHkgb2YgZWFjaCBzbWFsbCBwcmltZSAqLworICAgICAgbXB6X3NldF91aSAocHAsIDFMKTsKKyAgICAgIGZvciAoaSA9IDM7IGkgPD0gbWF4X2Rpdmlzb3I7IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoISBpc3ByaW1lIChpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgbXB6X211bF91aSAobmV3X3BwLCBwcCwgKHVuc2lnbmVkIGxvbmcpIGkpOworICAgICAgICAgIGlmIChtcHpfc2l6ZWluYmFzZSAobmV3X3BwLCAyKSA+IG1vZF9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgbXB6X3NldCAocHAsIG5ld19wcCk7CisKKyAgICAgICAgICBhc3NlcnQgKG5yYXdmYWN0b3IgPCBmYWN0b3JfYWxsb2MpOworICAgICAgICAgIHJhd2ZhY3RvcltucmF3ZmFjdG9yXS5kaXZpc29yID0gaTsKKyAgICAgICAgICByYXdmYWN0b3JbbnJhd2ZhY3Rvcl0ubXVsdGlwbGljaXR5ID0gMTsKKyAgICAgICAgICBucmF3ZmFjdG9yKys7CisgICAgICAgIH0KKworICAgICAgLyogUGx1cyBhbiBleHRyYSBjb3B5IG9mIG9uZSBvciBtb3JlIG9mIHRoZSBwcmltZXMgc2VsZWN0ZWQsIGlmIHRoYXQKKyAgICAgICAgIHN0aWxsIGZpdHMgaW4gbWF4X2Rpdmlzb3IgYW5kIHRoZSB0b3RhbCBpbiBtb2RfYml0cy4gIFVzdWFsbHkgb25seQorICAgICAgICAgMyBvciA1IHdpbGwgYmUgY2FuZGlkYXRlcyAqLworICAgICAgZm9yIChpID0gbnJhd2ZhY3Rvci0xOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChyYXdmYWN0b3JbaV0uZGl2aXNvciA+IG1heF9kaXZpc29yIC8gcmF3ZmFjdG9yW2ldLmRpdmlzb3IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBtcHpfbXVsX3VpIChuZXdfcHAsIHBwLCAodW5zaWduZWQgbG9uZykgcmF3ZmFjdG9yW2ldLmRpdmlzb3IpOworICAgICAgICAgIGlmIChtcHpfc2l6ZWluYmFzZSAobmV3X3BwLCAyKSA+IG1vZF9iaXRzKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgbXB6X3NldCAocHAsIG5ld19wcCk7CisKKyAgICAgICAgICByYXdmYWN0b3JbaV0ubXVsdGlwbGljaXR5Kys7CisgICAgICAgIH0KKworICAgICAgbW9kX2JpdHMgPSBtcHpfc2l6ZWluYmFzZSAocHAsIDIpOworCisgICAgICBtcHpfc2V0IChwcF9ub3JtLCBwcCk7CisgICAgICB3aGlsZSAobXB6X3NpemVpbmJhc2UgKHBwX25vcm0sIDIpIDwgbnVtYl9iaXRzKQorICAgICAgICBtcHpfYWRkIChwcF9ub3JtLCBwcF9ub3JtLCBwcF9ub3JtKTsKKworICAgICAgbXB6X3ByZWludl9pbnZlcnQgKHBwX2ludmVydGVkLCBwcF9ub3JtLCBudW1iX2JpdHMpOworCisgICAgICBtcHpfY2xlYXIgKG5ld19wcCk7CisgICAgfQorCisgIC8qIHN0YXJ0IHRoZSBmYWN0b3IgYXJyYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5yYXdmYWN0b3I7IGkrKykKKyAgICB7CisgICAgICBpbnQgIGo7CisgICAgICBhc3NlcnQgKG5mYWN0b3IgPCBmYWN0b3JfYWxsb2MpOworICAgICAgZmFjdG9yW25mYWN0b3JdLmRpdmlzb3IgPSAxOworICAgICAgZm9yIChqID0gMDsgaiA8IHJhd2ZhY3RvcltpXS5tdWx0aXBsaWNpdHk7IGorKykKKyAgICAgICAgZmFjdG9yW25mYWN0b3JdLmRpdmlzb3IgKj0gcmF3ZmFjdG9yW2ldLmRpdmlzb3I7CisgICAgICBuZmFjdG9yKys7CisgICAgfQorCisgY29tYmluZToKKyAgLyogQ29tYmluZSBlbnRyaWVzIGluIHRoZSBmYWN0b3IgYXJyYXkuICBDb21iaW5lIHRoZSBzbWFsbGVzdCBlbnRyeSB3aXRoCisgICAgIHRoZSBiaWdnZXN0IG9uZSB0aGF0IHdpbGwgZml0IHdpdGggaXQgKGllLiB1bmRlciBtYXhfZGl2aXNvciksIHRoZW4KKyAgICAgcmVwZWF0IHRoYXQgd2l0aCB0aGUgbmV3IHNtYWxsZXN0IGVudHJ5LiAqLworICBxc29ydCAoZmFjdG9yLCBuZmFjdG9yLCBzaXplb2YgKGZhY3RvclswXSksIGZfY21wX2Rpdmlzb3IpOworICBmb3IgKGkgPSBuZmFjdG9yLTE7IGkgPj0gMTsgaS0tKQorICAgIHsKKyAgICAgIGlmIChmYWN0b3JbaV0uZGl2aXNvciA8PSBtYXhfZGl2aXNvciAvIGZhY3RvclswXS5kaXZpc29yKQorICAgICAgICB7CisgICAgICAgICAgZmFjdG9yWzBdLmRpdmlzb3IgKj0gZmFjdG9yW2ldLmRpdmlzb3I7CisgICAgICAgICAgQ09MTEFQU0VfRUxFTUVOVCAoZmFjdG9yLCBpLCBuZmFjdG9yKTsKKyAgICAgICAgICBnb3RvIGNvbWJpbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgdG90YWxfZnJhY3Rpb24gPSAxLjA7CisgIGZvciAoaSA9IDA7IGkgPCBuZmFjdG9yOyBpKyspCisgICAgeworICAgICAgbXB6X2luaXQgKGZhY3RvcltpXS5pbnZlcnNlKTsKKyAgICAgIG1wel9pbnZlcnRfdWlfMmV4cCAoZmFjdG9yW2ldLmludmVyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBmYWN0b3JbaV0uZGl2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1vZF9iaXRzKTsKKworICAgICAgbXB6X2luaXQgKGZhY3RvcltpXS5tYXNrKTsKKyAgICAgIHNxdWFyZV9tYXNrIChmYWN0b3JbaV0ubWFzaywgZmFjdG9yW2ldLmRpdmlzb3IpOworCisgICAgICAvKiBmcmFjdGlvbiBvZiBwb3NzaWJsZSBzcXVhcmVzICovCisgICAgICBmYWN0b3JbaV0uZnJhY3Rpb24gPSAoZG91YmxlKSBtcHpfcG9wY291bnQgKGZhY3RvcltpXS5tYXNrKQorICAgICAgICAvIGZhY3RvcltpXS5kaXZpc29yOworCisgICAgICAvKiB0b3RhbCBmcmFjdGlvbiBvZiBwb3NzaWJsZSBzcXVhcmVzICovCisgICAgICB0b3RhbF9mcmFjdGlvbiAqPSBmYWN0b3JbaV0uZnJhY3Rpb247CisgICAgfQorCisgIC8qIGJlc3QgdGVzdHMgZmlyc3QgKGllLiBzbWFsbGVzdCBmcmFjdGlvbikgKi8KKyAgcXNvcnQgKGZhY3RvciwgbmZhY3Rvciwgc2l6ZW9mIChmYWN0b3JbMF0pLCBmX2NtcF9mcmFjdGlvbik7Cit9CisKK3ZvaWQKK3ByaW50IChpbnQgbGltYl9iaXRzLCBpbnQgbmFpbF9iaXRzKQoreworICBpbnQgICAgaTsKKyAgbXB6X3QgIG1oaSwgbWxvOworCisgIHByaW50ZiAoIi8qIFRoaXMgZmlsZSBnZW5lcmF0ZWQgYnkgZ2VuLXBzcXIuYyAtIERPIE5PVCBFRElULiAqL1xuIik7CisgIHByaW50ZiAoIlxuIik7CisKKyAgcHJpbnRmICgiI2lmIEdNUF9MSU1CX0JJVFMgIT0gJWQgfHwgR01QX05BSUxfQklUUyAhPSAlZFxuIiwKKyAgICAgICAgICBsaW1iX2JpdHMsIG5haWxfYml0cyk7CisgIHByaW50ZiAoIkVycm9yLCBlcnJvciwgdGhpcyBkYXRhIGlzIGZvciAlZCBiaXQgbGltYiBhbmQgJWQgYml0IG5haWxcbiIsCisgICAgICAgICAgbGltYl9iaXRzLCBuYWlsX2JpdHMpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworICBwcmludGYgKCJcbiIpOworCisgIHByaW50ZiAoIi8qIE5vbi16ZXJvIGJpdCBpbmRpY2F0ZXMgYSBxdWFkcmF0aWMgcmVzaWR1ZSBtb2QgMHgxMDAuXG4iKTsKKyAgcHJpbnRmICgiICAgVGhpcyB0ZXN0IGlkZW50aWZpZXMgJS4yZiUlIGFzIG5vbi1zcXVhcmVzICglZC8yNTYpLiAqL1xuIiwKKyAgICAgICAgICAoMS4wIC0gc3FfcmVzXzB4MTAwX2ZyYWN0aW9uKSAqIDEwMC4wLAorICAgICAgICAgIDB4MTAwIC0gc3FfcmVzXzB4MTAwX251bSk7CisgIHByaW50ZiAoInN0YXRpYyBjb25zdCBtcF9saW1iX3RcbiIpOworICBwcmludGYgKCJzcV9yZXNfMHgxMDBbJWRdID0ge1xuIiwgbnNxX3Jlc18weDEwMCk7CisgIGZvciAoaSA9IDA7IGkgPCBuc3FfcmVzXzB4MTAwOyBpKyspCisgICAgeworICAgICAgcHJpbnRmICgiICBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBzcV9yZXNfMHgxMDBbaV0pOworICAgICAgcHJpbnRmICgiKSxcbiIpOworICAgIH0KKyAgcHJpbnRmICgifTtcbiIpOworICBwcmludGYgKCJcbiIpOworCisgIGlmIChtcHpfc2duIChwcCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIvKiBtcG5fbW9kXzM0bHN1YjEgbm90IHVzZWQgZHVlIHRvICVzICovXG4iLCBtb2QzNF9leGN1c2UpOworICAgICAgcHJpbnRmICgiLyogUEVSRlNRUl9QUCA9ICIpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZiAoIi8qIDJeJWQtMSA9ICIsIG1vZDM0X2JpdHMpOworICBmb3IgKGkgPSAwOyBpIDwgbnJhd2ZhY3RvcjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChpICE9IDApCisgICAgICAgIHByaW50ZiAoIiAqICIpOworICAgICAgcHJpbnRmICgiJWQiLCByYXdmYWN0b3JbaV0uZGl2aXNvcik7CisgICAgICBpZiAocmF3ZmFjdG9yW2ldLm11bHRpcGxpY2l0eSAhPSAxKQorICAgICAgICBwcmludGYgKCJeJWQiLCByYXdmYWN0b3JbaV0ubXVsdGlwbGljaXR5KTsKKyAgICB9CisgIHByaW50ZiAoIiAlcyovXG4iLCBtcHpfc2duIChwcCkgPT0gMCA/ICIuLi4gIiA6ICIiKTsKKworICBwcmludGYgKCIjZGVmaW5lIFBFUkZTUVJfTU9EX0JJVFMgICVkXG4iLCBtb2RfYml0cyk7CisgIGlmIChtcHpfc2duIChwcCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIjZGVmaW5lIFBFUkZTUVJfUFAgICAgICAgICAgICBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBwcCk7CisgICAgICBwcmludGYgKCIpXG4iKTsKKyAgICAgIHByaW50ZiAoIiNkZWZpbmUgUEVSRlNRUl9QUF9OT1JNICAgICAgIENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIHBwX25vcm0pOworICAgICAgcHJpbnRmICgiKVxuIik7CisgICAgICBwcmludGYgKCIjZGVmaW5lIFBFUkZTUVJfUFBfSU5WRVJURUQgICBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBwcF9pbnZlcnRlZCk7CisgICAgICBwcmludGYgKCIpXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIlxuIik7CisKKyAgbXB6X2luaXQgKG1oaSk7CisgIG1wel9pbml0IChtbG8pOworCisgIHByaW50ZiAoIi8qIFRoaXMgdGVzdCBpZGVudGlmaWVzICUuMmYlJSBhcyBub24tc3F1YXJlcy4gKi9cbiIsCisgICAgICAgICAgKDEuMCAtIHRvdGFsX2ZyYWN0aW9uKSAqIDEwMC4wKTsKKyAgcHJpbnRmICgiI2RlZmluZSBQRVJGU1FSX01PRF9URVNUKHVwLCB1c2l6ZSkgXFxcbiIpOworICBwcmludGYgKCIgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxuIik7CisgIHByaW50ZiAoIiAgICBtcF9saW1iX3QgIHI7ICAgICAgICAgICAgICAgICAgIFxcXG4iKTsKKyAgaWYgKG1wel9zZ24gKHBwKSAhPSAwKQorICAgIHByaW50ZiAoIiAgICBQRVJGU1FSX01PRF9QUCAociwgdXAsIHVzaXplKTsgIFxcXG4iKTsKKyAgZWxzZQorICAgIHByaW50ZiAoIiAgICBQRVJGU1FSX01PRF8zNCAociwgdXAsIHVzaXplKTsgIFxcXG4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbmZhY3RvcjsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgICAvKiAlNS4yZiUlICovICAgICAgICAgICAgICAgICAgICBcXFxuIiwKKyAgICAgICAgICAgICAgKDEuMCAtIGZhY3RvcltpXS5mcmFjdGlvbikgKiAxMDAuMCk7CisKKyAgICAgIHByaW50ZiAoIiAgICBQRVJGU1FSX01PRF8lZCAociwgQ05TVF9MSU1CKCUyZCksIENOU1RfTElNQigweCIsCisgICAgICAgICAgICAgIGZhY3RvcltpXS5kaXZpc29yIDw9IGxpbWJfYml0cyA/IDEgOiAyLAorICAgICAgICAgICAgICBmYWN0b3JbaV0uZGl2aXNvcik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgZmFjdG9yW2ldLmludmVyc2UpOworICAgICAgcHJpbnRmICgiKSwgXFxcbiIpOworICAgICAgcHJpbnRmICgiICAgICAgICAgICAgICAgICAgIENOU1RfTElNQigweCIpOworCisgICAgICBpZiAoIGZhY3RvcltpXS5kaXZpc29yIDw9IGxpbWJfYml0cykKKyAgICAgICAgeworICAgICAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBmYWN0b3JbaV0ubWFzayk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1wel90ZGl2X3JfMmV4cCAobWxvLCBmYWN0b3JbaV0ubWFzaywgKHVuc2lnbmVkIGxvbmcpIGxpbWJfYml0cyk7CisgICAgICAgICAgbXB6X3RkaXZfcV8yZXhwIChtaGksIGZhY3RvcltpXS5tYXNrLCAodW5zaWduZWQgbG9uZykgbGltYl9iaXRzKTsKKyAgICAgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgbWhpKTsKKyAgICAgICAgICBwcmludGYgKCIpLCBDTlNUX0xJTUIoMHgiKTsKKyAgICAgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgbWxvKTsKKyAgICAgICAgfQorICAgICAgcHJpbnRmICgiKSk7IFxcXG4iKTsKKyAgICB9CisKKyAgcHJpbnRmICgiICB9IHdoaWxlICgwKVxuIik7CisgIHByaW50ZiAoIlxuIik7CisKKyAgcHJpbnRmICgiLyogR3JhbmQgdG90YWwgc3FfcmVzXzB4MTAwIGFuZCBQRVJGU1FSX01PRF9URVNULCAlLjJmJSUgbm9uLXNxdWFyZXMuICovXG4iLAorICAgICAgICAgICgxLjAgLSAodG90YWxfZnJhY3Rpb24gKiA0NC4wLzI1Ni4wKSkgKiAxMDAuMCk7CisgIHByaW50ZiAoIlxuIik7CisKKyAgcHJpbnRmICgiLyogaGVscGVyIGZvciB0ZXN0cy9tcHovdC1wZXJmc3FyLmMgKi9cbiIpOworICBwcmludGYgKCIjZGVmaW5lIFBFUkZTUVJfRElWSVNPUlMgIHsgMjU2LCIpOworICBmb3IgKGkgPSAwOyBpIDwgbmZhY3RvcjsgaSsrKQorICAgICAgcHJpbnRmICgiICVkLCIsIGZhY3RvcltpXS5kaXZpc29yKTsKKyAgcHJpbnRmICgiIH1cbiIpOworCisKKyAgbXB6X2NsZWFyIChtaGkpOworICBtcHpfY2xlYXIgKG1sbyk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50ICBsaW1iX2JpdHMsIG5haWxfYml0czsKKworICBpZiAoYXJnYyAhPSAzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOiBnZW4tcHNxciA8bGltYmJpdHM+IDxuYWlsYml0cz5cbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGxpbWJfYml0cyA9IGF0b2kgKGFyZ3ZbMV0pOworICBuYWlsX2JpdHMgPSBhdG9pIChhcmd2WzJdKTsKKworICBpZiAobGltYl9iaXRzIDw9IDAKKyAgICAgIHx8IG5haWxfYml0cyA8IDAKKyAgICAgIHx8IG5haWxfYml0cyA+PSBsaW1iX2JpdHMpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCBsaW1iL25haWwgYml0czogJWQgJWRcbiIsCisgICAgICAgICAgICAgICBsaW1iX2JpdHMsIG5haWxfYml0cyk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZ2VuZXJhdGVfc3FfcmVzXzB4MTAwIChsaW1iX2JpdHMpOworICBnZW5lcmF0ZV9tb2QgKGxpbWJfYml0cywgbmFpbF9iaXRzKTsKKworICBwcmludCAobGltYl9iaXRzLCBuYWlsX2JpdHMpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2VuLXNpZXZlLmMgYi9nZW4tc2lldmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTMzOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2VuLXNpZXZlLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qIEdlbmVyYXRlIHByaW1lc2lldmUgZGF0YS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKK0NvcHlyaWdodCAyMDIxLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJib290c3RyYXAuYyIKKworc3RhdGljIGludAorYml0X3RvX24gKGludCBiaXQpIHsgcmV0dXJuIChiaXQqMys0KXwxOyB9CisKK2ludAorZ2VuZXJhdGUgKGludCBsaW1iX2JpdHMsIGludCBsaW1pdCkKK3sKKyAgbXB6X3QgIGxpbWI7CisgIGludCBpLCBsYiwgcGMsIGMsIHRvdHBjLCBtYXhwcmltZTsKKworICBtcHpfaW5pdCAobGltYik7CisKKyAgcHJpbnRmICgiLyogVGhpcyBmaWxlIGdlbmVyYXRlZCBieSBnZW4tc2lldmUuYyAtIERPIE5PVCBFRElULiAqL1xuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIiNpZiBHTVBfTElNQl9CSVRTICE9ICVkXG4iLCBsaW1iX2JpdHMpOworICBwcmludGYgKCJFcnJvciwgZXJyb3IsIHRoaXMgZGF0YSBpcyBmb3IgJWQgYml0c1xuIiwgbGltYl9iaXRzKTsKKyAgcHJpbnRmICgiI2VuZGlmXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiI2RlZmluZSBQUklNRVNJRVZFX0lOSVRfVEFCTEUgIik7CisKKyAgbWF4cHJpbWUgPSAzOworICBsYiA9IHBjID0gYyA9IHRvdHBjID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspCisgICAgeworICAgICAgaWYgKCEgaXNwcmltZSAoYml0X3RvX24gKGkpKSkKKwltcHpfc2V0Yml0IChsaW1iLCBsYik7CisgICAgICBlbHNlCisJbWF4cHJpbWUgPSBiaXRfdG9fbiAoaSksICsrcGM7CisgICAgICArK2xiOworICAgICAgaWYgKGxiID09IGxpbWJfYml0cykKKwl7CisJICArK2M7CisJICBwcmludGYgKCJcXFxuXHRDTlNUX0xJTUIgKDB4Iik7CisJICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIGxpbWIpOworCSAgcHJpbnRmICgiKSxcdC8qICVkIC0gJWQgKCVkIHByaW1lcykgKi9cdCIsIGJpdF90b19uIChpICsgMSAtIGxpbWJfYml0cyksCisJCSAgYml0X3RvX24gKGkgKyAxKSAtIDEsIHBjKTsKKwkgIHRvdHBjICs9IHBjOworCSAgbGIgPSBwYyA9IDA7CisJICBtcHpfc2V0X3VpIChsaW1iLCAwKTsKKwl9CisgICAgfQorCisgIGlmICgobXB6X3NnbiAobGltYikgfCBsYiB8IHBjKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlxuZ2VuLXNpZXZlOiBJbnRlcm5hbCBlcnJvciwgZHVyaW5nIGdlbmVyYXRlICglZCwgJWQpLlxuIiwgbGltYl9iaXRzLCAgbGltaXQpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChsaW1iKTsKKworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIFBSSU1FU0lFVkVfTlVNQkVST0ZfVEFCTEUgJWRcbiIsIGMpOworCisgIHByaW50ZiAoIi8qICNkZWZpbmUgUFJJTUVTSUVWRV9QUklNRVNfSU5fVEFCTEUgJWQgKi9cbiIsIHRvdHBjKTsKKyAgcHJpbnRmICgiI2RlZmluZSBQUklNRVNJRVZFX0hJR0hFU1RfUFJJTUUgJWRcbiIsIG1heHByaW1lKTsKKyAgcHJpbnRmICgiLyogI2RlZmluZSBQUklNRVNJRVZFX0ZJUlNUX1VOQ0hFQ0tFRCAlZCAqL1xuIiwgYml0X3RvX24gKGxpbWl0KSk7CisKKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQKK3NldG1hc2sgKG1wel90IG1hc2ssIGludCBhLCBpbnQgYikKK3sKKyAgbXB6X3NldF91aSAobWFzaywgMCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAyICogYSAqIGI7ICsraSkKKyAgICBpZiAoKGJpdF90b19uIChpKSAlIGEgPT0gMCkgfHwgKGJpdF90b19uIChpKSAlIGIgPT0gMCkpCisgICAgICBtcHpfc2V0Yml0IChtYXNrLCBpKTsKK30KKwordm9pZAorZ2VuX3NpZXZlX21hc2tzIChpbnQgbGltYl9iaXRzKSB7CisgIG1wel90ICBtYXNrLCBsaW1iOworCisgIG1wel9pbml0IChtYXNrKTsKKyAgbXB6X2luaXQgKGxpbWIpOworCisgIHByaW50ZiAoIlxuIik7CisgIGlmIChsaW1iX2JpdHMgPiA2MCAmJiBsaW1iX2JpdHMgPCA5MSkKKyAgICB7CisgICAgICBzZXRtYXNrIChtYXNrLCA1LCAxMSk7CisKKyAgICAgIG1wel90ZGl2X3JfMmV4cCAobGltYiwgbWFzaywgbGltYl9iaXRzKTsKKyAgICAgIHByaW50ZiAoIiNkZWZpbmUgU0lFVkVfTUFTSzEgQ05TVF9MSU1CKDB4Iik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIGxpbWIpOworICAgICAgcHJpbnRmICgiKVxuIik7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKGxpbWIsIG1hc2ssIGxpbWJfYml0cyk7CisgICAgICBwcmludGYgKCIjZGVmaW5lIFNJRVZFX01BU0tUIENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgLTE2LCBsaW1iKTsKKyAgICAgIHByaW50ZiAoIilcbiIpOworCisgICAgICBzZXRtYXNrIChtYXNrLCA3LCAxMyk7CisKKyAgICAgIG1wel90ZGl2X3JfMmV4cCAobGltYiwgbWFzaywgbGltYl9iaXRzKTsKKyAgICAgIHByaW50ZiAoIiNkZWZpbmUgU0lFVkVfMk1TSzEgQ05TVF9MSU1CKDB4Iik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIGxpbWIpOworICAgICAgcHJpbnRmICgiKVxuIik7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKG1hc2ssIG1hc2ssIGxpbWJfYml0cyk7CisgICAgICBtcHpfdGRpdl9yXzJleHAgKGxpbWIsIG1hc2ssIGxpbWJfYml0cyk7CisgICAgICBwcmludGYgKCIjZGVmaW5lIFNJRVZFXzJNU0syIENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgLTE2LCBsaW1iKTsKKyAgICAgIHByaW50ZiAoIilcbiIpOworICAgICAgbXB6X3RkaXZfcV8yZXhwIChsaW1iLCBtYXNrLCBsaW1iX2JpdHMpOworICAgICAgcHJpbnRmICgiI2RlZmluZSBTSUVWRV8yTVNLVCBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIC0xNiwgbGltYik7CisgICAgICBwcmludGYgKCIpXG4iKTsKKyAgICB9CisgIGVsc2UgaWYgKGxpbWJfYml0cyA+IDIzICYmIGxpbWJfYml0cyA8IDM2KQorICAgIHsKKyAgICAgIHNldG1hc2sgKG1hc2ssIDUsIDcpOworCisgICAgICBtcHpfdGRpdl9yXzJleHAgKGxpbWIsIG1hc2ssIGxpbWJfYml0cyk7CisgICAgICBwcmludGYgKCIjZGVmaW5lIFNJRVZFX01BU0sxIENOU1RfTElNQigweCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgLTE2LCBsaW1iKTsKKyAgICAgIHByaW50ZiAoIilcbiIpOworICAgICAgbXB6X3RkaXZfcV8yZXhwIChtYXNrLCBtYXNrLCBsaW1iX2JpdHMpOworICAgICAgbXB6X3RkaXZfcl8yZXhwIChsaW1iLCBtYXNrLCBsaW1iX2JpdHMpOworICAgICAgcHJpbnRmICgiI2RlZmluZSBTSUVWRV9NQVNLMiBDTlNUX0xJTUIoMHgiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIC0xNiwgbGltYik7CisgICAgICBwcmludGYgKCIpXG4iKTsKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAobGltYiwgbWFzaywgbGltYl9iaXRzKTsKKyAgICAgIHByaW50ZiAoIiNkZWZpbmUgU0lFVkVfTUFTS1QgQ05TVF9MSU1CKDB4Iik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIGxpbWIpOworICAgICAgcHJpbnRmICgiKVxuIik7CisgICAgfQorICBwcmludGYgKCJcbiIpOworCisgIG1wel9jbGVhciAobGltYik7CisgIG1wel9jbGVhciAobWFzayk7Cit9CisKKy8qIDUqMiA9IDEwCisgICA3KjIgPSAxNAorICAgNSo3KjIgPSA3MCAoMiozNSwgMyoyNCwgNCoxOCwgNSoxNC4uLikKKyAgIDUqMTEqMiA9IDExMCAoMio1NSwgMyozNywgNCoyOCwgNSoyMi4uLikKKyAgIDUqMTMqMiA9IDEzMCAoMio2NSwgMyo0NCwgNCozMywgNSoyNi4uLikKKyAgIDcqMTEqMiA9IDE1NCAoMio3NywgMyo1MiwgNCozOSwgNSozMS4uLikKKyAgIDcqMTMqMiA9IDE4MiAoMio5MSwgMyo2MSwgNCo0NiwgNSozNy4uLikKKyovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50ICBsaW1iX2JpdHMsIGxpbWl0OworCisgIGlmIChhcmdjICE9IDIpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IGdlbi1zaWV2ZSA8bGltYmJpdHM+XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBsaW1iX2JpdHMgPSBhdG9pIChhcmd2WzFdKTsKKworICBsaW1pdCA9IDY0ICogMjg7IC8qIGJpdHMgaW4gdGhlIHByZXNpZXZlZCBzaWV2ZSAqLworICBpZiAobGltaXQgJSBsaW1iX2JpdHMgIT0gMCkKKyAgICBsaW1pdCArPSBsaW1iX2JpdHMgLSBsaW1pdCAlIGxpbWJfYml0czsKKyAgZ2VuZXJhdGUgKGxpbWJfYml0cywgbGltaXQpOworICBnZW5fc2lldmVfbWFza3MgKGxpbWJfYml0cyk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZW4tdHJpYWxkaXZ0YWIuYyBiL2dlbi10cmlhbGRpdnRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOGMzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZW4tdHJpYWxkaXZ0YWIuYwpAQCAtMCwwICsxLDMwMSBAQAorLyogZ2VuLXRyaWFsZGl2dGFiLmMKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMiwgMjAxMywgMjAxNiwgMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyoKKyAgR2VuZXJhdGUgdGFibGVzIGZvciBmYXN0LCBkaXZpc2lvbi1mcmVlIHRyaWFsIGRpdmlzaW9uIGZvciBHTVAuCisKKyAgVGhlcmUgaXMgb25lIG1haW4gdGFibGUsIHB0YWIuICBJdCBjb250YWlucyBwcmltZXMsIG11bHRpcGxpZWQgdG9nZXRoZXIsIGFuZAorICBzZXZlcmFsIHR5cGVzIG9mIHByZS1jb21wdXRlZCBpbnZlcnNlcy4gIEl0IHJlZmVycyB0byB0YWJsZXMgb2YgdGhlIHR5cGUKKyAgZHRhYiwgdmlhIHRoZSBsYXN0IHR3byBpbmRpY2VzLiAgVGhhdCB0YWJsZSBjb250YWlucyB0aGUgaW5kaXZpZHVhbCBwcmltZXMgaW4KKyAgdGhlIHJhbmdlLCBleGNlcHQgdGhhdCB0aGUgcHJpbWVzIGFyZSBub3QgYWN0dWFsbHkgaW5jbHVkZWQgaW4gdGhlIHRhYmxlIChzZWUKKyAgdGhlIFAgbWFjcm87IGl0IHNuZWFraW5nbHkgZXhjbHVkZXMgdGhlIHByaW1lcyB0aGVtc2VsdmVzKS4gIEluc3RlYWQsIHRoZQorICBkdGFiIHRhYmxlcyBjb250YWlucyB0dXBsZXMgZm9yIGVhY2ggcHJpbWUgKG1vZHVsYXItaW52ZXJzZSwgbGltaXQpIHVzZWQgZm9yCisgIGRpdmlzaWJpbGl0eSBjaGVja3MuCisKKyAgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIGZvciBkaXZpc2lvbiBvZiB2ZXJ5IG1hbnkgcHJpbWVzLCBzaW5jZSB0aGVuCisgIG90aGVyIGFsZ29yaXRobXMgYXBwbHkuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJib290c3RyYXAuYyIKKworaW50IHN1bXNwaWxscyAobXB6X3QsIG1wel90ICosIGludCk7Cit2b2lkIG1wbl9tb2RfMXNfNHBfY3BzIChtcHpfdCBbN10sIG1wel90KTsKKworaW50IGxpbWJfYml0czsKKworbXB6X3QgQjsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgdCwgcDsKKyAgbXB6X3QgcHBwLCBhY2MsIGludiwgZ21wX251bWJfbWF4LCB0bXAsIEJoYWxmOworICBtcHpfdCBwcmVbN107CisgIGludCBpOworICBpbnQgc3RhcnRfcCwgZW5kX3AsIGludGVydmFsX3N0YXJ0LCBpbnRlcnZhbF9lbmQsIG9taXR0ZWRfcDsKKyAgY29uc3QgY2hhciAqZW5kdG9rOworICBpbnQgc3RvcDsKKyAgaW50IG5wLCBzdGFydF9pZHg7CisKKyAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBiaXRzIGVuZHByaW1lXG4iLCBhcmd2WzBdKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBsaW1iX2JpdHMgPSBhdG9pIChhcmd2WzFdKTsKKworICBlbmRfcCA9IDEyOTA7CQkJLyogZGVmYXVsdCBlbmQgcHJpbWUgKi8KKyAgaWYgKGFyZ2MgPT0gMykKKyAgICBlbmRfcCA9IGF0b2kgKGFyZ3ZbMl0pOworCisgIHByaW50ZiAoIiNpZiBHTVBfTElNQl9CSVRTICE9ICVkXG4iLCBsaW1iX2JpdHMpOworICBwcmludGYgKCIjZXJyb3IgVGhpcyB0YWJsZSBpcyBmb3IgR01QX0xJTUJfQklUUyA9ICVkXG4iLCBsaW1iX2JpdHMpOworICBwcmludGYgKCIjZW5kaWZcblxuIik7CisKKyAgcHJpbnRmICgiI2lmIEdNUF9OQUlMX0JJVFMgIT0gMFxuIik7CisgIHByaW50ZiAoIiNlcnJvciBUaGlzIHRhYmxlIGRvZXMgbm90IHN1cHBvcnQgbmFpbHNcbiIpOworICBwcmludGYgKCIjZW5kaWZcblxuIik7CisKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICBtcHpfaW5pdCAocHJlW2ldKTsKKworICBtcHpfaW5pdCAoQik7CisgIG1wel9zZXRiaXQgKEIsIGxpbWJfYml0cyk7CisgIG1wel9pbml0X3NldCAoZ21wX251bWJfbWF4LCBCKTsKKyAgbXB6X3N1Yl91aSAoZ21wX251bWJfbWF4LCBnbXBfbnVtYl9tYXgsIDEpOworCisgIG1wel9pbml0ICh0bXApOworICBtcHpfaW5pdCAoaW52KTsKKworICBtcHpfaW5pdCAoQmhhbGYpOworICBtcHpfc2V0Yml0IChCaGFsZiwgbGltYl9iaXRzIC0gMSk7CisKKyAgc3RhcnRfcCA9IDM7CisKKyAgbXB6X2luaXRfc2V0X3VpIChwcHAsIDEpOworICBtcHpfaW5pdCAoYWNjKTsKKyAgaW50ZXJ2YWxfc3RhcnQgPSBzdGFydF9wOworICBvbWl0dGVkX3AgPSAzOworICBpbnRlcnZhbF9lbmQgPSAwOworCisvKiAgcHJpbnRmICgic3RhdGljIHN0cnVjdCBnbXBfcHJpbWVzX2R0YWIgZ21wX3ByaW1lc19kdGFiW10gPSB7XG4iKTsgKi8KKworICBwcmludGYgKCIjaWZkZWYgV0FOVF9kdGFiXG4iKTsKKworICBmb3IgKHQgPSBzdGFydF9wOyB0IDw9IGVuZF9wOyB0ICs9IDIpCisgICAgeworICAgICAgaWYgKCEgaXNwcmltZSAodCkpCisJY29udGludWU7CisKKyAgICAgIG1wel9tdWxfdWkgKGFjYywgcHBwLCB0KTsKKyAgICAgIHN0b3AgPSBtcHpfY21wIChhY2MsIEJoYWxmKSA+PSAwOworICAgICAgaWYgKCFzdG9wKQorCXsKKwkgIG1wbl9tb2RfMXNfNHBfY3BzIChwcmUsIGFjYyk7CisJICBzdG9wID0gc3Vtc3BpbGxzIChhY2MsIHByZSArIDIsIDUpOworCX0KKworICAgICAgaWYgKHN0b3ApCisJeworCSAgZm9yIChwID0gaW50ZXJ2YWxfc3RhcnQ7IHAgPD0gaW50ZXJ2YWxfZW5kOyBwICs9IDIpCisJICAgIHsKKwkgICAgICBpZiAoISBpc3ByaW1lIChwKSkKKwkJY29udGludWU7CisKKwkgICAgICBwcmludGYgKCIgIFAoJWQsIiwgKGludCkgcCk7CisJICAgICAgbXB6X2ludmVydF91aV8yZXhwIChpbnYsIHAsIGxpbWJfYml0cyk7CisJICAgICAgcHJpbnRmICgiQ05TVF9MSU1CKDB4Iik7ICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgaW52KTsgIHByaW50ZiAoIiksIik7CisKKwkgICAgICBtcHpfdGRpdl9xX3VpICh0bXAsIGdtcF9udW1iX21heCwgcCk7CisJICAgICAgcHJpbnRmICgiQ05TVF9MSU1CKDB4Iik7ICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgdG1wKTsKKwkgICAgICBwcmludGYgKCIpKSxcbiIpOworCSAgICB9CisJICBtcHpfc2V0X3VpIChwcHAsIHQpOworCSAgaW50ZXJ2YWxfc3RhcnQgPSB0OworCSAgb21pdHRlZF9wID0gdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXB6X3NldCAocHBwLCBhY2MpOworCX0KKyAgICAgIGludGVydmFsX2VuZCA9IHQ7CisgICAgfQorICBwcmludGYgKCIjZGVmaW5lIFNNQUxMRVNUX09NSVRURURfUFJJTUUgJWRcbiIsIChpbnQpIG9taXR0ZWRfcCk7CisgIHByaW50ZiAoIiNlbmRpZlxuIik7CisKKyAgcHJpbnRmICgiI2lmZGVmIFdBTlRfcHRhYlxuIik7CisKKy8qICBwcmludGYgKCJzdGF0aWMgc3RydWN0IGdtcF9wcmltZXNfcHRhYiBnbXBfcHJpbWVzX3B0YWJbXSA9IHtcbiIpOyAqLworCisgIGVuZHRvayA9ICIiOworCisgIG1wel9zZXRfdWkgKHBwcCwgMSk7CisgIGludGVydmFsX3N0YXJ0ID0gc3RhcnRfcDsKKyAgaW50ZXJ2YWxfZW5kID0gMDsKKyAgbnAgPSAwOworICBzdGFydF9pZHggPSAwOworICBmb3IgKHQgPSBzdGFydF9wOyB0IDw9IGVuZF9wOyB0ICs9IDIpCisgICAgeworICAgICAgaWYgKCEgaXNwcmltZSAodCkpCisJY29udGludWU7CisKKyAgICAgIG1wel9tdWxfdWkgKGFjYywgcHBwLCB0KTsKKworICAgICAgc3RvcCA9IG1wel9jbXAgKGFjYywgQmhhbGYpID49IDA7CisgICAgICBpZiAoIXN0b3ApCisJeworCSAgbXBuX21vZF8xc180cF9jcHMgKHByZSwgYWNjKTsKKwkgIHN0b3AgPSBzdW1zcGlsbHMgKGFjYywgcHJlICsgMiwgNSk7CisJfQorCisgICAgICBpZiAoc3RvcCkKKwl7CisJICBtcG5fbW9kXzFzXzRwX2NwcyAocHJlLCBwcHApOworCSAgcHJpbnRmICgiJXMiLCBlbmR0b2spOworCSAgcHJpbnRmICgiICB7Q05TVF9MSU1CKDB4Iik7ICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgcHBwKTsKKwkgIHByaW50ZiAoIikse0NOU1RfTElNQigweCIpOyAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIHByZVswXSk7CisJICBwcmludGYgKCIpLCVkIiwgKGludCkgUFRSKHByZVsxXSlbMF0pOworCSAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiwiKTsKKwkgICAgICBwcmludGYgKCJDTlNUX0xJTUIoMHgiKTsgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBwcmVbMiArIGldKTsKKwkgICAgICBwcmludGYgKCIpIik7CisJICAgIH0KKwkgIHByaW50ZiAoIn0sIik7CisJICBwcmludGYgKCIlZCwiLCBzdGFydF9pZHgpOworCSAgcHJpbnRmICgiJWR9IiwgbnAgLSBzdGFydF9pZHgpOworCisJICBlbmR0b2sgPSAiLFxuIjsKKwkgIG1wel9zZXRfdWkgKHBwcCwgdCk7CisJICBpbnRlcnZhbF9zdGFydCA9IHQ7CisJICBzdGFydF9pZHggPSBucDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXB6X3NldCAocHBwLCBhY2MpOworCX0KKyAgICAgIGludGVydmFsX2VuZCA9IHQ7CisgICAgICBucCsrOworICAgIH0KKworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworCisgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nCittcHpfbG9nMiAobXB6X3QgeCkKK3sKKyAgcmV0dXJuIG1wel9zZ24gKHgpID8gbXB6X3NpemVpbmJhc2UgKHgsIDIpIDogMDsKK30KKwordm9pZAorbXBuX21vZF8xc180cF9jcHMgKG1wel90IGNwc1s3XSwgbXB6X3QgYnBhcm0pCit7CisgIG1wel90IGIsIGJpOworICBtcHpfdCBCMW1vZGIsIEIybW9kYiwgQjNtb2RiLCBCNG1vZGIsIEI1bW9kYjsKKyAgbXB6X3QgdDsKKyAgaW50IGNudDsKKworICBtcHpfaW5pdF9zZXQgKGIsIGJwYXJtKTsKKworICBjbnQgPSBsaW1iX2JpdHMgLSBtcHpfbG9nMiAoYik7CisKKyAgbXB6X2luaXQgKGJpKTsKKyAgbXB6X2luaXQgKHQpOworICBtcHpfaW5pdCAoQjFtb2RiKTsKKyAgbXB6X2luaXQgKEIybW9kYik7CisgIG1wel9pbml0IChCM21vZGIpOworICBtcHpfaW5pdCAoQjRtb2RiKTsKKyAgbXB6X2luaXQgKEI1bW9kYik7CisKKyAgbXB6X3NldF91aSAodCwgMSk7CisgIG1wel9tdWxfMmV4cCAodCwgdCwgbGltYl9iaXRzIC0gY250KTsKKyAgbXB6X3N1YiAodCwgdCwgYik7CisgIG1wel9tdWxfMmV4cCAodCwgdCwgbGltYl9iaXRzKTsKKyAgbXB6X3RkaXZfcSAoYmksIHQsIGIpOwkJLyogYmkgPSBCXjIvYiwgZXhjZXB0IG1zYiAqLworCisgIG1wel9zZXRfdWkgKHQsIDEpOworICBtcHpfbXVsXzJleHAgKHQsIHQsIGxpbWJfYml0cyk7CS8qIHQgPSBCICovCisgIG1wel90ZGl2X3IgKEIxbW9kYiwgdCwgYik7CisKKyAgbXB6X211bF8yZXhwICh0LCBCMW1vZGIsIGxpbWJfYml0cyk7CisgIG1wel90ZGl2X3IgKEIybW9kYiwgdCwgYik7CisKKyAgbXB6X211bF8yZXhwICh0LCBCMm1vZGIsIGxpbWJfYml0cyk7CisgIG1wel90ZGl2X3IgKEIzbW9kYiwgdCwgYik7CisKKyAgbXB6X211bF8yZXhwICh0LCBCM21vZGIsIGxpbWJfYml0cyk7CisgIG1wel90ZGl2X3IgKEI0bW9kYiwgdCwgYik7CisKKyAgbXB6X211bF8yZXhwICh0LCBCNG1vZGIsIGxpbWJfYml0cyk7CisgIG1wel90ZGl2X3IgKEI1bW9kYiwgdCwgYik7CisKKyAgbXB6X3NldCAoY3BzWzBdLCBiaSk7CisgIG1wel9zZXRfdWkgKGNwc1sxXSwgY250KTsKKyAgbXB6X3RkaXZfcV8yZXhwIChjcHNbMl0sIEIxbW9kYiwgMCk7CisgIG1wel90ZGl2X3FfMmV4cCAoY3BzWzNdLCBCMm1vZGIsIDApOworICBtcHpfdGRpdl9xXzJleHAgKGNwc1s0XSwgQjNtb2RiLCAwKTsKKyAgbXB6X3RkaXZfcV8yZXhwIChjcHNbNV0sIEI0bW9kYiwgMCk7CisgIG1wel90ZGl2X3FfMmV4cCAoY3BzWzZdLCBCNW1vZGIsIDApOworCisgIG1wel9jbGVhciAoYik7CisgIG1wel9jbGVhciAoYmkpOworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKEIxbW9kYik7CisgIG1wel9jbGVhciAoQjJtb2RiKTsKKyAgbXB6X2NsZWFyIChCM21vZGIpOworICBtcHpfY2xlYXIgKEI0bW9kYik7CisgIG1wel9jbGVhciAoQjVtb2RiKTsKK30KKworaW50CitzdW1zcGlsbHMgKG1wel90IHBwcCwgbXB6X3QgKmEsIGludCBuKQoreworICBtcHpfdCBzOworICBpbnQgaSwgcmV0OworCisgIG1wel9pbml0X3NldCAocywgYVswXSk7CisKKyAgZm9yIChpID0gMTsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBtcHpfYWRkIChzLCBzLCBhW2ldKTsKKyAgICB9CisgIHJldCA9IG1wel9jbXAgKHMsIEIpID49IDA7CisgIG1wel9jbGVhciAocyk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dtcC1oLmluIGIvZ21wLWguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5OGU5NwotLS0gL2Rldi9udWxsCisrKyBiL2dtcC1oLmluCkBAIC0wLDAgKzEsMjM0NCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIEdOVSBtdWx0aXBsZSBwcmVjaXNpb24gZnVuY3Rpb25zLiAgIC0qLSBtb2RlOiBjIC0qLQorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk3LCAxOTk5LTIwMTYsIDIwMjAsIDIwMjEgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaWZuZGVmIF9fR01QX0hfXworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaW5jbHVkZSA8aW9zZndkPiAgIC8qIGZvciBzdGQ6OmlzdHJlYW0sIHN0ZDo6b3N0cmVhbSwgc3RkOjpzdHJpbmcgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisjZW5kaWYKKworCisvKiBJbnN0YW50aWF0ZWQgYnkgY29uZmlndXJlLiAqLworI2lmICEgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkKKyNkZWZpbmUgX19HTVBfSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXIgICBASEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJACisjZGVmaW5lIF9fR01QX0hBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMgQEhBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGNACisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgICAgICAgICAgICAgICAgICAgICAgQEdNUF9MSU1CX0JJVFNACisjZGVmaW5lIEdNUF9OQUlMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgQEdNUF9OQUlMX0JJVFNACisjZW5kaWYKKyNkZWZpbmUgR01QX05VTUJfQklUUyAgICAgKEdNUF9MSU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTKQorI2RlZmluZSBHTVBfTlVNQl9NQVNLICAgICAoKH4gX19HTVBfQ0FTVCAobXBfbGltYl90LCAwKSkgPj4gR01QX05BSUxfQklUUykKKyNkZWZpbmUgR01QX05VTUJfTUFYICAgICAgR01QX05VTUJfTUFTSworI2RlZmluZSBHTVBfTkFJTF9NQVNLICAgICAofiBHTVBfTlVNQl9NQVNLKQorCisKKyNpZm5kZWYgX19HTlVfTVBfXworI2RlZmluZSBfX0dOVV9NUF9fIDYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAvKiBmb3Igc2l6ZV90ICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIEluc3RhbnRpYXRlZCBieSBjb25maWd1cmUuICovCisjaWYgISBkZWZpbmVkIChfX0dNUF9XSVRISU5fQ09ORklHVVJFKQorQERFRk5fTE9OR19MT05HX0xJTUJACisjZGVmaW5lIF9fR01QX0xJQkdNUF9ETEwgIEBMSUJHTVBfRExMQAorI2VuZGlmCisKKworLyogX19HTVBfREVDTFNQRUMgc3VwcG9ydHMgV2luZG93cyBETEwgdmVyc2lvbnMgb2YgbGliZ21wLCBhbmQgaXMgZW1wdHkgaW4KKyAgIGFsbCBvdGhlciBjaXJjdW1zdGFuY2VzLgorCisgICBXaGVuIGNvbXBpbGluZyBvYmplY3RzIGZvciBsaWJnbXAsIF9fR01QX0RFQ0xTUEVDIGlzIGFuIGV4cG9ydCBkaXJlY3RpdmUsCisgICBvciB3aGVuIGNvbXBpbGluZyBmb3IgYW4gYXBwbGljYXRpb24gaXQncyBhbiBpbXBvcnQgZGlyZWN0aXZlLiAgVGhlIHR3bworICAgY2FzZXMgYXJlIGRpZmZlcmVudGlhdGVkIGJ5IF9fR01QX1dJVEhJTl9HTVAgZGVmaW5lZCBieSB0aGUgR01QIE1ha2VmaWxlcworICAgKGFuZCBub3QgZGVmaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uKS4KKworICAgX19HTVBfREVDTFNQRUNfWFggaXMgc2ltaWxhcmx5IHVzZWQgZm9yIGxpYmdtcHh4LiAgX19HTVBfV0lUSElOX0dNUFhYCisgICBpbmRpY2F0ZXMgd2hlbiBidWlsZGluZyBsaWJnbXB4eCwgYW5kIGluIHRoYXQgY2FzZSBsaWJnbXB4eCBmdW5jdGlvbnMgYXJlCisgICBleHBvcnRzLCBidXQgbGliZ21wIGZ1bmN0aW9ucyB3aGljaCBtaWdodCBnZXQgY2FsbGVkIGFyZSBpbXBvcnRzLgorCisgICBMaWJ0b29sIERMTF9FWFBPUlQgZGVmaW5lIGlzIG5vdCB1c2VkLgorCisgICBUaGVyZSdzIG5vIGF0dGVtcHQgdG8gc3VwcG9ydCBHTVAgYnVpbHQgYm90aCBzdGF0aWMgYW5kIERMTC4gIERvaW5nIHNvCisgICB3b3VsZCBtZWFuIGFwcGxpY2F0aW9ucyB3b3VsZCBoYXZlIHRvIHRlbGwgdXMgd2hpY2ggb2YgdGhlIHR3byBpcyBnb2luZworICAgdG8gYmUgdXNlZCB3aGVuIGxpbmtpbmcsIGFuZCB0aGF0IHNlZW1zIHZlcnkgdGVkaW91cyBhbmQgZXJyb3IgcHJvbmUgaWYKKyAgIHVzaW5nIEdNUCBieSBoYW5kLCBhbmQgZXF1YWxseSB0ZWRpb3VzIGZyb20gYSBwYWNrYWdlIHNpbmNlIGF1dG9jb25mIGFuZAorICAgYXV0b21ha2UgZG9uJ3QgZ2l2ZSBtdWNoIGhlbHAuCisKKyAgIF9fR01QX0RFQ0xTUEVDIGlzIHJlcXVpcmVkIG9uIGFsbCBkb2N1bWVudGVkIGdsb2JhbCBmdW5jdGlvbnMgYW5kCisgICB2YXJpYWJsZXMsIHRoZSB2YXJpb3VzIGludGVybmFscyBpbiBnbXAtaW1wbC5oIGV0YyBjYW4gYmUgbGVmdCB1bmFkb3JuZWQuCisgICBCdXQgaW50ZXJuYWxzIHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMgb3Igc3BlZWQgbWVhc3VyaW5nIHByb2dyYW1zCisgICBzaG91bGQgaGF2ZSBfX0dNUF9ERUNMU1BFQywgYW5kIGNlcnRhaW5seSBjb25zdGFudHMgb3IgdmFyaWFibGVzIG11c3QKKyAgIGhhdmUgaXQgb3IgdGhlIHdyb25nIGFkZHJlc3Mgd2lsbCBiZSByZXNvbHZlZC4KKworICAgSW4gZ2NjIF9fZGVjbHNwZWMgY2FuIGdvIGF0IGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgcHJvdG90eXBlLgorCisgICBJbiBNaWNyb3NvZnQgQyBfX2RlY2xzcGVjIG11c3QgZ28gYXQgdGhlIHN0YXJ0LCBvciBhZnRlciB0aGUgdHlwZSBsaWtlCisgICB2b2lkIF9fZGVjbHNwZWMoLi4uKSAqZm9vKCkiLiAgVGhlcmUncyBubyBfX2RsbGV4cG9ydCBvciBhbnl0aGluZyB0bworICAgZ3VhcmQgYWdhaW5zdCBzb21lb25lIGZvb2xpc2ggI2RlZmluaW5nIGRsbGV4cG9ydC4gIF9leHBvcnQgdXNlZCB0byBiZQorICAgYXZhaWxhYmxlLCBidXQgbm8gbG9uZ2VyLgorCisgICBJbiBCb3JsYW5kIEMgX2V4cG9ydCBzdGlsbCBleGlzdHMsIGJ1dCBuZWVkcyB0byBnbyBhZnRlciB0aGUgdHlwZSwgbGlrZQorICAgInZvaWQgX2V4cG9ydCBmb28oKTsiLiAgV291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIF9fR01QX0RFQ0xTUEVDIHN5bnRheCB0bworICAgbWFrZSB1c2Ugb2YgdGhhdC4gIFByb2JhYmx5IG1vcmUgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICAqLworCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgX19kZWNsc3BlYyhfX2RsbGV4cG9ydF9fKQorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19JTVBPUlQgIF9fZGVjbHNwZWMoX19kbGxpbXBvcnRfXykKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9NU0NfVkVSKSB8fCBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKyNpZmRlZiBfX1dBVENPTUNfXworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19FWFBPUlQgIF9fZXhwb3J0CisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX19pbXBvcnQKKyNlbmRpZgorI2lmZGVmIF9fSUJNQ19fCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgX0V4cG9ydAorI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19JTVBPUlQgIF9JbXBvcnQKKyNlbmRpZgorCisjaWYgX19HTVBfTElCR01QX0RMTAorI2lmZGVmIF9fR01QX1dJVEhJTl9HTVAKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGEgRExMIGxpYmdtcCAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQyAgX19HTVBfREVDTFNQRUNfRVhQT1JUCisjZWxzZQorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYW4gYXBwbGljYXRpb24gd2hpY2ggd2lsbCBsaW5rIHRvIGEgRExMIGxpYmdtcCAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQyAgX19HTVBfREVDTFNQRUNfSU1QT1JUCisjZW5kaWYKKyNlbHNlCisvKiBhbGwgb3RoZXIgY2FzZXMgKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUMKKyNlbmRpZgorCisKKyNpZmRlZiBfX0dNUF9TSE9SVF9MSU1CCit0eXBlZGVmIHVuc2lnbmVkIGludAkJbXBfbGltYl90OwordHlwZWRlZiBpbnQJCQltcF9saW1iX3NpZ25lZF90OworI2Vsc2UKKyNpZmRlZiBfTE9OR19MT05HX0xJTUIKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludAltcF9saW1iX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQJCW1wX2xpbWJfc2lnbmVkX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAltcF9saW1iX3Q7Cit0eXBlZGVmIGxvbmcgaW50CQltcF9saW1iX3NpZ25lZF90OworI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJbXBfYml0Y250X3Q7CisKKy8qIEZvciByZWZlcmVuY2UsIG5vdGUgdGhhdCB0aGUgbmFtZSBfX21wel9zdHJ1Y3QgZ2V0cyBpbnRvIEMrKyBtYW5nbGVkCisgICBmdW5jdGlvbiBuYW1lcywgd2hpY2ggbWVhbnMgYWx0aG91Z2ggdGhlICJfXyIgc3VnZ2VzdHMgYW4gaW50ZXJuYWwsIHdlCisgICBtdXN0IGxlYXZlIHRoaXMgbmFtZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IF9tcF9hbGxvYzsJCS8qIE51bWJlciBvZiAqbGltYnMqIGFsbG9jYXRlZCBhbmQgcG9pbnRlZAorCQkJCSAgIHRvIGJ5IHRoZSBfbXBfZCBmaWVsZC4gICovCisgIGludCBfbXBfc2l6ZTsJCQkvKiBhYnMoX21wX3NpemUpIGlzIHRoZSBudW1iZXIgb2YgbGltYnMgdGhlCisJCQkJICAgbGFzdCBmaWVsZCBwb2ludHMgdG8uICBJZiBfbXBfc2l6ZSBpcworCQkJCSAgIG5lZ2F0aXZlIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuICAqLworICBtcF9saW1iX3QgKl9tcF9kOwkJLyogUG9pbnRlciB0byB0aGUgbGltYnMuICAqLworfSBfX21wel9zdHJ1Y3Q7CisKKyNlbmRpZiAvKiBfX0dOVV9NUF9fICovCisKKwordHlwZWRlZiBfX21wel9zdHJ1Y3QgTVBfSU5UOyAgICAvKiBnbXAgMSBzb3VyY2UgY29tcGF0aWJpbGl0eSAqLwordHlwZWRlZiBfX21wel9zdHJ1Y3QgbXB6X3RbMV07CisKK3R5cGVkZWYgbXBfbGltYl90ICoJCW1wX3B0cjsKK3R5cGVkZWYgY29uc3QgbXBfbGltYl90ICoJbXBfc3JjcHRyOworI2lmIGRlZmluZWQgKF9DUkFZKSAmJiAhIGRlZmluZWQgKF9DUkFZTVBQKQorLyogcGxhaW4gYGludCcgaXMgbXVjaCBmYXN0ZXIgKDQ4IGJpdHMpICovCisjZGVmaW5lIF9fR01QX01QX1NJWkVfVF9JTlQgICAgIDEKK3R5cGVkZWYgaW50CQkJbXBfc2l6ZV90OwordHlwZWRlZiBpbnQJCQltcF9leHBfdDsKKyNlbHNlCisjZGVmaW5lIF9fR01QX01QX1NJWkVfVF9JTlQgICAgIDAKK3R5cGVkZWYgbG9uZyBpbnQJCW1wX3NpemVfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCW1wX2V4cF90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fbXB6X3N0cnVjdCBfbXBfbnVtOworICBfX21wel9zdHJ1Y3QgX21wX2RlbjsKK30gX19tcHFfc3RydWN0OworCit0eXBlZGVmIF9fbXBxX3N0cnVjdCBNUF9SQVQ7ICAgIC8qIGdtcCAxIHNvdXJjZSBjb21wYXRpYmlsaXR5ICovCit0eXBlZGVmIF9fbXBxX3N0cnVjdCBtcHFfdFsxXTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IF9tcF9wcmVjOwkJCS8qIE1heCBwcmVjaXNpb24sIGluIG51bWJlciBvZiBgbXBfbGltYl90J3MuCisJCQkJICAgU2V0IGJ5IG1wZl9pbml0IGFuZCBtb2RpZmllZCBieQorCQkJCSAgIG1wZl9zZXRfcHJlYy4gIFRoZSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlCisJCQkJICAgX21wX2QgZmllbGQgY29udGFpbnMgYHByZWMnICsgMSBsaW1icy4gICovCisgIGludCBfbXBfc2l6ZTsJCQkvKiBhYnMoX21wX3NpemUpIGlzIHRoZSBudW1iZXIgb2YgbGltYnMgdGhlCisJCQkJICAgbGFzdCBmaWVsZCBwb2ludHMgdG8uICBJZiBfbXBfc2l6ZSBpcworCQkJCSAgIG5lZ2F0aXZlIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuICAqLworICBtcF9leHBfdCBfbXBfZXhwOwkJLyogRXhwb25lbnQsIGluIHRoZSBiYXNlIG9mIGBtcF9saW1iX3QnLiAgKi8KKyAgbXBfbGltYl90ICpfbXBfZDsJCS8qIFBvaW50ZXIgdG8gdGhlIGxpbWJzLiAgKi8KK30gX19tcGZfc3RydWN0OworCisvKiB0eXBlZGVmIF9fbXBmX3N0cnVjdCBNUF9GTE9BVDsgKi8KK3R5cGVkZWYgX19tcGZfc3RydWN0IG1wZl90WzFdOworCisvKiBBdmFpbGFibGUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGFsZ29yaXRobXMuICAqLwordHlwZWRlZiBlbnVtCit7CisgIEdNUF9SQU5EX0FMR19ERUZBVUxUID0gMCwKKyAgR01QX1JBTkRfQUxHX0xDID0gR01QX1JBTkRfQUxHX0RFRkFVTFQgLyogTGluZWFyIGNvbmdydWVudGlhbC4gICovCit9IGdtcF9yYW5kYWxnX3Q7CisKKy8qIFJhbmRvbSBzdGF0ZSBzdHJ1Y3QuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbXB6X3QgX21wX3NlZWQ7CSAgLyogX21wX2QgbWVtYmVyIHBvaW50cyB0byBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLiAqLworICBnbXBfcmFuZGFsZ190IF9tcF9hbGc7ICAvKiBDdXJyZW50bHkgdW51c2VkLiAqLworICB1bmlvbiB7CisgICAgdm9pZCAqX21wX2xjOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gcG9pbnRlcnMgc3RydWN0dXJlLiAgKi8KKyAgfSBfbXBfYWxnZGF0YTsKK30gX19nbXBfcmFuZHN0YXRlX3N0cnVjdDsKK3R5cGVkZWYgX19nbXBfcmFuZHN0YXRlX3N0cnVjdCBnbXBfcmFuZHN0YXRlX3RbMV07CisKKy8qIFR5cGVzIGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgaW4gZ21wIGZpbGVzLiAgKi8KKy8qID8/PyBTaG91bGQgbm90IHBvbGx1dGUgdXNlciBuYW1lIHNwYWNlIHdpdGggdGhlc2UgPz8/ICovCit0eXBlZGVmIGNvbnN0IF9fbXB6X3N0cnVjdCAqbXB6X3NyY3B0cjsKK3R5cGVkZWYgX19tcHpfc3RydWN0ICptcHpfcHRyOwordHlwZWRlZiBjb25zdCBfX21wZl9zdHJ1Y3QgKm1wZl9zcmNwdHI7Cit0eXBlZGVmIF9fbXBmX3N0cnVjdCAqbXBmX3B0cjsKK3R5cGVkZWYgY29uc3QgX19tcHFfc3RydWN0ICptcHFfc3JjcHRyOwordHlwZWRlZiBfX21wcV9zdHJ1Y3QgKm1wcV9wdHI7Cit0eXBlZGVmIF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3QgKmdtcF9yYW5kc3RhdGVfcHRyOwordHlwZWRlZiBjb25zdCBfX2dtcF9yYW5kc3RhdGVfc3RydWN0ICpnbXBfcmFuZHN0YXRlX3NyY3B0cjsKKworCisjaWYgX19HTVBfTElCR01QX0RMTAorI2lmZGVmIF9fR01QX1dJVEhJTl9HTVBYWAorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwgbGliZ21weHggKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfWFggIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGEgYXBwbGljYXRpb24gd2hpY2ggd2lsbCBsaW5rIHRvIGEgRExMIGxpYmdtcHh4ICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX1hYICBfX0dNUF9ERUNMU1BFQ19JTVBPUlQKKyNlbmRpZgorI2Vsc2UKKy8qIGFsbCBvdGhlciBjYXNlcyAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19YWAorI2VuZGlmCisKKworI2lmbmRlZiBfX01QTgorI2RlZmluZSBfX01QTih4KSBfX2dtcG5fIyN4CisjZW5kaWYKKworLyogRm9yIHJlZmVyZW5jZSwgImRlZmluZWQoRU9GKSIgY2Fubm90IGJlIHVzZWQgaGVyZS4gIEluIGcrKyAyLjk1LjQsCisgICA8aW9zdHJlYW0+IGRlZmluZXMgRU9GIGJ1dCBub3QgRklMRS4gICovCisjaWYgZGVmaW5lZCAoRklMRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChIX1NURElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0hfU1RESU8pICAgICAgICAgICAgICAgLyogQUlYICovICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IKSAgICAgICAgICAgICAgIC8qIGdsaWJjLCBTdW4sIFNDTyAqLyAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSF8pICAgICAgICAgICAgICAvKiBCU0QsIE9TRiAqLyAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19IKSAgICAgICAgICAgICAgLyogQm9ybGFuZCAqLyAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fSF9fKSAgICAgICAgICAgIC8qIElSSVggKi8gICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSU5DTFVERUQpICAgICAgICAvKiBIUFVYICovICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19kal9pbmNsdWRlX3N0ZGlvX2hfKSAgLyogREpHUFAgKi8gICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9GSUxFX0RFRklORUQpICAgICAgICAgIC8qIE1pY3Jvc29mdCAqLyAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX18pICAgICAgICAgICAgICAvKiBBcHBsZSBNUFcgTXJDICovICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TTF9TVERJT19IKSAgICAgICAgICAgLyogTWV0cm93ZXJrcyAqLyAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IX0lOQ0xVREVEKSAgICAgIC8qIFFOWDQgKi8JCVwKKyAgfHwgZGVmaW5lZCAoX0lTT19TVERJT19JU09fSCkgICAgICAgLyogU3VuIEMrKyAqLwkJXAorICB8fCBkZWZpbmVkIChfX1NURElPX0xPQURFRCkgICAgICAgICAvKiBWTVMgKi8JCQlcCisgIHx8IGRlZmluZWQgKF9TVERJTykgICAgICAgICAgICAgICAgIC8qIEhQRSBOb25TdG9wICovICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX0RFRklORURfRklMRSkgICAgICAgICAvKiBtdXNsICovCisjZGVmaW5lIF9HTVBfSF9IQVZFX0ZJTEUgMQorI2VuZGlmCisKKy8qIEluIElTTyBDLCBpZiBhIHByb3RvdHlwZSBpbnZvbHZpbmcgInN0cnVjdCBvYnN0YWNrICoiIGlzIGdpdmVuIHdpdGhvdXQKKyAgIHRoYXQgc3RydWN0dXJlIGRlZmluZWQsIHRoZW4gdGhlIHN0cnVjdCBpcyBzY29wZWQgZG93biB0byBqdXN0IHRoZQorICAgcHJvdG90eXBlLCBjYXVzaW5nIGEgY29uZmxpY3QgaWYgaXQncyBzdWJzZXF1ZW50bHkgZGVmaW5lZCBmb3IgcmVhbC4gIFNvCisgICBvbmx5IGdpdmUgcHJvdG90eXBlcyBpZiB3ZSd2ZSBnb3Qgb2JzdGFjay5oLiAgKi8KKyNpZiBkZWZpbmVkIChfT0JTVEFDS19IKSAgIC8qIGdsaWJjIDxvYnN0YWNrLmg+ICovCisjZGVmaW5lIF9HTVBfSF9IQVZFX09CU1RBQ0sgMQorI2VuZGlmCisKKy8qIFRoZSBwcm90b3R5cGVzIGZvciBnbXBfdnByaW50ZiBldGMgYXJlIHByb3ZpZGVkIG9ubHkgaWYgdmFfbGlzdCBpcyBkZWZpbmVkLAorICAgdmlhIGFuIGFwcGxpY2F0aW9uIGhhdmluZyBpbmNsdWRlZCA8c3RkYXJnLmg+LiAgVXN1YWxseSB2YV9saXN0IGlzIGEgdHlwZWRlZgorICAgc28gY2FuJ3QgYmUgdGVzdGVkIGRpcmVjdGx5LCBidXQgQzk5IHNwZWNpZmllcyB0aGF0IHZhX3N0YXJ0IGlzIGEgbWFjcm8uCisKKyAgIDxzdGRpby5oPiB3aWxsIGRlZmluZSBzb21lIHNvcnQgb2YgdmFfbGlzdCBmb3IgdnByaW50ZiBhbmQgdmZwcmludGYsIGJ1dAorICAgbGV0J3Mgbm90IGJvdGhlciB0cnlpbmcgdG8gdXNlIHRoYXQgc2luY2UgaXQncyBub3Qgc3RhbmRhcmQgYW5kIHNpbmNlCisgICBhcHBsaWNhdGlvbiB1c2VzIGZvciBnbXBfdnByaW50ZiBldGMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlcXVpcmUgdGhlCisgICB3aG9sZSA8c3RkYXJnLmg+IGFueXdheS4gICovCisKKyNpZmRlZiB2YV9zdGFydAorI2RlZmluZSBfR01QX0hfSEFWRV9WQV9MSVNUIDEKKyNlbmRpZgorCisvKiBUZXN0IGZvciBnY2MgPj0gbWFqLm1pbiwgYXMgcGVyIF9fR05VQ19QUkVSRVEgaW4gZ2xpYmMgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19HTlVDX01JTk9SX18pCisjZGVmaW5lIF9fR01QX0dOVUNfUFJFUkVRKG1haiwgbWluKSBcCisgICgoX19HTlVDX18gPDwgMTYpICsgX19HTlVDX01JTk9SX18gPj0gKChtYWopIDw8IDE2KSArIChtaW4pKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfR05VQ19QUkVSRVEobWFqLCBtaW4pICAwCisjZW5kaWYKKworLyogInB1cmUiIGlzIGluIGdjYyAyLjk2IGFuZCB1cCwgc2VlICIoZ2NjKUZ1bmN0aW9uIEF0dHJpYnV0ZXMiLiAgQmFzaWNhbGx5CisgICBpdCBtZWFucyBhIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBidXQgZXhhbWluZSBpdHMgYXJndW1lbnRzIGFuZCBtZW1vcnkKKyAgIChnbG9iYWwgb3IgdmlhIGFyZ3VtZW50cykgdG8gZ2VuZXJhdGUgYSByZXR1cm4gdmFsdWUsIGJ1dCBjaGFuZ2VzIG5vdGhpbmcKKyAgIGFuZCBoYXMgbm8gc2lkZS1lZmZlY3RzLiAgX19HTVBfTk9fQVRUUklCVVRFX0NPTlNUX1BVUkUgbGV0cworICAgdHVuZS9jb21tb24uYyBldGMgdHVybiB0aGlzIG9mZiB3aGVuIHRyeWluZyB0byB3cml0ZSB0aW1pbmcgbG9vcHMuICAqLworI2lmIF9fR01QX0dOVUNfUFJFUkVRICgyLDk2KSAmJiAhIGRlZmluZWQgKF9fR01QX05PX0FUVFJJQlVURV9DT05TVF9QVVJFKQorI2RlZmluZSBfX0dNUF9BVFRSSUJVVEVfUFVSRSAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZWxzZQorI2RlZmluZSBfX0dNUF9BVFRSSUJVVEVfUFVSRQorI2VuZGlmCisKKworLyogX19HTVBfQ0FTVCBhbGxvd3MgdXMgdG8gdXNlIHN0YXRpY19jYXN0IGluIEMrKywgc28gb3VyIG1hY3JvcyBhcmUgY2xlYW4KKyAgIHRvICJnKysgLVdvbGQtc3R5bGUtY2FzdCIuCisKKyAgIENhc3RzIGluICJleHRlcm4gaW5saW5lIiBjb2RlIHdpdGhpbiBhbiBleHRlcm4gIkMiIGJsb2NrIGRvbid0IGluZHVjZQorICAgdGhlc2Ugd2FybmluZ3MsIHNvIF9fR01QX0NBU1Qgb25seSBuZWVkcyB0byBiZSB1c2VkIG9uIGRvY3VtZW50ZWQKKyAgIG1hY3Jvcy4gICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBfX0dNUF9DQVNUKHR5cGUsIGV4cHIpICAoc3RhdGljX2Nhc3Q8dHlwZT4gKGV4cHIpKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfQ0FTVCh0eXBlLCBleHByKSAgKCh0eXBlKSAoZXhwcikpCisjZW5kaWYKKworCisvKiBBbiBlbXB0eSAidGhyb3cgKCkiIG1lYW5zIHRoZSBmdW5jdGlvbiBkb2Vzbid0IHRocm93IGFueSBDKysgZXhjZXB0aW9ucywKKyAgIHRoaXMgY2FuIHNhdmUgc29tZSBzdGFjayBmcmFtZSBpbmZvIGluIGFwcGxpY2F0aW9ucy4KKworICAgQ3VycmVudGx5IGl0J3MgZ2l2ZW4gb25seSBvbiBmdW5jdGlvbnMgd2hpY2ggbmV2ZXIgZGl2aWRlLWJ5LXplcm8gZXRjLAorICAgZG9uJ3QgYWxsb2NhdGUgbWVtb3J5LCBhbmQgYXJlIGV4cGVjdGVkIHRvIG5ldmVyIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5LgorICAgVGhpcyBsZWF2ZXMgb3BlbiB0aGUgcG9zc2liaWxpdHkgb2YgYSBDKysgdGhyb3cgZnJvbSBhIGZ1dHVyZSBHTVAKKyAgIGV4Y2VwdGlvbnMgc2NoZW1lLgorCisgICBtcHpfc2V0X3VpIGV0YyBhcmUgb21pdHRlZCB0byBsZWF2ZSBvcGVuIHRoZSBsYXp5IGFsbG9jYXRpb24gc2NoZW1lCisgICBkZXNjcmliZWQgaW4gZG9jL3Rhc2tzLmh0bWwuICBtcHpfZ2V0X2QgZXRjIGFyZSBvbWl0dGVkIHRvIGxlYXZlIG9wZW4KKyAgIGV4Y2VwdGlvbnMgZm9yIGZsb2F0IG92ZXJmbG93cy4KKworICAgTm90ZSB0aGF0IF9fR01QX05PVEhST1cgbXVzdCBiZSBnaXZlbiBvbiBhbnkgaW5saW5lcyB0aGUgc2FtZSBhcyBvbiB0aGVpcgorICAgcHJvdG90eXBlcyAoZm9yIGcrKyBhdCBsZWFzdCwgd2hlcmUgdGhleSdyZSB1c2VkIHRvZ2V0aGVyKS4gIE5vdGUgYWxzbworICAgdGhhdCBnKysgMy4wIGRlbWFuZHMgdGhhdCBfX0dNUF9OT1RIUk9XIGlzIGJlZm9yZSBvdGhlciBhdHRyaWJ1dGVzIGxpa2UKKyAgIF9fR01QX0FUVFJJQlVURV9QVVJFLiAgKi8KKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNkZWZpbmUgX19HTVBfTk9USFJPVyAgbm9leGNlcHQKKyNlbHNlCisjZGVmaW5lIF9fR01QX05PVEhST1cgIHRocm93ICgpCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fR01QX05PVEhST1cKKyNlbmRpZgorCisKKy8qIFBPUlRNRTogV2hhdCBvdGhlciBjb21waWxlcnMgaGF2ZSBhIHVzZWZ1bCAiZXh0ZXJuIGlubGluZSI/ICAic3RhdGljCisgICBpbmxpbmUiIHdvdWxkIGJlIGFuIGFjY2VwdGFibGUgc3Vic3RpdHV0ZSBpZiB0aGUgY29tcGlsZXIgKG9yIGxpbmtlcikKKyAgIGRpc2NhcmRzIHVudXNlZCBzdGF0aWNzLiAgKi8KKworIC8qIGdjYyBoYXMgX19pbmxpbmVfXyBpbiBhbGwgbW9kZXMsIGluY2x1ZGluZyBzdHJpY3QgYW5zaS4gIEdpdmUgYSBwcm90b3R5cGUKKyAgICBmb3IgYW4gaW5saW5lIHRvbywgc28gYXMgdG8gY29ycmVjdGx5IHNwZWNpZnkgImRsbGltcG9ydCIgb24gd2luZG93cywgaW4KKyAgICBjYXNlIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgcmF0aGVyIHRoYW4gaW5saW5lZC4KKyAgICBHQ0MgNC4zIGFuZCBhYm92ZSB3aXRoIC1zdGQ9Yzk5IG9yIC1zdGQ9Z251OTkgaW1wbGVtZW50cyBJU08gQzk5CisgICAgaW5saW5lIHNlbWFudGljcywgdW5sZXNzIC1mZ251ODktaW5saW5lIGlzIHVzZWQuICAqLworI2lmZGVmIF9fR05VQ19fCisjaWYgKGRlZmluZWQgX19HTlVDX1NURENfSU5MSU5FX18pIHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIpIFwKKyAgfHwgKGRlZmluZWQgX19HTlVDX0dOVV9JTkxJTkVfXyAmJiBkZWZpbmVkIF9fY3BsdXNwbHVzKQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FIGV4dGVybiBfX2lubGluZV9fIF9fYXR0cmlidXRlX18gKChfX2dudV9pbmxpbmVfXykpCisjZWxzZQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICAgICAgZXh0ZXJuIF9faW5saW5lX18KKyNlbmRpZgorI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMQorI2VuZGlmCisKKy8qIERFQyBDIChlZy4gdmVyc2lvbiA1LjkpIHN1cHBvcnRzICJzdGF0aWMgX19pbmxpbmUgZm9vKCkiLCBldmVuIGluIC1zdGQxCisgICBzdHJpY3QgQU5TSSBtb2RlLiAgSW5saW5pbmcgaXMgZG9uZSBldmVuIHdoZW4gbm90IG9wdGltaXppbmcgKGllLiAtTzAKKyAgIG1vZGUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgYnV0IGFuIHVubmVjZXNzYXJ5IGxvY2FsIGNvcHkgb2YgZm9vIGlzCisgICBlbWl0dGVkIHVubGVzcyAtTyBpcyB1c2VkLiAgImV4dGVybiBfX2lubGluZSIgaXMgYWNjZXB0ZWQsIGJ1dCB0aGUKKyAgICJleHRlcm4iIGFwcGVhcnMgdG8gYmUgaWdub3JlZCwgaWUuIGl0IGJlY29tZXMgYSBwbGFpbiBnbG9iYWwgZnVuY3Rpb24KKyAgIGJ1dCB3aGljaCBpcyBpbmxpbmVkIHdpdGhpbiBpdHMgZmlsZS4gIERvbid0IGtub3cgaWYgYWxsIG9sZCB2ZXJzaW9ucyBvZgorICAgREVDIEMgc3VwcG9ydGVkIF9faW5saW5lLCBidXQgYXMgYSBzdGFydCBsZXQncyBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yCisgICBjdXJyZW50IHZlcnNpb25zLiAgKi8KKyNpZmRlZiBfX0RFQ0MKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgc3RhdGljIF9faW5saW5lCisjZW5kaWYKKworLyogU0NPIE9wZW5VTklYIDggY2Mgc3VwcG9ydHMgInN0YXRpYyBpbmxpbmUgZm9vKCkiIGJ1dCBub3QgaW4gLVhjIHN0cmljdAorICAgQU5TSSBtb2RlIChfX1NURENfXyBpcyAxIGluIHRoYXQgbW9kZSkuICBJbmxpbmluZyBvbmx5IGFjdHVhbGx5IHRha2VzCisgICBwbGFjZSB1bmRlciAtTy4gIFdpdGhvdXQgLU8gImZvbyIgc2VlbXMgdG8gYmUgZW1pdHRlZCB3aGV0aGVyIGl0J3MgdXNlZAorICAgb3Igbm90LCB3aGljaCBpcyB3YXN0ZWZ1bC4gICJleHRlcm4gaW5saW5lIGZvbygpIiBpc24ndCB1c2VmdWwsIHRoZQorICAgImV4dGVybiIgaXMgYXBwYXJlbnRseSBpZ25vcmVkLCBzbyBmb28gaXMgaW5saW5lZCBpZiBwb3NzaWJsZSBidXQgYWxzbworICAgZW1pdHRlZCBhcyBhIGdsb2JhbCwgd2hpY2ggY2F1c2VzIG11bHRpcGxlIGRlZmluaXRpb24gZXJyb3JzIHdoZW4KKyAgIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYmdtcC4gICovCisjaWZkZWYgX19TQ09fVkVSU0lPTl9fCisjaWYgX19TQ09fVkVSU0lPTl9fID4gNDAwMDAwMDAwICYmIF9fU1REQ19fICE9IDEgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1pY3Jvc29mdCdzIEMgY29tcGlsZXIgYWNjZXB0cyBfX2lubGluZSAqLworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIF9faW5saW5lCisjZW5kaWYKKworLyogUmVjZW50IGVub3VnaCBTdW4gQyBjb21waWxlcnMgd2FudCAiaW5saW5lIiAqLworI2lmIGRlZmluZWQgKF9fU1VOUFJPX0MpICYmIF9fU1VOUFJPX0MgPj0gMHg1NjAgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIGlubGluZQorI2VuZGlmCisKKy8qIFNvbWV3aGF0IG9sZGVyIFN1biBDIGNvbXBpbGVycyB3YW50ICJzdGF0aWMgaW5saW5lIiAqLworI2lmIGRlZmluZWQgKF9fU1VOUFJPX0MpICYmIF9fU1VOUFJPX0MgPj0gMHg1NDAgXAorICAmJiAhIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisKKy8qIEMrKyBhbHdheXMgaGFzICJpbmxpbmUiIGFuZCBzaW5jZSBpdCdzIGEgbm9ybWFsIGZlYXR1cmUgdGhlIGxpbmtlciBzaG91bGQKKyAgIGRpc2NhcmQgZHVwbGljYXRlIG5vbi1pbmxpbmVkIGNvcGllcywgb3IgaWYgaXQgZG9lc24ndCB0aGVuIHRoYXQncyBhCisgICBwcm9ibGVtIGZvciBldmVyeW9uZSwgbm90IGp1c3QgR01QLiAgKi8KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgJiYgISBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICBpbmxpbmUKKyNlbmRpZgorCisvKiBEb24ndCBkbyBhbnkgaW5saW5pbmcgd2l0aGluIGEgY29uZmlndXJlIHJ1biwgc2luY2UgaWYgdGhlIGNvbXBpbGVyIGVuZHMKKyAgIHVwIGVtaXR0aW5nIGNvcGllcyBvZiB0aGUgY29kZSBpbnRvIHRoZSBvYmplY3QgZmlsZSBpdCBjYW4gZW5kIHVwCisgICBkZW1hbmRpbmcgdGhlIHZhcmlvdXMgc3VwcG9ydCByb3V0aW5lcyAobGlrZSBtcG5fcG9wY291bnQpIGZvciBsaW5raW5nLAorICAgbWFraW5nIHRoZSAiYWxsb2NhIiB0ZXN0IGFuZCBwZXJoYXBzIG90aGVycyBmYWlsLiAgQW5kIG9uIGhwcGEgaWE2NCBhCisgICBwcmUtcmVsZWFzZSBnY2MgMy4yIHdhcyBzZWVuIG5vdCByZXNwZWN0aW5nIHRoZSAiZXh0ZXJuIiBpbiAiZXh0ZXJuCisgICBfX2lubGluZV9fIiwgdHJpZ2dlcmluZyB0aGlzIHByb2JsZW0gdG9vLiAgKi8KKyNpZiBkZWZpbmVkIChfX0dNUF9XSVRISU5fQ09ORklHVVJFKSAmJiAhIF9fR01QX1dJVEhJTl9DT05GSUdVUkVfSU5MSU5FCisjdW5kZWYgX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCisKKy8qIEJ5IGRlZmF1bHQsIGRvbid0IGdpdmUgYSBwcm90b3R5cGUgd2hlbiB0aGVyZSdzIGdvaW5nIHRvIGJlIGFuIGlubGluZQorICAgdmVyc2lvbi4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IENyYXkgQysrIG9iamVjdHMgdG8gdGhlIGNvbWJpbmF0aW9uIG9mCisgICBwcm90b3R5cGUgYW5kIGlubGluZS4gICovCisjaWZkZWYgX19HTVBfRVhURVJOX0lOTElORQorI2lmbmRlZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUworI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyAgMQorI2VuZGlmCisKKworI2RlZmluZSBfX0dNUF9BQlMoeCkgICAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQorI2RlZmluZSBfX0dNUF9NQVgoaCxpKSAoKGgpID4gKGkpID8gKGgpIDogKGkpKQorCisKKy8qIF9fYnVpbHRpbl9leHBlY3QgaXMgaW4gZ2NjIDMuMCwgYW5kIG5vdCBpbiAyLjk1LiAqLworI2lmIF9fR01QX0dOVUNfUFJFUkVRICgzLDApCisjZGVmaW5lIF9fR01QX0xJS0VMWShjb25kKSAgICBfX2J1aWx0aW5fZXhwZWN0ICgoY29uZCkgIT0gMCwgMSkKKyNkZWZpbmUgX19HTVBfVU5MSUtFTFkoY29uZCkgIF9fYnVpbHRpbl9leHBlY3QgKChjb25kKSAhPSAwLCAwKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfTElLRUxZKGNvbmQpICAgIChjb25kKQorI2RlZmluZSBfX0dNUF9VTkxJS0VMWShjb25kKSAgKGNvbmQpCisjZW5kaWYKKworI2lmZGVmIF9DUkFZCisjZGVmaW5lIF9fR01QX0NSQVlfUHJhZ21hKHN0cikgIF9QcmFnbWEgKHN0cikKKyNlbHNlCisjZGVmaW5lIF9fR01QX0NSQVlfUHJhZ21hKHN0cikKKyNlbmRpZgorCisKKy8qIEFsbG93IGRpcmVjdCB1c2VyIGFjY2VzcyB0byBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIGFuIG1wcV90IG9iamVjdC4gICovCisjZGVmaW5lIG1wcV9udW1yZWYoUSkgKCYoKFEpLT5fbXBfbnVtKSkKKyNkZWZpbmUgbXBxX2RlbnJlZihRKSAoJigoUSktPl9tcF9kZW4pKQorCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgewordXNpbmcgc3RkOjpGSUxFOworI2VuZGlmCisKKyNkZWZpbmUgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgX19nbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgKHZvaWQgKigqKSAoc2l6ZV90KSwKKwkJCQkgICAgICB2b2lkICooKikgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQkJCSAgICAgIHZvaWQgKCopICh2b2lkICosIHNpemVfdCkpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgX19nbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgKHZvaWQgKigqKikgKHNpemVfdCksCisJCQkJICAgICAgdm9pZCAqKCoqKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisJCQkJICAgICAgdm9pZCAoKiopICh2b2lkICosIHNpemVfdCkpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBfYml0c19wZXJfbGltYiBfX2dtcF9iaXRzX3Blcl9saW1iCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY29uc3QgaW50IG1wX2JpdHNfcGVyX2xpbWI7CisKKyNkZWZpbmUgZ21wX2Vycm5vIF9fZ21wX2Vycm5vCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gaW50IGdtcF9lcnJubzsKKworI2RlZmluZSBnbXBfdmVyc2lvbiBfX2dtcF92ZXJzaW9uCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGdtcF92ZXJzaW9uOworCisKKy8qKioqKioqKioqKioqKioqIFJhbmRvbSBudW1iZXIgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBnbXBfcmFuZGluaXQgX19nbXBfcmFuZGluaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRpbml0IChnbXBfcmFuZHN0YXRlX3B0ciwgZ21wX3JhbmRhbGdfdCwgLi4uKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfZGVmYXVsdCBfX2dtcF9yYW5kaW5pdF9kZWZhdWx0CitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdF9kZWZhdWx0IChnbXBfcmFuZHN0YXRlX3B0cik7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X2xjXzJleHAgX19nbXBfcmFuZGluaXRfbGNfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfbGNfMmV4cCAoZ21wX3JhbmRzdGF0ZV9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSBfX2dtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIChnbXBfcmFuZHN0YXRlX3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIGdtcF9yYW5kaW5pdF9tdCBfX2dtcF9yYW5kaW5pdF9tdAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfbXQgKGdtcF9yYW5kc3RhdGVfcHRyKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfc2V0IF9fZ21wX3JhbmRpbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfc2V0IChnbXBfcmFuZHN0YXRlX3B0ciwgZ21wX3JhbmRzdGF0ZV9zcmNwdHIpOworCisjZGVmaW5lIGdtcF9yYW5kc2VlZCBfX2dtcF9yYW5kc2VlZAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZHNlZWQgKGdtcF9yYW5kc3RhdGVfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBnbXBfcmFuZHNlZWRfdWkgX19nbXBfcmFuZHNlZWRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRzZWVkX3VpIChnbXBfcmFuZHN0YXRlX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIGdtcF9yYW5kY2xlYXIgX19nbXBfcmFuZGNsZWFyCitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kY2xlYXIgKGdtcF9yYW5kc3RhdGVfcHRyKTsKKworI2RlZmluZSBnbXBfdXJhbmRvbWJfdWkgX19nbXBfdXJhbmRvbWJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgZ21wX3VyYW5kb21iX3VpIChnbXBfcmFuZHN0YXRlX3B0ciwgdW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgZ21wX3VyYW5kb21tX3VpIF9fZ21wX3VyYW5kb21tX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGdtcF91cmFuZG9tbV91aSAoZ21wX3JhbmRzdGF0ZV9wdHIsIHVuc2lnbmVkIGxvbmcpOworCisKKy8qKioqKioqKioqKioqKioqIEZvcm1hdHRlZCBvdXRwdXQgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGdtcF9hc3ByaW50ZiBfX2dtcF9hc3ByaW50ZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9hc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisjZGVmaW5lIGdtcF9mcHJpbnRmIF9fZ21wX2ZwcmludGYKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX2ZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX29ic3RhY2tfcHJpbnRmIF9fZ21wX29ic3RhY2tfcHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfT0JTVEFDSykKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfb2JzdGFja19wcmludGYgKHN0cnVjdCBvYnN0YWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9vYnN0YWNrX3ZwcmludGYgX19nbXBfb2JzdGFja192cHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfT0JTVEFDSykgJiYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfb2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ByaW50ZiBfX2dtcF9wcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfcHJpbnRmIChjb25zdCBjaGFyICosIC4uLik7CisKKyNkZWZpbmUgZ21wX3NucHJpbnRmIF9fZ21wX3NucHJpbnRmCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworCisjZGVmaW5lIGdtcF9zcHJpbnRmIF9fZ21wX3NwcmludGYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfc3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CisKKyNkZWZpbmUgZ21wX3Zhc3ByaW50ZiBfX2dtcF92YXNwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92YXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdmZwcmludGYgX19nbXBfdmZwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9GSUxFKSAmJiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZwcmludGYgX19nbXBfdnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZwcmludGYgKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNucHJpbnRmIF9fZ21wX3ZzbnByaW50ZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNwcmludGYgX19nbXBfdnNwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92c3ByaW50ZiAoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogRm9ybWF0dGVkIGlucHV0IHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBnbXBfZnNjYW5mIF9fZ21wX2ZzY2FuZgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfZnNjYW5mIChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9zY2FuZiBfX2dtcF9zY2FuZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9zY2FuZiAoY29uc3QgY2hhciAqLCAuLi4pOworCisjZGVmaW5lIGdtcF9zc2NhbmYgX19nbXBfc3NjYW5mCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NzY2FuZiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CisKKyNkZWZpbmUgZ21wX3Zmc2NhbmYgX19nbXBfdmZzY2FuZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX0ZJTEUpICYmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3Zmc2NhbmYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF92c2NhbmYgX19nbXBfdnNjYW5mCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnNjYW5mIChjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3Zzc2NhbmYgX19nbXBfdnNzY2FuZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3Zzc2NhbmYgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIEludGVnZXIgKGkuZS4gWikgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9tcHpfcmVhbGxvYyBfX2dtcHpfcmVhbGxvYworI2RlZmluZSBtcHpfcmVhbGxvYyBfX2dtcHpfcmVhbGxvYworX19HTVBfREVDTFNQRUMgdm9pZCAqX21wel9yZWFsbG9jIChtcHpfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wel9hYnMgX19nbXB6X2FicworI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9hYnMpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hYnMgKG1wel9wdHIsIG1wel9zcmNwdHIpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2FkZCBfX2dtcHpfYWRkCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGQgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9hZGRfdWkgX19nbXB6X2FkZF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2FkZG11bCBfX2dtcHpfYWRkbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGRtdWwgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9hZGRtdWxfdWkgX19nbXB6X2FkZG11bF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkbXVsX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2FuZCBfX2dtcHpfYW5kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hbmQgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9hcnJheV9pbml0IF9fZ21wel9hcnJheV9pbml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hcnJheV9pbml0IChtcHpfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXB6X2Jpbl91aSBfX2dtcHpfYmluX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9iaW5fdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfYmluX3VpdWkgX19nbXB6X2Jpbl91aXVpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9iaW5fdWl1aSAobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfY2Rpdl9xIF9fZ21wel9jZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2NkaXZfcV8yZXhwIF9fZ21wel9jZGl2X3FfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xXzJleHAgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHpfY2Rpdl9xX3VpIF9fZ21wel9jZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3FfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfY2Rpdl9xciBfX2dtcHpfY2Rpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xciAobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2NkaXZfcXJfdWkgX19nbXB6X2NkaXZfcXJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3FyX3VpIChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2NkaXZfciBfX2dtcHpfY2Rpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jZGl2X3IgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9jZGl2X3JfMmV4cCBfX2dtcHpfY2Rpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcl8yZXhwIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcl91aSBfX2dtcHpfY2Rpdl9yX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfY2Rpdl9yX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2NkaXZfdWkgX19nbXB6X2NkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3VpIChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NsZWFyIF9fZ21wel9jbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2xlYXIgKG1wel9wdHIpOworCisjZGVmaW5lIG1wel9jbGVhcnMgX19nbXB6X2NsZWFycworX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2xlYXJzIChtcHpfcHRyLCAuLi4pOworCisjZGVmaW5lIG1wel9jbHJiaXQgX19nbXB6X2NscmJpdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2xyYml0IChtcHpfcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X2NtcCBfX2dtcHpfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcCAobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY21wX2QgX19nbXB6X2NtcF9kCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcF9kIChtcHpfc3JjcHRyLCBkb3VibGUpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHpfY21wX3NpIF9fZ21wel9jbXBfc2kKK19fR01QX0RFQ0xTUEVDIGludCBfbXB6X2NtcF9zaSAobXB6X3NyY3B0ciwgc2lnbmVkIGxvbmcgaW50KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHpfY21wX3VpIF9fZ21wel9jbXBfdWkKK19fR01QX0RFQ0xTUEVDIGludCBfbXB6X2NtcF91aSAobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NtcGFicyBfX2dtcHpfY21wYWJzCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcGFicyAobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY21wYWJzX2QgX19nbXB6X2NtcGFic19kCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcGFic19kIChtcHpfc3JjcHRyLCBkb3VibGUpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBhYnNfdWkgX19nbXB6X2NtcGFic191aQorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnNfdWkgKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jb20gX19nbXB6X2NvbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY29tIChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfY29tYml0IF9fZ21wel9jb21iaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NvbWJpdCAobXB6X3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfcCBfX2dtcHpfY29uZ3J1ZW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3AgKG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfMmV4cF9wIF9fZ21wel9jb25ncnVlbnRfMmV4cF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NvbmdydWVudF8yZXhwX3AgKG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfdWlfcCBfX2dtcHpfY29uZ3J1ZW50X3VpX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3VpX3AgKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9kaXZleGFjdCBfX2dtcHpfZGl2ZXhhY3QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2RpdmV4YWN0IChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfZGl2ZXhhY3RfdWkgX19nbXB6X2RpdmV4YWN0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9kaXZleGFjdF91aSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV9wIF9fZ21wel9kaXZpc2libGVfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfcCAobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV91aV9wIF9fZ21wel9kaXZpc2libGVfdWlfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfdWlfcCAobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV8yZXhwX3AgX19nbXB6X2RpdmlzaWJsZV8yZXhwX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZGl2aXNpYmxlXzJleHBfcCAobXB6X3NyY3B0ciwgbXBfYml0Y250X3QpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2R1bXAgX19nbXB6X2R1bXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2R1bXAgKG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9leHBvcnQgX19nbXB6X2V4cG9ydAorX19HTVBfREVDTFNQRUMgdm9pZCAqbXB6X2V4cG9ydCAodm9pZCAqLCBzaXplX3QgKiwgaW50LCBzaXplX3QsIGludCwgc2l6ZV90LCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfZmFjX3VpIF9fZ21wel9mYWNfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZhY191aSAobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel8yZmFjX3VpIF9fZ21wel8yZmFjX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel8yZmFjX3VpIChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X21mYWNfdWl1aSBfX2dtcHpfbWZhY191aXVpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tZmFjX3VpdWkgKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3ByaW1vcmlhbF91aSBfX2dtcHpfcHJpbW9yaWFsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wcmltb3JpYWxfdWkgKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfZmRpdl9xIF9fZ21wel9mZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcV8yZXhwIF9fZ21wel9mZGl2X3FfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9xXzJleHAgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHpfZmRpdl9xX3VpIF9fZ21wel9mZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfZmRpdl9xciBfX2dtcHpfZmRpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9xciAobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcXJfdWkgX19nbXB6X2ZkaXZfcXJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FyX3VpIChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfciBfX2dtcHpfZmRpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3IgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9mZGl2X3JfMmV4cCBfX2dtcHpfZmRpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcl8yZXhwIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcl91aSBfX2dtcHpfZmRpdl9yX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl9yX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfdWkgX19nbXB6X2ZkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3VpIChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpYl91aSBfX2dtcHpfZmliX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9maWJfdWkgKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfZmliMl91aSBfX2dtcHpfZmliMl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmliMl91aSAobXB6X3B0ciwgbXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel9maXRzX3NpbnRfcCBfX2dtcHpfZml0c19zaW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c19zaW50X3AgKG1wel9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpdHNfc2xvbmdfcCBfX2dtcHpfZml0c19zbG9uZ19wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfc2xvbmdfcCAobXB6X3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZml0c19zc2hvcnRfcCBfX2dtcHpfZml0c19zc2hvcnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3NzaG9ydF9wIChtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9maXRzX3VpbnRfcCBfX2dtcHpfZml0c191aW50X3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191aW50X3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfdWludF9wIChtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2ZpdHNfdWxvbmdfcCBfX2dtcHpfZml0c191bG9uZ19wCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWxvbmdfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c191bG9uZ19wIChtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2ZpdHNfdXNob3J0X3AgX19nbXB6X2ZpdHNfdXNob3J0X3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191c2hvcnRfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c191c2hvcnRfcCAobXB6X3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9nY2QgX19nbXB6X2djZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZ2NkIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfZ2NkX3VpIF9fZ21wel9nY2RfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9nY2RfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfZ2NkZXh0IF9fZ21wel9nY2RleHQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2djZGV4dCAobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2dldF9kIF9fZ21wel9nZXRfZAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wel9nZXRfZCAobXB6X3NyY3B0cikgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2dldF9kXzJleHAgX19nbXB6X2dldF9kXzJleHAKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcHpfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICosIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9nZXRfc2kgX19nbXB6X2dldF9zaQorX19HTVBfREVDTFNQRUMgLyogc2lnbmVkICovIGxvbmcgaW50IG1wel9nZXRfc2kgKG1wel9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2dldF9zdHIgX19nbXB6X2dldF9zdHIKK19fR01QX0RFQ0xTUEVDIGNoYXIgKm1wel9nZXRfc3RyIChjaGFyICosIGludCwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X2dldF91aSBfX2dtcHpfZ2V0X3VpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldF91aSkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9nZXRfdWkgKG1wel9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfZ2V0bGltYm4gX19nbXB6X2dldGxpbWJuCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wel9nZXRsaW1ibiAobXB6X3NyY3B0ciwgbXBfc2l6ZV90KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2hhbWRpc3QgX19nbXB6X2hhbWRpc3QKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wel9oYW1kaXN0IChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9pbXBvcnQgX19nbXB6X2ltcG9ydAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW1wb3J0IChtcHpfcHRyLCBzaXplX3QsIGludCwgc2l6ZV90LCBpbnQsIHNpemVfdCwgY29uc3Qgdm9pZCAqKTsKKworI2RlZmluZSBtcHpfaW5pdCBfX2dtcHpfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdCAobXB6X3B0cikgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcHpfaW5pdDIgX19nbXB6X2luaXQyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0MiAobXB6X3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIG1wel9pbml0cyBfX2dtcHpfaW5pdHMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRzIChtcHpfcHRyLCAuLi4pIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0IF9fZ21wel9pbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdF9zZXQgKG1wel9wdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9kIF9fZ21wel9pbml0X3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldF9kIChtcHpfcHRyLCBkb3VibGUpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9zaSBfX2dtcHpfaW5pdF9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRfc2V0X3NpIChtcHpfcHRyLCBzaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9zdHIgX19nbXB6X2luaXRfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wel9pbml0X3NldF9zdHIgKG1wel9wdHIsIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXRfdWkgX19nbXB6X2luaXRfc2V0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldF91aSAobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel9pbnBfcmF3IF9fZ21wel9pbnBfcmF3CisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9pbnBfcmF3IChtcHpfcHRyLCBGSUxFICopOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2lucF9zdHIgX19nbXB6X2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X2lucF9zdHIgKG1wel9wdHIsIEZJTEUgKiwgaW50KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9pbnZlcnQgX19nbXB6X2ludmVydAorX19HTVBfREVDTFNQRUMgaW50IG1wel9pbnZlcnQgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9pb3IgX19nbXB6X2lvcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW9yIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfamFjb2JpIF9fZ21wel9qYWNvYmkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfamFjb2JpIChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfa3JvbmVja2VyIG1wel9qYWNvYmkgIC8qIGFsaWFzICovCisKKyNkZWZpbmUgbXB6X2tyb25lY2tlcl9zaSBfX2dtcHpfa3JvbmVja2VyX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2tyb25lY2tlcl9zaSAobXB6X3NyY3B0ciwgbG9uZykgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2tyb25lY2tlcl91aSBfX2dtcHpfa3JvbmVja2VyX3VpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2tyb25lY2tlcl91aSAobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NpX2tyb25lY2tlciBfX2dtcHpfc2lfa3JvbmVja2VyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3NpX2tyb25lY2tlciAobG9uZywgbXB6X3NyY3B0cikgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3VpX2tyb25lY2tlciBfX2dtcHpfdWlfa3JvbmVja2VyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3VpX2tyb25lY2tlciAodW5zaWduZWQgbG9uZywgbXB6X3NyY3B0cikgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2xjbSBfX2dtcHpfbGNtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sY20gKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9sY21fdWkgX19nbXB6X2xjbV91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbGNtX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBtcHpfbGVnZW5kcmUgbXB6X2phY29iaSAgLyogYWxpYXMgKi8KKworI2RlZmluZSBtcHpfbHVjbnVtX3VpIF9fZ21wel9sdWNudW1fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2x1Y251bV91aSAobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel9sdWNudW0yX3VpIF9fZ21wel9sdWNudW0yX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sdWNudW0yX3VpIChtcHpfcHRyLCBtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X21pbGxlcnJhYmluIF9fZ21wel9taWxsZXJyYWJpbgorX19HTVBfREVDTFNQRUMgaW50IG1wel9taWxsZXJyYWJpbiAobXB6X3NyY3B0ciwgaW50KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfbW9kIF9fZ21wel9tb2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X21vZCAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X21vZF91aSBtcHpfZmRpdl9yX3VpIC8qIHNhbWUgYXMgZmRpdl9yIGJlY2F1c2UgZGl2aXNvciB1bnNpZ25lZCAqLworCisjZGVmaW5lIG1wel9tdWwgX19nbXB6X211bAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfbXVsXzJleHAgX19nbXB6X211bF8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWxfMmV4cCAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIG1wel9tdWxfc2kgX19nbXB6X211bF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsX3NpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X211bF91aSBfX2dtcHpfbXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWxfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfbmVnIF9fZ21wel9uZWcKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfbmVnKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbmVnIChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9uZXh0cHJpbWUgX19nbXB6X25leHRwcmltZQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbmV4dHByaW1lIChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfcHJldnByaW1lIF9fZ21wel9wcmV2cHJpbWUKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfcHJldnByaW1lIChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfb3V0X3JhdyBfX2dtcHpfb3V0X3JhdworI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfb3V0X3JhdyAoRklMRSAqLCBtcHpfc3JjcHRyKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9vdXRfc3RyIF9fZ21wel9vdXRfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9vdXRfc3RyIChGSUxFICosIGludCwgbXB6X3NyY3B0cik7CisjZW5kaWYKKworI2RlZmluZSBtcHpfcGVyZmVjdF9wb3dlcl9wIF9fZ21wel9wZXJmZWN0X3Bvd2VyX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfcGVyZmVjdF9wb3dlcl9wIChtcHpfc3JjcHRyKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfcGVyZmVjdF9zcXVhcmVfcCBfX2dtcHpfcGVyZmVjdF9zcXVhcmVfcAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wel9wZXJmZWN0X3NxdWFyZV9wIChtcHpfc3JjcHRyKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9wb3Bjb3VudCBfX2dtcHpfcG9wY291bnQKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcG9wY291bnQpCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfcG9wY291bnQgKG1wel9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfcG93X3VpIF9fZ21wel9wb3dfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Bvd191aSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wel9wb3dtIF9fZ21wel9wb3dtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dtIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfcG93bV9zZWMgX19nbXB6X3Bvd21fc2VjCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dtX3NlYyAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X3Bvd21fdWkgX19nbXB6X3Bvd21fdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Bvd21fdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfcHJvYmFiX3ByaW1lX3AgX19nbXB6X3Byb2JhYl9wcmltZV9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3Byb2JhYl9wcmltZV9wIChtcHpfc3JjcHRyLCBpbnQpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9yYW5kb20gX19nbXB6X3JhbmRvbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcmFuZG9tIChtcHpfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wel9yYW5kb20yIF9fZ21wel9yYW5kb20yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9yYW5kb20yIChtcHpfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wel9yZWFsbG9jMiBfX2dtcHpfcmVhbGxvYzIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3JlYWxsb2MyIChtcHpfcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X3JlbW92ZSBfX2dtcHpfcmVtb3ZlCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfcmVtb3ZlIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfcm9vdCBfX2dtcHpfcm9vdAorX19HTVBfREVDTFNQRUMgaW50IG1wel9yb290IChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3Jvb3RyZW0gX19nbXB6X3Jvb3RyZW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3Jvb3RyZW0gKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfcnJhbmRvbWIgX19nbXB6X3JyYW5kb21iCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9ycmFuZG9tYiAobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV9wdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHpfc2NhbjAgX19nbXB6X3NjYW4wCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcHpfc2NhbjAgKG1wel9zcmNwdHIsIG1wX2JpdGNudF90KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zY2FuMSBfX2dtcHpfc2NhbjEKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wel9zY2FuMSAobXB6X3NyY3B0ciwgbXBfYml0Y250X3QpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NldCBfX2dtcHpfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXQgKG1wel9wdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9zZXRfZCBfX2dtcHpfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9kIChtcHpfcHRyLCBkb3VibGUpOworCisjZGVmaW5lIG1wel9zZXRfZiBfX2dtcHpfc2V0X2YKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9mIChtcHpfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfc2V0X3EgX19nbXB6X3NldF9xCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NldF9xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X3EgKG1wel9wdHIsIG1wcV9zcmNwdHIpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3NldF9zaSBfX2dtcHpfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRfc2kgKG1wel9wdHIsIHNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3NldF9zdHIgX19nbXB6X3NldF9zdHIKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfc2V0X3N0ciAobXB6X3B0ciwgY29uc3QgY2hhciAqLCBpbnQpOworCisjZGVmaW5lIG1wel9zZXRfdWkgX19nbXB6X3NldF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X3VpIChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3NldGJpdCBfX2dtcHpfc2V0Yml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRiaXQgKG1wel9wdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHpfc2l6ZSBfX2dtcHpfc2l6ZQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zaXplKQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9zaXplIChtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3NpemVpbmJhc2UgX19nbXB6X3NpemVpbmJhc2UKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfc2l6ZWluYmFzZSAobXB6X3NyY3B0ciwgaW50KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zcXJ0IF9fZ21wel9zcXJ0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zcXJ0IChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfc3FydHJlbSBfX2dtcHpfc3FydHJlbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3FydHJlbSAobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X3N1YiBfX2dtcHpfc3ViCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWIgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9zdWJfdWkgX19nbXB6X3N1Yl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3ViX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3VpX3N1YiBfX2dtcHpfdWlfc3ViCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91aV9zdWIgKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfc3VibXVsIF9fZ21wel9zdWJtdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3N1Ym11bCAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X3N1Ym11bF91aSBfX2dtcHpfc3VibXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJtdWxfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfc3dhcCBfX2dtcHpfc3dhcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3dhcCAobXB6X3B0ciwgbXB6X3B0cikgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcHpfdGRpdl91aSBfX2dtcHpfdGRpdl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfdWkgKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfdGRpdl9xIF9fZ21wel90ZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X3RkaXZfcV8yZXhwIF9fZ21wel90ZGl2X3FfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9xXzJleHAgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHpfdGRpdl9xX3VpIF9fZ21wel90ZGl2X3FfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3FfdWkgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHpfdGRpdl9xciBfX2dtcHpfdGRpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9xciAobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXB6X3RkaXZfcXJfdWkgX19nbXB6X3RkaXZfcXJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3FyX3VpIChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3RkaXZfciBfX2dtcHpfdGRpdl9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel90ZGl2X3IgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel90ZGl2X3JfMmV4cCBfX2dtcHpfdGRpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcl8yZXhwIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X3RkaXZfcl91aSBfX2dtcHpfdGRpdl9yX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9yX3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3RzdGJpdCBfX2dtcHpfdHN0Yml0CitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3RzdGJpdCAobXB6X3NyY3B0ciwgbXBfYml0Y250X3QpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3VpX3Bvd191aSBfX2dtcHpfdWlfcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91aV9wb3dfdWkgKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXB6X3VyYW5kb21iIF9fZ21wel91cmFuZG9tYgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdXJhbmRvbWIgKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXB6X3VyYW5kb21tIF9fZ21wel91cmFuZG9tbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdXJhbmRvbW0gKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfeG9yIF9fZ21wel94b3IKKyNkZWZpbmUgbXB6X2VvciBfX2dtcHpfeG9yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel94b3IgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9saW1ic19yZWFkIF9fZ21wel9saW1ic19yZWFkCitfX0dNUF9ERUNMU1BFQyBtcF9zcmNwdHIgbXB6X2xpbWJzX3JlYWQgKG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wel9saW1ic193cml0ZSBfX2dtcHpfbGltYnNfd3JpdGUKK19fR01QX0RFQ0xTUEVDIG1wX3B0ciBtcHpfbGltYnNfd3JpdGUgKG1wel9wdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXB6X2xpbWJzX21vZGlmeSBfX2dtcHpfbGltYnNfbW9kaWZ5CitfX0dNUF9ERUNMU1BFQyBtcF9wdHIgbXB6X2xpbWJzX21vZGlmeSAobXB6X3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcHpfbGltYnNfZmluaXNoIF9fZ21wel9saW1ic19maW5pc2gKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2xpbWJzX2ZpbmlzaCAobXB6X3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcHpfcm9pbml0X24gX19nbXB6X3JvaW5pdF9uCitfX0dNUF9ERUNMU1BFQyBtcHpfc3JjcHRyIG1wel9yb2luaXRfbiAobXB6X3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIE1QWl9ST0lOSVRfTih4cCwgeHMpIHt7MCwgKHhzKSwoeHApIH19CisKKy8qKioqKioqKioqKioqKioqIFJhdGlvbmFsIChpLmUuIFEpIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBtcHFfYWJzIF9fZ21wcV9hYnMKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfYWJzKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfYWJzIChtcHFfcHRyLCBtcHFfc3JjcHRyKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9hZGQgX19nbXBxX2FkZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfYWRkIChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfY2Fub25pY2FsaXplIF9fZ21wcV9jYW5vbmljYWxpemUKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2Nhbm9uaWNhbGl6ZSAobXBxX3B0cik7CisKKyNkZWZpbmUgbXBxX2NsZWFyIF9fZ21wcV9jbGVhcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2xlYXIgKG1wcV9wdHIpOworCisjZGVmaW5lIG1wcV9jbGVhcnMgX19nbXBxX2NsZWFycworX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2xlYXJzIChtcHFfcHRyLCAuLi4pOworCisjZGVmaW5lIG1wcV9jbXAgX19nbXBxX2NtcAorX19HTVBfREVDTFNQRUMgaW50IG1wcV9jbXAgKG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHFfY21wX3NpIF9fZ21wcV9jbXBfc2kKK19fR01QX0RFQ0xTUEVDIGludCBfbXBxX2NtcF9zaSAobXBxX3NyY3B0ciwgbG9uZywgdW5zaWduZWQgbG9uZykgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgX21wcV9jbXBfdWkgX19nbXBxX2NtcF91aQorX19HTVBfREVDTFNQRUMgaW50IF9tcHFfY21wX3VpIChtcHFfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9jbXBfeiBfX2dtcHFfY21wX3oKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfY21wX3ogKG1wcV9zcmNwdHIsIG1wel9zcmNwdHIpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9kaXYgX19nbXBxX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZGl2IChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfZGl2XzJleHAgX19nbXBxX2Rpdl8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9kaXZfMmV4cCAobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIG1wcV9lcXVhbCBfX2dtcHFfZXF1YWwKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfZXF1YWwgKG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBxX2dldF9udW0gX19nbXBxX2dldF9udW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2dldF9udW0gKG1wel9wdHIsIG1wcV9zcmNwdHIpOworCisjZGVmaW5lIG1wcV9nZXRfZGVuIF9fZ21wcV9nZXRfZGVuCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9nZXRfZGVuIChtcHpfcHRyLCBtcHFfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfZ2V0X2QgX19nbXBxX2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBxX2dldF9kIChtcHFfc3JjcHRyKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHFfZ2V0X3N0ciBfX2dtcHFfZ2V0X3N0cgorX19HTVBfREVDTFNQRUMgY2hhciAqbXBxX2dldF9zdHIgKGNoYXIgKiwgaW50LCBtcHFfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfaW5pdCBfX2dtcHFfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW5pdCAobXBxX3B0cik7CisKKyNkZWZpbmUgbXBxX2luaXRzIF9fZ21wcV9pbml0cworX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW5pdHMgKG1wcV9wdHIsIC4uLik7CisKKyNkZWZpbmUgbXBxX2lucF9zdHIgX19nbXBxX2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBxX2lucF9zdHIgKG1wcV9wdHIsIEZJTEUgKiwgaW50KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9pbnYgX19nbXBxX2ludgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfaW52IChtcHFfcHRyLCBtcHFfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfbXVsIF9fZ21wcV9tdWwKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX211bCAobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cik7CisKKyNkZWZpbmUgbXBxX211bF8yZXhwIF9fZ21wcV9tdWxfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfbXVsXzJleHAgKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcHFfbmVnIF9fZ21wcV9uZWcKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfbmVnKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfbmVnIChtcHFfcHRyLCBtcHFfc3JjcHRyKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9vdXRfc3RyIF9fZ21wcV9vdXRfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wcV9vdXRfc3RyIChGSUxFICosIGludCwgbXBxX3NyY3B0cik7CisjZW5kaWYKKworI2RlZmluZSBtcHFfc2V0IF9fZ21wcV9zZXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldCAobXBxX3B0ciwgbXBxX3NyY3B0cik7CisKKyNkZWZpbmUgbXBxX3NldF9kIF9fZ21wcV9zZXRfZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X2QgKG1wcV9wdHIsIGRvdWJsZSk7CisKKyNkZWZpbmUgbXBxX3NldF9kZW4gX19nbXBxX3NldF9kZW4KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9kZW4gKG1wcV9wdHIsIG1wel9zcmNwdHIpOworCisjZGVmaW5lIG1wcV9zZXRfZiBfX2dtcHFfc2V0X2YKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9mIChtcHFfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcHFfc2V0X251bSBfX2dtcHFfc2V0X251bQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X251bSAobXBxX3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXBxX3NldF9zaSBfX2dtcHFfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfc2kgKG1wcV9wdHIsIHNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wcV9zZXRfc3RyIF9fZ21wcV9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBxX3NldF9zdHIgKG1wcV9wdHIsIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBtcHFfc2V0X3VpIF9fZ21wcV9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF91aSAobXBxX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcHFfc2V0X3ogX19nbXBxX3NldF96CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfeiAobXBxX3B0ciwgbXB6X3NyY3B0cik7CisKKyNkZWZpbmUgbXBxX3N1YiBfX2dtcHFfc3ViCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zdWIgKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpOworCisjZGVmaW5lIG1wcV9zd2FwIF9fZ21wcV9zd2FwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zd2FwIChtcHFfcHRyLCBtcHFfcHRyKSBfX0dNUF9OT1RIUk9XOworCisKKy8qKioqKioqKioqKioqKioqIEZsb2F0IChpLmUuIEYpIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBtcGZfYWJzIF9fZ21wZl9hYnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FicyAobXBmX3B0ciwgbXBmX3NyY3B0cik7CisKKyNkZWZpbmUgbXBmX2FkZCBfX2dtcGZfYWRkCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9hZGQgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9hZGRfdWkgX19nbXBmX2FkZF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfYWRkX3VpIChtcGZfcHRyLCBtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisjZGVmaW5lIG1wZl9jZWlsIF9fZ21wZl9jZWlsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jZWlsIChtcGZfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfY2xlYXIgX19nbXBmX2NsZWFyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jbGVhciAobXBmX3B0cik7CisKKyNkZWZpbmUgbXBmX2NsZWFycyBfX2dtcGZfY2xlYXJzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jbGVhcnMgKG1wZl9wdHIsIC4uLik7CisKKyNkZWZpbmUgbXBmX2NtcCBfX2dtcGZfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcCAobXBmX3NyY3B0ciwgbXBmX3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfY21wX3ogX19nbXBmX2NtcF96CitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcF96IChtcGZfc3JjcHRyLCBtcHpfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9jbXBfZCBfX2dtcGZfY21wX2QKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfY21wX2QgKG1wZl9zcmNwdHIsIGRvdWJsZSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2NtcF9zaSBfX2dtcGZfY21wX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcF9zaSAobXBmX3NyY3B0ciwgc2lnbmVkIGxvbmcgaW50KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9jbXBfdWkgX19nbXBmX2NtcF91aQorX19HTVBfREVDTFNQRUMgaW50IG1wZl9jbXBfdWkgKG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9kaXYgX19nbXBmX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZGl2IChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfZGl2XzJleHAgX19nbXBmX2Rpdl8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9kaXZfMmV4cCAobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBfYml0Y250X3QpOworCisjZGVmaW5lIG1wZl9kaXZfdWkgX19nbXBmX2Rpdl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfZGl2X3VpIChtcGZfcHRyLCBtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXBmX2R1bXAgX19nbXBmX2R1bXAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2R1bXAgKG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9lcSBfX2dtcGZfZXEKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZXEgKG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIsIG1wX2JpdGNudF90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c19zaW50X3AgX19nbXBmX2ZpdHNfc2ludF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfc2ludF9wIChtcGZfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3Nsb25nX3AgX19nbXBmX2ZpdHNfc2xvbmdfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3Nsb25nX3AgKG1wZl9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfc3Nob3J0X3AgX19nbXBmX2ZpdHNfc3Nob3J0X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c19zc2hvcnRfcCAobXBmX3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c191aW50X3AgX19nbXBmX2ZpdHNfdWludF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2ZpdHNfdWludF9wIChtcGZfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3Vsb25nX3AgX19nbXBmX2ZpdHNfdWxvbmdfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9maXRzX3Vsb25nX3AgKG1wZl9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfdXNob3J0X3AgX19nbXBmX2ZpdHNfdXNob3J0X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c191c2hvcnRfcCAobXBmX3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZmxvb3IgX19nbXBmX2Zsb29yCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9mbG9vciAobXBmX3B0ciwgbXBmX3NyY3B0cik7CisKKyNkZWZpbmUgbXBmX2dldF9kIF9fZ21wZl9nZXRfZAorX19HTVBfREVDTFNQRUMgZG91YmxlIG1wZl9nZXRfZCAobXBmX3NyY3B0cikgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9kXzJleHAgX19nbXBmX2dldF9kXzJleHAKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcGZfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICosIG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9nZXRfZGVmYXVsdF9wcmVjIF9fZ21wZl9nZXRfZGVmYXVsdF9wcmVjCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcGZfZ2V0X2RlZmF1bHRfcHJlYyAodm9pZCkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZ2V0X3ByZWMgX19nbXBmX2dldF9wcmVjCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcGZfZ2V0X3ByZWMgKG1wZl9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9zaSBfX2dtcGZfZ2V0X3NpCitfX0dNUF9ERUNMU1BFQyBsb25nIG1wZl9nZXRfc2kgKG1wZl9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9zdHIgX19nbXBmX2dldF9zdHIKK19fR01QX0RFQ0xTUEVDIGNoYXIgKm1wZl9nZXRfc3RyIChjaGFyICosIG1wX2V4cF90ICosIGludCwgc2l6ZV90LCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfZ2V0X3VpIF9fZ21wZl9nZXRfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgbXBmX2dldF91aSAobXBmX3NyY3B0cikgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfaW5pdCBfX2dtcGZfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdCAobXBmX3B0cik7CisKKyNkZWZpbmUgbXBmX2luaXQyIF9fZ21wZl9pbml0MgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdDIgKG1wZl9wdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcGZfaW5pdHMgX19nbXBmX2luaXRzCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0cyAobXBmX3B0ciwgLi4uKTsKKworI2RlZmluZSBtcGZfaW5pdF9zZXQgX19nbXBmX2luaXRfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0X3NldCAobXBmX3B0ciwgbXBmX3NyY3B0cik7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X2QgX19nbXBmX2luaXRfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X2QgKG1wZl9wdHIsIGRvdWJsZSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3NpIF9fZ21wZl9pbml0X3NldF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdF9zZXRfc2kgKG1wZl9wdHIsIHNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3N0ciBfX2dtcGZfaW5pdF9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2luaXRfc2V0X3N0ciAobXBmX3B0ciwgY29uc3QgY2hhciAqLCBpbnQpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF91aSBfX2dtcGZfaW5pdF9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X3VpIChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKKyNkZWZpbmUgbXBmX2lucF9zdHIgX19nbXBmX2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBmX2lucF9zdHIgKG1wZl9wdHIsIEZJTEUgKiwgaW50KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wZl9pbnRlZ2VyX3AgX19nbXBmX2ludGVnZXJfcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9pbnRlZ2VyX3AgKG1wZl9zcmNwdHIpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX211bCBfX2dtcGZfbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9tdWwgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9tdWxfMmV4cCBfX2dtcGZfbXVsXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX211bF8yZXhwIChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcF9iaXRjbnRfdCk7CisKKyNkZWZpbmUgbXBmX211bF91aSBfX2dtcGZfbXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9tdWxfdWkgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcGZfbmVnIF9fZ21wZl9uZWcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX25lZyAobXBmX3B0ciwgbXBmX3NyY3B0cik7CisKKyNkZWZpbmUgbXBmX291dF9zdHIgX19nbXBmX291dF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBmX291dF9zdHIgKEZJTEUgKiwgaW50LCBzaXplX3QsIG1wZl9zcmNwdHIpOworI2VuZGlmCisKKyNkZWZpbmUgbXBmX3Bvd191aSBfX2dtcGZfcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9wb3dfdWkgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKworI2RlZmluZSBtcGZfcmFuZG9tMiBfX2dtcGZfcmFuZG9tMgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcmFuZG9tMiAobXBmX3B0ciwgbXBfc2l6ZV90LCBtcF9leHBfdCk7CisKKyNkZWZpbmUgbXBmX3JlbGRpZmYgX19nbXBmX3JlbGRpZmYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3JlbGRpZmYgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9zZXQgX19nbXBmX3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0IChtcGZfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfc2V0X2QgX19nbXBmX3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfZCAobXBmX3B0ciwgZG91YmxlKTsKKworI2RlZmluZSBtcGZfc2V0X2RlZmF1bHRfcHJlYyBfX2dtcGZfc2V0X2RlZmF1bHRfcHJlYworX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X2RlZmF1bHRfcHJlYyAobXBfYml0Y250X3QpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBmX3NldF9wcmVjIF9fZ21wZl9zZXRfcHJlYworX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3ByZWMgKG1wZl9wdHIsIG1wX2JpdGNudF90KTsKKworI2RlZmluZSBtcGZfc2V0X3ByZWNfcmF3IF9fZ21wZl9zZXRfcHJlY19yYXcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9wcmVjX3JhdyAobXBmX3B0ciwgbXBfYml0Y250X3QpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBmX3NldF9xIF9fZ21wZl9zZXRfcQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3EgKG1wZl9wdHIsIG1wcV9zcmNwdHIpOworCisjZGVmaW5lIG1wZl9zZXRfc2kgX19nbXBmX3NldF9zaQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3NpIChtcGZfcHRyLCBzaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wZl9zZXRfc3RyIF9fZ21wZl9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX3NldF9zdHIgKG1wZl9wdHIsIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBtcGZfc2V0X3VpIF9fZ21wZl9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF91aSAobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wZl9zZXRfeiBfX2dtcGZfc2V0X3oKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF96IChtcGZfcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfc2l6ZSBfX2dtcGZfc2l6ZQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wZl9zaXplIChtcGZfc3JjcHRyKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9zcXJ0IF9fZ21wZl9zcXJ0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zcXJ0IChtcGZfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfc3FydF91aSBfX2dtcGZfc3FydF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3FydF91aSAobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wZl9zdWIgX19nbXBmX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3ViIChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfc3ViX3VpIF9fZ21wZl9zdWJfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3N1Yl91aSAobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCisjZGVmaW5lIG1wZl9zd2FwIF9fZ21wZl9zd2FwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zd2FwIChtcGZfcHRyLCBtcGZfcHRyKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wZl90cnVuYyBfX2dtcGZfdHJ1bmMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3RydW5jIChtcGZfcHRyLCBtcGZfc3JjcHRyKTsKKworI2RlZmluZSBtcGZfdWlfZGl2IF9fZ21wZl91aV9kaXYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3VpX2RpdiAobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wZl9zcmNwdHIpOworCisjZGVmaW5lIG1wZl91aV9zdWIgX19nbXBmX3VpX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdWlfc3ViIChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBmX3NyY3B0cik7CisKKyNkZWZpbmUgbXBmX3VyYW5kb21iIF9fZ21wZl91cmFuZG9tYgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdXJhbmRvbWIgKG1wZl9wdHIsIGdtcF9yYW5kc3RhdGVfcHRyLCBtcF9iaXRjbnRfdCk7CisKKworLyoqKioqKioqKioqKiBMb3cgbGV2ZWwgcG9zaXRpdmUtaW50ZWdlciAoaS5lLiBOKSByb3V0aW5lcy4gICoqKioqKioqKioqKi8KKworLyogVGhpcyBpcyB1Z2x5LCBidXQgd2UgbmVlZCB0byBtYWtlIHVzZXIgY2FsbHMgcmVhY2ggdGhlIHByZWZpeGVkIGZ1bmN0aW9uLiAqLworCisjZGVmaW5lIG1wbl9hZGQgX19NUE4oYWRkKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGQpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2FkZF8xIF9fTVBOKGFkZF8xKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGRfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkgX19HTVBfTk9USFJPVzsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9hZGRfbiBfX01QTihhZGRfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX2FkZG11bF8xIF9fTVBOKGFkZG11bF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRtdWxfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fY21wIF9fTVBOKGNtcCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9jbXAgKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcG5femVyb19wIF9fTVBOKHplcm9fcCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5femVyb19wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl96ZXJvX3AgKG1wX3NyY3B0ciwgbXBfc2l6ZV90KSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2RpdmV4YWN0XzEgX19NUE4oZGl2ZXhhY3RfMSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2RpdmV4YWN0XzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5Myhkc3Qsc3JjLHNpemUpIFwKKyAgbXBuX2RpdmV4YWN0X2J5M2MgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIDApKQorCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTNjIF9fTVBOKGRpdmV4YWN0X2J5M2MpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdmV4YWN0X2J5M2MgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2Rpdm1vZF8xKHFwLG5wLG5zaXplLGRsaW1iKSBcCisgIG1wbl9kaXZyZW1fMSAocXAsIF9fR01QX0NBU1QgKG1wX3NpemVfdCwgMCksIG5wLCBuc2l6ZSwgZGxpbWIpCisKKyNkZWZpbmUgbXBuX2RpdnJlbSBfX01QTihkaXZyZW0pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX2RpdnJlbV8xIF9fTVBOKGRpdnJlbV8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kaXZyZW1fMSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9kaXZyZW1fMiBfX01QTihkaXZyZW1fMikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2cmVtXzIgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworI2RlZmluZSBtcG5fZGl2X3FyXzEgX19NUE4oZGl2X3FyXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2Rpdl9xcl8xIChtcF9wdHIsIG1wX2xpbWJfdCAqLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fZGl2X3FyXzIgX19NUE4oZGl2X3FyXzIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2Rpdl9xcl8yIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKyNkZWZpbmUgbXBuX2djZCBfX01QTihnY2QpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX2djZCAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9nY2RfMTEgX19NUE4oZ2NkXzExKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9nY2RfMTEgKG1wX2xpbWJfdCwgbXBfbGltYl90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fZ2NkXzEgX19NUE4oZ2NkXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2djZF8xIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fZ2NkZXh0XzEgX19NUE4oZ2NkZXh0XzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2djZGV4dF8xIChtcF9saW1iX3NpZ25lZF90ICosIG1wX2xpbWJfc2lnbmVkX3QgKiwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9nY2RleHQgX19NUE4oZ2NkZXh0KQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9nY2RleHQgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QgKiwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fZ2V0X3N0ciBfX01QTihnZXRfc3RyKQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wbl9nZXRfc3RyICh1bnNpZ25lZCBjaGFyICosIGludCwgbXBfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9oYW1kaXN0IF9fTVBOKGhhbWRpc3QpCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcG5faGFtZGlzdCAobXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fbHNoaWZ0IF9fTVBOKGxzaGlmdCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbHNoaWZ0IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworCisjZGVmaW5lIG1wbl9tb2RfMSBfX01QTihtb2RfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbW9kXzEgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9tdWwgX19NUE4obXVsKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fbXVsXzEgX19NUE4obXVsXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9tdWxfbiBfX01QTihtdWxfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX211bF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9zcXIgX19NUE4oc3FyKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fbmVnIF9fTVBOKG5lZykKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fbmVnKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9uZWcgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2NvbSBfX01QTihjb20pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9jb20gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9wZXJmZWN0X3NxdWFyZV9wIF9fTVBOKHBlcmZlY3Rfc3F1YXJlX3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBuX3BlcmZlY3Rfc3F1YXJlX3AgKG1wX3NyY3B0ciwgbXBfc2l6ZV90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fcGVyZmVjdF9wb3dlcl9wIF9fTVBOKHBlcmZlY3RfcG93ZXJfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fcGVyZmVjdF9wb3dlcl9wIChtcF9zcmNwdHIsIG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3BvcGNvdW50IF9fTVBOKHBvcGNvdW50KQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBuX3BvcGNvdW50IChtcF9zcmNwdHIsIG1wX3NpemVfdCkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fcG93XzEgX19NUE4ocG93XzEpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3Bvd18xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX3B0cik7CisKKy8qIHVuZG9jdW1lbnRlZCBub3csIGJ1dCByZXRhaW5lZCBoZXJlIGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBtcG5fcHJlaW52X21vZF8xIF9fTVBOKHByZWludl9tb2RfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcHJlaW52X21vZF8xIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9yYW5kb20gX19NUE4ocmFuZG9tKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fcmFuZG9tIChtcF9wdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX3JhbmRvbTIgX19NUE4ocmFuZG9tMikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3JhbmRvbTIgKG1wX3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fcnNoaWZ0IF9fTVBOKHJzaGlmdCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcnNoaWZ0IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworCisjZGVmaW5lIG1wbl9zY2FuMCBfX01QTihzY2FuMCkKK19fR01QX0RFQ0xTUEVDIG1wX2JpdGNudF90IG1wbl9zY2FuMCAobXBfc3JjcHRyLCBtcF9iaXRjbnRfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NjYW4xIF9fTVBOKHNjYW4xKQorX19HTVBfREVDTFNQRUMgbXBfYml0Y250X3QgbXBuX3NjYW4xIChtcF9zcmNwdHIsIG1wX2JpdGNudF90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fc2V0X3N0ciBfX01QTihzZXRfc3RyKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9zZXRfc3RyIChtcF9wdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90LCBpbnQpOworCisjZGVmaW5lIG1wbl9zaXplaW5iYXNlIF9fTVBOKHNpemVpbmJhc2UpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBuX3NpemVpbmJhc2UgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBpbnQpOworCisjZGVmaW5lIG1wbl9zcXJ0cmVtIF9fTVBOKHNxcnRyZW0pCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3NxcnRyZW0gKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX3N1YiBfX01QTihzdWIpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1YikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3ViIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZW5kaWYKKworI2RlZmluZSBtcG5fc3ViXzEgX19NUE4oc3ViXzEpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1Yl8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSBfX0dNUF9OT1RIUk9XOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX3N1Yl9uIF9fTVBOKHN1Yl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fc3VibXVsXzEgX19NUE4oc3VibXVsXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1Ym11bF8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl90ZGl2X3FyIF9fTVBOKHRkaXZfcXIpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl90ZGl2X3FyIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9hbmRfbiBfX01QTihhbmRfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2FuZF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5fYW5kbl9uIF9fTVBOKGFuZG5fbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2FuZG5fbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNkZWZpbmUgbXBuX25hbmRfbiBfX01QTihuYW5kX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9uYW5kX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZGVmaW5lIG1wbl9pb3JfbiBfX01QTihpb3JfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2lvcl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5faW9ybl9uIF9fTVBOKGlvcm5fbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2lvcm5fbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNkZWZpbmUgbXBuX25pb3JfbiBfX01QTihuaW9yX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9uaW9yX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZGVmaW5lIG1wbl94b3JfbiBfX01QTih4b3JfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3hvcl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5feG5vcl9uIF9fTVBOKHhub3JfbikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3hub3JfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fY29weWkgX19NUE4oY29weWkpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9jb3B5aSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZGVmaW5lIG1wbl9jb3B5ZCBfX01QTihjb3B5ZCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2NvcHlkIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNkZWZpbmUgbXBuX3plcm8gX19NUE4oemVybykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3plcm8gKG1wX3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fY25kX2FkZF9uIF9fTVBOKGNuZF9hZGRfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fY25kX2FkZF9uIChtcF9saW1iX3QsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZGVmaW5lIG1wbl9jbmRfc3ViX24gX19NUE4oY25kX3N1Yl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9jbmRfc3ViX24gKG1wX2xpbWJfdCwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fc2VjX2FkZF8xIF9fTVBOKHNlY19hZGRfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc2VjX2FkZF8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX3B0cik7CisjZGVmaW5lIG1wbl9zZWNfYWRkXzFfaXRjaCBfX01QTihzZWNfYWRkXzFfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2VjX2FkZF8xX2l0Y2ggKG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NlY19zdWJfMSBfX01QTihzZWNfc3ViXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3NlY19zdWJfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fc2VjX3N1Yl8xX2l0Y2ggX19NUE4oc2VjX3N1Yl8xX2l0Y2gpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3NlY19zdWJfMV9pdGNoIChtcF9zaXplX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9jbmRfc3dhcCAgX19NUE4oY25kX3N3YXApCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9jbmRfc3dhcCAobXBfbGltYl90LCB2b2xhdGlsZSBtcF9saW1iX3QgKiwgdm9sYXRpbGUgbXBfbGltYl90ICosIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX3NlY19tdWwgX19NUE4oc2VjX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3NlY19tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fc2VjX211bF9pdGNoIF9fTVBOKHNlY19tdWxfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2VjX211bF9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NlY19zcXIgX19NUE4oc2VjX3NxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3NlY19zcXIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisjZGVmaW5lIG1wbl9zZWNfc3FyX2l0Y2ggX19NUE4oc2VjX3Nxcl9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9zZWNfc3FyX2l0Y2ggKG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3NlY19wb3dtIF9fTVBOKHNlY19wb3dtKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc2VjX3Bvd20gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfYml0Y250X3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fc2VjX3Bvd21faXRjaCBfX01QTihzZWNfcG93bV9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9zZWNfcG93bV9pdGNoIChtcF9zaXplX3QsIG1wX2JpdGNudF90LCBtcF9zaXplX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9zZWNfdGFic2VsZWN0IF9fTVBOKHNlY190YWJzZWxlY3QpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9zZWNfdGFic2VsZWN0ICh2b2xhdGlsZSBtcF9saW1iX3QgKiwgdm9sYXRpbGUgY29uc3QgbXBfbGltYl90ICosIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9zZWNfZGl2X3FyIF9fTVBOKHNlY19kaXZfcXIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3NlY19kaXZfcXIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fc2VjX2Rpdl9xcl9pdGNoIF9fTVBOKHNlY19kaXZfcXJfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2VjX2Rpdl9xcl9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZGVmaW5lIG1wbl9zZWNfZGl2X3IgX19NUE4oc2VjX2Rpdl9yKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc2VjX2Rpdl9yIChtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisjZGVmaW5lIG1wbl9zZWNfZGl2X3JfaXRjaCBfX01QTihzZWNfZGl2X3JfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2VjX2Rpdl9yX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fc2VjX2ludmVydCBfX01QTihzZWNfaW52ZXJ0KQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9zZWNfaW52ZXJ0IChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2JpdGNudF90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fc2VjX2ludmVydF9pdGNoIF9fTVBOKHNlY19pbnZlcnRfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc2VjX2ludmVydF9pdGNoIChtcF9zaXplX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisKKy8qKioqKioqKioqKioqKioqIG1weiBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHByb3ZpZGVkIGFzIGlubGluZXMgd2hlcmUgcG9zc2libGUsIGJ1dCBhbHdheXMgZXhpc3QgYXMKKyAgIGxpYnJhcnkgZnVuY3Rpb25zIHRvbywgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LgorCisgICBXaXRoaW4gZ21wIGl0c2VsZiB0aGlzIGlubGluaW5nIGdlbmVyYWxseSBpc24ndCByZWxpZWQgb24sIHNpbmNlIGl0CisgICBkb2Vzbid0IGdldCBkb25lIGZvciBhbGwgY29tcGlsZXJzLCB3aGVyZWFzIGlmIHNvbWV0aGluZyBpcyB3b3J0aAorICAgaW5saW5pbmcgdGhlbiBpdCdzIHdvcnRoIGFycmFuZ2luZyBhbHdheXMuCisKKyAgIFRoZXJlIGFyZSB0d28gc3R5bGVzIG9mIGlubGluaW5nIGhlcmUuICBXaGVuIHRoZSBzYW1lIGJpdCBvZiBjb2RlIGlzCisgICB3YW50ZWQgZm9yIHRoZSBpbmxpbmUgYXMgZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gX19HTVBfRk9SQ0VfZm9vCisgICBhcnJhbmdlcyBmb3IgdGhhdCBjb2RlIHRvIGJlIGVtaXR0ZWQgYW5kIHRoZSBfX0dNUF9FWFRFUk5fSU5MSU5FCisgICBkaXJlY3RpdmUgc3VwcHJlc3NlZCwgZWcuIG1wel9maXRzX3VpbnRfcC4gIFdoZW4gYSBkaWZmZXJlbnQgYml0IG9mIGNvZGUKKyAgIGlzIHdhbnRlZCBmb3IgdGhlIGlubGluZSB0aGFuIGZvciB0aGUgbGlicmFyeSB2ZXJzaW9uLCB0aGVuCisgICBfX0dNUF9GT1JDRV9mb28gYXJyYW5nZXMgdGhlIGlubGluZSB0byBiZSBzdXBwcmVzc2VkLCBlZy4gbXB6X2Ficy4gICovCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9hYnMpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wel9hYnMgKG1wel9wdHIgX19nbXBfdywgbXB6X3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wel9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfc2l6ZSA9IF9fR01QX0FCUyAoX19nbXBfdy0+X21wX3NpemUpOworfQorI2VuZGlmCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyNkZWZpbmUgX19HTVBaX0ZJVFNfVVRZUEVfUCh6LG1heHZhbCkJCQkJCVwKKyAgbXBfc2l6ZV90ICBfX2dtcF9uID0gei0+X21wX3NpemU7CQkJCQlcCisgIG1wX3B0ciAgX19nbXBfcCA9IHotPl9tcF9kOwkJCQkJCVwKKyAgcmV0dXJuIChfX2dtcF9uID09IDAgfHwgKF9fZ21wX24gPT0gMSAmJiBfX2dtcF9wWzBdIDw9IG1heHZhbCkpOworI2Vsc2UKKyNkZWZpbmUgX19HTVBaX0ZJVFNfVVRZUEVfUCh6LG1heHZhbCkJCQkJCVwKKyAgbXBfc2l6ZV90ICBfX2dtcF9uID0gei0+X21wX3NpemU7CQkJCQlcCisgIG1wX3B0ciAgX19nbXBfcCA9IHotPl9tcF9kOwkJCQkJCVwKKyAgcmV0dXJuIChfX2dtcF9uID09IDAgfHwgKF9fZ21wX24gPT0gMSAmJiBfX2dtcF9wWzBdIDw9IG1heHZhbCkJXAorCSAgfHwgKF9fZ21wX24gPT0gMiAmJiBfX2dtcF9wWzFdIDw9ICgobXBfbGltYl90KSBtYXh2YWwgPj4gR01QX05VTUJfQklUUykpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWludF9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWludF9wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wel9maXRzX3VpbnRfcCAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIF9fR01QWl9GSVRTX1VUWVBFX1AgKF9fZ21wX3osIFVJTlRfTUFYKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdWxvbmdfcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3Vsb25nX3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X2ZpdHNfdWxvbmdfcCAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIF9fR01QWl9GSVRTX1VUWVBFX1AgKF9fZ21wX3osIFVMT05HX01BWCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VzaG9ydF9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2ZpdHNfdXNob3J0X3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X2ZpdHNfdXNob3J0X3AgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICBfX0dNUFpfRklUU19VVFlQRV9QIChfX2dtcF96LCBVU0hSVF9NQVgpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZ2V0X3VpKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldF91aSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgordW5zaWduZWQgbG9uZworbXB6X2dldF91aSAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3B0ciBfX2dtcF9wID0gX19nbXBfei0+X21wX2Q7CisgIG1wX3NpemVfdCBfX2dtcF9uID0gX19nbXBfei0+X21wX3NpemU7CisgIG1wX2xpbWJfdCBfX2dtcF9sID0gX19nbXBfcFswXTsKKyAgLyogVGhpcyBpcyBhICIjaWYiIHJhdGhlciB0aGFuIGEgcGxhaW4gImlmIiBzbyBhcyB0byBhdm9pZCBnY2Mgd2FybmluZ3MKKyAgICAgYWJvdXQgIjw8IEdNUF9OVU1CX0JJVFMiIGV4Y2VlZGluZyB0aGUgdHlwZSBzaXplLCBhbmQgdG8gYXZvaWQgQm9ybGFuZAorICAgICBDKysgNi4wIHdhcm5pbmdzIGFib3V0IGNvbmRpdGlvbiBhbHdheXMgdHJ1ZSBmb3Igc29tZXRoaW5nIGxpa2UKKyAgICAgIlVMT05HX01BWCA8IEdNUF9OVU1CX01BU0siLiAgKi8KKyNpZiBHTVBfTkFJTF9CSVRTID09IDAgfHwgZGVmaW5lZCAoX0xPTkdfTE9OR19MSU1CKQorICAvKiBsaW1iPT1sb25nIGFuZCBubyBuYWlscywgb3IgbGltYj09bG9uZ2xvbmcsIG9uZSBsaW1iIGlzIGVub3VnaCAqLworICByZXR1cm4gKF9fZ21wX24gIT0gMCA/IF9fZ21wX2wgOiAwKTsKKyNlbHNlCisgIC8qIGxpbWI9PWxvbmcgYW5kIG5haWxzLCBuZWVkIHR3byBsaW1icyB3aGVuIGF2YWlsYWJsZSAqLworICBfX2dtcF9uID0gX19HTVBfQUJTIChfX2dtcF9uKTsKKyAgaWYgKF9fZ21wX24gPD0gMSkKKyAgICByZXR1cm4gKF9fZ21wX24gIT0gMCA/IF9fZ21wX2wgOiAwKTsKKyAgZWxzZQorICAgIHJldHVybiBfX2dtcF9sICsgKF9fZ21wX3BbMV0gPDwgR01QX05VTUJfQklUUyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wel9nZXRsaW1ibiAobXB6X3NyY3B0ciBfX2dtcF96LCBtcF9zaXplX3QgX19nbXBfbikgX19HTVBfTk9USFJPVworeworICBtcF9saW1iX3QgIF9fZ21wX3Jlc3VsdCA9IDA7CisgIGlmIChfX0dNUF9MSUtFTFkgKF9fZ21wX24gPj0gMCAmJiBfX2dtcF9uIDwgX19HTVBfQUJTIChfX2dtcF96LT5fbXBfc2l6ZSkpKQorICAgIF9fZ21wX3Jlc3VsdCA9IF9fZ21wX3otPl9tcF9kW19fZ21wX25dOworICByZXR1cm4gX19nbXBfcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9uZWcpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wel9uZWcgKG1wel9wdHIgX19nbXBfdywgbXB6X3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wel9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfc2l6ZSA9IC0gX19nbXBfdy0+X21wX3NpemU7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3BlcmZlY3Rfc3F1YXJlX3ApCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK2ludAorbXB6X3BlcmZlY3Rfc3F1YXJlX3AgKG1wel9zcmNwdHIgX19nbXBfYSkKK3sKKyAgbXBfc2l6ZV90IF9fZ21wX2FzaXplOworICBpbnQgICAgICAgX19nbXBfcmVzdWx0OworCisgIF9fZ21wX2FzaXplID0gX19nbXBfYS0+X21wX3NpemU7CisgIF9fZ21wX3Jlc3VsdCA9IChfX2dtcF9hc2l6ZSA+PSAwKTsgIC8qIHplcm8gaXMgYSBzcXVhcmUsIG5lZ2F0aXZlcyBhcmUgbm90ICovCisgIGlmIChfX0dNUF9MSUtFTFkgKF9fZ21wX2FzaXplID4gMCkpCisgICAgX19nbXBfcmVzdWx0ID0gbXBuX3BlcmZlY3Rfc3F1YXJlX3AgKF9fZ21wX2EtPl9tcF9kLCBfX2dtcF9hc2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wb3Bjb3VudCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wb3Bjb3VudCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfYml0Y250X3QKK21wel9wb3Bjb3VudCAobXB6X3NyY3B0ciBfX2dtcF91KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3NpemVfdCAgICAgIF9fZ21wX3VzaXplOworICBtcF9iaXRjbnRfdCAgICBfX2dtcF9yZXN1bHQ7CisKKyAgX19nbXBfdXNpemUgPSBfX2dtcF91LT5fbXBfc2l6ZTsKKyAgX19nbXBfcmVzdWx0ID0gKF9fZ21wX3VzaXplIDwgMCA/IH4gX19HTVBfQ0FTVCAobXBfYml0Y250X3QsIDApIDogX19HTVBfQ0FTVCAobXBfYml0Y250X3QsIDApKTsKKyAgaWYgKF9fR01QX0xJS0VMWSAoX19nbXBfdXNpemUgPiAwKSkKKyAgICBfX2dtcF9yZXN1bHQgPSAgbXBuX3BvcGNvdW50IChfX2dtcF91LT5fbXBfZCwgX19nbXBfdXNpemUpOworICByZXR1cm4gX19nbXBfcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2V0X3EpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2V0X3EpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK3ZvaWQKK21wel9zZXRfcSAobXB6X3B0ciBfX2dtcF93LCBtcHFfc3JjcHRyIF9fZ21wX3UpCit7CisgIG1wel90ZGl2X3EgKF9fZ21wX3csIG1wcV9udW1yZWYgKF9fZ21wX3UpLCBtcHFfZGVucmVmIChfX2dtcF91KSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zaXplKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NpemUpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK3NpemVfdAorbXB6X3NpemUgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICByZXR1cm4gX19HTVBfQUJTIChfX2dtcF96LT5fbXBfc2l6ZSk7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBtcHEgaW5saW5lcyAqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgJiYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfYWJzKQorX19HTVBfRVhURVJOX0lOTElORSB2b2lkCittcHFfYWJzIChtcHFfcHRyIF9fZ21wX3csIG1wcV9zcmNwdHIgX19nbXBfdSkKK3sKKyAgaWYgKF9fZ21wX3cgIT0gX19nbXBfdSkKKyAgICBtcHFfc2V0IChfX2dtcF93LCBfX2dtcF91KTsKKyAgX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZSA9IF9fR01QX0FCUyAoX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpICYmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX25lZykKK19fR01QX0VYVEVSTl9JTkxJTkUgdm9pZAorbXBxX25lZyAobXBxX3B0ciBfX2dtcF93LCBtcHFfc3JjcHRyIF9fZ21wX3UpCit7CisgIGlmIChfX2dtcF93ICE9IF9fZ21wX3UpCisgICAgbXBxX3NldCAoX19nbXBfdywgX19nbXBfdSk7CisgIF9fZ21wX3ctPl9tcF9udW0uX21wX3NpemUgPSAtIF9fZ21wX3ctPl9tcF9udW0uX21wX3NpemU7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBtcG4gaW5saW5lcyAqKioqKioqKioqKioqKioqLworCisvKiBUaGUgY29tbWVudHMgd2l0aCBfX0dNUE5fQUREXzEgYmVsb3cgYXBwbHkgaGVyZSB0b28uCisKKyAgIFRoZSB0ZXN0IGZvciBGVU5DVElPTiByZXR1cm5pbmcgMCBzaG91bGQgcHJlZGljdCB3ZWxsLiAgSWYgaXQncyBhc3N1bWVkCisgICB7eXAseXNpemV9IHdpbGwgdXN1YWxseSBoYXZlIGEgcmFuZG9tIG51bWJlciBvZiBiaXRzIHRoZW4gdGhlIGhpZ2ggbGltYgorICAgd29uJ3QgYmUgZnVsbCBhbmQgYSBjYXJyeSBvdXQgd2lsbCBvY2N1ciBhIGdvb2QgZGVhbCBsZXNzIHRoYW4gNTAlIG9mIHRoZQorICAgdGltZS4KKworICAgeXNpemU9PTAgaXNuJ3QgYSBkb2N1bWVudGVkIGZlYXR1cmUsIGJ1dCBpcyB1c2VkIGludGVybmFsbHkgaW4gYSBmZXcKKyAgIHBsYWNlcy4KKworICAgUHJvZHVjaW5nIGNvdXQgbGFzdCBzdG9wcyBpdCB1c2luZyB1cCBhIHJlZ2lzdGVyIGR1cmluZyB0aGUgbWFpbiBwYXJ0IG9mCisgICB0aGUgY2FsY3VsYXRpb24sIHRob3VnaCBnY2MgKGFzIG9mIDMuMCkgb24gYW4gImlmIChtcG5fYWRkICguLi4pKSIKKyAgIGRvZXNuJ3Qgc2VlbSBhYmxlIHRvIG1vdmUgdGhlIHRydWUgYW5kIGZhbHNlIGxlZ3Mgb2YgdGhlIGNvbmRpdGlvbmFsIHVwCisgICB0byB0aGUgdHdvIHBsYWNlcyBjb3V0IGlzIGdlbmVyYXRlZC4gICovCisKKyNkZWZpbmUgX19HTVBOX0FPUlMoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplLCBGVU5DVElPTiwgVEVTVCkgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIF9fZ21wX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKCh5c2l6ZSkgPj0gMCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKCh4c2l6ZSkgPj0gKHlzaXplKSk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFMl9QICh3cCwgeHNpemUsIHhwLCB4c2l6ZSkpOyAqLyAgICAgIFwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFMl9QICh3cCwgeHNpemUsIHlwLCB5c2l6ZSkpOyAqLyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2dtcF9pID0gKHlzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19nbXBfaSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEZVTkNUSU9OICh3cCwgeHAsIHlwLCBfX2dtcF9pKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoX19nbXBfaSA+PSAoeHNpemUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKGNvdXQpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZ290byBfX2dtcF9kb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2dtcF94ID0gKHhwKVtfX2dtcF9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlIChURVNUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHdwKSAhPSAoeHApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fR01QTl9DT1BZX1JFU1QgKHdwLCB4cCwgeHNpemUsIF9fZ21wX2kpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY291dCkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZG9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0dNUE5fQUREKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSkgICAgICAgICAgICAgIFwKKyAgX19HTVBOX0FPUlMgKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSwgbXBuX2FkZF9uLCAgICAgICBcCisgICAgICAgICAgICAgICAoKCh3cClbX19nbXBfaSsrXSA9IChfX2dtcF94ICsgMSkgJiBHTVBfTlVNQl9NQVNLKSA9PSAwKSkKKyNkZWZpbmUgX19HTVBOX1NVQihjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUpICAgICAgICAgICAgICBcCisgIF9fR01QTl9BT1JTIChjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUsIG1wbl9zdWJfbiwgICAgICAgXAorICAgICAgICAgICAgICAgKCgod3ApW19fZ21wX2krK10gPSAoX19nbXBfeCAtIDEpICYgR01QX05VTUJfTUFTSyksIF9fZ21wX3ggPT0gMCkpCisKKworLyogVGhlIHVzZSBvZiBfX2dtcF9pIGluZGV4aW5nIGlzIGRlc2lnbmVkIHRvIGVuc3VyZSBhIGNvbXBpbGUgdGltZSBzcmM9PWRzdAorICAgcmVtYWlucyBuaWNlIGFuZCBjbGVhciB0byB0aGUgY29tcGlsZXIsIHNvIHRoYXQgX19HTVBOX0NPUFlfUkVTVCBjYW4KKyAgIGRpc2FwcGVhciwgYW5kIHRoZSBsb2FkL2FkZC9zdG9yZSBnZXRzIGEgY2hhbmNlIHRvIGJlY29tZSBhCisgICByZWFkLW1vZGlmeS13cml0ZSBvbiBDSVNDIENQVXMuCisKKyAgIEFsdGVybmF0aXZlczoKKworICAgVXNpbmcgYSBwYWlyIG9mIHBvaW50ZXJzIGluc3RlYWQgb2YgaW5kZXhpbmcgd291bGQgYmUgcG9zc2libGUsIGJ1dCBnY2MKKyAgIGlzbid0IGFibGUgdG8gcmVjb2duaXNlIGNvbXBpbGUtdGltZSBzcmM9PWRzdCBpbiB0aGF0IGNhc2UsIGV2ZW4gd2hlbiB0aGUKKyAgIHBvaW50ZXJzIGFyZSBpbmNyZW1lbnRlZCBtb3JlIG9yIGxlc3MgdG9nZXRoZXIuICBPdGhlciBjb21waWxlcnMgd291bGQKKyAgIHZlcnkgbGlrZWx5IGhhdmUgc2ltaWxhciBkaWZmaWN1bHR5LgorCisgICBnY2MgY291bGQgdXNlICJpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc3JjPT1kc3QpICYmIHNyYz09ZHN0KSIgb3IKKyAgIHNpbWlsYXIgdG8gZGV0ZWN0IGEgY29tcGlsZS10aW1lIHNyYz09ZHN0LiAgVGhpcyB3b3JrcyBuaWNlbHkgb24gZ2NjCisgICAyLjk1LngsIGl0J3Mgbm90IGdvb2Qgb24gZ2NjIDMuMCB3aGVyZSBfX2J1aWx0aW5fY29uc3RhbnRfcChwPT1wKSBzZWVtcworICAgdG8gYmUgYWx3YXlzIGZhbHNlLCBmb3IgYSBwb2ludGVyIHAuICBCdXQgdGhlIGN1cnJlbnQgY29kZSBmb3JtIHNlZW1zCisgICBnb29kIGVub3VnaCBmb3Igc3JjPT1kc3QgYW55d2F5LgorCisgICBnY2Mgb24geDg2IGFzIHVzdWFsIGRvZXNuJ3QgZ2l2ZSBwYXJ0aWN1bGFybHkgZ29vZCBmbGFncyBoYW5kbGluZyBmb3IgdGhlCisgICBjYXJyeS9ib3Jyb3cgZGV0ZWN0aW9uLiAgSXQncyB0ZW1wdGluZyB0byB3YW50IHNvbWUgbXVsdGkgaW5zdHJ1Y3Rpb24gYXNtCisgICBibG9ja3MgdG8gaGVscCBpdCwgYW5kIHRoaXMgd2FzIHRyaWVkLCBidXQgaW4gdHJ1dGggdGhlcmUncyBvbmx5IGEgZmV3CisgICBpbnN0cnVjdGlvbnMgdG8gc2F2ZSBhbmQgYW55IGdhaW4gaXMgYWxsIHRvbyBlYXNpbHkgbG9zdCBieSByZWdpc3RlcgorICAganVnZ2xpbmcgc2V0dGluZyB1cCBmb3IgdGhlIGFzbS4gICovCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyNkZWZpbmUgX19HTVBOX0FPUlNfMShjb3V0LCBkc3QsIHNyYywgbiwgdiwgT1AsIENCKQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgbXBfc2l6ZV90ICBfX2dtcF9pOwkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fZ21wX3gsIF9fZ21wX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCVwKKyAgICAvKiBBU1NFUlQgKChuKSA+PSAxKTsgKi8JCQkJCVwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGRzdCwgc3JjLCBuKSk7ICovCVwKKwkJCQkJCQkJXAorICAgIF9fZ21wX3ggPSAoc3JjKVswXTsJCQkJCQlcCisgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkc3QpWzBdID0gX19nbXBfcjsJCQkJCQlcCisgICAgaWYgKENCIChfX2dtcF9yLCBfX2dtcF94LCAodikpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgewkJCQkJCQkJXAorCShjb3V0KSA9IDE7CQkJCQkJXAorCWZvciAoX19nbXBfaSA9IDE7IF9fZ21wX2kgPCAobik7KSAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgewkJCQkJCQlcCisJICAgIF9fZ21wX3ggPSAoc3JjKVtfX2dtcF9pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIF9fZ21wX3IgPSBfX2dtcF94IE9QIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgIChkc3QpW19fZ21wX2ldID0gX19nbXBfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICsrX19nbXBfaTsJCQkJCQlcCisJICAgIGlmICghQ0IgKF9fZ21wX3IsIF9fZ21wX3gsIDEpKSAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgewkJCQkJCQlcCisJCWlmICgoc3JjKSAhPSAoZHN0KSkJCQkJXAorCQkgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBuLCBfX2dtcF9pKTsgICAgICBcCisJCShjb3V0KSA9IDA7CQkJCQlcCisJCWJyZWFrOwkJCQkJCVwKKwkgICAgICB9CQkJCQkJCVwKKwkgIH0JCQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCWlmICgoc3JjKSAhPSAoZHN0KSkJCQkJCVwKKwkgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBuLCAxKTsJCQlcCisJKGNvdXQpID0gMDsJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgPj0gMQorI2RlZmluZSBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCBPUCwgQ0IpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7CQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeCwgX19nbXBfcjsJCQkJXAorCQkJCQkJCQlcCisgICAgLyogQVNTRVJUICgobikgPj0gMSk7ICovCQkJCQlcCisgICAgLyogQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChkc3QsIHNyYywgbikpOyAqLwlcCisJCQkJCQkJCVwKKyAgICBfX2dtcF94ID0gKHNyYylbMF07CQkJCQkJXAorICAgIF9fZ21wX3IgPSBfX2dtcF94IE9QICh2KTsJCQkJCVwKKyAgICAoZHN0KVswXSA9IF9fZ21wX3IgJiBHTVBfTlVNQl9NQVNLOwkJCQlcCisgICAgaWYgKF9fZ21wX3IgPj4gR01QX05VTUJfQklUUyAhPSAwKQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJKGNvdXQpID0gMTsJCQkJCQlcCisJZm9yIChfX2dtcF9pID0gMTsgX19nbXBfaSA8IChuKTspCQkJXAorCSAgewkJCQkJCQlcCisJICAgIF9fZ21wX3ggPSAoc3JjKVtfX2dtcF9pXTsJCQkJXAorCSAgICBfX2dtcF9yID0gX19nbXBfeCBPUCAxOwkJCQlcCisJICAgIChkc3QpW19fZ21wX2ldID0gX19nbXBfciAmIEdNUF9OVU1CX01BU0s7CQlcCisJICAgICsrX19nbXBfaTsJCQkJCQlcCisJICAgIGlmIChfX2dtcF9yID4+IEdNUF9OVU1CX0JJVFMgPT0gMCkJCQlcCisJICAgICAgewkJCQkJCQlcCisJCWlmICgoc3JjKSAhPSAoZHN0KSkJCQkJXAorCQkgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBuLCBfX2dtcF9pKTsJXAorCQkoY291dCkgPSAwOwkJCQkJXAorCQlicmVhazsJCQkJCQlcCisJICAgICAgfQkJCQkJCQlcCisJICB9CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwlpZiAoKHNyYykgIT0gKGRzdCkpCQkJCQlcCisJICBfX0dNUE5fQ09QWV9SRVNUIChkc3QsIHNyYywgbiwgMSk7CQkJXAorCShjb3V0KSA9IDA7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgX19HTVBOX0FERENCKHIseCx5KSAoKHIpIDwgKHkpKQorI2RlZmluZSBfX0dNUE5fU1VCQ0Iocix4LHkpICgoeCkgPCAoeSkpCisKKyNkZWZpbmUgX19HTVBOX0FERF8xKGNvdXQsIGRzdCwgc3JjLCBuLCB2KQkgICAgIFwKKyAgX19HTVBOX0FPUlNfMShjb3V0LCBkc3QsIHNyYywgbiwgdiwgKywgX19HTVBOX0FERENCKQorI2RlZmluZSBfX0dNUE5fU1VCXzEoY291dCwgZHN0LCBzcmMsIG4sIHYpCSAgICAgXAorICBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCAtLCBfX0dNUE5fU1VCQ0IpCisKKworLyogQ29tcGFyZSB7eHAsc2l6ZX0gYW5kIHt5cCxzaXplfSwgc2V0dGluZyAicmVzdWx0IiB0byBwb3NpdGl2ZSwgemVybyBvcgorICAgbmVnYXRpdmUuICBzaXplPT0wIGlzIGFsbG93ZWQuICBPbiByYW5kb20gZGF0YSB1c3VhbGx5IG9ubHkgb25lIGxpbWIgd2lsbAorICAgbmVlZCB0byBiZSBleGFtaW5lZCB0byBnZXQgYSByZXN1bHQsIHNvIGl0J3Mgd29ydGggaGF2aW5nIGl0IGlubGluZS4gICovCisjZGVmaW5lIF9fR01QTl9DTVAocmVzdWx0LCB4cCwgeXAsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90ICBfX2dtcF9pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90ICBfX2dtcF94LCBfX2dtcF95OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc2l6ZSkgPj0gMCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJlc3VsdCkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19nbXBfaSA9IChzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKC0tX19nbXBfaSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fZ21wX3ggPSAoeHApW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fZ21wX3kgPSAoeXApW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfX2dtcF94ICE9IF9fZ21wX3kpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiBDYW5ub3QgdXNlIF9fZ21wX3ggLSBfX2dtcF95LCBtYXkgb3ZlcmZsb3cgYW4gImludCIgKi8gICBcCisgICAgICAgICAgICAocmVzdWx0KSA9IChfX2dtcF94ID4gX19nbXBfeSA/IDEgOiAtMSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworI2lmIGRlZmluZWQgKF9fR01QTl9DT1BZKSAmJiAhIGRlZmluZWQgKF9fR01QTl9DT1BZX1JFU1QpCisjZGVmaW5lIF9fR01QTl9DT1BZX1JFU1QoZHN0LCBzcmMsIHNpemUsIHN0YXJ0KSAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzdGFydCkgPj0gMCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc3RhcnQpIDw9IChzaXplKSk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fR01QTl9DT1BZICgoZHN0KSsoc3RhcnQpLCAoc3JjKSsoc3RhcnQpLCAoc2l6ZSktKHN0YXJ0KSk7IFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBDb3B5IHtzcmMsc2l6ZX0gdG8ge2RzdCxzaXplfSwgc3RhcnRpbmcgYXQgInN0YXJ0Ii4gIFRoaXMgaXMgZGVzaWduZWQgdG8KKyAgIGtlZXAgdGhlIGluZGV4aW5nIGRzdFtqXSBhbmQgc3JjW2pdIG5pY2UgYW5kIHNpbXBsZSBmb3IgX19HTVBOX0FERF8xLAorICAgX19HTVBOX0FERCwgZXRjLiAgKi8KKyNpZiAhIGRlZmluZWQgKF9fR01QTl9DT1BZX1JFU1QpCisjZGVmaW5lIF9fR01QTl9DT1BZX1JFU1QoZHN0LCBzcmMsIHNpemUsIHN0YXJ0KSAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9zaXplX3QgX19nbXBfajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc2l6ZSkgPj0gMCk7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzdGFydCkgPD0gKHNpemUpKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChkc3QsIHNyYywgc2l6ZSkpOyAqLyAgICAgXAorICAgIF9fR01QX0NSQVlfUHJhZ21hICgiX0NSSSBpdmRlcCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKF9fZ21wX2ogPSAoc3RhcnQpOyBfX2dtcF9qIDwgKHNpemUpOyBfX2dtcF9qKyspICAgICAgICBcCisgICAgICAoZHN0KVtfX2dtcF9qXSA9IChzcmMpW19fZ21wX2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIEVuaGFuY2VtZW50OiBVc2Ugc29tZSBvZiB0aGUgc21hcnRlciBjb2RlIGZyb20gZ21wLWltcGwuaC4gIE1heWJlIHVzZQorICAgbXBuX2NvcHlpIGlmIHRoZXJlJ3MgYSBuYXRpdmUgdmVyc2lvbiwgYW5kIGlmIHdlIGRvbid0IG1pbmQgZGVtYW5kaW5nCisgICBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3IgaXQgKG9uIHRhcmdldHMgd2hpY2ggdXNlIGl0KS4gICovCisKKyNpZiAhIGRlZmluZWQgKF9fR01QTl9DT1BZKQorI2RlZmluZSBfX0dNUE5fQ09QWShkc3QsIHNyYywgc2l6ZSkgICBfX0dNUE5fQ09QWV9SRVNUIChkc3QsIHNyYywgc2l6ZSwgMCkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfbGltYl90CittcG5fYWRkIChtcF9wdHIgX19nbXBfd3AsIG1wX3NyY3B0ciBfX2dtcF94cCwgbXBfc2l6ZV90IF9fZ21wX3hzaXplLCBtcF9zcmNwdHIgX19nbXBfeXAsIG1wX3NpemVfdCBfX2dtcF95c2l6ZSkKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9jOworICBfX0dNUE5fQUREIChfX2dtcF9jLCBfX2dtcF93cCwgX19nbXBfeHAsIF9fZ21wX3hzaXplLCBfX2dtcF95cCwgX19nbXBfeXNpemUpOworICByZXR1cm4gX19nbXBfYzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZF8xKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZF8xKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9hZGRfMSAobXBfcHRyIF9fZ21wX2RzdCwgbXBfc3JjcHRyIF9fZ21wX3NyYywgbXBfc2l6ZV90IF9fZ21wX3NpemUsIG1wX2xpbWJfdCBfX2dtcF9uKSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX2xpbWJfdCAgX19nbXBfYzsKKyAgX19HTVBOX0FERF8xIChfX2dtcF9jLCBfX2dtcF9kc3QsIF9fZ21wX3NyYywgX19nbXBfc2l6ZSwgX19nbXBfbik7CisgIHJldHVybiBfX2dtcF9jOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2NtcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcG5fY21wIChtcF9zcmNwdHIgX19nbXBfeHAsIG1wX3NyY3B0ciBfX2dtcF95cCwgbXBfc2l6ZV90IF9fZ21wX3NpemUpIF9fR01QX05PVEhST1cKK3sKKyAgaW50IF9fZ21wX3Jlc3VsdDsKKyAgX19HTVBOX0NNUCAoX19nbXBfcmVzdWx0LCBfX2dtcF94cCwgX19nbXBfeXAsIF9fZ21wX3NpemUpOworICByZXR1cm4gX19nbXBfcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5femVyb19wKQorI2lmICEgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3plcm9fcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcG5femVyb19wIChtcF9zcmNwdHIgX19nbXBfcCwgbXBfc2l6ZV90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgLyogaWYgKF9fR01QX0xJS0VMWSAoX19nbXBfbiA+IDApKSAqLworICAgIGRvIHsKKyAgICAgIGlmIChfX2dtcF9wWy0tX19nbXBfbl0gIT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9IHdoaWxlIChfX2dtcF9uICE9IDApOworICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX3N1YikKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWIpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX3N1YiAobXBfcHRyIF9fZ21wX3dwLCBtcF9zcmNwdHIgX19nbXBfeHAsIG1wX3NpemVfdCBfX2dtcF94c2l6ZSwgbXBfc3JjcHRyIF9fZ21wX3lwLCBtcF9zaXplX3QgX19nbXBfeXNpemUpCit7CisgIG1wX2xpbWJfdCAgX19nbXBfYzsKKyAgX19HTVBOX1NVQiAoX19nbXBfYywgX19nbXBfd3AsIF9fZ21wX3hwLCBfX2dtcF94c2l6ZSwgX19nbXBfeXAsIF9fZ21wX3lzaXplKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWJfMSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWJfMSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfbGltYl90CittcG5fc3ViXzEgKG1wX3B0ciBfX2dtcF9kc3QsIG1wX3NyY3B0ciBfX2dtcF9zcmMsIG1wX3NpemVfdCBfX2dtcF9zaXplLCBtcF9saW1iX3QgX19nbXBfbikgX19HTVBfTk9USFJPVworeworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9TVUJfMSAoX19nbXBfYywgX19nbXBfZHN0LCBfX2dtcF9zcmMsIF9fZ21wX3NpemUsIF9fZ21wX24pOworICByZXR1cm4gX19nbXBfYzsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX25lZykKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9uZWcpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX25lZyAobXBfcHRyIF9fZ21wX3JwLCBtcF9zcmNwdHIgX19nbXBfdXAsIG1wX3NpemVfdCBfX2dtcF9uKQoreworICB3aGlsZSAoKl9fZ21wX3VwID09IDApIC8qIExvdyB6ZXJvIGxpbWJzIGFyZSB1bmNoYW5nZWQgYnkgbmVnYXRpb24uICovCisgICAgeworICAgICAgKl9fZ21wX3JwID0gMDsKKyAgICAgIGlmICghLS1fX2dtcF9uKSAvKiBBbGwgemVybyAqLworCXJldHVybiAwOworICAgICAgKytfX2dtcF91cDsgKytfX2dtcF9ycDsKKyAgICB9CisKKyAgKl9fZ21wX3JwID0gKC0gKl9fZ21wX3VwKSAmIEdNUF9OVU1CX01BU0s7CisKKyAgaWYgKC0tX19nbXBfbikgLyogSGlnaGVyIGxpbWJzIGdldCBjb21wbGVtZW50ZWQuICovCisgICAgbXBuX2NvbSAoKytfX2dtcF9ycCwgKytfX2dtcF91cCwgX19nbXBfbik7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKworLyogQWxsb3cgZmFzdGVyIHRlc3RpbmcgZm9yIG5lZ2F0aXZlLCB6ZXJvLCBhbmQgcG9zaXRpdmUuICAqLworI2RlZmluZSBtcHpfc2duKFopICgoWiktPl9tcF9zaXplIDwgMCA/IC0xIDogKFopLT5fbXBfc2l6ZSA+IDApCisjZGVmaW5lIG1wZl9zZ24oRikgKChGKS0+X21wX3NpemUgPCAwID8gLTEgOiAoRiktPl9tcF9zaXplID4gMCkKKyNkZWZpbmUgbXBxX3NnbihRKSAoKFEpLT5fbXBfbnVtLl9tcF9zaXplIDwgMCA/IC0xIDogKFEpLT5fbXBfbnVtLl9tcF9zaXplID4gMCkKKworLyogV2hlbiB1c2luZyBHQ0MsIG9wdGltaXplIGNlcnRhaW4gY29tbW9uIGNvbXBhcmlzb25zLiAgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMgorI2RlZmluZSBtcHpfY21wX3VpKFosVUkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChVSSkgJiYgKFVJKSA9PSAwCQkJCVwKKyAgID8gbXB6X3NnbiAoWikgOiBfbXB6X2NtcF91aSAoWixVSSkpCisjZGVmaW5lIG1wel9jbXBfc2koWixTSSkJCQkJCQlcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoKFNJKSA+PSAwKSAmJiAoU0kpID49IDAJCQlcCisgICA/IG1wel9jbXBfdWkgKFosIF9fR01QX0NBU1QgKHVuc2lnbmVkIGxvbmcsIFNJKSkJCQlcCisgICA6IF9tcHpfY21wX3NpIChaLFNJKSkKKyNkZWZpbmUgbXBxX2NtcF91aShRLE5VSSxEVUkpCQkJCQlcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoTlVJKSAmJiAoTlVJKSA9PSAwID8gbXBxX3NnbiAoUSkJXAorICAgOiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoKE5VSSkgPT0gKERVSSkpICYmIChOVUkpID09IChEVUkpCVwKKyAgID8gbXB6X2NtcCAobXBxX251bXJlZiAoUSksIG1wcV9kZW5yZWYgKFEpKQkJCVwKKyAgIDogX21wcV9jbXBfdWkgKFEsTlVJLERVSSkpCisjZGVmaW5lIG1wcV9jbXBfc2kocSxuLGQpCQkJCVwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wICgobikgPj0gMCkgJiYgKG4pID49IDAJCVwKKyAgID8gbXBxX2NtcF91aSAocSwgX19HTVBfQ0FTVCAodW5zaWduZWQgbG9uZywgbiksIGQpCVwKKyAgIDogX21wcV9jbXBfc2kgKHEsIG4sIGQpKQorI2Vsc2UKKyNkZWZpbmUgbXB6X2NtcF91aShaLFVJKSBfbXB6X2NtcF91aSAoWixVSSkKKyNkZWZpbmUgbXB6X2NtcF9zaShaLFVJKSBfbXB6X2NtcF9zaSAoWixVSSkKKyNkZWZpbmUgbXBxX2NtcF91aShRLE5VSSxEVUkpIF9tcHFfY21wX3VpIChRLE5VSSxEVUkpCisjZGVmaW5lIG1wcV9jbXBfc2kocSxuLGQpICBfbXBxX2NtcF9zaShxLG4sZCkKKyNlbmRpZgorCisKKy8qIFVzaW5nICImIiByYXRoZXIgdGhhbiAiJiYiIG1lYW5zIHRoZXNlIGNhbiBjb21lIG91dCBicmFuY2gtZnJlZS4gIEV2ZXJ5CisgICBtcHpfdCBoYXMgYXQgbGVhc3Qgb25lIGxpbWIgYWxsb2NhdGVkLCBzbyBmZXRjaGluZyB0aGUgbG93IGxpbWIgaXMgYWx3YXlzCisgICBhbGxvd2VkLiAgKi8KKyNkZWZpbmUgbXB6X29kZF9wKHopICAgKCgoeiktPl9tcF9zaXplICE9IDApICYgX19HTVBfQ0FTVCAoaW50LCAoeiktPl9tcF9kWzBdKSkKKyNkZWZpbmUgbXB6X2V2ZW5fcCh6KSAgKCEgbXB6X29kZF9wICh6KSkKKworCisvKioqKioqKioqKioqKioqKiBDKysgcm91dGluZXMgKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSAmLCBtcHpfc3JjcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtICYsIG1wcV9zcmNwdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiwgbXBmX3NyY3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmLCBtcHpfcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PiAoc3RkOjppc3RyZWFtICYsIG1wcV9wdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+IChzdGQ6OmlzdHJlYW0gJiwgbXBmX3B0cik7CisjZW5kaWYKKworCisvKiBTb3VyY2UtbGV2ZWwgY29tcGF0aWJpbGl0eSB3aXRoIEdNUCAyIGFuZCBlYXJsaWVyLiAqLworI2RlZmluZSBtcG5fZGl2bW9kKHFwLG5wLG5zaXplLGRwLGRzaXplKSBcCisgIG1wbl9kaXZyZW0gKHFwLCBfX0dNUF9DQVNUIChtcF9zaXplX3QsIDApLCBucCwgbnNpemUsIGRwLCBkc2l6ZSkKKworLyogU291cmNlLWxldmVsIGNvbXBhdGliaWxpdHkgd2l0aCBHTVAgMS4gICovCisjZGVmaW5lIG1wel9tZGl2CW1wel9mZGl2X3EKKyNkZWZpbmUgbXB6X21kaXZtb2QJbXB6X2ZkaXZfcXIKKyNkZWZpbmUgbXB6X21tb2QJbXB6X2ZkaXZfcgorI2RlZmluZSBtcHpfbWRpdl91aQltcHpfZmRpdl9xX3VpCisjZGVmaW5lIG1wel9tZGl2bW9kX3VpKHEscixuLGQpIFwKKyAgKCgocikgPT0gMCkgPyBtcHpfZmRpdl9xX3VpIChxLG4sZCkgOiBtcHpfZmRpdl9xcl91aSAocSxyLG4sZCkpCisjZGVmaW5lIG1wel9tbW9kX3VpKHIsbixkKSBcCisgICgoKHIpID09IDApID8gbXB6X2ZkaXZfdWkgKG4sZCkgOiBtcHpfZmRpdl9yX3VpIChyLG4sZCkpCisKKy8qIFVzZWZ1bCBzeW5vbnltcywgYnV0IG5vdCBxdWl0ZSBjb21wYXRpYmxlIHdpdGggR01QIDEuICAqLworI2RlZmluZSBtcHpfZGl2CQltcHpfZmRpdl9xCisjZGVmaW5lIG1wel9kaXZtb2QJbXB6X2ZkaXZfcXIKKyNkZWZpbmUgbXB6X2Rpdl91aQltcHpfZmRpdl9xX3VpCisjZGVmaW5lIG1wel9kaXZtb2RfdWkJbXB6X2ZkaXZfcXJfdWkKKyNkZWZpbmUgbXB6X2Rpdl8yZXhwCW1wel9mZGl2X3FfMmV4cAorI2RlZmluZSBtcHpfbW9kXzJleHAJbXB6X2ZkaXZfcl8yZXhwCisKK2VudW0KK3sKKyAgR01QX0VSUk9SX05PTkUgPSAwLAorICBHTVBfRVJST1JfVU5TVVBQT1JURURfQVJHVU1FTlQgPSAxLAorICBHTVBfRVJST1JfRElWSVNJT05fQllfWkVSTyA9IDIsCisgIEdNUF9FUlJPUl9TUVJUX09GX05FR0FUSVZFID0gNCwKKyAgR01QX0VSUk9SX0lOVkFMSURfQVJHVU1FTlQgPSA4LAorICBHTVBfRVJST1JfTVBaX09WRVJGTE9XID0gMTYKK307CisKKy8qIERlZmluZSBDQyBhbmQgQ0ZMQUdTIHdoaWNoIHdlcmUgdXNlZCB0byBidWlsZCB0aGlzIHZlcnNpb24gb2YgR01QICovCisjZGVmaW5lIF9fR01QX0NDICJAQ0NAIgorI2RlZmluZSBfX0dNUF9DRkxBR1MgIkBDRkxBR1NAIgorCisvKiBNYWpvciB2ZXJzaW9uIG51bWJlciBpcyB0aGUgdmFsdWUgb2YgX19HTlVfTVBfXyB0b28sIGFib3ZlLiAqLworI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OICAgICAgICAgICAgNgorI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OX01JTk9SICAgICAgMworI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwgMAorI2RlZmluZSBfX0dOVV9NUF9SRUxFQVNFIChfX0dOVV9NUF9WRVJTSU9OICogMTAwMDAgKyBfX0dOVV9NUF9WRVJTSU9OX01JTk9SICogMTAwICsgX19HTlVfTVBfVkVSU0lPTl9QQVRDSExFVkVMKQorCisjZGVmaW5lIF9fR01QX0hfXworI2VuZGlmIC8qIF9fR01QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ21wLWltcGwuaCBiL2dtcC1pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxNWFmNwotLS0gL2Rldi9udWxsCisrKyBiL2dtcC1pbXBsLmgKQEAgLTAsMCArMSw1MzQ2IEBACisvKiBJbmNsdWRlIGZpbGUgZm9yIGludGVybmFsIEdOVSBNUCB0eXBlcyBhbmQgZGVmaW5pdGlvbnMuCisKKyAgIFRIRSBDT05URU5UUyBPRiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgQU5EIEFSRSBBTE1PU1QgQ0VSVEFJTiBUTworICAgQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBJTiBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMTk5MS0yMDE4LCAyMDIxLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIF9fR01QX0RFQ0xTUEVDIG11c3QgYmUgZ2l2ZW4gb24gYW55IGdsb2JhbCBkYXRhIHRoYXQgd2lsbCBiZSBhY2Nlc3NlZAorICAgZnJvbSBvdXRzaWRlIGxpYmdtcCwgbWVhbmluZyBmcm9tIHRoZSB0ZXN0IG9yIGRldmVsb3BtZW50IHByb2dyYW1zLCBvcgorICAgZnJvbSBsaWJnbXB4eC4gIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBpbmNvcnJlY3QgYWRkcmVzcworICAgYmVpbmcgdXNlZCBmb3IgdGhlIGFjY2Vzc2VzLiAgT24gZnVuY3Rpb25zIF9fR01QX0RFQ0xTUEVDIG1ha2VzIGNhbGxzCisgICBmcm9tIG91dHNpZGUgbGliZ21wIG1vcmUgZWZmaWNpZW50LCBidXQgdGhleSdsbCBzdGlsbCB3b3JrIGZpbmUgd2l0aG91dAorICAgaXQuICAqLworCisKKyNpZm5kZWYgX19HTVBfSU1QTF9IX18KKyNkZWZpbmUgX19HTVBfSU1QTF9IX18KKworI2lmIGRlZmluZWQgX0NSQVkKKyNpbmNsdWRlIDxpbnRyaW5zaWNzLmg+ICAvKiBmb3IgX3BvcGNudCAqLworI2VuZGlmCisKKy8qIEZvciBJTlRfTUFYLCBldGMuIFdlIHVzZWQgdG8gYXZvaWQgaXQgYmVjYXVzZSBvZiBhIGJ1ZyAob24gc29sYXJpcywKKyAgIGdjYyAyLjk1IHVuZGVyIC1tY3B1PXVsdHJhc3BhcmMgaW4gQUJJPTMyIGVuZHMgdXAgZ2V0dGluZyB3cm9uZworICAgdmFsdWVzICh0aGUgQUJJPTY0IHZhbHVlcykpLCBidXQgaXQgc2hvdWxkIGJlIHNhZmUgbm93LgorCisgICBPbiBDcmF5IHZlY3RvciBzeXN0ZW1zLCBob3dldmVyLCB3ZSBuZWVkIHRoZSBzeXN0ZW0gbGltaXRzLmggc2luY2Ugc2l6ZXMKKyAgIG9mIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgY2FuIGRpZmZlciB0aGVyZSwgZGVwZW5kaW5nIG9uIGNvbXBpbGVyCisgICBvcHRpb25zIChlZy4gLWhub2Zhc3RtZCksIG1ha2luZyBvdXIgU0hSVF9NQVggZXRjIGV4cHJlc3Npb25zIGZhaWwuICBGb3IKKyAgIHJlZmVyZW5jZSwgaW50IGNhbiBiZSA0NiBvciA2NCBiaXRzLCB3aGVyZWFzIHVpbnQgaXMgYWx3YXlzIDY0IGJpdHM7IGFuZAorICAgc2hvcnQgY2FuIGJlIDI0LCAzMiwgNDYgb3IgNjQgYml0cywgYW5kIGRpZmZlcmVudCBmb3IgdXNob3J0LiAgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBGb3IgZmF0LmggYW5kIG90aGVyIGZhdCBiaW5hcnkgc3R1ZmYuCisgICBObyBuZWVkIGZvciBfX0dNUF9BVFRSSUJVVEVfUFVSRSBvciBfX0dNUF9OT1RIUk9XLCBzaW5jZSBmdW5jdGlvbnMKKyAgIGRlY2xhcmVkIHRoaXMgd2F5IGFyZSBvbmx5IHVzZWQgdG8gc2V0IGZ1bmN0aW9uIHBvaW50ZXJzIGluIF9fZ21wbl9jcHV2ZWMsCisgICB0aGV5J3JlIG5vdCBjYWxsZWQgZGlyZWN0bHkuICAqLworI2RlZmluZSBERUNMX2FkZF9uKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkKKyNkZWZpbmUgREVDTF9hZGRsc2gxX24obmFtZSkgXAorICBERUNMX2FkZF9uIChuYW1lKQorI2RlZmluZSBERUNMX2FkZGxzaDJfbihuYW1lKSBcCisgIERFQ0xfYWRkX24gKG5hbWUpCisjZGVmaW5lIERFQ0xfYWRkbXVsXzEobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbmFtZSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KQorI2RlZmluZSBERUNMX2FkZG11bF8yKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cikKKyNkZWZpbmUgREVDTF9iZGl2X2RibTFjKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KQorI2RlZmluZSBERUNMX2NuZF9hZGRfbihuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9saW1iX3QsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkKKyNkZWZpbmUgREVDTF9jbmRfc3ViX24obmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbmFtZSAobXBfbGltYl90LCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpCisjZGVmaW5lIERFQ0xfY29tKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgdm9pZCBuYW1lIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KQorI2RlZmluZSBERUNMX2NvcHlkKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgdm9pZCBuYW1lIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KQorI2RlZmluZSBERUNMX2NvcHlpKG5hbWUpIFwKKyAgREVDTF9jb3B5ZCAobmFtZSkKKyNkZWZpbmUgREVDTF9kaXZleGFjdF8xKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgdm9pZCBuYW1lIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpCisjZGVmaW5lIERFQ0xfZGl2ZXhhY3RfYnkzYyhuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpCisjZGVmaW5lIERFQ0xfZGl2cmVtXzEobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbmFtZSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpCisjZGVmaW5lIERFQ0xfZ2NkXzExKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX2xpbWJfdCwgbXBfbGltYl90KQorI2RlZmluZSBERUNMX2xzaGlmdChuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCkKKyNkZWZpbmUgREVDTF9sc2hpZnRjKG5hbWUpIFwKKyAgREVDTF9sc2hpZnQgKG5hbWUpCisjZGVmaW5lIERFQ0xfbW9kXzEobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbmFtZSAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkKKyNkZWZpbmUgREVDTF9tb2RfMV8xcChuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBjb25zdCBtcF9saW1iX3QgW10pCisjZGVmaW5lIERFQ0xfbW9kXzFfMXBfY3BzKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgdm9pZCBuYW1lIChtcF9saW1iX3QgY3BzW10sIG1wX2xpbWJfdCBiKQorI2RlZmluZSBERUNMX21vZF8xc18ycChuYW1lKSBcCisgIERFQ0xfbW9kXzFfMXAgKG5hbWUpCisjZGVmaW5lIERFQ0xfbW9kXzFzXzJwX2NwcyhuYW1lKSBcCisgIERFQ0xfbW9kXzFfMXBfY3BzIChuYW1lKQorI2RlZmluZSBERUNMX21vZF8xc180cChuYW1lKSBcCisgIERFQ0xfbW9kXzFfMXAgKG5hbWUpCisjZGVmaW5lIERFQ0xfbW9kXzFzXzRwX2NwcyhuYW1lKSBcCisgIERFQ0xfbW9kXzFfMXBfY3BzIChuYW1lKQorI2RlZmluZSBERUNMX21vZF8zNGxzdWIxKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX3NyY3B0ciwgbXBfc2l6ZV90KQorI2RlZmluZSBERUNMX21vZGV4YWN0XzFjX29kZChuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpCisjZGVmaW5lIERFQ0xfbXVsXzEobmFtZSkgXAorICBERUNMX2FkZG11bF8xIChuYW1lKQorI2RlZmluZSBERUNMX211bF9iYXNlY2FzZShuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIHZvaWQgbmFtZSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpCisjZGVmaW5lIERFQ0xfbXVsbG9fYmFzZWNhc2UobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyB2b2lkIG5hbWUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkKKyNkZWZpbmUgREVDTF9wcmVpbnZfZGl2cmVtXzEobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbmFtZSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgaW50KQorI2RlZmluZSBERUNMX3ByZWludl9tb2RfMShuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpCisjZGVmaW5lIERFQ0xfcmVkY18xKG5hbWUpIFwKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG5hbWUgKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KQorI2RlZmluZSBERUNMX3JlZGNfMihuYW1lKSBcCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBuYW1lIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cikKKyNkZWZpbmUgREVDTF9yc2hpZnQobmFtZSkgXAorICBERUNMX2xzaGlmdCAobmFtZSkKKyNkZWZpbmUgREVDTF9zcXJfYmFzZWNhc2UobmFtZSkgXAorICBfX0dNUF9ERUNMU1BFQyB2b2lkIG5hbWUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpCisjZGVmaW5lIERFQ0xfc3ViX24obmFtZSkgXAorICBERUNMX2FkZF9uIChuYW1lKQorI2RlZmluZSBERUNMX3N1YmxzaDFfbihuYW1lKSBcCisgIERFQ0xfYWRkX24gKG5hbWUpCisjZGVmaW5lIERFQ0xfc3VibXVsXzEobmFtZSkgXAorICBERUNMX2FkZG11bF8xIChuYW1lKQorCisjaWYgISBkZWZpbmVkIChfX0dNUF9XSVRISU5fQ09ORklHVVJFKQorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImdtcC5oIgorI2luY2x1ZGUgImdtcC1tcGFyYW0uaCIKKyNpbmNsdWRlICJmaWJfdGFibGUuaCIKKyNpbmNsdWRlICJmYWNfdGFibGUuaCIKKyNpbmNsdWRlICJzaWV2ZV90YWJsZS5oIgorI2luY2x1ZGUgIm1wX2Jhc2VzLmgiCisjaWYgV0FOVF9GQVRfQklOQVJZCisjaW5jbHVkZSAiZmF0LmgiCisjZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9JTlRUWVBFU19IICAgICAgLyogZm9yIHVpbnRfbGVhc3QzMl90ICovCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKy8qIE9uIHNvbWUgcGxhdGZvcm1zIGludHR5cGVzLmggZXhpc3RzIGJ1dCBpcyBpbmNvbXBsZXRlCisgICBhbmQgd2Ugc3RpbGwgbmVlZCBzdGRpbnQuaC4gKi8KKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGNzdHJpbmc+ICAvKiBmb3Igc3RybGVuICovCisjaW5jbHVkZSA8c3RyaW5nPiAgIC8qIGZvciBzdGQ6OnN0cmluZyAqLworI2VuZGlmCisKKworI2lmbmRlZiBXQU5UX1RNUF9ERUJVRyAgLyogZm9yIFRNUF9BTExPQ19MSU1CU18yIGFuZCBvdGhlcnMgKi8KKyNkZWZpbmUgV0FOVF9UTVBfREVCVUcgMAorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdHJpZXMgdG8gZ2V0IGEgZ29vZCB2ZXJzaW9uIG9mIGFsbG9jYS4gIFRoZSB0ZXN0cyBhcmUKKyAgIGFkYXB0ZWQgZnJvbSBhdXRvY29uZiBBQ19GVU5DX0FMTE9DQSwgd2l0aCBhIGNvdXBsZSBvZiBhZGRpdGlvbnMuCisgICBXaGV0aGVyIHRoaXMgc3VjY2VlZHMgaXMgdGVzdGVkIGJ5IEdNUF9GVU5DX0FMTE9DQSBhbmQgSEFWRV9BTExPQ0Egd2lsbAorICAgYmUgc2V0dXAgYXBwcm9wcmlhdGVseS4KKworICAgaWZuZGVmIGFsbG9jYSAtIGEgY3BwIGRlZmluZSBtaWdodCBhbHJlYWR5IGV4aXN0LgorICAgICAgIGdsaWJjIDxzdGRsaWIuaD4gaW5jbHVkZXMgPGFsbG9jYS5oPiB3aGljaCB1c2VzIEdDQyBfX2J1aWx0aW5fYWxsb2NhLgorICAgICAgIEhQIGNjICtPbGliY2FsbHMgYWRkcyBhICNkZWZpbmUgb2YgYWxsb2NhIHRvIF9fYnVpbHRpbl9hbGxvY2EuCisKKyAgIEdDQyBfX2J1aWx0aW5fYWxsb2NhIC0gcHJlZmVycmVkIHdoZW5ldmVyIGF2YWlsYWJsZS4KKworICAgX0FJWCBwcmFnbWEgLSBJQk0gY29tcGlsZXJzIG5lZWQgYSAjcHJhZ21hIGluICJlYWNoIG1vZHVsZSB0aGF0IG5lZWRzIHRvCisgICAgICAgdXNlIGFsbG9jYSIuICBQcmFnbWEgaW5kZW50ZWQgdG8gcHJvdGVjdCBwcmUtQU5TSSBjcHAncy4gIF9JQk1SMiB3YXMKKyAgICAgICB1c2VkIGluIHBhc3QgdmVyc2lvbnMgb2YgR01QLCByZXRhaW5lZCBzdGlsbCBpbiBjYXNlIGl0IG1hdHRlcnMuCisKKyAgICAgICBUaGUgYXV0b2NvbmYgbWFudWFsIHNheXMgdGhpcyBwcmFnbWEgbmVlZHMgdG8gYmUgYXQgdGhlIHN0YXJ0IG9mIGEgQworICAgICAgIGZpbGUsIGFwYXJ0IGZyb20gY29tbWVudHMgYW5kIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLiAgSXMgdGhhdCB0cnVlPworICAgICAgIHhsYyBvbiBhaXggNC54eHggZG9lc24ndCBzZWVtIHRvIG1pbmQgaXQgYmVpbmcgYWZ0ZXIgcHJvdG90eXBlcyBldGMKKyAgICAgICBmcm9tIGdtcC5oLgorKi8KKworI2lmbmRlZiBhbGxvY2EKKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBlbHNlCisjICBpZmRlZiBfX0RFQ0MKKyMgICBkZWZpbmUgYWxsb2NhKHgpIF9fQUxMT0NBKHgpCisjICBlbHNlCisjICAgaWZkZWYgX01TQ19WRVIKKyMgICAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICAgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyAgIGVsc2UKKyMgICAgaWYgSEFWRV9BTExPQ0FfSAorIyAgICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICAgIGVsc2UKKyMgICAgIGlmIGRlZmluZWQgKF9BSVgpIHx8IGRlZmluZWQgKF9JQk1SMikKKyAjcHJhZ21hIGFsbG9jYQorIyAgICAgZWxzZQorICAgICAgIGNoYXIgKmFsbG9jYSAoKTsKKyMgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBpZiBub3QgcHJvdmlkZWQgYnkgZ21wLW1wYXJhbS5oICovCisjaWZuZGVmIEdNUF9MSU1CX0JZVEVTCisjZGVmaW5lIEdNUF9MSU1CX0JZVEVTICBTSVpFT0ZfTVBfTElNQl9UCisjZW5kaWYKKyNpZm5kZWYgR01QX0xJTUJfQklUUworI2RlZmluZSBHTVBfTElNQl9CSVRTICAoOCAqIFNJWkVPRl9NUF9MSU1CX1QpCisjZW5kaWYKKworI2RlZmluZSBCSVRTX1BFUl9VTE9ORyAgKDggKiBTSVpFT0ZfVU5TSUdORURfTE9ORykKKworCisvKiBnbXBfdWludF9sZWFzdDMyX3QgaXMgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gKi8KKyNpZiBIQVZFX1VJTlRfTEVBU1QzMl9UCit0eXBlZGVmIHVpbnRfbGVhc3QzMl90ICAgICAgZ21wX3VpbnRfbGVhc3QzMl90OworI2Vsc2UKKyNpZiBTSVpFT0ZfVU5TSUdORURfU0hPUlQgPj0gNAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIGdtcF91aW50X2xlYXN0MzJfdDsKKyNlbHNlCisjaWYgU0laRU9GX1VOU0lHTkVEID49IDQKK3R5cGVkZWYgdW5zaWduZWQgICAgICAgICAgICBnbXBfdWludF9sZWFzdDMyX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIGdtcF91aW50X2xlYXN0MzJfdDsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworCisvKiBnbXBfaW50cHRyX3QsIGZvciBwb2ludGVyIHRvIGludGVnZXIgY2FzdHMgKi8KKyNpZiBIQVZFX0lOVFBUUl9UCit0eXBlZGVmIGludHB0cl90ICAgICAgICAgICAgZ21wX2ludHB0cl90OworI2Vsc2UgLyogZmFsbGJhY2sgKi8KK3R5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICBnbXBfaW50cHRyX3Q7CisjZW5kaWYKKworCisvKiBwcmUtaW52ZXJzZSB0eXBlcyBmb3IgdHJ1bmNhdGluZyBkaXZpc2lvbiBhbmQgbW9kdWxvICovCit0eXBlZGVmIHN0cnVjdCB7bXBfbGltYl90IGludjMyO30gZ21wX3BpMV90OwordHlwZWRlZiBzdHJ1Y3Qge21wX2xpbWJfdCBpbnYyMSwgaW52MzIsIGludjUzO30gZ21wX3BpMl90OworCisKKy8qICJjb25zdCIgYmFzaWNhbGx5IG1lYW5zIGEgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGJ1dCBleGFtaW5lIGl0cyBhcmd1bWVudHMKKyAgIGFuZCBnaXZlIGEgcmV0dXJuIHZhbHVlLCBpdCBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgYW55IG1lbW9yeSAobmVpdGhlcgorICAgZ2xvYmFsIG5vciBwb2ludGVkIHRvIGJ5IGFyZ3VtZW50cyksIGFuZCBoYXMgbm8gb3RoZXIgc2lkZS1lZmZlY3RzLiAgVGhpcworICAgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuICJwdXJlIi4gIFNlZSBpbmZvIG5vZGUgIihnY2MpRnVuY3Rpb24KKyAgIEF0dHJpYnV0ZXMiLiAgX19HTVBfTk9fQVRUUklCVVRFX0NPTlNUX1BVUkUgbGV0cyB0dW5lL2NvbW1vbi5jIGV0YyB0dXJuCisgICB0aGlzIG9mZiB3aGVuIHRyeWluZyB0byB3cml0ZSB0aW1pbmcgbG9vcHMuICAqLworI2lmIEhBVkVfQVRUUklCVVRFX0NPTlNUICYmICEgZGVmaW5lZCAoX19HTVBfTk9fQVRUUklCVVRFX0NPTlNUX1BVUkUpCisjZGVmaW5lIEFUVFJJQlVURV9DT05TVCAgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSkKKyNlbHNlCisjZGVmaW5lIEFUVFJJQlVURV9DT05TVAorI2VuZGlmCisKKyNpZiBIQVZFX0FUVFJJQlVURV9OT1JFVFVSTgorI2RlZmluZSBBVFRSSUJVVEVfTk9SRVRVUk4gIF9fYXR0cmlidXRlX18gKChub3JldHVybikpCisjZWxzZQorI2RlZmluZSBBVFRSSUJVVEVfTk9SRVRVUk4KKyNlbmRpZgorCisvKiAibWFsbG9jIiBtZWFucyBhIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBtYWxsb2MgaW4gdGhhdCB0aGUgcG9pbnRlciBpdAorICAgcmV0dXJucyBkb2Vzbid0IGFsaWFzIGFueXRoaW5nLiAgKi8KKyNpZiBIQVZFX0FUVFJJQlVURV9NQUxMT0MKKyNkZWZpbmUgQVRUUklCVVRFX01BTExPQyAgX19hdHRyaWJ1dGVfXyAoKG1hbGxvYykpCisjZWxzZQorI2RlZmluZSBBVFRSSUJVVEVfTUFMTE9DCisjZW5kaWYKKworCisjaWYgISBIQVZFX1NUUkNIUgorI2RlZmluZSBzdHJjaHIocyxjKSAgaW5kZXgocyxjKQorI2VuZGlmCisKKyNpZiAhIEhBVkVfTUVNU0VUCisjZGVmaW5lIG1lbXNldChwLCBjLCBuKQkJCVwKKyAgZG8gewkJCQkJXAorICAgIEFTU0VSVCAoKG4pID49IDApOwkJCVwKKyAgICBjaGFyICpfX21lbXNldF9fcCA9IChwKTsJCVwKKyAgICBpbnQJIF9faTsJCQkJXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgKG4pOyBfX2krKykJXAorICAgICAgX19tZW1zZXRfX3BbX19pXSA9IChjKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiB2YV9jb3B5IGlzIHN0YW5kYXJkIGluIEM5OSwgYW5kIGdjYyBwcm92aWRlcyBfX3ZhX2NvcHkgd2hlbiBpbiBzdHJpY3QgQzg5CisgICBtb2RlLiAgRmFsbGluZyBiYWNrIHRvIGEgbWVtY3B5IHdpbGwgZ2l2ZSBtYXhpbXVtIHBvcnRhYmlsaXR5LCBzaW5jZSBpdAorICAgd29ya3Mgbm8gbWF0dGVyIHdoZXRoZXIgdmFfbGlzdCBpcyBhIHBvaW50ZXIsIHN0cnVjdCBvciBhcnJheS4gICovCisjaWYgISBkZWZpbmVkICh2YV9jb3B5KSAmJiBkZWZpbmVkIChfX3ZhX2NvcHkpCisjZGVmaW5lIHZhX2NvcHkoZHN0LHNyYykgIF9fdmFfY29weShkc3Qsc3JjKQorI2VuZGlmCisjaWYgISBkZWZpbmVkICh2YV9jb3B5KQorI2RlZmluZSB2YV9jb3B5KGRzdCxzcmMpIFwKKyAgZG8geyBtZW1jcHkgKCYoZHN0KSwgJihzcmMpLCBzaXplb2YgKHZhX2xpc3QpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIEhBVkVfSE9TVF9DUFVfYWxwaGFfQ0lYIGlzIDEgb24gYW4gYWxwaGEgd2l0aCB0aGUgQ0lYIGluc3RydWN0aW9ucworICAgKGllLiBjdGx6LCBjdHBvcCwgY3R0eikuICAqLworI2lmIEhBVkVfSE9TVF9DUFVfYWxwaGFldjY3IHx8IEhBVkVfSE9TVF9DUFVfYWxwaGFldjY4ICBcCisgIHx8IEhBVkVfSE9TVF9DUFVfYWxwaGFldjcKKyNkZWZpbmUgSEFWRV9IT1NUX0NQVV9hbHBoYV9DSVggMQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBVc2FnZTogVE1QX0RFQ0w7CisJICBUTVBfTUFSSzsKKwkgIHB0ciA9IFRNUF9BTExPQyAoYnl0ZXMpOworCSAgVE1QX0ZSRUU7CisKKyAgIFNtYWxsIGFsbG9jYXRpb25zIHNob3VsZCB1c2UgVE1QX1NBTExPQywgYmlnIGFsbG9jYXRpb25zIHNob3VsZCB1c2UKKyAgIFRNUF9CQUxMT0MuICBBbGxvY2F0aW9ucyB0aGF0IG1pZ2h0IGJlIHNtYWxsIG9yIGJpZyBzaG91bGQgdXNlIFRNUF9BTExPQy4KKworICAgRnVuY3Rpb25zIHRoYXQgdXNlIGp1c3QgVE1QX1NBTExPQyBzaG91bGQgdXNlIFRNUF9TREVDTCwgVE1QX1NNQVJLLCBhbmQKKyAgIFRNUF9TRlJFRS4KKworICAgVE1QX0RFQ0wganVzdCBkZWNsYXJlcyBhIHZhcmlhYmxlLCBidXQgbWlnaHQgYmUgZW1wdHkgYW5kIHNvIG11c3QgYmUgbGFzdAorICAgaW4gYSBsaXN0IG9mIHZhcmlhYmxlcy4gIFRNUF9NQVJLIG11c3QgYmUgZG9uZSBiZWZvcmUgYW55IFRNUF9BTExPQy4KKyAgIFRNUF9BTExPQygwKSBpcyBub3QgYWxsb3dlZC4gIFRNUF9GUkVFIGRvZXNuJ3QgbmVlZCB0byBiZSBkb25lIGlmIGEKKyAgIFRNUF9NQVJLIHdhcyBtYWRlLCBidXQgdGhlbiBubyBUTVBfQUxMT0NzLiAgKi8KKworLyogVGhlIGFsaWdubWVudCBpbiBieXRlcywgdXNlZCBmb3IgVE1QX0FMTE9DZWQgYmxvY2tzLCB3aGVuIGFsbG9jYSBvcgorICAgX19nbXBfYWxsb2NhdGVfZnVuYyBkb2Vzbid0IGFscmVhZHkgZGV0ZXJtaW5lIGl0LiAgKi8KK3VuaW9uIHRtcF9hbGlnbl90IHsKKyAgbXBfbGltYl90ICBsOworICBkb3VibGUgICAgIGQ7CisgIGNoYXIgICAgICAgKnA7Cit9OworI2RlZmluZSBfX1RNUF9BTElHTiAgc2l6ZW9mICh1bmlvbiB0bXBfYWxpZ25fdCkKKworLyogUmV0dXJuICJhIiByb3VuZGVkIHVwd2FyZHMgdG8gYSBtdWx0aXBsZSBvZiAibSIsIGlmIGl0IGlzbid0IGFscmVhZHkuCisgICAiYSIgbXVzdCBiZSBhbiB1bnNpZ25lZCB0eXBlLgorICAgVGhpcyBpcyBkZXNpZ25lZCBmb3IgdXNlIHdpdGggYSBjb21waWxlLXRpbWUgY29uc3RhbnQgIm0iLgorICAgVGhlIFBPVzIgY2FzZSBpcyBleHBlY3RlZCB0byBiZSB1c3VhbCwgYW5kIGdjYyAzLjAgYW5kIHVwIHJlY29nbmlzZXMKKyAgICIoLSg4Km4pKSU4IiBvciB0aGUgbGlrZSBpcyBhbHdheXMgemVybywgd2hpY2ggbWVhbnMgdGhlIHJvdW5kaW5nIHVwIGluCisgICB0aGUgV0FOVF9UTVBfTk9UUkVFTlRSQU5UIHZlcnNpb24gb2YgVE1QX0FMTE9DIGJlbG93IHdpbGwgYmUgYSBub29wLiAgKi8KKyNkZWZpbmUgUk9VTkRfVVBfTVVMVElQTEUoYSxtKSAgICAgICAgICBcCisgIChQT1cyX1AobSkgPyAoYSkgKyAoLShhKSklKG0pICAgICAgICAgXAorICAgOiAoYSkrKG0pLTEgLSAoKChhKSsobSktMSkgJSAobSkpKQorCisjaWYgZGVmaW5lZCAoV0FOVF9UTVBfQUxMT0NBKSB8fCBkZWZpbmVkIChXQU5UX1RNUF9SRUVOVFJBTlQpCitzdHJ1Y3QgdG1wX3JlZW50cmFudF90IHsKKyAgc3RydWN0IHRtcF9yZWVudHJhbnRfdCAgKm5leHQ7CisgIHNpemVfdAkJICBzaXplOwkgIC8qIGJ5dGVzLCBpbmNsdWRpbmcgaGVhZGVyICovCit9OworX19HTVBfREVDTFNQRUMgdm9pZCAqX19nbXBfdG1wX3JlZW50cmFudF9hbGxvYyAoc3RydWN0IHRtcF9yZWVudHJhbnRfdCAqKiwgc2l6ZV90KSBBVFRSSUJVVEVfTUFMTE9DOworX19HTVBfREVDTFNQRUMgdm9pZCAgX19nbXBfdG1wX3JlZW50cmFudF9mcmVlIChzdHJ1Y3QgdG1wX3JlZW50cmFudF90ICopOworI2VuZGlmCisKKyNpZiBXQU5UX1RNUF9BTExPQ0EKKyNkZWZpbmUgVE1QX1NERUNMCisjZGVmaW5lIFRNUF9ERUNMCQlzdHJ1Y3QgdG1wX3JlZW50cmFudF90ICpfX3RtcF9tYXJrZXIKKyNkZWZpbmUgVE1QX1NNQVJLCisjZGVmaW5lIFRNUF9NQVJLCQlfX3RtcF9tYXJrZXIgPSAwCisjZGVmaW5lIFRNUF9TQUxMT0MobikJCWFsbG9jYShuKQorI2RlZmluZSBUTVBfQkFMTE9DKG4pCQlfX2dtcF90bXBfcmVlbnRyYW50X2FsbG9jICgmX190bXBfbWFya2VyLCBuKQorLyogVGhlIHBlY3VsaWFyIHN0YWNrIGFsbG9jYXRpb24gbGltaXQgaGVyZSBpcyBjaG9zZW4gZm9yIGVmZmljaWVudCBhc20uICAqLworI2RlZmluZSBUTVBfQUxMT0MobikJCQkJCQkJXAorICAoTElLRUxZICgobikgPD0gMHg3ZjAwKSA/IFRNUF9TQUxMT0MobikgOiBUTVBfQkFMTE9DKG4pKQorI2RlZmluZSBUTVBfU0ZSRUUKKyNkZWZpbmUgVE1QX0ZSRUUJCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChVTkxJS0VMWSAoX190bXBfbWFya2VyICE9IDApKQkJCQkJXAorICAgICAgX19nbXBfdG1wX3JlZW50cmFudF9mcmVlIChfX3RtcF9tYXJrZXIpOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIFdBTlRfVE1QX1JFRU5UUkFOVAorI2RlZmluZSBUTVBfU0RFQ0wJCVRNUF9ERUNMCisjZGVmaW5lIFRNUF9ERUNMCQlzdHJ1Y3QgdG1wX3JlZW50cmFudF90ICpfX3RtcF9tYXJrZXIKKyNkZWZpbmUgVE1QX1NNQVJLCQlUTVBfTUFSSworI2RlZmluZSBUTVBfTUFSSwkJX190bXBfbWFya2VyID0gMAorI2RlZmluZSBUTVBfU0FMTE9DKG4pCQlUTVBfQUxMT0MobikKKyNkZWZpbmUgVE1QX0JBTExPQyhuKQkJVE1QX0FMTE9DKG4pCisjZGVmaW5lIFRNUF9BTExPQyhuKQkJX19nbXBfdG1wX3JlZW50cmFudF9hbGxvYyAoJl9fdG1wX21hcmtlciwgbikKKyNkZWZpbmUgVE1QX1NGUkVFCQlUTVBfRlJFRQorI2RlZmluZSBUTVBfRlJFRQkJX19nbXBfdG1wX3JlZW50cmFudF9mcmVlIChfX3RtcF9tYXJrZXIpCisjZW5kaWYKKworI2lmIFdBTlRfVE1QX05PVFJFRU5UUkFOVAorc3RydWN0IHRtcF9tYXJrZXIKK3sKKyAgc3RydWN0IHRtcF9zdGFjayAqd2hpY2hfY2h1bms7CisgIHZvaWQgKmFsbG9jX3BvaW50OworfTsKK19fR01QX0RFQ0xTUEVDIHZvaWQgKl9fZ21wX3RtcF9hbGxvYyAodW5zaWduZWQgbG9uZykgQVRUUklCVVRFX01BTExPQzsKK19fR01QX0RFQ0xTUEVDIHZvaWQgX19nbXBfdG1wX21hcmsgKHN0cnVjdCB0bXBfbWFya2VyICopOworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcF90bXBfZnJlZSAoc3RydWN0IHRtcF9tYXJrZXIgKik7CisjZGVmaW5lIFRNUF9TREVDTAkJVE1QX0RFQ0wKKyNkZWZpbmUgVE1QX0RFQ0wJCXN0cnVjdCB0bXBfbWFya2VyIF9fdG1wX21hcmtlcgorI2RlZmluZSBUTVBfU01BUksJCVRNUF9NQVJLCisjZGVmaW5lIFRNUF9NQVJLCQlfX2dtcF90bXBfbWFyayAoJl9fdG1wX21hcmtlcikKKyNkZWZpbmUgVE1QX1NBTExPQyhuKQkJVE1QX0FMTE9DKG4pCisjZGVmaW5lIFRNUF9CQUxMT0MobikJCVRNUF9BTExPQyhuKQorI2RlZmluZSBUTVBfQUxMT0MobikJCQkJCQkJXAorICBfX2dtcF90bXBfYWxsb2MgKFJPVU5EX1VQX01VTFRJUExFICgodW5zaWduZWQgbG9uZykgKG4pLCBfX1RNUF9BTElHTikpCisjZGVmaW5lIFRNUF9TRlJFRQkJVE1QX0ZSRUUKKyNkZWZpbmUgVE1QX0ZSRUUJCV9fZ21wX3RtcF9mcmVlICgmX190bXBfbWFya2VyKQorI2VuZGlmCisKKyNpZiBXQU5UX1RNUF9ERUJVRworLyogU2VlIHRhbC1kZWJ1Zy5jIGZvciBzb21lIGNvbW1lbnRzLiAqLworc3RydWN0IHRtcF9kZWJ1Z190IHsKKyAgc3RydWN0IHRtcF9kZWJ1Z19lbnRyeV90ICAqbGlzdDsKKyAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqZmlsZTsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICBsaW5lOworfTsKK3N0cnVjdCB0bXBfZGVidWdfZW50cnlfdCB7CisgIHN0cnVjdCB0bXBfZGVidWdfZW50cnlfdCAgKm5leHQ7CisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrOworICBzaXplX3QgICAgICAgICAgICAgICAgICAgIHNpemU7Cit9OworX19HTVBfREVDTFNQRUMgdm9pZCAgX19nbXBfdG1wX2RlYnVnX21hcmsgKGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgdG1wX2RlYnVnX3QgKiosCisJCQkJCSAgIHN0cnVjdCB0bXBfZGVidWdfdCAqLAorCQkJCQkgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX0dNUF9ERUNMU1BFQyB2b2lkICpfX2dtcF90bXBfZGVidWdfYWxsb2MgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsCisJCQkJCSAgICBzdHJ1Y3QgdG1wX2RlYnVnX3QgKiosIGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgIHNpemVfdCkgQVRUUklCVVRFX01BTExPQzsKK19fR01QX0RFQ0xTUEVDIHZvaWQgIF9fZ21wX3RtcF9kZWJ1Z19mcmVlIChjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJCQkgICBzdHJ1Y3QgdG1wX2RlYnVnX3QgKiosCisJCQkJCSAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNkZWZpbmUgVE1QX1NERUNMIFRNUF9ERUNMX05BTUUoX190bXBfeG1hcmtlciwgIl9fdG1wX21hcmtlciIpCisjZGVmaW5lIFRNUF9ERUNMIFRNUF9ERUNMX05BTUUoX190bXBfeG1hcmtlciwgIl9fdG1wX21hcmtlciIpCisjZGVmaW5lIFRNUF9TTUFSSyBUTVBfTUFSS19OQU1FKF9fdG1wX3htYXJrZXIsICJfX3RtcF9tYXJrZXIiKQorI2RlZmluZSBUTVBfTUFSSyBUTVBfTUFSS19OQU1FKF9fdG1wX3htYXJrZXIsICJfX3RtcF9tYXJrZXIiKQorI2RlZmluZSBUTVBfU0ZSRUUgVE1QX0ZSRUVfTkFNRShfX3RtcF94bWFya2VyLCAiX190bXBfbWFya2VyIikKKyNkZWZpbmUgVE1QX0ZSRUUgVE1QX0ZSRUVfTkFNRShfX3RtcF94bWFya2VyLCAiX190bXBfbWFya2VyIikKKy8qIFRoZSBtYXJrZXIgdmFyaWFibGUgaXMgZGVzaWduZWQgdG8gcHJvdm9rZSBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlCisgICB3YXJuaW5nIGZyb20gdGhlIGNvbXBpbGVyIGlmIFRNUF9GUkVFIGlzIHVzZWQgd2l0aG91dCBhIFRNUF9NQVJLLgorICAgX190bXBfbWFya2VyX2luc2NvcGUgZG9lcyB0aGUgc2FtZSBmb3IgVE1QX0FMTE9DLiAgUnVudGltZSB0ZXN0cyBwaWNrCisgICB0aGVzZSB0aGluZ3MgdXAgdG9vLiAgKi8KKyNkZWZpbmUgVE1QX0RFQ0xfTkFNRShtYXJrZXIsIG1hcmtlcl9uYW1lKQkJCQlcCisgIGludCBtYXJrZXI7CQkJCQkJCQlcCisgIGludCBfX3RtcF9tYXJrZXJfaW5zY29wZTsJCQkJCQlcCisgIGNvbnN0IGNoYXIgKl9fdG1wX21hcmtlcl9uYW1lID0gbWFya2VyX25hbWU7CQkJCVwKKyAgc3RydWN0IHRtcF9kZWJ1Z190ICBfX3RtcF9tYXJrZXJfc3RydWN0OwkJCQlcCisgIC8qIGRvbid0IGRlbWFuZCBOVUxMLCBqdXN0IGNhc3QgYSB6ZXJvICovCQkJCVwKKyAgc3RydWN0IHRtcF9kZWJ1Z190ICAqX190bXBfbWFya2VyID0gKHN0cnVjdCB0bXBfZGVidWdfdCAqKSAwCisjZGVmaW5lIFRNUF9NQVJLX05BTUUobWFya2VyLCBtYXJrZXJfbmFtZSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1hcmtlciA9IDE7CQkJCQkJCQlcCisgICAgX190bXBfbWFya2VyX2luc2NvcGUgPSAxOwkJCQkJCVwKKyAgICBfX2dtcF90bXBfZGVidWdfbWFyayAgKEFTU0VSVF9GSUxFLCBBU1NFUlRfTElORSwJCQlcCisJCQkgICAmX190bXBfbWFya2VyLCAmX190bXBfbWFya2VyX3N0cnVjdCwJCVwKKwkJCSAgIF9fdG1wX21hcmtlcl9uYW1lLCBtYXJrZXJfbmFtZSk7CQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFRNUF9TQUxMT0MobikJCVRNUF9BTExPQyhuKQorI2RlZmluZSBUTVBfQkFMTE9DKG4pCQlUTVBfQUxMT0MobikKKyNkZWZpbmUgVE1QX0FMTE9DKHNpemUpCQkJCQkJCVwKKyAgX19nbXBfdG1wX2RlYnVnX2FsbG9jIChBU1NFUlRfRklMRSwgQVNTRVJUX0xJTkUsCQkJXAorCQkJIF9fdG1wX21hcmtlcl9pbnNjb3BlLAkJCQlcCisJCQkgJl9fdG1wX21hcmtlciwgX190bXBfbWFya2VyX25hbWUsIHNpemUpCisjZGVmaW5lIFRNUF9GUkVFX05BTUUobWFya2VyLCBtYXJrZXJfbmFtZSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIF9fZ21wX3RtcF9kZWJ1Z19mcmVlICAoQVNTRVJUX0ZJTEUsIEFTU0VSVF9MSU5FLAkJCVwKKwkJCSAgIG1hcmtlciwgJl9fdG1wX21hcmtlciwJCQlcCisJCQkgICBfX3RtcF9tYXJrZXJfbmFtZSwgbWFya2VyX25hbWUpOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIFdBTlRfVE1QX0RFQlVHICovCisKKworLyogQWxsb2NhdGluZyB2YXJpb3VzIHR5cGVzLiAqLworI2RlZmluZSBUTVBfQUxMT0NfVFlQRShuLHR5cGUpICAoKHR5cGUgKikgVE1QX0FMTE9DICgobikgKiBzaXplb2YgKHR5cGUpKSkKKyNkZWZpbmUgVE1QX1NBTExPQ19UWVBFKG4sdHlwZSkgKCh0eXBlICopIFRNUF9TQUxMT0MgKChuKSAqIHNpemVvZiAodHlwZSkpKQorI2RlZmluZSBUTVBfQkFMTE9DX1RZUEUobix0eXBlKSAoKHR5cGUgKikgVE1QX0JBTExPQyAoKG4pICogc2l6ZW9mICh0eXBlKSkpCisjZGVmaW5lIFRNUF9BTExPQ19MSU1CUyhuKSAgICAgIFRNUF9BTExPQ19UWVBFKG4sbXBfbGltYl90KQorI2RlZmluZSBUTVBfU0FMTE9DX0xJTUJTKG4pICAgICBUTVBfU0FMTE9DX1RZUEUobixtcF9saW1iX3QpCisjZGVmaW5lIFRNUF9CQUxMT0NfTElNQlMobikgICAgIFRNUF9CQUxMT0NfVFlQRShuLG1wX2xpbWJfdCkKKyNkZWZpbmUgVE1QX0FMTE9DX01QX1BUUlMobikgICAgVE1QX0FMTE9DX1RZUEUobixtcF9wdHIpCisjZGVmaW5lIFRNUF9TQUxMT0NfTVBfUFRSUyhuKSAgIFRNUF9TQUxMT0NfVFlQRShuLG1wX3B0cikKKyNkZWZpbmUgVE1QX0JBTExPQ19NUF9QVFJTKG4pICAgVE1QX0JBTExPQ19UWVBFKG4sbXBfcHRyKQorCisvKiBJdCdzIG1vcmUgZWZmaWNpZW50IHRvIGFsbG9jYXRlIG9uZSBibG9jayB0aGFuIG1hbnkuICBUaGlzIGlzIGNlcnRhaW5seQorICAgdHJ1ZSBvZiB0aGUgbWFsbG9jIG1ldGhvZHMsIGJ1dCBpdCBjYW4gZXZlbiBiZSB0cnVlIG9mIGFsbG9jYSBpZiB0aGF0CisgICBpbnZvbHZlcyBjb3B5aW5nIGEgY2h1bmsgb2Ygc3RhY2sgKHZhcmlvdXMgUklTQ3MpLCBvciBhIGNhbGwgdG8gYSBzdGFjaworICAgYm91bmRzIGNoZWNrIChtaW5ndykuICBJbiBhbnkgY2FzZSwgd2hlbiBkZWJ1Z2dpbmcga2VlcCBzZXBhcmF0ZSBibG9ja3MKKyAgIHNvIGEgcmVkem9uaW5nIG1hbGxvYyBkZWJ1Z2dlciBjYW4gcHJvdGVjdCBlYWNoIGluZGl2aWR1YWxseS4gICovCisjZGVmaW5lIFRNUF9BTExPQ19MSU1CU18yKHhwLHhzaXplLCB5cCx5c2l6ZSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChXQU5UX1RNUF9ERUJVRykJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkoeHApID0gVE1QX0FMTE9DX0xJTUJTICh4c2l6ZSk7CQkJCQlcCisJKHlwKSA9IFRNUF9BTExPQ19MSU1CUyAoeXNpemUpOwkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCSh4cCkgPSBUTVBfQUxMT0NfTElNQlMgKCh4c2l6ZSkgKyAoeXNpemUpKTsJCQlcCisJKHlwKSA9ICh4cCkgKyAoeHNpemUpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIFRNUF9BTExPQ19MSU1CU18zKHhwLHhzaXplLCB5cCx5c2l6ZSwgenAsenNpemUpCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChXQU5UX1RNUF9ERUJVRykJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkoeHApID0gVE1QX0FMTE9DX0xJTUJTICh4c2l6ZSk7CQkJCQlcCisJKHlwKSA9IFRNUF9BTExPQ19MSU1CUyAoeXNpemUpOwkJCQkJXAorCSh6cCkgPSBUTVBfQUxMT0NfTElNQlMgKHpzaXplKTsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkoeHApID0gVE1QX0FMTE9DX0xJTUJTICgoeHNpemUpICsgKHlzaXplKSArICh6c2l6ZSkpOwkJXAorCSh5cCkgPSAoeHApICsgKHhzaXplKTsJCQkJCQlcCisJKHpwKSA9ICh5cCkgKyAoeXNpemUpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIEZyb20gZ21wLmgsIG5pY2VyIG5hbWVzIGZvciBpbnRlcm5hbCB1c2UuICovCisjZGVmaW5lIENSQVlfUHJhZ21hKHN0cikgICAgICAgICAgICAgICBfX0dNUF9DUkFZX1ByYWdtYShzdHIpCisjZGVmaW5lIE1QTl9DTVAocmVzdWx0LCB4cCwgeXAsIHNpemUpICBfX0dNUE5fQ01QKHJlc3VsdCwgeHAsIHlwLCBzaXplKQorI2RlZmluZSBMSUtFTFkoY29uZCkgICAgICAgICAgICAgICAgICAgX19HTVBfTElLRUxZKGNvbmQpCisjZGVmaW5lIFVOTElLRUxZKGNvbmQpICAgICAgICAgICAgICAgICBfX0dNUF9VTkxJS0VMWShjb25kKQorCisjZGVmaW5lIEFCUyh4KSAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQorI2RlZmluZSBORUdfQ0FTVChULHgpICgtIChfX0dNUF9DQVNUIChULCAoeCkgKyAxKSAtIDEpKQorI2RlZmluZSBBQlNfQ0FTVChULHgpICgoeCkgPj0gMCA/IF9fR01QX0NBU1QgKFQsIHgpIDogTkVHX0NBU1QgKFQseCkpCisjdW5kZWYgTUlOCisjZGVmaW5lIE1JTihsLG8pICgobCkgPCAobykgPyAobCkgOiAobykpCisjdW5kZWYgTUFYCisjZGVmaW5lIE1BWChoLGkpICgoaCkgPiAoaSkgPyAoaCkgOiAoaSkpCisjZGVmaW5lIG51bWJlcm9mKHgpICAoc2l6ZW9mICh4KSAvIHNpemVvZiAoKHgpWzBdKSkKKworLyogRmllbGQgYWNjZXNzIG1hY3Jvcy4gICovCisjZGVmaW5lIFNJWih4KSAoKHgpLT5fbXBfc2l6ZSkKKyNkZWZpbmUgQUJTSVooeCkgQUJTIChTSVogKHgpKQorI2RlZmluZSBQVFIoeCkgKCh4KS0+X21wX2QpCisjZGVmaW5lIEVYUCh4KSAoKHgpLT5fbXBfZXhwKQorI2RlZmluZSBQUkVDKHgpICgoeCktPl9tcF9wcmVjKQorI2RlZmluZSBBTExPQyh4KSAoKHgpLT5fbXBfYWxsb2MpCisjZGVmaW5lIE5VTSh4KSBtcHFfbnVtcmVmKHgpCisjZGVmaW5lIERFTih4KSBtcHFfZGVucmVmKHgpCisKKy8qIG4tMSBpbnZlcnRzIGFueSBsb3cgemVyb3MgYW5kIHRoZSBsb3dlc3Qgb25lIGJpdC4gIElmIG4mKG4tMSkgbGVhdmVzIHplcm8KKyAgIHRoZW4gdGhhdCBsb3dlc3Qgb25lIGJpdCBtdXN0IGhhdmUgYmVlbiB0aGUgb25seSBiaXQgc2V0LiAgbj09MCB3aWxsCisgICByZXR1cm4gdHJ1ZSB0aG91Z2gsIHNvIGF2b2lkIHRoYXQuICAqLworI2RlZmluZSBQT1cyX1AobikgICgoKG4pICYgKChuKSAtIDEpKSA9PSAwKQorCisvKiBUaGlzIGlzIGludGVuZGVkIGZvciBjb25zdGFudCBUSFJFU0hPTERzIG9ubHksIHdoZXJlIHRoZSBjb21waWxlcgorICAgY2FuIGNvbXBsZXRlbHkgZm9sZCB0aGUgcmVzdWx0LiAgKi8KKyNkZWZpbmUgTE9HMkMobikgXAorICgoKG4pID49ICAgIDB4MSkgKyAoKG4pID49ICAgIDB4MikgKyAoKG4pID49ICAgIDB4NCkgKyAoKG4pID49ICAgIDB4OCkgKyBcCisgICgobikgPj0gICAweDEwKSArICgobikgPj0gICAweDIwKSArICgobikgPj0gICAweDQwKSArICgobikgPj0gICAweDgwKSArIFwKKyAgKChuKSA+PSAgMHgxMDApICsgKChuKSA+PSAgMHgyMDApICsgKChuKSA+PSAgMHg0MDApICsgKChuKSA+PSAgMHg4MDApICsgXAorICAoKG4pID49IDB4MTAwMCkgKyAoKG4pID49IDB4MjAwMCkgKyAoKG4pID49IDB4NDAwMCkgKyAoKG4pID49IDB4ODAwMCkpCisKKyNkZWZpbmUgTVBfTElNQl9UX01BWCAgICAgICh+IChtcF9saW1iX3QpIDApCisKKy8qIE11c3QgY2FzdCBVTE9OR19NQVggZXRjIHRvIHVuc2lnbmVkIGxvbmcgZXRjLCBzaW5jZSB0aGV5IG1pZ2h0IG5vdCBiZQorICAgdW5zaWduZWQgb24gYSBLJlIgY29tcGlsZXIuICBJbiBwYXJ0aWN1bGFyIHRoZSBIUC1VWCAxMCBidW5kbGVkIEsmUiBjYworICAgdHJlYXRzIHRoZSBwbGFpbiBkZWNpbWFsIHZhbHVlcyBpbiA8bGltaXRzLmg+IGFzIHNpZ25lZC4gICovCisjZGVmaW5lIFVMT05HX0hJR0hCSVQgICAgICAoVUxPTkdfTUFYIF4gKCh1bnNpZ25lZCBsb25nKSBVTE9OR19NQVggPj4gMSkpCisjZGVmaW5lIFVJTlRfSElHSEJJVCAgICAgICAoVUlOVF9NQVggXiAoKHVuc2lnbmVkKSBVSU5UX01BWCA+PiAxKSkKKyNkZWZpbmUgVVNIUlRfSElHSEJJVCAgICAgIChVU0hSVF9NQVggXiAoKHVuc2lnbmVkIHNob3J0KSBVU0hSVF9NQVggPj4gMSkpCisjZGVmaW5lIEdNUF9MSU1CX0hJR0hCSVQgIChNUF9MSU1CX1RfTUFYIF4gKE1QX0xJTUJfVF9NQVggPj4gMSkpCisKKyNpZiBfX0dNUF9NUF9TSVpFX1RfSU5UCisjZGVmaW5lIE1QX1NJWkVfVF9NQVggICAgICBJTlRfTUFYCisjZGVmaW5lIE1QX1NJWkVfVF9NSU4gICAgICBJTlRfTUlOCisjZWxzZQorI2RlZmluZSBNUF9TSVpFX1RfTUFYICAgICAgTE9OR19NQVgKKyNkZWZpbmUgTVBfU0laRV9UX01JTiAgICAgIExPTkdfTUlOCisjZW5kaWYKKworLyogbXBfZXhwX3QgaXMgdGhlIHNhbWUgYXMgbXBfc2l6ZV90ICovCisjZGVmaW5lIE1QX0VYUF9UX01BWCAgIE1QX1NJWkVfVF9NQVgKKyNkZWZpbmUgTVBfRVhQX1RfTUlOICAgTVBfU0laRV9UX01JTgorCisjZGVmaW5lIExPTkdfSElHSEJJVCAgICAgICBMT05HX01JTgorI2RlZmluZSBJTlRfSElHSEJJVCAgICAgICAgSU5UX01JTgorI2RlZmluZSBTSFJUX0hJR0hCSVQgICAgICAgU0hSVF9NSU4KKworCisjZGVmaW5lIEdNUF9OVU1CX0hJR0hCSVQgIChDTlNUX0xJTUIoMSkgPDwgKEdNUF9OVU1CX0JJVFMtMSkpCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyNkZWZpbmUgR01QX05BSUxfTE9XQklUICAgQ05TVF9MSU1CKDApCisjZWxzZQorI2RlZmluZSBHTVBfTkFJTF9MT1dCSVQgICAoQ05TVF9MSU1CKDEpIDw8IEdNUF9OVU1CX0JJVFMpCisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorLyogU2V0IHZhcmlvdXMgKl9USFJFU0hPTEQgdmFsdWVzIHRvIGJlIHVzZWQgZm9yIG5haWxzLiAgVGh1cyB3ZSBhdm9pZCB1c2luZworICAgY29kZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gcXVhbGlmaWVkLiAgKi8KKworI3VuZGVmICBEQ19ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIERDX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICAgICAgIDUwCisKKyN1bmRlZiBESVZSRU1fMV9OT1JNX1RIUkVTSE9MRAorI3VuZGVmIERJVlJFTV8xX1VOTk9STV9USFJFU0hPTEQKKyN1bmRlZiBNT0RfMV9OT1JNX1RIUkVTSE9MRAorI3VuZGVmIE1PRF8xX1VOTk9STV9USFJFU0hPTEQKKyN1bmRlZiBVU0VfUFJFSU5WX0RJVlJFTV8xCisjdW5kZWYgRElWUkVNXzJfVEhSRVNIT0xECisjdW5kZWYgRElWRVhBQ1RfMV9USFJFU0hPTEQKKyNkZWZpbmUgRElWUkVNXzFfTk9STV9USFJFU0hPTEQgICAgICAgICAgIE1QX1NJWkVfVF9NQVggIC8qIG5vIHByZWludiAqLworI2RlZmluZSBESVZSRU1fMV9VTk5PUk1fVEhSRVNIT0xEICAgICAgICAgTVBfU0laRV9UX01BWCAgLyogbm8gcHJlaW52ICovCisjZGVmaW5lIE1PRF8xX05PUk1fVEhSRVNIT0xEICAgICAgICAgICAgICBNUF9TSVpFX1RfTUFYICAvKiBubyBwcmVpbnYgKi8KKyNkZWZpbmUgTU9EXzFfVU5OT1JNX1RIUkVTSE9MRCAgICAgICAgICAgIE1QX1NJWkVfVF9NQVggIC8qIG5vIHByZWludiAqLworI2RlZmluZSBVU0VfUFJFSU5WX0RJVlJFTV8xICAgICAgICAgICAgICAgMCAgLyogbm8gcHJlaW52ICovCisjZGVmaW5lIERJVlJFTV8yX1RIUkVTSE9MRCAgICAgICAgICAgICAgICBNUF9TSVpFX1RfTUFYICAvKiBubyBwcmVpbnYgKi8KKworLyogbXBuL2dlbmVyaWMvbXVsX2ZmdC5jIGlzIG5vdCBuYWlscy1jYXBhYmxlLiAqLworI3VuZGVmICBNVUxfRkZUX1RIUkVTSE9MRAorI3VuZGVmICBTUVJfRkZUX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICBNUF9TSVpFX1RfTUFYCisjZGVmaW5lIFNRUl9GRlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIE1QX1NJWkVfVF9NQVgKKyNlbmRpZgorCisvKiBTd2FwIG1hY3Jvcy4gKi8KKworI2RlZmluZSBNUF9MSU1CX1RfU1dBUCh4LCB5KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19tcF9saW1iX3Rfc3dhcF9fdG1wID0gKHgpOwkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXBfbGltYl90X3N3YXBfX3RtcDsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBfU0laRV9UX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc2l6ZV90IF9fbXBfc2l6ZV90X3N3YXBfX3RtcCA9ICh4KTsJCQkJXAorICAgICh4KSA9ICh5KTsJCQkJCQkJCVwKKyAgICAoeSkgPSBfX21wX3NpemVfdF9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBfUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyIF9fbXBfcHRyX3N3YXBfX3RtcCA9ICh4KTsJCQkJCVwKKyAgICAoeCkgPSAoeSk7CQkJCQkJCQlcCisgICAgKHkpID0gX19tcF9wdHJfc3dhcF9fdG1wOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBfU1JDUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc3JjcHRyIF9fbXBfc3JjcHRyX3N3YXBfX3RtcCA9ICh4KTsJCQkJXAorICAgICh4KSA9ICh5KTsJCQkJCQkJCVwKKyAgICAoeSkgPSBfX21wX3NyY3B0cl9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX1BUUl9TV0FQKHhwLHhzLCB5cCx5cykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBNUF9QVFJfU1dBUCAoeHAsIHlwKTsJCQkJCQlcCisgICAgTVBfU0laRV9UX1NXQVAgKHhzLCB5cyk7CQkJCQkJXAorICB9IHdoaWxlKDApCisjZGVmaW5lIE1QTl9TUkNQVFJfU1dBUCh4cCx4cywgeXAseXMpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgTVBfU1JDUFRSX1NXQVAgKHhwLCB5cCk7CQkJCQkJXAorICAgIE1QX1NJWkVfVF9TV0FQICh4cywgeXMpOwkJCQkJCVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIE1QWl9QVFJfU1dBUCh4LCB5KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcHpfcHRyIF9fbXB6X3B0cl9zd2FwX190bXAgPSAoeCk7CQkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXB6X3B0cl9zd2FwX190bXA7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBNUFpfU1JDUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXB6X3NyY3B0ciBfX21wel9zcmNwdHJfc3dhcF9fdG1wID0gKHgpOwkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXB6X3NyY3B0cl9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBRX1BUUl9TV0FQKHgsIHkpCQkJCQkJXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wcV9wdHIgX19tcHFfcHRyX3N3YXBfX3RtcCA9ICh4KTsJCQkJCVwKKyAgICAoeCkgPSAoeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeSkgPSBfX21wcV9wdHJfc3dhcF9fdG1wOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBRX1NSQ1BUUl9TV0FQKHgsIHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcHFfc3JjcHRyIF9fbXBxX3NyY3B0cl9zd2FwX190bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeCkgPSAoeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeSkgPSBfX21wcV9zcmNwdHJfc3dhcF9fdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBFbmhhbmNlbWVudDogX19nbXBfYWxsb2NhdGVfZnVuYyBjb3VsZCBoYXZlICJfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkiLAorICAgYnV0IGN1cnJlbnQgZ2NjICgzLjApIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHRoYXQuICAqLworX19HTVBfREVDTFNQRUMgZXh0ZXJuIHZvaWQgKiAoKl9fZ21wX2FsbG9jYXRlX2Z1bmMpIChzaXplX3QpOworX19HTVBfREVDTFNQRUMgZXh0ZXJuIHZvaWQgKiAoKl9fZ21wX3JlYWxsb2NhdGVfZnVuYykgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOworX19HTVBfREVDTFNQRUMgZXh0ZXJuIHZvaWQgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHZvaWQgKiwgc2l6ZV90KTsKKworX19HTVBfREVDTFNQRUMgdm9pZCAqX19nbXBfZGVmYXVsdF9hbGxvY2F0ZSAoc2l6ZV90KTsKK19fR01QX0RFQ0xTUEVDIHZvaWQgKl9fZ21wX2RlZmF1bHRfcmVhbGxvY2F0ZSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCk7CitfX0dNUF9ERUNMU1BFQyB2b2lkIF9fZ21wX2RlZmF1bHRfZnJlZSAodm9pZCAqLCBzaXplX3QpOworCisjZGVmaW5lIF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRShuLHR5cGUpIFwKKyAgKCh0eXBlICopICgqX19nbXBfYWxsb2NhdGVfZnVuYykgKChuKSAqIHNpemVvZiAodHlwZSkpKQorI2RlZmluZSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTKG4pICAgX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChuLCBtcF9saW1iX3QpCisKKyNkZWZpbmUgX19HTVBfUkVBTExPQ0FURV9GVU5DX1RZUEUocCwgb2xkX3NpemUsIG5ld19zaXplLCB0eXBlKQkJXAorICAoKHR5cGUgKikgKCpfX2dtcF9yZWFsbG9jYXRlX2Z1bmMpCQkJCQlcCisgICAocCwgKG9sZF9zaXplKSAqIHNpemVvZiAodHlwZSksIChuZXdfc2l6ZSkgKiBzaXplb2YgKHR5cGUpKSkKKyNkZWZpbmUgX19HTVBfUkVBTExPQ0FURV9GVU5DX0xJTUJTKHAsIG9sZF9zaXplLCBuZXdfc2l6ZSkJCVwKKyAgX19HTVBfUkVBTExPQ0FURV9GVU5DX1RZUEUocCwgb2xkX3NpemUsIG5ld19zaXplLCBtcF9saW1iX3QpCisKKyNkZWZpbmUgX19HTVBfRlJFRV9GVU5DX1RZUEUocCxuLHR5cGUpICgqX19nbXBfZnJlZV9mdW5jKSAocCwgKG4pICogc2l6ZW9mICh0eXBlKSkKKyNkZWZpbmUgX19HTVBfRlJFRV9GVU5DX0xJTUJTKHAsbikgICAgIF9fR01QX0ZSRUVfRlVOQ19UWVBFIChwLCBuLCBtcF9saW1iX3QpCisKKyNkZWZpbmUgX19HTVBfUkVBTExPQ0FURV9GVU5DX01BWUJFKHB0ciwgb2xkc2l6ZSwgbmV3c2l6ZSkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoKG9sZHNpemUpICE9IChuZXdzaXplKSkJCQkJCQlcCisgICAgICAocHRyKSA9ICgqX19nbXBfcmVhbGxvY2F0ZV9mdW5jKSAocHRyLCBvbGRzaXplLCBuZXdzaXplKTsJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTUFZQkVfVFlQRShwdHIsIG9sZHNpemUsIG5ld3NpemUsIHR5cGUpCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoKG9sZHNpemUpICE9IChuZXdzaXplKSkJCQkJCQlcCisgICAgICAocHRyKSA9ICh0eXBlICopICgqX19nbXBfcmVhbGxvY2F0ZV9mdW5jKQkJCQlcCisJKHB0ciwgKG9sZHNpemUpICogc2l6ZW9mICh0eXBlKSwgKG5ld3NpemUpICogc2l6ZW9mICh0eXBlKSk7CVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBEdW1teSBmb3Igbm9uLWdjYywgY29kZSBpbnZvbHZpbmcgaXQgd2lsbCBnbyBkZWFkLiAqLworI2lmICEgZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMgorI2RlZmluZSBfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSAgIDAKKyNlbmRpZgorCisKKy8qIEluIGdjYyAyLjk2IGFuZCB1cCBvbiBpMzg2LCB0YWlsIGNhbGxzIGFyZSBvcHRpbWl6ZWQgdG8ganVtcHMgaWYgdGhlCisgICBzdGFjayB1c2FnZSBpcyBjb21wYXRpYmxlLiAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0gKE4pKSkgaGVscHMgYnkKKyAgIHB1dHRpbmcgbGVhZGluZyBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycywgYXZvaWRpbmcgZXh0cmEgc3RhY2suCisKKyAgIHJlZ3Bhcm0gY2Fubm90IGJlIHVzZWQgd2l0aCBjYWxscyBnb2luZyB0aHJvdWdoIHRoZSBQTFQsIGJlY2F1c2UgdGhlCisgICBiaW5kaW5nIGNvZGUgdGhlcmUgbWF5IGNsb2JiZXIgdGhlIHJlZ2lzdGVycyAoJWVheCwgJWVkeCwgJWVjeCkgdXNlZCBmb3IKKyAgIHRoZSByZWdwYXJtIHBhcmFtZXRlcnMuICBDYWxscyB0byBsb2NhbCAoaWUuIHN0YXRpYykgZnVuY3Rpb25zIGNvdWxkCisgICBzdGlsbCB1c2UgdGhpcywgaWYgd2UgY2FyZWQgdG8gZGlmZmVyZW50aWF0ZSBsb2NhbHMgYW5kIGdsb2JhbHMuCisKKyAgIE9uIGF0aGxvbi11bmtub3duLWZyZWVic2Q0Ljkgd2l0aCBnY2MgMy4zLjMsIHJlZ3Bhcm0gY2Fubm90IGJlIHVzZWQgd2l0aAorICAgLXAgb3IgLXBnIHByb2ZpbGluZywgc2luY2UgdGhhdCB2ZXJzaW9uIG9mIGdjYyBkb2Vzbid0IHJlYWxpemUgdGhlCisgICAubWNvdW50IGNhbGxzIHdpbGwgY2xvYmJlciB0aGUgcGFyYW1ldGVyIHJlZ2lzdGVycy4gIE90aGVyIHN5c3RlbXMgYXJlCisgICBvaywgbGlrZSBkZWJpYW4gd2l0aCBnbGliYyAyLjMuMiAobWNvdW50IGRvZXNuJ3QgY2xvYmJlciksIGJ1dCB3ZSBkb24ndAorICAgYm90aGVyIHRvIHRyeSB0byBkZXRlY3QgdGhpcy4gIHJlZ3Bhcm0gaXMgb25seSBhbiBvcHRpbWl6YXRpb24gc28gd2UganVzdAorICAgZGlzYWJsZSBpdCB3aGVuIHByb2ZpbGluZyAocHJvZmlsaW5nIGJlaW5nIGEgc2xvd2Rvd24gYW55d2F5KS4gICovCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYgJiYgX19HTVBfR05VQ19QUkVSRVEgKDIsOTYpICYmICEgZGVmaW5lZCAoUElDKSBcCisgICYmICEgV0FOVF9QUk9GSUxJTkdfUFJPRiAmJiAhIFdBTlRfUFJPRklMSU5HX0dQUk9GCisjZGVmaW5lIFVTRV9MRUFESU5HX1JFR1BBUk0gMQorI2Vsc2UKKyNkZWZpbmUgVVNFX0xFQURJTkdfUkVHUEFSTSAwCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBhbHRlcmluZyBwYXJhbWV0ZXIgb3JkZXIgYWNjb3JkaW5nIHRvIHJlZ3Bhcm0gdXNhZ2UuICovCisjaWYgVVNFX0xFQURJTkdfUkVHUEFSTQorI2RlZmluZSBSRUdQQVJNXzJfMShhLGIseCkgICAgeCxhLGIKKyNkZWZpbmUgUkVHUEFSTV8zXzEoYSxiLGMseCkgIHgsYSxiLGMKKyNkZWZpbmUgUkVHUEFSTV9BVFRSKG4pIF9fYXR0cmlidXRlX18gKChyZWdwYXJtIChuKSkpCisjZWxzZQorI2RlZmluZSBSRUdQQVJNXzJfMShhLGIseCkgICAgYSxiLHgKKyNkZWZpbmUgUkVHUEFSTV8zXzEoYSxiLGMseCkgIGEsYixjLHgKKyNkZWZpbmUgUkVHUEFSTV9BVFRSKG4pCisjZW5kaWYKKworCisvKiBBU01fTCBnaXZlcyBhIGxvY2FsIGxhYmVsIGZvciBhIGdjYyBhc20gYmxvY2ssIGZvciB1c2Ugd2hlbiB0ZW1wb3JhcnkKKyAgIGxvY2FsIGxhYmVscyBsaWtlICIxOiIgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSwgd2hpY2ggaXMgdGhlIGNhc2UgZm9yCisgICBpbnN0YW5jZSBvbiB0aGUgeDg2cyAodGhlIFNDTyBhc3NlbWJsZXIgZG9lc24ndCBzdXBwb3J0IHRoZW0pLgorCisgICBUaGUgbGFiZWwgZ2VuZXJhdGVkIGlzIG1hZGUgdW5pcXVlIGJ5IGluY2x1ZGluZyAiJT0iIHdoaWNoIGlzIGEgdW5pcXVlCisgICBudW1iZXIgZm9yIGVhY2ggaW5zbi4gIFRoaXMgZW5zdXJlcyB0aGUgc2FtZSBuYW1lIGNhbiBiZSB1c2VkIGluIG11bHRpcGxlCisgICBhc20gYmxvY2tzLCBwZXJoYXBzIHZpYSBhIG1hY3JvLiAgU2luY2UganVtcHMgYmV0d2VlbiBhc20gYmxvY2tzIGFyZSBub3QKKyAgIGFsbG93ZWQgdGhlcmUncyBubyBuZWVkIGZvciBhIGxhYmVsIHRvIGJlIHVzYWJsZSBvdXRzaWRlIGEgc2luZ2xlCisgICBibG9jay4gICovCisKKyNkZWZpbmUgQVNNX0wobmFtZSkgIExTWU1fUFJFRklYICJhc21fJT1fIiAjbmFtZQorCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2CisjaWYgMAorLyogRklYTUU6IENoZWNrIHRoYXQgdGhlc2UgYWN0dWFsbHkgaW1wcm92ZSB0aGluZ3MuCisgICBGSVhNRTogTmVlZCBhIGNsZCBhZnRlciBlYWNoIHN0ZC4KKyAgIEZJWE1FOiBDYW4ndCBoYXZlIGlucHV0cyBpbiBjbG9iYmVyZWQgcmVnaXN0ZXJzLCBtdXN0IGRlc2NyaWJlIHRoZW0gYXMKKyAgIGR1bW15IG91dHB1dHMsIGFuZCBhZGQgdm9sYXRpbGUuICovCisjZGVmaW5lIE1QTl9DT1BZX0lOQ1IoRFNULCBTUkMsIE4pCQkJCQlcCisgIF9fYXNtX18gKCJjbGRcblx0cmVwXG5cdG1vdnNsIiA6IDoJCQkJCVwKKwkgICAiRCIgKERTVCksICJTIiAoU1JDKSwgImMiIChOKSA6CQkJCVwKKwkgICAiY3giLCAiZGkiLCAic2kiLCAibWVtb3J5IikKKyNkZWZpbmUgTVBOX0NPUFlfREVDUihEU1QsIFNSQywgTikJCQkJCVwKKyAgX19hc21fXyAoInN0ZFxuXHRyZXBcblx0bW92c2wiIDogOgkJCQkJXAorCSAgICJEIiAoKERTVCkgKyAoTikgLSAxKSwgIlMiICgoU1JDKSArIChOKSAtIDEpLCAiYyIgKE4pIDoJXAorCSAgICJjeCIsICJkaSIsICJzaSIsICJtZW1vcnkiKQorI2VuZGlmCisjZW5kaWYKKworCitfX0dNUF9ERUNMU1BFQyB2b2lkIF9fZ21wel9hb3JzbXVsXzEgKFJFR1BBUk1fM18xIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9saW1iX3QsIG1wX3NpemVfdCkpIFJFR1BBUk1fQVRUUigxKTsKKyNkZWZpbmUgbXB6X2FvcnNtdWxfMSh3LHUsdixzdWIpICBfX2dtcHpfYW9yc211bF8xIChSRUdQQVJNXzNfMSAodywgdSwgdiwgc3ViKSkKKworI2RlZmluZSBtcHpfbl9wb3dfdWkgX19nbXB6X25fcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgIG1wel9uX3Bvd191aSAobXB6X3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGxvbmcpOworCisKKyNkZWZpbmUgbXBuX2FkZG11bF8xYyBfX01QTihhZGRtdWxfMWMpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZG11bF8xYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCisjaWZuZGVmIG1wbl9hZGRtdWxfMiAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9hZGRtdWxfMiBfX01QTihhZGRtdWxfMikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbXVsXzIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYWRkbXVsXzMgX19NUE4oYWRkbXVsXzMpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZG11bF8zIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworCisjZGVmaW5lIG1wbl9hZGRtdWxfNCBfX01QTihhZGRtdWxfNCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbXVsXzQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKyNkZWZpbmUgbXBuX2FkZG11bF81IF9fTVBOKGFkZG11bF81KQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRtdWxfNSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworI2RlZmluZSBtcG5fYWRkbXVsXzYgX19NUE4oYWRkbXVsXzYpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZG11bF82IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworCisjZGVmaW5lIG1wbl9hZGRtdWxfNyBfX01QTihhZGRtdWxfNykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbXVsXzcgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKyNkZWZpbmUgbXBuX2FkZG11bF84IF9fTVBOKGFkZG11bF84KQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRtdWxfOCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworLyogQWx0ZXJuYXRpdmUgZW50cnkgcG9pbnQgaW4gbXBuX2FkZG11bF8yIGZvciB0aGUgYmVuZWZpdCBvZiBtcG5fc3FyX2Jhc2VjYXNlLiAgKi8KKyNkZWZpbmUgbXBuX2FkZG11bF8ycyBfX01QTihhZGRtdWxfMnMpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZG11bF8ycyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworLyogT3ZlcnJpZGUgbXBuX2FkZGxzaDFfbiwgbXBuX2FkZGxzaDJfbiwgbXBuX3N1YmxzaDFfbiwgZXRjIHdpdGggbXBuX2FkZGxzaF9uLAorICAgZXRjIHdoZW4gIUhBVkVfTkFUSVZFIHRoZSBmb3JtZXIgYnV0IEhBVkVfTkFUSVZFXyB0aGUgbGF0dGVyLiAgU2ltaWxhcmx5LAorICAgb3ZlcnJpZGUgZm9vX2lwMSBmdW5jdGlvbnMgd2l0aCBmb28uICBXZSB0aGVuIGxpZSBhbmQgc2F5IHRoZXNlIG1hY3JvcworICAgcmVwcmVzZW50IG5hdGl2ZSBmdW5jdGlvbnMsIGJ1dCBsZWF2ZSBhIHRyYWNlIGJ5IHVzaW5nIHRoZSB2YWx1ZSAyIHJhdGhlcgorICAgdGhhbiAxLiAgKi8KKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbiAmJiAhIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyNkZWZpbmUgbXBuX2FkZGxzaDFfbihhLGIsYyxkKSAgICAgICAgICBtcG5fYWRkbHNoX24oYSxiLGMsZCwxKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uICAgICAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uYyAmJiAhIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25jCisjZGVmaW5lIG1wbl9hZGRsc2gxX25jKGEsYixjLGQseCkgICAgICAgbXBuX2FkZGxzaF9uYyhhLGIsYyxkLDEseCkKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbmMgICAgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24gJiYgISBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorI2RlZmluZSBtcG5fYWRkbHNoMV9uX2lwMShhLGIsbikgICAgICAgIG1wbl9hZGRsc2gxX24oYSxhLGIsbikKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbl9pcDEgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25jICYmICEgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbmNfaXAxCisjZGVmaW5lIG1wbl9hZGRsc2gxX25jX2lwMShhLGIsbixjKSAgICAgbXBuX2FkZGxzaDFfbmMoYSxhLGIsbixjKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uY19pcDEgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uICYmICEgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbgorI2RlZmluZSBtcG5fYWRkbHNoMl9uKGEsYixjLGQpICAgICAgICAgIG1wbl9hZGRsc2hfbihhLGIsYyxkLDIpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX24gICAgICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX25jICYmICEgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbmMKKyNkZWZpbmUgbXBuX2FkZGxzaDJfbmMoYSxiLGMsZCx4KSAgICAgICBtcG5fYWRkbHNoX25jKGEsYixjLGQsMix4KQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uYyAgICAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbiAmJiAhIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25faXAxCisjZGVmaW5lIG1wbl9hZGRsc2gyX25faXAxKGEsYixuKSAgICAgICAgbXBuX2FkZGxzaDJfbihhLGEsYixuKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uX2lwMSAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbmMgJiYgISBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uY19pcDEKKyNkZWZpbmUgbXBuX2FkZGxzaDJfbmNfaXAxKGEsYixuLGMpICAgICBtcG5fYWRkbHNoMl9uYyhhLGEsYixuLGMpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25jX2lwMSAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoX24gJiYgISBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uCisjZGVmaW5lIG1wbl9zdWJsc2gxX24oYSxiLGMsZCkgICAgICAgICAgbXBuX3N1YmxzaF9uKGEsYixjLGQsMSkKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbiAgICAgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2hfbmMgJiYgISBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uYworI2RlZmluZSBtcG5fc3VibHNoMV9uYyhhLGIsYyxkLHgpICAgICAgIG1wbl9zdWJsc2hfbmMoYSxiLGMsZCwxLHgpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX25jICAgICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uICYmICEgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbl9pcDEKKyNkZWZpbmUgbXBuX3N1YmxzaDFfbl9pcDEoYSxiLG4pICAgICAgICBtcG5fc3VibHNoMV9uKGEsYSxiLG4pCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX25faXAxICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uYyAmJiAhIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX25jX2lwMQorI2RlZmluZSBtcG5fc3VibHNoMV9uY19pcDEoYSxiLG4sYykgICAgIG1wbl9zdWJsc2gxX25jKGEsYSxiLG4sYykKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbmNfaXAxICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2hfbiAmJiAhIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX24KKyNkZWZpbmUgbXBuX3N1YmxzaDJfbihhLGIsYyxkKSAgICAgICAgICBtcG5fc3VibHNoX24oYSxiLGMsZCwyKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fc3VibHNoMl9uICAgICAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uYyAmJiAhIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX25jCisjZGVmaW5lIG1wbl9zdWJsc2gyX25jKGEsYixjLGQseCkgICAgICAgbXBuX3N1YmxzaF9uYyhhLGIsYyxkLDIseCkKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbmMgICAgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX24gJiYgISBIQVZFX05BVElWRV9tcG5fc3VibHNoMl9uX2lwMQorI2RlZmluZSBtcG5fc3VibHNoMl9uX2lwMShhLGIsbikgICAgICAgIG1wbl9zdWJsc2gyX24oYSxhLGIsbikKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbl9pcDEgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX25jICYmICEgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbmNfaXAxCisjZGVmaW5lIG1wbl9zdWJsc2gyX25jX2lwMShhLGIsbixjKSAgICAgbXBuX3N1YmxzaDJfbmMoYSxhLGIsbixjKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fc3VibHNoMl9uY19pcDEgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaF9uICYmICEgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbgorI2RlZmluZSBtcG5fcnNibHNoMV9uKGEsYixjLGQpICAgICAgICAgIG1wbl9yc2Jsc2hfbihhLGIsYyxkLDEpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX24gICAgICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoX25jICYmICEgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbmMKKyNkZWZpbmUgbXBuX3JzYmxzaDFfbmMoYSxiLGMsZCx4KSAgICAgICBtcG5fcnNibHNoX25jKGEsYixjLGQsMSx4KQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uYyAgICAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbiAmJiAhIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX25faXAxCisjZGVmaW5lIG1wbl9yc2Jsc2gxX25faXAxKGEsYixuKSAgICAgICAgbXBuX3JzYmxzaDFfbihhLGEsYixuKQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uX2lwMSAgIDIKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbmMgJiYgISBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uY19pcDEKKyNkZWZpbmUgbXBuX3JzYmxzaDFfbmNfaXAxKGEsYixuLGMpICAgICBtcG5fcnNibHNoMV9uYyhhLGEsYixuLGMpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX25jX2lwMSAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoX24gJiYgISBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uCisjZGVmaW5lIG1wbl9yc2Jsc2gyX24oYSxiLGMsZCkgICAgICAgICAgbXBuX3JzYmxzaF9uKGEsYixjLGQsMikKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbiAgICAgICAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2hfbmMgJiYgISBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uYworI2RlZmluZSBtcG5fcnNibHNoMl9uYyhhLGIsYyxkLHgpICAgICAgIG1wbl9yc2Jsc2hfbmMoYSxiLGMsZCwyLHgpCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gyX25jICAgICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uICYmICEgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbl9pcDEKKyNkZWZpbmUgbXBuX3JzYmxzaDJfbl9pcDEoYSxiLG4pICAgICAgICBtcG5fcnNibHNoMl9uKGEsYSxiLG4pCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gyX25faXAxICAgMgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uYyAmJiAhIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gyX25jX2lwMQorI2RlZmluZSBtcG5fcnNibHNoMl9uY19pcDEoYSxiLG4sYykgICAgIG1wbl9yc2Jsc2gyX25jKGEsYSxiLG4sYykKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbmNfaXAxICAyCisjZW5kaWYKKworCisjaWZuZGVmIG1wbl9hZGRsc2gxX24KKyNkZWZpbmUgbXBuX2FkZGxzaDFfbiBfX01QTihhZGRsc2gxX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZGxzaDFfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBtcG5fYWRkbHNoMV9uYworI2RlZmluZSBtcG5fYWRkbHNoMV9uYyBfX01QTihhZGRsc2gxX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRsc2gxX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX2FkZGxzaDFfbl9pcDEKKyNkZWZpbmUgbXBuX2FkZGxzaDFfbl9pcDEgX19NUE4oYWRkbHNoMV9uX2lwMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbHNoMV9uX2lwMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX2FkZGxzaDFfbmNfaXAxCisjZGVmaW5lIG1wbl9hZGRsc2gxX25jX2lwMSBfX01QTihhZGRsc2gxX25jX2lwMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbHNoMV9uY19pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisjZW5kaWYKKworI2lmbmRlZiBtcG5fYWRkbHNoMl9uCisjZGVmaW5lIG1wbl9hZGRsc2gyX24gX19NUE4oYWRkbHNoMl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRsc2gyX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX2FkZGxzaDJfbmMKKyNkZWZpbmUgbXBuX2FkZGxzaDJfbmMgX19NUE4oYWRkbHNoMl9uYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbHNoMl9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9hZGRsc2gyX25faXAxCisjZGVmaW5lIG1wbl9hZGRsc2gyX25faXAxIF9fTVBOKGFkZGxzaDJfbl9pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZGxzaDJfbl9pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9hZGRsc2gyX25jX2lwMQorI2RlZmluZSBtcG5fYWRkbHNoMl9uY19pcDEgX19NUE4oYWRkbHNoMl9uY19pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZGxzaDJfbmNfaXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2VuZGlmCisKKyNpZm5kZWYgbXBuX2FkZGxzaF9uCisjZGVmaW5lIG1wbl9hZGRsc2hfbiBfX01QTihhZGRsc2hfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbHNoX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorI2lmbmRlZiBtcG5fYWRkbHNoX25jCisjZGVmaW5lIG1wbl9hZGRsc2hfbmMgX19NUE4oYWRkbHNoX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRsc2hfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50LCBtcF9saW1iX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9hZGRsc2hfbl9pcDEKKyNkZWZpbmUgbXBuX2FkZGxzaF9uX2lwMSBfX01QTihhZGRsc2hfbl9pcDEpCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkbHNoX25faXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworI2VuZGlmCisjaWZuZGVmIG1wbl9hZGRsc2hfbmNfaXAxCisjZGVmaW5lIG1wbl9hZGRsc2hfbmNfaXAxIF9fTVBOKGFkZGxzaF9uY19pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZGxzaF9uY19pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCwgbXBfbGltYl90KTsKKyNlbmRpZgorCisjaWZuZGVmIG1wbl9zdWJsc2gxX24KKyNkZWZpbmUgbXBuX3N1YmxzaDFfbiBfX01QTihzdWJsc2gxX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1YmxzaDFfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBtcG5fc3VibHNoMV9uYworI2RlZmluZSBtcG5fc3VibHNoMV9uYyBfX01QTihzdWJsc2gxX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJsc2gxX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX3N1YmxzaDFfbl9pcDEKKyNkZWZpbmUgbXBuX3N1YmxzaDFfbl9pcDEgX19NUE4oc3VibHNoMV9uX2lwMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibHNoMV9uX2lwMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX3N1YmxzaDFfbmNfaXAxCisjZGVmaW5lIG1wbl9zdWJsc2gxX25jX2lwMSBfX01QTihzdWJsc2gxX25jX2lwMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibHNoMV9uY19pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisjZW5kaWYKKworI2lmbmRlZiBtcG5fc3VibHNoMl9uCisjZGVmaW5lIG1wbl9zdWJsc2gyX24gX19NUE4oc3VibHNoMl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJsc2gyX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX3N1YmxzaDJfbmMKKyNkZWZpbmUgbXBuX3N1YmxzaDJfbmMgX19NUE4oc3VibHNoMl9uYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibHNoMl9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9zdWJsc2gyX25faXAxCisjZGVmaW5lIG1wbl9zdWJsc2gyX25faXAxIF9fTVBOKHN1YmxzaDJfbl9pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1YmxzaDJfbl9pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9zdWJsc2gyX25jX2lwMQorI2RlZmluZSBtcG5fc3VibHNoMl9uY19pcDEgX19NUE4oc3VibHNoMl9uY19pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1YmxzaDJfbmNfaXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2VuZGlmCisKKyNpZm5kZWYgbXBuX3N1YmxzaF9uCisjZGVmaW5lIG1wbl9zdWJsc2hfbiBfX01QTihzdWJsc2hfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibHNoX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorI2lmbmRlZiBtcG5fc3VibHNoX25jCisjZGVmaW5lIG1wbl9zdWJsc2hfbmMgX19NUE4oc3VibHNoX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJsc2hfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50LCBtcF9saW1iX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9zdWJsc2hfbl9pcDEKKyNkZWZpbmUgbXBuX3N1YmxzaF9uX2lwMSBfX01QTihzdWJsc2hfbl9pcDEpCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3VibHNoX25faXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworI2VuZGlmCisjaWZuZGVmIG1wbl9zdWJsc2hfbmNfaXAxCisjZGVmaW5lIG1wbl9zdWJsc2hfbmNfaXAxIF9fTVBOKHN1YmxzaF9uY19pcDEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1YmxzaF9uY19pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCwgbXBfbGltYl90KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9yc2Jsc2gxX24gX19NUE4ocnNibHNoMV9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl9zaWduZWRfdCBtcG5fcnNibHNoMV9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5fcnNibHNoMV9uYyBfX01QTihyc2Jsc2gxX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl9zaWduZWRfdCBtcG5fcnNibHNoMV9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9yc2Jsc2gyX24gX19NUE4ocnNibHNoMl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl9zaWduZWRfdCBtcG5fcnNibHNoMl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5fcnNibHNoMl9uYyBfX01QTihyc2Jsc2gyX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl9zaWduZWRfdCBtcG5fcnNibHNoMl9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9yc2Jsc2hfbiBfX01QTihyc2Jsc2hfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfc2lnbmVkX3QgbXBuX3JzYmxzaF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCk7CisjZGVmaW5lIG1wbl9yc2Jsc2hfbmMgX19NUE4ocnNibHNoX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl9zaWduZWRfdCBtcG5fcnNibHNoX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fcnNoMWFkZF9uIF9fTVBOKHJzaDFhZGRfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcnNoMWFkZF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2RlZmluZSBtcG5fcnNoMWFkZF9uYyBfX01QTihyc2gxYWRkX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9yc2gxYWRkX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX3JzaDFzdWJfbiBfX01QTihyc2gxc3ViX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3JzaDFzdWJfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNkZWZpbmUgbXBuX3JzaDFzdWJfbmMgX19NUE4ocnNoMXN1Yl9uYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcnNoMXN1Yl9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjaWZuZGVmIG1wbl9sc2hpZnRjICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX2xzaGlmdGMgX19NUE4obHNoaWZ0YykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbHNoaWZ0YyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9hZGRfZXJyMV9uICBfX01QTihhZGRfZXJyMV9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRfZXJyMV9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9hZGRfZXJyMl9uICBfX01QTihhZGRfZXJyMl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRfZXJyMl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2FkZF9lcnIzX24gIF9fTVBOKGFkZF9lcnIzX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZF9lcnIzX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9zdWJfZXJyMV9uICBfX01QTihzdWJfZXJyMV9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfZXJyMV9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9zdWJfZXJyMl9uICBfX01QTihzdWJfZXJyMl9uKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfZXJyMl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX3N1Yl9lcnIzX24gIF9fTVBOKHN1Yl9lcnIzX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1Yl9lcnIzX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9hZGRfbl9zdWJfbiBfX01QTihhZGRfbl9zdWJfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkX25fc3ViX24gKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fYWRkX25fc3ViX25jIF9fTVBOKGFkZF9uX3N1Yl9uYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkX25fc3ViX25jIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fYWRkYWRkbXVsXzFtc2IwIF9fTVBOKGFkZGFkZG11bF8xbXNiMCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkYWRkbXVsXzFtc2IwIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fZGl2cmVtXzFjIF9fTVBOKGRpdnJlbV8xYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2cmVtXzFjIChtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSBtcG5fZHVtcCBfX01QTihkdW1wKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fZHVtcCAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9maWIyX3VpIF9fTVBOKGZpYjJfdWkpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX2ZpYjJfdWkgKG1wX3B0ciwgbXBfcHRyLCB1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBtcG5fZmliMm0gX19NUE4oZmliMm0pCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBuX2ZpYjJtIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fc3Ryb25nZmlibyBfX01QTihzdHJvbmdmaWJvKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9zdHJvbmdmaWJvIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworLyogUmVtYXAgbmFtZXMgb2YgaW50ZXJuYWwgbXBuIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIF9fY2x6X3RhYiAgICAgICAgICAgICAgIF9fTVBOKGNsel90YWIpCisjZGVmaW5lIG1wbl91ZGl2X3dfc2RpdgkJX19NUE4odWRpdl93X3NkaXYpCisKKyNkZWZpbmUgbXBuX2phY29iaV9iYXNlIF9fTVBOKGphY29iaV9iYXNlKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9qYWNvYmlfYmFzZSAobXBfbGltYl90LCBtcF9saW1iX3QsIGludCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lIG1wbl9qYWNvYmlfMiBfX01QTihqYWNvYmlfMikKK19fR01QX0RFQ0xTUEVDIGludCBtcG5famFjb2JpXzIgKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCB1bnNpZ25lZCk7CisKKyNkZWZpbmUgbXBuX2phY29iaV9uIF9fTVBOKGphY29iaV9uKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9qYWNvYmlfbiAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgdW5zaWduZWQpOworCisjZGVmaW5lIG1wbl9tb2RfMWMgX19NUE4obW9kXzFjKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMWMgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX211bF8xYyBfX01QTihtdWxfMWMpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF8xYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9tdWxfMiBfX01QTihtdWxfMikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVsXzIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKyNkZWZpbmUgbXBuX211bF8zIF9fTVBOKG11bF8zKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdWxfMyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworI2RlZmluZSBtcG5fbXVsXzQgX19NUE4obXVsXzQpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF80IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworCisjZGVmaW5lIG1wbl9tdWxfNSBfX01QTihtdWxfNSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVsXzUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKyNkZWZpbmUgbXBuX211bF82IF9fTVBOKG11bF82KQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdWxfNiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKworI2lmbmRlZiBtcG5fbXVsX2Jhc2VjYXNlICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX211bF9iYXNlY2FzZSBfX01QTihtdWxfYmFzZWNhc2UpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tdWxfYmFzZWNhc2UgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9tdWxsb19uIF9fTVBOKG11bGxvX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tdWxsb19uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjaWZuZGVmIG1wbl9tdWxsb19iYXNlY2FzZSAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9tdWxsb19iYXNlY2FzZSBfX01QTihtdWxsb19iYXNlY2FzZSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX211bGxvX2Jhc2VjYXNlIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisKKyNpZm5kZWYgbXBuX3Nxcl9iYXNlY2FzZSAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9zcXJfYmFzZWNhc2UgX19NUE4oc3FyX2Jhc2VjYXNlKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc3FyX2Jhc2VjYXNlIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9zcXJsbyBfX01QTihzcXJsbykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3NxcmxvIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fc3FybG9fYmFzZWNhc2UgX19NUE4oc3FybG9fYmFzZWNhc2UpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9zcXJsb19iYXNlY2FzZSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX211bG1pZF9iYXNlY2FzZSBfX01QTihtdWxtaWRfYmFzZWNhc2UpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tdWxtaWRfYmFzZWNhc2UgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fbXVsbWlkX24gX19NUE4obXVsbWlkX24pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tdWxtaWRfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBtcG5fbXVsbWlkIF9fTVBOKG11bG1pZCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX211bG1pZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9zdWJtdWxfMWMgX19NUE4oc3VibXVsXzFjKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJtdWxfMWMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2lmbmRlZiBtcG5fcmVkY18xICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX3JlZGNfMSBfX01QTihyZWRjXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3JlZGNfMSAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2VuZGlmCisKKyNpZm5kZWYgbXBuX3JlZGNfMiAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9yZWRjXzIgX19NUE4ocmVkY18yKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9yZWRjXzIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9yZWRjX24gX19NUE4ocmVkY19uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fcmVkY19uIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKKworI2lmbmRlZiBtcG5fbW9kXzFfMXBfY3BzICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX21vZF8xXzFwX2NwcyBfX01QTihtb2RfMV8xcF9jcHMpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tb2RfMV8xcF9jcHMgKG1wX2xpbWJfdCBbNF0sIG1wX2xpbWJfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX21vZF8xXzFwICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX21vZF8xXzFwIF9fTVBOKG1vZF8xXzFwKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMV8xcCAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgY29uc3QgbXBfbGltYl90IFs0XSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2lmbmRlZiBtcG5fbW9kXzFzXzJwX2NwcyAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9tb2RfMXNfMnBfY3BzIF9fTVBOKG1vZF8xc18ycF9jcHMpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tb2RfMXNfMnBfY3BzIChtcF9saW1iX3QgWzVdLCBtcF9saW1iX3QpOworI2VuZGlmCisjaWZuZGVmIG1wbl9tb2RfMXNfMnAgIC8qIGlmIG5vdCBkb25lIHdpdGggY3B1dmVjIGluIGEgZmF0IGJpbmFyeSAqLworI2RlZmluZSBtcG5fbW9kXzFzXzJwIF9fTVBOKG1vZF8xc18ycCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbW9kXzFzXzJwIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBjb25zdCBtcF9saW1iX3QgWzVdKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjaWZuZGVmIG1wbl9tb2RfMXNfM3BfY3BzICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX21vZF8xc18zcF9jcHMgX19NUE4obW9kXzFzXzNwX2NwcykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX21vZF8xc18zcF9jcHMgKG1wX2xpbWJfdCBbNl0sIG1wX2xpbWJfdCk7CisjZW5kaWYKKyNpZm5kZWYgbXBuX21vZF8xc18zcCAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lIG1wbl9tb2RfMXNfM3AgX19NUE4obW9kXzFzXzNwKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMXNfM3AgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIGNvbnN0IG1wX2xpbWJfdCBbNl0pIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNpZm5kZWYgbXBuX21vZF8xc180cF9jcHMgIC8qIGlmIG5vdCBkb25lIHdpdGggY3B1dmVjIGluIGEgZmF0IGJpbmFyeSAqLworI2RlZmluZSBtcG5fbW9kXzFzXzRwX2NwcyBfX01QTihtb2RfMXNfNHBfY3BzKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fbW9kXzFzXzRwX2NwcyAobXBfbGltYl90IFs3XSwgbXBfbGltYl90KTsKKyNlbmRpZgorI2lmbmRlZiBtcG5fbW9kXzFzXzRwICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX21vZF8xc180cCBfX01QTihtb2RfMXNfNHApCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX21vZF8xc180cCAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgY29uc3QgbXBfbGltYl90IFs3XSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYmNfbXVsbW9kX2JubTEgX19NUE4oYmNfbXVsbW9kX2JubTEpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9iY19tdWxtb2RfYm5tMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSBtcG5fbXVsbW9kX2JubTEgX19NUE4obXVsbW9kX2JubTEpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9tdWxtb2RfYm5tMSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSBfX01QTihtdWxtb2RfYm5tMV9uZXh0X3NpemUpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAobXBfc2l6ZV90KSBBVFRSSUJVVEVfQ09OU1Q7CitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX211bG1vZF9ibm0xX2l0Y2ggKG1wX3NpemVfdCBybiwgbXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pIHsKKyAgbXBfc2l6ZV90IG4sIGl0Y2g7CisgIG4gPSBybiA+PiAxOworICBpdGNoID0gcm4gKyA0ICsKKyAgICAoYW4gPiBuID8gKGJuID4gbiA/IHJuIDogbikgOiAwKTsKKyAgcmV0dXJuIGl0Y2g7Cit9CisKKyNpZm5kZWYgTU9EX0JLTlAxX1VTRTExCisjZGVmaW5lIE1PRF9CS05QMV9VU0UxMSAoKEdNUF9OVU1CX0JJVFMgJSA4ICE9IDApICYmIChHTVBfTlVNQl9CSVRTICUgMiA9PSAwKSkKKyNlbmRpZgorI2lmbmRlZiBNT0RfQktOUDFfT05MWTMKKyNkZWZpbmUgTU9EX0JLTlAxX09OTFkzIDAKKyNlbmRpZgorI2RlZmluZSBtcG5fbXVsbW9kX2JrbnAxIF9fTVBOKG11bG1vZF9ia25wMSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX211bG1vZF9ia25wMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCwgbXBfcHRyKTsKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fbXVsbW9kX2JrbnAxX2l0Y2ggKG1wX3NpemVfdCBybikgeworICByZXR1cm4gcm4gPDwgMjsKK30KKyNpZiBNT0RfQktOUDFfT05MWTMKKyNkZWZpbmUgTVBOX01VTE1PRF9CS05QMV9VU0FCTEUocm4sIGssIG1uKQkJCQlcCisgICgoR01QX05VTUJfQklUUyAlIDggPT0gMCkgJiYgKChtbikgPj0gMTgpICYmICgocm4pID4gMTYpICYmCQlcCisgICAoKChybikgJSAoKGspID0gMykgPT0gMCkpKQorI2Vsc2UKKyNkZWZpbmUgTVBOX01VTE1PRF9CS05QMV9VU0FCTEUocm4sIGssIG1uKQkJCQlcCisgICgoKEdNUF9OVU1CX0JJVFMgJSA4ID09IDApICYmICgobW4pID49IDE4KSAmJiAoKHJuKSA+IDE2KSAmJgkJXAorICAgICgoKHJuKSAlICgoaykgPSAzKSA9PSAwKSB8fAkJCQkJCVwKKyAgICAgKCgoR01QX05VTUJfQklUUyAlIDE2ICE9IDApIHx8ICgoKG1uKSA+PSAzNSkgJiYgKChybikgPj0gMzIpKSkgJiYJXAorICAgICAgKCgoR01QX05VTUJfQklUUyAlIDE2ID09IDApICYmICgocm4pICUgKChrKSA9IDUpID09IDApKSB8fAlcCisgICAgICAgKCgobW4pID49IDQ5KSAmJgkJCQkJCQlcCisJKCgocm4pICUgKChrKSA9IDcpID09IDApIHx8CQkJCQlcCisJICgoR01QX05VTUJfQklUUyAlIDE2ID09IDApICYmICgobW4pID49IDEwNCkgJiYgKChybikgPj0gNjQpICYmCVwKKwkgICgoTU9EX0JLTlAxX1VTRTExICYmICgocm4pICUgKChrKSA9IDExKSA9PSAwKSkgfHwJCVwKKwkgICAoKHJuKSAlICgoaykgPSAxMykgPT0gMCkgfHwJCQkJCVwKKwkgICAoKEdNUF9OVU1CX0JJVFMgJSAzMiA9PSAwKSAmJiAoKG1uKSA+PSAxMzYpICYmICgocm4pID49IDEyOCkgJiYgXAorCSAgICAoKHJuKSAlICgoaykgPSAxNykgPT0gMCkJCQkJCVwKKwkgICAgKSkpKSkpKSkpIHx8CQkJCQkJXAorICAoKEdNUF9OVU1CX0JJVFMgJSAxNiAhPSAwKSAmJiBNT0RfQktOUDFfVVNFMTEgJiYJCQlcCisgICAoKG1uKSA+PSAxMDQpICYmICgocm4pID49IDY0KSAmJiAoKHJuKSAlICgoaykgPSAxMSkgPT0gMCkpICkKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9zcXJtb2RfYmtucDEgX19NUE4oc3FybW9kX2JrbnAxKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc3FybW9kX2JrbnAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCwgbXBfcHRyKTsKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fc3FybW9kX2JrbnAxX2l0Y2ggKG1wX3NpemVfdCBybikgeworICByZXR1cm4gcm4gKiAzOworfQorI2lmIE1PRF9CS05QMV9PTkxZMworI2RlZmluZSBNUE5fU1FSTU9EX0JLTlAxX1VTQUJMRShybiwgaywgbW4pCQkJCVwKKyAgTVBOX01VTE1PRF9CS05QMV9VU0FCTEUocm4sIGssIG1uKQorI2Vsc2UKKyNkZWZpbmUgTVBOX1NRUk1PRF9CS05QMV9VU0FCTEUocm4sIGssIG1uKQkJCQlcCisgICgoKEdNUF9OVU1CX0JJVFMgJSA4ID09IDApICYmICgobW4pID49IDI3KSAmJiAoKHJuKSA+IDI0KSAmJgkJXAorICAgICgoKHJuKSAlICgoaykgPSAzKSA9PSAwKSB8fAkJCQkJCVwKKyAgICAgKCgoR01QX05VTUJfQklUUyAlIDE2ICE9IDApIHx8ICgoKG1uKSA+PSA1NSkgJiYgKChybikgPiA1MCkpKSAmJglcCisgICAgICAoKChHTVBfTlVNQl9CSVRTICUgMTYgPT0gMCkgJiYgKChybikgJSAoKGspID0gNSkgPT0gMCkpIHx8CVwKKyAgICAgICAoKChtbikgPj0gNTYpICYmCQkJCQkJCVwKKwkoKChybikgJSAoKGspID0gNykgPT0gMCkgfHwJCQkJCVwKKwkgKChHTVBfTlVNQl9CSVRTICUgMTYgPT0gMCkgJiYgKChtbikgPj0gMTQzKSAmJiAoKHJuKSA+PSAxMjgpICYmIFwKKwkgICgoTU9EX0JLTlAxX1VTRTExICYmICgocm4pICUgKChrKSA9IDExKSA9PSAwKSkgfHwJCVwKKwkgICAoKHJuKSAlICgoaykgPSAxMykgPT0gMCkgfHwJCQkJCVwKKwkgICAoKEdNUF9OVU1CX0JJVFMgJSAzMiA9PSAwKSAmJiAoKG1uKSA+PSAyNzIpICYmICgocm4pID49IDI1NikgJiYgXAorCSAgICAoKHJuKSAlICgoaykgPSAxNykgPT0gMCkJCQkJCVwKKwkgICAgKSkpKSkpKSkpIHx8CQkJCQkJXAorICAgKChHTVBfTlVNQl9CSVRTICUgMTYgIT0gMCkgJiYgTU9EX0JLTlAxX1VTRTExICYmCQkJXAorICAgICgobW4pID49IDE0MykgJiYgKChybikgPj0gMTI4KSAmJiAoKHJuKSAlICgoaykgPSAxMSkgPT0gMCkpICkKKyNlbmRpZgorCisKKyNkZWZpbmUgbXBuX3Nxcm1vZF9ibm0xIF9fTVBOKHNxcm1vZF9ibm0xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fc3FybW9kX2JubTEgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgbXBuX3Nxcm1vZF9ibm0xX25leHRfc2l6ZSBfX01QTihzcXJtb2RfYm5tMV9uZXh0X3NpemUpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX3Nxcm1vZF9ibm0xX25leHRfc2l6ZSAobXBfc2l6ZV90KSBBVFRSSUJVVEVfQ09OU1Q7CitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Nxcm1vZF9ibm0xX2l0Y2ggKG1wX3NpemVfdCBybiwgbXBfc2l6ZV90IGFuKSB7CisgIG1wX3NpemVfdCBuLCBpdGNoOworICBuID0gcm4gPj4gMTsKKyAgaXRjaCA9IHJuICsgMyArCisgICAgKGFuID4gbiA/IGFuIDogMCk7CisgIHJldHVybiBpdGNoOworfQorCisvKiBQc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb24gcG9pbnRlcnMgc3RydWN0dXJlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAoKnJhbmRzZWVkX2ZuKSAoZ21wX3JhbmRzdGF0ZV9wdHIsIG1wel9zcmNwdHIpOworICB2b2lkICgqcmFuZGdldF9mbikgKGdtcF9yYW5kc3RhdGVfcHRyLCBtcF9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKKyAgdm9pZCAoKnJhbmRjbGVhcl9mbikgKGdtcF9yYW5kc3RhdGVfcHRyKTsKKyAgdm9pZCAoKnJhbmRpc2V0X2ZuKSAoZ21wX3JhbmRzdGF0ZV9wdHIsIGdtcF9yYW5kc3RhdGVfc3JjcHRyKTsKK30gZ21wX3JhbmRmbnB0cl90OworCisvKiBNYWNybyB0byBvYnRhaW4gYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFJOR19GTlBUUihyc3RhdGUpICgocnN0YXRlKS0+X21wX2FsZ2RhdGEuX21wX2xjKQorCisvKiBNYWNybyB0byBvYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0b3IncyBzdGF0ZS4KKyAgIFdoZW4gdXNlZCBhcyBhIGx2YWx1ZSB0aGUgcnZhbHVlIG5lZWRzIHRvIGJlIGNhc3QgdG8gbXBfcHRyLiAgKi8KKyNkZWZpbmUgUk5HX1NUQVRFKHJzdGF0ZSkgKChyc3RhdGUpLT5fbXBfc2VlZC0+X21wX2QpCisKKy8qIFdyaXRlIGEgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBiaXRzIHRvIHJwLiAgKi8KKyNkZWZpbmUgX2dtcF9yYW5kKHJwLCBzdGF0ZSwgYml0cykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBnbXBfcmFuZHN0YXRlX3B0ciAgX19yc3RhdGUgPSAoc3RhdGUpOwkJCQlcCisgICAgKCooKGdtcF9yYW5kZm5wdHJfdCAqKSBSTkdfRk5QVFIgKF9fcnN0YXRlKSktPnJhbmRnZXRfZm4pCQlcCisgICAgICAoX19yc3RhdGUsIHJwLCBiaXRzKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKK19fR01QX0RFQ0xTUEVDIHZvaWQgX19nbXBfcmFuZGluaXRfbXRfbm9zZWVkIChnbXBfcmFuZHN0YXRlX3B0cik7CisKKworLyogX19nbXBfcmFuZHMgaXMgdGhlIGdsb2JhbCBzdGF0ZSBmb3IgdGhlIG9sZC1zdHlsZSByYW5kb20gZnVuY3Rpb25zLCBhbmQKKyAgIGlzIGFsc28gdXNlZCBpbiB0aGUgdGVzdCBwcm9ncmFtcyAoaGVuY2UgdGhlIF9fR01QX0RFQ0xTUEVDKS4KKworICAgVGhlcmUncyBubyBzZWVkaW5nIGhlcmUsIHNvIG1wel9yYW5kb20gZXRjIHdpbGwgZ2VuZXJhdGUgdGhlIHNhbWUKKyAgIHNlcXVlbmNlIGV2ZXJ5IHRpbWUuICBUaGlzIGlzIG5vdCB1bmxpa2UgdGhlIEMgbGlicmFyeSByYW5kb20gZnVuY3Rpb25zCisgICBpZiB5b3UgZG9uJ3Qgc2VlZCB0aGVtLCBzbyBwZXJoYXBzIGl0J3MgYWNjZXB0YWJsZS4gIERpZ2dpbmcgdXAgYSBzZWVkCisgICBmcm9tIC9kZXYvcmFuZG9tIG9yIHRoZSBsaWtlIHdvdWxkIHdvcmsgb24gbWFueSBzeXN0ZW1zLCBidXQgbWlnaHQKKyAgIGVuY291cmFnZSBhIGZhbHNlIGNvbmZpZGVuY2UsIHNpbmNlIGl0J2QgYmUgcHJldHR5IG11Y2ggaW1wb3NzaWJsZSB0byBkbworICAgc29tZXRoaW5nIHRoYXQgd291bGQgd29yayByZWxpYWJseSBldmVyeXdoZXJlLiAgSW4gYW55IGNhc2UgdGhlIG5ldyBzdHlsZQorICAgZnVuY3Rpb25zIGFyZSByZWNvbW1lbmRlZCB0byBhcHBsaWNhdGlvbnMgd2hpY2ggY2FyZSBhYm91dCByYW5kb21uZXNzLCBzbworICAgdGhlIG9sZCBmdW5jdGlvbnMgYXJlbid0IHRvbyBpbXBvcnRhbnQuICAqLworCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY2hhciAgICAgICAgICAgICBfX2dtcF9yYW5kc19pbml0aWFsaXplZDsKK19fR01QX0RFQ0xTUEVDIGV4dGVybiBnbXBfcmFuZHN0YXRlX3QgIF9fZ21wX3JhbmRzOworCisjZGVmaW5lIFJBTkRTCQkJCQkJCQlcCisgICgoX19nbXBfcmFuZHNfaW5pdGlhbGl6ZWQgPyAwCQkJCQkJXAorICAgIDogKF9fZ21wX3JhbmRzX2luaXRpYWxpemVkID0gMSwJCQkJCVwKKyAgICAgICBfX2dtcF9yYW5kaW5pdF9tdF9ub3NlZWQgKF9fZ21wX3JhbmRzKSwgMCkpLAkJCVwKKyAgIF9fZ21wX3JhbmRzKQorCisvKiB0aGlzIGlzIHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMsIHRvIGZyZWUgbWVtb3J5ICovCisjZGVmaW5lIFJBTkRTX0NMRUFSKCkJCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2dtcF9yYW5kc19pbml0aWFsaXplZCkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19nbXBfcmFuZHNfaW5pdGlhbGl6ZWQgPSAwOwkJCQkJXAorCWdtcF9yYW5kY2xlYXIgKF9fZ21wX3JhbmRzKTsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogRm9yIGEgdGhyZXNob2xkIGJldHdlZW4gYWxnb3JpdGhtcyBBIGFuZCBCLCBzaXplPj10aHJlc2ggaXMgd2hlcmUgQgorICAgc2hvdWxkIGJlIHVzZWQuICBTcGVjaWFsIHZhbHVlIE1QX1NJWkVfVF9NQVggbWVhbnMgb25seSBldmVyIHVzZSBBLCBvcgorICAgdmFsdWUgMCBtZWFucyBvbmx5IGV2ZXIgdXNlIEIuICBUaGUgdGVzdHMgZm9yIHRoZXNlIHNwZWNpYWwgdmFsdWVzIHdpbGwKKyAgIGJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMsIHNvIHRoZSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBlbGltaW5hdGUKKyAgIHRoZSBjb2RlIGZvciB0aGUgdW53YW50ZWQgYWxnb3JpdGhtLiAgKi8KKworI2lmICEgZGVmaW5lZCAoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMgorI2RlZmluZSBBQk9WRV9USFJFU0hPTEQoc2l6ZSx0aHJlc2gpCQkJCQlcCisgICgodGhyZXNoKSA9PSAwCQkJCQkJCVwKKyAgIHx8ICgodGhyZXNoKSAhPSBNUF9TSVpFX1RfTUFYCQkJCQlcCisgICAgICAgJiYgKHNpemUpID49ICh0aHJlc2gpKSkKKyNlbHNlCisjZGVmaW5lIEFCT1ZFX1RIUkVTSE9MRChzaXplLHRocmVzaCkJCQkJCVwKKyAgKChfX2J1aWx0aW5fY29uc3RhbnRfcCAodGhyZXNoKSAmJiAodGhyZXNoKSA9PSAwKQkJCVwKKyAgIHx8ICghKF9fYnVpbHRpbl9jb25zdGFudF9wICh0aHJlc2gpICYmICh0aHJlc2gpID09IE1QX1NJWkVfVF9NQVgpCVwKKyAgICAgICAmJiAoc2l6ZSkgPj0gKHRocmVzaCkpKQorI2VuZGlmCisjZGVmaW5lIEJFTE9XX1RIUkVTSE9MRChzaXplLHRocmVzaCkgICghIEFCT1ZFX1RIUkVTSE9MRCAoc2l6ZSwgdGhyZXNoKSkKKworLyogVGhlIG1pbmltYWwgc3VwcG9ydGVkIHZhbHVlIGZvciBUb29tMjIgZGVwZW5kcyBhbHNvIG9uIFRvb20zMiBhbmQKKyAgIFRvb200MiBpbXBsZW1lbnRhdGlvbnMuICovCisjZGVmaW5lIE1QTl9UT09NMjJfTVVMX01JTlNJWkUgICAgNgorI2RlZmluZSBNUE5fVE9PTTJfU1FSX01JTlNJWkUgICAgIDQKKworI2RlZmluZSBNUE5fVE9PTTMzX01VTF9NSU5TSVpFICAgMTcKKyNkZWZpbmUgTVBOX1RPT00zX1NRUl9NSU5TSVpFICAgIDE3CisKKyNkZWZpbmUgTVBOX1RPT000NF9NVUxfTUlOU0laRSAgIDMwCisjZGVmaW5lIE1QTl9UT09NNF9TUVJfTUlOU0laRSAgICAzMAorCisjZGVmaW5lIE1QTl9UT09NNkhfTVVMX01JTlNJWkUgICA0NgorI2RlZmluZSBNUE5fVE9PTTZfU1FSX01JTlNJWkUgICAgNDYKKworI2RlZmluZSBNUE5fVE9PTThIX01VTF9NSU5TSVpFICAgODYKKyNkZWZpbmUgTVBOX1RPT004X1NRUl9NSU5TSVpFICAgIDg2CisKKyNkZWZpbmUgTVBOX1RPT00zMl9NVUxfTUlOU0laRSAgIDEwCisjZGVmaW5lIE1QTl9UT09NNDJfTVVMX01JTlNJWkUgICAxMAorI2RlZmluZSBNUE5fVE9PTTQzX01VTF9NSU5TSVpFICAgMjUKKyNkZWZpbmUgTVBOX1RPT001M19NVUxfTUlOU0laRSAgIDE3CisjZGVmaW5lIE1QTl9UT09NNTRfTVVMX01JTlNJWkUgICAzMQorI2RlZmluZSBNUE5fVE9PTTYzX01VTF9NSU5TSVpFICAgNDkKKworI2RlZmluZSBNUE5fVE9PTTQyX01VTE1JRF9NSU5TSVpFICAgIDQKKworI2RlZmluZSAgIG1wbl9zcXJfZGlhZ29uYWwgX19NUE4oc3FyX2RpYWdvbmFsKQorX19HTVBfREVDTFNQRUMgdm9pZCAgICAgIG1wbl9zcXJfZGlhZ29uYWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9zcXJfZGlhZ19hZGRsc2gxIF9fTVBOKHNxcl9kaWFnX2FkZGxzaDEpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Nxcl9kaWFnX2FkZGxzaDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV81cHRzIF9fTVBOKHRvb21faW50ZXJwb2xhdGVfNXB0cykKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV81cHRzIChtcF9wdHIsIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgaW50LCBtcF9saW1iX3QpOworCitlbnVtIHRvb202X2ZsYWdzIHt0b29tNl9hbGxfcG9zID0gMCwgdG9vbTZfdm0xX25lZyA9IDEsIHRvb202X3ZtMl9uZWcgPSAyfTsKKyNkZWZpbmUgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV82cHRzIF9fTVBOKHRvb21faW50ZXJwb2xhdGVfNnB0cykKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV82cHRzIChtcF9wdHIsIG1wX3NpemVfdCwgZW51bSB0b29tNl9mbGFncywgbXBfcHRyLCBtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90KTsKKworZW51bSB0b29tN19mbGFncyB7IHRvb203X3cxX25lZyA9IDEsIHRvb203X3czX25lZyA9IDIgfTsKKyNkZWZpbmUgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV83cHRzIF9fTVBOKHRvb21faW50ZXJwb2xhdGVfN3B0cykKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV83cHRzIChtcF9wdHIsIG1wX3NpemVfdCwgZW51bSB0b29tN19mbGFncywgbXBfcHRyLCBtcF9wdHIsIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgbXBuX3Rvb21faW50ZXJwb2xhdGVfOHB0cyBfX01QTih0b29tX2ludGVycG9sYXRlXzhwdHMpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb21faW50ZXJwb2xhdGVfOHB0cyAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgbXBuX3Rvb21faW50ZXJwb2xhdGVfMTJwdHMgX19NUE4odG9vbV9pbnRlcnBvbGF0ZV8xMnB0cykKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV8xMnB0cyAobXBfcHRyLCBtcF9wdHIsIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgaW50LCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl90b29tX2ludGVycG9sYXRlXzE2cHRzIF9fTVBOKHRvb21faW50ZXJwb2xhdGVfMTZwdHMpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb21faW50ZXJwb2xhdGVfMTZwdHMgKG1wX3B0ciwgbXBfcHRyLCBtcF9wdHIsIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgaW50LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIF9fTVBOKHRvb21fY291cGxlX2hhbmRsaW5nKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIGludCwgbXBfc2l6ZV90LCBpbnQsIGludCk7CisKKyNkZWZpbmUgICBtcG5fdG9vbV9ldmFsX2RncjNfcG0xIF9fTVBOKHRvb21fZXZhbF9kZ3IzX3BtMSkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fdG9vbV9ldmFsX2RncjNfcG0xIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tX2V2YWxfZGdyM19wbTIgX19NUE4odG9vbV9ldmFsX2RncjNfcG0yKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl90b29tX2V2YWxfZGdyM19wbTIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb21fZXZhbF9wbTEgX19NUE4odG9vbV9ldmFsX3BtMSkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fdG9vbV9ldmFsX3BtMSAobXBfcHRyLCBtcF9wdHIsIHVuc2lnbmVkLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb21fZXZhbF9wbTIgX19NUE4odG9vbV9ldmFsX3BtMikKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fdG9vbV9ldmFsX3BtMiAobXBfcHRyLCBtcF9wdHIsIHVuc2lnbmVkLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb21fZXZhbF9wbTJleHAgX19NUE4odG9vbV9ldmFsX3BtMmV4cCkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fdG9vbV9ldmFsX3BtMmV4cCAobXBfcHRyLCBtcF9wdHIsIHVuc2lnbmVkLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCB1bnNpZ25lZCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tX2V2YWxfcG0ycmV4cCBfX01QTih0b29tX2V2YWxfcG0ycmV4cCkKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fdG9vbV9ldmFsX3BtMnJleHAgKG1wX3B0ciwgbXBfcHRyLCB1bnNpZ25lZCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgdW5zaWduZWQsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTIyX211bCBfX01QTih0b29tMjJfbXVsKQorX19HTVBfREVDTFNQRUMgdm9pZCAgICAgIG1wbl90b29tMjJfbXVsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tMzJfbXVsIF9fTVBOKHRvb20zMl9tdWwpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb20zMl9tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb200Ml9tdWwgX19NUE4odG9vbTQyX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTQyX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTUyX211bCBfX01QTih0b29tNTJfbXVsKQorX19HTVBfREVDTFNQRUMgdm9pZCAgICAgIG1wbl90b29tNTJfbXVsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tNjJfbXVsIF9fTVBOKHRvb202Ml9tdWwpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb202Ml9tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb20yX3NxciBfX01QTih0b29tMl9zcXIpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb20yX3NxciAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tMzNfbXVsIF9fTVBOKHRvb20zM19tdWwpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb20zM19tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb200M19tdWwgX19NUE4odG9vbTQzX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTQzX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTUzX211bCBfX01QTih0b29tNTNfbXVsKQorX19HTVBfREVDTFNQRUMgdm9pZCAgICAgIG1wbl90b29tNTNfbXVsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSAgIG1wbl90b29tNTRfbXVsIF9fTVBOKHRvb201NF9tdWwpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX3Rvb201NF9tdWwgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb202M19tdWwgX19NUE4odG9vbTYzX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTYzX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTNfc3FyIF9fTVBOKHRvb20zX3NxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTNfc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb200NF9tdWwgX19NUE4odG9vbTQ0X211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTQ0X211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTRfc3FyIF9fTVBOKHRvb200X3NxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTRfc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb202aF9tdWwgX19NUE4odG9vbTZoX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTZoX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbTZfc3FyIF9fTVBOKHRvb202X3NxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTZfc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb204aF9tdWwgX19NUE4odG9vbThoX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbThoX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisKKyNkZWZpbmUgICBtcG5fdG9vbThfc3FyIF9fTVBOKHRvb204X3NxcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbThfc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX3Rvb200Ml9tdWxtaWQgX19NUE4odG9vbTQyX211bG1pZCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fdG9vbTQyX211bG1pZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX2ZmdF9iZXN0X2sgX19NUE4oZmZ0X2Jlc3RfaykKK19fR01QX0RFQ0xTUEVDIGludCAgICAgICBtcG5fZmZ0X2Jlc3RfayAobXBfc2l6ZV90LCBpbnQpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgIG1wbl9tdWxfZmZ0IF9fTVBOKG11bF9mZnQpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF9mZnQgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIGludCk7CisKKyNkZWZpbmUgICBtcG5fbXVsX2ZmdF9mdWxsIF9fTVBOKG11bF9mZnRfZnVsbCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fbXVsX2ZmdF9mdWxsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgICBtcG5fbnVzc2JhdW1lcl9tdWwgX19NUE4obnVzc2JhdW1lcl9tdWwpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX251c3NiYXVtZXJfbXVsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgICBtcG5fZmZ0X25leHRfc2l6ZSBfX01QTihmZnRfbmV4dF9zaXplKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9mZnRfbmV4dF9zaXplIChtcF9zaXplX3QsIGludCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lICAgbXBuX2Rpdl9xcl8xbl9waTEgX19NUE4oZGl2X3FyXzFuX3BpMSkKKyAgX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kaXZfcXJfMW5fcGkxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSAgIG1wbl9kaXZfcXJfMm5fcGkxIF9fTVBOKGRpdl9xcl8ybl9waTEpCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2X3FyXzJuX3BpMSAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSAgIG1wbl9kaXZfcXJfMnVfcGkxIF9fTVBOKGRpdl9xcl8ydV9waTEpCisgIF9fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fZGl2X3FyXzJ1X3BpMSAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgaW50LCBtcF9saW1iX3QpOworCisjZGVmaW5lICAgbXBuX3NicGkxX2Rpdl9xciBfX01QTihzYnBpMV9kaXZfcXIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3NicGkxX2Rpdl9xciAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgICBtcG5fc2JwaTFfZGl2X3EgX19NUE4oc2JwaTFfZGl2X3EpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3NicGkxX2Rpdl9xIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSAgIG1wbl9zYnBpMV9kaXZhcHByX3EgX19NUE4oc2JwaTFfZGl2YXBwcl9xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zYnBpMV9kaXZhcHByX3EgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lICAgbXBuX2RjcGkxX2Rpdl9xciBfX01QTihkY3BpMV9kaXZfcXIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RjcGkxX2Rpdl9xciAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIGdtcF9waTFfdCAqKTsKKyNkZWZpbmUgICBtcG5fZGNwaTFfZGl2X3FyX24gX19NUE4oZGNwaTFfZGl2X3FyX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RjcGkxX2Rpdl9xcl9uIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIGdtcF9waTFfdCAqLCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX2RjcGkxX2Rpdl9xIF9fTVBOKGRjcGkxX2Rpdl9xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kY3BpMV9kaXZfcSAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIGdtcF9waTFfdCAqKTsKKworI2RlZmluZSAgIG1wbl9kY3BpMV9kaXZhcHByX3EgX19NUE4oZGNwaTFfZGl2YXBwcl9xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kY3BpMV9kaXZhcHByX3EgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBnbXBfcGkxX3QgKik7CisKKyNkZWZpbmUgICBtcG5fbXVfZGl2X3FyIF9fTVBOKG11X2Rpdl9xcikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVfZGl2X3FyIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9tdV9kaXZfcXJfaXRjaCBfX01QTihtdV9kaXZfcXJfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fbXVfZGl2X3FyX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90LCBpbnQpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgIG1wbl9wcmVpbnZfbXVfZGl2X3FyIF9fTVBOKHByZWludl9tdV9kaXZfcXIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3ByZWludl9tdV9kaXZfcXIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9wcmVpbnZfbXVfZGl2X3FyX2l0Y2ggX19NUE4ocHJlaW52X211X2Rpdl9xcl9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9wcmVpbnZfbXVfZGl2X3FyX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9zaXplX3QpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgIG1wbl9tdV9kaXZhcHByX3EgX19NUE4obXVfZGl2YXBwcl9xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdV9kaXZhcHByX3EgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9tdV9kaXZhcHByX3FfaXRjaCBfX01QTihtdV9kaXZhcHByX3FfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fbXVfZGl2YXBwcl9xX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90LCBpbnQpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgIG1wbl9tdV9kaXZfcSBfX01QTihtdV9kaXZfcSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVfZGl2X3EgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9tdV9kaXZfcV9pdGNoIF9fTVBOKG11X2Rpdl9xX2l0Y2gpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX211X2Rpdl9xX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90LCBpbnQpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgbXBuX2Rpdl9xIF9fTVBOKGRpdl9xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fZGl2X3EgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lICAgbXBuX2ludmVydCBfX01QTihpbnZlcnQpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX2ludmVydCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgbXBuX2ludmVydF9pdGNoKG4pICBtcG5faW52ZXJ0YXBwcl9pdGNoKG4pCisKKyNkZWZpbmUgICBtcG5fbmlfaW52ZXJ0YXBwciBfX01QTihuaV9pbnZlcnRhcHByKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9uaV9pbnZlcnRhcHByIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9pbnZlcnRhcHByIF9fTVBOKGludmVydGFwcHIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2ludmVydGFwcHIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisjZGVmaW5lIG1wbl9pbnZlcnRhcHByX2l0Y2gobikgICgyICogKG4pKQorCisjZGVmaW5lICAgbXBuX2JpbnZlcnQgX19NUE4oYmludmVydCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fYmludmVydCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgICBtcG5fYmludmVydF9pdGNoIF9fTVBOKGJpbnZlcnRfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fYmludmVydF9pdGNoIChtcF9zaXplX3QpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSBtcG5fYmRpdl9xXzEgX19NUE4oYmRpdl9xXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2JkaXZfcV8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCisjZGVmaW5lIG1wbl9waTFfYmRpdl9xXzEgX19NUE4ocGkxX2JkaXZfcV8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9waTFfYmRpdl9xXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90LCBpbnQpOworCisjZGVmaW5lICAgbXBuX3NicGkxX2JkaXZfcXIgX19NUE4oc2JwaTFfYmRpdl9xcikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc2JwaTFfYmRpdl9xciAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgICBtcG5fc2JwaTFfYmRpdl9xIF9fTVBOKHNicGkxX2JkaXZfcSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fc2JwaTFfYmRpdl9xIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSAgIG1wbl9zYnBpMV9iZGl2X3IgX19NUE4oc2JwaTFfYmRpdl9yKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zYnBpMV9iZGl2X3IgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworI2RlZmluZSAgIG1wbl9kY3BpMV9iZGl2X3FyIF9fTVBOKGRjcGkxX2JkaXZfcXIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RjcGkxX2JkaXZfcXIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworI2RlZmluZSAgIG1wbl9kY3BpMV9iZGl2X3FyX25faXRjaCBfX01QTihkY3BpMV9iZGl2X3FyX25faXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fZGNwaTFfYmRpdl9xcl9uX2l0Y2ggKG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lICAgbXBuX2RjcGkxX2JkaXZfcXJfbiBfX01QTihkY3BpMV9iZGl2X3FyX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RjcGkxX2JkaXZfcXJfbiAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX3B0cik7CisjZGVmaW5lICAgbXBuX2RjcGkxX2JkaXZfcSBfX01QTihkY3BpMV9iZGl2X3EpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX2RjcGkxX2JkaXZfcSAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgICBtcG5fbXVfYmRpdl9xciBfX01QTihtdV9iZGl2X3FyKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tdV9iZGl2X3FyIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9tdV9iZGl2X3FyX2l0Y2ggX19NUE4obXVfYmRpdl9xcl9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9tdV9iZGl2X3FyX2l0Y2ggKG1wX3NpemVfdCwgbXBfc2l6ZV90KSBBVFRSSUJVVEVfQ09OU1Q7CisKKyNkZWZpbmUgICBtcG5fbXVfYmRpdl9xIF9fTVBOKG11X2JkaXZfcSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fbXVfYmRpdl9xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgICBtcG5fbXVfYmRpdl9xX2l0Y2ggX19NUE4obXVfYmRpdl9xX2l0Y2gpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX211X2JkaXZfcV9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lICAgbXBuX2JkaXZfcXIgX19NUE4oYmRpdl9xcikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYmRpdl9xciAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKyNkZWZpbmUgICBtcG5fYmRpdl9xcl9pdGNoIF9fTVBOKGJkaXZfcXJfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fYmRpdl9xcl9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lICAgbXBuX2JkaXZfcSBfX01QTihiZGl2X3EpCitfX0dNUF9ERUNMU1BFQyB2b2lkICAgICAgbXBuX2JkaXZfcSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisjZGVmaW5lICAgbXBuX2JkaXZfcV9pdGNoIF9fTVBOKGJkaXZfcV9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9iZGl2X3FfaXRjaCAobXBfc2l6ZV90LCBtcF9zaXplX3QpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSAgIG1wbl9kaXZleGFjdCBfX01QTihkaXZleGFjdCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fZGl2ZXhhY3QgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKyNkZWZpbmUgICBtcG5fZGl2ZXhhY3RfaXRjaCBfX01QTihkaXZleGFjdF9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9kaXZleGFjdF9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjaWZuZGVmIG1wbl9iZGl2X2RibTFjICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgICBtcG5fYmRpdl9kYm0xYyBfX01QTihiZGl2X2RibTFjKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9iZGl2X2RibTFjIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CisjZW5kaWYKKworI2RlZmluZSAgIG1wbl9iZGl2X2RibTEoZHN0LCBzcmMsIHNpemUsIGRpdmlzb3IpIFwKKyAgbXBuX2JkaXZfZGJtMWMgKGRzdCwgc3JjLCBzaXplLCBkaXZpc29yLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIDApKQorCisjZGVmaW5lICAgbXBuX3Bvd20gX19NUE4ocG93bSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fcG93bSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9wb3dsbyBfX01QTihwb3dsbykKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fcG93bG8gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl9zZWNfcGkxX2Rpdl9xciBfX01QTihzZWNfcGkxX2Rpdl9xcikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc2VjX3BpMV9kaXZfcXIgKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX3B0cik7CisjZGVmaW5lIG1wbl9zZWNfcGkxX2Rpdl9yIF9fTVBOKHNlY19waTFfZGl2X3IpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9zZWNfcGkxX2Rpdl9yIChtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfcHRyKTsKKworCisjaWZuZGVmIERJVkVYQUNUX0JZM19NRVRIT0QKKyNpZiBHTVBfTlVNQl9CSVRTICUgMiA9PSAwICYmICEgZGVmaW5lZCAoSEFWRV9OQVRJVkVfbXBuX2RpdmV4YWN0X2J5M2MpCisjZGVmaW5lIERJVkVYQUNUX0JZM19NRVRIT0QgMAkvKiBkZWZhdWx0IHRvIHVzaW5nIG1wbl9iZGl2X2RibTFjICovCisjZWxzZQorI2RlZmluZSBESVZFWEFDVF9CWTNfTUVUSE9EIDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBESVZFWEFDVF9CWTNfTUVUSE9EID09IDAKKyN1bmRlZiBtcG5fZGl2ZXhhY3RfYnkzCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBcCisgICgzICYgbXBuX2JkaXZfZGJtMSAoZHN0LCBzcmMsIHNpemUsIF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgR01QX05VTUJfTUFTSyAvIDMpKSkKKy8qIG92ZXJyaWRlIG1wbl9kaXZleGFjdF9ieTNjIGRlZmluZWQgaW4gZ21wLmggKi8KKy8qCisjdW5kZWYgbXBuX2RpdmV4YWN0X2J5M2MKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5M2MoZHN0LHNyYyxzaXplLGN5KSBcCisgICgzICYgbXBuX2JkaXZfZGJtMWMgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIEdNUF9OVU1CX01BU0sgLyAzLCBHTVBfTlVNQl9NQVNLIC8gMyAqIGN5KSkpCisqLworI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgNCA9PSAwCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTUoZHN0LHNyYyxzaXplKSBcCisgICg3ICYgMyAqIG1wbl9iZGl2X2RibTEgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIEdNUF9OVU1CX01BU0sgLyA1KSkpCisjZW5kaWYKKworI2lmIEdNUF9OVU1CX0JJVFMgJSAzID09IDAKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5Nyhkc3Qsc3JjLHNpemUpIFwKKyAgKDcgJiAxICogbXBuX2JkaXZfZGJtMSAoZHN0LCBzcmMsIHNpemUsIF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgR01QX05VTUJfTUFTSyAvIDcpKSkKKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyAlIDYgPT0gMAorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk5KGRzdCxzcmMsc2l6ZSkgXAorICAoMTUgJiA3ICogbXBuX2JkaXZfZGJtMSAoZHN0LCBzcmMsIHNpemUsIF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgR01QX05VTUJfTUFTSyAvIDkpKSkKKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyAlIDEwID09IDAKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MTEoZHN0LHNyYyxzaXplKSBcCisgICgxNSAmIDUgKiBtcG5fYmRpdl9kYm0xIChkc3QsIHNyYywgc2l6ZSwgX19HTVBfQ0FTVCAobXBfbGltYl90LCBHTVBfTlVNQl9NQVNLIC8gMTEpKSkKKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyAlIDEyID09IDAKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MTMoZHN0LHNyYyxzaXplKSBcCisgICgxNSAmIDMgKiBtcG5fYmRpdl9kYm0xIChkc3QsIHNyYywgc2l6ZSwgX19HTVBfQ0FTVCAobXBfbGltYl90LCBHTVBfTlVNQl9NQVNLIC8gMTMpKSkKKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyAlIDQgPT0gMAorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkxNShkc3Qsc3JjLHNpemUpIFwKKyAgKDE1ICYgMSAqIG1wbl9iZGl2X2RibTEgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIEdNUF9OVU1CX01BU0sgLyAxNSkpKQorI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgOCA9PSAwCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTE3KGRzdCxzcmMsc2l6ZSkgXAorICAoMzEgJiAxNSAqIG1wbl9iZGl2X2RibTEgKGRzdCwgc3JjLCBzaXplLCBfX0dNUF9DQVNUIChtcF9saW1iX3QsIEdNUF9OVU1CX01BU0sgLyAxNykpKQorI2VuZGlmCisKKyNkZWZpbmUgbXB6X2RpdmV4YWN0X2djZCAgX19nbXB6X2RpdmV4YWN0X2djZAorX19HTVBfREVDTFNQRUMgdm9pZCAgICBtcHpfZGl2ZXhhY3RfZ2NkIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKKworI2RlZmluZSBtcHpfcHJvZGxpbWJzICBfX2dtcHpfcHJvZGxpbWJzCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXB6X3Byb2RsaW1icyAobXB6X3B0ciwgbXBfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wel9vZGRmYWNfMSAgX19nbXB6X29kZGZhY18xCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9vZGRmYWNfMSAobXB6X3B0ciwgbXBfbGltYl90LCB1bnNpZ25lZCk7CisKKyNkZWZpbmUgbXB6X3N0cm9uZ2x1Y2FzICBfX2dtcHpfc3Ryb25nbHVjYXMKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfc3Ryb25nbHVjYXMgKG1wel9zcmNwdHIsIG1wel9wdHIsIG1wel9wdHIpOworCisjZGVmaW5lIG1wel9sdWNhc19tb2QgIF9fZ21wel9sdWNhc19tb2QKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfbHVjYXNfbW9kIChtcHpfcHRyLCBtcHpfcHRyLCBsb25nLCBtcF9iaXRjbnRfdCwgbXB6X3NyY3B0ciwgbXB6X3B0ciwgbXB6X3B0cik7CisKKyNkZWZpbmUgbXB6X2lucF9zdHJfbm93aGl0ZSBfX2dtcHpfaW5wX3N0cl9ub3doaXRlCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90ICBtcHpfaW5wX3N0cl9ub3doaXRlIChtcHpfcHRyLCBGSUxFICosIGludCwgaW50LCBzaXplX3QpOworI2VuZGlmCisKKyNkZWZpbmUgbXBuX2RpdmlzaWJsZV9wIF9fTVBOKGRpdmlzaWJsZV9wKQorX19HTVBfREVDTFNQRUMgaW50ICAgICBtcG5fZGl2aXNpYmxlX3AgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgICBtcG5fcm9vdHJlbSBfX01QTihyb290cmVtKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9yb290cmVtIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2Jyb290IF9fTVBOKGJyb290KQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fYnJvb3QgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2Jyb290X2ludm0xIF9fTVBOKGJyb290X2ludm0xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fYnJvb3RfaW52bTEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKKyNkZWZpbmUgbXBuX2Jyb290aW52IF9fTVBOKGJyb290aW52KQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fYnJvb3RpbnYgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfcHRyKTsKKworI2RlZmluZSBtcG5fYnNxcnQgX19NUE4oYnNxcnQpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9ic3FydCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX2JpdGNudF90LCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl9ic3FydGludiBfX01QTihic3FydGludikKK19fR01QX0RFQ0xTUEVDIGludCBtcG5fYnNxcnRpbnYgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9iaXRjbnRfdCwgbXBfcHRyKTsKKworI2lmIGRlZmluZWQgKF9DUkFZKQorI2RlZmluZSBNUE5fQ09QWV9JTkNSKGRzdCwgc3JjLCBuKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGludCBfX2k7CQkvKiBGYXN0ZXIgb24gc29tZSBDcmF5cyB3aXRoIHBsYWluIGludCAqLwlcCisgICAgX1ByYWdtYSAoIl9DUkkgaXZkZXAiKTsJCQkJCQlcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCAobik7IF9faSsrKQkJCQkJXAorICAgICAgKGRzdClbX19pXSA9IChzcmMpW19faV07CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIHVzZWQgYnkgdGVzdCBwcm9ncmFtcywgaGVuY2UgX19HTVBfREVDTFNQRUMgKi8KKyNpZm5kZWYgbXBuX2NvcHlpICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX2NvcHlpIF9fTVBOKGNvcHlpKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fY29weWkgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKE1QTl9DT1BZX0lOQ1IpICYmIEhBVkVfTkFUSVZFX21wbl9jb3B5aQorI2RlZmluZSBNUE5fQ09QWV9JTkNSKGRzdCwgc3JjLCBzaXplKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKHNpemUpID49IDApOwkJCQkJCVwKKyAgICBBU1NFUlQgKE1QTl9TQU1FX09SX0lOQ1JfUCAoZHN0LCBzcmMsIHNpemUpKTsJCQlcCisgICAgbXBuX2NvcHlpIChkc3QsIHNyYywgc2l6ZSk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENvcHkgTiBsaW1icyBmcm9tIFNSQyB0byBEU1QgaW5jcmVtZW50aW5nLCBOPT0wIGFsbG93ZWQuICAqLworI2lmICEgZGVmaW5lZCAoTVBOX0NPUFlfSU5DUikKKyNkZWZpbmUgTVBOX0NPUFlfSU5DUihkc3QsIHNyYywgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChuKSA+PSAwKTsJCQkJCQkJXAorICAgIEFTU0VSVCAoTVBOX1NBTUVfT1JfSU5DUl9QIChkc3QsIHNyYywgbikpOwkJCQlcCisgICAgaWYgKChuKSAhPSAwKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCW1wX3NpemVfdCBfX24gPSAobikgLSAxOwkJCQkJXAorCW1wX3B0ciBfX2RzdCA9IChkc3QpOwkJCQkJCVwKKwltcF9zcmNwdHIgX19zcmMgPSAoc3JjKTsJCQkJCVwKKwltcF9saW1iX3QgX194OwkJCQkJCQlcCisJX194ID0gKl9fc3JjKys7CQkJCQkJCVwKKwlpZiAoX19uICE9IDApCQkJCQkJCVwKKwkgIHsJCQkJCQkJCVwKKwkgICAgZG8JCQkJCQkJCVwKKwkgICAgICB7CQkJCQkJCQlcCisJCSpfX2RzdCsrID0gX194OwkJCQkJCVwKKwkJX194ID0gKl9fc3JjKys7CQkJCQkJXAorCSAgICAgIH0JCQkJCQkJCVwKKwkgICAgd2hpbGUgKC0tX19uKTsJCQkJCQlcCisJICB9CQkJCQkJCQlcCisJKl9fZHN0KysgPSBfX3g7CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoX0NSQVkpCisjZGVmaW5lIE1QTl9DT1BZX0RFQ1IoZHN0LCBzcmMsIG4pCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaW50IF9faTsJCS8qIEZhc3RlciBvbiBzb21lIENyYXlzIHdpdGggcGxhaW4gaW50ICovCVwKKyAgICBfUHJhZ21hICgiX0NSSSBpdmRlcCIpOwkJCQkJCVwKKyAgICBmb3IgKF9faSA9IChuKSAtIDE7IF9faSA+PSAwOyBfX2ktLSkJCQkJXAorICAgICAgKGRzdClbX19pXSA9IChzcmMpW19faV07CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIHVzZWQgYnkgdGVzdCBwcm9ncmFtcywgaGVuY2UgX19HTVBfREVDTFNQRUMgKi8KKyNpZm5kZWYgbXBuX2NvcHlkICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX2NvcHlkIF9fTVBOKGNvcHlkKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fY29weWQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKE1QTl9DT1BZX0RFQ1IpICYmIEhBVkVfTkFUSVZFX21wbl9jb3B5ZAorI2RlZmluZSBNUE5fQ09QWV9ERUNSKGRzdCwgc3JjLCBzaXplKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKHNpemUpID49IDApOwkJCQkJCVwKKyAgICBBU1NFUlQgKE1QTl9TQU1FX09SX0RFQ1JfUCAoZHN0LCBzcmMsIHNpemUpKTsJCQlcCisgICAgbXBuX2NvcHlkIChkc3QsIHNyYywgc2l6ZSk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENvcHkgTiBsaW1icyBmcm9tIFNSQyB0byBEU1QgZGVjcmVtZW50aW5nLCBOPT0wIGFsbG93ZWQuICAqLworI2lmICEgZGVmaW5lZCAoTVBOX0NPUFlfREVDUikKKyNkZWZpbmUgTVBOX0NPUFlfREVDUihkc3QsIHNyYywgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChuKSA+PSAwKTsJCQkJCQkJXAorICAgIEFTU0VSVCAoTVBOX1NBTUVfT1JfREVDUl9QIChkc3QsIHNyYywgbikpOwkJCQlcCisgICAgaWYgKChuKSAhPSAwKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCW1wX3NpemVfdCBfX24gPSAobikgLSAxOwkJCQkJXAorCW1wX3B0ciBfX2RzdCA9IChkc3QpICsgX19uOwkJCQkJXAorCW1wX3NyY3B0ciBfX3NyYyA9IChzcmMpICsgX19uOwkJCQkJXAorCW1wX2xpbWJfdCBfX3g7CQkJCQkJCVwKKwlfX3ggPSAqX19zcmMtLTsJCQkJCQkJXAorCWlmIChfX24gIT0gMCkJCQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBkbwkJCQkJCQkJXAorCSAgICAgIHsJCQkJCQkJCVwKKwkJKl9fZHN0LS0gPSBfX3g7CQkJCQkJXAorCQlfX3ggPSAqX19zcmMtLTsJCQkJCQlcCisJICAgICAgfQkJCQkJCQkJXAorCSAgICB3aGlsZSAoLS1fX24pOwkJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKwkqX19kc3QtLSA9IF9feDsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKyNpZm5kZWYgTVBOX0NPUFkKKyNkZWZpbmUgTVBOX0NPUFkoZCxzLG4pCQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGQsIHMsIG4pKTsJCQkJXAorICAgIE1QTl9DT1BZX0lOQ1IgKGQsIHMsIG4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIFNldCB7ZHN0LHNpemV9IHRvIHRoZSBsaW1icyBvZiB7c3JjLHNpemV9IGluIHJldmVyc2Ugb3JkZXIuICovCisjZGVmaW5lIE1QTl9SRVZFUlNFKGRzdCwgc3JjLCBzaXplKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX3B0ciAgICAgX19kc3QgPSAoZHN0KTsJCQkJCQlcCisgICAgbXBfc2l6ZV90ICBfX3NpemUgPSAoc2l6ZSk7CQkJCQkJXAorICAgIG1wX3NyY3B0ciAgX19zcmMgPSAoc3JjKSArIF9fc2l6ZSAtIDE7CQkJCVwKKyAgICBtcF9zaXplX3QgIF9faTsJCQkJCQkJXAorICAgIEFTU0VSVCAoKHNpemUpID49IDApOwkJCQkJCVwKKyAgICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZHN0LCBzaXplLCBzcmMsIHNpemUpKTsJCQlcCisgICAgQ1JBWV9QcmFnbWEgKCJfQ1JJIGl2ZGVwIik7CQkJCQkJXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgX19zaXplOyBfX2krKykJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJKl9fZHN0ID0gKl9fc3JjOwkJCQkJCVwKKwlfX2RzdCsrOwkJCQkJCQlcCisJX19zcmMtLTsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBaZXJvIG4gbGltYnMgYXQgZHN0LgorCisgICBGb3IgcG93ZXIgYW5kIHBvd2VycGMgd2Ugd2FudCBhbiBpbmxpbmUgc3R1L2JkbnogbG9vcCBmb3IgemVyb2luZy4gIE9uCisgICBwcGM2MzAgZm9yIGluc3RhbmNlIHRoaXMgaXMgb3B0aW1hbCBzaW5jZSBpdCBjYW4gc3VzdGFpbiBvbmx5IDEgc3RvcmUgcGVyCisgICBjeWNsZS4KKworICAgZ2NjIDIuOTUueCAoZm9yIHBvd2VycGM2NCAtbWFpeDY0LCBvciBwb3dlcnBjMzIpIGRvZXNuJ3QgcmVjb2duaXNlIHRoZQorICAgImZvciIgbG9vcCBpbiB0aGUgZ2VuZXJpYyBjb2RlIGJlbG93IGNhbiBiZWNvbWUgc3R1L2JkbnouICBUaGUgZG8vd2hpbGUKKyAgIGhlcmUgaGVscHMgaXQgZ2V0IHRvIHRoYXQuICBUaGUgc2FtZSBjYXZlYXQgYWJvdXQgcGxhaW4gLW1wb3dlcnBjNjQgbW9kZQorICAgYXBwbGllcyBoZXJlIGFzIHRvIF9fR01QTl9DT1BZX0lOQ1IgaW4gZ21wLmguCisKKyAgIHhsYyAzLjEgYWxyZWFkeSBnZW5lcmF0ZXMgc3R1L2JkbnogZnJvbSB0aGUgZ2VuZXJpYyBDLCBhbmQgZG9lcyBzbyBmcm9tCisgICB0aGlzIGxvb3AgdG9vLgorCisgICBFbmhhbmNlbWVudDogR0xJQkMgZG9lcyBzb21lIHRyaWNrZXJ5IHdpdGggZGNieiB0byB6ZXJvIHdob2xlIGNhY2hlIGxpbmVzCisgICBhdCBhIHRpbWUuICBNUE5fWkVSTyBpc24ndCBhbGwgdGhhdCBpbXBvcnRhbnQgaW4gR01QLCBzbyBpdCBtaWdodCBiZSBtb3JlCisgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aCB0byBkbyB0aGUgc2FtZSwgdGhvdWdoIHBlcmhhcHMgYSBjYWxsIHRvIG1lbXNldAorICAgd291bGQgYmUgZ29vZCB3aGVuIG9uIGEgR05VIHN5c3RlbS4gICovCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlciB8fCBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjCisjZGVmaW5lIE1QTl9GSUxMKGRzdCwgbiwgZikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyIF9fZHN0ID0gKGRzdCkgLSAxOwkJCQkJCVwKKyAgICBtcF9zaXplX3QgX19uID0gKG4pOwkJCQkJCVwKKyAgICBBU1NFUlQgKF9fbiA+IDApOwkJCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICAqKytfX2RzdCA9IChmKTsJCQkJCQkJXAorICAgIHdoaWxlICgtLV9fbik7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIE1QTl9GSUxMCisjZGVmaW5lIE1QTl9GSUxMKGRzdCwgbiwgZikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyIF9fZHN0ID0gKGRzdCk7CQkJCQkJXAorICAgIG1wX3NpemVfdCBfX24gPSAobik7CQkJCQkJXAorICAgIEFTU0VSVCAoX19uID4gMCk7CQkJCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgICpfX2RzdCsrID0gKGYpOwkJCQkJCQlcCisgICAgd2hpbGUgKC0tX19uKTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgTVBOX1pFUk8oZHN0LCBuKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChuKSA+PSAwKTsJCQkJCQkJXAorICAgIGlmICgobikgIT0gMCkJCQkJCQkJXAorICAgICAgTVBOX0ZJTEwgKGRzdCwgbiwgQ05TVF9MSU1CICgwKSk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIE9uIHRoZSB4ODZzIHJlcGUvc2Nhc2wgZG9lc24ndCBzZWVtIHVzZWZ1bCwgc2luY2UgaXQgdGFrZXMgbWFueSBjeWNsZXMgdG8KKyAgIHN0YXJ0IHVwIGFuZCB3b3VsZCBuZWVkIHRvIHN0cmlwIGEgbG90IG9mIHplcm9zIGJlZm9yZSBpdCdkIGJlIGZhc3RlcgorICAgdGhhbiBhIHNpbXBsZSBjbXBsIGxvb3AuICBIZXJlIGFyZSBzb21lIHRpbWVzIGluIGN5Y2xlcyBmb3IKKyAgIHN0ZC9yZXBlL3NjYXNsL2NsZCBhbmQgY2xkL3JlcGUvc2Nhc2wgKHRoZSBsYXR0ZXIgd291bGQgYmUgZm9yIHN0cmlwcGluZworICAgbG93IHplcm9zKS4KKworCQlzdGQgICBjbGQKKwkgICBQNSAgICAxOCAgICAxNgorCSAgIFA2ICAgIDQ2ICAgIDM4CisJICAgSzYgICAgMzYgICAgMTMKKwkgICBLNyAgICAyMSAgICAyMAorKi8KKyNpZm5kZWYgTVBOX05PUk1BTElaRQorI2RlZmluZSBNUE5fTk9STUFMSVpFKERTVCwgTkxJTUJTKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgd2hpbGUgKChOTElNQlMpID4gMCkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWlmICgoRFNUKVsoTkxJTUJTKSAtIDFdICE9IDApCQkJCQlcCisJICBicmVhazsJCQkJCQkJXAorCShOTElNQlMpLS07CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgTVBOX05PUk1BTElaRV9OT1RfWkVSTworI2RlZmluZSBNUE5fTk9STUFMSVpFX05PVF9aRVJPKERTVCwgTkxJTUJTKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgd2hpbGUgKDEpCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCUFTU0VSVCAoKE5MSU1CUykgPj0gMSk7CQkJCQkJXAorCWlmICgoRFNUKVsoTkxJTUJTKSAtIDFdICE9IDApCQkJCQlcCisJICBicmVhazsJCQkJCQkJXAorCShOTElNQlMpLS07CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogU3RyaXAgbGVhc3Qgc2lnbmlmaWNhbnQgemVybyBsaW1icyBmcm9tIHtwdHIsc2l6ZX0gYnkgaW5jcmVtZW50aW5nIHB0cgorICAgYW5kIGRlY3JlbWVudGluZyBzaXplLiAgbG93IHNob3VsZCBiZSBwdHJbMF0sIGFuZCB3aWxsIGJlIHRoZSBuZXcgcHRyWzBdCisgICBvbiByZXR1cm5pbmcuICBUaGUgbnVtYmVyIGluIHtwdHIsc2l6ZX0gbXVzdCBiZSBub24temVybywgaWUuIHNpemUhPTAgYW5kCisgICBzb21ld2hlcmUgYSBub24temVybyBsaW1iLiAgKi8KKyNkZWZpbmUgTVBOX1NUUklQX0xPV19aRVJPU19OT1RfWkVSTyhwdHIsIHNpemUsIGxvdykJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgQVNTRVJUICgoc2l6ZSkgPj0gMSk7CQkJCQkJXAorICAgIEFTU0VSVCAoKGxvdykgPT0gKHB0cilbMF0pOwkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICB3aGlsZSAoKGxvdykgPT0gMCkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkoc2l6ZSktLTsJCQkJCQkJXAorCUFTU0VSVCAoKHNpemUpID49IDEpOwkJCQkJCVwKKwkocHRyKSsrOwkJCQkJCQlcCisJKGxvdykgPSAqKHB0cik7CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIEluaXRpYWxpemUgWCBvZiB0eXBlIG1wel90IHdpdGggc3BhY2UgZm9yIE5MSU1CUyBsaW1icy4gIFggc2hvdWxkIGJlIGEKKyAgIHRlbXBvcmFyeSB2YXJpYWJsZTsgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgb3V0IGF0IGZ1bmN0aW9uCisgICByZXR1cm4uICBXZSB1c2UgX194IGhlcmUgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBhY2NlcHQgYm90aCBtcHpfcHRyIGFuZAorICAgbXB6X3QgYXJndW1lbnRzLiAgKi8KKyNkZWZpbmUgTVBaX1RNUF9JTklUKFgsIE5MSU1CUykJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXB6X3B0ciBfX3ggPSAoWCk7CQkJCQkJCVwKKyAgICBBU1NFUlQgKChOTElNQlMpID49IDEpOwkJCQkJCVwKKyAgICBfX3gtPl9tcF9hbGxvYyA9IChOTElNQlMpOwkJCQkJCVwKKyAgICBfX3gtPl9tcF9kID0gVE1QX0FMTE9DX0xJTUJTIChOTElNQlMpOwkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZiBXQU5UX0FTU0VSVAorc3RhdGljIGlubGluZSB2b2lkICoKK19tcHpfbmV3YWxsb2MgKG1wel9wdHIgeiwgbXBfc2l6ZV90IG4pCit7CisgIHZvaWQgKiByZXMgPSBfbXB6X3JlYWxsb2MoeixuKTsKKyAgLyogSWYgd2UgYXJlIGNoZWNraW5nIHRoZSBjb2RlLCBmb3JjZSBhIHJhbmRvbSBjaGFuZ2UgdG8gbGltYnMuICovCisgICgobXBfcHRyKSByZXMpWzBdID0gfiAoKG1wX3B0cikgcmVzKVtBTExPQyAoeikgLSAxXTsKKyAgcmV0dXJuIHJlczsKK30KKyNlbHNlCisjZGVmaW5lIF9tcHpfbmV3YWxsb2MgX21wel9yZWFsbG9jCisjZW5kaWYKKy8qIFJlYWxsb2MgZm9yIGFuIG1wel90IFdIQVQgaWYgaXQgaGFzIGxlc3MgdGhhbiBORUVERUQgbGltYnMuICAqLworI2RlZmluZSBNUFpfUkVBTExPQyh6LG4pIChVTkxJS0VMWSAoKG4pID4gQUxMT0MoeikpCQkJXAorCQkJICA/IChtcF9wdHIpIF9tcHpfcmVhbGxvYyh6LG4pCQkJXAorCQkJICA6IFBUUih6KSkKKyNkZWZpbmUgTVBaX05FV0FMTE9DKHosbikgKFVOTElLRUxZICgobikgPiBBTExPQyh6KSkJCQlcCisJCQkgICA/IChtcF9wdHIpIF9tcHpfbmV3YWxsb2MoeixuKQkJXAorCQkJICAgOiBQVFIoeikpCisKKyNkZWZpbmUgTVBaX0VRVUFMXzFfUCh6KSAgKFNJWih6KT09MSAmJiBQVFIoeilbMF0gPT0gMSkKKworCisvKiBNUE5fRklCMl9TSVpFKG4pIGlzIHRoZSBzaXplIGluIGxpbWJzIHJlcXVpcmVkIGJ5IG1wbl9maWIyX3VpIGZvciBmcCBhbmQKKyAgIGYxcC4KKworICAgRnJvbSBLbnV0aCB2b2wgMSBzZWN0aW9uIDEuMi44LCBGW25dID0gcGhpXm4vc3FydCg1KSByb3VuZGVkIHRvIHRoZQorICAgbmVhcmVzdCBpbnRlZ2VyLCB3aGVyZSBwaGk9KDErc3FydCg1KSkvMiBpcyB0aGUgZ29sZGVuIHJhdGlvLiAgU28gdGhlCisgICBudW1iZXIgb2YgYml0cyByZXF1aXJlZCBpcyBuKmxvZ18yKCgxK3NxcnQoNSkpLzIpID0gbiowLjY5NDI0MTkuCisKKyAgIFRoZSBtdWx0aXBsaWVyIHVzZWQgaXMgMjMvMzI9MC43MTg3NSBmb3IgZWZmaWNpZW50IGNhbGN1bGF0aW9uIG9uIENQVXMKKyAgIHdpdGhvdXQgZ29vZCBmbG9hdGluZyBwb2ludC4gIFRoZXJlJ3MgKzIgZm9yIHJvdW5kaW5nIHVwLCBhbmQgYSBmdXJ0aGVyCisgICArMiBzaW5jZSBhdCB0aGUgbGFzdCBzdGVwIHggbGltYnMgYXJlIGRvdWJsZWQgaW50byBhIDJ4KzEgbGltYiByZWdpb24KKyAgIHdoZXJlYXMgdGhlIGFjdHVhbCBGWzJrXSB2YWx1ZSBtaWdodCBiZSBvbmx5IDJ4LTEgbGltYnMuCisKKyAgIE5vdGUgdGhhdCBhIGRpdmlzaW9uIGlzIGRvbmUgZmlyc3QsIHNpbmNlIG9uIGEgMzItYml0IHN5c3RlbSBpdCdzIGF0CisgICBsZWFzdCBjb25jZWl2YWJsZSB0byBnbyByaWdodCB1cCB0byBuPT1VTE9OR19NQVguICAoRlsyXjMyLTFdIHdvdWxkIGJlCisgICBhYm91dCAzODBNYnl0ZXMsIHBsdXMgdGVtcG9yYXJ5IHdvcmtzcGFjZSBvZiBhYm91dCAxLjJHYnl0ZXMgaGVyZSBhbmQKKyAgIHdoYXRldmVyIGEgbXVsdGlwbHkgb2YgdHdvIDE5ME1ieXRlIG51bWJlcnMgdGFrZXMuKQorCisgICBFbmhhbmNlbWVudDogV2hlbiBHTVBfTlVNQl9CSVRTIGlzIG5vdCBhIHBvd2VyIG9mIDIgdGhlIGRpdmlzaW9uIGNvdWxkIGJlCisgICB3b3JrZWQgaW50byB0aGUgbXVsdGlwbGllci4gICovCisKKyNkZWZpbmUgTVBOX0ZJQjJfU0laRShuKSBcCisgICgobXBfc2l6ZV90KSAoKG4pIC8gMzIgKiAyMyAvIEdNUF9OVU1CX0JJVFMpICsgNCkKKworCisvKiBGSUJfVEFCTEUobikgcmV0dXJucyB0aGUgRmlib25hY2NpIG51bWJlciBGW25dLiAgTXVzdCBoYXZlIG4gaW4gdGhlIHJhbmdlCisgICAtMSA8PSBuIDw9IEZJQl9UQUJMRV9MSU1JVCAodGhhdCBjb25zdGFudCBpbiBmaWJfdGFibGUuaCkuCisKKyAgIEZJQl9UQUJMRV9MVUNOVU1fTElNSVQgKGluIGZpYl90YWJsZS5oKSBpcyB0aGUgbGFyZ2VzdCBuIGZvciB3aGljaCBMW25dID0KKyAgIEZbbl0gKyAyKkZbbi0xXSBmaXRzIGluIGEgbGltYi4gICovCisKK19fR01QX0RFQ0xTUEVDIGV4dGVybiBjb25zdCBtcF9saW1iX3QgX19nbXBfZmliX3RhYmxlW107CisjZGVmaW5lIEZJQl9UQUJMRShuKSAgKF9fZ21wX2ZpYl90YWJsZVsobikrMV0pCisKK2V4dGVybiBjb25zdCBtcF9saW1iX3QgX19nbXBfb2RkZmFjX3RhYmxlW107CitleHRlcm4gY29uc3QgbXBfbGltYl90IF9fZ21wX29kZDJmYWNfdGFibGVbXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIF9fZ21wX2ZhYzJjbnRfdGFibGVbXTsKK2V4dGVybiBjb25zdCBtcF9saW1iX3QgX19nbXBfbGltYnJvb3RzX3RhYmxlW107CisKKy8qIG5ebG9nIDw9IEdNUF9OVU1CX01BWCwgYSBsaW1iIGNhbiBzdG9yZSBsb2cgZmFjdG9ycyBsZXNzIHRoYW4gbiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZAorbG9nX25fbWF4IChtcF9saW1iX3QgbikKK3sKKyAgdW5zaWduZWQgbG9nOworICBmb3IgKGxvZyA9IDg7IG4gPiBfX2dtcF9saW1icm9vdHNfdGFibGVbbG9nIC0gMV07IGxvZy0tKTsKKyAgcmV0dXJuIGxvZzsKK30KKworI2RlZmluZSBTSUVWRVNJWkUgNTEyCQkvKiBGSVhNRTogQWxsb3cgZ21wX2luaXRfcHJpbWVzaWV2ZSB0byBjaG9vc2UgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGxvbmcgZDsJCSAgIC8qIGN1cnJlbnQgaW5kZXggaW4gc1tdICovCisgIHVuc2lnbmVkIGxvbmcgczA7CQkgICAvKiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBzWzBdICovCisgIHVuc2lnbmVkIGxvbmcgc3FydF9zMDsJICAgLyogbWlzbm9tZXIgZm9yIHNxcnQoc1tTSUVWRVNJWkUtMV0pICovCisgIHVuc2lnbmVkIGNoYXIgc1tTSUVWRVNJWkUgKyAxXTsgIC8qIHNpZXZlIHRhYmxlICovCit9IGdtcF9wcmltZXNpZXZlX3Q7CisKKyNkZWZpbmUgZ21wX2luaXRfcHJpbWVzaWV2ZSBfX2dtcF9pbml0X3ByaW1lc2lldmUKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX2luaXRfcHJpbWVzaWV2ZSAoZ21wX3ByaW1lc2lldmVfdCAqKTsKKworI2RlZmluZSBnbXBfbmV4dHByaW1lIF9fZ21wX25leHRwcmltZQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgZ21wX25leHRwcmltZSAoZ21wX3ByaW1lc2lldmVfdCAqKTsKKworI2RlZmluZSBnbXBfcHJpbWVzaWV2ZSBfX2dtcF9wcmltZXNpZXZlCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgZ21wX3ByaW1lc2lldmUgKG1wX3B0ciwgbXBfbGltYl90KTsKKworCisjaWZuZGVmIE1VTF9UT09NMjJfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xEICAgICAgICAgICAgIDMwCisjZW5kaWYKKworI2lmbmRlZiBNVUxfVE9PTTMzX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfVE9PTTMzX1RIUkVTSE9MRCAgICAgICAgICAgIDEwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVMX1RPT000NF9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT000NF9USFJFU0hPTEQgICAgICAgICAgICAzMDAKKyNlbmRpZgorCisjaWZuZGVmIE1VTF9UT09NNkhfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NNkhfVEhSRVNIT0xEICAgICAgICAgICAgMzUwCisjZW5kaWYKKworI2lmbmRlZiBTUVJfVE9PTTZfVEhSRVNIT0xECisjZGVmaW5lIFNRUl9UT09NNl9USFJFU0hPTEQgTVVMX1RPT002SF9USFJFU0hPTEQKKyNlbmRpZgorCisjaWZuZGVmIE1VTF9UT09NOEhfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NOEhfVEhSRVNIT0xEICAgICAgICAgICAgNDUwCisjZW5kaWYKKworI2lmbmRlZiBTUVJfVE9PTThfVEhSRVNIT0xECisjZGVmaW5lIFNRUl9UT09NOF9USFJFU0hPTEQgTVVMX1RPT004SF9USFJFU0hPTEQKKyNlbmRpZgorCisjaWZuZGVmIE1VTF9UT09NMzJfVE9fVE9PTTQzX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfVE9PTTMyX1RPX1RPT000M19USFJFU0hPTEQgIDEwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVMX1RPT00zMl9UT19UT09NNTNfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NMzJfVE9fVE9PTTUzX1RIUkVTSE9MRCAgMTEwCisjZW5kaWYKKworI2lmbmRlZiBNVUxfVE9PTTQyX1RPX1RPT001M19USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNTNfVEhSRVNIT0xEICAxMDAKKyNlbmRpZgorCisjaWZuZGVmIE1VTF9UT09NNDJfVE9fVE9PTTYzX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfVE9PTTQyX1RPX1RPT002M19USFJFU0hPTEQgIDExMAorI2VuZGlmCisKKyNpZm5kZWYgTVVMX1RPT000M19UT19UT09NNTRfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NNDNfVE9fVE9PTTU0X1RIUkVTSE9MRCAgMTUwCisjZW5kaWYKKworLyogTVVMX1RPT00yMl9USFJFU0hPTERfTElNSVQgaXMgdGhlIG1heGltdW0gZm9yIE1VTF9UT09NMjJfVEhSRVNIT0xELiAgSW4gYQorICAgbm9ybWFsIGJ1aWxkIE1VTF9UT09NMjJfVEhSRVNIT0xEIGlzIGEgY29uc3RhbnQgYW5kIHdlIHVzZSB0aGF0LiAgSW4gYSBmYXQKKyAgIGJpbmFyeSBvciB0dW5lIHByb2dyYW0gYnVpbGQgTVVMX1RPT00yMl9USFJFU0hPTEQgaXMgYSB2YXJpYWJsZSBhbmQgYQorICAgc2VwYXJhdGUgaGFyZCBsaW1pdCB3aWxsIGhhdmUgYmVlbiBkZWZpbmVkLiAgU2ltaWxhcmx5IGZvciBUT09NMy4gICovCisjaWZuZGVmIE1VTF9UT09NMjJfVEhSRVNIT0xEX0xJTUlUCisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xEX0xJTUlUICBNVUxfVE9PTTIyX1RIUkVTSE9MRAorI2VuZGlmCisjaWZuZGVmIE1VTF9UT09NMzNfVEhSRVNIT0xEX0xJTUlUCisjZGVmaW5lIE1VTF9UT09NMzNfVEhSRVNIT0xEX0xJTUlUICBNVUxfVE9PTTMzX1RIUkVTSE9MRAorI2VuZGlmCisjaWZuZGVmIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRF9MSU1JVAorI2RlZmluZSBNVUxMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQgIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRAorI2VuZGlmCisjaWZuZGVmIFNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRF9MSU1JVAorI2RlZmluZSBTUVJMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQgIFNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRAorI2VuZGlmCisjaWZuZGVmIFNRUkxPX0RDX1RIUkVTSE9MRF9MSU1JVAorI2RlZmluZSBTUVJMT19EQ19USFJFU0hPTERfTElNSVQgIFNRUkxPX0RDX1RIUkVTSE9MRAorI2VuZGlmCisKKy8qIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQgaXMgd2hlcmUgbXBuX3Nxcl9iYXNlY2FzZSBzaG91bGQgdGFrZSBvdmVyIGZyb20KKyAgIG1wbl9tdWxfYmFzZWNhc2UuICBEZWZhdWx0IGlzIHRvIHVzZSBtcG5fc3FyX2Jhc2VjYXNlIGZyb20gMC4gIChOb3RlIHRoYXQgd2UKKyAgIGNlcnRhaW5seSBhbHdheXMgd2FudCBpdCBpZiB0aGVyZSdzIGEgbmF0aXZlIGFzc2VtYmxlciBtcG5fc3FyX2Jhc2VjYXNlLikKKworICAgSWYgaXQgdHVybnMgb3V0IHRoYXQgbXBuX3Rvb20yX3NxciBiZWNvbWVzIGZhc3RlciB0aGFuIG1wbl9tdWxfYmFzZWNhc2UKKyAgIGJlZm9yZSBtcG5fc3FyX2Jhc2VjYXNlIGRvZXMsIHRoZW4gU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCBpcyB0aGUgdG9vbTIKKyAgIHRocmVzaG9sZCBhbmQgU1FSX1RPT00yX1RIUkVTSE9MRCBpcyAwLiAgVGhpcyBvZGRpdHkgYXJpc2VzIG1vcmUgb3IgbGVzcworICAgYmVjYXVzZSBTUVJfVE9PTTJfVEhSRVNIT0xEIHJlcHJlc2VudHMgdGhlIHNpemUgdXAgdG8gd2hpY2ggbXBuX3Nxcl9iYXNlY2FzZQorICAgc2hvdWxkIGJlIHVzZWQsIGFuZCB0aGF0IG1heSBiZSBuZXZlci4gICovCisKKyNpZm5kZWYgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorI2RlZmluZSBTUVJfQkFTRUNBU0VfVEhSRVNIT0xEICAgICAgICAgICAgMCAgLyogbmV2ZXIgdXNlIG1wbl9tdWxfYmFzZWNhc2UgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNRUl9UT09NMl9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT00yX1RIUkVTSE9MRCAgICAgICAgICAgICAgNTAKKyNlbmRpZgorCisjaWZuZGVmIFNRUl9UT09NM19USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT00zX1RIUkVTSE9MRCAgICAgICAgICAgICAxMjAKKyNlbmRpZgorCisjaWZuZGVmIFNRUl9UT09NNF9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT000X1RIUkVTSE9MRCAgICAgICAgICAgICA0MDAKKyNlbmRpZgorCisvKiBTZWUgY29tbWVudHMgYWJvdmUgYWJvdXQgTVVMX1RPT00zM19USFJFU0hPTERfTElNSVQuICAqLworI2lmbmRlZiBTUVJfVE9PTTNfVEhSRVNIT0xEX0xJTUlUCisjZGVmaW5lIFNRUl9UT09NM19USFJFU0hPTERfTElNSVQgIFNRUl9UT09NM19USFJFU0hPTEQKKyNlbmRpZgorCisjaWZuZGVmIE1VTE1JRF9UT09NNDJfVEhSRVNIT0xECisjZGVmaW5lIE1VTE1JRF9UT09NNDJfVEhSRVNIT0xEICAgICBNVUxfVE9PTTIyX1RIUkVTSE9MRAorI2VuZGlmCisKKyNpZm5kZWYgTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xECisjZGVmaW5lIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCAgICAgICAgICAwICAvKiBuZXZlciB1c2UgbXBuX211bF9iYXNlY2FzZSAqLworI2VuZGlmCisKKyNpZm5kZWYgTVVMTE9fRENfVEhSRVNIT0xECisjZGVmaW5lIE1VTExPX0RDX1RIUkVTSE9MRCAgICAgICAgICgyKk1VTF9UT09NMjJfVEhSRVNIT0xEKQorI2VuZGlmCisKKyNpZm5kZWYgTVVMTE9fTVVMX05fVEhSRVNIT0xECisjZGVmaW5lIE1VTExPX01VTF9OX1RIUkVTSE9MRCAgICAgICgyKk1VTF9GRlRfVEhSRVNIT0xEKQorI2VuZGlmCisKKyNpZm5kZWYgU1FSTE9fQkFTRUNBU0VfVEhSRVNIT0xECisjZGVmaW5lIFNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRCAgICAgICAgICAwICAvKiBuZXZlciB1c2UgbXBuX3Nxcl9iYXNlY2FzZSAqLworI2VuZGlmCisKKyNpZm5kZWYgU1FSTE9fRENfVEhSRVNIT0xECisjZGVmaW5lIFNRUkxPX0RDX1RIUkVTSE9MRCAgICAgICAgIChNVUxMT19EQ19USFJFU0hPTEQpCisjZW5kaWYKKworI2lmbmRlZiBTUVJMT19TUVJfVEhSRVNIT0xECisjZGVmaW5lIFNRUkxPX1NRUl9USFJFU0hPTEQgICAgICAgIChNVUxMT19NVUxfTl9USFJFU0hPTEQpCisjZW5kaWYKKworI2lmbmRlZiBEQ19ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIERDX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICgyKk1VTF9UT09NMjJfVEhSRVNIT0xEKQorI2VuZGlmCisKKyNpZm5kZWYgRENfRElWQVBQUl9RX1RIUkVTSE9MRAorI2RlZmluZSBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgIDIwMAorI2VuZGlmCisKKyNpZm5kZWYgRENfQkRJVl9RUl9USFJFU0hPTEQKKyNkZWZpbmUgRENfQkRJVl9RUl9USFJFU0hPTEQgICAgICAgKDIqTVVMX1RPT00yMl9USFJFU0hPTEQpCisjZW5kaWYKKworI2lmbmRlZiBEQ19CRElWX1FfVEhSRVNIT0xECisjZGVmaW5lIERDX0JESVZfUV9USFJFU0hPTEQgICAgICAgICAgICAgMTgwCisjZW5kaWYKKworI2lmbmRlZiBESVZFWEFDVF9KRUJfVEhSRVNIT0xECisjZGVmaW5lIERJVkVYQUNUX0pFQl9USFJFU0hPTEQgICAgICAgICAgIDI1CisjZW5kaWYKKworI2lmbmRlZiBJTlZfTVVMTU9EX0JOTTFfVEhSRVNIT0xECisjZGVmaW5lIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQgICg0Kk1VTE1PRF9CTk0xX1RIUkVTSE9MRCkKKyNlbmRpZgorCisjaWZuZGVmIElOVl9BUFBSX1RIUkVTSE9MRAorI2RlZmluZSBJTlZfQVBQUl9USFJFU0hPTEQgICAgICAgICBJTlZfTkVXVE9OX1RIUkVTSE9MRAorI2VuZGlmCisKKyNpZm5kZWYgSU5WX05FV1RPTl9USFJFU0hPTEQKKyNkZWZpbmUgSU5WX05FV1RPTl9USFJFU0hPTEQgICAgICAgICAgICAyMDAKKyNlbmRpZgorCisjaWZuZGVmIEJJTlZfTkVXVE9OX1RIUkVTSE9MRAorI2RlZmluZSBCSU5WX05FV1RPTl9USFJFU0hPTEQgICAgICAgICAgIDMwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVfRElWQVBQUl9RX1RIUkVTSE9MRAorI2RlZmluZSBNVV9ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgMjAwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVfRElWX1FSX1RIUkVTSE9MRAorI2RlZmluZSBNVV9ESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgMjAwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVQSV9ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIE1VUElfRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgMjAwCisjZW5kaWYKKworI2lmbmRlZiBNVV9CRElWX1FfVEhSRVNIT0xECisjZGVmaW5lIE1VX0JESVZfUV9USFJFU0hPTEQgICAgICAgICAgICAyMDAwCisjZW5kaWYKKworI2lmbmRlZiBNVV9CRElWX1FSX1RIUkVTSE9MRAorI2RlZmluZSBNVV9CRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgMjAwMAorI2VuZGlmCisKKyNpZm5kZWYgTVVMTU9EX0JOTTFfVEhSRVNIT0xECisjZGVmaW5lIE1VTE1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgIDE2CisjZW5kaWYKKworI2lmbmRlZiBTUVJNT0RfQk5NMV9USFJFU0hPTEQKKyNkZWZpbmUgU1FSTU9EX0JOTTFfVEhSRVNIT0xEICAgICAgICAgICAgMTYKKyNlbmRpZgorCisjaWZuZGVmIE1VTF9UT19NVUxNT0RfQk5NMV9GT1JfMk5YTl9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPX01VTE1PRF9CTk0xX0ZPUl8yTlhOX1RIUkVTSE9MRCAgKElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQvMikKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF8yIHx8IEhBVkVfTkFUSVZFX21wbl9yZWRjXzIKKworI2lmbmRlZiBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRAorI2RlZmluZSBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCAgICAgICAxNQorI2VuZGlmCisjaWZuZGVmIFJFRENfMl9UT19SRURDX05fVEhSRVNIT0xECisjZGVmaW5lIFJFRENfMl9UT19SRURDX05fVEhSRVNIT0xEICAgICAgMTAwCisjZW5kaWYKKworI2Vsc2UKKworI2lmbmRlZiBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRAorI2RlZmluZSBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCAgICAgIDEwMAorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzIgfHwgSEFWRV9OQVRJVkVfbXBuX3JlZGNfMiAqLworCisKKy8qIEZpcnN0IGsgdG8gdXNlIGZvciBhbiBGRlQgbW9kRiBtdWx0aXBseS4gIEEgbW9kRiBGRlQgaXMgYW4gb3JkZXIKKyAgIGxvZygyXmspL2xvZygyXihrLTEpKSBhbGdvcml0aG0sIHNvIGs9MyBpcyBtZXJlbHkgMS41IGxpa2Uga2FyYXRzdWJhLAorICAgd2hlcmVhcyBrPTQgaXMgMS4zMyB3aGljaCBpcyBmYXN0ZXIgdGhhbiB0b29tMyBhdCAxLjQ4NS4gICAgKi8KKyNkZWZpbmUgRkZUX0ZJUlNUX0sgIDQKKworLyogVGhyZXNob2xkIGF0IHdoaWNoIEZGVCBzaG91bGQgYmUgdXNlZCB0byBkbyBhIG1vZEYgTnhOIC0+IE4gbXVsdGlwbHkuICovCisjaWZuZGVmIE1VTF9GRlRfTU9ERl9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCAgIChNVUxfVE9PTTMzX1RIUkVTSE9MRCAqIDMpCisjZW5kaWYKKyNpZm5kZWYgU1FSX0ZGVF9NT0RGX1RIUkVTSE9MRAorI2RlZmluZSBTUVJfRkZUX01PREZfVEhSRVNIT0xEICAgKFNRUl9UT09NM19USFJFU0hPTEQgKiAzKQorI2VuZGlmCisKKy8qIFRocmVzaG9sZCBhdCB3aGljaCBGRlQgc2hvdWxkIGJlIHVzZWQgdG8gZG8gYW4gTnhOIC0+IDJOIG11bHRpcGx5LiAgVGhpcworICAgd2lsbCBiZSBhIHNpemUgd2hlcmUgRkZUIGlzIHVzaW5nIGs9NyBvciBrPTgsIHNpbmNlIGFuIEZGVC1rIHVzZWQgZm9yIGFuCisgICBOeE4tPjJOIG11bHRpcGx5IGFuZCBub3QgcmVjdXJzaW5nIGludG8gaXRzZWxmIGlzIGFuIG9yZGVyCisgICBsb2coMl5rKS9sb2coMl4oay0yKSkgYWxnb3JpdGhtLCBzbyBpdCdsbCBiZSBhdCBsZWFzdCBrPTcgYXQgMS4zOSB3aGljaAorICAgaXMgdGhlIGZpcnN0IGJldHRlciB0aGFuIHRvb20zLiAgKi8KKyNpZm5kZWYgTVVMX0ZGVF9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX0ZGVF9USFJFU0hPTEQgICAoTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCAqIDEwKQorI2VuZGlmCisjaWZuZGVmIFNRUl9GRlRfVEhSRVNIT0xECisjZGVmaW5lIFNRUl9GRlRfVEhSRVNIT0xEICAgKFNRUl9GRlRfTU9ERl9USFJFU0hPTEQgKiAxMCkKKyNlbmRpZgorCisvKiBUYWJsZSBvZiB0aHJlc2hvbGRzIGZvciBzdWNjZXNzaXZlIG1vZEYgRkZUICJrInMuICBUaGUgZmlyc3QgZW50cnkgaXMKKyAgIHdoZXJlIEZGVF9GSVJTVF9LKzEgc2hvdWxkIGJlIHVzZWQsIHRoZSBzZWNvbmQgRkZUX0ZJUlNUX0srMiwKKyAgIGV0Yy4gIFNlZSBtcG5fZmZ0X2Jlc3RfaygpLiAqLworI2lmbmRlZiBNVUxfRkZUX1RBQkxFCisjZGVmaW5lIE1VTF9GRlRfVEFCTEUJCQkJCQkJXAorICB7IE1VTF9UT09NMzNfVEhSRVNIT0xEICogNCwgICAvKiBrPTUgKi8JCQkJXAorICAgIE1VTF9UT09NMzNfVEhSRVNIT0xEICogOCwgICAvKiBrPTYgKi8JCQkJXAorICAgIE1VTF9UT09NMzNfVEhSRVNIT0xEICogMTYsICAvKiBrPTcgKi8JCQkJXAorICAgIE1VTF9UT09NMzNfVEhSRVNIT0xEICogMzIsICAvKiBrPTggKi8JCQkJXAorICAgIE1VTF9UT09NMzNfVEhSRVNIT0xEICogOTYsICAvKiBrPTkgKi8JCQkJXAorICAgIE1VTF9UT09NMzNfVEhSRVNIT0xEICogMjg4LCAvKiBrPTEwICovCQkJCVwKKyAgICAwIH0KKyNlbmRpZgorI2lmbmRlZiBTUVJfRkZUX1RBQkxFCisjZGVmaW5lIFNRUl9GRlRfVEFCTEUJCQkJCQkJXAorICB7IFNRUl9UT09NM19USFJFU0hPTEQgKiA0LCAgIC8qIGs9NSAqLwkJCQlcCisgICAgU1FSX1RPT00zX1RIUkVTSE9MRCAqIDgsICAgLyogaz02ICovCQkJCVwKKyAgICBTUVJfVE9PTTNfVEhSRVNIT0xEICogMTYsICAvKiBrPTcgKi8JCQkJXAorICAgIFNRUl9UT09NM19USFJFU0hPTEQgKiAzMiwgIC8qIGs9OCAqLwkJCQlcCisgICAgU1FSX1RPT00zX1RIUkVTSE9MRCAqIDk2LCAgLyogaz05ICovCQkJCVwKKyAgICBTUVJfVE9PTTNfVEhSRVNIT0xEICogMjg4LCAvKiBrPTEwICovCQkJCVwKKyAgICAwIH0KKyNlbmRpZgorCitzdHJ1Y3QgZmZ0X3RhYmxlX25rCit7CisgIGdtcF91aW50X2xlYXN0MzJfdCBuOjI3OworICBnbXBfdWludF9sZWFzdDMyX3Qgazo1OworfTsKKworI2lmbmRlZiBGRlRfVEFCTEVfQVRUUlMKKyNkZWZpbmUgRkZUX1RBQkxFX0FUVFJTICAgc3RhdGljIGNvbnN0CisjZW5kaWYKKworI2RlZmluZSBNUE5fRkZUX1RBQkxFX1NJWkUgIDE2CisKKworI2lmbmRlZiBEQ19ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIERDX0RJVl9RUl9USFJFU0hPTEQgICAgKDMgKiBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyNlbmRpZgorCisjaWZuZGVmIEdFVF9TVFJfRENfVEhSRVNIT0xECisjZGVmaW5lIEdFVF9TVFJfRENfVEhSRVNIT0xEICAgICAgICAgICAgIDE4CisjZW5kaWYKKworI2lmbmRlZiBHRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xECisjZGVmaW5lIEdFVF9TVFJfUFJFQ09NUFVURV9USFJFU0hPTEQgICAgIDM1CisjZW5kaWYKKworI2lmbmRlZiBTRVRfU1RSX0RDX1RIUkVTSE9MRAorI2RlZmluZSBTRVRfU1RSX0RDX1RIUkVTSE9MRCAgICAgICAgICAgIDc1MAorI2VuZGlmCisKKyNpZm5kZWYgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRAorI2RlZmluZSBTRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xEICAgMjAwMAorI2VuZGlmCisKKyNpZm5kZWYgRkFDX09ERF9USFJFU0hPTEQKKyNkZWZpbmUgRkFDX09ERF9USFJFU0hPTEQgICAgMzUKKyNlbmRpZgorCisjaWZuZGVmIEZBQ19EU0NfVEhSRVNIT0xECisjZGVmaW5lIEZBQ19EU0NfVEhSRVNIT0xEICAgNDAwCisjZW5kaWYKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHhwLHhzaXplIGFuZCB5cCx5c2l6ZSBvdmVybGFwLgorICAgSWYgeHAreHNpemU8PXlwIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgb3IgaWYgeXAreXNpemU8PXhwIHRoZXJlJ3Mgbm8KKyAgIG92ZXJsYXAuICBJZiBib3RoIHRoZXNlIGFyZSBmYWxzZSwgdGhlcmUncyBhbiBvdmVybGFwLiAqLworI2RlZmluZSBNUE5fT1ZFUkxBUF9QKHhwLCB4c2l6ZSwgeXAsIHlzaXplKQkJCQlcCisgICgoeHApICsgKHhzaXplKSA+ICh5cCkgJiYgKHlwKSArICh5c2l6ZSkgPiAoeHApKQorI2RlZmluZSBNRU1fT1ZFUkxBUF9QKHhwLCB4c2l6ZSwgeXAsIHlzaXplKQkJCQlcCisgICggICAoY2hhciAqKSAoeHApICsgKHhzaXplKSA+IChjaGFyICopICh5cCkJCQkJXAorICAgJiYgKGNoYXIgKikgKHlwKSArICh5c2l6ZSkgPiAoY2hhciAqKSAoeHApKQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgeHAseHNpemUgYW5kIHlwLHlzaXplIGFyZSBlaXRoZXIgaWRlbnRpY2FsIG9yIG5vdAorICAgb3ZlcmxhcHBpbmcuICBSZXR1cm4gemVybyBpZiB0aGV5J3JlIHBhcnRpYWxseSBvdmVybGFwcGluZy4gKi8KKyNkZWZpbmUgTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCh4cCwgeXAsIHNpemUpCQkJCVwKKyAgTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AoeHAsIHNpemUsIHlwLCBzaXplKQorI2RlZmluZSBNUE5fU0FNRV9PUl9TRVBBUkFURTJfUCh4cCwgeHNpemUsIHlwLCB5c2l6ZSkJCQlcCisgICgoeHApID09ICh5cCkgfHwgISBNUE5fT1ZFUkxBUF9QICh4cCwgeHNpemUsIHlwLCB5c2l6ZSkpCisKKy8qIFJldHVybiBub24temVybyBpZiBkc3QsZHNpemUgYW5kIHNyYyxzc2l6ZSBhcmUgZWl0aGVyIGlkZW50aWNhbCBvcgorICAgb3ZlcmxhcHBpbmcgaW4gYSB3YXkgc3VpdGFibGUgZm9yIGFuIGluY3JlbWVudGluZy9kZWNyZW1lbnRpbmcgYWxnb3JpdGhtLgorICAgUmV0dXJuIHplcm8gaWYgdGhleSdyZSBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgaW4gYW4gdW5zdWl0YWJsZSBmYXNoaW9uLiAqLworI2RlZmluZSBNUE5fU0FNRV9PUl9JTkNSMl9QKGRzdCwgZHNpemUsIHNyYywgc3NpemUpCQkJXAorICAoKGRzdCkgPD0gKHNyYykgfHwgISBNUE5fT1ZFUkxBUF9QIChkc3QsIGRzaXplLCBzcmMsIHNzaXplKSkKKyNkZWZpbmUgTVBOX1NBTUVfT1JfSU5DUl9QKGRzdCwgc3JjLCBzaXplKQkJCQlcCisgIE1QTl9TQU1FX09SX0lOQ1IyX1AoZHN0LCBzaXplLCBzcmMsIHNpemUpCisjZGVmaW5lIE1QTl9TQU1FX09SX0RFQ1IyX1AoZHN0LCBkc2l6ZSwgc3JjLCBzc2l6ZSkJCQlcCisgICgoZHN0KSA+PSAoc3JjKSB8fCAhIE1QTl9PVkVSTEFQX1AgKGRzdCwgZHNpemUsIHNyYywgc3NpemUpKQorI2RlZmluZSBNUE5fU0FNRV9PUl9ERUNSX1AoZHN0LCBzcmMsIHNpemUpCQkJCVwKKyAgTVBOX1NBTUVfT1JfREVDUjJfUChkc3QsIHNpemUsIHNyYywgc2l6ZSkKKworCisvKiBBU1NFUlQoKSBpcyBhIHByaXZhdGUgYXNzZXJ0aW9uIGNoZWNraW5nIHNjaGVtZSwgc2ltaWxhciB0byA8YXNzZXJ0Lmg+LgorICAgQVNTRVJUKCkgZG9lcyB0aGUgY2hlY2sgb25seSBpZiBXQU5UX0FTU0VSVCBpcyBzZWxlY3RlZCwgQVNTRVJUX0FMV0FZUygpCisgICBkb2VzIGl0IGFsd2F5cy4gIEdlbmVyYWxseSBhc3NlcnRpb25zIGFyZSBtZWFudCBmb3IgZGV2ZWxvcG1lbnQsIGJ1dAorICAgbWlnaHQgaGVscCB3aGVuIGxvb2tpbmcgZm9yIGEgcHJvYmxlbSBsYXRlciB0b28uICAqLworCisjaWZkZWYgX19MSU5FX18KKyNkZWZpbmUgQVNTRVJUX0xJTkUgIF9fTElORV9fCisjZWxzZQorI2RlZmluZSBBU1NFUlRfTElORSAgLTEKKyNlbmRpZgorCisjaWZkZWYgX19GSUxFX18KKyNkZWZpbmUgQVNTRVJUX0ZJTEUgIF9fRklMRV9fCisjZWxzZQorI2RlZmluZSBBU1NFUlRfRklMRSAgIiIKKyNlbmRpZgorCitfX0dNUF9ERUNMU1BFQyB2b2lkIF9fZ21wX2Fzc2VydF9oZWFkZXIgKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fR01QX0RFQ0xTUEVDIHZvaWQgX19nbXBfYXNzZXJ0X2ZhaWwgKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopIEFUVFJJQlVURV9OT1JFVFVSTjsKKworI2RlZmluZSBBU1NFUlRfRkFJTChleHByKSAgX19nbXBfYXNzZXJ0X2ZhaWwgKEFTU0VSVF9GSUxFLCBBU1NFUlRfTElORSwgI2V4cHIpCisKKyNkZWZpbmUgQVNTRVJUX0FMV0FZUyhleHByKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoVU5MSUtFTFkgKCEoZXhwcikpKQkJCQkJCVwKKyAgICAgIEFTU0VSVF9GQUlMIChleHByKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZiBXQU5UX0FTU0VSVAorI2RlZmluZSBBU1NFUlQoZXhwcikgICBBU1NFUlRfQUxXQVlTIChleHByKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHIpICAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBBU1NFUlRfQ0FSUlkgY2hlY2tzIHRoZSBleHByZXNzaW9uIGlzIG5vbi16ZXJvLCBhbmQgQVNTRVJUX05PQ0FSUlkgY2hlY2tzCisgICB0aGF0IGl0J3MgemVyby4gIEluIGJvdGggY2FzZXMgaWYgYXNzZXJ0aW9uIGNoZWNraW5nIGlzIGRpc2FibGVkIHRoZQorICAgZXhwcmVzc2lvbiBpcyBzdGlsbCBldmFsdWF0ZWQuICBUaGVzZSBtYWNyb3MgYXJlIG1lYW50IGZvciB1c2Ugd2l0aAorICAgcm91dGluZXMgbGlrZSBtcG5fYWRkX24oKSB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIHJlcHJlc2VudHMgYSBjYXJyeSBvcgorICAgd2hhdGV2ZXIgdGhhdCBzaG91bGQgb3Igc2hvdWxkbid0IG9jY3VyIGluIHNvbWUgY29udGV4dC4gIEZvciBleGFtcGxlLAorICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfbiAocnAsIHMxcCwgczJwLCBzaXplKSk7ICovCisjaWYgV0FOVF9BU1NFUlQKKyNkZWZpbmUgQVNTRVJUX0NBUlJZKGV4cHIpICAgICBBU1NFUlRfQUxXQVlTICgoZXhwcikgIT0gMCkKKyNkZWZpbmUgQVNTRVJUX05PQ0FSUlkoZXhwcikgICBBU1NFUlRfQUxXQVlTICgoZXhwcikgPT0gMCkKKyNlbHNlCisjZGVmaW5lIEFTU0VSVF9DQVJSWShleHByKSAgICAgKGV4cHIpCisjZGVmaW5lIEFTU0VSVF9OT0NBUlJZKGV4cHIpICAgKGV4cHIpCisjZW5kaWYKKworCisvKiBBU1NFUlRfQ09ERSBpbmNsdWRlcyBjb2RlIHdoZW4gYXNzZXJ0aW9uIGNoZWNraW5nIGlzIHdhbnRlZC4gIFRoaXMgaXMgdGhlCisgICBzYW1lIGFzIHdyaXRpbmcgIiNpZiBXQU5UX0FTU0VSVCIsIGJ1dCBtb3JlIGNvbXBhY3QuICAqLworI2lmIFdBTlRfQVNTRVJUCisjZGVmaW5lIEFTU0VSVF9DT0RFKGV4cHIpICBleHByCisjZWxzZQorI2RlZmluZSBBU1NFUlRfQ09ERShleHByKQorI2VuZGlmCisKKworLyogVGVzdCB0aGF0IGFuIG1wcV90IGlzIGluIGZ1bGx5IGNhbm9uaWNhbCBmb3JtLiAgVGhpcyBjYW4gYmUgdXNlZCBhcworICAgcHJvdGVjdGlvbiBvbiByb3V0aW5lcyBsaWtlIG1wcV9lcXVhbCB3aGljaCBnaXZlIHdyb25nIHJlc3VsdHMgb24KKyAgIG5vbi1jYW5vbmljYWwgaW5wdXRzLiAgKi8KKyNpZiBXQU5UX0FTU0VSVAorI2RlZmluZSBBU1NFUlRfTVBRX0NBTk9OSUNBTChxKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKHEtPl9tcF9kZW4uX21wX3NpemUgPiAwKTsJCQkJCVwKKyAgICBpZiAocS0+X21wX251bS5fbXBfc2l6ZSA9PSAwKQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkvKiB6ZXJvIHNob3VsZCBiZSAwLzEgKi8JCQkJCVwKKwlBU1NFUlQgKG1wel9jbXBfdWkgKG1wcV9kZW5yZWYocSksIDFMKSA9PSAwKTsJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJLyogbm8gY29tbW9uIGZhY3RvcnMgKi8JCQkJCQlcCisJbXB6X3QgIF9fZzsJCQkJCQkJXAorCW1wel9pbml0IChfX2cpOwkJCQkJCQlcCisJbXB6X2djZCAoX19nLCBtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpKTsJCQlcCisJQVNTRVJUIChtcHpfY21wX3VpIChfX2csIDEpID09IDApOwkJCQlcCisJbXB6X2NsZWFyIChfX2cpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBU1NFUlRfTVBRX0NBTk9OSUNBTChxKQkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyogQ2hlY2sgdGhhdCB0aGUgbmFpbCBwYXJ0cyBhcmUgemVyby4gKi8KKyNkZWZpbmUgQVNTRVJUX0FMV0FZU19MSU1CKGxpbWIpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX25haWwgPSAobGltYikgJiBHTVBfTkFJTF9NQVNLOwkJCQlcCisgICAgQVNTRVJUX0FMV0FZUyAoX19uYWlsID09IDApOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBBU1NFUlRfQUxXQVlTX01QTihwdHIsIHNpemUpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgLyogbGV0IHdob2xlIGxvb3AgZ28gZGVhZCB3aGVuIG5vIG5haWxzICovCQkJCVwKKyAgICBpZiAoR01QX05BSUxfQklUUyAhPSAwKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJbXBfc2l6ZV90ICBfX2k7CQkJCQkJCVwKKwlmb3IgKF9faSA9IDA7IF9faSA8IChzaXplKTsgX19pKyspCQkJCVwKKwkgIEFTU0VSVF9BTFdBWVNfTElNQiAoKHB0cilbX19pXSk7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjaWYgV0FOVF9BU1NFUlQKKyNkZWZpbmUgQVNTRVJUX0xJTUIobGltYikgICAgICAgQVNTRVJUX0FMV0FZU19MSU1CIChsaW1iKQorI2RlZmluZSBBU1NFUlRfTVBOKHB0ciwgc2l6ZSkgICBBU1NFUlRfQUxXQVlTX01QTiAocHRyLCBzaXplKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX0xJTUIobGltYikgICAgICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIEFTU0VSVF9NUE4ocHRyLCBzaXplKSAgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyogQXNzZXJ0IHRoYXQgYW4gbXBuIHJlZ2lvbiB7cHRyLHNpemV9IGlzIHplcm8sIG9yIG5vbi16ZXJvLgorICAgc2l6ZT09MCBpcyBhbGxvd2VkLCBhbmQgaW4gdGhhdCBjYXNlIHtwdHIsc2l6ZX0gY29uc2lkZXJlZCB0byBiZSB6ZXJvLiAgKi8KKyNpZiBXQU5UX0FTU0VSVAorI2RlZmluZSBBU1NFUlRfTVBOX1pFUk9fUChwdHIsc2l6ZSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9faTsJCQkJCQkJXAorICAgIEFTU0VSVCAoKHNpemUpID49IDApOwkJCQkJCVwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IChzaXplKTsgX19pKyspCQkJCQlcCisgICAgICBBU1NFUlQgKChwdHIpW19faV0gPT0gMCk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBBU1NFUlRfTVBOX05PTlpFUk9fUChwdHIsc2l6ZSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9faTsJCQkJCQkJXAorICAgIGludAkgICAgICAgX19ub256ZXJvID0gMDsJCQkJCQlcCisgICAgQVNTRVJUICgoc2l6ZSkgPj0gMCk7CQkJCQkJXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgKHNpemUpOyBfX2krKykJCQkJCVwKKyAgICAgIGlmICgocHRyKVtfX2ldICE9IDApCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkgIF9fbm9uemVybyA9IDE7CQkJCQkJXAorCSAgYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgQVNTRVJUIChfX25vbnplcm8pOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBU1NFUlRfTVBOX1pFUk9fUChwdHIsc2l6ZSkgICAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBU1NFUlRfTVBOX05PTlpFUk9fUChwdHIsc2l6ZSkgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworI2lmICEgSEFWRV9OQVRJVkVfbXBuX2NvbQorI3VuZGVmIG1wbl9jb20KKyNkZWZpbmUgbXBuX2NvbShkLHMsbikJCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX3B0ciAgICAgX19kID0gKGQpOwkJCQkJCVwKKyAgICBtcF9zcmNwdHIgIF9fcyA9IChzKTsJCQkJCQlcCisgICAgbXBfc2l6ZV90ICBfX24gPSAobik7CQkJCQkJXAorICAgIEFTU0VSVCAoX19uID49IDEpOwkJCQkJCQlcCisgICAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChfX2QsIF9fcywgX19uKSk7CQkJXAorICAgIGRvCQkJCQkJCQkJXAorICAgICAgKl9fZCsrID0gKH4gKl9fcysrKSAmIEdNUF9OVU1CX01BU0s7CQkJCVwKKyAgICB3aGlsZSAoLS1fX24pOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBNUE5fTE9HT1BTX05fSU5MSU5FKHJwLCB1cCwgdnAsIG4sIG9wZXJhdGlvbikJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc3JjcHRyCV9fdXAgPSAodXApOwkJCQkJCVwKKyAgICBtcF9zcmNwdHIJX192cCA9ICh2cCk7CQkJCQkJXAorICAgIG1wX3B0cglfX3JwID0gKHJwKTsJCQkJCQlcCisgICAgbXBfc2l6ZV90CV9fbiA9IChuKTsJCQkJCQlcCisgICAgbXBfbGltYl90IF9fYSwgX19iOwkJCQkJCQlcCisgICAgQVNTRVJUIChfX24gPiAwKTsJCQkJCQkJXAorICAgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoX19ycCwgX191cCwgX19uKSk7CQkJXAorICAgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoX19ycCwgX192cCwgX19uKSk7CQkJXAorICAgIF9fdXAgKz0gX19uOwkJCQkJCQlcCisgICAgX192cCArPSBfX247CQkJCQkJCVwKKyAgICBfX3JwICs9IF9fbjsJCQkJCQkJXAorICAgIF9fbiA9IC1fX247CQkJCQkJCQlcCisgICAgZG8gewkJCQkJCQkJXAorICAgICAgX19hID0gX191cFtfX25dOwkJCQkJCQlcCisgICAgICBfX2IgPSBfX3ZwW19fbl07CQkJCQkJCVwKKyAgICAgIF9fcnBbX19uXSA9IG9wZXJhdGlvbjsJCQkJCQlcCisgICAgfSB3aGlsZSAoKytfX24pOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworI2lmICEgSEFWRV9OQVRJVkVfbXBuX2FuZF9uCisjdW5kZWYgbXBuX2FuZF9uCisjZGVmaW5lIG1wbl9hbmRfbihycCwgdXAsIHZwLCBuKSBcCisgIE1QTl9MT0dPUFNfTl9JTkxJTkUgKHJwLCB1cCwgdnAsIG4sIF9fYSAmIF9fYikKKyNlbmRpZgorCisjaWYgISBIQVZFX05BVElWRV9tcG5fYW5kbl9uCisjdW5kZWYgbXBuX2FuZG5fbgorI2RlZmluZSBtcG5fYW5kbl9uKHJwLCB1cCwgdnAsIG4pIFwKKyAgTVBOX0xPR09QU19OX0lOTElORSAocnAsIHVwLCB2cCwgbiwgX19hICYgfl9fYikKKyNlbmRpZgorCisjaWYgISBIQVZFX05BVElWRV9tcG5fbmFuZF9uCisjdW5kZWYgbXBuX25hbmRfbgorI2RlZmluZSBtcG5fbmFuZF9uKHJwLCB1cCwgdnAsIG4pIFwKKyAgTVBOX0xPR09QU19OX0lOTElORSAocnAsIHVwLCB2cCwgbiwgfihfX2EgJiBfX2IpICYgR01QX05VTUJfTUFTSykKKyNlbmRpZgorCisjaWYgISBIQVZFX05BVElWRV9tcG5faW9yX24KKyN1bmRlZiBtcG5faW9yX24KKyNkZWZpbmUgbXBuX2lvcl9uKHJwLCB1cCwgdnAsIG4pIFwKKyAgTVBOX0xPR09QU19OX0lOTElORSAocnAsIHVwLCB2cCwgbiwgX19hIHwgX19iKQorI2VuZGlmCisKKyNpZiAhIEhBVkVfTkFUSVZFX21wbl9pb3JuX24KKyN1bmRlZiBtcG5faW9ybl9uCisjZGVmaW5lIG1wbl9pb3JuX24ocnAsIHVwLCB2cCwgbikgXAorICBNUE5fTE9HT1BTX05fSU5MSU5FIChycCwgdXAsIHZwLCBuLCAoX19hIHwgfl9fYikgJiBHTVBfTlVNQl9NQVNLKQorI2VuZGlmCisKKyNpZiAhIEhBVkVfTkFUSVZFX21wbl9uaW9yX24KKyN1bmRlZiBtcG5fbmlvcl9uCisjZGVmaW5lIG1wbl9uaW9yX24ocnAsIHVwLCB2cCwgbikgXAorICBNUE5fTE9HT1BTX05fSU5MSU5FIChycCwgdXAsIHZwLCBuLCB+KF9fYSB8IF9fYikgJiBHTVBfTlVNQl9NQVNLKQorI2VuZGlmCisKKyNpZiAhIEhBVkVfTkFUSVZFX21wbl94b3JfbgorI3VuZGVmIG1wbl94b3JfbgorI2RlZmluZSBtcG5feG9yX24ocnAsIHVwLCB2cCwgbikgXAorICBNUE5fTE9HT1BTX05fSU5MSU5FIChycCwgdXAsIHZwLCBuLCBfX2EgXiBfX2IpCisjZW5kaWYKKworI2lmICEgSEFWRV9OQVRJVkVfbXBuX3hub3JfbgorI3VuZGVmIG1wbl94bm9yX24KKyNkZWZpbmUgbXBuX3hub3JfbihycCwgdXAsIHZwLCBuKSBcCisgIE1QTl9MT0dPUFNfTl9JTkxJTkUgKHJwLCB1cCwgdnAsIG4sIH4oX19hIF4gX19iKSAmIEdNUF9OVU1CX01BU0spCisjZW5kaWYKKworI2RlZmluZSBtcG5fdHJpYWxkaXYgX19NUE4odHJpYWxkaXYpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3RyaWFsZGl2IChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBpbnQgKik7CisKKyNkZWZpbmUgbXBuX3JlbW92ZSBfX01QTihyZW1vdmUpCitfX0dNUF9ERUNMU1BFQyBtcF9iaXRjbnRfdCBtcG5fcmVtb3ZlIChtcF9wdHIsIG1wX3NpemVfdCAqLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2JpdGNudF90KTsKKworCisvKiBBRERDX0xJTUIgc2V0cyB3PXgreSBhbmQgY291dCB0byAwIG9yIDEgZm9yIGEgY2FycnkgZnJvbSB0aGF0IGFkZGl0aW9uLiAqLworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2RlZmluZSBBRERDX0xJTUIoY291dCwgdywgeCwgeSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9feCA9ICh4KTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX3kgPSAoeSk7CQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX193ID0gX194ICsgX195OwkJCQkJCVwKKyAgICAodykgPSBfX3c7CQkJCQkJCQlcCisgICAgKGNvdXQpID0gX193IDwgX194OwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBRERDX0xJTUIoY291dCwgdywgeCwgeSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fdzsJCQkJCQkJXAorICAgIEFTU0VSVF9MSU1CICh4KTsJCQkJCQkJXAorICAgIEFTU0VSVF9MSU1CICh5KTsJCQkJCQkJXAorICAgIF9fdyA9ICh4KSArICh5KTsJCQkJCQkJXAorICAgICh3KSA9IF9fdyAmIEdNUF9OVU1CX01BU0s7CQkJCQkJXAorICAgIChjb3V0KSA9IF9fdyA+PiBHTVBfTlVNQl9CSVRTOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIFNVQkNfTElNQiBzZXRzIHc9eC15IGFuZCBjb3V0IHRvIDAgb3IgMSBmb3IgYSBib3Jyb3cgZnJvbSB0aGF0CisgICBzdWJ0cmFjdC4gICovCisjaWYgR01QX05BSUxfQklUUyA9PSAwCisjZGVmaW5lIFNVQkNfTElNQihjb3V0LCB3LCB4LCB5KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX194ID0gKHgpOwkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9feSA9ICh5KTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX3cgPSBfX3ggLSBfX3k7CQkJCQkJXAorICAgICh3KSA9IF9fdzsJCQkJCQkJCVwKKyAgICAoY291dCkgPSBfX3cgPiBfX3g7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFNVQkNfTElNQihjb3V0LCB3LCB4LCB5KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX193ID0gKHgpIC0gKHkpOwkJCQkJCVwKKyAgICAodykgPSBfX3cgJiBHTVBfTlVNQl9NQVNLOwkJCQkJCVwKKyAgICAoY291dCkgPSBfX3cgPj4gKEdNUF9MSU1CX0JJVFMtMSk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBNUE5fSU5DUl9VIGRvZXMge3B0cixzaXplfSArPSBuLCBNUE5fREVDUl9VIGRvZXMge3B0cixzaXplfSAtPSBuLCBib3RoCisgICBleHBlY3Rpbmcgbm8gY2FycnkgKG9yIGJvcnJvdykgZnJvbSB0aGF0LgorCisgICBUaGUgc2l6ZSBwYXJhbWV0ZXIgaXMgb25seSBmb3IgdGhlIGJlbmVmaXQgb2YgYXNzZXJ0aW9uIGNoZWNraW5nLiAgSW4gYQorICAgbm9ybWFsIGJ1aWxkIGl0J3MgdW51c2VkIGFuZCB0aGUgY2FycnkvYm9ycm93IGlzIGp1c3QgcHJvcGFnYXRlZCBhcyBmYXIKKyAgIGFzIGl0IG5lZWRzIHRvIGdvLgorCisgICBPbiByYW5kb20gZGF0YSwgdXN1YWxseSBvbmx5IG9uZSBvciB0d28gbGltYnMgb2Yge3B0cixzaXplfSBnZXQgdXBkYXRlZCwKKyAgIHNvIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYW55IHNvcGhpc3RpY2F0ZWQgbG9vcGluZywganVzdCBzb21ldGhpbmcgY29tcGFjdAorICAgYW5kIHNlbnNpYmxlLgorCisgICBGSVhNRTogU3dpdGNoIGFsbCBjb2RlIGZyb20gbXBuX3tpbmNyLGRlY3J9X3UgdG8gTVBOX3tJTkNSLERFQ1J9X1UsCisgICBkZWNsYXJpbmcgdGhlaXIgb3BlcmFuZCBzaXplcywgdGhlbiByZW1vdmUgdGhlIGZvcm1lci4gIFRoaXMgaXMgcHVyZWx5CisgICBmb3IgdGhlIGJlbmVmaXQgb2YgYXNzZXJ0aW9uIGNoZWNraW5nLiAgKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBHTVBfTkFJTF9CSVRTID09IDAgJiYgISBkZWZpbmVkIChOT19BU00pCVwKKyAgJiYgKGRlZmluZWQoSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2KSB8fCBkZWZpbmVkKEhBVkVfSE9TVF9DUFVfRkFNSUxZX3g4Nl82NCkpIFwKKyAgJiYgISBXQU5UX0FTU0VSVAorLyogQmV0dGVyIGZsYWdzIGhhbmRsaW5nIHRoYW4gdGhlIGdlbmVyaWMgQyBnaXZlcyBvbiBpMzg2LCBzYXZpbmcgYSBmZXcKKyAgIGJ5dGVzIG9mIGNvZGUgYW5kIG1heWJlIGEgY3ljbGUgb3IgdHdvLiAgKi8KKworI2RlZmluZSBNUE5fSU9SRF9VKHB0ciwgaW5jciwgYW9ycykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9wdHIgIF9fcHRyX2R1bW15OwkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGluY3IpICYmIChpbmNyKSA9PSAwKQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChpbmNyKSAmJiAoaW5jcikgPT0gMSkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCQlcCisJICAoIlxuIiBBU01fTCh0b3ApICI6XG4iCQkJCQlcCisJICAgIlx0IiBhb3JzICJcdCQxLCAoJTApXG4iCQkJCQlcCisJICAgIlx0bGVhXHQlYzIoJTApLCAlMFxuIgkJCQkJXAorCSAgICJcdGpjXHQiIEFTTV9MKHRvcCkJCQkJCQlcCisJICAgOiAiPXIiIChfX3B0cl9kdW1teSkJCQkJCQlcCisJICAgOiAiMCIgIChwdHIpLCAibiIgKHNpemVvZihtcF9saW1iX3QpKQkJCVwKKwkgICA6ICJtZW1vcnkiKTsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fCQkJCQkJXAorCSAgKCAgIGFvcnMgICJcdCUyLCAoJTApXG4iCQkJCQlcCisJICAgIlx0am5jXHQiIEFTTV9MKGRvbmUpICJcbiIJCQkJCVwKKwkgICBBU01fTCh0b3ApICI6XG4iCQkJCQkJXAorCSAgICJcdCIgYW9ycyAiXHQkMSwgJWMzKCUwKVxuIgkJCQkJXAorCSAgICJcdGxlYVx0JWMzKCUwKSwgJTBcbiIJCQkJCVwKKwkgICAiXHRqY1x0IiBBU01fTCh0b3ApICJcbiIJCQkJCVwKKwkgICBBU01fTChkb25lKSAiOlxuIgkJCQkJCVwKKwkgICA6ICI9ciIgKF9fcHRyX2R1bW15KQkJCQkJCVwKKwkgICA6ICIwIiAgKHB0ciksCQkJCQkJXAorCSAgICAgInJlIiAoKG1wX2xpbWJfdCkgKGluY3IpKSwgIm4iIChzaXplb2YobXBfbGltYl90KSkJCVwKKwkgICA6ICJtZW1vcnkiKTsJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2lmIEdNUF9MSU1CX0JJVFMgPT0gMzIKKyNkZWZpbmUgTVBOX0lOQ1JfVShwdHIsIHNpemUsIGluY3IpICBNUE5fSU9SRF9VIChwdHIsIGluY3IsICJhZGRsIikKKyNkZWZpbmUgTVBOX0RFQ1JfVShwdHIsIHNpemUsIGluY3IpICBNUE5fSU9SRF9VIChwdHIsIGluY3IsICJzdWJsIikKKyNlbmRpZgorI2lmIEdNUF9MSU1CX0JJVFMgPT0gNjQKKyNkZWZpbmUgTVBOX0lOQ1JfVShwdHIsIHNpemUsIGluY3IpICBNUE5fSU9SRF9VIChwdHIsIGluY3IsICJhZGRxIikKKyNkZWZpbmUgTVBOX0RFQ1JfVShwdHIsIHNpemUsIGluY3IpICBNUE5fSU9SRF9VIChwdHIsIGluY3IsICJzdWJxIikKKyNlbmRpZgorI2RlZmluZSBtcG5faW5jcl91KHB0ciwgaW5jcikgIE1QTl9JTkNSX1UgKHB0ciwgMCwgaW5jcikKKyNkZWZpbmUgbXBuX2RlY3JfdShwdHIsIGluY3IpICBNUE5fREVDUl9VIChwdHIsIDAsIGluY3IpCisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2lmbmRlZiBtcG5faW5jcl91CisjZGVmaW5lIG1wbl9pbmNyX3UocCxpbmNyKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX194OwkJCQkJCQlcCisgICAgbXBfcHRyIF9fcCA9IChwKTsJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoaW5jcikgJiYgKGluY3IpID09IDEpCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwl3aGlsZSAoKysoKihfX3ArKykpID09IDApCQkJCQlcCisJICA7CQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX194ID0gKl9fcCArIChpbmNyKTsJCQkJCQlcCisJKl9fcCA9IF9feDsJCQkJCQkJXAorCWlmIChfX3ggPCAoaW5jcikpCQkJCQkJXAorCSAgd2hpbGUgKCsrKCooKytfX3ApKSA9PSAwKQkJCQkJXAorCSAgICA7CQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIG1wbl9kZWNyX3UKKyNkZWZpbmUgbXBuX2RlY3JfdShwLGluY3IpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX3g7CQkJCQkJCVwKKyAgICBtcF9wdHIgX19wID0gKHApOwkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChpbmNyKSAmJiAoaW5jcikgPT0gMSkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCXdoaWxlICgoKihfX3ArKykpLS0gPT0gMCkJCQkJCVwKKwkgIDsJCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlfX3ggPSAqX19wOwkJCQkJCQlcCisJKl9fcCA9IF9feCAtIChpbmNyKTsJCQkJCQlcCisJaWYgKF9feCA8IChpbmNyKSkJCQkJCQlcCisJICB3aGlsZSAoKCooKytfX3ApKS0tID09IDApCQkJCQlcCisJICAgIDsJCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAxCisjaWZuZGVmIG1wbl9pbmNyX3UKKyNkZWZpbmUgbXBuX2luY3JfdShwLGluY3IpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX3g7CQkJCQkJCVwKKyAgICBtcF9wdHIgX19wID0gKHApOwkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChpbmNyKSAmJiAoaW5jcikgPT0gMSkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWRvCQkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIF9feCA9ICgqX19wICsgMSkgJiBHTVBfTlVNQl9NQVNLOwkJCQlcCisJICAgICpfX3ArKyA9IF9feDsJCQkJCQlcCisJICB9CQkJCQkJCQlcCisJd2hpbGUgKF9feCA9PSAwKTsJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX194ID0gKCpfX3AgKyAoaW5jcikpOwkJCQkJCVwKKwkqX19wKysgPSBfX3ggJiBHTVBfTlVNQl9NQVNLOwkJCQkJXAorCWlmIChfX3ggPj4gR01QX05VTUJfQklUUyAhPSAwKQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBkbwkJCQkJCQkJXAorCSAgICAgIHsJCQkJCQkJCVwKKwkJX194ID0gKCpfX3AgKyAxKSAmIEdNUF9OVU1CX01BU0s7CQkJXAorCQkqX19wKysgPSBfX3g7CQkJCQkJXAorCSAgICAgIH0JCQkJCQkJCVwKKwkgICAgd2hpbGUgKF9feCA9PSAwKTsJCQkJCQlcCisJICB9CQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIG1wbl9kZWNyX3UKKyNkZWZpbmUgbXBuX2RlY3JfdShwLGluY3IpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX3g7CQkJCQkJCVwKKyAgICBtcF9wdHIgX19wID0gKHApOwkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChpbmNyKSAmJiAoaW5jcikgPT0gMSkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWRvCQkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIF9feCA9ICpfX3A7CQkJCQkJCVwKKwkgICAgKl9fcCsrID0gKF9feCAtIDEpICYgR01QX05VTUJfTUFTSzsJCQkJXAorCSAgfQkJCQkJCQkJXAorCXdoaWxlIChfX3ggPT0gMCk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9feCA9ICpfX3AgLSAoaW5jcik7CQkJCQkJXAorCSpfX3ArKyA9IF9feCAmIEdNUF9OVU1CX01BU0s7CQkJCQlcCisJaWYgKF9feCA+PiBHTVBfTlVNQl9CSVRTICE9IDApCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIGRvCQkJCQkJCQlcCisJICAgICAgewkJCQkJCQkJXAorCQlfX3ggPSAqX19wOwkJCQkJCVwKKwkJKl9fcCsrID0gKF9feCAtIDEpICYgR01QX05VTUJfTUFTSzsJCQlcCisJICAgICAgfQkJCQkJCQkJXAorCSAgICB3aGlsZSAoX194ID09IDApOwkJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1QTl9JTkNSX1UKKyNpZiBXQU5UX0FTU0VSVAorI2RlZmluZSBNUE5fSU5DUl9VKHB0ciwgc2l6ZSwgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChzaXplKSA+PSAxKTsJCQkJCQlcCisgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfMSAocHRyLCBwdHIsIHNpemUsIG4pKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBNUE5fSU5DUl9VKHB0ciwgc2l6ZSwgbikgICBtcG5faW5jcl91IChwdHIsIG4pCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1QTl9ERUNSX1UKKyNpZiBXQU5UX0FTU0VSVAorI2RlZmluZSBNUE5fREVDUl9VKHB0ciwgc2l6ZSwgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChzaXplKSA+PSAxKTsJCQkJCQlcCisgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfMSAocHRyLCBwdHIsIHNpemUsIG4pKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBNUE5fREVDUl9VKHB0ciwgc2l6ZSwgbikgICBtcG5fZGVjcl91IChwdHIsIG4pCisjZW5kaWYKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludGVybmFsIGJpbmFyeSBmb3JtYXQgYW5kIHN0cmluZ3MuICAqLworc3RydWN0IGJhc2VzCit7CisgIC8qIE51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGNvbnZlcnNpb24gYmFzZSB0aGF0IGFsd2F5cyBmaXRzIGluIGFuIG1wX2xpbWJfdC4KKyAgICAgRm9yIGV4YW1wbGUsIGZvciBiYXNlIDEwIG9uIGEgbWFjaGluZSB3aGVyZSBhbiBtcF9saW1iX3QgaGFzIDMyIGJpdHMgdGhpcworICAgICBpcyA5LCBzaW5jZSAxMCoqOSBpcyB0aGUgbGFyZ2VzdCBudW1iZXIgdGhhdCBmaXRzIGludG8gYW4gbXBfbGltYl90LiAgKi8KKyAgaW50IGNoYXJzX3Blcl9saW1iOworCisgIC8qIGxvZygyKS9sb2coY29udmVyc2lvbl9iYXNlKSAqLworICBtcF9saW1iX3QgbG9nYjI7CisKKyAgLyogbG9nKGNvbnZlcnNpb25fYmFzZSkvbG9nKDIpICovCisgIG1wX2xpbWJfdCBsb2cyYjsKKworICAvKiBiYXNlKipjaGFyc19wZXJfbGltYiwgaS5lLiB0aGUgYmlnZ2VzdCBudW1iZXIgdGhhdCBmaXRzIGEgd29yZCwgYnVpbHQgYnkKKyAgICAgZmFjdG9ycyBvZiBiYXNlLiAgRXhjZXB0aW9uOiBGb3IgMiwgNCwgOCwgZXRjLCBiaWdfYmFzZSBpcyBsb2cyKGJhc2UpLAorICAgICBpLmUuIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCBlYWNoIGRpZ2l0IGluIHRoZSBiYXNlLiAgKi8KKyAgbXBfbGltYl90IGJpZ19iYXNlOworCisgIC8qIEEgR01QX0xJTUJfQklUUyBiaXQgYXBwcm94aW1hdGlvbiB0byAxL2JpZ19iYXNlLCByZXByZXNlbnRlZCBhcyBhCisgICAgIGZpeGVkLXBvaW50IG51bWJlci4gIEluc3RlYWQgb2YgZGl2aWRpbmcgYnkgYmlnX2Jhc2UgYW4gYXBwbGljYXRpb24gY2FuCisgICAgIGNob29zZSB0byBtdWx0aXBseSBieSBiaWdfYmFzZV9pbnZlcnRlZC4gICovCisgIG1wX2xpbWJfdCBiaWdfYmFzZV9pbnZlcnRlZDsKK307CisKKyNkZWZpbmUgICBtcF9iYXNlcyBfX01QTihiYXNlcykKK19fR01QX0RFQ0xTUEVDIGV4dGVybiBjb25zdCBzdHJ1Y3QgYmFzZXMgbXBfYmFzZXNbMjU3XTsKKworCisvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIGJhc2UgZm9yIG5iaXRzIGJpdHMsIG1ha2luZyBzdXJlIHRoZSByZXN1bHQKKyAgIGlzIG5ldmVyIHRvbyBzbWFsbC4gIFRoZSB0d28gdmFyaWFudHMgb2YgdGhlIG1hY3JvIGltcGxlbWVudCB0aGUgc2FtZQorICAgZnVuY3Rpb247IHRoZSBHVDIgdmFyaWFudCBiZWxvdyB3b3JrcyBqdXN0IGZvciBiYXNlcyA+IDIuICAqLworI2RlZmluZSBESUdJVFNfSU5fQkFTRV9GUk9NX0JJVFMocmVzLCBuYml0cywgYikJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfcGgsIF9kdW1teTsJCQkJCQlcCisgICAgc2l6ZV90IF9uYml0cyA9IChuYml0cyk7CQkJCQkJXAorICAgIHVtdWxfcHBtbSAoX3BoLCBfZHVtbXksIG1wX2Jhc2VzW2JdLmxvZ2IyLCBfbmJpdHMpOwkJCVwKKyAgICBfcGggKz0gKF9kdW1teSArIF9uYml0cyA8IF9kdW1teSk7CQkJCQlcCisgICAgcmVzID0gX3BoICsgMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBESUdJVFNfSU5fQkFTRUdUMl9GUk9NX0JJVFMocmVzLCBuYml0cywgYikJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9waCwgX2R1bW15OwkJCQkJCVwKKyAgICBzaXplX3QgX25iaXRzID0gKG5iaXRzKTsJCQkJCQlcCisgICAgdW11bF9wcG1tIChfcGgsIF9kdW1teSwgbXBfYmFzZXNbYl0ubG9nYjIgKyAxLCBfbmJpdHMpOwkJXAorICAgIHJlcyA9IF9waCArIDE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogRm9yIHBvd2VyIG9mIDIgYmFzZXMgdGhpcyBpcyBleGFjdC4gIEZvciBvdGhlciBiYXNlcyB0aGUgcmVzdWx0IGlzIGVpdGhlcgorICAgZXhhY3Qgb3Igb25lIHRvbyBiaWcuCisKKyAgIFRvIGJlIGV4YWN0IGFsd2F5cyBpdCdkIGJlIG5lY2Vzc2FyeSB0byBleGFtaW5lIGFsbCB0aGUgbGltYnMgb2YgdGhlCisgICBvcGVyYW5kLCBzaW5jZSBudW1iZXJzIGxpa2UgMTAwLi4wMDAgYW5kIDk5Li4uOTk5IGdlbmVyYWxseSBkaWZmZXIgb25seQorICAgaW4gdGhlIGxvd2VzdCBsaW1iLiAgSXQnZCBiZSBwb3NzaWJsZSB0byBleGFtaW5lIGp1c3QgYSBjb3VwbGUgb2YgaGlnaAorICAgbGltYnMgdG8gaW5jcmVhc2UgdGhlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGV4YWN0LCBidXQgdGhhdCBkb2Vzbid0IHNlZW0KKyAgIHdvcnRoIGJvdGhlcmluZyB3aXRoLiAgKi8KKworI2RlZmluZSBNUE5fU0laRUlOQkFTRShyZXN1bHQsIHB0ciwgc2l6ZSwgYmFzZSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGludAkgICBfX2xiX2Jhc2UsIF9fY250OwkJCQkJCVwKKyAgICBzaXplX3QgX190b3RiaXRzOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgQVNTRVJUICgoc2l6ZSkgPj0gMCk7CQkJCQkJXAorICAgIEFTU0VSVCAoKGJhc2UpID49IDIpOwkJCQkJCVwKKyAgICBBU1NFUlQgKChiYXNlKSA8IG51bWJlcm9mIChtcF9iYXNlcykpOwkJCQlcCisJCQkJCQkJCQlcCisgICAgLyogU3BlY2lhbCBjYXNlIGZvciBYID09IDAuICAqLwkJCQkJXAorICAgIGlmICgoc2l6ZSkgPT0gMCkJCQkJCQkJXAorICAgICAgKHJlc3VsdCkgPSAxOwkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIG9mIFguICAqLwlcCisJY291bnRfbGVhZGluZ196ZXJvcyAoX19jbnQsIChwdHIpWyhzaXplKS0xXSk7CQkJXAorCV9fdG90Yml0cyA9IChzaXplX3QpIChzaXplKSAqIEdNUF9OVU1CX0JJVFMgLSAoX19jbnQgLSBHTVBfTkFJTF9CSVRTKTtcCisJCQkJCQkJCQlcCisJaWYgKFBPVzJfUCAoYmFzZSkpCQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBfX2xiX2Jhc2UgPSBtcF9iYXNlc1tiYXNlXS5iaWdfYmFzZTsJCQlcCisJICAgIChyZXN1bHQpID0gKF9fdG90Yml0cyArIF9fbGJfYmFzZSAtIDEpIC8gX19sYl9iYXNlOwkJXAorCSAgfQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkgIHsJCQkJCQkJCVwKKwkgICAgRElHSVRTX0lOX0JBU0VHVDJfRlJPTV9CSVRTIChyZXN1bHQsIF9fdG90Yml0cywgYmFzZSk7CVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX1NJWkVJTkJBU0VfMkVYUChyZXN1bHQsIHB0ciwgc2l6ZSwgYmFzZTJleHApCQkJXAorICBkbyB7CQkJCQkJCQkJCVwKKyAgICBpbnQgICAgICAgICAgX19jbnQ7CQkJCQkJCQlcCisgICAgbXBfYml0Y250X3QgIF9fdG90Yml0czsJCQkJCQkJXAorICAgIEFTU0VSVCAoKHNpemUpID4gMCk7CQkJCQkJCVwKKyAgICBBU1NFUlQgKChwdHIpWyhzaXplKS0xXSAhPSAwKTsJCQkJCQlcCisgICAgY291bnRfbGVhZGluZ196ZXJvcyAoX19jbnQsIChwdHIpWyhzaXplKS0xXSk7CQkJCVwKKyAgICBfX3RvdGJpdHMgPSAobXBfYml0Y250X3QpIChzaXplKSAqIEdNUF9OVU1CX0JJVFMgLSAoX19jbnQgLSBHTVBfTkFJTF9CSVRTKTsJXAorICAgIChyZXN1bHQpID0gKF9fdG90Yml0cyArIChiYXNlMmV4cCktMSkgLyAoYmFzZTJleHApOwkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogYml0IGNvdW50IHRvIGxpbWIgY291bnQsIHJvdW5kaW5nIHVwICovCisjZGVmaW5lIEJJVFNfVE9fTElNQlMobikgICgoKG4pICsgKEdNUF9OVU1CX0JJVFMgLSAxKSkgLyBHTVBfTlVNQl9CSVRTKQorCisvKiBNUE5fU0VUX1VJIHNldHMgYW4gbXBuIChwdHIsIGNudCkgdG8gZ2l2ZW4gdWkuICBNUFpfRkFLRV9VSSBjcmVhdGVzIGZha2UKKyAgIG1wel90IGZyb20gdWkuICBUaGUgenAgYXJndW1lbnQgbXVzdCBoYXZlIHJvb20gZm9yIExJTUJTX1BFUl9VTE9ORyBsaW1icworICAgaW4gYm90aCBjYXNlcyAoTElNQlNfUEVSX1VMT05HIGlzIGFsc28gZGVmaW5lZCBoZXJlLikgKi8KKyNpZiBCSVRTX1BFUl9VTE9ORyA8PSBHTVBfTlVNQl9CSVRTIC8qIG5lZWQgb25lIGxpbWIgcGVyIHVsb25nICovCisKKyNkZWZpbmUgTElNQlNfUEVSX1VMT05HIDEKKyNkZWZpbmUgTVBOX1NFVF9VSSh6cCwgem4sIHUpCQkJCQkJXAorICAoenApWzBdID0gKHUpOwkJCQkJCQlcCisgICh6bikgPSAoKHpwKVswXSAhPSAwKTsKKyNkZWZpbmUgTVBaX0ZBS0VfVUkoeiwgenAsIHUpCQkJCQkJXAorICAoenApWzBdID0gKHUpOwkJCQkJCQlcCisgIFBUUiAoeikgPSAoenApOwkJCQkJCQlcCisgIFNJWiAoeikgPSAoKHpwKVswXSAhPSAwKTsJCQkJCQlcCisgIEFTU0VSVF9DT0RFIChBTExPQyAoeikgPSAxKTsKKworI2Vsc2UgLyogbmVlZCB0d28gbGltYnMgcGVyIHVsb25nICovCisKKyNkZWZpbmUgTElNQlNfUEVSX1VMT05HIDIKKyNkZWZpbmUgTVBOX1NFVF9VSSh6cCwgem4sIHUpCQkJCQkJXAorICAoenApWzBdID0gKHUpICYgR01QX05VTUJfTUFTSzsJCQkJCVwKKyAgKHpwKVsxXSA9ICh1KSA+PiBHTVBfTlVNQl9CSVRTOwkJCQkJXAorICAoem4pID0gKCh6cClbMV0gIT0gMCA/IDIgOiAoenApWzBdICE9IDAgPyAxIDogMCk7CisjZGVmaW5lIE1QWl9GQUtFX1VJKHosIHpwLCB1KQkJCQkJCVwKKyAgKHpwKVswXSA9ICh1KSAmIEdNUF9OVU1CX01BU0s7CQkJCQlcCisgICh6cClbMV0gPSAodSkgPj4gR01QX05VTUJfQklUUzsJCQkJCVwKKyAgU0laICh6KSA9ICgoenApWzFdICE9IDAgPyAyIDogKHpwKVswXSAhPSAwID8gMSA6IDApOwkJCVwKKyAgUFRSICh6KSA9ICh6cCk7CQkJCQkJCVwKKyAgQVNTRVJUX0NPREUgKEFMTE9DICh6KSA9IDIpOworCisjZW5kaWYKKworCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2CisjZGVmaW5lIFRBUkdFVF9SRUdJU1RFUl9TVEFSVkVEIDEKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9SRUdJU1RFUl9TVEFSVkVEIDAKKyNlbmRpZgorCisKKy8qIExJTUJfSElHSEJJVF9UT19NQVNLKG4pIGV4YW1pbmVzIHRoZSBoaWdoIGJpdCBvZiBhIGxpbWIgdmFsdWUgYW5kIHR1cm5zIDEKKyAgIG9yIDAgdGhlcmUgaW50byBhIGxpbWIgMHhGRi4uRkYgb3IgMCByZXNwZWN0aXZlbHkuCisKKyAgIE9uIG1vc3QgQ1BVcyB0aGlzIGlzIGp1c3QgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBieSBHTVBfTElNQl9CSVRTLTEsCisgICBidXQgQzk5IGRvZXNuJ3QgZ3VhcmFudGVlIHNpZ25lZCByaWdodCBzaGlmdHMgYXJlIGFyaXRobWV0aWMsIHNvIHdlIGhhdmUKKyAgIGEgbGl0dGxlIGNvbXBpbGUtdGltZSB0ZXN0IGFuZCBhIGZhbGxiYWNrIHRvIGEgIj8gOiIgZm9ybS4gIFRoZSBsYXR0ZXIgaXMKKyAgIG5lY2Vzc2FyeSBmb3IgaW5zdGFuY2Ugb24gQ3JheSB2ZWN0b3Igc3lzdGVtcy4KKworICAgUmVjZW50IHZlcnNpb25zIG9mIGdjYyAoZWcuIDMuMykgd2lsbCBpbiBmYWN0IG9wdGltaXplIGEgIj8gOiIgbGlrZSB0aGlzCisgICB0byBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGFueXdheSwgYnV0IGl0J3MgZ29vZCB0byBnZXQgdGhlIGRlc2lyZWQKKyAgIHNoaWZ0IG9uIHBhc3QgdmVyc2lvbnMgdG9vIChpbiBwYXJ0aWN1bGFyIHNpbmNlIGFuIGltcG9ydGFudCB1c2Ugb2YKKyAgIExJTUJfSElHSEJJVF9UT19NQVNLIGlzIGluIHVkaXZfcXJubmRfcHJlaW52KS4gICovCisKKyNkZWZpbmUgTElNQl9ISUdIQklUX1RPX01BU0sobikJCQkJCQlcCisgICgoKG1wX2xpbWJfc2lnbmVkX3QpIC0xID4+IDEpIDwgMAkJCQkJXAorICAgPyAobXBfbGltYl9zaWduZWRfdCkgKG4pID4+IChHTVBfTElNQl9CSVRTIC0gMSkJCQlcCisgICA6IChuKSAmIEdNUF9MSU1CX0hJR0hCSVQgPyBNUF9MSU1CX1RfTUFYIDogQ05TVF9MSU1CKDApKQorCisKKy8qIFVzZSBhIGxpYnJhcnkgZnVuY3Rpb24gZm9yIGludmVydF9saW1iLCBpZiBhdmFpbGFibGUuICovCisjZGVmaW5lICBtcG5faW52ZXJ0X2xpbWIgX19NUE4oaW52ZXJ0X2xpbWIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2ludmVydF9saW1iIChtcF9saW1iX3QpIEFUVFJJQlVURV9DT05TVDsKKyNpZiAhIGRlZmluZWQgKGludmVydF9saW1iKSAmJiBIQVZFX05BVElWRV9tcG5faW52ZXJ0X2xpbWIKKyNkZWZpbmUgaW52ZXJ0X2xpbWIoaW52eGwseGwpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIChpbnZ4bCkgPSBtcG5faW52ZXJ0X2xpbWIgKHhsKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIGludmVydF9saW1iCisjZGVmaW5lIGludmVydF9saW1iKGludnhsLHhsKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX2R1bW15OwkJCQkJCQlcCisgICAgQVNTRVJUICgoeGwpICE9IDApOwkJCQkJCQlcCisgICAgdWRpdl9xcm5uZCAoaW52eGwsIF9kdW1teSwgfih4bCksIH5DTlNUX0xJTUIoMCksIHhsKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGludmVydF9waTEoZGludiwgZDEsIGQwKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfdiwgX3AsIF90MSwgX3QwLCBfbWFzazsJCQkJCVwKKyAgICBpbnZlcnRfbGltYiAoX3YsIGQxKTsJCQkJCQlcCisgICAgX3AgPSAoZDEpICogX3Y7CQkJCQkJCVwKKyAgICBfcCArPSAoZDApOwkJCQkJCQkJXAorICAgIGlmIChfcCA8IChkMCkpCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX3YtLTsJCQkJCQkJCVwKKwlfbWFzayA9IC0obXBfbGltYl90KSAoX3AgPj0gKGQxKSk7CQkJCVwKKwlfcCAtPSAoZDEpOwkJCQkJCQlcCisJX3YgKz0gX21hc2s7CQkJCQkJCVwKKwlfcCAtPSBfbWFzayAmIChkMSk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF90MSwgX3QwLCBkMCwgX3YpOwkJCQkJXAorICAgIF9wICs9IF90MTsJCQkJCQkJCVwKKyAgICBpZiAoX3AgPCBfdDEpCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX3YtLTsJCQkJCQkJCVwKKwlpZiAoVU5MSUtFTFkgKF9wID49IChkMSkpKQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBpZiAoX3AgPiAoZDEpIHx8IF90MCA+PSAoZDApKQkJCQlcCisJICAgICAgX3YtLTsJCQkJCQkJXAorCSAgfQkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICAoZGludikuaW52MzIgPSBfdjsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisKKy8qIHVkaXZfcXJubmRfcHJlaW52IC0tIEJhc2VkIG9uIHdvcmsgYnkgTmllbHMgTcO2bGxlciBhbmQgVG9yYmrDtnJuIEdyYW5sdW5kLgorICAgV2Ugd3JpdGUgdGhpbmdzIHN0cmFuZ2VseSBiZWxvdywgdG8gaGVscCBnY2MuICBBIG1vcmUgc3RyYWlnaHRmb3J3YXJkCisgICB2ZXJzaW9uOgorCV9yID0gKG5sKSAtIF9xaCAqIChkKTsKKwlfdCA9IF9yICsgKGQpOworCWlmIChfciA+PSBfcWwpCisJICB7CisJICAgIF9xaC0tOworCSAgICBfciA9IF90OworCSAgfQorICAgRm9yIG9uZSBvcGVyYXRpb24gc2hvcnRlciBjcml0aWNhbCBwYXRoLCBvbmUgbWF5IHdhbnQgdG8gdXNlIHRoaXMgZm9ybToKKwlfcCA9IF9xaCAqIChkKQorCV9zID0gKG5sKSArIChkKTsKKwlfciA9IChubCkgLSBfcDsKKwlfdCA9IF9zIC0gX3A7CisJaWYgKF9yID49IF9xbCkKKwkgIHsKKwkgICAgX3FoLS07CisJICAgIF9yID0gX3Q7CisJICB9CisqLworI2RlZmluZSB1ZGl2X3Fybm5kX3ByZWludihxLCByLCBuaCwgbmwsIGQsIGRpKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9xaCwgX3FsLCBfciwgX21hc2s7CQkJCQlcCisgICAgdW11bF9wcG1tIChfcWgsIF9xbCwgKG5oKSwgKGRpKSk7CQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChubCkgJiYgKG5sKSA9PSAwKQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9xaCArPSAobmgpICsgMTsJCQkJCQlcCisJX3IgPSAtIF9xaCAqIChkKTsJCQkJCQlcCisJX21hc2sgPSAtKG1wX2xpbWJfdCkgKF9yID4gX3FsKTsgLyogYm90aCA+IGFuZCA+PSBhcmUgT0sgKi8JXAorCV9xaCArPSBfbWFzazsJCQkJCQkJXAorCV9yICs9IF9tYXNrICYgKGQpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlhZGRfc3NhYWFhIChfcWgsIF9xbCwgX3FoLCBfcWwsIChuaCkgKyAxLCAobmwpKTsJCVwKKwlfciA9IChubCkgLSBfcWggKiAoZCk7CQkJCQkJXAorCV9tYXNrID0gLShtcF9saW1iX3QpIChfciA+IF9xbCk7IC8qIGJvdGggPiBhbmQgPj0gYXJlIE9LICovCVwKKwlfcWggKz0gX21hc2s7CQkJCQkJCVwKKwlfciArPSBfbWFzayAmIChkKTsJCQkJCQlcCisJaWYgKFVOTElLRUxZIChfciA+PSAoZCkpKQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBfciAtPSAoZCk7CQkJCQkJCVwKKwkgICAgX3FoKys7CQkJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgKHIpID0gX3I7CQkJCQkJCQlcCisgICAgKHEpID0gX3FoOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBEaXZpZGluZyAoTkgsIE5MKSBieSBELCByZXR1cm5pbmcgdGhlIHJlbWFpbmRlciBvbmx5LiBVbmxpa2UKKyAgIHVkaXZfcXJubmRfcHJlaW52LCB3b3JrcyBhbHNvIGZvciB0aGUgY2FzZSBOSCA9PSBELCB3aGVyZSB0aGUKKyAgIHF1b3RpZW50IGRvZXNuJ3QgcXVpdGUgZml0IGluIGEgc2luZ2xlIGxpbWIuICovCisjZGVmaW5lIHVkaXZfcm5uZF9wcmVpbnYociwgbmgsIG5sLCBkLCBkaSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfcWgsIF9xbCwgX3IsIF9tYXNrOwkJCQkJXAorICAgIHVtdWxfcHBtbSAoX3FoLCBfcWwsIChuaCksIChkaSkpOwkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobmwpICYmIChubCkgPT0gMCkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlfciA9IH4oX3FoICsgKG5oKSkgKiAoZCk7CQkJCQlcCisJX21hc2sgPSAtKG1wX2xpbWJfdCkgKF9yID4gX3FsKTsgLyogYm90aCA+IGFuZCA+PSBhcmUgT0sgKi8JXAorCV9yICs9IF9tYXNrICYgKGQpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlhZGRfc3NhYWFhIChfcWgsIF9xbCwgX3FoLCBfcWwsIChuaCkgKyAxLCAobmwpKTsJCVwKKwlfciA9IChubCkgLSBfcWggKiAoZCk7CQkJCQkJXAorCV9tYXNrID0gLShtcF9saW1iX3QpIChfciA+IF9xbCk7IC8qIGJvdGggPiBhbmQgPj0gYXJlIE9LICovCVwKKwlfciArPSBfbWFzayAmIChkKTsJCQkJCQlcCisJaWYgKFVOTElLRUxZIChfciA+PSAoZCkpKQkJCQkJXAorCSAgX3IgLT0gKGQpOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIChyKSA9IF9yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBDb21wdXRlIHF1b3RpZW50IHRoZSBxdW90aWVudCBhbmQgcmVtYWluZGVyIGZvciBuIC8gZC4gUmVxdWlyZXMgZAorICAgPj0gQl4yIC8gMiBhbmQgbiA8IGQgQi4gZGkgaXMgdGhlIGludmVyc2UKKworICAgICBmbG9vciAoKEJeMyAtIDEpIC8gKGQwICsgZDEgQikpIC0gQi4KKworICAgTk9URTogT3V0cHV0IHZhcmlhYmxlcyBhcmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcy4gT25seSBzb21lIGlucHV0cworICAgYW5kIG91dHB1dHMgbWF5IG92ZXJsYXAuCisqLworI2RlZmluZSB1ZGl2X3FyXzNieTIocSwgcjEsIHIwLCBuMiwgbjEsIG4wLCBkMSwgZDAsIGRpbnYpCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9xMCwgX3QxLCBfdDAsIF9tYXNrOwkJCQkJXAorICAgIHVtdWxfcHBtbSAoKHEpLCBfcTAsIChuMiksIChkaW52KSk7CQkJCQlcCisgICAgYWRkX3NzYWFhYSAoKHEpLCBfcTAsIChxKSwgX3EwLCAobjIpLCAobjEpKTsJCQlcCisJCQkJCQkJCQlcCisgICAgLyogQ29tcHV0ZSB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgbiAtIHEnZCAqLwkJXAorICAgIChyMSkgPSAobjEpIC0gKGQxKSAqIChxKTsJCQkJCQlcCisgICAgc3ViX2RkbW1zcyAoKHIxKSwgKHIwKSwgKHIxKSwgKG4wKSwgKGQxKSwgKGQwKSk7CQkJXAorICAgIHVtdWxfcHBtbSAoX3QxLCBfdDAsIChkMCksIChxKSk7CQkJCQlcCisgICAgc3ViX2RkbW1zcyAoKHIxKSwgKHIwKSwgKHIxKSwgKHIwKSwgX3QxLCBfdDApOwkJCVwKKyAgICAocSkrKzsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAvKiBDb25kaXRpb25hbGx5IGFkanVzdCBxIGFuZCB0aGUgcmVtYWluZGVycyAqLwkJCVwKKyAgICBfbWFzayA9IC0gKG1wX2xpbWJfdCkgKChyMSkgPj0gX3EwKTsJCQkJXAorICAgIChxKSArPSBfbWFzazsJCQkJCQkJXAorICAgIGFkZF9zc2FhYWEgKChyMSksIChyMCksIChyMSksIChyMCksIF9tYXNrICYgKGQxKSwgX21hc2sgJiAoZDApKTsJXAorICAgIGlmIChVTkxJS0VMWSAoKHIxKSA+PSAoZDEpKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKChyMSkgPiAoZDEpIHx8IChyMCkgPj0gKGQwKSkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICAocSkrKzsJCQkJCQkJXAorCSAgICBzdWJfZGRtbXNzICgocjEpLCAocjApLCAocjEpLCAocjApLCAoZDEpLCAoZDApKTsJCVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZm5kZWYgbXBuX3ByZWludl9kaXZyZW1fMSAgLyogaWYgbm90IGRvbmUgd2l0aCBjcHV2ZWMgaW4gYSBmYXQgYmluYXJ5ICovCisjZGVmaW5lICAgbXBuX3ByZWludl9kaXZyZW1fMSBfX01QTihwcmVpbnZfZGl2cmVtXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3ByZWludl9kaXZyZW1fMSAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgaW50KTsKKyNlbmRpZgorCisKKy8qIFVTRV9QUkVJTlZfRElWUkVNXzEgaXMgd2hldGhlciB0byB1c2UgbXBuX3ByZWludl9kaXZyZW1fMSwgYXMgb3Bwb3NlZCB0byB0aGUKKyAgIHBsYWluIG1wbl9kaXZyZW1fMS4gIFRoZSBkZWZhdWx0IGlzIHllcywgc2luY2UgdGhlIGZldyBDSVNDIGNoaXBzIHdoZXJlCisgICBwcmVpbnYgaXMgbm90IGdvb2QgaGF2ZSBkZWZpbmVzIHNheWluZyBzby4gICovCisjaWZuZGVmIFVTRV9QUkVJTlZfRElWUkVNXzEKKyNkZWZpbmUgVVNFX1BSRUlOVl9ESVZSRU1fMSAgIDEKKyNlbmRpZgorCisjaWYgVVNFX1BSRUlOVl9ESVZSRU1fMQorI2RlZmluZSBNUE5fRElWUkVNX09SX1BSRUlOVl9ESVZSRU1fMShxcCx4c2l6ZSxhcCxzaXplLGQsZGludixzaGlmdCkgICAgXAorICBtcG5fcHJlaW52X2RpdnJlbV8xIChxcCwgeHNpemUsIGFwLCBzaXplLCBkLCBkaW52LCBzaGlmdCkKKyNlbHNlCisjZGVmaW5lIE1QTl9ESVZSRU1fT1JfUFJFSU5WX0RJVlJFTV8xKHFwLHhzaXplLGFwLHNpemUsZCxkaW52LHNoaWZ0KSAgICBcCisgIG1wbl9kaXZyZW1fMSAocXAsIHhzaXplLCBhcCwgc2l6ZSwgZCkKKyNlbmRpZgorCisjaWZuZGVmIFBSRUlOVl9NT0RfMV9UT19NT0RfMV9USFJFU0hPTEQKKyNkZWZpbmUgUFJFSU5WX01PRF8xX1RPX01PRF8xX1RIUkVTSE9MRCAxMAorI2VuZGlmCisKKy8qIFRoaXMgc2VsZWN0aW9uIG1heSBzZWVtIGJhY2t3YXJkcy4gIFRoZSByZWFzb24gbXBuX21vZF8xIHR5cGljYWxseSB0YWtlcworICAgb3ZlciBmb3IgbGFyZ2VyIHNpemVzIGlzIHRoYXQgaXQgdXNlcyB0aGUgbW9kXzFfMSBmdW5jdGlvbi4gICovCisjZGVmaW5lIE1QTl9NT0RfT1JfUFJFSU5WX01PRF8xKHNyYyxzaXplLGRpdmlzb3IsaW52ZXJzZSkJCVwKKyAgKEJFTE9XX1RIUkVTSE9MRCAoc2l6ZSwgUFJFSU5WX01PRF8xX1RPX01PRF8xX1RIUkVTSE9MRCkJCVwKKyAgID8gbXBuX3ByZWludl9tb2RfMSAoc3JjLCBzaXplLCBkaXZpc29yLCBpbnZlcnNlKQkJCVwKKyAgIDogbXBuX21vZF8xIChzcmMsIHNpemUsIGRpdmlzb3IpKQorCisKKyNpZm5kZWYgbXBuX21vZF8zNGxzdWIxICAvKiBpZiBub3QgZG9uZSB3aXRoIGNwdXZlYyBpbiBhIGZhdCBiaW5hcnkgKi8KKyNkZWZpbmUgbXBuX21vZF8zNGxzdWIxIF9fTVBOKG1vZF8zNGxzdWIxKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyLCBtcF9zaXplX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKworLyogRElWRVhBQ1RfMV9USFJFU0hPTEQgaXMgYXQgd2hhdCBzaXplIHRvIHVzZSBtcG5fZGl2ZXhhY3RfMSwgYXMgb3Bwb3NlZCB0bworICAgcGxhaW4gbXBuX2RpdnJlbV8xLiAgTGlrZXdpc2UgQk1PRF8xX1RPX01PRF8xX1RIUkVTSE9MRCBmb3IKKyAgIG1wbl9tb2RleGFjdF8xX29kZCBhZ2FpbnN0IHBsYWluIG1wbl9tb2RfMS4gIE9uIG1vc3QgQ1BVcyBkaXZleGFjdCBhbmQKKyAgIG1vZGV4YWN0IGFyZSBmYXN0ZXIgYXQgYWxsIHNpemVzLCBzbyB0aGUgZGVmYXVsdHMgYXJlIDAuICBUaG9zZSBDUFVzCisgICB3aGVyZSB0aGlzIGlzIG5vdCByaWdodCBoYXZlIGEgdHVuZWQgdGhyZXNob2xkLiAgKi8KKyNpZm5kZWYgRElWRVhBQ1RfMV9USFJFU0hPTEQKKyNkZWZpbmUgRElWRVhBQ1RfMV9USFJFU0hPTEQgIDAKKyNlbmRpZgorI2lmbmRlZiBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xECisjZGVmaW5lIEJNT0RfMV9UT19NT0RfMV9USFJFU0hPTEQgIDEwCisjZW5kaWYKKworI2RlZmluZSBNUE5fRElWUkVNX09SX0RJVkVYQUNUXzEocnAsIHVwLCBuLCBkKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgRElWRVhBQ1RfMV9USFJFU0hPTEQpKQkJCVwKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fZGl2cmVtXzEgKHJwLCAobXBfc2l6ZV90KSAwLCB1cCwgbiwgZCkpOwlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlBU1NFUlQgKG1wbl9tb2RfMSAodXAsIG4sIGQpID09IDApOwkJCQlcCisJbXBuX2RpdmV4YWN0XzEgKHJwLCB1cCwgbiwgZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjaWZuZGVmIG1wbl9tb2RleGFjdF8xY19vZGQgIC8qIGlmIG5vdCBkb25lIHdpdGggY3B1dmVjIGluIGEgZmF0IGJpbmFyeSAqLworI2RlZmluZSBtcG5fbW9kZXhhY3RfMWNfb2RkIF9fTVBOKG1vZGV4YWN0XzFjX29kZCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbW9kZXhhY3RfMWNfb2RkIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fbW9kZXhhY3RfMV9vZGQKKyNkZWZpbmUgICBtcG5fbW9kZXhhY3RfMV9vZGQgIF9fTVBOKG1vZGV4YWN0XzFfb2RkKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RleGFjdF8xX29kZCAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZWxzZQorI2RlZmluZSBtcG5fbW9kZXhhY3RfMV9vZGQoc3JjLHNpemUsZGl2aXNvcikgXAorICBtcG5fbW9kZXhhY3RfMWNfb2RkIChzcmMsIHNpemUsIGRpdmlzb3IsIENOU1RfTElNQigwKSkKKyNlbmRpZgorCisjZGVmaW5lIE1QTl9NT0RfT1JfTU9ERVhBQ1RfMV9PREQoc3JjLHNpemUsZGl2aXNvcikJCQlcCisgIChCRUxPV19USFJFU0hPTEQgKHNpemUsIEJNT0RfMV9UT19NT0RfMV9USFJFU0hPTEQpCQkJXAorICAgPyBtcG5fbW9kZXhhY3RfMV9vZGQgKHNyYywgc2l6ZSwgZGl2aXNvcikJCQkJXAorICAgOiBtcG5fbW9kXzEgKHNyYywgc2l6ZSwgZGl2aXNvcikpCisKKy8qIGJpbnZlcnRfbGltYigpIHNldHMgaW52IHRvIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIG4gbW9kdWxvCisgICAyXkdNUF9OVU1CX0JJVFMsIGllLiBzYXRpc2Z5aW5nIGludipuID09IDEgbW9kIDJeR01QX05VTUJfQklUUy4KKyAgIG4gbXVzdCBiZSBvZGQgKG90aGVyd2lzZSBzdWNoIGFuIGludmVyc2UgZG9lc24ndCBleGlzdCkuCisKKyAgIFRoaXMgaXMgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggaW52ZXJ0X2xpbWIoKSwgd2hpY2ggaXMgY29tcGxldGVseQorICAgZGlmZmVyZW50LgorCisgICBUaGUgdGFibGUgbG9va3VwIGdpdmVzIGFuIGludmVyc2Ugd2l0aCB0aGUgbG93IDggYml0cyB2YWxpZCwgYW5kIGVhY2gKKyAgIG11bHRpcGx5IHN0ZXAgZG91YmxlcyB0aGUgbnVtYmVyIG9mIGJpdHMuICBTZWUgSmViZWxlYW4gIkFuIGFsZ29yaXRobSBmb3IKKyAgIGV4YWN0IGRpdmlzaW9uIiBlbmQgb2Ygc2VjdGlvbiA0IChyZWZlcmVuY2UgaW4gZ21wLnRleGkpLgorCisgICBQb3NzaWJsZSBlbmhhbmNlbWVudDogQ291bGQgdXNlIFVIV3R5cGUgdW50aWwgdGhlIGxhc3Qgc3RlcCwgaWYgaGFsZi1zaXplCisgICBtdWx0aXBsaWVzIGFyZSBmYXN0ZXIgKG1pZ2h0IGhlbHAgdW5kZXIgX0xPTkdfTE9OR19MSU1CKS4KKworICAgQWx0ZXJuYXRpdmU6IEFzIG5vdGVkIGluIEdyYW5sdW5kIGFuZCBNb250Z29tZXJ5ICJEaXZpc2lvbiBieSBJbnZhcmlhbnQKKyAgIEludGVnZXJzIHVzaW5nIE11bHRpcGxpY2F0aW9uIiAocmVmZXJlbmNlIGluIGdtcC50ZXhpKSwgbiBpdHNlbGYgZ2l2ZXMgYQorICAgMy1iaXQgaW52ZXJzZSBpbW1lZGlhdGVseSwgYW5kIGNvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBhIHRhYmxlIGxvb2t1cC4KKyAgIEEgNC1iaXQgaW52ZXJzZSBjYW4gYmUgb2J0YWluZWQgZWZmZWN0aXZlbHkgZnJvbSB4b3JpbmcgYml0cyAxIGFuZCAyIGludG8KKyAgIGJpdCAzLCBmb3IgaW5zdGFuY2Ugd2l0aCAoKChuICsgMikgJiA0KSA8PCAxKSBeIG4uICAqLworCisjZGVmaW5lIGJpbnZlcnRfbGltYl90YWJsZSAgX19nbXBfYmludmVydF9saW1iX3RhYmxlCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciAgYmludmVydF9saW1iX3RhYmxlWzEyOF07CisKKyNkZWZpbmUgYmludmVydF9saW1iKGludixuKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fbiA9IChuKTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX2ludjsJCQkJCQkJXAorICAgIEFTU0VSVCAoKF9fbiAmIDEpID09IDEpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBfX2ludiA9IGJpbnZlcnRfbGltYl90YWJsZVsoX19uLzIpICYgMHg3Rl07IC8qICA4ICovCQlcCisgICAgaWYgKEdNUF9OVU1CX0JJVFMgPiA4KSAgIF9faW52ID0gMiAqIF9faW52IC0gX19pbnYgKiBfX2ludiAqIF9fbjsJXAorICAgIGlmIChHTVBfTlVNQl9CSVRTID4gMTYpICBfX2ludiA9IDIgKiBfX2ludiAtIF9faW52ICogX19pbnYgKiBfX247CVwKKyAgICBpZiAoR01QX05VTUJfQklUUyA+IDMyKSAgX19pbnYgPSAyICogX19pbnYgLSBfX2ludiAqIF9faW52ICogX19uOwlcCisJCQkJCQkJCQlcCisgICAgaWYgKEdNUF9OVU1CX0JJVFMgPiA2NCkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWludCAgX19pbnZiaXRzID0gNjQ7CQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkgIF9faW52ID0gMiAqIF9faW52IC0gX19pbnYgKiBfX2ludiAqIF9fbjsJCQlcCisJICBfX2ludmJpdHMgKj0gMjsJCQkJCQlcCisJfSB3aGlsZSAoX19pbnZiaXRzIDwgR01QX05VTUJfQklUUyk7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgQVNTRVJUICgoX19pbnYgKiBfX24gJiBHTVBfTlVNQl9NQVNLKSA9PSAxKTsJCQlcCisgICAgKGludikgPSBfX2ludiAmIEdNUF9OVU1CX01BU0s7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIG1vZGxpbWJfaW52ZXJ0IGJpbnZlcnRfbGltYiAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCisvKiBNdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIDMsIG1vZHVsbyAyXkdNUF9OVU1CX0JJVFMuCisgICBFZy4gMHhBQUFBQUFBQiBmb3IgMzIgYml0cywgMHhBQUFBQUFBQUFBQUFBQUFCIGZvciA2NCBiaXRzLgorICAgR01QX05VTUJfTUFYLzMqMisxIGlzIHJpZ2h0IHdoZW4gR01QX05VTUJfQklUUyBpcyBldmVuLCBidXQgd2hlbiBpdCdzIG9kZAorICAgd2UgbmVlZCB0byBzdGFydCBmcm9tIEdNUF9OVU1CX01BWD4+MS4gKi8KKyNkZWZpbmUgTU9ETElNQl9JTlZFUlNFXzMgKCgoR01QX05VTUJfTUFYID4+IChHTVBfTlVNQl9CSVRTICUgMikpIC8gMykgKiAyICsgMSkKKworLyogY2VpbChHTVBfTlVNQl9NQVgvMykgYW5kIGNlaWwoMipHTVBfTlVNQl9NQVgvMykuCisgICBUaGVzZSBleHByZXNzaW9ucyB3b3JrIGJlY2F1c2UgR01QX05VTUJfTUFYJTMgIT0gMCBmb3IgYWxsIEdNUF9OVU1CX0JJVFMuICovCisjZGVmaW5lIEdNUF9OVU1CX0NFSUxfTUFYX0RJVjMgICAoR01QX05VTUJfTUFYIC8gMyArIDEpCisjZGVmaW5lIEdNUF9OVU1CX0NFSUxfMk1BWF9ESVYzICAoKEdNUF9OVU1CX01BWD4+MSkgLyAzICsgMSArIEdNUF9OVU1CX0hJR0hCSVQpCisKKworLyogU2V0IHIgdG8gLWEgbW9kIGQuICBhPj1kIGlzIGFsbG93ZWQuICBDYW4gZ2l2ZSByPmQuICBBbGwgc2hvdWxkIGJlIGxpbWJzLgorCisgICBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgY2FsY3VsYXRpb24uCisgICBBbnl0aGluZyBjb25ncnVlbnQgdG8gLWEgd291bGQgYmUgZmluZSBmb3IgdGhlIG9uZSBsaW1iIGNvbmdydWVuY2UKKyAgIHRlc3RzLiAgKi8KKworI2RlZmluZSBORUdfTU9EKHIsIGEsIGQpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKGQpICE9IDApOwkJCQkJCQlcCisgICAgQVNTRVJUX0xJTUIgKGEpOwkJCQkJCQlcCisgICAgQVNTRVJUX0xJTUIgKGQpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgaWYgKChhKSA8PSAoZCkpCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJLyogc21hbGwgYSBpcyByZWFzb25hYmx5IGxpa2VseSAqLwkJCQlcCisJKHIpID0gKGQpIC0gKGEpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwl1bnNpZ25lZCAgIF9fdHdvczsJCQkJCQlcCisJbXBfbGltYl90ICBfX2Rub3JtOwkJCQkJCVwKKwljb3VudF9sZWFkaW5nX3plcm9zIChfX3R3b3MsIGQpOwkJCQlcCisJX190d29zIC09IEdNUF9OQUlMX0JJVFM7CQkJCQlcCisJX19kbm9ybSA9IChkKSA8PCBfX3R3b3M7CQkJCQlcCisJKHIpID0gKChhKSA8PSBfX2Rub3JtID8gX19kbm9ybSA6IDIqX19kbm9ybSkgLSAoYSk7CQlcCisgICAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVF9MSU1CIChyKTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBBIGJpdCBtYXNrIG9mIGFsbCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgemVybyBiaXRzIG9mIG4sIG9yIC0xIGlmIG49PTAuICovCisjZGVmaW5lIExPV19aRVJPU19NQVNLKG4pICAoKChuKSAmIC0obikpIC0gMSkKKworCisvKiBVTE9OR19QQVJJVFkgc2V0cyAicCIgdG8gMSBpZiB0aGVyZSdzIGFuIG9kZCBudW1iZXIgb2YgMSBiaXRzIGluICJuIiwgb3IKKyAgIHRvIDAgaWYgdGhlcmUncyBhbiBldmVuIG51bWJlci4gICJuIiBzaG91bGQgYmUgYW4gdW5zaWduZWQgbG9uZyBhbmQgInAiCisgICBhbiBpbnQuICAqLworCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoTk9fQVNNKSAmJiBIQVZFX0hPU1RfQ1BVX2FscGhhX0NJWAorI2RlZmluZSBVTE9OR19QQVJJVFkocCwgbikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaW50IF9fcDsJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgiY3Rwb3AgJTEsICUwIiA6ICI9ciIgKF9fcCkgOiAiciIgKG4pKTsJCQlcCisgICAgKHApID0gX19wICYgMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENyYXkgaW50cmluc2ljIF9wb3BjbnQuICovCisjaWZkZWYgX0NSQVkKKyNkZWZpbmUgVUxPTkdfUEFSSVRZKHAsIG4pICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHApID0gX3BvcGNudCAobikgJiAxOyAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikJCQlcCisgICAgJiYgISBkZWZpbmVkIChOT19BU00pICYmIGRlZmluZWQgKF9faWE2NCkKKy8qIHVuc2lnbmVkIGxvbmcgaXMgZWl0aGVyIDMyIG9yIDY0IGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBBQkksIHplcm8gZXh0ZW5kCisgICB0byBhIDY0IGJpdCB1bnNpZ25lZCBsb25nIGxvbmcgZm9yIHBvcGNudCAqLworI2RlZmluZSBVTE9OR19QQVJJVFkocCwgbikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5zaWduZWQgbG9uZyBsb25nICBfX24gPSAodW5zaWduZWQgbG9uZykgKG4pOwkJCVwKKyAgICBpbnQgIF9fcDsJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgicG9wY250ICUwID0gJTEiIDogIj1yIiAoX19wKSA6ICJyIiAoX19uKSk7CQlcCisgICAgKHApID0gX19wICYgMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgISBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKQkJCVwKKyAgICAmJiAhIGRlZmluZWQgKE5PX0FTTSkgJiYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2CisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDMsMSkKKyNkZWZpbmUgX19HTVBfcW0gIj1RbSIKKyNkZWZpbmUgX19HTVBfcSAiPVEiCisjZWxzZQorI2RlZmluZSBfX0dNUF9xbSAiPXFtIgorI2RlZmluZSBfX0dNUF9xICI9cSIKKyNlbmRpZgorI2RlZmluZSBVTE9OR19QQVJJVFkocCwgbikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgY2hhcgkgICBfX3A7CQkJCQkJCVwKKyAgICB1bnNpZ25lZCBsb25nICBfX24gPSAobik7CQkJCQkJXAorICAgIF9fbiBePSAoX19uID4+IDE2KTsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJ4b3JiICVoMSwgJWIxXG5cdCIJCQkJCVwKKwkgICAgICJzZXRwbyAlMCIJCQkJCQkJXAorCSA6IF9fR01QX3FtIChfX3ApLCBfX0dNUF9xIChfX24pCQkJCVwKKwkgOiAiMSIgKF9fbikpOwkJCQkJCQlcCisgICAgKHApID0gX19wOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKFVMT05HX1BBUklUWSkKKyNkZWZpbmUgVUxPTkdfUEFSSVRZKHAsIG4pCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuc2lnbmVkIGxvbmcgIF9fbiA9IChuKTsJCQkJCQlcCisgICAgaW50ICBfX3AgPSAwOwkJCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcCBePSAweDk2Njk2OTk2TCA+PiAoX19uICYgMHgxRik7CQkJCVwKKwlfX24gPj49IDU7CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKF9fbiAhPSAwKTsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIChwKSA9IF9fcCAmIDE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIDMgY3ljbGVzIG9uIDYwNCBvciA3NTAgc2luY2Ugc2hpZnRzIGFuZCBybHdpbWkncyBjYW4gcGFpci4gIGdjYyAoYXMgb2YKKyAgIHZlcnNpb24gMy4xIGF0IGxlYXN0KSBkb2Vzbid0IHNlZW0gdG8ga25vdyBob3cgdG8gZ2VuZXJhdGUgcmx3aW1pIGZvcgorICAgYW55dGhpbmcgb3RoZXIgdGhhbiBiaXQtZmllbGRzLCBzbyB1c2UgImFzbSIuICAqLworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkgICAgICAgICAgICAgICAgICAgIFwKKyAgJiYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJwYyAmJiBHTVBfTElNQl9CSVRTID09IDMyCisjZGVmaW5lIEJTV0FQX0xJTUIoZHN0LCBzcmMpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX19ic3dhcGxfc3JjID0gKHNyYyk7CQkJCQlcCisgICAgbXBfbGltYl90ICBfX3RtcDEgPSBfX2Jzd2FwbF9zcmMgPj4gMjQ7CQkvKiBsb3cgYnl0ZSAqLwlcCisgICAgbXBfbGltYl90ICBfX3RtcDIgPSBfX2Jzd2FwbF9zcmMgPDwgMjQ7CQkvKiBoaWdoIGJ5dGUgKi8JXAorICAgIF9fYXNtX18gKCJybHdpbWkgJTAsICUyLCAyNCwgMTYsIDIzIgkJLyogMm5kIGxvdyAqLwlcCisJIDogIj1yIiAoX190bXAxKSA6ICIwIiAoX190bXAxKSwgInIiIChfX2Jzd2FwbF9zcmMpKTsJCVwKKyAgICBfX2FzbV9fICgicmx3aW1pICUwLCAlMiwgIDgsICA4LCAxNSIJCS8qIDNuZCBoaWdoICovCVwKKwkgOiAiPXIiIChfX3RtcDIpIDogIjAiIChfX3RtcDIpLCAiciIgKF9fYnN3YXBsX3NyYykpOwkJXAorICAgIChkc3QpID0gX190bXAxIHwgX190bXAyOwkJCQkvKiB3aG9sZSAqLwlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogYnN3YXAgaXMgYXZhaWxhYmxlIG9uIGk0ODYgYW5kIHVwIGFuZCBpcyBmYXN0LiAgQSBjb21iaW5hdGlvbiByb3J3ICQ4IC8KKyAgIHJvbGwgJDE2IC8gcm9ydyAkOCBpcyB1c2VkIGluIGdsaWJjIGZvciBwbGFpbiBpMzg2IChhbmQgaW4gdGhlIGxpbnV4CisgICBrZXJuZWwgd2l0aCB4Y2hnYiBpbnN0ZWFkIG9mIHJvcncpLCBidXQgdGhpcyBpcyBub3QgZG9uZSBoZXJlLCBiZWNhdXNlCisgICBpMzg2IG1lYW5zIGdlbmVyaWMgeDg2IGFuZCBtaXhpbmcgd29yZCBhbmQgZHdvcmQgb3BlcmF0aW9ucyB3aWxsIGNhdXNlCisgICBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxscyBvbiBQNiBjaGlwcy4gICovCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoTk9fQVNNKSAgICAgICAgICAgIFwKKyAgJiYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2ICYmICEgSEFWRV9IT1NUX0NQVV9pMzg2ICAgXAorICAmJiBHTVBfTElNQl9CSVRTID09IDMyCisjZGVmaW5lIEJTV0FQX0xJTUIoZHN0LCBzcmMpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChkc3QpIDogIjAiIChzcmMpKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkgICAgICAgICAgICBcCisgICYmIGRlZmluZWQgKF9fYW1kNjRfXykgJiYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBCU1dBUF9MSU1CKGRzdCwgc3JjKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnN3YXAgJXEwIiA6ICI9ciIgKGRzdCkgOiAiMCIgKHNyYykpOwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikJCQlcCisgICAgJiYgISBkZWZpbmVkIChOT19BU00pICYmIGRlZmluZWQgKF9faWE2NCkgJiYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBCU1dBUF9MSU1CKGRzdCwgc3JjKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXV4MSAlMCA9ICUxLCBAcmV2IiA6ICI9ciIgKGRzdCkgOiAgInIiIChzcmMpKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBBcyBwZXIgZ2xpYmMuICovCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoTk9fQVNNKSAgICAgICAgICAgICAgICAgICAgXAorICAmJiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9tNjhrICYmIEdNUF9MSU1CX0JJVFMgPT0gMzIKKyNkZWZpbmUgQlNXQVBfTElNQihkc3QsIHNyYykJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX2Jzd2FwbF9zcmMgPSAoc3JjKTsJCQkJCVwKKyAgICBfX2FzbV9fICgicm9yJS53ICUjOCwgJTBcblx0IgkJCQkJXAorCSAgICAgInN3YXAgICAlMFxuXHQiCQkJCQkJXAorCSAgICAgInJvciUudyAlIzgsICUwIgkJCQkJCVwKKwkgICAgIDogIj1kIiAoZHN0KQkJCQkJCVwKKwkgICAgIDogIjAiIChfX2Jzd2FwbF9zcmMpKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIChCU1dBUF9MSU1CKQorI2lmIEdNUF9MSU1CX0JJVFMgPT0gOAorI2RlZmluZSBCU1dBUF9MSU1CKGRzdCwgc3JjKQkJCQlcCisgIGRvIHsgKGRzdCkgPSAoc3JjKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmIEdNUF9MSU1CX0JJVFMgPT0gMTYKKyNkZWZpbmUgQlNXQVBfTElNQihkc3QsIHNyYykJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgKGRzdCkgPSAoKHNyYykgPDwgOCkgKyAoKHNyYykgPj4gOCk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmIEdNUF9MSU1CX0JJVFMgPT0gMzIKKyNkZWZpbmUgQlNXQVBfTElNQihkc3QsIHNyYykJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgKGRzdCkgPQkJCQkJCQkJXAorICAgICAgKChzcmMpIDw8IDI0KQkJCQkJCQlcCisgICAgICArICgoKHNyYykgJiAweEZGMDApIDw8IDgpCQkJCQkJXAorICAgICAgKyAoKChzcmMpID4+IDgpICYgMHhGRjAwKQkJCQkJCVwKKyAgICAgICsgKChzcmMpID4+IDI0KTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBCU1dBUF9MSU1CKGRzdCwgc3JjKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICAoZHN0KSA9CQkJCQkJCQlcCisgICAgICAoKHNyYykgPDwgNTYpCQkJCQkJCVwKKyAgICAgICsgKCgoc3JjKSAmIDB4RkYwMCkgPDwgNDApCQkJCQlcCisgICAgICArICgoKHNyYykgJiAweEZGMDAwMCkgPDwgMjQpCQkJCQlcCisgICAgICArICgoKHNyYykgJiAweEZGMDAwMDAwKSA8PCA4KQkJCQkJXAorICAgICAgKyAoKChzcmMpID4+IDgpICYgMHhGRjAwMDAwMCkJCQkJCVwKKyAgICAgICsgKCgoc3JjKSA+PiAyNCkgJiAweEZGMDAwMCkJCQkJCVwKKyAgICAgICsgKCgoc3JjKSA+PiA0MCkgJiAweEZGMDApCQkJCQlcCisgICAgICArICgoc3JjKSA+PiA1Nik7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKEJTV0FQX0xJTUIpCisjZGVmaW5lIEJTV0FQX0xJTUIoZHN0LCBzcmMpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX19ic3dhcGxfc3JjID0gKHNyYyk7CQkJCQlcCisgICAgbXBfbGltYl90ICBfX2RzdGwgPSAwOwkJCQkJCVwKKyAgICBpbnQJICAgICAgIF9faTsJCQkJCQkJXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgR01QX0xJTUJfQllURVM7IF9faSsrKQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19kc3RsID0gKF9fZHN0bCA8PCA4KSB8IChfX2Jzd2FwbF9zcmMgJiAweEZGKTsJCQlcCisJX19ic3dhcGxfc3JjID4+PSA4OwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgKGRzdCkgPSBfX2RzdGw7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIEFwcGFyZW50bHkgbHdicnggbWlnaHQgYmUgc2xvdyBvbiBzb21lIFBvd2VyUEMgY2hpcHMsIHNvIHJlc3RyaWN0IGl0IHRvCisgICB0aG9zZSB3ZSBrbm93IGFyZSBmYXN0LiAgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgISBkZWZpbmVkIChOT19BU00pCQkJCVwKKyAgJiYgR01QX0xJTUJfQklUUyA9PSAzMiAmJiBIQVZFX0xJTUJfQklHX0VORElBTgkJCVwKKyAgJiYgKEhBVkVfSE9TVF9DUFVfcG93ZXJwYzYwNAkJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcG93ZXJwYzYwNGUJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcG93ZXJwYzc1MAkJCQkJXAorICAgICAgfHwgSEFWRV9IT1NUX0NQVV9wb3dlcnBjNzQwMCkKKyNkZWZpbmUgQlNXQVBfTElNQl9GRVRDSChsaW1iLCBzcmMpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc3JjcHRyICBfX2JsZl9zcmMgPSAoc3JjKTsJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fbGltYjsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJsd2JyeCAlMCwgMCwgJTEiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX2xpbWIpCQkJCQkJXAorCSAgICAgOiAiciIgKF9fYmxmX3NyYyksCQkJCQkJXAorCSAgICAgICAibSIgKCpfX2JsZl9zcmMpKTsJCQkJCVwKKyAgICAobGltYikgPSBfX2xpbWI7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIChCU1dBUF9MSU1CX0ZFVENIKQorI2RlZmluZSBCU1dBUF9MSU1CX0ZFVENIKGxpbWIsIHNyYykgIEJTV0FQX0xJTUIgKGxpbWIsICooc3JjKSkKKyNlbmRpZgorCisKKy8qIE9uIHRoZSBzYW1lIGJhc2lzIHRoYXQgbHdicnggbWlnaHQgYmUgc2xvdywgcmVzdHJpY3Qgc3R3YnJ4IHRvIHRob3NlIHdlCisgICBrbm93IGFyZSBmYXN0LiAgRklYTUU6IElzIHRoaXMgbmVjZXNzYXJ5PyAgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgISBkZWZpbmVkIChOT19BU00pCQkJCVwKKyAgJiYgR01QX0xJTUJfQklUUyA9PSAzMiAmJiBIQVZFX0xJTUJfQklHX0VORElBTgkJCVwKKyAgJiYgKEhBVkVfSE9TVF9DUFVfcG93ZXJwYzYwNAkJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcG93ZXJwYzYwNGUJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcG93ZXJwYzc1MAkJCQkJXAorICAgICAgfHwgSEFWRV9IT1NUX0NQVV9wb3dlcnBjNzQwMCkKKyNkZWZpbmUgQlNXQVBfTElNQl9TVE9SRShkc3QsIGxpbWIpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyICAgICBfX2RzdCA9IChkc3QpOwkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9fbGltYiA9IChsaW1iKTsJCQkJCQlcCisgICAgX19hc21fXyAoInN0d2JyeCAlMSwgMCwgJTIiCQkJCQkJXAorCSAgICAgOiAiPW0iICgqX19kc3QpCQkJCQkJXAorCSAgICAgOiAiciIgKF9fbGltYiksCQkJCQkJXAorCSAgICAgICAiciIgKF9fZHN0KSk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKEJTV0FQX0xJTUJfU1RPUkUpCisjZGVmaW5lIEJTV0FQX0xJTUJfU1RPUkUoZHN0LCBsaW1iKSAgQlNXQVBfTElNQiAoKihkc3QpLCBsaW1iKQorI2VuZGlmCisKKworLyogQnl0ZSBzd2FwIGxpbWJzIGZyb20ge3NyYyxzaXplfSBhbmQgc3RvcmUgYXQge2RzdCxzaXplfS4gKi8KKyNkZWZpbmUgTVBOX0JTV0FQKGRzdCwgc3JjLCBzaXplKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX3B0ciAgICAgX19kc3QgPSAoZHN0KTsJCQkJCQlcCisgICAgbXBfc3JjcHRyICBfX3NyYyA9IChzcmMpOwkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9fc2l6ZSA9IChzaXplKTsJCQkJCQlcCisgICAgbXBfc2l6ZV90ICBfX2k7CQkJCQkJCVwKKyAgICBBU1NFUlQgKChzaXplKSA+PSAwKTsJCQkJCQlcCisgICAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChkc3QsIHNyYywgc2l6ZSkpOwkJCVwKKyAgICBDUkFZX1ByYWdtYSAoIl9DUkkgaXZkZXAiKTsJCQkJCQlcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX3NpemU7IF9faSsrKQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlCU1dBUF9MSU1CX0ZFVENIICgqX19kc3QsIF9fc3JjKTsJCQkJXAorCV9fZHN0Kys7CQkJCQkJCVwKKwlfX3NyYysrOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBCeXRlIHN3YXAgbGltYnMgZnJvbSB7ZHN0LHNpemV9IGFuZCBzdG9yZSBpbiByZXZlcnNlIG9yZGVyIGF0IHtzcmMsc2l6ZX0uICovCisjZGVmaW5lIE1QTl9CU1dBUF9SRVZFUlNFKGRzdCwgc3JjLCBzaXplKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyICAgICBfX2RzdCA9IChkc3QpOwkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9fc2l6ZSA9IChzaXplKTsJCQkJCQlcCisgICAgbXBfc3JjcHRyICBfX3NyYyA9IChzcmMpICsgX19zaXplIC0gMTsJCQkJXAorICAgIG1wX3NpemVfdCAgX19pOwkJCQkJCQlcCisgICAgQVNTRVJUICgoc2l6ZSkgPj0gMCk7CQkJCQkJXAorICAgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChkc3QsIHNpemUsIHNyYywgc2l6ZSkpOwkJCVwKKyAgICBDUkFZX1ByYWdtYSAoIl9DUkkgaXZkZXAiKTsJCQkJCQlcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX3NpemU7IF9faSsrKQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlCU1dBUF9MSU1CX0ZFVENIICgqX19kc3QsIF9fc3JjKTsJCQkJXAorCV9fZHN0Kys7CQkJCQkJCVwKKwlfX3NyYy0tOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisKKy8qIE5vIHByb2Nlc3NvciBjbGFpbWluZyB0byBiZSBTUEFSQyB2OSBjb21wbGlhbnQgc2VlbXMgdG8KKyAgIGltcGxlbWVudCB0aGUgUE9QQyBpbnN0cnVjdGlvbi4gIERpc2FibGUgcGF0dGVybiBmb3Igbm93LiAgKi8KKyNpZiAwCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fc3BhcmNfdjlfXyAmJiBHTVBfTElNQl9CSVRTID09IDY0CisjZGVmaW5lIHBvcGNfbGltYihyZXN1bHQsIGlucHV0KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIERJdHlwZSBfX3JlczsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJwb3BjICUxLCUwIiA6ICI9ciIgKHJlc3VsdCkgOiAickkiIChpbnB1dCkpOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkgJiYgSEFWRV9IT1NUX0NQVV9hbHBoYV9DSVgKKyNkZWZpbmUgcG9wY19saW1iKHJlc3VsdCwgaW5wdXQpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgX19hc21fXyAoImN0cG9wICUxLCAlMCIgOiAiPXIiIChyZXN1bHQpIDogInIiIChpbnB1dCkpOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENyYXkgaW50cmluc2ljLiAqLworI2lmZGVmIF9DUkFZCisjZGVmaW5lIHBvcGNfbGltYihyZXN1bHQsIGlucHV0KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIChyZXN1bHQpID0gX3BvcGNudCAoaW5wdXQpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikJCQlcCisgICAgJiYgISBkZWZpbmVkIChOT19BU00pICYmIGRlZmluZWQgKF9faWE2NCkgJiYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBwb3BjX2xpbWIocmVzdWx0LCBpbnB1dCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgicG9wY250ICUwID0gJTEiIDogIj1yIiAocmVzdWx0KSA6ICJyIiAoaW5wdXQpKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBDb29sIHBvcHVsYXRpb24gY291bnQgb2YgYW4gbXBfbGltYl90LgorICAgWW91IGhhdmUgdG8gZmlndXJlIG91dCBob3cgdGhpcyB3b3JrcywgV2Ugd29uJ3QgdGVsbCB5b3UhCisKKyAgIFRoZSBjb25zdGFudHMgY291bGQgYWxzbyBiZSBleHByZXNzZWQgYXM6CisgICAgIDB4NTUuLi4gPSBbMl5OIC8gM10gICAgID0gWygyXk4tMSkvM10KKyAgICAgMHgzMy4uLiA9IFsyXk4gLyA1XSAgICAgPSBbKDJeTi0xKS81XQorICAgICAweDBmLi4uID0gWzJeTiAvIDE3XSAgICA9IFsoMl5OLTEpLzE3XQorICAgICAoTiBpcyBHTVBfTElNQl9CSVRTLCBbXSBkZW5vdGVzIHRydW5jYXRpb24uKSAqLworCisjaWYgISBkZWZpbmVkIChwb3BjX2xpbWIpICYmIEdNUF9MSU1CX0JJVFMgPT0gOAorI2RlZmluZSBwb3BjX2xpbWIocmVzdWx0LCBpbnB1dCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9feCA9IChpbnB1dCk7CQkJCQkJXAorICAgIF9feCAtPSAoX194ID4+IDEpICYgTVBfTElNQl9UX01BWC8zOwkJCQlcCisgICAgX194ID0gKChfX3ggPj4gMikgJiBNUF9MSU1CX1RfTUFYLzUpICsgKF9feCAmIE1QX0xJTUJfVF9NQVgvNSk7CVwKKyAgICBfX3ggPSAoKF9feCA+PiA0KSArIF9feCk7CQkJCQkJXAorICAgIChyZXN1bHQpID0gX194ICYgMHgwZjsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCAocG9wY19saW1iKSAmJiBHTVBfTElNQl9CSVRTID09IDE2CisjZGVmaW5lIHBvcGNfbGltYihyZXN1bHQsIGlucHV0KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX194ID0gKGlucHV0KTsJCQkJCQlcCisgICAgX194IC09IChfX3ggPj4gMSkgJiBNUF9MSU1CX1RfTUFYLzM7CQkJCVwKKyAgICBfX3ggPSAoKF9feCA+PiAyKSAmIE1QX0xJTUJfVF9NQVgvNSkgKyAoX194ICYgTVBfTElNQl9UX01BWC81KTsJXAorICAgIF9feCArPSAoX194ID4+IDQpOwkJCQkJCQlcCisgICAgX194ID0gKChfX3ggPj4gOCkgJiBNUF9MSU1CX1RfTUFYLzQzNjkpKyhfX3ggJiBNUF9MSU1CX1RfTUFYLzQzNjkpOwlcCisgICAgKHJlc3VsdCkgPSBfX3g7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIChwb3BjX2xpbWIpICYmIEdNUF9MSU1CX0JJVFMgPT0gMzIKKyNkZWZpbmUgcG9wY19saW1iKHJlc3VsdCwgaW5wdXQpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX3ggPSAoaW5wdXQpOwkJCQkJCVwKKyAgICBfX3ggLT0gKF9feCA+PiAxKSAmIE1QX0xJTUJfVF9NQVgvMzsJCQkJXAorICAgIF9feCA9ICgoX194ID4+IDIpICYgTVBfTElNQl9UX01BWC81KSArIChfX3ggJiBNUF9MSU1CX1RfTUFYLzUpOwlcCisgICAgX194ID0gKChfX3ggPj4gNCkgKyBfX3gpICYgTVBfTElNQl9UX01BWC8xNzsJCQlcCisgICAgX194ID0gKChfX3ggPj4gOCkgKyBfX3gpOwkJCQkJCVwKKyAgICBfX3ggPSAoKF9feCA+PiAxNikgKyBfX3gpOwkJCQkJCVwKKyAgICAocmVzdWx0KSA9IF9feCAmIDB4ZmY7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKHBvcGNfbGltYikgJiYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBwb3BjX2xpbWIocmVzdWx0LCBpbnB1dCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgIF9feCA9IChpbnB1dCk7CQkJCQkJXAorICAgIF9feCAtPSAoX194ID4+IDEpICYgTVBfTElNQl9UX01BWC8zOwkJCQlcCisgICAgX194ID0gKChfX3ggPj4gMikgJiBNUF9MSU1CX1RfTUFYLzUpICsgKF9feCAmIE1QX0xJTUJfVF9NQVgvNSk7CVwKKyAgICBfX3ggPSAoKF9feCA+PiA0KSArIF9feCkgJiBNUF9MSU1CX1RfTUFYLzE3OwkJCVwKKyAgICBfX3ggPSAoKF9feCA+PiA4KSArIF9feCk7CQkJCQkJXAorICAgIF9feCA9ICgoX194ID4+IDE2KSArIF9feCk7CQkJCQkJXAorICAgIF9feCA9ICgoX194ID4+IDMyKSArIF9feCk7CQkJCQkJXAorICAgIChyZXN1bHQpID0gX194ICYgMHhmZjsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBEZWZpbmUgc3R1ZmYgZm9yIGxvbmdsb25nLmguICAqLworI2lmIEhBVkVfQVRUUklCVVRFX01PREUKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVRSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFFJKSkpOwordHlwZWRlZgkJIGludCBTSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVNJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7Cit0eXBlZGVmCQkgaW50IERJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVREl0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChESSkpKTsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVVFJdHlwZTsKK3R5cGVkZWYJCSBsb25nIFNJdHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVU0l0eXBlOworI2lmIEhBVkVfTE9OR19MT05HCit0eXBlZGVmCWxvbmcgbG9uZyBpbnQgREl0eXBlOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IFVESXR5cGU7CisjZWxzZSAvKiBBc3N1bWUgYGxvbmcnIGdpdmVzIHVzIGEgd2lkZSBlbm91Z2ggdHlwZS4gIE5lZWRlZCBmb3IgaHBwYTIuMHcuICAqLwordHlwZWRlZiBsb25nIGludCBESXR5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IFVESXR5cGU7CisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIG1wX2xpbWJfdCBVV3R5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSFd0eXBlOworI2RlZmluZSBXX1RZUEVfU0laRSBHTVBfTElNQl9CSVRTCisKKy8qIERlZmluZSBpZWVlX2RvdWJsZV9leHRyYWN0IGFuZCBfR01QX0lFRUVfRkxPQVRTLgorCisgICBCaXQgZmllbGQgcGFja2luZyBpcyAiaW1wbGVtZW50YXRpb24gZGVmaW5lZCIgYWNjb3JkaW5nIHRvIEM5OSwgd2hpY2gKKyAgIGxlYXZlcyB1cyBhdCB0aGUgY29tcGlsZXIncyBtZXJjeSBoZXJlLiAgRm9yIHNvbWUgc3lzdGVtcyBwYWNraW5nIGlzCisgICBkZWZpbmVkIGluIHRoZSBBQkkgKGVnLiB4ODYpLiAgSW4gYW55IGNhc2Ugc28gZmFyIGl0IHNlZW1zIHVuaXZlcnNhbCB0aGF0CisgICBsaXR0bGUgZW5kaWFuIHN5c3RlbXMgcGFjayBmcm9tIGxvdyB0byBoaWdoLCBhbmQgYmlnIGVuZGlhbiBmcm9tIGhpZ2ggdG8KKyAgIGxvdyB3aXRoaW4gdGhlIGdpdmVuIHR5cGUuCisKKyAgIFdpdGhpbiB0aGUgZmllbGRzIHdlIHJlbHkgb24gdGhlIGludGVnZXIgZW5kaWFubmVzcyBiZWluZyB0aGUgc2FtZSBhcyB0aGUKKyAgIGZsb2F0IGVuZGlhbm5lc3MsIHRoaXMgaXMgdHJ1ZSBldmVyeXdoZXJlIHdlIGtub3cgb2YgYW5kIGl0J2QgYmUgYSBmYWlybHkKKyAgIHN0cmFuZ2Ugc3lzdGVtIHRoYXQgZGlkIGFueXRoaW5nIGVsc2UuICAqLworCisjaWYgSEFWRV9ET1VCTEVfSUVFRV9MSVRUTEVfU1dBUFBFRAorI2RlZmluZSBfR01QX0lFRUVfRkxPQVRTIDEKK3VuaW9uIGllZWVfZG91YmxlX2V4dHJhY3QKK3sKKyAgc3RydWN0CisgICAgeworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IG1hbmg6MjA7CisgICAgICBnbXBfdWludF9sZWFzdDMyX3QgZXhwOjExOworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IHNpZzoxOworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IG1hbmw6MzI7CisgICAgfSBzOworICBkb3VibGUgZDsKK307CisjZW5kaWYKKworI2lmIEhBVkVfRE9VQkxFX0lFRUVfTElUVExFX0VORElBTgorI2RlZmluZSBfR01QX0lFRUVfRkxPQVRTIDEKK3VuaW9uIGllZWVfZG91YmxlX2V4dHJhY3QKK3sKKyAgc3RydWN0CisgICAgeworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IG1hbmw6MzI7CisgICAgICBnbXBfdWludF9sZWFzdDMyX3QgbWFuaDoyMDsKKyAgICAgIGdtcF91aW50X2xlYXN0MzJfdCBleHA6MTE7CisgICAgICBnbXBfdWludF9sZWFzdDMyX3Qgc2lnOjE7CisgICAgfSBzOworICBkb3VibGUgZDsKK307CisjZW5kaWYKKworI2lmIEhBVkVfRE9VQkxFX0lFRUVfQklHX0VORElBTgorI2RlZmluZSBfR01QX0lFRUVfRkxPQVRTIDEKK3VuaW9uIGllZWVfZG91YmxlX2V4dHJhY3QKK3sKKyAgc3RydWN0CisgICAgeworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IHNpZzoxOworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IGV4cDoxMTsKKyAgICAgIGdtcF91aW50X2xlYXN0MzJfdCBtYW5oOjIwOworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IG1hbmw6MzI7CisgICAgfSBzOworICBkb3VibGUgZDsKK307CisjZW5kaWYKKworI2lmIEhBVkVfRE9VQkxFX1ZBWF9ECit1bmlvbiBkb3VibGVfZXh0cmFjdAoreworICBzdHJ1Y3QKKyAgICB7CisgICAgICBnbXBfdWludF9sZWFzdDMyX3QgbWFuMzo3OwkvKiBoaWdoZXN0IDcgYml0cyAqLworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IGV4cDo4OwkJLyogZXhjZXNzLTEyOCBleHBvbmVudCAqLworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IHNpZzoxOworICAgICAgZ21wX3VpbnRfbGVhc3QzMl90IG1hbjI6MTY7CisgICAgICBnbXBfdWludF9sZWFzdDMyX3QgbWFuMToxNjsKKyAgICAgIGdtcF91aW50X2xlYXN0MzJfdCBtYW4wOjE2OwkvKiBsb3dlc3QgMTYgYml0cyAqLworICAgIH0gczsKKyAgZG91YmxlIGQ7Cit9OworI2VuZGlmCisKKy8qIFVzZSAoNC4wICogLi4uKSBpbnN0ZWFkIG9mICgyLjAgKiAuLi4pIHRvIHdvcmsgYXJvdW5kIGJ1Z2d5IGNvbXBpbGVycworICAgdGhhdCBkb24ndCBjb252ZXJ0IHVsb25nLT5kb3VibGUgY29ycmVjdGx5IChlZy4gU3VuT1MgNCBuYXRpdmUgY2MpLiAgKi8KKyNkZWZpbmUgTVBfQkFTRV9BU19ET1VCTEUgKDQuMCAqICgobXBfbGltYl90KSAxIDw8IChHTVBfTlVNQl9CSVRTIC0gMikpKQorLyogTWF4aW11bSBudW1iZXIgb2YgbGltYnMgaXQgd2lsbCB0YWtlIHRvIHN0b3JlIGFueSBgZG91YmxlJy4KKyAgIFdlIGFzc3VtZSBkb3VibGVzIGhhdmUgNTMgbWFudGlzc2EgYml0cy4gICovCisjZGVmaW5lIExJTUJTX1BFUl9ET1VCTEUgKCg1MyArIEdNUF9OVU1CX0JJVFMgLSAyKSAvIEdNUF9OVU1CX0JJVFMgKyAxKQorCitfX0dNUF9ERUNMU1BFQyBpbnQgX19nbXBfZXh0cmFjdF9kb3VibGUgKG1wX3B0ciwgZG91YmxlKTsKKworI2RlZmluZSBtcG5fZ2V0X2QgX19nbXBuX2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBuX2dldF9kIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBsb25nKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworCisvKiBET1VCTEVfTkFOX0lORl9BQ1RJT04gZXhlY3V0ZXMgY29kZSBhX25hbiBpZiB4IGlzIGEgTmFOLCBvciBleGVjdXRlcworICAgYV9pbmYgaWYgeCBpcyBhbiBpbmZpbml0eS4gIEJvdGggYXJlIGNvbnNpZGVyZWQgdW5saWtlbHkgdmFsdWVzLCBmb3IKKyAgIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8KKworI2lmIF9HTVBfSUVFRV9GTE9BVFMKKyNkZWZpbmUgRE9VQkxFX05BTl9JTkZfQUNUSU9OKHgsIGFfbmFuLCBhX2luZikJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIGllZWVfZG91YmxlX2V4dHJhY3QgIHU7CQkJCQlcCisgICAgdS5kID0gKHgpOwkJCQkJCQkJXAorICAgIGlmIChVTkxJS0VMWSAodS5zLmV4cCA9PSAweDdGRikpCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWlmICh1LnMubWFubCA9PSAwICYmIHUucy5tYW5oID09IDApCQkJCVwKKwkgIHsgYV9pbmY7IH0JCQkJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkgIHsgYV9uYW47IH0JCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgSEFWRV9ET1VCTEVfVkFYX0QgfHwgSEFWRV9ET1VCTEVfVkFYX0cgfHwgSEFWRV9ET1VCTEVfQ1JBWV9DRlAKKy8qIG5vIG5hbnMgb3IgaW5mcyBpbiB0aGVzZSBmb3JtYXRzICovCisjZGVmaW5lIERPVUJMRV9OQU5fSU5GX0FDVElPTih4LCBhX25hbiwgYV9pbmYpICBcCisgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIERPVUJMRV9OQU5fSU5GX0FDVElPTgorLyogVW5rbm93biBmb3JtYXQsIHRyeSBzb21ldGhpbmcgZ2VuZXJpYy4KKyAgIE5hTiBzaG91bGQgYmUgInVub3JkZXJlZCIsIHNvIHghPXguCisgICBJbmYgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIERCTF9NQVguICAqLworI2RlZmluZSBET1VCTEVfTkFOX0lORl9BQ1RJT04oeCwgYV9uYW4sIGFfaW5mKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGlmIChVTkxJS0VMWSAoKHgpICE9ICh4KSkpCQkJCQlcCisJeyBhX25hbjsgfQkJCQkJCQlcCisgICAgICBlbHNlIGlmIChVTkxJS0VMWSAoKHgpID4gREJMX01BWCB8fCAoeCkgPCAtREJMX01BWCkpCQlcCisJeyBhX2luZjsgfQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBPbiBtNjhrLCB4ODYgYW5kIGFtZDY0LCBnY2MgKGFuZCBtYXliZSBvdGhlciBjb21waWxlcnMpIGNhbiBob2xkIGRvdWJsZXMKKyAgIGluIHRoZSBjb3Byb2Nlc3Nvciwgd2hpY2ggbWVhbnMgYSBiaWdnZXIgZXhwb25lbnQgcmFuZ2UgdGhhbiBub3JtYWwsIGFuZAorICAgZGVwZW5kaW5nIG9uIHRoZSByb3VuZGluZyBtb2RlLCBhIGJpZ2dlciBtYW50aXNzYSB0aGFuIG5vcm1hbC4gIChTZWUKKyAgICJEaXNhcHBvaW50bWVudHMiIGluIHRoZSBnY2MgbWFudWFsLikgIEZPUkNFX0RPVUJMRSBzdG9yZXMgYW5kIGZldGNoZXMKKyAgICJkIiB0aHJvdWdoIG1lbW9yeSB0byBmb3JjZSBhbnkgcm91bmRpbmcgYW5kIG92ZXJmbG93cyB0byBvY2N1ci4KKworICAgT24gYW1kNjQsIGFuZCBvbiB4ODZzIHdpdGggU1NFMiwgZ2NjIChkZXBlbmRpbmcgb24gb3B0aW9ucykgdXNlcyB0aGUgeG1tCisgICByZWdpc3RlcnMsIHdoZXJlIHRoZXJlJ3Mgbm8gc3VjaCBleHRyYSBwcmVjaXNpb24gYW5kIG5vIG5lZWQgZm9yIHRoZQorICAgRk9SQ0VfRE9VQkxFLiAgV2UgZG9uJ3QgYm90aGVyIHRvIGRldGVjdCB0aGlzIHNpbmNlIHRoZSBwcmVzZW50IHVzZXMgZm9yCisgICBGT1JDRV9ET1VCTEUgYXJlIG9ubHkgaW4gdGVzdCBwcm9ncmFtcyBhbmQgZGVmYXVsdCBnZW5lcmljIEMgY29kZS4KKworICAgTm90IHF1aXRlIHN1cmUgdGhhdCBhbiAiYXV0b21hdGljIHZvbGF0aWxlIiB3aWxsIHVzZSBtZW1vcnksIGJ1dCBpdCBkb2VzCisgICBpbiBnY2MuICBBbiBhc20oIiI6Ij1tIihkKToiMCIoZCkpIGNhbid0IGJlIHVzZWQgdG8gdHJpY2sgZ2NjLCBzaW5jZQorICAgYXBwYXJlbnRseSBtYXRjaGluZyBvcGVyYW5kcyBsaWtlICIwIiBhcmUgb25seSBhbGxvd2VkIG9uIGEgcmVnaXN0ZXIKKyAgIG91dHB1dC4gIGdjYyAzLjQgd2FybnMgYWJvdXQgdGhpcywgdGhvdWdoIGluIGZhY3QgaXQgYW5kIHBhc3QgdmVyc2lvbnMKKyAgIHNlZW0gdG8gcHV0IHRoZSBvcGVyYW5kIHRocm91Z2ggbWVtb3J5IGFzIGhvcGVkLiAgKi8KKworI2lmIChIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9tNjhrIHx8IEhBVkVfSE9TVF9DUFVfRkFNSUxZX3g4NiAgICAgIFwKKyAgICAgfHwgZGVmaW5lZCAoX19hbWQ2NF9fKSkKKyNkZWZpbmUgRk9SQ0VfRE9VQkxFKGQpIFwKKyAgZG8geyB2b2xhdGlsZSBkb3VibGUgX19nbXBfZm9yY2UgPSAoZCk7IChkKSA9IF9fZ21wX2ZvcmNlOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRk9SQ0VfRE9VQkxFKGQpICBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBfX2dtcF9kaWdpdF92YWx1ZV90YWJbXTsKKworX19HTVBfREVDTFNQRUMgZXh0ZXJuIGludCBfX2dtcF9qdW5rOworX19HTVBfREVDTFNQRUMgZXh0ZXJuIGNvbnN0IGludCBfX2dtcF8wOworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcF9leGNlcHRpb24gKGludCkgQVRUUklCVVRFX05PUkVUVVJOOworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcF9kaXZpZGVfYnlfemVybyAodm9pZCkgQVRUUklCVVRFX05PUkVUVVJOOworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcF9zcXJ0X29mX25lZ2F0aXZlICh2b2lkKSBBVFRSSUJVVEVfTk9SRVRVUk47CitfX0dNUF9ERUNMU1BFQyB2b2lkIF9fZ21wX292ZXJmbG93X2luX21weiAodm9pZCkgQVRUUklCVVRFX05PUkVUVVJOOworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAodm9pZCkgQVRUUklCVVRFX05PUkVUVVJOOworI2RlZmluZSBHTVBfRVJST1IoY29kZSkgICBfX2dtcF9leGNlcHRpb24gKGNvZGUpCisjZGVmaW5lIERJVklERV9CWV9aRVJPICAgIF9fZ21wX2RpdmlkZV9ieV96ZXJvICgpCisjZGVmaW5lIFNRUlRfT0ZfTkVHQVRJVkUgIF9fZ21wX3NxcnRfb2ZfbmVnYXRpdmUgKCkKKyNkZWZpbmUgTVBaX09WRVJGTE9XICAgICAgX19nbXBfb3ZlcmZsb3dfaW5fbXB6ICgpCisKKyNpZiBkZWZpbmVkIF9MT05HX0xPTkdfTElNQgorI2RlZmluZSBDTlNUX0xJTUIoQykgKChtcF9saW1iX3QpIEMjI0xMKQorI2Vsc2UgLyogbm90IF9MT05HX0xPTkdfTElNQiAqLworI2RlZmluZSBDTlNUX0xJTUIoQykgKChtcF9saW1iX3QpIEMjI0wpCisjZW5kaWYgLyogX0xPTkdfTE9OR19MSU1CICovCisKKy8qIFN0dWZmIHVzZWQgYnkgbXBuL2dlbmVyaWMvcGVyZnNxci5jIGFuZCBtcHovcHJpbWVfcC5jICovCisjaWYgR01QX05VTUJfQklUUyA9PSAyCisjZGVmaW5lIFBQIDB4MwkJCQkJLyogMyAqLworI2RlZmluZSBQUF9GSVJTVF9PTUlUVEVEIDUKKyNlbmRpZgorI2lmIEdNUF9OVU1CX0JJVFMgPT0gNAorI2RlZmluZSBQUCAweEYJCQkJCS8qIDMgeCA1ICovCisjZGVmaW5lIFBQX0ZJUlNUX09NSVRURUQgNworI2VuZGlmCisjaWYgR01QX05VTUJfQklUUyA9PSA4CisjZGVmaW5lIFBQIDB4NjkJCQkJCS8qIDMgeCA1IHggNyAqLworI2RlZmluZSBQUF9GSVJTVF9PTUlUVEVEIDExCisjZW5kaWYKKyNpZiBHTVBfTlVNQl9CSVRTID09IDE2CisjZGVmaW5lIFBQIDB4M0FBNwkJCQkvKiAzIHggNSB4IDcgeCAxMSB4IDEzICovCisjZGVmaW5lIFBQX0ZJUlNUX09NSVRURUQgMTcKKyNlbmRpZgorI2lmIEdNUF9OVU1CX0JJVFMgPT0gMzIKKyNkZWZpbmUgUFAgMHhDMENGRDc5N0wJCQkJLyogMyB4IDUgeCA3IHggMTEgeCAuLi4geCAyOSAqLworI2RlZmluZSBQUF9JTlZFUlRFRCAweDUzRTU2NDVDTAorI2RlZmluZSBQUF9GSVJTVF9PTUlUVEVEIDMxCisjZW5kaWYKKyNpZiBHTVBfTlVNQl9CSVRTID09IDY0CisjZGVmaW5lIFBQIENOU1RfTElNQigweEUyMjFGOTdDMzBFOTRFMUQpCS8qIDMgeCA1IHggNyB4IDExIHggLi4uIHggNTMgKi8KKyNkZWZpbmUgUFBfSU5WRVJURUQgQ05TVF9MSU1CKDB4MjFDRkU2Q0ZDOTM4QjM2QikKKyNkZWZpbmUgUFBfRklSU1RfT01JVFRFRCA1OQorI2VuZGlmCisjaWZuZGVmIFBQX0ZJUlNUX09NSVRURUQKKyNkZWZpbmUgUFBfRklSU1RfT01JVFRFRCAzCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbXBfbGltYl90IGQwLCBkMTsKK30gbXBfZG91YmxlX2xpbWJfdDsKKworI2RlZmluZSBtcG5fZ2NkXzIyIF9fTVBOIChnY2RfMjIpCitfX0dNUF9ERUNMU1BFQyBtcF9kb3VibGVfbGltYl90IG1wbl9nY2RfMjIgKG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CisKKy8qIEJJVDEgbWVhbnMgYSByZXN1bHQgdmFsdWUgaW4gYml0IDEgKHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBiaXQpLCB3aXRoIGEKKyAgIHplcm8gYml0IHJlcHJlc2VudGluZyArMSBhbmQgYSBvbmUgYml0IHJlcHJlc2VudGluZyAtMS4gIEJpdHMgb3RoZXIgdGhhbgorICAgYml0IDEgYXJlIGdhcmJhZ2UuICBUaGVzZSBhcmUgbWVhbnQgdG8gYmUga2VwdCBpbiAiaW50InMsIGFuZCBjYXN0cyBhcmUKKyAgIHVzZWQgdG8gZW5zdXJlIHRoZSBleHByZXNzaW9ucyBhcmUgImludCJzIGV2ZW4gaWYgYSBhbmQvb3IgYiBtaWdodCBiZQorICAgb3RoZXIgdHlwZXMuCisKKyAgIEpBQ09CSV9UV09TX1VfQklUMSBhbmQgSkFDT0JJX1JFQ0lQX1VVX0JJVDEgYXJlIHVzZWQgaW4gbXBuX2phY29iaV9iYXNlCisgICBhbmQgdGhlaXIgc3BlZWQgaXMgaW1wb3J0YW50LiAgRXhwcmVzc2lvbnMgYXJlIHVzZWQgcmF0aGVyIHRoYW4KKyAgIGNvbmRpdGlvbmFscyB0byBhY2N1bXVsYXRlIHNpZ24gY2hhbmdlcywgd2hpY2ggZWZmZWN0aXZlbHkgbWVhbnMgWE9ScworICAgaW5zdGVhZCBvZiBjb25kaXRpb25hbCBKVU1Qcy4gKi8KKworLyogKGEvMCksIHdpdGggYSBzaWduZWQ7IGlzIDEgaWYgYT0rLy0xLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBKQUNPQklfUzAoYSkgICAoKChhKSA9PSAxKSB8ICgoYSkgPT0gLTEpKQorCisvKiAoYS8wKSwgd2l0aCBhIHVuc2lnbmVkOyBpcyAxIGlmIGE9Ky8tMSwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgSkFDT0JJX1UwKGEpICAgKChhKSA9PSAxKQorCisvKiBGSVhNRTogSkFDT0JJX0xTMCBhbmQgSkFDT0JJXzBMUyBhcmUgdGhlIHNhbWUsIHNvIGRlbGV0ZSBvbmUgYW5kCisgICBjb21lIHVwIHdpdGggYSBiZXR0ZXIgbmFtZS4gKi8KKworLyogKGEvMCksIHdpdGggYSBnaXZlbiBieSBsb3cgYW5kIHNpemU7CisgICBpcyAxIGlmIGE9Ky8tMSwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgSkFDT0JJX0xTMChhbG93LGFzaXplKSBcCisgICgoKGFzaXplKSA9PSAxIHx8IChhc2l6ZSkgPT0gLTEpICYmIChhbG93KSA9PSAxKQorCisvKiAoYS8wKSwgd2l0aCBhIGFuIG1wel90OworICAgZmV0Y2ggb2YgbG93IGxpbWIgYWx3YXlzIHZhbGlkLCBldmVuIGlmIHNpemUgaXMgemVybyAqLworI2RlZmluZSBKQUNPQklfWjAoYSkgICBKQUNPQklfTFMwIChQVFIoYSlbMF0sIFNJWihhKSkKKworLyogKDAvYiksIHdpdGggYiB1bnNpZ25lZDsgaXMgMSBpZiBiPTEsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIEpBQ09CSV8wVShiKSAgICgoYikgPT0gMSkKKworLyogKDAvYiksIHdpdGggYiB1bnNpZ25lZDsgaXMgMSBpZiBiPSsvLTEsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIEpBQ09CSV8wUyhiKSAgICgoYikgPT0gMSB8fCAoYikgPT0gLTEpCisKKy8qICgwL2IpLCB3aXRoIGIgZ2l2ZW4gYnkgbG93IGFuZCBzaXplOyBpcyAxIGlmIGI9Ky8tMSwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgSkFDT0JJXzBMUyhibG93LGJzaXplKSBcCisgICgoKGJzaXplKSA9PSAxIHx8IChic2l6ZSkgPT0gLTEpICYmIChibG93KSA9PSAxKQorCisvKiBDb252ZXJ0IGEgYml0MSB0byArMSBvciAtMS4gKi8KKyNkZWZpbmUgSkFDT0JJX0JJVDFfVE9fUE4ocmVzdWx0X2JpdDEpIFwKKyAgKDEgLSAoKGludCkgKHJlc3VsdF9iaXQxKSAmIDIpKQorCisvKiAoMi9iKSwgd2l0aCBiIHVuc2lnbmVkIGFuZCBvZGQ7CisgICBpcyAoLTEpXigoYl4yLTEpLzgpIHdoaWNoIGlzIDEgaWYgYj09MSw3bW9kOCBvciAtMSBpZiBiPT0zLDVtb2Q4IGFuZAorICAgaGVuY2Ugb2J0YWluZWQgZnJvbSAoYj4+MSleYiAqLworI2RlZmluZSBKQUNPQklfVFdPX1VfQklUMShiKSBcCisgICgoaW50KSAoKChiKSA+PiAxKSBeIChiKSkpCisKKy8qICgyL2IpXnR3b3MsIHdpdGggYiB1bnNpZ25lZCBhbmQgb2RkICovCisjZGVmaW5lIEpBQ09CSV9UV09TX1VfQklUMSh0d29zLCBiKSBcCisgICgoaW50KSAoKHR3b3MpIDw8IDEpICYgSkFDT0JJX1RXT19VX0JJVDEgKGIpKQorCisvKiAoMi9iKV50d29zLCB3aXRoIGIgdW5zaWduZWQgYW5kIG9kZCAqLworI2RlZmluZSBKQUNPQklfVFdPU19VKHR3b3MsIGIpIFwKKyAgKEpBQ09CSV9CSVQxX1RPX1BOIChKQUNPQklfVFdPU19VX0JJVDEgKHR3b3MsIGIpKSkKKworLyogKC0xL2IpLCB3aXRoIGIgb2RkIChzaWduZWQgb3IgdW5zaWduZWQpOworICAgaXMgKC0xKV4oKGItMSkvMikgKi8KKyNkZWZpbmUgSkFDT0JJX04xQl9CSVQxKGIpIFwKKyAgKChpbnQpIChiKSkKKworLyogKGEvYikgZWZmZWN0IGR1ZSB0byBzaWduIG9mIGE6IHNpZ25lZC91bnNpZ25lZCwgYiBvZGQ7CisgICBpcyAoLTEvYikgaWYgYTwwLCBvciArMSBpZiBhPj0wICovCisjZGVmaW5lIEpBQ09CSV9BU0dOX1NVX0JJVDEoYSwgYikgXAorICAoKCgoYSkgPCAwKSA8PCAxKSAmIEpBQ09CSV9OMUJfQklUMShiKSkKKworLyogKGEvYikgZWZmZWN0IGR1ZSB0byBzaWduIG9mIGI6IHNpZ25lZC9zaWduZWQ7CisgICBpcyAtMSBpZiBhIGFuZCBiIGJvdGggbmVnYXRpdmUsICsxIG90aGVyd2lzZSAqLworI2RlZmluZSBKQUNPQklfQlNHTl9TU19CSVQxKGEsIGIpIFwKKyAgKCgoKGEpPDApICYgKChiKTwwKSkgPDwgMSkKKworLyogKGEvYikgZWZmZWN0IGR1ZSB0byBzaWduIG9mIGI6IHNpZ25lZC9tcHo7CisgICBpcyAtMSBpZiBhIGFuZCBiIGJvdGggbmVnYXRpdmUsICsxIG90aGVyd2lzZSAqLworI2RlZmluZSBKQUNPQklfQlNHTl9TWl9CSVQxKGEsIGIpIFwKKyAgSkFDT0JJX0JTR05fU1NfQklUMSAoYSwgU0laKGIpKQorCisvKiAoYS9iKSBlZmZlY3QgZHVlIHRvIHNpZ24gb2YgYjogbXB6L3NpZ25lZDsKKyAgIGlzIC0xIGlmIGEgYW5kIGIgYm90aCBuZWdhdGl2ZSwgKzEgb3RoZXJ3aXNlICovCisjZGVmaW5lIEpBQ09CSV9CU0dOX1pTX0JJVDEoYSwgYikgXAorICBKQUNPQklfQlNHTl9TWl9CSVQxIChiLCBhKQorCisvKiAoYS9iKSByZWNpcHJvY2l0eSB0byBzd2l0Y2ggdG8gKGIvYSksIGEsYiBib3RoIHVuc2lnbmVkIGFuZCBvZGQ7CisgICBpcyAoLTEpXigoYS0xKSooYi0xKS80KSwgd2hpY2ggbWVhbnMgKzEgaWYgZWl0aGVyIGEsYj09MW1vZDQsIG9yIC0xIGlmCisgICBib3RoIGEsYj09M21vZDQsIGFjaGlldmVkIGluIGJpdCAxIGJ5IGEmYi4gIE5vIEFTU0VSVCgpcyBhYm91dCBhLGIgb2RkCisgICBiZWNhdXNlIHRoaXMgaXMgdXNlZCBpbiBhIGNvdXBsZSBvZiBwbGFjZXMgd2l0aCBvbmx5IGJpdCAxIG9mIGEgb3IgYgorICAgdmFsaWQuICovCisjZGVmaW5lIEpBQ09CSV9SRUNJUF9VVV9CSVQxKGEsIGIpIFwKKyAgKChpbnQpICgoYSkgJiAoYikpKQorCisvKiBTdHJpcCBsb3cgemVybyBsaW1icyBmcm9tIHtiX3B0cixiX3NpemV9IGJ5IGluY3JlbWVudGluZyBiX3B0ciBhbmQKKyAgIGRlY3JlbWVudGluZyBiX3NpemUuICBiX2xvdyBzaG91bGQgYmUgYl9wdHJbMF0gb24gZW50cnksIGFuZCB3aWxsIGJlCisgICB1cGRhdGVkIGZvciB0aGUgbmV3IGJfcHRyLiAgcmVzdWx0X2JpdDEgaXMgdXBkYXRlZCBhY2NvcmRpbmcgdG8gdGhlCisgICBmYWN0b3JzIG9mIDIgc3RyaXBwZWQsIGFzIHBlciAoYS8yKS4gICovCisjZGVmaW5lIEpBQ09CSV9TVFJJUF9MT1dfWkVST1MocmVzdWx0X2JpdDEsIGEsIGJfcHRyLCBiX3NpemUsIGJfbG93KQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgQVNTRVJUICgoYl9zaXplKSA+PSAxKTsJCQkJCQlcCisgICAgQVNTRVJUICgoYl9sb3cpID09IChiX3B0cilbMF0pOwkJCQkJXAorCQkJCQkJCQkJXAorICAgIHdoaWxlIChVTkxJS0VMWSAoKGJfbG93KSA9PSAwKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJKGJfc2l6ZSktLTsJCQkJCQkJXAorCUFTU0VSVCAoKGJfc2l6ZSkgPj0gMSk7CQkJCQkJXAorCShiX3B0cikrKzsJCQkJCQkJXAorCShiX2xvdykgPSAqKGJfcHRyKTsJCQkJCQlcCisJCQkJCQkJCQlcCisJQVNTRVJUICgoKGEpICYgMSkgIT0gMCk7CQkJCQlcCisJaWYgKChHTVBfTlVNQl9CSVRTICUgMikgPT0gMSkJCQkJCVwKKwkgIChyZXN1bHRfYml0MSkgXj0gSkFDT0JJX1RXT19VX0JJVDEoYSk7CQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogU2V0IGFfcmVtIHRvIHthX3B0cixhX3NpemV9IHJlZHVjZWQgbW9kdWxvIGIsIGVpdGhlciB1c2luZyBtb2RfMSBvcgorICAgbW9kZXhhY3RfMV9vZGQsIGJ1dCBpbiBlaXRoZXIgY2FzZSBsZWF2aW5nIGFfcmVtPGIuICBiIG11c3QgYmUgb2RkIGFuZAorICAgdW5zaWduZWQuICBtb2RleGFjdF8xX29kZCBlZmZlY3RpdmVseSBjYWxjdWxhdGVzIC1hIG1vZCBiLCBhbmQKKyAgIHJlc3VsdF9iaXQxIGlzIGFkanVzdGVkIGZvciB0aGUgZmFjdG9yIG9mIC0xLgorCisgICBUaGUgd2F5IG1wbl9tb2RleGFjdF8xX29kZCBzb21ldGltZXMgYmFzZXMgaXRzIHJlbWFpbmRlciBvbiBhX3NpemUgYW5kCisgICBzb21ldGltZXMgb24gYV9zaXplLTEgbWVhbnMgaWYgR01QX05VTUJfQklUUyBpcyBvZGQgd2UgY2FuJ3Qga25vdyB3aGF0CisgICBmYWN0b3IgdG8gaW50cm9kdWNlIGludG8gcmVzdWx0X2JpdDEsIHNvIGZvciB0aGF0IGNhc2UgdXNlIG1wbl9tb2RfMQorICAgdW5jb25kaXRpb25hbGx5LgorCisgICBGSVhNRTogbXBuX21vZGV4YWN0XzFfb2RkIGlzIG1vcmUgZWZmaWNpZW50LCBzbyBzb21lIHdheSB0byBnZXQgaXQgdXNlZAorICAgZm9yIG9kZCBHTVBfTlVNQl9CSVRTIHdvdWxkIGJlIGdvb2QuICBQZXJoYXBzIGl0IGNvdWxkIG11bmcgaXRzIHJlc3VsdCwKKyAgIG9yIG5vdCBza2lwIGEgZGl2aWRlIHN0ZXAsIG9yIHNvbWV0aGluZy4gKi8KKworI2RlZmluZSBKQUNPQklfTU9EX09SX01PREVYQUNUXzFfT0REKHJlc3VsdF9iaXQxLCBhX3JlbSwgYV9wdHIsIGFfc2l6ZSwgYikgXAorICBkbyB7CQkJCQkJCQkJICAgXAorICAgIG1wX3NyY3B0ciAgX19hX3B0cgk9IChhX3B0cik7CQkJCQkgICBcCisgICAgbXBfc2l6ZV90ICBfX2Ffc2l6ZSA9IChhX3NpemUpOwkJCQkJICAgXAorICAgIG1wX2xpbWJfdCAgX19iCT0gKGIpOwkJCQkJCSAgIFwKKwkJCQkJCQkJCSAgIFwKKyAgICBBU1NFUlQgKF9fYV9zaXplID49IDEpOwkJCQkJCSAgIFwKKyAgICBBU1NFUlQgKF9fYiAmIDEpOwkJCQkJCQkgICBcCisJCQkJCQkJCQkgICBcCisgICAgaWYgKChHTVBfTlVNQl9CSVRTICUgMikgIT0gMAkJCQkJICAgXAorCXx8IEFCT1ZFX1RIUkVTSE9MRCAoX19hX3NpemUsIEJNT0RfMV9UT19NT0RfMV9USFJFU0hPTEQpKQkgICBcCisgICAgICB7CQkJCQkJCQkJICAgXAorCShhX3JlbSkgPSBtcG5fbW9kXzEgKF9fYV9wdHIsIF9fYV9zaXplLCBfX2IpOwkJCSAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICBcCisgICAgZWxzZQkJCQkJCQkJICAgXAorICAgICAgewkJCQkJCQkJCSAgIFwKKwkocmVzdWx0X2JpdDEpIF49IEpBQ09CSV9OMUJfQklUMSAoX19iKTsJCQkJICAgXAorCShhX3JlbSkgPSBtcG5fbW9kZXhhY3RfMV9vZGQgKF9fYV9wdHIsIF9fYV9zaXplLCBfX2IpOwkJICAgXAorICAgICAgfQkJCQkJCQkJCSAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyogU3RhdGUgZm9yIHRoZSBKYWNvYmkgY29tcHV0YXRpb24gdXNpbmcgTGVobWVyLiAqLworI2RlZmluZSBqYWNvYmlfdGFibGUgX19nbXBfamFjb2JpX3RhYmxlCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBqYWNvYmlfdGFibGVbMjA4XTsKKworLyogQml0IGxheW91dCBmb3IgdGhlIGluaXRpYWwgc3RhdGUuIGIgbXVzdCBiZSBvZGQuCisKKyAgICAgIDMgIDIgIDEgMAorICAgKy0tKy0tKy0tKy0tKworICAgfGExfGEwfGIxfCBzfAorICAgKy0tKy0tKy0tKy0tKworCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK21wbl9qYWNvYmlfaW5pdCAodW5zaWduZWQgYSwgdW5zaWduZWQgYiwgdW5zaWduZWQgcykKK3sKKyAgQVNTRVJUIChiICYgMSk7CisgIEFTU0VSVCAocyA8PSAxKTsKKyAgcmV0dXJuICgoYSAmIDMpIDw8IDIpICsgKGIgJiAyKSArIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittcG5famFjb2JpX2ZpbmlzaCAodW5zaWduZWQgYml0cykKK3sKKyAgLyogKGEsIGIpID0gKDEsMCkgb3IgKDAsMSkgKi8KKyAgQVNTRVJUICggKGJpdHMgJiAxNCkgPT0gMCk7CisKKyAgcmV0dXJuIDEtMiooYml0cyAmIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCittcG5famFjb2JpX3VwZGF0ZSAodW5zaWduZWQgYml0cywgdW5zaWduZWQgZGVub21pbmF0b3IsIHVuc2lnbmVkIHEpCit7CisgIC8qIEZJWE1FOiBDb3VsZCBoYWx2ZSB0YWJsZSBzaXplIGJ5IG5vdCBpbmNsdWRpbmcgdGhlIGUgYml0IGluIHRoZQorICAgKiBpbmRleCwgYW5kIGluc3RlYWQgeG9yIHdoZW4gdXBkYXRpbmcuIFRoZW4gdGhlIGxvb2t1cCB3b3VsZCBiZQorICAgKiBsaWtlCisgICAqCisgICAqICAgYml0cyBePSB0YWJsZVsoKGJpdHMgJiAzMCkgPDwgMikgKyAoZGVub21pbmF0b3IgPDwgMikgKyBxXTsKKyAgICovCisKKyAgQVNTRVJUIChiaXRzIDwgMjYpOworICBBU1NFUlQgKGRlbm9taW5hdG9yIDwgMik7CisgIEFTU0VSVCAocSA8IDQpOworCisgIC8qIEZvciBhbG1vc3QgYWxsIGNhbGxzLCBkZW5vbWluYXRvciBpcyBjb25zdGFudCBhbmQgcXVpdGUgb2Z0ZW4gcQorICAgICBpcyBjb25zdGFudCB0b28uIFNvIHVzZSBhZGRpdGlvbiByYXRoZXIgdGhhbiBvciwgc28gdGhlIGNvbXBpbGVyCisgICAgIGNhbiBwdXQgdGhlIGNvbnN0YW50IHBhcnQgY2FuIGludG8gdGhlIG9mZnNldCBvZiBhbiBpbmRleGVkCisgICAgIGFkZHJlc3NpbmcgaW5zdHJ1Y3Rpb24uCisKKyAgICAgV2l0aCBjb25zdGFudCBkZW5vbWluYXRvciwgdGhlIGJlbG93IHRhYmxlIGxvb2t1cCBpcyBjb21waWxlZCB0bworCisgICAgICAgQyBDb25zdGFudCBxID0gMSwgY29uc3RhbnQgZGVub21pbmF0b3IgPSAxCisgICAgICAgbW92emJsIHRhYmxlKzUoJWVheCw4KSwgJWVheAorCisgICAgIG9yCisKKyAgICAgICBDIHEgaW4gJWVkeCwgY29uc3RhbnQgZGVub21pbmF0b3IgPSAxCisgICAgICAgbW92emJsIHRhYmxlKzQoJWVkeCwlZWF4LDgpLCAlZWF4CisKKyAgICAgT25lIGNvdWxkIG1haW50YWluIHRoZSBzdGF0ZSBwcmVzaGlmdGVkIDMgYml0cywgdG8gc2F2ZSBhIHNoaWZ0CisgICAgIGhlcmUsIGJ1dCBhdCBsZWFzdCBvbiB4ODYsIHRoYXQncyBubyByZWFsIHNhdmluZy4KKyAgKi8KKyAgcmV0dXJuIGphY29iaV90YWJsZVsoYml0cyA8PCAzKSArIChkZW5vbWluYXRvciA8PCAyKSArIHFdOworfQorCisvKiBNYXRyaXggbXVsdGlwbGljYXRpb24gKi8KKyNkZWZpbmUgICBtcG5fbWF0cml4MjJfbXVsIF9fTVBOKG1hdHJpeDIyX211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgICAgICBtcG5fbWF0cml4MjJfbXVsIChtcF9wdHIsIG1wX3B0ciwgbXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3B0cik7CisjZGVmaW5lICAgbXBuX21hdHJpeDIyX211bF9pdGNoIF9fTVBOKG1hdHJpeDIyX211bF9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9tYXRyaXgyMl9tdWxfaXRjaCAobXBfc2l6ZV90LCBtcF9zaXplX3QpIEFUVFJJQlVURV9DT05TVDsKKworI2lmbmRlZiBNQVRSSVgyMl9TVFJBU1NFTl9USFJFU0hPTEQKKyNkZWZpbmUgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xEIDMwCisjZW5kaWYKKworLyogSEdDRCBkZWZpbml0aW9ucyAqLworCisvKiBFeHRyYWN0IG9uZSBudW1iLCBzaGlmdGluZyBjb3VudCBiaXRzIGxlZnQKKyAgICBfX19fX19fXyAgX19fX19fX18KKyAgIHxfX194aF9fX3x8X19feGxfX198CisJICB8X19fX3JfX19ffAorICAgPmNvdW50IDwKKworICAgVGhlIGNvdW50IGluY2x1ZGVzIGFueSBuYWlsIGJpdHMsIHNvIGl0IHNob3VsZCB3b3JrIGZpbmUgaWYgY291bnQKKyAgIGlzIGNvbXB1dGVkIHVzaW5nIGNvdW50X2xlYWRpbmdfemVyb3MuIElmIEdNUF9OQUlMX0JJVFMgPiAwLCBhbGwgb2YKKyAgIHhoLCB4bCBhbmQgciBpbmNsdWRlIG5haWwgYml0cy4gTXVzdCBoYXZlIDAgPCBjb3VudCA8IEdNUF9MSU1CX0JJVFMuCisKKyAgIEZJWE1FOiBPbWl0IG1hc2tpbmcgd2l0aCBHTVBfTlVNQl9NQVNLLCBhbmQgbGV0IGNhbGxlcnMgZG8gdGhhdCBmb3IKKyAgIHRob3NlIGNhbGxzIHdoZXJlIHRoZSBjb3VudCBoaWdoIGJpdHMgb2YgeGggbWF5IGJlIG5vbi16ZXJvLgorKi8KKworI2RlZmluZSBNUE5fRVhUUkFDVF9OVU1CKGNvdW50LCB4aCwgeGwpCQkJCVwKKyAgKCgoKHhoKSA8PCAoKGNvdW50KSAtIEdNUF9OQUlMX0JJVFMpKSAmIEdNUF9OVU1CX01BU0spIHwJXAorICAgKCh4bCkgPj4gKEdNUF9MSU1CX0JJVFMgLSAoY291bnQpKSkpCisKKworLyogVGhlIG1hdHJpeCBub24tbmVnYXRpdmUgTSA9ICh1LCB1Jzsgdix2Jykga2VlcHMgdHJhY2sgb2YgdGhlCisgICByZWR1Y3Rpb24gKGE7YikgPSBNIChhbHBoYTsgYmV0YSkgd2hlcmUgYWxwaGEsIGJldGEgYXJlIHNtYWxsZXIKKyAgIHRoYW4gYSwgYi4gVGhlIGRldGVybWluYW50IG11c3QgYWx3YXlzIGJlIG9uZSwgc28gdGhhdCBNIGhhcyBhbgorICAgaW52ZXJzZSAodicsIC11JzsgLXYsIHUpLiBFbGVtZW50cyBhbHdheXMgZml0IGluIEdNUF9OVU1CX0JJVFMgLSAxCisgICBiaXRzLiAqLworc3RydWN0IGhnY2RfbWF0cml4MQoreworICBtcF9saW1iX3QgdVsyXVsyXTsKK307CisKKyNkZWZpbmUgbXBuX2hnY2QyIF9fTVBOIChoZ2NkMikKK19fR01QX0RFQ0xTUEVDIGludCBtcG5faGdjZDIgKG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwJc3RydWN0IGhnY2RfbWF0cml4MSAqKTsKKworI2RlZmluZSBtcG5faGdjZF9tdWxfbWF0cml4MV92ZWN0b3IgX19NUE4gKGhnY2RfbXVsX21hdHJpeDFfdmVjdG9yKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9oZ2NkX211bF9tYXRyaXgxX3ZlY3RvciAoY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4MSAqLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfcHRyLCBtcF9zaXplX3QpOworCisjZGVmaW5lIG1wbl9tYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yIF9fTVBOIChtYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9tYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yIChjb25zdCBzdHJ1Y3QgaGdjZF9tYXRyaXgxICosIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NpemVfdCk7CisKKyNkZWZpbmUgbXBuX2hnY2QyX2phY29iaSBfX01QTiAoaGdjZDJfamFjb2JpKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9oZ2NkMl9qYWNvYmkgKG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgc3RydWN0IGhnY2RfbWF0cml4MSAqLCB1bnNpZ25lZCAqKTsKKworc3RydWN0IGhnY2RfbWF0cml4Cit7CisgIG1wX3NpemVfdCBhbGxvYzsJCS8qIGZvciBzYW5pdHkgY2hlY2tpbmcgb25seSAqLworICBtcF9zaXplX3QgbjsKKyAgbXBfcHRyIHBbMl1bMl07Cit9OworCisjZGVmaW5lIE1QTl9IR0NEX01BVFJJWF9JTklUX0lUQ0gobikgKDQgKiAoKG4rMSkvMiArIDEpKQorCisjZGVmaW5lIG1wbl9oZ2NkX21hdHJpeF9pbml0IF9fTVBOIChoZ2NkX21hdHJpeF9pbml0KQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5faGdjZF9tYXRyaXhfaW5pdCAoc3RydWN0IGhnY2RfbWF0cml4ICosIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSBtcG5faGdjZF9tYXRyaXhfdXBkYXRlX3EgX19NUE4gKGhnY2RfbWF0cml4X3VwZGF0ZV9xKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5faGdjZF9tYXRyaXhfdXBkYXRlX3EgKHN0cnVjdCBoZ2NkX21hdHJpeCAqLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQsIG1wX3B0cik7CisKKyNkZWZpbmUgbXBuX2hnY2RfbWF0cml4X211bF8xIF9fTVBOIChoZ2NkX21hdHJpeF9tdWxfMSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2hnY2RfbWF0cml4X211bF8xIChzdHJ1Y3QgaGdjZF9tYXRyaXggKiwgY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4MSAqLCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl9oZ2NkX21hdHJpeF9tdWwgX19NUE4gKGhnY2RfbWF0cml4X211bCkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX2hnY2RfbWF0cml4X211bCAoc3RydWN0IGhnY2RfbWF0cml4ICosIGNvbnN0IHN0cnVjdCBoZ2NkX21hdHJpeCAqLCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl9oZ2NkX21hdHJpeF9hZGp1c3QgX19NUE4gKGhnY2RfbWF0cml4X2FkanVzdCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5faGdjZF9tYXRyaXhfYWRqdXN0IChjb25zdCBzdHJ1Y3QgaGdjZF9tYXRyaXggKiwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisjZGVmaW5lIG1wbl9oZ2NkX3N0ZXAgX19NUE4oaGdjZF9zdGVwKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9oZ2NkX3N0ZXAgKG1wX3NpemVfdCwgbXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgc3RydWN0IGhnY2RfbWF0cml4ICosIG1wX3B0cik7CisKKyNkZWZpbmUgbXBuX2hnY2RfcmVkdWNlIF9fTVBOKGhnY2RfcmVkdWNlKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9oZ2NkX3JlZHVjZSAoc3RydWN0IGhnY2RfbWF0cml4ICosIG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworI2RlZmluZSBtcG5faGdjZF9yZWR1Y2VfaXRjaCBfX01QTihoZ2NkX3JlZHVjZV9pdGNoKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9oZ2NkX3JlZHVjZV9pdGNoIChtcF9zaXplX3QsIG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lIG1wbl9oZ2NkX2l0Y2ggX19NUE4gKGhnY2RfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5faGdjZF9pdGNoIChtcF9zaXplX3QpIEFUVFJJQlVURV9DT05TVDsKKworI2RlZmluZSBtcG5faGdjZCBfX01QTiAoaGdjZCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5faGdjZCAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgc3RydWN0IGhnY2RfbWF0cml4ICosIG1wX3B0cik7CisKKyNkZWZpbmUgbXBuX2hnY2RfYXBwcl9pdGNoIF9fTVBOIChoZ2NkX2FwcHJfaXRjaCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5faGdjZF9hcHByX2l0Y2ggKG1wX3NpemVfdCkgQVRUUklCVVRFX0NPTlNUOworCisjZGVmaW5lIG1wbl9oZ2NkX2FwcHIgX19NUE4gKGhnY2RfYXBwcikKK19fR01QX0RFQ0xTUEVDIGludCBtcG5faGdjZF9hcHByIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBzdHJ1Y3QgaGdjZF9tYXRyaXggKiwgbXBfcHRyKTsKKworI2RlZmluZSBtcG5faGdjZF9qYWNvYmkgX19NUE4gKGhnY2RfamFjb2JpKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9oZ2NkX2phY29iaSAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgc3RydWN0IGhnY2RfbWF0cml4ICosIHVuc2lnbmVkICosIG1wX3B0cik7CisKK3R5cGVkZWYgdm9pZCBnY2Rfc3ViZGl2X3N0ZXBfaG9vayh2b2lkICosIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgaW50KTsKKworLyogTmVlZHMgc3RvcmFnZSBmb3IgdGhlIHF1b3RpZW50ICovCisjZGVmaW5lIE1QTl9HQ0RfU1VCRElWX1NURVBfSVRDSChuKSAobikKKworI2RlZmluZSBtcG5fZ2NkX3N1YmRpdl9zdGVwIF9fTVBOKGdjZF9zdWJkaXZfc3RlcCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fZ2NkX3N1YmRpdl9zdGVwIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zaXplX3QsIGdjZF9zdWJkaXZfc3RlcF9ob29rICosIHZvaWQgKiwgbXBfcHRyKTsKKworc3RydWN0IGdjZGV4dF9jdHgKK3sKKyAgLyogUmVzdWx0IHBhcmFtZXRlcnMuICovCisgIG1wX3B0ciBncDsKKyAgbXBfc2l6ZV90IGduOworICBtcF9wdHIgdXA7CisgIG1wX3NpemVfdCAqdXNpemU7CisKKyAgLyogQ29mYWN0b3JzIHVwZGF0ZWQgaW4gZWFjaCBzdGVwLiAqLworICBtcF9zaXplX3QgdW47CisgIG1wX3B0ciB1MCwgdTEsIHRwOworfTsKKworI2RlZmluZSBtcG5fZ2NkZXh0X2hvb2sgX19NUE4gKGdjZGV4dF9ob29rKQorZ2NkX3N1YmRpdl9zdGVwX2hvb2sgbXBuX2djZGV4dF9ob29rOworCisjZGVmaW5lIE1QTl9HQ0RFWFRfTEVITUVSX05fSVRDSChuKSAoNCoobikgKyAzKQorCisjZGVmaW5lIG1wbl9nY2RleHRfbGVobWVyX24gX19NUE4oZ2NkZXh0X2xlaG1lcl9uKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9nY2RleHRfbGVobWVyX24gKG1wX3B0ciwgbXBfcHRyLCBtcF9zaXplX3QgKiwgbXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworLyogNCooYW4gKyAxKSArIDQqKGJuICsgMSkgKyBhbiAqLworI2RlZmluZSBNUE5fR0NERVhUX0xFSE1FUl9JVENIKGFuLCBibikgKDUqKGFuKSArIDQqKGJuKSArIDgpCisKKyNpZm5kZWYgSEdDRF9USFJFU0hPTEQKKyNkZWZpbmUgSEdDRF9USFJFU0hPTEQgNDAwCisjZW5kaWYKKworI2lmbmRlZiBIR0NEX0FQUFJfVEhSRVNIT0xECisjZGVmaW5lIEhHQ0RfQVBQUl9USFJFU0hPTEQgNDAwCisjZW5kaWYKKworI2lmbmRlZiBIR0NEX1JFRFVDRV9USFJFU0hPTEQKKyNkZWZpbmUgSEdDRF9SRURVQ0VfVEhSRVNIT0xEIDEwMDAKKyNlbmRpZgorCisjaWZuZGVmIEdDRF9EQ19USFJFU0hPTEQKKyNkZWZpbmUgR0NEX0RDX1RIUkVTSE9MRCAxMDAwCisjZW5kaWYKKworI2lmbmRlZiBHQ0RFWFRfRENfVEhSRVNIT0xECisjZGVmaW5lIEdDREVYVF9EQ19USFJFU0hPTEQgNjAwCisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgZm9yIG1wbl9zZXRfc3RyIGFuZCBtcG5fZ2V0X3N0ciAqLworc3RydWN0IHBvd2VycworeworICBtcF9wdHIgcDsJCQkvKiBhY3R1YWwgcG93ZXIgdmFsdWUgKi8KKyAgbXBfc2l6ZV90IG47CQkJLyogIyBvZiBsaW1icyBhdCBwICovCisgIG1wX3NpemVfdCBzaGlmdDsJCS8qIHdlaWdodCBvZiBsb3dlc3QgbGltYiwgaW4gbGltYiBiYXNlIEIgKi8KKyAgc2l6ZV90IGRpZ2l0c19pbl9iYXNlOwkvKiBudW1iZXIgb2YgY29ycmVzcG9uZGluZyBkaWdpdHMgKi8KKyAgaW50IGJhc2U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcG93ZXJzIHBvd2Vyc190OworI2RlZmluZSBtcG5fc3RyX3Bvd3RhYl9hbGxvYyhuKSAoKG4pICsgMiAqIEdNUF9MSU1CX0JJVFMpIC8qIEZJWE1FOiBUaGlzIGNhbiBwZXJoYXBzIGJlIHRyaW1tZWQgKi8KKyNkZWZpbmUgbXBuX2RjX3NldF9zdHJfaXRjaChuKSAoKG4pICsgR01QX0xJTUJfQklUUykKKyNkZWZpbmUgbXBuX2RjX2dldF9zdHJfaXRjaChuKSAoKG4pICsgR01QX0xJTUJfQklUUykKKworI2RlZmluZSBtcG5fY29tcHV0ZV9wb3d0YWIgX19NUE4oY29tcHV0ZV9wb3d0YWIpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBuX2NvbXB1dGVfcG93dGFiIChwb3dlcnNfdCAqLCBtcF9wdHIsIG1wX3NpemVfdCwgaW50KTsKKyNkZWZpbmUgICBtcG5fZGNfc2V0X3N0ciBfX01QTihkY19zZXRfc3RyKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9kY19zZXRfc3RyIChtcF9wdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90LCBjb25zdCBwb3dlcnNfdCAqLCBtcF9wdHIpOworI2RlZmluZSAgIG1wbl9iY19zZXRfc3RyIF9fTVBOKGJjX3NldF9zdHIpCitfX0dNUF9ERUNMU1BFQyBtcF9zaXplX3QgbXBuX2JjX3NldF9zdHIgKG1wX3B0ciwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBzaXplX3QsIGludCk7CisKKworLyogX19HTVBGX0JJVFNfVE9fUFJFQyBhcHBsaWVzIGEgbWluaW11bSA1MyBiaXRzLCByb3VuZHMgdXB3YXJkcyB0byBhIHdob2xlCisgICBsaW1iIGFuZCBhZGRzIGFuIGV4dHJhIGxpbWIuICBfX0dNUEZfUFJFQ19UT19CSVRTIGRyb3BzIHRoYXQgZXh0cmEgbGltYiwKKyAgIGhlbmNlIGdpdmluZyBiYWNrIHRoZSB1c2VyJ3Mgc2l6ZSBpbiBiaXRzIHJvdW5kZWQgdXAuICBOb3RpY2UgdGhhdAorICAgY29udmVydGluZyBwcmVjLT5iaXRzLT5wcmVjIGdpdmVzIGFuIHVuY2hhbmdlZCB2YWx1ZS4gICovCisjZGVmaW5lIF9fR01QRl9CSVRTX1RPX1BSRUMobikJCQkJCQlcCisgICgobXBfc2l6ZV90KSAoKF9fR01QX01BWCAoNTMsIG4pICsgMiAqIEdNUF9OVU1CX0JJVFMgLSAxKSAvIEdNUF9OVU1CX0JJVFMpKQorI2RlZmluZSBfX0dNUEZfUFJFQ19UT19CSVRTKG4pIFwKKyAgKChtcF9iaXRjbnRfdCkgKG4pICogR01QX05VTUJfQklUUyAtIEdNUF9OVU1CX0JJVFMpCisKK19fR01QX0RFQ0xTUEVDIGV4dGVybiBtcF9zaXplX3QgX19nbXBfZGVmYXVsdF9mcF9saW1iX3ByZWNpc2lvbjsKKworLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJhc2UtYiBkaWdpdHMgY29ycmVzcG9uZGluZyB0byBubGltYnMgbGltYnMsIHJvdW5kaW5nCisgICBkb3duLiAgKi8KKyNkZWZpbmUgRElHSVRTX0lOX0JBU0VfUEVSX0xJTUIocmVzLCBubGltYnMsIGIpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX3BoLCBfZHVtbXk7CQkJCQkJXAorICAgIHVtdWxfcHBtbSAoX3BoLCBfZHVtbXksCQkJCQkJXAorCSAgICAgICBtcF9iYXNlc1tiXS5sb2diMiwgR01QX05VTUJfQklUUyAqIChtcF9saW1iX3QpIChubGltYnMpKTtcCisgICAgcmVzID0gX3BoOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgbGltYnMgY29ycmVzcG9uZGluZyB0byBuZGlnaXRzIGJhc2UtYiBkaWdpdHMsIHJvdW5kaW5nCisgICB1cC4gICovCisjZGVmaW5lIExJTUJTX1BFUl9ESUdJVF9JTl9CQVNFKHJlcywgbmRpZ2l0cywgYikJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9waCwgX2R1bW15OwkJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9waCwgX2R1bW15LCBtcF9iYXNlc1tiXS5sb2cyYiwgKG1wX2xpbWJfdCkgKG5kaWdpdHMpKTsJXAorICAgIHJlcyA9IDggKiBfcGggLyBHTVBfTlVNQl9CSVRTICsgMjsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBTZXQgbiB0byB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBhbiBtcGYgb2YgdGhlIGdpdmVuIF9tcF9wcmVjCisgICBmaWVsZCwgaW4gdGhlIGdpdmVuIGJhc2UuICBUaGlzIGlzIGEgcm91bmRlZCB1cCB2YWx1ZSwgZGVzaWduZWQgdG8gZW5zdXJlCisgICB0aGVyZSdzIGVub3VnaCBkaWdpdHMgdG8gcmVwcm9kdWNlIGFsbCB0aGUgZ3VhcmFudGVlZCBwYXJ0IG9mIHRoZSB2YWx1ZS4KKworICAgVGhlcmUgYXJlIHByZWMgbWFueSBsaW1icywgYnV0IHRoZSBoaWdoIG1pZ2h0IGJlIG9ubHkgIjEiIHNvIGZvcmdldCBpdAorICAgYW5kIGp1c3QgY291bnQgcHJlYy0xIGxpbWJzIGludG8gY2hhcnMuICArMSByb3VuZHMgdGhhdCB1cHdhcmRzLCBhbmQgYQorICAgZnVydGhlciArMSBpcyBiZWNhdXNlIHRoZSBsaW1icyB1c3VhbGx5IHdvbid0IGZhbGwgb24gZGlnaXQgYm91bmRhcmllcy4KKworICAgRklYTUU6IElmIGJhc2UgaXMgYSBwb3dlciBvZiAyIGFuZCB0aGUgYml0cyBwZXIgZGlnaXQgZGl2aWRlcworICAgR01QX0xJTUJfQklUUyB0aGVuIHRoZSArMiBpcyB1bm5lY2Vzc2FyeS4gIFRoaXMgaGFwcGVucyBhbHdheXMgZm9yCisgICBiYXNlPT0yLCBhbmQgaW4gYmFzZT09MTYgd2l0aCB0aGUgY3VycmVudCAzMiBvciA2NCBiaXQgbGltYiBzaXplcy4gKi8KKworI2RlZmluZSBNUEZfU0lHTklGSUNBTlRfRElHSVRTKG4sIGJhc2UsIHByZWMpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBzaXplX3QgcmF3bjsJCQkJCQkJXAorICAgIEFTU0VSVCAoYmFzZSA+PSAyICYmIGJhc2UgPCBudW1iZXJvZiAobXBfYmFzZXMpKTsJCQlcCisgICAgRElHSVRTX0lOX0JBU0VfUEVSX0xJTUIgKHJhd24sIChwcmVjKSAtIDEsIGJhc2UpOwkJCVwKKyAgICBuID0gcmF3biArIDI7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBEZWNpbWFsIHBvaW50IHN0cmluZywgZnJvbSB0aGUgY3VycmVudCBDIGxvY2FsZS4gIE5lZWRzIDxsYW5naW5mby5oPiBmb3IKKyAgIG5sX2xhbmdpbmZvIGFuZCBjb25zdGFudHMsIHByZWZlcmFibHkgd2l0aCBfR05VX1NPVVJDRSBkZWZpbmVkIHRvIGdldAorICAgREVDSU1BTF9QT0lOVCBmcm9tIGdsaWJjLCBhbmQgbmVlZHMgPGxvY2FsZS5oPiBmb3IgbG9jYWxlY29udiwgZWFjaCB1bmRlcgorICAgdGhlaXIgcmVzcGVjdGl2ZSAjaWYgSEFWRV9GT09fSC4KKworICAgR0xJQkMgcmVjb21tZW5kcyBubF9sYW5naW5mbyBiZWNhdXNlIGdldHRpbmcgb25seSBvbmUgZmFjZXQgY2FuIGJlCisgICBmYXN0ZXIsIGFwcGFyZW50bHkuICovCisKKy8qIERFQ0lNQUxfUE9JTlQgc2VlbXMgdG8gbmVlZCBfR05VX1NPVVJDRSBkZWZpbmVkIHRvIGdldCBpdCBmcm9tIGdsaWJjLiAqLworI2lmIEhBVkVfTkxfTEFOR0lORk8gJiYgZGVmaW5lZCAoREVDSU1BTF9QT0lOVCkKKyNkZWZpbmUgR01QX0RFQ0lNQUxfUE9JTlQgIChubF9sYW5naW5mbyAoREVDSU1BTF9QT0lOVCkpCisjZW5kaWYKKy8qIFJBRElYQ0hBUiBpcyBkZXByZWNhdGVkLCBzdGlsbCBpbiB1bml4OTggb3Igc29tZSBzdWNoLiAqLworI2lmIEhBVkVfTkxfTEFOR0lORk8gJiYgZGVmaW5lZCAoUkFESVhDSEFSKSAmJiAhIGRlZmluZWQgKEdNUF9ERUNJTUFMX1BPSU5UKQorI2RlZmluZSBHTVBfREVDSU1BTF9QT0lOVCAgKG5sX2xhbmdpbmZvIChSQURJWENIQVIpKQorI2VuZGlmCisvKiBsb2NhbGVjb252IGlzIHNsb3dlciBzaW5jZSBpdCByZXR1cm5zIGFsbCBsb2NhbGUgc3R1ZmYgKi8KKyNpZiBIQVZFX0xPQ0FMRUNPTlYgJiYgISBkZWZpbmVkIChHTVBfREVDSU1BTF9QT0lOVCkKKyNkZWZpbmUgR01QX0RFQ0lNQUxfUE9JTlQgIChsb2NhbGVjb252KCktPmRlY2ltYWxfcG9pbnQpCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKEdNUF9ERUNJTUFMX1BPSU5UKQorI2RlZmluZSBHTVBfREVDSU1BTF9QT0lOVCAgKCIuIikKKyNlbmRpZgorCisKKyNkZWZpbmUgRE9QUk5UX0NPTlZfRklYRUQgICAgICAgIDEKKyNkZWZpbmUgRE9QUk5UX0NPTlZfU0NJRU5USUZJQyAgIDIKKyNkZWZpbmUgRE9QUk5UX0NPTlZfR0VORVJBTCAgICAgIDMKKworI2RlZmluZSBET1BSTlRfSlVTVElGWV9OT05FICAgICAgMAorI2RlZmluZSBET1BSTlRfSlVTVElGWV9MRUZUICAgICAgMQorI2RlZmluZSBET1BSTlRfSlVTVElGWV9SSUdIVCAgICAgMgorI2RlZmluZSBET1BSTlRfSlVTVElGWV9JTlRFUk5BTCAgMworCisjZGVmaW5lIERPUFJOVF9TSE9XQkFTRV9ZRVMgICAgICAxCisjZGVmaW5lIERPUFJOVF9TSE9XQkFTRV9OTyAgICAgICAyCisjZGVmaW5lIERPUFJOVF9TSE9XQkFTRV9OT05aRVJPICAzCisKK3N0cnVjdCBkb3BybnRfcGFyYW1zX3QgeworICBpbnQgICAgICAgICBiYXNlOyAgICAgICAgICAvKiBuZWdhdGl2ZSBmb3IgdXBwZXIgY2FzZSAqLworICBpbnQgICAgICAgICBjb252OyAgICAgICAgICAvKiBjaG9pY2VzIGFib3ZlICovCisgIGNvbnN0IGNoYXIgICpleHBmbXQ7ICAgICAgIC8qIGV4cG9uZW50IGZvcm1hdCAqLworICBpbnQgICAgICAgICBleHB0aW1lczQ7ICAgICAvKiBleHBvbmVudCBtdWx0aXBseSBieSA0ICovCisgIGNoYXIgICAgICAgIGZpbGw7ICAgICAgICAgIC8qIGNoYXJhY3RlciAqLworICBpbnQgICAgICAgICBqdXN0aWZ5OyAgICAgICAvKiBjaG9pY2VzIGFib3ZlICovCisgIGludCAgICAgICAgIHByZWM7ICAgICAgICAgIC8qIHByZWMgZmllbGQsIG9yIC0xIGZvciBhbGwgZGlnaXRzICovCisgIGludCAgICAgICAgIHNob3diYXNlOyAgICAgIC8qIGNob2ljZXMgYWJvdmUgKi8KKyAgaW50ICAgICAgICAgc2hvd3BvaW50OyAgICAgLyogaWYgcmFkaXggcG9pbnQgYWx3YXlzIHNob3duICovCisgIGludCAgICAgICAgIHNob3d0cmFpbGluZzsgIC8qIGlmIHRyYWlsaW5nIHplcm9zIHdhbnRlZCAqLworICBjaGFyICAgICAgICBzaWduOyAgICAgICAgICAvKiAnKycsICcgJywgb3IgJ1wwJyAqLworICBpbnQgICAgICAgICB3aWR0aDsgICAgICAgICAvKiB3aWR0aCBmaWVsZCAqLworfTsKKworI2lmIF9HTVBfSF9IQVZFX1ZBX0xJU1QKKwordHlwZWRlZiBpbnQgKCpkb3BybnRfZm9ybWF0X3QpICh2b2lkICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Cit0eXBlZGVmIGludCAoKmRvcHJudF9tZW1vcnlfdCkgKHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwordHlwZWRlZiBpbnQgKCpkb3BybnRfcmVwc190KSAgICh2b2lkICosIGludCwgaW50KTsKK3R5cGVkZWYgaW50ICgqZG9wcm50X2ZpbmFsX3QpICAodm9pZCAqKTsKKworc3RydWN0IGRvcHJudF9mdW5zX3QgeworICBkb3BybnRfZm9ybWF0X3QgIGZvcm1hdDsKKyAgZG9wcm50X21lbW9yeV90ICBtZW1vcnk7CisgIGRvcHJudF9yZXBzX3QgICAgcmVwczsKKyAgZG9wcm50X2ZpbmFsX3QgICBmaW5hbDsgICAvKiBOVUxMIGlmIG5vdCByZXF1aXJlZCAqLworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkb3BybnRfZnVuc190ICBfX2dtcF9mcHJpbnRmX2Z1bnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgIF9fZ21wX3NwcmludGZfZnVuczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfc25wcmludGZfZnVuczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfb2JzdGFja19wcmludGZfZnVuczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfb3N0cmVhbV9mdW5zOworCisvKiAiYnVmIiBpcyBhIF9fZ21wX2FsbG9jYXRlX2Z1bmMgYmxvY2sgb2YgImFsbG9jIiBtYW55IGJ5dGVzLiAgVGhlIGZpcnN0CisgICAic2l6ZSIgb2YgdGhlc2UgaGF2ZSBiZWVuIHdyaXR0ZW4uICAiYWxsb2MgPiBzaXplIiBpcyBtYWludGFpbmVkLCBzbworICAgdGhlcmUncyByb29tIHRvIHN0b3JlIGEgJ1wwJyBhdCB0aGUgZW5kLiAgInJlc3VsdCIgaXMgd2hlcmUgdGhlCisgICBhcHBsaWNhdGlvbiB3YW50cyB0aGUgZmluYWwgYmxvY2sgcG9pbnRlci4gICovCitzdHJ1Y3QgZ21wX2FzcHJpbnRmX3QgeworICBjaGFyICAgICoqcmVzdWx0OworICBjaGFyICAgICpidWY7CisgIHNpemVfdCAgc2l6ZTsKKyAgc2l6ZV90ICBhbGxvYzsKK307CisKKyNkZWZpbmUgR01QX0FTUFJJTlRGX1RfSU5JVChkLCBvdXRwdXQpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgKGQpLnJlc3VsdCA9IChvdXRwdXQpOwkJCQkJCVwKKyAgICAoZCkuYWxsb2MgPSAyNTY7CQkJCQkJCVwKKyAgICAoZCkuYnVmID0gKGNoYXIgKikgKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoKGQpLmFsbG9jKTsJCVwKKyAgICAoZCkuc2l6ZSA9IDA7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogSWYgYSByZWFsbG9jIGlzIG5lY2Vzc2FyeSwgdXNlIHR3aWNlIHRoZSBzaXplIGFjdHVhbGx5IHJlcXVpcmVkLCBzbyBhcyB0bworICAgYXZvaWQgcmVwZWF0ZWQgc21hbGwgcmVhbGxvY3MuICAqLworI2RlZmluZSBHTVBfQVNQUklOVEZfVF9ORUVEKGQsIG4pCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgc2l6ZV90ICBhbGxvYywgbmV3c2l6ZSwgbmV3YWxsb2M7CQkJCQlcCisgICAgQVNTRVJUICgoZCktPmFsbG9jID49IChkKS0+c2l6ZSArIDEpOwkJCQlcCisJCQkJCQkJCQlcCisgICAgYWxsb2MgPSAoZCktPmFsbG9jOwkJCQkJCQlcCisgICAgbmV3c2l6ZSA9IChkKS0+c2l6ZSArIChuKTsJCQkJCQlcCisgICAgaWYgKGFsbG9jIDw9IG5ld3NpemUpCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwluZXdhbGxvYyA9IDIqbmV3c2l6ZTsJCQkJCQlcCisJKGQpLT5hbGxvYyA9IG5ld2FsbG9jOwkJCQkJCVwKKwkoZCktPmJ1ZiA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19UWVBFICgoZCktPmJ1ZiwJCVwKKwkJCQkJICAgICAgIGFsbG9jLCBuZXdhbGxvYywgY2hhcik7CVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKK19fR01QX0RFQ0xTUEVDIGludCBfX2dtcF9hc3ByaW50Zl9tZW1vcnkgKHN0cnVjdCBnbXBfYXNwcmludGZfdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX0dNUF9ERUNMU1BFQyBpbnQgX19nbXBfYXNwcmludGZfcmVwcyAoc3RydWN0IGdtcF9hc3ByaW50Zl90ICosIGludCwgaW50KTsKK19fR01QX0RFQ0xTUEVDIGludCBfX2dtcF9hc3ByaW50Zl9maW5hbCAoc3RydWN0IGdtcF9hc3ByaW50Zl90ICopOworCisvKiBidWYgaXMgd2hlcmUgdG8gd3JpdGUgdGhlIG5leHQgb3V0cHV0LCBhbmQgc2l6ZSBpcyBob3cgbXVjaCBzcGFjZSBpcyBsZWZ0CisgICB0aGVyZS4gIElmIHRoZSBhcHBsaWNhdGlvbiBwYXNzZWQgc2l6ZT09MCB0aGVuIHRoYXQncyB3aGF0IHdlJ2xsIGhhdmUKKyAgIGhlcmUsIGFuZCBub3RoaW5nIGF0IGFsbCBzaG91bGQgYmUgd3JpdHRlbi4gICovCitzdHJ1Y3QgZ21wX3NucHJpbnRmX3QgeworICBjaGFyICAgICpidWY7CisgIHNpemVfdCAgc2l6ZTsKK307CisKKy8qIEFkZCB0aGUgYnl0ZXMgcHJpbnRlZCBieSB0aGUgY2FsbCB0byB0aGUgdG90YWwgcmV0dmFsLCBvciBiYWlsIG91dCBvbiBhbgorICAgZXJyb3IuICAqLworI2RlZmluZSBET1BSTlRfQUNDVU1VTEFURShjYWxsKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpbnQgIF9fcmV0OwkJCQkJCQkJXAorICAgIF9fcmV0ID0gY2FsbDsJCQkJCQkJXAorICAgIGlmIChfX3JldCA9PSAtMSkJCQkJCQkJXAorICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAorICAgIHJldHZhbCArPSBfX3JldDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBET1BSTlRfQUNDVU1VTEFURV9GVU4oZnVuLCBwYXJhbXMpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKChmdW4pICE9IE5VTEwpOwkJCQkJCVwKKyAgICBET1BSTlRfQUNDVU1VTEFURSAoKCooZnVuKSkgcGFyYW1zKTsJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERPUFJOVF9GT1JNQVQoZm10LCBhcCkJCQkJCQlcCisgIERPUFJOVF9BQ0NVTVVMQVRFX0ZVTiAoZnVucy0+Zm9ybWF0LCAoZGF0YSwgZm10LCBhcCkpCisjZGVmaW5lIERPUFJOVF9NRU1PUlkocHRyLCBsZW4pCQkJCQkJXAorICBET1BSTlRfQUNDVU1VTEFURV9GVU4gKGZ1bnMtPm1lbW9yeSwgKGRhdGEsIHB0ciwgbGVuKSkKKyNkZWZpbmUgRE9QUk5UX1JFUFMoYywgbikJCQkJCQlcCisgIERPUFJOVF9BQ0NVTVVMQVRFX0ZVTiAoZnVucy0+cmVwcywgKGRhdGEsIGMsIG4pKQorCisjZGVmaW5lIERPUFJOVF9TVFJJTkcoc3RyKSAgICAgIERPUFJOVF9NRU1PUlkgKHN0ciwgc3RybGVuIChzdHIpKQorCisjZGVmaW5lIERPUFJOVF9SRVBTX01BWUJFKGMsIG4pCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmICgobikgIT0gMCkJCQkJCQkJXAorICAgICAgRE9QUk5UX1JFUFMgKGMsIG4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgRE9QUk5UX01FTU9SWV9NQVlCRShwdHIsIGxlbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoKGxlbikgIT0gMCkJCQkJCQkJXAorICAgICAgRE9QUk5UX01FTU9SWSAocHRyLCBsZW4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworX19HTVBfREVDTFNQRUMgaW50IF9fZ21wX2RvcHJudCAoY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgKiwgdm9pZCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworX19HTVBfREVDTFNQRUMgaW50IF9fZ21wX2RvcHJudF9pbnRlZ2VyIChjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAqLCB2b2lkICosIGNvbnN0IHN0cnVjdCBkb3BybnRfcGFyYW1zX3QgKiwgY29uc3QgY2hhciAqKTsKKworI2RlZmluZSBfX2dtcF9kb3BybnRfbXBmIF9fZ21wX2RvcHJudF9tcGYyCitfX0dNUF9ERUNMU1BFQyBpbnQgX19nbXBfZG9wcm50X21wZiAoY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgKiwgdm9pZCAqLCBjb25zdCBzdHJ1Y3QgZG9wcm50X3BhcmFtc190ICosIGNvbnN0IGNoYXIgKiwgbXBmX3NyY3B0cik7CisKK19fR01QX0RFQ0xTUEVDIGludCBfX2dtcF9yZXBsYWNlbWVudF92c25wcmludGYgKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmIC8qIF9HTVBfSF9IQVZFX1ZBX0xJU1QgKi8KKworCit0eXBlZGVmIGludCAoKmdtcF9kb3NjYW5fc2Nhbl90KSAgKHZvaWQgKiwgY29uc3QgY2hhciAqLCAuLi4pOwordHlwZWRlZiB2b2lkICooKmdtcF9kb3NjYW5fc3RlcF90KSAodm9pZCAqLCBpbnQpOwordHlwZWRlZiBpbnQgKCpnbXBfZG9zY2FuX2dldF90KSAgICh2b2lkICopOwordHlwZWRlZiBpbnQgKCpnbXBfZG9zY2FuX3VuZ2V0X3QpIChpbnQsIHZvaWQgKik7CisKK3N0cnVjdCBnbXBfZG9zY2FuX2Z1bnNfdCB7CisgIGdtcF9kb3NjYW5fc2Nhbl90ICAgc2NhbjsKKyAgZ21wX2Rvc2Nhbl9zdGVwX3QgICBzdGVwOworICBnbXBfZG9zY2FuX2dldF90ICAgIGdldDsKKyAgZ21wX2Rvc2Nhbl91bmdldF90ICB1bmdldDsKK307CitleHRlcm4gY29uc3Qgc3RydWN0IGdtcF9kb3NjYW5fZnVuc190ICBfX2dtcF9mc2NhbmZfZnVuczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZ21wX2Rvc2Nhbl9mdW5zX3QgIF9fZ21wX3NzY2FuZl9mdW5zOworCisjaWYgX0dNUF9IX0hBVkVfVkFfTElTVAorX19HTVBfREVDTFNQRUMgaW50IF9fZ21wX2Rvc2NhbiAoY29uc3Qgc3RydWN0IGdtcF9kb3NjYW5fZnVuc190ICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisKKy8qIEZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuICAqLworI2RlZmluZSBNUFpfQ0hFQ0tfRk9STUFUKHopCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVF9BTFdBWVMgKFNJWih6KSA9PSAwIHx8IFBUUih6KVtBQlNJWih6KSAtIDFdICE9IDApOwkJXAorICAgIEFTU0VSVF9BTFdBWVMgKEFMTE9DKHopID49IEFCU0laKHopKTsJCQkJXAorICAgIEFTU0VSVF9BTFdBWVNfTVBOIChQVFIoeiksIEFCU0laKHopKTsJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QUV9DSEVDS19GT1JNQVQocSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgTVBaX0NIRUNLX0ZPUk1BVCAobXBxX251bXJlZiAocSkpOwkJCQkJXAorICAgIE1QWl9DSEVDS19GT1JNQVQgKG1wcV9kZW5yZWYgKHEpKTsJCQkJCVwKKyAgICBBU1NFUlRfQUxXQVlTIChTSVoobXBxX2RlbnJlZihxKSkgPj0gMSk7CQkJCVwKKwkJCQkJCQkJCVwKKyAgICBpZiAoU0laKG1wcV9udW1yZWYocSkpID09IDApCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCS8qIHNob3VsZCBoYXZlIHplcm8gYXMgMC8xICovCQkJCQlcCisJQVNTRVJUX0FMV0FZUyAoU0laKG1wcV9kZW5yZWYocSkpID09IDEJCQkJXAorCQkgICAgICAgJiYgUFRSKG1wcV9kZW5yZWYocSkpWzBdID09IDEpOwkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwkvKiBzaG91bGQgaGF2ZSBubyBjb21tb24gZmFjdG9ycyAqLwkJCQlcCisJbXB6X3QgIGc7CQkJCQkJCVwKKwltcHpfaW5pdCAoZyk7CQkJCQkJCVwKKwltcHpfZ2NkIChnLCBtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpKTsJCQlcCisJQVNTRVJUX0FMV0FZUyAobXB6X2NtcF91aSAoZywgMSkgPT0gMCk7CQkJCVwKKwltcHpfY2xlYXIgKGcpOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QRl9DSEVDS19GT1JNQVQoZikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgQVNTRVJUX0FMV0FZUyAoUFJFQyhmKSA+PSBfX0dNUEZfQklUU19UT19QUkVDKDUzKSk7CQkJXAorICAgIEFTU0VSVF9BTFdBWVMgKEFCU0laKGYpIDw9IFBSRUMoZikrMSk7CQkJCVwKKyAgICBpZiAoU0laKGYpID09IDApCQkJCQkJCVwKKyAgICAgIEFTU0VSVF9BTFdBWVMgKEVYUChmKSA9PSAwKTsJCQkJCVwKKyAgICBpZiAoU0laKGYpICE9IDApCQkJCQkJCVwKKyAgICAgIEFTU0VSVF9BTFdBWVMgKFBUUihmKVtBQlNJWihmKSAtIDFdICE9IDApOwkJCVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBFbmhhbmNlbWVudDogVGhlICJtb2QiIGFuZCAiZ2NkXzEiIGZ1bmN0aW9ucyBiZWxvdyBjb3VsZCBoYXZlCisgICBfX0dNUF9BVFRSSUJVVEVfUFVSRSwgYnV0IGN1cnJlbnRseSAoZ2NjIDMuMykgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgb24KKyAgIGZ1bmN0aW9uIHBvaW50ZXJzLCBvbmx5IGFjdHVhbCBmdW5jdGlvbnMuICBJdCBwcm9iYWJseSBkb2Vzbid0IG1ha2UgbXVjaAorICAgZGlmZmVyZW5jZSB0byB0aGUgZ21wIGNvZGUsIHNpbmNlIGhvcGVmdWxseSB3ZSBhcnJhbmdlIGNhbGxzIHNvIHRoZXJlJ3MKKyAgIG5vIGdyZWF0IG5lZWQgZm9yIHRoZSBjb21waWxlciB0byBtb3ZlIHRoaW5ncyBhcm91bmQuICAqLworCisjaWYgV0FOVF9GQVRfQklOQVJZICYmIChIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYgfHwgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2XzY0KQorLyogTk9URTogVGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoaXMgc3RydWN0IGFyZSBhbHNvIGluIENQVVZFQ19GVU5DU19MSVNUCisgICBpbiBtcG4veDg2L3g4Ni1kZWZzLm00IGFuZCBtcG4veDg2XzY0L3g4Nl82NC1kZWZzLm00LiAgQmUgc3VyZSB0byB1cGRhdGUKKyAgIHRob3NlIHdoZW4gY2hhbmdpbmcgaGVyZS4gICovCitzdHJ1Y3QgY3B1dmVjX3QgeworICBERUNMX2FkZF9uICAgICAgICAgICAoKCphZGRfbikpOworICBERUNMX2FkZGxzaDFfbiAgICAgICAoKCphZGRsc2gxX24pKTsKKyAgREVDTF9hZGRsc2gyX24gICAgICAgKCgqYWRkbHNoMl9uKSk7CisgIERFQ0xfYWRkbXVsXzEgICAgICAgICgoKmFkZG11bF8xKSk7CisgIERFQ0xfYWRkbXVsXzIgICAgICAgICgoKmFkZG11bF8yKSk7CisgIERFQ0xfYmRpdl9kYm0xYyAgICAgICgoKmJkaXZfZGJtMWMpKTsKKyAgREVDTF9jbmRfYWRkX24gICAgICAgKCgqY25kX2FkZF9uKSk7CisgIERFQ0xfY25kX3N1Yl9uICAgICAgICgoKmNuZF9zdWJfbikpOworICBERUNMX2NvbSAgICAgICAgICAgICAoKCpjb20pKTsKKyAgREVDTF9jb3B5ZCAgICAgICAgICAgKCgqY29weWQpKTsKKyAgREVDTF9jb3B5aSAgICAgICAgICAgKCgqY29weWkpKTsKKyAgREVDTF9kaXZleGFjdF8xICAgICAgKCgqZGl2ZXhhY3RfMSkpOworICBERUNMX2RpdnJlbV8xICAgICAgICAoKCpkaXZyZW1fMSkpOworICBERUNMX2djZF8xMSAgICAgICAgICAoKCpnY2RfMTEpKTsKKyAgREVDTF9sc2hpZnQgICAgICAgICAgKCgqbHNoaWZ0KSk7CisgIERFQ0xfbHNoaWZ0YyAgICAgICAgICgoKmxzaGlmdGMpKTsKKyAgREVDTF9tb2RfMSAgICAgICAgICAgKCgqbW9kXzEpKTsKKyAgREVDTF9tb2RfMV8xcCAgICAgICAgKCgqbW9kXzFfMXApKTsKKyAgREVDTF9tb2RfMV8xcF9jcHMgICAgKCgqbW9kXzFfMXBfY3BzKSk7CisgIERFQ0xfbW9kXzFzXzJwICAgICAgICgoKm1vZF8xc18ycCkpOworICBERUNMX21vZF8xc18ycF9jcHMgICAoKCptb2RfMXNfMnBfY3BzKSk7CisgIERFQ0xfbW9kXzFzXzRwICAgICAgICgoKm1vZF8xc180cCkpOworICBERUNMX21vZF8xc180cF9jcHMgICAoKCptb2RfMXNfNHBfY3BzKSk7CisgIERFQ0xfbW9kXzM0bHN1YjEgICAgICgoKm1vZF8zNGxzdWIxKSk7CisgIERFQ0xfbW9kZXhhY3RfMWNfb2RkICgoKm1vZGV4YWN0XzFjX29kZCkpOworICBERUNMX211bF8xICAgICAgICAgICAoKCptdWxfMSkpOworICBERUNMX211bF9iYXNlY2FzZSAgICAoKCptdWxfYmFzZWNhc2UpKTsKKyAgREVDTF9tdWxsb19iYXNlY2FzZSAgKCgqbXVsbG9fYmFzZWNhc2UpKTsKKyAgREVDTF9wcmVpbnZfZGl2cmVtXzEgKCgqcHJlaW52X2RpdnJlbV8xKSk7CisgIERFQ0xfcHJlaW52X21vZF8xICAgICgoKnByZWludl9tb2RfMSkpOworICBERUNMX3JlZGNfMSAgICAgICAgICAoKCpyZWRjXzEpKTsKKyAgREVDTF9yZWRjXzIgICAgICAgICAgKCgqcmVkY18yKSk7CisgIERFQ0xfcnNoaWZ0ICAgICAgICAgICgoKnJzaGlmdCkpOworICBERUNMX3Nxcl9iYXNlY2FzZSAgICAoKCpzcXJfYmFzZWNhc2UpKTsKKyAgREVDTF9zdWJfbiAgICAgICAgICAgKCgqc3ViX24pKTsKKyAgREVDTF9zdWJsc2gxX24gICAgICAgKCgqc3VibHNoMV9uKSk7CisgIERFQ0xfc3VibXVsXzEgICAgICAgICgoKnN1Ym11bF8xKSk7CisgIG1wX3NpemVfdCAgICAgICAgICAgIG11bF90b29tMjJfdGhyZXNob2xkOworICBtcF9zaXplX3QgICAgICAgICAgICBtdWxfdG9vbTMzX3RocmVzaG9sZDsKKyAgbXBfc2l6ZV90ICAgICAgICAgICAgc3FyX3Rvb20yX3RocmVzaG9sZDsKKyAgbXBfc2l6ZV90ICAgICAgICAgICAgc3FyX3Rvb20zX3RocmVzaG9sZDsKKyAgbXBfc2l6ZV90ICAgICAgICAgICAgYm1vZF8xX3RvX21vZF8xX3RocmVzaG9sZDsKK307CitfX0dNUF9ERUNMU1BFQyBleHRlcm4gc3RydWN0IGNwdXZlY190IF9fZ21wbl9jcHV2ZWM7CitfX0dNUF9ERUNMU1BFQyBleHRlcm4gaW50IF9fZ21wbl9jcHV2ZWNfaW5pdGlhbGl6ZWQ7CisjZW5kaWYgLyogeDg2IGZhdCBiaW5hcnkgKi8KKworX19HTVBfREVDTFNQRUMgdm9pZCBfX2dtcG5fY3B1dmVjX2luaXQgKHZvaWQpOworCisvKiBHZXQgYSB0aHJlc2hvbGQgImZpZWxkIiBmcm9tIF9fZ21wbl9jcHV2ZWMsIHJ1bm5pbmcgX19nbXBuX2NwdXZlY19pbml0KCkKKyAgIGlmIHRoYXQgaGFzbid0IHlldCBiZWVuIGRvbmUgKHRvIGVzdGFibGlzaCB0aGUgcmlnaHQgdmFsdWVzKS4gICovCisjZGVmaW5lIENQVVZFQ19USFJFU0hPTEQoZmllbGQpCQkJCQkJICAgICAgXAorICAoKExJS0VMWSAoX19nbXBuX2NwdXZlY19pbml0aWFsaXplZCkgPyAwIDogKF9fZ21wbl9jcHV2ZWNfaW5pdCAoKSwgMCkpLCAgICAgXAorICAgX19nbXBuX2NwdXZlYy5maWVsZCkKKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworI2RlZmluZSBtcG5fYWRkX25jIF9fTVBOKGFkZF9uYykKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fYWRkX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisjZWxzZQorc3RhdGljIGlubGluZQorbXBfbGltYl90CittcG5fYWRkX25jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGNpKQoreworICBtcF9saW1iX3QgY287CisgIGNvID0gbXBuX2FkZF9uIChycCwgdXAsIHZwLCBuKTsKKyAgY28gKz0gbXBuX2FkZF8xIChycCwgcnAsIG4sIGNpKTsKKyAgcmV0dXJuIGNvOworfQorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3ViX25jCisjZGVmaW5lIG1wbl9zdWJfbmMgX19NUE4oc3ViX25jKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9zdWJfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIG1wX2xpbWJfdAorbXBuX3N1Yl9uYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBjaSkKK3sKKyAgbXBfbGltYl90IGNvOworICBjbyA9IG1wbl9zdWJfbiAocnAsIHVwLCB2cCwgbik7CisgIGNvICs9IG1wbl9zdWJfMSAocnAsIHJwLCBuLCBjaSk7CisgIHJldHVybiBjbzsKK30KKyNlbmRpZgorCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisvKiBTb21lIGV4dHJhcyB3YW50ZWQgd2hlbiByZWNvbXBpbGluZyBzb21lIC5jIGZpbGVzIGZvciB1c2UgYnkgdGhlIHR1bmUKKyAgIHByb2dyYW0uICBOb3QgcGFydCBvZiBhIG5vcm1hbCBidWlsZC4KKworICAgSXQncyBuZWNlc3NhcnkgdG8ga2VlcCB0aGVzZSB0aHJlc2hvbGRzIGFzICNkZWZpbmVzIChqdXN0IHRvIGFuCisgICBpZGVudGljYWxseSBuYW1lZCB2YXJpYWJsZSksIHNpbmNlIHZhcmlvdXMgZGVmYXVsdHMgYXJlIGVzdGFibGlzaGVkIGJhc2VkCisgICBvbiAjaWZkZWYgaW4gdGhlIC5jIGZpbGVzLiAgRm9yIHNvbWUgdGhpcyBpcyBub3Qgc28gKHRoZSBkZWZhdWx0cyBhcmUKKyAgIGluc3RlYWQgZXN0YWJsaXNoZWQgYWJvdmUpLCBidXQgYWxsIGFyZSBkb25lIHRoaXMgd2F5IGZvciBjb25zaXN0ZW5jeS4gKi8KKworI3VuZGVmCU1VTF9UT09NMjJfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xECQltdWxfdG9vbTIyX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11bF90b29tMjJfdGhyZXNob2xkOworCisjdW5kZWYJTVVMX1RPT00zM19USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT00zM19USFJFU0hPTEQJCW11bF90b29tMzNfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVsX3Rvb20zM190aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxfVE9PTTQ0X1RIUkVTSE9MRAorI2RlZmluZSBNVUxfVE9PTTQ0X1RIUkVTSE9MRAkJbXVsX3Rvb200NF90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxfdG9vbTQ0X3RocmVzaG9sZDsKKworI3VuZGVmCU1VTF9UT09NNkhfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NNkhfVEhSRVNIT0xECQltdWxfdG9vbTZoX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11bF90b29tNmhfdGhyZXNob2xkOworCisjdW5kZWYJTVVMX1RPT004SF9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT004SF9USFJFU0hPTEQJCW11bF90b29tOGhfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVsX3Rvb204aF90aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxfVE9PTTMyX1RPX1RPT000M19USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT00zMl9UT19UT09NNDNfVEhSRVNIT0xECW11bF90b29tMzJfdG9fdG9vbTQzX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11bF90b29tMzJfdG9fdG9vbTQzX3RocmVzaG9sZDsKKworI3VuZGVmCU1VTF9UT09NMzJfVE9fVE9PTTUzX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfVE9PTTMyX1RPX1RPT001M19USFJFU0hPTEQJbXVsX3Rvb20zMl90b190b29tNTNfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVsX3Rvb20zMl90b190b29tNTNfdGhyZXNob2xkOworCisjdW5kZWYJTVVMX1RPT000Ml9UT19UT09NNTNfVEhSRVNIT0xECisjZGVmaW5lIE1VTF9UT09NNDJfVE9fVE9PTTUzX1RIUkVTSE9MRAltdWxfdG9vbTQyX3RvX3Rvb201M190aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxfdG9vbTQyX3RvX3Rvb201M190aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxfVE9PTTQyX1RPX1RPT002M19USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xECW11bF90b29tNDJfdG9fdG9vbTYzX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11bF90b29tNDJfdG9fdG9vbTYzX3RocmVzaG9sZDsKKworI3VuZGVmICBNVUxfVE9PTTQzX1RPX1RPT001NF9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX1RPT000M19UT19UT09NNTRfVEhSRVNIT0xECW11bF90b29tNDNfdG9fdG9vbTU0X3RocmVzaG9sZDsKK2V4dGVybiBtcF9zaXplX3QJCQltdWxfdG9vbTQzX3RvX3Rvb201NF90aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxfRkZUX1RIUkVTSE9MRAorI2RlZmluZSBNVUxfRkZUX1RIUkVTSE9MRAkJbXVsX2ZmdF90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxfZmZ0X3RocmVzaG9sZDsKKworI3VuZGVmCU1VTF9GRlRfTU9ERl9USFJFU0hPTEQKKyNkZWZpbmUgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRAkJbXVsX2ZmdF9tb2RmX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11bF9mZnRfbW9kZl90aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxfRkZUX1RBQkxFCisjZGVmaW5lIE1VTF9GRlRfVEFCTEUJCQl7IDAgfQorCisjdW5kZWYJTVVMX0ZGVF9UQUJMRTMKKyNkZWZpbmUgTVVMX0ZGVF9UQUJMRTMJCQl7IHswLDB9IH0KKworLyogQSBuYXRpdmUgbXBuX3Nxcl9iYXNlY2FzZSBpcyBub3QgdHVuZWQgYW5kIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQgc2hvdWxkCisgICByZW1haW4gYXMgemVybyAoYWx3YXlzIHVzZSBpdCkuICovCisjaWYgISBIQVZFX05BVElWRV9tcG5fc3FyX2Jhc2VjYXNlCisjdW5kZWYJU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorI2RlZmluZSBTUVJfQkFTRUNBU0VfVEhSRVNIT0xECQlzcXJfYmFzZWNhc2VfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc3FyX2Jhc2VjYXNlX3RocmVzaG9sZDsKKyNlbmRpZgorCisjaWYgVFVORV9QUk9HUkFNX0JVSUxEX1NRUgorI3VuZGVmCVNRUl9UT09NMl9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT00yX1RIUkVTSE9MRAkJU1FSX1RPT00yX01BWF9HRU5FUklDCisjZWxzZQorI3VuZGVmCVNRUl9UT09NMl9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT00yX1RIUkVTSE9MRAkJc3FyX3Rvb20yX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcl90b29tMl90aHJlc2hvbGQ7CisjZW5kaWYKKworI3VuZGVmCVNRUl9UT09NM19USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT00zX1RIUkVTSE9MRAkJc3FyX3Rvb20zX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcl90b29tM190aHJlc2hvbGQ7CisKKyN1bmRlZglTUVJfVE9PTTRfVEhSRVNIT0xECisjZGVmaW5lIFNRUl9UT09NNF9USFJFU0hPTEQJCXNxcl90b29tNF90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlzcXJfdG9vbTRfdGhyZXNob2xkOworCisjdW5kZWYJU1FSX1RPT002X1RIUkVTSE9MRAorI2RlZmluZSBTUVJfVE9PTTZfVEhSRVNIT0xECQlzcXJfdG9vbTZfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc3FyX3Rvb202X3RocmVzaG9sZDsKKworI3VuZGVmCVNRUl9UT09NOF9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT004X1RIUkVTSE9MRAkJc3FyX3Rvb204X3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcl90b29tOF90aHJlc2hvbGQ7CisKKyN1bmRlZiAgU1FSX0ZGVF9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX0ZGVF9USFJFU0hPTEQJCXNxcl9mZnRfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc3FyX2ZmdF90aHJlc2hvbGQ7CisKKyN1bmRlZiAgU1FSX0ZGVF9NT0RGX1RIUkVTSE9MRAorI2RlZmluZSBTUVJfRkZUX01PREZfVEhSRVNIT0xECQlzcXJfZmZ0X21vZGZfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc3FyX2ZmdF9tb2RmX3RocmVzaG9sZDsKKworI3VuZGVmCVNRUl9GRlRfVEFCTEUKKyNkZWZpbmUgU1FSX0ZGVF9UQUJMRQkJCXsgMCB9CisKKyN1bmRlZglTUVJfRkZUX1RBQkxFMworI2RlZmluZSBTUVJfRkZUX1RBQkxFMwkJCXsgezAsMH0gfQorCisjdW5kZWYJTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xECisjZGVmaW5lIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRAltdWxsb19iYXNlY2FzZV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxsb19iYXNlY2FzZV90aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxMT19EQ19USFJFU0hPTEQKKyNkZWZpbmUgTVVMTE9fRENfVEhSRVNIT0xECQltdWxsb19kY190aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxsb19kY190aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxMT19NVUxfTl9USFJFU0hPTEQKKyNkZWZpbmUgTVVMTE9fTVVMX05fVEhSRVNIT0xECQltdWxsb19tdWxfbl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxsb19tdWxfbl90aHJlc2hvbGQ7CisKKyN1bmRlZglTUVJMT19CQVNFQ0FTRV9USFJFU0hPTEQKKyNkZWZpbmUgU1FSTE9fQkFTRUNBU0VfVEhSRVNIT0xECXNxcmxvX2Jhc2VjYXNlX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcmxvX2Jhc2VjYXNlX3RocmVzaG9sZDsKKworI3VuZGVmCVNRUkxPX0RDX1RIUkVTSE9MRAorI2RlZmluZSBTUVJMT19EQ19USFJFU0hPTEQJCXNxcmxvX2RjX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcmxvX2RjX3RocmVzaG9sZDsKKworI3VuZGVmCVNRUkxPX1NRUl9USFJFU0hPTEQKKyNkZWZpbmUgU1FSTE9fU1FSX1RIUkVTSE9MRAkJc3FybG9fc3FyX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXNxcmxvX3Nxcl90aHJlc2hvbGQ7CisKKyN1bmRlZglNVUxNSURfVE9PTTQyX1RIUkVTSE9MRAorI2RlZmluZSBNVUxNSURfVE9PTTQyX1RIUkVTSE9MRAkJbXVsbWlkX3Rvb200Ml90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdWxtaWRfdG9vbTQyX3RocmVzaG9sZDsKKworI3VuZGVmCURJVl9RUl8yX1BJMl9USFJFU0hPTEQKKyNkZWZpbmUgRElWX1FSXzJfUEkyX1RIUkVTSE9MRAkJZGl2X3FyXzJfcGkyX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWRpdl9xcl8yX3BpMl90aHJlc2hvbGQ7CisKKyN1bmRlZglEQ19ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIERDX0RJVl9RUl9USFJFU0hPTEQJCWRjX2Rpdl9xcl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlkY19kaXZfcXJfdGhyZXNob2xkOworCisjdW5kZWYJRENfRElWQVBQUl9RX1RIUkVTSE9MRAorI2RlZmluZSBEQ19ESVZBUFBSX1FfVEhSRVNIT0xECQlkY19kaXZhcHByX3FfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJZGNfZGl2YXBwcl9xX3RocmVzaG9sZDsKKworI3VuZGVmCURDX0JESVZfUV9USFJFU0hPTEQKKyNkZWZpbmUgRENfQkRJVl9RX1RIUkVTSE9MRAkJZGNfYmRpdl9xX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWRjX2JkaXZfcV90aHJlc2hvbGQ7CisKKyN1bmRlZglEQ19CRElWX1FSX1RIUkVTSE9MRAorI2RlZmluZSBEQ19CRElWX1FSX1RIUkVTSE9MRAkJZGNfYmRpdl9xcl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlkY19iZGl2X3FyX3RocmVzaG9sZDsKKworI3VuZGVmCU1VX0RJVl9RUl9USFJFU0hPTEQKKyNkZWZpbmUgTVVfRElWX1FSX1RIUkVTSE9MRAkJbXVfZGl2X3FyX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW11X2Rpdl9xcl90aHJlc2hvbGQ7CisKKyN1bmRlZglNVV9ESVZBUFBSX1FfVEhSRVNIT0xECisjZGVmaW5lIE1VX0RJVkFQUFJfUV9USFJFU0hPTEQJCW11X2RpdmFwcHJfcV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdV9kaXZhcHByX3FfdGhyZXNob2xkOworCisjdW5kZWYJTVVQSV9ESVZfUVJfVEhSRVNIT0xECisjZGVmaW5lIE1VUElfRElWX1FSX1RIUkVTSE9MRAkJbXVwaV9kaXZfcXJfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVwaV9kaXZfcXJfdGhyZXNob2xkOworCisjdW5kZWYJTVVfQkRJVl9RUl9USFJFU0hPTEQKKyNkZWZpbmUgTVVfQkRJVl9RUl9USFJFU0hPTEQJCW11X2JkaXZfcXJfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVfYmRpdl9xcl90aHJlc2hvbGQ7CisKKyN1bmRlZglNVV9CRElWX1FfVEhSRVNIT0xECisjZGVmaW5lIE1VX0JESVZfUV9USFJFU0hPTEQJCW11X2JkaXZfcV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltdV9iZGl2X3FfdGhyZXNob2xkOworCisjdW5kZWYJSU5WX01VTE1PRF9CTk0xX1RIUkVTSE9MRAorI2RlZmluZSBJTlZfTVVMTU9EX0JOTTFfVEhSRVNIT0xECWludl9tdWxtb2RfYm5tMV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlpbnZfbXVsbW9kX2JubTFfdGhyZXNob2xkOworCisjdW5kZWYJSU5WX05FV1RPTl9USFJFU0hPTEQKKyNkZWZpbmUgSU5WX05FV1RPTl9USFJFU0hPTEQJCWludl9uZXd0b25fdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJaW52X25ld3Rvbl90aHJlc2hvbGQ7CisKKyN1bmRlZglJTlZfQVBQUl9USFJFU0hPTEQKKyNkZWZpbmUgSU5WX0FQUFJfVEhSRVNIT0xECQlpbnZfYXBwcl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlpbnZfYXBwcl90aHJlc2hvbGQ7CisKKyN1bmRlZglCSU5WX05FV1RPTl9USFJFU0hPTEQKKyNkZWZpbmUgQklOVl9ORVdUT05fVEhSRVNIT0xECQliaW52X25ld3Rvbl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQliaW52X25ld3Rvbl90aHJlc2hvbGQ7CisKKyN1bmRlZglSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRAorI2RlZmluZSBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRAlyZWRjXzFfdG9fcmVkY18yX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXJlZGNfMV90b19yZWRjXzJfdGhyZXNob2xkOworCisjdW5kZWYJUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQKKyNkZWZpbmUgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQJcmVkY18yX3RvX3JlZGNfbl90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlyZWRjXzJfdG9fcmVkY19uX3RocmVzaG9sZDsKKworI3VuZGVmCVJFRENfMV9UT19SRURDX05fVEhSRVNIT0xECisjZGVmaW5lIFJFRENfMV9UT19SRURDX05fVEhSRVNIT0xECXJlZGNfMV90b19yZWRjX25fdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJcmVkY18xX3RvX3JlZGNfbl90aHJlc2hvbGQ7CisKKyN1bmRlZglNQVRSSVgyMl9TVFJBU1NFTl9USFJFU0hPTEQKKyNkZWZpbmUgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xECW1hdHJpeDIyX3N0cmFzc2VuX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW1hdHJpeDIyX3N0cmFzc2VuX3RocmVzaG9sZDsKKwordHlwZWRlZiBpbnQgaGdjZDJfZnVuY190IChtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsCisJCQkgIHN0cnVjdCBoZ2NkX21hdHJpeDEgKik7CitleHRlcm4gaGdjZDJfZnVuY190ICpoZ2NkMl9mdW5jOworCisjdW5kZWYJSEdDRF9USFJFU0hPTEQKKyNkZWZpbmUgSEdDRF9USFJFU0hPTEQJCQloZ2NkX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWhnY2RfdGhyZXNob2xkOworCisjdW5kZWYJSEdDRF9BUFBSX1RIUkVTSE9MRAorI2RlZmluZSBIR0NEX0FQUFJfVEhSRVNIT0xECQloZ2NkX2FwcHJfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJaGdjZF9hcHByX3RocmVzaG9sZDsKKworI3VuZGVmCUhHQ0RfUkVEVUNFX1RIUkVTSE9MRAorI2RlZmluZSBIR0NEX1JFRFVDRV9USFJFU0hPTEQJCWhnY2RfcmVkdWNlX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWhnY2RfcmVkdWNlX3RocmVzaG9sZDsKKworI3VuZGVmCUdDRF9EQ19USFJFU0hPTEQKKyNkZWZpbmUgR0NEX0RDX1RIUkVTSE9MRAkJZ2NkX2RjX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWdjZF9kY190aHJlc2hvbGQ7CisKKyN1bmRlZiAgR0NERVhUX0RDX1RIUkVTSE9MRAorI2RlZmluZSBHQ0RFWFRfRENfVEhSRVNIT0xECQlnY2RleHRfZGNfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJZ2NkZXh0X2RjX3RocmVzaG9sZDsKKworI3VuZGVmICBESVZfUVJfMU5fUEkxX01FVEhPRAorI2RlZmluZSBESVZfUVJfMU5fUEkxX01FVEhPRAkJZGl2X3FyXzFuX3BpMV9tZXRob2QKK2V4dGVybiBpbnQJCQkJZGl2X3FyXzFuX3BpMV9tZXRob2Q7CisKKyN1bmRlZiAgRElWX1FSXzFfTk9STV9USFJFU0hPTEQKKyNkZWZpbmUgRElWX1FSXzFfTk9STV9USFJFU0hPTEQJCWRpdl9xcl8xX25vcm1fdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJZGl2X3FyXzFfbm9ybV90aHJlc2hvbGQ7CisKKyN1bmRlZiAgRElWX1FSXzFfVU5OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBESVZfUVJfMV9VTk5PUk1fVEhSRVNIT0xECWRpdl9xcl8xX3Vubm9ybV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlkaXZfcXJfMV91bm5vcm1fdGhyZXNob2xkOworCisjdW5kZWYgIERJVlJFTV8xX05PUk1fVEhSRVNIT0xECisjZGVmaW5lIERJVlJFTV8xX05PUk1fVEhSRVNIT0xECQlkaXZyZW1fMV9ub3JtX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWRpdnJlbV8xX25vcm1fdGhyZXNob2xkOworCisjdW5kZWYgIERJVlJFTV8xX1VOTk9STV9USFJFU0hPTEQKKyNkZWZpbmUgRElWUkVNXzFfVU5OT1JNX1RIUkVTSE9MRAlkaXZyZW1fMV91bm5vcm1fdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJZGl2cmVtXzFfdW5ub3JtX3RocmVzaG9sZDsKKworI3VuZGVmCU1PRF8xX05PUk1fVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xX05PUk1fVEhSRVNIT0xECQltb2RfMV9ub3JtX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW1vZF8xX25vcm1fdGhyZXNob2xkOworCisjdW5kZWYJTU9EXzFfVU5OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBNT0RfMV9VTk5PUk1fVEhSRVNIT0xECQltb2RfMV91bm5vcm1fdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbW9kXzFfdW5ub3JtX3RocmVzaG9sZDsKKworI3VuZGVmICBNT0RfMV8xUF9NRVRIT0QKKyNkZWZpbmUgTU9EXzFfMVBfTUVUSE9ECQkJbW9kXzFfMXBfbWV0aG9kCitleHRlcm4gaW50CQkJCW1vZF8xXzFwX21ldGhvZDsKKworI3VuZGVmCU1PRF8xTl9UT19NT0RfMV8xX1RIUkVTSE9MRAorI2RlZmluZSBNT0RfMU5fVE9fTU9EXzFfMV9USFJFU0hPTEQJbW9kXzFuX3RvX21vZF8xXzFfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbW9kXzFuX3RvX21vZF8xXzFfdGhyZXNob2xkOworCisjdW5kZWYJTU9EXzFVX1RPX01PRF8xXzFfVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xVV9UT19NT0RfMV8xX1RIUkVTSE9MRAltb2RfMXVfdG9fbW9kXzFfMV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQltb2RfMXVfdG9fbW9kXzFfMV90aHJlc2hvbGQ7CisKKyN1bmRlZglNT0RfMV8xX1RPX01PRF8xXzJfVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xXzFfVE9fTU9EXzFfMl9USFJFU0hPTEQJbW9kXzFfMV90b19tb2RfMV8yX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW1vZF8xXzFfdG9fbW9kXzFfMl90aHJlc2hvbGQ7CisKKyN1bmRlZglNT0RfMV8yX1RPX01PRF8xXzRfVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xXzJfVE9fTU9EXzFfNF9USFJFU0hPTEQJbW9kXzFfMl90b19tb2RfMV80X3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCW1vZF8xXzJfdG9fbW9kXzFfNF90aHJlc2hvbGQ7CisKKyN1bmRlZglQUkVJTlZfTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xECisjZGVmaW5lIFBSRUlOVl9NT0RfMV9UT19NT0RfMV9USFJFU0hPTEQJcHJlaW52X21vZF8xX3RvX21vZF8xX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCXByZWludl9tb2RfMV90b19tb2RfMV90aHJlc2hvbGQ7CisKKyNpZiAhIFVESVZfUFJFSU5WX0FMV0FZUworI3VuZGVmCURJVlJFTV8yX1RIUkVTSE9MRAorI2RlZmluZSBESVZSRU1fMl9USFJFU0hPTEQJCWRpdnJlbV8yX3RocmVzaG9sZAorZXh0ZXJuIG1wX3NpemVfdAkJCWRpdnJlbV8yX3RocmVzaG9sZDsKKyNlbmRpZgorCisjdW5kZWYJTVVMTU9EX0JOTTFfVEhSRVNIT0xECisjZGVmaW5lIE1VTE1PRF9CTk0xX1RIUkVTSE9MRAkJbXVsbW9kX2JubTFfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJbXVsbW9kX2JubTFfdGhyZXNob2xkOworCisjdW5kZWYJU1FSTU9EX0JOTTFfVEhSRVNIT0xECisjZGVmaW5lIFNRUk1PRF9CTk0xX1RIUkVTSE9MRAkJc3FybW9kX2JubTFfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc3FybW9kX2JubTFfdGhyZXNob2xkOworCisjdW5kZWYJR0VUX1NUUl9EQ19USFJFU0hPTEQKKyNkZWZpbmUgR0VUX1NUUl9EQ19USFJFU0hPTEQJCWdldF9zdHJfZGNfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJZ2V0X3N0cl9kY190aHJlc2hvbGQ7CisKKyN1bmRlZiAgR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRAorI2RlZmluZSBHRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xECWdldF9zdHJfcHJlY29tcHV0ZV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlnZXRfc3RyX3ByZWNvbXB1dGVfdGhyZXNob2xkOworCisjdW5kZWYJU0VUX1NUUl9EQ19USFJFU0hPTEQKKyNkZWZpbmUgU0VUX1NUUl9EQ19USFJFU0hPTEQJCXNldF9zdHJfZGNfdGhyZXNob2xkCitleHRlcm4gbXBfc2l6ZV90CQkJc2V0X3N0cl9kY190aHJlc2hvbGQ7CisKKyN1bmRlZiAgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRAorI2RlZmluZSBTRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xECXNldF9zdHJfcHJlY29tcHV0ZV90aHJlc2hvbGQKK2V4dGVybiBtcF9zaXplX3QJCQlzZXRfc3RyX3ByZWNvbXB1dGVfdGhyZXNob2xkOworCisjdW5kZWYgIEZBQ19PRERfVEhSRVNIT0xECisjZGVmaW5lIEZBQ19PRERfVEhSRVNIT0xECQlmYWNfb2RkX3RocmVzaG9sZAorZXh0ZXJuICBtcF9zaXplX3QJCQlmYWNfb2RkX3RocmVzaG9sZDsKKworI3VuZGVmICBGQUNfRFNDX1RIUkVTSE9MRAorI2RlZmluZSBGQUNfRFNDX1RIUkVTSE9MRAkJZmFjX2RzY190aHJlc2hvbGQKK2V4dGVybiAgbXBfc2l6ZV90CQkJZmFjX2RzY190aHJlc2hvbGQ7CisKKyN1bmRlZiAgRkZUX1RBQkxFX0FUVFJTCisjZGVmaW5lIEZGVF9UQUJMRV9BVFRSUworZXh0ZXJuIG1wX3NpemVfdCAgbXBuX2ZmdF90YWJsZVsyXVtNUE5fRkZUX1RBQkxFX1NJWkVdOworI2RlZmluZSBGRlRfVEFCTEUzX1NJWkUgMjAwMAkvKiBnZW5lcm91cyBzcGFjZSBmb3IgdHVuaW5nICovCitleHRlcm4gc3RydWN0IGZmdF90YWJsZV9uayBtcG5fZmZ0X3RhYmxlM1syXVtGRlRfVEFCTEUzX1NJWkVdOworCisvKiBTaXplcyB0aGUgdHVuZSBwcm9ncmFtIHRlc3RzIHVwIHRvLCB1c2VkIGluIGEgY291cGxlIG9mIHJlY29tcGlsYXRpb25zLiAqLworI3VuZGVmIE1VTF9UT09NMjJfVEhSRVNIT0xEX0xJTUlUCisjdW5kZWYgTVVMX1RPT00zM19USFJFU0hPTERfTElNSVQKKyN1bmRlZiBNVUxMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQKKyN1bmRlZiBTUVJMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQKKyN1bmRlZiBTUVJMT19EQ19USFJFU0hPTERfTElNSVQKKyN1bmRlZiBTUVJfVE9PTTNfVEhSRVNIT0xEX0xJTUlUCisjZGVmaW5lIFNRUl9UT09NMl9NQVhfR0VORVJJQyAgICAgICAgICAgMjAwCisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xEX0xJTUlUICAgICAgNzAwCisjZGVmaW5lIE1VTF9UT09NMzNfVEhSRVNIT0xEX0xJTUlUICAgICAgNzAwCisjZGVmaW5lIFNRUl9UT09NM19USFJFU0hPTERfTElNSVQgICAgICAgNDAwCisjZGVmaW5lIE1VTF9UT09NNDRfVEhSRVNIT0xEX0xJTUlUICAgICAxMDAwCisjZGVmaW5lIFNRUl9UT09NNF9USFJFU0hPTERfTElNSVQgICAgICAxMDAwCisjZGVmaW5lIE1VTF9UT09NNkhfVEhSRVNIT0xEX0xJTUlUICAgICAxMTAwCisjZGVmaW5lIFNRUl9UT09NNl9USFJFU0hPTERfTElNSVQgICAgICAxMTAwCisjZGVmaW5lIE1VTF9UT09NOEhfVEhSRVNIT0xEX0xJTUlUICAgICAxMjAwCisjZGVmaW5lIFNRUl9UT09NOF9USFJFU0hPTERfTElNSVQgICAgICAxMjAwCisjZGVmaW5lIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRF9MSU1JVCAgMjAwCisjZGVmaW5lIFNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRF9MSU1JVCAgMjAwCisjZGVmaW5lIFNRUkxPX0RDX1RIUkVTSE9MRF9MSU1JVCAgICAgICAgNDAwCisjZGVmaW5lIEdFVF9TVFJfVEhSRVNIT0xEX0xJTUlUICAgICAgICAgMTUwCisjZGVmaW5lIEZBQ19EU0NfVEhSRVNIT0xEX0xJTUlUICAgICAgICAyMDQ4CisKKyNlbmRpZiAvKiBUVU5FX1BST0dSQU1fQlVJTEQgKi8KKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKy8qIEZJWE1FOiBNYWtlIHRoZXNlIGl0Y2ggZnVuY3Rpb25zIGxlc3MgY29uc2VydmF0aXZlLiAgQWxzbyBjb25zaWRlciBtYWtpbmcKKyAgIHRoZW0gZGVwZW5kZW50IG9uIGp1c3QgJ2FuJywgYW5kIGNvbXB1dGUgdGhlIGFsbG9jYXRpb24gZGlyZWN0bHkgZnJvbSAnYW4nCisgICBpbnN0ZWFkIG9mIHZpYSBuLiAgKi8KKworLyogdG9vbTIyL3Rvb20yOiBTY3JhdGNoIG5lZWQgaXMgMiooYW4gKyBrKSwgayBpcyB0aGUgcmVjdXJzaW9uIGRlcHRoLgorICAgayBpcyB0aHMgc21hbGxlc3QgayBzdWNoIHRoYXQKKyAgICAgY2VpbChhbi8yXmspIDwgTVVMX1RPT00yMl9USFJFU0hPTEQuCisgICB3aGljaCBpbXBsaWVzIHRoYXQKKyAgICAgayA9IGJpdHNpemUgb2YgZmxvb3IgKChhbi0xKS8oTVVMX1RPT00yMl9USFJFU0hPTEQtMSkpCisgICAgICAgPSAxICsgZmxvb3IgKGxvZ18yIChmbG9vciAoKGFuLTEpLyhNVUxfVE9PTTIyX1RIUkVTSE9MRC0xKSkpKQorKi8KKyNkZWZpbmUgbXBuX3Rvb20yMl9tdWxfaXRjaChhbiwgYm4pIFwKKyAgKDIgKiAoKGFuKSArIEdNUF9OVU1CX0JJVFMpKQorI2RlZmluZSBtcG5fdG9vbTJfc3FyX2l0Y2goYW4pIFwKKyAgKDIgKiAoKGFuKSArIEdNUF9OVU1CX0JJVFMpKQorCisvKiB0b29tMzMvdG9vbTM6IFNjcmF0Y2ggbmVlZCBpcyA1YW4vMiArIDEwaywgayBpcyB0aGUgcmVjdXJzaW9uIGRlcHRoLgorICAgV2UgdXNlIDNhbiArIEMsIHNvIHRoYXQgd2UgY2FuIHVzZSBhIHNtYWxsZXIgY29uc3RhbnQuCisgKi8KKyNkZWZpbmUgbXBuX3Rvb20zM19tdWxfaXRjaChhbiwgYm4pIFwKKyAgKDMgKiAoYW4pICsgR01QX05VTUJfQklUUykKKyNkZWZpbmUgbXBuX3Rvb20zX3Nxcl9pdGNoKGFuKSBcCisgICgzICogKGFuKSArIEdNUF9OVU1CX0JJVFMpCisKKy8qIHRvb20zMy90b29tMzogU2NyYXRjaCBuZWVkIGlzIDhhbi8zICsgMTNrLCBrIGlzIHRoZSByZWN1cnNpb24gZGVwdGguCisgICBXZSB1c2UgM2FuICsgQywgc28gdGhhdCB3ZSBjYW4gdXNlIGEgc21hbGxlciBjb25zdGFudC4KKyAqLworI2RlZmluZSBtcG5fdG9vbTQ0X211bF9pdGNoKGFuLCBibikgXAorICAoMyAqIChhbikgKyBHTVBfTlVNQl9CSVRTKQorI2RlZmluZSBtcG5fdG9vbTRfc3FyX2l0Y2goYW4pIFwKKyAgKDMgKiAoYW4pICsgR01QX05VTUJfQklUUykKKworI2RlZmluZSBtcG5fdG9vbTZfc3FyX2l0Y2gobikJCQkJCQlcCisgICgoKG4pIC0gU1FSX1RPT002X1RIUkVTSE9MRCkqMiArCQkJCQlcCisgICBNQVgoU1FSX1RPT002X1RIUkVTSE9MRCoyICsgR01QX05VTUJfQklUUyo2LAkJCQlcCisgICAgICAgbXBuX3Rvb200X3Nxcl9pdGNoKFNRUl9UT09NNl9USFJFU0hPTEQpKSkKKworI2RlZmluZSBNVUxfVE9PTTZIX01JTgkJCQkJCQlcCisgICgoTVVMX1RPT002SF9USFJFU0hPTEQgPiBNVUxfVE9PTTQ0X1RIUkVTSE9MRCkgPwkJCVwKKyAgICBNVUxfVE9PTTZIX1RIUkVTSE9MRCA6IE1VTF9UT09NNDRfVEhSRVNIT0xEKQorI2RlZmluZSBtcG5fdG9vbTZfbXVsX25faXRjaChuKQkJCQkJCVwKKyAgKCgobikgLSBNVUxfVE9PTTZIX01JTikqMiArCQkJCQkJXAorICAgTUFYKE1VTF9UT09NNkhfTUlOKjIgKyBHTVBfTlVNQl9CSVRTKjYsCQkJCVwKKyAgICAgICBtcG5fdG9vbTQ0X211bF9pdGNoKE1VTF9UT09NNkhfTUlOLE1VTF9UT09NNkhfTUlOKSkpCisKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fdG9vbTZoX211bF9pdGNoIChtcF9zaXplX3QgYW4sIG1wX3NpemVfdCBibikgeworICBtcF9zaXplX3QgZXN0aW1hdGVkTjsKKyAgZXN0aW1hdGVkTiA9IChhbiArIGJuKSAvIChzaXplX3QpIDEwICsgMTsKKyAgcmV0dXJuIG1wbl90b29tNl9tdWxfbl9pdGNoIChlc3RpbWF0ZWROICogNik7Cit9CisKKyNkZWZpbmUgbXBuX3Rvb204X3Nxcl9pdGNoKG4pCQkJCQkJXAorICAoKCgobikqMTUpPj4zKSAtICgoU1FSX1RPT004X1RIUkVTSE9MRCoxNSk+PjMpICsJCQlcCisgICBNQVgoKChTUVJfVE9PTThfVEhSRVNIT0xEKjE1KT4+MykgKyBHTVBfTlVNQl9CSVRTKjYsCQkJXAorICAgICAgIG1wbl90b29tNl9zcXJfaXRjaChTUVJfVE9PTThfVEhSRVNIT0xEKSkpCisKKyNkZWZpbmUgTVVMX1RPT004SF9NSU4JCQkJCQkJXAorICAoKE1VTF9UT09NOEhfVEhSRVNIT0xEID4gTVVMX1RPT002SF9NSU4pID8JCQkJXAorICAgIE1VTF9UT09NOEhfVEhSRVNIT0xEIDogTVVMX1RPT002SF9NSU4pCisjZGVmaW5lIG1wbl90b29tOF9tdWxfbl9pdGNoKG4pCQkJCQkJXAorICAoKCgobikqMTUpPj4zKSAtICgoTVVMX1RPT004SF9NSU4qMTUpPj4zKSArCQkJCVwKKyAgIE1BWCgoKE1VTF9UT09NOEhfTUlOKjE1KT4+MykgKyBHTVBfTlVNQl9CSVRTKjYsCQkJXAorICAgICAgIG1wbl90b29tNl9tdWxfbl9pdGNoKE1VTF9UT09NOEhfTUlOKSkpCisKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fdG9vbThoX211bF9pdGNoIChtcF9zaXplX3QgYW4sIG1wX3NpemVfdCBibikgeworICBtcF9zaXplX3QgZXN0aW1hdGVkTjsKKyAgZXN0aW1hdGVkTiA9IChhbiArIGJuKSAvIChzaXplX3QpIDE0ICsgMTsKKyAgcmV0dXJuIG1wbl90b29tOF9tdWxfbl9pdGNoIChlc3RpbWF0ZWROICogOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fdG9vbTMyX211bF9pdGNoIChtcF9zaXplX3QgYW4sIG1wX3NpemVfdCBibikKK3sKKyAgbXBfc2l6ZV90IG4gPSAxICsgKDIgKiBhbiA+PSAzICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDMgOiAoYm4gLSAxKSA+PiAxKTsKKyAgbXBfc2l6ZV90IGl0Y2ggPSAyICogbiArIDE7CisKKyAgcmV0dXJuIGl0Y2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgbXBfc2l6ZV90CittcG5fdG9vbTQyX211bF9pdGNoIChtcF9zaXplX3QgYW4sIG1wX3NpemVfdCBibikKK3sKKyAgbXBfc2l6ZV90IG4gPSBhbiA+PSAyICogYm4gPyAoYW4gKyAzKSA+PiAyIDogKGJuICsgMSkgPj4gMTsKKyAgcmV0dXJuIDYgKiBuICsgMzsKK30KKworc3RhdGljIGlubGluZSBtcF9zaXplX3QKK21wbl90b29tNDNfbXVsX2l0Y2ggKG1wX3NpemVfdCBhbiwgbXBfc2l6ZV90IGJuKQoreworICBtcF9zaXplX3QgbiA9IDEgKyAoMyAqIGFuID49IDQgKiBibiA/IChhbiAtIDEpID4+IDIgOiAoYm4gLSAxKSAvIChzaXplX3QpIDMpOworCisgIHJldHVybiA2Km4gKyA0OworfQorCitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Rvb201Ml9tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3NpemVfdCBuID0gMSArICgyICogYW4gPj0gNSAqIGJuID8gKGFuIC0gMSkgLyAoc2l6ZV90KSA1IDogKGJuIC0gMSkgPj4gMSk7CisgIHJldHVybiA2Km4gKyA0OworfQorCitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Rvb201M19tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3NpemVfdCBuID0gMSArICgzICogYW4gPj0gNSAqIGJuID8gKGFuIC0gMSkgLyAoc2l6ZV90KSA1IDogKGJuIC0gMSkgLyAoc2l6ZV90KSAzKTsKKyAgcmV0dXJuIDEwICogbiArIDEwOworfQorCitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Rvb202Ml9tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3NpemVfdCBuID0gMSArIChhbiA+PSAzICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDYgOiAoYm4gLSAxKSA+PiAxKTsKKyAgcmV0dXJuIDEwICogbiArIDEwOworfQorCitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Rvb202M19tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3NpemVfdCBuID0gMSArIChhbiA+PSAyICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDYgOiAoYm4gLSAxKSAvIChzaXplX3QpIDMpOworICByZXR1cm4gOSAqIG4gKyAzOworfQorCitzdGF0aWMgaW5saW5lIG1wX3NpemVfdAorbXBuX3Rvb201NF9tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3NpemVfdCBuID0gMSArICg0ICogYW4gPj0gNSAqIGJuID8gKGFuIC0gMSkgLyAoc2l6ZV90KSA1IDogKGJuIC0gMSkgLyAoc2l6ZV90KSA0KTsKKyAgcmV0dXJuIDkgKiBuICsgMzsKK30KKworLyogbGV0IFMobikgPSBzcGFjZSByZXF1aXJlZCBmb3IgaW5wdXQgc2l6ZSBuLAorICAgdGhlbiBTKG4pID0gMyBmbG9vcihuLzIpICsgMSArIFMoZmxvb3Iobi8yKSkuICAgKi8KKyNkZWZpbmUgbXBuX3Rvb200Ml9tdWxtaWRfaXRjaChuKSBcCisgICgzICogKG4pICsgR01QX05VTUJfQklUUykKKworI2lmIDAKKyNkZWZpbmUgbXBuX2ZmdF9tdWwgbXBuX211bF9mZnRfZnVsbAorI2Vsc2UKKyNkZWZpbmUgbXBuX2ZmdF9tdWwgbXBuX251c3NiYXVtZXJfbXVsCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qIEEgbGl0dGxlIGhlbHBlciBmb3IgYSBudWxsLXRlcm1pbmF0ZWQgX19nbXBfYWxsb2NhdGVfZnVuYyBzdHJpbmcuCisgICBUaGUgZGVzdHJ1Y3RvciBlbnN1cmVzIGl0J3MgZnJlZWQgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgVGhlIGxlbiBmaWVsZCBpcyBuZWVkZWQgYnkgdGhlIGRlc3RydWN0b3IsIGFuZCBjYW4gYmUgdXNlZCBieSBhbnlvbmUgZWxzZQorICAgdG8gYXZvaWQgYSBzZWNvbmQgc3RybGVuIHBhc3Mgb3ZlciB0aGUgZGF0YS4KKworICAgU2luY2Ugb3VyIGlucHV0IGlzIGEgQyBzdHJpbmcsIHVzaW5nIHN0cmxlbiBpcyBjb3JyZWN0LiAgUGVyaGFwcyBpdCdkIGJlCisgICBtb3JlIEMrKy1pc2ggc3R5bGUgdG8gdXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aCwgYnV0IGNoYXJfdHJhaXRzCisgICBpc24ndCBhdmFpbGFibGUgaW4gZ2NjIDIuOTUuNC4gICovCisKK2NsYXNzIGdtcF9hbGxvY2F0ZWRfc3RyaW5nIHsKKyBwdWJsaWM6CisgIGNoYXIgKnN0cjsKKyAgc2l6ZV90IGxlbjsKKyAgZ21wX2FsbG9jYXRlZF9zdHJpbmcoY2hhciAqYXJnKQorICB7CisgICAgc3RyID0gYXJnOworICAgIGxlbiA9IHN0ZDo6c3RybGVuIChzdHIpOworICB9CisgIH5nbXBfYWxsb2NhdGVkX3N0cmluZygpCisgIHsKKyAgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgbGVuKzEpOworICB9Cit9OworCitzdGQ6OmlzdHJlYW0gJl9fZ21wel9vcGVyYXRvcl9pbl9ub3doaXRlIChzdGQ6OmlzdHJlYW0gJiwgbXB6X3B0ciwgY2hhcik7CitpbnQgX19nbXBfaXN0cmVhbV9zZXRfYmFzZSAoc3RkOjppc3RyZWFtICYsIGNoYXIgJiwgYm9vbCAmLCBib29sICYpOwordm9pZCBfX2dtcF9pc3RyZWFtX3NldF9kaWdpdHMgKHN0ZDo6c3RyaW5nICYsIHN0ZDo6aXN0cmVhbSAmLCBjaGFyICYsIGJvb2wgJiwgaW50KTsKK3ZvaWQgX19nbXBfZG9wcm50X3BhcmFtc19mcm9tX2lvcyAoc3RydWN0IGRvcHJudF9wYXJhbXNfdCAqLCBzdGQ6OmlvcyAmKTsKK3N0ZDo6b3N0cmVhbSYgX19nbXBfZG9wcm50X2ludGVnZXJfb3N0cmVhbSAoc3RkOjpvc3RyZWFtICYsIHN0cnVjdCBkb3BybnRfcGFyYW1zX3QgKiwgY2hhciAqKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfYXNwcmludGZfZnVuc19ub2Zvcm1hdDsKKworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfX0dNUF9JTVBMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ21weHguaCBiL2dtcHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL2dtcHh4LmgKQEAgLTAsMCArMSwzODcxIEBACisvKiBnbXB4eC5oIC0tIEMrKyBjbGFzcyB3cmFwcGVyIGZvciBHTVAgdHlwZXMuICAtKi0gQysrIC0qLQorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA2LCAyMDA4LCAyMDExLTIwMTUsIDIwMTggRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaWZuZGVmIF9fR01QX1BMVVNQTFVTX18KKyNkZWZpbmUgX19HTVBfUExVU1BMVVNfXworCisjaW5jbHVkZSA8aW9zZndkPgorCisjaW5jbHVkZSA8Y3N0cmluZz4gIC8qIGZvciBzdHJsZW4gKi8KKyNpbmNsdWRlIDxsaW1pdHM+ICAvKiBudW1lcmljX2xpbWl0cyAqLworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8YWxnb3JpdGhtPiAgLyogc3dhcCAqLworI2luY2x1ZGUgPHN0cmluZz4KKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjZWxzZQorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Z21wLmg+CisKKy8vIHdyYXBwZXIgZm9yIGdjYydzIF9fYnVpbHRpbl9jb25zdGFudF9wCisvLyBfX2J1aWx0aW5fY29uc3RhbnRfcCBoYXMgYmVlbiBpbiBnY2Mgc2luY2UgZm9yZXZlciwKKy8vIGJ1dCBnKystMy40IG1pc2NvbXBpbGVzIGl0LgorI2lmIF9fR01QX0dOVUNfUFJFUkVRKDQsIDIpCisjZGVmaW5lIF9fR01QWFhfQ09OU1RBTlQoWCkgX19idWlsdGluX2NvbnN0YW50X3AoWCkKKyNlbHNlCisjZGVmaW5lIF9fR01QWFhfQ09OU1RBTlQoWCkgZmFsc2UKKyNlbmRpZgorI2RlZmluZSBfX0dNUFhYX0NPTlNUQU5UX1RSVUUoWCkgKF9fR01QWFhfQ09OU1RBTlQoWCkgJiYgKFgpKQorCisvLyBVc2UgQysrMTEgZmVhdHVyZXMKKyNpZm5kZWYgX19HTVBYWF9VU0VfQ1hYMTEKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjZGVmaW5lIF9fR01QWFhfVVNFX0NYWDExIDEKKyNlbHNlCisjZGVmaW5lIF9fR01QWFhfVVNFX0NYWDExIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBfX0dNUFhYX1VTRV9DWFgxMQorI2RlZmluZSBfX0dNUFhYX05PRVhDRVBUIG5vZXhjZXB0CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGZvciBjb21tb25fdHlwZQorI2Vsc2UKKyNkZWZpbmUgX19HTVBYWF9OT0VYQ0VQVAorI2VuZGlmCisKKy8vIE1heCBhbGxvY2F0aW9ucyBmb3IgcGxhaW4gdHlwZXMgd2hlbiBjb252ZXJ0ZWQgdG8gR01QIHR5cGVzCisjaWYgR01QX05BSUxfQklUUyAhPSAwICYmICEgZGVmaW5lZCBfTE9OR19MT05HX0xJTUIKKyNkZWZpbmUgX19HTVBaX1VMSV9MSU1CUyAyCisjZWxzZQorI2RlZmluZSBfX0dNUFpfVUxJX0xJTUJTIDEKKyNlbmRpZgorCisjZGVmaW5lIF9fR01QWFhfQklUU19UT19MSU1CUyhuKSAgKCgobikgKyAoR01QX05VTUJfQklUUyAtIDEpKSAvIEdNUF9OVU1CX0JJVFMpCisjZGVmaW5lIF9fR01QWl9EQkxfTElNQlMgX19HTVBYWF9CSVRTX1RPX0xJTUJTKERCTF9NQVhfRVhQKSsxCisjZGVmaW5lIF9fR01QUV9OVU1fREJMX0xJTUJTIF9fR01QWl9EQkxfTElNQlMKKyNkZWZpbmUgX19HTVBRX0RFTl9EQkxfTElNQlMgX19HTVBYWF9CSVRTX1RPX0xJTUJTKERCTF9NQU5UX0RJRysxLURCTF9NSU5fRVhQKSsxCisvLyBUaGUgZmluYWwgKzFzIGFyZSBhIHNlY3VyaXR5IG1hcmdpbi4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YKKy8vIG1wcV9zZXRfZCBzZWVtcyB0byBuZWVkIGl0IGZvciB0aGUgZGVub21pbmF0b3IuCisKK2lubGluZSB2b2lkIF9fbXB6X3NldF91aV9zYWZlKG1wel9wdHIgcCwgdW5zaWduZWQgbG9uZyBsKQoreworICBwLT5fbXBfc2l6ZSA9IChsICE9IDApOworICBwLT5fbXBfZFswXSA9IGwgJiBHTVBfTlVNQl9NQVNLOworI2lmIF9fR01QWl9VTElfTElNQlMgPiAxCisgIGwgPj49IEdNUF9OVU1CX0JJVFM7CisgIHAtPl9tcF9kWzFdID0gbDsKKyAgcC0+X21wX3NpemUgKz0gKGwgIT0gMCk7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQgX19tcHpfc2V0X3NpX3NhZmUobXB6X3B0ciBwLCBsb25nIGwpCit7CisgIGlmKGwgPCAwKQorICB7CisgICAgX19tcHpfc2V0X3VpX3NhZmUocCwgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgICBtcHpfbmVnKHAsIHApOworICB9CisgIGVsc2UKKyAgICBfX21wel9zZXRfdWlfc2FmZShwLCBsKTsKKyAgICAvLyBOb3RlOiB3ZSBrbm93IHRoZSBoaWdoIGJpdCBvZiBsIGlzIDAgc28gd2UgY291bGQgZG8gc2xpZ2h0bHkgYmV0dGVyCit9CisKKy8vIEZha2UgdGVtcG9yYXJ5IHZhcmlhYmxlcworI2RlZmluZSBfX0dNUFhYX1RNUFpfVUkJCQkJCQkJXAorICBtcHpfdCB0ZW1wOwkJCQkJCQkJXAorICBtcF9saW1iX3QgbGltYnNbX19HTVBaX1VMSV9MSU1CU107CQkJCQlcCisgIHRlbXAtPl9tcF9kID0gbGltYnM7CQkJCQkJCVwKKyAgX19tcHpfc2V0X3VpX3NhZmUgKHRlbXAsIGwpCisjZGVmaW5lIF9fR01QWFhfVE1QWl9TSQkJCQkJCQlcCisgIG1wel90IHRlbXA7CQkJCQkJCQlcCisgIG1wX2xpbWJfdCBsaW1ic1tfX0dNUFpfVUxJX0xJTUJTXTsJCQkJCVwKKyAgdGVtcC0+X21wX2QgPSBsaW1iczsJCQkJCQkJXAorICBfX21wel9zZXRfc2lfc2FmZSAodGVtcCwgbCkKKyNkZWZpbmUgX19HTVBYWF9UTVBaX0QJCQkJCQkJXAorICBtcHpfdCB0ZW1wOwkJCQkJCQkJXAorICBtcF9saW1iX3QgbGltYnNbX19HTVBaX0RCTF9MSU1CU107CQkJCQlcCisgIHRlbXAtPl9tcF9kID0gbGltYnM7CQkJCQkJCVwKKyAgdGVtcC0+X21wX2FsbG9jID0gX19HTVBaX0RCTF9MSU1CUzsJCQkJCVwKKyAgbXB6X3NldF9kICh0ZW1wLCBkKQorCisjZGVmaW5lIF9fR01QWFhfVE1QUV9VSQkJCQkJCQlcCisgIG1wcV90IHRlbXA7CQkJCQkJCQlcCisgIG1wX2xpbWJfdCBsaW1ic1tfX0dNUFpfVUxJX0xJTUJTKzFdOwkJCQkJXAorICBtcHFfbnVtcmVmKHRlbXApLT5fbXBfZCA9IGxpbWJzOwkJCQkJXAorICBfX21wel9zZXRfdWlfc2FmZSAobXBxX251bXJlZih0ZW1wKSwgbCk7CQkJCVwKKyAgbXBxX2RlbnJlZih0ZW1wKS0+X21wX2QgPSBsaW1icyArIF9fR01QWl9VTElfTElNQlM7CQkJXAorICBtcHFfZGVucmVmKHRlbXApLT5fbXBfc2l6ZSA9IDE7CQkJCQlcCisgIG1wcV9kZW5yZWYodGVtcCktPl9tcF9kWzBdID0gMQorI2RlZmluZSBfX0dNUFhYX1RNUFFfU0kJCQkJCQkJXAorICBtcHFfdCB0ZW1wOwkJCQkJCQkJXAorICBtcF9saW1iX3QgbGltYnNbX19HTVBaX1VMSV9MSU1CUysxXTsJCQkJCVwKKyAgbXBxX251bXJlZih0ZW1wKS0+X21wX2QgPSBsaW1iczsJCQkJCVwKKyAgX19tcHpfc2V0X3NpX3NhZmUgKG1wcV9udW1yZWYodGVtcCksIGwpOwkJCQlcCisgIG1wcV9kZW5yZWYodGVtcCktPl9tcF9kID0gbGltYnMgKyBfX0dNUFpfVUxJX0xJTUJTOwkJCVwKKyAgbXBxX2RlbnJlZih0ZW1wKS0+X21wX3NpemUgPSAxOwkJCQkJXAorICBtcHFfZGVucmVmKHRlbXApLT5fbXBfZFswXSA9IDEKKyNkZWZpbmUgX19HTVBYWF9UTVBRX0QJCQkJCQkJXAorICBtcHFfdCB0ZW1wOwkJCQkJCQkJXAorICBtcF9saW1iX3QgbGltYnNbX19HTVBRX05VTV9EQkxfTElNQlMgKyBfX0dNUFFfREVOX0RCTF9MSU1CU107CQlcCisgIG1wcV9udW1yZWYodGVtcCktPl9tcF9kID0gbGltYnM7CQkJCQlcCisgIG1wcV9udW1yZWYodGVtcCktPl9tcF9hbGxvYyA9IF9fR01QUV9OVU1fREJMX0xJTUJTOwkJCVwKKyAgbXBxX2RlbnJlZih0ZW1wKS0+X21wX2QgPSBsaW1icyArIF9fR01QUV9OVU1fREJMX0xJTUJTOwkJXAorICBtcHFfZGVucmVmKHRlbXApLT5fbXBfYWxsb2MgPSBfX0dNUFFfREVOX0RCTF9MSU1CUzsJCQlcCisgIG1wcV9zZXRfZCAodGVtcCwgZCkKKworaW5saW5lIHVuc2lnbmVkIGxvbmcgX19nbXB4eF9hYnNfdWkgKHNpZ25lZCBsb25nIGwpCit7CisgIHJldHVybiBsID49IDAgPyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKQorCSAgOiAtc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCk7Cit9CisKKy8qKioqKioqKioqKioqKioqIEZ1bmN0aW9uIG9iamVjdHMgKioqKioqKioqKioqKioqKi8KKy8qIEFueSBldmFsdWF0aW9uIG9mIGEgX19nbXBfZXhwciBlbmRzIHVwIGNhbGxpbmcgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucworICAgYWxsIGludGVybWVkaWF0ZSBmdW5jdGlvbnMgYmVpbmcgaW5saW5lLCB0aGUgZXZhbHVhdGlvbiBzaG91bGQgb3B0aW1pemUKKyAgIHRvIGEgZGlyZWN0IGNhbGwgdG8gdGhlIHJlbGV2YW50IGZ1bmN0aW9uLCB0aHVzIHlpZWxkaW5nIG5vIG92ZXJoZWFkCisgICBvdmVyIHRoZSBDIGludGVyZmFjZS4gKi8KKworc3RydWN0IF9fZ21wX3VuYXJ5X3BsdXMKK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdykgeyBtcHpfc2V0KHosIHcpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIpIHsgbXBxX3NldChxLCByKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnKSB7IG1wZl9zZXQoZiwgZyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF91bmFyeV9taW51cworeworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KSB7IG1wel9uZWcoeiwgdyk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgcikgeyBtcHFfbmVnKHEsIHIpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgbXBmX25lZyhmLCBnKTsgfQorfTsKKworc3RydWN0IF9fZ21wX3VuYXJ5X2NvbQoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KSB7IG1wel9jb20oeiwgdyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfcGx1cworeworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBtcHpfc3JjcHRyIHYpCisgIHsgbXB6X2FkZCh6LCB3LCB2KTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKyAgICAvLyBJZGVhbGx5LCB0aG9zZSBjaGVja3Mgc2hvdWxkIGhhcHBlbiBlYXJsaWVyIHNvIHRoYXQgdGhlIHRyZWUKKyAgICAvLyBnZW5lcmF0ZWQgZm9yIGErMCtiIHdvdWxkIGp1c3QgYmUgc3VtKGEsYikuCisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgbCA9PSAwKQorICAgIHsKKyAgICAgIGlmICh6ICE9IHcpIG1wel9zZXQoeiwgdyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG1wel9hZGRfdWkoeiwgdywgbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHNpZ25lZCBsb25nIGludCBsKQorICB7CisgICAgaWYgKGwgPj0gMCkKKyAgICAgIGV2YWwoeiwgdywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgIGVsc2UKKyAgICAgIG1wel9zdWJfdWkoeiwgdywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgbXB6X2FkZCAoeiwgdywgdGVtcCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGRvdWJsZSBkLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBkKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIG1wcV9zcmNwdHIgcykKKyAgeyBtcHFfYWRkKHEsIHIsIHMpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgciwgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UKGwpICYmIGwgPT0gMCkKKyAgICB7CisgICAgICBpZiAocSAhPSByKSBtcHFfc2V0KHEsIHIpOworICAgIH0KKyAgICBlbHNlIGlmIChfX0dNUFhYX0NPTlNUQU5UKGwpICYmIGwgPT0gMSkKKyAgICB7CisgICAgICBtcHpfYWRkIChtcHFfbnVtcmVmKHEpLCBtcHFfbnVtcmVmKHIpLCBtcHFfZGVucmVmKHIpKTsKKyAgICAgIGlmIChxICE9IHIpIG1wel9zZXQobXBxX2RlbnJlZihxKSwgbXBxX2RlbnJlZihyKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAocSA9PSByKQorICAgICAgICBtcHpfYWRkbXVsX3VpKG1wcV9udW1yZWYocSksIG1wcV9kZW5yZWYocSksIGwpOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtcHpfbXVsX3VpKG1wcV9udW1yZWYocSksIG1wcV9kZW5yZWYociksIGwpOworICAgICAgICBtcHpfYWRkKG1wcV9udW1yZWYocSksIG1wcV9udW1yZWYocSksIG1wcV9udW1yZWYocikpOworICAgICAgICBtcHpfc2V0KG1wcV9kZW5yZWYocSksIG1wcV9kZW5yZWYocikpOworICAgICAgfQorICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciByKQorICB7IGV2YWwocSwgciwgbCk7IH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIHNpZ25lZCBsb25nIGludCBsKTsKKyAgLy8gZGVmaW5lZCBhZnRlciBfX2dtcF9iaW5hcnlfbWludXMKKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIHNpZ25lZCBsb25nIGludCBsLCBtcHFfc3JjcHRyIHIpCisgIHsgZXZhbChxLCByLCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBRX0Q7ICAgIG1wcV9hZGQgKHEsIHIsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBkb3VibGUgZCwgbXBxX3NyY3B0ciByKQorICB7IGV2YWwocSwgciwgZCk7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBtcHpfc3JjcHRyIHopCisgIHsKKyAgICBpZiAocSA9PSByKQorICAgICAgbXB6X2FkZG11bChtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpLCB6KTsKKyAgICBlbHNlCisgICAgeworICAgICAgbXB6X211bChtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHIpLCB6KTsKKyAgICAgIG1wel9hZGQobXBxX251bXJlZihxKSwgbXBxX251bXJlZihxKSwgbXBxX251bXJlZihyKSk7CisgICAgICBtcHpfc2V0KG1wcV9kZW5yZWYocSksIG1wcV9kZW5yZWYocikpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXB6X3NyY3B0ciB6LCBtcHFfc3JjcHRyIHIpCisgIHsgZXZhbChxLCByLCB6KTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIG1wZl9zcmNwdHIgaCkKKyAgeyBtcGZfYWRkKGYsIGcsIGgpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyBtcGZfYWRkX3VpKGYsIGcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCB1bnNpZ25lZCBsb25nIGludCBsLCBtcGZfc3JjcHRyIGcpCisgIHsgbXBmX2FkZF91aShmLCBnLCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBtcGZfYWRkX3VpKGYsIGcsIGwpOworICAgIGVsc2UKKyAgICAgIG1wZl9zdWJfdWkoZiwgZywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZykKKyAgeyBldmFsKGYsIGcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIGRvdWJsZSBkKQorICB7CisgICAgbXBmX3QgdGVtcDsKKyAgICBtcGZfaW5pdDIodGVtcCwgOCpzaXplb2YoZG91YmxlKSk7CisgICAgbXBmX3NldF9kKHRlbXAsIGQpOworICAgIG1wZl9hZGQoZiwgZywgdGVtcCk7CisgICAgbXBmX2NsZWFyKHRlbXApOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBkb3VibGUgZCwgbXBmX3NyY3B0ciBnKQorICB7IGV2YWwoZiwgZywgZCk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfbWludXMKK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgbXB6X3NyY3B0ciB2KQorICB7IG1wel9zdWIoeiwgdywgdik7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgbCA9PSAwKQorICAgIHsKKyAgICAgIGlmICh6ICE9IHcpIG1wel9zZXQoeiwgdyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG1wel9zdWJfdWkoeiwgdywgbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UKGwpICYmIGwgPT0gMCkKKyAgICB7CisgICAgICBtcHpfbmVnKHosIHcpOworICAgIH0KKyAgICBlbHNlCisgICAgICBtcHpfdWlfc3ViKHosIGwsIHcpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHNpZ25lZCBsb25nIGludCBsKQorICB7CisgICAgaWYgKGwgPj0gMCkKKyAgICAgIGV2YWwoeiwgdywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgIGVsc2UKKyAgICAgIG1wel9hZGRfdWkoeiwgdywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBldmFsKHosIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpLCB3KTsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1wel9hZGRfdWkoeiwgdywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgICAgICAgbXB6X25lZyh6LCB6KTsKKyAgICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIG1wel9zdWIgKHosIHcsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBkb3VibGUgZCwgbXB6X3NyY3B0ciB3KQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgbXB6X3N1YiAoeiwgdGVtcCwgdyk7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBtcHFfc3JjcHRyIHMpCisgIHsgbXBxX3N1YihxLCByLCBzKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKyAgICBpZiAoX19HTVBYWF9DT05TVEFOVChsKSAmJiBsID09IDApCisgICAgeworICAgICAgaWYgKHEgIT0gcikgbXBxX3NldChxLCByKTsKKyAgICB9CisgICAgZWxzZSBpZiAoX19HTVBYWF9DT05TVEFOVChsKSAmJiBsID09IDEpCisgICAgeworICAgICAgbXB6X3N1YiAobXBxX251bXJlZihxKSwgbXBxX251bXJlZihyKSwgbXBxX2RlbnJlZihyKSk7CisgICAgICBpZiAocSAhPSByKSBtcHpfc2V0KG1wcV9kZW5yZWYocSksIG1wcV9kZW5yZWYocikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHEgPT0gcikKKyAgICAgICAgbXB6X3N1Ym11bF91aShtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpLCBsKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbXB6X211bF91aShtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHIpLCBsKTsKKyAgICAgICAgbXB6X3N1YihtcHFfbnVtcmVmKHEpLCBtcHFfbnVtcmVmKHIpLCBtcHFfbnVtcmVmKHEpKTsKKyAgICAgICAgbXB6X3NldChtcHFfZGVucmVmKHEpLCBtcHFfZGVucmVmKHIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wcV9zcmNwdHIgcikKKyAgeyBldmFsKHEsIHIsIGwpOyBtcHFfbmVnKHEsIHEpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIHNpZ25lZCBsb25nIGludCBsKQorICB7CisgICAgaWYgKGwgPj0gMCkKKyAgICAgIGV2YWwocSwgciwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgIGVsc2UKKyAgICAgIF9fZ21wX2JpbmFyeV9wbHVzOjpldmFsKHEsIHIsIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIHNpZ25lZCBsb25nIGludCBsLCBtcHFfc3JjcHRyIHIpCisgIHsgZXZhbChxLCByLCBsKTsgbXBxX25lZyhxLCBxKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBRX0Q7ICAgIG1wcV9zdWIgKHEsIHIsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBkb3VibGUgZCwgbXBxX3NyY3B0ciByKQorICB7ICBfX0dNUFhYX1RNUFFfRDsgICAgbXBxX3N1YiAocSwgdGVtcCwgcik7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBtcHpfc3JjcHRyIHopCisgIHsKKyAgICBpZiAocSA9PSByKQorICAgICAgbXB6X3N1Ym11bChtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHEpLCB6KTsKKyAgICBlbHNlCisgICAgeworICAgICAgbXB6X211bChtcHFfbnVtcmVmKHEpLCBtcHFfZGVucmVmKHIpLCB6KTsKKyAgICAgIG1wel9zdWIobXBxX251bXJlZihxKSwgbXBxX251bXJlZihyKSwgbXBxX251bXJlZihxKSk7CisgICAgICBtcHpfc2V0KG1wcV9kZW5yZWYocSksIG1wcV9kZW5yZWYocikpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXB6X3NyY3B0ciB6LCBtcHFfc3JjcHRyIHIpCisgIHsgZXZhbChxLCByLCB6KTsgbXBxX25lZyhxLCBxKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIG1wZl9zcmNwdHIgaCkKKyAgeyBtcGZfc3ViKGYsIGcsIGgpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyBtcGZfc3ViX3VpKGYsIGcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCB1bnNpZ25lZCBsb25nIGludCBsLCBtcGZfc3JjcHRyIGcpCisgIHsgbXBmX3VpX3N1YihmLCBsLCBnKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBtcGZfc3ViX3VpKGYsIGcsIGwpOworICAgIGVsc2UKKyAgICAgIG1wZl9hZGRfdWkoZiwgZywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZykKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBtcGZfc3ViX3VpKGYsIGcsIGwpOworICAgIGVsc2UKKyAgICAgIG1wZl9hZGRfdWkoZiwgZywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgICBtcGZfbmVnKGYsIGYpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIGRvdWJsZSBkKQorICB7CisgICAgbXBmX3QgdGVtcDsKKyAgICBtcGZfaW5pdDIodGVtcCwgOCpzaXplb2YoZG91YmxlKSk7CisgICAgbXBmX3NldF9kKHRlbXAsIGQpOworICAgIG1wZl9zdWIoZiwgZywgdGVtcCk7CisgICAgbXBmX2NsZWFyKHRlbXApOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBkb3VibGUgZCwgbXBmX3NyY3B0ciBnKQorICB7CisgICAgbXBmX3QgdGVtcDsKKyAgICBtcGZfaW5pdDIodGVtcCwgOCpzaXplb2YoZG91YmxlKSk7CisgICAgbXBmX3NldF9kKHRlbXAsIGQpOworICAgIG1wZl9zdWIoZiwgdGVtcCwgZyk7CisgICAgbXBmX2NsZWFyKHRlbXApOworICB9Cit9OworCisvLyBkZWZpbmVkIGhlcmUgc28gaXQgY2FuIHJlZmVyZW5jZSBfX2dtcF9iaW5hcnlfbWludXMKK2lubGluZSB2b2lkCitfX2dtcF9iaW5hcnlfcGx1czo6ZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgciwgc2lnbmVkIGxvbmcgaW50IGwpCit7CisgIGlmIChsID49IDApCisgICAgZXZhbChxLCByLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgIGVsc2UKKyAgICBfX2dtcF9iaW5hcnlfbWludXM6OmV2YWwocSwgciwgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKK30KKworc3RydWN0IF9fZ21wX2JpbmFyeV9sc2hpZnQKK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgbXBfYml0Y250X3QgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UKGwpICYmIChsID09IDApKQorICAgIHsKKyAgICAgIGlmICh6ICE9IHcpIG1wel9zZXQoeiwgdyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG1wel9tdWxfMmV4cCh6LCB3LCBsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBtcF9iaXRjbnRfdCBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgKGwgPT0gMCkpCisgICAgeworICAgICAgaWYgKHEgIT0gcikgbXBxX3NldChxLCByKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbXBxX211bF8yZXhwKHEsIHIsIGwpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIG1wX2JpdGNudF90IGwpCisgIHsgbXBmX211bF8yZXhwKGYsIGcsIGwpOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfYmluYXJ5X3JzaGlmdAoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBtcF9iaXRjbnRfdCBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgKGwgPT0gMCkpCisgICAgeworICAgICAgaWYgKHogIT0gdykgbXB6X3NldCh6LCB3KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbXB6X2ZkaXZfcV8yZXhwKHosIHcsIGwpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIG1wX2JpdGNudF90IGwpCisgIHsKKyAgICBpZiAoX19HTVBYWF9DT05TVEFOVChsKSAmJiAobCA9PSAwKSkKKyAgICB7CisgICAgICBpZiAocSAhPSByKSBtcHFfc2V0KHEsIHIpOworICAgIH0KKyAgICBlbHNlCisgICAgICBtcHFfZGl2XzJleHAocSwgciwgbCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgbXBfYml0Y250X3QgbCkKKyAgeyBtcGZfZGl2XzJleHAoZiwgZywgbCk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfbXVsdGlwbGllcworeworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBtcHpfc3JjcHRyIHYpCisgIHsgbXB6X211bCh6LCB3LCB2KTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKy8vIGdjYy0zLjMgZG9lc24ndCBoYXZlIF9fYnVpbHRpbl9jdHpsLiBEb24ndCBib3RoZXIgb3B0aW1pemluZyBmb3Igb2xkIGdjYy4KKyNpZiBfX0dNUF9HTlVDX1BSRVJFUSgzLCA0KQorICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UKGwpICYmIChsICYgKGwtMSkpID09IDApCisgICAgeworICAgICAgaWYgKGwgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgei0+X21wX3NpemUgPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBfX2dtcF9iaW5hcnlfbHNoaWZ0OjpldmFsKHosIHcsIF9fYnVpbHRpbl9jdHpsKGwpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICBtcHpfbXVsX3VpKHosIHcsIGwpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCB1bnNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA+PSAwKSkKKyAgICAgIGV2YWwoeiwgdywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgIGVsc2UgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsIDw9IDApKQorICAgICAgeworICAgICAgICBldmFsKHosIHcsIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisJbXB6X25lZyh6LCB6KTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBtcHpfbXVsX3NpICh6LCB3LCBsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgbXB6X211bCAoeiwgdywgdGVtcCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGRvdWJsZSBkLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBkKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIG1wcV9zcmNwdHIgcykKKyAgeyBtcHFfbXVsKHEsIHIsIHMpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgciwgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeworI2lmIF9fR01QX0dOVUNfUFJFUkVRKDMsIDQpCisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgKGwgJiAobC0xKSkgPT0gMCkKKyAgICB7CisgICAgICBpZiAobCA9PSAwKQorICAgICAgeworCW1wcV9zZXRfdWkocSwgMCwgMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIF9fZ21wX2JpbmFyeV9sc2hpZnQ6OmV2YWwocSwgciwgX19idWlsdGluX2N0emwobCkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBfX0dNUFhYX1RNUFFfVUk7CisgICAgICBtcHFfbXVsIChxLCByLCB0ZW1wKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wcV9zcmNwdHIgcikKKyAgeyBldmFsKHEsIHIsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIHNpZ25lZCBsb25nIGludCBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID49IDApKQorICAgICAgZXZhbChxLCByLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgICAgZWxzZSBpZiAoX19HTVBYWF9DT05TVEFOVF9UUlVFKGwgPD0gMCkpCisgICAgICB7CisgICAgICAgIGV2YWwocSwgciwgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKwltcHFfbmVnKHEsIHEpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlfX0dNUFhYX1RNUFFfU0k7CisJbXBxX211bCAocSwgciwgdGVtcCk7CisgICAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIHNpZ25lZCBsb25nIGludCBsLCBtcHFfc3JjcHRyIHIpCisgIHsgZXZhbChxLCByLCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBRX0Q7ICAgIG1wcV9tdWwgKHEsIHIsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBkb3VibGUgZCwgbXBxX3NyY3B0ciByKQorICB7IGV2YWwocSwgciwgZCk7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBtcGZfc3JjcHRyIGgpCisgIHsgbXBmX211bChmLCBnLCBoKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgbXBmX211bF91aShmLCBnLCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXBmX3NyY3B0ciBnKQorICB7IG1wZl9tdWxfdWkoZiwgZywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKyAgICBpZiAobCA+PSAwKQorICAgICAgbXBmX211bF91aShmLCBnLCBsKTsKKyAgICBlbHNlCisgICAgICB7CisJbXBmX211bF91aShmLCBnLCAtc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworCW1wZl9uZWcoZiwgZik7CisgICAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIHNpZ25lZCBsb25nIGludCBsLCBtcGZfc3JjcHRyIGcpCisgIHsgZXZhbChmLCBnLCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBkb3VibGUgZCkKKyAgeworICAgIG1wZl90IHRlbXA7CisgICAgbXBmX2luaXQyKHRlbXAsIDgqc2l6ZW9mKGRvdWJsZSkpOworICAgIG1wZl9zZXRfZCh0ZW1wLCBkKTsKKyAgICBtcGZfbXVsKGYsIGcsIHRlbXApOworICAgIG1wZl9jbGVhcih0ZW1wKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgZG91YmxlIGQsIG1wZl9zcmNwdHIgZykKKyAgeyBldmFsKGYsIGcsIGQpOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfYmluYXJ5X2RpdmlkZXMKK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgbXB6X3NyY3B0ciB2KQorICB7IG1wel90ZGl2X3Eoeiwgdywgdik7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7CisjaWYgX19HTVBfR05VQ19QUkVSRVEoMywgNCkKKyAgICAvLyBEb24ndCBvcHRpbWl6ZSBkaXZpc2lvbiBieSAwLi4uCisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgKGwgJiAobC0xKSkgPT0gMCAmJiBsICE9IDApCisgICAgeworICAgICAgaWYgKGwgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHogIT0gdykgbXB6X3NldCh6LCB3KTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgbXB6X3RkaXZfcV8yZXhwKHosIHcsIF9fYnVpbHRpbl9jdHpsKGwpKTsKKyAgICAgICAgLy8gd2FybmluZzogZG8gbm90IHVzZSByc2hpZnQgKGZkaXYpCisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgbXB6X3RkaXZfcV91aSh6LCB3LCBsKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7CisgICAgaWYgKG1wel9zZ24odykgPj0gMCkKKyAgICAgIHsKKwlpZiAobXB6X2ZpdHNfdWxvbmdfcCh3KSkKKwkgIG1wel9zZXRfdWkoeiwgbCAvIG1wel9nZXRfdWkodykpOworCWVsc2UKKwkgIG1wel9zZXRfdWkoeiwgMCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCW1wel9uZWcoeiwgdyk7CisJaWYgKG1wel9maXRzX3Vsb25nX3AoeikpCisJICB7CisJICAgIG1wel9zZXRfdWkoeiwgbCAvIG1wel9nZXRfdWkoeikpOworCSAgICBtcHpfbmVnKHosIHopOworCSAgfQorCWVsc2UKKwkgIG1wel9zZXRfdWkoeiwgMCk7CisgICAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKyAgICBpZiAobCA+PSAwKQorICAgICAgZXZhbCh6LCB3LCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgICAgZWxzZQorICAgICAgeworCWV2YWwoeiwgdywgLXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKwltcHpfbmVnKHosIHopOworICAgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBzaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7CisgICAgaWYgKG1wel9maXRzX3Nsb25nX3AodykpCisgICAgICBtcHpfc2V0X3NpKHosIGwgLyBtcHpfZ2V0X3NpKHcpKTsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIGlmIHcgaXMgYmlnZ2VyIHRoYW4gYSBsb25nIHRoZW4gdGhlIHF1b3RpZW50IG11c3QgYmUgemVybywgdW5sZXNzCisgICAgICAgICAgIGw9PUxPTkdfTUlOIGFuZCB3PT0tTE9OR19NSU4gaW4gd2hpY2ggY2FzZSB0aGUgcXVvdGllbnQgaXMgLTEgKi8KKyAgICAgICAgbXB6X3NldF9zaSAoeiwgKG1wel9jbXBhYnNfdWkgKHcsIF9fZ21weHhfYWJzX3VpKGwpKSA9PSAwID8gLTEgOiAwKSk7CisgICAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgZG91YmxlIGQpCisgIHsgIF9fR01QWFhfVE1QWl9EOyAgICBtcHpfdGRpdl9xICh6LCB3LCB0ZW1wKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgZG91YmxlIGQsIG1wel9zcmNwdHIgdykKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIG1wel90ZGl2X3EgKHosIHRlbXAsIHcpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgciwgbXBxX3NyY3B0ciBzKQorICB7IG1wcV9kaXYocSwgciwgcyk7IH0KKworICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7CisjaWYgX19HTVBfR05VQ19QUkVSRVEoMywgNCkKKyAgICBpZiAoX19HTVBYWF9DT05TVEFOVChsKSAmJiAobCAmIChsLTEpKSA9PSAwICYmIGwgIT0gMCkKKyAgICAgIF9fZ21wX2JpbmFyeV9yc2hpZnQ6OmV2YWwocSwgciwgX19idWlsdGluX2N0emwobCkpOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIF9fR01QWFhfVE1QUV9VSTsKKyAgICAgIG1wcV9kaXYgKHEsIHIsIHRlbXApOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciByKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID09IDApKQorICAgICAgbXBxX3NldF91aShxLCAwLCAxKTsKKyAgICBlbHNlIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA9PSAxKSkKKyAgICAgIG1wcV9pbnYocSwgcik7CisgICAgZWxzZQorICAgICAgeworCV9fR01QWFhfVE1QUV9VSTsKKwltcHFfZGl2IChxLCB0ZW1wLCByKTsKKyAgICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wcV9wdHIgcSwgbXBxX3NyY3B0ciByLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA+PSAwKSkKKyAgICAgIGV2YWwocSwgciwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgIGVsc2UgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsIDw9IDApKQorICAgICAgeworICAgICAgICBldmFsKHEsIHIsIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisJbXBxX25lZyhxLCBxKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJX19HTVBYWF9UTVBRX1NJOworCW1wcV9kaXYgKHEsIHIsIHRlbXApOworICAgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBzaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciByKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID09IDApKQorICAgICAgbXBxX3NldF91aShxLCAwLCAxKTsKKyAgICBlbHNlIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA9PSAxKSkKKyAgICAgIG1wcV9pbnYocSwgcik7CisgICAgZWxzZSBpZiAoX19HTVBYWF9DT05TVEFOVF9UUlVFKGwgPT0gLTEpKQorICAgICAgeworCW1wcV9pbnYocSwgcik7CisJbXBxX25lZyhxLCBxKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJX19HTVBYWF9UTVBRX1NJOworCW1wcV9kaXYgKHEsIHRlbXAsIHIpOworICAgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxLCBtcHFfc3JjcHRyIHIsIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFFfRDsgICAgbXBxX2RpdiAocSwgciwgdGVtcCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIGRvdWJsZSBkLCBtcHFfc3JjcHRyIHIpCisgIHsgIF9fR01QWFhfVE1QUV9EOyAgICBtcHFfZGl2IChxLCB0ZW1wLCByKTsgfQorCisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIG1wZl9zcmNwdHIgaCkKKyAgeyBtcGZfZGl2KGYsIGcsIGgpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyBtcGZfZGl2X3VpKGYsIGcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCB1bnNpZ25lZCBsb25nIGludCBsLCBtcGZfc3JjcHRyIGcpCisgIHsgbXBmX3VpX2RpdihmLCBsLCBnKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBtcGZfZGl2X3VpKGYsIGcsIGwpOworICAgIGVsc2UKKyAgICAgIHsKKwltcGZfZGl2X3VpKGYsIGcsIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisJbXBmX25lZyhmLCBmKTsKKyAgICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZykKKyAgeworICAgIGlmIChsID49IDApCisgICAgICBtcGZfdWlfZGl2KGYsIGwsIGcpOworICAgIGVsc2UKKyAgICAgIHsKKwltcGZfdWlfZGl2KGYsIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSwgZyk7CisJbXBmX25lZyhmLCBmKTsKKyAgICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgbXBmX3NyY3B0ciBnLCBkb3VibGUgZCkKKyAgeworICAgIG1wZl90IHRlbXA7CisgICAgbXBmX2luaXQyKHRlbXAsIDgqc2l6ZW9mKGRvdWJsZSkpOworICAgIG1wZl9zZXRfZCh0ZW1wLCBkKTsKKyAgICBtcGZfZGl2KGYsIGcsIHRlbXApOworICAgIG1wZl9jbGVhcih0ZW1wKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wZl9wdHIgZiwgZG91YmxlIGQsIG1wZl9zcmNwdHIgZykKKyAgeworICAgIG1wZl90IHRlbXA7CisgICAgbXBmX2luaXQyKHRlbXAsIDgqc2l6ZW9mKGRvdWJsZSkpOworICAgIG1wZl9zZXRfZCh0ZW1wLCBkKTsKKyAgICBtcGZfZGl2KGYsIHRlbXAsIGcpOworICAgIG1wZl9jbGVhcih0ZW1wKTsKKyAgfQorfTsKKworc3RydWN0IF9fZ21wX2JpbmFyeV9tb2R1bHVzCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIG1wel9zcmNwdHIgdikKKyAgeyBtcHpfdGRpdl9yKHosIHcsIHYpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyBtcHpfdGRpdl9yX3VpKHosIHcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCB1bnNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsKKyAgICBpZiAobXB6X3Nnbih3KSA+PSAwKQorICAgICAgeworCWlmIChtcHpfZml0c191bG9uZ19wKHcpKQorCSAgbXB6X3NldF91aSh6LCBsICUgbXB6X2dldF91aSh3KSk7CisJZWxzZQorCSAgbXB6X3NldF91aSh6LCBsKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJbXB6X25lZyh6LCB3KTsKKwlpZiAobXB6X2ZpdHNfdWxvbmdfcCh6KSkKKwkgIG1wel9zZXRfdWkoeiwgbCAlIG1wel9nZXRfdWkoeikpOworCWVsc2UKKwkgIG1wel9zZXRfdWkoeiwgbCk7CisgICAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsKKyAgICBtcHpfdGRpdl9yX3VpICh6LCB3LCBfX2dtcHh4X2Fic191aShsKSk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsKKyAgICBpZiAobXB6X2ZpdHNfc2xvbmdfcCh3KSkKKyAgICAgIG1wel9zZXRfc2koeiwgbCAlIG1wel9nZXRfc2kodykpOworICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogaWYgdyBpcyBiaWdnZXIgdGhhbiBhIGxvbmcgdGhlbiB0aGUgcmVtYWluZGVyIGlzIGwgdW5jaGFuZ2VkLAorICAgICAgICAgICB1bmxlc3MgbD09TE9OR19NSU4gYW5kIHc9PS1MT05HX01JTiBpbiB3aGljaCBjYXNlIGl0J3MgMCAqLworICAgICAgICBtcHpfc2V0X3NpICh6LCBtcHpfY21wYWJzX3VpICh3LCBfX2dtcHh4X2Fic191aShsKSkgPT0gMCA/IDAgOiBsKTsKKyAgICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIG1wel90ZGl2X3IgKHosIHcsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBkb3VibGUgZCwgbXB6X3NyY3B0ciB3KQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgbXB6X3RkaXZfciAoeiwgdGVtcCwgdyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfYW5kCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIG1wel9zcmNwdHIgdikKKyAgeyBtcHpfYW5kKHosIHcsIHYpOyB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyAgX19HTVBYWF9UTVBaX1VJOyAgIG1wel9hbmQgKHosIHcsIHRlbXApOyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgbCk7ICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHNpZ25lZCBsb25nIGludCBsKQorICB7ICBfX0dNUFhYX1RNUFpfU0k7ICAgbXB6X2FuZCAoeiwgdywgdGVtcCk7ICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBzaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgbCk7ICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgbXB6X2FuZCAoeiwgdywgdGVtcCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGRvdWJsZSBkLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBkKTsgIH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfaW9yCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIG1wel9zcmNwdHIgdikKKyAgeyBtcHpfaW9yKHosIHcsIHYpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgIF9fR01QWFhfVE1QWl9VSTsgICBtcHpfaW9yICh6LCB3LCB0ZW1wKTsgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeyAgX19HTVBYWF9UTVBaX1NJOyAgIG1wel9pb3IgKHosIHcsIHRlbXApOyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIG1wel9pb3IgKHosIHcsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBkb3VibGUgZCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgZCk7ICB9Cit9OworCitzdHJ1Y3QgX19nbXBfYmluYXJ5X3hvcgoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBtcHpfc3JjcHRyIHYpCisgIHsgbXB6X3hvcih6LCB3LCB2KTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7ICBfX0dNUFhYX1RNUFpfVUk7ICAgbXB6X3hvciAoeiwgdywgdGVtcCk7ICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCB1bnNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBsKTsgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgIF9fR01QWFhfVE1QWl9TSTsgICBtcHpfeG9yICh6LCB3LCB0ZW1wKTsgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBsKTsgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgZG91YmxlIGQpCisgIHsgIF9fR01QWFhfVE1QWl9EOyAgICBtcHpfeG9yICh6LCB3LCB0ZW1wKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgZG91YmxlIGQsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGQpOyAgfQorfTsKKworc3RydWN0IF9fZ21wX2NtcF9mdW5jdGlvbgoreworICBzdGF0aWMgaW50IGV2YWwobXB6X3NyY3B0ciB6LCBtcHpfc3JjcHRyIHcpIHsgcmV0dXJuIG1wel9jbXAoeiwgdyk7IH0KKworICBzdGF0aWMgaW50IGV2YWwobXB6X3NyY3B0ciB6LCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiBtcHpfY21wX3VpKHosIGwpOyB9CisgIHN0YXRpYyBpbnQgZXZhbCh1bnNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIC1tcHpfY21wX3VpKHosIGwpOyB9CisgIHN0YXRpYyBpbnQgZXZhbChtcHpfc3JjcHRyIHosIHNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiBtcHpfY21wX3NpKHosIGwpOyB9CisgIHN0YXRpYyBpbnQgZXZhbChzaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB6KQorICB7IHJldHVybiAtbXB6X2NtcF9zaSh6LCBsKTsgfQorICBzdGF0aWMgaW50IGV2YWwobXB6X3NyY3B0ciB6LCBkb3VibGUgZCkKKyAgeyByZXR1cm4gbXB6X2NtcF9kKHosIGQpOyB9CisgIHN0YXRpYyBpbnQgZXZhbChkb3VibGUgZCwgbXB6X3NyY3B0ciB6KQorICB7IHJldHVybiAtbXB6X2NtcF9kKHosIGQpOyB9CisKKyAgc3RhdGljIGludCBldmFsKG1wcV9zcmNwdHIgcSwgbXBxX3NyY3B0ciByKSB7IHJldHVybiBtcHFfY21wKHEsIHIpOyB9CisKKyAgc3RhdGljIGludCBldmFsKG1wcV9zcmNwdHIgcSwgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyByZXR1cm4gbXBxX2NtcF91aShxLCBsLCAxKTsgfQorICBzdGF0aWMgaW50IGV2YWwodW5zaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciBxKQorICB7IHJldHVybiAtbXBxX2NtcF91aShxLCBsLCAxKTsgfQorICBzdGF0aWMgaW50IGV2YWwobXBxX3NyY3B0ciBxLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeyByZXR1cm4gbXBxX2NtcF9zaShxLCBsLCAxKTsgfQorICBzdGF0aWMgaW50IGV2YWwoc2lnbmVkIGxvbmcgaW50IGwsIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gLW1wcV9jbXBfc2kocSwgbCwgMSk7IH0KKyAgc3RhdGljIGludCBldmFsKG1wcV9zcmNwdHIgcSwgZG91YmxlIGQpCisgIHsgIF9fR01QWFhfVE1QUV9EOyAgICByZXR1cm4gbXBxX2NtcCAocSwgdGVtcCk7IH0KKyAgc3RhdGljIGludCBldmFsKGRvdWJsZSBkLCBtcHFfc3JjcHRyIHEpCisgIHsgIF9fR01QWFhfVE1QUV9EOyAgICByZXR1cm4gbXBxX2NtcCAodGVtcCwgcSk7IH0KKyAgc3RhdGljIGludCBldmFsKG1wcV9zcmNwdHIgcSwgbXB6X3NyY3B0ciB6KQorICB7IHJldHVybiBtcHFfY21wX3oocSwgeik7IH0KKyAgc3RhdGljIGludCBldmFsKG1wel9zcmNwdHIgeiwgbXBxX3NyY3B0ciBxKQorICB7IHJldHVybiAtbXBxX2NtcF96KHEsIHopOyB9CisKKyAgc3RhdGljIGludCBldmFsKG1wZl9zcmNwdHIgZiwgbXBmX3NyY3B0ciBnKSB7IHJldHVybiBtcGZfY21wKGYsIGcpOyB9CisKKyAgc3RhdGljIGludCBldmFsKG1wZl9zcmNwdHIgZiwgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeyByZXR1cm4gbXBmX2NtcF91aShmLCBsKTsgfQorICBzdGF0aWMgaW50IGV2YWwodW5zaWduZWQgbG9uZyBpbnQgbCwgbXBmX3NyY3B0ciBmKQorICB7IHJldHVybiAtbXBmX2NtcF91aShmLCBsKTsgfQorICBzdGF0aWMgaW50IGV2YWwobXBmX3NyY3B0ciBmLCBzaWduZWQgbG9uZyBpbnQgbCkKKyAgeyByZXR1cm4gbXBmX2NtcF9zaShmLCBsKTsgfQorICBzdGF0aWMgaW50IGV2YWwoc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gLW1wZl9jbXBfc2koZiwgbCk7IH0KKyAgc3RhdGljIGludCBldmFsKG1wZl9zcmNwdHIgZiwgZG91YmxlIGQpCisgIHsgcmV0dXJuIG1wZl9jbXBfZChmLCBkKTsgfQorICBzdGF0aWMgaW50IGV2YWwoZG91YmxlIGQsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gLW1wZl9jbXBfZChmLCBkKTsgfQorICBzdGF0aWMgaW50IGV2YWwobXBmX3NyY3B0ciBmLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIG1wZl9jbXBfeihmLCB6KTsgfQorICBzdGF0aWMgaW50IGV2YWwobXB6X3NyY3B0ciB6LCBtcGZfc3JjcHRyIGYpCisgIHsgcmV0dXJuIC1tcGZfY21wX3ooZiwgeik7IH0KKyAgc3RhdGljIGludCBldmFsKG1wZl9zcmNwdHIgZiwgbXBxX3NyY3B0ciBxKQorICB7CisgICAgbXBmX3QgcWY7CisgICAgbXBmX2luaXQocWYpOyAvKiBTaG91bGQgd2UgdXNlIHRoZSBwcmVjaXNpb24gb2YgZj8gICovCisgICAgbXBmX3NldF9xKHFmLCBxKTsKKyAgICBpbnQgcmV0ID0gZXZhbChmLCBxZik7CisgICAgbXBmX2NsZWFyKHFmKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHN0YXRpYyBpbnQgZXZhbChtcHFfc3JjcHRyIHEsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gLWV2YWwoZiwgcSk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9iaW5hcnlfZXF1YWwKK3sKKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIG1wel9zcmNwdHIgdykgeyByZXR1cm4gbXB6X2NtcCh6LCB3KSA9PSAwOyB9CisKKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wel9jbXBfdWkoeiwgbCkgPT0gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgeikKKyAgeyByZXR1cm4gZXZhbCh6LCBsKTsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wel9zcmNwdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wel9jbXBfc2koeiwgbCkgPT0gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKHNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIGV2YWwoeiwgbCk7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIGRvdWJsZSBkKQorICB7IHJldHVybiBtcHpfY21wX2QoeiwgZCkgPT0gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKGRvdWJsZSBkLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIGV2YWwoeiwgZCk7IH0KKworICBzdGF0aWMgYm9vbCBldmFsKG1wcV9zcmNwdHIgcSwgbXBxX3NyY3B0ciByKQorICB7IHJldHVybiBtcHFfZXF1YWwocSwgcikgIT0gMDsgfQorCisgIHN0YXRpYyBib29sIGV2YWwobXBxX3NyY3B0ciBxLCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiAoKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgbCA9PSAwKSB8fAorCSAgICBtcHpfY21wX3VpKG1wcV9kZW5yZWYocSksIDEpID09IDApICYmCisgICAgICBtcHpfY21wX3VpKG1wcV9udW1yZWYocSksIGwpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbCh1bnNpZ25lZCBsb25nIGludCBsLCBtcHFfc3JjcHRyIHEpCisgIHsgcmV0dXJuIGV2YWwocSwgbCk7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHFfc3JjcHRyIHEsIHNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiAoKF9fR01QWFhfQ09OU1RBTlQobCkgJiYgbCA9PSAwKSB8fAorCSAgICBtcHpfY21wX3VpKG1wcV9kZW5yZWYocSksIDEpID09IDApICYmCisgICAgICBtcHpfY21wX3NpKG1wcV9udW1yZWYocSksIGwpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChzaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciBxKQorICB7IHJldHVybiBldmFsKHEsIGwpOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXBxX3NyY3B0ciBxLCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBRX0Q7ICAgIHJldHVybiBtcHFfZXF1YWwgKHEsIHRlbXApICE9IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChkb3VibGUgZCwgbXBxX3NyY3B0ciBxKQorICB7IHJldHVybiBldmFsKHEsIGQpOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXBxX3NyY3B0ciBxLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIG1wel9jbXBfdWkobXBxX2RlbnJlZihxKSwgMSkgPT0gMCAmJiBtcHpfY21wKG1wcV9udW1yZWYocSksIHopID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gZXZhbChxLCB6KTsgfQorCisgIHN0YXRpYyBib29sIGV2YWwobXBmX3NyY3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgcmV0dXJuIG1wZl9jbXAoZiwgZykgPT0gMDsgfQorCisgIHN0YXRpYyBib29sIGV2YWwobXBmX3NyY3B0ciBmLCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiBtcGZfY21wX3VpKGYsIGwpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbCh1bnNpZ25lZCBsb25nIGludCBsLCBtcGZfc3JjcHRyIGYpCisgIHsgcmV0dXJuIGV2YWwoZiwgbCk7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcGZfc3JjcHRyIGYsIHNpZ25lZCBsb25nIGludCBsKQorICB7IHJldHVybiBtcGZfY21wX3NpKGYsIGwpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChzaWduZWQgbG9uZyBpbnQgbCwgbXBmX3NyY3B0ciBmKQorICB7IHJldHVybiBldmFsKGYsIGwpOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXBmX3NyY3B0ciBmLCBkb3VibGUgZCkKKyAgeyByZXR1cm4gbXBmX2NtcF9kKGYsIGQpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChkb3VibGUgZCwgbXBmX3NyY3B0ciBmKQorICB7IHJldHVybiBldmFsKGYsIGQpOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXBmX3NyY3B0ciBmLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIG1wZl9jbXBfeihmLCB6KSA9PSAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXB6X3NyY3B0ciB6LCBtcGZfc3JjcHRyIGYpCisgIHsgcmV0dXJuIGV2YWwoZiwgeik7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcGZfc3JjcHRyIGYsIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gX19nbXBfY21wX2Z1bmN0aW9uOjpldmFsKGYsIHEpID09IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHFfc3JjcHRyIHEsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gZXZhbChmLCBxKTsgfQorfTsKKworc3RydWN0IF9fZ21wX2JpbmFyeV9sZXNzCit7CisgIHN0YXRpYyBib29sIGV2YWwobXB6X3NyY3B0ciB6LCBtcHpfc3JjcHRyIHcpIHsgcmV0dXJuIG1wel9jbXAoeiwgdykgPCAwOyB9CisKKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wel9jbXBfdWkoeiwgbCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwodW5zaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB6KQorICB7IHJldHVybiBtcHpfY21wX3VpKHosIGwpID4gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wel9zcmNwdHIgeiwgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wel9jbXBfc2koeiwgbCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwoc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgeikKKyAgeyByZXR1cm4gbXB6X2NtcF9zaSh6LCBsKSA+IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIGRvdWJsZSBkKQorICB7IHJldHVybiBtcHpfY21wX2QoeiwgZCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwoZG91YmxlIGQsIG1wel9zcmNwdHIgeikKKyAgeyByZXR1cm4gbXB6X2NtcF9kKHosIGQpID4gMDsgfQorCisgIHN0YXRpYyBib29sIGV2YWwobXBxX3NyY3B0ciBxLCBtcHFfc3JjcHRyIHIpIHsgcmV0dXJuIG1wcV9jbXAocSwgcikgPCAwOyB9CisKKyAgc3RhdGljIGJvb2wgZXZhbChtcHFfc3JjcHRyIHEsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wcV9jbXBfdWkocSwgbCwgMSkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwodW5zaWduZWQgbG9uZyBpbnQgbCwgbXBxX3NyY3B0ciBxKQorICB7IHJldHVybiBtcHFfY21wX3VpKHEsIGwsIDEpID4gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wcV9zcmNwdHIgcSwgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wcV9jbXBfc2kocSwgbCwgMSkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwoc2lnbmVkIGxvbmcgaW50IGwsIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gbXBxX2NtcF9zaShxLCBsLCAxKSA+IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHFfc3JjcHRyIHEsIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFFfRDsgICAgcmV0dXJuIG1wcV9jbXAgKHEsIHRlbXApIDwgMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKGRvdWJsZSBkLCBtcHFfc3JjcHRyIHEpCisgIHsgIF9fR01QWFhfVE1QUV9EOyAgICByZXR1cm4gbXBxX2NtcCAodGVtcCwgcSkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXBxX3NyY3B0ciBxLCBtcHpfc3JjcHRyIHopCisgIHsgcmV0dXJuIG1wcV9jbXBfeihxLCB6KSA8IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcHpfc3JjcHRyIHosIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gbXBxX2NtcF96KHEsIHopID4gMDsgfQorCisgIHN0YXRpYyBib29sIGV2YWwobXBmX3NyY3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgcmV0dXJuIG1wZl9jbXAoZiwgZykgPCAwOyB9CisKKyAgc3RhdGljIGJvb2wgZXZhbChtcGZfc3JjcHRyIGYsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wZl9jbXBfdWkoZiwgbCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwodW5zaWduZWQgbG9uZyBpbnQgbCwgbXBmX3NyY3B0ciBmKQorICB7IHJldHVybiBtcGZfY21wX3VpKGYsIGwpID4gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wZl9zcmNwdHIgZiwgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgcmV0dXJuIG1wZl9jbXBfc2koZiwgbCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwoc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gbXBmX2NtcF9zaShmLCBsKSA+IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcGZfc3JjcHRyIGYsIGRvdWJsZSBkKQorICB7IHJldHVybiBtcGZfY21wX2QoZiwgZCkgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwoZG91YmxlIGQsIG1wZl9zcmNwdHIgZikKKyAgeyByZXR1cm4gbXBmX2NtcF9kKGYsIGQpID4gMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wZl9zcmNwdHIgZiwgbXB6X3NyY3B0ciB6KQorICB7IHJldHVybiBtcGZfY21wX3ooZiwgeikgPCAwOyB9CisgIHN0YXRpYyBib29sIGV2YWwobXB6X3NyY3B0ciB6LCBtcGZfc3JjcHRyIGYpCisgIHsgcmV0dXJuIG1wZl9jbXBfeihmLCB6KSA+IDA7IH0KKyAgc3RhdGljIGJvb2wgZXZhbChtcGZfc3JjcHRyIGYsIG1wcV9zcmNwdHIgcSkKKyAgeyByZXR1cm4gX19nbXBfY21wX2Z1bmN0aW9uOjpldmFsKGYsIHEpIDwgMDsgfQorICBzdGF0aWMgYm9vbCBldmFsKG1wcV9zcmNwdHIgcSwgbXBmX3NyY3B0ciBmKQorICB7IHJldHVybiBfX2dtcF9jbXBfZnVuY3Rpb246OmV2YWwocSwgZikgPCAwOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfYmluYXJ5X2dyZWF0ZXIKK3sKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBldmFsKFQgdCwgVSB1KSB7IHJldHVybiBfX2dtcF9iaW5hcnlfbGVzczo6ZXZhbCh1LCB0KTsgfQorfTsKKworc3RydWN0IF9fZ21wX3VuYXJ5X2luY3JlbWVudAoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeikgeyBtcHpfYWRkX3VpKHosIHosIDEpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxKQorICB7IG1wel9hZGQobXBxX251bXJlZihxKSwgbXBxX251bXJlZihxKSwgbXBxX2RlbnJlZihxKSk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYpIHsgbXBmX2FkZF91aShmLCBmLCAxKTsgfQorfTsKKworc3RydWN0IF9fZ21wX3VuYXJ5X2RlY3JlbWVudAoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeikgeyBtcHpfc3ViX3VpKHosIHosIDEpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBxX3B0ciBxKQorICB7IG1wel9zdWIobXBxX251bXJlZihxKSwgbXBxX251bXJlZihxKSwgbXBxX2RlbnJlZihxKSk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYpIHsgbXBmX3N1Yl91aShmLCBmLCAxKTsgfQorfTsKKworc3RydWN0IF9fZ21wX2Fic19mdW5jdGlvbgoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KSB7IG1wel9hYnMoeiwgdyk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHFfcHRyIHEsIG1wcV9zcmNwdHIgcikgeyBtcHFfYWJzKHEsIHIpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgbXBmX2FicyhmLCBnKTsgfQorfTsKKworc3RydWN0IF9fZ21wX3RydW5jX2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgbXBmX3RydW5jKGYsIGcpOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfZmxvb3JfZnVuY3Rpb24KK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZykgeyBtcGZfZmxvb3IoZiwgZyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9jZWlsX2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcpIHsgbXBmX2NlaWwoZiwgZyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9zcXJ0X2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcpIHsgbXB6X3NxcnQoeiwgdyk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZykgeyBtcGZfc3FydChmLCBnKTsgfQorfTsKKworc3RydWN0IF9fZ21wX2h5cG90X2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIG1wZl9zcmNwdHIgaCkKKyAgeworICAgIG1wZl90IHRlbXA7CisgICAgbXBmX2luaXQyKHRlbXAsIG1wZl9nZXRfcHJlYyhmKSk7CisgICAgbXBmX211bCh0ZW1wLCBnLCBnKTsKKyAgICBtcGZfbXVsKGYsIGgsIGgpOworICAgIG1wZl9hZGQoZiwgZiwgdGVtcCk7CisgICAgbXBmX3NxcnQoZiwgZik7CisgICAgbXBmX2NsZWFyKHRlbXApOworICB9CisKKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgdW5zaWduZWQgbG9uZyBpbnQgbCkKKyAgeworICAgIG1wZl90IHRlbXA7CisgICAgbXBmX2luaXQyKHRlbXAsIG1wZl9nZXRfcHJlYyhmKSk7CisgICAgbXBmX211bCh0ZW1wLCBnLCBnKTsKKyAgICBtcGZfc2V0X3VpKGYsIGwpOworICAgIG1wZl9tdWxfdWkoZiwgZiwgbCk7CisgICAgbXBmX2FkZChmLCBmLCB0ZW1wKTsKKyAgICBtcGZfY2xlYXIodGVtcCk7CisgICAgbXBmX3NxcnQoZiwgZik7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wZl9zcmNwdHIgZykKKyAgeyBldmFsKGYsIGcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBtcGZfc3JjcHRyIGcsIHNpZ25lZCBsb25nIGludCBsKQorICB7IGV2YWwoZiwgZywgX19nbXB4eF9hYnNfdWkobCkpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBzaWduZWQgbG9uZyBpbnQgbCwgbXBmX3NyY3B0ciBnKQorICB7IGV2YWwoZiwgZywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIG1wZl9zcmNwdHIgZywgZG91YmxlIGQpCisgIHsKKyAgICBtcGZfdCB0ZW1wOworICAgIG1wZl9pbml0Mih0ZW1wLCBtcGZfZ2V0X3ByZWMoZikpOworICAgIG1wZl9tdWwodGVtcCwgZywgZyk7CisgICAgbXBmX3NldF9kKGYsIGQpOworICAgIG1wZl9tdWwoZiwgZiwgZik7CisgICAgbXBmX2FkZChmLCBmLCB0ZW1wKTsKKyAgICBtcGZfc3FydChmLCBmKTsKKyAgICBtcGZfY2xlYXIodGVtcCk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcGZfcHRyIGYsIGRvdWJsZSBkLCBtcGZfc3JjcHRyIGcpCisgIHsgZXZhbChmLCBnLCBkKTsgfQorfTsKKworc3RydWN0IF9fZ21wX3Nnbl9mdW5jdGlvbgoreworICBzdGF0aWMgaW50IGV2YWwobXB6X3NyY3B0ciB6KSB7IHJldHVybiBtcHpfc2duKHopOyB9CisgIHN0YXRpYyBpbnQgZXZhbChtcHFfc3JjcHRyIHEpIHsgcmV0dXJuIG1wcV9zZ24ocSk7IH0KKyAgc3RhdGljIGludCBldmFsKG1wZl9zcmNwdHIgZikgeyByZXR1cm4gbXBmX3NnbihmKTsgfQorfTsKKworc3RydWN0IF9fZ21wX2djZF9mdW5jdGlvbgoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBtcHpfc3JjcHRyIHYpCisgIHsgbXB6X2djZCh6LCB3LCB2KTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCB1bnNpZ25lZCBsb25nIGludCBsKQorICB7IG1wel9nY2RfdWkoeiwgdywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHNpZ25lZCBsb25nIGludCBsKQorICB7IGV2YWwoeiwgdywgX19nbXB4eF9hYnNfdWkobCkpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBzaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgZG91YmxlIGQpCisgIHsgIF9fR01QWFhfVE1QWl9EOyAgICBtcHpfZ2NkICh6LCB3LCB0ZW1wKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgZG91YmxlIGQsIG1wel9zcmNwdHIgdykKKyAgeyBldmFsKHosIHcsIGQpOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfbGNtX2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIG1wel9zcmNwdHIgdikKKyAgeyBtcHpfbGNtKHosIHcsIHYpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcsIHVuc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgbXB6X2xjbV91aSh6LCB3LCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgdW5zaWduZWQgbG9uZyBpbnQgbCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdywgc2lnbmVkIGxvbmcgaW50IGwpCisgIHsgZXZhbCh6LCB3LCBfX2dtcHh4X2Fic191aShsKSk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHNpZ25lZCBsb25nIGludCBsLCBtcHpfc3JjcHRyIHcpCisgIHsgZXZhbCh6LCB3LCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3LCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIG1wel9sY20gKHosIHcsIHRlbXApOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBkb3VibGUgZCwgbXB6X3NyY3B0ciB3KQorICB7IGV2YWwoeiwgdywgZCk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9yYW5kX2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBnbXBfcmFuZHN0YXRlX3QgcywgbXBfYml0Y250X3QgbCkKKyAgeyBtcHpfdXJhbmRvbWIoeiwgcywgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGdtcF9yYW5kc3RhdGVfdCBzLCBtcHpfc3JjcHRyIHcpCisgIHsgbXB6X3VyYW5kb21tKHosIHMsIHcpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXBmX3B0ciBmLCBnbXBfcmFuZHN0YXRlX3QgcywgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfdXJhbmRvbWIoZiwgcywgcHJlYyk7IH0KK307CisKK3N0cnVjdCBfX2dtcF9mYWNfZnVuY3Rpb24KK3sKKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgbCkgeyBtcHpfZmFjX3VpKHosIGwpOyB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBzaWduZWQgbG9uZyBsKQorICB7CisgICAgaWYgKGwgPCAwKQorI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IgKCJmYWN0b3JpYWwobmVnYXRpdmUpIik7CisjZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6ZG9tYWluX2Vycm9yOiBmYWN0b3JpYWwobmVnYXRpdmUpXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICBldmFsKHosIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGwpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KQorICB7CisgICAgaWYgKCFtcHpfZml0c191bG9uZ19wKHcpKQorICAgICAgeworCWlmIChtcHpfc2duKHcpIDwgMCkKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKwkgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yICgiZmFjdG9yaWFsKG5lZ2F0aXZlKSIpOworI2Vsc2UKKyAgICAgICAgIHsKKwkgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmRvbWFpbl9lcnJvcjogZmFjdG9yaWFsKG5lZ2F0aXZlKVxuIjsKKyAgICAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgICAgfQorI2VuZGlmCisJZWxzZQorI2lmZGVmIF9fRVhDRVBUSU9OUworCSAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsgLy8gb3Igc3RkOjpvdmVyZmxvd19lcnJvciAoImZhY3RvcmlhbCIpPworI2Vsc2UKKyAgICAgICAgIHsKKwkgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmJhZF9hbGxvY1xuIjsKKyAgICAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisgICAgZXZhbCh6LCBtcHpfZ2V0X3VpKHcpKTsKKyAgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgZG91YmxlIGQpCisgIHsgIF9fR01QWFhfVE1QWl9EOyAgICBldmFsICh6LCB0ZW1wKTsgfQorfTsKKworc3RydWN0IF9fZ21wX3ByaW1vcmlhbF9mdW5jdGlvbgoreworICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgdW5zaWduZWQgbG9uZyBsKSB7IG1wel9wcmltb3JpYWxfdWkoeiwgbCk7IH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHNpZ25lZCBsb25nIGwpCisgIHsKKyAgICBpZiAobCA8IDApCisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciAoInByaW1vcmlhbChuZWdhdGl2ZSkiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjpkb21haW5fZXJyb3I6IHByaW1vcmlhbChuZWdhdGl2ZSlcbiI7CisgICAgICAgIHN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIGV2YWwoeiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBtcHpfc3JjcHRyIHcpCisgIHsKKyAgICBpZiAoIW1wel9maXRzX3Vsb25nX3AodykpCisgICAgICB7CisJaWYgKG1wel9zZ24odykgPCAwKQorI2lmZGVmIF9fRVhDRVBUSU9OUworCSAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IgKCJwcmltb3JpYWwobmVnYXRpdmUpIik7CisjZWxzZQorICAgICAgICAgeworCSAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6ZG9tYWluX2Vycm9yOiBwcmltb3JpYWwobmVnYXRpdmUpXG4iOworICAgICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICAgICB9CisjZW5kaWYKKwllbHNlCisjaWZkZWYgX19FWENFUFRJT05TCisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOyAvLyBvciBzdGQ6Om92ZXJmbG93X2Vycm9yICgicHJpbW9yaWFsIik/CisjZWxzZQorICAgICAgICAgeworCSAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6YmFkX2FsbG9jXG4iOworICAgICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgICBldmFsKHosIG1wel9nZXRfdWkodykpOworICB9CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBkb3VibGUgZCkKKyAgeyAgX19HTVBYWF9UTVBaX0Q7ICAgIGV2YWwgKHosIHRlbXApOyB9Cit9OworCitzdHJ1Y3QgX19nbXBfZmliX2Z1bmN0aW9uCit7CisgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCB1bnNpZ25lZCBsb25nIGwpIHsgbXB6X2ZpYl91aSh6LCBsKTsgfQorICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgc2lnbmVkIGxvbmcgbCkKKyAgeworICAgIGlmIChsIDwgMCkKKyAgICAgIHsKKwlldmFsKHosIC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisJaWYgKChsICYgMSkgPT0gMCkKKwkgIG1wel9uZWcoeiwgeik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgZXZhbCh6LCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdykKKyAgeworICAgIGlmICghbXB6X2ZpdHNfc2xvbmdfcCh3KSkKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7IC8vIG9yIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgKCJmaWJvbmFjY2kiKT8KKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjpiYWRfYWxsb2NcbiI7CisgICAgICAgIHN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIGV2YWwoeiwgbXB6X2dldF9zaSh3KSk7CisgIH0KKyAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGRvdWJsZSBkKQorICB7ICBfX0dNUFhYX1RNUFpfRDsgICAgZXZhbCAoeiwgdGVtcCk7IH0KK307CisKKworLyoqKioqKioqKioqKioqKiogQXV4aWxpYXJ5IGNsYXNzZXMgKioqKioqKioqKioqKioqKi8KKworLyogdGhpcyBpcyBtdWNoIHRoZSBzYW1lIGFzIGdtcF9hbGxvY2F0ZWRfc3RyaW5nIGluIGdtcC1pbXBsLmgKKyAgIHNpbmNlIGdtcC1pbXBsLmggaXMgbm90IHB1YmxpY2x5IGF2YWlsYWJsZSwgSSByZWRlZmluZSBpdCBoZXJlCisgICBJIHVzZSBhIGRpZmZlcmVudCBuYW1lIHRvIGF2b2lkIHBvc3NpYmxlIGNsYXNoZXMgKi8KKworZXh0ZXJuICJDIiB7CisgIHR5cGVkZWYgdm9pZCAoKl9fZ21wX2ZyZWVmdW5jX3QpICh2b2lkICosIHNpemVfdCk7Cit9CitzdHJ1Y3QgX19nbXBfYWxsb2NfY3N0cmluZworeworICBjaGFyICpzdHI7CisgIF9fZ21wX2FsbG9jX2NzdHJpbmcoY2hhciAqcykgeyBzdHIgPSBzOyB9CisgIH5fX2dtcF9hbGxvY19jc3RyaW5nKCkKKyAgeworICAgIF9fZ21wX2ZyZWVmdW5jX3QgZnJlZWZ1bmM7CisgICAgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgKE5VTEwsIE5VTEwsICZmcmVlZnVuYyk7CisgICAgKCpmcmVlZnVuYykgKHN0ciwgc3RkOjpzdHJsZW4oc3RyKSsxKTsKKyAgfQorfTsKKworCisvLyBnZW5lcmFsIGV4cHJlc3Npb24gdGVtcGxhdGUgY2xhc3MKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorY2xhc3MgX19nbXBfZXhwcjsKKworCisvLyB0ZW1wbGF0ZXMgZm9yIHJlc29sdmluZyBleHByZXNzaW9uIHR5cGVzCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX3JlZgoreworICB0eXBlZGVmIFQgcmVmX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX3JlZjxfX2dtcF9leHByPFQsIFU+ID4KK3sKKyAgdHlwZWRlZiBjb25zdCBfX2dtcF9leHByPFQsIFU+ICYgcmVmX3R5cGU7Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVID0gVD4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX2V4cHI7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19nbXBfcmVzb2x2ZV9leHByPG1wel90PgoreworICB0eXBlZGVmIG1wel90IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgbXB6X3B0ciBwdHJfdHlwZTsKKyAgdHlwZWRlZiBtcHpfc3JjcHRyIHNyY3B0cl90eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX2V4cHI8bXBxX3Q+Cit7CisgIHR5cGVkZWYgbXBxX3QgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBtcHFfcHRyIHB0cl90eXBlOworICB0eXBlZGVmIG1wcV9zcmNwdHIgc3JjcHRyX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fZ21wX3Jlc29sdmVfZXhwcjxtcGZfdD4KK3sKKyAgdHlwZWRlZiBtcGZfdCB2YWx1ZV90eXBlOworICB0eXBlZGVmIG1wZl9wdHIgcHRyX3R5cGU7CisgIHR5cGVkZWYgbXBmX3NyY3B0ciBzcmNwdHJfdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19nbXBfcmVzb2x2ZV9leHByPG1wel90LCBtcHFfdD4KK3sKKyAgdHlwZWRlZiBtcHFfdCB2YWx1ZV90eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX2V4cHI8bXBxX3QsIG1wel90PgoreworICB0eXBlZGVmIG1wcV90IHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fZ21wX3Jlc29sdmVfZXhwcjxtcHpfdCwgbXBmX3Q+Cit7CisgIHR5cGVkZWYgbXBmX3QgdmFsdWVfdHlwZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgX19nbXBfcmVzb2x2ZV9leHByPG1wZl90LCBtcHpfdD4KK3sKKyAgdHlwZWRlZiBtcGZfdCB2YWx1ZV90eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBfX2dtcF9yZXNvbHZlX2V4cHI8bXBxX3QsIG1wZl90PgoreworICB0eXBlZGVmIG1wZl90IHZhbHVlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IF9fZ21wX3Jlc29sdmVfZXhwcjxtcGZfdCwgbXBxX3Q+Cit7CisgIHR5cGVkZWYgbXBmX3QgdmFsdWVfdHlwZTsKK307CisKKyNpZiBfX0dNUFhYX1VTRV9DWFgxMQorbmFtZXNwYWNlIHN0ZCB7CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBXPgorICBzdHJ1Y3QgY29tbW9uX3R5cGUgPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8ViwgVz4gPgorICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX2V4cHI8VCwgVj46OnZhbHVlX3R5cGUgWDsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX19nbXBfZXhwcjxYLCBYPiB0eXBlOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBzdHJ1Y3QgY29tbW9uX3R5cGUgPF9fZ21wX2V4cHI8VCwgVT4gPgorICB7CisgICAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHR5cGU7CisgIH07CisKKyNkZWZpbmUgX19HTVBYWF9ERUNMQVJFX0NPTU1PTl9UWVBFKHR5cCkJXAorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4JCQlcCisgIHN0cnVjdCBjb21tb25fdHlwZSA8X19nbXBfZXhwcjxULCBVPiwgdHlwID4JXAorICB7CQkJCQkJXAorICAgIHR5cGVkZWYgX19nbXBfZXhwcjxULCBUPiB0eXBlOwkJXAorICB9OwkJCQkJCVwKKwkJCQkJCVwKKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CQkJXAorICBzdHJ1Y3QgY29tbW9uX3R5cGUgPHR5cCwgX19nbXBfZXhwcjxULCBVPiA+CVwKKyAgewkJCQkJCVwKKyAgICB0eXBlZGVmIF9fZ21wX2V4cHI8VCwgVD4gdHlwZTsJCVwKKyAgfQorCisgIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRShzaWduZWQgY2hhcik7CisgIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRSh1bnNpZ25lZCBjaGFyKTsKKyAgX19HTVBYWF9ERUNMQVJFX0NPTU1PTl9UWVBFKHNpZ25lZCBpbnQpOworICBfX0dNUFhYX0RFQ0xBUkVfQ09NTU9OX1RZUEUodW5zaWduZWQgaW50KTsKKyAgX19HTVBYWF9ERUNMQVJFX0NPTU1PTl9UWVBFKHNpZ25lZCBzaG9ydCBpbnQpOworICBfX0dNUFhYX0RFQ0xBUkVfQ09NTU9OX1RZUEUodW5zaWduZWQgc2hvcnQgaW50KTsKKyAgX19HTVBYWF9ERUNMQVJFX0NPTU1PTl9UWVBFKHNpZ25lZCBsb25nIGludCk7CisgIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRSh1bnNpZ25lZCBsb25nIGludCk7CisgIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRShmbG9hdCk7CisgIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRShkb3VibGUpOworI3VuZGVmIF9fR01QWFhfREVDTEFSRV9DT01NT05fVFlQRQorfQorI2VuZGlmCisKKy8vIGNsYXNzZXMgZm9yIGV2YWx1YXRpbmcgdW5hcnkgYW5kIGJpbmFyeSBleHByZXNzaW9ucwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE9wPgorc3RydWN0IF9fZ21wX3VuYXJ5X2V4cHIKK3sKKyAgdHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9yZWY8VD46OnJlZl90eXBlIHZhbDsKKworICBfX2dtcF91bmFyeV9leHByKGNvbnN0IFQgJnYpIDogdmFsKHYpIHsgfQorcHJpdmF0ZToKKyAgX19nbXBfdW5hcnlfZXhwcigpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorc3RydWN0IF9fZ21wX2JpbmFyeV9leHByCit7CisgIHR5cGVuYW1lIF9fZ21wX3Jlc29sdmVfcmVmPFQ+OjpyZWZfdHlwZSB2YWwxOworICB0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX3JlZjxVPjo6cmVmX3R5cGUgdmFsMjsKKworICBfX2dtcF9iaW5hcnlfZXhwcihjb25zdCBUICZ2MSwgY29uc3QgVSAmdjIpIDogdmFsMSh2MSksIHZhbDIodjIpIHsgfQorcHJpdmF0ZToKKyAgX19nbXBfYmluYXJ5X2V4cHIoKTsKK307CisKKworCisvKioqKioqKioqKioqKioqKiBNYWNyb3MgZm9yIGluLWNsYXNzIGRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqLworLyogVGhpcyBpcyBqdXN0IHJlcGV0aXRpdmUgY29kZSB0aGF0IGlzIGVhc2llciB0byBtYWludGFpbiBpZiBpdCdzIHdyaXR0ZW4KKyAgIG9ubHkgb25jZSAqLworCisjZGVmaW5lIF9fR01QUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKGZ1bikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwcjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPiAmIGZ1bihjb25zdCBfX2dtcF9leHByPFQsIFU+ICYpOworCisjZGVmaW5lIF9fR01QTl9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKGZ1bikgXAorICBfX2dtcF9leHByICYgZnVuKHNpZ25lZCBjaGFyKTsgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwciAmIGZ1bih1bnNpZ25lZCBjaGFyKTsgICAgICAgICAgICBcCisgIF9fZ21wX2V4cHIgJiBmdW4oc2lnbmVkIGludCk7ICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByICYgZnVuKHVuc2lnbmVkIGludCk7ICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwciAmIGZ1bihzaWduZWQgc2hvcnQgaW50KTsgICAgICAgICBcCisgIF9fZ21wX2V4cHIgJiBmdW4odW5zaWduZWQgc2hvcnQgaW50KTsgICAgICAgXAorICBfX2dtcF9leHByICYgZnVuKHNpZ25lZCBsb25nIGludCk7ICAgICAgICAgIFwKKyAgX19nbXBfZXhwciAmIGZ1bih1bnNpZ25lZCBsb25nIGludCk7ICAgICAgICBcCisgIF9fZ21wX2V4cHIgJiBmdW4oZmxvYXQpOyAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByICYgZnVuKGRvdWJsZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgLyogX19nbXBfZXhwciAmIGZ1bihsb25nIGRvdWJsZSk7ICovCisKKyNkZWZpbmUgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihmdW4pIFwKK19fR01QUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKGZ1bikgICAgICAgIFwKK19fR01QTl9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKGZ1bikKKworI2RlZmluZSBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SX1VJKGZ1bikgXAorICBfX2dtcF9leHByICYgZnVuKG1wX2JpdGNudF90KTsKKworI2RlZmluZSBfX0dNUF9ERUNMQVJFX0lOQ1JFTUVOVF9PUEVSQVRPUihmdW4pIFwKKyAgaW5saW5lIF9fZ21wX2V4cHIgJiBmdW4oKTsgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBfX2dtcF9leHByIGZ1bihpbnQpOworCisjZGVmaW5lIF9fR01QWFhfREVGSU5FX0FSSVRITUVUSUNfQ09OU1RSVUNUT1JTCQlcCisgIF9fZ21wX2V4cHIoc2lnbmVkIGNoYXIgYykgeyBpbml0X3NpKGMpOyB9CQlcCisgIF9fZ21wX2V4cHIodW5zaWduZWQgY2hhciBjKSB7IGluaXRfdWkoYyk7IH0JCVwKKyAgX19nbXBfZXhwcihzaWduZWQgaW50IGkpIHsgaW5pdF9zaShpKTsgfQkJXAorICBfX2dtcF9leHByKHVuc2lnbmVkIGludCBpKSB7IGluaXRfdWkoaSk7IH0JCVwKKyAgX19nbXBfZXhwcihzaWduZWQgc2hvcnQgaW50IHMpIHsgaW5pdF9zaShzKTsgfQlcCisgIF9fZ21wX2V4cHIodW5zaWduZWQgc2hvcnQgaW50IHMpIHsgaW5pdF91aShzKTsgfQlcCisgIF9fZ21wX2V4cHIoc2lnbmVkIGxvbmcgaW50IGwpIHsgaW5pdF9zaShsKTsgfQkJXAorICBfX2dtcF9leHByKHVuc2lnbmVkIGxvbmcgaW50IGwpIHsgaW5pdF91aShsKTsgfQlcCisgIF9fZ21wX2V4cHIoZmxvYXQgZikgeyBpbml0X2QoZik7IH0JCQlcCisgIF9fZ21wX2V4cHIoZG91YmxlIGQpIHsgaW5pdF9kKGQpOyB9CisKKyNkZWZpbmUgX19HTVBYWF9ERUZJTkVfQVJJVEhNRVRJQ19BU1NJR05NRU5UUwkJXAorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KHNpZ25lZCBjaGFyIGMpIHsgYXNzaWduX3NpKGMpOyByZXR1cm4gKnRoaXM7IH0gXAorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KHVuc2lnbmVkIGNoYXIgYykgeyBhc3NpZ25fdWkoYyk7IHJldHVybiAqdGhpczsgfSBcCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oc2lnbmVkIGludCBpKSB7IGFzc2lnbl9zaShpKTsgcmV0dXJuICp0aGlzOyB9IFwKKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPSh1bnNpZ25lZCBpbnQgaSkgeyBhc3NpZ25fdWkoaSk7IHJldHVybiAqdGhpczsgfSBcCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oc2lnbmVkIHNob3J0IGludCBzKSB7IGFzc2lnbl9zaShzKTsgcmV0dXJuICp0aGlzOyB9IFwKKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPSh1bnNpZ25lZCBzaG9ydCBpbnQgcykgeyBhc3NpZ25fdWkocyk7IHJldHVybiAqdGhpczsgfSBcCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oc2lnbmVkIGxvbmcgaW50IGwpIHsgYXNzaWduX3NpKGwpOyByZXR1cm4gKnRoaXM7IH0gXAorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KHVuc2lnbmVkIGxvbmcgaW50IGwpIHsgYXNzaWduX3VpKGwpOyByZXR1cm4gKnRoaXM7IH0gXAorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KGZsb2F0IGYpIHsgYXNzaWduX2QoZik7IHJldHVybiAqdGhpczsgfSBcCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oZG91YmxlIGQpIHsgYXNzaWduX2QoZCk7IHJldHVybiAqdGhpczsgfQorCisjZGVmaW5lIF9fR01QUF9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPiAgICAgICAgICBcCitmdW4oY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcik7CisKKyNkZWZpbmUgX19HTVBOTl9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgYmlndHlwZSkgXAorc3RhdGljIGlubGluZSBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8YmlndHlwZSwgZXZhbF9mdW4+ID4gICAgICAgICAgICBcCitmdW4odHlwZSBleHByKTsKKworI2RlZmluZSBfX0dNUE5TX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB0eXBlKSAgXAorX19HTVBOTl9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgc2lnbmVkIGxvbmcpCisjZGVmaW5lIF9fR01QTlVfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHR5cGUpICBcCitfX0dNUE5OX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBfX0dNUE5EX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB0eXBlKSAgXAorX19HTVBOTl9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgZG91YmxlKQorCisjZGVmaW5lIF9fR01QTl9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgICAgIFwKK19fR01QTlNfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBjaGFyKSAgICAgICAgICAgXAorX19HTVBOVV9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgY2hhcikgICAgICAgICBcCitfX0dNUE5TX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgaW50KSAgICAgICAgICAgIFwKK19fR01QTlVfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGludCkgICAgICAgICAgXAorX19HTVBOU19ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIHNob3J0IGludCkgICAgICBcCitfX0dNUE5VX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBzaG9ydCBpbnQpICAgIFwKK19fR01QTlNfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBsb25nIGludCkgICAgICAgXAorX19HTVBOVV9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgbG9uZyBpbnQpICAgICBcCitfX0dNUE5EX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCBmbG9hdCkgICAgICAgICAgICAgICAgIFwKK19fR01QTkRfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIGRvdWJsZSkKKworI2RlZmluZSBfX0dNUF9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgICAgICBcCitfX0dNUFBfREVDTEFSRV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19fR01QTl9ERUNMQVJFX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1bikKKworLyoqKioqKioqKioqKioqKiogbXB6X2NsYXNzIC0tIHdyYXBwZXIgZm9yIG1wel90ICoqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2dtcF9leHByPG1wel90LCBtcHpfdD4KK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgbXB6X3QgdmFsdWVfdHlwZTsKKyAgdmFsdWVfdHlwZSBtcDsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIGFsbCBhcml0aG1ldGljIHR5cGVzCisgIHZvaWQgYXNzaWduX3VpKHVuc2lnbmVkIGxvbmcgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA9PSAwKSkKKyAgICAgIF9fZ2V0X21wKCktPl9tcF9zaXplID0gMDsKKyAgICBlbHNlCisgICAgICBtcHpfc2V0X3VpKG1wLCBsKTsKKyAgfQorICB2b2lkIGFzc2lnbl9zaShzaWduZWQgbG9uZyBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID49IDApKQorICAgICAgYXNzaWduX3VpKGwpOworICAgIGVsc2UgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsIDw9IDApKQorICAgICAgeworCWFzc2lnbl91aSgtc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworCW1wel9uZWcobXAsIG1wKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBtcHpfc2V0X3NpKG1wLCBsKTsKKyAgfQorICB2b2lkIGFzc2lnbl9kIChkb3VibGUgZCkKKyAgeworICAgIG1wel9zZXRfZCAobXAsIGQpOworICB9CisKKyAgdm9pZCBpbml0X3VpKHVuc2lnbmVkIGxvbmcgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA9PSAwKSkKKyAgICAgIG1wel9pbml0KG1wKTsKKyAgICBlbHNlCisgICAgICBtcHpfaW5pdF9zZXRfdWkobXAsIGwpOworICB9CisgIHZvaWQgaW5pdF9zaShzaWduZWQgbG9uZyBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID49IDApKQorICAgICAgaW5pdF91aShsKTsKKyAgICBlbHNlIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA8PSAwKSkKKyAgICAgIHsKKwlpbml0X3VpKC1zdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisJbXB6X25lZyhtcCwgbXApOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIG1wel9pbml0X3NldF9zaShtcCwgbCk7CisgIH0KKyAgdm9pZCBpbml0X2QgKGRvdWJsZSBkKQorICB7CisgICAgbXB6X2luaXRfc2V0X2QgKG1wLCBkKTsKKyAgfQorCitwdWJsaWM6CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kZWZhdWx0X3ByZWMoKTsgfQorCisgIC8vIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcgorICBfX2dtcF9leHByKCkgX19HTVBYWF9OT0VYQ0VQVCB7IG1wel9pbml0KG1wKTsgfQorCisgIF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwciAmeikgeyBtcHpfaW5pdF9zZXQobXAsIHoubXApOyB9CisjaWYgX19HTVBYWF9VU0VfQ1hYMTEKKyAgX19nbXBfZXhwcihfX2dtcF9leHByICYmeikgbm9leGNlcHQKKyAgeyAqX19nZXRfbXAoKSA9ICp6Ll9fZ2V0X21wKCk7IG1wel9pbml0KHoubXApOyB9CisjZW5kaWYKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwcjxtcHpfdCwgVD4gJmV4cHIpCisgIHsgbXB6X2luaXQobXApOyBfX2dtcF9zZXRfZXhwcihtcCwgZXhwcik7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CisgIGV4cGxpY2l0IF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikKKyAgeyBtcHpfaW5pdChtcCk7IF9fZ21wX3NldF9leHByKG1wLCBleHByKTsgfQorCisgIF9fR01QWFhfREVGSU5FX0FSSVRITUVUSUNfQ09OU1RSVUNUT1JTCisKKyAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCBjaGFyICpzLCBpbnQgYmFzZSA9IDApCisgIHsKKyAgICBpZiAobXB6X2luaXRfc2V0X3N0ciAobXAsIHMsIGJhc2UpICE9IDApCisgICAgICB7CisgICAgICAgIG1wel9jbGVhciAobXApOworI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHpfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHpfc2V0X3N0clxuIjsKKyAgICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICB9CisgIGV4cGxpY2l0IF9fZ21wX2V4cHIoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIGludCBiYXNlID0gMCkKKyAgeworICAgIGlmIChtcHpfaW5pdF9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIGJhc2UpICE9IDApCisgICAgICB7CisgICAgICAgIG1wel9jbGVhciAobXApOworI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHpfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHpfc2V0X3N0clxuIjsKKyAgICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICB9CisKKyAgZXhwbGljaXQgX19nbXBfZXhwcihtcHpfc3JjcHRyIHopIHsgbXB6X2luaXRfc2V0KG1wLCB6KTsgfQorCisgIH5fX2dtcF9leHByKCkgeyBtcHpfY2xlYXIobXApOyB9CisKKyAgdm9pZCBzd2FwKF9fZ21wX2V4cHImIHopIF9fR01QWFhfTk9FWENFUFQKKyAgeyBzdGQ6OnN3YXAoKl9fZ2V0X21wKCksICp6Ll9fZ2V0X21wKCkpOyB9CisKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMKKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBfX2dtcF9leHByICZ6KQorICB7IG1wel9zZXQobXAsIHoubXApOyByZXR1cm4gKnRoaXM7IH0KKyNpZiBfX0dNUFhYX1VTRV9DWFgxMQorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KF9fZ21wX2V4cHIgJiZ6KSBub2V4Y2VwdAorICB7IHN3YXAoeik7IHJldHVybiAqdGhpczsgfQorI2VuZGlmCisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBfX2dtcF9leHByPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGU+ICYgb3BlcmF0b3I9KGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpCisgIHsgX19nbXBfc2V0X2V4cHIobXAsIGV4cHIpOyByZXR1cm4gKnRoaXM7IH0KKworICBfX0dNUFhYX0RFRklORV9BUklUSE1FVElDX0FTU0lHTk1FTlRTCisKKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBjaGFyICpzKQorICB7CisgICAgaWYgKG1wel9zZXRfc3RyIChtcCwgcywgMCkgIT0gMCkKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wel9zZXRfc3RyIik7CisjZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6aW52YWxpZF9hcmd1bWVudDogbXB6X3NldF9zdHJcbiI7CisgICAgICAgIHN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAqdGhpczsKKyAgfQorICBfX2dtcF9leHByICYgb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZzKQorICB7CisgICAgaWYgKG1wel9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIDApICE9IDApCisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHpfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wel9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBzdHJpbmcgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucworICBpbnQgc2V0X3N0cihjb25zdCBjaGFyICpzLCBpbnQgYmFzZSkKKyAgeyByZXR1cm4gbXB6X3NldF9zdHIobXAsIHMsIGJhc2UpOyB9CisgIGludCBzZXRfc3RyKGNvbnN0IHN0ZDo6c3RyaW5nICZzLCBpbnQgYmFzZSkKKyAgeyByZXR1cm4gbXB6X3NldF9zdHIobXAsIHMuY19zdHIoKSwgYmFzZSk7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X3N0cihpbnQgYmFzZSA9IDEwKSBjb25zdAorICB7CisgICAgX19nbXBfYWxsb2NfY3N0cmluZyB0ZW1wKG1wel9nZXRfc3RyKDAsIGJhc2UsIG1wKSk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRlbXAuc3RyKTsKKyAgfQorCisgIC8vIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgIG1wel9zcmNwdHIgX19nZXRfbXAoKSBjb25zdCB7IHJldHVybiBtcDsgfQorICBtcHpfcHRyIF9fZ2V0X21wKCkgeyByZXR1cm4gbXA7IH0KKyAgbXB6X3NyY3B0ciBnZXRfbXB6X3QoKSBjb25zdCB7IHJldHVybiBtcDsgfQorICBtcHpfcHRyIGdldF9tcHpfdCgpIHsgcmV0dXJuIG1wOyB9CisKKyAgc2lnbmVkIGxvbmcgaW50IGdldF9zaSgpIGNvbnN0IHsgcmV0dXJuIG1wel9nZXRfc2kobXApOyB9CisgIHVuc2lnbmVkIGxvbmcgaW50IGdldF91aSgpIGNvbnN0IHsgcmV0dXJuIG1wel9nZXRfdWkobXApOyB9CisgIGRvdWJsZSBnZXRfZCgpIGNvbnN0IHsgcmV0dXJuIG1wel9nZXRfZChtcCk7IH0KKworICAvLyBib29sIGZpdHNfc2NoYXJfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX3NjaGFyX3AobXApOyB9CisgIC8vIGJvb2wgZml0c191Y2hhcl9wKCkgY29uc3QgeyByZXR1cm4gbXB6X2ZpdHNfdWNoYXJfcChtcCk7IH0KKyAgYm9vbCBmaXRzX3NpbnRfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX3NpbnRfcChtcCk7IH0KKyAgYm9vbCBmaXRzX3VpbnRfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX3VpbnRfcChtcCk7IH0KKyAgYm9vbCBmaXRzX3NzaG9ydF9wKCkgY29uc3QgeyByZXR1cm4gbXB6X2ZpdHNfc3Nob3J0X3AobXApOyB9CisgIGJvb2wgZml0c191c2hvcnRfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX3VzaG9ydF9wKG1wKTsgfQorICBib29sIGZpdHNfc2xvbmdfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX3Nsb25nX3AobXApOyB9CisgIGJvb2wgZml0c191bG9uZ19wKCkgY29uc3QgeyByZXR1cm4gbXB6X2ZpdHNfdWxvbmdfcChtcCk7IH0KKyAgLy8gYm9vbCBmaXRzX2Zsb2F0X3AoKSBjb25zdCB7IHJldHVybiBtcHpfZml0c19mbG9hdF9wKG1wKTsgfQorICAvLyBib29sIGZpdHNfZG91YmxlX3AoKSBjb25zdCB7IHJldHVybiBtcHpfZml0c19kb3VibGVfcChtcCk7IH0KKyAgLy8gYm9vbCBmaXRzX2xkb3VibGVfcCgpIGNvbnN0IHsgcmV0dXJuIG1wel9maXRzX2xkb3VibGVfcChtcCk7IH0KKworI2lmIF9fR01QWFhfVVNFX0NYWDExCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBfX2dldF9tcCgpLT5fbXBfc2l6ZSAhPSAwOyB9CisjZW5kaWYKKworICAvLyBtZW1iZXIgb3BlcmF0b3JzCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IrPSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvci09KQorICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yKj0pCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IvPSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvciU9KQorCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3ImPSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcnw9KQorICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yXj0pCisKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUl9VSShvcGVyYXRvcjw8PSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUl9VSShvcGVyYXRvcj4+PSkKKworICBfX0dNUF9ERUNMQVJFX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvcisrKQorICBfX0dNUF9ERUNMQVJFX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvci0tKQorCisgIF9fR01QX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihtcHpfdCwgZmFjdG9yaWFsLCBfX2dtcF9mYWNfZnVuY3Rpb24pCisgIF9fR01QX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihtcHpfdCwgcHJpbW9yaWFsLCBfX2dtcF9wcmltb3JpYWxfZnVuY3Rpb24pCisgIF9fR01QX0RFQ0xBUkVfVU5BUllfU1RBVElDX01FTUZVTihtcHpfdCwgZmlib25hY2NpLCBfX2dtcF9maWJfZnVuY3Rpb24pCit9OworCit0eXBlZGVmIF9fZ21wX2V4cHI8bXB6X3QsIG1wel90PiBtcHpfY2xhc3M7CisKKworLyoqKioqKioqKioqKioqKiogbXBxX2NsYXNzIC0tIHdyYXBwZXIgZm9yIG1wcV90ICoqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2dtcF9leHByPG1wcV90LCBtcHFfdD4KK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgbXBxX3QgdmFsdWVfdHlwZTsKKyAgdmFsdWVfdHlwZSBtcDsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIGFsbCBhcml0aG1ldGljIHR5cGVzCisgIHZvaWQgYXNzaWduX3VpKHVuc2lnbmVkIGxvbmcgbCkgeyBtcHFfc2V0X3VpKG1wLCBsLCAxKTsgfQorICB2b2lkIGFzc2lnbl9zaShzaWduZWQgbG9uZyBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID49IDApKQorICAgICAgYXNzaWduX3VpKGwpOworICAgIGVsc2UKKyAgICAgIG1wcV9zZXRfc2kobXAsIGwsIDEpOworICB9CisgIHZvaWQgYXNzaWduX2QgKGRvdWJsZSBkKSAgICAgICAgeyBtcHFfc2V0X2QgKG1wLCBkKTsgfQorCisgIHZvaWQgaW5pdF91aSh1bnNpZ25lZCBsb25nIGwpCXsgbXBxX2luaXQobXApOyBnZXRfbnVtKCkgPSBsOyB9CisgIHZvaWQgaW5pdF9zaShzaWduZWQgbG9uZyBsKQl7IG1wcV9pbml0KG1wKTsgZ2V0X251bSgpID0gbDsgfQorICB2b2lkIGluaXRfZCAoZG91YmxlIGQpCXsgbXBxX2luaXQobXApOyBhc3NpZ25fZCAoZCk7IH0KKworcHVibGljOgorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIG1wZl9nZXRfZGVmYXVsdF9wcmVjKCk7IH0KKyAgdm9pZCBjYW5vbmljYWxpemUoKSB7IG1wcV9jYW5vbmljYWxpemUobXApOyB9CisKKyAgLy8gY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yCisgIF9fZ21wX2V4cHIoKSB7IG1wcV9pbml0KG1wKTsgfQorCisgIF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwciAmcSkKKyAgeworICAgIG1wel9pbml0X3NldChtcHFfbnVtcmVmKG1wKSwgbXBxX251bXJlZihxLm1wKSk7CisgICAgbXB6X2luaXRfc2V0KG1wcV9kZW5yZWYobXApLCBtcHFfZGVucmVmKHEubXApKTsKKyAgfQorI2lmIF9fR01QWFhfVVNFX0NYWDExCisgIF9fZ21wX2V4cHIoX19nbXBfZXhwciAmJnEpCisgIHsgKm1wID0gKnEubXA7IG1wcV9pbml0KHEubXApOyB9CisgIF9fZ21wX2V4cHIobXB6X2NsYXNzICYmeikKKyAgeworICAgICptcHFfbnVtcmVmKG1wKSA9ICp6LmdldF9tcHpfdCgpOworICAgIG1wel9pbml0X3NldF91aShtcHFfZGVucmVmKG1wKSwgMSk7CisgICAgbXB6X2luaXQoei5nZXRfbXB6X3QoKSk7CisgIH0KKyNlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgX19nbXBfZXhwcihjb25zdCBfX2dtcF9leHByPG1wel90LCBUPiAmZXhwcikKKyAgeyBtcHFfaW5pdChtcCk7IF9fZ21wX3NldF9leHByKG1wLCBleHByKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgX19nbXBfZXhwcihjb25zdCBfX2dtcF9leHByPG1wcV90LCBUPiAmZXhwcikKKyAgeyBtcHFfaW5pdChtcCk7IF9fZ21wX3NldF9leHByKG1wLCBleHByKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCBfX2dtcF9leHByPFQsIFU+ICZleHByKQorICB7IG1wcV9pbml0KG1wKTsgX19nbXBfc2V0X2V4cHIobXAsIGV4cHIpOyB9CisKKyAgX19HTVBYWF9ERUZJTkVfQVJJVEhNRVRJQ19DT05TVFJVQ1RPUlMKKworICBleHBsaWNpdCBfX2dtcF9leHByKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlID0gMCkKKyAgeworICAgIG1wcV9pbml0IChtcCk7CisgICAgLy8gSWYgcyBpcyB0aGUgbGl0ZXJhbCAwLCB3ZSBtZWFudCB0byBjYWxsIGFub3RoZXIgY29uc3RydWN0b3IuCisgICAgLy8gSWYgcyBqdXN0IGhhcHBlbnMgdG8gZXZhbHVhdGUgdG8gMCwgd2Ugd291bGQgY3Jhc2gsIHNvIHdoYXRldmVyLgorICAgIGlmIChzID09IDApCisgICAgICB7CisJLy8gRG9uJ3QgdHVybiBtcHFfY2xhc3MoMCwwKSBpbnRvIDAKKwltcHpfc2V0X3NpKG1wcV9kZW5yZWYobXApLCBiYXNlKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChtcHFfc2V0X3N0cihtcCwgcywgYmFzZSkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgbXBxX2NsZWFyIChtcCk7CisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wcV9zZXRfc3RyIik7CisjZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6aW52YWxpZF9hcmd1bWVudDogbXBxX3NldF9zdHJcbiI7CisgICAgICAgIHN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgfQorICB9CisgIGV4cGxpY2l0IF9fZ21wX2V4cHIoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIGludCBiYXNlID0gMCkKKyAgeworICAgIG1wcV9pbml0KG1wKTsKKyAgICBpZiAobXBxX3NldF9zdHIgKG1wLCBzLmNfc3RyKCksIGJhc2UpICE9IDApCisgICAgICB7CisgICAgICAgIG1wcV9jbGVhciAobXApOworI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHFfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wcV9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgfQorICBleHBsaWNpdCBfX2dtcF9leHByKG1wcV9zcmNwdHIgcSkKKyAgeworICAgIG1wel9pbml0X3NldChtcHFfbnVtcmVmKG1wKSwgbXBxX251bXJlZihxKSk7CisgICAgbXB6X2luaXRfc2V0KG1wcV9kZW5yZWYobXApLCBtcHFfZGVucmVmKHEpKTsKKyAgfQorCisgIF9fZ21wX2V4cHIoY29uc3QgbXB6X2NsYXNzICZudW0sIGNvbnN0IG1wel9jbGFzcyAmZGVuKQorICB7CisgICAgbXB6X2luaXRfc2V0KG1wcV9udW1yZWYobXApLCBudW0uZ2V0X21wel90KCkpOworICAgIG1wel9pbml0X3NldChtcHFfZGVucmVmKG1wKSwgZGVuLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIH5fX2dtcF9leHByKCkgeyBtcHFfY2xlYXIobXApOyB9CisKKyAgdm9pZCBzd2FwKF9fZ21wX2V4cHImIHEpIF9fR01QWFhfTk9FWENFUFQgeyBzdGQ6OnN3YXAoKm1wLCAqcS5tcCk7IH0KKworICAvLyBhc3NpZ25tZW50IG9wZXJhdG9ycworICBfX2dtcF9leHByICYgb3BlcmF0b3I9KGNvbnN0IF9fZ21wX2V4cHIgJnEpCisgIHsgbXBxX3NldChtcCwgcS5tcCk7IHJldHVybiAqdGhpczsgfQorI2lmIF9fR01QWFhfVVNFX0NYWDExCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oX19nbXBfZXhwciAmJnEpIG5vZXhjZXB0CisgIHsgc3dhcChxKTsgcmV0dXJuICp0aGlzOyB9CisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0obXB6X2NsYXNzICYmeikgbm9leGNlcHQKKyAgeyBnZXRfbnVtKCkgPSBzdGQ6Om1vdmUoeik7IGdldF9kZW4oKSA9IDF1OyByZXR1cm4gKnRoaXM7IH0KKyNlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgX19nbXBfZXhwcjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPiAmIG9wZXJhdG9yPShjb25zdCBfX2dtcF9leHByPFQsIFU+ICZleHByKQorICB7IF9fZ21wX3NldF9leHByKG1wLCBleHByKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgX19HTVBYWF9ERUZJTkVfQVJJVEhNRVRJQ19BU1NJR05NRU5UUworCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oY29uc3QgY2hhciAqcykKKyAgeworICAgIGlmIChtcHFfc2V0X3N0ciAobXAsIHMsIDApICE9IDApCisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHFfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wcV9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmcykKKyAgeworICAgIGlmIChtcHFfc2V0X3N0cihtcCwgcy5jX3N0cigpLCAwKSAhPSAwKQorI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBxX3NldF9zdHIiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHFfc2V0X3N0clxuIjsKKyAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgfQorI2VuZGlmCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gc3RyaW5nIGlucHV0L291dHB1dCBmdW5jdGlvbnMKKyAgaW50IHNldF9zdHIoY29uc3QgY2hhciAqcywgaW50IGJhc2UpCisgIHsgcmV0dXJuIG1wcV9zZXRfc3RyKG1wLCBzLCBiYXNlKTsgfQorICBpbnQgc2V0X3N0cihjb25zdCBzdGQ6OnN0cmluZyAmcywgaW50IGJhc2UpCisgIHsgcmV0dXJuIG1wcV9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIGJhc2UpOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9zdHIoaW50IGJhc2UgPSAxMCkgY29uc3QKKyAgeworICAgIF9fZ21wX2FsbG9jX2NzdHJpbmcgdGVtcChtcHFfZ2V0X3N0cigwLCBiYXNlLCBtcCkpOworICAgIHJldHVybiBzdGQ6OnN0cmluZyh0ZW1wLnN0cik7CisgIH0KKworICAvLyBjb252ZXJzaW9uIGZ1bmN0aW9ucworCisgIC8vIGNhc3RpbmcgYSByZWZlcmVuY2UgdG8gYW4gbXB6X3QgdG8gbXB6X2NsYXNzICYgaXMgYSBkaXJ0eSBoYWNrLgorICAvLyBJdCBraW5kIG9mIHdvcmtzIGJlY2F1c2UgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG1wel9jbGFzcyBpcworICAvLyBleGFjdGx5IGFuIG1wel90LCBidXQgY29tcGlsZXJzIGFyZSBhbGxvd2VkIHRvIGFzc3VtZSB0aGF0IG1wcV9jbGFzcworICAvLyBhbmQgbXB6X2NsYXNzIGRvIG5vdCBhbGlhcy4uLiBJbiBtcHpfY2xhc3MsIHdlIGF2b2lkIHVzaW5nIG1wIGRpcmVjdGx5LAorICAvLyB0byByZWR1Y2UgdGhlIHJpc2tzIG9mIHN1Y2ggcHJvYmxlbWF0aWMgb3B0aW1pemF0aW9ucy4KKyAgY29uc3QgbXB6X2NsYXNzICYgZ2V0X251bSgpIGNvbnN0CisgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbXB6X2NsYXNzICY+KCptcHFfbnVtcmVmKG1wKSk7IH0KKyAgbXB6X2NsYXNzICYgZ2V0X251bSgpCisgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bXB6X2NsYXNzICY+KCptcHFfbnVtcmVmKG1wKSk7IH0KKyAgY29uc3QgbXB6X2NsYXNzICYgZ2V0X2RlbigpIGNvbnN0CisgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbXB6X2NsYXNzICY+KCptcHFfZGVucmVmKG1wKSk7IH0KKyAgbXB6X2NsYXNzICYgZ2V0X2RlbigpCisgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bXB6X2NsYXNzICY+KCptcHFfZGVucmVmKG1wKSk7IH0KKworICBtcHFfc3JjcHRyIF9fZ2V0X21wKCkgY29uc3QgeyByZXR1cm4gbXA7IH0KKyAgbXBxX3B0ciBfX2dldF9tcCgpIHsgcmV0dXJuIG1wOyB9CisgIG1wcV9zcmNwdHIgZ2V0X21wcV90KCkgY29uc3QgeyByZXR1cm4gbXA7IH0KKyAgbXBxX3B0ciBnZXRfbXBxX3QoKSB7IHJldHVybiBtcDsgfQorCisgIG1wel9zcmNwdHIgZ2V0X251bV9tcHpfdCgpIGNvbnN0IHsgcmV0dXJuIG1wcV9udW1yZWYobXApOyB9CisgIG1wel9wdHIgZ2V0X251bV9tcHpfdCgpIHsgcmV0dXJuIG1wcV9udW1yZWYobXApOyB9CisgIG1wel9zcmNwdHIgZ2V0X2Rlbl9tcHpfdCgpIGNvbnN0IHsgcmV0dXJuIG1wcV9kZW5yZWYobXApOyB9CisgIG1wel9wdHIgZ2V0X2Rlbl9tcHpfdCgpIHsgcmV0dXJuIG1wcV9kZW5yZWYobXApOyB9CisKKyAgZG91YmxlIGdldF9kKCkgY29uc3QgeyByZXR1cm4gbXBxX2dldF9kKG1wKTsgfQorCisjaWYgX19HTVBYWF9VU0VfQ1hYMTEKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1wcV9udW1yZWYobXApLT5fbXBfc2l6ZSAhPSAwOyB9CisjZW5kaWYKKworICAvLyBjb21wb3VuZCBhc3NpZ25tZW50cworICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yKz0pCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3ItPSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcio9KQorICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yLz0pCisKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUl9VSShvcGVyYXRvcjw8PSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUl9VSShvcGVyYXRvcj4+PSkKKworICBfX0dNUF9ERUNMQVJFX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvcisrKQorICBfX0dNUF9ERUNMQVJFX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvci0tKQorfTsKKwordHlwZWRlZiBfX2dtcF9leHByPG1wcV90LCBtcHFfdD4gbXBxX2NsYXNzOworCisKKy8qKioqKioqKioqKioqKioqIG1wZl9jbGFzcyAtLSB3cmFwcGVyIGZvciBtcGZfdCAqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX19nbXBfZXhwcjxtcGZfdCwgbXBmX3Q+Cit7Citwcml2YXRlOgorICB0eXBlZGVmIG1wZl90IHZhbHVlX3R5cGU7CisgIHZhbHVlX3R5cGUgbXA7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBhbGwgYXJpdGhtZXRpYyB0eXBlcworICB2b2lkIGFzc2lnbl91aSh1bnNpZ25lZCBsb25nIGwpIHsgbXBmX3NldF91aShtcCwgbCk7IH0KKyAgdm9pZCBhc3NpZ25fc2koc2lnbmVkIGxvbmcgbCkKKyAgeworICAgIGlmIChfX0dNUFhYX0NPTlNUQU5UX1RSVUUobCA+PSAwKSkKKyAgICAgIGFzc2lnbl91aShsKTsKKyAgICBlbHNlCisgICAgICBtcGZfc2V0X3NpKG1wLCBsKTsKKyAgfQorICB2b2lkIGFzc2lnbl9kIChkb3VibGUgZCkgICAgICAgIHsgbXBmX3NldF9kIChtcCwgZCk7IH0KKworICB2b2lkIGluaXRfdWkodW5zaWduZWQgbG9uZyBsKQorICB7CisgICAgaWYgKF9fR01QWFhfQ09OU1RBTlRfVFJVRShsID09IDApKQorICAgICAgbXBmX2luaXQobXApOworICAgIGVsc2UKKyAgICAgIG1wZl9pbml0X3NldF91aShtcCwgbCk7CisgIH0KKyAgdm9pZCBpbml0X3NpKHNpZ25lZCBsb25nIGwpCisgIHsKKyAgICBpZiAoX19HTVBYWF9DT05TVEFOVF9UUlVFKGwgPj0gMCkpCisgICAgICBpbml0X3VpKGwpOworICAgIGVsc2UKKyAgICAgIG1wZl9pbml0X3NldF9zaShtcCwgbCk7CisgIH0KKyAgdm9pZCBpbml0X2QgKGRvdWJsZSBkKQl7IG1wZl9pbml0X3NldF9kIChtcCwgZCk7IH0KKworcHVibGljOgorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIG1wZl9nZXRfcHJlYyhtcCk7IH0KKworICB2b2lkIHNldF9wcmVjKG1wX2JpdGNudF90IHByZWMpIHsgbXBmX3NldF9wcmVjKG1wLCBwcmVjKTsgfQorICB2b2lkIHNldF9wcmVjX3JhdyhtcF9iaXRjbnRfdCBwcmVjKSB7IG1wZl9zZXRfcHJlY19yYXcobXAsIHByZWMpOyB9CisKKyAgLy8gY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yCisgIF9fZ21wX2V4cHIoKSB7IG1wZl9pbml0KG1wKTsgfQorCisgIF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwciAmZikKKyAgeyBtcGZfaW5pdDIobXAsIGYuZ2V0X3ByZWMoKSk7IG1wZl9zZXQobXAsIGYubXApOyB9CisjaWYgX19HTVBYWF9VU0VfQ1hYMTEKKyAgX19nbXBfZXhwcihfX2dtcF9leHByICYmZikKKyAgeyAqbXAgPSAqZi5tcDsgbXBmX2luaXQyKGYubXAsIGdldF9wcmVjKCkpOyB9CisjZW5kaWYKKyAgX19nbXBfZXhwcihjb25zdCBfX2dtcF9leHByICZmLCBtcF9iaXRjbnRfdCBwcmVjKQorICB7IG1wZl9pbml0MihtcCwgcHJlYyk7IG1wZl9zZXQobXAsIGYubXApOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICBfX2dtcF9leHByKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpCisgIHsgbXBmX2luaXQyKG1wLCBleHByLmdldF9wcmVjKCkpOyBfX2dtcF9zZXRfZXhwcihtcCwgZXhwcik7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CisgIF9fZ21wX2V4cHIoY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwciwgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfaW5pdDIobXAsIHByZWMpOyBfX2dtcF9zZXRfZXhwcihtcCwgZXhwcik7IH0KKworICBfX0dNUFhYX0RFRklORV9BUklUSE1FVElDX0NPTlNUUlVDVE9SUworCisgIF9fZ21wX2V4cHIoc2lnbmVkIGNoYXIgYywgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfaW5pdDIobXAsIHByZWMpOyBtcGZfc2V0X3NpKG1wLCBjKTsgfQorICBfX2dtcF9leHByKHVuc2lnbmVkIGNoYXIgYywgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfaW5pdDIobXAsIHByZWMpOyBtcGZfc2V0X3VpKG1wLCBjKTsgfQorCisgIF9fZ21wX2V4cHIoc2lnbmVkIGludCBpLCBtcF9iaXRjbnRfdCBwcmVjKQorICB7IG1wZl9pbml0MihtcCwgcHJlYyk7IG1wZl9zZXRfc2kobXAsIGkpOyB9CisgIF9fZ21wX2V4cHIodW5zaWduZWQgaW50IGksIG1wX2JpdGNudF90IHByZWMpCisgIHsgbXBmX2luaXQyKG1wLCBwcmVjKTsgbXBmX3NldF91aShtcCwgaSk7IH0KKworICBfX2dtcF9leHByKHNpZ25lZCBzaG9ydCBpbnQgcywgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfaW5pdDIobXAsIHByZWMpOyBtcGZfc2V0X3NpKG1wLCBzKTsgfQorICBfX2dtcF9leHByKHVuc2lnbmVkIHNob3J0IGludCBzLCBtcF9iaXRjbnRfdCBwcmVjKQorICB7IG1wZl9pbml0MihtcCwgcHJlYyk7IG1wZl9zZXRfdWkobXAsIHMpOyB9CisKKyAgX19nbXBfZXhwcihzaWduZWQgbG9uZyBpbnQgbCwgbXBfYml0Y250X3QgcHJlYykKKyAgeyBtcGZfaW5pdDIobXAsIHByZWMpOyBtcGZfc2V0X3NpKG1wLCBsKTsgfQorICBfX2dtcF9leHByKHVuc2lnbmVkIGxvbmcgaW50IGwsIG1wX2JpdGNudF90IHByZWMpCisgIHsgbXBmX2luaXQyKG1wLCBwcmVjKTsgbXBmX3NldF91aShtcCwgbCk7IH0KKworICBfX2dtcF9leHByKGZsb2F0IGYsIG1wX2JpdGNudF90IHByZWMpCisgIHsgbXBmX2luaXQyKG1wLCBwcmVjKTsgbXBmX3NldF9kKG1wLCBmKTsgfQorICBfX2dtcF9leHByKGRvdWJsZSBkLCBtcF9iaXRjbnRfdCBwcmVjKQorICB7IG1wZl9pbml0MihtcCwgcHJlYyk7IG1wZl9zZXRfZChtcCwgZCk7IH0KKyAgLy8gX19nbXBfZXhwcihsb25nIGRvdWJsZSBsZCkgeyBtcGZfaW5pdF9zZXRfZChtcCwgbGQpOyB9CisgIC8vIF9fZ21wX2V4cHIobG9uZyBkb3VibGUgbGQsIG1wX2JpdGNudF90IHByZWMpCisgIC8vIHsgbXBmX2luaXQyKG1wLCBwcmVjKTsgbXBmX3NldF9kKG1wLCBsZCk7IH0KKworICBleHBsaWNpdCBfX2dtcF9leHByKGNvbnN0IGNoYXIgKnMpCisgIHsKKyAgICBpZiAobXBmX2luaXRfc2V0X3N0ciAobXAsIHMsIDApICE9IDApCisgICAgICB7CisgICAgICAgIG1wZl9jbGVhciAobXApOworI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcGZfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wZl9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgfQorICBfX2dtcF9leHByKGNvbnN0IGNoYXIgKnMsIG1wX2JpdGNudF90IHByZWMsIGludCBiYXNlID0gMCkKKyAgeworICAgIG1wZl9pbml0MihtcCwgcHJlYyk7CisgICAgaWYgKG1wZl9zZXRfc3RyKG1wLCBzLCBiYXNlKSAhPSAwKQorICAgICAgeworICAgICAgICBtcGZfY2xlYXIgKG1wKTsKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBmX3NldF9zdHIiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcGZfc2V0X3N0clxuIjsKKyAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgfQorI2VuZGlmCisgICAgICB9CisgIH0KKyAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCBzdGQ6OnN0cmluZyAmcykKKyAgeworICAgIGlmIChtcGZfaW5pdF9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIDApICE9IDApCisgICAgICB7CisgICAgICAgIG1wZl9jbGVhciAobXApOworI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcGZfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wZl9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgfQorICBfX2dtcF9leHByKGNvbnN0IHN0ZDo6c3RyaW5nICZzLCBtcF9iaXRjbnRfdCBwcmVjLCBpbnQgYmFzZSA9IDApCisgIHsKKyAgICBtcGZfaW5pdDIobXAsIHByZWMpOworICAgIGlmIChtcGZfc2V0X3N0cihtcCwgcy5jX3N0cigpLCBiYXNlKSAhPSAwKQorICAgICAgeworICAgICAgICBtcGZfY2xlYXIgKG1wKTsKKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBmX3NldF9zdHIiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcGZfc2V0X3N0clxuIjsKKyAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgfQorI2VuZGlmCisgICAgICB9CisgIH0KKworICBleHBsaWNpdCBfX2dtcF9leHByKG1wZl9zcmNwdHIgZikKKyAgeyBtcGZfaW5pdDIobXAsIG1wZl9nZXRfcHJlYyhmKSk7IG1wZl9zZXQobXAsIGYpOyB9CisgIF9fZ21wX2V4cHIobXBmX3NyY3B0ciBmLCBtcF9iaXRjbnRfdCBwcmVjKQorICB7IG1wZl9pbml0MihtcCwgcHJlYyk7IG1wZl9zZXQobXAsIGYpOyB9CisKKyAgfl9fZ21wX2V4cHIoKSB7IG1wZl9jbGVhcihtcCk7IH0KKworICB2b2lkIHN3YXAoX19nbXBfZXhwciYgZikgX19HTVBYWF9OT0VYQ0VQVCB7IHN0ZDo6c3dhcCgqbXAsICpmLm1wKTsgfQorCisgIC8vIGFzc2lnbm1lbnQgb3BlcmF0b3JzCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oY29uc3QgX19nbXBfZXhwciAmZikKKyAgeyBtcGZfc2V0KG1wLCBmLm1wKTsgcmV0dXJuICp0aGlzOyB9CisjaWYgX19HTVBYWF9VU0VfQ1hYMTEKKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShfX2dtcF9leHByICYmZikgbm9leGNlcHQKKyAgeyBzd2FwKGYpOyByZXR1cm4gKnRoaXM7IH0KKyNlbmRpZgorICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgX19nbXBfZXhwcjx2YWx1ZV90eXBlLCB2YWx1ZV90eXBlPiAmIG9wZXJhdG9yPShjb25zdCBfX2dtcF9leHByPFQsIFU+ICZleHByKQorICB7IF9fZ21wX3NldF9leHByKG1wLCBleHByKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgX19HTVBYWF9ERUZJTkVfQVJJVEhNRVRJQ19BU1NJR05NRU5UUworCisgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oY29uc3QgY2hhciAqcykKKyAgeworICAgIGlmIChtcGZfc2V0X3N0ciAobXAsIHMsIDApICE9IDApCisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcGZfc2V0X3N0ciIpOworI2Vsc2UKKyAgICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wZl9zZXRfc3RyXG4iOworICAgICAgICBzdGQ6OmFib3J0KCk7CisgICAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmcykKKyAgeworICAgIGlmIChtcGZfc2V0X3N0cihtcCwgcy5jX3N0cigpLCAwKSAhPSAwKQorI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBmX3NldF9zdHIiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcGZfc2V0X3N0clxuIjsKKyAgICAgICAgc3RkOjphYm9ydCgpOworICAgICAgfQorI2VuZGlmCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gc3RyaW5nIGlucHV0L291dHB1dCBmdW5jdGlvbnMKKyAgaW50IHNldF9zdHIoY29uc3QgY2hhciAqcywgaW50IGJhc2UpCisgIHsgcmV0dXJuIG1wZl9zZXRfc3RyKG1wLCBzLCBiYXNlKTsgfQorICBpbnQgc2V0X3N0cihjb25zdCBzdGQ6OnN0cmluZyAmcywgaW50IGJhc2UpCisgIHsgcmV0dXJuIG1wZl9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIGJhc2UpOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9zdHIobXBfZXhwX3QgJmV4cG8sIGludCBiYXNlID0gMTAsIHNpemVfdCBzaXplID0gMCkgY29uc3QKKyAgeworICAgIF9fZ21wX2FsbG9jX2NzdHJpbmcgdGVtcChtcGZfZ2V0X3N0cigwLCAmZXhwbywgYmFzZSwgc2l6ZSwgbXApKTsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcodGVtcC5zdHIpOworICB9CisKKyAgLy8gY29udmVyc2lvbiBmdW5jdGlvbnMKKyAgbXBmX3NyY3B0ciBfX2dldF9tcCgpIGNvbnN0IHsgcmV0dXJuIG1wOyB9CisgIG1wZl9wdHIgX19nZXRfbXAoKSB7IHJldHVybiBtcDsgfQorICBtcGZfc3JjcHRyIGdldF9tcGZfdCgpIGNvbnN0IHsgcmV0dXJuIG1wOyB9CisgIG1wZl9wdHIgZ2V0X21wZl90KCkgeyByZXR1cm4gbXA7IH0KKworICBzaWduZWQgbG9uZyBpbnQgZ2V0X3NpKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9zaShtcCk7IH0KKyAgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X3VpKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF91aShtcCk7IH0KKyAgZG91YmxlIGdldF9kKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kKG1wKTsgfQorCisgIC8vIGJvb2wgZml0c19zY2hhcl9wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfc2NoYXJfcChtcCk7IH0KKyAgLy8gYm9vbCBmaXRzX3VjaGFyX3AoKSBjb25zdCB7IHJldHVybiBtcGZfZml0c191Y2hhcl9wKG1wKTsgfQorICBib29sIGZpdHNfc2ludF9wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfc2ludF9wKG1wKTsgfQorICBib29sIGZpdHNfdWludF9wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfdWludF9wKG1wKTsgfQorICBib29sIGZpdHNfc3Nob3J0X3AoKSBjb25zdCB7IHJldHVybiBtcGZfZml0c19zc2hvcnRfcChtcCk7IH0KKyAgYm9vbCBmaXRzX3VzaG9ydF9wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfdXNob3J0X3AobXApOyB9CisgIGJvb2wgZml0c19zbG9uZ19wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfc2xvbmdfcChtcCk7IH0KKyAgYm9vbCBmaXRzX3Vsb25nX3AoKSBjb25zdCB7IHJldHVybiBtcGZfZml0c191bG9uZ19wKG1wKTsgfQorICAvLyBib29sIGZpdHNfZmxvYXRfcCgpIGNvbnN0IHsgcmV0dXJuIG1wZl9maXRzX2Zsb2F0X3AobXApOyB9CisgIC8vIGJvb2wgZml0c19kb3VibGVfcCgpIGNvbnN0IHsgcmV0dXJuIG1wZl9maXRzX2RvdWJsZV9wKG1wKTsgfQorICAvLyBib29sIGZpdHNfbGRvdWJsZV9wKCkgY29uc3QgeyByZXR1cm4gbXBmX2ZpdHNfbGRvdWJsZV9wKG1wKTsgfQorCisjaWYgX19HTVBYWF9VU0VfQ1hYMTEKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1wZl9zZ24obXApICE9IDA7IH0KKyNlbmRpZgorCisgIC8vIGNvbXBvdW5kIGFzc2lnbm1lbnRzCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IrPSkKKyAgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvci09KQorICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yKj0pCisgIF9fR01QX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IvPSkKKworICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SX1VJKG9wZXJhdG9yPDw9KQorICBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SX1VJKG9wZXJhdG9yPj49KQorCisgIF9fR01QX0RFQ0xBUkVfSU5DUkVNRU5UX09QRVJBVE9SKG9wZXJhdG9yKyspCisgIF9fR01QX0RFQ0xBUkVfSU5DUkVNRU5UX09QRVJBVE9SKG9wZXJhdG9yLS0pCit9OworCit0eXBlZGVmIF9fZ21wX2V4cHI8bXBmX3QsIG1wZl90PiBtcGZfY2xhc3M7CisKKworCisvKioqKioqKioqKioqKioqKiBVc2VyLWRlZmluZWQgbGl0ZXJhbHMgKioqKioqKioqKioqKioqKi8KKworI2lmIF9fR01QWFhfVVNFX0NYWDExCitpbmxpbmUgbXB6X2NsYXNzIG9wZXJhdG9yIiIgX21weihjb25zdCBjaGFyKiBzKQoreworICByZXR1cm4gbXB6X2NsYXNzKHMpOworfQorCitpbmxpbmUgbXBxX2NsYXNzIG9wZXJhdG9yIiIgX21wcShjb25zdCBjaGFyKiBzKQoreworICBtcHFfY2xhc3MgcTsKKyAgcS5nZXRfbnVtKCkgPSBzOworICByZXR1cm4gcTsKK30KKworaW5saW5lIG1wZl9jbGFzcyBvcGVyYXRvciIiIF9tcGYoY29uc3QgY2hhciogcykKK3sKKyAgcmV0dXJuIG1wZl9jbGFzcyhzKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKiBJL08gb3BlcmF0b3JzICoqKioqKioqKioqKioqKiovCisKKy8vIHRoZXNlIHNob3VsZCAoYW5kIHdpbGwpIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3I8PAorKHN0ZDo6b3N0cmVhbSAmbywgY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikKK3sKKyAgX19nbXBfZXhwcjxULCBUPiBjb25zdCYgdGVtcChleHByKTsKKyAgcmV0dXJuIG8gPDwgdGVtcC5fX2dldF9tcCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBzdGQ6OmlzdHJlYW0gJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSAmaSwgX19nbXBfZXhwcjxULCBUPiAmZXhwcikKK3sKKyAgcmV0dXJuIGkgPj4gZXhwci5fX2dldF9tcCgpOworfQorCisvKgorLy8geW91IG1pZ2h0IHdhbnQgdG8gdW5jb21tZW50IHRoaXMKK2lubGluZSBzdGQ6OmlzdHJlYW0gJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSAmaSwgbXBxX2NsYXNzICZxKQoreworICBpID4+IHEuZ2V0X21wcV90KCk7CisgIHEuY2Fub25pY2FsaXplKCk7CisgIHJldHVybiBpOworfQorKi8KKworCisvKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgZm9yIHR5cGUgY29udmVyc2lvbiAqKioqKioqKioqKioqKioqLworCitpbmxpbmUgdm9pZCBfX2dtcF9zZXRfZXhwcihtcHpfcHRyIHosIGNvbnN0IG1wel9jbGFzcyAmdykKK3sKKyAgbXB6X3NldCh6LCB3LmdldF9tcHpfdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBfX2dtcF9zZXRfZXhwcihtcHpfcHRyIHosIGNvbnN0IF9fZ21wX2V4cHI8bXB6X3QsIFQ+ICZleHByKQoreworICBleHByLmV2YWwoeik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgX19nbXBfc2V0X2V4cHIobXB6X3B0ciB6LCBjb25zdCBfX2dtcF9leHByPG1wcV90LCBUPiAmZXhwcikKK3sKKyAgbXBxX2NsYXNzIGNvbnN0JiB0ZW1wKGV4cHIpOworICBtcHpfc2V0X3EoeiwgdGVtcC5nZXRfbXBxX3QoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgX19nbXBfc2V0X2V4cHIobXB6X3B0ciB6LCBjb25zdCBfX2dtcF9leHByPG1wZl90LCBUPiAmZXhwcikKK3sKKyAgbXBmX2NsYXNzIGNvbnN0JiB0ZW1wKGV4cHIpOworICBtcHpfc2V0X2YoeiwgdGVtcC5nZXRfbXBmX3QoKSk7Cit9CisKK2lubGluZSB2b2lkIF9fZ21wX3NldF9leHByKG1wcV9wdHIgcSwgY29uc3QgbXB6X2NsYXNzICZ6KQoreworICBtcHFfc2V0X3oocSwgei5nZXRfbXB6X3QoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgX19nbXBfc2V0X2V4cHIobXBxX3B0ciBxLCBjb25zdCBfX2dtcF9leHByPG1wel90LCBUPiAmZXhwcikKK3sKKyAgX19nbXBfc2V0X2V4cHIobXBxX251bXJlZihxKSwgZXhwcik7CisgIG1wel9zZXRfdWkobXBxX2RlbnJlZihxKSwgMSk7Cit9CisKK2lubGluZSB2b2lkIF9fZ21wX3NldF9leHByKG1wcV9wdHIgcSwgY29uc3QgbXBxX2NsYXNzICZyKQoreworICBtcHFfc2V0KHEsIHIuZ2V0X21wcV90KCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSB2b2lkIF9fZ21wX3NldF9leHByKG1wcV9wdHIgcSwgY29uc3QgX19nbXBfZXhwcjxtcHFfdCwgVD4gJmV4cHIpCit7CisgIGV4cHIuZXZhbChxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBfX2dtcF9zZXRfZXhwcihtcHFfcHRyIHEsIGNvbnN0IF9fZ21wX2V4cHI8bXBmX3QsIFQ+ICZleHByKQoreworICBtcGZfY2xhc3MgY29uc3QmIHRlbXAoZXhwcik7CisgIG1wcV9zZXRfZihxLCB0ZW1wLmdldF9tcGZfdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBfX2dtcF9zZXRfZXhwcihtcGZfcHRyIGYsIGNvbnN0IF9fZ21wX2V4cHI8bXB6X3QsIFQ+ICZleHByKQoreworICBtcHpfY2xhc3MgY29uc3QmIHRlbXAoZXhwcik7CisgIG1wZl9zZXRfeihmLCB0ZW1wLmdldF9tcHpfdCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgdm9pZCBfX2dtcF9zZXRfZXhwcihtcGZfcHRyIGYsIGNvbnN0IF9fZ21wX2V4cHI8bXBxX3QsIFQ+ICZleHByKQoreworICBtcHFfY2xhc3MgY29uc3QmIHRlbXAoZXhwcik7CisgIG1wZl9zZXRfcShmLCB0ZW1wLmdldF9tcHFfdCgpKTsKK30KKworaW5saW5lIHZvaWQgX19nbXBfc2V0X2V4cHIobXBmX3B0ciBmLCBjb25zdCBtcGZfY2xhc3MgJmcpCit7CisgIG1wZl9zZXQoZiwgZy5nZXRfbXBmX3QoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgX19nbXBfc2V0X2V4cHIobXBmX3B0ciBmLCBjb25zdCBfX2dtcF9leHByPG1wZl90LCBUPiAmZXhwcikKK3sKKyAgZXhwci5ldmFsKGYpOworfQorCisKKy8qIFRlbXBvcmFyeSBvYmplY3RzICovCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgX19nbXBfdGVtcAoreworICBfX2dtcF9leHByPFQsIFQ+IHZhbDsKKyAgcHVibGljOgorICB0ZW1wbGF0ZTxjbGFzcyBVLCBjbGFzcyBWPgorICBfX2dtcF90ZW1wKFUgY29uc3QmIHUsIFYpIDogdmFsICh1KSB7fQorICB0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX2V4cHI8VD46OnNyY3B0cl90eXBlCisgIF9fZ2V0X21wKCkgY29uc3QgeyByZXR1cm4gdmFsLl9fZ2V0X21wKCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2dtcF90ZW1wIDxtcGZfdD4KK3sKKyAgbXBmX2NsYXNzIHZhbDsKKyAgcHVibGljOgorICB0ZW1wbGF0ZTxjbGFzcyBVPgorICBfX2dtcF90ZW1wKFUgY29uc3QmIHUsIG1wZl9wdHIgcmVzKSA6IHZhbCAodSwgbXBmX2dldF9wcmVjKHJlcykpIHt9CisgIG1wZl9zcmNwdHIgX19nZXRfbXAoKSBjb25zdCB7IHJldHVybiB2YWwuX19nZXRfbXAoKTsgfQorfTsKKworLyoqKioqKioqKioqKioqKiogU3BlY2lhbGl6YXRpb25zIG9mIF9fZ21wX2V4cHIgKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBldmFsKCkgbWV0aG9kIG9mIF9fZ21wX2V4cHI8VCwgVT4gZXZhbHVhdGVzIHRoZSBjb3JyZXNwb25kaW5nCisgICBleHByZXNzaW9uIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gaXRzIGFyZ3VtZW50LCB3aGljaCBpcyBlaXRoZXIgYW4KKyAgIG1wel90LCBtcHFfdCwgb3IgbXBmX3QgYXMgc3BlY2lmaWVkIGJ5IHRoZSBUIGFyZ3VtZW50LgorICAgQ29tcG91bmQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCByZWN1cnNpdmVseSAodGVtcG9yYXJpZXMgYXJlIGNyZWF0ZWQKKyAgIHRvIGhvbGQgaW50ZXJtZWRpYXRlIHZhbHVlcyksIHdoaWxlIGZvciBzaW1wbGUgZXhwcmVzc2lvbnMgdGhlIGV2YWwoKQorICAgbWV0aG9kIG9mIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBvYmplY3QgKGF2YWlsYWJsZSBhcyB0aGUgT3AgYXJndW1lbnQKKyAgIG9mIGVpdGhlciBfX2dtcF91bmFyeV9leHByPFQsIE9wPiBvciBfX2dtcF9iaW5hcnlfZXhwcjxULCBVLCBPcD4pIGlzCisgICBjYWxsZWQuICovCisKKworLyoqKioqKioqKioqKioqKiogVW5hcnkgZXhwcmVzc2lvbnMgKioqKioqKioqKioqKioqKi8KKy8qIGNhc2VzOgorICAgLSBzaW1wbGU6ICAgYXJndW1lbnQgaXMgbXAqX2NsYXNzLCB0aGF0IGlzLCBfX2dtcF9leHByPFQsIFQ+CisgICAtIGNvbXBvdW5kOiBhcmd1bWVudCBpcyBfX2dtcF9leHByPFQsIFU+ICh3aXRoIFUgbm90IGVxdWFsIHRvIFQpICovCisKKworLy8gc2ltcGxlIGV4cHJlc3Npb25zCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbF90eXBlOworCisgIF9fZ21wX3VuYXJ5X2V4cHI8dmFsX3R5cGUsIE9wPiBleHByOworcHVibGljOgorICBleHBsaWNpdCBfX2dtcF9leHByKGNvbnN0IHZhbF90eXBlICZ2YWwpIDogZXhwcih2YWwpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7IE9wOjpldmFsKHAsIGV4cHIudmFsLl9fZ2V0X21wKCkpOyB9CisgIGNvbnN0IHZhbF90eXBlICYgZ2V0X3ZhbCgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwuZ2V0X3ByZWMoKTsgfQorfTsKKworCisvLyBzaW1wbGUgZXhwcmVzc2lvbnMsIFUgaXMgYSBidWlsdC1pbiBudW1lcmljYWwgdHlwZQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CitjbGFzcyBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8VSwgT3A+ID4KK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgVSB2YWxfdHlwZTsKKworICBfX2dtcF91bmFyeV9leHByPHZhbF90eXBlLCBPcD4gZXhwcjsKK3B1YmxpYzoKKyAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCB2YWxfdHlwZSAmdmFsKSA6IGV4cHIodmFsKSB7IH0KKyAgdm9pZCBldmFsKHR5cGVuYW1lIF9fZ21wX3Jlc29sdmVfZXhwcjxUPjo6cHRyX3R5cGUgcCkgY29uc3QKKyAgeyBPcDo6ZXZhbChwLCBleHByLnZhbCk7IH0KKyAgY29uc3QgdmFsX3R5cGUgJiBnZXRfdmFsKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWw7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdCB7IHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOyB9Cit9OworCisKKy8vIGNvbXBvdW5kIGV4cHJlc3Npb25zCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFU+IHZhbF90eXBlOworCisgIF9fZ21wX3VuYXJ5X2V4cHI8dmFsX3R5cGUsIE9wPiBleHByOworcHVibGljOgorICBleHBsaWNpdCBfX2dtcF9leHByKGNvbnN0IHZhbF90eXBlICZ2YWwpIDogZXhwcih2YWwpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7IGV4cHIudmFsLmV2YWwocCk7IE9wOjpldmFsKHAsIHApOyB9CisgIGNvbnN0IHZhbF90eXBlICYgZ2V0X3ZhbCgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwuZ2V0X3ByZWMoKTsgfQorfTsKKworCisvKioqKioqKioqKioqKioqKiBCaW5hcnkgZXhwcmVzc2lvbnMgKioqKioqKioqKioqKioqKi8KKy8qIHNpbXBsZToKKyAgIC0gYXJndW1lbnRzIGFyZSBib3RoIG1wKl9jbGFzcworICAgLSBvbmUgYXJndW1lbnQgaXMgbXAqX2NsYXNzLCBvbmUgaXMgYSBidWlsdC1pbiB0eXBlCisgICBjb21wb3VuZDoKKyAgIC0gb25lIGlzIG1wKl9jbGFzcywgb25lIGlzIF9fZ21wX2V4cHI8VCwgVT4KKyAgIC0gb25lIGlzIF9fZ21wX2V4cHI8VCwgVT4sIG9uZSBpcyBidWlsdC1pbgorICAgLSBib3RoIGFyZ3VtZW50cyBhcmUgX19nbXBfZXhwcjwuLi4+ICovCisKKworLy8gc2ltcGxlIGV4cHJlc3Npb25zCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7IE9wOjpldmFsKHAsIGV4cHIudmFsMS5fX2dldF9tcCgpLCBleHByLnZhbDIuX19nZXRfbXAoKSk7IH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKKworLy8gc2ltcGxlIGV4cHJlc3Npb25zLCBVIGlzIGEgYnVpbHQtaW4gbnVtZXJpY2FsIHR5cGUKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorY2xhc3MgX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBVLCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBVIHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7IE9wOjpldmFsKHAsIGV4cHIudmFsMS5fX2dldF9tcCgpLCBleHByLnZhbDIpOyB9CisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9CisgIGNvbnN0IHZhbDJfdHlwZSAmIGdldF92YWwyKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwyOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxLmdldF9wcmVjKCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8VSwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgVSB2YWwxX3R5cGU7CisgIHR5cGVkZWYgX19nbXBfZXhwcjxULCBUPiB2YWwyX3R5cGU7CisKKyAgX19nbXBfYmluYXJ5X2V4cHI8dmFsMV90eXBlLCB2YWwyX3R5cGUsIE9wPiBleHByOworcHVibGljOgorICBfX2dtcF9leHByKGNvbnN0IHZhbDFfdHlwZSAmdmFsMSwgY29uc3QgdmFsMl90eXBlICZ2YWwyKQorICAgIDogZXhwcih2YWwxLCB2YWwyKSB7IH0KKyAgdm9pZCBldmFsKHR5cGVuYW1lIF9fZ21wX3Jlc29sdmVfZXhwcjxUPjo6cHRyX3R5cGUgcCkgY29uc3QKKyAgeyBPcDo6ZXZhbChwLCBleHByLnZhbDEsIGV4cHIudmFsMi5fX2dldF9tcCgpKTsgfQorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfQorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfQorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMi5nZXRfcHJlYygpOyB9Cit9OworCisKKy8vIGNvbXBvdW5kIGV4cHJlc3Npb25zLCBvbmUgYXJndW1lbnQgaXMgYSBzdWJleHByZXNzaW9uCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBfX2dtcF9leHByPFUsIFY+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFUsIFY+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgaWYocCAhPSBleHByLnZhbDEuX19nZXRfbXAoKSkKKyAgICB7CisgICAgICBfX2dtcF9zZXRfZXhwcihwLCBleHByLnZhbDIpOworICAgICAgT3A6OmV2YWwocCwgZXhwci52YWwxLl9fZ2V0X21wKCksIHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19nbXBfdGVtcDxUPiB0ZW1wKGV4cHIudmFsMiwgcCk7CisgICAgICBPcDo6ZXZhbChwLCBleHByLnZhbDEuX19nZXRfbXAoKSwgdGVtcC5fX2dldF9tcCgpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFUsIFY+LCBfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFUsIFY+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgaWYocCAhPSBleHByLnZhbDIuX19nZXRfbXAoKSkKKyAgICB7CisgICAgICBfX2dtcF9zZXRfZXhwcihwLCBleHByLnZhbDEpOworICAgICAgT3A6OmV2YWwocCwgcCwgZXhwci52YWwyLl9fZ2V0X21wKCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19nbXBfdGVtcDxUPiB0ZW1wKGV4cHIudmFsMSwgcCk7CisgICAgICBPcDo6ZXZhbChwLCB0ZW1wLl9fZ2V0X21wKCksIGV4cHIudmFsMi5fX2dldF9tcCgpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBfX2dtcF9leHByPFQsIFU+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFU+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgaWYocCAhPSBleHByLnZhbDEuX19nZXRfbXAoKSkKKyAgICB7CisgICAgICBfX2dtcF9zZXRfZXhwcihwLCBleHByLnZhbDIpOworICAgICAgT3A6OmV2YWwocCwgZXhwci52YWwxLl9fZ2V0X21wKCksIHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19nbXBfdGVtcDxUPiB0ZW1wKGV4cHIudmFsMiwgcCk7CisgICAgICBPcDo6ZXZhbChwLCBleHByLnZhbDEuX19nZXRfbXAoKSwgdGVtcC5fX2dldF9tcCgpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFU+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFQ+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgaWYocCAhPSBleHByLnZhbDIuX19nZXRfbXAoKSkKKyAgICB7CisgICAgICBfX2dtcF9zZXRfZXhwcihwLCBleHByLnZhbDEpOworICAgICAgT3A6OmV2YWwocCwgcCwgZXhwci52YWwyLl9fZ2V0X21wKCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgX19nbXBfdGVtcDxUPiB0ZW1wKGV4cHIudmFsMSwgcCk7CisgICAgICBPcDo6ZXZhbChwLCB0ZW1wLl9fZ2V0X21wKCksIGV4cHIudmFsMi5fX2dldF9tcCgpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKKworLy8gb25lIGFyZ3VtZW50IGlzIGEgc3ViZXhwcmVzc2lvbiwgb25lIGlzIGEgYnVpbHQtaW4KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorY2xhc3MgX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBWLCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFU+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBWIHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgZXhwci52YWwxLmV2YWwocCk7CisgICAgT3A6OmV2YWwocCwgcCwgZXhwci52YWwyKTsKKyAgfQorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfQorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfQorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMS5nZXRfcHJlYygpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3A+CitjbGFzcyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPFUsIF9fZ21wX2V4cHI8VCwgVj4sIE9wPiA+Cit7Citwcml2YXRlOgorICB0eXBlZGVmIFUgdmFsMV90eXBlOworICB0eXBlZGVmIF9fZ21wX2V4cHI8VCwgVj4gdmFsMl90eXBlOworCisgIF9fZ21wX2JpbmFyeV9leHByPHZhbDFfdHlwZSwgdmFsMl90eXBlLCBPcD4gZXhwcjsKK3B1YmxpYzoKKyAgX19nbXBfZXhwcihjb25zdCB2YWwxX3R5cGUgJnZhbDEsIGNvbnN0IHZhbDJfdHlwZSAmdmFsMikKKyAgICA6IGV4cHIodmFsMSwgdmFsMikgeyB9CisgIHZvaWQgZXZhbCh0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX2V4cHI8VD46OnB0cl90eXBlIHApIGNvbnN0CisgIHsKKyAgICBleHByLnZhbDIuZXZhbChwKTsKKyAgICBPcDo6ZXZhbChwLCBleHByLnZhbDEsIHApOworICB9CisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9CisgIGNvbnN0IHZhbDJfdHlwZSAmIGdldF92YWwyKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwyOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwyLmdldF9wcmVjKCk7IH0KK307CisKKworLy8gYm90aCBhcmd1bWVudHMgYXJlIHN1YmV4cHJlc3Npb25zCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBXLCBjbGFzcyBPcD4KK2NsYXNzIF9fZ21wX2V4cHIKKzxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFYsIFc+LCBPcD4gPgoreworcHJpdmF0ZToKKyAgdHlwZWRlZiBfX2dtcF9leHByPFQsIFU+IHZhbDFfdHlwZTsKKyAgdHlwZWRlZiBfX2dtcF9leHByPFYsIFc+IHZhbDJfdHlwZTsKKworICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgT3A+IGV4cHI7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfQorICB2b2lkIGV2YWwodHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQ+OjpwdHJfdHlwZSBwKSBjb25zdAorICB7CisgICAgX19nbXBfdGVtcDxUPiB0ZW1wMihleHByLnZhbDIsIHApOworICAgIGV4cHIudmFsMS5ldmFsKHApOworICAgIE9wOjpldmFsKHAsIHAsIHRlbXAyLl9fZ2V0X21wKCkpOworICB9CisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9CisgIGNvbnN0IHZhbDJfdHlwZSAmIGdldF92YWwyKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwyOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QKKyAgeworICAgIG1wX2JpdGNudF90IHByZWMxID0gZXhwci52YWwxLmdldF9wcmVjKCksCisgICAgICBwcmVjMiA9IGV4cHIudmFsMi5nZXRfcHJlYygpOworICAgIHJldHVybiAocHJlYzEgPiBwcmVjMikgPyBwcmVjMSA6IHByZWMyOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CitjbGFzcyBfX2dtcF9leHByCis8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxVLCBWPiwgX19nbXBfZXhwcjxULCBXPiwgT3A+ID4KK3sKK3ByaXZhdGU6CisgIHR5cGVkZWYgX19nbXBfZXhwcjxVLCBWPiB2YWwxX3R5cGU7CisgIHR5cGVkZWYgX19nbXBfZXhwcjxULCBXPiB2YWwyX3R5cGU7CisKKyAgX19nbXBfYmluYXJ5X2V4cHI8dmFsMV90eXBlLCB2YWwyX3R5cGUsIE9wPiBleHByOworcHVibGljOgorICBfX2dtcF9leHByKGNvbnN0IHZhbDFfdHlwZSAmdmFsMSwgY29uc3QgdmFsMl90eXBlICZ2YWwyKQorICAgIDogZXhwcih2YWwxLCB2YWwyKSB7IH0KKyAgdm9pZCBldmFsKHR5cGVuYW1lIF9fZ21wX3Jlc29sdmVfZXhwcjxUPjo6cHRyX3R5cGUgcCkgY29uc3QKKyAgeworICAgIF9fZ21wX3RlbXA8VD4gdGVtcDEoZXhwci52YWwxLCBwKTsKKyAgICBleHByLnZhbDIuZXZhbChwKTsKKyAgICBPcDo6ZXZhbChwLCB0ZW1wMS5fX2dldF9tcCgpLCBwKTsKKyAgfQorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfQorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfQorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0CisgIHsKKyAgICBtcF9iaXRjbnRfdCBwcmVjMSA9IGV4cHIudmFsMS5nZXRfcHJlYygpLAorICAgICAgcHJlYzIgPSBleHByLnZhbDIuZ2V0X3ByZWMoKTsKKyAgICByZXR1cm4gKHByZWMxID4gcHJlYzIpID8gcHJlYzEgOiBwcmVjMjsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorY2xhc3MgX19nbXBfZXhwcgorPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8VCwgVj4sIE9wPiA+Cit7Citwcml2YXRlOgorICB0eXBlZGVmIF9fZ21wX2V4cHI8VCwgVT4gdmFsMV90eXBlOworICB0eXBlZGVmIF9fZ21wX2V4cHI8VCwgVj4gdmFsMl90eXBlOworCisgIF9fZ21wX2JpbmFyeV9leHByPHZhbDFfdHlwZSwgdmFsMl90eXBlLCBPcD4gZXhwcjsKK3B1YmxpYzoKKyAgX19nbXBfZXhwcihjb25zdCB2YWwxX3R5cGUgJnZhbDEsIGNvbnN0IHZhbDJfdHlwZSAmdmFsMikKKyAgICA6IGV4cHIodmFsMSwgdmFsMikgeyB9CisgIHZvaWQgZXZhbCh0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX2V4cHI8VD46OnB0cl90eXBlIHApIGNvbnN0CisgIHsKKyAgICBfX2dtcF90ZW1wPFQ+IHRlbXAyKGV4cHIudmFsMiwgcCk7CisgICAgZXhwci52YWwxLmV2YWwocCk7CisgICAgT3A6OmV2YWwocCwgcCwgdGVtcDIuX19nZXRfbXAoKSk7CisgIH0KKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0KKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgbXBfYml0Y250X3QgcHJlYzEgPSBleHByLnZhbDEuZ2V0X3ByZWMoKSwKKyAgICAgIHByZWMyID0gZXhwci52YWwyLmdldF9wcmVjKCk7CisgICAgcmV0dXJuIChwcmVjMSA+IHByZWMyKSA/IHByZWMxIDogcHJlYzI7CisgIH0KK307CisKKworLyoqKioqKioqKioqKioqKiogU3BlY2lhbCBjYXNlcyAqKioqKioqKioqKioqKioqLworCisvKiBTb21lIG9wZXJhdGlvbnMgKGkuZS4sIGFkZCBhbmQgc3VidHJhY3QpIHdpdGggbWl4ZWQgbXB6L21wcSBhcmd1bWVudHMKKyAgIGNhbiBiZSBkb25lIGRpcmVjdGx5IHdpdGhvdXQgZmlyc3QgY29udmVydGluZyB0aGUgbXB6IHRvIG1wcS4KKyAgIEFwcHJvcHJpYXRlIHNwZWNpYWxpemF0aW9ucyBvZiBfX2dtcF9leHByIGFyZSByZXF1aXJlZC4gKi8KKworCisjZGVmaW5lIF9fR01QWlFfREVGSU5FX0VYUFIoZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBfX2dtcF9leHByPG1wcV90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIG1wcV9jbGFzcywgZXZhbF9mdW4+ID4gXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgbXB6X2NsYXNzIHZhbDFfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIG1wcV9jbGFzcyB2YWwyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2JpbmFyeV9leHByPHZhbDFfdHlwZSwgdmFsMl90eXBlLCBldmFsX2Z1bj4gZXhwcjsgICAgICAgICAgICAgICAgICAgXAorcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwcihjb25zdCB2YWwxX3R5cGUgJnZhbDEsIGNvbnN0IHZhbDJfdHlwZSAmdmFsMikgICAgICAgICAgICAgICAgICBcCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGV2YWwobXBxX3B0ciBxKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyBldmFsX2Z1bjo6ZXZhbChxLCBleHByLnZhbDEuZ2V0X21wel90KCksIGV4cHIudmFsMi5nZXRfbXBxX3QoKSk7IH0gICAgICBcCisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfSAgICAgICAgICAgICAgICAgIFwKKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdCB7IHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOyB9ICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBfX2dtcF9leHByPG1wcV90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHFfY2xhc3MsIG1wel9jbGFzcywgZXZhbF9mdW4+ID4gXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgbXBxX2NsYXNzIHZhbDFfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIG1wel9jbGFzcyB2YWwyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2JpbmFyeV9leHByPHZhbDFfdHlwZSwgdmFsMl90eXBlLCBldmFsX2Z1bj4gZXhwcjsgICAgICAgICAgICAgICAgICAgXAorcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwcihjb25zdCB2YWwxX3R5cGUgJnZhbDEsIGNvbnN0IHZhbDJfdHlwZSAmdmFsMikgICAgICAgICAgICAgICAgICBcCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGV2YWwobXBxX3B0ciBxKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyBldmFsX2Z1bjo6ZXZhbChxLCBleHByLnZhbDEuZ2V0X21wcV90KCksIGV4cHIudmFsMi5nZXRfbXB6X3QoKSk7IH0gICAgICBcCisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfSAgICAgICAgICAgICAgICAgIFwKKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdCB7IHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOyB9ICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBfX2dtcF9leHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPG1wcV90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIF9fZ21wX2V4cHI8bXBxX3QsIFQ+LCBldmFsX2Z1bj4gPiAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIG1wel9jbGFzcyB2YWwxX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfX2dtcF9leHByPG1wcV90LCBUPiB2YWwyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgZXZhbF9mdW4+IGV4cHI7ICAgICAgICAgICAgICAgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpICAgICAgICAgICAgICAgICAgXAorICAgIDogZXhwcih2YWwxLCB2YWwyKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBldmFsKG1wcV9wdHIgcSkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wcV9jbGFzcyB0ZW1wKGV4cHIudmFsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBldmFsX2Z1bjo6ZXZhbChxLCBleHByLnZhbDEuZ2V0X21wel90KCksIHRlbXAuZ2V0X21wcV90KCkpOyAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfSAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0gICAgICAgICAgICAgICAgICBcCisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kZWZhdWx0X3ByZWMoKTsgfSAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2xhc3MgX19nbXBfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKzxtcHFfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXBxX2NsYXNzLCBfX2dtcF9leHByPG1wel90LCBUPiwgZXZhbF9mdW4+ID4gICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBtcHFfY2xhc3MgdmFsMV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgX19nbXBfZXhwcjxtcHpfdCwgVD4gdmFsMl90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfYmluYXJ5X2V4cHI8dmFsMV90eXBlLCB2YWwyX3R5cGUsIGV2YWxfZnVuPiBleHByOyAgICAgICAgICAgICAgICAgICBcCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByKGNvbnN0IHZhbDFfdHlwZSAmdmFsMSwgY29uc3QgdmFsMl90eXBlICZ2YWwyKSAgICAgICAgICAgICAgICAgIFwKKyAgICA6IGV4cHIodmFsMSwgdmFsMikgeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgZXZhbChtcHFfcHRyIHEpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcHpfY2xhc3MgdGVtcChleHByLnZhbDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXZhbF9mdW46OmV2YWwocSwgZXhwci52YWwxLmdldF9tcHFfdCgpLCB0ZW1wLmdldF9tcHpfdCgpKTsgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdmFsMV90eXBlICYgZ2V0X3ZhbDEoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDE7IH0gICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHZhbDJfdHlwZSAmIGdldF92YWwyKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwyOyB9ICAgICAgICAgICAgICAgICAgXAorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIG1wZl9nZXRfZGVmYXVsdF9wcmVjKCk7IH0gICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NsYXNzIF9fZ21wX2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCis8bXBxX3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBtcHFfY2xhc3MsIGV2YWxfZnVuPiA+ICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgX19nbXBfZXhwcjxtcHpfdCwgVD4gdmFsMV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIG1wcV9jbGFzcyB2YWwyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2JpbmFyeV9leHByPHZhbDFfdHlwZSwgdmFsMl90eXBlLCBldmFsX2Z1bj4gZXhwcjsgICAgICAgICAgICAgICAgICAgXAorcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwcihjb25zdCB2YWwxX3R5cGUgJnZhbDEsIGNvbnN0IHZhbDJfdHlwZSAmdmFsMikgICAgICAgICAgICAgICAgICBcCisgICAgOiBleHByKHZhbDEsIHZhbDIpIHsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGV2YWwobXBxX3B0ciBxKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXB6X2NsYXNzIHRlbXAoZXhwci52YWwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV2YWxfZnVuOjpldmFsKHEsIHRlbXAuZ2V0X21wel90KCksIGV4cHIudmFsMi5nZXRfbXBxX3QoKSk7ICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfSAgICAgICAgICAgICAgICAgIFwKKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdCB7IHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOyB9ICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBfX2dtcF9leHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPG1wcV90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wcV90LCBUPiwgbXB6X2NsYXNzLCBldmFsX2Z1bj4gPiAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF9fZ21wX2V4cHI8bXBxX3QsIFQ+IHZhbDFfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBtcHpfY2xhc3MgdmFsMl90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgZXZhbF9mdW4+IGV4cHI7ICAgICAgICAgICAgICAgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpICAgICAgICAgICAgICAgICAgXAorICAgIDogZXhwcih2YWwxLCB2YWwyKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBldmFsKG1wcV9wdHIgcSkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wcV9jbGFzcyB0ZW1wKGV4cHIudmFsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBldmFsX2Z1bjo6ZXZhbChxLCB0ZW1wLmdldF9tcHFfdCgpLCBleHByLnZhbDIuZ2V0X21wel90KCkpOyAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfSAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0gICAgICAgICAgICAgICAgICBcCisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kZWZhdWx0X3ByZWMoKTsgfSAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2xhc3MgX19nbXBfZXhwcjxtcHFfdCwgX19nbXBfYmluYXJ5X2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKzxfX2dtcF9leHByPG1wel90LCBUPiwgX19nbXBfZXhwcjxtcHFfdCwgVT4sIGV2YWxfZnVuPiA+ICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfX2dtcF9leHByPG1wel90LCBUPiB2YWwxX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVkZWYgX19nbXBfZXhwcjxtcHFfdCwgVT4gdmFsMl90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfYmluYXJ5X2V4cHI8dmFsMV90eXBlLCB2YWwyX3R5cGUsIGV2YWxfZnVuPiBleHByOyAgICAgICAgICAgICAgICAgICBcCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByKGNvbnN0IHZhbDFfdHlwZSAmdmFsMSwgY29uc3QgdmFsMl90eXBlICZ2YWwyKSAgICAgICAgICAgICAgICAgIFwKKyAgICA6IGV4cHIodmFsMSwgdmFsMikgeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgZXZhbChtcHFfcHRyIHEpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcHpfY2xhc3MgdGVtcDEoZXhwci52YWwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhwci52YWwyLmV2YWwocSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV2YWxfZnVuOjpldmFsKHEsIHRlbXAxLmdldF9tcHpfdCgpLCBxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHZhbDFfdHlwZSAmIGdldF92YWwxKCkgY29uc3QgeyByZXR1cm4gZXhwci52YWwxOyB9ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwyX3R5cGUgJiBnZXRfdmFsMigpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMjsgfSAgICAgICAgICAgICAgICAgIFwKKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdCB7IHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOyB9ICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBfX2dtcF9leHByPG1wcV90LCBfX2dtcF9iaW5hcnlfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPF9fZ21wX2V4cHI8bXBxX3QsIFQ+LCBfX2dtcF9leHByPG1wel90LCBVPiwgZXZhbF9mdW4+ID4gICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIF9fZ21wX2V4cHI8bXBxX3QsIFQ+IHZhbDFfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBfX2dtcF9leHByPG1wel90LCBVPiB2YWwyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9iaW5hcnlfZXhwcjx2YWwxX3R5cGUsIHZhbDJfdHlwZSwgZXZhbF9mdW4+IGV4cHI7ICAgICAgICAgICAgICAgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX2V4cHIoY29uc3QgdmFsMV90eXBlICZ2YWwxLCBjb25zdCB2YWwyX3R5cGUgJnZhbDIpICAgICAgICAgICAgICAgICAgXAorICAgIDogZXhwcih2YWwxLCB2YWwyKSB7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBldmFsKG1wcV9wdHIgcSkgY29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wel9jbGFzcyB0ZW1wMihleHByLnZhbDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHByLnZhbDEuZXZhbChxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXZhbF9mdW46OmV2YWwocSwgcSwgdGVtcDIuZ2V0X21wel90KCkpOyAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2YWwxX3R5cGUgJiBnZXRfdmFsMSgpIGNvbnN0IHsgcmV0dXJuIGV4cHIudmFsMTsgfSAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdmFsMl90eXBlICYgZ2V0X3ZhbDIoKSBjb25zdCB7IHJldHVybiBleHByLnZhbDI7IH0gICAgICAgICAgICAgICAgICBcCisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kZWZhdWx0X3ByZWMoKTsgfSAgICAgICAgICAgXAorfTsKKworCitfX0dNUFpRX0RFRklORV9FWFBSKF9fZ21wX2JpbmFyeV9wbHVzKQorX19HTVBaUV9ERUZJTkVfRVhQUihfX2dtcF9iaW5hcnlfbWludXMpCisKKworCisvKioqKioqKioqKioqKioqKiBNYWNyb3MgZm9yIGRlZmluaW5nIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqLworLyogUmVzdWx0cyBvZiBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucyBhcmUgaW5zdGFuY2VzIG9mIF9fZ21wX2V4cHI8VCwgVT4uCisgICBUIGRldGVybWluZXMgdGhlIG51bWVyaWNhbCB0eXBlIG9mIHRoZSBleHByZXNzaW9uOiBpdCBjYW4gYmUgZWl0aGVyCisgICBtcHpfdCwgbXBxX3QsIG9yIG1wZl90LiAgV2hlbiB0aGUgYXJndW1lbnRzIG9mIGEgYmluYXJ5CisgICBleHByZXNzaW9uIGhhdmUgZGlmZmVyZW50IG51bWVyaWNhbCB0eXBlcywgX19nbXBfcmVzb2x2ZV9leHByIGlzIHVzZWQKKyAgIHRvIGRldGVybWluZSB0aGUgImxhcmdlciIgdHlwZS4KKyAgIFUgaXMgZWl0aGVyIF9fZ21wX3VuYXJ5X2V4cHI8ViwgT3A+IG9yIF9fZ21wX2JpbmFyeV9leHByPFYsIFcsIE9wPiwKKyAgIHdoZXJlIFYgYW5kIFcgYXJlIHRoZSBhcmd1bWVudHMnIHR5cGVzIC0tIHRoZXkgY2FuIGluIHR1cm4gYmUKKyAgIGV4cHJlc3Npb25zLCB0aHVzIGFsbG93aW5nIHRvIGJ1aWxkIGNvbXBvdW5kIGV4cHJlc3Npb25zIHRvIGFueQorICAgZGVncmVlIG9mIGNvbXBsZXhpdHkuCisgICBPcCBpcyBhIGZ1bmN0aW9uIG9iamVjdCB0aGF0IG11c3QgaGF2ZSBhbiBldmFsKCkgbWV0aG9kIGFjY2VwdGluZworICAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorICAgQWN0dWFsIGV2YWx1YXRpb24gb2YgYSBfX2dtcF9leHByPFQsIFU+IG9iamVjdCBpcyBkb25lIHdoZW4gaXQgZ2V0cworICAgYXNzaWduZWQgdG8gYW4gbXAqX2NsYXNzICgibGF6eSIgZXZhbHVhdGlvbik6IHRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCisgICBpdHMgZXZhbCgpIG1ldGhvZC4gKi8KKworCisvLyBub24tbWVtYmVyIHVuYXJ5IG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zCisKKyNkZWZpbmUgX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OKGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgZXZhbF9mdW4+ID4gICAgICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPihleHByKTsgXAorfQorCisvLyB2YXJpYW50IHRoYXQgb25seSB3b3JrcyBmb3Igb25lIG9mIHsgbXB6LCBtcHEsIG1wZiB9CisKKyNkZWZpbmUgX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgZXZhbF9mdW4+ID4gICAgICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPihleHByKTsgXAorfQorCisjZGVmaW5lIF9fR01QX0RFRklORV9VTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgdHlwZSBmdW4oY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByPFQsIFQ+IGNvbnN0JiB0ZW1wKGV4cHIpOyBcCisgIHJldHVybiBldmFsX2Z1bjo6ZXZhbCh0ZW1wLl9fZ2V0X21wKCkpOyAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvLyBub24tbWVtYmVyIGJpbmFyeSBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucworCisjZGVmaW5lIF9fR01QUF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OKGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIFc+ICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgX19nbXBfZXhwcjx0eXBlbmFtZSBfX2dtcF9yZXNvbHZlX2V4cHI8VCwgVj46OnZhbHVlX3R5cGUsICAgICAgIFwKK19fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8ViwgVz4sIGV2YWxfZnVuPiA+ICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIxLCBjb25zdCBfX2dtcF9leHByPFYsIFc+ICZleHByMikgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8dHlwZW5hbWUgX19nbXBfcmVzb2x2ZV9leHByPFQsIFY+Ojp2YWx1ZV90eXBlLCAgICAgXAorICAgICBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFYsIFc+LCBldmFsX2Z1bj4gPiBcCisgICAgKGV4cHIxLCBleHByMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1biwgdHlwZSwgYmlndHlwZSkgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIF9fZ21wX2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIGJpZ3R5cGUsIGV2YWxfZnVuPiA+ICAgICAgICAgICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIsIHR5cGUgdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX19nbXBfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBiaWd0eXBlLCBldmFsX2Z1bj4gPihleHByLCB0KTsgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIF9fZ21wX2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPFQsIF9fZ21wX2JpbmFyeV9leHByPGJpZ3R5cGUsIF9fZ21wX2V4cHI8VCwgVT4sIGV2YWxfZnVuPiA+ICAgICAgICAgICAgICAgXAorZnVuKHR5cGUgdCwgY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX19nbXBfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDxULCBfX2dtcF9iaW5hcnlfZXhwcjxiaWd0eXBlLCBfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPih0LCBleHByKTsgXAorfQorCisjZGVmaW5lIF9fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB0eXBlKSAgICAgICAgICBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1biwgdHlwZSwgc2lnbmVkIGxvbmcgaW50KQorCisjZGVmaW5lIF9fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB0eXBlKSAgICAgICAgICAgIFwKK19fR01QTk5fREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB0eXBlLCB1bnNpZ25lZCBsb25nIGludCkKKworI2RlZmluZSBfX0dNUE5EX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1biwgdHlwZSkgXAorX19HTVBOTl9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OKGZ1biwgZXZhbF9mdW4sIHR5cGUsIGRvdWJsZSkKKworI2RlZmluZSBfX0dNUE5MRF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OKGZ1biwgZXZhbF9mdW4sIHR5cGUpICAgICBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1biwgdHlwZSwgbG9uZyBkb3VibGUpCisKKyNkZWZpbmUgX19HTVBOX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBzaWduZWQgY2hhcikgICAgICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBjaGFyKSAgICAgIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBzaWduZWQgaW50KSAgICAgICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBpbnQpICAgICAgIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBzaWduZWQgc2hvcnQgaW50KSAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBzaG9ydCBpbnQpIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBzaWduZWQgbG9uZyBpbnQpICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBsb25nIGludCkgIFwKK19fR01QTkRfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBmbG9hdCkgICAgICAgICAgICAgIFwKK19fR01QTkRfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuLCBkb3VibGUpICAgICAgICAgICAgIFwKKy8qIF9fR01QTkxEX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1biwgbG9uZyBkb3VibGUpICovCisKKyNkZWZpbmUgX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuKSBcCitfX0dNUFBfREVGSU5FX0JJTkFSWV9GVU5DVElPTihmdW4sIGV2YWxfZnVuKSAgICAgICAgXAorX19HTVBOX0RFRklORV9CSU5BUllfRlVOQ1RJT04oZnVuLCBldmFsX2Z1bikKKworLy8gdmFyaWFudCB0aGF0IG9ubHkgd29ya3MgZm9yIG9uZSBvZiB7IG1weiwgbXBxLCBtcGYgfQorCisjZGVmaW5lIF9fR01QUF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1bikgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzIFc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgX19nbXBfZXhwcjxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8VCwgVz4sIGV2YWxfZnVuPiA+ICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIxLCBjb25zdCBfX2dtcF9leHByPFQsIFc+ICZleHByMikgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8VCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFQsIFc+LCBldmFsX2Z1bj4gPiBcCisgICAgKGV4cHIxLCBleHByMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCBiaWd0eXBlKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIF9fZ21wX2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIGJpZ3R5cGUsIGV2YWxfZnVuPiA+ICAgICAgICAgICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIsIHR5cGUgdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX19nbXBfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBiaWd0eXBlLCBldmFsX2Z1bj4gPihleHByLCB0KTsgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIF9fZ21wX2V4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPFQsIF9fZ21wX2JpbmFyeV9leHByPGJpZ3R5cGUsIF9fZ21wX2V4cHI8VCwgVT4sIGV2YWxfZnVuPiA+ICAgICAgICAgICAgICAgXAorZnVuKHR5cGUgdCwgY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX19nbXBfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDxULCBfX2dtcF9iaW5hcnlfZXhwcjxiaWd0eXBlLCBfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPih0LCBleHByKTsgXAorfQorCisjZGVmaW5lIF9fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHR5cGUpICAgICAgICAgIFwKK19fR01QTk5fREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHR5cGUsIHNpZ25lZCBsb25nIGludCkKKworI2RlZmluZSBfX0dNUE5VX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlKSAgICAgICAgICBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCB1bnNpZ25lZCBsb25nIGludCkKKworI2RlZmluZSBfX0dNUE5EX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlKSBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCBkb3VibGUpCisKKyNkZWZpbmUgX19HTVBOTERfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHR5cGUpICAgICBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCBsb25nIGRvdWJsZSkKKworI2RlZmluZSBfX0dNUE5fREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICBcCitfX0dNUE5TX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgY2hhcikgICAgICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGNoYXIpICAgICAgXAorX19HTVBOU19ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIGludCkgICAgICAgICBcCitfX0dNUE5VX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBpbnQpICAgICAgIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBzaG9ydCBpbnQpICAgXAorX19HTVBOVV9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgc2hvcnQgaW50KSBcCitfX0dNUE5TX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgbG9uZyBpbnQpICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKFQsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGxvbmcgaW50KSAgXAorX19HTVBORF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1biwgZmxvYXQpICAgICAgICAgICAgICBcCitfX0dNUE5EX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCBkb3VibGUpICAgICAgICAgICAgIFwKKy8qIF9fR01QTkxEX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuLCBsb25nIGRvdWJsZSkgKi8KKworI2RlZmluZSBfX0dNUF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEoVCwgZnVuLCBldmFsX2Z1bikgXAorX19HTVBQX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuKSAgICAgICAgXAorX19HTVBOX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShULCBmdW4sIGV2YWxfZnVuKQorCisKKyNkZWZpbmUgX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl9VSShmdW4sIGV2YWxfZnVuKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBfX2dtcF9leHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIG1wX2JpdGNudF90LCBldmFsX2Z1bj4gPiBcCitmdW4oY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwciwgbXBfYml0Y250X3QgbCkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPF9fZ21wX2V4cHI8VCwgVT4sIG1wX2JpdGNudF90LCBldmFsX2Z1bj4gPihleHByLCBsKTsgICAgICAgIFwKK30KKworCisjZGVmaW5lIF9fR01QUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1bikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVz4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgdHlwZSBmdW4oY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcjEsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWNvbnN0IF9fZ21wX2V4cHI8ViwgVz4gJmV4cHIyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByPFQsIFQ+IGNvbnN0JiB0ZW1wMShleHByMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByPFYsIFY+IGNvbnN0JiB0ZW1wMihleHByMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZXZhbF9mdW46OmV2YWwodGVtcDEuX19nZXRfbXAoKSwgdGVtcDIuX19nZXRfbXAoKSk7ICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9fR01QTk5fREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sICAgXAorCQkJCQkgICAgdHlwZTIsIGJpZ3R5cGUpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSB0eXBlIGZ1bihjb25zdCBfX2dtcF9leHByPFQsIFU+ICZleHByLCB0eXBlMiB0KSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9leHByPFQsIFQ+IGNvbnN0JiB0ZW1wKGV4cHIpOyAgICAgIFwKKyAgcmV0dXJuIGV2YWxfZnVuOjpldmFsKHRlbXAuX19nZXRfbXAoKSwgc3RhdGljX2Nhc3Q8YmlndHlwZT4odCkpOyBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgdHlwZSBmdW4odHlwZTIgdCwgY29uc3QgX19nbXBfZXhwcjxULCBVPiAmZXhwcikgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfZXhwcjxULCBUPiBjb25zdCYgdGVtcChleHByKTsgICAgICBcCisgIHJldHVybiBldmFsX2Z1bjo6ZXZhbChzdGF0aWNfY2FzdDxiaWd0eXBlPih0KSwgdGVtcC5fX2dldF9tcCgpKTsgXAorfQorCisjZGVmaW5lIF9fR01QTlNfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHR5cGUyKSBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCAgICAgICAgICAgICAgICBcCisJCQkJICAgIHR5cGUyLCBzaWduZWQgbG9uZyBpbnQpCisKKyNkZWZpbmUgX19HTVBOVV9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1biwgdHlwZTIpIFwKK19fR01QTk5fREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgdHlwZTIsIHVuc2lnbmVkIGxvbmcgaW50KQorCisjZGVmaW5lIF9fR01QTkRfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHR5cGUyKSBcCitfX0dNUE5OX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCB0eXBlMiwgZG91YmxlKQorCisjZGVmaW5lIF9fR01QTkxEX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCB0eXBlMikgICAgIFwKK19fR01QTk5fREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHR5cGUyLCBsb25nIGRvdWJsZSkKKworI2RlZmluZSBfX0dNUE5fREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICBcCitfX0dNUE5TX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgY2hhcikgICAgICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGNoYXIpICAgICAgXAorX19HTVBOU19ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIGludCkgICAgICAgICBcCitfX0dNUE5VX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBpbnQpICAgICAgIFwKK19fR01QTlNfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBzaG9ydCBpbnQpICAgXAorX19HTVBOVV9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgc2hvcnQgaW50KSBcCitfX0dNUE5TX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgbG9uZyBpbnQpICAgIFwKK19fR01QTlVfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGxvbmcgaW50KSAgXAorX19HTVBORF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1biwgZmxvYXQpICAgICAgICAgICAgICBcCitfX0dNUE5EX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCBkb3VibGUpICAgICAgICAgICAgIFwKKy8qIF9fR01QTkxEX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuLCBsb25nIGRvdWJsZSkgKi8KKworI2RlZmluZSBfX0dNUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04odHlwZSwgZnVuLCBldmFsX2Z1bikgXAorX19HTVBQX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuKSAgICAgICAgXAorX19HTVBOX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTih0eXBlLCBmdW4sIGV2YWxfZnVuKQorCisKKy8vIG1lbWJlciBvcGVyYXRvcnMKKworI2RlZmluZSBfX0dNUFBfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIHR5cGUjI19jbGFzcyAmIHR5cGUjI19jbGFzczo6ZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbXBfc2V0X2V4cHIobXAsIF9fZ21wX2V4cHI8dHlwZSMjX3QsIF9fZ21wX2JpbmFyeV9leHByICAgICAgICAgICAgICAgICAgXAorCQkgPHR5cGUjI19jbGFzcywgX19nbXBfZXhwcjxULCBVPiwgZXZhbF9mdW4+ID4oKnRoaXMsIGV4cHIpKTsgXAorICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX19HTVBOTl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgICAgXAorCQkJCQkgdHlwZTIsIGJpZ3R5cGUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgdHlwZSMjX2NsYXNzICYgdHlwZSMjX2NsYXNzOjpmdW4odHlwZTIgdCkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9zZXRfZXhwcihtcCwgX19nbXBfZXhwcjx0eXBlIyNfdCwgX19nbXBfYmluYXJ5X2V4cHIgICAgICBcCisJCSA8dHlwZSMjX2NsYXNzLCBiaWd0eXBlLCBldmFsX2Z1bj4gPigqdGhpcywgdCkpOyBcCisgIHJldHVybiAqdGhpczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfX0dNUE5TX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCB0eXBlMikgXAorX19HTVBOTl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgICAgICAgICAgICAgICAgXAorCQkJCSB0eXBlMiwgc2lnbmVkIGxvbmcgaW50KQorCisjZGVmaW5lIF9fR01QTlVfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHR5cGUyKSBcCitfX0dNUE5OX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCAgICAgICAgICAgICAgICBcCisJCQkJIHR5cGUyLCB1bnNpZ25lZCBsb25nIGludCkKKworI2RlZmluZSBfX0dNUE5EX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCB0eXBlMikgXAorX19HTVBOTl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgdHlwZTIsIGRvdWJsZSkKKworI2RlZmluZSBfX0dNUE5MRF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgdHlwZTIpICAgICBcCitfX0dNUE5OX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCB0eXBlMiwgbG9uZyBkb3VibGUpCisKKyNkZWZpbmUgX19HTVBOX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuKSAgICAgICAgICAgICAgXAorX19HTVBOU19ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIGNoYXIpICAgICAgICBcCitfX0dNUE5VX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBjaGFyKSAgICAgIFwKK19fR01QTlNfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBpbnQpICAgICAgICAgXAorX19HTVBOVV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgaW50KSAgICAgICBcCitfX0dNUE5TX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgc2hvcnQgaW50KSAgIFwKK19fR01QTlVfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIHNob3J0IGludCkgXAorX19HTVBOU19ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIGxvbmcgaW50KSAgICBcCitfX0dNUE5VX0RFRklORV9DT01QT1VORF9PUEVSQVRPUih0eXBlLCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBsb25nIGludCkgIFwKK19fR01QTkRfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4sIGZsb2F0KSAgICAgICAgICAgICAgXAorX19HTVBORF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgZG91YmxlKSAgICAgICAgICAgICBcCisvKiBfX0dNUE5MRF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1biwgbG9uZyBkb3VibGUpICovCisKKyNkZWZpbmUgX19HTVBfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKHR5cGUsIGZ1biwgZXZhbF9mdW4pIFwKK19fR01QUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1bikgICAgICAgIFwKK19fR01QTl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1bikKKworI2RlZmluZSBfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKGZ1biwgZXZhbF9mdW4pIFwKK19fR01QX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihtcHosIGZ1biwgZXZhbF9mdW4pCisKKyNkZWZpbmUgX19HTVBRX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihmdW4sIGV2YWxfZnVuKSBcCitfX0dNUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IobXBxLCBmdW4sIGV2YWxfZnVuKQorCisjZGVmaW5lIF9fR01QRl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IoZnVuLCBldmFsX2Z1bikgXAorX19HTVBfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG1wZiwgZnVuLCBldmFsX2Z1bikKKworCisKKyNkZWZpbmUgX19HTVBfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKHR5cGUsIGZ1biwgZXZhbF9mdW4pICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIHR5cGUjI19jbGFzcyAmIHR5cGUjI19jbGFzczo6ZnVuKG1wX2JpdGNudF90IGwpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fZ21wX3NldF9leHByKG1wLCBfX2dtcF9leHByPHR5cGUjI190LCBfX2dtcF9iaW5hcnlfZXhwciAgICAgXAorICAgIDx0eXBlIyNfY2xhc3MsIG1wX2JpdGNudF90LCBldmFsX2Z1bj4gPigqdGhpcywgbCkpOyAgIFwKKyAgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX19HTVBaX0RFRklORV9DT01QT1VORF9PUEVSQVRPUl9VSShmdW4sIGV2YWxfZnVuKSBcCitfX0dNUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkobXB6LCBmdW4sIGV2YWxfZnVuKQorCisjZGVmaW5lIF9fR01QUV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkoZnVuLCBldmFsX2Z1bikgXAorX19HTVBfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKG1wcSwgZnVuLCBldmFsX2Z1bikKKworI2RlZmluZSBfX0dNUEZfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKGZ1biwgZXZhbF9mdW4pIFwKK19fR01QX0RFRklORV9DT01QT1VORF9PUEVSQVRPUl9VSShtcGYsIGZ1biwgZXZhbF9mdW4pCisKKworCisjZGVmaW5lIF9fR01QX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IodHlwZSwgZnVuLCBldmFsX2Z1bikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSB0eXBlIyNfY2xhc3MgJiB0eXBlIyNfY2xhc3M6OmZ1bigpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBldmFsX2Z1bjo6ZXZhbChtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuICp0aGlzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSB0eXBlIyNfY2xhc3MgdHlwZSMjX2NsYXNzOjpmdW4oaW50KSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlIyNfY2xhc3MgdGVtcCgqdGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXZhbF9mdW46OmV2YWwobXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9fR01QWl9ERUZJTkVfSU5DUkVNRU5UX09QRVJBVE9SKGZ1biwgZXZhbF9mdW4pIFwKK19fR01QX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IobXB6LCBmdW4sIGV2YWxfZnVuKQorCisjZGVmaW5lIF9fR01QUV9ERUZJTkVfSU5DUkVNRU5UX09QRVJBVE9SKGZ1biwgZXZhbF9mdW4pIFwKK19fR01QX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IobXBxLCBmdW4sIGV2YWxfZnVuKQorCisjZGVmaW5lIF9fR01QRl9ERUZJTkVfSU5DUkVNRU5UX09QRVJBVE9SKGZ1biwgZXZhbF9mdW4pIFwKK19fR01QX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IobXBmLCBmdW4sIGV2YWxfZnVuKQorCisKKyNkZWZpbmUgX19HTVBQX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgZXZhbF9mdW4+ID4gICAgICAgICAgXAorZnVuKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJmV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBldmFsX2Z1bj4gPihleHByKTsgXAorfQorCisjZGVmaW5lIF9fR01QTk5fREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgYmlndHlwZSkgIFwKK2lubGluZSBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8YmlndHlwZSwgZXZhbF9mdW4+ID4gICAgICAgICAgICAgICAgICAgXAorZnVuKHR5cGUgZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxiaWd0eXBlLCBldmFsX2Z1bj4gPihleHByKTsgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9fR01QTlNfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSkgIFwKK19fR01QTk5fREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgc2lnbmVkIGxvbmcpCisjZGVmaW5lIF9fR01QTlVfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSkgIFwKK19fR01QTk5fREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdHlwZSwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgX19HTVBORF9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB0eXBlKSAgXAorX19HTVBOTl9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB0eXBlLCBkb3VibGUpCisKKyNkZWZpbmUgX19HTVBOX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICBcCitfX0dNUE5TX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBjaGFyKSAgICAgICAgICAgXAorX19HTVBOVV9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBjaGFyKSAgICAgICAgIFwKK19fR01QTlNfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgc2lnbmVkIGludCkgICAgICAgICAgICBcCitfX0dNUE5VX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHVuc2lnbmVkIGludCkgICAgICAgICAgXAorX19HTVBOU19ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCBzaWduZWQgc2hvcnQgaW50KSAgICAgIFwKK19fR01QTlVfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgdW5zaWduZWQgc2hvcnQgaW50KSAgICBcCitfX0dNUE5TX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIHNpZ25lZCBsb25nIGludCkgICAgICAgXAorX19HTVBOVV9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuLCB1bnNpZ25lZCBsb25nIGludCkgICAgIFwKK19fR01QTkRfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4oVCwgZnVuLCBldmFsX2Z1biwgZmxvYXQpICAgICAgICAgICAgICAgICBcCitfX0dNUE5EX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4sIGRvdWJsZSkgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIF9fR01QX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgXAorX19HTVBQX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKFQsIGZ1biwgZXZhbF9mdW4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKK19fR01QTl9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihULCBmdW4sIGV2YWxfZnVuKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKworLyoqKioqKioqKioqKioqKiogQXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqLworCisvLyBub24tbWVtYmVyIG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zCisKK19fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTihvcGVyYXRvcissIF9fZ21wX3VuYXJ5X3BsdXMpCitfX0dNUF9ERUZJTkVfVU5BUllfRlVOQ1RJT04ob3BlcmF0b3ItLCBfX2dtcF91bmFyeV9taW51cykKK19fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTl8xKG1wel90LCBvcGVyYXRvcn4sIF9fZ21wX3VuYXJ5X2NvbSkKKworX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTihvcGVyYXRvcissIF9fZ21wX2JpbmFyeV9wbHVzKQorX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTihvcGVyYXRvci0sIF9fZ21wX2JpbmFyeV9taW51cykKK19fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT04ob3BlcmF0b3IqLCBfX2dtcF9iaW5hcnlfbXVsdGlwbGllcykKK19fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT04ob3BlcmF0b3IvLCBfX2dtcF9iaW5hcnlfZGl2aWRlcykKK19fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShtcHpfdCwgb3BlcmF0b3IlLCBfX2dtcF9iaW5hcnlfbW9kdWx1cykKK19fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT05fMShtcHpfdCwgb3BlcmF0b3ImLCBfX2dtcF9iaW5hcnlfYW5kKQorX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKG1wel90LCBvcGVyYXRvcnwsIF9fZ21wX2JpbmFyeV9pb3IpCitfX0dNUF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEobXB6X3QsIG9wZXJhdG9yXiwgX19nbXBfYmluYXJ5X3hvcikKKworX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl9VSShvcGVyYXRvcjw8LCBfX2dtcF9iaW5hcnlfbHNoaWZ0KQorX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl9VSShvcGVyYXRvcj4+LCBfX2dtcF9iaW5hcnlfcnNoaWZ0KQorCitfX0dNUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04oYm9vbCwgb3BlcmF0b3I9PSwgX19nbXBfYmluYXJ5X2VxdWFsKQorX19HTVBfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKGJvb2wsIG9wZXJhdG9yIT0sICEgX19nbXBfYmluYXJ5X2VxdWFsKQorX19HTVBfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKGJvb2wsIG9wZXJhdG9yPCwgX19nbXBfYmluYXJ5X2xlc3MpCitfX0dNUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04oYm9vbCwgb3BlcmF0b3I8PSwgISBfX2dtcF9iaW5hcnlfZ3JlYXRlcikKK19fR01QX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTihib29sLCBvcGVyYXRvcj4sIF9fZ21wX2JpbmFyeV9ncmVhdGVyKQorX19HTVBfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OKGJvb2wsIG9wZXJhdG9yPj0sICEgX19nbXBfYmluYXJ5X2xlc3MpCisKK19fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTihhYnMsIF9fZ21wX2Fic19mdW5jdGlvbikKK19fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTl8xKG1wZl90LCB0cnVuYywgX19nbXBfdHJ1bmNfZnVuY3Rpb24pCitfX0dNUF9ERUZJTkVfVU5BUllfRlVOQ1RJT05fMShtcGZfdCwgZmxvb3IsIF9fZ21wX2Zsb29yX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OXzEobXBmX3QsIGNlaWwsIF9fZ21wX2NlaWxfZnVuY3Rpb24pCitfX0dNUF9ERUZJTkVfVU5BUllfRlVOQ1RJT05fMShtcGZfdCwgc3FydCwgX19nbXBfc3FydF9mdW5jdGlvbikKK19fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTl8xKG1wel90LCBzcXJ0LCBfX2dtcF9zcXJ0X2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OXzEobXB6X3QsIGZhY3RvcmlhbCwgX19nbXBfZmFjX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OXzEobXB6X3QsIHByaW1vcmlhbCwgX19nbXBfcHJpbW9yaWFsX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX1VOQVJZX0ZVTkNUSU9OXzEobXB6X3QsIGZpYm9uYWNjaSwgX19nbXBfZmliX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKG1wZl90LCBoeXBvdCwgX19nbXBfaHlwb3RfZnVuY3Rpb24pCitfX0dNUF9ERUZJTkVfQklOQVJZX0ZVTkNUSU9OXzEobXB6X3QsIGdjZCwgX19nbXBfZ2NkX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX0JJTkFSWV9GVU5DVElPTl8xKG1wel90LCBsY20sIF9fZ21wX2xjbV9mdW5jdGlvbikKKworX19HTVBfREVGSU5FX1VOQVJZX1RZUEVfRlVOQ1RJT04oaW50LCBzZ24sIF9fZ21wX3Nnbl9mdW5jdGlvbikKK19fR01QX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTihpbnQsIGNtcCwgX19nbXBfY21wX2Z1bmN0aW9uKQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgc3dhcChfX2dtcF9leHByPFQsIFQ+JiB4LCBfX2dtcF9leHByPFQsIFQ+JiB5KSBfX0dNUFhYX05PRVhDRVBUCit7IHguc3dhcCh5KTsgfQorCisvLyBtZW1iZXIgb3BlcmF0b3JzIGZvciBtcHpfY2xhc3MKKworX19HTVBaX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcis9LCBfX2dtcF9iaW5hcnlfcGx1cykKK19fR01QWl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3ItPSwgX19nbXBfYmluYXJ5X21pbnVzKQorX19HTVBaX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcio9LCBfX2dtcF9iaW5hcnlfbXVsdGlwbGllcykKK19fR01QWl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IvPSwgX19nbXBfYmluYXJ5X2RpdmlkZXMpCitfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yJT0sIF9fZ21wX2JpbmFyeV9tb2R1bHVzKQorCitfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yJj0sIF9fZ21wX2JpbmFyeV9hbmQpCitfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yfD0sIF9fZ21wX2JpbmFyeV9pb3IpCitfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yXj0sIF9fZ21wX2JpbmFyeV94b3IpCisKK19fR01QWl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkob3BlcmF0b3I8PD0sIF9fZ21wX2JpbmFyeV9sc2hpZnQpCitfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKG9wZXJhdG9yPj49LCBfX2dtcF9iaW5hcnlfcnNoaWZ0KQorCitfX0dNUFpfREVGSU5FX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvcisrLCBfX2dtcF91bmFyeV9pbmNyZW1lbnQpCitfX0dNUFpfREVGSU5FX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvci0tLCBfX2dtcF91bmFyeV9kZWNyZW1lbnQpCisKK19fR01QX0RFRklORV9VTkFSWV9TVEFUSUNfTUVNRlVOKG1wel90LCBtcHpfY2xhc3M6OmZhY3RvcmlhbCwgX19nbXBfZmFjX2Z1bmN0aW9uKQorX19HTVBfREVGSU5FX1VOQVJZX1NUQVRJQ19NRU1GVU4obXB6X3QsIG1wel9jbGFzczo6cHJpbW9yaWFsLCBfX2dtcF9wcmltb3JpYWxfZnVuY3Rpb24pCitfX0dNUF9ERUZJTkVfVU5BUllfU1RBVElDX01FTUZVTihtcHpfdCwgbXB6X2NsYXNzOjpmaWJvbmFjY2ksIF9fZ21wX2ZpYl9mdW5jdGlvbikKKworLy8gbWVtYmVyIG9wZXJhdG9ycyBmb3IgbXBxX2NsYXNzCisKK19fR01QUV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IrPSwgX19nbXBfYmluYXJ5X3BsdXMpCitfX0dNUFFfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yLT0sIF9fZ21wX2JpbmFyeV9taW51cykKK19fR01QUV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IqPSwgX19nbXBfYmluYXJ5X211bHRpcGxpZXMpCitfX0dNUFFfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SKG9wZXJhdG9yLz0sIF9fZ21wX2JpbmFyeV9kaXZpZGVzKQorCitfX0dNUFFfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKG9wZXJhdG9yPDw9LCBfX2dtcF9iaW5hcnlfbHNoaWZ0KQorX19HTVBRX0RFRklORV9DT01QT1VORF9PUEVSQVRPUl9VSShvcGVyYXRvcj4+PSwgX19nbXBfYmluYXJ5X3JzaGlmdCkKKworX19HTVBRX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1Iob3BlcmF0b3IrKywgX19nbXBfdW5hcnlfaW5jcmVtZW50KQorX19HTVBRX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1Iob3BlcmF0b3ItLSwgX19nbXBfdW5hcnlfZGVjcmVtZW50KQorCisvLyBtZW1iZXIgb3BlcmF0b3JzIGZvciBtcGZfY2xhc3MKKworX19HTVBGX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcis9LCBfX2dtcF9iaW5hcnlfcGx1cykKK19fR01QRl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3ItPSwgX19nbXBfYmluYXJ5X21pbnVzKQorX19HTVBGX0RFRklORV9DT01QT1VORF9PUEVSQVRPUihvcGVyYXRvcio9LCBfX2dtcF9iaW5hcnlfbXVsdGlwbGllcykKK19fR01QRl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1Iob3BlcmF0b3IvPSwgX19nbXBfYmluYXJ5X2RpdmlkZXMpCisKK19fR01QRl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkob3BlcmF0b3I8PD0sIF9fZ21wX2JpbmFyeV9sc2hpZnQpCitfX0dNUEZfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJKG9wZXJhdG9yPj49LCBfX2dtcF9iaW5hcnlfcnNoaWZ0KQorCitfX0dNUEZfREVGSU5FX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvcisrLCBfX2dtcF91bmFyeV9pbmNyZW1lbnQpCitfX0dNUEZfREVGSU5FX0lOQ1JFTUVOVF9PUEVSQVRPUihvcGVyYXRvci0tLCBfX2dtcF91bmFyeV9kZWNyZW1lbnQpCisKKworCisvKioqKioqKioqKioqKioqKiBDbGFzcyB3cmFwcGVyIGZvciBnbXBfcmFuZHN0YXRlX3QgKioqKioqKioqKioqKioqKi8KKworY2xhc3MgX19nbXBfdXJhbmRvbWJfdmFsdWUgeyB9OworY2xhc3MgX19nbXBfdXJhbmRvbW1fdmFsdWUgeyB9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfdXJhbmRvbWJfdmFsdWU+Cit7Citwcml2YXRlOgorICBfX2dtcF9yYW5kc3RhdGVfc3RydWN0ICpzdGF0ZTsKKyAgbXBfYml0Y250X3QgYml0czsKK3B1YmxpYzoKKyAgX19nbXBfZXhwcihnbXBfcmFuZHN0YXRlX3QgcywgbXBfYml0Y250X3QgbCkgOiBzdGF0ZShzKSwgYml0cyhsKSB7IH0KKyAgdm9pZCBldmFsKG1wel9wdHIgeikgY29uc3QgeyBfX2dtcF9yYW5kX2Z1bmN0aW9uOjpldmFsKHosIHN0YXRlLCBiaXRzKTsgfQorICBtcF9iaXRjbnRfdCBnZXRfcHJlYygpIGNvbnN0IHsgcmV0dXJuIG1wZl9nZXRfZGVmYXVsdF9wcmVjKCk7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBfX2dtcF9leHByPG1wel90LCBfX2dtcF91cmFuZG9tbV92YWx1ZT4KK3sKK3ByaXZhdGU6CisgIF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3QgKnN0YXRlOworICBtcHpfY2xhc3MgcmFuZ2U7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoZ21wX3JhbmRzdGF0ZV90IHMsIGNvbnN0IG1wel9jbGFzcyAmeikgOiBzdGF0ZShzKSwgcmFuZ2UoeikgeyB9CisgIHZvaWQgZXZhbChtcHpfcHRyIHopIGNvbnN0CisgIHsgX19nbXBfcmFuZF9mdW5jdGlvbjo6ZXZhbCh6LCBzdGF0ZSwgcmFuZ2UuZ2V0X21wel90KCkpOyB9CisgIG1wX2JpdGNudF90IGdldF9wcmVjKCkgY29uc3QgeyByZXR1cm4gbXBmX2dldF9kZWZhdWx0X3ByZWMoKTsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIF9fZ21wX2V4cHI8bXBmX3QsIF9fZ21wX3VyYW5kb21iX3ZhbHVlPgoreworcHJpdmF0ZToKKyAgX19nbXBfcmFuZHN0YXRlX3N0cnVjdCAqc3RhdGU7CisgIG1wX2JpdGNudF90IGJpdHM7CitwdWJsaWM6CisgIF9fZ21wX2V4cHIoZ21wX3JhbmRzdGF0ZV90IHMsIG1wX2JpdGNudF90IGwpIDogc3RhdGUocyksIGJpdHMobCkgeyB9CisgIHZvaWQgZXZhbChtcGZfcHRyIGYpIGNvbnN0CisgIHsKKyAgICBfX2dtcF9yYW5kX2Z1bmN0aW9uOjpldmFsKGYsIHN0YXRlLAorCShiaXRzPjApID8gYml0cyA6IG1wZl9nZXRfcHJlYyhmKSk7CisgIH0KKyAgbXBfYml0Y250X3QgZ2V0X3ByZWMoKSBjb25zdAorICB7CisgICAgaWYgKGJpdHMgPT0gMCkKKyAgICAgIHJldHVybiBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBiaXRzOworICB9Cit9OworCitleHRlcm4gIkMiIHsKKyAgdHlwZWRlZiB2b2lkIF9fZ21wX3JhbmRpbml0X2RlZmF1bHRfdCAoZ21wX3JhbmRzdGF0ZV90KTsKKyAgdHlwZWRlZiB2b2lkIF9fZ21wX3JhbmRpbml0X2xjXzJleHBfdCAoZ21wX3JhbmRzdGF0ZV90LCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBfYml0Y250X3QpOworICB0eXBlZGVmIGludCBfX2dtcF9yYW5kaW5pdF9sY18yZXhwX3NpemVfdCAoZ21wX3JhbmRzdGF0ZV90LCBtcF9iaXRjbnRfdCk7Cit9CisKK2NsYXNzIGdtcF9yYW5kY2xhc3MKK3sKK3ByaXZhdGU6CisgIGdtcF9yYW5kc3RhdGVfdCBzdGF0ZTsKKworICAvLyBjb3B5IGNvbnN0cnVjdGlvbiBhbmQgYXNzaWdubWVudCBub3QgYWxsb3dlZAorICBnbXBfcmFuZGNsYXNzKGNvbnN0IGdtcF9yYW5kY2xhc3MgJik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGdtcF9yYW5kY2xhc3MgJik7CitwdWJsaWM6CisgIC8vIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcgorICBnbXBfcmFuZGNsYXNzKGdtcF9yYW5kYWxnX3QgYWxnLCB1bnNpZ25lZCBsb25nIGludCBzaXplKQorICB7CisgICAgc3dpdGNoIChhbGcpCisgICAgICB7CisgICAgICBjYXNlIEdNUF9SQU5EX0FMR19MQzogLy8gbm8gb3RoZXIgY2FzZXMgZm9yIG5vdworICAgICAgZGVmYXVsdDoKKwlnbXBfcmFuZGluaXQoc3RhdGUsIGFsZywgc2l6ZSk7CisJYnJlYWs7CisgICAgICB9CisgIH0KKworICAvLyBnbXBfcmFuZGluaXRfZGVmYXVsdAorICBnbXBfcmFuZGNsYXNzKF9fZ21wX3JhbmRpbml0X2RlZmF1bHRfdCogZikgeyBmKHN0YXRlKTsgfQorCisgIC8vIGdtcF9yYW5kaW5pdF9sY18yZXhwCisgIGdtcF9yYW5kY2xhc3MoX19nbXBfcmFuZGluaXRfbGNfMmV4cF90KiBmLAorCQltcHpfY2xhc3MgeiwgdW5zaWduZWQgbG9uZyBpbnQgbDEsIG1wX2JpdGNudF90IGwyKQorICB7IGYoc3RhdGUsIHouZ2V0X21wel90KCksIGwxLCBsMik7IH0KKworICAvLyBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplCisgIGdtcF9yYW5kY2xhc3MoX19nbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplX3QqIGYsCisJCW1wX2JpdGNudF90IHNpemUpCisgIHsKKyAgICBpZiAoZiAoc3RhdGUsIHNpemUpID09IDApCisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICB0aHJvdyBzdGQ6Omxlbmd0aF9lcnJvciAoImdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUiKTsKKyNlbHNlCisgICAgICB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjpsZW5ndGhfZXJyb3I6IGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemVcbiI7CisgICAgICAgIHN0ZDo6YWJvcnQoKTsKKyAgICAgIH0KKyNlbmRpZgorICB9CisKKyAgfmdtcF9yYW5kY2xhc3MoKSB7IGdtcF9yYW5kY2xlYXIoc3RhdGUpOyB9CisKKyAgLy8gaW5pdGlhbGl6ZQorICB2b2lkIHNlZWQoKTsgLy8gY2hvb3NlIGEgcmFuZG9tIHNlZWQgc29tZSB3YXkgKD8pCisgIHZvaWQgc2VlZCh1bnNpZ25lZCBsb25nIGludCBzKSB7IGdtcF9yYW5kc2VlZF91aShzdGF0ZSwgcyk7IH0KKyAgdm9pZCBzZWVkKGNvbnN0IG1wel9jbGFzcyAmeikgeyBnbXBfcmFuZHNlZWQoc3RhdGUsIHouZ2V0X21wel90KCkpOyB9CisKKyAgLy8gZ2V0IHJhbmRvbSBudW1iZXIKKyAgX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfdXJhbmRvbWJfdmFsdWU+IGdldF96X2JpdHMobXBfYml0Y250X3QgbCkKKyAgeyByZXR1cm4gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfdXJhbmRvbWJfdmFsdWU+KHN0YXRlLCBsKTsgfQorICBfX2dtcF9leHByPG1wel90LCBfX2dtcF91cmFuZG9tYl92YWx1ZT4gZ2V0X3pfYml0cyhjb25zdCBtcHpfY2xhc3MgJnopCisgIHsgcmV0dXJuIGdldF96X2JpdHMoei5nZXRfdWkoKSk7IH0KKyAgLy8gRklYTUU6IHouZ2V0X2JpdGNudF90KCkgPworCisgIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX3VyYW5kb21tX3ZhbHVlPiBnZXRfel9yYW5nZShjb25zdCBtcHpfY2xhc3MgJnopCisgIHsgcmV0dXJuIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX3VyYW5kb21tX3ZhbHVlPihzdGF0ZSwgeik7IH0KKworICBfX2dtcF9leHByPG1wZl90LCBfX2dtcF91cmFuZG9tYl92YWx1ZT4gZ2V0X2YobXBfYml0Y250X3QgcHJlYyA9IDApCisgIHsgcmV0dXJuIF9fZ21wX2V4cHI8bXBmX3QsIF9fZ21wX3VyYW5kb21iX3ZhbHVlPihzdGF0ZSwgcHJlYyk7IH0KK307CisKKworLyoqKioqKioqKioqKioqKiogU3BlY2lhbGl6ZSBzdGQ6Om51bWVyaWNfbGltaXRzICoqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBzdGQgeworICB0ZW1wbGF0ZSA8PiBjbGFzcyBudW1lcmljX2xpbWl0czxtcHpfY2xhc3M+CisgIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKyAgICBzdGF0aWMgbXB6X2NsYXNzIG1pbigpIHsgcmV0dXJuIG1wel9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wel9jbGFzcyBtYXgoKSB7IHJldHVybiBtcHpfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcHpfY2xhc3MgbG93ZXN0KCkgeyByZXR1cm4gbXB6X2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZGlnaXRzMTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOworICAgIHN0YXRpYyBtcHpfY2xhc3MgZXBzaWxvbigpIHsgcmV0dXJuIG1wel9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wel9jbGFzcyByb3VuZF9lcnJvcigpIHsgcmV0dXJuIG1wel9jbGFzcygpOyB9CisgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudDEwID0gMDsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OworICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworICAgIHN0YXRpYyBtcHpfY2xhc3MgaW5maW5pdHkoKSB7IHJldHVybiBtcHpfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcHpfY2xhc3MgcXVpZXRfTmFOKCkgeyByZXR1cm4gbXB6X2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgbXB6X2NsYXNzIHNpZ25hbGluZ19OYU4oKSB7IHJldHVybiBtcHpfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcHpfY2xhc3MgZGVub3JtX21pbigpIHsgcmV0dXJuIG1wel9jbGFzcygpOyB9CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX21vZHVsbyA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CisgIH07CisKKyAgdGVtcGxhdGUgPD4gY2xhc3MgbnVtZXJpY19saW1pdHM8bXBxX2NsYXNzPgorICB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisgICAgc3RhdGljIG1wcV9jbGFzcyBtaW4oKSB7IHJldHVybiBtcHFfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcHFfY2xhc3MgbWF4KCkgeyByZXR1cm4gbXBxX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgbXBxX2NsYXNzIGxvd2VzdCgpIHsgcmV0dXJuIG1wcV9jbGFzcygpOyB9CisgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgc3RhdGljIGNvbnN0IGludCByYWRpeCA9IDI7CisgICAgc3RhdGljIG1wcV9jbGFzcyBlcHNpbG9uKCkgeyByZXR1cm4gbXBxX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgbXBxX2NsYXNzIHJvdW5kX2Vycm9yKCkgeyByZXR1cm4gbXBxX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisgICAgc3RhdGljIG1wcV9jbGFzcyBpbmZpbml0eSgpIHsgcmV0dXJuIG1wcV9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wcV9jbGFzcyBxdWlldF9OYU4oKSB7IHJldHVybiBtcHFfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcHFfY2xhc3Mgc2lnbmFsaW5nX05hTigpIHsgcmV0dXJuIG1wcV9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wcV9jbGFzcyBkZW5vcm1fbWluKCkgeyByZXR1cm4gbXBxX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKKyAgfTsKKworICB0ZW1wbGF0ZSA8PiBjbGFzcyBudW1lcmljX2xpbWl0czxtcGZfY2xhc3M+CisgIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKyAgICBzdGF0aWMgbXBmX2NsYXNzIG1pbigpIHsgcmV0dXJuIG1wZl9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wZl9jbGFzcyBtYXgoKSB7IHJldHVybiBtcGZfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcGZfY2xhc3MgbG93ZXN0KCkgeyByZXR1cm4gbXBmX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZGlnaXRzMTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4YWN0ID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGludCByYWRpeCA9IDI7CisgICAgc3RhdGljIG1wZl9jbGFzcyBlcHNpbG9uKCkgeyByZXR1cm4gbXBmX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgbXBmX2NsYXNzIHJvdW5kX2Vycm9yKCkgeyByZXR1cm4gbXBmX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisgICAgc3RhdGljIG1wZl9jbGFzcyBpbmZpbml0eSgpIHsgcmV0dXJuIG1wZl9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wZl9jbGFzcyBxdWlldF9OYU4oKSB7IHJldHVybiBtcGZfY2xhc3MoKTsgfQorICAgIHN0YXRpYyBtcGZfY2xhc3Mgc2lnbmFsaW5nX05hTigpIHsgcmV0dXJuIG1wZl9jbGFzcygpOyB9CisgICAgc3RhdGljIG1wZl9jbGFzcyBkZW5vcm1fbWluKCkgeyByZXR1cm4gbXBmX2NsYXNzKCk7IH0KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF9pbmRldGVybWluYXRlOworICB9OworfQorCisKKy8qKioqKioqKioqKioqKioqICN1bmRlZiBhbGwgcHJpdmF0ZSBtYWNyb3MgKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIF9fR01QUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SCisjdW5kZWYgX19HTVBOX0RFQ0xBUkVfQ09NUE9VTkRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUF9ERUNMQVJFX0NPTVBPVU5EX09QRVJBVE9SCisjdW5kZWYgX19HTVBfREVDTEFSRV9DT01QT1VORF9PUEVSQVRPUl9VSQorI3VuZGVmIF9fR01QX0RFQ0xBUkVfSU5DUkVNRU5UX09QRVJBVE9SCisjdW5kZWYgX19HTVBYWF9ERUZJTkVfQVJJVEhNRVRJQ19DT05TVFJVQ1RPUlMKKyN1bmRlZiBfX0dNUFhYX0RFRklORV9BUklUSE1FVElDX0FTU0lHTk1FTlRTCisKKyN1bmRlZiBfX0dNUFpRX0RFRklORV9FWFBSCisKKyN1bmRlZiBfX0dNUF9ERUZJTkVfVU5BUllfRlVOQ1RJT05fMQorI3VuZGVmIF9fR01QX0RFRklORV9VTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QX0RFRklORV9VTkFSWV9UWVBFX0ZVTkNUSU9OCisKKyN1bmRlZiBfX0dNUFBfREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QTk5fREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QTlNfREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QTlVfREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QTkRfREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QTkxEX0RFRklORV9CSU5BUllfRlVOQ1RJT04KKyN1bmRlZiBfX0dNUE5fREVGSU5FX0JJTkFSWV9GVU5DVElPTgorI3VuZGVmIF9fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT04KKworI3VuZGVmIF9fR01QX0RFRklORV9CSU5BUllfRlVOQ1RJT05fVUkKKworI3VuZGVmIF9fR01QUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04KKyN1bmRlZiBfX0dNUE5OX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTgorI3VuZGVmIF9fR01QTlNfREVGSU5FX0JJTkFSWV9UWVBFX0ZVTkNUSU9OCisjdW5kZWYgX19HTVBOVV9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04KKyN1bmRlZiBfX0dNUE5EX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTgorI3VuZGVmIF9fR01QTkxEX0RFRklORV9CSU5BUllfVFlQRV9GVU5DVElPTgorI3VuZGVmIF9fR01QTl9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04KKyN1bmRlZiBfX0dNUF9ERUZJTkVfQklOQVJZX1RZUEVfRlVOQ1RJT04KKworI3VuZGVmIF9fR01QWl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKworI3VuZGVmIF9fR01QUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUE5OX0RFRklORV9DT01QT1VORF9PUEVSQVRPUgorI3VuZGVmIF9fR01QTlNfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SCisjdW5kZWYgX19HTVBOVV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUE5EX0RFRklORV9DT01QT1VORF9PUEVSQVRPUgorI3VuZGVmIF9fR01QTkxEX0RFRklORV9DT01QT1VORF9PUEVSQVRPUgorI3VuZGVmIF9fR01QTl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKworI3VuZGVmIF9fR01QUV9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUEZfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SCisKKyN1bmRlZiBfX0dNUF9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkKKyN1bmRlZiBfX0dNUFpfREVGSU5FX0NPTVBPVU5EX09QRVJBVE9SX1VJCisjdW5kZWYgX19HTVBRX0RFRklORV9DT01QT1VORF9PUEVSQVRPUl9VSQorI3VuZGVmIF9fR01QRl9ERUZJTkVfQ09NUE9VTkRfT1BFUkFUT1JfVUkKKworI3VuZGVmIF9fR01QX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IKKyN1bmRlZiBfX0dNUFpfREVGSU5FX0lOQ1JFTUVOVF9PUEVSQVRPUgorI3VuZGVmIF9fR01QUV9ERUZJTkVfSU5DUkVNRU5UX09QRVJBVE9SCisjdW5kZWYgX19HTVBGX0RFRklORV9JTkNSRU1FTlRfT1BFUkFUT1IKKworI3VuZGVmIF9fR01QWFhfQ09OU1RBTlRfVFJVRQorI3VuZGVmIF9fR01QWFhfQ09OU1RBTlQKKworI2VuZGlmIC8qIF9fR01QX1BMVVNQTFVTX18gKi8KZGlmZiAtLWdpdCBhL2ludmFsaWQuYyBiL2ludmFsaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDllYWIyCi0tLSAvZGV2L251bGwKKysrIGIvaW52YWxpZC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIF9fZ21wX2ludmFsaWRfb3BlcmF0aW9uIC0tIGludmFsaWQgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgLyogZm9yIGdldHBpZCAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEluY2lkZW50YWxseSwga2lsbCBpcyBub3QgYXZhaWxhYmxlIG9uIG1pbmd3LCBidXQgdGhhdCdzIG9rLCBpdCBoYXMgcmFpc2UKKyAgIGFuZCB3ZSdsbCBiZSB1c2luZyB0aGF0LiAgKi8KKyNpZiAhIEhBVkVfUkFJU0UKKyNkZWZpbmUgcmFpc2Uoc2lnKSAgIGtpbGwgKGdldHBpZCgpLCBzaWcpCisjZW5kaWYKKworCisvKiBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiBpcyBmb3IgYW4gaW52YWxpZCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb24sIGxpa2UKKyAgIG1wel9zZXRfZCBvbiBhIE5hTiBvciBJbmYuICBJdCdzIGRvbmUgYXMgYSBzdWJyb3V0aW5lIHRvIG1pbmltaXplIGNvZGUgaW4KKyAgIHBsYWNlcyByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KKworICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKSBpcyBub3QgdXNlZCBoZXJlLCBzaW5jZSB1bmZvcnR1bmF0ZWx5IG9uIG1vc3QKKyAgIHN5c3RlbXMgaXQgd291bGQgcmVxdWlyZSBsaWJtLgorCisgICBBbHRlcm5hdGl2ZXM6CisKKyAgIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGNoZWNrIHdoZXRoZXIgYSBoYXJkd2FyZSAiaW52YWxpZCBvcGVyYXRpb24iIHRyYXAKKyAgIGlzIGVuYWJsZWQgb3Igbm90IGJlZm9yZSByYWlzaW5nIGEgc2lnbmFsLiAgVGhpcyB3b3VsZCByZXF1aXJlIGFsbAorICAgY2FsbGVycyB0byBiZSBwcmVwYXJlZCB0byBjb250aW51ZSB3aXRoIHNvbWUgYm9ndXMgcmVzdWx0LiAgQm9ndXMgcmV0dXJucworICAgYXJlIGJhZCwgYnV0IHByZXN1bWFibHkgYW4gYXBwbGljYXRpb24gZGlzYWJsaW5nIHRoZSB0cmFwIGlzIHByZXBhcmVkIGZvcgorICAgdGhhdC4KKworICAgT24gc29tZSBzeXN0ZW1zIChlZy4gQlNEKSB0aGUgc2lnbmFsIGhhbmRsZXIgY2FuIGZpbmQgb3V0IHRoZSByZWFzb24gZm9yCisgICBhIFNJR0ZQRSAob3ZlcmZsb3csIGludmFsaWQsIGRpdi1ieS16ZXJvLCBldGMpLiAgUGVyaGFwcyB3ZSBjb3VsZCBnZXQKKyAgIHRoYXQgaW50byBvdXIgcmFpc2UgdG9vLgorCisgICBpMzg2IEdMSUJDIGltcGxlbWVudHMgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKSB3aXRoIGFuIGFzbSBmZGl2IDAvMC4KKyAgIFRoYXQgd291bGQgYm90aCByZXNwZWN0IHRoZSBleGNlcHRpb25zIG1hc2sgYW5kIGdpdmUgYSByZWFzb24gY29kZSBpbiBhCisgICBCU0Qgc2lnbmFsLiAgKi8KKwordm9pZAorX19nbXBfaW52YWxpZF9vcGVyYXRpb24gKHZvaWQpCit7CisgIHJhaXNlIChTSUdGUEUpOworICBhYm9ydCAoKTsKK30KZGlmZiAtLWdpdCBhL2xvbmdsb25nLmggYi9sb25nbG9uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWMzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9sb25nbG9uZy5oCkBAIC0wLDAgKzEsMjI4OSBAQAorLyogbG9uZ2xvbmcuaCAtLSBkZWZpbml0aW9ucyBmb3IgbWl4ZWQgc2l6ZSAzMi82NCBiaXQgYXJpdGhtZXRpYy4KKworQ29weXJpZ2h0IDE5OTEtMTk5NCwgMTk5NiwgMTk5NywgMTk5OS0yMDA1LCAyMDA3LTIwMDksIDIwMTEtMjAyMCBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIFlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlOgorCisgICBVV3R5cGUgLS0gQW4gdW5zaWduZWQgdHlwZSwgZGVmYXVsdCB0eXBlIGZvciBvcGVyYXRpb25zICh0eXBpY2FsbHkgYSAid29yZCIpCisgICBVSFd0eXBlIC0tIEFuIHVuc2lnbmVkIHR5cGUsIGF0IGxlYXN0IGhhbGYgdGhlIHNpemUgb2YgVVd0eXBlCisgICBVRFd0eXBlIC0tIEFuIHVuc2lnbmVkIHR5cGUsIGF0IGxlYXN0IHR3aWNlIGFzIGxhcmdlIGEgVVd0eXBlCisgICBXX1RZUEVfU0laRSAtLSBzaXplIGluIGJpdHMgb2YgVVd0eXBlCisKKyAgIFNJdHlwZSwgVVNJdHlwZSAtLSBTaWduZWQgYW5kIHVuc2lnbmVkIDMyIGJpdCB0eXBlcworICAgREl0eXBlLCBVREl0eXBlIC0tIFNpZ25lZCBhbmQgdW5zaWduZWQgNjQgYml0IHR5cGVzCisKKyAgIE9uIGEgMzIgYml0IG1hY2hpbmUgVVd0eXBlIHNob3VsZCB0eXBpY2FsbHkgYmUgVVNJdHlwZTsKKyAgIG9uIGEgNjQgYml0IG1hY2hpbmUsIFVXdHlwZSBzaG91bGQgdHlwaWNhbGx5IGJlIFVESXR5cGUuCisKKyAgIE9wdGlvbmFsbHksIGRlZmluZToKKworICAgTE9OR0xPTkdfU1RBTkRBTE9ORSAtLSBBdm9pZCBjb2RlIHRoYXQgbmVlZHMgbWFjaGluZS1kZXBlbmRlbnQgc3VwcG9ydCBmaWxlcworICAgTk9fQVNNIC0tIERpc2FibGUgaW5saW5lIGFzbQorCisKKyAgIENBVVRJT04hICBVc2luZyB0aGlzIHZlcnNpb24gb2YgbG9uZ2xvbmcuaCBvdXRzaWRlIG9mIEdNUCBpcyBub3Qgc2FmZS4gIFlvdQorICAgbmVlZCB0byBpbmNsdWRlIGdtcC5oIGFuZCBnbXAtaW1wbC5oLCBvciBjZXJ0YWluIHRoaW5ncyBtaWdodCBub3Qgd29yayBhcworICAgZXhwZWN0ZWQuCisqLworCisjZGVmaW5lIF9fQklUUzQgKFdfVFlQRV9TSVpFIC8gNCkKKyNkZWZpbmUgX19sbF9CICgoVVd0eXBlKSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQorI2RlZmluZSBfX2xsX2xvd3BhcnQodCkgKChVV3R5cGUpICh0KSAmIChfX2xsX0IgLSAxKSkKKyNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKFVXdHlwZSkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQorCisvKiBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIG5vIHVuZGVzaXJhYmxlIHNoYXJpbmcgYmV0d2VlbiBkaWZmZXJlbnQgbGlicmFyaWVzCisgICB0aGF0IHVzZSB0aGlzIGZpbGUgdGFrZXMgcGxhY2UuICAqLworI2lmbmRlZiBfX01QTgorI2RlZmluZSBfX01QTih4KSBfXyMjeAorI2VuZGlmCisKKy8qIERlZmluZSBhdXhpbGlhcnkgYXNtIG1hY3Jvcy4KKworICAgMSkgdW11bF9wcG1tKGhpZ2hfcHJvZCwgbG93X3Byb2QsIG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkgbXVsdGlwbGllcyB0d28KKyAgIFVXdHlwZSBpbnRlZ2VycyBNVUxUSVBMSUVSIGFuZCBNVUxUSVBMSUNBTkQsIGFuZCBnZW5lcmF0ZXMgYSB0d28gVVd0eXBlCisgICB3b3JkIHByb2R1Y3QgaW4gSElHSF9QUk9EIGFuZCBMT1dfUFJPRC4KKworICAgMikgX191bXVsc2lkaTMoYSxiKSBtdWx0aXBsaWVzIHR3byBVV3R5cGUgaW50ZWdlcnMgQSBhbmQgQiwgYW5kIHJldHVybnMgYQorICAgVURXdHlwZSBwcm9kdWN0LiAgVGhpcyBpcyBqdXN0IGEgdmFyaWFudCBvZiB1bXVsX3BwbW0uCisKKyAgIDMpIHVkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0b3IsIGxvd19udW1lcmF0b3IsCisgICBkZW5vbWluYXRvcikgZGl2aWRlcyBhIFVEV3R5cGUsIGNvbXBvc2VkIGJ5IHRoZSBVV3R5cGUgaW50ZWdlcnMKKyAgIEhJR0hfTlVNRVJBVE9SIGFuZCBMT1dfTlVNRVJBVE9SLCBieSBERU5PTUlOQVRPUiBhbmQgcGxhY2VzIHRoZSBxdW90aWVudAorICAgaW4gUVVPVElFTlQgYW5kIHRoZSByZW1haW5kZXIgaW4gUkVNQUlOREVSLiAgSElHSF9OVU1FUkFUT1IgbXVzdCBiZSBsZXNzCisgICB0aGFuIERFTk9NSU5BVE9SIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4gIElmLCBpbiBhZGRpdGlvbiwgdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsIHRoZW4gdGhlIHByZS1wcm9jZXNzb3Igc3ltYm9sCisgICBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgorCisgICA0KSBzZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAorICAgZGVub21pbmF0b3IpLiAgTGlrZSB1ZGl2X3Fybm5kIGJ1dCB0aGUgbnVtYmVycyBhcmUgc2lnbmVkLiAgVGhlIHF1b3RpZW50CisgICBpcyByb3VuZGVkIHRvd2FyZHMgMC4KKworICAgNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20gdGhlCisgICBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCBpbiB0aGUgVVd0eXBlIFguICBUaGlzIGlzIHRoZSBudW1iZXIgb2YKKyAgIHN0ZXBzIFggbmVlZHMgdG8gYmUgc2hpZnRlZCBsZWZ0IHRvIHNldCB0aGUgbXNiLiAgVW5kZWZpbmVkIGZvciBYID09IDAsCisgICB1bmxlc3MgdGhlIHN5bWJvbCBDT1VOVF9MRUFESU5HX1pFUk9TXzAgaXMgZGVmaW5lZCB0byBzb21lIHZhbHVlLgorCisgICA2KSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkgbGlrZSBjb3VudF9sZWFkaW5nX3plcm9zLCBidXQgY291bnRzCisgICBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBlbmQuCisKKyAgIDcpIGFkZF9zc2FhYWEoaGlnaF9zdW0sIGxvd19zdW0sIGhpZ2hfYWRkZW5kXzEsIGxvd19hZGRlbmRfMSwKKyAgIGhpZ2hfYWRkZW5kXzIsIGxvd19hZGRlbmRfMikgYWRkcyB0d28gVVd0eXBlIGludGVnZXJzLCBjb21wb3NlZCBieQorICAgSElHSF9BRERFTkRfMSBhbmQgTE9XX0FEREVORF8xLCBhbmQgSElHSF9BRERFTkRfMiBhbmQgTE9XX0FEREVORF8yCisgICByZXNwZWN0aXZlbHkuICBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbiBISUdIX1NVTSBhbmQgTE9XX1NVTS4gIE92ZXJmbG93CisgICAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsIGFuZCBpcyBsb3N0LgorCisgICA4KSBzdWJfZGRtbXNzKGhpZ2hfZGlmZmVyZW5jZSwgbG93X2RpZmZlcmVuY2UsIGhpZ2hfbWludWVuZCwgbG93X21pbnVlbmQsCisgICBoaWdoX3N1YnRyYWhlbmQsIGxvd19zdWJ0cmFoZW5kKSBzdWJ0cmFjdHMgdHdvIHR3by13b3JkIFVXdHlwZSBpbnRlZ2VycywKKyAgIGNvbXBvc2VkIGJ5IEhJR0hfTUlOVUVORF8xIGFuZCBMT1dfTUlOVUVORF8xLCBhbmQgSElHSF9TVUJUUkFIRU5EXzIgYW5kCisgICBMT1dfU1VCVFJBSEVORF8yIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfRElGRkVSRU5DRQorICAgYW5kIExPV19ESUZGRVJFTkNFLiAgT3ZlcmZsb3cgKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLAorICAgYW5kIGlzIGxvc3QuCisKKyAgIElmIGFueSBvZiB0aGVzZSBtYWNyb3MgYXJlIGxlZnQgdW5kZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgQ1BVLAorICAgQyBtYWNyb3MgYXJlIHVzZWQuCisKKworICAgTm90ZXM6CisKKyAgIEZvciBhZGRfc3NhYWFhIHRoZSB0d28gaGlnaCBhbmQgdHdvIGxvdyBhZGRlbmRzIGNhbiBib3RoIGNvbW11dGUsIGJ1dAorICAgdW5mb3J0dW5hdGVseSBnY2Mgb25seSBzdXBwb3J0cyBvbmUgIiUiIGNvbW11dGF0aXZlIGluIGVhY2ggYXNtIGJsb2NrLgorICAgVGhpcyBoYXMgYWx3YXlzIGJlZW4gc28gYnV0IGlzIG9ubHkgZG9jdW1lbnRlZCBpbiByZWNlbnQgdmVyc2lvbnMKKyAgIChlZy4gcHJlLXJlbGVhc2UgMy4zKS4gIEhhdmluZyB0d28gb3IgbW9yZSAiJSJzIGNhbiBjYXVzZSBhbiBpbnRlcm5hbAorICAgY29tcGlsZXIgZXJyb3IgaW4gY2VydGFpbiByYXJlIGNpcmN1bXN0YW5jZXMuCisKKyAgIEFwcGFyZW50bHkgaXQgd2FzIG9ubHkgdGhlIGxhc3QgIiUiIHRoYXQgd2FzIGV2ZXIgYWN0dWFsbHkgcmVzcGVjdGVkLCBzbworICAgdGhlIGNvZGUgaGFzIGJlZW4gdXBkYXRlZCB0byBsZWF2ZSBqdXN0IHRoYXQuICBDbGVhcmx5IHRoZXJlJ3MgYSBmcmVlCisgICBjaG9pY2Ugd2hldGhlciBoaWdoIG9yIGxvdyBzaG91bGQgZ2V0IGl0LCBpZiB0aGVyZSdzIGEgcmVhc29uIHRvIGZhdm91cgorICAgb25lIG92ZXIgdGhlIG90aGVyLiAgQWxzbyBvYnZpb3VzbHkgd2hlbiB0aGUgY29uc3RyYWludHMgb24gdGhlIHR3bworICAgb3BlcmFuZHMgYXJlIGlkZW50aWNhbCB0aGVyZSdzIG5vIGJlbmVmaXQgdG8gdGhlIHJlbG9hZGVyIGluIGFueSAiJSIgYXQKKyAgIGFsbC4KKworICAgKi8KKworLyogVGhlIENQVXMgY29tZSBpbiBhbHBoYWJldGljYWwgb3JkZXIgYmVsb3cuCisKKyAgIFBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgbW9yZSBDUFVzIGhlcmUsIG9yIGltcHJvdmUgdGhlIGN1cnJlbnQgc3VwcG9ydAorICAgZm9yIHRoZSBDUFVzIGJlbG93ISAgKi8KKworCisvKiBjb3VudF9sZWFkaW5nX3plcm9zX2djY19jbHogaXMgY291bnRfbGVhZGluZ196ZXJvcyBpbXBsZW1lbnRlZCB3aXRoIGdjYworICAgMy40IF9fYnVpbHRpbl9jbHpsIG9yIF9fYnVpbHRpbl9jbHpsbCwgYWNjb3JkaW5nIHRvIG91ciBsaW1iIHNpemUuCisgICBTaW1pbGFybHkgY291bnRfdHJhaWxpbmdfemVyb3NfZ2NjX2N0eiB1c2luZyBfX2J1aWx0aW5fY3R6bCBvcgorICAgX19idWlsdGluX2N0emxsLgorCisgICBUaGVzZSBidWlsdGlucyBhcmUgb25seSB1c2VkIHdoZW4gd2UgY2hlY2sgd2hhdCBjb2RlIGNvbWVzIG91dCwgb24gc29tZQorICAgY2hpcHMgdGhleSdyZSBtZXJlbHkgbGliZ2NjIGNhbGxzLCB3aGVyZSB3ZSB3aWxsIGluc3RlYWQgd2FudCBhbiBpbmxpbmUKKyAgIGluIHRoYXQgY2FzZSAoZWl0aGVyIGFzbSBvciBnZW5lcmljIEMpLgorCisgICBUaGVzZSBidWlsdGlucyBhcmUgYmV0dGVyIHRoYW4gYW4gYXNtIGJsb2NrIG9mIHRoZSBzYW1lIGluc24sIHNpbmNlIGFuCisgICBhc20gYmxvY2sgZG9lc24ndCBnaXZlIGdjYyBhbnkgaW5mb3JtYXRpb24gYWJvdXQgc2NoZWR1bGluZyBvciByZXNvdXJjZQorICAgdXNhZ2UuICBXZSBrZWVwIGFuIGFzbSBibG9jayBmb3IgdXNlIG9uIHByaW9yIHZlcnNpb25zIG9mIGdjYyB0aG91Z2guCisKKyAgIEZvciByZWZlcmVuY2UsIF9fYnVpbHRpbl9mZnMgZXhpc3RlZCBpbiBnY2MgcHJpb3IgdG8gX19idWlsdGluX2NseiwgYnV0CisgICBpdCdzIG5vdCB1c2VkIChmb3IgY291bnRfbGVhZGluZ196ZXJvcykgYmVjYXVzZSBpdCBnZW5lcmFsbHkgZ2l2ZXMgZXh0cmEKKyAgIGNvZGUgdG8gZW5zdXJlIHRoZSByZXN1bHQgaXMgMCB3aGVuIHRoZSBpbnB1dCBpcyAwLCB3aGljaCB3ZSBkb24ndCBuZWVkCisgICBvciB3YW50LiAgKi8KKworI2lmZGVmIF9MT05HX0xPTkdfTElNQgorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zX2djY19jbHooY291bnQseCkJXAorICBkbyB7CQkJCQkJXAorICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQlcCisgICAgKGNvdW50KSA9IF9fYnVpbHRpbl9jbHpsbCAoeCk7CQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zX2djY19jbHooY291bnQseCkJXAorICBkbyB7CQkJCQkJXAorICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQlcCisgICAgKGNvdW50KSA9IF9fYnVpbHRpbl9jbHpsICh4KTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgX0xPTkdfTE9OR19MSU1CCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zX2djY19jdHooY291bnQseCkJXAorICBkbyB7CQkJCQkJXAorICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQlcCisgICAgKGNvdW50KSA9IF9fYnVpbHRpbl9jdHpsbCAoeCk7CQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvc19nY2NfY3R6KGNvdW50LHgpCVwKKyAgZG8gewkJCQkJCVwKKyAgICBBU1NFUlQgKCh4KSAhPSAwKTsJCQkJXAorICAgIChjb3VudCkgPSBfX2J1aWx0aW5fY3R6bCAoeCk7CQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBGSVhNRTogVGhlIG1hY3JvcyB1c2luZyBleHRlcm5hbCByb3V0aW5lcyBsaWtlIF9fTVBOKGNvdW50X2xlYWRpbmdfemVyb3MpCisgICBkb24ndCBuZWVkIHRvIGJlIHVuZGVyICFOT19BU00gKi8KKyNpZiAhIGRlZmluZWQgKE5PX0FTTSkKKworI2lmIGRlZmluZWQgKF9fYWxwaGEpICYmIFdfVFlQRV9TSVpFID09IDY0CisvKiBNb3N0IGFscGhhLWJhc2VkIG1hY2hpbmVzLCBleGNlcHQgQ3JheSBzeXN0ZW1zLiAqLworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorI2lmIF9fR01QX0dOVUNfUFJFUkVRICgzLDMpCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIChwaCkgPSBfX2J1aWx0aW5fYWxwaGFfdW11bGggKF9fbTAsIF9fbTEpOwkJCQlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgidW11bGggJXIxLCUyLCUwIgkJCQkJCVwKKwkgICAgIDogIj1yIiAocGgpCQkJCQkJXAorCSAgICAgOiAiJXJKIiAoX19tMCksICJySSIgKF9fbTEpKTsJCQkJXAorICAgIChwbCkgPSBfX20wICogX19tMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjZWxzZSAvKiAhIF9fR05VQ19fICovCisjaW5jbHVkZSA8bWFjaGluZS9idWlsdGlucy5oPgorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICAocGgpID0gX19VTVVMSCAoX19tMCwgX19tMSk7CQkJCQlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVXdHlwZSBfX2RpOwkJCQkJCQlcCisgICAgX19kaSA9IF9fTVBOKGludmVydF9saW1iKSAoZCk7CQkJCQlcCisgICAgdWRpdl9xcm5uZF9wcmVpbnYgKHEsIHIsIG4xLCBuMCwgZCwgX19kaSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVURJVl9QUkVJTlZfQUxXQVlTICAxCisjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworCisvKiBjbHpfdGFiIGlzIHJlcXVpcmVkIGluIGFsbCBjb25maWd1cmF0aW9ucywgc2luY2UgbXBuL2FscGhhL2NudGx6LmFzbQorICAgYWx3YXlzIGdvZXMgaW50byBsaWJnbXAuc28sIGV2ZW4gd2hlbiBub3QgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfTkVFRF9DTFpfVEFCCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgSEFWRV9IT1NUX0NQVV9hbHBoYV9DSVgKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhDT1VOVCxYKSBcCisgIF9fYXNtX18oImN0bHogJTEsJTAiIDogIj1yIihDT1VOVCkgOiAiciIoWCkpCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKENPVU5ULFgpIFwKKyAgX19hc21fXygiY3R0eiAlMSwlMCIgOiAiPXIiKENPVU5UKSA6ICJyIihYKSkKKyNlbmRpZiAvKiBjbHovY3R6IHVzaW5nIGNpeCAqLworCisjaWYgISBkZWZpbmVkIChjb3VudF9sZWFkaW5nX3plcm9zKQkJCQlcCisgICYmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKExPTkdMT05HX1NUQU5EQUxPTkUpCisvKiBBTFBIQV9DTVBCR0VfMCBnaXZlcyAiY21wYmdlICQzMSxzcmMsZHN0IiwgaWUuIHRlc3Qgc3JjIGJ5dGVzID09IDAuCisgICAiJDMxIiBpcyB3cml0dGVuIGV4cGxpY2l0bHkgaW4gdGhlIGFzbSwgc2luY2UgYW4gInIiIGNvbnN0cmFpbnQgd29uJ3QKKyAgIHNlbGVjdCByZWcgMzEuICBUaGVyZSBzZWVtcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0ICJyMzEiIHN5bnRheCBmb3IgY3JheSwKKyAgIHNpbmNlIGdjYyBpdHNlbGYgKHByZS1yZWxlYXNlIDMuNCkgZW1pdHMganVzdCAkMzEgaW4gdmFyaW91cyBwbGFjZXMuCSAqLworI2RlZmluZSBBTFBIQV9DTVBCR0VfMChkc3QsIHNyYykJCQkJCVwKKyAgZG8geyBhc20gKCJjbXBiZ2UgJDMxLCAlMSwgJTAiIDogIj1yIiAoZHN0KSA6ICJyIiAoc3JjKSk7IH0gd2hpbGUgKDApCisvKiBaZXJvIGJ5dGVzIGFyZSB0dXJuZWQgaW50byBiaXRzIHdpdGggY21wYmdlLCBhIF9fY2x6X3RhYiBsb29rdXAgY291bnRzCisgICB0aGVtLCBsb2NhdGluZyB0aGUgaGlnaGVzdCBub24temVybyBieXRlLiAgQSBzZWNvbmQgX19jbHpfdGFiIGxvb2t1cAorICAgY291bnRzIHRoZSBsZWFkaW5nIHplcm8gYml0cyBpbiB0aGF0IGJ5dGUsIGdpdmluZyB0aGUgcmVzdWx0LiAgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgIF9fY2x6X19iLCBfX2Nsel9fYywgX19jbHpfX3ggPSAoeCk7CQkJCVwKKyAgICBBTFBIQV9DTVBCR0VfMCAoX19jbHpfX2IsICBfX2Nsel9feCk7CSAgICAvKiB6ZXJvIGJ5dGVzICovCVwKKyAgICBfX2Nsel9fYiA9IF9fY2x6X3RhYiBbKF9fY2x6X19iID4+IDEpIF4gMHg3Rl07ICAvKiA4IHRvIDEgYnl0ZSAqLwlcCisgICAgX19jbHpfX2IgPSBfX2Nsel9fYiAqIDggLSA3OwkJICAgIC8qIDU3IHRvIDEgc2hpZnQgKi8gXAorICAgIF9fY2x6X194ID4+PSBfX2Nsel9fYjsJCQkJCQlcCisgICAgX19jbHpfX2MgPSBfX2Nsel90YWIgW19fY2x6X194XTsJCSAgICAvKiA4IHRvIDEgYml0ICovCVwKKyAgICBfX2Nsel9fYiA9IDY1IC0gX19jbHpfX2I7CQkJCQkJXAorICAgIChjb3VudCkgPSBfX2Nsel9fYiAtIF9fY2x6X19jOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TX05FRURfQ0xaX1RBQgorI2VuZGlmIC8qIGNseiB1c2luZyBjbXBiZ2UgKi8KKworI2lmICEgZGVmaW5lZCAoY291bnRfbGVhZGluZ196ZXJvcykgJiYgISBkZWZpbmVkIChMT05HTE9OR19TVEFOREFMT05FKQorI2lmIEhBVkVfQVRUUklCVVRFX0NPTlNUCitsb25nIF9fTVBOKGNvdW50X2xlYWRpbmdfemVyb3MpIChVREl0eXBlKSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKKyNlbHNlCitsb25nIF9fTVBOKGNvdW50X2xlYWRpbmdfemVyb3MpIChVREl0eXBlKTsKKyNlbmRpZgorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgICgoY291bnQpID0gX19NUE4oY291bnRfbGVhZGluZ196ZXJvcykgKHgpKQorI2VuZGlmIC8qIGNseiB1c2luZyBtcG4gKi8KKyNlbmRpZiAvKiBfX2FscGhhICovCisKKyNpZiBkZWZpbmVkIChfX0FWUikgJiYgV19UWVBFX1NJWkUgPT0gOAorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bnNpZ25lZCBzaG9ydCBfX3AgPSAodW5zaWduZWQgc2hvcnQpIChtMCkgKiAobTEpOwkJCVwKKyAgICAocGgpID0gX19wID4+IDg7CQkJCQkJCVwKKyAgICAocGwpID0gX19wOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIEFWUiAqLworCisjaWYgZGVmaW5lZCAoX0NSQVkpICYmIFdfVFlQRV9TSVpFID09IDY0CisjaW5jbHVkZSA8aW50cmluc2ljcy5oPgorI2RlZmluZSBVRElWX1BSRUlOVl9BTFdBWVMgIDEKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKK2xvbmcgX19NUE4oY291bnRfbGVhZGluZ196ZXJvcykgKFVESXR5cGUpOworI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgICgoY291bnQpID0gX2xlYWR6ICgoVVd0eXBlKSAoeCkpKQorI2lmIGRlZmluZWQgKF9DUkFZSUVFRSkJCS8qIEkuZS4sIENyYXkgVDkwL2llZWUsIFQzRCwgYW5kIFQzRSAqLworI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICAocGgpID0gX2ludF9tdWx0X3VwcGVyIChfX20wLCBfX20xKTsJCQkJXAorICAgIChwbCkgPSBfX20wICogX19tMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsgVVd0eXBlIF9fZGk7CQkJCQkJCVwKKyAgICBfX2RpID0gX19NUE4oaW52ZXJ0X2xpbWIpIChkKTsJCQkJCVwKKyAgICB1ZGl2X3Fybm5kX3ByZWludiAocSwgciwgbjEsIG4wLCBkLCBfX2RpKTsJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIExPTkdMT05HX1NUQU5EQUxPTkUgKi8KKyNlbmRpZiAvKiBfQ1JBWUlFRUUgKi8KKyNlbmRpZiAvKiBfQ1JBWSAqLworCisjaWYgZGVmaW5lZCAoX19pYTY0KSAmJiBXX1RZUEVfU0laRSA9PSA2NAorLyogVGhpcyBmb3JtIGVuY291cmFnZXMgZ2NjIChwcmUtcmVsZWFzZSAzLjQgYXQgbGVhc3QpIHRvIGVtaXQgcHJlZGljYXRlZAorICAgInN1YiByPXIsciIgYW5kICJzdWIgcj1yLHIsMSIsIGdpdmluZyBhIDIgY3ljbGUgbGF0ZW5jeS4gIFRoZSBnZW5lcmljCisgICBjb2RlIHVzaW5nICJhbDxibCIgYXJpdGhtZXRpY2FsbHkgY29tZXMgb3V0IG1ha2luZyBhbiBhY3R1YWwgMCBvciAxIGluIGEKKyAgIHJlZ2lzdGVyLCB3aGljaCB0YWtlcyBhbiBleHRyYSBjeWNsZS4gICovCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgICAgICBcCisgIGRvIHsJCQkJCQlcCisgICAgVVd0eXBlIF9feDsJCQkJCVwKKyAgICBfX3ggPSAoYWwpIC0gKGJsKTsJCQkJXAorICAgIGlmICgoYWwpIDwgKGJsKSkJCQkJXAorICAgICAgKHNoKSA9IChhaCkgLSAoYmgpIC0gMTsJCQlcCisgICAgZWxzZQkJCQkJXAorICAgICAgKHNoKSA9IChhaCkgLSAoYmgpOwkJCVwKKyAgICAoc2wpID0gX194OwkJCQkJXAorICB9IHdoaWxlICgwKQorI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpCisvKiBEbyBib3RoIHByb2R1Y3QgcGFydHMgaW4gYXNzZW1ibHksIHNpbmNlIHRoYXQgZ2l2ZXMgYmV0dGVyIGNvZGUgd2l0aAorICAgYWxsIGdjYyB2ZXJzaW9ucy4gIFNvbWUgY2FsbGVycyB3aWxsIGp1c3QgdXNlIHRoZSB1cHBlciBwYXJ0LCBhbmQgaW4KKyAgIHRoYXQgc2l0dWF0aW9uIHdlIHdhc3RlIGFuIGluc3RydWN0aW9uLCBidXQgbm90IGFueSBjeWNsZXMuICAqLworI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgICBfX2FzbV9fICgieG1hLmh1ICUwID0gJTIsICUzLCBmMFxuXHR4bWEubCAlMSA9ICUyLCAlMywgZjAiCQlcCisJICAgICA6ICI9JmYiIChwaCksICI9ZiIgKHBsKQkJCQkJXAorCSAgICAgOiAiZiIgKG0wKSwgImYiIChtMSkpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX3ggPSAoeCksIF95LCBfYSwgX2M7CQkJCQlcCisgICAgX19hc21fXyAoIm11eDEgJTAgPSAlMSwgQHJldiIgOiAiPXIiIChfeSkgOiAiciIgKF94KSk7CQlcCisgICAgX19hc21fXyAoImN6eDEubCAlMCA9ICUxIiA6ICI9ciIgKF9hKSA6ICJyIiAoLV95IHwgX3kpKTsJCVwKKyAgICBfYyA9IChfYSAtIDEpIDw8IDM7CQkJCQkJCVwKKyAgICBfeCA+Pj0gX2M7CQkJCQkJCQlcCisgICAgaWYgKF94ID49IDEgPDwgNCkJCQkJCQkJXAorICAgICAgX3ggPj49IDQsIF9jICs9IDQ7CQkJCQkJXAorICAgIGlmIChfeCA+PSAxIDw8IDIpCQkJCQkJCVwKKyAgICAgIF94ID4+PSAyLCBfYyArPSAyOwkJCQkJCVwKKyAgICBfYyArPSBfeCA+PiAxOwkJCQkJCQlcCisgICAgKGNvdW50KSA9ICBXX1RZUEVfU0laRSAtIDEgLSBfYzsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKy8qIHNpbWlsYXIgdG8gd2hhdCBnY2MgZG9lcyBmb3IgX19idWlsdGluX2ZmcywgYnV0IDAgYmFzZWQgcmF0aGVyIHRoYW4gMQorICAgYmFzZWQsIGFuZCB3ZSBkb24ndCBuZWVkIGEgc3BlY2lhbCBjYXNlIGZvciB4PT0wIGhlcmUgKi8KKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fY3R6X3ggPSAoeCk7CQkJCQkJXAorICAgIF9fYXNtX18gKCJwb3BjbnQgJTAgPSAlMSIJCQkJCQlcCisJICAgICA6ICI9ciIgKGNvdW50KQkJCQkJCVwKKwkgICAgIDogInIiICgoX19jdHpfeC0xKSAmIH5fX2N0el94KSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIpCisjaW5jbHVkZSA8aWE2NGludHJpbi5oPgorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBwaCA9IF9tNjRfeG1haHUgKF9fbTAsIF9fbTEsIDApOwkJCQkJXAorICAgIHBsID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBMT05HTE9OR19TVEFOREFMT05FCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIGRvIHsgVVd0eXBlIF9fZGk7CQkJCQkJCVwKKyAgICBfX2RpID0gX19NUE4oaW52ZXJ0X2xpbWIpIChkKTsJCQkJCVwKKyAgICB1ZGl2X3Fybm5kX3ByZWludiAocSwgciwgbjEsIG4wLCBkLCBfX2RpKTsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBVRElWX1BSRUlOVl9BTFdBWVMgIDEKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorCisvKiBXZSBzb21ldGltZXMgbmVlZCB0byBjbG9iYmVyICJjYyIgd2l0aCBnY2MyLCBidXQgdGhhdCB3b3VsZCBub3QgYmUKKyAgIHVuZGVyc3Rvb2QgYnkgZ2NjMS4gIFVzZSBjcHAgdG8gYXZvaWQgbWFqb3IgY29kZSBkdXBsaWNhdGlvbi4gICovCisjaWYgX19HTlVDX18gPCAyCisjZGVmaW5lIF9fQ0xPQkJFUl9DQworI2RlZmluZSBfX0FORF9DTE9CQkVSX0NDCisjZWxzZSAvKiBfX0dOVUNfXyA+PSAyICovCisjZGVmaW5lIF9fQ0xPQkJFUl9DQyA6ICJjYyIKKyNkZWZpbmUgX19BTkRfQ0xPQkJFUl9DQyAsICJjYyIKKyNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgKi8KKworI2lmIChkZWZpbmVkIChfX2EyOWtfXykgfHwgZGVmaW5lZCAoX0FNMjlLKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGQgJTEsJTQsJTVcblx0YWRkYyAlMCwlMiwlMyIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiJXIiIChhbCksICJySSIgKGJsKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWIgJTEsJTQsJTVcblx0c3ViYyAlMCwlMiwlMyIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpKQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsdGlwbHUgJTAsJTEsJTIiCQkJCQlcCisJICAgICA6ICI9ciIgKHhsKQkJCQkJCVwKKwkgICAgIDogInIiIChfX20wKSwgInIiIChfX20xKSk7CQkJCQlcCisgICAgX19hc21fXyAoIm11bHRtdSAlMCwlMSwlMiIJCQkJCQlcCisJICAgICA6ICI9ciIgKHhoKQkJCQkJCVwKKwkgICAgIDogInIiIChfX20wKSwgInIiIChfX20xKSk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCJkaXZpZHUgJTAsJTMsJTQiCQkJCQkJXAorCSAgIDogIj1yIiAocSksICI9cSIgKHIpCQkJCQkJXAorCSAgIDogIjEiIChuMSksICJyIiAobjApLCAiciIgKGQpKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgICAgX19hc21fXyAoImNseiAlMCwlMSIJCQkJCQlcCisJICAgICA6ICI9ciIgKGNvdW50KQkJCQkJCVwKKwkgICAgIDogInIiICh4KSkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDMyCisjZW5kaWYgLyogX19hMjlrX18gKi8KKworI2lmIGRlZmluZWQgKF9fYXJjX18pCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkLmZcdCUxLCAlNCwgJTVcblx0YWRjXHQlMCwgJTIsICUzIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwJCQkJCQkJXAorCSAgICAgIj0mciIgKHNsKQkJCQkJCQlcCisJICAgOiAiciIgICgoVVNJdHlwZSkgKGFoKSksCQkJCQlcCisJICAgICAicklDYWwiICgoVVNJdHlwZSkgKGJoKSksCQkJCQlcCisJICAgICAiJXIiICgoVVNJdHlwZSkgKGFsKSksCQkJCQlcCisJICAgICAicklDYWwiICgoVVNJdHlwZSkgKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3ViLmZcdCUxLCAlNCwgJTVcblx0c2JjXHQlMCwgJTIsICUzIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwJCQkJCQkJXAorCSAgICAgIj0mciIgKHNsKQkJCQkJCQlcCisJICAgOiAiciIgKChVU0l0eXBlKSAoYWgpKSwJCQkJCVwKKwkgICAgICJySUNhbCIgKChVU0l0eXBlKSAoYmgpKSwJCQkJCVwKKwkgICAgICJyIiAoKFVTSXR5cGUpIChhbCkpLAkJCQkJXAorCSAgICAgInJJQ2FsIiAoKFVTSXR5cGUpIChibCkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybV9fKSAmJiAoZGVmaW5lZCAoX190aHVtYjJfXykgfHwgIWRlZmluZWQgKF9fdGh1bWJfXykpIFwKKyAgICAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJsKSAmJiAtKFVTSXR5cGUpKGJsKSA8IChVU0l0eXBlKShibCkpCVwKKyAgICAgIF9fYXNtX18gKCJzdWJzXHQlMSwgJTQsICU1XG5cdGFkY1x0JTAsICUyLCAlMyIJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLAkJCQkJXAorCQkgIiVyIiAoYWwpLCAickkiICgtKFVTSXR5cGUpKGJsKSkgX19DTE9CQkVSX0NDKTsJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJhZGRzXHQlMSwgJTQsICU1XG5cdGFkY1x0JTAsICUyLCAlMyIJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICJyIiAoYWgpLCAickkiIChiaCksICIlciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7CVwKKyAgfSB3aGlsZSAoMCkKKy8qIEZJWE1FOiBFeHRlbmQgdGhlIGltbWVkaWF0ZSByYW5nZSBmb3IgdGhlIGxvdyB3b3JkIGJ5IHVzaW5nIGJvdGggQUREUyBhbmQKKyAgIFNVQlMsIHNpbmNlIHRoZXkgc2V0IGNhcnJ5IGluIHRoZSBzYW1lIHdheS4gIFdlIG5lZWQgc2VwYXJhdGUgZGVmaW5pdGlvbnMKKyAgIGZvciB0aHVtYiBhbmQgbm9uLXRodW1iIHNpbmNlIHRodW1iIGxhY2tzIFJTQy4gICovCisjaWYgZGVmaW5lZCAoX190aHVtYl9fKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpCQlcCisJJiYgKGFoKSA9PSAoYmgpKQkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJzdWJzXHQlMSwgJTIsICUzXG5cdHNiY1x0JTAsICUwLCAlMCIJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPXIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7CQkJXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhbCkpCQkJCQlcCisgICAgICBfX2FzbV9fICgicnNic1x0JTEsICU1LCAlNFxuXHRzYmNcdCUwLCAlMiwgJTMiCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICJyIiAoYWgpLCAickkiIChiaCksICJySSIgKGFsKSwgInIiIChibCkgX19DTE9CQkVSX0NDKTsgXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIF9fYXNtX18gKCJzdWJzXHQlMSwgJTQsICU1XG5cdHNiY1x0JTAsICUyLCAlMyIJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgICAgIDogInIiIChhaCksICJySSIgKGJoKSwgInIiIChhbCksICJySSIgKGJsKSBfX0NMT0JCRVJfQ0MpOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkJCVwKKwkmJiAoYWgpID09IChiaCkpCQkJCQkJXAorICAgICAgX19hc21fXyAoInN1YnNcdCUxLCAlMiwgJTNcblx0c2JjXHQlMCwgJTAsICUwIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9ciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICJyIiAoYWwpLCAickkiIChibCkgX19DTE9CQkVSX0NDKTsJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFsKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkpCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEsICU1LCAlNFxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKwllbHNlCQkJCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEsICU1LCAlNFxuXHRzYmNcdCUwLCAlMiwgJTMiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChibCkpCQkJCQlcCisJICBfX2FzbV9fICgic3Vic1x0JTEsICU0LCAlNVxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKwllbHNlCQkJCQkJCQlcCisJICBfX2FzbV9fICgicnNic1x0JTEsICU1LCAlNFxuXHRyc2NcdCUwLCAlMywgJTIiCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAickkiIChhaCksICJyIiAoYmgpLCAickkiIChhbCksICJyIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoInN1YnNcdCUxLCAlNCwgJTVcblx0c2JjXHQlMCwgJTIsICUzIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiciIgKGFsKSwgInJJIiAoYmwpIF9fQ0xPQkJFUl9DQyk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoX19BUk1fQVJDSF8yX18pIHx8IGRlZmluZWQgKF9fQVJNX0FSQ0hfMkFfXykgXAorICAgIHx8IGRlZmluZWQgKF9fQVJNX0FSQ0hfM19fKQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBhLCBiKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICByZWdpc3RlciBVU0l0eXBlIF9fdDAsIF9fdDEsIF9fdDI7CQkJCQlcCisgICAgX19hc21fXyAoIiVAIElubGluZWQgdW11bF9wcG1tXG4iCQkJCQlcCisJICAgIgltb3YJJTIsICU1LCBsc3IgIzE2XG4iCQkJCVwKKwkgICAiCW1vdgklMCwgJTYsIGxzciAjMTZcbiIJCQkJXAorCSAgICIJYmljCSUzLCAlNSwgJTIsIGxzbCAjMTZcbiIJCQkJXAorCSAgICIJYmljCSU0LCAlNiwgJTAsIGxzbCAjMTZcbiIJCQkJXAorCSAgICIJbXVsCSUxLCAlMywgJTRcbiIJCQkJCVwKKwkgICAiCW11bAklNCwgJTIsICU0XG4iCQkJCQlcCisJICAgIgltdWwJJTMsICUwLCAlM1xuIgkJCQkJXAorCSAgICIJbXVsCSUwLCAlMiwgJTBcbiIJCQkJCVwKKwkgICAiCWFkZHMJJTMsICU0LCAlM1xuIgkJCQkJXAorCSAgICIJYWRkY3MJJTAsICUwLCAjNjU1MzZcbiIJCQkJXAorCSAgICIJYWRkcwklMSwgJTEsICUzLCBsc2wgIzE2XG4iCQkJCVwKKwkgICAiCWFkYwklMCwgJTAsICUzLCBsc3IgIzE2IgkJCQlcCisJICAgOiAiPSZyIiAoKFVTSXR5cGUpICh4aCkpLCAiPXIiICgoVVNJdHlwZSkgKHhsKSksCQlcCisJICAgICAiPSZyIiAoX190MCksICI9JnIiIChfX3QxKSwgIj1yIiAoX190MikJCQlcCisJICAgOiAiciIgKChVU0l0eXBlKSAoYSkpLCAiciIgKChVU0l0eXBlKSAoYikpIF9fQ0xPQkJFUl9DQyk7CVwKKyAgfSB3aGlsZSAoMCkKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVXdHlwZSBfX3I7CQkJCQkJCVwKKyAgICAocSkgPSBfX01QTih1ZGl2X3Fybm5kKSAoJl9fciwgKG4xKSwgKG4wKSwgKGQpKTsJCQlcCisgICAgKHIpID0gX19yOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIFVXdHlwZSBfX01QTih1ZGl2X3Fybm5kKSAoVVd0eXBlICosIFVXdHlwZSwgVVd0eXBlLCBVV3R5cGUpOworI2VuZGlmIC8qIExPTkdMT05HX1NUQU5EQUxPTkUgKi8KKyNlbHNlIC8qIEFSTXY0IG9yIG5ld2VyICovCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIGEsIGIpIFwKKyAgX19hc21fXyAoInVtdWxsICUwLCUxLCUyLCUzIiA6ICI9JnIiICh4bCksICI9JnIiICh4aCkgOiAiciIgKGEpLCAiciIgKGIpKQorI2RlZmluZSBzbXVsX3BwbW0oeGgsIHhsLCBhLCBiKSBcCisgIF9fYXNtX18gKCJzbXVsbCAlMCwlMSwlMiwlMyIgOiAiPSZyIiAoeGwpLCAiPSZyIiAoeGgpIDogInIiIChhKSwgInIiIChiKSkKKyNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7IFVXdHlwZSBfX2RpOwkJCQkJCQlcCisgICAgX19kaSA9IF9fTVBOKGludmVydF9saW1iKSAoZCk7CQkJCQlcCisgICAgdWRpdl9xcm5uZF9wcmVpbnYgKHEsIHIsIG4xLCBuMCwgZCwgX19kaSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVURJVl9QUkVJTlZfQUxXQVlTICAxCisjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19BUk1fQVJDSF8yX18pIC4uLiAqLworI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSAgY291bnRfbGVhZGluZ196ZXJvc19nY2NfY2x6KGNvdW50LCB4KQorI2RlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyhjb3VudCwgeCkgIGNvdW50X3RyYWlsaW5nX3plcm9zX2djY19jdHooY291bnQsIHgpCisjZW5kaWYgLyogX19hcm1fXyAqLworCisjaWYgZGVmaW5lZCAoX19hYXJjaDY0X18pICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmwpICYmIH4oVURJdHlwZSkoYmwpIDw9IChVREl0eXBlKShibCkpCVwKKyAgICAgIF9fYXNtX18gKCJzdWJzXHQlMSwgJXg0LCAlNVxuXHRhZGNcdCUwLCAleDIsICV4MyIJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgICAgIDogInJaIiAoKFVESXR5cGUpKGFoKSksICJyWiIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgIiVyIiAoKFVESXR5cGUpKGFsKSksICJySSIgKC0oVURJdHlwZSkoYmwpKSBfX0NMT0JCRVJfQ0MpO1wKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgiYWRkc1x0JTEsICV4NCwgJTVcblx0YWRjXHQlMCwgJXgyLCAleDMiCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICJyWiIgKChVREl0eXBlKShhaCkpLCAicloiICgoVURJdHlwZSkoYmgpKSwJCVwKKwkJICIlciIgKChVREl0eXBlKShhbCkpLCAickkiICgoVURJdHlwZSkoYmwpKSBfX0NMT0JCRVJfQ0MpO1wKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChibCkgJiYgfihVREl0eXBlKShibCkgPD0gKFVESXR5cGUpKGJsKSkJXAorICAgICAgX19hc21fXyAoImFkZHNcdCUxLCAleDQsICU1XG5cdHNiY1x0JTAsICV4MiwgJXgzIgkJCVwKKwkgICAgICAgOiAiPXIsciIgKHNoKSwgIj0mciwmciIgKHNsKQkJCQlcCisJICAgICAgIDogInJaLHJaIiAoKFVESXR5cGUpKGFoKSksICJyWixyWiIgKChVREl0eXBlKShiaCkpLAlcCisJCSAicixaIiAgICgoVURJdHlwZSkoYWwpKSwgInJJLHIiICgtKFVESXR5cGUpKGJsKSkgX19DTE9CQkVSX0NDKTtcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoInN1YnNcdCUxLCAleDQsICU1XG5cdHNiY1x0JTAsICV4MiwgJXgzIgkJCVwKKwkgICAgICAgOiAiPXIsciIgKHNoKSwgIj0mciwmciIgKHNsKQkJCQlcCisJICAgICAgIDogInJaLHJaIiAoKFVESXR5cGUpKGFoKSksICJyWixyWiIgKChVREl0eXBlKShiaCkpLAlcCisJCSAicixaIiAgICgoVURJdHlwZSkoYWwpKSwgInJJLHIiICAoKFVESXR5cGUpKGJsKSkgX19DTE9CQkVSX0NDKTtcCisgIH0gd2hpbGUoMCk7CisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDQsOSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fbGxfVVRJdHlwZSBfX2F0dHJpYnV0ZV9fKChtb2RlKFRJKSkpOwlcCisgICAgX19sbF9VVEl0eXBlIF9fbGwgPSAoX19sbF9VVEl0eXBlKSh1KSAqICh2KTsJCQlcCisgICAgdzEgPSBfX2xsID4+IDY0OwkJCQkJCQlcCisgICAgdzAgPSBfX2xsOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKHVtdWxfcHBtbSkKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVURJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoInVtdWxoXHQlMCwgJTEsICUyIiA6ICI9ciIgKHBoKSA6ICJyIiAoX19tMCksICJyIiAoX19tMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgIGNvdW50X2xlYWRpbmdfemVyb3NfZ2NjX2Nseihjb3VudCwgeCkKKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpICBjb3VudF90cmFpbGluZ196ZXJvc19nY2NfY3R6KGNvdW50LCB4KQorI2VuZGlmIC8qIF9fYWFyY2g2NF9fICovCisKKyNpZiBkZWZpbmVkIChfX2NsaXBwZXJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICAoe3VuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgX19hc21fXyAoIm11bHd1eCAlMiwlMCIJCQkJCQlcCisJICAgOiAiPXIiIChfX3guX19sbCkJCQkJCQlcCisJICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLCAiciIgKChVU0l0eXBlKSh2KSkpOwkJCVwKKyAgKHcxKSA9IF9feC5fX2kuX19oOyAodzApID0gX194Ll9faS5fX2w7fSkKKyNkZWZpbmUgc211bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICAoe3VuaW9uIHtESXR5cGUgX19sbDsJCQkJCQkJXAorCSAgIHN0cnVjdCB7U0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICBfX2FzbV9fICgibXVsd3ggJTIsJTAiCQkJCQkJXAorCSAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgIDogIiUwIiAoKFNJdHlwZSkodSkpLCAiciIgKChTSXR5cGUpKHYpKSk7CQkJXAorICAodzEpID0gX194Ll9faS5fX2g7ICh3MCkgPSBfX3guX19pLl9fbDt9KQorI2RlZmluZSBfX3VtdWxzaWRpMyh1LCB2KSBcCisgICh7VURJdHlwZSBfX3c7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsd3V4ICUyLCUwIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX193KSA6ICIlMCIgKChVU0l0eXBlKSh1KSksICJyIiAoKFVTSXR5cGUpKHYpKSk7CVwKKyAgICBfX3c7IH0pCisjZW5kaWYgLyogX19jbGlwcGVyX18gKi8KKworLyogRnVqaXRzdSB2ZWN0b3IgY29tcHV0ZXJzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3V4cF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCB1LCB2KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0Lmx1ICUxLCUyLCUwIgk6ICI9ciIgKF9feC5fX2xsKSA6ICIlciIgKHUpLCAicksiICh2KSk7XAorICAgIChwaCkgPSBfX3guX19pLl9faDsJCQkJCQkJXAorICAgIChwbCkgPSBfX3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBzbXVsX3BwbW0ocGgsIHBsLCB1LCB2KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtdWx0LmwgJTEsJTIsJTAiIDogIj1yIiAoX194Ll9fbGwpIDogIiVyIiAodSksICJySyIgKHYpKTsJXAorICAgIChwaCkgPSBfX3guX19pLl9faDsJCQkJCQkJXAorICAgIChwbCkgPSBfX3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2dtaWNyb19fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZC53ICU1LCUxXG5cdGFkZHggJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChzaCksICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1Yi53ICU1LCUxXG5cdHN1YnggJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChzaCksICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJnIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIF9fYXNtX18gKCJtdWx4ICUzLCUwLCUxIgkJCQkJCVwKKwkgICA6ICI9ZyIgKHBoKSwgIj1yIiAocGwpCQkJCQlcCisJICAgOiAiJTAiICgoVVNJdHlwZSkobTApKSwgImciICgoVVNJdHlwZSkobTEpKSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgX19hc21fXyAoImRpdnggJTQsJTAsJTEiCQkJCQkJXAorCSAgIDogIj1nIiAocSksICI9ciIgKHIpCQkJCQkJXAorCSAgIDogIjEiICgoVVNJdHlwZSkobmgpKSwgIjAiICgoVVNJdHlwZSkobmwpKSwgImciICgoVVNJdHlwZSkoZCkpKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIF9fYXNtX18gKCJic2NoLzEgJTEsJTAiCQkJCQkJXAorCSAgIDogIj1nIiAoY291bnQpIDogImciICgoVVNJdHlwZSkoeCkpLCAiMCIgKChVU0l0eXBlKTApKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2hwcGEpICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkJUk1ICU1LCVyNCwlMVxuXHRhZGRjICVyMiwlcjMsJTAiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAick0iIChhaCksICJyTSIgKGJoKSwgIiVyTSIgKGFsKSwgInJJIiAoYmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YiVJNCAlNCwlcjUsJTFcblx0c3ViYiAlcjIsJXIzLCUwIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogInJNIiAoYWgpLCAick0iIChiaCksICJySSIgKGFsKSwgInJNIiAoYmwpKQorI2lmIGRlZmluZWQgKF9QQV9SSVNDMV8xKQorI2RlZmluZSB1bXVsX3BwbW0od2gsIHdsLCB1LCB2KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJ4bXB5dSAlMSwlMiwlMCIgOiAiPSpmIiAoX194Ll9fbGwpIDogIipmIiAodSksICIqZiIgKHYpKTsJXAorICAgICh3aCkgPSBfX3guX19pLl9faDsJCQkJCQkJXAorICAgICh3bCkgPSBfX3guX19pLl9fbDsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fdG1wOwkJCQkJCQlcCisgICAgX19hc21fXyAoCQkJCQkJCQlcCisgICAgICAgImxkaQkJMSwlMFxuIgkJCQkJCVwKKyIJZXh0cnUsPQkJJTEsMTUsMTYsJSVyMAk7IEJpdHMgMzEuLjE2IHplcm8/XG4iCQlcCisiCWV4dHJ1LHRyCSUxLDE1LDE2LCUxCTsgTm8uICBTaGlmdCBkb3duLCBza2lwIGFkZC5cbiIJXAorIglsZG8JCTE2KCUwKSwlMAk7IFllcy4gIFBlcmZvcm0gYWRkLlxuIgkJXAorIglleHRydSw9CQklMSwyMyw4LCUlcjAJOyBCaXRzIDE1Li44IHplcm8/XG4iCQlcCisiCWV4dHJ1LHRyCSUxLDIzLDgsJTEJOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIglcCisiCWxkbwkJOCglMCksJTAJOyBZZXMuICBQZXJmb3JtIGFkZC5cbiIJCVwKKyIJZXh0cnUsPQkJJTEsMjcsNCwlJXIwCTsgQml0cyA3Li40IHplcm8/XG4iCQlcCisiCWV4dHJ1LHRyCSUxLDI3LDQsJTEJOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIglcCisiCWxkbwkJNCglMCksJTAJOyBZZXMuICBQZXJmb3JtIGFkZC5cbiIJCVwKKyIJZXh0cnUsPQkJJTEsMjksMiwlJXIwCTsgQml0cyAzLi4yIHplcm8/XG4iCQlcCisiCWV4dHJ1LHRyCSUxLDI5LDIsJTEJOyBOby4gIFNoaWZ0IGRvd24sIHNraXAgYWRkLlxuIglcCisiCWxkbwkJMiglMCksJTAJOyBZZXMuICBQZXJmb3JtIGFkZC5cbiIJCVwKKyIJZXh0cnUJCSUxLDMwLDEsJTEJOyBFeHRyYWN0IGJpdCAxLlxuIgkJXAorIglzdWIJCSUwLCUxLCUwCTsgU3VidHJhY3QgaXQuXG4iCQlcCisJOiAiPXIiIChjb3VudCksICI9ciIgKF9fdG1wKSA6ICIxIiAoeCkpOwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBocHBhICovCisKKy8qIFRoZXNlIG1hY3JvcyBhcmUgZm9yIEFCST0yLjB3LiAgSW4gQUJJPTIuMG4gdGhleSBjYW4ndCBiZSB1c2VkLCBzaW5jZSBHQ0MKKyAgICgzLjIpIHB1dHMgbG9uZ2xvbmcgaW50byB0d28gYWRqYWNlbnQgMzItYml0IHJlZ2lzdGVycy4gIFByZXN1bWFibHkgdGhpcworICAgaXMganVzdCBhIGNhc2Ugb2Ygbm8gZGlyZWN0IHN1cHBvcnQgZm9yIDIuMG4gYnV0IHRyZWF0aW5nIGl0IGxpa2UgMS4wLiAqLworI2lmIGRlZmluZWQgKF9faHBwYSkgJiYgV19UWVBFX1NJWkUgPT0gNjQgJiYgISBkZWZpbmVkIChfTE9OR19MT05HX0xJTUIpCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkJUk1ICU1LCVyNCwlMVxuXHRhZGQsZGMgJXIyLCVyMywlMCIJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICJyTSIgKGFoKSwgInJNIiAoYmgpLCAiJXJNIiAoYWwpLCAickkiIChibCkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3ViJUk0ICU0LCVyNSwlMVxuXHRzdWIsZGIgJXIyLCVyMywlMCIJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICJyTSIgKGFoKSwgInJNIiAoYmgpLCAickkiIChhbCksICJyTSIgKGJsKSkKKyNlbmRpZiAvKiBocHBhICovCisKKyNpZiAoZGVmaW5lZCAoX19pMzcwX18pIHx8IGRlZmluZWQgKF9fczM5MF9fKSB8fCBkZWZpbmVkIChfX212c19fKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNpZiBkZWZpbmVkIChfX3phcmNoX18pIHx8IGRlZmluZWQgKEhBVkVfSE9TVF9DUFVfczM5MF96YXJjaCkKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisvKiAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChibCkpCQkJCQlcCisgICAgICBfX2FzbV9fICgiYWxmaVx0JTEsJW81XG5cdGFsY3JcdCUwLCUzIgkJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgICAgIDogIjAiICAoYWgpLCAiciIgKGJoKSwgIiUxIiAoYWwpLCAibiIgKGJsKSBfX0NMT0JCRVJfQ0MpO1wKKyAgICBlbHNlCQkJCQkJCQlcCisqLyAgICBfX2FzbV9fICgiYWxyXHQlMSwlNVxuXHRhbGNyXHQlMCwlMyIJCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICIwIiAgKGFoKSwgInIiIChiaCksICIlMSIgKGFsKSwgInIiIChibClfX0NMT0JCRVJfQ0MpOwlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorLyogIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmwpKQkJCQkJXAorICAgICAgX19hc21fXyAoInNsZmlcdCUxLCVvNVxuXHRzbGJyXHQlMCwlMyIJCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICIwIiAoYWgpLCAiciIgKGJoKSwgIjEiIChhbCksICJuIiAoYmwpIF9fQ0xPQkJFUl9DQyk7CVwKKyAgICBlbHNlCQkJCQkJCQlcCisqLyAgICBfX2FzbV9fICgic2xyXHQlMSwlNVxuXHRzbGJyXHQlMCwlMyIJCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICIwIiAoYWgpLCAiciIgKGJoKSwgIjEiIChhbCksICJyIiAoYmwpIF9fQ0xPQkJFUl9DQyk7CVwKKyAgfSB3aGlsZSAoMCkKKyNpZiBfX0dNUF9HTlVDX1BSRVJFUSAoNCw1KQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9feC5fX2xsID0gKFVESXR5cGUpIChtMCkgKiAoVURJdHlwZSkgKG0xKTsJCQkJXAorICAgICh4aCkgPSBfX3guX19pLl9faDsgKHhsKSA9IF9feC5fX2kuX19sOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2lmIDAKKy8qIEZJWE1FOiB0aGlzIGZhaWxzIGlmIGdjYyBrbm93cyBhYm91dCB0aGUgNjQtYml0IHJlZ2lzdGVycy4gIFVzZSBvbmx5CisgICB3aXRoIGEgbmV3IGVub3VnaCBwcm9jZXNzb3IgcHJldGVuZGluZyB3ZSBoYXZlIDMyLWJpdCByZWdpc3RlcnMuICAqLworI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtbHJcdCUwLCUyIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgICAgOiAiJTAiIChtMCksICJyIiAobTEpKTsJCQkJCVwKKyAgICAoeGgpID0gX194Ll9faS5fX2g7ICh4bCkgPSBfX3guX19pLl9fbDsJCQkJXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgbTAsIG0xKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAvKiBXaGVuIHdlIGhhdmUgNjQtYml0IHJlZ3MgYW5kIGdjYyBpcyBhd2FyZSBvZiB0aGF0LCB3ZSBjYW5ub3Qgc2ltcGx5IHVzZQorICAgICBESW1vZGUgZm9yIHRoZSBwcm9kdWN0LCBzaW5jZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZCB0byBhIHNpbmdsZSA2NC1iaXQKKyAgICAgcmVnaXN0ZXIsIHdoZXJlYXMgbWxyIHVzZXMgdGhlIGxvdyAzMi1iaXRzIG9mIGFuIGV2ZW4tb2RkIHJlZ2lzdGVyIHBhaXIuCisgICovCQkJCQkJCQkJXAorICAgIHJlZ2lzdGVyIFVTSXR5cGUgX19yMCBfX2FzbV9fICgiMCIpOwkJCQlcCisgICAgcmVnaXN0ZXIgVVNJdHlwZSBfX3IxIF9fYXNtX18gKCIxIikgPSAobTApOwkJCQlcCisgICAgX19hc21fXyAoIm1sclx0JTAsJTMiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX3IwKSwgIj1yIiAoX19yMSkJCQkJCVwKKwkgICAgIDogInIiIChfX3IxKSwgInIiIChtMSkpOwkJCQkJXAorICAgICh4aCkgPSBfX3IwOyAoeGwpID0gX19yMTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogaWYgMCAqLworI2VuZGlmCisjaWYgMAorLyogRklYTUU6IHRoaXMgZmFpbHMgaWYgZ2NjIGtub3dzIGFib3V0IHRoZSA2NC1iaXQgcmVnaXN0ZXJzLiAgVXNlIG9ubHkKKyAgIHdpdGggYSBuZXcgZW5vdWdoIHByb2Nlc3NvciBwcmV0ZW5kaW5nIHdlIGhhdmUgMzItYml0IHJlZ2lzdGVycy4gICovCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX3guX19pLl9faCA9IG4xOyBfX3guX19pLl9fbCA9IG4wOwkJCQkJXAorICAgIF9fYXNtX18gKCJkbHJcdCUwLCUyIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgICAgOiAiMCIgKF9feC5fX2xsKSwgInIiIChkKSk7CQkJCVwKKyAgICAocSkgPSBfX3guX19pLl9fbDsgKHIpID0gX194Ll9faS5fX2g7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHJlZ2lzdGVyIFVTSXR5cGUgX19yMCBfX2FzbV9fICgiMCIpID0gKG4xKTsJCQkJXAorICAgIHJlZ2lzdGVyIFVTSXR5cGUgX19yMSBfX2FzbV9fICgiMSIpID0gKG4wKTsJCQkJXAorICAgIF9fYXNtX18gKCJkbHJcdCUwLCU0IgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX19yMCksICI9ciIgKF9fcjEpCQkJCQlcCisJICAgICA6ICJyIiAoX19yMCksICJyIiAoX19yMSksICJyIiAoZCkpOwkJCVwKKyAgICAocSkgPSBfX3IxOyAocikgPSBfX3IwOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBpZiAwICovCisjZWxzZSAvKiBpZiBfX3phcmNoX18gKi8KKy8qIEZJWE1FOiB0aGlzIGZhaWxzIGlmIGdjYyBrbm93cyBhYm91dCB0aGUgNjQtYml0IHJlZ2lzdGVycy4gICovCisjZGVmaW5lIHNtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7REl0eXBlIF9fbGw7CQkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgICAgX19hc21fXyAoIm1yXHQlMCwlMiIJCQkJCQlcCisJICAgICA6ICI9ciIgKF9feC5fX2xsKQkJCQkJCVwKKwkgICAgIDogIiUwIiAobTApLCAiciIgKG0xKSk7CQkJCQlcCisgICAgKHhoKSA9IF9feC5fX2kuX19oOyAoeGwpID0gX194Ll9faS5fX2w7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKy8qIEZJWE1FOiB0aGlzIGZhaWxzIGlmIGdjYyBrbm93cyBhYm91dCB0aGUgNjQtYml0IHJlZ2lzdGVycy4gICovCisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtESXR5cGUgX19sbDsJCQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX3guX19pLl9faCA9IG4xOyBfX3guX19pLl9fbCA9IG4wOwkJCQkJXAorICAgIF9fYXNtX18gKCJkclx0JTAsJTIiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX3guX19sbCkJCQkJCQlcCisJICAgICA6ICIwIiAoX194Ll9fbGwpLCAiciIgKGQpKTsJCQkJXAorICAgIChxKSA9IF9feC5fX2kuX19sOyAocikgPSBfX3guX19pLl9faDsJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGlmIF9femFyY2hfXyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3MzOTB4X18pICYmIFdfVFlQRV9TSVpFID09IDY0CisvKiBXZSBuZWVkIHRvIGNhc3Qgb3BlcmFuZHMgd2l0aCByZWdpc3RlciBjb25zdHJhaW50cywgb3RoZXJ3aXNlIHRoZWlyIHR5cGVzCisgICB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgU0ltb2RlIGJ5IGdjYy4gIEZvciB0aGVzZSBtYWNoaW5lcywgc3VjaCBvcGVyYXRpb25zCisgICB3aWxsIGluc2VydCBhIHZhbHVlIGludG8gdGhlIGxvdyAzMiBiaXRzLCBhbmQgbGVhdmUgdGhlIGhpZ2ggMzIgYml0cyB3aXRoCisgICBnYXJiYWdlLiAgKi8KKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgX19hc21fXyAoImFsZ3JcdCUxLCU1XG5cdGFsY2dyXHQlMCwlMyIJCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICIwIiAgKChVREl0eXBlKShhaCkpLCAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgIiUxIiAoKFVESXR5cGUpKGFsKSksICJyIiAoKFVESXR5cGUpKGJsKSkgX19DTE9CQkVSX0NDKTsgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgic2xnclx0JTEsJTVcblx0c2xiZ3JcdCUwLCUzIgkJCQlcCisJICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgOiAiMCIgKChVREl0eXBlKShhaCkpLCAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCSAgICAgICAiMSIgKChVREl0eXBlKShhbCkpLCAiciIgKChVREl0eXBlKShibCkpIF9fQ0xPQkJFUl9DQyk7CVwKKyAgfSB3aGlsZSAoMCkKKyNpZiAhZGVmaW5lZCAoX19jbGFuZ19fKQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge3Vuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fICgobW9kZShUSSkpKSBfX2xsOwkJXAorCSAgIHN0cnVjdCB7VURJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibWxnclx0JTAsJTIiCQkJCQkJXAorCSAgICAgOiAiPXIiIChfX3guX19sbCkJCQkJCQlcCisJICAgICA6ICIlMCIgKChVREl0eXBlKShtMCkpLCAiciIgKChVREl0eXBlKShtMSkpKTsJCVwKKyAgICAoeGgpID0gX194Ll9faS5fX2g7ICh4bCkgPSBfX3guX19pLl9fbDsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7dW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18gKChtb2RlKFRJKSkpIF9fbGw7CQlcCisJICAgc3RydWN0IHtVREl0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIF9feC5fX2kuX19oID0gbjE7IF9feC5fX2kuX19sID0gbjA7CQkJCQlcCisgICAgX19hc21fXyAoImRsZ3JcdCUwLCUyIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgICAgOiAiMCIgKF9feC5fX2xsKSwgInIiICgoVURJdHlwZSkoZCkpKTsJCQlcCisgICAgKHEpID0gX194Ll9faS5fX2w7IChyKSA9IF9feC5fX2kuX19oOwkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAwIC8qIEZJWE1FOiBFbmFibGUgZm9yIHoxMCAoPykgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjbnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge3Vuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fICgobW9kZShUSSkpKSBfX2xsOwkJXAorCSAgIHN0cnVjdCB7VURJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX2Nscl9jbnQ7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiZmxvZ3JcdCUwLCUxIgkJCQkJCVwKKwkgICAgIDogIj1yIiAoX19jbHJfY250Ll9fbGwpCQkJCQlcCisJICAgICA6ICJyIiAoeCkgX19DTE9CQkVSX0NDKTsJCQkJCVwKKyAgICAoY250KSA9IF9fY2xyX2NudC5fX2kuX19oOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKy8qIE9uIHg4NiBhbmQgeDg2XzY0LCBldmVyeSBhc20gaW1wbGljaXRseSBjbG9iYmVycyAiZmxhZ3MiIGFuZCAiZnBzciIsCisgICBzbyB3ZSBkb24ndCBuZWVkIF9fQ0xPQkJFUl9DQy4gICovCisjaWYgKGRlZmluZWQgKF9faTM4Nl9fKSB8fCBkZWZpbmVkIChfX2k0ODZfXykpICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkbCAlNSwlazFcblx0YWRjbCAlMywlazAiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YmwgJTUsJWsxXG5cdHNiYmwgJTMsJWswIgkJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiMCIgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIxIiAoKFVTSXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoIm11bGwgJTMiCQkJCQkJCVwKKwkgICA6ICI9YSIgKHcwKSwgIj1kIiAodzEpCQkJCQlcCisJICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLCAicm0iICgoVVNJdHlwZSkodikpKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZHgpIC8qIGQgcmVuYW1lZCB0byBkeCBhdm9pZGluZyAiPWQiICovXAorICBfX2FzbV9fICgiZGl2bCAlNCIJCSAgICAgLyogc3RyaW5naWZpY2F0aW9uIGluIEsmUiBDICovCVwKKwkgICA6ICI9YSIgKHEpLCAiPWQiIChyKQkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKG4wKSksICIxIiAoKFVTSXR5cGUpKG4xKSksICJybSIgKChVU0l0eXBlKShkeCkpKQorCisjaWYgSEFWRV9IT1NUX0NQVV9pNTg2IHx8IEhBVkVfSE9TVF9DUFVfcGVudGl1bSB8fCBIQVZFX0hPU1RfQ1BVX3BlbnRpdW1tbXgKKy8qIFBlbnRpdW0gYnNybCB0YWtlcyBiZXR3ZWVuIDEwIGFuZCA3MiBjeWNsZXMgZGVwZW5kaW5nIHdoZXJlIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCAxIGJpdCBpcywgaGVuY2UgdGhlIHVzZSBvZiB0aGUgZm9sbG93aW5nIGFsdGVybmF0aXZlcy4gIGJzZmwKKyAgIGlzIHNsb3cgdG9vLCBiZXR3ZWVuIDE4IGFuZCA0MiBkZXBlbmRpbmcgd2hlcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IDEKKyAgIGJpdCBpcywgc28gbGV0IHRoZSBnZW5lcmljIGNvdW50X3RyYWlsaW5nX3plcm9zIGJlbG93IG1ha2UgdXNlIG9mIHRoZQorICAgY291bnRfbGVhZGluZ196ZXJvcyBoZXJlIHRvby4gICovCisKKyNpZiBIQVZFX0hPU1RfQ1BVX3BlbnRpdW1tbXggJiYgISBkZWZpbmVkIChMT05HTE9OR19TVEFOREFMT05FKQorLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgYSBmaXhlZCAxNCBvciAxNSBjeWNsZXMsIGJ1dCBwb3NzaWJseSBwbHVzIGFuIEwxCisgICBjYWNoZSBtaXNzIHJlYWRpbmcgZnJvbSBfX2Nsel90YWIuICBGb3IgUDU1IGl0J3MgZmF2b3VyZWQgb3ZlciB0aGUgZmxvYXQKKyAgIGJlbG93IHNvIGFzIHRvIGF2b2lkIG1peGluZyBNTVggYW5kIHg4Nywgc2luY2UgdGhlIHBlbmFsdHkgZm9yIHN3aXRjaGluZworICAgYmV0d2VlbiB0aGUgdHdvIGlzIGFib3V0IDEwMCBjeWNsZXMuCisKKyAgIFRoZSBhc20gYmxvY2sgc2V0cyBfX3NoaWZ0IHRvIC0zIGlmIHRoZSBoaWdoIDI0IGJpdHMgYXJlIGNsZWFyLCAtMiBmb3IKKyAgIDE2LCAtMSBmb3IgOCwgb3IgMCBvdGhlcndpc2UuICBUaGlzIGNvdWxkIGJlIHdyaXR0ZW4gZXF1aXZhbGVudGx5IGFzCisgICBmb2xsb3dzLCBidXQgYXMgb2YgZ2NjIDIuOTUuMiBpdCByZXN1bHRzIGluIGNvbmRpdGlvbmFsIGp1bXBzLgorCisgICAgICAgX19zaGlmdCA9IC0oX19uIDwgMHgxMDAwMDAwKTsKKyAgICAgICBfX3NoaWZ0IC09IChfX24gPCAweDEwMDAwKTsKKyAgICAgICBfX3NoaWZ0IC09IChfX24gPCAweDEwMCk7CisKKyAgIFRoZSBtaWRkbGUgdHdvIHNiYmwgYW5kIGNtcGwncyBwYWlyLCBhbmQgd2l0aCBsdWNrIHNvbWV0aGluZyBnY2MKKyAgIGdlbmVyYXRlcyBtaWdodCBwYWlyIHdpdGggdGhlIGZpcnN0IGNtcGwgYW5kIHRoZSBsYXN0IHNiYmwuICBUaGUgIjMyKzEiCisgICBjb25zdGFudCBjb3VsZCBiZSBmb2xkZWQgaW50byBfX2Nsel90YWJbXSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aAorICAgbWFraW5nIGEgZGlmZmVyZW50IHRhYmxlIGp1c3QgZm9yIHRoYXQuICAqLworCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoYyxuKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgIF9fbiA9IChuKTsJCQkJCQkJXAorICAgIFVTSXR5cGUgIF9fc2hpZnQ7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiY21wbCAgJDB4MTAwMDAwMCwgJTFcbiIJCQkJCVwKKwkgICAgICJzYmJsICAlMCwgJTBcbiIJCQkJCQlcCisJICAgICAiY21wbCAgJDB4MTAwMDAsICUxXG4iCQkJCQlcCisJICAgICAic2JibCAgJDAsICUwXG4iCQkJCQkJXAorCSAgICAgImNtcGwgICQweDEwMCwgJTFcbiIJCQkJCVwKKwkgICAgICJzYmJsICAkMCwgJTBcbiIJCQkJCQlcCisJICAgICA6ICI9JnIiIChfX3NoaWZ0KSA6ICJyIiAgKF9fbikpOwkJCQlcCisgICAgX19zaGlmdCA9IF9fc2hpZnQqOCArIDI0ICsgMTsJCQkJCVwKKyAgICAoYykgPSAzMiArIDEgLSBfX3NoaWZ0IC0gX19jbHpfdGFiW19fbiA+PiBfX3NoaWZ0XTsJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfTkVFRF9DTFpfVEFCCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfMCAgIDMxICAgLyogbj09MCBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG49PTEgKi8KKworI2Vsc2UgLyogISBwZW50aXVtbW14IHx8IExPTkdMT05HX1NUQU5EQUxPTkUgKi8KKy8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGEgZml4ZWQgMTQgY3ljbGVzIG9yIHNvLiAgU29tZSBzY2hlZHVsaW5nCisgICBvcHBvcnR1bml0aWVzIHNob3VsZCBiZSBhdmFpbGFibGUgYmV0d2VlbiB0aGUgZmxvYXQgbG9hZC9zdG9yZSB0b28uICBUaGlzCisgICBzb3J0IG9mIGNvZGUgaXMgdXNlZCBpbiBnY2MgMyBmb3IgX19idWlsdGluX2ZmcyAod2l0aCAibiYtbiIpIGFuZCBpcworICAgYXBwYXJlbnRseSBzdWdnZXN0ZWQgYnkgdGhlIEludGVsIG9wdGltaXppbmcgbWFudWFsIChkb24ndCBrbm93IGV4YWN0bHkKKyAgIHdoZXJlKS4gIGdjYyAyLjk1IG9yIHVwIHdpbGwgYmUgYmVzdCBmb3IgdGhpcywgc28gdGhlICJkb3VibGUiIGlzCisgICBjb3JyZWN0bHkgYWxpZ25lZCBvbiB0aGUgc3RhY2suICAqLworI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGMsbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7CQkJCQkJCQlcCisgICAgICBkb3VibGUgICAgZDsJCQkJCQkJXAorICAgICAgdW5zaWduZWQgIGFbMl07CQkJCQkJCVwKKyAgICB9IF9fdTsJCQkJCQkJCVwKKyAgICBfX3UuZCA9IChVV3R5cGUpIChuKTsJCQkJCQlcCisgICAgKGMpID0gMHgzRkYgKyAzMSAtIChfX3UuYVsxXSA+PiAyMCk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wICAgKDB4M0ZGICsgMzEpCisjZW5kaWYgLyogcGVudGl1bW14ICovCisKKyNlbHNlIC8qICEgcGVudGl1bSAqLworCisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDMsNCkgIC8qIHVzaW5nIGJzcmwgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCx4KSAgY291bnRfbGVhZGluZ196ZXJvc19nY2NfY2x6KGNvdW50LHgpCisjZW5kaWYgLyogZ2NjIGNseiAqLworCisvKiBPbiBQNiwgZ2NjIHByaW9yIHRvIDMuMCBnZW5lcmF0ZXMgYSBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxsIGZvcgorICAgX19jYnRtcF4zMSwgZHVlIHRvIHVzaW5nICJ4b3JiICQzMSIgaW5zdGVhZCBvZiAieG9ybCAkMzEiLCB0aGUgZm9ybWVyCisgICBiZWluZyAxIGNvZGUgYnl0ZSBzbWFsbGVyLiAgIjMxLV9fY2J0bXAiIGlzIGEgd29ya2Fyb3VuZCwgcHJvYmFibHkgYXQgdGhlCisgICBjb3N0IG9mIG9uZSBleHRyYSBpbnN0cnVjdGlvbi4gIERvIHRoaXMgZm9yICJpMzg2IiB0b28sIHNpbmNlIHRoYXQgbWVhbnMKKyAgIGdlbmVyaWMgeDg2LiAgKi8KKyNpZiAhIGRlZmluZWQgKGNvdW50X2xlYWRpbmdfemVyb3MpICYmIF9fR05VQ19fIDwgMwkJCVwKKyAgJiYgKEhBVkVfSE9TVF9DUFVfaTM4NgkJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfaTY4NgkJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcGVudGl1bXBybwkJCQkJXAorICAgICAgfHwgSEFWRV9IT1NUX0NQVV9wZW50aXVtMgkJCQkJCVwKKyAgICAgIHx8IEhBVkVfSE9TVF9DUFVfcGVudGl1bTMpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNybCAlMSwlMCIgOiAiPXIiIChfX2NidG1wKSA6ICJybSIgKChVU0l0eXBlKSh4KSkpOwlcCisgICAgKGNvdW50KSA9IDMxIC0gX19jYnRtcDsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogZ2NjPDMgYXNtIGJzcmwgKi8KKworI2lmbmRlZiBjb3VudF9sZWFkaW5nX3plcm9zCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNybCAlMSwlMCIgOiAiPXIiIChfX2NidG1wKSA6ICJybSIgKChVU0l0eXBlKSh4KSkpOwlcCisgICAgKGNvdW50KSA9IF9fY2J0bXAgXiAzMTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogYXNtIGJzcmwgKi8KKworI2lmIF9fR01QX0dOVUNfUFJFUkVRICgzLDQpICAvKiB1c2luZyBic2ZsICovCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50LHgpICBjb3VudF90cmFpbGluZ196ZXJvc19nY2NfY3R6KGNvdW50LHgpCisjZW5kaWYgLyogZ2NjIGN0eiAqLworCisjaWZuZGVmIGNvdW50X3RyYWlsaW5nX3plcm9zCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50LCB4KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKHgpICE9IDApOwkJCQkJCQlcCisgICAgX19hc21fXyAoImJzZmwgJTEsJWswIiA6ICI9ciIgKGNvdW50KSA6ICJybSIgKChVU0l0eXBlKSh4KSkpOwlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogYXNtIGJzZmwgKi8KKworI2VuZGlmIC8qICEgcGVudGl1bSAqLworCisjZW5kaWYgLyogODB4ODYgKi8KKworI2lmIGRlZmluZWQgKF9fYW1kNjRfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGRxICU1LCVxMVxuXHRhZGNxICUzLCVxMCIJCQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogIjAiICAoKFVESXR5cGUpKGFoKSksICJybWUiICgoVURJdHlwZSkoYmgpKSwJCVwKKwkgICAgICIlMSIgKChVREl0eXBlKShhbCkpLCAicm1lIiAoKFVESXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgic3VicSAlNSwlcTFcblx0c2JicSAlMywlcTAiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVESXR5cGUpKGFoKSksICJybWUiICgoVURJdHlwZSkoYmgpKSwJCVwKKwkgICAgICIxIiAoKFVESXR5cGUpKGFsKSksICJybWUiICgoVURJdHlwZSkoYmwpKSkKKyNpZiBYODZfQVNNX01VTFggXAorICAgJiYgKEhBVkVfSE9TVF9DUFVfaGFzd2VsbCB8fCBIQVZFX0hPU1RfQ1BVX2Jyb2Fkd2VsbCBcCisgICAgICAgfHwgSEFWRV9IT1NUX0NQVV9za3lsYWtlIHx8IEhBVkVfSE9TVF9DUFVfYmQ0IHx8IEhBVkVfSE9TVF9DUFVfemVuKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx4XHQlMywgJXEwLCAlcTEiCQkJCQkJXAorCSAgIDogIj1yIiAodzApLCAiPXIiICh3MSkJCQkJCVwKKwkgICA6ICIlZCIgKChVREl0eXBlKSh1KSksICJybSIgKChVREl0eXBlKSh2KSkpCisjZWxzZQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWxxXHQlMyIJCQkJCQkJXAorCSAgIDogIj1hIiAodzApLCAiPWQiICh3MSkJCQkJCVwKKwkgICA6ICIlMCIgKChVREl0eXBlKSh1KSksICJybSIgKChVREl0eXBlKSh2KSkpCisjZW5kaWYKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGR4KSAvKiBkIHJlbmFtZWQgdG8gZHggYXZvaWRpbmcgIj1kIiAqL1wKKyAgX19hc21fXyAoImRpdnEgJTQiCQkgICAgIC8qIHN0cmluZ2lmaWNhdGlvbiBpbiBLJlIgQyAqLwlcCisJICAgOiAiPWEiIChxKSwgIj1kIiAocikJCQkJCQlcCisJICAgOiAiMCIgKChVREl0eXBlKShuMCkpLCAiMSIgKChVREl0eXBlKShuMSkpLCAicm0iICgoVURJdHlwZSkoZHgpKSkKKworI2lmIEhBVkVfSE9TVF9DUFVfaGFzd2VsbCB8fCBIQVZFX0hPU1RfQ1BVX2Jyb2Fkd2VsbCB8fCBIQVZFX0hPU1RfQ1BVX3NreWxha2UgXAorICB8fCBIQVZFX0hPU1RfQ1BVX2sxMCB8fCBIQVZFX0hPU1RfQ1BVX2JkMSB8fCBIQVZFX0hPU1RfQ1BVX2JkMglcCisgIHx8IEhBVkVfSE9TVF9DUFVfYmQzIHx8IEhBVkVfSE9TVF9DUFVfYmQ0IHx8IEhBVkVfSE9TVF9DUFVfemVuCVwKKyAgfHwgSEFWRV9IT1NUX0NQVV9ib2JjYXQgfHwgSEFWRV9IT1NUX0NQVV9qYWd1YXIKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICAvKiBUaGlzIGlzIGx6Y250LCBzcGVsbGVkIGZvciBvbGRlciBhc3NlbWJsZXJzLiAgRGVzdGluYXRpb24gYW5kICovCVwKKyAgICAvKiBzb3VyY2UgbXVzdCBiZSBhIDY0LWJpdCByZWdpc3RlcnMsIGhlbmNlIGNhc3QgYW5kICVxLiAgICAgICAgICovCVwKKyAgICBfX2FzbV9fICgicmVwO2Jzclx0JTEsICVxMCIgOiAiPXIiIChjb3VudCkgOiAicm0iICgoVURJdHlwZSkoeCkpKTsJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgNjQKKyNlbHNlCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVURJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNyXHQlMSwlMCIgOiAiPXIiIChfX2NidG1wKSA6ICJybSIgKChVREl0eXBlKSh4KSkpOwlcCisgICAgKGNvdW50KSA9IF9fY2J0bXAgXiA2MzsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIEhBVkVfSE9TVF9DUFVfYmQyIHx8IEhBVkVfSE9TVF9DUFVfYmQzIHx8IEhBVkVfSE9TVF9DUFVfYmQ0IFwKKyAgfHwgSEFWRV9IT1NUX0NQVV96ZW4gfHwgSEFWRV9IT1NUX0NQVV9qYWd1YXIKKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgLyogVGhpcyBpcyB0emNudCwgc3BlbGxlZCBmb3Igb2xkZXIgYXNzZW1ibGVycy4gIERlc3RpbmF0aW9uIGFuZCAqLwlcCisgICAgLyogc291cmNlIG11c3QgYmUgYSA2NC1iaXQgcmVnaXN0ZXJzLCBoZW5jZSBjYXN0IGFuZCAlcS4gICAgICAgICAqLwlcCisgICAgX19hc21fXyAoInJlcDtic2ZcdCUxLCAlcTAiIDogIj1yIiAoY291bnQpIDogInJtIiAoKFVESXR5cGUpKHgpKSk7CVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09VTlRfVFJBSUxJTkdfWkVST1NfMCA2NAorI2Vsc2UKKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgQVNTRVJUICgoeCkgIT0gMCk7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiYnNmXHQlMSwgJXEwIiA6ICI9ciIgKGNvdW50KSA6ICJybSIgKChVREl0eXBlKSh4KSkpOwlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZiAvKiBfX2FtZDY0X18gKi8KKworI2lmIGRlZmluZWQgKF9faTg2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSByc2hpZnRfcmhsYyhyLGgsbCxjKSBcCisgIF9fYXNtX18gKCJzaHIgJTMscjAscjBcO3NocmQgJTEsJTIsJTAiCQkJCVwKKwkgICAiPXIiIChyKSA6ICJyIiAoaCksICJyIiAobCksICJybiIgKGMpKQorI2VuZGlmIC8qIGk4NjAgKi8KKworI2lmIGRlZmluZWQgKF9faTk2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImNtcG8gMSwwXDthZGRjICU1LCU0LCUxXDthZGRjICUzLCUyLCUwIgkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogImRJIiAoYWgpLCAiZEkiIChiaCksICIlZEkiIChhbCksICJkSSIgKGJsKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJjbXBvIDAsMFw7c3ViYyAlNSwlNCwlMVw7c3ViYyAlMywlMiwlMCIJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICJkSSIgKGFoKSwgImRJIiAoYmgpLCAiZEkiIChhbCksICJkSSIgKGJsKSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICAoe3VuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgX19hc21fXyAoImVtdWwgJTIsJTEsJTAiCQkJCQkJXAorCSAgIDogIj1kIiAoX194Ll9fbGwpIDogIiVkSSIgKHUpLCAiZEkiICh2KSk7CQkJXAorICAodzEpID0gX194Ll9faS5fX2g7ICh3MCkgPSBfX3guX19pLl9fbDt9KQorI2RlZmluZSBfX3VtdWxzaWRpMyh1LCB2KSBcCisgICh7VURJdHlwZSBfX3c7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiZW11bCAlMiwlMSwlMCIgOiAiPWQiIChfX3cpIDogIiVkSSIgKHUpLCAiZEkiICh2KSk7CVwKKyAgICBfX3c7IH0pCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbmgsIG5sLCBkKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9fbm47CQkJCQkJCVwKKyAgICBfX25uLl9faS5fX2ggPSAobmgpOyBfX25uLl9faS5fX2wgPSAobmwpOwkJCQlcCisgICAgX19hc21fXyAoImVkaXYgJWQsJW4sJTAiCQkJCQkJXAorCSAgIDogIj1kIiAoX19ycS5fX2xsKSA6ICJkSSIgKF9fbm4uX19sbCksICJkSSIgKGQpKTsJCVwKKyAgICAocikgPSBfX3JxLl9faS5fX2w7IChxKSA9IF9fcnEuX19pLl9faDsJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX2NidG1wOwkJCQkJCQlcCisgICAgX19hc21fXyAoInNjYW5iaXQgJTEsJTAiIDogIj1yIiAoX19jYnRtcCkgOiAiciIgKHgpKTsJCVwKKyAgICAoY291bnQpID0gX19jYnRtcCBeIDMxOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wICgtMzIpIC8qIHNpYyAqLworI2lmIGRlZmluZWQgKF9faTk2MG14KQkJLyogd2hhdCBpcyB0aGUgcHJvcGVyIHN5bWJvbCB0byB0ZXN0Pz8/ICovCisjZGVmaW5lIHJzaGlmdF9yaGxjKHIsaCxsLGMpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7fSBfX2k7CQkJCVwKKwkgIH0gX19ubjsJCQkJCQkJXAorICAgIF9fbm4uX19pLl9faCA9IChoKTsgX19ubi5fX2kuX19sID0gKGwpOwkJCQlcCisgICAgX19hc21fXyAoInNocmUgJTIsJTEsJTAiIDogIj1kIiAocikgOiAiZEkiIChfX25uLl9fbGwpLCAiZEkiIChjKSk7CVwKKyAgfQorI2VuZGlmIC8qIGk5NjBteCAqLworI2VuZGlmIC8qIGk5NjAgKi8KKworCisjaWYgZGVmaW5lZCAoX19sb29uZ2FyY2g2NCkgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX191ID0gKHUpLCBfX3YgPSAodik7CQkJCQlcCisgICAgKHcwKSA9IF9fdSAqIF9fdjsJCQkJCQkJXAorICAgICh3MSkgPSAodW5zaWduZWQgX19pbnQxMjhfXykgX191ICogX192ID4+IDY0OwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKyNpZiAoZGVmaW5lZCAoX19tYzY4MDAwX18pIHx8IGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKG1jNjgwMjApIFwKKyAgICAgfHwgZGVmaW5lZCAoX19tNjhrX18pIHx8IGRlZmluZWQgKF9fbWM1MjAwX18pIHx8IGRlZmluZWQgKF9fbWM1MjA2ZV9fKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM1MzA3X18pKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZCUubCAlNSwlMVxuXHRhZGR4JS5sICUzLCUwIgkJCQlcCisJICAgOiAiPWQiIChzaCksICI9JmQiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiZCIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YiUubCAlNSwlMVxuXHRzdWJ4JS5sICUzLCUwIgkJCQlcCisJICAgOiAiPWQiIChzaCksICI9JmQiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJkIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKy8qIFRoZSAnMDIwLCAnMDMwLCAnMDQwIGFuZCBDUFUzMiBoYXZlIDMyeDMyLT42NCBhbmQgNjQvMzItPjMycS0zMnIuICAqLworI2lmIGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKG1jNjgwMjApIFwKKyAgICAgfHwgZGVmaW5lZCAoX19tYzY4MDMwX18pIHx8IGRlZmluZWQgKG1jNjgwMzApIFwKKyAgICAgfHwgZGVmaW5lZCAoX19tYzY4MDQwX18pIHx8IGRlZmluZWQgKG1jNjgwNDApIFwKKyAgICAgfHwgZGVmaW5lZCAoX19tY3B1MzJfXykgfHwgZGVmaW5lZCAobWNwdTMyKSBcCisgICAgIHx8IGRlZmluZWQgKF9fTmVYVF9fKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx1JS5sICUzLCUxOiUwIgkJCQkJCVwKKwkgICA6ICI9ZCIgKHcwKSwgIj1kIiAodzEpCQkJCQlcCisJICAgOiAiJTAiICgoVVNJdHlwZSkodSkpLCAiZG1pIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgX19hc21fXyAoImRpdnUlLmwgJTQsJTE6JTAiCQkJCQkJXAorCSAgIDogIj1kIiAocSksICI9ZCIgKHIpCQkJCQkJXAorCSAgIDogIjAiICgoVVNJdHlwZSkobjApKSwgIjEiICgoVVNJdHlwZSkobjEpKSwgImRtaSIgKChVU0l0eXBlKShkKSkpCisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCJkaXZzJS5sICU0LCUxOiUwIgkJCQkJCVwKKwkgICA6ICI9ZCIgKHEpLCAiPWQiIChyKQkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKG4wKSksICIxIiAoKFVTSXR5cGUpKG4xKSksICJkbWkiICgoVVNJdHlwZSkoZCkpKQorI2Vsc2UgLyogZm9yIG90aGVyIDY4ayBmYW1pbHkgbWVtYmVycyB1c2UgMTZ4MTYtPjMyIG11bHRpcGxpY2F0aW9uICovCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIGEsIGIpIFwKKyAgZG8geyBVU0l0eXBlIF9fdW11bF90bXAxLCBfX3VtdWxfdG1wMjsJCQkJXAorCV9fYXNtX18gKCJ8IElubGluZWQgdW11bF9wcG1tXG4iCQkJCVwKKyIJbW92ZSUubAklNSwlM1xuIgkJCQkJCVwKKyIJbW92ZSUubAklMiwlMFxuIgkJCQkJCVwKKyIJbW92ZSUudwklMywlMVxuIgkJCQkJCVwKKyIJc3dhcAklM1xuIgkJCQkJCQlcCisiCXN3YXAJJTBcbiIJCQkJCQkJXAorIgltdWx1JS53CSUyLCUxXG4iCQkJCQkJXAorIgltdWx1JS53CSUzLCUwXG4iCQkJCQkJXAorIgltdWx1JS53CSUyLCUzXG4iCQkJCQkJXAorIglzd2FwCSUyXG4iCQkJCQkJCVwKKyIJbXVsdSUudwklNSwlMlxuIgkJCQkJCVwKKyIJYWRkJS5sCSUzLCUyXG4iCQkJCQkJXAorIglqY2MJMWZcbiIJCQkJCQkJXAorIglhZGQlLmwJJSMweDEwMDAwLCUwXG4iCQkJCQkJXAorIjE6CW1vdmUlLmwJJTIsJTNcbiIJCQkJCQlcCisiCWNsciUudwklMlxuIgkJCQkJCQlcCisiCXN3YXAJJTJcbiIJCQkJCQkJXAorIglzd2FwCSUzXG4iCQkJCQkJCVwKKyIJY2xyJS53CSUzXG4iCQkJCQkJCVwKKyIJYWRkJS5sCSUzLCUxXG4iCQkJCQkJXAorIglhZGR4JS5sCSUyLCUwXG4iCQkJCQkJXAorIgl8IEVuZCBpbmxpbmVkIHVtdWxfcHBtbSIJCQkJCVwKKwkgICAgICA6ICI9JmQiICh4aCksICI9JmQiICh4bCksCQkJCQlcCisJCSI9JmQiIChfX3VtdWxfdG1wMSksICI9JmQiIChfX3VtdWxfdG1wMikJCQlcCisJICAgICAgOiAiJTIiICgoVVNJdHlwZSkoYSkpLCAiZCIgKChVU0l0eXBlKShiKSkpOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmIC8qIG5vdCBtYzY4MDIwICovCisvKiBUaGUgJzAyMCwgJzAzMCwgJzA0MCBhbmQgJzA2MCBoYXZlIGJpdGZpZWxkIGluc25zLgorICAgR0NDIDMuNCBkZWZpbmVzIF9fbWM2ODAyMF9fIHdoZW4gaW4gQ1BVMzIgbW9kZSwgY2hlY2sgZm9yIF9fbWNwdTMyX18gdG8KKyAgIGV4Y2x1ZGUgYmZmZm8gb24gdGhhdCBjaGlwIChiaXRmaWVsZCBpbnNucyBub3QgYXZhaWxhYmxlKS4gICovCisjaWYgKGRlZmluZWQgKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkIChtYzY4MDIwKSAgICBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODAzMF9fKSB8fCBkZWZpbmVkIChtYzY4MDMwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODA0MF9fKSB8fCBkZWZpbmVkIChtYzY4MDQwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fbWM2ODA2MF9fKSB8fCBkZWZpbmVkIChtYzY4MDYwKSBcCisgICAgIHx8IGRlZmluZWQgKF9fTmVYVF9fKSkJCQkgICBcCisgICYmICEgZGVmaW5lZCAoX19tY3B1MzJfXykKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgiYmZmZm8gJTF7JWIyOiViMn0sJTAiCQkJCQlcCisJICAgOiAiPWQiIChjb3VudCkJCQkJCQlcCisJICAgOiAib2QiICgoVVNJdHlwZSkgKHgpKSwgIm4iICgwKSkKKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIDMyCisjZW5kaWYKKyNlbmRpZiAvKiBtYzY4MDAwICovCisKKyNpZiBkZWZpbmVkIChfX204ODAwMF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZHUuY28gJTEsJXI0LCVyNVxuXHRhZGR1LmNpICUwLCVyMiwlcjMiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAickoiIChhaCksICJySiIgKGJoKSwgIiVySiIgKGFsKSwgInJKIiAoYmwpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YnUuY28gJTEsJXI0LCVyNVxuXHRzdWJ1LmNpICUwLCVyMiwlcjMiCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAickoiIChhaCksICJySiIgKGJoKSwgInJKIiAoYWwpLCAickoiIChibCkpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fY2J0bXA7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgiZmYxICUwLCUxIiA6ICI9ciIgKF9fY2J0bXApIDogInIiICh4KSk7CQkJXAorICAgIChjb3VudCkgPSBfX2NidG1wIF4gMzE7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgNjMgLyogc2ljICovCisjaWYgZGVmaW5lZCAoX19tODgxMTBfXykKKyNkZWZpbmUgdW11bF9wcG1tKHdoLCB3bCwgdSwgdikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIHVuaW9uIHtVREl0eXBlIF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsdS5kICUwLCUxLCUyIiA6ICI9ciIgKF9feC5fX2xsKSA6ICJyIiAodSksICJyIiAodikpOwlcCisgICAgKHdoKSA9IF9feC5fX2kuX19oOwkJCQkJCQlcCisgICAgKHdsKSA9IF9feC5fX2kuX19sOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feCwgX19xOwkJCQkJCQlcCisgIF9feC5fX2kuX19oID0gKG4xKTsgX194Ll9faS5fX2wgPSAobjApOwkJCQlcCisgIF9fYXNtX18gKCJkaXZ1LmQgJTAsJTEsJTIiCQkJCQkJXAorCSAgIDogIj1yIiAoX19xLl9fbGwpIDogInIiIChfX3guX19sbCksICJyIiAoZCkpOwkJXAorICAocikgPSAobjApIC0gX19xLl9fbCAqIChkKTsgKHEpID0gX19xLl9fbDsgfSkKKyNlbmRpZiAvKiBfX204ODExMF9fICovCisjZW5kaWYgLyogX19tODgwMDBfXyAqLworCisjaWYgZGVmaW5lZCAoX19taXBzKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2lmIF9fR01QX0dOVUNfUFJFUkVRICg0LDQpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbGwgPSAoVURJdHlwZSkodSkgKiAodik7CQkJCQlcCisgICAgdzEgPSBfX2xsID4+IDMyOwkJCQkJCQlcCisgICAgdzAgPSBfX2xsOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKHVtdWxfcHBtbSkgJiYgX19HTVBfR05VQ19QUkVSRVEgKDIsNykgJiYgIWRlZmluZWQgKF9fY2xhbmdfXykKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVsdHUgJTIsJTMiIDogIj1sIiAodzApLCAiPWgiICh3MSkgOiAiZCIgKHUpLCAiZCIgKHYpKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKHVtdWxfcHBtbSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgibXVsdHUgJTIsJTNcblx0bWZsbyAlMFxuXHRtZmhpICUxIgkJCQlcCisJICAgOiAiPWQiICh3MCksICI9ZCIgKHcxKSA6ICJkIiAodSksICJkIiAodikpCisjZW5kaWYKKyNlbmRpZiAvKiBfX21pcHMgKi8KKworI2lmIChkZWZpbmVkIChfX21pcHMpICYmIF9fbWlwcyA+PSAzKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2lmIGRlZmluZWQgKF9NSVBTX0FSQ0hfTUlQUzY0UjYpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAodSksIF9fbTEgPSAodik7CQkJCQlcCisgICAgKHcwKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgICAgX19hc21fXyAoImRtdWh1XHQlMCwgJTEsICUyIiA6ICI9ZCIgKHcxKSA6ICJkIiAoX19tMCksICJkIiAoX19tMSkpOwlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKSAmJiBfX0dNUF9HTlVDX1BSRVJFUSAoNCw0KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19sbF9VVEl0eXBlIF9fYXR0cmlidXRlX18oKG1vZGUoVEkpKSk7CVwKKyAgICBfX2xsX1VUSXR5cGUgX19sbCA9IChfX2xsX1VUSXR5cGUpKHUpICogKHYpOwkJCVwKKyAgICB3MSA9IF9fbGwgPj4gNjQ7CQkJCQkJCVwKKyAgICB3MCA9IF9fbGw7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKSAmJiBfX0dNUF9HTlVDX1BSRVJFUSAoMiw3KSAmJiAhZGVmaW5lZCAoX19jbGFuZ19fKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJkbXVsdHUgJTIsJTMiCQkJCQkJXAorCSAgIDogIj1sIiAodzApLCAiPWgiICh3MSkJCQkJCVwKKwkgICA6ICJkIiAoKFVESXR5cGUpKHUpKSwgImQiICgoVURJdHlwZSkodikpKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKHVtdWxfcHBtbSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiZG11bHR1ICUyLCUzXG5cdG1mbG8gJTBcblx0bWZoaSAlMSIJCQkJXAorCSAgIDogIj1kIiAodzApLCAiPWQiICh3MSkJCQkJCVwKKwkgICA6ICJkIiAoKFVESXR5cGUpKHUpKSwgImQiICgoVURJdHlwZSkodikpKQorI2VuZGlmCisjZW5kaWYgLyogX19taXBzICovCisKKyNpZiBkZWZpbmVkIChfX21taXhfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiTVVMVSAlMCwlMiwlMyIgOiAiPXIiICh3MCksICI9eiIgKHcxKSA6ICJyIiAodSksICJyIiAodikpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fbnMzMjAwMF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICBfX2FzbV9fICgibWVpZCAlMiwlMCIJCQkJCQkJXAorCSAgIDogIj1nIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwgImciICgoVVNJdHlwZSkodikpKTsJCQlcCisgICh3MSkgPSBfX3guX19pLl9faDsgKHcwKSA9IF9feC5fX2kuX19sO30pCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKyAgKHtVREl0eXBlIF9fdzsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtZWlkICUyLCUwIgkJCQkJCVwKKwkgICAgIDogIj1nIiAoX193KQkJCQkJCVwKKwkgICAgIDogIiUwIiAoKFVTSXR5cGUpKHUpKSwgImciICgoVVNJdHlwZSkodikpKTsJCVwKKyAgICBfX3c7IH0pCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgICh7dW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICBfX3guX19pLl9faCA9IChuMSk7IF9feC5fX2kuX19sID0gKG4wKTsJCQkJXAorICBfX2FzbV9fICgiZGVpZCAlMiwlMCIJCQkJCQkJXAorCSAgIDogIj1nIiAoX194Ll9fbGwpCQkJCQkJXAorCSAgIDogIjAiIChfX3guX19sbCksICJnIiAoKFVTSXR5cGUpKGQpKSk7CQkJXAorICAocikgPSBfX3guX19pLl9fbDsgKHEpID0gX194Ll9faS5fX2g7IH0pCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50LHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBfX2FzbV9fICgiZmZzZAklMiwlMCIJCQkJCQlcCisJICAgICA6ICI9ciIgKGNvdW50KQkJCQkJCVwKKwkgICAgIDogIjAiICgoVVNJdHlwZSkgMCksICJyIiAoKFVTSXR5cGUpICh4KSkpOwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBfX25zMzIwMDBfXyAqLworCisvKiBJbiB0aGUgcGFzdCB3ZSBoYWQgYSBibG9jayBvZiB2YXJpb3VzICNkZWZpbmVzIHRlc3RlZAorICAgICAgIF9BUkNIX1BQQyAgICAtIEFJWAorICAgICAgIF9BUkNIX1BXUiAgICAtIEFJWAorICAgICAgIF9fcG93ZXJwY19fICAtIGdjYworICAgICAgIF9fUE9XRVJQQ19fICAtIEJFT1MKKyAgICAgICBfX3BwY19fICAgICAgLSBEYXJ3aW4KKyAgICAgICBQUEMgICAgICAgICAgLSBvbGQgZ2NjLCBHTlUvTGludXgsIFN5c1YKKyAgIFRoZSBwbGFpbiBQUEMgdGVzdCB3YXMgbm90IGdvb2QgZm9yIHZ4V29ya3MsIHNpbmNlIFBQQyBpcyBkZWZpbmVkIG9uIGFsbAorICAgQ1BVcyB0aGVyZSAoZWcuIG02OGsgdG9vKSwgYXMgYSBjb25zdGFudCBvbmUgaXMgZXhwZWN0ZWQgdG8gY29tcGFyZQorICAgQ1BVX0ZBTUlMWSBhZ2FpbnN0LgorCisgICBBdCBhbnkgcmF0ZSwgdGhpcyB3YXMgcHJldHR5IHVuYXR0cmFjdGl2ZSBhbmQgYSBiaXQgZnJhZ2lsZS4gIFRoZSB1c2Ugb2YKKyAgIEhBVkVfSE9TVF9DUFVfRkFNSUxZIGlzIGRlc2lnbmVkIHRvIGN1dCB0aHJvdWdoIGl0IGFsbCBhbmQgYmUgc3VyZSBvZgorICAgZ2V0dGluZyB0aGUgZGVzaXJlZCBlZmZlY3QuCisKKyAgIEVOSEFOQ0UtTUU6IFdlIHNob3VsZCB0ZXN0IF9JQk1SMiBoZXJlIHdoZW4gd2UgYWRkIGFzc2VtYmx5IHN1cHBvcnQgZm9yCisgICB0aGUgc3lzdGVtIHZlbmRvciBjb21waWxlcnMuICAoSXMgdGhhdCB2ZW5kb3IgY29tcGlsZXJzIHdpdGggaW5saW5lIGFzbSwKKyAgIG9yIHdoYXQ/KSAgKi8KKworI2lmIChIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlciB8fCBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjKQlcCisgICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCQkJXAorICAgICAgX19hc21fXyAoImFkZCVJNGMgJTEsJTMsJTRcblx0YWRkemUgJTAsJTIiCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCksICJySSIgKGJsKQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gfihVU0l0eXBlKSAwKQkJXAorICAgICAgX19hc21fXyAoImFkZCVJNGMgJTEsJTMsJTRcblx0YWRkbWUgJTAsJTIiCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKSA6ICJyIiAoYWgpLCAiJXIiIChhbCksICJySSIgKGJsKQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgiYWRkJUk1YyAlMSwlNCwlNVxuXHRhZGRlICUwLCUyLCUzIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgKGFoKSwgInIiIChiaCksICIlciIgKGFsKSwgInJJIiAoYmwpCQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkgJiYgKGFoKSA9PSAwKQkJCQlcCisgICAgICBfX2FzbV9fICgic3ViZiVJM2MgJTEsJTQsJTNcblx0c3ViZnplICUwLCUyIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGJoKSwgInJJIiAoYWwpLCAiciIgKGJsKQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gfihVU0l0eXBlKSAwKQkJXAorICAgICAgX19hc21fXyAoInN1YmYlSTNjICUxLCU0LCUzXG5cdHN1YmZtZSAlMCwlMiIJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpIDogInIiIChiaCksICJySSIgKGFsKSwgInIiIChibCkJXAorCQkgX19DTE9CQkVSX0NDKTsJCQkJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IDApCQkJXAorICAgICAgX19hc21fXyAoInN1YmYlSTNjICUxLCU0LCUzXG5cdGFkZG1lICUwLCUyIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGFoKSwgInJJIiAoYWwpLCAiciIgKGJsKQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gfihVU0l0eXBlKSAwKQkJXAorICAgICAgX19hc21fXyAoInN1YmYlSTNjICUxLCU0LCUzXG5cdGFkZHplICUwLCUyIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkgOiAiciIgKGFoKSwgInJJIiAoYWwpLCAiciIgKGJsKQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgic3ViZiVJNGMgJTEsJTUsJTRcblx0c3ViZmUgJTAsJTMsJTIiCQkJXAorCSAgICAgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgICAgICA6ICJyIiAoYWgpLCAiciIgKGJoKSwgInJJIiAoYWwpLCAiciIgKGJsKQkJXAorCQkgX19DTE9CQkVSX0NDKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgX19hc21fXyAoImNudGx6dyAlMCwlMSIgOiAiPXIiIChjb3VudCkgOiAiciIgKHgpKQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAgMzIKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjCisjaWYgX19HTVBfR05VQ19QUkVSRVEgKDQsNCkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19sbCA9IChVREl0eXBlKSh1KSAqICh2KTsJCQkJCVwKKyAgICB3MSA9IF9fbGwgPj4gMzI7CQkJCQkJCVwKKyAgICB3MCA9IF9fbGw7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsaHd1ICUwLCUxLCUyIiA6ICI9ciIgKHBoKSA6ICIlciIgKG0wKSwgInIiIChtMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsaHcgJTAsJTEsJTIiIDogIj1yIiAocGgpIDogIiVyIiAobTApLCAiciIgKG0xKSk7CVwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIHNtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorICBfX2FzbV9fICgibXVsICUwLCUyLCUzIiA6ICI9ciIgKHhoKSwgIj1xIiAoeGwpIDogInIiIChtMCksICJyIiAobTEpKQorI2RlZmluZSBzZGl2X3Fybm5kKHEsIHIsIG5oLCBubCwgZCkgXAorICBfX2FzbV9fICgiZGl2ICUwLCUyLCU0IiA6ICI9ciIgKHEpLCAiPXEiIChyKSA6ICJyIiAobmgpLCAiMSIgKG5sKSwgInIiIChkKSkKKyNlbmRpZgorI2VuZGlmIC8qIDMyLWJpdCBQT1dFUiBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLworCisvKiBXZSBzaG91bGQgdGVzdCBfSUJNUjIgaGVyZSB3aGVuIHdlIGFkZCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgc3lzdGVtCisgICB2ZW5kb3IgY29tcGlsZXJzLiAgKi8KKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlcnBjICYmIFdfVFlQRV9TSVpFID09IDY0CisjaWYgIWRlZmluZWQgKF9MT05HX0xPTkdfTElNQikKKy8qIF9MT05HX0xPTkdfTElNQiBpcyBBQkk9bW9kZTMyIHdoZXJlIGFkZGUgb3BlcmF0ZXMgb24gMzItYml0IHZhbHVlcy4gIFNvCisgICB1c2UgYWRkZSBldGMgb25seSB3aGVuIG5vdCBfTE9OR19MT05HX0xJTUIuICAqLworI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IDApCQkJCVwKKyAgICAgIF9fYXNtX18gKCJhZGQlSTRjICUxLCUzLCU0XG5cdGFkZHplICUwLCUyIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgICgoVURJdHlwZSkoYWgpKSwJCQkJCVwKKwkJICIlciIgKChVREl0eXBlKShhbCkpLCAickkiICgoVURJdHlwZSkoYmwpKQkJXAorCQkgX19DTE9CQkVSX0NDKTsJCQkJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IH4oVURJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJhZGQlSTRjICUxLCUzLCU0XG5cdGFkZG1lICUwLCUyIgkJCVwKKwkgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICAgICAgOiAiciIgICgoVURJdHlwZSkoYWgpKSwJCQkJCVwKKwkJICIlciIgKChVREl0eXBlKShhbCkpLCAickkiICgoVURJdHlwZSkoYmwpKQkJXAorCQkgX19DTE9CQkVSX0NDKTsJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoImFkZCVJNWMgJTEsJTQsJTVcblx0YWRkZSAlMCwlMiwlMyIJCQlcCisJICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgICAgIDogInIiICAoKFVESXR5cGUpKGFoKSksICJyIiAgKChVREl0eXBlKShiaCkpLAkJXAorCQkgIiVyIiAoKFVESXR5cGUpKGFsKSksICJySSIgKChVREl0eXBlKShibCkpCQlcCisJCSBfX0NMT0JCRVJfQ0MpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKy8qIFdlIHVzZSAiKnJJIiBmb3IgdGhlIGNvbnN0YW50IG9wZXJhbmQgaGVyZSwgc2luY2Ugd2l0aCBqdXN0ICJJIiwgZ2NjIGJhcmZzLgorICAgVGhpcyBtaWdodCBzZWVtIHN0cmFuZ2UsIGJ1dCBnY2MgZm9sZHMgYXdheSB0aGUgZGVhZCBjb2RlIGxhdGUuICAqLworI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJsKQkJCQkJXAorCSYmIChibCkgPiAtMHg4MDAwICYmIChibCkgPD0gMHg4MDAwICYmIChibCkgIT0gMCkgewkJXAorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gMCkJCQlcCisJICBfX2FzbV9fICgiYWRkaWMgJTEsJTMsJTRcblx0c3ViZnplICUwLCUyIgkJCVwKKwkJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCQkgICA6ICAgICAgICAgICAgICAgICAgICAgICAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgICAgICJyIiAoKFVESXR5cGUpKGFsKSksICIqckkiICgtKChVREl0eXBlKShibCkpKQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gfihVREl0eXBlKSAwKQlcCisJICBfX2FzbV9fICgiYWRkaWMgJTEsJTMsJTRcblx0c3ViZm1lICUwLCUyIgkJCVwKKwkJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCQkgICA6ICAgICAgICAgICAgICAgICAgICAgICAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgICAgICJyIiAoKFVESXR5cGUpKGFsKSksICIqckkiICgtKChVREl0eXBlKShibCkpKQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCVwKKwkgIF9fYXNtX18gKCJhZGRpYyAlMSwlMywlNFxuXHRhZGRtZSAlMCwlMiIJCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAiciIgKChVREl0eXBlKShhaCkpLAkJCQlcCisJCSAgICAgInIiICgoVURJdHlwZSkoYWwpKSwgIipySSIgKC0oKFVESXR5cGUpKGJsKSkpCVwKKwkJICAgICBfX0NMT0JCRVJfQ0MpOwkJCQkJXAorCWVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSB+KFVESXR5cGUpIDApCVwKKwkgIF9fYXNtX18gKCJhZGRpYyAlMSwlMywlNFxuXHRhZGR6ZSAlMCwlMiIJCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAiciIgKChVREl0eXBlKShhaCkpLAkJCQlcCisJCSAgICAgInIiICgoVURJdHlwZSkoYWwpKSwgIipySSIgKC0oKFVESXR5cGUpKGJsKSkpCVwKKwkJICAgICBfX0NMT0JCRVJfQ0MpOwkJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkgIF9fYXNtX18gKCJhZGRpYyAlMSwlNCwlNVxuXHRzdWJmZSAlMCwlMywlMiIJCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAiciIgKChVREl0eXBlKShhaCkpLCAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgICAgICJyIiAoKFVESXR5cGUpKGFsKSksICIqckkiICgtKChVREl0eXBlKShibCkpKQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKyAgICB9IGVsc2UgewkJCQkJCQkJXAorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gMCkJCQlcCisJICBfX2FzbV9fICgic3ViZiVJM2MgJTEsJTQsJTNcblx0c3ViZnplICUwLCUyIgkJCVwKKwkJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCQkgICA6ICAgICAgICAgICAgICAgICAgICAgICAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgICAgICJySSIgKChVREl0eXBlKShhbCkpLCAiciIgKChVREl0eXBlKShibCkpCQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT0gfihVREl0eXBlKSAwKQlcCisJICBfX2FzbV9fICgic3ViZiVJM2MgJTEsJTQsJTNcblx0c3ViZm1lICUwLCUyIgkJCVwKKwkJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCQkgICA6ICAgICAgICAgICAgICAgICAgICAgICAiciIgKChVREl0eXBlKShiaCkpLAkJXAorCQkgICAgICJySSIgKChVREl0eXBlKShhbCkpLCAiciIgKChVREl0eXBlKShibCkpCQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCVwKKwkgIF9fYXNtX18gKCJzdWJmJUkzYyAlMSwlNCwlM1xuXHRhZGRtZSAlMCwlMiIJCQlcCisJCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkJICAgOiAiciIgICgoVURJdHlwZSkoYWgpKSwJCQkJXAorCQkgICAgICJySSIgKChVREl0eXBlKShhbCkpLCAiciIgKChVREl0eXBlKShibCkpCQlcCisJCSAgICAgX19DTE9CQkVSX0NDKTsJCQkJCVwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gfihVREl0eXBlKSAwKQlcCisJICBfX2FzbV9fICgic3ViZiVJM2MgJTEsJTQsJTNcblx0YWRkemUgJTAsJTIiCQkJXAorCQkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQlcCisJCSAgIDogInIiICAoKFVESXR5cGUpKGFoKSksCQkJCVwKKwkJICAgICAickkiICgoVURJdHlwZSkoYWwpKSwgInIiICgoVURJdHlwZSkoYmwpKQkJXAorCQkgICAgIF9fQ0xPQkJFUl9DQyk7CQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCSAgX19hc21fXyAoInN1YmYlSTRjICUxLCU1LCU0XG5cdHN1YmZlICUwLCUzLCUyIgkJXAorCQkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQlcCisJCSAgIDogInIiICAoKFVESXR5cGUpKGFoKSksICJyIiAoKFVESXR5cGUpKGJoKSksCQlcCisJCSAgICAgInJJIiAoKFVESXR5cGUpKGFsKSksICJyIiAoKFVESXR5cGUpKGJsKSkJCVwKKwkJICAgICBfX0NMT0JCRVJfQ0MpOwkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogISBfTE9OR19MT05HX0xJTUIgKi8KKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgiY250bHpkICUwLCUxIiA6ICI9ciIgKGNvdW50KSA6ICJyIiAoeCkpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfMCA2NAorI2lmIF9fR01QX0dOVUNfUFJFUkVRICg0LDgpCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2xsX1VUSXR5cGUgX19hdHRyaWJ1dGVfXygobW9kZShUSSkpKTsJXAorICAgIF9fbGxfVVRJdHlwZSBfX2xsID0gKF9fbGxfVVRJdHlwZSkodSkgKiAodik7CQkJXAorICAgIHcxID0gX19sbCA+PiA2NDsJCQkJCQkJXAorICAgIHcwID0gX19sbDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVESXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJtdWxoZHUgJTAsJTEsJTIiIDogIj1yIiAocGgpIDogIiVyIiAoX19tMCksICJyIiAoX19tMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsaGQgJTAsJTEsJTIiIDogIj1yIiAocGgpIDogIiVyIiAoX19tMCksICJyIiAoX19tMSkpOwlcCisgICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogNjQtYml0IFBvd2VyUEMuICAqLworCisjaWYgZGVmaW5lZCAoX19weXJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJhZGR3ICU1LCUxXG5cdGFkZHdjICUzLCUwIgkJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiMCIgICgoVVNJdHlwZSkoYWgpKSwgImciICgoVVNJdHlwZSkoYmgpKSwJCQlcCisJICAgICAiJTEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWJ3ICU1LCUxXG5cdHN1YndiICUzLCUwIgkJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiMCIgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIxIiAoKFVTSXR5cGUpKGFsKSksICJnIiAoKFVTSXR5cGUpKGJsKSkpCisvKiBUaGlzIGluc24gd29ya3Mgb24gUHlyYW1pZHMgd2l0aCBBUCwgWFAsIG9yIE1JIENQVXMsIGJ1dCBub3Qgd2l0aCBTUC4gICovCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgKHt1bmlvbiB7VURJdHlwZSBfX2xsOwkJCQkJCVwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7fSBfX2k7CQkJCVwKKwkgIH0gX194OwkJCQkJCQlcCisgIF9fYXNtX18gKCJtb3Z3ICUxLCVSMFxuXHR1ZW11bCAlMiwlMCIJCQkJCVwKKwkgICA6ICI9JnIiIChfX3guX19sbCkJCQkJCQlcCisJICAgOiAiZyIgKChVU0l0eXBlKSAodSkpLCAiZyIgKChVU0l0eXBlKSh2KSkpOwkJCVwKKyAgKHcxKSA9IF9feC5fX2kuX19oOyAodzApID0gX194Ll9faS5fX2w7fSkKKyNlbmRpZiAvKiBfX3B5cl9fICovCisKKyNpZiBkZWZpbmVkIChfX2libTAzMl9fKSAvKiBSVC9ST01QICovICAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImEgJTEsJTVcblx0YWUgJTAsJTMiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiciIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiciIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInMgJTEsJTVcblx0c2UgJTAsJTMiCQkJCQlcCisJICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJyIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgInIiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc211bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisgIF9fYXNtX18gKAkJCQkJCQkJXAorICAgICAgICJzCXIyLHIyXG4iCQkJCQkJXAorIgltdHMgcjEwLCUyXG4iCQkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJbQlyMiwlM1xuIgkJCQkJCVwKKyIJY2FzCSUwLHIyLHIwXG4iCQkJCQkJXAorIgltZnMJcjEwLCUxIgkJCQkJCQlcCisJICAgOiAiPXIiIChwaCksICI9ciIgKHBsKQkJCQkJXAorCSAgIDogIiVyIiAoKFVTSXR5cGUpKG0wKSksICJyIiAoKFVTSXR5cGUpKG0xKSkJCQlcCisJICAgOiAicjIiKQorI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKCh4KSA+PSAweDEwMDAwKQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgiY2x6CSUwLCUxIgkJCQkJCVwKKwkgICAgICAgOiAiPXIiIChjb3VudCkgOiAiciIgKChVU0l0eXBlKSh4KSA+PiAxNikpOwkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19hc21fXyAoImNsegklMCwlMSIJCQkJCQlcCisJCSA6ICI9ciIgKGNvdW50KSA6ICJyIiAoKFVTSXR5cGUpKHgpKSk7CQkJXAorCShjb3VudCkgKz0gMTY7CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogUlQvUk9NUCAqLworCisjaWYgZGVmaW5lZCAoX19yaXNjdikgJiYgZGVmaW5lZCAoX19yaXNjdl9tdWwpICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIHUsIHYpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fdSA9ICh1KSwgX192ID0gKHYpOwkJCQkJXAorICAgIChwbCkgPSBfX3UgKiBfX3Y7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgibXVsaHVcdCUwLCAlMSwgJTIiIDogIj1yIiAocGgpIDogIiVyIiAoX191KSwgInIiIChfX3YpKTsJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX19TSDJfXykgfHwgZGVmaW5lZCAoX19TSDNfXykgfHwgZGVmaW5lZCAoX19TSDRfXykpICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKyAgX19hc21fXyAoImRtdWx1LmwgJTIsJTNcblx0c3RzIG1hY2wsJTFcblx0c3RzIG1hY2gsJTAiCQlcCisJICAgOiAiPXIiICh3MSksICI9ciIgKHcwKSA6ICJyIiAodSksICJyIiAodikgOiAibWFjbCIsICJtYWNoIikKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZGNjICVyNCwlNSwlMVxuXHRhZGR4ICVyMiwlMywlMCIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAickoiIChhaCksICJySSIgKGJoKSwiJXJKIiAoYWwpLCAickkiIChibCkJCQlcCisJICAgX19DTE9CQkVSX0NDKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YmNjICVyNCwlNSwlMVxuXHRzdWJ4ICVyMiwlMywlMCIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAickoiIChhaCksICJySSIgKGJoKSwgInJKIiAoYWwpLCAickkiIChibCkJXAorCSAgIF9fQ0xPQkJFUl9DQykKKy8qIEZJWE1FOiBXaGVuIGdjYyAtbWNwdT12OSBpcyB1c2VkIG9uIHNvbGFyaXMsIGdjYy9jb25maWcvc29sMi1zbGQtNjQuaAorICAgZG9lc24ndCBkZWZpbmUgYW55dGhpbmcgdG8gaW5kaWNhdGUgdGhhdCB0byB1cywgaXQgb25seSBzZXRzIF9fc3BhcmN2OC4gKi8KKyNpZiBkZWZpbmVkIChfX3NwYXJjX3Y5X18pIHx8IGRlZmluZWQgKF9fc3BhcmN2OSkKKy8qIFBlcmhhcHMgd2Ugc2hvdWxkIHVzZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGhlcmU/ICAqLworI2lmIDAKKy8qIFRyaWdnZXJzIGEgYnVnIG1ha2luZyBtcHovdGVzdHMvdC1nY2QuYyBmYWlsLgorICAgUGVyaGFwcyB3ZSBzaW1wbHkgbmVlZCBleHBsaWNpdGx5IHplcm8tZXh0ZW5kIHRoZSBpbnB1dHM/ICAqLworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisgIF9fYXNtX18gKCJtdWx4ICUyLCUzLCUlZzE7IHNybCAlJWcxLDAsJTE7IHNybHggJSVnMSwzMiwlMCIgOgkJXAorCSAgICI9ciIgKHcxKSwgIj1yIiAodzApIDogInIiICh1KSwgInIiICh2KSA6ICJnMSIpCisjZWxzZQorLyogVXNlIHY4IHVtdWwgdW50aWwgYWJvdmUgYnVnIGlzIGZpeGVkLiAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgidW11bCAlMiwlMywlMTtyZCAlJXksJTAiIDogIj1yIiAodzEpLCAiPXIiICh3MCkgOiAiciIgKHUpLCAiciIgKHYpKQorI2VuZGlmCisvKiBVc2UgYSBwbGFpbiB2OCBkaXZpZGUgZm9yIHY5LiAgKi8KKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVU0l0eXBlIF9fcTsJCQkJCQkJXAorICAgIF9fYXNtX18gKCJtb3YgJTEsJSV5O25vcDtub3A7bm9wO3VkaXYgJTIsJTMsJTAiCQkJXAorCSAgICAgOiAiPXIiIChfX3EpIDogInIiIChuMSksICJyIiAobjApLCAiciIgKGQpKTsJCVwKKyAgICAocikgPSAobjApIC0gX19xICogKGQpOwkJCQkJCVwKKyAgICAocSkgPSBfX3E7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2lmIGRlZmluZWQgKF9fc3BhcmNfdjhfXykgICAvKiBnY2Mgbm9ybWFsICovCQkJCVwKKyAgfHwgZGVmaW5lZCAoX19zcGFyY3Y4KSAgICAgLyogZ2NjIHNvbGFyaXMgKi8JCQkJXAorICB8fCBIQVZFX0hPU1RfQ1BVX3N1cGVyc3BhcmMKKy8qIERvbid0IG1hdGNoIGltbWVkaWF0ZSByYW5nZSBiZWNhdXNlLCAxKSBpdCBpcyBub3Qgb2Z0ZW4gdXNlZnVsLAorICAgMikgdGhlICdJJyBmbGFnIHRoaW5rcyBvZiB0aGUgcmFuZ2UgYXMgYSAxMyBiaXQgc2lnbmVkIGludGVydmFsLAorICAgd2hpbGUgd2Ugd2FudCB0byBtYXRjaCBhIDEzIGJpdCBpbnRlcnZhbCwgc2lnbiBleHRlbmRlZCB0byAzMiBiaXRzLAorICAgYnV0IElOVEVSUFJFVEVEIEFTIFVOU0lHTkVELiAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgidW11bCAlMiwlMywlMTtyZCAlJXksJTAiIDogIj1yIiAodzEpLCAiPXIiICh3MCkgOiAiciIgKHUpLCAiciIgKHYpKQorCisjaWYgSEFWRV9IT1NUX0NQVV9zdXBlcnNwYXJjCisjZWxzZQorLyogRG9uJ3QgdXNlIHRoaXMgb24gU3VwZXJTUEFSQyBiZWNhdXNlIGl0cyB1ZGl2IG9ubHkgaGFuZGxlcyA1MyBiaXQKKyAgIGRpdmlkZW5kcyBhbmQgd2lsbCB0cmFwIHRvIHRoZSBrZXJuZWwgZm9yIHRoZSByZXN0LiAqLworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVTSXR5cGUgX19xOwkJCQkJCQlcCisgICAgX19hc21fXyAoIm1vdiAlMSwlJXk7bm9wO25vcDtub3A7dWRpdiAlMiwlMywlMCIJCQlcCisJICAgICA6ICI9ciIgKF9fcSkgOiAiciIgKG4xKSwgInIiIChuMCksICJyIiAoZCkpOwkJXAorICAgIChyKSA9IChuMCkgLSBfX3EgKiAoZCk7CQkJCQkJXAorICAgIChxKSA9IF9fcTsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBIQVZFX0hPU1RfQ1BVX3N1cGVyc3BhcmMgKi8KKworI2Vsc2UgLyogISBfX3NwYXJjX3Y4X18gKi8KKyNpZiBkZWZpbmVkIChfX3NwYXJjbGl0ZV9fKQorLyogVGhpcyBoYXMgaGFyZHdhcmUgbXVsdGlwbHkgYnV0IG5vdCBkaXZpZGUuICBJdCBhbHNvIGhhcyB0d28gYWRkaXRpb25hbAorICAgaW5zdHJ1Y3Rpb25zIHNjYW4gKGZmcyBmcm9tIGhpZ2ggYml0KSBhbmQgZGl2c2NjLiAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgidW11bCAlMiwlMywlMTtyZCAlJXksJTAiIDogIj1yIiAodzEpLCAiPXIiICh3MCkgOiAiciIgKHUpLCAiciIgKHYpKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBfX2FzbV9fICgiISBJbmxpbmVkIHVkaXZfcXJubmRcbiIJCQkJCVwKKyIJd3IJJSVnMCwlMiwlJXkJISBOb3QgYSBkZWxheWVkIHdyaXRlIGZvciBzcGFyY2xpdGVcbiIJXAorIgl0c3QJJSVnMFxuIgkJCQkJCQlcCisiCWRpdnNjYwklMywlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlJWcxXG4iCQkJCQkJXAorIglkaXZzY2MJJSVnMSwlNCwlMFxuIgkJCQkJCVwKKyIJcmQJJSV5LCUxXG4iCQkJCQkJXAorIglibCxhIDFmXG4iCQkJCQkJCVwKKyIJYWRkCSUxLCU0LCUxXG4iCQkJCQkJXAorIjE6CSEgRW5kIG9mIGlubGluZSB1ZGl2X3Fybm5kIgkJCQkJXAorCSAgIDogIj1yIiAocSksICI9ciIgKHIpIDogInIiIChuMSksICJyIiAobjApLCAickkiIChkKQkJXAorCSAgIDogIiVnMSIgX19BTkRfQ0xPQkJFUl9DQykKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgic2NhbiAlMSwxLCUwIiA6ICI9ciIgKGNvdW50KSA6ICJyIiAoeCkpCisvKiBFYXJseSBzcGFyY2xpdGVzIHJldHVybiA2MyBmb3IgYW4gYXJndW1lbnQgb2YgMCwgYnV0IHRoZXkgd2FybiB0aGF0IGZ1dHVyZQorICAgaW1wbGVtZW50YXRpb25zIG1pZ2h0IGNoYW5nZSB0aGlzLiAgVGhlcmVmb3JlLCBsZWF2ZSBDT1VOVF9MRUFESU5HX1pFUk9TXzAKKyAgIHVuZGVmaW5lZC4gICovCisjZW5kaWYgLyogX19zcGFyY2xpdGVfXyAqLworI2VuZGlmIC8qIF9fc3BhcmNfdjhfXyAqLworI2VuZGlmIC8qIF9fc3BhcmNfdjlfXyAqLworLyogRGVmYXVsdCB0byBzcGFyYyB2NyB2ZXJzaW9ucyBvZiB1bXVsX3BwbW0gYW5kIHVkaXZfcXJubmQuICAqLworI2lmbmRlZiB1bXVsX3BwbW0KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiISBJbmxpbmVkIHVtdWxfcHBtbVxuIgkJCQkJXAorIgl3cgklJWcwLCUyLCUleQkhIFNQQVJDIGhhcyAwLTMgZGVsYXkgaW5zbiBhZnRlciBhIHdyXG4iIFwKKyIJc3JhCSUzLDMxLCUlZzIJISBEb24ndCBtb3ZlIHRoaXMgaW5zblxuIgkJXAorIglhbmQJJTIsJSVnMiwlJWcyCSEgRG9uJ3QgbW92ZSB0aGlzIGluc25cbiIJCVwKKyIJYW5kY2MJJSVnMCwwLCUlZzEJISBEb24ndCBtb3ZlIHRoaXMgaW5zblxuIgkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwlMywlJWcxXG4iCQkJCQkJXAorIgltdWxzY2MJJSVnMSwwLCUlZzFcbiIJCQkJCQlcCisiCWFkZAklJWcxLCUlZzIsJTBcbiIJCQkJCQlcCisiCXJkCSUleSwlMSIJCQkJCQkJXAorCSAgIDogIj1yIiAodzEpLCAiPXIiICh3MCkgOiAiJXJJIiAodSksICJyIiAodikJCQlcCisJICAgOiAiJWcxIiwgIiVnMiIgX19BTkRfQ0xPQkJFUl9DQykKKyNlbmRpZgorI2lmbmRlZiB1ZGl2X3Fybm5kCisjaWZuZGVmIExPTkdMT05HX1NUQU5EQUxPTkUKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgZG8geyBVV3R5cGUgX19yOwkJCQkJCQlcCisgICAgKHEpID0gX19NUE4odWRpdl9xcm5uZCkgKCZfX3IsIChuMSksIChuMCksIChkKSk7CQkJXAorICAgIChyKSA9IF9fcjsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKK2V4dGVybiBVV3R5cGUgX19NUE4odWRpdl9xcm5uZCkgKFVXdHlwZSAqLCBVV3R5cGUsIFVXdHlwZSwgVVd0eXBlKTsKKyNlbmRpZiAvKiBMT05HTE9OR19TVEFOREFMT05FICovCisjZW5kaWYgLyogdWRpdl9xcm5uZCAqLworI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoCQkJCQkJCQlcCisgICAgICAgImFkZGNjCSVyNCwlNSwlMVxuIgkJCQkJCVwKKyAgICAgICIJYWRkY2NjCSVyNiwlNywlJWcwXG4iCQkJCQkJXAorICAgICAgIglhZGRjCSVyMiwlMywlMCIJCQkJCQlcCisgICAgICAgOiAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJCQlcCisgICAgICAgOiAickoiICAoKFVESXR5cGUpKGFoKSksICJySSIgKChVREl0eXBlKShiaCkpLAkJCVwKKwkgIiVySiIgKChVREl0eXBlKShhbCkpLCAickkiICgoVURJdHlwZSkoYmwpKSwJCQlcCisJICIlckoiICgoVURJdHlwZSkoYWwpID4+IDMyKSwgInJJIiAoKFVESXR5cGUpKGJsKSA+PiAzMikJXAorCSAgIF9fQ0xPQkJFUl9DQykKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKAkJCQkJCQkJXAorICAgICAgICJzdWJjYwklcjQsJTUsJTFcbiIJCQkJCQlcCisgICAgICAiCXN1YmNjYwklcjYsJTcsJSVnMFxuIgkJCQkJCVwKKyAgICAgICIJc3ViYwklcjIsJTMsJTAiCQkJCQkJXAorICAgICAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQkJXAorICAgICAgIDogInJKIiAoKFVESXR5cGUpKGFoKSksICJySSIgKChVREl0eXBlKShiaCkpLAkJCVwKKwkgInJKIiAoKFVESXR5cGUpKGFsKSksICJySSIgKChVREl0eXBlKShibCkpLAkJCVwKKwkgInJKIiAoKFVESXR5cGUpKGFsKSA+PiAzMiksICJySSIgKChVREl0eXBlKShibCkgPj4gMzIpCQlcCisJICAgX19DTE9CQkVSX0NDKQorI2lmIF9fVklTX18gPj0gMHgzMDAKKyN1bmRlZiBhZGRfc3NhYWFhCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgJCQkJCQkJCVwKKyAgICAgICAiYWRkY2MJJXI0LCAlNSwgJTFcbiIJCQkJCQlcCisgICAgICAiCWFkZHhjCSVyMiwgJXIzLCAlMCIJCQkJCQlcCisJICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorICAgICAgIDogInJKIiAgKChVREl0eXBlKShhaCkpLCAickoiICgoVURJdHlwZSkoYmgpKSwJCQlcCisJICIlckoiICgoVURJdHlwZSkoYWwpKSwgInJJIiAoKFVESXR5cGUpKGJsKSkgX19DTE9CQkVSX0NDKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCQkJCVwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgidW11bHhoaVx0JTIsICUxLCAlMCIJCQkJCVwKKwkgICAgIDogIj1yIiAocGgpCQkJCQkJXAorCSAgICAgOiAiJXIiIChfX20wKSwgInIiIChfX20xKSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgXAorICBfX2FzbV9fICgibHpkXHQlMSwlMCIgOiAiPXIiIChjb3VudCkgOiAiciIgKHgpKQorLyogTmVlZGVkIGJ5IGNvdW50X2xlYWRpbmdfemVyb3NfMzIgaW4gc3BhcmM2NC5oLiAgKi8KKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU19ORUVEX0NMWl9UQUIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX192YXgpIHx8IGRlZmluZWQgKF9fdmF4X18pKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoImFkZGwyICU1LCUxXG5cdGFkd2MgJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChzaCksICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShhaCkpLCAiZyIgKChVU0l0eXBlKShiaCkpLAkJCVwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgX19hc21fXyAoInN1YmwyICU1LCUxXG5cdHNid2MgJTMsJTAiCQkJCQlcCisJICAgOiAiPWciIChzaCksICI9JmciIChzbCkJCQkJCVwKKwkgICA6ICIwIiAoKFVTSXR5cGUpKGFoKSksICJnIiAoKFVTSXR5cGUpKGJoKSksCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc211bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge1VESXR5cGUgX19sbDsJCQkJCQlcCisJICAgc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAorICAgIF9fYXNtX18gKCJlbXVsICUxLCUyLCQwLCUwIgkJCQkJCVwKKwkgICAgIDogIj1nIiAoX194Ll9fbGwpIDogImciIChfX20wKSwgImciIChfX20xKSk7CQlcCisgICAgKHhoKSA9IF9feC5fX2kuX19oOyAoeGwpID0gX194Ll9faS5fX2w7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2Rpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICB1bmlvbiB7REl0eXBlIF9fbGw7CQkJCQkJCVwKKwkgICBzdHJ1Y3Qge1NJdHlwZSBfX2wsIF9faDt9IF9faTsJCQkJXAorCSAgfSBfX3g7CQkJCQkJCVwKKyAgICBfX3guX19pLl9faCA9IG4xOyBfX3guX19pLl9fbCA9IG4wOwkJCQkJXAorICAgIF9fYXNtX18gKCJlZGl2ICUzLCUyLCUwLCUxIgkJCQkJCVwKKwkgICAgIDogIj1nIiAocSksICI9ZyIgKHIpIDogImciIChfX3guX19sbCksICJnIiAoZCkpOwkJXAorICB9IHdoaWxlICgwKQorI2lmIDAKKy8qIEZJWE1FOiBUaGlzIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYmUgdW5pbXBsZW1lbnRlZCBvbiBzb21lIHN5c3RlbXMgKHZheAorICAgODgwMCBtYXliZSkuICovCisjZGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50LHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgX19hc21fXyAoImZmcyAwLCAzMSwgJTEsICUwIgkJCQkJXAorCSAgICAgOiAiPWciIChjb3VudCkJCQkJCQlcCisJICAgICA6ICJnIiAoKFVTSXR5cGUpICh4KSkpOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisjZW5kaWYgLyogdmF4ICovCisKKyNpZiBkZWZpbmVkIChfX3o4MDAwX18pICYmIFdfVFlQRV9TSVpFID09IDE2CisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBfX2FzbV9fICgiYWRkCSVIMSwlSDVcblx0YWRjCSVIMCwlSDMiCQkJCVwKKwkgICA6ICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQkJXAorCSAgIDogIjAiICAoKHVuc2lnbmVkIGludCkoYWgpKSwgInIiICgodW5zaWduZWQgaW50KShiaCkpLAlcCisJICAgICAiJTEiICgodW5zaWduZWQgaW50KShhbCkpLCAiclFSIiAoKHVuc2lnbmVkIGludCkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIF9fYXNtX18gKCJzdWIJJUgxLCVINVxuXHRzYmMJJUgwLCVIMyIJCQkJXAorCSAgIDogIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCQlcCisJICAgOiAiMCIgKCh1bnNpZ25lZCBpbnQpKGFoKSksICJyIiAoKHVuc2lnbmVkIGludCkoYmgpKSwJXAorCSAgICAgIjEiICgodW5zaWduZWQgaW50KShhbCkpLCAiclFSIiAoKHVuc2lnbmVkIGludCkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgdW5pb24ge2xvbmcgaW50IF9fbGw7CQkJCQkJXAorCSAgIHN0cnVjdCB7dW5zaWduZWQgaW50IF9faCwgX19sO30gX19pOwkJCQlcCisJICB9IF9feDsJCQkJCQkJXAorICAgIHVuc2lnbmVkIGludCBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCVwKKyAgICBfX2FzbV9fICgibXVsdAklUzAsJUgzIgkJCQkJXAorCSAgICAgOiAiPXIiIChfX3guX19pLl9faCksICI9ciIgKF9feC5fX2kuX19sKQkJCVwKKwkgICAgIDogIiUxIiAobTApLCAiclFSIiAobTEpKTsJCQkJCVwKKyAgICAoeGgpID0gX194Ll9faS5fX2g7ICh4bCkgPSBfX3guX19pLl9fbDsJCQkJXAorICAgICh4aCkgKz0gKCgoKHNpZ25lZCBpbnQpIF9fbTAgPj4gMTUpICYgX19tMSkJCQkJXAorCSAgICAgKyAoKChzaWduZWQgaW50KSBfX20xID4+IDE1KSAmIF9fbTApKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYgLyogX196ODAwMF9fICovCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjZW5kaWYgLyogTk9fQVNNICovCisKKworLyogRklYTUU6ICJzaWRpIiBoZXJlIGlzIGhpZ2hseSBkb3VidGZ1bCwgc2hvdWxkIHNvbWV0aW1lcyBiZSAiZGl0aSIuICAqLworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pICYmIGRlZmluZWQgKF9fdW11bHNpZGkzKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVRFd0eXBlIF9fbGwgPSBfX3VtdWxzaWRpMyAobTAsIG0xKTsJCQkJXAorICAgIHBoID0gKFVXdHlwZSkgKF9fbGwgPj4gV19UWVBFX1NJWkUpOwkJCQlcCisgICAgcGwgPSAoVVd0eXBlKSBfX2xsOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChfX3VtdWxzaWRpMykKKyNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXAorICAoe1VXdHlwZSBfX2hpLCBfX2xvOwkJCQkJCQlcCisgICAgdW11bF9wcG1tIChfX2hpLCBfX2xvLCB1LCB2KTsJCQkJCVwKKyAgICAoKFVEV3R5cGUpIF9faGkgPDwgV19UWVBFX1NJWkUpIHwgX19sbzsgfSkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyNkZWZpbmUgX19sb25nbG9uZ19oX0MgIkMiCisjZWxzZQorI2RlZmluZSBfX2xvbmdsb25nX2hfQworI2VuZGlmCisKKy8qIFVzZSBtcG5fdW11bF9wcG1tIG9yIG1wbl91ZGl2X3Fybm5kIGZ1bmN0aW9ucywgaWYgdGhleSBleGlzdC4gIFRoZSAiX3IiCisgICBmb3JtcyBoYXZlICJyZXZlcnNlZCIgYXJndW1lbnRzLCBtZWFuaW5nIHRoZSBwb2ludGVyIGlzIGxhc3QsIHdoaWNoCisgICBzb21ldGltZXMgYWxsb3dzIGJldHRlciBwYXJhbWV0ZXIgcGFzc2luZywgaW4gcGFydGljdWxhciBvbiA2NC1iaXQKKyAgIGhwcGEuICovCisKKyNkZWZpbmUgbXBuX3VtdWxfcHBtbSAgX19NUE4odW11bF9wcG1tKQorZXh0ZXJuIF9fbG9uZ2xvbmdfaF9DIFVXdHlwZSBtcG5fdW11bF9wcG1tIChVV3R5cGUgKiwgVVd0eXBlLCBVV3R5cGUpOworCisjaWYgISBkZWZpbmVkICh1bXVsX3BwbW0pICYmIEhBVkVfTkFUSVZFX21wbl91bXVsX3BwbW0gIFwKKyAgJiYgISBkZWZpbmVkIChMT05HTE9OR19TVEFOREFMT05FKQorI2RlZmluZSB1bXVsX3BwbW0od2gsIHdsLCB1LCB2KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX191bXVsX3BwbW1fX3AwOwkJCQkJCVwKKyAgICAod2gpID0gbXBuX3VtdWxfcHBtbSAoJl9fdW11bF9wcG1tX19wMCwgKFVXdHlwZSkgKHUpLCAoVVd0eXBlKSAodikpO1wKKyAgICAod2wpID0gX191bXVsX3BwbW1fX3AwOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIG1wbl91bXVsX3BwbW1fciAgX19NUE4odW11bF9wcG1tX3IpCitleHRlcm4gX19sb25nbG9uZ19oX0MgVVd0eXBlIG1wbl91bXVsX3BwbW1fciAoVVd0eXBlLCBVV3R5cGUsIFVXdHlwZSAqKTsKKworI2lmICEgZGVmaW5lZCAodW11bF9wcG1tKSAmJiBIQVZFX05BVElWRV9tcG5fdW11bF9wcG1tX3IJXAorICAmJiAhIGRlZmluZWQgKExPTkdMT05HX1NUQU5EQUxPTkUpCisjZGVmaW5lIHVtdWxfcHBtbSh3aCwgd2wsIHUsIHYpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3VtdWxfcDA7CQkJCQkJCVwKKyAgICAod2gpID0gbXBuX3VtdWxfcHBtbV9yICgoVVd0eXBlKSAodSksIChVV3R5cGUpICh2KSwgJl9fdW11bF9wMCk7CVwKKyAgICAod2wpID0gX191bXVsX3AwOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBtcG5fdWRpdl9xcm5uZCAgX19NUE4odWRpdl9xcm5uZCkKK2V4dGVybiBfX2xvbmdsb25nX2hfQyBVV3R5cGUgbXBuX3VkaXZfcXJubmQgKFVXdHlwZSAqLCBVV3R5cGUsIFVXdHlwZSwgVVd0eXBlKTsKKworI2lmICEgZGVmaW5lZCAodWRpdl9xcm5uZCkgJiYgSEFWRV9OQVRJVkVfbXBuX3VkaXZfcXJubmQJXAorICAmJiAhIGRlZmluZWQgKExPTkdMT05HX1NUQU5EQUxPTkUpCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3VkaXZfcXJubmRfcjsJCQkJCQlcCisgICAgKHEpID0gbXBuX3VkaXZfcXJubmQgKCZfX3VkaXZfcXJubmRfciwJCQkJXAorCQkJICAoVVd0eXBlKSAobjEpLCAoVVd0eXBlKSAobjApLCAoVVd0eXBlKSBkKTsJXAorICAgIChyKSA9IF9fdWRpdl9xcm5uZF9yOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIG1wbl91ZGl2X3Fybm5kX3IgIF9fTVBOKHVkaXZfcXJubmRfcikKK2V4dGVybiBfX2xvbmdsb25nX2hfQyBVV3R5cGUgbXBuX3VkaXZfcXJubmRfciAoVVd0eXBlLCBVV3R5cGUsIFVXdHlwZSwgVVd0eXBlICopOworCisjaWYgISBkZWZpbmVkICh1ZGl2X3Fybm5kKSAmJiBIQVZFX05BVElWRV9tcG5fdWRpdl9xcm5uZF9yCVwKKyAgJiYgISBkZWZpbmVkIChMT05HTE9OR19TVEFOREFMT05FKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX191ZGl2X3Fybm5kX3I7CQkJCQkJXAorICAgIChxKSA9IG1wbl91ZGl2X3Fybm5kX3IgKChVV3R5cGUpIChuMSksIChVV3R5cGUpIChuMCksIChVV3R5cGUpIGQsCVwKKwkJCSAgICAmX191ZGl2X3Fybm5kX3IpOwkJCQlcCisgICAgKHIpID0gX191ZGl2X3Fybm5kX3I7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyogSWYgdGhpcyBtYWNoaW5lIGhhcyBubyBpbmxpbmUgYXNzZW1ibGVyLCB1c2UgQyBtYWNyb3MuICAqLworCisjaWYgIWRlZmluZWQgKGFkZF9zc2FhYWEpCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3g7CQkJCQkJCQlcCisgICAgVVd0eXBlIF9fYWwgPSAoYWwpOwkJCQkJCQlcCisgICAgVVd0eXBlIF9fYmwgPSAoYmwpOwkJCQkJCQlcCisgICAgX194ID0gX19hbCArIF9fYmw7CQkJCQkJCVwKKyAgICAoc2gpID0gKGFoKSArIChiaCkgKyAoX194IDwgX19hbCk7CQkJCQlcCisgICAgKHNsKSA9IF9feDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKHN1Yl9kZG1tc3MpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3g7CQkJCQkJCQlcCisgICAgVVd0eXBlIF9fYWwgPSAoYWwpOwkJCQkJCQlcCisgICAgVVd0eXBlIF9fYmwgPSAoYmwpOwkJCQkJCQlcCisgICAgX194ID0gX19hbCAtIF9fYmw7CQkJCQkJCVwKKyAgICAoc2gpID0gKGFoKSAtIChiaCkgLSAoX19hbCA8IF9fYmwpOwkJCQkJXAorICAgIChzbCkgPSBfX3g7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogSWYgd2UgbGFjayB1bXVsX3BwbW0gYnV0IGhhdmUgc211bF9wcG1tLCBkZWZpbmUgdW11bF9wcG1tIGluIHRlcm1zIG9mCisgICBzbXVsX3BwbW0uICAqLworI2lmICFkZWZpbmVkICh1bXVsX3BwbW0pICYmIGRlZmluZWQgKHNtdWxfcHBtbSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fdzE7CQkJCQkJCVwKKyAgICBVV3R5cGUgX194bTAgPSAodSksIF9feG0xID0gKHYpOwkJCQkJXAorICAgIHNtdWxfcHBtbSAoX193MSwgdzAsIF9feG0wLCBfX3htMSk7CQkJCQlcCisgICAgKHcxKSA9IF9fdzEgKyAoLShfX3htMCA+PiAoV19UWVBFX1NJWkUgLSAxKSkgJiBfX3htMSkJCVwKKwkJKyAoLShfX3htMSA+PiAoV19UWVBFX1NJWkUgLSAxKSkgJiBfX3htMCk7CQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSB1bXVsX3BwbW0sIGRlZmluZSBpdCB1c2luZyBwbGFpbiBDLgorCisgICBGb3IgcmVmZXJlbmNlLCB3aGVuIHRoaXMgY29kZSBpcyB1c2VkIGZvciBzcXVhcmluZyAoaWUuIHUgYW5kIHYgaWRlbnRpY2FsCisgICBleHByZXNzaW9ucyksIGdjYyByZWNvZ25pc2VzIF9feDEgYW5kIF9feDIgYXJlIHRoZSBzYW1lIGFuZCBnZW5lcmF0ZXMgMworICAgbXVsdGlwbGllcywgbm90IDQuICBUaGUgc3Vic2VxdWVudCBhZGRpdGlvbnMgY291bGQgYmUgb3B0aW1pemVkIGEgYml0LAorICAgYnV0IHRoZSBvbmx5IHBsYWNlIEdNUCBjdXJyZW50bHkgdXNlcyBzdWNoIGEgc3F1YXJlIGlzIG1wbl9zcXJfYmFzZWNhc2UsCisgICBhbmQgY2hpcHMgb2JsaWdlZCB0byB1c2UgdGhpcyBnZW5lcmljIEMgdW11bCB3aWxsIGhhdmUgcGxlbnR5IG9mIHdvcnNlCisgICBwZXJmb3JtYW5jZSBwcm9ibGVtcyB0aGFuIGEgY291cGxlIG9mIGV4dHJhIGluc3RydWN0aW9ucyBvbiB0aGUgZGlhZ29uYWwKKyAgIG9mIHNxcl9iYXNlY2FzZS4gICovCisKKyNpZiAhZGVmaW5lZCAodW11bF9wcG1tKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKKyAgICBVSFd0eXBlIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCisgICAgVVd0eXBlIF9fdSA9ICh1KSwgX192ID0gKHYpOwkJCQkJXAorCQkJCQkJCQkJXAorICAgIF9fdWwgPSBfX2xsX2xvd3BhcnQgKF9fdSk7CQkJCQkJXAorICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0IChfX3UpOwkJCQkJCVwKKyAgICBfX3ZsID0gX19sbF9sb3dwYXJ0IChfX3YpOwkJCQkJCVwKKyAgICBfX3ZoID0gX19sbF9oaWdocGFydCAoX192KTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX194MCA9IChVV3R5cGUpIF9fdWwgKiBfX3ZsOwkJCQkJXAorICAgIF9feDEgPSAoVVd0eXBlKSBfX3VsICogX192aDsJCQkJCVwKKyAgICBfX3gyID0gKFVXdHlwZSkgX191aCAqIF9fdmw7CQkJCQlcCisgICAgX194MyA9IChVV3R5cGUpIF9fdWggKiBfX3ZoOwkJCQkJXAorCQkJCQkJCQkJXAorICAgIF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICovCQlcCisgICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJXAorICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAorICAgICAgX194MyArPSBfX2xsX0I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBvcy4gKi8JXAorCQkJCQkJCQkJXAorICAgICh3MSkgPSBfX3gzICsgX19sbF9oaWdocGFydCAoX194MSk7CQkJCQlcCisgICAgKHcwKSA9IChfX3gxIDw8IFdfVFlQRV9TSVpFLzIpICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBJZiB3ZSBkb24ndCBoYXZlIHNtdWxfcHBtbSwgZGVmaW5lIGl0IHVzaW5nIHVtdWxfcHBtbSAod2hpY2ggc3VyZWx5IHdpbGwKKyAgIGV4aXN0IGluIG9uZSBmb3JtIG9yIGFub3RoZXIuICAqLworI2lmICFkZWZpbmVkIChzbXVsX3BwbW0pCisjZGVmaW5lIHNtdWxfcHBtbSh3MSwgdzAsIHUsIHYpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3cxOwkJCQkJCQlcCisgICAgVVd0eXBlIF9feG0wID0gKHUpLCBfX3htMSA9ICh2KTsJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9fdzEsIHcwLCBfX3htMCwgX194bTEpOwkJCQkJXAorICAgICh3MSkgPSBfX3cxIC0gKC0oX194bTAgPj4gKFdfVFlQRV9TSVpFIC0gMSkpICYgX194bTEpCQlcCisJCS0gKC0oX194bTEgPj4gKFdfVFlQRV9TSVpFIC0gMSkpICYgX194bTApOwkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIERlZmluZSB0aGlzIHVuY29uZGl0aW9uYWxseSwgc28gaXQgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZy4gICovCisjZGVmaW5lIF9fdWRpdl9xcm5uZF9jKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX2QxLCBfX2QwLCBfX3ExLCBfX3EwLCBfX3IxLCBfX3IwLCBfX207CQkJXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVCAoKGQpICE9IDApOwkJCQkJCQlcCisgICAgQVNTRVJUICgobjEpIDwgKGQpKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19kMSA9IF9fbGxfaGlnaHBhcnQgKGQpOwkJCQkJCVwKKyAgICBfX2QwID0gX19sbF9sb3dwYXJ0IChkKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19xMSA9IChuMSkgLyBfX2QxOwkJCQkJCQlcCisgICAgX19yMSA9IChuMSkgLSBfX3ExICogX19kMTsJCQkJCQlcCisgICAgX19tID0gX19xMSAqIF9fZDA7CQkJCQkJCVwKKyAgICBfX3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IxIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IxID49IChkKSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi9cCisJICBpZiAoX19yMSA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjEgLT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19xMCA9IF9fcjEgLyBfX2QxOwkJCQkJCQlcCisgICAgX19yMCA9IF9fcjEgIC0gX19xMCAqIF9fZDE7CQkJCQkJXAorICAgIF9fbSA9IF9fcTAgKiBfX2QwOwkJCQkJCQlcCisgICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IwID49IChkKSkJCQkJCQlcCisJICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgKHEpID0gX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCQkJXAorICAgIChyKSA9IF9fcjA7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIElmIHRoZSBwcm9jZXNzb3IgaGFzIG5vIHVkaXZfcXJubmQgYnV0IHNkaXZfcXJubmQsIGdvIHRocm91Z2gKKyAgIF9fdWRpdl93X3NkaXYgKGRlZmluZWQgaW4gbGliZ2NjIG9yIGVsc2V3aGVyZSkuICAqLworI2lmICFkZWZpbmVkICh1ZGl2X3Fybm5kKSAmJiBkZWZpbmVkIChzZGl2X3Fybm5kKSBcCisgICYmICEgZGVmaW5lZCAoTE9OR0xPTkdfU1RBTkRBTE9ORSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX19yOwkJCQkJCQkJXAorICAgIChxKSA9IF9fTVBOKHVkaXZfd19zZGl2KSAoJl9fciwgbmgsIG5sLCBkKTsJCQkJXAorICAgIChyKSA9IF9fcjsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKK19fR01QX0RFQ0xTUEVDIFVXdHlwZSBfX01QTih1ZGl2X3dfc2RpdikgKFVXdHlwZSAqLCBVV3R5cGUsIFVXdHlwZSwgVVd0eXBlKTsKKyNlbmRpZgorCisvKiBJZiB1ZGl2X3Fybm5kIHdhcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwcm9jZXNzb3IsIHVzZSBfX3VkaXZfcXJubmRfYy4gICovCisjaWYgIWRlZmluZWQgKHVkaXZfcXJubmQpCisjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCisjZGVmaW5lIHVkaXZfcXJubmQgX191ZGl2X3Fybm5kX2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKGNvdW50X2xlYWRpbmdfemVyb3MpCisjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBVV3R5cGUgX194ciA9ICh4KTsJCQkJCQkJXAorICAgIFVXdHlwZSBfX2E7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgaWYgKFdfVFlQRV9TSVpFID09IDMyKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19hID0gX194ciA8ICgoVVd0eXBlKSAxIDw8IDIqX19CSVRTNCkJCQkJXAorCSAgPyAoX194ciA8ICgoVVd0eXBlKSAxIDw8IF9fQklUUzQpID8gMSA6IF9fQklUUzQgKyAxKQkJXAorCSAgOiAoX194ciA8ICgoVVd0eXBlKSAxIDw8IDMqX19CSVRTNCkgPyAyKl9fQklUUzQgKyAxCQlcCisJICA6IDMqX19CSVRTNCArIDEpOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlmb3IgKF9fYSA9IFdfVFlQRV9TSVpFIC0gODsgX19hID4gMDsgX19hIC09IDgpCQkJXAorCSAgaWYgKCgoX194ciA+PiBfX2EpICYgMHhmZikgIT0gMCkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCSsrX19hOwkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAoY291bnQpID0gV19UWVBFX1NJWkUgKyAxIC0gX19hIC0gX19jbHpfdGFiW19feHIgPj4gX19hXTsJCVwKKyAgfSB3aGlsZSAoMCkKKy8qIFRoaXMgdmVyc2lvbiBnaXZlcyBhIHdlbGwtZGVmaW5lZCB2YWx1ZSBmb3IgemVyby4gKi8KKyNkZWZpbmUgQ09VTlRfTEVBRElOR19aRVJPU18wIChXX1RZUEVfU0laRSAtIDEpCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfTkVFRF9DTFpfVEFCCisjZGVmaW5lIENPVU5UX0xFQURJTkdfWkVST1NfU0xPVworI2VuZGlmCisKKy8qIGNsel90YWIgbmVlZGVkIGJ5IG1wbi94ODYvcGVudGl1bS9tb2RfMS5hc20gaW4gYSBmYXQgYmluYXJ5ICovCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2ICYmIFdBTlRfRkFUX0JJTkFSWQorI2RlZmluZSBDT1VOVF9MRUFESU5HX1pFUk9TX05FRURfQ0xaX1RBQgorI2VuZGlmCisKKyNpZmRlZiBDT1VOVF9MRUFESU5HX1pFUk9TX05FRURfQ0xaX1RBQgorZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19HTVBfREVDTFNQRUMgX19jbHpfdGFiWzEyOV07CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChjb3VudF90cmFpbGluZ196ZXJvcykKKyNpZiAhZGVmaW5lZCAoQ09VTlRfTEVBRElOR19aRVJPU19TTE9XKQorLyogRGVmaW5lIGNvdW50X3RyYWlsaW5nX3plcm9zIHVzaW5nIGFuIGFzbSBjb3VudF9sZWFkaW5nX3plcm9zLiAgKi8KKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fY3R6X3ggPSAoeCk7CQkJCQkJXAorICAgIFVXdHlwZSBfX2N0el9jOwkJCQkJCQlcCisgICAgQVNTRVJUIChfX2N0el94ICE9IDApOwkJCQkJCVwKKyAgICBjb3VudF9sZWFkaW5nX3plcm9zIChfX2N0el9jLCBfX2N0el94ICYgLV9fY3R6X3gpOwkJCVwKKyAgICAoY291bnQpID0gV19UWVBFX1NJWkUgLSAxIC0gX19jdHpfYzsJCQkJXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKy8qIERlZmluZSBjb3VudF90cmFpbGluZ196ZXJvcyBpbiBwbGFpbiBDLCBhc3N1bWluZyBzbWFsbCBjb3VudHMgYXJlIGNvbW1vbi4KKyAgIFdlIHVzZSBjbHpfdGFiIHdpdGhvdXQgYWRvLCBzaW5jZSB0aGUgQyBjb3VudF9sZWFkaW5nX3plcm9zIGFib3ZlIHdpbGwgaGF2ZQorICAgcHVsbGVkIGl0IGluLiAgKi8KKyNkZWZpbmUgY291bnRfdHJhaWxpbmdfemVyb3MoY291bnQsIHgpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fY3R6X3ggPSAoeCk7CQkJCQkJXAorICAgIGludCBfX2N0el9jOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgaWYgKExJS0VMWSAoKF9fY3R6X3ggJiAweGZmKSAhPSAwKSkJCQkJCVwKKyAgICAgIChjb3VudCkgPSBfX2Nsel90YWJbX19jdHpfeCAmIC1fX2N0el94XSAtIDI7CQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJZm9yIChfX2N0el9jID0gOCAtIDI7IF9fY3R6X2MgPCBXX1RZUEVfU0laRSAtIDI7IF9fY3R6X2MgKz0gOCkJXAorCSAgewkJCQkJCQkJXAorCSAgICBfX2N0el94ID4+PSA4OwkJCQkJCVwKKwkgICAgaWYgKExJS0VMWSAoKF9fY3R6X3ggJiAweGZmKSAhPSAwKSkJCQkJXAorCSAgICAgIGJyZWFrOwkJCQkJCQlcCisJICB9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJKGNvdW50KSA9IF9fY3R6X2MgKyBfX2Nsel90YWJbX19jdHpfeCAmIC1fX2N0el94XTsJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTgorI2RlZmluZSBVRElWX05FRURTX05PUk1BTElaQVRJT04gMAorI2VuZGlmCisKKy8qIFdoZXRoZXIgdWRpdl9xcm5uZCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCB3aXRoIHVkaXZfcXJubmRfcHJlaW52LCBhbmQKKyAgIHRoYXQgaGVuY2UgdGhlIGxhdHRlciBzaG91bGQgYWx3YXlzIGJlIHVzZWQuICAqLworI2lmbmRlZiBVRElWX1BSRUlOVl9BTFdBWVMKKyNkZWZpbmUgVURJVl9QUkVJTlZfQUxXQVlTIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVtb3J5LmMgYi9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAwMTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVtb3J5LmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIE1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMjAwMC0yMDAyLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gLyogZm9yIG1hbGxvYywgcmVhbGxvYywgZnJlZSAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkICogKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoc2l6ZV90KSA9IF9fZ21wX2RlZmF1bHRfYWxsb2NhdGU7Cit2b2lkICogKCpfX2dtcF9yZWFsbG9jYXRlX2Z1bmMpICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSA9IF9fZ21wX2RlZmF1bHRfcmVhbGxvY2F0ZTsKK3ZvaWQgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHZvaWQgKiwgc2l6ZV90KSA9IF9fZ21wX2RlZmF1bHRfZnJlZTsKKworCisvKiBEZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLiAgSW4gY2FzZSBvZiBmYWlsdXJlIHRvIGFsbG9jYXRlL3JlYWxsb2NhdGUKKyAgIGFuIGVycm9yIG1lc3NhZ2UgaXMgd3JpdHRlbiB0byBzdGRlcnIgYW5kIHRoZSBwcm9ncmFtIGFib3J0cy4gICovCisKK3ZvaWQgKgorX19nbXBfZGVmYXVsdF9hbGxvY2F0ZSAoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKnJldDsKKyNpZmRlZiBERUJVRworICBzaXplX3QgcmVxX3NpemUgPSBzaXplOworICBzaXplICs9IDIgKiBHTVBfTElNQl9CWVRFUzsKKyNlbmRpZgorICByZXQgPSBtYWxsb2MgKHNpemUpOworICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiR05VIE1QOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChzaXplPSVsdSlcbiIsIChsb25nKSBzaXplKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworI2lmZGVmIERFQlVHCisgIHsKKyAgICBtcF9wdHIgcCA9IHJldDsKKyAgICBwKys7CisgICAgcFstMV0gPSAoMHhkZWFkYmVlZiA8PCAzMSkgKyAweGRlYWZkZWVkOworICAgIGlmIChyZXFfc2l6ZSAlIEdNUF9MSU1CX0JZVEVTID09IDApCisgICAgICBwW3JlcV9zaXplIC8gR01QX0xJTUJfQllURVNdID0gfigoMHhkZWFkYmVlZiA8PCAzMSkgKyAweGRlYWZkZWVkKTsKKyAgICByZXQgPSBwOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCAqCitfX2dtcF9kZWZhdWx0X3JlYWxsb2NhdGUgKHZvaWQgKm9sZHB0ciwgc2l6ZV90IG9sZF9zaXplLCBzaXplX3QgbmV3X3NpemUpCit7CisgIHZvaWQgKnJldDsKKworI2lmZGVmIERFQlVHCisgIHNpemVfdCByZXFfc2l6ZSA9IG5ld19zaXplOworCisgIGlmIChvbGRfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIG1wX3B0ciBwID0gb2xkcHRyOworICAgICAgaWYgKHBbLTFdICE9ICgweGRlYWRiZWVmIDw8IDMxKSArIDB4ZGVhZmRlZWQpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiZ21wOiAocmVhbGxvYykgZGF0YSBjbG9iYmVyZWQgYmVmb3JlIGFsbG9jYXRpb24gYmxvY2tcbiIpOworCSAgYWJvcnQgKCk7CisJfQorICAgICAgaWYgKG9sZF9zaXplICUgR01QX0xJTUJfQllURVMgPT0gMCkKKwlpZiAocFtvbGRfc2l6ZSAvIEdNUF9MSU1CX0JZVEVTXSAhPSB+KCgweGRlYWRiZWVmIDw8IDMxKSArIDB4ZGVhZmRlZWQpKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICJnbXA6IChyZWFsbG9jKSBkYXRhIGNsb2JiZXJlZCBhZnRlciBhbGxvY2F0aW9uIGJsb2NrXG4iKTsKKwkgICAgYWJvcnQgKCk7CisJICB9CisgICAgICBvbGRwdHIgPSBwIC0gMTsKKyAgICB9CisKKyAgbmV3X3NpemUgKz0gMiAqIEdNUF9MSU1CX0JZVEVTOworI2VuZGlmCisKKyAgcmV0ID0gcmVhbGxvYyAob2xkcHRyLCBuZXdfc2l6ZSk7CisgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJHTlUgTVA6IENhbm5vdCByZWFsbG9jYXRlIG1lbW9yeSAob2xkX3NpemU9JWx1IG5ld19zaXplPSVsdSlcbiIsIChsb25nKSBvbGRfc2l6ZSwgKGxvbmcpIG5ld19zaXplKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworI2lmZGVmIERFQlVHCisgIHsKKyAgICBtcF9wdHIgcCA9IHJldDsKKyAgICBwKys7CisgICAgcFstMV0gPSAoMHhkZWFkYmVlZiA8PCAzMSkgKyAweGRlYWZkZWVkOworICAgIGlmIChyZXFfc2l6ZSAlIEdNUF9MSU1CX0JZVEVTID09IDApCisgICAgICBwW3JlcV9zaXplIC8gR01QX0xJTUJfQllURVNdID0gfigoMHhkZWFkYmVlZiA8PCAzMSkgKyAweGRlYWZkZWVkKTsKKyAgICByZXQgPSBwOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorX19nbXBfZGVmYXVsdF9mcmVlICh2b2lkICpibGtfcHRyLCBzaXplX3QgYmxrX3NpemUpCit7CisjaWZkZWYgREVCVUcKKyAgeworICAgIG1wX3B0ciBwID0gYmxrX3B0cjsKKyAgICBpZiAoYmxrX3NpemUgIT0gMCkKKyAgICAgIHsKKwlpZiAocFstMV0gIT0gKDB4ZGVhZGJlZWYgPDwgMzEpICsgMHhkZWFmZGVlZCkKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZ21wOiAoZnJlZSkgZGF0YSBjbG9iYmVyZWQgYmVmb3JlIGFsbG9jYXRpb24gYmxvY2tcbiIpOworCSAgICBhYm9ydCAoKTsKKwkgIH0KKwlpZiAoYmxrX3NpemUgJSBHTVBfTElNQl9CWVRFUyA9PSAwKQorCSAgaWYgKHBbYmxrX3NpemUgLyBHTVBfTElNQl9CWVRFU10gIT0gfigoMHhkZWFkYmVlZiA8PCAzMSkgKyAweGRlYWZkZWVkKSkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImdtcDogKGZyZWUpIGRhdGEgY2xvYmJlcmVkIGFmdGVyIGFsbG9jYXRpb24gYmxvY2tcbiIpOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisgICAgICB9CisgICAgYmxrX3B0ciA9IHAgLSAxOworICB9CisjZW5kaWYKKyAgZnJlZSAoYmxrX3B0cik7Cit9CmRpZmYgLS1naXQgYS9taW5pLWdtcC9taW5pLWdtcC5jIGIvbWluaS1nbXAvbWluaS1nbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE3MmJmCi0tLSAvZGV2L251bGwKKysrIGIvbWluaS1nbXAvbWluaS1nbXAuYwpAQCAtMCwwICsxLDQ2MjcgQEAKKy8qIG1pbmktZ21wLCBhIG1pbmltYWxpc3RpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIEdOVSBHTVAgc3Vic2V0LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlcgorICAgQWRkaXRpb25hbCBmdW5jdGlvbmFsaXRpZXMgYW5kIGltcHJvdmVtZW50cyBieSBNYXJjbyBCb2RyYXRvLgorCitDb3B5cmlnaHQgMTk5MS0xOTk3LCAxOTk5LTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIE5PVEU6IEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHdoaWNoIGFyZSBub3QgZGVjbGFyZWQgaW4KKyAgIG1pbmktZ21wLmggYXJlIGludGVybmFsLCBhbmQgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjb21wYXRpYmxlCisgICB3aXRoIEdNUCBvciB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBtaW5pLWdtcC4gKi8KKworLyogTXVjaCBvZiB0aGUgbWF0ZXJpYWwgY29waWVkIGZyb20gR01QIGZpbGVzLCBpbmNsdWRpbmc6IGdtcC1pbXBsLmgsCisgICBsb25nbG9uZy5oLCBtcG4vZ2VuZXJpYy9hZGRfbi5jLCBtcG4vZ2VuZXJpYy9hZGRtdWxfMS5jLAorICAgbXBuL2dlbmVyaWMvbHNoaWZ0LmMsIG1wbi9nZW5lcmljL211bF8xLmMsCisgICBtcG4vZ2VuZXJpYy9tdWxfYmFzZWNhc2UuYywgbXBuL2dlbmVyaWMvcnNoaWZ0LmMsCisgICBtcG4vZ2VuZXJpYy9zYnBpMV9kaXZfcXIuYywgbXBuL2dlbmVyaWMvc3ViX24uYywKKyAgIG1wbi9nZW5lcmljL3N1Ym11bF8xLmMuICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJtaW5pLWdtcC5oIgorCisjaWYgIWRlZmluZWQoTUlOSV9HTVBfRE9OVF9VU0VfRkxPQVRfSCkKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2VuZGlmCisKKwwKKy8qIE1hY3JvcyAqLworI2RlZmluZSBHTVBfTElNQl9CSVRTIChzaXplb2YobXBfbGltYl90KSAqIENIQVJfQklUKQorCisjZGVmaW5lIEdNUF9MSU1CX01BWCAoKG1wX2xpbWJfdCkgfiAobXBfbGltYl90KSAwKQorI2RlZmluZSBHTVBfTElNQl9ISUdIQklUICgobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC0gMSkpCisKKyNkZWZpbmUgR01QX0hMSU1CX0JJVCAoKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKQorI2RlZmluZSBHTVBfTExJTUJfTUFTSyAoR01QX0hMSU1CX0JJVCAtIDEpCisKKyNkZWZpbmUgR01QX1VMT05HX0JJVFMgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUKQorI2RlZmluZSBHTVBfVUxPTkdfSElHSEJJVCAoKHVuc2lnbmVkIGxvbmcpIDEgPDwgKEdNUF9VTE9OR19CSVRTIC0gMSkpCisKKyNkZWZpbmUgR01QX0FCUyh4KSAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQorI2RlZmluZSBHTVBfTkVHX0NBU1QoVCx4KSAoLSgoVCkoKHgpICsgMSkgLSAxKSkKKworI2RlZmluZSBHTVBfTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdNUF9NQVgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBHTVBfQ01QKGEsYikgKCgoYSkgPiAoYikpIC0gKChhKSA8IChiKSkpCisKKyNpZiBkZWZpbmVkKERCTF9NQU5UX0RJRykgJiYgRkxUX1JBRElYID09IDIKKyNkZWZpbmUgR01QX0RCTF9NQU5UX0JJVFMgREJMX01BTlRfRElHCisjZWxzZQorI2RlZmluZSBHTVBfREJMX01BTlRfQklUUyAoNTMpCisjZW5kaWYKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHhwLHhzaXplIGFuZCB5cCx5c2l6ZSBvdmVybGFwLgorICAgSWYgeHAreHNpemU8PXlwIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgb3IgaWYgeXAreXNpemU8PXhwIHRoZXJlJ3Mgbm8KKyAgIG92ZXJsYXAuICBJZiBib3RoIHRoZXNlIGFyZSBmYWxzZSwgdGhlcmUncyBhbiBvdmVybGFwLiAqLworI2RlZmluZSBHTVBfTVBOX09WRVJMQVBfUCh4cCwgeHNpemUsIHlwLCB5c2l6ZSkJCQkJXAorICAoKHhwKSArICh4c2l6ZSkgPiAoeXApICYmICh5cCkgKyAoeXNpemUpID4gKHhwKSkKKworI2RlZmluZSBnbXBfYXNzZXJ0X25vY2FycnkoeCkgZG8geyBcCisgICAgbXBfbGltYl90IF9fY3kgPSAoeCk7CSAgIFwKKyAgICBhc3NlcnQgKF9fY3kgPT0gMCk7CQkgICBcCisgICAgKHZvaWQpIChfX2N5KTsJCSAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBnbXBfY2x6KGNvdW50LCB4KSBkbyB7CQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX2Nsel94ID0gKHgpOwkJCQkJCVwKKyAgICB1bnNpZ25lZCBfX2Nsel9jID0gMDsJCQkJCQlcCisgICAgaW50IExPQ0FMX1NISUZUX0JJVFMgPSA4OwkJCQkJCVwKKyAgICBpZiAoR01QX0xJTUJfQklUUyA+IExPQ0FMX1NISUZUX0JJVFMpCQkJCVwKKyAgICAgIGZvciAoOwkJCQkJCQkJXAorCSAgIChfX2Nsel94ICYgKChtcF9saW1iX3QpIDB4ZmYgPDwgKEdNUF9MSU1CX0JJVFMgLSA4KSkpID09IDA7CVwKKwkgICBfX2Nsel9jICs9IDgpCQkJCQkJXAorCXsgX19jbHpfeCA8PD0gTE9DQUxfU0hJRlRfQklUUzsJfQkJCQlcCisgICAgZm9yICg7IChfX2Nsel94ICYgR01QX0xJTUJfSElHSEJJVCkgPT0gMDsgX19jbHpfYysrKQkJXAorICAgICAgX19jbHpfeCA8PD0gMTsJCQkJCQkJXAorICAgIChjb3VudCkgPSBfX2Nsel9jOwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZ21wX2N0eihjb3VudCwgeCkgZG8gewkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19jdHpfeCA9ICh4KTsJCQkJCQlcCisgICAgdW5zaWduZWQgX19jdHpfYyA9IDA7CQkJCQkJXAorICAgIGdtcF9jbHogKF9fY3R6X2MsIF9fY3R6X3ggJiAtIF9fY3R6X3gpOwkJCQlcCisgICAgKGNvdW50KSA9IEdNUF9MSU1CX0JJVFMgLSAxIC0gX19jdHpfYzsJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdtcF9hZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX194OwkJCQkJCQlcCisgICAgX194ID0gKGFsKSArIChibCk7CQkJCQkJCVwKKyAgICAoc2gpID0gKGFoKSArIChiaCkgKyAoX194IDwgKGFsKSk7CQkJCQlcCisgICAgKHNsKSA9IF9feDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBnbXBfc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9feDsJCQkJCQkJXAorICAgIF9feCA9IChhbCkgLSAoYmwpOwkJCQkJCQlcCisgICAgKHNoKSA9IChhaCkgLSAoYmgpIC0gKChhbCkgPCAoYmwpKTsJCQkJCVwKKyAgICAoc2wpID0gX194OwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdtcF91bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGludCBMT0NBTF9HTVBfTElNQl9CSVRTID0gR01QX0xJTUJfQklUUzsJCQkJXAorICAgIGlmIChzaXplb2YodW5zaWduZWQgaW50KSAqIENIQVJfQklUID49IDIgKiBHTVBfTElNQl9CSVRTKQkJXAorICAgICAgewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX193dyA9ICh1bnNpZ25lZCBpbnQpICh1KSAqICh2KTsJCQlcCisJdzAgPSAobXBfbGltYl90KSBfX3d3OwkJCQkJCVwKKwl3MSA9IChtcF9saW1iX3QpIChfX3d3ID4+IExPQ0FMX0dNUF9MSU1CX0JJVFMpOwkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSBpZiAoR01QX1VMT05HX0JJVFMgPj0gMiAqIEdNUF9MSU1CX0JJVFMpCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGludCBfX3d3ID0gKHVuc2lnbmVkIGxvbmcgaW50KSAodSkgKiAodik7CQlcCisJdzAgPSAobXBfbGltYl90KSBfX3d3OwkJCQkJCVwKKwl3MSA9IChtcF9saW1iX3QpIChfX3d3ID4+IExPQ0FMX0dNUF9MSU1CX0JJVFMpOwkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgZWxzZSB7CQkJCQkJCQlcCisgICAgICBtcF9saW1iX3QgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKKyAgICAgIHVuc2lnbmVkIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCisgICAgICBtcF9saW1iX3QgX191ID0gKHUpLCBfX3YgPSAodik7CQkJCQlcCisgICAgICBhc3NlcnQgKHNpemVvZiAodW5zaWduZWQpICogMiA+PSBzaXplb2YgKG1wX2xpbWJfdCkpOwkJXAorCQkJCQkJCQkJXAorICAgICAgX191bCA9IF9fdSAmIEdNUF9MTElNQl9NQVNLOwkJCQkJXAorICAgICAgX191aCA9IF9fdSA+PiAoR01QX0xJTUJfQklUUyAvIDIpOwkJCQlcCisgICAgICBfX3ZsID0gX192ICYgR01QX0xMSU1CX01BU0s7CQkJCQlcCisgICAgICBfX3ZoID0gX192ID4+IChHTVBfTElNQl9CSVRTIC8gMik7CQkJCVwKKwkJCQkJCQkJCVwKKyAgICAgIF9feDAgPSAobXBfbGltYl90KSBfX3VsICogX192bDsJCQkJCVwKKyAgICAgIF9feDEgPSAobXBfbGltYl90KSBfX3VsICogX192aDsJCQkJCVwKKyAgICAgIF9feDIgPSAobXBfbGltYl90KSBfX3VoICogX192bDsJCQkJCVwKKyAgICAgIF9feDMgPSAobXBfbGltYl90KSBfX3VoICogX192aDsJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAgIF9feDEgKz0gX194MCA+PiAoR01QX0xJTUJfQklUUyAvIDIpOy8qIHRoaXMgY2FuJ3QgZ2l2ZSBjYXJyeSAqLwlcCisgICAgICBfX3gxICs9IF9feDI7CQkvKiBidXQgdGhpcyBpbmRlZWQgY2FuICovCQlcCisgICAgICBpZiAoX194MSA8IF9feDIpCQkvKiBkaWQgd2UgZ2V0IGl0PyAqLwkJCVwKKwlfX3gzICs9IEdNUF9ITElNQl9CSVQ7CS8qIHllcywgYWRkIGl0IGluIHRoZSBwcm9wZXIgcG9zLiAqLwlcCisJCQkJCQkJCQlcCisgICAgICAodzEpID0gX194MyArIChfX3gxID4+IChHTVBfTElNQl9CSVRTIC8gMikpOwkJCVwKKyAgICAgICh3MCkgPSAoX194MSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSArIChfX3gwICYgR01QX0xMSU1CX01BU0spOwlcCisgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogSWYgbXBfbGltYl90IGlzIG9mIHNpemUgc21hbGxlciB0aGFuIGludCwgcGxhaW4gdSp2IGltcGxpZXMKKyAgIGF1dG9tYXRpYyBwcm9tb3Rpb24gdG8gKnNpZ25lZCogaW50LCBhbmQgdGhlbiBtdWx0aXBseSBtYXkgb3ZlcmZsb3cKKyAgIGFuZCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuIEV4cGxpY2l0bHkgY2FzdCB0byB1bnNpZ25lZCBpbnQgZm9yCisgICB0aGF0IGNhc2UuICovCisjZGVmaW5lIGdtcF91bXVsbG9fbGltYih1LCB2KSBcCisgICgoc2l6ZW9mKG1wX2xpbWJfdCkgPj0gc2l6ZW9mKGludCkpID8gKHUpKih2KSA6ICh1bnNpZ25lZCBpbnQpKHUpICogKHYpKQorCisjZGVmaW5lIGdtcF91ZGl2X3Fybm5kX3ByZWludihxLCByLCBuaCwgbmwsIGQsIGRpKQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX3FoLCBfcWwsIF9yLCBfbWFzazsJCQkJCVwKKyAgICBnbXBfdW11bF9wcG1tIChfcWgsIF9xbCwgKG5oKSwgKGRpKSk7CQkJCVwKKyAgICBnbXBfYWRkX3NzYWFhYSAoX3FoLCBfcWwsIF9xaCwgX3FsLCAobmgpICsgMSwgKG5sKSk7CQlcCisgICAgX3IgPSAobmwpIC0gZ21wX3VtdWxsb19saW1iIChfcWgsIChkKSk7CQkJCVwKKyAgICBfbWFzayA9IC0obXBfbGltYl90KSAoX3IgPiBfcWwpOyAvKiBib3RoID4gYW5kID49IGFyZSBPSyAqLwkJXAorICAgIF9xaCArPSBfbWFzazsJCQkJCQkJXAorICAgIF9yICs9IF9tYXNrICYgKGQpOwkJCQkJCQlcCisgICAgaWYgKF9yID49IChkKSkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlfciAtPSAoZCk7CQkJCQkJCVwKKwlfcWgrKzsJCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgKHIpID0gX3I7CQkJCQkJCQlcCisgICAgKHEpID0gX3FoOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdtcF91ZGl2X3FyXzNieTIocSwgcjEsIHIwLCBuMiwgbjEsIG4wLCBkMSwgZDAsIGRpbnYpCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IF9xMCwgX3QxLCBfdDAsIF9tYXNrOwkJCQkJXAorICAgIGdtcF91bXVsX3BwbW0gKChxKSwgX3EwLCAobjIpLCAoZGludikpOwkJCQlcCisgICAgZ21wX2FkZF9zc2FhYWEgKChxKSwgX3EwLCAocSksIF9xMCwgKG4yKSwgKG4xKSk7CQkJXAorCQkJCQkJCQkJXAorICAgIC8qIENvbXB1dGUgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGxpbWJzIG9mIG4gLSBxJ2QgKi8JCVwKKyAgICAocjEpID0gKG4xKSAtIGdtcF91bXVsbG9fbGltYiAoKGQxKSwgKHEpKTsJCQkJXAorICAgIGdtcF9zdWJfZGRtbXNzICgocjEpLCAocjApLCAocjEpLCAobjApLCAoZDEpLCAoZDApKTsJCVwKKyAgICBnbXBfdW11bF9wcG1tIChfdDEsIF90MCwgKGQwKSwgKHEpKTsJCQkJXAorICAgIGdtcF9zdWJfZGRtbXNzICgocjEpLCAocjApLCAocjEpLCAocjApLCBfdDEsIF90MCk7CQkJXAorICAgIChxKSsrOwkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIC8qIENvbmRpdGlvbmFsbHkgYWRqdXN0IHEgYW5kIHRoZSByZW1haW5kZXJzICovCQkJXAorICAgIF9tYXNrID0gLSAobXBfbGltYl90KSAoKHIxKSA+PSBfcTApOwkJCQlcCisgICAgKHEpICs9IF9tYXNrOwkJCQkJCQlcCisgICAgZ21wX2FkZF9zc2FhYWEgKChyMSksIChyMCksIChyMSksIChyMCksIF9tYXNrICYgKGQxKSwgX21hc2sgJiAoZDApKTsgXAorICAgIGlmICgocjEpID49IChkMSkpCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKChyMSkgPiAoZDEpIHx8IChyMCkgPj0gKGQwKSkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICAocSkrKzsJCQkJCQkJXAorCSAgICBnbXBfc3ViX2RkbW1zcyAoKHIxKSwgKHIwKSwgKHIxKSwgKHIwKSwgKGQxKSwgKGQwKSk7CVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIFN3YXAgbWFjcm9zLiAqLworI2RlZmluZSBNUF9MSU1CX1RfU1dBUCh4LCB5KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19tcF9saW1iX3Rfc3dhcF9fdG1wID0gKHgpOwkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXBfbGltYl90X3N3YXBfX3RtcDsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBfU0laRV9UX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc2l6ZV90IF9fbXBfc2l6ZV90X3N3YXBfX3RtcCA9ICh4KTsJCQkJXAorICAgICh4KSA9ICh5KTsJCQkJCQkJCVwKKyAgICAoeSkgPSBfX21wX3NpemVfdF9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIE1QX0JJVENOVF9UX1NXQVAoeCx5KQkJCVwKKyAgZG8gewkJCQkJCVwKKyAgICBtcF9iaXRjbnRfdCBfX21wX2JpdGNudF90X3N3YXBfX3RtcCA9ICh4KTsJXAorICAgICh4KSA9ICh5KTsJCQkJCVwKKyAgICAoeSkgPSBfX21wX2JpdGNudF90X3N3YXBfX3RtcDsJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBfUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfcHRyIF9fbXBfcHRyX3N3YXBfX3RtcCA9ICh4KTsJCQkJCVwKKyAgICAoeCkgPSAoeSk7CQkJCQkJCQlcCisgICAgKHkpID0gX19tcF9wdHJfc3dhcF9fdG1wOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTVBfU1JDUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc3JjcHRyIF9fbXBfc3JjcHRyX3N3YXBfX3RtcCA9ICh4KTsJCQkJXAorICAgICh4KSA9ICh5KTsJCQkJCQkJCVwKKyAgICAoeSkgPSBfX21wX3NyY3B0cl9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX1BUUl9TV0FQKHhwLHhzLCB5cCx5cykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBNUF9QVFJfU1dBUCAoeHAsIHlwKTsJCQkJCQlcCisgICAgTVBfU0laRV9UX1NXQVAgKHhzLCB5cyk7CQkJCQkJXAorICB9IHdoaWxlKDApCisjZGVmaW5lIE1QTl9TUkNQVFJfU1dBUCh4cCx4cywgeXAseXMpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgTVBfU1JDUFRSX1NXQVAgKHhwLCB5cCk7CQkJCQkJXAorICAgIE1QX1NJWkVfVF9TV0FQICh4cywgeXMpOwkJCQkJCVwKKyAgfSB3aGlsZSgwKQorCisjZGVmaW5lIE1QWl9QVFJfU1dBUCh4LCB5KQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcHpfcHRyIF9fbXB6X3B0cl9zd2FwX190bXAgPSAoeCk7CQkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXB6X3B0cl9zd2FwX190bXA7CQkJCQkJXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBNUFpfU1JDUFRSX1NXQVAoeCwgeSkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXB6X3NyY3B0ciBfX21wel9zcmNwdHJfc3dhcF9fdG1wID0gKHgpOwkJCQlcCisgICAgKHgpID0gKHkpOwkJCQkJCQkJXAorICAgICh5KSA9IF9fbXB6X3NyY3B0cl9zd2FwX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKK2NvbnN0IGludCBtcF9iaXRzX3Blcl9saW1iID0gR01QX0xJTUJfQklUUzsKKworDAorLyogTWVtb3J5IGFsbG9jYXRpb24gYW5kIG90aGVyIGhlbHBlciBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZAorZ21wX2RpZSAoY29uc3QgY2hhciAqbXNnKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgbXNnKTsKKyAgYWJvcnQoKTsKK30KKworc3RhdGljIHZvaWQgKgorZ21wX2RlZmF1bHRfYWxsb2MgKHNpemVfdCBzaXplKQoreworICB2b2lkICpwOworCisgIGFzc2VydCAoc2l6ZSA+IDApOworCisgIHAgPSBtYWxsb2MgKHNpemUpOworICBpZiAoIXApCisgICAgZ21wX2RpZSgiZ21wX2RlZmF1bHRfYWxsb2M6IFZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZC4iKTsKKworICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgKgorZ21wX2RlZmF1bHRfcmVhbGxvYyAodm9pZCAqb2xkLCBzaXplX3QgdW51c2VkX29sZF9zaXplLCBzaXplX3QgbmV3X3NpemUpCit7CisgIHZvaWQgKiBwOworCisgIHAgPSByZWFsbG9jIChvbGQsIG5ld19zaXplKTsKKworICBpZiAoIXApCisgICAgZ21wX2RpZSgiZ21wX2RlZmF1bHRfcmVhbGxvYzogVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkLiIpOworCisgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZAorZ21wX2RlZmF1bHRfZnJlZSAodm9pZCAqcCwgc2l6ZV90IHVudXNlZF9zaXplKQoreworICBmcmVlIChwKTsKK30KKworc3RhdGljIHZvaWQgKiAoKmdtcF9hbGxvY2F0ZV9mdW5jKSAoc2l6ZV90KSA9IGdtcF9kZWZhdWx0X2FsbG9jOworc3RhdGljIHZvaWQgKiAoKmdtcF9yZWFsbG9jYXRlX2Z1bmMpICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSA9IGdtcF9kZWZhdWx0X3JlYWxsb2M7CitzdGF0aWMgdm9pZCAoKmdtcF9mcmVlX2Z1bmMpICh2b2lkICosIHNpemVfdCkgPSBnbXBfZGVmYXVsdF9mcmVlOworCit2b2lkCittcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyAodm9pZCAqKCoqYWxsb2NfZnVuYykgKHNpemVfdCksCisJCQkgdm9pZCAqKCoqcmVhbGxvY19mdW5jKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisJCQkgdm9pZCAoKipmcmVlX2Z1bmMpICh2b2lkICosIHNpemVfdCkpCit7CisgIGlmIChhbGxvY19mdW5jKQorICAgICphbGxvY19mdW5jID0gZ21wX2FsbG9jYXRlX2Z1bmM7CisKKyAgaWYgKHJlYWxsb2NfZnVuYykKKyAgICAqcmVhbGxvY19mdW5jID0gZ21wX3JlYWxsb2NhdGVfZnVuYzsKKworICBpZiAoZnJlZV9mdW5jKQorICAgICpmcmVlX2Z1bmMgPSBnbXBfZnJlZV9mdW5jOworfQorCit2b2lkCittcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucyAodm9pZCAqKCphbGxvY19mdW5jKSAoc2l6ZV90KSwKKwkJCSB2b2lkICooKnJlYWxsb2NfZnVuYykgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQkJIHZvaWQgKCpmcmVlX2Z1bmMpICh2b2lkICosIHNpemVfdCkpCit7CisgIGlmICghYWxsb2NfZnVuYykKKyAgICBhbGxvY19mdW5jID0gZ21wX2RlZmF1bHRfYWxsb2M7CisgIGlmICghcmVhbGxvY19mdW5jKQorICAgIHJlYWxsb2NfZnVuYyA9IGdtcF9kZWZhdWx0X3JlYWxsb2M7CisgIGlmICghZnJlZV9mdW5jKQorICAgIGZyZWVfZnVuYyA9IGdtcF9kZWZhdWx0X2ZyZWU7CisKKyAgZ21wX2FsbG9jYXRlX2Z1bmMgPSBhbGxvY19mdW5jOworICBnbXBfcmVhbGxvY2F0ZV9mdW5jID0gcmVhbGxvY19mdW5jOworICBnbXBfZnJlZV9mdW5jID0gZnJlZV9mdW5jOworfQorCisjZGVmaW5lIGdtcF9hbGxvYyhzaXplKSAoKCpnbXBfYWxsb2NhdGVfZnVuYykoKHNpemUpKSkKKyNkZWZpbmUgZ21wX2ZyZWUocCwgc2l6ZSkgKCgqZ21wX2ZyZWVfZnVuYykgKChwKSwgKHNpemUpKSkKKyNkZWZpbmUgZ21wX3JlYWxsb2MocHRyLCBvbGRfc2l6ZSwgc2l6ZSkgKCgqZ21wX3JlYWxsb2NhdGVfZnVuYykocHRyLCBvbGRfc2l6ZSwgc2l6ZSkpCisKK3N0YXRpYyBtcF9wdHIKK2dtcF9hbGxvY19saW1icyAobXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiAobXBfcHRyKSBnbXBfYWxsb2MgKHNpemUgKiBzaXplb2YgKG1wX2xpbWJfdCkpOworfQorCitzdGF0aWMgbXBfcHRyCitnbXBfcmVhbGxvY19saW1icyAobXBfcHRyIG9sZCwgbXBfc2l6ZV90IG9sZF9zaXplLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgYXNzZXJ0IChzaXplID4gMCk7CisgIHJldHVybiAobXBfcHRyKSBnbXBfcmVhbGxvYyAob2xkLCBvbGRfc2l6ZSAqIHNpemVvZiAobXBfbGltYl90KSwgc2l6ZSAqIHNpemVvZiAobXBfbGltYl90KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnbXBfZnJlZV9saW1icyAobXBfcHRyIG9sZCwgbXBfc2l6ZV90IHNpemUpCit7CisgIGdtcF9mcmVlIChvbGQsIHNpemUgKiBzaXplb2YgKG1wX2xpbWJfdCkpOworfQorCisMCisvKiBNUE4gaW50ZXJmYWNlICovCisKK3ZvaWQKK21wbl9jb3B5aSAobXBfcHRyIGQsIG1wX3NyY3B0ciBzLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgZFtpXSA9IHNbaV07Cit9CisKK3ZvaWQKK21wbl9jb3B5ZCAobXBfcHRyIGQsIG1wX3NyY3B0ciBzLCBtcF9zaXplX3QgbikKK3sKKyAgd2hpbGUgKC0tbiA+PSAwKQorICAgIGRbbl0gPSBzW25dOworfQorCitpbnQKK21wbl9jbXAgKG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgbikKK3sKKyAgd2hpbGUgKC0tbiA+PSAwKQorICAgIHsKKyAgICAgIGlmIChhcFtuXSAhPSBicFtuXSkKKwlyZXR1cm4gYXBbbl0gPiBicFtuXSA/IDEgOiAtMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CittcG5fY21wNCAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuKQoreworICBpZiAoYW4gIT0gYm4pCisgICAgcmV0dXJuIGFuIDwgYm4gPyAtMSA6IDE7CisgIGVsc2UKKyAgICByZXR1cm4gbXBuX2NtcCAoYXAsIGJwLCBhbik7Cit9CisKK3N0YXRpYyBtcF9zaXplX3QKK21wbl9ub3JtYWxpemVkX3NpemUgKG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IG4pCit7CisgIHdoaWxlIChuID4gMCAmJiB4cFtuLTFdID09IDApCisgICAgLS1uOworICByZXR1cm4gbjsKK30KKworaW50CittcG5femVyb19wKG1wX3NyY3B0ciBycCwgbXBfc2l6ZV90IG4pCit7CisgIHJldHVybiBtcG5fbm9ybWFsaXplZF9zaXplIChycCwgbikgPT0gMDsKK30KKwordm9pZAorbXBuX3plcm8gKG1wX3B0ciBycCwgbXBfc2l6ZV90IG4pCit7CisgIHdoaWxlICgtLW4gPj0gMCkKKyAgICBycFtuXSA9IDA7Cit9CisKK21wX2xpbWJfdAorbXBuX2FkZF8xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiKQoreworICBtcF9zaXplX3QgaTsKKworICBhc3NlcnQgKG4gPiAwKTsKKyAgaSA9IDA7CisgIGRvCisgICAgeworICAgICAgbXBfbGltYl90IHIgPSBhcFtpXSArIGI7CisgICAgICAvKiBDYXJyeSBvdXQgKi8KKyAgICAgIGIgPSAociA8IGIpOworICAgICAgcnBbaV0gPSByOworICAgIH0KKyAgd2hpbGUgKCsraSA8IG4pOworCisgIHJldHVybiBiOworfQorCittcF9saW1iX3QKK21wbl9hZGRfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgY3k7CisKKyAgZm9yIChpID0gMCwgY3kgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBhLCBiLCByOworICAgICAgYSA9IGFwW2ldOyBiID0gYnBbaV07CisgICAgICByID0gYSArIGN5OworICAgICAgY3kgPSAociA8IGN5KTsKKyAgICAgIHIgKz0gYjsKKyAgICAgIGN5ICs9IChyIDwgYik7CisgICAgICBycFtpXSA9IHI7CisgICAgfQorICByZXR1cm4gY3k7Cit9CisKK21wX2xpbWJfdAorbXBuX2FkZCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBhc3NlcnQgKGFuID49IGJuKTsKKworICBjeSA9IG1wbl9hZGRfbiAocnAsIGFwLCBicCwgYm4pOworICBpZiAoYW4gPiBibikKKyAgICBjeSA9IG1wbl9hZGRfMSAocnAgKyBibiwgYXAgKyBibiwgYW4gLSBibiwgY3kpOworICByZXR1cm4gY3k7Cit9CisKK21wX2xpbWJfdAorbXBuX3N1Yl8xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiKQoreworICBtcF9zaXplX3QgaTsKKworICBhc3NlcnQgKG4gPiAwKTsKKworICBpID0gMDsKKyAgZG8KKyAgICB7CisgICAgICBtcF9saW1iX3QgYSA9IGFwW2ldOworICAgICAgLyogQ2Fycnkgb3V0ICovCisgICAgICBtcF9saW1iX3QgY3kgPSBhIDwgYjsKKyAgICAgIHJwW2ldID0gYSAtIGI7CisgICAgICBiID0gY3k7CisgICAgfQorICB3aGlsZSAoKytpIDwgbik7CisKKyAgcmV0dXJuIGI7Cit9CisKK21wX2xpbWJfdAorbXBuX3N1Yl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisgIG1wX2xpbWJfdCBjeTsKKworICBmb3IgKGkgPSAwLCBjeSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgbXBfbGltYl90IGEsIGI7CisgICAgICBhID0gYXBbaV07IGIgPSBicFtpXTsKKyAgICAgIGIgKz0gY3k7CisgICAgICBjeSA9IChiIDwgY3kpOworICAgICAgY3kgKz0gKGEgPCBiKTsKKyAgICAgIHJwW2ldID0gYSAtIGI7CisgICAgfQorICByZXR1cm4gY3k7Cit9CisKK21wX2xpbWJfdAorbXBuX3N1YiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBhc3NlcnQgKGFuID49IGJuKTsKKworICBjeSA9IG1wbl9zdWJfbiAocnAsIGFwLCBicCwgYm4pOworICBpZiAoYW4gPiBibikKKyAgICBjeSA9IG1wbl9zdWJfMSAocnAgKyBibiwgYXAgKyBibiwgYW4gLSBibiwgY3kpOworICByZXR1cm4gY3k7Cit9CisKK21wX2xpbWJfdAorbXBuX211bF8xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCB2bCkKK3sKKyAgbXBfbGltYl90IHVsLCBjbCwgaHBsLCBscGw7CisKKyAgYXNzZXJ0IChuID49IDEpOworCisgIGNsID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgZ21wX3VtdWxfcHBtbSAoaHBsLCBscGwsIHVsLCB2bCk7CisKKyAgICAgIGxwbCArPSBjbDsKKyAgICAgIGNsID0gKGxwbCA8IGNsKSArIGhwbDsKKworICAgICAgKnJwKysgPSBscGw7CisgICAgfQorICB3aGlsZSAoLS1uICE9IDApOworCisgIHJldHVybiBjbDsKK30KKworbXBfbGltYl90CittcG5fYWRkbXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHZsKQoreworICBtcF9saW1iX3QgdWwsIGNsLCBocGwsIGxwbCwgcmw7CisKKyAgYXNzZXJ0IChuID49IDEpOworCisgIGNsID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgZ21wX3VtdWxfcHBtbSAoaHBsLCBscGwsIHVsLCB2bCk7CisKKyAgICAgIGxwbCArPSBjbDsKKyAgICAgIGNsID0gKGxwbCA8IGNsKSArIGhwbDsKKworICAgICAgcmwgPSAqcnA7CisgICAgICBscGwgPSBybCArIGxwbDsKKyAgICAgIGNsICs9IGxwbCA8IHJsOworICAgICAgKnJwKysgPSBscGw7CisgICAgfQorICB3aGlsZSAoLS1uICE9IDApOworCisgIHJldHVybiBjbDsKK30KKworbXBfbGltYl90CittcG5fc3VibXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHZsKQoreworICBtcF9saW1iX3QgdWwsIGNsLCBocGwsIGxwbCwgcmw7CisKKyAgYXNzZXJ0IChuID49IDEpOworCisgIGNsID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgZ21wX3VtdWxfcHBtbSAoaHBsLCBscGwsIHVsLCB2bCk7CisKKyAgICAgIGxwbCArPSBjbDsKKyAgICAgIGNsID0gKGxwbCA8IGNsKSArIGhwbDsKKworICAgICAgcmwgPSAqcnA7CisgICAgICBscGwgPSBybCAtIGxwbDsKKyAgICAgIGNsICs9IGxwbCA+IHJsOworICAgICAgKnJwKysgPSBscGw7CisgICAgfQorICB3aGlsZSAoLS1uICE9IDApOworCisgIHJldHVybiBjbDsKK30KKworbXBfbGltYl90CittcG5fbXVsIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCB2bikKK3sKKyAgYXNzZXJ0ICh1biA+PSB2bik7CisgIGFzc2VydCAodm4gPj0gMSk7CisgIGFzc2VydCAoIUdNUF9NUE5fT1ZFUkxBUF9QKHJwLCB1biArIHZuLCB1cCwgdW4pKTsKKyAgYXNzZXJ0ICghR01QX01QTl9PVkVSTEFQX1AocnAsIHVuICsgdm4sIHZwLCB2bikpOworCisgIC8qIFdlIGZpcnN0IG11bHRpcGx5IGJ5IHRoZSBsb3cgb3JkZXIgbGltYi4gVGhpcyByZXN1bHQgY2FuIGJlCisgICAgIHN0b3JlZCwgbm90IGFkZGVkLCB0byBycC4gV2UgYWxzbyBhdm9pZCBhIGxvb3AgZm9yIHplcm9pbmcgdGhpcworICAgICB3YXkuICovCisKKyAgcnBbdW5dID0gbXBuX211bF8xIChycCwgdXAsIHVuLCB2cFswXSk7CisKKyAgLyogTm93IGFjY3VtdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdXBbXSBhbmQgdGhlIG5leHQgaGlnaGVyIGxpbWIgZnJvbQorICAgICB2cFtdLiAqLworCisgIHdoaWxlICgtLXZuID49IDEpCisgICAgeworICAgICAgcnAgKz0gMSwgdnAgKz0gMTsKKyAgICAgIHJwW3VuXSA9IG1wbl9hZGRtdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICAgIH0KKyAgcmV0dXJuIHJwW3VuXTsKK30KKwordm9pZAorbXBuX211bF9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBuX211bCAocnAsIGFwLCBuLCBicCwgbik7Cit9CisKK3ZvaWQKK21wbl9zcXIgKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBuX211bCAocnAsIGFwLCBuLCBhcCwgbik7Cit9CisKK21wX2xpbWJfdAorbXBuX2xzaGlmdCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgY250KQoreworICBtcF9saW1iX3QgaGlnaF9saW1iLCBsb3dfbGltYjsKKyAgdW5zaWduZWQgaW50IHRuYzsKKyAgbXBfbGltYl90IHJldHZhbDsKKworICBhc3NlcnQgKG4gPj0gMSk7CisgIGFzc2VydCAoY250ID49IDEpOworICBhc3NlcnQgKGNudCA8IEdNUF9MSU1CX0JJVFMpOworCisgIHVwICs9IG47CisgIHJwICs9IG47CisKKyAgdG5jID0gR01QX0xJTUJfQklUUyAtIGNudDsKKyAgbG93X2xpbWIgPSAqLS11cDsKKyAgcmV0dmFsID0gbG93X2xpbWIgPj4gdG5jOworICBoaWdoX2xpbWIgPSAobG93X2xpbWIgPDwgY250KTsKKworICB3aGlsZSAoLS1uICE9IDApCisgICAgeworICAgICAgbG93X2xpbWIgPSAqLS11cDsKKyAgICAgICotLXJwID0gaGlnaF9saW1iIHwgKGxvd19saW1iID4+IHRuYyk7CisgICAgICBoaWdoX2xpbWIgPSAobG93X2xpbWIgPDwgY250KTsKKyAgICB9CisgICotLXJwID0gaGlnaF9saW1iOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK21wX2xpbWJfdAorbXBuX3JzaGlmdCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgY250KQoreworICBtcF9saW1iX3QgaGlnaF9saW1iLCBsb3dfbGltYjsKKyAgdW5zaWduZWQgaW50IHRuYzsKKyAgbXBfbGltYl90IHJldHZhbDsKKworICBhc3NlcnQgKG4gPj0gMSk7CisgIGFzc2VydCAoY250ID49IDEpOworICBhc3NlcnQgKGNudCA8IEdNUF9MSU1CX0JJVFMpOworCisgIHRuYyA9IEdNUF9MSU1CX0JJVFMgLSBjbnQ7CisgIGhpZ2hfbGltYiA9ICp1cCsrOworICByZXR2YWwgPSAoaGlnaF9saW1iIDw8IHRuYyk7CisgIGxvd19saW1iID0gaGlnaF9saW1iID4+IGNudDsKKworICB3aGlsZSAoLS1uICE9IDApCisgICAgeworICAgICAgaGlnaF9saW1iID0gKnVwKys7CisgICAgICAqcnArKyA9IGxvd19saW1iIHwgKGhpZ2hfbGltYiA8PCB0bmMpOworICAgICAgbG93X2xpbWIgPSBoaWdoX2xpbWIgPj4gY250OworICAgIH0KKyAgKnJwID0gbG93X2xpbWI7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIG1wX2JpdGNudF90CittcG5fY29tbW9uX3NjYW4gKG1wX2xpbWJfdCBsaW1iLCBtcF9zaXplX3QgaSwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgdW4sCisJCSBtcF9saW1iX3QgdXgpCit7CisgIHVuc2lnbmVkIGNudDsKKworICBhc3NlcnQgKHV4ID09IDAgfHwgdXggPT0gR01QX0xJTUJfTUFYKTsKKyAgYXNzZXJ0ICgwIDw9IGkgJiYgaSA8PSB1biApOworCisgIHdoaWxlIChsaW1iID09IDApCisgICAgeworICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gdW4pCisJcmV0dXJuICh1eCA9PSAwID8gfihtcF9iaXRjbnRfdCkgMCA6IHVuICogR01QX0xJTUJfQklUUyk7CisgICAgICBsaW1iID0gdXggXiB1cFtpXTsKKyAgICB9CisgIGdtcF9jdHogKGNudCwgbGltYik7CisgIHJldHVybiAobXBfYml0Y250X3QpIGkgKiBHTVBfTElNQl9CSVRTICsgY250OworfQorCittcF9iaXRjbnRfdAorbXBuX3NjYW4xIChtcF9zcmNwdHIgcHRyLCBtcF9iaXRjbnRfdCBiaXQpCit7CisgIG1wX3NpemVfdCBpOworICBpID0gYml0IC8gR01QX0xJTUJfQklUUzsKKworICByZXR1cm4gbXBuX2NvbW1vbl9zY2FuICggcHRyW2ldICYgKEdNUF9MSU1CX01BWCA8PCAoYml0ICUgR01QX0xJTUJfQklUUykpLAorCQkJICBpLCBwdHIsIGksIDApOworfQorCittcF9iaXRjbnRfdAorbXBuX3NjYW4wIChtcF9zcmNwdHIgcHRyLCBtcF9iaXRjbnRfdCBiaXQpCit7CisgIG1wX3NpemVfdCBpOworICBpID0gYml0IC8gR01QX0xJTUJfQklUUzsKKworICByZXR1cm4gbXBuX2NvbW1vbl9zY2FuICh+cHRyW2ldICYgKEdNUF9MSU1CX01BWCA8PCAoYml0ICUgR01QX0xJTUJfQklUUykpLAorCQkJICBpLCBwdHIsIGksIEdNUF9MSU1CX01BWCk7Cit9CisKK3ZvaWQKK21wbl9jb20gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbikKK3sKKyAgd2hpbGUgKC0tbiA+PSAwKQorICAgICpycCsrID0gfiAqdXArKzsKK30KKworbXBfbGltYl90CittcG5fbmVnIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4pCit7CisgIHdoaWxlICgqdXAgPT0gMCkKKyAgICB7CisgICAgICAqcnAgPSAwOworICAgICAgaWYgKCEtLW4pCisJcmV0dXJuIDA7CisgICAgICArK3VwOyArK3JwOworICAgIH0KKyAgKnJwID0gLSAqdXA7CisgIG1wbl9jb20gKCsrcnAsICsrdXAsIC0tbik7CisgIHJldHVybiAxOworfQorCisMCisvKiBNUE4gZGl2aXNpb24gaW50ZXJmYWNlLiAqLworCisvKiBUaGUgMy8yIGludmVyc2UgaXMgZGVmaW5lZCBhcworCisgICAgIG0gPSBmbG9vciggKEJeMy0xKSAvIChCIHUxICsgdTApKSAtIEIKKyovCittcF9saW1iX3QKK21wbl9pbnZlcnRfM2J5MiAobXBfbGltYl90IHUxLCBtcF9saW1iX3QgdTApCit7CisgIG1wX2xpbWJfdCByLCBtOworCisgIHsKKyAgICBtcF9saW1iX3QgcCwgcWw7CisgICAgdW5zaWduZWQgdWwsIHVoLCBxaDsKKworICAgIGFzc2VydCAoc2l6ZW9mICh1bnNpZ25lZCkgKiAyID49IHNpemVvZiAobXBfbGltYl90KSk7CisgICAgLyogRm9yIG5vdGF0aW9uLCBsZXQgYiBkZW5vdGUgdGhlIGhhbGYtbGltYiBiYXNlLCBzbyB0aGF0IEIgPSBiXjIuCisgICAgICAgU3BsaXQgdTEgPSBiIHVoICsgdWwuICovCisgICAgdWwgPSB1MSAmIEdNUF9MTElNQl9NQVNLOworICAgIHVoID0gdTEgPj4gKEdNUF9MSU1CX0JJVFMgLyAyKTsKKworICAgIC8qIEFwcHJveGltYXRpb24gb2YgdGhlIGhpZ2ggaGFsZiBvZiBxdW90aWVudC4gRGlmZmVycyBmcm9tIHRoZSAyLzEKKyAgICAgICBpbnZlcnNlIG9mIHRoZSBoYWxmIGxpbWIgdWgsIHNpbmNlIHdlIGhhdmUgYWxyZWFkeSBzdWJ0cmFjdGVkCisgICAgICAgdTAuICovCisgICAgcWggPSAodTEgXiBHTVBfTElNQl9NQVgpIC8gdWg7CisKKyAgICAvKiBBZGp1c3QgdG8gZ2V0IGEgaGFsZi1saW1iIDMvMiBpbnZlcnNlLCBpLmUuLCB3ZSB3YW50CisKKyAgICAgICBxaCcgPSBmbG9vciggKGJeMyAtIDEpIC8gdSkgLSBiID0gZmxvb3IgKChiXjMgLSBiIHUgLSAxKSAvIHUKKwkgICA9IGZsb29yKCAoYiAofnUpICsgYi0xKSAvIHUpLAorCisgICAgICAgYW5kIHRoZSByZW1haW5kZXIKKworICAgICAgIHIgPSBiICh+dSkgKyBiLTEgLSBxaCAoYiB1aCArIHVsKQorICAgICAgID0gYiAofnUgLSBxaCB1aCkgKyBiLTEgLSBxaCB1bAorCisgICAgICAgU3VidHJhY3Rpb24gb2YgcWggdWwgbWF5IHVuZGVyZmxvdywgd2hpY2ggaW1wbGllcyBhZGp1c3RtZW50cy4KKyAgICAgICBCdXQgYnkgbm9ybWFsaXphdGlvbiwgMiB1ID49IEIgPiBxaCB1bCwgc28gd2UgbmVlZCB0byBhZGp1c3QgYnkKKyAgICAgICBhdCBtb3N0IDIuCisgICAgKi8KKworICAgIHIgPSAoKH51MSAtIChtcF9saW1iX3QpIHFoICogdWgpIDw8IChHTVBfTElNQl9CSVRTIC8gMikpIHwgR01QX0xMSU1CX01BU0s7CisKKyAgICBwID0gKG1wX2xpbWJfdCkgcWggKiB1bDsKKyAgICAvKiBBZGp1c3RtZW50IHN0ZXBzIHRha2VuIGZyb20gdWRpdl9xcm5uZF9jICovCisgICAgaWYgKHIgPCBwKQorICAgICAgeworCXFoLS07CisJciArPSB1MTsKKwlpZiAociA+PSB1MSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIHIgKi8KKwkgIGlmIChyIDwgcCkKKwkgICAgeworCSAgICAgIHFoLS07CisJICAgICAgciArPSB1MTsKKwkgICAgfQorICAgICAgfQorICAgIHIgLT0gcDsKKworICAgIC8qIExvdyBoYWxmIG9mIHRoZSBxdW90aWVudCBpcworCisgICAgICAgcWwgPSBmbG9vciAoIChiIHIgKyBiLTEpIC8gdTEpLgorCisgICAgICAgVGhpcyBpcyBhIDMvMiBkaXZpc2lvbiAob24gaGFsZi1saW1icyksIGZvciB3aGljaCBxaCBpcyBhCisgICAgICAgc3VpdGFibGUgaW52ZXJzZS4gKi8KKworICAgIHAgPSAociA+PiAoR01QX0xJTUJfQklUUyAvIDIpKSAqIHFoICsgcjsKKyAgICAvKiBVbmxpa2UgZnVsbC1saW1iIDMvMiwgd2UgY2FuIGFkZCAxIHdpdGhvdXQgb3ZlcmZsb3cuIEZvciB0aGlzIHRvCisgICAgICAgd29yaywgaXQgaXMgZXNzZW50aWFsIHRoYXQgcWwgaXMgYSBmdWxsIG1wX2xpbWJfdC4gKi8KKyAgICBxbCA9IChwID4+IChHTVBfTElNQl9CSVRTIC8gMikpICsgMTsKKworICAgIC8qIEJ5IHRoZSAzLzIgdHJpY2ssIHdlIGRvbid0IG5lZWQgdGhlIGhpZ2ggaGFsZiBsaW1iLiAqLworICAgIHIgPSAociA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSArIEdNUF9MTElNQl9NQVNLIC0gcWwgKiB1MTsKKworICAgIGlmIChyID49IChHTVBfTElNQl9NQVggJiAocCA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSkpCisgICAgICB7CisJcWwtLTsKKwlyICs9IHUxOworICAgICAgfQorICAgIG0gPSAoKG1wX2xpbWJfdCkgcWggPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgKyBxbDsKKyAgICBpZiAociA+PSB1MSkKKyAgICAgIHsKKwltKys7CisJciAtPSB1MTsKKyAgICAgIH0KKyAgfQorCisgIC8qIE5vdyBtIGlzIHRoZSAyLzEgaW52ZXJzZSBvZiB1MS4gSWYgdTAgPiAwLCBhZGp1c3QgaXQgdG8gYmVjb21lIGEKKyAgICAgMy8yIGludmVyc2UuICovCisgIGlmICh1MCA+IDApCisgICAgeworICAgICAgbXBfbGltYl90IHRoLCB0bDsKKyAgICAgIHIgPSB+cjsKKyAgICAgIHIgKz0gdTA7CisgICAgICBpZiAociA8IHUwKQorCXsKKwkgIG0tLTsKKwkgIGlmIChyID49IHUxKQorCSAgICB7CisJICAgICAgbS0tOworCSAgICAgIHIgLT0gdTE7CisJICAgIH0KKwkgIHIgLT0gdTE7CisJfQorICAgICAgZ21wX3VtdWxfcHBtbSAodGgsIHRsLCB1MCwgbSk7CisgICAgICByICs9IHRoOworICAgICAgaWYgKHIgPCB0aCkKKwl7CisJICBtLS07CisJICBtIC09ICgociA+IHUxKSB8ICgociA9PSB1MSkgJiAodGwgPiB1MCkpKTsKKwl9CisgICAgfQorCisgIHJldHVybiBtOworfQorCitzdHJ1Y3QgZ21wX2Rpdl9pbnZlcnNlCit7CisgIC8qIE5vcm1hbGl6YXRpb24gc2hpZnQgY291bnQuICovCisgIHVuc2lnbmVkIHNoaWZ0OworICAvKiBOb3JtYWxpemVkIGRpdmlzb3IgKGQwIHVudXNlZCBmb3IgbXBuX2Rpdl9xcl8xKSAqLworICBtcF9saW1iX3QgZDEsIGQwOworICAvKiBJbnZlcnNlLCBmb3IgMi8xIG9yIDMvMi4gKi8KKyAgbXBfbGltYl90IGRpOworfTsKKworc3RhdGljIHZvaWQKK21wbl9kaXZfcXJfMV9pbnZlcnQgKHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgKmludiwgbXBfbGltYl90IGQpCit7CisgIHVuc2lnbmVkIHNoaWZ0OworCisgIGFzc2VydCAoZCA+IDApOworICBnbXBfY2x6IChzaGlmdCwgZCk7CisgIGludi0+c2hpZnQgPSBzaGlmdDsKKyAgaW52LT5kMSA9IGQgPDwgc2hpZnQ7CisgIGludi0+ZGkgPSBtcG5faW52ZXJ0X2xpbWIgKGludi0+ZDEpOworfQorCitzdGF0aWMgdm9pZAorbXBuX2Rpdl9xcl8yX2ludmVydCAoc3RydWN0IGdtcF9kaXZfaW52ZXJzZSAqaW52LAorCQkgICAgIG1wX2xpbWJfdCBkMSwgbXBfbGltYl90IGQwKQoreworICB1bnNpZ25lZCBzaGlmdDsKKworICBhc3NlcnQgKGQxID4gMCk7CisgIGdtcF9jbHogKHNoaWZ0LCBkMSk7CisgIGludi0+c2hpZnQgPSBzaGlmdDsKKyAgaWYgKHNoaWZ0ID4gMCkKKyAgICB7CisgICAgICBkMSA9IChkMSA8PCBzaGlmdCkgfCAoZDAgPj4gKEdNUF9MSU1CX0JJVFMgLSBzaGlmdCkpOworICAgICAgZDAgPDw9IHNoaWZ0OworICAgIH0KKyAgaW52LT5kMSA9IGQxOworICBpbnYtPmQwID0gZDA7CisgIGludi0+ZGkgPSBtcG5faW52ZXJ0XzNieTIgKGQxLCBkMCk7Cit9CisKK3N0YXRpYyB2b2lkCittcG5fZGl2X3FyX2ludmVydCAoc3RydWN0IGdtcF9kaXZfaW52ZXJzZSAqaW52LAorCQkgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbikKK3sKKyAgYXNzZXJ0IChkbiA+IDApOworCisgIGlmIChkbiA9PSAxKQorICAgIG1wbl9kaXZfcXJfMV9pbnZlcnQgKGludiwgZHBbMF0pOworICBlbHNlIGlmIChkbiA9PSAyKQorICAgIG1wbl9kaXZfcXJfMl9pbnZlcnQgKGludiwgZHBbMV0sIGRwWzBdKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNoaWZ0OworICAgICAgbXBfbGltYl90IGQxLCBkMDsKKworICAgICAgZDEgPSBkcFtkbi0xXTsKKyAgICAgIGQwID0gZHBbZG4tMl07CisgICAgICBhc3NlcnQgKGQxID4gMCk7CisgICAgICBnbXBfY2x6IChzaGlmdCwgZDEpOworICAgICAgaW52LT5zaGlmdCA9IHNoaWZ0OworICAgICAgaWYgKHNoaWZ0ID4gMCkKKwl7CisJICBkMSA9IChkMSA8PCBzaGlmdCkgfCAoZDAgPj4gKEdNUF9MSU1CX0JJVFMgLSBzaGlmdCkpOworCSAgZDAgPSAoZDAgPDwgc2hpZnQpIHwgKGRwW2RuLTNdID4+IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpKTsKKwl9CisgICAgICBpbnYtPmQxID0gZDE7CisgICAgICBpbnYtPmQwID0gZDA7CisgICAgICBpbnYtPmRpID0gbXBuX2ludmVydF8zYnkyIChkMSwgZDApOworICAgIH0KK30KKworLyogTm90IG1hdGNoaW5nIGN1cnJlbnQgcHVibGljIGdtcCBpbnRlcmZhY2UsIHJhdGhlciBjb3JyZXNwb25kaW5nIHRvCisgICB0aGUgc2JwaTFfZGl2XyogZnVuY3Rpb25zLiAqLworc3RhdGljIG1wX2xpbWJfdAorbXBuX2Rpdl9xcl8xX3ByZWludiAobXBfcHRyIHFwLCBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgZ21wX2Rpdl9pbnZlcnNlICppbnYpCit7CisgIG1wX2xpbWJfdCBkLCBkaTsKKyAgbXBfbGltYl90IHI7CisgIG1wX3B0ciB0cCA9IE5VTEw7CisgIG1wX3NpemVfdCB0biA9IDA7CisKKyAgaWYgKGludi0+c2hpZnQgPiAwKQorICAgIHsKKyAgICAgIC8qIFNoaWZ0LCByZXVzaW5nIHFwIGFyZWEgaWYgcG9zc2libGUuIEluLXBsYWNlIHNoaWZ0IGlmIHFwID09IG5wLiAqLworICAgICAgdHAgPSBxcDsKKyAgICAgIGlmICghdHApCisgICAgICAgIHsKKwkgICB0biA9IG5uOworCSAgIHRwID0gZ21wX2FsbG9jX2xpbWJzICh0bik7CisgICAgICAgIH0KKyAgICAgIHIgPSBtcG5fbHNoaWZ0ICh0cCwgbnAsIG5uLCBpbnYtPnNoaWZ0KTsKKyAgICAgIG5wID0gdHA7CisgICAgfQorICBlbHNlCisgICAgciA9IDA7CisKKyAgZCA9IGludi0+ZDE7CisgIGRpID0gaW52LT5kaTsKKyAgd2hpbGUgKC0tbm4gPj0gMCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgcTsKKworICAgICAgZ21wX3VkaXZfcXJubmRfcHJlaW52IChxLCByLCByLCBucFtubl0sIGQsIGRpKTsKKyAgICAgIGlmIChxcCkKKwlxcFtubl0gPSBxOworICAgIH0KKyAgaWYgKHRuKQorICAgIGdtcF9mcmVlX2xpbWJzICh0cCwgdG4pOworCisgIHJldHVybiByID4+IGludi0+c2hpZnQ7Cit9CisKK3N0YXRpYyB2b2lkCittcG5fZGl2X3FyXzJfcHJlaW52IChtcF9wdHIgcXAsIG1wX3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCQkgICAgIGNvbnN0IHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgKmludikKK3sKKyAgdW5zaWduZWQgc2hpZnQ7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgZDEsIGQwLCBkaSwgcjEsIHIwOworCisgIGFzc2VydCAobm4gPj0gMik7CisgIHNoaWZ0ID0gaW52LT5zaGlmdDsKKyAgZDEgPSBpbnYtPmQxOworICBkMCA9IGludi0+ZDA7CisgIGRpID0gaW52LT5kaTsKKworICBpZiAoc2hpZnQgPiAwKQorICAgIHIxID0gbXBuX2xzaGlmdCAobnAsIG5wLCBubiwgc2hpZnQpOworICBlbHNlCisgICAgcjEgPSAwOworCisgIHIwID0gbnBbbm4gLSAxXTsKKworICBpID0gbm4gLSAyOworICBkbworICAgIHsKKyAgICAgIG1wX2xpbWJfdCBuMCwgcTsKKyAgICAgIG4wID0gbnBbaV07CisgICAgICBnbXBfdWRpdl9xcl8zYnkyIChxLCByMSwgcjAsIHIxLCByMCwgbjAsIGQxLCBkMCwgZGkpOworCisgICAgICBpZiAocXApCisJcXBbaV0gPSBxOworICAgIH0KKyAgd2hpbGUgKC0taSA+PSAwKTsKKworICBpZiAoc2hpZnQgPiAwKQorICAgIHsKKyAgICAgIGFzc2VydCAoKHIwICYgKEdNUF9MSU1CX01BWCA+PiAoR01QX0xJTUJfQklUUyAtIHNoaWZ0KSkpID09IDApOworICAgICAgcjAgPSAocjAgPj4gc2hpZnQpIHwgKHIxIDw8IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpKTsKKyAgICAgIHIxID4+PSBzaGlmdDsKKyAgICB9CisKKyAgbnBbMV0gPSByMTsKKyAgbnBbMF0gPSByMDsKK30KKworc3RhdGljIHZvaWQKK21wbl9kaXZfcXJfcGkxIChtcF9wdHIgcXAsCisJCW1wX3B0ciBucCwgbXBfc2l6ZV90IG5uLCBtcF9saW1iX3QgbjEsCisJCW1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCQltcF9saW1iX3QgZGludikKK3sKKyAgbXBfc2l6ZV90IGk7CisKKyAgbXBfbGltYl90IGQxLCBkMDsKKyAgbXBfbGltYl90IGN5LCBjeTE7CisgIG1wX2xpbWJfdCBxOworCisgIGFzc2VydCAoZG4gPiAyKTsKKyAgYXNzZXJ0IChubiA+PSBkbik7CisKKyAgZDEgPSBkcFtkbiAtIDFdOworICBkMCA9IGRwW2RuIC0gMl07CisKKyAgYXNzZXJ0ICgoZDEgJiBHTVBfTElNQl9ISUdIQklUKSAhPSAwKTsKKyAgLyogSXRlcmF0aW9uIHZhcmlhYmxlIGlzIHRoZSBpbmRleCBvZiB0aGUgcSBsaW1iLgorICAgKgorICAgKiBXZSBkaXZpZGUgPG4xLCBucFtkbi0xK2ldLCBucFtkbi0yK2ldLCBucFtkbi0zK2ldLC4uLiwgbnBbaV0+CisgICAqIGJ5ICAgICAgICAgICAgPGQxLCAgICAgICAgICBkMCwgICAgICAgIGRwW2RuLTNdLCAgLi4uLCBkcFswXSA+CisgICAqLworCisgIGkgPSBubiAtIGRuOworICBkbworICAgIHsKKyAgICAgIG1wX2xpbWJfdCBuMCA9IG5wW2RuLTEraV07CisKKyAgICAgIGlmIChuMSA9PSBkMSAmJiBuMCA9PSBkMCkKKwl7CisJICBxID0gR01QX0xJTUJfTUFYOworCSAgbXBuX3N1Ym11bF8xIChucCtpLCBkcCwgZG4sIHEpOworCSAgbjEgPSBucFtkbi0xK2ldOwkvKiB1cGRhdGUgbjEsIGxhc3QgbG9vcCdzIHZhbHVlIHdpbGwgbm93IGJlIGludmFsaWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgZ21wX3VkaXZfcXJfM2J5MiAocSwgbjEsIG4wLCBuMSwgbjAsIG5wW2RuLTIraV0sIGQxLCBkMCwgZGludik7CisKKwkgIGN5ID0gbXBuX3N1Ym11bF8xIChucCArIGksIGRwLCBkbi0yLCBxKTsKKworCSAgY3kxID0gbjAgPCBjeTsKKwkgIG4wID0gbjAgLSBjeTsKKwkgIGN5ID0gbjEgPCBjeTE7CisJICBuMSA9IG4xIC0gY3kxOworCSAgbnBbZG4tMitpXSA9IG4wOworCisJICBpZiAoY3kgIT0gMCkKKwkgICAgeworCSAgICAgIG4xICs9IGQxICsgbXBuX2FkZF9uIChucCArIGksIG5wICsgaSwgZHAsIGRuIC0gMSk7CisJICAgICAgcS0tOworCSAgICB9CisJfQorCisgICAgICBpZiAocXApCisJcXBbaV0gPSBxOworICAgIH0KKyAgd2hpbGUgKC0taSA+PSAwKTsKKworICBucFtkbiAtIDFdID0gbjE7Cit9CisKK3N0YXRpYyB2b2lkCittcG5fZGl2X3FyX3ByZWludiAobXBfcHRyIHFwLCBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJCSAgIGNvbnN0IHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgKmludikKK3sKKyAgYXNzZXJ0IChkbiA+IDApOworICBhc3NlcnQgKG5uID49IGRuKTsKKworICBpZiAoZG4gPT0gMSkKKyAgICBucFswXSA9IG1wbl9kaXZfcXJfMV9wcmVpbnYgKHFwLCBucCwgbm4sIGludik7CisgIGVsc2UgaWYgKGRuID09IDIpCisgICAgbXBuX2Rpdl9xcl8yX3ByZWludiAocXAsIG5wLCBubiwgaW52KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBuaDsKKyAgICAgIHVuc2lnbmVkIHNoaWZ0OworCisgICAgICBhc3NlcnQgKGludi0+ZDEgPT0gZHBbZG4tMV0pOworICAgICAgYXNzZXJ0IChpbnYtPmQwID09IGRwW2RuLTJdKTsKKyAgICAgIGFzc2VydCAoKGludi0+ZDEgJiBHTVBfTElNQl9ISUdIQklUKSAhPSAwKTsKKworICAgICAgc2hpZnQgPSBpbnYtPnNoaWZ0OworICAgICAgaWYgKHNoaWZ0ID4gMCkKKwluaCA9IG1wbl9sc2hpZnQgKG5wLCBucCwgbm4sIHNoaWZ0KTsKKyAgICAgIGVsc2UKKwluaCA9IDA7CisKKyAgICAgIG1wbl9kaXZfcXJfcGkxIChxcCwgbnAsIG5uLCBuaCwgZHAsIGRuLCBpbnYtPmRpKTsKKworICAgICAgaWYgKHNoaWZ0ID4gMCkKKwlnbXBfYXNzZXJ0X25vY2FycnkgKG1wbl9yc2hpZnQgKG5wLCBucCwgZG4sIHNoaWZ0KSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbXBuX2Rpdl9xciAobXBfcHRyIHFwLCBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4pCit7CisgIHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgaW52OworICBtcF9wdHIgdHAgPSBOVUxMOworCisgIGFzc2VydCAoZG4gPiAwKTsKKyAgYXNzZXJ0IChubiA+PSBkbik7CisKKyAgbXBuX2Rpdl9xcl9pbnZlcnQgKCZpbnYsIGRwLCBkbik7CisgIGlmIChkbiA+IDIgJiYgaW52LnNoaWZ0ID4gMCkKKyAgICB7CisgICAgICB0cCA9IGdtcF9hbGxvY19saW1icyAoZG4pOworICAgICAgZ21wX2Fzc2VydF9ub2NhcnJ5IChtcG5fbHNoaWZ0ICh0cCwgZHAsIGRuLCBpbnYuc2hpZnQpKTsKKyAgICAgIGRwID0gdHA7CisgICAgfQorICBtcG5fZGl2X3FyX3ByZWludiAocXAsIG5wLCBubiwgZHAsIGRuLCAmaW52KTsKKyAgaWYgKHRwKQorICAgIGdtcF9mcmVlX2xpbWJzICh0cCwgZG4pOworfQorCisMCisvKiBNUE4gYmFzZSBjb252ZXJzaW9uLiAqLworc3RhdGljIHVuc2lnbmVkCittcG5fYmFzZV9wb3dlcl9vZl90d29fcCAodW5zaWduZWQgYikKK3sKKyAgc3dpdGNoIChiKQorICAgIHsKKyAgICBjYXNlIDI6IHJldHVybiAxOworICAgIGNhc2UgNDogcmV0dXJuIDI7CisgICAgY2FzZSA4OiByZXR1cm4gMzsKKyAgICBjYXNlIDE2OiByZXR1cm4gNDsKKyAgICBjYXNlIDMyOiByZXR1cm4gNTsKKyAgICBjYXNlIDY0OiByZXR1cm4gNjsKKyAgICBjYXNlIDEyODogcmV0dXJuIDc7CisgICAgY2FzZSAyNTY6IHJldHVybiA4OworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgIH0KK30KKworc3RydWN0IG1wbl9iYXNlX2luZm8KK3sKKyAgLyogYmIgaXMgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdGhlIGJhc2Ugd2hpY2ggZml0cyBpbiBvbmUgbGltYiwgYW5kCisgICAgIGV4cCBpcyB0aGUgY29ycmVzcG9uZGluZyBleHBvbmVudC4gKi8KKyAgdW5zaWduZWQgZXhwOworICBtcF9saW1iX3QgYmI7Cit9OworCitzdGF0aWMgdm9pZAorbXBuX2dldF9iYXNlX2luZm8gKHN0cnVjdCBtcG5fYmFzZV9pbmZvICppbmZvLCBtcF9saW1iX3QgYikKK3sKKyAgbXBfbGltYl90IG07CisgIG1wX2xpbWJfdCBwOworICB1bnNpZ25lZCBleHA7CisKKyAgbSA9IEdNUF9MSU1CX01BWCAvIGI7CisgIGZvciAoZXhwID0gMSwgcCA9IGI7IHAgPD0gbTsgZXhwKyspCisgICAgcCAqPSBiOworCisgIGluZm8tPmV4cCA9IGV4cDsKKyAgaW5mby0+YmIgPSBwOworfQorCitzdGF0aWMgbXBfYml0Y250X3QKK21wbl9saW1iX3NpemVfaW5fYmFzZV8yIChtcF9saW1iX3QgdSkKK3sKKyAgdW5zaWduZWQgc2hpZnQ7CisKKyAgYXNzZXJ0ICh1ID4gMCk7CisgIGdtcF9jbHogKHNoaWZ0LCB1KTsKKyAgcmV0dXJuIEdNUF9MSU1CX0JJVFMgLSBzaGlmdDsKK30KKworc3RhdGljIHNpemVfdAorbXBuX2dldF9zdHJfYml0cyAodW5zaWduZWQgY2hhciAqc3AsIHVuc2lnbmVkIGJpdHMsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuKQoreworICB1bnNpZ25lZCBjaGFyIG1hc2s7CisgIHNpemVfdCBzbiwgajsKKyAgbXBfc2l6ZV90IGk7CisgIHVuc2lnbmVkIHNoaWZ0OworCisgIHNuID0gKCh1biAtIDEpICogR01QX0xJTUJfQklUUyArIG1wbl9saW1iX3NpemVfaW5fYmFzZV8yICh1cFt1bi0xXSkKKwkrIGJpdHMgLSAxKSAvIGJpdHM7CisKKyAgbWFzayA9ICgxVSA8PCBiaXRzKSAtIDE7CisKKyAgZm9yIChpID0gMCwgaiA9IHNuLCBzaGlmdCA9IDA7IGotLSA+IDA7KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZGlnaXQgPSB1cFtpXSA+PiBzaGlmdDsKKworICAgICAgc2hpZnQgKz0gYml0czsKKworICAgICAgaWYgKHNoaWZ0ID49IEdNUF9MSU1CX0JJVFMgJiYgKytpIDwgdW4pCisJeworCSAgc2hpZnQgLT0gR01QX0xJTUJfQklUUzsKKwkgIGRpZ2l0IHw9IHVwW2ldIDw8IChiaXRzIC0gc2hpZnQpOworCX0KKyAgICAgIHNwW2pdID0gZGlnaXQgJiBtYXNrOworICAgIH0KKyAgcmV0dXJuIHNuOworfQorCisvKiBXZSBnZW5lcmF0ZSBkaWdpdHMgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZW5kLCBhbmQgcmV2ZXJzZSBhdAorICAgdGhlIGVuZC4gKi8KK3N0YXRpYyBzaXplX3QKK21wbl9saW1iX2dldF9zdHIgKHVuc2lnbmVkIGNoYXIgKnNwLCBtcF9saW1iX3QgdywKKwkJICBjb25zdCBzdHJ1Y3QgZ21wX2Rpdl9pbnZlcnNlICpiaW52KQoreworICBtcF9zaXplX3QgaTsKKyAgZm9yIChpID0gMDsgdyA+IDA7IGkrKykKKyAgICB7CisgICAgICBtcF9saW1iX3QgaCwgbCwgcjsKKworICAgICAgaCA9IHcgPj4gKEdNUF9MSU1CX0JJVFMgLSBiaW52LT5zaGlmdCk7CisgICAgICBsID0gdyA8PCBiaW52LT5zaGlmdDsKKworICAgICAgZ21wX3VkaXZfcXJubmRfcHJlaW52ICh3LCByLCBoLCBsLCBiaW52LT5kMSwgYmludi0+ZGkpOworICAgICAgYXNzZXJ0ICgociAmIChHTVBfTElNQl9NQVggPj4gKEdNUF9MSU1CX0JJVFMgLSBiaW52LT5zaGlmdCkpKSA9PSAwKTsKKyAgICAgIHIgPj49IGJpbnYtPnNoaWZ0OworCisgICAgICBzcFtpXSA9IHI7CisgICAgfQorICByZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdAorbXBuX2dldF9zdHJfb3RoZXIgKHVuc2lnbmVkIGNoYXIgKnNwLAorCQkgICBpbnQgYmFzZSwgY29uc3Qgc3RydWN0IG1wbl9iYXNlX2luZm8gKmluZm8sCisJCSAgIG1wX3B0ciB1cCwgbXBfc2l6ZV90IHVuKQoreworICBzdHJ1Y3QgZ21wX2Rpdl9pbnZlcnNlIGJpbnY7CisgIHNpemVfdCBzbjsKKyAgc2l6ZV90IGk7CisKKyAgbXBuX2Rpdl9xcl8xX2ludmVydCAoJmJpbnYsIGJhc2UpOworCisgIHNuID0gMDsKKworICBpZiAodW4gPiAxKQorICAgIHsKKyAgICAgIHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgYmJpbnY7CisgICAgICBtcG5fZGl2X3FyXzFfaW52ZXJ0ICgmYmJpbnYsIGluZm8tPmJiKTsKKworICAgICAgZG8KKwl7CisJICBtcF9saW1iX3QgdzsKKwkgIHNpemVfdCBkb25lOworCSAgdyA9IG1wbl9kaXZfcXJfMV9wcmVpbnYgKHVwLCB1cCwgdW4sICZiYmludik7CisJICB1biAtPSAodXBbdW4tMV0gPT0gMCk7CisJICBkb25lID0gbXBuX2xpbWJfZ2V0X3N0ciAoc3AgKyBzbiwgdywgJmJpbnYpOworCisJICBmb3IgKHNuICs9IGRvbmU7IGRvbmUgPCBpbmZvLT5leHA7IGRvbmUrKykKKwkgICAgc3Bbc24rK10gPSAwOworCX0KKyAgICAgIHdoaWxlICh1biA+IDEpOworICAgIH0KKyAgc24gKz0gbXBuX2xpbWJfZ2V0X3N0ciAoc3AgKyBzbiwgdXBbMF0sICZiaW52KTsKKworICAvKiBSZXZlcnNlIG9yZGVyICovCisgIGZvciAoaSA9IDA7IDIqaSArIDEgPCBzbjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdCA9IHNwW2ldOworICAgICAgc3BbaV0gPSBzcFtzbiAtIGkgLSAxXTsKKyAgICAgIHNwW3NuIC0gaSAtIDFdID0gdDsKKyAgICB9CisKKyAgcmV0dXJuIHNuOworfQorCitzaXplX3QKK21wbl9nZXRfc3RyICh1bnNpZ25lZCBjaGFyICpzcCwgaW50IGJhc2UsIG1wX3B0ciB1cCwgbXBfc2l6ZV90IHVuKQoreworICB1bnNpZ25lZCBiaXRzOworCisgIGFzc2VydCAodW4gPiAwKTsKKyAgYXNzZXJ0ICh1cFt1bi0xXSA+IDApOworCisgIGJpdHMgPSBtcG5fYmFzZV9wb3dlcl9vZl90d29fcCAoYmFzZSk7CisgIGlmIChiaXRzKQorICAgIHJldHVybiBtcG5fZ2V0X3N0cl9iaXRzIChzcCwgYml0cywgdXAsIHVuKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBtcG5fYmFzZV9pbmZvIGluZm87CisKKyAgICAgIG1wbl9nZXRfYmFzZV9pbmZvICgmaW5mbywgYmFzZSk7CisgICAgICByZXR1cm4gbXBuX2dldF9zdHJfb3RoZXIgKHNwLCBiYXNlLCAmaW5mbywgdXAsIHVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyBtcF9zaXplX3QKK21wbl9zZXRfc3RyX2JpdHMgKG1wX3B0ciBycCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3AsIHNpemVfdCBzbiwKKwkJICB1bnNpZ25lZCBiaXRzKQoreworICBtcF9zaXplX3Qgcm47CisgIG1wX2xpbWJfdCBsaW1iOworICB1bnNpZ25lZCBzaGlmdDsKKworICBmb3IgKGxpbWIgPSAwLCBybiA9IDAsIHNoaWZ0ID0gMDsgc24tLSA+IDA7ICkKKyAgICB7CisgICAgICBsaW1iIHw9IChtcF9saW1iX3QpIHNwW3NuXSA8PCBzaGlmdDsKKyAgICAgIHNoaWZ0ICs9IGJpdHM7CisgICAgICBpZiAoc2hpZnQgPj0gR01QX0xJTUJfQklUUykKKwl7CisJICBzaGlmdCAtPSBHTVBfTElNQl9CSVRTOworCSAgcnBbcm4rK10gPSBsaW1iOworCSAgLyogTmV4dCBsaW5lIGlzIGNvcnJlY3QgYWxzbyBpZiBzaGlmdCA9PSAwLAorCSAgICAgYml0cyA9PSA4LCBhbmQgbXBfbGltYl90ID09IHVuc2lnbmVkIGNoYXIuICovCisJICBsaW1iID0gKHVuc2lnbmVkIGludCkgc3Bbc25dID4+IChiaXRzIC0gc2hpZnQpOworCX0KKyAgICB9CisgIGlmIChsaW1iICE9IDApCisgICAgcnBbcm4rK10gPSBsaW1iOworICBlbHNlCisgICAgcm4gPSBtcG5fbm9ybWFsaXplZF9zaXplIChycCwgcm4pOworICByZXR1cm4gcm47Cit9CisKKy8qIFJlc3VsdCBpcyB1c3VhbGx5IG5vcm1hbGl6ZWQsIGV4Y2VwdCBmb3IgYWxsLXplcm8gaW5wdXQsIGluIHdoaWNoCisgICBjYXNlIGEgc2luZ2xlIHplcm8gbGltYiBpcyB3cml0dGVuIGF0ICpSUCwgYW5kIDEgaXMgcmV0dXJuZWQuICovCitzdGF0aWMgbXBfc2l6ZV90CittcG5fc2V0X3N0cl9vdGhlciAobXBfcHRyIHJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcCwgc2l6ZV90IHNuLAorCQkgICBtcF9saW1iX3QgYiwgY29uc3Qgc3RydWN0IG1wbl9iYXNlX2luZm8gKmluZm8pCit7CisgIG1wX3NpemVfdCBybjsKKyAgbXBfbGltYl90IHc7CisgIHVuc2lnbmVkIGs7CisgIHNpemVfdCBqOworCisgIGFzc2VydCAoc24gPiAwKTsKKworICBrID0gMSArIChzbiAtIDEpICUgaW5mby0+ZXhwOworCisgIGogPSAwOworICB3ID0gc3BbaisrXTsKKyAgd2hpbGUgKC0tayAhPSAwKQorICAgIHcgPSB3ICogYiArIHNwW2orK107CisKKyAgcnBbMF0gPSB3OworCisgIGZvciAocm4gPSAxOyBqIDwgc247KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeTsKKworICAgICAgdyA9IHNwW2orK107CisgICAgICBmb3IgKGsgPSAxOyBrIDwgaW5mby0+ZXhwOyBrKyspCisJdyA9IHcgKiBiICsgc3BbaisrXTsKKworICAgICAgY3kgPSBtcG5fbXVsXzEgKHJwLCBycCwgcm4sIGluZm8tPmJiKTsKKyAgICAgIGN5ICs9IG1wbl9hZGRfMSAocnAsIHJwLCBybiwgdyk7CisgICAgICBpZiAoY3kgPiAwKQorCXJwW3JuKytdID0gY3k7CisgICAgfQorICBhc3NlcnQgKGogPT0gc24pOworCisgIHJldHVybiBybjsKK30KKworbXBfc2l6ZV90CittcG5fc2V0X3N0ciAobXBfcHRyIHJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcCwgc2l6ZV90IHNuLCBpbnQgYmFzZSkKK3sKKyAgdW5zaWduZWQgYml0czsKKworICBpZiAoc24gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBiaXRzID0gbXBuX2Jhc2VfcG93ZXJfb2ZfdHdvX3AgKGJhc2UpOworICBpZiAoYml0cykKKyAgICByZXR1cm4gbXBuX3NldF9zdHJfYml0cyAocnAsIHNwLCBzbiwgYml0cyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgbXBuX2Jhc2VfaW5mbyBpbmZvOworCisgICAgICBtcG5fZ2V0X2Jhc2VfaW5mbyAoJmluZm8sIGJhc2UpOworICAgICAgcmV0dXJuIG1wbl9zZXRfc3RyX290aGVyIChycCwgc3AsIHNuLCBiYXNlLCAmaW5mbyk7CisgICAgfQorfQorCisMCisvKiBNUFogaW50ZXJmYWNlICovCit2b2lkCittcHpfaW5pdCAobXB6X3QgcikKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iID0gR01QX0xJTUJfTUFYICYgMHhjMWEwOworCisgIHItPl9tcF9hbGxvYyA9IDA7CisgIHItPl9tcF9zaXplID0gMDsKKyAgci0+X21wX2QgPSAobXBfcHRyKSAmZHVtbXlfbGltYjsKK30KKworLyogVGhlIHV0aWxpdHkgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGJpdCBsaW1pdGVkLCBzaW5jZSBtYW55IGZ1bmN0aW9ucworICAgYXNzaWducyB0aGUgcmVzdWx0IHZhcmlhYmxlIHVzaW5nIG1wel9zd2FwLiAqLwordm9pZAorbXB6X2luaXQyIChtcHpfdCByLCBtcF9iaXRjbnRfdCBiaXRzKQoreworICBtcF9zaXplX3Qgcm47CisKKyAgYml0cyAtPSAoYml0cyAhPSAwKTsJCS8qIFJvdW5kIGRvd24sIGV4Y2VwdCBpZiAwICovCisgIHJuID0gMSArIGJpdHMgLyBHTVBfTElNQl9CSVRTOworCisgIHItPl9tcF9hbGxvYyA9IHJuOworICByLT5fbXBfc2l6ZSA9IDA7CisgIHItPl9tcF9kID0gZ21wX2FsbG9jX2xpbWJzIChybik7Cit9CisKK3ZvaWQKK21wel9jbGVhciAobXB6X3QgcikKK3sKKyAgaWYgKHItPl9tcF9hbGxvYykKKyAgICBnbXBfZnJlZV9saW1icyAoci0+X21wX2QsIHItPl9tcF9hbGxvYyk7Cit9CisKK3N0YXRpYyBtcF9wdHIKK21wel9yZWFsbG9jIChtcHpfdCByLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgc2l6ZSA9IEdNUF9NQVggKHNpemUsIDEpOworCisgIGlmIChyLT5fbXBfYWxsb2MpCisgICAgci0+X21wX2QgPSBnbXBfcmVhbGxvY19saW1icyAoci0+X21wX2QsIHItPl9tcF9hbGxvYywgc2l6ZSk7CisgIGVsc2UKKyAgICByLT5fbXBfZCA9IGdtcF9hbGxvY19saW1icyAoc2l6ZSk7CisgIHItPl9tcF9hbGxvYyA9IHNpemU7CisKKyAgaWYgKEdNUF9BQlMgKHItPl9tcF9zaXplKSA+IHNpemUpCisgICAgci0+X21wX3NpemUgPSAwOworCisgIHJldHVybiByLT5fbXBfZDsKK30KKworLyogUmVhbGxvYyBmb3IgYW4gbXB6X3QgV0hBVCBpZiBpdCBoYXMgbGVzcyB0aGFuIE5FRURFRCBsaW1icy4gICovCisjZGVmaW5lIE1QWl9SRUFMTE9DKHosbikgKChuKSA+ICh6KS0+X21wX2FsbG9jCQkJXAorCQkJICA/IG1wel9yZWFsbG9jKHosbikJCQlcCisJCQkgIDogKHopLT5fbXBfZCkKKwwKKy8qIE1QWiBhc3NpZ25tZW50IGFuZCBiYXNpYyBjb252ZXJzaW9ucy4gKi8KK3ZvaWQKK21wel9zZXRfc2kgKG1wel90IHIsIHNpZ25lZCBsb25nIGludCB4KQoreworICBpZiAoeCA+PSAwKQorICAgIG1wel9zZXRfdWkgKHIsIHgpOworICBlbHNlIC8qICh4IDwgMCkgKi8KKyAgICBpZiAoR01QX0xJTUJfQklUUyA8IEdNUF9VTE9OR19CSVRTKQorICAgICAgeworCW1wel9zZXRfdWkgKHIsIEdNUF9ORUdfQ0FTVCAodW5zaWduZWQgbG9uZyBpbnQsIHgpKTsKKwltcHpfbmVnIChyLCByKTsKKyAgICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHItPl9tcF9zaXplID0gLTE7CisgICAgICBNUFpfUkVBTExPQyAociwgMSlbMF0gPSBHTVBfTkVHX0NBU1QgKHVuc2lnbmVkIGxvbmcgaW50LCB4KTsKKyAgICB9Cit9CisKK3ZvaWQKK21wel9zZXRfdWkgKG1wel90IHIsIHVuc2lnbmVkIGxvbmcgaW50IHgpCit7CisgIGlmICh4ID4gMCkKKyAgICB7CisgICAgICByLT5fbXBfc2l6ZSA9IDE7CisgICAgICBNUFpfUkVBTExPQyAociwgMSlbMF0gPSB4OworICAgICAgaWYgKEdNUF9MSU1CX0JJVFMgPCBHTVBfVUxPTkdfQklUUykKKwl7CisJICBpbnQgTE9DQUxfR01QX0xJTUJfQklUUyA9IEdNUF9MSU1CX0JJVFM7CisJICB3aGlsZSAoeCA+Pj0gTE9DQUxfR01QX0xJTUJfQklUUykKKwkgICAgeworCSAgICAgICsrIHItPl9tcF9zaXplOworCSAgICAgIE1QWl9SRUFMTE9DIChyLCByLT5fbXBfc2l6ZSlbci0+X21wX3NpemUgLSAxXSA9IHg7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgci0+X21wX3NpemUgPSAwOworfQorCit2b2lkCittcHpfc2V0IChtcHpfdCByLCBjb25zdCBtcHpfdCB4KQoreworICAvKiBBbGxvdyB0aGUgTk9QIHIgPT0geCAqLworICBpZiAociAhPSB4KQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBuOworICAgICAgbXBfcHRyIHJwOworCisgICAgICBuID0gR01QX0FCUyAoeC0+X21wX3NpemUpOworICAgICAgcnAgPSBNUFpfUkVBTExPQyAociwgbik7CisKKyAgICAgIG1wbl9jb3B5aSAocnAsIHgtPl9tcF9kLCBuKTsKKyAgICAgIHItPl9tcF9zaXplID0geC0+X21wX3NpemU7CisgICAgfQorfQorCit2b2lkCittcHpfaW5pdF9zZXRfc2kgKG1wel90IHIsIHNpZ25lZCBsb25nIGludCB4KQoreworICBtcHpfaW5pdCAocik7CisgIG1wel9zZXRfc2kgKHIsIHgpOworfQorCit2b2lkCittcHpfaW5pdF9zZXRfdWkgKG1wel90IHIsIHVuc2lnbmVkIGxvbmcgaW50IHgpCit7CisgIG1wel9pbml0IChyKTsKKyAgbXB6X3NldF91aSAociwgeCk7Cit9CisKK3ZvaWQKK21wel9pbml0X3NldCAobXB6X3QgciwgY29uc3QgbXB6X3QgeCkKK3sKKyAgbXB6X2luaXQgKHIpOworICBtcHpfc2V0IChyLCB4KTsKK30KKworaW50CittcHpfZml0c19zbG9uZ19wIChjb25zdCBtcHpfdCB1KQoreworICByZXR1cm4gbXB6X2NtcF9zaSAodSwgTE9OR19NQVgpIDw9IDAgJiYgbXB6X2NtcF9zaSAodSwgTE9OR19NSU4pID49IDA7Cit9CisKK3N0YXRpYyBpbnQKK21wbl9hYnNmaXRzX3Vsb25nX3AgKG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuKQoreworICBpbnQgdWxvbmdzaXplID0gR01QX1VMT05HX0JJVFMgLyBHTVBfTElNQl9CSVRTOworICBtcF9saW1iX3QgdWxvbmdyZW0gPSAwOworCisgIGlmIChHTVBfVUxPTkdfQklUUyAlIEdNUF9MSU1CX0JJVFMgIT0gMCkKKyAgICB1bG9uZ3JlbSA9IChtcF9saW1iX3QpIChVTE9OR19NQVggPj4gR01QX0xJTUJfQklUUyAqIHVsb25nc2l6ZSkgKyAxOworCisgIHJldHVybiB1biA8PSB1bG9uZ3NpemUgfHwgKHVwW3Vsb25nc2l6ZV0gPCB1bG9uZ3JlbSAmJiB1biA9PSB1bG9uZ3NpemUgKyAxKTsKK30KKworaW50CittcHpfZml0c191bG9uZ19wIChjb25zdCBtcHpfdCB1KQoreworICBtcF9zaXplX3QgdXMgPSB1LT5fbXBfc2l6ZTsKKworICByZXR1cm4gdXMgPj0gMCAmJiBtcG5fYWJzZml0c191bG9uZ19wICh1LT5fbXBfZCwgdXMpOworfQorCitpbnQKK21wel9maXRzX3NpbnRfcCAoY29uc3QgbXB6X3QgdSkKK3sKKyAgcmV0dXJuIG1wel9jbXBfc2kgKHUsIElOVF9NQVgpIDw9IDAgJiYgbXB6X2NtcF9zaSAodSwgSU5UX01JTikgPj0gMDsKK30KKworaW50CittcHpfZml0c191aW50X3AgKGNvbnN0IG1wel90IHUpCit7CisgIHJldHVybiB1LT5fbXBfc2l6ZSA+PSAwICYmIG1wel9jbXBhYnNfdWkgKHUsIFVJTlRfTUFYKSA8PSAwOworfQorCitpbnQKK21wel9maXRzX3NzaG9ydF9wIChjb25zdCBtcHpfdCB1KQoreworICByZXR1cm4gbXB6X2NtcF9zaSAodSwgU0hSVF9NQVgpIDw9IDAgJiYgbXB6X2NtcF9zaSAodSwgU0hSVF9NSU4pID49IDA7Cit9CisKK2ludAorbXB6X2ZpdHNfdXNob3J0X3AgKGNvbnN0IG1wel90IHUpCit7CisgIHJldHVybiB1LT5fbXBfc2l6ZSA+PSAwICYmIG1wel9jbXBhYnNfdWkgKHUsIFVTSFJUX01BWCkgPD0gMDsKK30KKworbG9uZyBpbnQKK21wel9nZXRfc2kgKGNvbnN0IG1wel90IHUpCit7CisgIHVuc2lnbmVkIGxvbmcgciA9IG1wel9nZXRfdWkgKHUpOworICB1bnNpZ25lZCBsb25nIGMgPSAtTE9OR19NQVggLSBMT05HX01JTjsKKworICBpZiAodS0+X21wX3NpemUgPCAwKQorICAgIC8qIFRoaXMgZXhwcmVzc2lvbiBpcyBuZWNlc3NhcnkgdG8gcHJvcGVybHkgaGFuZGxlIC1MT05HX01JTiAqLworICAgIHJldHVybiAtKGxvbmcpIGMgLSAobG9uZykgKChyIC0gYykgJiBMT05HX01BWCk7CisgIGVsc2UKKyAgICByZXR1cm4gKGxvbmcpIChyICYgTE9OR19NQVgpOworfQorCit1bnNpZ25lZCBsb25nIGludAorbXB6X2dldF91aSAoY29uc3QgbXB6X3QgdSkKK3sKKyAgaWYgKEdNUF9MSU1CX0JJVFMgPCBHTVBfVUxPTkdfQklUUykKKyAgICB7CisgICAgICBpbnQgTE9DQUxfR01QX0xJTUJfQklUUyA9IEdNUF9MSU1CX0JJVFM7CisgICAgICB1bnNpZ25lZCBsb25nIHIgPSAwOworICAgICAgbXBfc2l6ZV90IG4gPSBHTVBfQUJTICh1LT5fbXBfc2l6ZSk7CisgICAgICBuID0gR01QX01JTiAobiwgMSArIChtcF9zaXplX3QpIChHTVBfVUxPTkdfQklUUyAtIDEpIC8gR01QX0xJTUJfQklUUyk7CisgICAgICB3aGlsZSAoLS1uID49IDApCisJciA9IChyIDw8IExPQ0FMX0dNUF9MSU1CX0JJVFMpICsgdS0+X21wX2Rbbl07CisgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgcmV0dXJuIHUtPl9tcF9zaXplID09IDAgPyAwIDogdS0+X21wX2RbMF07Cit9CisKK3NpemVfdAorbXB6X3NpemUgKGNvbnN0IG1wel90IHUpCit7CisgIHJldHVybiBHTVBfQUJTICh1LT5fbXBfc2l6ZSk7Cit9CisKK21wX2xpbWJfdAorbXB6X2dldGxpbWJuIChjb25zdCBtcHpfdCB1LCBtcF9zaXplX3QgbikKK3sKKyAgaWYgKG4gPj0gMCAmJiBuIDwgR01QX0FCUyAodS0+X21wX3NpemUpKQorICAgIHJldHVybiB1LT5fbXBfZFtuXTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCit2b2lkCittcHpfcmVhbGxvYzIgKG1wel90IHgsIG1wX2JpdGNudF90IG4pCit7CisgIG1wel9yZWFsbG9jICh4LCAxICsgKG4gLSAobiAhPSAwKSkgLyBHTVBfTElNQl9CSVRTKTsKK30KKworbXBfc3JjcHRyCittcHpfbGltYnNfcmVhZCAobXB6X3NyY3B0ciB4KQoreworICByZXR1cm4geC0+X21wX2Q7Cit9CisKK21wX3B0cgorbXB6X2xpbWJzX21vZGlmeSAobXB6X3QgeCwgbXBfc2l6ZV90IG4pCit7CisgIGFzc2VydCAobiA+IDApOworICByZXR1cm4gTVBaX1JFQUxMT0MgKHgsIG4pOworfQorCittcF9wdHIKK21wel9saW1ic193cml0ZSAobXB6X3QgeCwgbXBfc2l6ZV90IG4pCit7CisgIHJldHVybiBtcHpfbGltYnNfbW9kaWZ5ICh4LCBuKTsKK30KKwordm9pZAorbXB6X2xpbWJzX2ZpbmlzaCAobXB6X3QgeCwgbXBfc2l6ZV90IHhzKQoreworICBtcF9zaXplX3QgeG47CisgIHhuID0gbXBuX25vcm1hbGl6ZWRfc2l6ZSAoeC0+X21wX2QsIEdNUF9BQlMgKHhzKSk7CisgIHgtPl9tcF9zaXplID0geHMgPCAwID8gLXhuIDogeG47Cit9CisKK3N0YXRpYyBtcHpfc3JjcHRyCittcHpfcm9pbml0X25vcm1hbF9uIChtcHpfdCB4LCBtcF9zcmNwdHIgeHAsIG1wX3NpemVfdCB4cykKK3sKKyAgeC0+X21wX2FsbG9jID0gMDsKKyAgeC0+X21wX2QgPSAobXBfcHRyKSB4cDsKKyAgeC0+X21wX3NpemUgPSB4czsKKyAgcmV0dXJuIHg7Cit9CisKK21wel9zcmNwdHIKK21wel9yb2luaXRfbiAobXB6X3QgeCwgbXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgeHMpCit7CisgIG1wel9yb2luaXRfbm9ybWFsX24gKHgsIHhwLCB4cyk7CisgIG1wel9saW1ic19maW5pc2ggKHgsIHhzKTsKKyAgcmV0dXJuIHg7Cit9CisKKwwKKy8qIENvbnZlcnNpb25zIGFuZCBjb21wYXJpc29uIHRvIGRvdWJsZS4gKi8KK3ZvaWQKK21wel9zZXRfZCAobXB6X3QgciwgZG91YmxlIHgpCit7CisgIGludCBzaWduOworICBtcF9wdHIgcnA7CisgIG1wX3NpemVfdCBybiwgaTsKKyAgZG91YmxlIEI7CisgIGRvdWJsZSBCaTsKKyAgbXBfbGltYl90IGY7CisKKyAgLyogeCAhPSB4IGlzIHRydWUgd2hlbiB4IGlzIGEgTmFOLCBhbmQgeCA9PSB4ICogMC41IGlzIHRydWUgd2hlbiB4IGlzCisgICAgIHplcm8gb3IgaW5maW5pdHkuICovCisgIGlmICh4ICE9IHggfHwgeCA9PSB4ICogMC41KQorICAgIHsKKyAgICAgIHItPl9tcF9zaXplID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2lnbiA9IHggPCAwLjAgOworICBpZiAoc2lnbikKKyAgICB4ID0gLSB4OworCisgIGlmICh4IDwgMS4wKQorICAgIHsKKyAgICAgIHItPl9tcF9zaXplID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIEIgPSA0LjAgKiAoZG91YmxlKSAoR01QX0xJTUJfSElHSEJJVCA+PiAxKTsKKyAgQmkgPSAxLjAgLyBCOworICBmb3IgKHJuID0gMTsgeCA+PSBCOyBybisrKQorICAgIHggKj0gQmk7CisKKyAgcnAgPSBNUFpfUkVBTExPQyAociwgcm4pOworCisgIGYgPSAobXBfbGltYl90KSB4OworICB4IC09IGY7CisgIGFzc2VydCAoeCA8IDEuMCk7CisgIGkgPSBybi0xOworICBycFtpXSA9IGY7CisgIHdoaWxlICgtLWkgPj0gMCkKKyAgICB7CisgICAgICB4ID0gQiAqIHg7CisgICAgICBmID0gKG1wX2xpbWJfdCkgeDsKKyAgICAgIHggLT0gZjsKKyAgICAgIGFzc2VydCAoeCA8IDEuMCk7CisgICAgICBycFtpXSA9IGY7CisgICAgfQorCisgIHItPl9tcF9zaXplID0gc2lnbiA/IC0gcm4gOiBybjsKK30KKwordm9pZAorbXB6X2luaXRfc2V0X2QgKG1wel90IHIsIGRvdWJsZSB4KQoreworICBtcHpfaW5pdCAocik7CisgIG1wel9zZXRfZCAociwgeCk7Cit9CisKK2RvdWJsZQorbXB6X2dldF9kIChjb25zdCBtcHpfdCB1KQoreworICBpbnQgbTsKKyAgbXBfbGltYl90IGw7CisgIG1wX3NpemVfdCB1bjsKKyAgZG91YmxlIHg7CisgIGRvdWJsZSBCID0gNC4wICogKGRvdWJsZSkgKEdNUF9MSU1CX0hJR0hCSVQgPj4gMSk7CisKKyAgdW4gPSBHTVBfQUJTICh1LT5fbXBfc2l6ZSk7CisKKyAgaWYgKHVuID09IDApCisgICAgcmV0dXJuIDAuMDsKKworICBsID0gdS0+X21wX2RbLS11bl07CisgIGdtcF9jbHogKG0sIGwpOworICBtID0gbSArIEdNUF9EQkxfTUFOVF9CSVRTIC0gR01QX0xJTUJfQklUUzsKKyAgaWYgKG0gPCAwKQorICAgIGwgJj0gR01QX0xJTUJfTUFYIDw8IC1tOworCisgIGZvciAoeCA9IGw7IC0tdW4gPj0gMDspCisgICAgeworICAgICAgeCA9IEIqeDsKKyAgICAgIGlmIChtID4gMCkgeworCWwgPSB1LT5fbXBfZFt1bl07CisJbSAtPSBHTVBfTElNQl9CSVRTOworCWlmIChtIDwgMCkKKwkgIGwgJj0gR01QX0xJTUJfTUFYIDw8IC1tOworCXggKz0gbDsKKyAgICAgIH0KKyAgICB9CisKKyAgaWYgKHUtPl9tcF9zaXplIDwgMCkKKyAgICB4ID0gLXg7CisKKyAgcmV0dXJuIHg7Cit9CisKK2ludAorbXB6X2NtcGFic19kIChjb25zdCBtcHpfdCB4LCBkb3VibGUgZCkKK3sKKyAgbXBfc2l6ZV90IHhuOworICBkb3VibGUgQiwgQmk7CisgIG1wX3NpemVfdCBpOworCisgIHhuID0geC0+X21wX3NpemU7CisgIGQgPSBHTVBfQUJTIChkKTsKKworICBpZiAoeG4gIT0gMCkKKyAgICB7CisgICAgICB4biA9IEdNUF9BQlMgKHhuKTsKKworICAgICAgQiA9IDQuMCAqIChkb3VibGUpIChHTVBfTElNQl9ISUdIQklUID4+IDEpOworICAgICAgQmkgPSAxLjAgLyBCOworCisgICAgICAvKiBTY2FsZSBkIHNvIGl0IGNhbiBiZSBjb21wYXJlZCB3aXRoIHRoZSB0b3AgbGltYi4gKi8KKyAgICAgIGZvciAoaSA9IDE7IGkgPCB4bjsgaSsrKQorCWQgKj0gQmk7CisKKyAgICAgIGlmIChkID49IEIpCisJcmV0dXJuIC0xOworCisgICAgICAvKiBDb21wYXJlIGZsb29yKGQpIHRvIHRvcCBsaW1iLCBzdWJ0cmFjdCBhbmQgY2FuY2VsIHdoZW4gZXF1YWwuICovCisgICAgICBmb3IgKGkgPSB4bjsgaS0tID4gMDspCisJeworCSAgbXBfbGltYl90IGYsIHhsOworCisJICBmID0gKG1wX2xpbWJfdCkgZDsKKwkgIHhsID0geC0+X21wX2RbaV07CisJICBpZiAoeGwgPiBmKQorCSAgICByZXR1cm4gMTsKKwkgIGVsc2UgaWYgKHhsIDwgZikKKwkgICAgcmV0dXJuIC0xOworCSAgZCA9IEIgKiAoZCAtIGYpOworCX0KKyAgICB9CisgIHJldHVybiAtIChkID4gMC4wKTsKK30KKworaW50CittcHpfY21wX2QgKGNvbnN0IG1wel90IHgsIGRvdWJsZSBkKQoreworICBpZiAoeC0+X21wX3NpemUgPCAwKQorICAgIHsKKyAgICAgIGlmIChkID49IDAuMCkKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlCisJcmV0dXJuIC1tcHpfY21wYWJzX2QgKHgsIGQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChkIDwgMC4wKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiBtcHpfY21wYWJzX2QgKHgsIGQpOworICAgIH0KK30KKworDAorLyogTVBaIGNvbXBhcmlzb25zIGFuZCB0aGUgbGlrZS4gKi8KK2ludAorbXB6X3NnbiAoY29uc3QgbXB6X3QgdSkKK3sKKyAgcmV0dXJuIEdNUF9DTVAgKHUtPl9tcF9zaXplLCAwKTsKK30KKworaW50CittcHpfY21wX3NpIChjb25zdCBtcHpfdCB1LCBsb25nIHYpCit7CisgIG1wX3NpemVfdCB1c2l6ZSA9IHUtPl9tcF9zaXplOworCisgIGlmICh2ID49IDApCisgICAgcmV0dXJuIG1wel9jbXBfdWkgKHUsIHYpOworICBlbHNlIGlmICh1c2l6ZSA+PSAwKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIC0gbXB6X2NtcGFic191aSAodSwgR01QX05FR19DQVNUICh1bnNpZ25lZCBsb25nIGludCwgdikpOworfQorCitpbnQKK21wel9jbXBfdWkgKGNvbnN0IG1wel90IHUsIHVuc2lnbmVkIGxvbmcgdikKK3sKKyAgbXBfc2l6ZV90IHVzaXplID0gdS0+X21wX3NpemU7CisKKyAgaWYgKHVzaXplIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gbXB6X2NtcGFic191aSAodSwgdik7Cit9CisKK2ludAorbXB6X2NtcCAoY29uc3QgbXB6X3QgYSwgY29uc3QgbXB6X3QgYikKK3sKKyAgbXBfc2l6ZV90IGFzaXplID0gYS0+X21wX3NpemU7CisgIG1wX3NpemVfdCBic2l6ZSA9IGItPl9tcF9zaXplOworCisgIGlmIChhc2l6ZSAhPSBic2l6ZSkKKyAgICByZXR1cm4gKGFzaXplIDwgYnNpemUpID8gLTEgOiAxOworICBlbHNlIGlmIChhc2l6ZSA+PSAwKQorICAgIHJldHVybiBtcG5fY21wIChhLT5fbXBfZCwgYi0+X21wX2QsIGFzaXplKTsKKyAgZWxzZQorICAgIHJldHVybiBtcG5fY21wIChiLT5fbXBfZCwgYS0+X21wX2QsIC1hc2l6ZSk7Cit9CisKK2ludAorbXB6X2NtcGFic191aSAoY29uc3QgbXB6X3QgdSwgdW5zaWduZWQgbG9uZyB2KQoreworICBtcF9zaXplX3QgdW4gPSBHTVBfQUJTICh1LT5fbXBfc2l6ZSk7CisKKyAgaWYgKCEgbXBuX2Fic2ZpdHNfdWxvbmdfcCAodS0+X21wX2QsIHVuKSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdXUgPSBtcHpfZ2V0X3VpICh1KTsKKyAgICAgIHJldHVybiBHTVBfQ01QKHV1LCB2KTsKKyAgICB9Cit9CisKK2ludAorbXB6X2NtcGFicyAoY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgcmV0dXJuIG1wbl9jbXA0ICh1LT5fbXBfZCwgR01QX0FCUyAodS0+X21wX3NpemUpLAorCQkgICB2LT5fbXBfZCwgR01QX0FCUyAodi0+X21wX3NpemUpKTsKK30KKwordm9pZAorbXB6X2FicyAobXB6X3QgciwgY29uc3QgbXB6X3QgdSkKK3sKKyAgbXB6X3NldCAociwgdSk7CisgIHItPl9tcF9zaXplID0gR01QX0FCUyAoci0+X21wX3NpemUpOworfQorCit2b2lkCittcHpfbmVnIChtcHpfdCByLCBjb25zdCBtcHpfdCB1KQoreworICBtcHpfc2V0IChyLCB1KTsKKyAgci0+X21wX3NpemUgPSAtci0+X21wX3NpemU7Cit9CisKK3ZvaWQKK21wel9zd2FwIChtcHpfdCB1LCBtcHpfdCB2KQoreworICBNUF9TSVpFX1RfU1dBUCAodS0+X21wX2FsbG9jLCB2LT5fbXBfYWxsb2MpOworICBNUE5fUFRSX1NXQVAgKHUtPl9tcF9kLCB1LT5fbXBfc2l6ZSwgdi0+X21wX2QsIHYtPl9tcF9zaXplKTsKK30KKworDAorLyogTVBaIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAqLworCisKK3ZvaWQKK21wel9hZGRfdWkgKG1wel90IHIsIGNvbnN0IG1wel90IGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKyAgbXB6X3QgYmI7CisgIG1wel9pbml0X3NldF91aSAoYmIsIGIpOworICBtcHpfYWRkIChyLCBhLCBiYik7CisgIG1wel9jbGVhciAoYmIpOworfQorCit2b2lkCittcHpfc3ViX3VpIChtcHpfdCByLCBjb25zdCBtcHpfdCBhLCB1bnNpZ25lZCBsb25nIGIpCit7CisgIG1wel91aV9zdWIgKHIsIGIsIGEpOworICBtcHpfbmVnIChyLCByKTsKK30KKwordm9pZAorbXB6X3VpX3N1YiAobXB6X3QgciwgdW5zaWduZWQgbG9uZyBhLCBjb25zdCBtcHpfdCBiKQoreworICBtcHpfbmVnIChyLCBiKTsKKyAgbXB6X2FkZF91aSAociwgciwgYSk7Cit9CisKK3N0YXRpYyBtcF9zaXplX3QKK21wel9hYnNfYWRkIChtcHpfdCByLCBjb25zdCBtcHpfdCBhLCBjb25zdCBtcHpfdCBiKQoreworICBtcF9zaXplX3QgYW4gPSBHTVBfQUJTIChhLT5fbXBfc2l6ZSk7CisgIG1wX3NpemVfdCBibiA9IEdNUF9BQlMgKGItPl9tcF9zaXplKTsKKyAgbXBfcHRyIHJwOworICBtcF9saW1iX3QgY3k7CisKKyAgaWYgKGFuIDwgYm4pCisgICAgeworICAgICAgTVBaX1NSQ1BUUl9TV0FQIChhLCBiKTsKKyAgICAgIE1QX1NJWkVfVF9TV0FQIChhbiwgYm4pOworICAgIH0KKworICBycCA9IE1QWl9SRUFMTE9DIChyLCBhbiArIDEpOworICBjeSA9IG1wbl9hZGQgKHJwLCBhLT5fbXBfZCwgYW4sIGItPl9tcF9kLCBibik7CisKKyAgcnBbYW5dID0gY3k7CisKKyAgcmV0dXJuIGFuICsgY3k7Cit9CisKK3N0YXRpYyBtcF9zaXplX3QKK21wel9hYnNfc3ViIChtcHpfdCByLCBjb25zdCBtcHpfdCBhLCBjb25zdCBtcHpfdCBiKQoreworICBtcF9zaXplX3QgYW4gPSBHTVBfQUJTIChhLT5fbXBfc2l6ZSk7CisgIG1wX3NpemVfdCBibiA9IEdNUF9BQlMgKGItPl9tcF9zaXplKTsKKyAgaW50IGNtcDsKKyAgbXBfcHRyIHJwOworCisgIGNtcCA9IG1wbl9jbXA0IChhLT5fbXBfZCwgYW4sIGItPl9tcF9kLCBibik7CisgIGlmIChjbXAgPiAwKQorICAgIHsKKyAgICAgIHJwID0gTVBaX1JFQUxMT0MgKHIsIGFuKTsKKyAgICAgIGdtcF9hc3NlcnRfbm9jYXJyeSAobXBuX3N1YiAocnAsIGEtPl9tcF9kLCBhbiwgYi0+X21wX2QsIGJuKSk7CisgICAgICByZXR1cm4gbXBuX25vcm1hbGl6ZWRfc2l6ZSAocnAsIGFuKTsKKyAgICB9CisgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgeworICAgICAgcnAgPSBNUFpfUkVBTExPQyAociwgYm4pOworICAgICAgZ21wX2Fzc2VydF9ub2NhcnJ5IChtcG5fc3ViIChycCwgYi0+X21wX2QsIGJuLCBhLT5fbXBfZCwgYW4pKTsKKyAgICAgIHJldHVybiAtbXBuX25vcm1hbGl6ZWRfc2l6ZSAocnAsIGJuKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorbXB6X2FkZCAobXB6X3QgciwgY29uc3QgbXB6X3QgYSwgY29uc3QgbXB6X3QgYikKK3sKKyAgbXBfc2l6ZV90IHJuOworCisgIGlmICggKGEtPl9tcF9zaXplIF4gYi0+X21wX3NpemUpID49IDApCisgICAgcm4gPSBtcHpfYWJzX2FkZCAociwgYSwgYik7CisgIGVsc2UKKyAgICBybiA9IG1wel9hYnNfc3ViIChyLCBhLCBiKTsKKworICByLT5fbXBfc2l6ZSA9IGEtPl9tcF9zaXplID49IDAgPyBybiA6IC0gcm47Cit9CisKK3ZvaWQKK21wel9zdWIgKG1wel90IHIsIGNvbnN0IG1wel90IGEsIGNvbnN0IG1wel90IGIpCit7CisgIG1wX3NpemVfdCBybjsKKworICBpZiAoIChhLT5fbXBfc2l6ZSBeIGItPl9tcF9zaXplKSA+PSAwKQorICAgIHJuID0gbXB6X2Fic19zdWIgKHIsIGEsIGIpOworICBlbHNlCisgICAgcm4gPSBtcHpfYWJzX2FkZCAociwgYSwgYik7CisKKyAgci0+X21wX3NpemUgPSBhLT5fbXBfc2l6ZSA+PSAwID8gcm4gOiAtIHJuOworfQorCisMCisvKiBNUFogbXVsdGlwbGljYXRpb24gKi8KK3ZvaWQKK21wel9tdWxfc2kgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIGxvbmcgaW50IHYpCit7CisgIGlmICh2IDwgMCkKKyAgICB7CisgICAgICBtcHpfbXVsX3VpIChyLCB1LCBHTVBfTkVHX0NBU1QgKHVuc2lnbmVkIGxvbmcgaW50LCB2KSk7CisgICAgICBtcHpfbmVnIChyLCByKTsKKyAgICB9CisgIGVsc2UKKyAgICBtcHpfbXVsX3VpIChyLCB1LCB2KTsKK30KKwordm9pZAorbXB6X211bF91aSAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgdW5zaWduZWQgbG9uZyBpbnQgdikKK3sKKyAgbXB6X3QgdnY7CisgIG1wel9pbml0X3NldF91aSAodnYsIHYpOworICBtcHpfbXVsIChyLCB1LCB2dik7CisgIG1wel9jbGVhciAodnYpOworICByZXR1cm47Cit9CisKK3ZvaWQKK21wel9tdWwgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIGNvbnN0IG1wel90IHYpCit7CisgIGludCBzaWduOworICBtcF9zaXplX3QgdW4sIHZuLCBybjsKKyAgbXB6X3QgdDsKKyAgbXBfcHRyIHRwOworCisgIHVuID0gdS0+X21wX3NpemU7CisgIHZuID0gdi0+X21wX3NpemU7CisKKyAgaWYgKHVuID09IDAgfHwgdm4gPT0gMCkKKyAgICB7CisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpZ24gPSAodW4gXiB2bikgPCAwOworCisgIHVuID0gR01QX0FCUyAodW4pOworICB2biA9IEdNUF9BQlMgKHZuKTsKKworICBtcHpfaW5pdDIgKHQsICh1biArIHZuKSAqIEdNUF9MSU1CX0JJVFMpOworCisgIHRwID0gdC0+X21wX2Q7CisgIGlmICh1biA+PSB2bikKKyAgICBtcG5fbXVsICh0cCwgdS0+X21wX2QsIHVuLCB2LT5fbXBfZCwgdm4pOworICBlbHNlCisgICAgbXBuX211bCAodHAsIHYtPl9tcF9kLCB2biwgdS0+X21wX2QsIHVuKTsKKworICBybiA9IHVuICsgdm47CisgIHJuIC09IHRwW3JuLTFdID09IDA7CisKKyAgdC0+X21wX3NpemUgPSBzaWduID8gLSBybiA6IHJuOworICBtcHpfc3dhcCAociwgdCk7CisgIG1wel9jbGVhciAodCk7Cit9CisKK3ZvaWQKK21wel9tdWxfMmV4cCAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgbXBfYml0Y250X3QgYml0cykKK3sKKyAgbXBfc2l6ZV90IHVuLCBybjsKKyAgbXBfc2l6ZV90IGxpbWJzOworICB1bnNpZ25lZCBzaGlmdDsKKyAgbXBfcHRyIHJwOworCisgIHVuID0gR01QX0FCUyAodS0+X21wX3NpemUpOworICBpZiAodW4gPT0gMCkKKyAgICB7CisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxpbWJzID0gYml0cyAvIEdNUF9MSU1CX0JJVFM7CisgIHNoaWZ0ID0gYml0cyAlIEdNUF9MSU1CX0JJVFM7CisKKyAgcm4gPSB1biArIGxpbWJzICsgKHNoaWZ0ID4gMCk7CisgIHJwID0gTVBaX1JFQUxMT0MgKHIsIHJuKTsKKyAgaWYgKHNoaWZ0ID4gMCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kgPSBtcG5fbHNoaWZ0IChycCArIGxpbWJzLCB1LT5fbXBfZCwgdW4sIHNoaWZ0KTsKKyAgICAgIHJwW3JuLTFdID0gY3k7CisgICAgICBybiAtPSAoY3kgPT0gMCk7CisgICAgfQorICBlbHNlCisgICAgbXBuX2NvcHlkIChycCArIGxpbWJzLCB1LT5fbXBfZCwgdW4pOworCisgIG1wbl96ZXJvIChycCwgbGltYnMpOworCisgIHItPl9tcF9zaXplID0gKHUtPl9tcF9zaXplIDwgMCkgPyAtIHJuIDogcm47Cit9CisKK3ZvaWQKK21wel9hZGRtdWxfdWkgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIHVuc2lnbmVkIGxvbmcgaW50IHYpCit7CisgIG1wel90IHQ7CisgIG1wel9pbml0X3NldF91aSAodCwgdik7CisgIG1wel9tdWwgKHQsIHUsIHQpOworICBtcHpfYWRkIChyLCByLCB0KTsKKyAgbXB6X2NsZWFyICh0KTsKK30KKwordm9pZAorbXB6X3N1Ym11bF91aSAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgdW5zaWduZWQgbG9uZyBpbnQgdikKK3sKKyAgbXB6X3QgdDsKKyAgbXB6X2luaXRfc2V0X3VpICh0LCB2KTsKKyAgbXB6X211bCAodCwgdSwgdCk7CisgIG1wel9zdWIgKHIsIHIsIHQpOworICBtcHpfY2xlYXIgKHQpOworfQorCit2b2lkCittcHpfYWRkbXVsIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCBjb25zdCBtcHpfdCB2KQoreworICBtcHpfdCB0OworICBtcHpfaW5pdCAodCk7CisgIG1wel9tdWwgKHQsIHUsIHYpOworICBtcHpfYWRkIChyLCByLCB0KTsKKyAgbXB6X2NsZWFyICh0KTsKK30KKwordm9pZAorbXB6X3N1Ym11bCAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgbXB6X3QgdDsKKyAgbXB6X2luaXQgKHQpOworICBtcHpfbXVsICh0LCB1LCB2KTsKKyAgbXB6X3N1YiAociwgciwgdCk7CisgIG1wel9jbGVhciAodCk7Cit9CisKKwwKKy8qIE1QWiBkaXZpc2lvbiAqLworZW51bSBtcHpfZGl2X3JvdW5kX21vZGUgeyBHTVBfRElWX0ZMT09SLCBHTVBfRElWX0NFSUwsIEdNUF9ESVZfVFJVTkMgfTsKKworLyogQWxsb3dzIHEgb3IgciB0byBiZSB6ZXJvLiBSZXR1cm5zIDEgaWZmIHJlbWFpbmRlciBpcyBub24temVyby4gKi8KK3N0YXRpYyBpbnQKK21wel9kaXZfcXIgKG1wel90IHEsIG1wel90IHIsCisJICAgIGNvbnN0IG1wel90IG4sIGNvbnN0IG1wel90IGQsIGVudW0gbXB6X2Rpdl9yb3VuZF9tb2RlIG1vZGUpCit7CisgIG1wX3NpemVfdCBucywgZHMsIG5uLCBkbiwgcXM7CisgIG5zID0gbi0+X21wX3NpemU7CisgIGRzID0gZC0+X21wX3NpemU7CisKKyAgaWYgKGRzID09IDApCisgICAgZ21wX2RpZSgibXB6X2Rpdl9xcjogRGl2aWRlIGJ5IHplcm8uIik7CisKKyAgaWYgKG5zID09IDApCisgICAgeworICAgICAgaWYgKHEpCisJcS0+X21wX3NpemUgPSAwOworICAgICAgaWYgKHIpCisJci0+X21wX3NpemUgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gR01QX0FCUyAobnMpOworICBkbiA9IEdNUF9BQlMgKGRzKTsKKworICBxcyA9IGRzIF4gbnM7CisKKyAgaWYgKG5uIDwgZG4pCisgICAgeworICAgICAgaWYgKG1vZGUgPT0gR01QX0RJVl9DRUlMICYmIHFzID49IDApCisJeworCSAgLyogcSA9IDEsIHIgPSBuIC0gZCAqLworCSAgaWYgKHIpCisJICAgIG1wel9zdWIgKHIsIG4sIGQpOworCSAgaWYgKHEpCisJICAgIG1wel9zZXRfdWkgKHEsIDEpOworCX0KKyAgICAgIGVsc2UgaWYgKG1vZGUgPT0gR01QX0RJVl9GTE9PUiAmJiBxcyA8IDApCisJeworCSAgLyogcSA9IC0xLCByID0gbiArIGQgKi8KKwkgIGlmIChyKQorCSAgICBtcHpfYWRkIChyLCBuLCBkKTsKKwkgIGlmIChxKQorCSAgICBtcHpfc2V0X3NpIChxLCAtMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHEgPSAwLCByID0gZCAqLworCSAgaWYgKHIpCisJICAgIG1wel9zZXQgKHIsIG4pOworCSAgaWYgKHEpCisJICAgIHEtPl9tcF9zaXplID0gMDsKKwl9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgbnAsIHFwOworICAgICAgbXBfc2l6ZV90IHFuLCBybjsKKyAgICAgIG1wel90IHRxLCB0cjsKKworICAgICAgbXB6X2luaXRfc2V0ICh0ciwgbik7CisgICAgICBucCA9IHRyLT5fbXBfZDsKKworICAgICAgcW4gPSBubiAtIGRuICsgMTsKKworICAgICAgaWYgKHEpCisJeworCSAgbXB6X2luaXQyICh0cSwgcW4gKiBHTVBfTElNQl9CSVRTKTsKKwkgIHFwID0gdHEtPl9tcF9kOworCX0KKyAgICAgIGVsc2UKKwlxcCA9IE5VTEw7CisKKyAgICAgIG1wbl9kaXZfcXIgKHFwLCBucCwgbm4sIGQtPl9tcF9kLCBkbik7CisKKyAgICAgIGlmIChxcCkKKwl7CisJICBxbiAtPSAocXBbcW4tMV0gPT0gMCk7CisKKwkgIHRxLT5fbXBfc2l6ZSA9IHFzIDwgMCA/IC1xbiA6IHFuOworCX0KKyAgICAgIHJuID0gbXBuX25vcm1hbGl6ZWRfc2l6ZSAobnAsIGRuKTsKKyAgICAgIHRyLT5fbXBfc2l6ZSA9IG5zIDwgMCA/IC0gcm4gOiBybjsKKworICAgICAgaWYgKG1vZGUgPT0gR01QX0RJVl9GTE9PUiAmJiBxcyA8IDAgJiYgcm4gIT0gMCkKKwl7CisJICBpZiAocSkKKwkgICAgbXB6X3N1Yl91aSAodHEsIHRxLCAxKTsKKwkgIGlmIChyKQorCSAgICBtcHpfYWRkICh0ciwgdHIsIGQpOworCX0KKyAgICAgIGVsc2UgaWYgKG1vZGUgPT0gR01QX0RJVl9DRUlMICYmIHFzID49IDAgJiYgcm4gIT0gMCkKKwl7CisJICBpZiAocSkKKwkgICAgbXB6X2FkZF91aSAodHEsIHRxLCAxKTsKKwkgIGlmIChyKQorCSAgICBtcHpfc3ViICh0ciwgdHIsIGQpOworCX0KKworICAgICAgaWYgKHEpCisJeworCSAgbXB6X3N3YXAgKHRxLCBxKTsKKwkgIG1wel9jbGVhciAodHEpOworCX0KKyAgICAgIGlmIChyKQorCW1wel9zd2FwICh0ciwgcik7CisKKyAgICAgIG1wel9jbGVhciAodHIpOworCisgICAgICByZXR1cm4gcm4gIT0gMDsKKyAgICB9Cit9CisKK3ZvaWQKK21wel9jZGl2X3FyIChtcHpfdCBxLCBtcHpfdCByLCBjb25zdCBtcHpfdCBuLCBjb25zdCBtcHpfdCBkKQoreworICBtcHpfZGl2X3FyIChxLCByLCBuLCBkLCBHTVBfRElWX0NFSUwpOworfQorCit2b2lkCittcHpfZmRpdl9xciAobXB6X3QgcSwgbXB6X3QgciwgY29uc3QgbXB6X3QgbiwgY29uc3QgbXB6X3QgZCkKK3sKKyAgbXB6X2Rpdl9xciAocSwgciwgbiwgZCwgR01QX0RJVl9GTE9PUik7Cit9CisKK3ZvaWQKK21wel90ZGl2X3FyIChtcHpfdCBxLCBtcHpfdCByLCBjb25zdCBtcHpfdCBuLCBjb25zdCBtcHpfdCBkKQoreworICBtcHpfZGl2X3FyIChxLCByLCBuLCBkLCBHTVBfRElWX1RSVU5DKTsKK30KKwordm9pZAorbXB6X2NkaXZfcSAobXB6X3QgcSwgY29uc3QgbXB6X3QgbiwgY29uc3QgbXB6X3QgZCkKK3sKKyAgbXB6X2Rpdl9xciAocSwgTlVMTCwgbiwgZCwgR01QX0RJVl9DRUlMKTsKK30KKwordm9pZAorbXB6X2ZkaXZfcSAobXB6X3QgcSwgY29uc3QgbXB6X3QgbiwgY29uc3QgbXB6X3QgZCkKK3sKKyAgbXB6X2Rpdl9xciAocSwgTlVMTCwgbiwgZCwgR01QX0RJVl9GTE9PUik7Cit9CisKK3ZvaWQKK21wel90ZGl2X3EgKG1wel90IHEsIGNvbnN0IG1wel90IG4sIGNvbnN0IG1wel90IGQpCit7CisgIG1wel9kaXZfcXIgKHEsIE5VTEwsIG4sIGQsIEdNUF9ESVZfVFJVTkMpOworfQorCit2b2lkCittcHpfY2Rpdl9yIChtcHpfdCByLCBjb25zdCBtcHpfdCBuLCBjb25zdCBtcHpfdCBkKQoreworICBtcHpfZGl2X3FyIChOVUxMLCByLCBuLCBkLCBHTVBfRElWX0NFSUwpOworfQorCit2b2lkCittcHpfZmRpdl9yIChtcHpfdCByLCBjb25zdCBtcHpfdCBuLCBjb25zdCBtcHpfdCBkKQoreworICBtcHpfZGl2X3FyIChOVUxMLCByLCBuLCBkLCBHTVBfRElWX0ZMT09SKTsKK30KKwordm9pZAorbXB6X3RkaXZfciAobXB6X3QgciwgY29uc3QgbXB6X3QgbiwgY29uc3QgbXB6X3QgZCkKK3sKKyAgbXB6X2Rpdl9xciAoTlVMTCwgciwgbiwgZCwgR01QX0RJVl9UUlVOQyk7Cit9CisKK3ZvaWQKK21wel9tb2QgKG1wel90IHIsIGNvbnN0IG1wel90IG4sIGNvbnN0IG1wel90IGQpCit7CisgIG1wel9kaXZfcXIgKE5VTEwsIHIsIG4sIGQsIGQtPl9tcF9zaXplID49IDAgPyBHTVBfRElWX0ZMT09SIDogR01QX0RJVl9DRUlMKTsKK30KKworc3RhdGljIHZvaWQKK21wel9kaXZfcV8yZXhwIChtcHpfdCBxLCBjb25zdCBtcHpfdCB1LCBtcF9iaXRjbnRfdCBiaXRfaW5kZXgsCisJCWVudW0gbXB6X2Rpdl9yb3VuZF9tb2RlIG1vZGUpCit7CisgIG1wX3NpemVfdCB1biwgcW47CisgIG1wX3NpemVfdCBsaW1iX2NudDsKKyAgbXBfcHRyIHFwOworICBpbnQgYWRqdXN0OworCisgIHVuID0gdS0+X21wX3NpemU7CisgIGlmICh1biA9PSAwKQorICAgIHsKKyAgICAgIHEtPl9tcF9zaXplID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGxpbWJfY250ID0gYml0X2luZGV4IC8gR01QX0xJTUJfQklUUzsKKyAgcW4gPSBHTVBfQUJTICh1bikgLSBsaW1iX2NudDsKKyAgYml0X2luZGV4ICU9IEdNUF9MSU1CX0JJVFM7CisKKyAgaWYgKG1vZGUgPT0gKCh1biA+IDApID8gR01QX0RJVl9DRUlMIDogR01QX0RJVl9GTE9PUikpIC8qIHVuICE9IDAgaGVyZS4gKi8KKyAgICAvKiBOb3RlOiBCZWxvdywgdGhlIGZpbmFsIGluZGV4aW5nIGF0IGxpbWJfY250IGlzIHZhbGlkIGJlY2F1c2UgYXQKKyAgICAgICB0aGF0IHBvaW50IHdlIGhhdmUgcW4gPiAwLiAqLworICAgIGFkanVzdCA9IChxbiA8PSAwCisJICAgICAgfHwgIW1wbl96ZXJvX3AgKHUtPl9tcF9kLCBsaW1iX2NudCkKKwkgICAgICB8fCAodS0+X21wX2RbbGltYl9jbnRdCisJCSAgJiAoKChtcF9saW1iX3QpIDEgPDwgYml0X2luZGV4KSAtIDEpKSk7CisgIGVsc2UKKyAgICBhZGp1c3QgPSAwOworCisgIGlmIChxbiA8PSAwKQorICAgIHFuID0gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHFwID0gTVBaX1JFQUxMT0MgKHEsIHFuKTsKKworICAgICAgaWYgKGJpdF9pbmRleCAhPSAwKQorCXsKKwkgIG1wbl9yc2hpZnQgKHFwLCB1LT5fbXBfZCArIGxpbWJfY250LCBxbiwgYml0X2luZGV4KTsKKwkgIHFuIC09IHFwW3FuIC0gMV0gPT0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBuX2NvcHlpIChxcCwgdS0+X21wX2QgKyBsaW1iX2NudCwgcW4pOworCX0KKyAgICB9CisKKyAgcS0+X21wX3NpemUgPSBxbjsKKworICBpZiAoYWRqdXN0KQorICAgIG1wel9hZGRfdWkgKHEsIHEsIDEpOworICBpZiAodW4gPCAwKQorICAgIG1wel9uZWcgKHEsIHEpOworfQorCitzdGF0aWMgdm9pZAorbXB6X2Rpdl9yXzJleHAgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIG1wX2JpdGNudF90IGJpdF9pbmRleCwKKwkJZW51bSBtcHpfZGl2X3JvdW5kX21vZGUgbW9kZSkKK3sKKyAgbXBfc2l6ZV90IHVzLCB1biwgcm47CisgIG1wX3B0ciBycDsKKyAgbXBfbGltYl90IG1hc2s7CisKKyAgdXMgPSB1LT5fbXBfc2l6ZTsKKyAgaWYgKHVzID09IDAgfHwgYml0X2luZGV4ID09IDApCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKyAgcm4gPSAoYml0X2luZGV4ICsgR01QX0xJTUJfQklUUyAtIDEpIC8gR01QX0xJTUJfQklUUzsKKyAgYXNzZXJ0IChybiA+IDApOworCisgIHJwID0gTVBaX1JFQUxMT0MgKHIsIHJuKTsKKyAgdW4gPSBHTVBfQUJTICh1cyk7CisKKyAgbWFzayA9IEdNUF9MSU1CX01BWCA+PiAocm4gKiBHTVBfTElNQl9CSVRTIC0gYml0X2luZGV4KTsKKworICBpZiAocm4gPiB1bikKKyAgICB7CisgICAgICAvKiBRdW90aWVudCAod2l0aCB0cnVuY2F0aW9uKSBpcyB6ZXJvLCBhbmQgcmVtYWluZGVyIGlzCisJIG5vbi16ZXJvICovCisgICAgICBpZiAobW9kZSA9PSAoKHVzID4gMCkgPyBHTVBfRElWX0NFSUwgOiBHTVBfRElWX0ZMT09SKSkgLyogdXMgIT0gMCBoZXJlLiAqLworCXsKKwkgIC8qIEhhdmUgdG8gbmVnYXRlIGFuZCBzaWduIGV4dGVuZC4gKi8KKwkgIG1wX3NpemVfdCBpOworCisJICBnbXBfYXNzZXJ0X25vY2FycnkgKCEgbXBuX25lZyAocnAsIHUtPl9tcF9kLCB1bikpOworCSAgZm9yIChpID0gdW47IGkgPCBybiAtIDE7IGkrKykKKwkgICAgcnBbaV0gPSBHTVBfTElNQl9NQVg7CisKKwkgIHJwW3JuLTFdID0gbWFzazsKKwkgIHVzID0gLXVzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBKdXN0IGNvcHkgKi8KKwkgIGlmIChyICE9IHUpCisJICAgIG1wbl9jb3B5aSAocnAsIHUtPl9tcF9kLCB1bik7CisKKwkgIHJuID0gdW47CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChyICE9IHUpCisJbXBuX2NvcHlpIChycCwgdS0+X21wX2QsIHJuIC0gMSk7CisKKyAgICAgIHJwW3JuLTFdID0gdS0+X21wX2Rbcm4tMV0gJiBtYXNrOworCisgICAgICBpZiAobW9kZSA9PSAoKHVzID4gMCkgPyBHTVBfRElWX0NFSUwgOiBHTVBfRElWX0ZMT09SKSkgLyogdXMgIT0gMCBoZXJlLiAqLworCXsKKwkgIC8qIElmIHIgIT0gMCwgY29tcHV0ZSAyXntiaXRfY291bnR9IC0gci4gKi8KKwkgIG1wbl9uZWcgKHJwLCBycCwgcm4pOworCisJICBycFtybi0xXSAmPSBtYXNrOworCisJICAvKiB1cyBpcyBub3QgdXNlZCBmb3IgYW55dGhpbmcgZWxzZSwgc28gd2UgY2FuIG1vZGlmeSBpdAorCSAgICAgaGVyZSB0byBpbmRpY2F0ZSBmbGlwcGVkIHNpZ24uICovCisJICB1cyA9IC11czsKKwl9CisgICAgfQorICBybiA9IG1wbl9ub3JtYWxpemVkX3NpemUgKHJwLCBybik7CisgIHItPl9tcF9zaXplID0gdXMgPCAwID8gLXJuIDogcm47Cit9CisKK3ZvaWQKK21wel9jZGl2X3FfMmV4cCAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgbXBfYml0Y250X3QgY250KQoreworICBtcHpfZGl2X3FfMmV4cCAociwgdSwgY250LCBHTVBfRElWX0NFSUwpOworfQorCit2b2lkCittcHpfZmRpdl9xXzJleHAgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIG1wX2JpdGNudF90IGNudCkKK3sKKyAgbXB6X2Rpdl9xXzJleHAgKHIsIHUsIGNudCwgR01QX0RJVl9GTE9PUik7Cit9CisKK3ZvaWQKK21wel90ZGl2X3FfMmV4cCAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgbXBfYml0Y250X3QgY250KQoreworICBtcHpfZGl2X3FfMmV4cCAociwgdSwgY250LCBHTVBfRElWX1RSVU5DKTsKK30KKwordm9pZAorbXB6X2NkaXZfcl8yZXhwIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIG1wel9kaXZfcl8yZXhwIChyLCB1LCBjbnQsIEdNUF9ESVZfQ0VJTCk7Cit9CisKK3ZvaWQKK21wel9mZGl2X3JfMmV4cCAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgbXBfYml0Y250X3QgY250KQoreworICBtcHpfZGl2X3JfMmV4cCAociwgdSwgY250LCBHTVBfRElWX0ZMT09SKTsKK30KKwordm9pZAorbXB6X3RkaXZfcl8yZXhwIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIG1wel9kaXZfcl8yZXhwIChyLCB1LCBjbnQsIEdNUF9ESVZfVFJVTkMpOworfQorCit2b2lkCittcHpfZGl2ZXhhY3QgKG1wel90IHEsIGNvbnN0IG1wel90IG4sIGNvbnN0IG1wel90IGQpCit7CisgIGdtcF9hc3NlcnRfbm9jYXJyeSAobXB6X2Rpdl9xciAocSwgTlVMTCwgbiwgZCwgR01QX0RJVl9UUlVOQykpOworfQorCitpbnQKK21wel9kaXZpc2libGVfcCAoY29uc3QgbXB6X3QgbiwgY29uc3QgbXB6X3QgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXIgKE5VTEwsIE5VTEwsIG4sIGQsIEdNUF9ESVZfVFJVTkMpID09IDA7Cit9CisKK2ludAorbXB6X2NvbmdydWVudF9wIChjb25zdCBtcHpfdCBhLCBjb25zdCBtcHpfdCBiLCBjb25zdCBtcHpfdCBtKQoreworICBtcHpfdCB0OworICBpbnQgcmVzOworCisgIC8qIGEgPT0gYiAobW9kIDApIGlmZiBhID09IGIgKi8KKyAgaWYgKG1wel9zZ24gKG0pID09IDApCisgICAgcmV0dXJuIChtcHpfY21wIChhLCBiKSA9PSAwKTsKKworICBtcHpfaW5pdCAodCk7CisgIG1wel9zdWIgKHQsIGEsIGIpOworICByZXMgPSBtcHpfZGl2aXNpYmxlX3AgKHQsIG0pOworICBtcHpfY2xlYXIgKHQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCittcHpfZGl2X3FyX3VpIChtcHpfdCBxLCBtcHpfdCByLAorCSAgICAgICBjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQsIGVudW0gbXB6X2Rpdl9yb3VuZF9tb2RlIG1vZGUpCit7CisgIHVuc2lnbmVkIGxvbmcgcmV0OworICBtcHpfdCByciwgZGQ7CisKKyAgbXB6X2luaXQgKHJyKTsKKyAgbXB6X2luaXRfc2V0X3VpIChkZCwgZCk7CisgIG1wel9kaXZfcXIgKHEsIHJyLCBuLCBkZCwgbW9kZSk7CisgIG1wel9jbGVhciAoZGQpOworICByZXQgPSBtcHpfZ2V0X3VpIChycik7CisKKyAgaWYgKHIpCisgICAgbXB6X3N3YXAgKHIsIHJyKTsKKyAgbXB6X2NsZWFyIChycik7CisKKyAgcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgbG9uZworbXB6X2NkaXZfcXJfdWkgKG1wel90IHEsIG1wel90IHIsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKHEsIHIsIG4sIGQsIEdNUF9ESVZfQ0VJTCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK21wel9mZGl2X3FyX3VpIChtcHpfdCBxLCBtcHpfdCByLCBjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIHJldHVybiBtcHpfZGl2X3FyX3VpIChxLCByLCBuLCBkLCBHTVBfRElWX0ZMT09SKTsKK30KKwordW5zaWduZWQgbG9uZworbXB6X3RkaXZfcXJfdWkgKG1wel90IHEsIG1wel90IHIsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKHEsIHIsIG4sIGQsIEdNUF9ESVZfVFJVTkMpOworfQorCit1bnNpZ25lZCBsb25nCittcHpfY2Rpdl9xX3VpIChtcHpfdCBxLCBjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIHJldHVybiBtcHpfZGl2X3FyX3VpIChxLCBOVUxMLCBuLCBkLCBHTVBfRElWX0NFSUwpOworfQorCit1bnNpZ25lZCBsb25nCittcHpfZmRpdl9xX3VpIChtcHpfdCBxLCBjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIHJldHVybiBtcHpfZGl2X3FyX3VpIChxLCBOVUxMLCBuLCBkLCBHTVBfRElWX0ZMT09SKTsKK30KKwordW5zaWduZWQgbG9uZworbXB6X3RkaXZfcV91aSAobXB6X3QgcSwgY29uc3QgbXB6X3QgbiwgdW5zaWduZWQgbG9uZyBkKQoreworICByZXR1cm4gbXB6X2Rpdl9xcl91aSAocSwgTlVMTCwgbiwgZCwgR01QX0RJVl9UUlVOQyk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK21wel9jZGl2X3JfdWkgKG1wel90IHIsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKE5VTEwsIHIsIG4sIGQsIEdNUF9ESVZfQ0VJTCk7Cit9Cit1bnNpZ25lZCBsb25nCittcHpfZmRpdl9yX3VpIChtcHpfdCByLCBjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIHJldHVybiBtcHpfZGl2X3FyX3VpIChOVUxMLCByLCBuLCBkLCBHTVBfRElWX0ZMT09SKTsKK30KK3Vuc2lnbmVkIGxvbmcKK21wel90ZGl2X3JfdWkgKG1wel90IHIsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKE5VTEwsIHIsIG4sIGQsIEdNUF9ESVZfVFJVTkMpOworfQorCit1bnNpZ25lZCBsb25nCittcHpfY2Rpdl91aSAoY29uc3QgbXB6X3QgbiwgdW5zaWduZWQgbG9uZyBkKQoreworICByZXR1cm4gbXB6X2Rpdl9xcl91aSAoTlVMTCwgTlVMTCwgbiwgZCwgR01QX0RJVl9DRUlMKTsKK30KKwordW5zaWduZWQgbG9uZworbXB6X2ZkaXZfdWkgKGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKE5VTEwsIE5VTEwsIG4sIGQsIEdNUF9ESVZfRkxPT1IpOworfQorCit1bnNpZ25lZCBsb25nCittcHpfdGRpdl91aSAoY29uc3QgbXB6X3QgbiwgdW5zaWduZWQgbG9uZyBkKQoreworICByZXR1cm4gbXB6X2Rpdl9xcl91aSAoTlVMTCwgTlVMTCwgbiwgZCwgR01QX0RJVl9UUlVOQyk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK21wel9tb2RfdWkgKG1wel90IHIsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgcmV0dXJuIG1wel9kaXZfcXJfdWkgKE5VTEwsIHIsIG4sIGQsIEdNUF9ESVZfRkxPT1IpOworfQorCit2b2lkCittcHpfZGl2ZXhhY3RfdWkgKG1wel90IHEsIGNvbnN0IG1wel90IG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgZ21wX2Fzc2VydF9ub2NhcnJ5IChtcHpfZGl2X3FyX3VpIChxLCBOVUxMLCBuLCBkLCBHTVBfRElWX1RSVU5DKSk7Cit9CisKK2ludAorbXB6X2RpdmlzaWJsZV91aV9wIChjb25zdCBtcHpfdCBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIHJldHVybiBtcHpfZGl2X3FyX3VpIChOVUxMLCBOVUxMLCBuLCBkLCBHTVBfRElWX1RSVU5DKSA9PSAwOworfQorCisMCisvKiBHQ0QgKi8KK3N0YXRpYyBtcF9saW1iX3QKK21wbl9nY2RfMTEgKG1wX2xpbWJfdCB1LCBtcF9saW1iX3QgdikKK3sKKyAgdW5zaWduZWQgc2hpZnQ7CisKKyAgYXNzZXJ0ICggKHUgfCB2KSA+IDApOworCisgIGlmICh1ID09IDApCisgICAgcmV0dXJuIHY7CisgIGVsc2UgaWYgKHYgPT0gMCkKKyAgICByZXR1cm4gdTsKKworICBnbXBfY3R6IChzaGlmdCwgdSB8IHYpOworCisgIHUgPj49IHNoaWZ0OworICB2ID4+PSBzaGlmdDsKKworICBpZiAoICh1ICYgMSkgPT0gMCkKKyAgICBNUF9MSU1CX1RfU1dBUCAodSwgdik7CisKKyAgd2hpbGUgKCAodiAmIDEpID09IDApCisgICAgdiA+Pj0gMTsKKworICB3aGlsZSAodSAhPSB2KQorICAgIHsKKyAgICAgIGlmICh1ID4gdikKKwl7CisJICB1IC09IHY7CisJICBkbworCSAgICB1ID4+PSAxOworCSAgd2hpbGUgKCAodSAmIDEpID09IDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB2IC09IHU7CisJICBkbworCSAgICB2ID4+PSAxOworCSAgd2hpbGUgKCAodiAmIDEpID09IDApOworCX0KKyAgICB9CisgIHJldHVybiB1IDw8IHNoaWZ0OworfQorCit1bnNpZ25lZCBsb25nCittcHpfZ2NkX3VpIChtcHpfdCBnLCBjb25zdCBtcHpfdCB1LCB1bnNpZ25lZCBsb25nIHYpCit7CisgIG1wel90IHQ7CisgIG1wel9pbml0X3NldF91aSh0LCB2KTsKKyAgbXB6X2djZCAodCwgdSwgdCk7CisgIGlmICh2ID4gMCkKKyAgICB2ID0gbXB6X2dldF91aSAodCk7CisKKyAgaWYgKGcpCisgICAgbXB6X3N3YXAgKHQsIGcpOworCisgIG1wel9jbGVhciAodCk7CisKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBtcF9iaXRjbnRfdAorbXB6X21ha2Vfb2RkIChtcHpfdCByKQoreworICBtcF9iaXRjbnRfdCBzaGlmdDsKKworICBhc3NlcnQgKHItPl9tcF9zaXplID4gMCk7CisgIC8qIENvdW50IHRyYWlsaW5nIHplcm9zLCBlcXVpdmFsZW50IHRvIG1wbl9zY2FuMSwgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgYSAxICovCisgIHNoaWZ0ID0gbXBuX3NjYW4xIChyLT5fbXBfZCwgMCk7CisgIG1wel90ZGl2X3FfMmV4cCAociwgciwgc2hpZnQpOworCisgIHJldHVybiBzaGlmdDsKK30KKwordm9pZAorbXB6X2djZCAobXB6X3QgZywgY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgbXB6X3QgdHUsIHR2OworICBtcF9iaXRjbnRfdCB1eiwgdnosIGd6OworCisgIGlmICh1LT5fbXBfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIG1wel9hYnMgKGcsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHYtPl9tcF9zaXplID09IDApCisgICAgeworICAgICAgbXB6X2FicyAoZywgdSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1wel9pbml0ICh0dSk7CisgIG1wel9pbml0ICh0dik7CisKKyAgbXB6X2FicyAodHUsIHUpOworICB1eiA9IG1wel9tYWtlX29kZCAodHUpOworICBtcHpfYWJzICh0diwgdik7CisgIHZ6ID0gbXB6X21ha2Vfb2RkICh0dik7CisgIGd6ID0gR01QX01JTiAodXosIHZ6KTsKKworICBpZiAodHUtPl9tcF9zaXplIDwgdHYtPl9tcF9zaXplKQorICAgIG1wel9zd2FwICh0dSwgdHYpOworCisgIG1wel90ZGl2X3IgKHR1LCB0dSwgdHYpOworICBpZiAodHUtPl9tcF9zaXplID09IDApCisgICAgeworICAgICAgbXB6X3N3YXAgKGcsIHR2KTsKKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKDs7KQorICAgICAgeworCWludCBjOworCisJbXB6X21ha2Vfb2RkICh0dSk7CisJYyA9IG1wel9jbXAgKHR1LCB0dik7CisJaWYgKGMgPT0gMCkKKwkgIHsKKwkgICAgbXB6X3N3YXAgKGcsIHR1KTsKKwkgICAgYnJlYWs7CisJICB9CisJaWYgKGMgPCAwKQorCSAgbXB6X3N3YXAgKHR1LCB0dik7CisKKwlpZiAodHYtPl9tcF9zaXplID09IDEpCisJICB7CisJICAgIG1wX2xpbWJfdCAqZ3A7CisKKwkgICAgbXB6X3RkaXZfciAodHUsIHR1LCB0dik7CisJICAgIGdwID0gTVBaX1JFQUxMT0MgKGcsIDEpOyAvKiBncCA9IG1wel9saW1ic19tb2RpZnkgKGcsIDEpOyAqLworCSAgICAqZ3AgPSBtcG5fZ2NkXzExICh0dS0+X21wX2RbMF0sIHR2LT5fbXBfZFswXSk7CisKKwkgICAgZy0+X21wX3NpemUgPSAqZ3AgIT0gMDsgLyogbXB6X2xpbWJzX2ZpbmlzaCAoZywgMSk7ICovCisJICAgIGJyZWFrOworCSAgfQorCW1wel9zdWIgKHR1LCB0dSwgdHYpOworICAgICAgfQorICBtcHpfY2xlYXIgKHR1KTsKKyAgbXB6X2NsZWFyICh0dik7CisgIG1wel9tdWxfMmV4cCAoZywgZywgZ3opOworfQorCit2b2lkCittcHpfZ2NkZXh0IChtcHpfdCBnLCBtcHpfdCBzLCBtcHpfdCB0LCBjb25zdCBtcHpfdCB1LCBjb25zdCBtcHpfdCB2KQoreworICBtcHpfdCB0dSwgdHYsIHMwLCBzMSwgdDAsIHQxOworICBtcF9iaXRjbnRfdCB1eiwgdnosIGd6OworICBtcF9iaXRjbnRfdCBwb3dlcjsKKworICBpZiAodS0+X21wX3NpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBnID0gMCB1ICsgc2duKHYpIHYgKi8KKyAgICAgIHNpZ25lZCBsb25nIHNpZ24gPSBtcHpfc2duICh2KTsKKyAgICAgIG1wel9hYnMgKGcsIHYpOworICAgICAgaWYgKHMpCisJcy0+X21wX3NpemUgPSAwOworICAgICAgaWYgKHQpCisJbXB6X3NldF9zaSAodCwgc2lnbik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh2LT5fbXBfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGcgPSBzZ24odSkgdSArIDAgdiAqLworICAgICAgc2lnbmVkIGxvbmcgc2lnbiA9IG1wel9zZ24gKHUpOworICAgICAgbXB6X2FicyAoZywgdSk7CisgICAgICBpZiAocykKKwltcHpfc2V0X3NpIChzLCBzaWduKTsKKyAgICAgIGlmICh0KQorCXQtPl9tcF9zaXplID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbXB6X2luaXQgKHR1KTsKKyAgbXB6X2luaXQgKHR2KTsKKyAgbXB6X2luaXQgKHMwKTsKKyAgbXB6X2luaXQgKHMxKTsKKyAgbXB6X2luaXQgKHQwKTsKKyAgbXB6X2luaXQgKHQxKTsKKworICBtcHpfYWJzICh0dSwgdSk7CisgIHV6ID0gbXB6X21ha2Vfb2RkICh0dSk7CisgIG1wel9hYnMgKHR2LCB2KTsKKyAgdnogPSBtcHpfbWFrZV9vZGQgKHR2KTsKKyAgZ3ogPSBHTVBfTUlOICh1eiwgdnopOworCisgIHV6IC09IGd6OworICB2eiAtPSBnejsKKworICAvKiBDb2ZhY3RvcnMgY29ycmVzcG9uZGluZyB0byBvZGQgZ2NkLiBneiBoYW5kbGVkIGxhdGVyLiAqLworICBpZiAodHUtPl9tcF9zaXplIDwgdHYtPl9tcF9zaXplKQorICAgIHsKKyAgICAgIG1wel9zd2FwICh0dSwgdHYpOworICAgICAgTVBaX1NSQ1BUUl9TV0FQICh1LCB2KTsKKyAgICAgIE1QWl9QVFJfU1dBUCAocywgdCk7CisgICAgICBNUF9CSVRDTlRfVF9TV0FQICh1eiwgdnopOworICAgIH0KKworICAvKiBNYWludGFpbgorICAgKgorICAgKiB1ID0gdDAgdHUgKyB0MSB0dgorICAgKiB2ID0gczAgdHUgKyBzMSB0dgorICAgKgorICAgKiB3aGVyZSB1IGFuZCB2IGRlbm90ZSB0aGUgaW5wdXRzIHdpdGggY29tbW9uIGZhY3RvcnMgb2YgdHdvCisgICAqIGVsaW1pbmF0ZWQsIGFuZCBkZXQgKHMwLCB0MDsgczEsIHQxKSA9IDJecC4gVGhlbgorICAgKgorICAgKiAyXnAgdHUgPSAgczEgdSAtIHQxIHYKKyAgICogMl5wIHR2ID0gLXMwIHUgKyB0MCB2CisgICAqLworCisgIC8qIEFmdGVyIGluaXRpYWwgZGl2aXNpb24sIHR1ID0gcSB0diArIHR1Jywgd2UgaGF2ZQorICAgKgorICAgKiB1ID0gMl51eiAodHUnICsgcSB0dikKKyAgICogdiA9IDJednogdHYKKyAgICoKKyAgICogb3IKKyAgICoKKyAgICogdDAgPSAyXnV6LCB0MSA9IDJedXogcQorICAgKiBzMCA9IDAsICAgIHMxID0gMl52egorICAgKi8KKworICBtcHpfdGRpdl9xciAodDEsIHR1LCB0dSwgdHYpOworICBtcHpfbXVsXzJleHAgKHQxLCB0MSwgdXopOworCisgIG1wel9zZXRiaXQgKHMxLCB2eik7CisgIHBvd2VyID0gdXogKyB2ejsKKworICBpZiAodHUtPl9tcF9zaXplID4gMCkKKyAgICB7CisgICAgICBtcF9iaXRjbnRfdCBzaGlmdDsKKyAgICAgIHNoaWZ0ID0gbXB6X21ha2Vfb2RkICh0dSk7CisgICAgICBtcHpfc2V0Yml0ICh0MCwgdXogKyBzaGlmdCk7CisgICAgICBwb3dlciArPSBzaGlmdDsKKworICAgICAgZm9yICg7OykKKwl7CisJICBpbnQgYzsKKwkgIGMgPSBtcHpfY21wICh0dSwgdHYpOworCSAgaWYgKGMgPT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIGlmIChjIDwgMCkKKwkgICAgeworCSAgICAgIC8qIHR2ID0gdHYnICsgdHUKKwkgICAgICAgKgorCSAgICAgICAqIHUgPSB0MCB0dSArIHQxICh0dicgKyB0dSkgPSAodDAgKyB0MSkgdHUgKyB0MSB0dicKKwkgICAgICAgKiB2ID0gczAgdHUgKyBzMSAodHYnICsgdHUpID0gKHMwICsgczEpIHR1ICsgczEgdHYnICovCisKKwkgICAgICBtcHpfc3ViICh0diwgdHYsIHR1KTsKKwkgICAgICBtcHpfYWRkICh0MCwgdDAsIHQxKTsKKwkgICAgICBtcHpfYWRkIChzMCwgczAsIHMxKTsKKworCSAgICAgIHNoaWZ0ID0gbXB6X21ha2Vfb2RkICh0dik7CisJICAgICAgbXB6X211bF8yZXhwICh0MSwgdDEsIHNoaWZ0KTsKKwkgICAgICBtcHpfbXVsXzJleHAgKHMxLCBzMSwgc2hpZnQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcHpfc3ViICh0dSwgdHUsIHR2KTsKKwkgICAgICBtcHpfYWRkICh0MSwgdDAsIHQxKTsKKwkgICAgICBtcHpfYWRkIChzMSwgczAsIHMxKTsKKworCSAgICAgIHNoaWZ0ID0gbXB6X21ha2Vfb2RkICh0dSk7CisJICAgICAgbXB6X211bF8yZXhwICh0MCwgdDAsIHNoaWZ0KTsKKwkgICAgICBtcHpfbXVsXzJleHAgKHMwLCBzMCwgc2hpZnQpOworCSAgICB9CisJICBwb3dlciArPSBzaGlmdDsKKwl9CisgICAgfQorICBlbHNlCisgICAgbXB6X3NldGJpdCAodDAsIHV6KTsKKworICAvKiBOb3cgdHYgPSBvZGQgcGFydCBvZiBnY2QsIGFuZCAtczAgYW5kIHQwIGFyZSBjb3JyZXNwb25kaW5nCisgICAgIGNvZmFjdG9ycy4gKi8KKworICBtcHpfbXVsXzJleHAgKHR2LCB0diwgZ3opOworICBtcHpfbmVnIChzMCwgczApOworCisgIC8qIDJecCBnID0gczAgdSArIHQwIHYuIEVsaW1pbmF0ZSBvbmUgZmFjdG9yIG9mIHR3byBhdCBhIHRpbWUuIFRvCisgICAgIGFkanVzdCBjb2ZhY3RvcnMsIHdlIG5lZWQgdSAvIGcgYW5kIHYgLyBnICovCisKKyAgbXB6X2RpdmV4YWN0IChzMSwgdiwgdHYpOworICBtcHpfYWJzIChzMSwgczEpOworICBtcHpfZGl2ZXhhY3QgKHQxLCB1LCB0dik7CisgIG1wel9hYnMgKHQxLCB0MSk7CisKKyAgd2hpbGUgKHBvd2VyLS0gPiAwKQorICAgIHsKKyAgICAgIC8qIHMwIHUgKyB0MCB2ID0gKHMwIC0gdi9nKSB1IC0gKHQwICsgdS9nKSB2ICovCisgICAgICBpZiAobXB6X29kZF9wIChzMCkgfHwgbXB6X29kZF9wICh0MCkpCisJeworCSAgbXB6X3N1YiAoczAsIHMwLCBzMSk7CisJICBtcHpfYWRkICh0MCwgdDAsIHQxKTsKKwl9CisgICAgICBhc3NlcnQgKG1wel9ldmVuX3AgKHQwKSAmJiBtcHpfZXZlbl9wIChzMCkpOworICAgICAgbXB6X3RkaXZfcV8yZXhwIChzMCwgczAsIDEpOworICAgICAgbXB6X3RkaXZfcV8yZXhwICh0MCwgdDAsIDEpOworICAgIH0KKworICAvKiBBcnJhbmdlIHNvIHRoYXQgfHN8IDwgfHV8IC8gMmcgKi8KKyAgbXB6X2FkZCAoczEsIHMwLCBzMSk7CisgIGlmIChtcHpfY21wYWJzIChzMCwgczEpID4gMCkKKyAgICB7CisgICAgICBtcHpfc3dhcCAoczAsIHMxKTsKKyAgICAgIG1wel9zdWIgKHQwLCB0MCwgdDEpOworICAgIH0KKyAgaWYgKHUtPl9tcF9zaXplIDwgMCkKKyAgICBtcHpfbmVnIChzMCwgczApOworICBpZiAodi0+X21wX3NpemUgPCAwKQorICAgIG1wel9uZWcgKHQwLCB0MCk7CisKKyAgbXB6X3N3YXAgKGcsIHR2KTsKKyAgaWYgKHMpCisgICAgbXB6X3N3YXAgKHMsIHMwKTsKKyAgaWYgKHQpCisgICAgbXB6X3N3YXAgKHQsIHQwKTsKKworICBtcHpfY2xlYXIgKHR1KTsKKyAgbXB6X2NsZWFyICh0dik7CisgIG1wel9jbGVhciAoczApOworICBtcHpfY2xlYXIgKHMxKTsKKyAgbXB6X2NsZWFyICh0MCk7CisgIG1wel9jbGVhciAodDEpOworfQorCit2b2lkCittcHpfbGNtIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCBjb25zdCBtcHpfdCB2KQoreworICBtcHpfdCBnOworCisgIGlmICh1LT5fbXBfc2l6ZSA9PSAwIHx8IHYtPl9tcF9zaXplID09IDApCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtcHpfaW5pdCAoZyk7CisKKyAgbXB6X2djZCAoZywgdSwgdik7CisgIG1wel9kaXZleGFjdCAoZywgdSwgZyk7CisgIG1wel9tdWwgKHIsIGcsIHYpOworCisgIG1wel9jbGVhciAoZyk7CisgIG1wel9hYnMgKHIsIHIpOworfQorCit2b2lkCittcHpfbGNtX3VpIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCB1bnNpZ25lZCBsb25nIHYpCit7CisgIGlmICh2ID09IDAgfHwgdS0+X21wX3NpemUgPT0gMCkKKyAgICB7CisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHYgLz0gbXB6X2djZF91aSAoTlVMTCwgdSwgdik7CisgIG1wel9tdWxfdWkgKHIsIHUsIHYpOworCisgIG1wel9hYnMgKHIsIHIpOworfQorCitpbnQKK21wel9pbnZlcnQgKG1wel90IHIsIGNvbnN0IG1wel90IHUsIGNvbnN0IG1wel90IG0pCit7CisgIG1wel90IGcsIHRyOworICBpbnQgaW52ZXJ0aWJsZTsKKworICBpZiAodS0+X21wX3NpemUgPT0gMCB8fCBtcHpfY21wYWJzX3VpIChtLCAxKSA8PSAwKQorICAgIHJldHVybiAwOworCisgIG1wel9pbml0IChnKTsKKyAgbXB6X2luaXQgKHRyKTsKKworICBtcHpfZ2NkZXh0IChnLCB0ciwgTlVMTCwgdSwgbSk7CisgIGludmVydGlibGUgPSAobXB6X2NtcF91aSAoZywgMSkgPT0gMCk7CisKKyAgaWYgKGludmVydGlibGUpCisgICAgeworICAgICAgaWYgKHRyLT5fbXBfc2l6ZSA8IDApCisJeworCSAgaWYgKG0tPl9tcF9zaXplID49IDApCisJICAgIG1wel9hZGQgKHRyLCB0ciwgbSk7CisJICBlbHNlCisJICAgIG1wel9zdWIgKHRyLCB0ciwgbSk7CisJfQorICAgICAgbXB6X3N3YXAgKHIsIHRyKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChnKTsKKyAgbXB6X2NsZWFyICh0cik7CisgIHJldHVybiBpbnZlcnRpYmxlOworfQorCisMCisvKiBIaWdoZXIgbGV2ZWwgb3BlcmF0aW9ucyAoc3FydCwgcG93IGFuZCByb290KSAqLworCit2b2lkCittcHpfcG93X3VpIChtcHpfdCByLCBjb25zdCBtcHpfdCBiLCB1bnNpZ25lZCBsb25nIGUpCit7CisgIHVuc2lnbmVkIGxvbmcgYml0OworICBtcHpfdCB0cjsKKyAgbXB6X2luaXRfc2V0X3VpICh0ciwgMSk7CisKKyAgYml0ID0gR01QX1VMT05HX0hJR0hCSVQ7CisgIGRvCisgICAgeworICAgICAgbXB6X211bCAodHIsIHRyLCB0cik7CisgICAgICBpZiAoZSAmIGJpdCkKKwltcHpfbXVsICh0ciwgdHIsIGIpOworICAgICAgYml0ID4+PSAxOworICAgIH0KKyAgd2hpbGUgKGJpdCA+IDApOworCisgIG1wel9zd2FwIChyLCB0cik7CisgIG1wel9jbGVhciAodHIpOworfQorCit2b2lkCittcHpfdWlfcG93X3VpIChtcHpfdCByLCB1bnNpZ25lZCBsb25nIGJsaW1iLCB1bnNpZ25lZCBsb25nIGUpCit7CisgIG1wel90IGI7CisKKyAgbXB6X2luaXRfc2V0X3VpIChiLCBibGltYik7CisgIG1wel9wb3dfdWkgKHIsIGIsIGUpOworICBtcHpfY2xlYXIgKGIpOworfQorCit2b2lkCittcHpfcG93bSAobXB6X3QgciwgY29uc3QgbXB6X3QgYiwgY29uc3QgbXB6X3QgZSwgY29uc3QgbXB6X3QgbSkKK3sKKyAgbXB6X3QgdHI7CisgIG1wel90IGJhc2U7CisgIG1wX3NpemVfdCBlbiwgbW47CisgIG1wX3NyY3B0ciBtcDsKKyAgc3RydWN0IGdtcF9kaXZfaW52ZXJzZSBtaW52OworICB1bnNpZ25lZCBzaGlmdDsKKyAgbXBfcHRyIHRwID0gTlVMTDsKKworICBlbiA9IEdNUF9BQlMgKGUtPl9tcF9zaXplKTsKKyAgbW4gPSBHTVBfQUJTIChtLT5fbXBfc2l6ZSk7CisgIGlmIChtbiA9PSAwKQorICAgIGdtcF9kaWUgKCJtcHpfcG93bTogWmVybyBtb2R1bG8uIik7CisKKyAgaWYgKGVuID09IDApCisgICAgeworICAgICAgbXB6X3NldF91aSAociwgbXB6X2NtcGFic191aSAobSwgMSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtcCA9IG0tPl9tcF9kOworICBtcG5fZGl2X3FyX2ludmVydCAoJm1pbnYsIG1wLCBtbik7CisgIHNoaWZ0ID0gbWludi5zaGlmdDsKKworICBpZiAoc2hpZnQgPiAwKQorICAgIHsKKyAgICAgIC8qIFRvIGF2b2lkIHNoaWZ0cywgd2UgZG8gYWxsIG91ciByZWR1Y3Rpb25zLCBleGNlcHQgdGhlIGZpbmFsCisJIG9uZSwgdXNpbmcgYSAqbm9ybWFsaXplZCogbS4gKi8KKyAgICAgIG1pbnYuc2hpZnQgPSAwOworCisgICAgICB0cCA9IGdtcF9hbGxvY19saW1icyAobW4pOworICAgICAgZ21wX2Fzc2VydF9ub2NhcnJ5IChtcG5fbHNoaWZ0ICh0cCwgbXAsIG1uLCBzaGlmdCkpOworICAgICAgbXAgPSB0cDsKKyAgICB9CisKKyAgbXB6X2luaXQgKGJhc2UpOworCisgIGlmIChlLT5fbXBfc2l6ZSA8IDApCisgICAgeworICAgICAgaWYgKCFtcHpfaW52ZXJ0IChiYXNlLCBiLCBtKSkKKwlnbXBfZGllICgibXB6X3Bvd206IE5lZ2F0aXZlIGV4cG9uZW50IGFuZCBub24taW52ZXJ0aWJsZSBiYXNlLiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBibjsKKyAgICAgIG1wel9hYnMgKGJhc2UsIGIpOworCisgICAgICBibiA9IGJhc2UtPl9tcF9zaXplOworICAgICAgaWYgKGJuID49IG1uKQorCXsKKwkgIG1wbl9kaXZfcXJfcHJlaW52IChOVUxMLCBiYXNlLT5fbXBfZCwgYmFzZS0+X21wX3NpemUsIG1wLCBtbiwgJm1pbnYpOworCSAgYm4gPSBtbjsKKwl9CisKKyAgICAgIC8qIFdlIGhhdmUgcmVkdWNlZCB0aGUgYWJzb2x1dGUgdmFsdWUuIE5vdyB0YWtlIGNhcmUgb2YgdGhlCisJIHNpZ24uIE5vdGUgdGhhdCB3ZSBnZXQgemVybyByZXByZXNlbnRlZCBub24tY2Fub25pY2FsbHkgYXMKKwkgbS4gKi8KKyAgICAgIGlmIChiLT5fbXBfc2l6ZSA8IDApCisJeworCSAgbXBfcHRyIGJwID0gTVBaX1JFQUxMT0MgKGJhc2UsIG1uKTsKKwkgIGdtcF9hc3NlcnRfbm9jYXJyeSAobXBuX3N1YiAoYnAsIG1wLCBtbiwgYnAsIGJuKSk7CisJICBibiA9IG1uOworCX0KKyAgICAgIGJhc2UtPl9tcF9zaXplID0gbXBuX25vcm1hbGl6ZWRfc2l6ZSAoYmFzZS0+X21wX2QsIGJuKTsKKyAgICB9CisgIG1wel9pbml0X3NldF91aSAodHIsIDEpOworCisgIHdoaWxlICgtLWVuID49IDApCisgICAgeworICAgICAgbXBfbGltYl90IHcgPSBlLT5fbXBfZFtlbl07CisgICAgICBtcF9saW1iX3QgYml0OworCisgICAgICBiaXQgPSBHTVBfTElNQl9ISUdIQklUOworICAgICAgZG8KKwl7CisJICBtcHpfbXVsICh0ciwgdHIsIHRyKTsKKwkgIGlmICh3ICYgYml0KQorCSAgICBtcHpfbXVsICh0ciwgdHIsIGJhc2UpOworCSAgaWYgKHRyLT5fbXBfc2l6ZSA+IG1uKQorCSAgICB7CisJICAgICAgbXBuX2Rpdl9xcl9wcmVpbnYgKE5VTEwsIHRyLT5fbXBfZCwgdHItPl9tcF9zaXplLCBtcCwgbW4sICZtaW52KTsKKwkgICAgICB0ci0+X21wX3NpemUgPSBtcG5fbm9ybWFsaXplZF9zaXplICh0ci0+X21wX2QsIG1uKTsKKwkgICAgfQorCSAgYml0ID4+PSAxOworCX0KKyAgICAgIHdoaWxlIChiaXQgPiAwKTsKKyAgICB9CisKKyAgLyogRmluYWwgcmVkdWN0aW9uICovCisgIGlmICh0ci0+X21wX3NpemUgPj0gbW4pCisgICAgeworICAgICAgbWludi5zaGlmdCA9IHNoaWZ0OworICAgICAgbXBuX2Rpdl9xcl9wcmVpbnYgKE5VTEwsIHRyLT5fbXBfZCwgdHItPl9tcF9zaXplLCBtcCwgbW4sICZtaW52KTsKKyAgICAgIHRyLT5fbXBfc2l6ZSA9IG1wbl9ub3JtYWxpemVkX3NpemUgKHRyLT5fbXBfZCwgbW4pOworICAgIH0KKyAgaWYgKHRwKQorICAgIGdtcF9mcmVlX2xpbWJzICh0cCwgbW4pOworCisgIG1wel9zd2FwIChyLCB0cik7CisgIG1wel9jbGVhciAodHIpOworICBtcHpfY2xlYXIgKGJhc2UpOworfQorCit2b2lkCittcHpfcG93bV91aSAobXB6X3QgciwgY29uc3QgbXB6X3QgYiwgdW5zaWduZWQgbG9uZyBlbGltYiwgY29uc3QgbXB6X3QgbSkKK3sKKyAgbXB6X3QgZTsKKworICBtcHpfaW5pdF9zZXRfdWkgKGUsIGVsaW1iKTsKKyAgbXB6X3Bvd20gKHIsIGIsIGUsIG0pOworICBtcHpfY2xlYXIgKGUpOworfQorCisvKiB4PXRydW5jKHleKDEveikpLCByPXkteF56ICovCit2b2lkCittcHpfcm9vdHJlbSAobXB6X3QgeCwgbXB6X3QgciwgY29uc3QgbXB6X3QgeSwgdW5zaWduZWQgbG9uZyB6KQoreworICBpbnQgc2duOworICBtcF9iaXRjbnRfdCBiYzsKKyAgbXB6X3QgdCwgdTsKKworICBzZ24gPSB5LT5fbXBfc2l6ZSA8IDA7CisgIGlmICgofnogJiBzZ24pICE9IDApCisgICAgZ21wX2RpZSAoIm1wel9yb290cmVtOiBOZWdhdGl2ZSBhcmd1bWVudCwgd2l0aCBldmVuIHJvb3QuIik7CisgIGlmICh6ID09IDApCisgICAgZ21wX2RpZSAoIm1wel9yb290cmVtOiBaZXJvdGggcm9vdC4iKTsKKworICBpZiAobXB6X2NtcGFic191aSAoeSwgMSkgPD0gMCkgeworICAgIGlmICh4KQorICAgICAgbXB6X3NldCAoeCwgeSk7CisgICAgaWYgKHIpCisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgcmV0dXJuOworICB9CisKKyAgbXB6X2luaXQgKHUpOworICBtcHpfaW5pdCAodCk7CisgIGJjID0gKG1wel9zaXplaW5iYXNlICh5LCAyKSAtIDEpIC8geiArIDE7CisgIG1wel9zZXRiaXQgKHQsIGJjKTsKKworICBpZiAoeiA9PSAyKSAvKiBzaW1wbGlmeSBzcXJ0IGxvb3A6IHotMSA9PSAxICovCisgICAgZG8geworICAgICAgbXB6X3N3YXAgKHUsIHQpOwkJCS8qIHUgPSB4ICovCisgICAgICBtcHpfdGRpdl9xICh0LCB5LCB1KTsJCS8qIHQgPSB5L3ggKi8KKyAgICAgIG1wel9hZGQgKHQsIHQsIHUpOwkJLyogdCA9IHkveCArIHggKi8KKyAgICAgIG1wel90ZGl2X3FfMmV4cCAodCwgdCwgMSk7CS8qIHgnPSAoeS94ICsgeCkvMiAqLworICAgIH0gd2hpbGUgKG1wel9jbXBhYnMgKHQsIHUpIDwgMCk7CS8qIHx4J3wgPCB8eHwgKi8KKyAgZWxzZSAvKiB6ICE9IDIgKi8geworICAgIG1wel90IHY7CisKKyAgICBtcHpfaW5pdCAodik7CisgICAgaWYgKHNnbikKKyAgICAgIG1wel9uZWcgKHQsIHQpOworCisgICAgZG8geworICAgICAgbXB6X3N3YXAgKHUsIHQpOwkJCS8qIHUgPSB4ICovCisgICAgICBtcHpfcG93X3VpICh0LCB1LCB6IC0gMSk7CQkvKiB0ID0geF4oei0xKSAqLworICAgICAgbXB6X3RkaXZfcSAodCwgeSwgdCk7CQkvKiB0ID0geS94Xih6LTEpICovCisgICAgICBtcHpfbXVsX3VpICh2LCB1LCB6IC0gMSk7CQkvKiB2ID0geCooei0xKSAqLworICAgICAgbXB6X2FkZCAodCwgdCwgdik7CQkvKiB0ID0geS94Xih6LTEpICsgeCooei0xKSAqLworICAgICAgbXB6X3RkaXZfcV91aSAodCwgdCwgeik7CQkvKiB4Jz0oeS94Xih6LTEpICsgeCooei0xKSkveiAqLworICAgIH0gd2hpbGUgKG1wel9jbXBhYnMgKHQsIHUpIDwgMCk7CS8qIHx4J3wgPCB8eHwgKi8KKworICAgIG1wel9jbGVhciAodik7CisgIH0KKworICBpZiAocikgeworICAgIG1wel9wb3dfdWkgKHQsIHUsIHopOworICAgIG1wel9zdWIgKHIsIHksIHQpOworICB9CisgIGlmICh4KQorICAgIG1wel9zd2FwICh4LCB1KTsKKyAgbXB6X2NsZWFyICh1KTsKKyAgbXB6X2NsZWFyICh0KTsKK30KKworaW50CittcHpfcm9vdCAobXB6X3QgeCwgY29uc3QgbXB6X3QgeSwgdW5zaWduZWQgbG9uZyB6KQoreworICBpbnQgcmVzOworICBtcHpfdCByOworCisgIG1wel9pbml0IChyKTsKKyAgbXB6X3Jvb3RyZW0gKHgsIHIsIHksIHopOworICByZXMgPSByLT5fbXBfc2l6ZSA9PSAwOworICBtcHpfY2xlYXIgKHIpOworCisgIHJldHVybiByZXM7Cit9CisKKy8qIENvbXB1dGUgcyA9IGZsb29yKHNxcnQodSkpIGFuZCByID0gdSAtIHNeMi4gQWxsb3dzIHIgPT0gTlVMTCAqLwordm9pZAorbXB6X3NxcnRyZW0gKG1wel90IHMsIG1wel90IHIsIGNvbnN0IG1wel90IHUpCit7CisgIG1wel9yb290cmVtIChzLCByLCB1LCAyKTsKK30KKwordm9pZAorbXB6X3NxcnQgKG1wel90IHMsIGNvbnN0IG1wel90IHUpCit7CisgIG1wel9yb290cmVtIChzLCBOVUxMLCB1LCAyKTsKK30KKworaW50CittcHpfcGVyZmVjdF9zcXVhcmVfcCAoY29uc3QgbXB6X3QgdSkKK3sKKyAgaWYgKHUtPl9tcF9zaXplIDw9IDApCisgICAgcmV0dXJuICh1LT5fbXBfc2l6ZSA9PSAwKTsKKyAgZWxzZQorICAgIHJldHVybiBtcHpfcm9vdCAoTlVMTCwgdSwgMik7Cit9CisKK2ludAorbXBuX3BlcmZlY3Rfc3F1YXJlX3AgKG1wX3NyY3B0ciBwLCBtcF9zaXplX3QgbikKK3sKKyAgbXB6X3QgdDsKKworICBhc3NlcnQgKG4gPiAwKTsKKyAgYXNzZXJ0IChwIFtuLTFdICE9IDApOworICByZXR1cm4gbXB6X3Jvb3QgKE5VTEwsIG1wel9yb2luaXRfbm9ybWFsX24gKHQsIHAsIG4pLCAyKTsKK30KKworbXBfc2l6ZV90CittcG5fc3FydHJlbSAobXBfcHRyIHNwLCBtcF9wdHIgcnAsIG1wX3NyY3B0ciBwLCBtcF9zaXplX3QgbikKK3sKKyAgbXB6X3QgcywgciwgdTsKKyAgbXBfc2l6ZV90IHJlczsKKworICBhc3NlcnQgKG4gPiAwKTsKKyAgYXNzZXJ0IChwIFtuLTFdICE9IDApOworCisgIG1wel9pbml0IChyKTsKKyAgbXB6X2luaXQgKHMpOworICBtcHpfcm9vdHJlbSAocywgciwgbXB6X3JvaW5pdF9ub3JtYWxfbiAodSwgcCwgbiksIDIpOworCisgIGFzc2VydCAocy0+X21wX3NpemUgPT0gKG4rMSkvMik7CisgIG1wbl9jb3B5ZCAoc3AsIHMtPl9tcF9kLCBzLT5fbXBfc2l6ZSk7CisgIG1wel9jbGVhciAocyk7CisgIHJlcyA9IHItPl9tcF9zaXplOworICBpZiAocnApCisgICAgbXBuX2NvcHlkIChycCwgci0+X21wX2QsIHJlcyk7CisgIG1wel9jbGVhciAocik7CisgIHJldHVybiByZXM7Cit9CisMCisvKiBDb21iaW5hdG9yaWNzICovCisKK3ZvaWQKK21wel9tZmFjX3VpdWkgKG1wel90IHgsIHVuc2lnbmVkIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBtKQoreworICBtcHpfc2V0X3VpICh4LCBuICsgKG4gPT0gMCkpOworICBpZiAobSArIDEgPCAyKSByZXR1cm47CisgIHdoaWxlIChuID4gbSArIDEpCisgICAgbXB6X211bF91aSAoeCwgeCwgbiAtPSBtKTsKK30KKwordm9pZAorbXB6XzJmYWNfdWkgKG1wel90IHgsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgbXB6X21mYWNfdWl1aSAoeCwgbiwgMik7Cit9CisKK3ZvaWQKK21wel9mYWNfdWkgKG1wel90IHgsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgbXB6X21mYWNfdWl1aSAoeCwgbiwgMSk7Cit9CisKK3ZvaWQKK21wel9iaW5fdWl1aSAobXB6X3QgciwgdW5zaWduZWQgbG9uZyBuLCB1bnNpZ25lZCBsb25nIGspCit7CisgIG1wel90IHQ7CisKKyAgbXB6X3NldF91aSAociwgayA8PSBuKTsKKworICBpZiAoayA+IChuID4+IDEpKQorICAgIGsgPSAoayA8PSBuKSA/IG4gLSBrIDogMDsKKworICBtcHpfaW5pdCAodCk7CisgIG1wel9mYWNfdWkgKHQsIGspOworCisgIGZvciAoOyBrID4gMDsgLS1rKQorICAgIG1wel9tdWxfdWkgKHIsIHIsIG4tLSk7CisKKyAgbXB6X2RpdmV4YWN0IChyLCByLCB0KTsKKyAgbXB6X2NsZWFyICh0KTsKK30KKworDAorLyogUHJpbWFsaXR5IHRlc3RpbmcgKi8KKworLyogQ29tcHV0ZXMgS3JvbmVja2VyIChhL2IpIHdpdGggb2RkIGIsIGEhPTAgYW5kIEdDRChhLGIpID0gMSAqLworLyogQWRhcHRlZCBmcm9tIEpBQ09CSV9CQVNFX01FVEhPRD09NCBpbiBtcG4vZ2VuZXJpYy9qYWNiYXNlLmMgKi8KK3N0YXRpYyBpbnQKK2dtcF9qYWNvYmlfY29wcmltZSAobXBfbGltYl90IGEsIG1wX2xpbWJfdCBiKQoreworICBpbnQgYywgYml0ID0gMDsKKworICBhc3NlcnQgKGIgJiAxKTsKKyAgYXNzZXJ0IChhICE9IDApOworICAvKiBhc3NlcnQgKG1wbl9nY2RfMTEgKGEsIGIpID09IDEpOyAqLworCisgIC8qIEJlbG93LCB3ZSByZXByZXNlbnQgYSBhbmQgYiBzaGlmdGVkIHJpZ2h0IHNvIHRoYXQgdGhlIGxlYXN0CisgICAgIHNpZ25pZmljYW50IG9uZSBiaXQgaXMgaW1wbGljaXQuICovCisgIGIgPj49IDE7CisKKyAgZ21wX2N0eihjLCBhKTsKKyAgYSA+Pj0gMTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGEgPj49IGM7CisgICAgICAvKiAoMi9iKSA9IC0xIGlmIGIgPSAzIG9yIDUgbW9kIDggKi8KKyAgICAgIGJpdCBePSBjICYgKGIgXiAoYiA+PiAxKSk7CisgICAgICBpZiAoYSA8IGIpCisJeworCSAgaWYgKGEgPT0gMCkKKwkgICAgcmV0dXJuIGJpdCAmIDEgPyAtMSA6IDE7CisJICBiaXQgXj0gYSAmIGI7CisJICBhID0gYiAtIGE7CisJICBiIC09IGE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGEgLT0gYjsKKwkgIGFzc2VydCAoYSAhPSAwKTsKKwl9CisKKyAgICAgIGdtcF9jdHooYywgYSk7CisgICAgICArK2M7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZ21wX2x1Y2FzX3N0ZXBfa18yayAobXB6X3QgViwgbXB6X3QgUWssIGNvbnN0IG1wel90IG4pCit7CisgIG1wel9tb2QgKFFrLCBRaywgbik7CisgIC8qIFZfezJrfSA8LSBWX2sgXiAyIC0gMlFeayAqLworICBtcHpfbXVsIChWLCBWLCBWKTsKKyAgbXB6X3N1Ym11bF91aSAoViwgUWssIDIpOworICBtcHpfdGRpdl9yIChWLCBWLCBuKTsKKyAgLyogUV57Mmt9ID0gKFFeayleMiAqLworICBtcHpfbXVsIChRaywgUWssIFFrKTsKK30KKworLyogQ29tcHV0ZXMgVl9rLCBRXmsgKG1vZCBuKSBmb3IgdGhlIEx1Y2FzJyBzZXF1ZW5jZSAqLworLyogd2l0aCBQPTEsIFE9UTsgayA9IChuPj5iMCl8MS4gKi8KKy8qIFJlcXVpcmVzIGFuIG9kZCBuID4gNDsgYjAgPiAwOyAtMipRIG11c3Qgbm90IG92ZXJmbG93IGEgbG9uZyAqLworLyogUmV0dXJucyAoVV9rID09IDApIGFuZCBzZXRzIFY9Vl9rIGFuZCBRaz1RXmsuICovCitzdGF0aWMgaW50CitnbXBfbHVjYXNfbW9kIChtcHpfdCBWLCBtcHpfdCBRaywgbG9uZyBRLAorCSAgICAgICBtcF9iaXRjbnRfdCBiMCwgY29uc3QgbXB6X3QgbikKK3sKKyAgbXBfYml0Y250X3QgYnM7CisgIG1wel90IFU7CisgIGludCByZXM7CisKKyAgYXNzZXJ0IChiMCA+IDApOworICBhc3NlcnQgKFEgPD0gLSAoTE9OR19NSU4gLyAyKSk7CisgIGFzc2VydCAoUSA+PSAtIChMT05HX01BWCAvIDIpKTsKKyAgYXNzZXJ0IChtcHpfY21wX3VpIChuLCA0KSA+IDApOworICBhc3NlcnQgKG1wel9vZGRfcCAobikpOworCisgIG1wel9pbml0X3NldF91aSAoVSwgMSk7IC8qIFUxID0gMSAqLworICBtcHpfc2V0X3VpIChWLCAxKTsgLyogVjEgPSAxICovCisgIG1wel9zZXRfc2kgKFFrLCBRKTsKKworICBmb3IgKGJzID0gbXB6X3NpemVpbmJhc2UgKG4sIDIpIC0gMTsgLS1icyA+PSBiMDspCisgICAgeworICAgICAgLyogVV97Mmt9IDwtIFVfayAqIFZfayAqLworICAgICAgbXB6X211bCAoVSwgVSwgVik7CisgICAgICAvKiBWX3sya30gPC0gVl9rIF4gMiAtIDJRXmsgKi8KKyAgICAgIC8qIFFeezJrfSA9IChRXmspXjIgKi8KKyAgICAgIGdtcF9sdWNhc19zdGVwX2tfMmsgKFYsIFFrLCBuKTsKKworICAgICAgLyogQSBzdGVwIGstPmsrMSBpcyBwZXJmb3JtZWQgaWYgdGhlIGJpdCBpbiAkbiQgaXMgMQkqLworICAgICAgLyogbXB6X3RzdGJpdChuLGJzKSBvciB0aGUgYml0IGlzIDAgaW4gJG4kIGJ1dAkqLworICAgICAgLyogc2hvdWxkIGJlIDEgaW4gJG4rMSQgKGJzID09IGIwKQkJCSovCisgICAgICBpZiAoYjAgPT0gYnMgfHwgbXB6X3RzdGJpdCAobiwgYnMpKQorCXsKKwkgIC8qIFFee2srMX0gPC0gUV5rICogUSAqLworCSAgbXB6X211bF9zaSAoUWssIFFrLCBRKTsKKwkgIC8qIFVfe2srMX0gPC0gKFVfayArIFZfaykgLyAyICovCisJICBtcHpfc3dhcCAoVSwgVik7IC8qIEtlZXAgaW4gViB0aGUgb2xkIHZhbHVlIG9mIFVfayAqLworCSAgbXB6X2FkZCAoVSwgVSwgVik7CisJICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgVS8yLCBzbyB3ZSBuZWVkIGFuIGV2ZW4gdmFsdWUsICovCisJICAvKiBlcXVpdmFsZW50IChtb2QgbikgKi8KKwkgIGlmIChtcHpfb2RkX3AgKFUpKQorCSAgICBtcHpfYWRkIChVLCBVLCBuKTsKKwkgIG1wel90ZGl2X3FfMmV4cCAoVSwgVSwgMSk7CisJICAvKiBWX3trKzF9IDwtKEQqVV9rICsgVl9rKSAvIDIgPQorCQkJVV97aysxfSArIChELTEpLzIqVV9rID0gVV97aysxfSAtIDJRKlVfayAqLworCSAgbXB6X211bF9zaSAoViwgViwgLTIqUSk7CisJICBtcHpfYWRkIChWLCBVLCBWKTsKKwkgIG1wel90ZGl2X3IgKFYsIFYsIG4pOworCX0KKyAgICAgIG1wel90ZGl2X3IgKFUsIFUsIG4pOworICAgIH0KKworICByZXMgPSBVLT5fbXBfc2l6ZSA9PSAwOworICBtcHpfY2xlYXIgKFUpOworICByZXR1cm4gcmVzOworfQorCisvKiBQZXJmb3JtcyBzdHJvbmcgTHVjYXMnIHRlc3Qgb24geCwgd2l0aCBwYXJhbWV0ZXJzIHN1Z2dlc3RlZCAqLworLyogZm9yIHRoZSBCUFNXIHRlc3QuIFFrIGlzIG9ubHkgcGFzc2VkIHRvIHJlY3ljbGUgYSB2YXJpYWJsZS4gKi8KKy8qIFJlcXVpcmVzIEdDRCAoeCw2KSA9IDEuKi8KK3N0YXRpYyBpbnQKK2dtcF9zdHJvbmdsdWNhcyAoY29uc3QgbXB6X3QgeCwgbXB6X3QgUWspCit7CisgIG1wX2JpdGNudF90IGIwOworICBtcHpfdCBWLCBuOworICBtcF9saW1iX3QgbWF4RCwgRDsgLyogVGhlIGFic29sdXRlIHZhbHVlIGlzIHN0b3JlZC4gKi8KKyAgbG9uZyBROworICBtcF9saW1iX3QgdGw7CisKKyAgLyogVGVzdCBvbiB0aGUgYWJzb2x1dGUgdmFsdWUuICovCisgIG1wel9yb2luaXRfbm9ybWFsX24gKG4sIHgtPl9tcF9kLCBHTVBfQUJTICh4LT5fbXBfc2l6ZSkpOworCisgIGFzc2VydCAobXB6X29kZF9wIChuKSk7CisgIC8qIGFzc2VydCAobXB6X2djZF91aSAoTlVMTCwgbiwgNikgPT0gMSk7ICovCisgIGlmIChtcHpfcm9vdCAoUWssIG4sIDIpKQorICAgIHJldHVybiAwOyAvKiBBIHNxdWFyZSBpcyBjb21wb3NpdGUuICovCisKKyAgLyogQ2hlY2sgRHMgdXAgdG8gc3F1YXJlIHJvb3QgKGluIGNhc2UsIG4gaXMgcHJpbWUpCisgICAgIG9yIGF2b2lkIG92ZXJmbG93cyAqLworICBtYXhEID0gKFFrLT5fbXBfc2l6ZSA9PSAxKSA/IFFrLT5fbXBfZCBbMF0gLSAxIDogR01QX0xJTUJfTUFYOworCisgIEQgPSAzOworICAvKiBTZWFyY2ggYSBEIHN1Y2ggdGhhdCAoRC9uKSA9IC0xIGluIHRoZSBzZXF1ZW5jZSA1LC03LDksLTExLC4uICovCisgIC8qIEZvciB0aG9zZSBEcyB3ZSBoYXZlIChEL24pID0gKG4vfER8KSAqLworICBkbworICAgIHsKKyAgICAgIGlmIChEID49IG1heEQpCisJcmV0dXJuIDEgKyAoRCAhPSBHTVBfTElNQl9NQVgpOyAvKiAoMSArICEgfiBEKSAqLworICAgICAgRCArPSAyOworICAgICAgdGwgPSBtcHpfdGRpdl91aSAobiwgRCk7CisgICAgICBpZiAodGwgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisgIHdoaWxlIChnbXBfamFjb2JpX2NvcHJpbWUgKHRsLCBEKSA9PSAxKTsKKworICBtcHpfaW5pdCAoVik7CisKKyAgLyogbi0oRC9uKSA9IG4rMSA9IGQqMl57YjB9LCB3aXRoIGQgPSAobj4+YjApIHwgMSAqLworICBiMCA9IG1wbl9jb21tb25fc2NhbiAofiBuLT5fbXBfZFswXSwgMCwgbi0+X21wX2QsIG4tPl9tcF9zaXplLCBHTVBfTElNQl9NQVgpOworICAvKiBiMCA9IG1wel9zY2FuMCAobiwgMCk7ICovCisKKyAgLyogRD0gUF4yIC0gNFE7IFAgPSAxOyBRID0gKDEtRCkvNCAqLworICBRID0gKEQgJiAyKSA/IChsb25nKSAoRCA+PiAyKSArIDEgOiAtKGxvbmcpIChEID4+IDIpOworCisgIGlmICghIGdtcF9sdWNhc19tb2QgKFYsIFFrLCBRLCBiMCwgbikpCS8qIElmIFVkICE9IDAgKi8KKyAgICB3aGlsZSAoVi0+X21wX3NpemUgIT0gMCAmJiAtLWIwICE9IDApCS8qIHdoaWxlIFZrICE9IDAgKi8KKyAgICAgIC8qIFYgPC0gViBeIDIgLSAyUV5rICovCisgICAgICAvKiBRXnsya30gPSAoUV5rKV4yICovCisgICAgICBnbXBfbHVjYXNfc3RlcF9rXzJrIChWLCBRaywgbik7CisKKyAgbXB6X2NsZWFyIChWKTsKKyAgcmV0dXJuIChiMCAhPSAwKTsKK30KKworc3RhdGljIGludAorZ21wX21pbGxlcnJhYmluIChjb25zdCBtcHpfdCBuLCBjb25zdCBtcHpfdCBubTEsIG1wel90IHksCisJCSBjb25zdCBtcHpfdCBxLCBtcF9iaXRjbnRfdCBrKQoreworICBhc3NlcnQgKGsgPiAwKTsKKworICAvKiBDYWxsZXIgbXVzdCBpbml0aWFsaXplIHkgdG8gdGhlIGJhc2UuICovCisgIG1wel9wb3dtICh5LCB5LCBxLCBuKTsKKworICBpZiAobXB6X2NtcF91aSAoeSwgMSkgPT0gMCB8fCBtcHpfY21wICh5LCBubTEpID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgd2hpbGUgKC0tayA+IDApCisgICAgeworICAgICAgbXB6X3Bvd21fdWkgKHksIHksIDIsIG4pOworICAgICAgaWYgKG1wel9jbXAgKHksIG5tMSkgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBUaGlzIHByb2R1Y3QgaXMgMHhjMGNmZDc5NywgYW5kIGZpdHMgaW4gMzIgYml0cy4gKi8KKyNkZWZpbmUgR01QX1BSSU1FX1BST0RVQ1QgXAorICAoM1VMKjVVTCo3VUwqMTFVTCoxM1VMKjE3VUwqMTlVTCoyM1VMKjI5VUwpCisKKy8qIEJpdCAocCsxKS8yIGlzIHNldCwgZm9yIGVhY2ggb2RkIHByaW1lIDw9IDYxICovCisjZGVmaW5lIEdNUF9QUklNRV9NQVNLIDB4Yzk2OTk2ZGNVTAorCitpbnQKK21wel9wcm9iYWJfcHJpbWVfcCAoY29uc3QgbXB6X3QgbiwgaW50IHJlcHMpCit7CisgIG1wel90IG5tMTsKKyAgbXB6X3QgcTsKKyAgbXB6X3QgeTsKKyAgbXBfYml0Y250X3QgazsKKyAgaW50IGlzX3ByaW1lOworICBpbnQgajsKKworICAvKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuIG9ubHksIGZvciBjb21wYXRpYmlsaXR5CisgICAgIHdpdGggdGhlIHJlYWwgR01QLiAqLworICBpZiAobXB6X2V2ZW5fcCAobikpCisgICAgcmV0dXJuIChtcHpfY21wYWJzX3VpIChuLCAyKSA9PSAwKSA/IDIgOiAwOworCisgIC8qIEFib3ZlIHRlc3QgZXhjbHVkZXMgbiA9PSAwICovCisgIGFzc2VydCAobi0+X21wX3NpemUgIT0gMCk7CisKKyAgaWYgKG1wel9jbXBhYnNfdWkgKG4sIDY0KSA8IDApCisgICAgcmV0dXJuIChHTVBfUFJJTUVfTUFTSyA+PiAobi0+X21wX2RbMF0gPj4gMSkpICYgMjsKKworICBpZiAobXB6X2djZF91aSAoTlVMTCwgbiwgR01QX1BSSU1FX1BST0RVQ1QpICE9IDEpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQWxsIHByaW1lIGZhY3RvcnMgYXJlID49IDMxLiAqLworICBpZiAobXB6X2NtcGFic191aSAobiwgMzEqMzEpIDwgMCkKKyAgICByZXR1cm4gMjsKKworICBtcHpfaW5pdCAobm0xKTsKKyAgbXB6X2luaXQgKHEpOworCisgIC8qIEZpbmQgcSBhbmQgaywgd2hlcmUgcSBpcyBvZGQgYW5kIG4gPSAxICsgMioqayAqIHEuICAqLworICBtcHpfYWJzIChubTEsIG4pOworICBubTEtPl9tcF9kWzBdIC09IDE7CisgIC8qIENvdW50IHRyYWlsaW5nIHplcm9zLCBlcXVpdmFsZW50IHRvIG1wbl9zY2FuMSwgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgYSAxICovCisgIGsgPSBtcG5fc2NhbjEgKG5tMS0+X21wX2QsIDApOworICBtcHpfdGRpdl9xXzJleHAgKHEsIG5tMSwgayk7CisKKyAgLyogQlBTVyB0ZXN0ICovCisgIG1wel9pbml0X3NldF91aSAoeSwgMik7CisgIGlzX3ByaW1lID0gZ21wX21pbGxlcnJhYmluIChuLCBubTEsIHksIHEsIGspICYmIGdtcF9zdHJvbmdsdWNhcyAobiwgeSk7CisgIHJlcHMgLT0gMjQ7IC8qIHNraXAgdGhlIGZpcnN0IDI0IHJlcGV0aXRpb25zICovCisKKyAgLyogVXNlIE1pbGxlci1SYWJpbiwgd2l0aCBhIGRldGVybWluaXN0aWMgc2VxdWVuY2Ugb2YgYmFzZXMsIGFbal0gPQorICAgICBqXjIgKyBqICsgNDEgdXNpbmcgRXVsZXIncyBwb2x5bm9taWFsLiBXZSBwb3RlbnRpYWxseSBzdG9wIGVhcmx5LAorICAgICBpZiBhW2pdID49IG4gLSAxLiBTaW5jZSBuID49IDMxKjMxLCB0aGlzIGNhbiBoYXBwZW4gb25seSBpZiByZXBzID4KKyAgICAgMzAgKGFbMzBdID09IDk3MSA+IDMxKjMxID09IDk2MSkuICovCisKKyAgZm9yIChqID0gMDsgaXNfcHJpbWUgJiAoaiA8IHJlcHMpOyBqKyspCisgICAgeworICAgICAgbXB6X3NldF91aSAoeSwgKHVuc2lnbmVkIGxvbmcpIGoqaitqKzQxKTsKKyAgICAgIGlmIChtcHpfY21wICh5LCBubTEpID49IDApCisJeworCSAgLyogRG9uJ3QgdHJ5IGFueSBmdXJ0aGVyIGJhc2VzLiBUaGlzICJlYXJseSIgYnJlYWsgZG9lcyBub3QgYWZmZWN0CisJICAgICB0aGUgcmVzdWx0IGZvciBhbnkgcmVhc29uYWJsZSByZXBzIHZhbHVlICg8PTUwMDAgd2FzIHRlc3RlZCkgKi8KKwkgIGFzc2VydCAoaiA+PSAzMCk7CisJICBicmVhazsKKwl9CisgICAgICBpc19wcmltZSA9IGdtcF9taWxsZXJyYWJpbiAobiwgbm0xLCB5LCBxLCBrKTsKKyAgICB9CisgIG1wel9jbGVhciAobm0xKTsKKyAgbXB6X2NsZWFyIChxKTsKKyAgbXB6X2NsZWFyICh5KTsKKworICByZXR1cm4gaXNfcHJpbWU7Cit9CisKKwwKKy8qIExvZ2ljYWwgb3BlcmF0aW9ucyBhbmQgYml0IG1hbmlwdWxhdGlvbi4gKi8KKworLyogTnVtYmVycyBhcmUgdHJlYXRlZCBhcyBpZiByZXByZXNlbnRlZCBpbiB0d28ncyBjb21wbGVtZW50IChhbmQKKyAgIGluZmluaXRlbHkgc2lnbiBleHRlbmRlZCkuIEZvciBhIG5lZ2F0aXZlIHZhbHVlcyB3ZSBnZXQgdGhlIHR3bydzCisgICBjb21wbGVtZW50IGZyb20gLXggPSB+eCArIDEsIHdoZXJlIH4gaXMgYml0d2lzZSBjb21wbGVtZW50LgorICAgTmVnYXRpb24gdHJhbnNmb3JtcworCisgICAgIHh4eHgxMC4uLjAKKworICAgaW50bworCisgICAgIHl5eXkxMC4uLjAKKworICAgd2hlcmUgeXl5eSBpcyB0aGUgYml0d2lzZSBjb21wbGVtZW50IG9mIHh4eHguIFNvIGxlYXN0IHNpZ25pZmljYW50CisgICBiaXRzLCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBmaXJzdCBvbmUgYml0LCBhcmUgdW5jaGFuZ2VkLCBhbmQKKyAgIHRoZSBtb3JlIHNpZ25pZmljYW50IGJpdHMgYXJlIGFsbCBjb21wbGVtZW50ZWQuCisKKyAgIFRvIGNoYW5nZSBhIGJpdCBmcm9tIHplcm8gdG8gb25lIGluIGEgbmVnYXRpdmUgbnVtYmVyLCBzdWJ0cmFjdCB0aGUKKyAgIGNvcnJlc3BvbmRpbmcgcG93ZXIgb2YgdHdvIGZyb20gdGhlIGFic29sdXRlIHZhbHVlLiBUaGlzIGNhbiBuZXZlcgorICAgdW5kZXJmbG93LiBUbyBjaGFuZ2UgYSBiaXQgZnJvbSBvbmUgdG8gemVybywgYWRkIHRoZSBjb3JyZXNwb25kaW5nCisgICBwb3dlciBvZiB0d28sIGFuZCB0aGlzIG1pZ2h0IG92ZXJmbG93LiBFLmcuLCBpZiB4ID0gLTAwMTExMSwgdGhlCisgICB0d28ncyBjb21wbGVtZW50IGlzIDExMDAwMS4gQ2xlYXJpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCwgd2UKKyAgIGdldCB0d28ncyBjb21wbGVtZW50IDExMDAwMCwgYW5kIC0wMTAwMDAuICovCisKK2ludAorbXB6X3RzdGJpdCAoY29uc3QgbXB6X3QgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBtcF9zaXplX3QgbGltYl9pbmRleDsKKyAgdW5zaWduZWQgc2hpZnQ7CisgIG1wX3NpemVfdCBkczsKKyAgbXBfc2l6ZV90IGRuOworICBtcF9saW1iX3QgdzsKKyAgaW50IGJpdDsKKworICBkcyA9IGQtPl9tcF9zaXplOworICBkbiA9IEdNUF9BQlMgKGRzKTsKKyAgbGltYl9pbmRleCA9IGJpdF9pbmRleCAvIEdNUF9MSU1CX0JJVFM7CisgIGlmIChsaW1iX2luZGV4ID49IGRuKQorICAgIHJldHVybiBkcyA8IDA7CisKKyAgc2hpZnQgPSBiaXRfaW5kZXggJSBHTVBfTElNQl9CSVRTOworICB3ID0gZC0+X21wX2RbbGltYl9pbmRleF07CisgIGJpdCA9ICh3ID4+IHNoaWZ0KSAmIDE7CisKKyAgaWYgKGRzIDwgMCkKKyAgICB7CisgICAgICAvKiBkIDwgMC4gQ2hlY2sgaWYgYW55IG9mIHRoZSBiaXRzIGJlbG93IGlzIHNldDogSWYgc28sIG91ciBiaXQKKwkgbXVzdCBiZSBjb21wbGVtZW50ZWQuICovCisgICAgICBpZiAoc2hpZnQgPiAwICYmIChtcF9saW1iX3QpICh3IDw8IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpKSA+IDApCisJcmV0dXJuIGJpdCBeIDE7CisgICAgICB3aGlsZSAoLS1saW1iX2luZGV4ID49IDApCisJaWYgKGQtPl9tcF9kW2xpbWJfaW5kZXhdID4gMCkKKwkgIHJldHVybiBiaXQgXiAxOworICAgIH0KKyAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIHZvaWQKK21wel9hYnNfYWRkX2JpdCAobXB6X3QgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBtcF9zaXplX3QgZG4sIGxpbWJfaW5kZXg7CisgIG1wX2xpbWJfdCBiaXQ7CisgIG1wX3B0ciBkcDsKKworICBkbiA9IEdNUF9BQlMgKGQtPl9tcF9zaXplKTsKKworICBsaW1iX2luZGV4ID0gYml0X2luZGV4IC8gR01QX0xJTUJfQklUUzsKKyAgYml0ID0gKG1wX2xpbWJfdCkgMSA8PCAoYml0X2luZGV4ICUgR01QX0xJTUJfQklUUyk7CisKKyAgaWYgKGxpbWJfaW5kZXggPj0gZG4pCisgICAgeworICAgICAgbXBfc2l6ZV90IGk7CisgICAgICAvKiBUaGUgYml0IHNob3VsZCBiZSBzZXQgb3V0c2lkZSBvZiB0aGUgZW5kIG9mIHRoZSBudW1iZXIuCisJIFdlIGhhdmUgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG51bWJlci4gKi8KKyAgICAgIGRwID0gTVBaX1JFQUxMT0MgKGQsIGxpbWJfaW5kZXggKyAxKTsKKworICAgICAgZHBbbGltYl9pbmRleF0gPSBiaXQ7CisgICAgICBmb3IgKGkgPSBkbjsgaSA8IGxpbWJfaW5kZXg7IGkrKykKKwlkcFtpXSA9IDA7CisgICAgICBkbiA9IGxpbWJfaW5kZXggKyAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeTsKKworICAgICAgZHAgPSBkLT5fbXBfZDsKKworICAgICAgY3kgPSBtcG5fYWRkXzEgKGRwICsgbGltYl9pbmRleCwgZHAgKyBsaW1iX2luZGV4LCBkbiAtIGxpbWJfaW5kZXgsIGJpdCk7CisgICAgICBpZiAoY3kgPiAwKQorCXsKKwkgIGRwID0gTVBaX1JFQUxMT0MgKGQsIGRuICsgMSk7CisJICBkcFtkbisrXSA9IGN5OworCX0KKyAgICB9CisKKyAgZC0+X21wX3NpemUgPSAoZC0+X21wX3NpemUgPCAwKSA/IC0gZG4gOiBkbjsKK30KKworc3RhdGljIHZvaWQKK21wel9hYnNfc3ViX2JpdCAobXB6X3QgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBtcF9zaXplX3QgZG4sIGxpbWJfaW5kZXg7CisgIG1wX3B0ciBkcDsKKyAgbXBfbGltYl90IGJpdDsKKworICBkbiA9IEdNUF9BQlMgKGQtPl9tcF9zaXplKTsKKyAgZHAgPSBkLT5fbXBfZDsKKworICBsaW1iX2luZGV4ID0gYml0X2luZGV4IC8gR01QX0xJTUJfQklUUzsKKyAgYml0ID0gKG1wX2xpbWJfdCkgMSA8PCAoYml0X2luZGV4ICUgR01QX0xJTUJfQklUUyk7CisKKyAgYXNzZXJ0IChsaW1iX2luZGV4IDwgZG4pOworCisgIGdtcF9hc3NlcnRfbm9jYXJyeSAobXBuX3N1Yl8xIChkcCArIGxpbWJfaW5kZXgsIGRwICsgbGltYl9pbmRleCwKKwkJCQkgZG4gLSBsaW1iX2luZGV4LCBiaXQpKTsKKyAgZG4gPSBtcG5fbm9ybWFsaXplZF9zaXplIChkcCwgZG4pOworICBkLT5fbXBfc2l6ZSA9IChkLT5fbXBfc2l6ZSA8IDApID8gLSBkbiA6IGRuOworfQorCit2b2lkCittcHpfc2V0Yml0IChtcHpfdCBkLCBtcF9iaXRjbnRfdCBiaXRfaW5kZXgpCit7CisgIGlmICghbXB6X3RzdGJpdCAoZCwgYml0X2luZGV4KSkKKyAgICB7CisgICAgICBpZiAoZC0+X21wX3NpemUgPj0gMCkKKwltcHpfYWJzX2FkZF9iaXQgKGQsIGJpdF9pbmRleCk7CisgICAgICBlbHNlCisJbXB6X2Fic19zdWJfYml0IChkLCBiaXRfaW5kZXgpOworICAgIH0KK30KKwordm9pZAorbXB6X2NscmJpdCAobXB6X3QgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBpZiAobXB6X3RzdGJpdCAoZCwgYml0X2luZGV4KSkKKyAgICB7CisgICAgICBpZiAoZC0+X21wX3NpemUgPj0gMCkKKwltcHpfYWJzX3N1Yl9iaXQgKGQsIGJpdF9pbmRleCk7CisgICAgICBlbHNlCisJbXB6X2Fic19hZGRfYml0IChkLCBiaXRfaW5kZXgpOworICAgIH0KK30KKwordm9pZAorbXB6X2NvbWJpdCAobXB6X3QgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBpZiAobXB6X3RzdGJpdCAoZCwgYml0X2luZGV4KSBeIChkLT5fbXBfc2l6ZSA8IDApKQorICAgIG1wel9hYnNfc3ViX2JpdCAoZCwgYml0X2luZGV4KTsKKyAgZWxzZQorICAgIG1wel9hYnNfYWRkX2JpdCAoZCwgYml0X2luZGV4KTsKK30KKwordm9pZAorbXB6X2NvbSAobXB6X3QgciwgY29uc3QgbXB6X3QgdSkKK3sKKyAgbXB6X2FkZF91aSAociwgdSwgMSk7CisgIG1wel9uZWcgKHIsIHIpOworfQorCit2b2lkCittcHpfYW5kIChtcHpfdCByLCBjb25zdCBtcHpfdCB1LCBjb25zdCBtcHpfdCB2KQoreworICBtcF9zaXplX3QgdW4sIHZuLCBybiwgaTsKKyAgbXBfcHRyIHVwLCB2cCwgcnA7CisKKyAgbXBfbGltYl90IHV4LCB2eCwgcng7CisgIG1wX2xpbWJfdCB1YywgdmMsIHJjOworICBtcF9saW1iX3QgdWwsIHZsLCBybDsKKworICB1biA9IEdNUF9BQlMgKHUtPl9tcF9zaXplKTsKKyAgdm4gPSBHTVBfQUJTICh2LT5fbXBfc2l6ZSk7CisgIGlmICh1biA8IHZuKQorICAgIHsKKyAgICAgIE1QWl9TUkNQVFJfU1dBUCAodSwgdik7CisgICAgICBNUF9TSVpFX1RfU1dBUCAodW4sIHZuKTsKKyAgICB9CisgIGlmICh2biA9PSAwKQorICAgIHsKKyAgICAgIHItPl9tcF9zaXplID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdWMgPSB1LT5fbXBfc2l6ZSA8IDA7CisgIHZjID0gdi0+X21wX3NpemUgPCAwOworICByYyA9IHVjICYgdmM7CisKKyAgdXggPSAtdWM7CisgIHZ4ID0gLXZjOworICByeCA9IC1yYzsKKworICAvKiBJZiB0aGUgc21hbGxlciBpbnB1dCBpcyBwb3NpdGl2ZSwgaGlnaGVyIGxpbWJzIGRvbid0IG1hdHRlci4gKi8KKyAgcm4gPSB2eCA/IHVuIDogdm47CisKKyAgcnAgPSBNUFpfUkVBTExPQyAociwgcm4gKyAobXBfc2l6ZV90KSByYyk7CisKKyAgdXAgPSB1LT5fbXBfZDsKKyAgdnAgPSB2LT5fbXBfZDsKKworICBpID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICh1cFtpXSBeIHV4KSArIHVjOworICAgICAgdWMgPSB1bCA8IHVjOworCisgICAgICB2bCA9ICh2cFtpXSBeIHZ4KSArIHZjOworICAgICAgdmMgPSB2bCA8IHZjOworCisgICAgICBybCA9ICggKHVsICYgdmwpIF4gcngpICsgcmM7CisgICAgICByYyA9IHJsIDwgcmM7CisgICAgICBycFtpXSA9IHJsOworICAgIH0KKyAgd2hpbGUgKCsraSA8IHZuKTsKKyAgYXNzZXJ0ICh2YyA9PSAwKTsKKworICBmb3IgKDsgaSA8IHJuOyBpKyspCisgICAgeworICAgICAgdWwgPSAodXBbaV0gXiB1eCkgKyB1YzsKKyAgICAgIHVjID0gdWwgPCB1YzsKKworICAgICAgcmwgPSAoICh1bCAmIHZ4KSBeIHJ4KSArIHJjOworICAgICAgcmMgPSBybCA8IHJjOworICAgICAgcnBbaV0gPSBybDsKKyAgICB9CisgIGlmIChyYykKKyAgICBycFtybisrXSA9IHJjOworICBlbHNlCisgICAgcm4gPSBtcG5fbm9ybWFsaXplZF9zaXplIChycCwgcm4pOworCisgIHItPl9tcF9zaXplID0gcnggPyAtcm4gOiBybjsKK30KKwordm9pZAorbXB6X2lvciAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgbXBfc2l6ZV90IHVuLCB2biwgcm4sIGk7CisgIG1wX3B0ciB1cCwgdnAsIHJwOworCisgIG1wX2xpbWJfdCB1eCwgdngsIHJ4OworICBtcF9saW1iX3QgdWMsIHZjLCByYzsKKyAgbXBfbGltYl90IHVsLCB2bCwgcmw7CisKKyAgdW4gPSBHTVBfQUJTICh1LT5fbXBfc2l6ZSk7CisgIHZuID0gR01QX0FCUyAodi0+X21wX3NpemUpOworICBpZiAodW4gPCB2bikKKyAgICB7CisgICAgICBNUFpfU1JDUFRSX1NXQVAgKHUsIHYpOworICAgICAgTVBfU0laRV9UX1NXQVAgKHVuLCB2bik7CisgICAgfQorICBpZiAodm4gPT0gMCkKKyAgICB7CisgICAgICBtcHpfc2V0IChyLCB1KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdWMgPSB1LT5fbXBfc2l6ZSA8IDA7CisgIHZjID0gdi0+X21wX3NpemUgPCAwOworICByYyA9IHVjIHwgdmM7CisKKyAgdXggPSAtdWM7CisgIHZ4ID0gLXZjOworICByeCA9IC1yYzsKKworICAvKiBJZiB0aGUgc21hbGxlciBpbnB1dCBpcyBuZWdhdGl2ZSwgYnkgc2lnbiBleHRlbnNpb24gaGlnaGVyIGxpbWJzCisgICAgIGRvbid0IG1hdHRlci4gKi8KKyAgcm4gPSB2eCA/IHZuIDogdW47CisKKyAgcnAgPSBNUFpfUkVBTExPQyAociwgcm4gKyAobXBfc2l6ZV90KSByYyk7CisKKyAgdXAgPSB1LT5fbXBfZDsKKyAgdnAgPSB2LT5fbXBfZDsKKworICBpID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICh1cFtpXSBeIHV4KSArIHVjOworICAgICAgdWMgPSB1bCA8IHVjOworCisgICAgICB2bCA9ICh2cFtpXSBeIHZ4KSArIHZjOworICAgICAgdmMgPSB2bCA8IHZjOworCisgICAgICBybCA9ICggKHVsIHwgdmwpIF4gcngpICsgcmM7CisgICAgICByYyA9IHJsIDwgcmM7CisgICAgICBycFtpXSA9IHJsOworICAgIH0KKyAgd2hpbGUgKCsraSA8IHZuKTsKKyAgYXNzZXJ0ICh2YyA9PSAwKTsKKworICBmb3IgKDsgaSA8IHJuOyBpKyspCisgICAgeworICAgICAgdWwgPSAodXBbaV0gXiB1eCkgKyB1YzsKKyAgICAgIHVjID0gdWwgPCB1YzsKKworICAgICAgcmwgPSAoICh1bCB8IHZ4KSBeIHJ4KSArIHJjOworICAgICAgcmMgPSBybCA8IHJjOworICAgICAgcnBbaV0gPSBybDsKKyAgICB9CisgIGlmIChyYykKKyAgICBycFtybisrXSA9IHJjOworICBlbHNlCisgICAgcm4gPSBtcG5fbm9ybWFsaXplZF9zaXplIChycCwgcm4pOworCisgIHItPl9tcF9zaXplID0gcnggPyAtcm4gOiBybjsKK30KKwordm9pZAorbXB6X3hvciAobXB6X3QgciwgY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgbXBfc2l6ZV90IHVuLCB2biwgaTsKKyAgbXBfcHRyIHVwLCB2cCwgcnA7CisKKyAgbXBfbGltYl90IHV4LCB2eCwgcng7CisgIG1wX2xpbWJfdCB1YywgdmMsIHJjOworICBtcF9saW1iX3QgdWwsIHZsLCBybDsKKworICB1biA9IEdNUF9BQlMgKHUtPl9tcF9zaXplKTsKKyAgdm4gPSBHTVBfQUJTICh2LT5fbXBfc2l6ZSk7CisgIGlmICh1biA8IHZuKQorICAgIHsKKyAgICAgIE1QWl9TUkNQVFJfU1dBUCAodSwgdik7CisgICAgICBNUF9TSVpFX1RfU1dBUCAodW4sIHZuKTsKKyAgICB9CisgIGlmICh2biA9PSAwKQorICAgIHsKKyAgICAgIG1wel9zZXQgKHIsIHUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB1YyA9IHUtPl9tcF9zaXplIDwgMDsKKyAgdmMgPSB2LT5fbXBfc2l6ZSA8IDA7CisgIHJjID0gdWMgXiB2YzsKKworICB1eCA9IC11YzsKKyAgdnggPSAtdmM7CisgIHJ4ID0gLXJjOworCisgIHJwID0gTVBaX1JFQUxMT0MgKHIsIHVuICsgKG1wX3NpemVfdCkgcmMpOworCisgIHVwID0gdS0+X21wX2Q7CisgIHZwID0gdi0+X21wX2Q7CisKKyAgaSA9IDA7CisgIGRvCisgICAgeworICAgICAgdWwgPSAodXBbaV0gXiB1eCkgKyB1YzsKKyAgICAgIHVjID0gdWwgPCB1YzsKKworICAgICAgdmwgPSAodnBbaV0gXiB2eCkgKyB2YzsKKyAgICAgIHZjID0gdmwgPCB2YzsKKworICAgICAgcmwgPSAodWwgXiB2bCBeIHJ4KSArIHJjOworICAgICAgcmMgPSBybCA8IHJjOworICAgICAgcnBbaV0gPSBybDsKKyAgICB9CisgIHdoaWxlICgrK2kgPCB2bik7CisgIGFzc2VydCAodmMgPT0gMCk7CisKKyAgZm9yICg7IGkgPCB1bjsgaSsrKQorICAgIHsKKyAgICAgIHVsID0gKHVwW2ldIF4gdXgpICsgdWM7CisgICAgICB1YyA9IHVsIDwgdWM7CisKKyAgICAgIHJsID0gKHVsIF4gdXgpICsgcmM7CisgICAgICByYyA9IHJsIDwgcmM7CisgICAgICBycFtpXSA9IHJsOworICAgIH0KKyAgaWYgKHJjKQorICAgIHJwW3VuKytdID0gcmM7CisgIGVsc2UKKyAgICB1biA9IG1wbl9ub3JtYWxpemVkX3NpemUgKHJwLCB1bik7CisKKyAgci0+X21wX3NpemUgPSByeCA/IC11biA6IHVuOworfQorCitzdGF0aWMgdW5zaWduZWQKK2dtcF9wb3Bjb3VudF9saW1iIChtcF9saW1iX3QgeCkKK3sKKyAgdW5zaWduZWQgYzsKKworICAvKiBEbyAxNiBiaXRzIGF0IGEgdGltZSwgdG8gYXZvaWQgbGltYi1zaXplZCBjb25zdGFudHMuICovCisgIGludCBMT0NBTF9TSElGVF9CSVRTID0gMTY7CisgIGZvciAoYyA9IDA7IHggPiAwOykKKyAgICB7CisgICAgICB1bnNpZ25lZCB3ID0geCAtICgoeCA+PiAxKSAmIDB4NTU1NSk7CisgICAgICB3ID0gKCh3ID4+IDIpICYgMHgzMzMzKSArICh3ICYgMHgzMzMzKTsKKyAgICAgIHcgPSAgKHcgPj4gNCkgKyB3OworICAgICAgdyA9ICgodyA+PiA4KSAmIDB4MDAwZikgKyAodyAmIDB4MDAwZik7CisgICAgICBjICs9IHc7CisgICAgICBpZiAoR01QX0xJTUJfQklUUyA+IExPQ0FMX1NISUZUX0JJVFMpCisJeCA+Pj0gTE9DQUxfU0hJRlRfQklUUzsKKyAgICAgIGVsc2UKKwl4ID0gMDsKKyAgICB9CisgIHJldHVybiBjOworfQorCittcF9iaXRjbnRfdAorbXBuX3BvcGNvdW50IChtcF9zcmNwdHIgcCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX3NpemVfdCBpOworICBtcF9iaXRjbnRfdCBjOworCisgIGZvciAoYyA9IDAsIGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIGMgKz0gZ21wX3BvcGNvdW50X2xpbWIgKHBbaV0pOworCisgIHJldHVybiBjOworfQorCittcF9iaXRjbnRfdAorbXB6X3BvcGNvdW50IChjb25zdCBtcHpfdCB1KQoreworICBtcF9zaXplX3QgdW47CisKKyAgdW4gPSB1LT5fbXBfc2l6ZTsKKworICBpZiAodW4gPCAwKQorICAgIHJldHVybiB+KG1wX2JpdGNudF90KSAwOworCisgIHJldHVybiBtcG5fcG9wY291bnQgKHUtPl9tcF9kLCB1bik7Cit9CisKK21wX2JpdGNudF90CittcHpfaGFtZGlzdCAoY29uc3QgbXB6X3QgdSwgY29uc3QgbXB6X3QgdikKK3sKKyAgbXBfc2l6ZV90IHVuLCB2biwgaTsKKyAgbXBfbGltYl90IHVjLCB2YywgdWwsIHZsLCBjb21wOworICBtcF9zcmNwdHIgdXAsIHZwOworICBtcF9iaXRjbnRfdCBjOworCisgIHVuID0gdS0+X21wX3NpemU7CisgIHZuID0gdi0+X21wX3NpemU7CisKKyAgaWYgKCAodW4gXiB2bikgPCAwKQorICAgIHJldHVybiB+KG1wX2JpdGNudF90KSAwOworCisgIGNvbXAgPSAtICh1YyA9IHZjID0gKHVuIDwgMCkpOworICBpZiAodWMpCisgICAgeworICAgICAgYXNzZXJ0ICh2biA8IDApOworICAgICAgdW4gPSAtdW47CisgICAgICB2biA9IC12bjsKKyAgICB9CisKKyAgdXAgPSB1LT5fbXBfZDsKKyAgdnAgPSB2LT5fbXBfZDsKKworICBpZiAodW4gPCB2bikKKyAgICBNUE5fU1JDUFRSX1NXQVAgKHVwLCB1biwgdnAsIHZuKTsKKworICBmb3IgKGkgPSAwLCBjID0gMDsgaSA8IHZuOyBpKyspCisgICAgeworICAgICAgdWwgPSAodXBbaV0gXiBjb21wKSArIHVjOworICAgICAgdWMgPSB1bCA8IHVjOworCisgICAgICB2bCA9ICh2cFtpXSBeIGNvbXApICsgdmM7CisgICAgICB2YyA9IHZsIDwgdmM7CisKKyAgICAgIGMgKz0gZ21wX3BvcGNvdW50X2xpbWIgKHVsIF4gdmwpOworICAgIH0KKyAgYXNzZXJ0ICh2YyA9PSAwKTsKKworICBmb3IgKDsgaSA8IHVuOyBpKyspCisgICAgeworICAgICAgdWwgPSAodXBbaV0gXiBjb21wKSArIHVjOworICAgICAgdWMgPSB1bCA8IHVjOworCisgICAgICBjICs9IGdtcF9wb3Bjb3VudF9saW1iICh1bCBeIGNvbXApOworICAgIH0KKworICByZXR1cm4gYzsKK30KKworbXBfYml0Y250X3QKK21wel9zY2FuMSAoY29uc3QgbXB6X3QgdSwgbXBfYml0Y250X3Qgc3RhcnRpbmdfYml0KQoreworICBtcF9wdHIgdXA7CisgIG1wX3NpemVfdCB1cywgdW4sIGk7CisgIG1wX2xpbWJfdCBsaW1iLCB1eDsKKworICB1cyA9IHUtPl9tcF9zaXplOworICB1biA9IEdNUF9BQlMgKHVzKTsKKyAgaSA9IHN0YXJ0aW5nX2JpdCAvIEdNUF9MSU1CX0JJVFM7CisKKyAgLyogUGFzdCB0aGUgZW5kIHRoZXJlJ3Mgbm8gMSBiaXRzIGZvciB1Pj0wLCBvciBhbiBpbW1lZGlhdGUgMSBiaXQKKyAgICAgZm9yIHU8MC4gTm90aWNlIHRoaXMgdGVzdCBwaWNrcyB1cCBhbnkgdT09MCB0b28uICovCisgIGlmIChpID49IHVuKQorICAgIHJldHVybiAodXMgPj0gMCA/IH4obXBfYml0Y250X3QpIDAgOiBzdGFydGluZ19iaXQpOworCisgIHVwID0gdS0+X21wX2Q7CisgIHV4ID0gMDsKKyAgbGltYiA9IHVwW2ldOworCisgIGlmIChzdGFydGluZ19iaXQgIT0gMCkKKyAgICB7CisgICAgICBpZiAodXMgPCAwKQorCXsKKwkgIHV4ID0gbXBuX3plcm9fcCAodXAsIGkpOworCSAgbGltYiA9IH4gbGltYiArIHV4OworCSAgdXggPSAtIChtcF9saW1iX3QpIChsaW1iID49IHV4KTsKKwl9CisKKyAgICAgIC8qIE1hc2sgdG8gMCBhbGwgYml0cyBiZWZvcmUgc3RhcnRpbmdfYml0LCB0aHVzIGlnbm9yaW5nIHRoZW0uICovCisgICAgICBsaW1iICY9IEdNUF9MSU1CX01BWCA8PCAoc3RhcnRpbmdfYml0ICUgR01QX0xJTUJfQklUUyk7CisgICAgfQorCisgIHJldHVybiBtcG5fY29tbW9uX3NjYW4gKGxpbWIsIGksIHVwLCB1biwgdXgpOworfQorCittcF9iaXRjbnRfdAorbXB6X3NjYW4wIChjb25zdCBtcHpfdCB1LCBtcF9iaXRjbnRfdCBzdGFydGluZ19iaXQpCit7CisgIG1wX3B0ciB1cDsKKyAgbXBfc2l6ZV90IHVzLCB1biwgaTsKKyAgbXBfbGltYl90IGxpbWIsIHV4OworCisgIHVzID0gdS0+X21wX3NpemU7CisgIHV4ID0gLSAobXBfbGltYl90KSAodXMgPj0gMCk7CisgIHVuID0gR01QX0FCUyAodXMpOworICBpID0gc3RhcnRpbmdfYml0IC8gR01QX0xJTUJfQklUUzsKKworICAvKiBXaGVuIHBhc3QgZW5kLCB0aGVyZSdzIGFuIGltbWVkaWF0ZSAwIGJpdCBmb3IgdT49MCwgb3Igbm8gMCBiaXRzIGZvcgorICAgICB1PDAuICBOb3RpY2UgdGhpcyB0ZXN0IHBpY2tzIHVwIGFsbCBjYXNlcyBvZiB1PT0wIHRvby4gKi8KKyAgaWYgKGkgPj0gdW4pCisgICAgcmV0dXJuICh1eCA/IHN0YXJ0aW5nX2JpdCA6IH4obXBfYml0Y250X3QpIDApOworCisgIHVwID0gdS0+X21wX2Q7CisgIGxpbWIgPSB1cFtpXSBeIHV4OworCisgIGlmICh1eCA9PSAwKQorICAgIGxpbWIgLT0gbXBuX3plcm9fcCAodXAsIGkpOyAvKiBsaW1iID0gfih+bGltYiArIHplcm9fcCkgKi8KKworICAvKiBNYXNrIGFsbCBiaXRzIGJlZm9yZSBzdGFydGluZ19iaXQsIHRodXMgaWdub3JpbmcgdGhlbS4gKi8KKyAgbGltYiAmPSBHTVBfTElNQl9NQVggPDwgKHN0YXJ0aW5nX2JpdCAlIEdNUF9MSU1CX0JJVFMpOworCisgIHJldHVybiBtcG5fY29tbW9uX3NjYW4gKGxpbWIsIGksIHVwLCB1biwgdXgpOworfQorCisMCisvKiBNUFogYmFzZSBjb252ZXJzaW9uLiAqLworCitzaXplX3QKK21wel9zaXplaW5iYXNlIChjb25zdCBtcHpfdCB1LCBpbnQgYmFzZSkKK3sKKyAgbXBfc2l6ZV90IHVuLCB0bjsKKyAgbXBfc3JjcHRyIHVwOworICBtcF9wdHIgdHA7CisgIG1wX2JpdGNudF90IGJpdHM7CisgIHN0cnVjdCBnbXBfZGl2X2ludmVyc2UgYmk7CisgIHNpemVfdCBuZGlnaXRzOworCisgIGFzc2VydCAoYmFzZSA+PSAyKTsKKyAgYXNzZXJ0IChiYXNlIDw9IDYyKTsKKworICB1biA9IEdNUF9BQlMgKHUtPl9tcF9zaXplKTsKKyAgaWYgKHVuID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgdXAgPSB1LT5fbXBfZDsKKworICBiaXRzID0gKHVuIC0gMSkgKiBHTVBfTElNQl9CSVRTICsgbXBuX2xpbWJfc2l6ZV9pbl9iYXNlXzIgKHVwW3VuLTFdKTsKKyAgc3dpdGNoIChiYXNlKQorICAgIHsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gYml0czsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gKGJpdHMgKyAxKSAvIDI7CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuIChiaXRzICsgMikgLyAzOworICAgIGNhc2UgMTY6CisgICAgICByZXR1cm4gKGJpdHMgKyAzKSAvIDQ7CisgICAgY2FzZSAzMjoKKyAgICAgIHJldHVybiAoYml0cyArIDQpIC8gNTsKKyAgICAgIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgbW9yZSBjbGV2ZXIgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBiYXNlCisJIDEwLiAqLworICAgIH0KKworICB0cCA9IGdtcF9hbGxvY19saW1icyAodW4pOworICBtcG5fY29weWkgKHRwLCB1cCwgdW4pOworICBtcG5fZGl2X3FyXzFfaW52ZXJ0ICgmYmksIGJhc2UpOworCisgIHRuID0gdW47CisgIG5kaWdpdHMgPSAwOworICBkbworICAgIHsKKyAgICAgIG5kaWdpdHMrKzsKKyAgICAgIG1wbl9kaXZfcXJfMV9wcmVpbnYgKHRwLCB0cCwgdG4sICZiaSk7CisgICAgICB0biAtPSAodHBbdG4tMV0gPT0gMCk7CisgICAgfQorICB3aGlsZSAodG4gPiAwKTsKKworICBnbXBfZnJlZV9saW1icyAodHAsIHVuKTsKKyAgcmV0dXJuIG5kaWdpdHM7Cit9CisKK2NoYXIgKgorbXB6X2dldF9zdHIgKGNoYXIgKnNwLCBpbnQgYmFzZSwgY29uc3QgbXB6X3QgdSkKK3sKKyAgdW5zaWduZWQgYml0czsKKyAgY29uc3QgY2hhciAqZGlnaXRzOworICBtcF9zaXplX3QgdW47CisgIHNpemVfdCBpLCBzbiwgb3NuOworCisgIGRpZ2l0cyA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgIGlmIChiYXNlID4gMSkKKyAgICB7CisgICAgICBpZiAoYmFzZSA8PSAzNikKKwlkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgICAgIGVsc2UgaWYgKGJhc2UgPiA2MikKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKGJhc2UgPj0gLTEpCisgICAgYmFzZSA9IDEwOworICBlbHNlCisgICAgeworICAgICAgYmFzZSA9IC1iYXNlOworICAgICAgaWYgKGJhc2UgPiAzNikKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgc24gPSAxICsgbXB6X3NpemVpbmJhc2UgKHUsIGJhc2UpOworICBpZiAoIXNwKQorICAgIHsKKyAgICAgIG9zbiA9IDEgKyBzbjsKKyAgICAgIHNwID0gKGNoYXIgKikgZ21wX2FsbG9jIChvc24pOworICAgIH0KKyAgZWxzZQorICAgIG9zbiA9IDA7CisgIHVuID0gR01QX0FCUyAodS0+X21wX3NpemUpOworCisgIGlmICh1biA9PSAwKQorICAgIHsKKyAgICAgIHNwWzBdID0gJzAnOworICAgICAgc24gPSAxOworICAgICAgZ290byByZXQ7CisgICAgfQorCisgIGkgPSAwOworCisgIGlmICh1LT5fbXBfc2l6ZSA8IDApCisgICAgc3BbaSsrXSA9ICctJzsKKworICBiaXRzID0gbXBuX2Jhc2VfcG93ZXJfb2ZfdHdvX3AgKGJhc2UpOworCisgIGlmIChiaXRzKQorICAgIC8qIE5vdCBtb2RpZmllZCBpbiB0aGlzIGNhc2UuICovCisgICAgc24gPSBpICsgbXBuX2dldF9zdHJfYml0cyAoKHVuc2lnbmVkIGNoYXIgKikgc3AgKyBpLCBiaXRzLCB1LT5fbXBfZCwgdW4pOworICBlbHNlCisgICAgeworICAgICAgc3RydWN0IG1wbl9iYXNlX2luZm8gaW5mbzsKKyAgICAgIG1wX3B0ciB0cDsKKworICAgICAgbXBuX2dldF9iYXNlX2luZm8gKCZpbmZvLCBiYXNlKTsKKyAgICAgIHRwID0gZ21wX2FsbG9jX2xpbWJzICh1bik7CisgICAgICBtcG5fY29weWkgKHRwLCB1LT5fbXBfZCwgdW4pOworCisgICAgICBzbiA9IGkgKyBtcG5fZ2V0X3N0cl9vdGhlciAoKHVuc2lnbmVkIGNoYXIgKikgc3AgKyBpLCBiYXNlLCAmaW5mbywgdHAsIHVuKTsKKyAgICAgIGdtcF9mcmVlX2xpbWJzICh0cCwgdW4pOworICAgIH0KKworICBmb3IgKDsgaSA8IHNuOyBpKyspCisgICAgc3BbaV0gPSBkaWdpdHNbKHVuc2lnbmVkIGNoYXIpIHNwW2ldXTsKKworcmV0OgorICBzcFtzbl0gPSAnXDAnOworICBpZiAob3NuICYmIG9zbiAhPSBzbiArIDEpCisgICAgc3AgPSAoY2hhciopIGdtcF9yZWFsbG9jIChzcCwgb3NuLCBzbiArIDEpOworICByZXR1cm4gc3A7Cit9CisKK2ludAorbXB6X3NldF9zdHIgKG1wel90IHIsIGNvbnN0IGNoYXIgKnNwLCBpbnQgYmFzZSkKK3sKKyAgdW5zaWduZWQgYml0cywgdmFsdWVfb2ZfYTsKKyAgbXBfc2l6ZV90IHJuLCBhbGxvYzsKKyAgbXBfcHRyIHJwOworICBzaXplX3QgZG4sIHNuOworICBpbnQgc2lnbjsKKyAgdW5zaWduZWQgY2hhciAqZHA7CisKKyAgYXNzZXJ0IChiYXNlID09IDAgfHwgKGJhc2UgPj0gMiAmJiBiYXNlIDw9IDYyKSk7CisKKyAgd2hpbGUgKGlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSAqc3ApKQorICAgIHNwKys7CisKKyAgc2lnbiA9ICgqc3AgPT0gJy0nKTsKKyAgc3AgKz0gc2lnbjsKKworICBpZiAoYmFzZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChzcFswXSA9PSAnMCcpCisJeworCSAgaWYgKHNwWzFdID09ICd4JyB8fCBzcFsxXSA9PSAnWCcpCisJICAgIHsKKwkgICAgICBiYXNlID0gMTY7CisJICAgICAgc3AgKz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3BbMV0gPT0gJ2InIHx8IHNwWzFdID09ICdCJykKKwkgICAgeworCSAgICAgIGJhc2UgPSAyOworCSAgICAgIHNwICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYmFzZSA9IDg7CisJfQorICAgICAgZWxzZQorCWJhc2UgPSAxMDsKKyAgICB9CisKKyAgaWYgKCEqc3ApCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgc24gPSBzdHJsZW4oc3ApOworICBkcCA9ICh1bnNpZ25lZCBjaGFyICopIGdtcF9hbGxvYyAoc24pOworCisgIHZhbHVlX29mX2EgPSAoYmFzZSA+IDM2KSA/IDM2IDogMTA7CisgIGZvciAoZG4gPSAwOyAqc3A7IHNwKyspCisgICAgeworICAgICAgdW5zaWduZWQgZGlnaXQ7CisKKyAgICAgIGlmIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNwKSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKCpzcCA+PSAnMCcgJiYgKnNwIDw9ICc5JykKKwlkaWdpdCA9ICpzcCAtICcwJzsKKyAgICAgIGVsc2UgaWYgKCpzcCA+PSAnYScgJiYgKnNwIDw9ICd6JykKKwlkaWdpdCA9ICpzcCAtICdhJyArIHZhbHVlX29mX2E7CisgICAgICBlbHNlIGlmICgqc3AgPj0gJ0EnICYmICpzcCA8PSAnWicpCisJZGlnaXQgPSAqc3AgLSAnQScgKyAxMDsKKyAgICAgIGVsc2UKKwlkaWdpdCA9IGJhc2U7IC8qIGZhaWwgKi8KKworICAgICAgaWYgKGRpZ2l0ID49ICh1bnNpZ25lZCkgYmFzZSkKKwl7CisJICBnbXBfZnJlZSAoZHAsIHNuKTsKKwkgIHItPl9tcF9zaXplID0gMDsKKwkgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIGRwW2RuKytdID0gZGlnaXQ7CisgICAgfQorCisgIGlmICghZG4pCisgICAgeworICAgICAgZ21wX2ZyZWUgKGRwLCBzbik7CisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBiaXRzID0gbXBuX2Jhc2VfcG93ZXJfb2ZfdHdvX3AgKGJhc2UpOworCisgIGlmIChiaXRzID4gMCkKKyAgICB7CisgICAgICBhbGxvYyA9IChkbiAqIGJpdHMgKyBHTVBfTElNQl9CSVRTIC0gMSkgLyBHTVBfTElNQl9CSVRTOworICAgICAgcnAgPSBNUFpfUkVBTExPQyAociwgYWxsb2MpOworICAgICAgcm4gPSBtcG5fc2V0X3N0cl9iaXRzIChycCwgZHAsIGRuLCBiaXRzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgbXBuX2Jhc2VfaW5mbyBpbmZvOworICAgICAgbXBuX2dldF9iYXNlX2luZm8gKCZpbmZvLCBiYXNlKTsKKyAgICAgIGFsbG9jID0gKGRuICsgaW5mby5leHAgLSAxKSAvIGluZm8uZXhwOworICAgICAgcnAgPSBNUFpfUkVBTExPQyAociwgYWxsb2MpOworICAgICAgcm4gPSBtcG5fc2V0X3N0cl9vdGhlciAocnAsIGRwLCBkbiwgYmFzZSwgJmluZm8pOworICAgICAgLyogTm9ybWFsaXphdGlvbiwgbmVlZGVkIGZvciBhbGwtemVybyBpbnB1dC4gKi8KKyAgICAgIGFzc2VydCAocm4gPiAwKTsKKyAgICAgIHJuIC09IHJwW3JuLTFdID09IDA7CisgICAgfQorICBhc3NlcnQgKHJuIDw9IGFsbG9jKTsKKyAgZ21wX2ZyZWUgKGRwLCBzbik7CisKKyAgci0+X21wX3NpemUgPSBzaWduID8gLSBybiA6IHJuOworCisgIHJldHVybiAwOworfQorCitpbnQKK21wel9pbml0X3NldF9zdHIgKG1wel90IHIsIGNvbnN0IGNoYXIgKnNwLCBpbnQgYmFzZSkKK3sKKyAgbXB6X2luaXQgKHIpOworICByZXR1cm4gbXB6X3NldF9zdHIgKHIsIHNwLCBiYXNlKTsKK30KKworc2l6ZV90CittcHpfb3V0X3N0ciAoRklMRSAqc3RyZWFtLCBpbnQgYmFzZSwgY29uc3QgbXB6X3QgeCkKK3sKKyAgY2hhciAqc3RyOworICBzaXplX3QgbGVuLCBuOworCisgIHN0ciA9IG1wel9nZXRfc3RyIChOVUxMLCBiYXNlLCB4KTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuIDA7CisgIGxlbiA9IHN0cmxlbiAoc3RyKTsKKyAgbiA9IGZ3cml0ZSAoc3RyLCAxLCBsZW4sIHN0cmVhbSk7CisgIGdtcF9mcmVlIChzdHIsIGxlbiArIDEpOworICByZXR1cm4gbjsKK30KKworDAorc3RhdGljIGludAorZ21wX2RldGVjdF9lbmRpYW4gKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBpbnQgaSA9IDI7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSAmaTsKKyAgcmV0dXJuIDEgLSAqcDsKK30KKworLyogSW1wb3J0IGFuZCBleHBvcnQuIERvZXMgbm90IHN1cHBvcnQgbmFpbHMuICovCit2b2lkCittcHpfaW1wb3J0IChtcHpfdCByLCBzaXplX3QgY291bnQsIGludCBvcmRlciwgc2l6ZV90IHNpemUsIGludCBlbmRpYW4sCisJICAgIHNpemVfdCBuYWlscywgY29uc3Qgdm9pZCAqc3JjKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworICBwdHJkaWZmX3Qgd29yZF9zdGVwOworICBtcF9wdHIgcnA7CisgIG1wX3NpemVfdCBybjsKKworICAvKiBUaGUgY3VycmVudCAocGFydGlhbCkgbGltYi4gKi8KKyAgbXBfbGltYl90IGxpbWI7CisgIC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBjb3BpZWQgdG8gdGhpcyBsaW1iIChzdGFydGluZyBmcm9tCisgICAgIHRoZSBsb3cgZW5kKS4gKi8KKyAgc2l6ZV90IGJ5dGVzOworICAvKiBUaGUgaW5kZXggd2hlcmUgdGhlIGxpbWIgc2hvdWxkIGJlIHN0b3JlZCwgd2hlbiBjb21wbGV0ZWQuICovCisgIG1wX3NpemVfdCBpOworCisgIGlmIChuYWlscyAhPSAwKQorICAgIGdtcF9kaWUgKCJtcHpfaW1wb3J0OiBOYWlscyBub3Qgc3VwcG9ydGVkLiIpOworCisgIGFzc2VydCAob3JkZXIgPT0gMSB8fCBvcmRlciA9PSAtMSk7CisgIGFzc2VydCAoZW5kaWFuID49IC0xICYmIGVuZGlhbiA8PSAxKTsKKworICBpZiAoZW5kaWFuID09IDApCisgICAgZW5kaWFuID0gZ21wX2RldGVjdF9lbmRpYW4gKCk7CisKKyAgcCA9ICh1bnNpZ25lZCBjaGFyICopIHNyYzsKKworICB3b3JkX3N0ZXAgPSAob3JkZXIgIT0gZW5kaWFuKSA/IDIgKiBzaXplIDogMDsKKworICAvKiBQcm9jZXNzIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGVuZCwgc28gcG9pbnQgcCBhdCB0aGUKKyAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZC4gKi8KKyAgaWYgKG9yZGVyID09IDEpCisgICAgeworICAgICAgcCArPSBzaXplICogKGNvdW50IC0gMSk7CisgICAgICB3b3JkX3N0ZXAgPSAtIHdvcmRfc3RlcDsKKyAgICB9CisKKyAgLyogQW5kIGF0IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhhdCB3b3JkLiAqLworICBpZiAoZW5kaWFuID09IDEpCisgICAgcCArPSAoc2l6ZSAtIDEpOworCisgIHJuID0gKHNpemUgKiBjb3VudCArIHNpemVvZihtcF9saW1iX3QpIC0gMSkgLyBzaXplb2YobXBfbGltYl90KTsKKyAgcnAgPSBNUFpfUkVBTExPQyAociwgcm4pOworCisgIGZvciAobGltYiA9IDAsIGJ5dGVzID0gMCwgaSA9IDA7IGNvdW50ID4gMDsgY291bnQtLSwgcCArPSB3b3JkX3N0ZXApCisgICAgeworICAgICAgc2l6ZV90IGo7CisgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrLCBwIC09IChwdHJkaWZmX3QpIGVuZGlhbikKKwl7CisJICBsaW1iIHw9IChtcF9saW1iX3QpICpwIDw8IChieXRlcysrICogQ0hBUl9CSVQpOworCSAgaWYgKGJ5dGVzID09IHNpemVvZihtcF9saW1iX3QpKQorCSAgICB7CisJICAgICAgcnBbaSsrXSA9IGxpbWI7CisJICAgICAgYnl0ZXMgPSAwOworCSAgICAgIGxpbWIgPSAwOworCSAgICB9CisJfQorICAgIH0KKyAgYXNzZXJ0IChpICsgKGJ5dGVzID4gMCkgPT0gcm4pOworICBpZiAobGltYiAhPSAwKQorICAgIHJwW2krK10gPSBsaW1iOworICBlbHNlCisgICAgaSA9IG1wbl9ub3JtYWxpemVkX3NpemUgKHJwLCBpKTsKKworICByLT5fbXBfc2l6ZSA9IGk7Cit9CisKK3ZvaWQgKgorbXB6X2V4cG9ydCAodm9pZCAqciwgc2l6ZV90ICpjb3VudHAsIGludCBvcmRlciwgc2l6ZV90IHNpemUsIGludCBlbmRpYW4sCisJICAgIHNpemVfdCBuYWlscywgY29uc3QgbXB6X3QgdSkKK3sKKyAgc2l6ZV90IGNvdW50OworICBtcF9zaXplX3QgdW47CisKKyAgaWYgKG5haWxzICE9IDApCisgICAgZ21wX2RpZSAoIm1wel9leHBvcnQ6IE5haWxzIG5vdCBzdXBwb3J0ZWQuIik7CisKKyAgYXNzZXJ0IChvcmRlciA9PSAxIHx8IG9yZGVyID09IC0xKTsKKyAgYXNzZXJ0IChlbmRpYW4gPj0gLTEgJiYgZW5kaWFuIDw9IDEpOworICBhc3NlcnQgKHNpemUgPiAwIHx8IHUtPl9tcF9zaXplID09IDApOworCisgIHVuID0gdS0+X21wX3NpemU7CisgIGNvdW50ID0gMDsKKyAgaWYgKHVuICE9IDApCisgICAgeworICAgICAgc2l6ZV90IGs7CisgICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICAgcHRyZGlmZl90IHdvcmRfc3RlcDsKKyAgICAgIC8qIFRoZSBjdXJyZW50IChwYXJ0aWFsKSBsaW1iLiAqLworICAgICAgbXBfbGltYl90IGxpbWI7CisgICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gZG8gaW4gdGhpcyBsaW1iLiAqLworICAgICAgc2l6ZV90IGJ5dGVzOworICAgICAgLyogVGhlIGluZGV4IHdoZXJlIHRoZSBsaW1iIHdhcyByZWFkLiAqLworICAgICAgbXBfc2l6ZV90IGk7CisKKyAgICAgIHVuID0gR01QX0FCUyAodW4pOworCisgICAgICAvKiBDb3VudCBieXRlcyBpbiB0b3AgbGltYi4gKi8KKyAgICAgIGxpbWIgPSB1LT5fbXBfZFt1bi0xXTsKKyAgICAgIGFzc2VydCAobGltYiAhPSAwKTsKKworICAgICAgayA9IChHTVBfTElNQl9CSVRTIDw9IENIQVJfQklUKTsKKyAgICAgIGlmICghaykKKwl7CisJICBkbyB7CisJICAgIGludCBMT0NBTF9DSEFSX0JJVCA9IENIQVJfQklUOworCSAgICBrKys7IGxpbWIgPj49IExPQ0FMX0NIQVJfQklUOworCSAgfSB3aGlsZSAobGltYiAhPSAwKTsKKwl9CisgICAgICAvKiBlbHNlIGxpbWIgPSAwOyAqLworCisgICAgICBjb3VudCA9IChrICsgKHVuLTEpICogc2l6ZW9mIChtcF9saW1iX3QpICsgc2l6ZSAtIDEpIC8gc2l6ZTsKKworICAgICAgaWYgKCFyKQorCXIgPSBnbXBfYWxsb2MgKGNvdW50ICogc2l6ZSk7CisKKyAgICAgIGlmIChlbmRpYW4gPT0gMCkKKwllbmRpYW4gPSBnbXBfZGV0ZWN0X2VuZGlhbiAoKTsKKworICAgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIHI7CisKKyAgICAgIHdvcmRfc3RlcCA9IChvcmRlciAhPSBlbmRpYW4pID8gMiAqIHNpemUgOiAwOworCisgICAgICAvKiBQcm9jZXNzIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGVuZCwgc28gcG9pbnQgcCBhdCB0aGUKKwkgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZC4gKi8KKyAgICAgIGlmIChvcmRlciA9PSAxKQorCXsKKwkgIHAgKz0gc2l6ZSAqIChjb3VudCAtIDEpOworCSAgd29yZF9zdGVwID0gLSB3b3JkX3N0ZXA7CisJfQorCisgICAgICAvKiBBbmQgYXQgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGF0IHdvcmQuICovCisgICAgICBpZiAoZW5kaWFuID09IDEpCisJcCArPSAoc2l6ZSAtIDEpOworCisgICAgICBmb3IgKGJ5dGVzID0gMCwgaSA9IDAsIGsgPSAwOyBrIDwgY291bnQ7IGsrKywgcCArPSB3b3JkX3N0ZXApCisJeworCSAgc2l6ZV90IGo7CisJICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqLCBwIC09IChwdHJkaWZmX3QpIGVuZGlhbikKKwkgICAgeworCSAgICAgIGlmIChzaXplb2YgKG1wX2xpbWJfdCkgPT0gMSkKKwkJeworCQkgIGlmIChpIDwgdW4pCisJCSAgICAqcCA9IHUtPl9tcF9kW2krK107CisJCSAgZWxzZQorCQkgICAgKnAgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaW50IExPQ0FMX0NIQVJfQklUID0gQ0hBUl9CSVQ7CisJCSAgaWYgKGJ5dGVzID09IDApCisJCSAgICB7CisJCSAgICAgIGlmIChpIDwgdW4pCisJCQlsaW1iID0gdS0+X21wX2RbaSsrXTsKKwkJICAgICAgYnl0ZXMgPSBzaXplb2YgKG1wX2xpbWJfdCk7CisJCSAgICB9CisJCSAgKnAgPSBsaW1iOworCQkgIGxpbWIgPj49IExPQ0FMX0NIQVJfQklUOworCQkgIGJ5dGVzLS07CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGFzc2VydCAoaSA9PSB1bik7CisgICAgICBhc3NlcnQgKGsgPT0gY291bnQpOworICAgIH0KKworICBpZiAoY291bnRwKQorICAgICpjb3VudHAgPSBjb3VudDsKKworICByZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL21pbmktZ21wL21pbmktZ21wLmggYi9taW5pLWdtcC9taW5pLWdtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzI0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9taW5pLWdtcC9taW5pLWdtcC5oCkBAIC0wLDAgKzEsMzEwIEBACisvKiBtaW5pLWdtcCwgYSBtaW5pbWFsaXN0aWMgaW1wbGVtZW50YXRpb24gb2YgYSBHTlUgR01QIHN1YnNldC4KKworQ29weXJpZ2h0IDIwMTEtMjAxNSwgMjAxNywgMjAxOS0yMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBBYm91dCBtaW5pLWdtcDogVGhpcyBpcyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBzdWJzZXQgb2YgdGhlCisgICBHTVAgaW50ZXJmYWNlLiBJdCBpcyBpbnRlbmRlZCBmb3IgaW5jbHVzaW9uIGludG8gYXBwbGljYXRpb25zIHdoaWNoCisgICBoYXZlIG1vZGVzdCBiaWdudW1zIG5lZWRzLCBhcyBhIGZhbGxiYWNrIHdoZW4gdGhlIHJlYWwgR01QIGxpYnJhcnkKKyAgIGlzIG5vdCBpbnN0YWxsZWQuCisKKyAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAqLworCisjaWZuZGVmIF9fTUlOSV9HTVBfSF9fCisjZGVmaW5lIF9fTUlOSV9HTVBfSF9fCisKKy8qIEZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBtcF9zZXRfbWVtb3J5X2Z1bmN0aW9ucyAodm9pZCAqKCopIChzaXplX3QpLAorCQkJICAgICAgdm9pZCAqKCopICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKKwkJCSAgICAgIHZvaWQgKCopICh2b2lkICosIHNpemVfdCkpOworCit2b2lkIG1wX2dldF9tZW1vcnlfZnVuY3Rpb25zICh2b2lkICooKiopIChzaXplX3QpLAorCQkJICAgICAgdm9pZCAqKCoqKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisJCQkgICAgICB2b2lkICgqKikgKHZvaWQgKiwgc2l6ZV90KSk7CisKKyNpZm5kZWYgTUlOSV9HTVBfTElNQl9UWVBFCisjZGVmaW5lIE1JTklfR01QX0xJTUJfVFlQRSBsb25nCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBNSU5JX0dNUF9MSU1CX1RZUEUgbXBfbGltYl90OwordHlwZWRlZiBsb25nIG1wX3NpemVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtcF9iaXRjbnRfdDsKKwordHlwZWRlZiBtcF9saW1iX3QgKm1wX3B0cjsKK3R5cGVkZWYgY29uc3QgbXBfbGltYl90ICptcF9zcmNwdHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfbXBfYWxsb2M7CQkvKiBOdW1iZXIgb2YgKmxpbWJzKiBhbGxvY2F0ZWQgYW5kIHBvaW50ZWQKKwkJCQkgICB0byBieSB0aGUgX21wX2QgZmllbGQuICAqLworICBpbnQgX21wX3NpemU7CQkJLyogYWJzKF9tcF9zaXplKSBpcyB0aGUgbnVtYmVyIG9mIGxpbWJzIHRoZQorCQkJCSAgIGxhc3QgZmllbGQgcG9pbnRzIHRvLiAgSWYgX21wX3NpemUgaXMKKwkJCQkgICBuZWdhdGl2ZSB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiAgKi8KKyAgbXBfbGltYl90ICpfbXBfZDsJCS8qIFBvaW50ZXIgdG8gdGhlIGxpbWJzLiAgKi8KK30gX19tcHpfc3RydWN0OworCit0eXBlZGVmIF9fbXB6X3N0cnVjdCBtcHpfdFsxXTsKKwordHlwZWRlZiBfX21wel9zdHJ1Y3QgKm1wel9wdHI7Cit0eXBlZGVmIGNvbnN0IF9fbXB6X3N0cnVjdCAqbXB6X3NyY3B0cjsKKworZXh0ZXJuIGNvbnN0IGludCBtcF9iaXRzX3Blcl9saW1iOworCit2b2lkIG1wbl9jb3B5aSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIG1wbl9jb3B5ZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIG1wbl96ZXJvIChtcF9wdHIsIG1wX3NpemVfdCk7CisKK2ludCBtcG5fY21wIChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK2ludCBtcG5femVyb19wIChtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKK21wX2xpbWJfdCBtcG5fYWRkXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgbXBuX2FkZF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IG1wbl9hZGQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworbXBfbGltYl90IG1wbl9zdWJfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCBtcG5fc3ViX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgbXBuX3N1YiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgbXBuX211bF8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworbXBfbGltYl90IG1wbl9hZGRtdWxfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCBtcG5fc3VibXVsXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKK21wX2xpbWJfdCBtcG5fbXVsIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIG1wbl9tdWxfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgbXBuX3NxciAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CitpbnQgbXBuX3BlcmZlY3Rfc3F1YXJlX3AgKG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX3NpemVfdCBtcG5fc3FydHJlbSAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworbXBfbGltYl90IG1wbl9sc2hpZnQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCk7CittcF9saW1iX3QgbXBuX3JzaGlmdCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KTsKKworbXBfYml0Y250X3QgbXBuX3NjYW4wIChtcF9zcmNwdHIsIG1wX2JpdGNudF90KTsKK21wX2JpdGNudF90IG1wbl9zY2FuMSAobXBfc3JjcHRyLCBtcF9iaXRjbnRfdCk7CisKK3ZvaWQgbXBuX2NvbSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgbXBuX25lZyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKK21wX2JpdGNudF90IG1wbl9wb3Bjb3VudCAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgbXBuX2ludmVydF8zYnkyIChtcF9saW1iX3QsIG1wX2xpbWJfdCk7CisjZGVmaW5lIG1wbl9pbnZlcnRfbGltYih4KSBtcG5faW52ZXJ0XzNieTIgKCh4KSwgMCkKKworc2l6ZV90IG1wbl9nZXRfc3RyICh1bnNpZ25lZCBjaGFyICosIGludCwgbXBfcHRyLCBtcF9zaXplX3QpOworbXBfc2l6ZV90IG1wbl9zZXRfc3RyIChtcF9wdHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90LCBpbnQpOworCit2b2lkIG1wel9pbml0IChtcHpfdCk7Cit2b2lkIG1wel9pbml0MiAobXB6X3QsIG1wX2JpdGNudF90KTsKK3ZvaWQgbXB6X2NsZWFyIChtcHpfdCk7CisKKyNkZWZpbmUgbXB6X29kZF9wKHopICAgKCgoeiktPl9tcF9zaXplICE9IDApICYgKGludCkgKHopLT5fbXBfZFswXSkKKyNkZWZpbmUgbXB6X2V2ZW5fcCh6KSAgKCEgbXB6X29kZF9wICh6KSkKKworaW50IG1wel9zZ24gKGNvbnN0IG1wel90KTsKK2ludCBtcHpfY21wX3NpIChjb25zdCBtcHpfdCwgbG9uZyk7CitpbnQgbXB6X2NtcF91aSAoY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOworaW50IG1wel9jbXAgKGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CitpbnQgbXB6X2NtcGFic191aSAoY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOworaW50IG1wel9jbXBhYnMgKGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CitpbnQgbXB6X2NtcF9kIChjb25zdCBtcHpfdCwgZG91YmxlKTsKK2ludCBtcHpfY21wYWJzX2QgKGNvbnN0IG1wel90LCBkb3VibGUpOworCit2b2lkIG1wel9hYnMgKG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel9uZWcgKG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel9zd2FwIChtcHpfdCwgbXB6X3QpOworCit2b2lkIG1wel9hZGRfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIG1wel9hZGQgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfc3ViX3VpIChtcHpfdCwgY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBtcHpfdWlfc3ViIChtcHpfdCwgdW5zaWduZWQgbG9uZywgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfc3ViIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKKwordm9pZCBtcHpfbXVsX3NpIChtcHpfdCwgY29uc3QgbXB6X3QsIGxvbmcgaW50KTsKK3ZvaWQgbXB6X211bF91aSAobXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nIGludCk7Cit2b2lkIG1wel9tdWwgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfbXVsXzJleHAgKG1wel90LCBjb25zdCBtcHpfdCwgbXBfYml0Y250X3QpOwordm9pZCBtcHpfYWRkbXVsX3VpIChtcHpfdCwgY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcgaW50KTsKK3ZvaWQgbXB6X2FkZG11bCAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel9zdWJtdWxfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyBpbnQpOwordm9pZCBtcHpfc3VibXVsIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKKwordm9pZCBtcHpfY2Rpdl9xciAobXB6X3QsIG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfZmRpdl9xciAobXB6X3QsIG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfdGRpdl9xciAobXB6X3QsIG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfY2Rpdl9xIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X2ZkaXZfcSAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel90ZGl2X3EgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfY2Rpdl9yIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X2ZkaXZfciAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel90ZGl2X3IgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOworCit2b2lkIG1wel9jZGl2X3FfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wel9mZGl2X3FfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wel90ZGl2X3FfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wel9jZGl2X3JfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wel9mZGl2X3JfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wel90ZGl2X3JfMmV4cCAobXB6X3QsIGNvbnN0IG1wel90LCBtcF9iaXRjbnRfdCk7CisKK3ZvaWQgbXB6X21vZCAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CisKK3ZvaWQgbXB6X2RpdmV4YWN0IChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKKworaW50IG1wel9kaXZpc2libGVfcCAoY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK2ludCBtcHpfY29uZ3J1ZW50X3AgKGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOworCit1bnNpZ25lZCBsb25nIG1wel9jZGl2X3FyX3VpIChtcHpfdCwgbXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgbXB6X2ZkaXZfcXJfdWkgKG1wel90LCBtcHpfdCwgY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgbG9uZyBtcHpfdGRpdl9xcl91aSAobXB6X3QsIG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9jZGl2X3FfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9mZGl2X3FfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel90ZGl2X3FfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9jZGl2X3JfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9mZGl2X3JfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel90ZGl2X3JfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9jZGl2X3VpIChjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel9mZGl2X3VpIChjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIG1wel90ZGl2X3VpIChjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7CisKK3Vuc2lnbmVkIGxvbmcgbXB6X21vZF91aSAobXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKKwordm9pZCBtcHpfZGl2ZXhhY3RfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7CisKK2ludCBtcHpfZGl2aXNpYmxlX3VpX3AgKGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKKwordW5zaWduZWQgbG9uZyBtcHpfZ2NkX3VpIChtcHpfdCwgY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBtcHpfZ2NkIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X2djZGV4dCAobXB6X3QsIG1wel90LCBtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X2xjbV91aSAobXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgbXB6X2xjbSAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CitpbnQgbXB6X2ludmVydCAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CisKK3ZvaWQgbXB6X3NxcnRyZW0gKG1wel90LCBtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfc3FydCAobXB6X3QsIGNvbnN0IG1wel90KTsKK2ludCBtcHpfcGVyZmVjdF9zcXVhcmVfcCAoY29uc3QgbXB6X3QpOworCit2b2lkIG1wel9wb3dfdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIG1wel91aV9wb3dfdWkgKG1wel90LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgbXB6X3Bvd20gKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X3Bvd21fdWkgKG1wel90LCBjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZywgY29uc3QgbXB6X3QpOworCit2b2lkIG1wel9yb290cmVtIChtcHpfdCwgbXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKK2ludCBtcHpfcm9vdCAobXB6X3QsIGNvbnN0IG1wel90LCB1bnNpZ25lZCBsb25nKTsKKwordm9pZCBtcHpfZmFjX3VpIChtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIG1wel8yZmFjX3VpIChtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIG1wel9tZmFjX3VpdWkgKG1wel90LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgbXB6X2Jpbl91aXVpIChtcHpfdCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKK2ludCBtcHpfcHJvYmFiX3ByaW1lX3AgKGNvbnN0IG1wel90LCBpbnQpOworCitpbnQgbXB6X3RzdGJpdCAoY29uc3QgbXB6X3QsIG1wX2JpdGNudF90KTsKK3ZvaWQgbXB6X3NldGJpdCAobXB6X3QsIG1wX2JpdGNudF90KTsKK3ZvaWQgbXB6X2NscmJpdCAobXB6X3QsIG1wX2JpdGNudF90KTsKK3ZvaWQgbXB6X2NvbWJpdCAobXB6X3QsIG1wX2JpdGNudF90KTsKKwordm9pZCBtcHpfY29tIChtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfYW5kIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXB6X2lvciAobXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7Cit2b2lkIG1wel94b3IgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOworCittcF9iaXRjbnRfdCBtcHpfcG9wY291bnQgKGNvbnN0IG1wel90KTsKK21wX2JpdGNudF90IG1wel9oYW1kaXN0IChjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOworbXBfYml0Y250X3QgbXB6X3NjYW4wIChjb25zdCBtcHpfdCwgbXBfYml0Y250X3QpOworbXBfYml0Y250X3QgbXB6X3NjYW4xIChjb25zdCBtcHpfdCwgbXBfYml0Y250X3QpOworCitpbnQgbXB6X2ZpdHNfc2xvbmdfcCAoY29uc3QgbXB6X3QpOworaW50IG1wel9maXRzX3Vsb25nX3AgKGNvbnN0IG1wel90KTsKK2ludCBtcHpfZml0c19zaW50X3AgKGNvbnN0IG1wel90KTsKK2ludCBtcHpfZml0c191aW50X3AgKGNvbnN0IG1wel90KTsKK2ludCBtcHpfZml0c19zc2hvcnRfcCAoY29uc3QgbXB6X3QpOworaW50IG1wel9maXRzX3VzaG9ydF9wIChjb25zdCBtcHpfdCk7Citsb25nIGludCBtcHpfZ2V0X3NpIChjb25zdCBtcHpfdCk7Cit1bnNpZ25lZCBsb25nIGludCBtcHpfZ2V0X3VpIChjb25zdCBtcHpfdCk7Citkb3VibGUgbXB6X2dldF9kIChjb25zdCBtcHpfdCk7CitzaXplX3QgbXB6X3NpemUgKGNvbnN0IG1wel90KTsKK21wX2xpbWJfdCBtcHpfZ2V0bGltYm4gKGNvbnN0IG1wel90LCBtcF9zaXplX3QpOworCit2b2lkIG1wel9yZWFsbG9jMiAobXB6X3QsIG1wX2JpdGNudF90KTsKK21wX3NyY3B0ciBtcHpfbGltYnNfcmVhZCAobXB6X3NyY3B0cik7CittcF9wdHIgbXB6X2xpbWJzX21vZGlmeSAobXB6X3QsIG1wX3NpemVfdCk7CittcF9wdHIgbXB6X2xpbWJzX3dyaXRlIChtcHpfdCwgbXBfc2l6ZV90KTsKK3ZvaWQgbXB6X2xpbWJzX2ZpbmlzaCAobXB6X3QsIG1wX3NpemVfdCk7CittcHpfc3JjcHRyIG1wel9yb2luaXRfbiAobXB6X3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKworI2RlZmluZSBNUFpfUk9JTklUX04oeHAsIHhzKSB7ezAsICh4cyksKHhwKSB9fQorCit2b2lkIG1wel9zZXRfc2kgKG1wel90LCBzaWduZWQgbG9uZyBpbnQpOwordm9pZCBtcHpfc2V0X3VpIChtcHpfdCwgdW5zaWduZWQgbG9uZyBpbnQpOwordm9pZCBtcHpfc2V0IChtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfc2V0X2QgKG1wel90LCBkb3VibGUpOworCit2b2lkIG1wel9pbml0X3NldF9zaSAobXB6X3QsIHNpZ25lZCBsb25nIGludCk7Cit2b2lkIG1wel9pbml0X3NldF91aSAobXB6X3QsIHVuc2lnbmVkIGxvbmcgaW50KTsKK3ZvaWQgbXB6X2luaXRfc2V0IChtcHpfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHpfaW5pdF9zZXRfZCAobXB6X3QsIGRvdWJsZSk7CisKK3NpemVfdCBtcHpfc2l6ZWluYmFzZSAoY29uc3QgbXB6X3QsIGludCk7CitjaGFyICptcHpfZ2V0X3N0ciAoY2hhciAqLCBpbnQsIGNvbnN0IG1wel90KTsKK2ludCBtcHpfc2V0X3N0ciAobXB6X3QsIGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCBtcHpfaW5pdF9zZXRfc3RyIChtcHpfdCwgY29uc3QgY2hhciAqLCBpbnQpOworCisvKiBUaGlzIGxvbmcgbGlzdCB0YWtlbiBmcm9tIGdtcC5oLiAqLworLyogRm9yIHJlZmVyZW5jZSwgImRlZmluZWQoRU9GKSIgY2Fubm90IGJlIHVzZWQgaGVyZS4gIEluIGcrKyAyLjk1LjQsCisgICA8aW9zdHJlYW0+IGRlZmluZXMgRU9GIGJ1dCBub3QgRklMRS4gICovCisjaWYgZGVmaW5lZCAoRklMRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChIX1NURElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0hfU1RESU8pICAgICAgICAgICAgICAgLyogQUlYICovICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IKSAgICAgICAgICAgICAgIC8qIGdsaWJjLCBTdW4sIFNDTyAqLyAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSF8pICAgICAgICAgICAgICAvKiBCU0QsIE9TRiAqLyAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19IKSAgICAgICAgICAgICAgLyogQm9ybGFuZCAqLyAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fSF9fKSAgICAgICAgICAgIC8qIElSSVggKi8gICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSU5DTFVERUQpICAgICAgICAvKiBIUFVYICovICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19kal9pbmNsdWRlX3N0ZGlvX2hfKSAgLyogREpHUFAgKi8gICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9GSUxFX0RFRklORUQpICAgICAgICAgIC8qIE1pY3Jvc29mdCAqLyAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX18pICAgICAgICAgICAgICAvKiBBcHBsZSBNUFcgTXJDICovICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TTF9TVERJT19IKSAgICAgICAgICAgLyogTWV0cm93ZXJrcyAqLyAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IX0lOQ0xVREVEKSAgICAgIC8qIFFOWDQgKi8JCVwKKyAgfHwgZGVmaW5lZCAoX0lTT19TVERJT19JU09fSCkgICAgICAgLyogU3VuIEMrKyAqLwkJXAorICB8fCBkZWZpbmVkIChfX1NURElPX0xPQURFRCkgICAgICAgICAvKiBWTVMgKi8JCQlcCisgIHx8IGRlZmluZWQgKF9TVERJTykgICAgICAgICAgICAgICAgIC8qIEhQRSBOb25TdG9wICovICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX0RFRklORURfRklMRSkgICAgICAgICAvKiBtdXNsICovCitzaXplX3QgbXB6X291dF9zdHIgKEZJTEUgKiwgaW50LCBjb25zdCBtcHpfdCk7CisjZW5kaWYKKwordm9pZCBtcHpfaW1wb3J0IChtcHpfdCwgc2l6ZV90LCBpbnQsIHNpemVfdCwgaW50LCBzaXplX3QsIGNvbnN0IHZvaWQgKik7Cit2b2lkICptcHpfZXhwb3J0ICh2b2lkICosIHNpemVfdCAqLCBpbnQsIHNpemVfdCwgaW50LCBzaXplX3QsIGNvbnN0IG1wel90KTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogX19NSU5JX0dNUF9IX18gKi8KZGlmZiAtLWdpdCBhL21pbmktZ21wL21pbmktbXBxLmMgYi9taW5pLWdtcC9taW5pLW1wcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2UzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9taW5pLWdtcC9taW5pLW1wcS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKiBtaW5pLW1wcSwgYSBtaW5pbWFsaXN0aWMgaW1wbGVtZW50YXRpb24gb2YgYSBHTlUgR01QIHN1YnNldC4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8KKworICAgQWNrbm93bGVkZ21lbnQ6IHNwZWNpYWwgdGhhbmtzIHRvIEJyYWRsZXkgTHVjaWVyIGZvciBoaXMgY29tbWVudHMKKyAgIHRvIHRoZSBwcmVsaW1pbmFyeSB2ZXJzaW9uIG9mIHRoaXMgY29kZS4KKworQ29weXJpZ2h0IDIwMTgtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJtaW5pLW1wcS5oIgorCisjaWZuZGVmIEdNUF9MSU1CX0hJR0hCSVQKKy8qIERlZmluZSBtYWNyb3MgYW5kIHN0YXRpYyBmdW5jdGlvbnMgYWxyZWFkeSBkZWZpbmVkIGJ5IG1pbmktZ21wLmMgKi8KKyNkZWZpbmUgR01QX0xJTUJfQklUUyAoc2l6ZW9mKG1wX2xpbWJfdCkgKiBDSEFSX0JJVCkKKyNkZWZpbmUgR01QX0xJTUJfSElHSEJJVCAoKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAtIDEpKQorI2RlZmluZSBHTVBfTElNQl9NQVggKChtcF9saW1iX3QpIH4gKG1wX2xpbWJfdCkgMCkKKyNkZWZpbmUgR01QX05FR19DQVNUKFQseCkgKC0oKFQpKCh4KSArIDEpIC0gMSkpCisjZGVmaW5lIEdNUF9NSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworc3RhdGljIG1wel9zcmNwdHIKK21wel9yb2luaXRfbm9ybWFsX24gKG1wel90IHgsIG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IHhzKQoreworICB4LT5fbXBfYWxsb2MgPSAwOworICB4LT5fbXBfZCA9IChtcF9wdHIpIHhwOworICB4LT5fbXBfc2l6ZSA9IHhzOworICByZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQKK2dtcF9kaWUgKGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIG1zZyk7CisgIGFib3J0KCk7Cit9CisjZW5kaWYKKworDAorLyogTVBRIGhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBtcHFfc3JjcHRyCittcHFfcm9pbml0X25vcm1hbF9ubiAobXBxX3QgeCwgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3QgbnMsCisJCSAgICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZHMpCit7CisgIG1wel9yb2luaXRfbm9ybWFsX24gKG1wcV9udW1yZWYoeCksIG5wLCBucyk7CisgIG1wel9yb2luaXRfbm9ybWFsX24gKG1wcV9kZW5yZWYoeCksIGRwLCBkcyk7CisgIHJldHVybiB4OworfQorCitzdGF0aWMgbXBxX3NyY3B0cgorbXBxX3JvaW5pdF96eiAobXBxX3QgeCwgbXB6X3NyY3B0ciBuLCBtcHpfc3JjcHRyIGQpCit7CisgIHJldHVybiBtcHFfcm9pbml0X25vcm1hbF9ubiAoeCwgbi0+X21wX2QsIG4tPl9tcF9zaXplLAorCQkJICAgICAgIGQtPl9tcF9kLCBkLT5fbXBfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHFfbmFuX2luaXQgKG1wcV90IHgpCit7CisgIG1wel9pbml0IChtcHFfbnVtcmVmICh4KSk7CisgIG1wel9pbml0IChtcHFfZGVucmVmICh4KSk7Cit9CisKK3ZvaWQKK21wcV9pbml0IChtcHFfdCB4KQoreworICBtcHpfaW5pdCAobXBxX251bXJlZiAoeCkpOworICBtcHpfaW5pdF9zZXRfdWkgKG1wcV9kZW5yZWYgKHgpLCAxKTsKK30KKwordm9pZAorbXBxX2NsZWFyIChtcHFfdCB4KQoreworICBtcHpfY2xlYXIgKG1wcV9udW1yZWYgKHgpKTsKKyAgbXB6X2NsZWFyIChtcHFfZGVucmVmICh4KSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHFfY2Fub25pY2FsX3NpZ24gKG1wcV90IHIpCit7CisgIG1wX3NpemVfdCBkcyA9IG1wcV9kZW5yZWYgKHIpLT5fbXBfc2l6ZTsKKyAgaWYgKGRzIDw9IDApCisgICAgeworICAgICAgaWYgKGRzID09IDApCisJZ21wX2RpZSgibXBxOiBGcmFjdGlvbiB3aXRoIHplcm8gZGVub21pbmF0b3IuIik7CisgICAgICBtcHpfbmVnIChtcHFfZGVucmVmIChyKSwgbXBxX2RlbnJlZiAocikpOworICAgICAgbXB6X25lZyAobXBxX251bXJlZiAociksIG1wcV9udW1yZWYgKHIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittcHFfaGVscGVyX2Nhbm9uaWNhbGl6ZSAobXBxX3QgciwgY29uc3QgbXB6X3QgbnVtLCBjb25zdCBtcHpfdCBkZW4pCit7CisgIGlmIChudW0tPl9tcF9zaXplID09IDApCisgICAgbXBxX3NldF91aSAociwgMCwgMSk7CisgIGVsc2UKKyAgICB7CisgICAgICBtcHpfdCBnOworCisgICAgICBtcHpfaW5pdCAoZyk7CisgICAgICBtcHpfZ2NkIChnLCBudW0sIGRlbik7CisgICAgICBtcHpfdGRpdl9xIChtcHFfbnVtcmVmIChyKSwgbnVtLCBnKTsKKyAgICAgIG1wel90ZGl2X3EgKG1wcV9kZW5yZWYgKHIpLCBkZW4sIGcpOworICAgICAgbXB6X2NsZWFyIChnKTsKKyAgICAgIG1wcV9jYW5vbmljYWxfc2lnbiAocik7CisgICAgfQorfQorCit2b2lkCittcHFfY2Fub25pY2FsaXplIChtcHFfdCByKQoreworICBtcHFfaGVscGVyX2Nhbm9uaWNhbGl6ZSAociwgbXBxX251bXJlZiAociksIG1wcV9kZW5yZWYgKHIpKTsKK30KKwordm9pZAorbXBxX3N3YXAgKG1wcV90IGEsIG1wcV90IGIpCit7CisgIG1wel9zd2FwIChtcHFfbnVtcmVmIChhKSwgbXBxX251bXJlZiAoYikpOworICBtcHpfc3dhcCAobXBxX2RlbnJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKTsKK30KKworDAorLyogTVBRIGFzc2lnbm1lbnQgYW5kIGNvbnZlcnNpb25zLiAqLwordm9pZAorbXB6X3NldF9xIChtcHpfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfdGRpdl9xIChyLCBtcHFfbnVtcmVmIChxKSwgbXBxX2RlbnJlZiAocSkpOworfQorCit2b2lkCittcHFfc2V0IChtcHFfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfc2V0IChtcHFfbnVtcmVmIChyKSwgbXBxX251bXJlZiAocSkpOworICBtcHpfc2V0IChtcHFfZGVucmVmIChyKSwgbXBxX2RlbnJlZiAocSkpOworfQorCit2b2lkCittcHFfc2V0X3VpIChtcHFfdCByLCB1bnNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgbXB6X3NldF91aSAobXBxX251bXJlZiAociksIG4pOworICBtcHpfc2V0X3VpIChtcHFfZGVucmVmIChyKSwgZCk7Cit9CisKK3ZvaWQKK21wcV9zZXRfc2kgKG1wcV90IHIsIHNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgbXB6X3NldF9zaSAobXBxX251bXJlZiAociksIG4pOworICBtcHpfc2V0X3VpIChtcHFfZGVucmVmIChyKSwgZCk7Cit9CisKK3ZvaWQKK21wcV9zZXRfeiAobXBxX3QgciwgY29uc3QgbXB6X3QgbikKK3sKKyAgbXB6X3NldF91aSAobXBxX2RlbnJlZiAociksIDEpOworICBtcHpfc2V0IChtcHFfbnVtcmVmIChyKSwgbik7Cit9CisKK3ZvaWQKK21wcV9zZXRfbnVtIChtcHFfdCByLCBjb25zdCBtcHpfdCB6KQoreworICBtcHpfc2V0IChtcHFfbnVtcmVmIChyKSwgeik7Cit9CisKK3ZvaWQKK21wcV9zZXRfZGVuIChtcHFfdCByLCBjb25zdCBtcHpfdCB6KQoreworICBtcHpfc2V0IChtcHFfZGVucmVmIChyKSwgeik7Cit9CisKK3ZvaWQKK21wcV9nZXRfbnVtIChtcHpfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfc2V0IChyLCBtcHFfbnVtcmVmIChxKSk7Cit9CisKK3ZvaWQKK21wcV9nZXRfZGVuIChtcHpfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfc2V0IChyLCBtcHFfZGVucmVmIChxKSk7Cit9CisKKwwKKy8qIE1QUSBjb21wYXJpc29ucyBhbmQgdGhlIGxpa2UuICovCitpbnQKK21wcV9jbXAgKGNvbnN0IG1wcV90IGEsIGNvbnN0IG1wcV90IGIpCit7CisgIG1wel90IHQxLCB0MjsKKyAgaW50IHJlczsKKworICBtcHpfaW5pdCAodDEpOworICBtcHpfaW5pdCAodDIpOworICBtcHpfbXVsICh0MSwgbXBxX251bXJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKTsKKyAgbXB6X211bCAodDIsIG1wcV9udW1yZWYgKGIpLCBtcHFfZGVucmVmIChhKSk7CisgIHJlcyA9IG1wel9jbXAgKHQxLCB0Mik7CisgIG1wel9jbGVhciAodDEpOworICBtcHpfY2xlYXIgKHQyKTsKKworICByZXR1cm4gcmVzOworfQorCitpbnQKK21wcV9jbXBfeiAoY29uc3QgbXBxX3QgYSwgY29uc3QgbXB6X3QgYikKK3sKKyAgbXB6X3QgdDsKKyAgaW50IHJlczsKKworICBtcHpfaW5pdCAodCk7CisgIG1wel9tdWwgKHQsIGIsIG1wcV9kZW5yZWYgKGEpKTsKKyAgcmVzID0gbXB6X2NtcCAobXBxX251bXJlZiAoYSksIHQpOworICBtcHpfY2xlYXIgKHQpOworCisgIHJldHVybiByZXM7Cit9CisKK2ludAorbXBxX2VxdWFsIChjb25zdCBtcHFfdCBhLCBjb25zdCBtcHFfdCBiKQoreworICByZXR1cm4gKG1wel9jbXAgKG1wcV9udW1yZWYgKGEpLCBtcHFfbnVtcmVmIChiKSkgPT0gMCkgJiYKKyAgICAobXB6X2NtcCAobXBxX2RlbnJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKSA9PSAwKTsKK30KKworaW50CittcHFfY21wX3VpIChjb25zdCBtcHFfdCBxLCB1bnNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgbXBxX3QgdDsKKyAgYXNzZXJ0IChkICE9IDApOworICBpZiAoVUxPTkdfTUFYIDw9IEdNUF9MSU1CX01BWCkgeworICAgIG1wX2xpbWJfdCBubCA9IG4sIGRsID0gZDsKKyAgICByZXR1cm4gbXBxX2NtcCAocSwgbXBxX3JvaW5pdF9ub3JtYWxfbm4gKHQsICZubCwgbiAhPSAwLCAmZGwsIDEpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgcmV0OworCisgICAgbXBxX25hbl9pbml0ICh0KTsKKyAgICBtcHFfc2V0X3VpICh0LCBuLCBkKTsKKyAgICByZXQgPSBtcHFfY21wIChxLCB0KTsKKyAgICBtcHFfY2xlYXIgKHQpOworCisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitpbnQKK21wcV9jbXBfc2kgKGNvbnN0IG1wcV90IHEsIHNpZ25lZCBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgYXNzZXJ0IChkICE9IDApOworCisgIGlmIChuID49IDApCisgICAgcmV0dXJuIG1wcV9jbXBfdWkgKHEsIG4sIGQpOworICBlbHNlCisgICAgeworICAgICAgbXBxX3QgdDsKKworICAgICAgaWYgKFVMT05HX01BWCA8PSBHTVBfTElNQl9NQVgpCisJeworCSAgbXBfbGltYl90IG5sID0gR01QX05FR19DQVNUICh1bnNpZ25lZCBsb25nLCBuKSwgZGwgPSBkOworCSAgcmV0dXJuIG1wcV9jbXAgKHEsIG1wcV9yb2luaXRfbm9ybWFsX25uICh0LCAmbmwsIC0xLCAmZGwsIDEpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgbG9uZyBsX24gPSBHTVBfTkVHX0NBU1QgKHVuc2lnbmVkIGxvbmcsIG4pOworCisJICBtcHFfcm9pbml0X25vcm1hbF9ubiAodCwgbXBxX251bXJlZiAocSktPl9tcF9kLCAtIG1wcV9udW1yZWYgKHEpLT5fbXBfc2l6ZSwKKwkJCQltcHFfZGVucmVmIChxKS0+X21wX2QsIG1wcV9kZW5yZWYgKHEpLT5fbXBfc2l6ZSk7CisJICByZXR1cm4gLSBtcHFfY21wX3VpICh0LCBsX24sIGQpOworCX0KKyAgICB9Cit9CisKK2ludAorbXBxX3NnbiAoY29uc3QgbXBxX3QgYSkKK3sKKyAgcmV0dXJuIG1wel9zZ24gKG1wcV9udW1yZWYgKGEpKTsKK30KKworDAorLyogTVBRIGFyaXRobWV0aWMuICovCit2b2lkCittcHFfYWJzIChtcHFfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfYWJzIChtcHFfbnVtcmVmIChyKSwgbXBxX251bXJlZiAocSkpOworICBtcHpfc2V0IChtcHFfZGVucmVmIChyKSwgbXBxX2RlbnJlZiAocSkpOworfQorCit2b2lkCittcHFfbmVnIChtcHFfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHpfbmVnIChtcHFfbnVtcmVmIChyKSwgbXBxX251bXJlZiAocSkpOworICBtcHpfc2V0IChtcHFfZGVucmVmIChyKSwgbXBxX2RlbnJlZiAocSkpOworfQorCit2b2lkCittcHFfYWRkIChtcHFfdCByLCBjb25zdCBtcHFfdCBhLCBjb25zdCBtcHFfdCBiKQoreworICBtcHpfdCB0OworCisgIG1wel9pbml0ICh0KTsKKyAgbXB6X2djZCAodCwgbXBxX2RlbnJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKTsKKyAgaWYgKG1wel9jbXBfdWkgKHQsIDEpID09IDApCisgICAgeworICAgICAgbXB6X211bCAodCwgbXBxX251bXJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKTsKKyAgICAgIG1wel9hZGRtdWwgKHQsIG1wcV9udW1yZWYgKGIpLCBtcHFfZGVucmVmIChhKSk7CisgICAgICBtcHpfbXVsIChtcHFfZGVucmVmIChyKSwgbXBxX2RlbnJlZiAoYSksIG1wcV9kZW5yZWYgKGIpKTsKKyAgICAgIG1wel9zd2FwIChtcHFfbnVtcmVmIChyKSwgdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXB6X3QgeCwgeTsKKyAgICAgIG1wel9pbml0ICh4KTsKKyAgICAgIG1wel9pbml0ICh5KTsKKworICAgICAgbXB6X3RkaXZfcSAoeCwgbXBxX2RlbnJlZiAoYiksIHQpOworICAgICAgbXB6X3RkaXZfcSAoeSwgbXBxX2RlbnJlZiAoYSksIHQpOworICAgICAgbXB6X211bCAoeCwgbXBxX251bXJlZiAoYSksIHgpOworICAgICAgbXB6X2FkZG11bCAoeCwgbXBxX251bXJlZiAoYiksIHkpOworCisgICAgICBtcHpfZ2NkICh0LCB4LCB0KTsKKyAgICAgIG1wel90ZGl2X3EgKG1wcV9udW1yZWYgKHIpLCB4LCB0KTsKKyAgICAgIG1wel90ZGl2X3EgKHgsIG1wcV9kZW5yZWYgKGIpLCB0KTsKKyAgICAgIG1wel9tdWwgKG1wcV9kZW5yZWYgKHIpLCB4LCB5KTsKKworICAgICAgbXB6X2NsZWFyICh4KTsKKyAgICAgIG1wel9jbGVhciAoeSk7CisgICAgfQorICBtcHpfY2xlYXIgKHQpOworfQorCit2b2lkCittcHFfc3ViIChtcHFfdCByLCBjb25zdCBtcHFfdCBhLCBjb25zdCBtcHFfdCBiKQoreworICBtcHFfdCB0OworCisgIG1wcV9yb2luaXRfbm9ybWFsX25uICh0LCBtcHFfbnVtcmVmIChiKS0+X21wX2QsIC0gbXBxX251bXJlZiAoYiktPl9tcF9zaXplLAorCQkJbXBxX2RlbnJlZiAoYiktPl9tcF9kLCBtcHFfZGVucmVmIChiKS0+X21wX3NpemUpOworICBtcHFfYWRkIChyLCBhLCB0KTsKK30KKwordm9pZAorbXBxX2RpdiAobXBxX3QgciwgY29uc3QgbXBxX3QgYSwgY29uc3QgbXBxX3QgYikKK3sKKyAgbXBxX3QgdDsKKyAgbXBxX211bCAociwgYSwgbXBxX3JvaW5pdF96eiAodCwgbXBxX2RlbnJlZiAoYiksIG1wcV9udW1yZWYgKGIpKSk7Cit9CisKK3ZvaWQKK21wcV9tdWwgKG1wcV90IHIsIGNvbnN0IG1wcV90IGEsIGNvbnN0IG1wcV90IGIpCit7CisgIG1wcV90IHQ7CisgIG1wcV9uYW5faW5pdCAodCk7CisKKyAgaWYgKGEgIT0gYikgeworICAgIG1wcV9oZWxwZXJfY2Fub25pY2FsaXplICh0LCBtcHFfbnVtcmVmIChhKSwgbXBxX2RlbnJlZiAoYikpOworICAgIG1wcV9oZWxwZXJfY2Fub25pY2FsaXplIChyLCBtcHFfbnVtcmVmIChiKSwgbXBxX2RlbnJlZiAoYSkpOworCisgICAgYSA9IHI7CisgICAgYiA9IHQ7CisgIH0KKworICBtcHpfbXVsIChtcHFfbnVtcmVmIChyKSwgbXBxX251bXJlZiAoYSksIG1wcV9udW1yZWYgKGIpKTsKKyAgbXB6X211bCAobXBxX2RlbnJlZiAociksIG1wcV9kZW5yZWYgKGEpLCBtcHFfZGVucmVmIChiKSk7CisgIG1wcV9jbGVhciAodCk7Cit9CisKK3N0YXRpYyB2b2lkCittcHFfaGVscGVyXzJleHAgKG1wel90IHJuLCBtcHpfdCByZCwgY29uc3QgbXB6X3QgcW4sIGNvbnN0IG1wel90IHFkLCBtcF9iaXRjbnRfdCBlKQoreworICBtcF9iaXRjbnRfdCB6ID0gbXB6X3NjYW4xIChxZCwgMCk7CisgIHogPSBHTVBfTUlOICh6LCBlKTsKKyAgbXB6X211bF8yZXhwIChybiwgcW4sIGUgLSB6KTsKKyAgbXB6X3RkaXZfcV8yZXhwIChyZCwgcWQsIHopOworfQorCit2b2lkCittcHFfZGl2XzJleHAgKG1wcV90IHIsIGNvbnN0IG1wcV90IHEsIG1wX2JpdGNudF90IGUpCit7CisgIG1wcV9oZWxwZXJfMmV4cCAobXBxX2RlbnJlZiAociksIG1wcV9udW1yZWYgKHIpLCBtcHFfZGVucmVmIChxKSwgbXBxX251bXJlZiAocSksIGUpOworfQorCit2b2lkCittcHFfbXVsXzJleHAgKG1wcV90IHIsIGNvbnN0IG1wcV90IHEsIG1wX2JpdGNudF90IGUpCit7CisgIG1wcV9oZWxwZXJfMmV4cCAobXBxX251bXJlZiAociksIG1wcV9kZW5yZWYgKHIpLCBtcHFfbnVtcmVmIChxKSwgbXBxX2RlbnJlZiAocSksIGUpOworfQorCit2b2lkCittcHFfaW52IChtcHFfdCByLCBjb25zdCBtcHFfdCBxKQoreworICBtcHFfc2V0IChyLCBxKTsKKyAgbXB6X3N3YXAgKG1wcV9kZW5yZWYgKHIpLCBtcHFfbnVtcmVmIChyKSk7CisgIG1wcV9jYW5vbmljYWxfc2lnbiAocik7Cit9CisKKwwKKy8qIE1QUSB0by9mcm9tIGRvdWJsZS4gKi8KK3ZvaWQKK21wcV9zZXRfZCAobXBxX3QgciwgZG91YmxlIHgpCit7CisgIG1wel9zZXRfdWkgKG1wcV9kZW5yZWYgKHIpLCAxKTsKKworICAvKiB4ICE9IHggaXMgdHJ1ZSB3aGVuIHggaXMgYSBOYU4sIGFuZCB4ID09IHggKiAwLjUgaXMgdHJ1ZSB3aGVuIHggaXMKKyAgICAgemVybyBvciBpbmZpbml0eS4gKi8KKyAgaWYgKHggPT0geCAqIDAuNSB8fCB4ICE9IHgpCisgICAgbXBxX251bXJlZiAociktPl9tcF9zaXplID0gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRvdWJsZSBCOworICAgICAgbXBfYml0Y250X3QgZTsKKworICAgICAgQiA9IDQuMCAqIChkb3VibGUpIChHTVBfTElNQl9ISUdIQklUID4+IDEpOworICAgICAgZm9yIChlID0gMDsgeCAhPSB4ICsgMC41OyBlICs9IEdNUF9MSU1CX0JJVFMpCisJeCAqPSBCOworCisgICAgICBtcHpfc2V0X2QgKG1wcV9udW1yZWYgKHIpLCB4KTsKKyAgICAgIG1wcV9kaXZfMmV4cCAociwgciwgZSk7CisgICAgfQorfQorCitkb3VibGUKK21wcV9nZXRfZCAoY29uc3QgbXBxX3QgdSkKK3sKKyAgbXBfYml0Y250X3QgbmUsIGRlLCBlZTsKKyAgbXB6X3QgejsKKyAgZG91YmxlIEIsIHJldDsKKworICBuZSA9IG1wel9zaXplaW5iYXNlIChtcHFfbnVtcmVmICh1KSwgMik7CisgIGRlID0gbXB6X3NpemVpbmJhc2UgKG1wcV9kZW5yZWYgKHUpLCAyKTsKKworICBlZSA9IENIQVJfQklUICogc2l6ZW9mIChkb3VibGUpOworICBpZiAoZGUgPT0gMSB8fCBuZSA+IGRlICsgZWUpCisgICAgZWUgPSAwOworICBlbHNlCisgICAgZWUgPSAoZWUgKyBkZSAtIG5lKSAvIEdNUF9MSU1CX0JJVFMgKyAxOworCisgIG1wel9pbml0ICh6KTsKKyAgbXB6X211bF8yZXhwICh6LCBtcHFfbnVtcmVmICh1KSwgZWUgKiBHTVBfTElNQl9CSVRTKTsKKyAgbXB6X3RkaXZfcSAoeiwgeiwgbXBxX2RlbnJlZiAodSkpOworICByZXQgPSBtcHpfZ2V0X2QgKHopOworICBtcHpfY2xlYXIgKHopOworCisgIEIgPSA0LjAgKiAoZG91YmxlKSAoR01QX0xJTUJfSElHSEJJVCA+PiAxKTsKKyAgZm9yIChCID0gMSAvIEI7IGVlICE9IDA7IC0tZWUpCisgICAgcmV0ICo9IEI7CisKKyAgcmV0dXJuIHJldDsKK30KKworDAorLyogTVBRIGFuZCBzdHJpbmdzL3N0cmVhbXMuICovCitjaGFyICoKK21wcV9nZXRfc3RyIChjaGFyICpzcCwgaW50IGJhc2UsIGNvbnN0IG1wcV90IHEpCit7CisgIGNoYXIgKnJlczsKKyAgY2hhciAqcmRlbjsKKyAgc2l6ZV90IGxlbjsKKworICByZXMgPSBtcHpfZ2V0X3N0ciAoc3AsIGJhc2UsIG1wcV9udW1yZWYgKHEpKTsKKyAgaWYgKHJlcyA9PSBOVUxMIHx8IG1wel9jbXBfdWkgKG1wcV9kZW5yZWYgKHEpLCAxKSA9PSAwKQorICAgIHJldHVybiByZXM7CisKKyAgbGVuID0gc3RybGVuIChyZXMpICsgMTsKKyAgcmRlbiA9IHNwID8gc3AgKyBsZW4gOiBOVUxMOworICByZGVuID0gbXB6X2dldF9zdHIgKHJkZW4sIGJhc2UsIG1wcV9kZW5yZWYgKHEpKTsKKyAgYXNzZXJ0IChyZGVuICE9IE5VTEwpOworCisgIGlmIChzcCA9PSBOVUxMKSB7CisgICAgdm9pZCAqICgqZ21wX3JlYWxsb2NhdGVfZnVuYykgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOworICAgIHZvaWQgKCpnbXBfZnJlZV9mdW5jKSAodm9pZCAqLCBzaXplX3QpOworICAgIHNpemVfdCBsZGVuOworCisgICAgbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgKE5VTEwsICZnbXBfcmVhbGxvY2F0ZV9mdW5jLCAmZ21wX2ZyZWVfZnVuYyk7CisgICAgbGRlbiA9IHN0cmxlbiAocmRlbikgKyAxOworICAgIHJlcyA9IChjaGFyICopIGdtcF9yZWFsbG9jYXRlX2Z1bmMgKHJlcywgbGVuLCAobGRlbiArIGxlbikgKiBzaXplb2YgKGNoYXIpKTsKKyAgICBtZW1jcHkgKHJlcyArIGxlbiwgcmRlbiwgbGRlbik7CisgICAgZ21wX2ZyZWVfZnVuYyAocmRlbiwgbGRlbik7CisgIH0KKworICByZXMgW2xlbiAtIDFdID0gJy8nOworICByZXR1cm4gcmVzOworfQorCitzaXplX3QKK21wcV9vdXRfc3RyIChGSUxFICpzdHJlYW0sIGludCBiYXNlLCBjb25zdCBtcHFfdCB4KQoreworICBjaGFyICogc3RyOworICBzaXplX3QgbGVuLCBuOworICB2b2lkICgqZ21wX2ZyZWVfZnVuYykgKHZvaWQgKiwgc2l6ZV90KTsKKworICBzdHIgPSBtcHFfZ2V0X3N0ciAoTlVMTCwgYmFzZSwgeCk7CisgIGlmICghc3RyKQorICAgIHJldHVybiAwOworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIG4gPSBmd3JpdGUgKHN0ciwgMSwgbGVuLCBzdHJlYW0pOworICBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyAoTlVMTCwgTlVMTCwgJmdtcF9mcmVlX2Z1bmMpOworICBnbXBfZnJlZV9mdW5jIChzdHIsIGxlbiArIDEpOworICByZXR1cm4gbjsKK30KKworaW50CittcHFfc2V0X3N0ciAobXBxX3QgciwgY29uc3QgY2hhciAqc3AsIGludCBiYXNlKQoreworICBjb25zdCBjaGFyICpzbGFzaDsKKworICBzbGFzaCA9IHN0cmNociAoc3AsICcvJyk7CisgIGlmIChzbGFzaCA9PSBOVUxMKSB7CisgICAgbXB6X3NldF91aSAobXBxX2RlbnJlZihyKSwgMSk7CisgICAgcmV0dXJuIG1wel9zZXRfc3RyIChtcHFfbnVtcmVmKHIpLCBzcCwgYmFzZSk7CisgIH0gZWxzZSB7CisgICAgY2hhciAqbnVtOworICAgIHNpemVfdCBudW1sZW47CisgICAgaW50IHJldDsKKyAgICB2b2lkICogKCpnbXBfYWxsb2NhdGVfZnVuYykgKHNpemVfdCk7CisgICAgdm9pZCAoKmdtcF9mcmVlX2Z1bmMpICh2b2lkICosIHNpemVfdCk7CisKKyAgICBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyAoJmdtcF9hbGxvY2F0ZV9mdW5jLCBOVUxMLCAmZ21wX2ZyZWVfZnVuYyk7CisgICAgbnVtbGVuID0gc2xhc2ggLSBzcDsKKyAgICBudW0gPSAoY2hhciAqKSBnbXBfYWxsb2NhdGVfZnVuYyAobnVtbGVuICsgMSk7CisgICAgbWVtY3B5IChudW0sIHNwLCBudW1sZW4pOworICAgIG51bVtudW1sZW5dID0gJ1wwJzsKKyAgICByZXQgPSBtcHpfc2V0X3N0ciAobXBxX251bXJlZihyKSwgbnVtLCBiYXNlKTsKKyAgICBnbXBfZnJlZV9mdW5jIChudW0sIG51bWxlbiArIDEpOworCisgICAgaWYgKHJldCAhPSAwKQorICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBtcHpfc2V0X3N0ciAobXBxX2RlbnJlZihyKSwgc2xhc2ggKyAxLCBiYXNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWluaS1nbXAvbWluaS1tcHEuaCBiL21pbmktZ21wL21pbmktbXBxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhYmNlYwotLS0gL2Rldi9udWxsCisrKyBiL21pbmktZ21wL21pbmktbXBxLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIG1pbmktbXBxLCBhIG1pbmltYWxpc3RpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIEdOVSBHTVAgc3Vic2V0LgorCitDb3B5cmlnaHQgMjAxOCwgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyogSGVhZGVyICovCisKKyNpZm5kZWYgX19NSU5JX01QUV9IX18KKyNkZWZpbmUgX19NSU5JX01QUV9IX18KKworI2luY2x1ZGUgIm1pbmktZ21wLmgiCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fbXB6X3N0cnVjdCBfbXBfbnVtOworICBfX21wel9zdHJ1Y3QgX21wX2RlbjsKK30gX19tcHFfc3RydWN0OworCit0eXBlZGVmIF9fbXBxX3N0cnVjdCBtcHFfdFsxXTsKKwordHlwZWRlZiBjb25zdCBfX21wcV9zdHJ1Y3QgKm1wcV9zcmNwdHI7Cit0eXBlZGVmIF9fbXBxX3N0cnVjdCAqbXBxX3B0cjsKKworI2RlZmluZSBtcHFfbnVtcmVmKFEpICgmKChRKS0+X21wX251bSkpCisjZGVmaW5lIG1wcV9kZW5yZWYoUSkgKCYoKFEpLT5fbXBfZGVuKSkKKwordm9pZCBtcHFfYWJzIChtcHFfdCwgY29uc3QgbXBxX3QpOwordm9pZCBtcHFfYWRkIChtcHFfdCwgY29uc3QgbXBxX3QsIGNvbnN0IG1wcV90KTsKK3ZvaWQgbXBxX2Nhbm9uaWNhbGl6ZSAobXBxX3QpOwordm9pZCBtcHFfY2xlYXIgKG1wcV90KTsKK2ludCBtcHFfY21wIChjb25zdCBtcHFfdCwgY29uc3QgbXBxX3QpOworaW50IG1wcV9jbXBfc2kgKGNvbnN0IG1wcV90LCBzaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitpbnQgbXBxX2NtcF91aSAoY29uc3QgbXBxX3QsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworaW50IG1wcV9jbXBfeiAoY29uc3QgbXBxX3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXBxX2RpdiAobXBxX3QsIGNvbnN0IG1wcV90LCBjb25zdCBtcHFfdCk7Cit2b2lkIG1wcV9kaXZfMmV4cCAobXBxX3QsIGNvbnN0IG1wcV90LCBtcF9iaXRjbnRfdCk7CitpbnQgbXBxX2VxdWFsIChjb25zdCBtcHFfdCwgY29uc3QgbXBxX3QpOworZG91YmxlIG1wcV9nZXRfZCAoY29uc3QgbXBxX3QpOwordm9pZCBtcHFfZ2V0X2RlbiAobXB6X3QsIGNvbnN0IG1wcV90KTsKK3ZvaWQgbXBxX2dldF9udW0gKG1wel90LCBjb25zdCBtcHFfdCk7CitjaGFyICogbXBxX2dldF9zdHIgKGNoYXIgKiwgaW50LCBjb25zdCBtcHFfdCBxKTsKK3ZvaWQgbXBxX2luaXQgKG1wcV90KTsKK3ZvaWQgbXBxX2ludiAobXBxX3QsIGNvbnN0IG1wcV90KTsKK3ZvaWQgbXBxX211bCAobXBxX3QsIGNvbnN0IG1wcV90LCBjb25zdCBtcHFfdCk7Cit2b2lkIG1wcV9tdWxfMmV4cCAobXBxX3QsIGNvbnN0IG1wcV90LCBtcF9iaXRjbnRfdCk7Cit2b2lkIG1wcV9uZWcgKG1wcV90LCBjb25zdCBtcHFfdCk7Cit2b2lkIG1wcV9zZXQgKG1wcV90LCBjb25zdCBtcHFfdCk7Cit2b2lkIG1wcV9zZXRfZCAobXBxX3QsIGRvdWJsZSk7Cit2b2lkIG1wcV9zZXRfZGVuIChtcHFfdCwgY29uc3QgbXB6X3QpOwordm9pZCBtcHFfc2V0X251bSAobXBxX3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgbXBxX3NldF9zaSAobXBxX3QsIHNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK2ludCBtcHFfc2V0X3N0ciAobXBxX3QsIGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgbXBxX3NldF91aSAobXBxX3QsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBtcHFfc2V0X3ogKG1wcV90LCBjb25zdCBtcHpfdCk7CitpbnQgbXBxX3NnbiAoY29uc3QgbXBxX3QpOwordm9pZCBtcHFfc3ViIChtcHFfdCwgY29uc3QgbXBxX3QsIGNvbnN0IG1wcV90KTsKK3ZvaWQgbXBxX3N3YXAgKG1wcV90LCBtcHFfdCk7CisKKy8qIFRoaXMgbG9uZyBsaXN0IHRha2VuIGZyb20gZ21wLmguICovCisvKiBGb3IgcmVmZXJlbmNlLCAiZGVmaW5lZChFT0YpIiBjYW5ub3QgYmUgdXNlZCBoZXJlLiAgSW4gZysrIDIuOTUuNCwKKyAgIDxpb3N0cmVhbT4gZGVmaW5lcyBFT0YgYnV0IG5vdCBGSUxFLiAgKi8KKyNpZiBkZWZpbmVkIChGSUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKEhfU1RESU8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfSF9TVERJTykgICAgICAgICAgICAgICAvKiBBSVggKi8gICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX1NURElPX0gpICAgICAgICAgICAgICAgLyogZ2xpYmMsIFN1biwgU0NPICovICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IXykgICAgICAgICAgICAgIC8qIEJTRCwgT1NGICovICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX0gpICAgICAgICAgICAgICAvKiBCb3JsYW5kICovICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19IX18pICAgICAgICAgICAgLyogSVJJWCAqLyAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19JTkNMVURFRCkgICAgICAgIC8qIEhQVVggKi8gICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX2RqX2luY2x1ZGVfc3RkaW9faF8pICAvKiBESkdQUCAqLyAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0ZJTEVfREVGSU5FRCkgICAgICAgICAgLyogTWljcm9zb2Z0ICovICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fXykgICAgICAgICAgICAgIC8qIEFwcGxlIE1QVyBNckMgKi8gICAgICAgXAorICB8fCBkZWZpbmVkIChfTVNMX1NURElPX0gpICAgICAgICAgICAvKiBNZXRyb3dlcmtzICovICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX1NURElPX0hfSU5DTFVERUQpICAgICAgLyogUU5YNCAqLyAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9JU09fU1RESU9fSVNPX0gpICAgICAgIC8qIFN1biBDKysgKi8gICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX0xPQURFRCkgICAgICAgICAvKiBWTVMgKi8KK3NpemVfdCBtcHFfb3V0X3N0ciAoRklMRSAqLCBpbnQsIGNvbnN0IG1wcV90KTsKKyNlbmRpZgorCit2b2lkIG1wel9zZXRfcSAobXB6X3QsIGNvbnN0IG1wcV90KTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogX19NSU5JX01QUV9IX18gKi8KZGlmZiAtLWdpdCBhL21wX2JwbC5jIGIvbXBfYnBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzZmIxNQotLS0gL2Rldi9udWxsCisrKyBiL21wX2JwbC5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCitDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2NvbnN0IGludCBtcF9iaXRzX3Blcl9saW1iID0gR01QX0xJTUJfQklUUzsKK2NvbnN0IGludCBfX2dtcF8wID0gMDsKK2ludCBfX2dtcF9qdW5rOwpkaWZmIC0tZ2l0IGEvbXBfY2x6X3RhYi5jIGIvbXBfY2x6X3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2NiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcF9jbHpfdGFiLmMKQEAgLTAsMCArMSw0OCBAQAorLyogX19jbHpfdGFiIC0tIHN1cHBvcnQgZm9yIGxvbmdsb25nLmgKKworICAgVEhFIENPTlRFTlRTIE9GIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBBTkQgTUFZIENIQU5HRQorICAgSU5DT01QQVRJQkxZIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaWZkZWYgQ09VTlRfTEVBRElOR19aRVJPU19ORUVEX0NMWl9UQUIKK2NvbnN0Cit1bnNpZ25lZCBjaGFyIF9fY2x6X3RhYlsxMjldID0KK3sKKyAgMSwyLDMsMyw0LDQsNCw0LDUsNSw1LDUsNSw1LDUsNSw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCisgIDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKyAgOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAorICA5Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tcF9kdl90YWIuYyBiL21wX2R2X3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDlkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcF9kdl90YWIuYwpAQCAtMCwwICsxLDc3IEBACisvKiBfX2dtcF9kaWdpdF92YWx1ZV90YWIgLS0gc3VwcG9ydCBmb3IgbXAqX3NldF9zdHIKKworICAgVEhFIENPTlRFTlRTIE9GIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBBTkQgTUFZIENIQU5HRQorICAgSU5DT01QQVRJQkxZIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDMsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBUYWJsZSB0byBiZSBpbmRleGVkIGJ5IGNoYXJhY3RlciwgdG8gZ2V0IGl0cyBudW1lcmljYWwgdmFsdWUuICBBc3N1bWVzIEFTQ0lJCisgICBjaGFyYWN0ZXIgc2V0LgorCisgICBGaXJzdCBwYXJ0IG9mIHRhYmxlIHN1cHBvcnRzIGNvbW1vbiB1c2FnZXMsIHdoZXJlICdBJyBhbmQgJ2EnIGhhdmUgdGhlIHNhbWUKKyAgIHZhbHVlOyB0aGlzIHN1cHBvcnRzIGJhc2VzIDIuLjM2CisKKyAgIEF0IG9mZnNldCAyMDgsIHZhbHVlcyBmb3IgYmFzZXMgMzcuLjYyIHN0YXJ0LiAgSGVyZSwgJ0EnIGhhcyB0aGUgdmFsdWUgMTAKKyAgIChpbiBkZWNpbWFsKSBhbmQgJ2EnIGhhcyB0aGUgdmFsdWUgMzYuICAqLworCisjZGVmaW5lIFggMHhmZgorY29uc3QgdW5zaWduZWQgY2hhciBfX2dtcF9kaWdpdF92YWx1ZV90YWJbXSA9Cit7CisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsCisgIDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LFgsIFgsIFgsIFgsIFgsCisgIFgsMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsCisgIDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsCisgIDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LFgsIFgsIFgsIFgsIFgsCisgIFgsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsCisgIDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsCisgIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgsIFgKK307CmRpZmYgLS1naXQgYS9tcF9nZXRfZm5zLmMgYi9tcF9nZXRfZm5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlZDk2ZAotLS0gL2Rldi9udWxsCisrKyBiL21wX2dldF9mbnMuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyAtLSBHZXQgdGhlIGFsbG9jYXRlLCByZWFsbG9jYXRlLCBhbmQgZnJlZSBmdW5jdGlvbnMuCisKK0NvcHlyaWdodCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBfZ2V0X21lbW9yeV9mdW5jdGlvbnMgKHZvaWQgKigqKmFsbG9jX2Z1bmMpIChzaXplX3QpLAorCQkJIHZvaWQgKigqKnJlYWxsb2NfZnVuYykgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorCQkJIHZvaWQgKCoqZnJlZV9mdW5jKSAodm9pZCAqLCBzaXplX3QpKSBfX0dNUF9OT1RIUk9XCit7CisgIGlmIChhbGxvY19mdW5jICE9IE5VTEwpCisgICAgKmFsbG9jX2Z1bmMgPSBfX2dtcF9hbGxvY2F0ZV9mdW5jOworCisgIGlmIChyZWFsbG9jX2Z1bmMgIT0gTlVMTCkKKyAgICAqcmVhbGxvY19mdW5jID0gX19nbXBfcmVhbGxvY2F0ZV9mdW5jOworCisgIGlmIChmcmVlX2Z1bmMgIT0gTlVMTCkKKyAgICAqZnJlZV9mdW5jID0gX19nbXBfZnJlZV9mdW5jOworfQpkaWZmIC0tZ2l0IGEvbXBfbWludl90YWIuYyBiL21wX21pbnZfdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzZDRjMQotLS0gL2Rldi9udWxsCisrKyBiL21wX21pbnZfdGFiLmMKQEAgLTAsMCArMSw1OCBAQAorLyogQSB0YWJsZSBvZiBkYXRhIHN1cHBvcnRpbmcgYmludmVydF9saW1iKCkuCisKKyAgIFRIRSBDT05URU5UUyBPRiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgQU5EIE1BWSBDSEFOR0UKKyAgIElOQ09NUEFUSUJMWSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuICAqLworCisvKgorQ29weXJpZ2h0IDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIGJpbnZlcnRfbGltYl90YWJsZVtpXSBpcyB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiAyKmkrMSBtb2QgMjU2LAorICAgaWUuIChiaW52ZXJ0X2xpbWJfdGFibGVbaV0gKiAoMippKzEpKSAlIDI1NiA9PSAxICovCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgIGJpbnZlcnRfbGltYl90YWJsZVsxMjhdID0geworICAweDAxLCAweEFCLCAweENELCAweEI3LCAweDM5LCAweEEzLCAweEM1LCAweEVGLAorICAweEYxLCAweDFCLCAweDNELCAweEE3LCAweDI5LCAweDEzLCAweDM1LCAweERGLAorICAweEUxLCAweDhCLCAweEFELCAweDk3LCAweDE5LCAweDgzLCAweEE1LCAweENGLAorICAweEQxLCAweEZCLCAweDFELCAweDg3LCAweDA5LCAweEYzLCAweDE1LCAweEJGLAorICAweEMxLCAweDZCLCAweDhELCAweDc3LCAweEY5LCAweDYzLCAweDg1LCAweEFGLAorICAweEIxLCAweERCLCAweEZELCAweDY3LCAweEU5LCAweEQzLCAweEY1LCAweDlGLAorICAweEExLCAweDRCLCAweDZELCAweDU3LCAweEQ5LCAweDQzLCAweDY1LCAweDhGLAorICAweDkxLCAweEJCLCAweERELCAweDQ3LCAweEM5LCAweEIzLCAweEQ1LCAweDdGLAorICAweDgxLCAweDJCLCAweDRELCAweDM3LCAweEI5LCAweDIzLCAweDQ1LCAweDZGLAorICAweDcxLCAweDlCLCAweEJELCAweDI3LCAweEE5LCAweDkzLCAweEI1LCAweDVGLAorICAweDYxLCAweDBCLCAweDJELCAweDE3LCAweDk5LCAweDAzLCAweDI1LCAweDRGLAorICAweDUxLCAweDdCLCAweDlELCAweDA3LCAweDg5LCAweDczLCAweDk1LCAweDNGLAorICAweDQxLCAweEVCLCAweDBELCAweEY3LCAweDc5LCAweEUzLCAweDA1LCAweDJGLAorICAweDMxLCAweDVCLCAweDdELCAweEU3LCAweDY5LCAweDUzLCAweDc1LCAweDFGLAorICAweDIxLCAweENCLCAweEVELCAweEQ3LCAweDU5LCAweEMzLCAweEU1LCAweDBGLAorICAweDExLCAweDNCLCAweDVELCAweEM3LCAweDQ5LCAweDMzLCAweDU1LCAweEZGCit9OwpkaWZmIC0tZ2l0IGEvbXBfc2V0X2Zucy5jIGIvbXBfc2V0X2Zucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YmNkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tcF9zZXRfZm5zLmMKQEAgLTAsMCArMSw0OSBAQAorLyogbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgLS0gU2V0IHRoZSBhbGxvY2F0ZSwgcmVhbGxvY2F0ZSwgYW5kIGZyZWUgZnVuY3Rpb25zCisgICBmb3IgdXNlIGJ5IHRoZSBtcCBwYWNrYWdlLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wX3NldF9tZW1vcnlfZnVuY3Rpb25zICh2b2lkICooKmFsbG9jX2Z1bmMpIChzaXplX3QpLAorCQkJIHZvaWQgKigqcmVhbGxvY19mdW5jKSAodm9pZCAqLCBzaXplX3QsIHNpemVfdCksCisJCQkgdm9pZCAoKmZyZWVfZnVuYykgKHZvaWQgKiwgc2l6ZV90KSkgX19HTVBfTk9USFJPVworeworICBpZiAoYWxsb2NfZnVuYyA9PSAwKQorICAgIGFsbG9jX2Z1bmMgPSBfX2dtcF9kZWZhdWx0X2FsbG9jYXRlOworICBpZiAocmVhbGxvY19mdW5jID09IDApCisgICAgcmVhbGxvY19mdW5jID0gX19nbXBfZGVmYXVsdF9yZWFsbG9jYXRlOworICBpZiAoZnJlZV9mdW5jID09IDApCisgICAgZnJlZV9mdW5jID0gX19nbXBfZGVmYXVsdF9mcmVlOworCisgIF9fZ21wX2FsbG9jYXRlX2Z1bmMgPSBhbGxvY19mdW5jOworICBfX2dtcF9yZWFsbG9jYXRlX2Z1bmMgPSByZWFsbG9jX2Z1bmM7CisgIF9fZ21wX2ZyZWVfZnVuYyA9IGZyZWVfZnVuYzsKK30KZGlmZiAtLWdpdCBhL21wZi9hYnMuYyBiL21wZi9hYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQyYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL2Ficy5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIG1wZl9hYnMgLS0gQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBmbG9hdC4KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9hYnMgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciB1KQoreworICBtcF9zaXplX3Qgc2l6ZTsKKworICBzaXplID0gQUJTICh1LT5fbXBfc2l6ZSk7CisgIGlmIChyICE9IHUpCisgICAgeworICAgICAgbXBfc2l6ZV90IHByZWM7CisgICAgICBtcF9wdHIgcnAsIHVwOworCisgICAgICBwcmVjID0gci0+X21wX3ByZWMgKyAxOwkvKiBsaWUgbm90IHRvIGxvc2UgcHJlY2lzaW9uIGluIGFzc2lnbm1lbnQgKi8KKyAgICAgIHJwID0gci0+X21wX2Q7CisgICAgICB1cCA9IHUtPl9tcF9kOworCisgICAgICBpZiAoc2l6ZSA+IHByZWMpCisJeworCSAgdXAgKz0gc2l6ZSAtIHByZWM7CisJICBzaXplID0gcHJlYzsKKwl9CisKKyAgICAgIE1QTl9DT1BZIChycCwgdXAsIHNpemUpOworICAgICAgci0+X21wX2V4cCA9IHUtPl9tcF9leHA7CisgICAgfQorICByLT5fbXBfc2l6ZSA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcGYvYWRkLmMgYi9tcGYvYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhOWU0NwotLS0gL2Rldi9udWxsCisrKyBiL21wZi9hZGQuYwpAQCAtMCwwICsxLDE4MyBAQAorLyogbXBmX2FkZCAtLSBBZGQgdHdvIGZsb2F0cy4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfYWRkIChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSwgbXBmX3NyY3B0ciB2KQoreworICBtcF9zcmNwdHIgdXAsIHZwOworICBtcF9wdHIgcnAsIHRwOworICBtcF9zaXplX3QgdXNpemUsIHZzaXplLCByc2l6ZTsKKyAgbXBfc2l6ZV90IHByZWM7CisgIG1wX2V4cF90IHVleHA7CisgIG1wX3NpemVfdCBlZGlmZjsKKyAgbXBfbGltYl90IGN5OworICBpbnQgbmVnYXRlOworICBUTVBfREVDTDsKKworICB1c2l6ZSA9IHUtPl9tcF9zaXplOworICB2c2l6ZSA9IHYtPl9tcF9zaXplOworCisgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHRoYXQgZG9uJ3Qgd29yayBpbiBnZW5lcmljIGNvZGUgYmVsb3cuICAqLworICBpZiAodXNpemUgPT0gMCkKKyAgICB7CisgICAgc2V0X3Jfdl9tYXliZToKKyAgICAgIGlmIChyICE9IHYpCisgICAgICAgIG1wZl9zZXQgKHIsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHZzaXplID09IDApCisgICAgeworICAgICAgdiA9IHU7CisgICAgICBnb3RvIHNldF9yX3ZfbWF5YmU7CisgICAgfQorCisgIC8qIElmIHNpZ25zIG9mIFUgYW5kIFYgYXJlIGRpZmZlcmVudCwgcGVyZm9ybSBzdWJ0cmFjdGlvbi4gICovCisgIGlmICgodXNpemUgXiB2c2l6ZSkgPCAwKQorICAgIHsKKyAgICAgIF9fbXBmX3N0cnVjdCB2X25lZ2F0ZWQ7CisgICAgICB2X25lZ2F0ZWQuX21wX3NpemUgPSAtdnNpemU7CisgICAgICB2X25lZ2F0ZWQuX21wX2V4cCA9IHYtPl9tcF9leHA7CisgICAgICB2X25lZ2F0ZWQuX21wX2QgPSB2LT5fbXBfZDsKKyAgICAgIG1wZl9zdWIgKHIsIHUsICZ2X25lZ2F0ZWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBUTVBfTUFSSzsKKworICAvKiBTaWducyBhcmUgbm93IGtub3duIHRvIGJlIHRoZSBzYW1lLiAgKi8KKyAgbmVnYXRlID0gdXNpemUgPCAwOworCisgIC8qIE1ha2UgVSBiZSB0aGUgb3BlcmFuZCB3aXRoIHRoZSBsYXJnZXN0IGV4cG9uZW50LiAgKi8KKyAgaWYgKHUtPl9tcF9leHAgPCB2LT5fbXBfZXhwKQorICAgIHsKKyAgICAgIG1wZl9zcmNwdHIgdDsKKyAgICAgIHQgPSB1OyB1ID0gdjsgdiA9IHQ7CisgICAgICB1c2l6ZSA9IHUtPl9tcF9zaXplOworICAgICAgdnNpemUgPSB2LT5fbXBfc2l6ZTsKKyAgICB9CisKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgdnNpemUgPSBBQlMgKHZzaXplKTsKKyAgdXAgPSB1LT5fbXBfZDsKKyAgdnAgPSB2LT5fbXBfZDsKKyAgcnAgPSByLT5fbXBfZDsKKyAgcHJlYyA9IHItPl9tcF9wcmVjOworICB1ZXhwID0gdS0+X21wX2V4cDsKKyAgZWRpZmYgPSB1LT5fbXBfZXhwIC0gdi0+X21wX2V4cDsKKworICAvKiBJZiBVIGV4dGVuZHMgYmV5b25kIFBSRUMsIGlnbm9yZSB0aGUgcGFydCB0aGF0IGRvZXMuICAqLworICBpZiAodXNpemUgPiBwcmVjKQorICAgIHsKKyAgICAgIHVwICs9IHVzaXplIC0gcHJlYzsKKyAgICAgIHVzaXplID0gcHJlYzsKKyAgICB9CisKKyAgLyogSWYgViBleHRlbmRzIGJleW9uZCBQUkVDLCBpZ25vcmUgdGhlIHBhcnQgdGhhdCBkb2VzLgorICAgICBOb3RlIHRoYXQgdGhpcyBtYXkgbWFrZSB2c2l6ZSBuZWdhdGl2ZS4gICovCisgIGlmICh2c2l6ZSArIGVkaWZmID4gcHJlYykKKyAgICB7CisgICAgICB2cCArPSB2c2l6ZSArIGVkaWZmIC0gcHJlYzsKKyAgICAgIHZzaXplID0gcHJlYyAtIGVkaWZmOworICAgIH0KKworI2lmIDAKKyAgLyogTG9jYXRlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBub24temVybyBsaW1iIGluICh0aGUgbmVlZGVkIHBhcnRzCisgICAgIG9mKSBVIGFuZCBWLCB0byBzaW1wbGlmeSB0aGUgY29kZSBiZWxvdy4gICovCisgIHdoaWxlICh1cFswXSA9PSAwKQorICAgIHVwKyssIHVzaXplLS07CisgIHdoaWxlICh2cFswXSA9PSAwKQorICAgIHZwKyssIHZzaXplLS07CisjZW5kaWYKKworICAvKiBBbGxvY2F0ZSB0ZW1wIHNwYWNlIGZvciB0aGUgcmVzdWx0LiAgQWxsb2NhdGUKKyAgICAganVzdCB2c2l6ZSArIGVkaWZmIGxhdGVyPz8/ICAqLworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAocHJlYyk7CisKKyAgaWYgKGVkaWZmID49IHByZWMpCisgICAgeworICAgICAgLyogViBjb21wbGV0ZWx5IGNhbmNlbGxlZC4gICovCisgICAgICBpZiAocnAgIT0gdXApCisJTVBOX0NPUFlfSU5DUiAocnAsIHVwLCB1c2l6ZSk7CisgICAgICByc2l6ZSA9IHVzaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgKi8KKyAgICAgIC8qIHZ2dnZ2dnYgIHwgIHZ2ICAgICAgIHwgICAgdnZ2dnYgIHwgICAgdiAgICAgIHwgICAgICAgdnYgKi8KKworICAgICAgaWYgKHVzaXplID4gZWRpZmYpCisJeworCSAgLyogVSBhbmQgViBwYXJ0aWFsbHkgb3ZlcmxhcHMuICAqLworCSAgaWYgKHZzaXplICsgZWRpZmYgPD0gdXNpemUpCisJICAgIHsKKwkgICAgICAvKiB1dXV1ICAgICAqLworCSAgICAgIC8qICAgdiAgICAgICovCisJICAgICAgbXBfc2l6ZV90IHNpemU7CisJICAgICAgc2l6ZSA9IHVzaXplIC0gZWRpZmYgLSB2c2l6ZTsKKwkgICAgICBNUE5fQ09QWSAodHAsIHVwLCBzaXplKTsKKwkgICAgICBjeSA9IG1wbl9hZGQgKHRwICsgc2l6ZSwgdXAgKyBzaXplLCB1c2l6ZSAtIHNpemUsIHZwLCB2c2l6ZSk7CisJICAgICAgcnNpemUgPSB1c2l6ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogdXV1dSAgICAgKi8KKwkgICAgICAvKiAgIHZ2dnZ2ICAqLworCSAgICAgIG1wX3NpemVfdCBzaXplOworCSAgICAgIHNpemUgPSB2c2l6ZSArIGVkaWZmIC0gdXNpemU7CisJICAgICAgTVBOX0NPUFkgKHRwLCB2cCwgc2l6ZSk7CisJICAgICAgY3kgPSBtcG5fYWRkICh0cCArIHNpemUsIHVwLCB1c2l6ZSwgdnAgKyBzaXplLCB1c2l6ZSAtIGVkaWZmKTsKKwkgICAgICByc2l6ZSA9IHZzaXplICsgZWRpZmY7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogdXV1dSAgICAgKi8KKwkgIC8qICAgICAgdnYgICovCisJICBtcF9zaXplX3Qgc2l6ZTsKKwkgIHNpemUgPSB2c2l6ZSArIGVkaWZmIC0gdXNpemU7CisJICBNUE5fQ09QWSAodHAsIHZwLCB2c2l6ZSk7CisJICBNUE5fWkVSTyAodHAgKyB2c2l6ZSwgZWRpZmYgLSB1c2l6ZSk7CisJICBNUE5fQ09QWSAodHAgKyBzaXplLCB1cCwgdXNpemUpOworCSAgY3kgPSAwOworCSAgcnNpemUgPSBzaXplICsgdXNpemU7CisJfQorCisgICAgICBNUE5fQ09QWSAocnAsIHRwLCByc2l6ZSk7CisgICAgICBycFtyc2l6ZV0gPSBjeTsKKyAgICAgIHJzaXplICs9IGN5OworICAgICAgdWV4cCArPSBjeTsKKyAgICB9CisKKyAgci0+X21wX3NpemUgPSBuZWdhdGUgPyAtcnNpemUgOiByc2l6ZTsKKyAgci0+X21wX2V4cCA9IHVleHA7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBmL2FkZF91aS5jIGIvbXBmL2FkZF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmE5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvYWRkX3VpLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIG1wZl9hZGRfdWkgLS0gQWRkIGEgZmxvYXQgYW5kIGFuIHVuc2lnbmVkIGludGVnZXIuCisKK0NvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX2FkZF91aSAobXBmX3B0ciBzdW0sIG1wZl9zcmNwdHIgdSwgdW5zaWduZWQgbG9uZyBpbnQgdikKK3sKKyAgbXBfc3JjcHRyIHVwID0gdS0+X21wX2Q7CisgIG1wX3B0ciBzdW1wID0gc3VtLT5fbXBfZDsKKyAgbXBfc2l6ZV90IHVzaXplLCBzdW1zaXplOworICBtcF9zaXplX3QgcHJlYyA9IHN1bS0+X21wX3ByZWM7CisgIG1wX2V4cF90IHVleHAgPSB1LT5fbXBfZXhwOworCisgIHVzaXplID0gdS0+X21wX3NpemU7CisgIGlmICh1c2l6ZSA8PSAwKQorICAgIHsKKyAgICAgIGlmICh1c2l6ZSA9PSAwKQorCXsKKwkgIG1wZl9zZXRfdWkgKHN1bSwgdik7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9fbXBmX3N0cnVjdCB1X25lZ2F0ZWQ7CisJICB1X25lZ2F0ZWQuX21wX3NpemUgPSAtdXNpemU7CisJICB1X25lZ2F0ZWQuX21wX2V4cCA9IHUtPl9tcF9leHA7CisJICB1X25lZ2F0ZWQuX21wX2QgPSB1LT5fbXBfZDsKKwkgIG1wZl9zdWJfdWkgKHN1bSwgJnVfbmVnYXRlZCwgdik7CisJICBzdW0tPl9tcF9zaXplID0gLShzdW0tPl9tcF9zaXplKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGlmICh2ID09IDApCisgICAgeworICAgIHN1bV9pc191OgorICAgICAgaWYgKHUgIT0gc3VtKQorCXsKKwkgIHN1bXNpemUgPSBNSU4gKHVzaXplLCBwcmVjICsgMSk7CisJICBNUE5fQ09QWSAoc3VtLT5fbXBfZCwgdXAgKyB1c2l6ZSAtIHN1bXNpemUsIHN1bXNpemUpOworCSAgc3VtLT5fbXBfc2l6ZSA9IHN1bXNpemU7CisJICBzdW0tPl9tcF9leHAgPSB1LT5fbXBfZXhwOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHVleHAgPiAwKQorICAgIHsKKyAgICAgIC8qIFUgPj0gMS4gICovCisgICAgICBpZiAodWV4cCA+IHByZWMpCisJeworCSAgLyogVSA+PiBWLCBWIGlzIG5vdCBwYXJ0IG9mIGZpbmFsIHJlc3VsdC4gICovCisJICBnb3RvIHN1bV9pc191OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBVJ3MgImxpbWIgcG9pbnQiIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIHRoZSBmaXJzdCBsaW1iCisJICAgICBhbmQgdGhlIFBSRUM6dGggbGltYi4KKwkgICAgIEJvdGggVSBhbmQgViBhcmUgcGFydCBvZiB0aGUgZmluYWwgcmVzdWx0LiAgKi8KKwkgIGlmICh1ZXhwID4gdXNpemUpCisJICAgIHsKKwkgICAgICAvKiAgIHV1dXV1dTAwMDAuICovCisJICAgICAgLyogKyAgICAgICAgICB2LiAqLworCSAgICAgIC8qIFdlIGJlZ2luIHdpdGggbW92aW5nIFUgdG8gdGhlIHRvcCBvZiBTVU0sIHRvIGhhbmRsZQorCQkgc2FtZXZhcihVLFNVTSkuICAqLworCSAgICAgIE1QTl9DT1BZX0RFQ1IgKHN1bXAgKyB1ZXhwIC0gdXNpemUsIHVwLCB1c2l6ZSk7CisJICAgICAgc3VtcFswXSA9IHY7CisJICAgICAgTVBOX1pFUk8gKHN1bXAgKyAxLCB1ZXhwIC0gdXNpemUgLSAxKTsKKyNpZiAwIC8qIFdoYXQgaXMgdGhpcz8/PyAqLworCSAgICAgIGlmIChzdW0gPT0gdSkKKwkJTVBOX0NPUFkgKHN1bS0+X21wX2QsIHN1bXAsIHVleHApOworI2VuZGlmCisJICAgICAgc3VtLT5fbXBfc2l6ZSA9IHVleHA7CisJICAgICAgc3VtLT5fbXBfZXhwID0gdWV4cDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogICB1dXV1dXUudXV1dSAqLworCSAgICAgIC8qICsgICAgICB2LiAgICAgKi8KKwkgICAgICBtcF9saW1iX3QgY3lfbGltYjsKKwkgICAgICBpZiAodXNpemUgPiBwcmVjKQorCQl7CisJCSAgLyogSWdub3JlIGV4Y2VzcyBsaW1icyBpbiBVLiAgKi8KKwkJICB1cCArPSB1c2l6ZSAtIHByZWM7CisJCSAgdXNpemUgLT0gdXNpemUgLSBwcmVjOyAvKiBFcS4gdXNpemUgPSBwcmVjICovCisJCX0KKwkgICAgICBpZiAoc3VtcCAhPSB1cCkKKwkJTVBOX0NPUFlfSU5DUiAoc3VtcCwgdXAsIHVzaXplIC0gdWV4cCk7CisJICAgICAgY3lfbGltYiA9IG1wbl9hZGRfMSAoc3VtcCArIHVzaXplIC0gdWV4cCwgdXAgKyB1c2l6ZSAtIHVleHAsCisJCQkJICAgdWV4cCwgKG1wX2xpbWJfdCkgdik7CisJICAgICAgc3VtcFt1c2l6ZV0gPSBjeV9saW1iOworCSAgICAgIHN1bS0+X21wX3NpemUgPSB1c2l6ZSArIGN5X2xpbWI7CisJICAgICAgc3VtLT5fbXBfZXhwID0gdWV4cCArIGN5X2xpbWI7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVSA8IDEsIHNvIFYgPiBVIGZvciBzdXJlLiAgKi8KKyAgICAgIC8qIHYuICAgICAgICAgKi8KKyAgICAgIC8qICAuMDAwMHV1dXUgKi8KKyAgICAgIGlmICgoLXVleHApID49IHByZWMpCisJeworCSAgc3VtcFswXSA9IHY7CisJICBzdW0tPl9tcF9zaXplID0gMTsKKwkgIHN1bS0+X21wX2V4cCA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICh1c2l6ZSArICgtdWV4cCkgKyAxID4gcHJlYykKKwkgICAgeworCSAgICAgIC8qIElnbm9yZSBleGNlc3MgbGltYnMgaW4gVS4gICovCisJICAgICAgdXAgKz0gdXNpemUgKyAoLXVleHApICsgMSAtIHByZWM7CisJICAgICAgdXNpemUgLT0gdXNpemUgKyAoLXVleHApICsgMSAtIHByZWM7CisJICAgIH0KKwkgIGlmIChzdW1wICE9IHVwKQorCSAgICBNUE5fQ09QWV9JTkNSIChzdW1wLCB1cCwgdXNpemUpOworCSAgTVBOX1pFUk8gKHN1bXAgKyB1c2l6ZSwgLXVleHApOworCSAgc3VtcFt1c2l6ZSArICgtdWV4cCldID0gdjsKKwkgIHN1bS0+X21wX3NpemUgPSB1c2l6ZSArICgtdWV4cCkgKyAxOworCSAgc3VtLT5fbXBfZXhwID0gMTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBmL2NlaWxmbG9vci5jIGIvbXBmL2NlaWxmbG9vci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjY2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvY2VpbGZsb29yLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIG1wZl9jZWlsLCBtcGZfZmxvb3IgLS0gcm91bmQgYW4gbXBmIHRvIGFuIGludGVnZXIuCisKK0NvcHlyaWdodCAyMDAxLCAyMDA0LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBkaXI9PTEgZm9yIGNlaWwsIGRpcj09LTEgZm9yIGZsb29yCisKKyAgIE5vdGljZSB0aGUgdXNlIG9mIHByZWMrMSBlbnN1cmVzIG1wZl9jZWlsIGFuZCBtcGZfZmxvb3IgYXJlIGVxdWl2YWxlbnQgdG8KKyAgIG1wZl9zZXQgaWYgdSBpcyBhbHJlYWR5IGFuIGludGVnZXIuICAqLworCitzdGF0aWMgdm9pZCBfX2dtcGZfY2VpbF9vcl9mbG9vciAoUkVHUEFSTV8yXzEgKG1wZl9wdHIsIG1wZl9zcmNwdHIsIGludCkpIFJFR1BBUk1fQVRUUiAoMSk7CisjZGVmaW5lIG1wZl9jZWlsX29yX2Zsb29yKHIsdSxkaXIpICBfX2dtcGZfY2VpbF9vcl9mbG9vciAoUkVHUEFSTV8yXzEgKHIsIHUsIGRpcikpCisKK1JFR1BBUk1fQVRUUiAoMSkgc3RhdGljIHZvaWQKK21wZl9jZWlsX29yX2Zsb29yIChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSwgaW50IGRpcikKK3sKKyAgbXBfcHRyICAgICBycCwgdXAsIHA7CisgIG1wX3NpemVfdCAgc2l6ZSwgYXNpemUsIHByZWM7CisgIG1wX2V4cF90ICAgZXhwOworCisgIHNpemUgPSBTSVoodSk7CisgIGlmIChzaXplID09IDApCisgICAgeworICAgIHplcm86CisgICAgICBTSVoocikgPSAwOworICAgICAgRVhQKHIpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcnAgPSBQVFIocik7CisgIGV4cCA9IEVYUCh1KTsKKyAgaWYgKGV4cCA8PSAwKQorICAgIHsKKyAgICAgIC8qIHUgaXMgb25seSBhIGZyYWN0aW9uICovCisgICAgICBpZiAoKHNpemUgXiBkaXIpIDwgMCkKKyAgICAgICAgZ290byB6ZXJvOworICAgICAgcnBbMF0gPSAxOworICAgICAgRVhQKHIpID0gMTsKKyAgICAgIFNJWihyKSA9IGRpcjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIEVYUChyKSA9IGV4cDsKKworICB1cCA9IFBUUih1KTsKKyAgYXNpemUgPSBBQlMgKHNpemUpOworICB1cCArPSBhc2l6ZTsKKworICAvKiBza2lwIGZyYWN0aW9uIHBhcnQgb2YgdSAqLworICBhc2l6ZSA9IE1JTiAoYXNpemUsIGV4cCk7CisKKyAgLyogZG9uJ3QgbG9zZSBwcmVjaXNpb24gaW4gdGhlIGNvcHkgKi8KKyAgcHJlYyA9IFBSRUMgKHIpICsgMTsKKworICAvKiBza2lwIGV4Y2VzcyBvdmVyIHRhcmdldCBwcmVjaXNpb24gKi8KKyAgYXNpemUgPSBNSU4gKGFzaXplLCBwcmVjKTsKKworICB1cCAtPSBhc2l6ZTsKKworICBpZiAoKHNpemUgXiBkaXIpID49IDApCisgICAgeworICAgICAgLyogcm91bmRpbmcgZGlyZWN0aW9uIG1hdGNoZXMgc2lnbiwgbXVzdCBpbmNyZW1lbnQgaWYgaWdub3JlZCBwYXJ0IGlzCisgICAgICAgICBub24temVybyAqLworICAgICAgZm9yIChwID0gUFRSKHUpOyBwICE9IHVwOyBwKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnAgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKG1wbl9hZGRfMSAocnAsIHVwLCBhc2l6ZSwgQ05TVF9MSU1CKDEpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiB3YXMgYWxsIDB4RkYuLkZGcywgd2hpY2ggaGF2ZSBiZWNvbWUgemVyb3MsIGdpdmluZyBqdXN0CisgICAgICAgICAgICAgICAgICAgICBhIGNhcnJ5ICovCisgICAgICAgICAgICAgICAgICBycFswXSA9IDE7CisgICAgICAgICAgICAgICAgICBhc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICBFWFAocikrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFNJWihyKSA9IChzaXplID49IDAgPyBhc2l6ZSA6IC1hc2l6ZSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBTSVoocikgPSAoc2l6ZSA+PSAwID8gYXNpemUgOiAtYXNpemUpOworICBpZiAocnAgIT0gdXApCisgICAgTVBOX0NPUFlfSU5DUiAocnAsIHVwLCBhc2l6ZSk7Cit9CisKKwordm9pZAorbXBmX2NlaWwgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciB1KQoreworICBtcGZfY2VpbF9vcl9mbG9vciAociwgdSwgMSk7Cit9CisKK3ZvaWQKK21wZl9mbG9vciAobXBmX3B0ciByLCBtcGZfc3JjcHRyIHUpCit7CisgIG1wZl9jZWlsX29yX2Zsb29yIChyLCB1LCAtMSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvY2xlYXIuYyBiL21wZi9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzllMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvY2xlYXIuYwpAQCAtMCwwICsxLDM4IEBACisvKiBtcGZfY2xlYXIgLS0gZGUtYWxsb2NhdGUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IHRoZSBkeW5hbWljIGRpZ2l0IHNwYWNlIG9mCisgICBhbiBpbnRlZ2VyLgorCitDb3B5cmlnaHQgMTk5My0xOTk1LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX2NsZWFyIChtcGZfcHRyIHgpCit7CisgIF9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoUFRSKHgpLCBQUkVDKHgpICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvY2xlYXJzLmMgYi9tcGYvY2xlYXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1ZmExOQotLS0gL2Rldi9udWxsCisrKyBiL21wZi9jbGVhcnMuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBtcGZfY2xlYXJzKCkgLS0gQ2xlYXIgbXVsdGlwbGUgbXBmX3QgdmFyaWFibGVzLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9jbGVhcnMgKG1wZl9wdHIgeCwgLi4uKQoreworICB2YV9saXN0ICBhcDsKKworICB2YV9zdGFydCAoYXAsIHgpOworCisgIGRvCisgICAgeworICAgICAgX19HTVBfRlJFRV9GVU5DX0xJTUJTIChQVFIoeCksIFBSRUMoeCkgKyAxKTsKKyAgICAgIHggPSB2YV9hcmcgKGFwLCBtcGZfcHRyKTsKKyAgICB9CisgIHdoaWxlICh4ICE9IE5VTEwpOworCisgIHZhX2VuZCAoYXApOworfQpkaWZmIC0tZ2l0IGEvbXBmL2NtcC5jIGIvbXBmL2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MThiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvY21wLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIG1wZl9jbXAgLS0gQ29tcGFyZSB0d28gZmxvYXRzLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMSwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXBmX2NtcCAobXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYpIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc3JjcHRyIHVwLCB2cDsKKyAgbXBfc2l6ZV90IHVzaXplLCB2c2l6ZTsKKyAgbXBfZXhwX3QgdWV4cCwgdmV4cDsKKyAgaW50IGNtcDsKKyAgaW50IHVzaWduOworCisgIHVzaXplID0gU0laKHUpOworICB2c2l6ZSA9IFNJWih2KTsKKyAgdXNpZ24gPSB1c2l6ZSA+PSAwID8gMSA6IC0xOworCisgIC8qIDEuIEFyZSB0aGUgc2lnbnMgZGlmZmVyZW50PyAgKi8KKyAgaWYgKCh1c2l6ZSBeIHZzaXplKSA+PSAwKQorICAgIHsKKyAgICAgIC8qIFUgYW5kIFYgYXJlIGJvdGggbm9uLW5lZ2F0aXZlIG9yIGJvdGggbmVnYXRpdmUuICAqLworICAgICAgaWYgKHVzaXplID09IDApCisJLyogdnNpemUgPj0gMCAqLworCXJldHVybiAtKHZzaXplICE9IDApOworICAgICAgaWYgKHZzaXplID09IDApCisJLyogdXNpemUgPj0gMCAqLworCXJldHVybiB1c2l6ZSAhPSAwOworICAgICAgLyogRmFsbCBvdXQuICAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEVpdGhlciBVIG9yIFYgaXMgbmVnYXRpdmUsIGJ1dCBub3QgYm90aC4gICovCisgICAgICByZXR1cm4gdXNpZ247CisgICAgfQorCisgIC8qIFUgYW5kIFYgaGF2ZSB0aGUgc2FtZSBzaWduIGFuZCBhcmUgYm90aCBub24temVyby4gICovCisKKyAgdWV4cCA9IEVYUCh1KTsKKyAgdmV4cCA9IEVYUCh2KTsKKworICAvKiAyLiBBcmUgdGhlIGV4cG9uZW50cyBkaWZmZXJlbnQ/ICAqLworICBpZiAodWV4cCA+IHZleHApCisgICAgcmV0dXJuIHVzaWduOworICBpZiAodWV4cCA8IHZleHApCisgICAgcmV0dXJuIC11c2lnbjsKKworICB1c2l6ZSA9IEFCUyAodXNpemUpOworICB2c2l6ZSA9IEFCUyAodnNpemUpOworCisgIHVwID0gUFRSICh1KTsKKyAgdnAgPSBQVFIgKHYpOworCisjZGVmaW5lIFNUUklDVF9NUEZfTk9STUFMSVpBVElPTiAwCisjaWYgISBTVFJJQ1RfTVBGX05PUk1BTElaQVRJT04KKyAgLyogSWdub3JlIHplcm9lcyBhdCB0aGUgbG93IGVuZCBvZiBVIGFuZCBWLiAgKi8KKyAgZG8geworICAgIG1wX2xpbWJfdCB0bDsKKyAgICB0bCA9IHVwWzBdOworICAgIE1QTl9TVFJJUF9MT1dfWkVST1NfTk9UX1pFUk8gKHVwLCB1c2l6ZSwgdGwpOworICAgIHRsID0gdnBbMF07CisgICAgTVBOX1NUUklQX0xPV19aRVJPU19OT1RfWkVSTyAodnAsIHZzaXplLCB0bCk7CisgIH0gd2hpbGUgKDApOworI2VuZGlmCisKKyAgaWYgKHVzaXplID4gdnNpemUpCisgICAgeworICAgICAgY21wID0gbXBuX2NtcCAodXAgKyB1c2l6ZSAtIHZzaXplLCB2cCwgdnNpemUpOworICAgICAgLyogaWYgKGNtcCA9PSAwKSAqLworICAgICAgLyoJcmV0dXJuIHVzaWduOyAqLworICAgICAgKytjbXA7CisgICAgfQorICBlbHNlIGlmICh2c2l6ZSA+IHVzaXplKQorICAgIHsKKyAgICAgIGNtcCA9IG1wbl9jbXAgKHVwLCB2cCArIHZzaXplIC0gdXNpemUsIHVzaXplKTsKKyAgICAgIC8qIGlmIChjbXAgPT0gMCkgKi8KKyAgICAgIC8qCXJldHVybiAtdXNpZ247ICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY21wID0gbXBuX2NtcCAodXAsIHZwLCB1c2l6ZSk7CisgICAgICBpZiAoY21wID09IDApCisJcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gY21wID4gMCA/IHVzaWduIDogLXVzaWduOworfQpkaWZmIC0tZ2l0IGEvbXBmL2NtcF9kLmMgYi9tcGYvY21wX2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmEwOTliCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2NtcF9kLmMKQEAgLTAsMCArMSw1OSBAQAorLyogbXBmX2NtcF9kIC0tIGNvbXBhcmUgbXBmIGFuZCBkb3VibGUuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0ZMT0FUX0gKKyNpbmNsdWRlIDxmbG9hdC5oPiAgLyogZm9yIERCTF9NQVggKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CittcGZfY21wX2QgKG1wZl9zcmNwdHIgZiwgZG91YmxlIGQpCit7CisgIG1wX2xpbWJfdCAgZGFycmF5W0xJTUJTX1BFUl9ET1VCTEVdOworICBtcGZfdCAgICAgIGRmOworCisgIC8qIGQ9TmFOIGhhcyBubyBzZW5zaWJsZSByZXR1cm4gdmFsdWUsIHNvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgZD1JbmYgb3IgLUluZiBpcyBhbHdheXMgYmlnZ2VyIHRoYW4gei4gICovCisgIERPVUJMRV9OQU5fSU5GX0FDVElPTiAoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGQgPCAwLjAgPyAxIDogLTEpKTsKKworICBpZiAoZCA9PSAwLjApCisgICAgcmV0dXJuIFNJWihmKTsKKworICBQVFIoZGYpID0gZGFycmF5OworICBTSVooZGYpID0gKGQgPj0gMC4wID8gTElNQlNfUEVSX0RPVUJMRSA6IC1MSU1CU19QRVJfRE9VQkxFKTsKKyAgRVhQKGRmKSA9IF9fZ21wX2V4dHJhY3RfZG91YmxlIChkYXJyYXksIEFCUyhkKSk7CisKKyAgcmV0dXJuIG1wZl9jbXAgKGYsIGRmKTsKK30KZGlmZiAtLWdpdCBhL21wZi9jbXBfc2kuYyBiL21wZi9jbXBfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ5ODgwCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2NtcF9zaS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiBtcGZfY21wX3NpIC0tIENvbXBhcmUgYSBmbG9hdCB3aXRoIGEgc2lnbmVkIGludGVnZXIuCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDE5OTktMjAwMiwgMjAwNCwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitpbnQKK21wZl9jbXBfc2kgKG1wZl9zcmNwdHIgdSwgbG9uZyBpbnQgdnZhbCkgX19HTVBfTk9USFJPVworeworICBtcF9zcmNwdHIgdXA7CisgIG1wX3NpemVfdCB1c2l6ZTsKKyAgbXBfZXhwX3QgdWV4cDsKKyAgbXBfbGltYl90IHVsaW1iOworICBpbnQgdXNpZ247CisgIHVuc2lnbmVkIGxvbmcgYWJzX3Z2YWw7CisKKyAgdXNpemUgPSBTSVogKHUpOworCisgIC8qIDEuIEFyZSB0aGUgc2lnbnMgZGlmZmVyZW50PyAgKi8KKyAgaWYgKCh1c2l6ZSA8IDApID09ICh2dmFsIDwgMCkpIC8qIGRvbid0IHVzZSB4b3IsIHR5cGUgc2l6ZSBtYXkgZGlmZmVyICovCisgICAgeworICAgICAgLyogVSBhbmQgViBhcmUgYm90aCBub24tbmVnYXRpdmUgb3IgYm90aCBuZWdhdGl2ZS4gICovCisgICAgICBpZiAodXNpemUgPT0gMCkKKwkvKiB2dmFsID49IDAgKi8KKwlyZXR1cm4gLSh2dmFsICE9IDApOworICAgICAgaWYgKHZ2YWwgPT0gMCkKKwkvKiB1c2l6ZSA+PSAwICovCisJcmV0dXJuIHVzaXplICE9IDA7CisgICAgICAvKiBGYWxsIG91dC4gICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRWl0aGVyIFUgb3IgViBpcyBuZWdhdGl2ZSwgYnV0IG5vdCBib3RoLiAgKi8KKyAgICAgIHJldHVybiB1c2l6ZSA+PSAwID8gMSA6IC0xOworICAgIH0KKworICAvKiBVIGFuZCBWIGhhdmUgdGhlIHNhbWUgc2lnbiBhbmQgYXJlIGJvdGggbm9uLXplcm8uICAqLworCisgIC8qIDIuIEFyZSB0aGUgZXhwb25lbnRzIGRpZmZlcmVudCAoVidzIGV4cG9uZW50ID09IDEpPyAgKi8KKyAgdWV4cCA9IEVYUCAodSk7CisgIHVzaWduID0gdXNpemUgPj0gMCA/IDEgOiAtMTsKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgYWJzX3Z2YWwgPSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZywgdnZhbCk7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgaWYgKHVleHAgIT0gMSArIChhYnNfdnZhbCA+IEdNUF9OVU1CX01BWCkpCisgICAgcmV0dXJuICh1ZXhwIDwgMSArIChhYnNfdnZhbCA+IEdNUF9OVU1CX01BWCkpID8gLXVzaWduIDogdXNpZ247CisjZWxzZQorICBpZiAodWV4cCAhPSAxKQorICAgIHJldHVybiAodWV4cCA8IDEpID8gLXVzaWduIDogdXNpZ247CisjZW5kaWYKKworICB1cCA9IFBUUiAodSk7CisKKyAgQVNTRVJUICh1c2l6ZSA+IDApOworICB1bGltYiA9IHVwWy0tdXNpemVdOworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorICBpZiAodWV4cCA9PSAyKQorICAgIHsKKyAgICAgIGlmICgodWxpbWIgPj4gR01QX05BSUxfQklUUykgIT0gMCkKKwlyZXR1cm4gdXNpZ247CisgICAgICB1bGltYiA9ICh1bGltYiA8PCBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIGlmICh1c2l6ZSAhPSAwKSB1bGltYiB8PSB1cFstLXVzaXplXTsKKyAgICB9CisjZW5kaWYKKworICAvKiAzLiBDb21wYXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IG1hbnRpc3NhIGxpbWIgd2l0aCBWLiAgKi8KKyAgaWYgKHVsaW1iICE9IGFic192dmFsKQorICAgIHJldHVybiAodWxpbWIgPCBhYnNfdnZhbCkgPyAtdXNpZ24gOiB1c2lnbjsKKworICAvKiBJZ25vcmUgemVyb2VzIGF0IHRoZSBsb3cgZW5kIG9mIFUuICAqLworICBmb3IgKDsgKnVwID09IDA7ICsrdXApCisgICAgLS11c2l6ZTsKKworICAvKiA0LiBOb3csIGlmIHRoZSBudW1iZXIgb2YgbGltYnMgYXJlIGRpZmZlcmVudCwgd2UgaGF2ZSBhIGRpZmZlcmVuY2UKKyAgICAgc2luY2Ugd2UgaGF2ZSBtYWRlIHN1cmUgdGhlIHRyYWlsaW5nIGxpbWJzIGFyZSBub3QgemVyby4gICovCisgIGlmICh1c2l6ZSA+IDApCisgICAgcmV0dXJuIHVzaWduOworCisgIC8qIFdvdywgd2UgZ290IHplcm8gZXZlbiBpZiB3ZSB0cmllZCBoYXJkIHRvIGF2b2lkIGl0LiAgKi8KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tcGYvY21wX3VpLmMgYi9tcGYvY21wX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL21wZi9jbXBfdWkuYwpAQCAtMCwwICsxLDg3IEBACisvKiBtcGZfY21wX3VpIC0tIENvbXBhcmUgYSBmbG9hdCB3aXRoIGFuIHVuc2lnbmVkIGludGVnZXIuCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDE5OTksIDIwMDEsIDIwMDIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitpbnQKK21wZl9jbXBfdWkgKG1wZl9zcmNwdHIgdSwgdW5zaWduZWQgbG9uZyBpbnQgdnZhbCkgX19HTVBfTk9USFJPVworeworICBtcF9zcmNwdHIgdXA7CisgIG1wX3NpemVfdCB1c2l6ZTsKKyAgbXBfZXhwX3QgdWV4cDsKKyAgbXBfbGltYl90IHVsaW1iOworCisgIHVzaXplID0gU0laICh1KTsKKworICAvKiAxLiBJcyBVIG5lZ2F0aXZlPyAgKi8KKyAgaWYgKHVzaXplIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIC8qIFdlIHJlbHkgb24gdXNpemUgYmVpbmcgbm9uLW5lZ2F0aXZlIGluIHRoZSBjb2RlIHRoYXQgZm9sbG93cy4gICovCisKKyAgaWYgKHZ2YWwgPT0gMCkKKyAgICByZXR1cm4gdXNpemUgIT0gMDsKKworICAvKiAyLiBBcmUgdGhlIGV4cG9uZW50cyBkaWZmZXJlbnQgKFYncyBleHBvbmVudCA9PSAxKT8gICovCisgIHVleHAgPSBFWFAgKHUpOworCisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGlmICh1ZXhwICE9IDEgKyAodnZhbCA+IEdNUF9OVU1CX01BWCkpCisgICAgcmV0dXJuICh1ZXhwIDwgMSArICh2dmFsID4gR01QX05VTUJfTUFYKSkgPyAtMSA6IDE7CisjZWxzZQorICBpZiAodWV4cCAhPSAxKQorICAgIHJldHVybiAodWV4cCA8IDEpID8gLTEgOiAxOworI2VuZGlmCisKKyAgdXAgPSBQVFIgKHUpOworCisgIEFTU0VSVCAodXNpemUgPiAwKTsKKyAgdWxpbWIgPSB1cFstLXVzaXplXTsKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgaWYgKHVleHAgPT0gMikKKyAgICB7CisgICAgICBpZiAoKHVsaW1iID4+IEdNUF9OQUlMX0JJVFMpICE9IDApCisJcmV0dXJuIDE7CisgICAgICB1bGltYiA9ICh1bGltYiA8PCBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIGlmICh1c2l6ZSAhPSAwKSB1bGltYiB8PSB1cFstLXVzaXplXTsKKyAgICB9CisjZW5kaWYKKworICAvKiAzLiBDb21wYXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IG1hbnRpc3NhIGxpbWIgd2l0aCBWLiAgKi8KKyAgaWYgKHVsaW1iICE9IHZ2YWwpCisgICAgcmV0dXJuICh1bGltYiA8IHZ2YWwpID8gLTEgOiAxOworCisgIC8qIElnbm9yZSB6ZXJvZXMgYXQgdGhlIGxvdyBlbmQgb2YgVS4gICovCisgIGZvciAoOyAqdXAgPT0gMDsgKyt1cCkKKyAgICAtLXVzaXplOworCisgIC8qIDQuIE5vdywgaWYgdGhlIG51bWJlciBvZiBsaW1icyBhcmUgZGlmZmVyZW50LCB3ZSBoYXZlIGEgZGlmZmVyZW5jZQorICAgICBzaW5jZSB3ZSBoYXZlIG1hZGUgc3VyZSB0aGUgdHJhaWxpbmcgbGltYnMgYXJlIG5vdCB6ZXJvLiAgKi8KKyAgcmV0dXJuICh1c2l6ZSA+IDApOworfQpkaWZmIC0tZ2l0IGEvbXBmL2NtcF96LmMgYi9tcGYvY21wX3ouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk5ODBmCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2NtcF96LmMKQEAgLTAsMCArMSw0NSBAQAorLyogbXBmX2NtcF96IC0tIENvbXBhcmUgYSBmbG9hdCB3aXRoIGFuIGludGVnZXIuCisKK0NvcHlyaWdodCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CittcGZfY21wX3ogKG1wZl9zcmNwdHIgdSwgbXB6X3NyY3B0ciB2KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wZl90IHZmOworICBtcF9zaXplX3Qgc2l6ZTsKKworICBTSVogKHZmKSA9IHNpemUgPSBTSVogKHYpOworICBFWFAgKHZmKSA9IHNpemUgPSBBQlMgKHNpemUpOworICAvKiBQUkVDICh2ZikgPSBzaXplOyAqLworICBQVFIgKHZmKSA9IFBUUiAodik7CisKKyAgcmV0dXJuIG1wZl9jbXAgKHUsIHZmKTsKK30KZGlmZiAtLWdpdCBhL21wZi9kaXYuYyBiL21wZi9kaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTNhZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL2Rpdi5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBtcGZfZGl2IC0tIERpdmlkZSB0d28gZmxvYXRzLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA0LCAyMDA1LCAyMDEwLCAyMDEyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogTm90IGRvbmU6CisKKyAgIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBpZGVudGlmeSBhbiBvdmVybGFwIHU9PXYuICBUaGUgcmVzdWx0IHdpbGwgYmUKKyAgIGNvcnJlY3QgKDEuMCksIGJ1dCBhIGZ1bGwgYWN0dWFsIGRpdmlzaW9uIGlzIGRvbmUgd2hlcmVhcyBvZiBjb3Vyc2UKKyAgIHgveD09MSBuZWVkcyBubyB3b3JrLiAgU3VjaCBhIGNhbGwgaXMgbm90IGEgc2Vuc2libGUgdGhpbmcgdG8gbWFrZSwgYW5kCisgICBpdCdzIGxlZnQgdG8gYW4gYXBwbGljYXRpb24gdG8gbm90aWNlIGFuZCBvcHRpbWl6ZSBpZiBpdCBtaWdodCBhcmlzZQorICAgc29tZWhvdyB0aHJvdWdoIHBvaW50ZXIgYWxpYXNpbmcgb3Igd2hhdGV2ZXIuCisKKyAgIEVuaGFuY2VtZW50czoKKworICAgVGhlIGhpZ2ggcXVvdGllbnQgbGltYiBpcyBub24temVybyB3aGVuIGhpZ2h7dXAsdnNpemV9ID49IHt2cCx2c2l6ZX0uICBXZQorICAgY291bGQgbWFrZSB0aGF0IGNvbXBhcmlzb24gYW5kIHVzZSBxc2l6ZT09cHJlYyBpbnN0ZWFkIG9mIHFzaXplPT1wcmVjKzEsCisgICB0byBzYXZlIG9uZSBsaW1iIGluIHRoZSBkaXZpc2lvbi4KKworICAgSWYgcj09dSBidXQgdGhlIHNpemUgaXMgZW5vdWdoIGJpZ2dlciB0aGFuIHByZWMgdGhhdCB0aGVyZSB3b24ndCBiZSBhbgorICAgb3ZlcmxhcCBiZXR3ZWVuIHF1b3RpZW50IGFuZCBkaXZpZGVuZCBpbiBtcG5fZGl2X3EsIHRoZW4gd2UgY2FuIGF2b2lkCisgICBjb3B5aW5nIHVwLHVzaXplLiAgVGhpcyB3b3VsZCBvbmx5IGFyaXNlIGZyb20gYSBwcmVjIHJlZHVjZWQgd2l0aAorICAgbXBmX3NldF9wcmVjX3JhdyBhbmQgd2lsbCBiZSBwcmV0dHkgdW51c3VhbCwgYnV0IG1pZ2h0IGJlIHdvcnRod2hpbGUgaWYKKyAgIGl0IGNvdWxkIGJlIHdvcmtlZCBpbnRvIHRoZSBjb3B5X3UgZGVjaXNpb24gY2xlYW5seS4gICovCisKK3ZvaWQKK21wZl9kaXYgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYpCit7CisgIG1wX3NyY3B0ciB1cCwgdnA7CisgIG1wX3B0ciBycCwgdHAsIG5ld192cDsKKyAgbXBfc2l6ZV90IHVzaXplLCB2c2l6ZSwgcnNpemUsIHByb3NwZWN0aXZlX3JzaXplLCB0c2l6ZSwgemVyb3M7CisgIG1wX3NpemVfdCBzaWduX3F1b3RpZW50LCBwcmVjLCBoaWdoX3plcm8sIGNob3A7CisgIG1wX2V4cF90IHJleHA7CisgIGludCBjb3B5X3U7CisgIFRNUF9ERUNMOworCisgIHVzaXplID0gU0laKHUpOworICB2c2l6ZSA9IFNJWih2KTsKKworICBpZiAoVU5MSUtFTFkgKHZzaXplID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIGlmICh1c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIFNJWihyKSA9IDA7CisgICAgICBFWFAocikgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzaWduX3F1b3RpZW50ID0gdXNpemUgXiB2c2l6ZTsKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgdnNpemUgPSBBQlMgKHZzaXplKTsKKyAgcHJlYyA9IFBSRUMocik7CisKKyAgVE1QX01BUks7CisgIHJleHAgPSBFWFAodSkgLSBFWFAodikgKyAxOworCisgIHJwID0gUFRSKHIpOworICB1cCA9IFBUUih1KTsKKyAgdnAgPSBQVFIodik7CisKKyAgcHJvc3BlY3RpdmVfcnNpemUgPSB1c2l6ZSAtIHZzaXplICsgMTsgLyogcXVvdCBmcm9tIHVzaW5nIGdpdmVuIHUsdiBzaXplcyAqLworICByc2l6ZSA9IHByZWMgKyAxOwkJCSAvKiBkZXNpcmVkIHF1b3QgKi8KKworICB6ZXJvcyA9IHJzaXplIC0gcHJvc3BlY3RpdmVfcnNpemU7CSAvKiBwYWRkaW5nIHUgdG8gZ2l2ZSByc2l6ZSAqLworICBjb3B5X3UgPSAoemVyb3MgPiAwIHx8IHJwID09IHVwKTsJIC8qIGNvcHkgdSBpZiBvdmVybGFwIG9yIHBhZGRpbmcgKi8KKworICBjaG9wID0gTUFYICgtemVyb3MsIDApOwkJIC8qIG5lZ2F0aXZlIHplcm9zIG1lYW5zIHNob3J0ZW4gdSAqLworICB1cCArPSBjaG9wOworICB1c2l6ZSAtPSBjaG9wOworICB6ZXJvcyArPSBjaG9wOwkJCSAvKiBub3cgemVyb3MgPj0gMCAqLworCisgIHRzaXplID0gdXNpemUgKyB6ZXJvczsJCSAvKiBzaXplIGZvciBwb3NzaWJsZSBjb3B5IG9mIHUgKi8KKworICAvKiBjb3B5IGFuZCBwb3NzaWJseSBleHRlbmQgdSBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNvcHlfdSkKKyAgICB7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAodHNpemUgKyAxKTsJLyogKzEgZm9yIG1wbl9kaXZfcSdzIHNjcmF0Y2ggbmVlZHMgKi8KKyAgICAgIE1QTl9aRVJPICh0cCwgemVyb3MpOworICAgICAgTVBOX0NPUFkgKHRwK3plcm9zLCB1cCwgdXNpemUpOworICAgICAgdXAgPSB0cDsKKyAgICAgIHVzaXplID0gdHNpemU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHVzaXplICsgMSk7CisgICAgfQorCisgIC8qIGVuc3VyZSBkaXZpc29yIGRvZXNuJ3Qgb3ZlcmxhcCBxdW90aWVudCAqLworICBpZiAocnAgPT0gdnApCisgICAgeworICAgICAgbmV3X3ZwID0gVE1QX0FMTE9DX0xJTUJTICh2c2l6ZSk7CisgICAgICBNUE5fQ09QWSAobmV3X3ZwLCB2cCwgdnNpemUpOworICAgICAgdnAgPSBuZXdfdnA7CisgICAgfQorCisgIEFTU0VSVCAodXNpemUtdnNpemUrMSA9PSByc2l6ZSk7CisgIG1wbl9kaXZfcSAocnAsIHVwLCB1c2l6ZSwgdnAsIHZzaXplLCB0cCk7CisKKyAgLyogc3RyaXAgcG9zc2libGUgemVybyBoaWdoIGxpbWIgKi8KKyAgaGlnaF96ZXJvID0gKHJwW3JzaXplLTFdID09IDApOworICByc2l6ZSAtPSBoaWdoX3plcm87CisgIHJleHAgLT0gaGlnaF96ZXJvOworCisgIFNJWihyKSA9IHNpZ25fcXVvdGllbnQgPj0gMCA/IHJzaXplIDogLXJzaXplOworICBFWFAocikgPSByZXhwOworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wZi9kaXZfMmV4cC5jIGIvbXBmL2Rpdl8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NTJjMQotLS0gL2Rldi9udWxsCisrKyBiL21wZi9kaXZfMmV4cC5jCkBAIC0wLDAgKzEsMTM4IEBACisvKiBtcGZfZGl2XzJleHAgLS0gRGl2aWRlIGEgZmxvYXQgYnkgMl5uLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBNdWx0aXBsZXMgb2YgR01QX05VTUJfQklUUyBpbiBleHAgc2ltcGx5IG1lYW4gYW4gYW1vdW50IHN1YnRyYWN0ZWQgZnJvbQorICAgRVhQKHUpIHRvIHNldCBFWFAocikuICBUaGUgcmVtYWluZGVyIGV4cCVHTVBfTlVNQl9CSVRTIGlzIHRoZW4gYSByaWdodAorICAgc2hpZnQgZm9yIHRoZSBsaW1iIGRhdGEuCisKKyAgIElmIGV4cCVHTVBfTlVNQl9CSVRTID09IDAgdGhlbiB0aGVyZSdzIG5vIHNoaWZ0aW5nLCB3ZSBlZmZlY3RpdmVseSBqdXN0CisgICBkbyBhbiBtcHpfc2V0IHdpdGggY2hhbmdlZCBFWFAocikuICBMaWtlIG1wel9zZXQgd2UgdGFrZSBwcmVjKzEgbGltYnMgaW4KKyAgIHRoaXMgY2FzZS4gIEFsdGhvdWdoIGp1c3QgcHJlYyB3b3VsZCBzdWZmaWNlLCBpdCdzIG5pY2UgdG8gaGF2ZQorICAgbXBmX2Rpdl8yZXhwIHdpdGggZXhwPT0wIGNvbWUgb3V0IHRoZSBzYW1lIGFzIG1wel9zZXQuCisKKyAgIFdoZW4gc2hpZnRpbmcgd2UgdGFrZSB1cCB0byBwcmVjIG1hbnkgbGltYnMgZnJvbSB0aGUgaW5wdXQuICBPdXIgc2hpZnQgaXMKKyAgIGN5ID0gbXBuX3JzaGlmdCAoUFRSKHIpKzEsIFBUUih1KStrLCAuLi4pLCB3aGVyZSBrIGlzIHRoZSBudW1iZXIgb2YgbG93CisgICBsaW1icyBkcm9wcGVkIGZyb20gdSwgYW5kIHRoZSBjYXJyeSBvdXQgaXMgc3RvcmVkIHRvIFBUUihyKVswXS4gIFdlIGRvbid0CisgICB0cnkgdG8gd29yayBleHRyYSBiaXRzIGZyb20gUFRSKHUpW2stMV0gKHdoZW4gaz49MSBtYWtlcyBpdCBhdmFpbGFibGUpCisgICBpbnRvIHRoYXQgbG93IGNhcnJ5IGxpbWIuICBKdXN0IHByZWMgbGltYnMgKHdpdGggdGhlIGhpZ2ggbm9uLXplcm8pIGZyb20KKyAgIHRoZSBpbnB1dCBpcyBlbm91Z2ggYml0cyBmb3IgdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBwcmVjaXNpb24sIG5vIG5lZWQKKyAgIHRvIGRvIGV4dHJhIHdvcmsuCisKKyAgIElmIHI9PXUgdGhlIHNoaWZ0IHdpbGwgaGF2ZSBvdmVybGFwcGluZyBvcGVyYW5kcy4gIFdoZW4gaz49MSAoaWUuIHdoZW4KKyAgIHVzaXplID4gcHJlYyksIHRoZSBvdmVybGFwIGlzIGluIHRoZSBzdHlsZSBzdXBwb3J0ZWQgYnkgcnNoaWZ0IChpZS4gZHN0CisgICA8PSBzcmMpLgorCisgICBCdXQgd2hlbiByPT11IGFuZCBrPT0wIChpZS4gdXNpemUgPD0gcHJlYyksIHdlIHdvdWxkIGhhdmUgYW4gaW52YWxpZAorICAgb3ZlcmxhcCAobXBuX3JzaGlmdCAocnArMSwgcnAsIC4uLikpLiAgSW4gdGhpcyBjYXNlIHdlIG11c3QgaW5zdGVhZCB1c2UKKyAgIG1wbl9sc2hpZnQgKFBUUihyKSwgUFRSKHUpLCBzaXplLCBOVU1CLXNoaWZ0KS4gIEFuIGxzaGlmdCBieSBOVU1CLXNoaWZ0CisgICBiaXRzIGdpdmVzIGlkZW50aWNhbCBkYXRhIG9mIGNvdXJzZSwgaXQncyBqdXN0IGl0cyBvdmVybGFwIHJlc3RyaWN0aW9ucworICAgd2hpY2ggZGlmZmVyLgorCisgICBJbiBib3RoIHNoaWZ0IGNhc2VzLCB0aGUgcmVzdWx0aW5nIGRhdGEgaXMgYWJzX3VzaXplKzEgbGltYnMuICAiYWRqIiBpcworICAgdXNlZCB0byBhZGQgKzEgdG8gdGhhdCBzaXplIGlmIHRoZSBoaWdoIGlzIG5vbi16ZXJvIChpdCBtYXkgb2YgY291cnNlCisgICBoYXZlIGJlY29tZSB6ZXJvIGJ5IHRoZSBzaGlmdGluZykuICBFWFAodSkgaXMgdGhlIGV4cG9uZW50IGp1c3QgYWJvdmUKKyAgIHRob3NlIGFic191c2l6ZSsxIGxpbWJzLCBzbyBpdCBnZXRzIC0xK2Fkaiwgd2hpY2ggbWVhbnMgLTEgaWYgdGhlIGhpZ2ggaXMKKyAgIHplcm8sIG9yIG5vIGNoYW5nZSBpZiB0aGUgaGlnaCBpcyBub24temVyby4KKworICAgRW5oYW5jZW1lbnRzOgorCisgICBUaGUgd2F5IG1wbl9sc2hpZnQgaXMgdXNlZCBtZWFucyBzdWNjZXNzaXZlIG1wZl9kaXZfMmV4cCBjYWxscyBvbiB0aGUKKyAgIHNhbWUgb3BlcmFuZCB3aWxsIGFjY3VtdWxhdGUgbG93IHplcm8gbGltYnMsIHVudGlsIHByZWMrMSBsaW1icyBpcworICAgcmVhY2hlZC4gIFRoaXMgaXMgd2FzdGVmdWwgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4gIFdoZW4gYWJzX3VzaXplIDw9CisgICBwcmVjLCB3ZSBzaG91bGQgdGVzdCB0aGUgbG93IGV4cCVHTVBfTlVNQl9CSVRTIG1hbnkgYml0cyBvZiBQVFIodSlbMF0sCisgICBpZS4gdGhvc2Ugd2hpY2ggd291bGQgYmUgc2hpZnRlZCBvdXQgYnkgYW4gbXBuX3JzaGlmdC4gIElmIHRoZXkncmUgemVybworICAgdGhlbiB1c2UgdGhhdCBtcG5fcnNoaWZ0LiAgKi8KKwordm9pZAorbXBmX2Rpdl8yZXhwIChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSwgbXBfYml0Y250X3QgZXhwKQoreworICBtcF9zcmNwdHIgdXA7CisgIG1wX3B0ciBycCA9IHItPl9tcF9kOworICBtcF9zaXplX3QgdXNpemU7CisgIG1wX3NpemVfdCBhYnNfdXNpemU7CisgIG1wX3NpemVfdCBwcmVjID0gci0+X21wX3ByZWM7CisgIG1wX2V4cF90IHVleHAgPSB1LT5fbXBfZXhwOworCisgIHVzaXplID0gdS0+X21wX3NpemU7CisKKyAgaWYgKFVOTElLRUxZICh1c2l6ZSA9PSAwKSkKKyAgICB7CisgICAgICByLT5fbXBfc2l6ZSA9IDA7CisgICAgICByLT5fbXBfZXhwID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYWJzX3VzaXplID0gQUJTICh1c2l6ZSk7CisgIHVwID0gdS0+X21wX2Q7CisKKyAgaWYgKGV4cCAlIEdNUF9OVU1CX0JJVFMgPT0gMCkKKyAgICB7CisgICAgICBwcmVjKys7CQkJLyogcmV0YWluIG1vcmUgcHJlY2lzaW9uIGhlcmUgYXMgd2UgZG9uJ3QgbmVlZAorCQkJCSAgIHRvIGFjY291bnQgZm9yIGNhcnJ5LW91dCBoZXJlICovCisgICAgICBpZiAoYWJzX3VzaXplID4gcHJlYykKKwl7CisJICB1cCArPSBhYnNfdXNpemUgLSBwcmVjOworCSAgYWJzX3VzaXplID0gcHJlYzsKKwl9CisgICAgICBpZiAocnAgIT0gdXApCisJTVBOX0NPUFlfSU5DUiAocnAsIHVwLCBhYnNfdXNpemUpOworICAgICAgci0+X21wX2V4cCA9IHVleHAgLSBleHAgLyBHTVBfTlVNQl9CSVRTOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeV9saW1iOworICAgICAgbXBfc2l6ZV90IGFkajsKKyAgICAgIGlmIChhYnNfdXNpemUgPiBwcmVjKQorCXsKKwkgIHVwICs9IGFic191c2l6ZSAtIHByZWM7CisJICBhYnNfdXNpemUgPSBwcmVjOworCSAgLyogVXNlIG1wbl9yc2hpZnQgc2luY2UgbXBuX2xzaGlmdCBvcGVyYXRlcyBkb3dud2FyZHMsIGFuZCB3ZQorCSAgICAgdGhlcmVmb3JlIHdvdWxkIGNsb2JiZXIgcGFydCBvZiBVIGJlZm9yZSB1c2luZyB0aGF0IHBhcnQsIGluIGNhc2UKKwkgICAgIFIgaXMgdGhlIHNhbWUgdmFyaWFibGUgYXMgVS4gICovCisJICBjeV9saW1iID0gbXBuX3JzaGlmdCAocnAgKyAxLCB1cCwgYWJzX3VzaXplLCBleHAgJSBHTVBfTlVNQl9CSVRTKTsKKwkgIHJwWzBdID0gY3lfbGltYjsKKwkgIGFkaiA9IHJwW2Fic191c2l6ZV0gIT0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3lfbGltYiA9IG1wbl9sc2hpZnQgKHJwLCB1cCwgYWJzX3VzaXplLAorCQkJCUdNUF9OVU1CX0JJVFMgLSBleHAgJSBHTVBfTlVNQl9CSVRTKTsKKwkgIHJwW2Fic191c2l6ZV0gPSBjeV9saW1iOworCSAgYWRqID0gY3lfbGltYiAhPSAwOworCX0KKworICAgICAgYWJzX3VzaXplICs9IGFkajsKKyAgICAgIHItPl9tcF9leHAgPSB1ZXhwIC0gZXhwIC8gR01QX05VTUJfQklUUyAtIDEgKyBhZGo7CisgICAgfQorICByLT5fbXBfc2l6ZSA9IHVzaXplID49IDAgPyBhYnNfdXNpemUgOiAtYWJzX3VzaXplOworfQpkaWZmIC0tZ2l0IGEvbXBmL2Rpdl91aS5jIGIvbXBmL2Rpdl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZGl2X3VpLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIG1wZl9kaXZfdWkgLS0gRGl2aWRlIGEgZmxvYXQgd2l0aCBhbiB1bnNpZ25lZCBpbnRlZ2VyLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA0LCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKwordm9pZAorbXBmX2Rpdl91aSAobXBmX3B0ciByLCBtcGZfc3JjcHRyIHUsIHVuc2lnbmVkIGxvbmcgaW50IHYpCit7CisgIG1wX3NyY3B0ciB1cDsKKyAgbXBfcHRyIHJwLCB0cCwgcnRwOworICBtcF9zaXplX3QgdXNpemU7CisgIG1wX3NpemVfdCByc2l6ZSwgdHNpemU7CisgIG1wX3NpemVfdCBzaWduX3F1b3RpZW50OworICBtcF9zaXplX3QgcHJlYzsKKyAgbXBfbGltYl90IHFfbGltYjsKKyAgbXBfZXhwX3QgcmV4cDsKKyAgVE1QX0RFQ0w7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAodiA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcGZfdCB2ZjsKKyAgICAgIG1wX2xpbWJfdCB2bFsyXTsKKyAgICAgIFNJWih2ZikgPSAyOworICAgICAgRVhQKHZmKSA9IDI7CisgICAgICBQVFIodmYpID0gdmw7CisgICAgICB2bFswXSA9IHYgJiBHTVBfTlVNQl9NQVNLOworICAgICAgdmxbMV0gPSB2ID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICBtcGZfZGl2IChyLCB1LCB2Zik7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgaWYgKFVOTElLRUxZICh2ID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIHVzaXplID0gdS0+X21wX3NpemU7CisKKyAgaWYgKHVzaXplID09IDApCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgci0+X21wX2V4cCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpZ25fcXVvdGllbnQgPSB1c2l6ZTsKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgcHJlYyA9IHItPl9tcF9wcmVjOworCisgIFRNUF9NQVJLOworCisgIHJwID0gci0+X21wX2Q7CisgIHVwID0gdS0+X21wX2Q7CisKKyAgdHNpemUgPSAxICsgcHJlYzsKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRzaXplICsgMSk7CisKKyAgaWYgKHVzaXplID4gdHNpemUpCisgICAgeworICAgICAgdXAgKz0gdXNpemUgLSB0c2l6ZTsKKyAgICAgIHVzaXplID0gdHNpemU7CisgICAgICBydHAgPSB0cDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUE5fWkVSTyAodHAsIHRzaXplIC0gdXNpemUpOworICAgICAgcnRwID0gdHAgKyAodHNpemUgLSB1c2l6ZSk7CisgICAgfQorCisgIC8qIE1vdmUgdGhlIGRpdmlkZW5kIHRvIHRoZSByZW1haW5kZXIuICAqLworICBNUE5fQ09QWSAocnRwLCB1cCwgdXNpemUpOworCisgIG1wbl9kaXZtb2RfMSAocnAsIHRwLCB0c2l6ZSwgKG1wX2xpbWJfdCkgdik7CisgIHFfbGltYiA9IHJwW3RzaXplIC0gMV07CisKKyAgcnNpemUgPSB0c2l6ZSAtIChxX2xpbWIgPT0gMCk7CisgIHJleHAgPSB1LT5fbXBfZXhwIC0gKHFfbGltYiA9PSAwKTsKKyAgci0+X21wX3NpemUgPSBzaWduX3F1b3RpZW50ID49IDAgPyByc2l6ZSA6IC1yc2l6ZTsKKyAgci0+X21wX2V4cCA9IHJleHA7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBmL2R1bXAuYyBiL21wZi9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzN2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21wZi9kdW1wLmMKQEAgLTAsMCArMSw1MiBAQAorLyogbXBmX2R1bXAgLS0gRHVtcCBhIGZsb2F0IHRvIHN0ZG91dC4KKworICAgVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBOT1QgU0FGRSBUTworICAgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBUSElTCisgICBGVU5DVElPTiBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIGZvciBzdHJsZW4gKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfZHVtcCAobXBmX3NyY3B0ciB1KQoreworICBtcF9leHBfdCBleHA7CisgIGNoYXIgKnN0cjsKKworICBzdHIgPSBtcGZfZ2V0X3N0ciAoMCwgJmV4cCwgMTAsIDAsIHUpOworICBpZiAoc3RyWzBdID09ICctJykKKyAgICBwcmludGYgKCItMC4lc2UlbGRcbiIsIHN0ciArIDEsIGV4cCk7CisgIGVsc2UKKyAgICBwcmludGYgKCIwLiVzZSVsZFxuIiwgc3RyLCBleHApOworICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgc3RybGVuIChzdHIpICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvZXEuYyBiL21wZi9lcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGI5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZXEuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogbXBmX2VxIC0tIENvbXBhcmUgdHdvIGZsb2F0cyB1cCB0byBhIHNwZWNpZmllZCBiaXQgIy4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTYsIDIwMDEsIDIwMDIsIDIwMDgsIDIwMDksIDIwMTIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCitpbnQKK21wZl9lcSAobXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYsIG1wX2JpdGNudF90IG5fYml0cykKK3sKKyAgbXBfc3JjcHRyIHVwLCB2cCwgcDsKKyAgbXBfc2l6ZV90IHVzaXplLCB2c2l6ZSwgbWluc2l6ZSwgbWF4c2l6ZSwgbl9saW1icywgaSwgc2l6ZTsKKyAgbXBfZXhwX3QgdWV4cCwgdmV4cDsKKyAgbXBfbGltYl90IGRpZmY7CisgIGludCBjbnQ7CisKKyAgdWV4cCA9IHUtPl9tcF9leHA7CisgIHZleHAgPSB2LT5fbXBfZXhwOworCisgIHVzaXplID0gdS0+X21wX3NpemU7CisgIHZzaXplID0gdi0+X21wX3NpemU7CisKKyAgLyogMS4gQXJlIHRoZSBzaWducyBkaWZmZXJlbnQ/ICAqLworICBpZiAoKHVzaXplIF4gdnNpemUpID49IDApCisgICAgeworICAgICAgLyogVSBhbmQgViBhcmUgYm90aCBub24tbmVnYXRpdmUgb3IgYm90aCBuZWdhdGl2ZS4gICovCisgICAgICBpZiAodXNpemUgPT0gMCkKKwlyZXR1cm4gdnNpemUgPT0gMDsKKyAgICAgIGlmICh2c2l6ZSA9PSAwKQorCXJldHVybiAwOworCisgICAgICAvKiBGYWxsIG91dC4gICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRWl0aGVyIFUgb3IgViBpcyBuZWdhdGl2ZSwgYnV0IG5vdCBib3RoLiAgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBVIGFuZCBWIGhhdmUgdGhlIHNhbWUgc2lnbiBhbmQgYXJlIGJvdGggbm9uLXplcm8uICAqLworCisgIC8qIDIuIEFyZSB0aGUgZXhwb25lbnRzIGRpZmZlcmVudD8gICovCisgIGlmICh1ZXhwICE9IHZleHApCisgICAgcmV0dXJuIDA7CisKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgdnNpemUgPSBBQlMgKHZzaXplKTsKKworICB1cCA9IHUtPl9tcF9kOworICB2cCA9IHYtPl9tcF9kOworCisgIHVwICs9IHVzaXplOwkJCS8qIHBvaW50IGp1c3QgYWJvdmUgbW9zdCBzaWduaWZpY2FudCBsaW1iICovCisgIHZwICs9IHZzaXplOwkJCS8qIHBvaW50IGp1c3QgYWJvdmUgbW9zdCBzaWduaWZpY2FudCBsaW1iICovCisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCB1cFstMV0pOworICBpZiAoKHZwWy0xXSA+PiAoR01QX0xJTUJfQklUUyAtIDEgLSBjbnQpKSAhPSAxKQorICAgIHJldHVybiAwOwkJCS8qIG1zYiBwb3NpdGlvbnMgZGlmZmVyZW50ICovCisKKyAgbl9iaXRzICs9IGNudCAtIEdNUF9OQUlMX0JJVFM7CisgIG5fbGltYnMgPSAobl9iaXRzICsgR01QX05VTUJfQklUUyAtIDEpIC8gR01QX05VTUJfQklUUzsKKworICB1c2l6ZSA9IE1JTiAodXNpemUsIG5fbGltYnMpOworICB2c2l6ZSA9IE1JTiAodnNpemUsIG5fbGltYnMpOworCisjaWYgMAorICAvKiBJZ25vcmUgemVyb3MgYXQgdGhlIGxvdyBlbmQgb2YgVSBhbmQgVi4gICovCisgIHdoaWxlICh1cFswXSA9PSAwKQorICAgIHVwKyssIHVzaXplLS07CisgIHdoaWxlICh2cFswXSA9PSAwKQorICAgIHZwKyssIHZzaXplLS07CisjZW5kaWYKKworICBtaW5zaXplID0gTUlOICh1c2l6ZSwgdnNpemUpOworICBtYXhzaXplID0gdXNpemUgKyB2c2l6ZSAtIG1pbnNpemU7CisKKyAgdXAgLT0gbWluc2l6ZTsJCS8qIHBvaW50IGF0IG1vc3Qgc2lnbmlmaWNhbnQgY29tbW9uIGxpbWIgKi8KKyAgdnAgLT0gbWluc2l6ZTsJCS8qIHBvaW50IGF0IG1vc3Qgc2lnbmlmaWNhbnQgY29tbW9uIGxpbWIgKi8KKworICAvKiBDb21wYXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IHBhcnQgd2hpY2ggaGFzIGV4cGxpY2l0IGxpbWJzIGZvciBVIGFuZCBWLiAqLworICBmb3IgKGkgPSBtaW5zaXplIC0gMTsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICBpZiAodXBbaV0gIT0gdnBbaV0pCisJcmV0dXJuIDA7CisgICAgfQorCisgIG5fYml0cyAtPSAobWF4c2l6ZSAtIDEpICogR01QX05VTUJfQklUUzsKKworICBzaXplID0gbWF4c2l6ZSAtIG1pbnNpemU7CisgIGlmIChzaXplICE9IDApCisgICAgeworICAgICAgaWYgKHVwWzBdICE9IHZwWzBdKQorCXJldHVybiAwOworCisgICAgICAvKiBOb3cgZWl0aGVyIFUgb3IgViBoYXMgaXRzIGxpbWJzIGNvbnN1bWVkLCBpLmUsIGNvbnRpbnVlcyB3aXRoIGFuCisJIGluZmluaXRlIG51bWJlciBvZiBpbXBsaWNpdCB6ZXJvIGxpbWJzLiAgQ2hlY2sgdGhhdCB0aGUgb3RoZXIgb3BlcmFuZAorCSBoYXMganVzdCB6ZXJvcyBpbiB0aGUgY29ycmVzcG9uZGluZywgcmVsZXZhbnQgcGFydC4gICovCisKKyAgICAgIGlmICh1c2l6ZSA+IHZzaXplKQorCXAgPSB1cCAtIHNpemU7CisgICAgICBlbHNlCisJcCA9IHZwIC0gc2l6ZTsKKworICAgICAgZm9yIChpID0gc2l6ZSAtIDE7IGkgPiAwOyBpLS0pCisJeworCSAgaWYgKHBbaV0gIT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfQorCisgICAgICBkaWZmID0gcFswXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBCb3RoIFUgb3IgViBoYXMgaXRzIGxpbWJzIGNvbnN1bWVkLiAgKi8KKworICAgICAgZGlmZiA9IHVwWzBdIF4gdnBbMF07CisgICAgfQorCisgIGlmIChuX2JpdHMgPCBHTVBfTlVNQl9CSVRTKQorICAgIGRpZmYgPj49IEdNUF9OVU1CX0JJVFMgLSBuX2JpdHM7CisKKyAgcmV0dXJuIGRpZmYgPT0gMDsKK30KZGlmZiAtLWdpdCBhL21wZi9maXRzX3MuaCBiL21wZi9maXRzX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU3NGJlCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2ZpdHNfcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIG1wZl9maXRzX3MqX3AgLS0gdGVzdCB3aGV0aGVyIGFuIG1wZiBmaXRzIGEgQyBzaWduZWQgdHlwZS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIE5vdGljZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbXB6X3NldF9mICsgbXB6X2ZpdHNfcypfcC4gICovCisKK2ludAorRlVOQ1RJT04gKG1wZl9zcmNwdHIgZikgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3QgIGZzLCBmbjsKKyAgbXBfc3JjcHRyICBmcDsKKyAgbXBfZXhwX3QgICBleHA7CisgIG1wX2xpbWJfdCAgZmw7CisKKyAgZXhwID0gRVhQKGYpOworICBpZiAoZXhwIDwgMSkKKyAgICByZXR1cm4gMTsgIC8qIC0xIDwgZiA8IDEgdHJ1bmNhdGVzIHRvIHplcm8sIHNvIGZpdHMgKi8KKworICBmcyA9IFNJWiAoZik7CisgIGZwID0gUFRSKGYpOworICBmbiA9IEFCUyAoZnMpOworCisgIGlmIChleHAgPT0gMSkKKyAgICB7CisgICAgICBmbCA9IGZwW2ZuLTFdOworICAgIH0KKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgZWxzZSBpZiAoZXhwID09IDIgJiYgTUFYSU1VTSA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBmbCA9IGZwW2ZuLTFdOworICAgICAgaWYgKChmbCA+PiBHTVBfTkFJTF9CSVRTKSAhPSAwKQorCXJldHVybiAwOworICAgICAgZmwgPSAoZmwgPDwgR01QX05VTUJfQklUUyk7CisgICAgICBpZiAoZm4gPj0gMikKKyAgICAgICAgZmwgfD0gZnBbZm4tMl07CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZmwgPD0gKGZzID49IDAgPyAobXBfbGltYl90KSBNQVhJTVVNIDogTkVHX0NBU1QgKG1wX2xpbWJfdCwgTUlOSU1VTSkpOworfQpkaWZmIC0tZ2l0IGEvbXBmL2ZpdHNfc2ludC5jIGIvbXBmL2ZpdHNfc2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWNlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZml0c19zaW50LmMKQEAgLTAsMCArMSwzNiBAQAorLyogbXBmX2ZpdHNfc2ludF9wIC0tIHRlc3Qgd2hldGhlciBhbiBtcGYgZml0cyBhbiBpbnQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgRlVOQ1RJT04gICBtcGZfZml0c19zaW50X3AKKyNkZWZpbmUgTUFYSU1VTSAgICBJTlRfTUFYCisjZGVmaW5lIE1JTklNVU0gICAgSU5UX01JTgorCisjaW5jbHVkZSAiZml0c19zLmgiCmRpZmYgLS1naXQgYS9tcGYvZml0c19zbG9uZy5jIGIvbXBmL2ZpdHNfc2xvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRiNjhjCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2ZpdHNfc2xvbmcuYwpAQCAtMCwwICsxLDM2IEBACisvKiBtcGZfZml0c19zbG9uZ19wIC0tIHRlc3Qgd2hldGhlciBhbiBtcGYgZml0cyBhIGxvbmcuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgRlVOQ1RJT04gICBtcGZfZml0c19zbG9uZ19wCisjZGVmaW5lIE1BWElNVU0gICAgTE9OR19NQVgKKyNkZWZpbmUgTUlOSU1VTSAgICBMT05HX01JTgorCisjaW5jbHVkZSAiZml0c19zLmgiCmRpZmYgLS1naXQgYS9tcGYvZml0c19zc2hvcnQuYyBiL21wZi9maXRzX3NzaG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmM1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZml0c19zc2hvcnQuYwpAQCAtMCwwICsxLDM2IEBACisvKiBtcGZfZml0c19zc2hvcnRfcCAtLSB0ZXN0IHdoZXRoZXIgYW4gbXBmIGZpdHMgYSBzaG9ydC4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2RlZmluZSBGVU5DVElPTiAgIG1wZl9maXRzX3NzaG9ydF9wCisjZGVmaW5lIE1BWElNVU0gICAgU0hSVF9NQVgKKyNkZWZpbmUgTUlOSU1VTSAgICBTSFJUX01JTgorCisjaW5jbHVkZSAiZml0c19zLmgiCmRpZmYgLS1naXQgYS9tcGYvZml0c191LmggYi9tcGYvZml0c191LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3Y2E3OAotLS0gL2Rldi9udWxsCisrKyBiL21wZi9maXRzX3UuaApAQCAtMCwwICsxLDczIEBACisvKiBtcGZfZml0c191Kl9wIC0tIHRlc3Qgd2hldGhlciBhbiBtcGYgZml0cyBhIEMgdW5zaWduZWQgdHlwZS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTMsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIE5vdGljZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbXB6X3NldF9mICsgbXB6X2ZpdHNfdSpfcC4gICovCisKK2ludAorRlVOQ1RJT04gKG1wZl9zcmNwdHIgZikgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3QgIGZuOworICBtcF9zcmNwdHIgIGZwOworICBtcF9leHBfdCAgIGV4cDsKKyAgbXBfbGltYl90ICBmbDsKKworICBleHAgPSBFWFAoZik7CisgIGlmIChleHAgPCAxKQorICAgIHJldHVybiAxOyAgLyogLTEgPCBmIDwgMSB0cnVuY2F0ZXMgdG8gemVybywgc28gZml0cyAqLworCisgIGZuID0gU0laKGYpOworICBpZiAoZm4gPCAwKSAvKiB6ZXJvIGNhdGNoZWQgYnkgZXhwID09IDAgKi8KKyAgICByZXR1cm4gMDsgLyogbmVnYXRpdmVzIGRvbid0IGZpdCAqLworCisgIGZwID0gUFRSKGYpOworCisgIGlmIChleHAgPT0gMSkKKyAgICB7CisgICAgICBmbCA9IGZwW2ZuLTFdOworICAgIH0KKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgZWxzZSBpZiAoZXhwID09IDIgJiYgTUFYSU1VTSA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBmbCA9IGZwW2ZuLTFdOworICAgICAgaWYgKChmbCA+PiBHTVBfTkFJTF9CSVRTKSAhPSAwKQorCXJldHVybiAwOworICAgICAgZmwgPSAoZmwgPDwgR01QX05VTUJfQklUUyk7CisgICAgICBpZiAoZm4gPj0gMikKKyAgICAgICAgZmwgfD0gZnBbZm4tMl07CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZmwgPD0gTUFYSU1VTTsKK30KZGlmZiAtLWdpdCBhL21wZi9maXRzX3VpbnQuYyBiL21wZi9maXRzX3VpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjEwN2IwCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2ZpdHNfdWludC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIG1wZl9maXRzX3VpbnRfcCAtLSB0ZXN0IHdoZXRoZXIgYW4gbXBmIGZpdHMgYW4gdW5zaWduZWQgaW50LgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjZGVmaW5lIEZVTkNUSU9OICBtcGZfZml0c191aW50X3AKKyNkZWZpbmUgTUFYSU1VTSAgIFVJTlRfTUFYCisKKyNpbmNsdWRlICJmaXRzX3UuaCIKZGlmZiAtLWdpdCBhL21wZi9maXRzX3Vsb25nLmMgYi9tcGYvZml0c191bG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZml0c191bG9uZy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIG1wZl9maXRzX3Vsb25nX3AgLS0gdGVzdCB3aGV0aGVyIGFuIG1wZiBmaXRzIGFuIHVuc2lnbmVkIGxvbmcuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgRlVOQ1RJT04gIG1wZl9maXRzX3Vsb25nX3AKKyNkZWZpbmUgTUFYSU1VTSAgIFVMT05HX01BWAorCisjaW5jbHVkZSAiZml0c191LmgiCmRpZmYgLS1naXQgYS9tcGYvZml0c191c2hvcnQuYyBiL21wZi9maXRzX3VzaG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTNmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZml0c191c2hvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBtcGZfZml0c191c2hvcnRfcCAtLSB0ZXN0IHdoZXRoZXIgYW4gbXBmIGZpdHMgYW4gdW5zaWduZWQgc2hvcnQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgRlVOQ1RJT04gIG1wZl9maXRzX3VzaG9ydF9wCisjZGVmaW5lIE1BWElNVU0gICBVU0hSVF9NQVgKKworI2luY2x1ZGUgImZpdHNfdS5oIgpkaWZmIC0tZ2l0IGEvbXBmL2dldF9kLmMgYi9tcGYvZ2V0X2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgyNmZiCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2dldF9kLmMKQEAgLTAsMCArMSw0NiBAQAorLyogZG91YmxlIG1wZl9nZXRfZCAobXBmX3Qgc3JjKSAtLSByZXR1cm4gU1JDIHRydW5jYXRlZCB0byBhIGRvdWJsZS4KKworQ29weXJpZ2h0IDE5OTYsIDIwMDEtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2RvdWJsZQorbXBmX2dldF9kIChtcGZfc3JjcHRyIHNyYykKK3sKKyAgbXBfc2l6ZV90ICBzaXplLCBhYnNfc2l6ZTsKKyAgbG9uZyAgICAgICBleHA7CisKKyAgc2l6ZSA9IFNJWiAoc3JjKTsKKyAgaWYgKFVOTElLRUxZIChzaXplID09IDApKQorICAgIHJldHVybiAwLjA7CisKKyAgYWJzX3NpemUgPSBBQlMgKHNpemUpOworICBleHAgPSAoRVhQIChzcmMpIC0gYWJzX3NpemUpICogR01QX05VTUJfQklUUzsKKyAgcmV0dXJuIG1wbl9nZXRfZCAoUFRSIChzcmMpLCBhYnNfc2l6ZSwgc2l6ZSwgZXhwKTsKK30KZGlmZiAtLWdpdCBhL21wZi9nZXRfZF8yZXhwLmMgYi9tcGYvZ2V0X2RfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGE3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZ2V0X2RfMmV4cC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIGRvdWJsZSBtcGZfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICpleHAsIG1wZl90IHNyYykuCisKK0NvcHlyaWdodCAyMDAxLTIwMDQsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworZG91YmxlCittcGZfZ2V0X2RfMmV4cCAoc2lnbmVkIGxvbmcgaW50ICpleHBwdHIsIG1wZl9zcmNwdHIgc3JjKQoreworICBtcF9zaXplX3Qgc2l6ZSwgYWJzX3NpemU7CisgIG1wX3NyY3B0ciBwdHI7CisgIGludCBjbnQ7CisKKyAgc2l6ZSA9IFNJWihzcmMpOworICBpZiAoVU5MSUtFTFkgKHNpemUgPT0gMCkpCisgICAgeworICAgICAgKmV4cHB0ciA9IDA7CisgICAgICByZXR1cm4gMC4wOworICAgIH0KKworICBwdHIgPSBQVFIoc3JjKTsKKyAgYWJzX3NpemUgPSBBQlMgKHNpemUpOworICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIHB0clthYnNfc2l6ZSAtIDFdKTsKKyAgY250IC09IEdNUF9OQUlMX0JJVFM7CisKKyAgKmV4cHB0ciA9IEVYUChzcmMpICogR01QX05VTUJfQklUUyAtIGNudDsKKyAgcmV0dXJuIG1wbl9nZXRfZCAocHRyLCBhYnNfc2l6ZSwgc2l6ZSwgLShhYnNfc2l6ZSAqIEdNUF9OVU1CX0JJVFMgLSBjbnQpKTsKK30KZGlmZiAtLWdpdCBhL21wZi9nZXRfZGZsX3ByZWMuYyBiL21wZi9nZXRfZGZsX3ByZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZjNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL2dldF9kZmxfcHJlYy5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIG1wZl9nZXRfZGVmYXVsdF9wcmVjIC0tIHJldHVybiBkZWZhdWx0IHByZWNpc2lvbiBpbiBiaXRzLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworbXBfYml0Y250X3QKK21wZl9nZXRfZGVmYXVsdF9wcmVjICh2b2lkKSBfX0dNUF9OT1RIUk9XCit7CisgIHJldHVybiBfX0dNUEZfUFJFQ19UT19CSVRTIChfX2dtcF9kZWZhdWx0X2ZwX2xpbWJfcHJlY2lzaW9uKTsKK30KZGlmZiAtLWdpdCBhL21wZi9nZXRfcHJjLmMgYi9tcGYvZ2V0X3ByYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWU5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvZ2V0X3ByYy5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIG1wZl9nZXRfcHJlYyh4KSAtLSBSZXR1cm4gdGhlIHByZWNpc2lvbiBpbiBiaXRzIG9mIHguCisKK0NvcHlyaWdodCAxOTk2LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworbXBfYml0Y250X3QKK21wZl9nZXRfcHJlYyAobXBmX3NyY3B0ciB4KSBfX0dNUF9OT1RIUk9XCit7CisgIHJldHVybiBfX0dNUEZfUFJFQ19UT19CSVRTICh4LT5fbXBfcHJlYyk7Cit9CmRpZmYgLS1naXQgYS9tcGYvZ2V0X3NpLmMgYi9tcGYvZ2V0X3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL21wZi9nZXRfc2kuYwpAQCAtMCwwICsxLDg2IEBACisvKiBtcGZfZ2V0X3NpIC0tIG1wZiB0byBsb25nIGNvbnZlcnNpb24KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEFueSBmcmFjdGlvbiBiaXRzIGFyZSB0cnVuY2F0ZWQsIG1lYW5pbmcgc2ltcGx5IGRpc2NhcmRlZC4KKworICAgRm9yIHZhbHVlcyBiaWdnZXIgdGhhbiBhIGxvbmcsIHRoZSBsb3cgYml0cyBhcmUgcmV0dXJuZWQsIGxpa2UKKyAgIG1wel9nZXRfc2ksIGJ1dCB0aGlzIGlzbid0IGRvY3VtZW50ZWQuCisKKyAgIE5vdGljZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbXB6X3NldF9mICsgbXB6X2dldF9zaS4KKworCisgICBJbXBsZW1lbnRhdGlvbjoKKworICAgZmwgaXMgZXN0YWJsaXNoZWQgaW4gYmFzaWNhbGx5IHRoZSBzYW1lIHdheSBhcyBmb3IgbXBmX2dldF91aSwgc2VlIHRoYXQKKyAgIGNvZGUgZm9yIGV4cGxhbmF0aW9ucyBvZiB0aGUgY29uZGl0aW9ucy4KKworICAgSG93ZXZlciB1bmxpa2UgbXBmX2dldF91aSB3ZSBuZWVkIGFuIGV4cGxpY2l0IHJldHVybiAwIGZvciBleHA8PTAuICBXaGVuCisgICBmIGlzIGEgbmVnYXRpdmUgZnJhY3Rpb24gKGllLiBzaXplPDAgYW5kIGV4cDw9MCkgd2UgY2FuJ3QgbGV0IGZsPT0wIGdvCisgICB0aHJvdWdoIHRvIHRoZSB6YW55IGZpbmFsICJ+ICgoZmwgLSAxKSAmIExPTkdfTUFYKSIsIHRoYXQgd291bGQgZ2l2ZQorICAgLTB4ODAwMDAwMDAgaW5zdGVhZCBvZiB0aGUgZGVzaXJlZCAwLiAgKi8KKworbG9uZworbXBmX2dldF9zaSAobXBmX3NyY3B0ciBmKSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX2V4cF90IGV4cDsKKyAgbXBfc2l6ZV90IHNpemUsIGFic19zaXplOworICBtcF9zcmNwdHIgZnA7CisgIG1wX2xpbWJfdCBmbDsKKworICBleHAgPSBFWFAgKGYpOworICBzaXplID0gU0laIChmKTsKKyAgZnAgPSBQVFIgKGYpOworCisgIC8qIGZyYWN0aW9uIGFsb25lIHRydW5jYXRlcyB0byB6ZXJvCisgICAgIHRoaXMgYWxzbyBjb3ZlcnMgemVybywgc2luY2Ugd2UgaGF2ZSBleHA9PTAgZm9yIHplcm8gKi8KKyAgaWYgKGV4cCA8PSAwKQorICAgIHJldHVybiAwTDsKKworICAvKiB0aGVyZSBhcmUgc29tZSBsaW1icyBhYm92ZSB0aGUgcmFkaXggcG9pbnQgKi8KKworICBmbCA9IDA7CisgIGFic19zaXplID0gQUJTIChzaXplKTsKKyAgaWYgKGFic19zaXplID49IGV4cCkKKyAgICBmbCA9IGZwW2Fic19zaXplLWV4cF07CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMKKyAgaWYgKGV4cCA+IDEgJiYgYWJzX3NpemUrMSA+PSBleHApCisgICAgZmwgfD0gZnBbYWJzX3NpemUgLSBleHAgKyAxXSA8PCBHTVBfTlVNQl9CSVRTOworI2VuZGlmCisKKyAgaWYgKHNpemUgPiAwKQorICAgIHJldHVybiBmbCAmIExPTkdfTUFYOworICBlbHNlCisgICAgLyogdGhpcyBmb3JtIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgaGFuZGxlIC0weDgwLi4wMCAqLworICAgIHJldHVybiAtMSAtIChsb25nKSAoKGZsIC0gMSkgJiBMT05HX01BWCk7Cit9CmRpZmYgLS1naXQgYS9tcGYvZ2V0X3N0ci5jIGIvbXBmL2dldF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDZjNGFlCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2dldF9zdHIuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogbXBmX2dldF9zdHIgKGRpZ2l0X3B0ciwgZXhwLCBiYXNlLCBuX2RpZ2l0cywgYSkgLS0gQ29udmVydCB0aGUgZmxvYXRpbmcKKyAgIHBvaW50IG51bWJlciBBIHRvIGEgYmFzZSBCQVNFIG51bWJlciBhbmQgc3RvcmUgTl9ESUdJVFMgcmF3IGRpZ2l0cyBhdAorICAgRElHSVRfUFRSLCBhbmQgdGhlIGJhc2UgQkFTRSBleHBvbmVudCBpbiB0aGUgd29yZCBwb2ludGVkIHRvIGJ5IEVYUC4gIEZvcgorICAgZXhhbXBsZSwgdGhlIG51bWJlciAzLjE0MTYgd291bGQgYmUgcmV0dXJuZWQgYXMgIjMxNDE2IiBpbiBESUdJVF9QVFIgYW5kCisgICAxIGluIEVYUC4KKworQ29weXJpZ2h0IDE5OTMtMTk5NywgMjAwMC0yMDAzLCAyMDA1LCAyMDA2LCAyMDExLCAyMDE1LCAyMDE3IEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCQkvKiBmb3IgY291bnRfbGVhZGluZ196ZXJvcyAqLworCisvKiBDb3VsZCB1c2Ugc29tZSBtb3JlIHdvcmsuCisKKyAgIDEuIEFsbG9jYXRpb24gaXMgZXhjZXNzaXZlLiAgVHJ5IHRvIGNvbWJpbmUgYXJlYXMuICBQZXJoYXBzIHVzZSByZXN1bHQKKyAgICAgIHN0cmluZyBhcmVhIGZvciB0ZW1wIGxpbWIgc3BhY2U/CisgICAyLiBXZSBnZW5lcmF0ZSB1cCB0byB0d28gbGltYnMgb2YgZXh0cmEgZGlnaXRzLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0CisgICAgICBjaGVjayB0aGUgZXhhY3QgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGlucHV0IG9wZXJhbmQsIGFuZCBmcm9tIHRoYXQKKyAgICAgIGNvbXB1dGUgYW4gYWNjdXJhdGUgZXhwb25lbnQgKHZhcmlhYmxlIGUgaW4gdGhlIGNvZGUpLiAgSXQgd291bGQgYmUKKyAgICAgIGNsZWFuZXIgYW5kIHByb2JhYmx5IHNvbWV3aGF0IGZhc3RlciB0byBjaGFuZ2UgdGhpcy4KKyovCisKKy8qIENvbXB1dGUgYmFzZV5leHAgYW5kIHJldHVybiB0aGUgbW9zdCBzaWduaWZpY2FudCBwcmVjIGxpbWJzIGluIHJwW10uCisgICBQdXQgdGhlIGNvdW50IG9mIG9taXR0ZWQgbG93IGxpbWJzIGluICppZ24uCisgICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplICh3aGljaCBtaWdodCBiZSBsZXNzIHRoYW4gcHJlYykuCisgICBBbGxvY2F0aW9uIG9mIHJwW10gYW5kIHRoZSB0ZW1wb3JhcnkgdHBbXSBzaG91bGQgYmUgMipwcmVjKzIgbGltYnMuICAqLworc3RhdGljIG1wX3NpemVfdAorbXBuX3Bvd18xX2hpZ2hwYXJ0IChtcF9wdHIgcnAsIG1wX3NpemVfdCAqaWducCwKKwkJICAgIG1wX2xpbWJfdCBiYXNlLCB1bnNpZ25lZCBsb25nIGV4cCwKKwkJICAgIG1wX3NpemVfdCBwcmVjLCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBpZ247CQkvKiBjb3VudHMgbnVtYmVyIG9mIGlnbm9yZWQgbG93IGxpbWJzIGluIHIgKi8KKyAgbXBfc2l6ZV90IG9mZjsJCS8qIGtlZXBzIHRyYWNrIG9mIG9mZnNldCB3aGVyZSB2YWx1ZSBzdGFydHMgKi8KKyAgbXBfcHRyIHBhc3NlZF9ycCA9IHJwOworICBtcF9zaXplX3Qgcm47CisgIGludCBjbnQ7CisgIGludCBpOworCisgIGlmIChleHAgPT0gMCkKKyAgICB7CisgICAgICBycFswXSA9IDE7CisgICAgICAqaWducCA9IDA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcnBbMF0gPSBiYXNlOworICBybiA9IDE7CisgIG9mZiA9IDA7CisgIGlnbiA9IDA7CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgZXhwKTsKKyAgZm9yIChpID0gR01QX0xJTUJfQklUUyAtIGNudCAtIDI7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1wbl9zcXIgKHRwLCBycCArIG9mZiwgcm4pOworICAgICAgcm4gPSAyICogcm47CisgICAgICBybiAtPSB0cFtybiAtIDFdID09IDA7CisgICAgICBpZ24gPDw9IDE7CisKKyAgICAgIG9mZiA9IDA7CisgICAgICBpZiAocm4gPiBwcmVjKQorCXsKKwkgIGlnbiArPSBybiAtIHByZWM7CisJICBvZmYgPSBybiAtIHByZWM7CisJICBybiA9IHByZWM7CisJfQorICAgICAgTVBfUFRSX1NXQVAgKHJwLCB0cCk7CisKKyAgICAgIGlmICgoKGV4cCA+PiBpKSAmIDEpICE9IDApCisJeworCSAgbXBfbGltYl90IGN5OworCSAgY3kgPSBtcG5fbXVsXzEgKHJwLCBycCArIG9mZiwgcm4sIGJhc2UpOworCSAgcnBbcm5dID0gY3k7CisJICBybiArPSBjeSAhPSAwOworCSAgb2ZmID0gMDsKKwl9CisgICAgfQorCisgIGlmIChybiA+IHByZWMpCisgICAgeworICAgICAgQVNTRVJUIChybiA9PSBwcmVjICsgMSk7CisKKyAgICAgIGlnbiArPSBybiAtIHByZWM7CisgICAgICBycCArPSBybiAtIHByZWM7CisgICAgICBybiA9IHByZWM7CisgICAgfQorCisgIC8qIFdpdGggc29tZXdoYXQgbGVzcyB0aGFuIDUwJSBwcm9iYWJpbGl0eSwgd2UgY2FuIHNraXAgdGhpcyBjb3B5LiAgKi8KKyAgaWYgKHBhc3NlZF9ycCAhPSBycCArIG9mZikKKyAgICBNUE5fQ09QWV9JTkNSIChwYXNzZWRfcnAsIHJwICsgb2ZmLCBybik7CisgICppZ25wID0gaWduOworICByZXR1cm4gcm47Cit9CisKK2NoYXIgKgorbXBmX2dldF9zdHIgKGNoYXIgKmRidWYsIG1wX2V4cF90ICpleHAsIGludCBiYXNlLCBzaXplX3Qgbl9kaWdpdHMsIG1wZl9zcmNwdHIgdSkKK3sKKyAgbXBfZXhwX3QgdWU7CisgIG1wX3NpemVfdCBuX2xpbWJzX25lZWRlZDsKKyAgc2l6ZV90IG1heF9kaWdpdHM7CisgIG1wX3B0ciB1cCwgcHAsIHRwOworICBtcF9zaXplX3QgdW4sIHBuLCB0bjsKKyAgdW5zaWduZWQgY2hhciAqdHN0cjsKKyAgbXBfZXhwX3QgZXhwX2luX2Jhc2U7CisgIHNpemVfdCBuX2RpZ2l0c19jb21wdXRlZDsKKyAgbXBfc2l6ZV90IGk7CisgIGNvbnN0IGNoYXIgKm51bV90b190ZXh0OworICBzaXplX3QgYWxsb2Nfc2l6ZSA9IDA7CisgIGNoYXIgKmRwOworICBUTVBfREVDTDsKKworICB1cCA9IFBUUih1KTsKKyAgdW4gPSBBQlNJWih1KTsKKyAgdWUgPSBFWFAodSk7CisKKyAgbnVtX3RvX3RleHQgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICBpZiAoYmFzZSA+IDEpCisgICAgeworICAgICAgaWYgKGJhc2UgPD0gMzYpCisJbnVtX3RvX3RleHQgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgICAgIGVsc2UgaWYgKFVOTElLRUxZIChiYXNlID4gNjIpKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKGJhc2UgPiAtMikKKyAgICB7CisgICAgICBiYXNlID0gMTA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmFzZSA9IC1iYXNlOworICAgICAgaWYgKFVOTElLRUxZIChiYXNlID4gMzYpKQorCXJldHVybiBOVUxMOworICAgIH0KKworICBNUEZfU0lHTklGSUNBTlRfRElHSVRTIChtYXhfZGlnaXRzLCBiYXNlLCBQUkVDKHUpKTsKKyAgaWYgKG5fZGlnaXRzID09IDAgfHwgbl9kaWdpdHMgPiBtYXhfZGlnaXRzKQorICAgIG5fZGlnaXRzID0gbWF4X2RpZ2l0czsKKworICBpZiAoZGJ1ZiA9PSAwKQorICAgIHsKKyAgICAgIC8qIFdlIGRpZG4ndCBnZXQgYSBzdHJpbmcgZnJvbSB0aGUgdXNlci4gIEFsbG9jYXRlIG9uZSAoYW5kIHJldHVybgorCSBhIHBvaW50ZXIgdG8gaXQpIHdpdGggc3BhY2UgZm9yIGAtJyBhbmQgdGVybWluYXRpbmcgbnVsbC4gICovCisgICAgICBhbGxvY19zaXplID0gbl9kaWdpdHMgKyAyOworICAgICAgZGJ1ZiA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAobl9kaWdpdHMgKyAyLCBjaGFyKTsKKyAgICB9CisKKyAgaWYgKHVuID09IDApCisgICAgeworICAgICAgKmV4cCA9IDA7CisgICAgICAqZGJ1ZiA9IDA7CisgICAgICBuX2RpZ2l0cyA9IDA7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgIFRNUF9NQVJLOworCisgIC8qIEFsbG9jYXRlIHRlbXBvcmFyeSBkaWdpdCBzcGFjZS4gIFdlIGNhbid0IHB1dCBkaWdpdHMgZGlyZWN0bHkgaW4gdGhlIHVzZXIKKyAgICAgYXJlYSwgc2luY2Ugd2UgZ2VuZXJhdGUgbW9yZSBkaWdpdHMgdGhhbiByZXF1ZXN0ZWQuICAoV2UgYWxsb2NhdGUKKyAgICAgMiAqIEdNUF9MSU1CX0JJVFMgZXh0cmEgYnl0ZXMgYmVjYXVzZSBvZiB0aGUgZGlnaXQgYmxvY2sgbmF0dXJlIG9mIHRoZQorICAgICBjb252ZXJzaW9uLikgICovCisgIHRzdHIgPSAodW5zaWduZWQgY2hhciAqKSBUTVBfQUxMT0MgKG5fZGlnaXRzICsgMiAqIEdNUF9MSU1CX0JJVFMgKyAzKTsKKworICBMSU1CU19QRVJfRElHSVRfSU5fQkFTRSAobl9saW1ic19uZWVkZWQsIG5fZGlnaXRzLCBiYXNlKTsKKworICBpZiAodW4gPiBuX2xpbWJzX25lZWRlZCkKKyAgICB7CisgICAgICB1cCArPSB1biAtIG5fbGltYnNfbmVlZGVkOworICAgICAgdW4gPSBuX2xpbWJzX25lZWRlZDsKKyAgICB9CisKKyAgVE1QX0FMTE9DX0xJTUJTXzIgKHBwLCAyICogbl9saW1ic19uZWVkZWQgKyA0LAorCQkgICAgIHRwLCAyICogbl9saW1ic19uZWVkZWQgKyA0KTsKKworICBpZiAodWUgPD0gbl9saW1ic19uZWVkZWQpCisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBtdWx0aXBseSBudW1iZXIgYnkgYmFzZV5uIHRvIGdldCBhbiBuX2RpZ2l0cyBpbnRlZ2VyIHBhcnQuICAqLworICAgICAgbXBfc2l6ZV90IG5fbW9yZV9saW1ic19uZWVkZWQsIGlnbiwgb2ZmOworICAgICAgdW5zaWduZWQgbG9uZyBlOworCisgICAgICBuX21vcmVfbGltYnNfbmVlZGVkID0gbl9saW1ic19uZWVkZWQgLSB1ZTsKKyAgICAgIERJR0lUU19JTl9CQVNFX1BFUl9MSU1CIChlLCBuX21vcmVfbGltYnNfbmVlZGVkLCBiYXNlKTsKKworICAgICAgcG4gPSBtcG5fcG93XzFfaGlnaHBhcnQgKHBwLCAmaWduLCAobXBfbGltYl90KSBiYXNlLCBlLCBuX2xpbWJzX25lZWRlZCArIDEsIHRwKTsKKyAgICAgIGlmICh1biA+IHBuKQorCW1wbl9tdWwgKHRwLCB1cCwgdW4sIHBwLCBwbik7CS8qIEZJWE1FOiBtcG5fbXVsX2hpZ2hwYXJ0ICovCisgICAgICBlbHNlCisJbXBuX211bCAodHAsIHBwLCBwbiwgdXAsIHVuKTsJLyogRklYTUU6IG1wbl9tdWxfaGlnaHBhcnQgKi8KKyAgICAgIHRuID0gdW4gKyBwbjsKKyAgICAgIHRuIC09IHRwW3RuIC0gMV0gPT0gMDsKKyAgICAgIG9mZiA9IHVuIC0gdWUgLSBpZ247CisgICAgICBpZiAob2ZmIDwgMCkKKwl7CisJICBNUE5fQ09QWV9ERUNSICh0cCAtIG9mZiwgdHAsIHRuKTsKKwkgIE1QTl9aRVJPICh0cCwgLW9mZik7CisJICB0biAtPSBvZmY7CisJICBvZmYgPSAwOworCX0KKyAgICAgIG5fZGlnaXRzX2NvbXB1dGVkID0gbXBuX2dldF9zdHIgKHRzdHIsIGJhc2UsIHRwICsgb2ZmLCB0biAtIG9mZik7CisKKyAgICAgIGV4cF9pbl9iYXNlID0gbl9kaWdpdHNfY29tcHV0ZWQgLSBlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gZGl2aWRlIG51bWJlciBieSBiYXNlXm4gdG8gZ2V0IGFuIG5fZGlnaXRzIGludGVnZXIgcGFydC4gICovCisgICAgICBtcF9zaXplX3Qgbl9sZXNzX2xpbWJzX25lZWRlZCwgaWduLCBvZmYsIHhuOworICAgICAgdW5zaWduZWQgbG9uZyBlOworICAgICAgbXBfcHRyIGR1bW15cCwgeHA7CisKKyAgICAgIG5fbGVzc19saW1ic19uZWVkZWQgPSB1ZSAtIG5fbGltYnNfbmVlZGVkOworICAgICAgRElHSVRTX0lOX0JBU0VfUEVSX0xJTUIgKGUsIG5fbGVzc19saW1ic19uZWVkZWQsIGJhc2UpOworCisgICAgICBwbiA9IG1wbl9wb3dfMV9oaWdocGFydCAocHAsICZpZ24sIChtcF9saW1iX3QpIGJhc2UsIGUsIG5fbGltYnNfbmVlZGVkICsgMSwgdHApOworCisgICAgICB4biA9IG5fbGltYnNfbmVlZGVkICsgKG5fbGVzc19saW1ic19uZWVkZWQtaWduKTsKKyAgICAgIHhwID0gVE1QX0FMTE9DX0xJTUJTICh4bik7CisgICAgICBvZmYgPSB4biAtIHVuOworICAgICAgTVBOX1pFUk8gKHhwLCBvZmYpOworICAgICAgTVBOX0NPUFkgKHhwICsgb2ZmLCB1cCwgdW4pOworCisgICAgICBkdW1teXAgPSBUTVBfQUxMT0NfTElNQlMgKHBuKTsKKyAgICAgIG1wbl90ZGl2X3FyICh0cCwgZHVtbXlwLCAobXBfc2l6ZV90KSAwLCB4cCwgeG4sIHBwLCBwbik7CisgICAgICB0biA9IHhuIC0gcG4gKyAxOworICAgICAgdG4gLT0gdHBbdG4gLSAxXSA9PSAwOworICAgICAgbl9kaWdpdHNfY29tcHV0ZWQgPSBtcG5fZ2V0X3N0ciAodHN0ciwgYmFzZSwgdHAsIHRuKTsKKworICAgICAgZXhwX2luX2Jhc2UgPSBuX2RpZ2l0c19jb21wdXRlZCArIGU7CisgICAgfQorCisgIC8qIFdlIHNob3VsZCBub3JtYWxseSBoYXZlIGNvbXB1dGVkIHRvbyBtYW55IGRpZ2l0cy4gIFJvdW5kIHRoZSByZXN1bHQKKyAgICAgYXQgdGhlIHBvaW50IGluZGljYXRlZCBieSBuX2RpZ2l0cy4gICovCisgIGlmIChuX2RpZ2l0c19jb21wdXRlZCA+IG5fZGlnaXRzKQorICAgIHsKKyAgICAgIHNpemVfdCBpOworICAgICAgLyogUm91bmQgdGhlIHJlc3VsdC4gICovCisgICAgICBpZiAodHN0cltuX2RpZ2l0c10gKiAyID49IGJhc2UpCisJeworCSAgbl9kaWdpdHNfY29tcHV0ZWQgPSBuX2RpZ2l0czsKKwkgIGZvciAoaSA9IG5fZGlnaXRzIC0gMTs7IGktLSkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGludCB4OworCSAgICAgIHggPSArKyh0c3RyW2ldKTsKKwkgICAgICBpZiAoeCAhPSBiYXNlKQorCQlicmVhazsKKwkgICAgICBuX2RpZ2l0c19jb21wdXRlZC0tOworCSAgICAgIGlmIChpID09IDApCisJCXsKKwkJICAvKiBXZSBoYWQgc29tZXRoaW5nIGxpa2UgYGJiYmJiYmIuLi5iZCcsIHdoZXJlIDIqZCA+PSBiYXNlCisJCSAgICAgYW5kIGBiJyBkZW5vdGVzIGRpZ2l0IHdpdGggc2lnbmlmaWNhbmNlIGJhc2UgLSAxLgorCQkgICAgIFRoaXMgcm91bmRzIHVwIHRvIGAxJywgaW5jcmVhc2luZyB0aGUgZXhwb25lbnQuICAqLworCQkgIHRzdHJbMF0gPSAxOworCQkgIG5fZGlnaXRzX2NvbXB1dGVkID0gMTsKKwkJICBleHBfaW5fYmFzZSsrOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFdlIG1pZ2h0IGhhdmUgZmV3ZXIgZGlnaXRzIHRoYW4gcmVxdWVzdGVkIGFzIGEgcmVzdWx0IG9mIHJvdW5kaW5nIGFib3ZlLAorICAgICAoaS5lLiAwLjk5OTk5OSA9PiAxLjApIG9yIGJlY2F1c2Ugd2UgaGF2ZSBhIG51bWJlciB0aGF0IHNpbXBseSBkb2Vzbid0CisgICAgIG5lZWQgbWFueSBkaWdpdHMgaW4gdGhpcyBiYXNlIChlLmcuLCAwLjEyNSBpbiBiYXNlIDEwKS4gICovCisgIGlmIChuX2RpZ2l0cyA+IG5fZGlnaXRzX2NvbXB1dGVkKQorICAgIG5fZGlnaXRzID0gbl9kaWdpdHNfY29tcHV0ZWQ7CisKKyAgLyogUmVtb3ZlIHRyYWlsaW5nIDAuICBUaGVyZSBjYW4gYmUgbWFueSB6ZXJvcy4gICovCisgIHdoaWxlIChuX2RpZ2l0cyAhPSAwICYmIHRzdHJbbl9kaWdpdHMgLSAxXSA9PSAwKQorICAgIG5fZGlnaXRzLS07CisKKyAgZHAgPSBkYnVmICsgKFNJWih1KSA8IDApOworCisgIC8qIFRyYW5zbGF0ZSB0byBBU0NJSSBhbmQgY29weSB0byByZXN1bHQgc3RyaW5nLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5fZGlnaXRzOyBpKyspCisgICAgZHBbaV0gPSBudW1fdG9fdGV4dFt0c3RyW2ldXTsKKyAgZHBbbl9kaWdpdHNdID0gMDsKKworICAqZXhwID0gZXhwX2luX2Jhc2U7CisKKyAgaWYgKFNJWih1KSA8IDApCisgICAgeworICAgICAgZGJ1ZlswXSA9ICctJzsKKyAgICAgIG5fZGlnaXRzKys7CisgICAgfQorCisgIFRNUF9GUkVFOworCisgZG9uZToKKyAgLyogSWYgdGhlIHN0cmluZyB3YXMgYWxsb2NlZCB0aGVuIHJlc2l6ZSBpdCBkb3duIHRvIHRoZSBhY3R1YWwgc3BhY2UKKyAgICAgcmVxdWlyZWQuICAqLworICBpZiAoYWxsb2Nfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIF9fR01QX1JFQUxMT0NBVEVfRlVOQ19NQVlCRV9UWVBFIChkYnVmLCBhbGxvY19zaXplLCBuX2RpZ2l0cyArIDEsIGNoYXIpOworICAgIH0KKworICByZXR1cm4gZGJ1ZjsKK30KZGlmZiAtLWdpdCBhL21wZi9nZXRfdWkuYyBiL21wZi9nZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I5MzMzCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2dldF91aS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBtcGZfZ2V0X3VpIC0tIG1wZiB0byB1bG9uZyBjb252ZXJzaW9uCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBBbnkgZnJhY3Rpb24gYml0cyBhcmUgdHJ1bmNhdGVkLCBtZWFuaW5nIHNpbXBseSBkaXNjYXJkZWQuCisKKyAgIEZvciB2YWx1ZXMgYmlnZ2VyIHRoYW4gYSB1bG9uZywgdGhlIGxvdyBiaXRzIGFyZSByZXR1cm5lZCAodGhlIGxvdworICAgYWJzb2x1dGUgdmFsdWUgYml0cyBhY3R1YWxseSksIGxpa2UgbXB6X2dldF91aSwgYnV0IHRoaXMgaXNuJ3QKKyAgIGRvY3VtZW50ZWQuCisKKyAgIE5vdGljZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbXB6X3NldF9mICsgbXB6X2dldF91aS4KKworCisgICBJbXBsZW1lbnRhdGlvbjoKKworICAgVGhlIGxpbWIganVzdCBhYm92ZSB0aGUgcmFkaXggcG9pbnQgZm9yIHVzIHRvIGV4dHJhY3QgaXMgcHRyW3NpemUtZXhwXS4KKworICAgV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBzaXplLWV4cCBpbmRleCBmYWxscyBpbiBvdXIgYXZhaWxhYmxlIGRhdGEKKyAgIHJhbmdlLCAwIHRvIHNpemUtMSBpbmNsdXNpdmUuICBXZSB0ZXN0IHRoaXMgd2l0aG91dCByaXNrIG9mIGFuIG92ZXJmbG93CisgICBpbnZvbHZpbmcgZXhwIGJ5IHJlcXVpcmluZyBzaXplPj1leHAgKGdpdmluZyBzaXplLWV4cCA+PSAwKSBhbmQgZXhwPjAKKyAgIChnaXZpbmcgc2l6ZS1leHAgPD0gc2l6ZS0xKS4KKworICAgTm90aWNlIGlmIHNpemU9PTAgdGhlcmUncyBubyBmZXRjaCwgc2luY2Ugb2YgY291cnNlIHNpemU+PWV4cCBhbmQgZXhwPjAKKyAgIGNhbiBvbmx5IGJlIHRydWUgaWYgc2l6ZT4wLiAgU28gdGhlcmUncyBubyBzcGVjaWFsIGhhbmRsaW5nIGZvciBzaXplPT0wLAorICAgaXQgY29tZXMgb3V0IGFzIDAgdGhlIHNhbWUgYXMgYW55IG90aGVyIHRpbWUgd2UgaGF2ZSBubyBkYXRhIGF0IG91cgorICAgdGFyZ2V0IGluZGV4LgorCisgICBGb3IgbmFpbHMsIHRoZSBzZWNvbmQgbGltYiBhYm92ZSB0aGUgcmFkaXggcG9pbnQgaXMgYWxzbyByZXF1aXJlZCwgdGhpcworICAgaXMgcHRyW3NpemUtZXhwKzFdLgorCisgICBBZ2FpbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgc2l6ZS1leHArMSBmYWxscyBpbiBvdXIgZGF0YSByYW5nZSwgMCB0bworICAgc2l6ZS0xIGluY2x1c2l2ZS4gIFdlIHRlc3Qgd2l0aG91dCByaXNrIG9mIG92ZXJmbG93IGJ5IHJlcXVpcmluZworICAgc2l6ZSsxPj1leHAgKGdpdmluZyBzaXplLWV4cCsxID49IDApIGFuZCBleHA+MSAoZ2l2aW5nIHNpemUtZXhwKzEgPD0KKyAgIHNpemUtMSkuCisKKyAgIEFuZCBhZ2FpbiBpZiBzaXplPT0wIHRoZXNlIHNlY29uZCBmZXRjaCBjb25kaXRpb25zIGFyZSBub3Qgc2F0aXNmaWVkCisgICBlaXRoZXIgc2luY2Ugc2l6ZSsxPj1leHAgYW5kIGV4cD4xIGFyZSBvbmx5IHRydWUgaWYgc2l6ZT4wLgorCisgICBUaGUgY29kZSBpcyBhcnJhbmdlZCB3aXRoIGV4cD4wIHdyYXBwaW5nIHRoZSBleHA+MSB0ZXN0IHNpbmNlIGV4cD4xIGlzCisgICBtaXMtY29tcGlsZWQgYnkgYWxwaGEgZ2NjIHByaW9yIHRvIHZlcnNpb24gMy40LiAgSXQgcmUtd3JpdGVzIGl0IGFzCisgICBleHAtMT4wLCB3aGljaCBpcyBpbmNvcnJlY3Qgd2hlbiBleHA9PU1QX0VYUF9UX01JTi4gIEJ5IGhhdmluZyBleHA+MAorICAgdGVzdGVkIGZpcnN0IHdlIGVuc3VyZSBNUF9FWFBfVF9NSU4gZG9lc24ndCByZWFjaCBleHA+MS4gICovCisKK3Vuc2lnbmVkIGxvbmcKK21wZl9nZXRfdWkgKG1wZl9zcmNwdHIgZikgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3Qgc2l6ZTsKKyAgbXBfZXhwX3QgZXhwOworICBtcF9zcmNwdHIgZnA7CisgIG1wX2xpbWJfdCBmbDsKKworICBleHAgPSBFWFAgKGYpOworICBzaXplID0gU0laIChmKTsKKyAgZnAgPSBQVFIgKGYpOworCisgIGZsID0gMDsKKyAgaWYgKGV4cCA+IDApCisgICAgeworICAgICAgLyogdGhlcmUgYXJlIHNvbWUgbGltYnMgYWJvdmUgdGhlIHJhZGl4IHBvaW50ICovCisKKyAgICAgIHNpemUgPSBBQlMgKHNpemUpOworICAgICAgaWYgKHNpemUgPj0gZXhwKQorICAgICAgICBmbCA9IGZwW3NpemUtZXhwXTsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUworICAgICAgaWYgKGV4cCA+IDEgJiYgc2l6ZSsxID49IGV4cCkKKyAgICAgICAgZmwgKz0gKGZwW3NpemUtZXhwKzFdIDw8IEdNUF9OVU1CX0JJVFMpOworI2VuZGlmCisgICAgfQorCisgIHJldHVybiAodW5zaWduZWQgbG9uZykgZmw7Cit9CmRpZmYgLS1naXQgYS9tcGYvaW5pdC5jIGIvbXBmL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFiMjYyCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2luaXQuYwpAQCAtMCwwICsxLDQxIEBACisvKiBtcGZfaW5pdCgpIC0tIE1ha2UgYSBuZXcgbXVsdGlwbGUgcHJlY2lzaW9uIG51bWJlciB3aXRoIHZhbHVlIDAuCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDIwMDAsIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfaW5pdCAobXBmX3B0ciByKQoreworICBtcF9zaXplX3QgcHJlYyA9IF9fZ21wX2RlZmF1bHRfZnBfbGltYl9wcmVjaXNpb247CisgIHItPl9tcF9zaXplID0gMDsKKyAgci0+X21wX2V4cCA9IDA7CisgIHItPl9tcF9wcmVjID0gcHJlYzsKKyAgci0+X21wX2QgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChwcmVjICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvaW5pdDIuYyBiL21wZi9pbml0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MGEwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvaW5pdDIuYwpAQCAtMCwwICsxLDQzIEBACisvKiBtcGZfaW5pdDIoKSAtLSBNYWtlIGEgbmV3IG11bHRpcGxlIHByZWNpc2lvbiBudW1iZXIgd2l0aCB2YWx1ZSAwLgorCitDb3B5cmlnaHQgMTk5My0xOTk1LCAyMDAwLCAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX2luaXQyIChtcGZfcHRyIHIsIG1wX2JpdGNudF90IHByZWNfaW5fYml0cykKK3sKKyAgbXBfc2l6ZV90IHByZWM7CisKKyAgcHJlYyA9IF9fR01QRl9CSVRTX1RPX1BSRUMgKHByZWNfaW5fYml0cyk7CisgIHItPl9tcF9zaXplID0gMDsKKyAgci0+X21wX2V4cCA9IDA7CisgIHItPl9tcF9wcmVjID0gcHJlYzsKKyAgci0+X21wX2QgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChwcmVjICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvaW5pdHMuYyBiL21wZi9pbml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDA1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvaW5pdHMuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBtcGZfaW5pdHMoKSAtLSBJbml0aWFsaXplIG11bHRpcGxlIG1wZl90IHZhcmlhYmxlcyBhbmQgc2V0IHRoZW0gdG8gMC4KKworQ29weXJpZ2h0IDIwMDksIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfaW5pdHMgKG1wZl9wdHIgeCwgLi4uKQoreworICB2YV9saXN0ICBhcDsKKworICB2YV9zdGFydCAoYXAsIHgpOworCisgIGRvCisgICAgeworICAgICAgbXBmX2luaXQgKHgpOworICAgICAgeCA9IHZhX2FyZyAoYXAsIG1wZl9wdHIpOworICAgIH0KKyAgd2hpbGUgKHggIT0gTlVMTCk7CisKKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9tcGYvaW5wX3N0ci5jIGIvbXBmL2lucF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjYxYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL2lucF9zdHIuYwpAQCAtMCwwICsxLDkyIEBACisvKiBtcGZfaW5wX3N0cihkZXN0X2Zsb2F0LCBzdHJlYW0sIGJhc2UpIC0tIElucHV0IGEgbnVtYmVyIGluIGJhc2UKKyAgIEJBU0UgZnJvbSBzdGRpbyBzdHJlYW0gU1RSRUFNIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIERFU1RfRkxPQVQuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAwLTIwMDIsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworc2l6ZV90CittcGZfaW5wX3N0ciAobXBmX3B0ciByb3AsIEZJTEUgKnN0cmVhbSwgaW50IGJhc2UpCit7CisgIGNoYXIgKnN0cjsKKyAgc2l6ZV90IGFsbG9jX3NpemUsIHN0cl9zaXplOworICBpbnQgYzsKKyAgaW50IHJlczsKKyAgc2l6ZV90IG5yZWFkOworCisgIGlmIChzdHJlYW0gPT0gMCkKKyAgICBzdHJlYW0gPSBzdGRpbjsKKworICBhbGxvY19zaXplID0gMTAwOworICBzdHIgPSBfX0dNUF9BTExPQ0FURV9GVU5DX1RZUEUgKGFsbG9jX3NpemUsIGNoYXIpOworICBzdHJfc2l6ZSA9IDA7CisgIG5yZWFkID0gMDsKKworICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworICBkbworICAgIHsKKyAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworICAgICAgbnJlYWQrKzsKKyAgICB9CisgIHdoaWxlIChpc3NwYWNlIChjKSk7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAoc3RyX3NpemUgPj0gYWxsb2Nfc2l6ZSkKKwl7CisJICBzaXplX3Qgb2xkX2FsbG9jX3NpemUgPSBhbGxvY19zaXplOworCSAgYWxsb2Nfc2l6ZSA9IGFsbG9jX3NpemUgKiAzIC8gMjsKKwkgIHN0ciA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19UWVBFIChzdHIsIG9sZF9hbGxvY19zaXplLCBhbGxvY19zaXplLCBjaGFyKTsKKwl9CisgICAgICBpZiAoYyA9PSBFT0YgfHwgaXNzcGFjZSAoYykpCisJYnJlYWs7CisgICAgICBzdHJbc3RyX3NpemUrK10gPSBjOworICAgICAgYyA9IGdldGMgKHN0cmVhbSk7CisgICAgfQorICB1bmdldGMgKGMsIHN0cmVhbSk7CisgIG5yZWFkLS07CisKKyAgaWYgKHN0cl9zaXplID49IGFsbG9jX3NpemUpCisgICAgeworICAgICAgc2l6ZV90IG9sZF9hbGxvY19zaXplID0gYWxsb2Nfc2l6ZTsKKyAgICAgIGFsbG9jX3NpemUgPSBhbGxvY19zaXplICogMyAvIDI7CisgICAgICBzdHIgPSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfVFlQRSAoc3RyLCBvbGRfYWxsb2Nfc2l6ZSwgYWxsb2Nfc2l6ZSwgY2hhcik7CisgICAgfQorICBzdHJbc3RyX3NpemVdID0gMDsKKworICByZXMgPSBtcGZfc2V0X3N0ciAocm9wLCBzdHIsIGJhc2UpOworICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgYWxsb2Nfc2l6ZSk7CisKKyAgaWYgKHJlcyA9PSAtMSkKKyAgICByZXR1cm4gMDsJCQkvKiBlcnJvciAqLworCisgIHJldHVybiBzdHJfc2l6ZSArIG5yZWFkOworfQpkaWZmIC0tZ2l0IGEvbXBmL2ludF9wLmMgYi9tcGYvaW50X3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRjZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL2ludF9wLmMKQEAgLTAsMCArMSw1NSBAQAorLyogbXBmX2ludGVnZXJfcCAtLSB0ZXN0IHdoZXRoZXIgYW4gbXBmIGlzIGFuIGludGVnZXIgKi8KKworLyoKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDE0LTIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorbXBmX2ludGVnZXJfcCAobXBmX3NyY3B0ciBmKSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3NyY3B0ciBmcDsKKyAgbXBfZXhwX3QgZXhwOworICBtcF9zaXplX3Qgc2l6ZTsKKworICBzaXplID0gU0laIChmKTsKKyAgZXhwID0gRVhQIChmKTsKKyAgaWYgKGV4cCA8PSAwKQorICAgIHJldHVybiAoc2l6ZSA9PSAwKTsgIC8qIHplcm8gaXMgYW4gaW50ZWdlciwKKwkJCSAgICBvdGhlcnMgaGF2ZSBvbmx5IGZyYWN0aW9uIGxpbWJzICovCisgIHNpemUgPSBBQlMgKHNpemUpOworCisgIC8qIElnbm9yZSB6ZXJvZXMgYXQgdGhlIGxvdyBlbmQgb2YgRi4gICovCisgIGZvciAoZnAgPSBQVFIgKGYpOyAqZnAgPT0gMDsgKytmcCkKKyAgICAtLXNpemU7CisKKyAgLyogbm8gZnJhY3Rpb24gbGltYnMgKi8KKyAgcmV0dXJuIHNpemUgPD0gZXhwOworfQpkaWZmIC0tZ2l0IGEvbXBmL2lzZXQuYyBiL21wZi9pc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmOTAwNgotLS0gL2Rldi9udWxsCisrKyBiL21wZi9pc2V0LmMKQEAgLTAsMCArMSw2MSBAQAorLyogbXBmX2luaXRfc2V0IC0tIEluaXRpYWxpemUgYSBmbG9hdCBhbmQgYXNzaWduIGl0IGZyb20gYW5vdGhlciBmbG9hdC4KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMCwgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9pbml0X3NldCAobXBmX3B0ciByLCBtcGZfc3JjcHRyIHMpCit7CisgIG1wX3B0ciBycCwgc3A7CisgIG1wX3NpemVfdCBzc2l6ZSwgc2l6ZTsKKyAgbXBfc2l6ZV90IHByZWM7CisKKyAgcHJlYyA9IF9fZ21wX2RlZmF1bHRfZnBfbGltYl9wcmVjaXNpb247CisgIHItPl9tcF9kID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAocHJlYyArIDEpOworICByLT5fbXBfcHJlYyA9IHByZWM7CisKKyAgcHJlYysrOwkJLyogbGllIG5vdCB0byBsb3NlIHByZWNpc2lvbiBpbiBhc3NpZ25tZW50ICovCisgIHNzaXplID0gcy0+X21wX3NpemU7CisgIHNpemUgPSBBQlMgKHNzaXplKTsKKworICBycCA9IHItPl9tcF9kOworICBzcCA9IHMtPl9tcF9kOworCisgIGlmIChzaXplID4gcHJlYykKKyAgICB7CisgICAgICBzcCArPSBzaXplIC0gcHJlYzsKKyAgICAgIHNpemUgPSBwcmVjOworICAgIH0KKworICByLT5fbXBfZXhwID0gcy0+X21wX2V4cDsKKyAgci0+X21wX3NpemUgPSBzc2l6ZSA+PSAwID8gc2l6ZSA6IC1zaXplOworCisgIE1QTl9DT1BZIChycCwgc3AsIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvbXBmL2lzZXRfZC5jIGIvbXBmL2lzZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzYyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvaXNldF9kLmMKQEAgLTAsMCArMSw0MSBAQAorLyogbXBmX2luaXRfc2V0X2QgLS0gSW5pdGlhbGl6ZSBhIGZsb2F0IGFuZCBhc3NpZ24gaXQgZnJvbSBhIGRvdWJsZS4KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMCwgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9pbml0X3NldF9kIChtcGZfcHRyIHIsIGRvdWJsZSB2YWwpCit7CisgIG1wX3NpemVfdCBwcmVjID0gX19nbXBfZGVmYXVsdF9mcF9saW1iX3ByZWNpc2lvbjsKKyAgci0+X21wX3ByZWMgPSBwcmVjOworICByLT5fbXBfZCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfTElNQlMgKHByZWMgKyAxKTsKKworICBtcGZfc2V0X2QgKHIsIHZhbCk7Cit9CmRpZmYgLS1naXQgYS9tcGYvaXNldF9zaS5jIGIvbXBmL2lzZXRfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFiYjlhCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL2lzZXRfc2kuYwpAQCAtMCwwICsxLDU3IEBACisvKiBtcGZfaW5pdF9zZXRfc2koKSAtLSBJbml0aWFsaXplIGEgZmxvYXQgYW5kIGFzc2lnbiBpdCBmcm9tIGEgc2lnbmVkIGludC4KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfaW5pdF9zZXRfc2kgKG1wZl9wdHIgciwgbG9uZyBpbnQgdmFsKQoreworICBtcF9zaXplX3QgcHJlYyA9IF9fZ21wX2RlZmF1bHRfZnBfbGltYl9wcmVjaXNpb247CisgIG1wX3NpemVfdCBzaXplOworICBtcF9saW1iX3Qgdmw7CisKKyAgci0+X21wX3ByZWMgPSBwcmVjOworICByLT5fbXBfZCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfTElNQlMgKHByZWMgKyAxKTsKKworICB2bCA9IChtcF9saW1iX3QpIEFCU19DQVNUICh1bnNpZ25lZCBsb25nIGludCwgdmFsKTsKKworICByLT5fbXBfZFswXSA9IHZsICYgR01QX05VTUJfTUFTSzsKKyAgc2l6ZSA9IHZsICE9IDA7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMKKyAgdmwgPj49IEdNUF9OVU1CX0JJVFM7CisgIHItPl9tcF9kWzFdID0gdmw7CisgIHNpemUgKz0gKHZsICE9IDApOworI2VuZGlmCisKKyAgci0+X21wX2V4cCA9IHNpemU7CisgIHItPl9tcF9zaXplID0gdmFsID49IDAgPyBzaXplIDogLXNpemU7Cit9CmRpZmYgLS1naXQgYS9tcGYvaXNldF9zdHIuYyBiL21wZi9pc2V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvaXNldF9zdHIuYwpAQCAtMCwwICsxLDQzIEBACisvKiBtcGZfaW5pdF9zZXRfc3RyIC0tIEluaXRpYWxpemUgYSBmbG9hdCBhbmQgYXNzaWduIGl0IGZyb20gYSBzdHJpbmcuCisKK0NvcHlyaWdodCAxOTk1LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CittcGZfaW5pdF9zZXRfc3RyIChtcGZfcHRyIHIsIGNvbnN0IGNoYXIgKnMsIGludCBiYXNlKQoreworICBtcF9zaXplX3QgcHJlYyA9IF9fZ21wX2RlZmF1bHRfZnBfbGltYl9wcmVjaXNpb247CisgIHItPl9tcF9zaXplID0gMDsKKyAgci0+X21wX2V4cCA9IDA7CisgIHItPl9tcF9wcmVjID0gcHJlYzsKKyAgci0+X21wX2QgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChwcmVjICsgMSk7CisKKyAgcmV0dXJuIG1wZl9zZXRfc3RyIChyLCBzLCBiYXNlKTsKK30KZGlmZiAtLWdpdCBhL21wZi9pc2V0X3VpLmMgYi9tcGYvaXNldF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDI2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvaXNldF91aS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG1wZl9pbml0X3NldF91aSgpIC0tIEluaXRpYWxpemUgYSBmbG9hdCBhbmQgYXNzaWduIGl0IGZyb20gYW4gdW5zaWduZWQgaW50LgorCitDb3B5cmlnaHQgMTk5My0xOTk1LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX2luaXRfc2V0X3VpIChtcGZfcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW50IHZhbCkKK3sKKyAgbXBfc2l6ZV90IHByZWMgPSBfX2dtcF9kZWZhdWx0X2ZwX2xpbWJfcHJlY2lzaW9uOworICBtcF9zaXplX3Qgc2l6ZTsKKworICByLT5fbXBfcHJlYyA9IHByZWM7CisgIHItPl9tcF9kID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAocHJlYyArIDEpOworICByLT5fbXBfZFswXSA9IHZhbCAmIEdNUF9OVU1CX01BU0s7CisgIHNpemUgPSAodmFsICE9IDApOworCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIHZhbCA+Pj0gR01QX05VTUJfQklUUzsKKyAgci0+X21wX2RbMV0gPSB2YWw7CisgIHNpemUgKz0gKHZhbCAhPSAwKTsKKyNlbmRpZgorCisgIHItPl9tcF9zaXplID0gc2l6ZTsKKyAgci0+X21wX2V4cCA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcGYvbXVsLmMgYi9tcGYvbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YzA2MAotLS0gL2Rldi9udWxsCisrKyBiL21wZi9tdWwuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogbXBmX211bCAtLSBNdWx0aXBseSB0d28gZmxvYXRzLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMSwgMjAwNSwgMjAxOSwgMjAyMCBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfbXVsIChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSwgbXBmX3NyY3B0ciB2KQoreworICBtcF9zaXplX3Qgc2lnbl9wcm9kdWN0OworICBtcF9zaXplX3QgcHJlYyA9IFBSRUMgKHIpOworICBtcF9zaXplX3QgcnNpemU7CisgIG1wX2xpbWJfdCBjeV9saW1iOworICBtcF9wdHIgcnAsIHRwOworICBtcF9zaXplX3QgYWRqOworICBUTVBfREVDTDsKKworICBpZiAodSA9PSB2KQorICAgIHsKKyAgICAgIG1wX3NyY3B0ciB1cDsKKyAgICAgIG1wX3NpemVfdCB1c2l6ZTsKKworICAgICAgc2lnbl9wcm9kdWN0ID0gMDsKKworICAgICAgdXNpemUgPSBBQlNJWiAodSk7CisKKyAgICAgIHVwID0gUFRSICh1KTsKKyAgICAgIGlmICh1c2l6ZSA+IHByZWMpCisJeworCSAgdXAgKz0gdXNpemUgLSBwcmVjOworCSAgdXNpemUgPSBwcmVjOworCX0KKworICAgICAgaWYgKHVzaXplID09IDApCisJeworCSAgU0laIChyKSA9IDA7CisJICBFWFAgKHIpID0gMDsJCS8qID8/PyAqLworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBUTVBfTUFSSzsKKwkgIHJzaXplID0gMiAqIHVzaXplOworCSAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHJzaXplKTsKKworCSAgbXBuX3NxciAodHAsIHVwLCB1c2l6ZSk7CisJICBjeV9saW1iID0gdHBbcnNpemUgLSAxXTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfc3JjcHRyIHVwLCB2cDsKKyAgICAgIG1wX3NpemVfdCB1c2l6ZSwgdnNpemU7CisKKyAgICAgIHVzaXplID0gU0laICh1KTsKKyAgICAgIHZzaXplID0gU0laICh2KTsKKyAgICAgIHNpZ25fcHJvZHVjdCA9IHVzaXplIF4gdnNpemU7CisKKyAgICAgIHVzaXplID0gQUJTICh1c2l6ZSk7CisgICAgICB2c2l6ZSA9IEFCUyAodnNpemUpOworCisgICAgICB1cCA9IFBUUiAodSk7CisgICAgICB2cCA9IFBUUiAodik7CisgICAgICBpZiAodXNpemUgPiBwcmVjKQorCXsKKwkgIHVwICs9IHVzaXplIC0gcHJlYzsKKwkgIHVzaXplID0gcHJlYzsKKwl9CisgICAgICBpZiAodnNpemUgPiBwcmVjKQorCXsKKwkgIHZwICs9IHZzaXplIC0gcHJlYzsKKwkgIHZzaXplID0gcHJlYzsKKwl9CisKKyAgICAgIGlmICh1c2l6ZSA9PSAwIHx8IHZzaXplID09IDApCisJeworCSAgU0laIChyKSA9IDA7CisJICBFWFAgKHIpID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgVE1QX01BUks7CisJICByc2l6ZSA9IHVzaXplICsgdnNpemU7CisJICB0cCA9IFRNUF9BTExPQ19MSU1CUyAocnNpemUpOworCSAgY3lfbGltYiA9ICh1c2l6ZSA+PSB2c2l6ZQorCQkgICAgID8gbXBuX211bCAodHAsIHVwLCB1c2l6ZSwgdnAsIHZzaXplKQorCQkgICAgIDogbXBuX211bCAodHAsIHZwLCB2c2l6ZSwgdXAsIHVzaXplKSk7CisKKwl9CisgICAgfQorCisgIGFkaiA9IGN5X2xpbWIgPT0gMDsKKyAgcnNpemUgLT0gYWRqOworICBwcmVjKys7CisgIGlmIChyc2l6ZSA+IHByZWMpCisgICAgeworICAgICAgdHAgKz0gcnNpemUgLSBwcmVjOworICAgICAgcnNpemUgPSBwcmVjOworICAgIH0KKyAgcnAgPSBQVFIgKHIpOworICBNUE5fQ09QWSAocnAsIHRwLCByc2l6ZSk7CisgIEVYUCAocikgPSBFWFAgKHUpICsgRVhQICh2KSAtIGFkajsKKyAgU0laIChyKSA9IHNpZ25fcHJvZHVjdCA+PSAwID8gcnNpemUgOiAtcnNpemU7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcGYvbXVsXzJleHAuYyBiL21wZi9tdWxfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTczNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvbXVsXzJleHAuYwpAQCAtMCwwICsxLDEzMiBAQAorLyogbXBmX211bF8yZXhwIC0tIE11bHRpcGx5IGEgZmxvYXQgYnkgMl5uLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBNdWx0aXBsZXMgb2YgR01QX05VTUJfQklUUyBpbiBleHAgc2ltcGx5IG1lYW4gYW4gYW1vdW50IGFkZGVkIHRvIEVYUCh1KQorICAgdG8gc2V0IEVYUChyKS4gIFRoZSByZW1haW5kZXIgZXhwJUdNUF9OVU1CX0JJVFMgaXMgdGhlbiBhIGxlZnQgc2hpZnQgZm9yCisgICB0aGUgbGltYiBkYXRhLgorCisgICBJZiBleHAlR01QX05VTUJfQklUUyA9PSAwIHRoZW4gdGhlcmUncyBubyBzaGlmdGluZywgd2UgZWZmZWN0aXZlbHkganVzdAorICAgZG8gYW4gbXB6X3NldCB3aXRoIGNoYW5nZWQgRVhQKHIpLiAgTGlrZSBtcHpfc2V0IHdlIHRha2UgcHJlYysxIGxpbWJzIGluCisgICB0aGlzIGNhc2UuICBBbHRob3VnaCBqdXN0IHByZWMgd291bGQgc3VmZmljZSwgaXQncyBuaWNlIHRvIGhhdmUKKyAgIG1wZl9tdWxfMmV4cCB3aXRoIGV4cD09MCBjb21lIG91dCB0aGUgc2FtZSBhcyBtcHpfc2V0LgorCisgICBXaGVuIHNoaWZ0aW5nIHdlIHRha2UgdXAgdG8gcHJlYyBtYW55IGxpbWJzIGZyb20gdGhlIGlucHV0LiAgT3VyIHNoaWZ0IGlzCisgICBjeSA9IG1wbl9sc2hpZnQgKFBUUihyKSwgUFRSKHUpK2ssIHNpemUsIC4uLiksIHdoZXJlIGsgaXMgdGhlIG51bWJlciBvZgorICAgbG93IGxpbWJzIGRyb3BwZWQgZnJvbSB1LCBhbmQgdGhlIGNhcnJ5IG91dCBpcyBzdG9yZWQgdG8gUFRSKHIpW3NpemVdLgorCisgICBJdCBtYXkgYmUgbm90ZWQgdGhhdCB0aGUgbG93IGxpbWIgUFRSKHIpWzBdIGRvZXNuJ3QgaW5jb3Jwb3JhdGUgYml0cyBmcm9tCisgICBQVFIodSlbay0xXSAod2hlbiBrPj0xIG1ha2VzIHRoYXQgbGltYiBhdmFpbGFibGUpLiAgVGFraW5nIGp1c3QgcHJlYworICAgbGltYnMgZnJvbSB0aGUgaW5wdXQgKHdpdGggdGhlIGhpZ2ggbm9uLXplcm8pIGlzIGVub3VnaCBiaXRzIGZvciB0aGUKKyAgIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBwcmVjaXNpb24sIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgZXh0cmEgd29yay4KKworICAgSWYgcj09dSB0aGUgc2hpZnQgd2lsbCBoYXZlIG92ZXJsYXBwaW5nIG9wZXJhbmRzLiAgV2hlbiBrPT0wIChpZS4gd2hlbgorICAgdXNpemUgPD0gcHJlYyksIHRoZSBvdmVybGFwIGlzIHN1cHBvcnRlZCBieSBsc2hpZnQgKGllLiBkc3QgPT0gc3JjKS4KKworICAgQnV0IHdoZW4gcj09dSBhbmQgaz49MSAoaWUuIHVzaXplID4gcHJlYyksIHdlIHdvdWxkIGhhdmUgYW4gaW52YWxpZAorICAgb3ZlcmxhcCAoaWUuIG1wbl9sc2hpZnQgKHJwLCBycCtrLCAuLi4pKS4gIEluIHRoaXMgY2FzZSB3ZSBtdXN0IGluc3RlYWQKKyAgIHVzZSBtcG5fcnNoaWZ0IChQVFIocikrMSwgUFRSKHUpK2ssIHNpemUsIE5VTUItc2hpZnQpIHdpdGggdGhlIGNhcnJ5IG91dAorICAgc3RvcmVkIHRvIFBUUihyKVswXS4gIEFuIHJzaGlmdCBieSBOVU1CLXNoaWZ0IGJpdHMgbGlrZSB0aGlzIGdpdmVzCisgICBpZGVudGljYWwgZGF0YSwgaXQncyBqdXN0IGl0cyBvdmVybGFwIHJlc3RyaWN0aW9ucyB3aGljaCBkaWZmZXIuCisKKyAgIEVuaGFuY2VtZW50czoKKworICAgVGhlIHdheSBtcG5fbHNoaWZ0IGlzIHVzZWQgbWVhbnMgc3VjY2Vzc2l2ZSBtcGZfbXVsXzJleHAgY2FsbHMgb24gdGhlCisgICBzYW1lIG9wZXJhbmQgd2lsbCBhY2N1bXVsYXRlIGxvdyB6ZXJvIGxpbWJzLCB1bnRpbCBwcmVjKzEgbGltYnMgaXMKKyAgIHJlYWNoZWQuICBUaGlzIGlzIHdhc3RlZnVsIGZvciBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuICBXaGVuIGFic191c2l6ZSA8PQorICAgcHJlYywgd2Ugc2hvdWxkIHRlc3QgdGhlIGxvdyBleHAlR01QX05VTUJfQklUUyBtYW55IGJpdHMgb2YgUFRSKHUpWzBdLAorICAgaWUuIHRob3NlIHdoaWNoIHdvdWxkIGJlIHNoaWZ0ZWQgb3V0IGJ5IGFuIG1wbl9yc2hpZnQuICBJZiB0aGV5J3JlIHplcm8KKyAgIHRoZW4gdXNlIHRoYXQgbXBuX3JzaGlmdC4gICovCisKK3ZvaWQKK21wZl9tdWxfMmV4cCAobXBmX3B0ciByLCBtcGZfc3JjcHRyIHUsIG1wX2JpdGNudF90IGV4cCkKK3sKKyAgbXBfc3JjcHRyIHVwOworICBtcF9wdHIgcnAgPSByLT5fbXBfZDsKKyAgbXBfc2l6ZV90IHVzaXplOworICBtcF9zaXplX3QgYWJzX3VzaXplOworICBtcF9zaXplX3QgcHJlYyA9IHItPl9tcF9wcmVjOworICBtcF9leHBfdCB1ZXhwID0gdS0+X21wX2V4cDsKKworICB1c2l6ZSA9IHUtPl9tcF9zaXplOworCisgIGlmIChVTkxJS0VMWSAodXNpemUgPT0gMCkpCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgci0+X21wX2V4cCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGFic191c2l6ZSA9IEFCUyAodXNpemUpOworICB1cCA9IHUtPl9tcF9kOworCisgIGlmIChleHAgJSBHTVBfTlVNQl9CSVRTID09IDApCisgICAgeworICAgICAgcHJlYysrOwkJCS8qIHJldGFpbiBtb3JlIHByZWNpc2lvbiBoZXJlIGFzIHdlIGRvbid0IG5lZWQKKwkJCQkgICB0byBhY2NvdW50IGZvciBjYXJyeS1vdXQgaGVyZSAqLworICAgICAgaWYgKGFic191c2l6ZSA+IHByZWMpCisJeworCSAgdXAgKz0gYWJzX3VzaXplIC0gcHJlYzsKKwkgIGFic191c2l6ZSA9IHByZWM7CisJfQorICAgICAgaWYgKHJwICE9IHVwKQorCU1QTl9DT1BZX0lOQ1IgKHJwLCB1cCwgYWJzX3VzaXplKTsKKyAgICAgIHItPl9tcF9leHAgPSB1ZXhwICsgZXhwIC8gR01QX05VTUJfQklUUzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3lfbGltYjsKKyAgICAgIG1wX3NpemVfdCBhZGo7CisgICAgICBpZiAoYWJzX3VzaXplID4gcHJlYykKKwl7CisJICB1cCArPSBhYnNfdXNpemUgLSBwcmVjOworCSAgYWJzX3VzaXplID0gcHJlYzsKKwkgIC8qIFVzZSBtcG5fcnNoaWZ0IHNpbmNlIG1wbl9sc2hpZnQgb3BlcmF0ZXMgZG93bndhcmRzLCBhbmQgd2UKKwkgICAgIHRoZXJlZm9yZSB3b3VsZCBjbG9iYmVyIHBhcnQgb2YgVSBiZWZvcmUgdXNpbmcgdGhhdCBwYXJ0LCBpbiBjYXNlCisJICAgICBSIGlzIHRoZSBzYW1lIHZhcmlhYmxlIGFzIFUuICAqLworCSAgY3lfbGltYiA9IG1wbl9yc2hpZnQgKHJwICsgMSwgdXAsIGFic191c2l6ZSwKKwkJCQlHTVBfTlVNQl9CSVRTIC0gZXhwICUgR01QX05VTUJfQklUUyk7CisJICBycFswXSA9IGN5X2xpbWI7CisJICBhZGogPSBycFthYnNfdXNpemVdICE9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN5X2xpbWIgPSBtcG5fbHNoaWZ0IChycCwgdXAsIGFic191c2l6ZSwgZXhwICUgR01QX05VTUJfQklUUyk7CisJICBycFthYnNfdXNpemVdID0gY3lfbGltYjsKKwkgIGFkaiA9IGN5X2xpbWIgIT0gMDsKKwl9CisKKyAgICAgIGFic191c2l6ZSArPSBhZGo7CisgICAgICByLT5fbXBfZXhwID0gdWV4cCArIGV4cCAvIEdNUF9OVU1CX0JJVFMgKyBhZGo7CisgICAgfQorICByLT5fbXBfc2l6ZSA9IHVzaXplID49IDAgPyBhYnNfdXNpemUgOiAtYWJzX3VzaXplOworfQpkaWZmIC0tZ2l0IGEvbXBmL211bF91aS5jIGIvbXBmL211bF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGE2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvbXVsX3VpLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qIG1wZl9tdWxfdWkgLS0gTXVsdGlwbHkgYSBmbG9hdCBhbmQgYW4gdW5zaWduZWQgaW50ZWdlci4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDEsIDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogVGhlIGNvcmUgb3BlcmF0aW9uIGlzIGEgbXVsdGlwbHkgb2YgUFJFQyhyKSBsaW1icyBmcm9tIHUgYnkgdiwgcHJvZHVjaW5nCisgICBlaXRoZXIgUFJFQyhyKSBvciBQUkVDKHIpKzEgcmVzdWx0IGxpbWJzLiAgSWYgdSBpcyBzaG9ydGVyIHRoYW4gUFJFQyhyKSwKKyAgIHRoZW4gd2UgdGFrZSBvbmx5IGFzIG11Y2ggYXMgaXQgaGFzLiAgSWYgdSBpcyBsb25nZXIgd2UgaW5jb3Jwb3JhdGUgYQorICAgY2FycnkgZnJvbSB0aGUgbG93ZXIgbGltYnMuCisKKyAgIElmIHUgaGFzIGp1c3QgMSBleHRyYSBsaW1iLCB0aGVuIHRoZSBjYXJyeSB0byBhZGQgaXMgaGlnaCh1cFswXSp2KS4gIFRoYXQKKyAgIGlzIG9mIGNvdXJzZSB3aGF0IG1wbl9tdWxfMSB3b3VsZCBkbyBpZiBpdCB3YXMgY2FsbGVkIHdpdGggUFJFQyhyKSsxCisgICBsaW1icyBvZiBpbnB1dC4KKworICAgSWYgdSBoYXMgbW9yZSB0aGFuIDEgZXh0cmEgbGltYiwgdGhlbiB0aGVyZSBjYW4gYmUgYSBmdXJ0aGVyIGNhcnJ5IGJpdAorICAgb3V0IG9mIGxvd2VyIHVuY2FsY3VsYXRlZCBsaW1icyAodGhlIHdheSB0aGUgbG93IG9mIG9uZSBwcm9kdWN0IGFkZHMgdG8KKyAgIHRoZSBoaWdoIG9mIHRoZSBwcm9kdWN0IGJlbG93IGl0KS4gIFRoaXMgaXMgb2YgY291cnNlIHdoYXQgYW4gbXBuX211bF8xCisgICB3b3VsZCBkbyBpZiBpdCB3YXMgY2FsbGVkIHdpdGggdGhlIGZ1bGwgdSBvcGVyYW5kLiAgQnV0IHdlIGluc3RlYWQgd29yaworICAgZG93bndhcmRzIGV4cGxpY2l0bHksIHVudGlsIGEgY2Fycnkgb2NjdXJzIG9yIHVudGlsIGEgdmFsdWUgb3RoZXIgdGhhbgorICAgR01QX05VTUJfTUFYIG9jY3VycyAodGhhdCBiZWluZyB0aGUgb25seSB2YWx1ZSBhIGNhcnJ5IGJpdCBjYW4gcHJvcGFnYXRlCisgICBhY3Jvc3MpLgorCisgICBUaGUgY2FycnkgZGV0ZXJtaW5hdGlvbiBub3JtYWxseSByZXF1aXJlcyB0d28gdW11bF9wcG1tJ3MsIG9ubHkgcmFyZWx5CisgICB3aWxsIEdNUF9OVU1CX01BWCBvY2N1ciBhbmQgcmVxdWlyZSBmdXJ0aGVyIHByb2R1Y3RzLgorCisgICBUaGUgY2FycnkgbGltYiBpcyBjb252ZW5pZW50bHkgYWRkZWQgaW50byB0aGUgbXVsXzEgdXNpbmcgbXBuX211bF8xYyB3aGVuCisgICB0aGF0IGZ1bmN0aW9uIGV4aXN0cywgb3RoZXJ3aXNlIGEgc3Vic2VxdWVudCBtcG5fYWRkXzEgaXMgbmVlZGVkLgorCisgICBDbGVhcmx5IHdoZW4gbXBuX211bF8xYyBpcyB1c2VkIHRoZSBjYXJyeSBtdXN0IGJlIGNhbGN1bGF0ZWQgZmlyc3QuICBCdXQKKyAgIHRoaXMgaXMgYWxzbyB0aGUgY2FzZSB3aGVuIGFkZF8xIGlzIHVzZWQsIHNpbmNlIGlmIHI9PXUgYW5kIEFCU0laKHIpID4KKyAgIFBSRUMocikgdGhlbiB0aGUgbXBuX211bF8xIG92ZXJ3cml0ZXMgdGhlIGxvdyBwYXJ0IG9mIHRoZSBpbnB1dC4KKworICAgQSByZXVzZSByPT11IHdpdGggc2l6ZSA+IHByZWMgY2FuIG9jY3VyIGZyb20gYSBzaXplIFBSRUMocikrMSBpbiB0aGUKKyAgIHVzdWFsIHdheSwgb3IgaXQgY2FuIG9jY3VyIGZyb20gYW4gbXBmX3NldF9wcmVjX3JhdyBsZWF2aW5nIGEgYmlnZ2VyCisgICBzaXplZCB2YWx1ZS4gIEluIGJvdGggY2FzZXMgd2UgY2FuIGVuZCB1cCBjYWxsaW5nIG1wbl9tdWxfMSB3aXRoCisgICBvdmVybGFwcGluZyBzcmMgYW5kIGRzdCByZWdpb25zLCBidXQgdGhpcyB3aWxsIGJlIHdpdGggZHN0IDwgc3JjIGFuZCBzdWNoCisgICBhbiBvdmVybGFwIGlzIHBlcm1pdHRlZC4KKworICAgTm90IGRvbmU6CisKKyAgIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBkZXRlcm1pbmUgaW4gYWR2YW5jZSB3aGV0aGVyIHRoZSByZXN1bHQgd2lsbCBiZQorICAgUFJFQyhyKSBvciBQUkVDKHIpKzEgbGltYnMuICBJZiBpdCdzIGdvaW5nIHRvIGJlIFBSRUMocikrMSB0aGVuIHdlIGNvdWxkCisgICB0YWtlIG9uZSBsZXNzIGxpbWIgZnJvbSB1IGFuZCBnZW5lcmF0ZSBqdXN0IFBSRUMociksIHRoYXQgb2YgY291cnNlCisgICBzYXRpc2Z5aW5nIGFwcGxpY2F0aW9uIHJlcXVlc3RlZCBwcmVjaXNpb24uICBCdXQgYW55IHRlc3QgY291bnRpbmcgYml0cworICAgb3IgZm9ybWluZyB0aGUgaGlnaCBwcm9kdWN0IHdvdWxkIGFsbW9zdCBjZXJ0YWlubHkgdGFrZSBsb25nZXIgdGhhbiB0aGUKKyAgIGluY3JlbWVudGFsIGNvc3Qgb2YgYW4gZXh0cmEgbGltYiBpbiBtcG5fbXVsXzEuCisKKyAgIEVuaGFuY2VtZW50czoKKworICAgUmVwZWF0ZWQgbXBmX211bF91aSdzIHdpdGggYW4gZXZlbiB2IHdpbGwgYWNjdW11bGF0ZSBsb3cgemVybyBiaXRzIG9uIHRoZQorICAgcmVzdWx0LCBsZWF2aW5nIGxvdyB6ZXJvIGxpbWJzIGFmdGVyIGEgd2hpbGUsIHdoaWNoIGl0IG1pZ2h0IGJlIG5pY2UgdG8KKyAgIHN0cmlwIHRvIHNhdmUgd29yayBpbiBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuICBDYWxjdWxhdGluZyB0aGUgbG93IGxpbWIKKyAgIGV4cGxpY2l0bHkgd291bGQgbGV0IHVzIGRpcmVjdCBtcG5fbXVsXzEgdG8gcHV0IHRoZSBiYWxhbmNlIGF0IHJwIHdoZW4KKyAgIHRoZSBsb3cgaXMgemVybyAoaW5zdGVhZCBvZiBub3JtYWxseSBycCsxKS4gIEJ1dCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyCisgICB0aGlzIHdvdWxkIGJlIHdvcnRod2hpbGUuICBFeHBsaWNpdCBjb2RlIGZvciB0aGUgbG93IGxpbWIgd2lsbCBwcm9iYWJseQorICAgYmUgc2xvd2VyIHRoYW4gaGF2aW5nIGl0IGRvbmUgaW4gbXBuX211bF8xLCBzbyB3ZSBuZWVkIHRvIGNvbnNpZGVyIGhvdworICAgb2Z0ZW4gYSB6ZXJvIHdpbGwgYmUgc3RyaXBwZWQgYW5kIGhvdyBtdWNoIHRoYXQncyBsaWtlbHkgdG8gc2F2ZQorICAgbGF0ZXIuICAqLworCit2b2lkCittcGZfbXVsX3VpIChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSwgdW5zaWduZWQgbG9uZyBpbnQgdikKK3sKKyAgbXBfc3JjcHRyIHVwOworICBtcF9zaXplX3QgdXNpemU7CisgIG1wX3NpemVfdCBzaXplOworICBtcF9zaXplX3QgcHJlYywgZXhjZXNzOworICBtcF9saW1iX3QgY3lfbGltYiwgdmwsIGNiaXQsIGNpbjsKKyAgbXBfcHRyIHJwOworCisgIHVzaXplID0gdS0+X21wX3NpemU7CisgIGlmIChVTkxJS0VMWSAodiA9PSAwKSB8fCBVTkxJS0VMWSAodXNpemUgPT0gMCkpCisgICAgeworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgci0+X21wX2V4cCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKHYgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBmX3QgICAgIHZmOworICAgICAgbXBfbGltYl90IHZwWzJdOworICAgICAgdnBbMF0gPSB2ICYgR01QX05VTUJfTUFTSzsKKyAgICAgIHZwWzFdID0gdiA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgUFRSKHZmKSA9IHZwOworICAgICAgU0laKHZmKSA9IDI7CisgICAgICBBU1NFUlRfQ09ERSAoUFJFQyh2ZikgPSAyKTsKKyAgICAgIEVYUCh2ZikgPSAyOworICAgICAgbXBmX211bCAociwgdSwgdmYpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgIHNpemUgPSBBQlMgKHVzaXplKTsKKyAgcHJlYyA9IHItPl9tcF9wcmVjOworICB1cCA9IHUtPl9tcF9kOworICB2bCA9IHY7CisgIGV4Y2VzcyA9IHNpemUgLSBwcmVjOworICBjaW4gPSAwOworCisgIGlmIChleGNlc3MgPiAwKQorICAgIHsKKyAgICAgIC8qIHVwIGlzIGJpZ2dlciB0aGFuIGRlc2lyZWQgcnAsIHNob3J0ZW4gaXQgdG8gcHJlYyBsaW1icyBhbmQKKyAgICAgICAgIGRldGVybWluZSBhIGNhcnJ5LWluICovCisKKyAgICAgIG1wX2xpbWJfdCAgdmxfc2hpZnRlZCA9IHZsIDw8IEdNUF9OQUlMX0JJVFM7CisgICAgICBtcF9saW1iX3QgIGhpLCBsbywgbmV4dF9sbywgc3VtOworICAgICAgbXBfc2l6ZV90ICBpOworCisgICAgICAvKiBoaWdoIGxpbWIgb2YgdG9wIHByb2R1Y3QgKi8KKyAgICAgIGkgPSBleGNlc3MgLSAxOworICAgICAgdW11bF9wcG1tIChjaW4sIGxvLCB1cFtpXSwgdmxfc2hpZnRlZCk7CisKKyAgICAgIC8qIGFuZCBjYXJyeSBiaXQgb3V0IG9mIHByb2R1Y3RzIGJlbG93IHRoYXQsIGlmIGFueSAqLworICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgIGktLTsKKyAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIHVtdWxfcHBtbSAoaGksIG5leHRfbG8sIHVwW2ldLCB2bF9zaGlmdGVkKTsKKyAgICAgICAgICBsbyA+Pj0gR01QX05BSUxfQklUUzsKKyAgICAgICAgICBBRERDX0xJTUIgKGNiaXQsIHN1bSwgaGksIGxvKTsKKyAgICAgICAgICBjaW4gKz0gY2JpdDsKKyAgICAgICAgICBsbyA9IG5leHRfbG87CisKKyAgICAgICAgICAvKiBDb250aW51ZSBvbmx5IGlmIHRoZSBzdW0gaXMgR01QX05VTUJfTUFYLiAgR01QX05VTUJfTUFYIGlzIHRoZQorICAgICAgICAgICAgIG9ubHkgdmFsdWUgYSBjYXJyeSBmcm9tIGJlbG93IGNhbiBwcm9wYWdhdGUgYWNyb3NzLiAgSWYgd2UndmUKKyAgICAgICAgICAgICBqdXN0IHNlZW4gdGhlIGNhcnJ5IG91dCAoaWUuIGNiaXQhPTApIHRoZW4gc3VtIT1HTVBfTlVNQl9NQVgsCisgICAgICAgICAgICAgc28gdGhpcyB0ZXN0IHN0b3BzIHVzIGZvciB0aGF0IGNhc2UgdG9vLiAgKi8KKyAgICAgICAgICBpZiAoTElLRUxZIChzdW0gIT0gR01QX05VTUJfTUFYKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIHVwICs9IGV4Y2VzczsKKyAgICAgIHNpemUgPSBwcmVjOworICAgIH0KKworICBycCA9IHItPl9tcF9kOworI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMWMKKyAgY3lfbGltYiA9IG1wbl9tdWxfMWMgKHJwLCB1cCwgc2l6ZSwgdmwsIGNpbik7CisjZWxzZQorICBjeV9saW1iID0gbXBuX211bF8xIChycCwgdXAsIHNpemUsIHZsKTsKKyAgX19HTVBOX0FERF8xIChjYml0LCBycCwgcnAsIHNpemUsIGNpbik7CisgIGN5X2xpbWIgKz0gY2JpdDsKKyNlbmRpZgorICBycFtzaXplXSA9IGN5X2xpbWI7CisgIGN5X2xpbWIgPSBjeV9saW1iICE9IDA7CisgIHItPl9tcF9leHAgPSB1LT5fbXBfZXhwICsgY3lfbGltYjsKKyAgc2l6ZSArPSBjeV9saW1iOworICByLT5fbXBfc2l6ZSA9IHVzaXplID49IDAgPyBzaXplIDogLXNpemU7Cit9CmRpZmYgLS1naXQgYS9tcGYvbmVnLmMgYi9tcGYvbmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NDgxNQotLS0gL2Rldi9udWxsCisrKyBiL21wZi9uZWcuYwpAQCAtMCwwICsxLDYxIEBACisvKiBtcGZfbmVnIC0tIE5lZ2F0ZSBhIGZsb2F0LgorCitDb3B5cmlnaHQgMTk5My0xOTk1LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX25lZyAobXBmX3B0ciByLCBtcGZfc3JjcHRyIHUpCit7CisgIG1wX3NpemVfdCBzaXplOworCisgIHNpemUgPSAtdS0+X21wX3NpemU7CisgIGlmIChyICE9IHUpCisgICAgeworICAgICAgbXBfc2l6ZV90IHByZWM7CisgICAgICBtcF9zaXplX3QgYXNpemU7CisgICAgICBtcF9wdHIgcnAsIHVwOworCisgICAgICBwcmVjID0gci0+X21wX3ByZWMgKyAxOwkvKiBsaWUgbm90IHRvIGxvc2UgcHJlY2lzaW9uIGluIGFzc2lnbm1lbnQgKi8KKyAgICAgIGFzaXplID0gQUJTIChzaXplKTsKKyAgICAgIHJwID0gci0+X21wX2Q7CisgICAgICB1cCA9IHUtPl9tcF9kOworCisgICAgICBpZiAoYXNpemUgPiBwcmVjKQorCXsKKwkgIHVwICs9IGFzaXplIC0gcHJlYzsKKwkgIGFzaXplID0gcHJlYzsKKwl9CisKKyAgICAgIE1QTl9DT1BZIChycCwgdXAsIGFzaXplKTsKKyAgICAgIHItPl9tcF9leHAgPSB1LT5fbXBfZXhwOworICAgICAgc2l6ZSA9IHNpemUgPj0gMCA/IGFzaXplIDogLWFzaXplOworICAgIH0KKyAgci0+X21wX3NpemUgPSBzaXplOworfQpkaWZmIC0tZ2l0IGEvbXBmL291dF9zdHIuYyBiL21wZi9vdXRfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMmQwZgotLS0gL2Rldi9udWxsCisrKyBiL21wZi9vdXRfc3RyLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIG1wZl9vdXRfc3RyIChzdHJlYW0sIGJhc2UsIG5fZGlnaXRzLCBvcCkgLS0gUHJpbnQgTl9ESUdJVFMgZGlnaXRzIGZyb20KKyAgIHRoZSBmbG9hdCBPUCB0byBTVFJFQU0gaW4gYmFzZSBCQVNFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgd3JpdHRlbiwgb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDIwMDEsIDIwMDIsIDIwMDUsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgICAgLyogZm9yIERFQ0lNQUxfUE9JTlQgaW4gbGFuZ2luZm8uaCAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgSEFWRV9MQU5HSU5GT19ICisjaW5jbHVkZSA8bGFuZ2luZm8uaD4gIC8qIGZvciBubF9sYW5naW5mbyAqLworI2VuZGlmCisKKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+ICAgIC8qIGZvciBsb2NhbGVjb252ICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCitzaXplX3QKK21wZl9vdXRfc3RyIChGSUxFICpzdHJlYW0sIGludCBiYXNlLCBzaXplX3Qgbl9kaWdpdHMsIG1wZl9zcmNwdHIgb3ApCit7CisgIGNoYXIgKnN0cjsKKyAgbXBfZXhwX3QgZXhwOworICBzaXplX3Qgd3JpdHRlbjsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKGJhc2UgPT0gMCkKKyAgICBiYXNlID0gMTA7CisgIGlmIChuX2RpZ2l0cyA9PSAwKQorICAgIE1QRl9TSUdOSUZJQ0FOVF9ESUdJVFMgKG5fZGlnaXRzLCBiYXNlLCBvcC0+X21wX3ByZWMpOworCisgIGlmIChzdHJlYW0gPT0gMCkKKyAgICBzdHJlYW0gPSBzdGRvdXQ7CisKKyAgLyogQ29uc2lkZXIgdGhlc2UgY2hhbmdlczoKKyAgICAgKiBEb24ndCBhbGxvY2F0ZSBtZW1vcnkgaGVyZSBmb3IgaHVnZSBuX2RpZ2l0czsgcGFzcyBOVUxMIHRvIG1wZl9nZXRfc3RyLgorICAgICAqIE1ha2UgbXBmX2dldF9zdHIgYWxsb2NhdGUgZXh0cmEgc3BhY2Ugd2hlbiBwYXNzZWQgTlVMTCwgdG8gYXZvaWQKKyAgICAgICBhbGxvY2F0aW5nIHR3byBodWdlIHN0cmluZyBidWZmZXJzLgorICAgICAqIEltcGxlbWVudCBtb3JlL290aGVyIGFsbG9jYXRpb24gcmVkdWN0aW9ucyB0cmlja3MuICAqLworCisgIHN0ciA9IChjaGFyICopIFRNUF9BTExPQyAobl9kaWdpdHMgKyAyKTsgLyogZXh0cmEgZm9yIG1pbnVzIHNpZ24gYW5kIFwwICovCisKKyAgbXBmX2dldF9zdHIgKHN0ciwgJmV4cCwgYmFzZSwgbl9kaWdpdHMsIG9wKTsKKyAgbl9kaWdpdHMgPSBzdHJsZW4gKHN0cik7CisKKyAgd3JpdHRlbiA9IDA7CisKKyAgLyogV3JpdGUgc2lnbiAqLworICBpZiAoc3RyWzBdID09ICctJykKKyAgICB7CisgICAgICBzdHIrKzsKKyAgICAgIGZwdXRjICgnLScsIHN0cmVhbSk7CisgICAgICB3cml0dGVuID0gMTsKKyAgICAgIG5fZGlnaXRzLS07CisgICAgfQorCisgIHsKKyAgICBjb25zdCBjaGFyICAqcG9pbnQgPSBHTVBfREVDSU1BTF9QT0lOVDsKKyAgICBzaXplX3QgICAgICBwb2ludGxlbiA9IHN0cmxlbiAocG9pbnQpOworICAgIHB1dGMgKCcwJywgc3RyZWFtKTsKKyAgICBmd3JpdGUgKHBvaW50LCAxLCBwb2ludGxlbiwgc3RyZWFtKTsKKyAgICB3cml0dGVuICs9IHBvaW50bGVuICsgMTsKKyAgfQorCisgIC8qIFdyaXRlIG1hbnRpc3NhICovCisgIHsKKyAgICBzaXplX3QgZndyZXQ7CisgICAgZndyZXQgPSBmd3JpdGUgKHN0ciwgMSwgbl9kaWdpdHMsIHN0cmVhbSk7CisgICAgd3JpdHRlbiArPSBmd3JldDsKKyAgfQorCisgIC8qIFdyaXRlIGV4cG9uZW50ICovCisgIHsKKyAgICBpbnQgZnByZXQ7CisgICAgZnByZXQgPSBmcHJpbnRmIChzdHJlYW0sIChiYXNlIDw9IDEwID8gImUlbGQiIDogIkAlbGQiKSwgZXhwKTsKKyAgICB3cml0dGVuICs9IGZwcmV0OworICB9CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBmZXJyb3IgKHN0cmVhbSkgPyAwIDogd3JpdHRlbjsKK30KZGlmZiAtLWdpdCBhL21wZi9wb3dfdWkuYyBiL21wZi9wb3dfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU0ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL3Bvd191aS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIG1wZl9wb3dfdWkgLS0gQ29tcHV0ZSBiXmUuCisKK0NvcHlyaWdodCAxOTk4LCAxOTk5LCAyMDAxLCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBUaGlzIHVzZXMgYSBwbGFpbiByaWdodC10by1sZWZ0IHNxdWFyZS1hbmQtbXVsdGlwbHkgYWxnb3JpdGhtLgorCisgICBGSVhNRTogV2hlbiBwb3Bjb3VudChlKSBpcyBub3QgdG9vIHNtYWxsLCBpdCB3b3VsZCBwcm9iYWJseSBzcGVlZCB0aGluZ3MgdXAKKyAgIHRvIHVzZSBhIGstYXJ5IHNsaWRpbmcgd2luZG93IGFsZ29yaXRobS4gICovCisKK3ZvaWQKK21wZl9wb3dfdWkgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciBiLCB1bnNpZ25lZCBsb25nIGludCBlKQoreworICBtcGZfdCB0OworICBpbnQgY250OworCisgIGlmIChlIDw9IDEpCisgICAgeworICAgICAgaWYgKGUgPT0gMCkKKwltcGZfc2V0X3VpIChyLCAxKTsKKyAgICAgIGVsc2UKKwltcGZfc2V0IChyLCBiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCAobXBfbGltYl90KSBlKTsKKyAgY250ID0gR01QX0xJTUJfQklUUyAtIDEgLSBjbnQ7CisKKyAgLyogSW5jcmVhc2UgY29tcHV0YXRpb24gcHJlY2lzaW9uIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGV4cG9uZW50LiAgQWRkaW5nCisgICAgIGxvZzIocG9wY291bnQoZSkgKyBsb2cyKGUpKSBiaXRzIHNob3VsZCBiZSBzdWZmaWNpZW50LCBidXQgd2UgYWRkIGxvZzIoZSksCisgICAgIGkuZS4gbXVjaCBtb3JlLiAgV2l0aCBtcGYncyByb3VuZGluZyBvZiBwcmVjaXNpb24gdG8gd2hvbGUgbGltYnMsIHRoaXMKKyAgICAgd2lsbCBiZSBleGNlc3NpdmUgb25seSB3aGVuIGxpbWJzIGFyZSBhcnRpZmljaWFsbHkgc21hbGwuICAqLworICBtcGZfaW5pdDIgKHQsIG1wZl9nZXRfcHJlYyAocikgKyBjbnQpOworCisgIG1wZl9zZXQgKHQsIGIpOwkJLyogY29uc3VtZSBtb3N0IHNpZ25pZmljYW50IGJpdCAqLworICB3aGlsZSAoLS1jbnQgPiAwKQorICAgIHsKKyAgICAgIG1wZl9tdWwgKHQsIHQsIHQpOworICAgICAgaWYgKChlID4+IGNudCkgJiAxKQorCW1wZl9tdWwgKHQsIHQsIGIpOworICAgIH0KKworICAvKiBEbyB0aGUgbGFzdCBpdGVyYXRpb24gc3BlY2lhbGx5IGluIG9yZGVyIHRvIHNhdmUgYSBjb3B5IG9wZXJhdGlvbi4gICovCisgIGlmIChlICYgMSkKKyAgICB7CisgICAgICBtcGZfbXVsICh0LCB0LCB0KTsKKyAgICAgIG1wZl9tdWwgKHIsIHQsIGIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wZl9tdWwgKHIsIHQsIHQpOworICAgIH0KKworICBtcGZfY2xlYXIgKHQpOworfQpkaWZmIC0tZ2l0IGEvbXBmL3JhbmRvbTIuYyBiL21wZi9yYW5kb20yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwMTYzYwotLS0gL2Rldi9udWxsCisrKyBiL21wZi9yYW5kb20yLmMKQEAgLTAsMCArMSw2NiBAQAorLyogbXBmX3JhbmRvbTIgLS0gR2VuZXJhdGUgYSBwb3NpdGl2ZSByYW5kb20gbXBmX3Qgb2Ygc3BlY2lmaWVkIHNpemUsIHdpdGgKKyAgIGxvbmcgcnVucyBvZiBjb25zZWN1dGl2ZSBvbmVzIGFuZCB6ZXJvcyBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uLgorICAgSW50ZW5kZWQgZm9yIHRlc3Rpbmcgb2Ygb3RoZXIgTVAgcm91dGluZXMuCisKK0NvcHlyaWdodCAxOTk1LCAxOTk2LCAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wZl9yYW5kb20yIChtcGZfcHRyIHgsIG1wX3NpemVfdCB4cywgbXBfZXhwX3QgZXhwKQoreworICBtcF9zaXplX3QgeG47CisgIG1wX3NpemVfdCBwcmVjOworICBtcF9saW1iX3QgZWxpbWI7CisKKyAgeG4gPSBBQlMgKHhzKTsKKyAgcHJlYyA9IFBSRUMoeCk7CisKKyAgaWYgKHhuID09IDApCisgICAgeworICAgICAgRVhQKHgpID0gMDsKKyAgICAgIFNJWih4KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh4biA+IHByZWMgKyAxKQorICAgIHhuID0gcHJlYyArIDE7CisKKyAgLyogR2VuZXJhbCByYW5kb20gbWFudGlzc2EuICAqLworICBtcG5fcmFuZG9tMiAoUFRSKHgpLCB4bik7CisKKyAgLyogR2VuZXJhdGUgcmFuZG9tIGV4cG9uZW50LiAgKi8KKyAgX2dtcF9yYW5kICgmZWxpbWIsIFJBTkRTLCBHTVBfTlVNQl9CSVRTKTsKKyAgZXhwID0gQUJTIChleHApOworICBleHAgPSBlbGltYiAlICgyICogZXhwICsgMSkgLSBleHA7CisKKyAgRVhQKHgpID0gZXhwOworICBTSVooeCkgPSB4cyA8IDAgPyAteG4gOiB4bjsKK30KZGlmZiAtLWdpdCBhL21wZi9yZWxkaWZmLmMgYi9tcGYvcmVsZGlmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvcmVsZGlmZi5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIG1wZl9yZWxkaWZmIC0tIEdlbmVyYXRlIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIG9mIHR3byBmbG9hdHMuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAxLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBUaGUgcHJlY2lzaW9uIHdlIHVzZSBmb3IgZCA9IHgteSBpcyBiYXNlZCBvbiB3aGF0IG1wZl9kaXYgd2lsbCB3YW50IGZyb20KKyAgIHRoZSBkaXZpZGVuZC4gIEl0IGNhbGxzIG1wbl9kaXZfcSB0byBwcm9kdWNlIGEgcXVvdGllbnQgb2YgcnByZWMrMSBsaW1icy4KKyAgIFNvIHJwcmVjKzEgPT0gZHNpemUgLSB4c2l6ZSArIDEsIGhlbmNlIGRwcmVjID0gcnByZWMreHNpemUuICAqLworCit2b2lkCittcGZfcmVsZGlmZiAobXBmX3B0ciByZGlmZiwgbXBmX3NyY3B0ciB4LCBtcGZfc3JjcHRyIHkpCit7CisgIGlmIChVTkxJS0VMWSAoU0laKHgpID09IDApKQorICAgIHsKKyAgICAgIG1wZl9zZXRfdWkgKHJkaWZmLCAodW5zaWduZWQgbG9uZyBpbnQpIChtcGZfc2duICh5KSAhPSAwKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfc2l6ZV90IGRwcmVjOworICAgICAgbXBmX3QgZDsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBUTVBfTUFSSzsKKyAgICAgIGRwcmVjID0gUFJFQyhyZGlmZikgKyBBQlNJWih4KTsKKyAgICAgIEFTU0VSVCAoUFJFQyhyZGlmZikrMSA9PSBkcHJlYyAtIEFCU0laKHgpICsgMSk7CisKKyAgICAgIFBSRUMoZCkgPSBkcHJlYzsKKyAgICAgIFBUUihkKSA9IFRNUF9BTExPQ19MSU1CUyAoZHByZWMgKyAxKTsKKworICAgICAgbXBmX3N1YiAoZCwgeCwgeSk7CisgICAgICBTSVooZCkgPSBBQlNJWihkKTsKKyAgICAgIG1wZl9kaXYgKHJkaWZmLCBkLCB4KTsKKworICAgICAgVE1QX0ZSRUU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBmL3NldC5jIGIvbXBmL3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmZlODYKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2V0LmMKQEAgLTAsMCArMSw1NSBAQAorLyogbXBmX3NldCAtLSBBc3NpZ24gYSBmbG9hdCBmcm9tIGFub3RoZXIgZmxvYXQuCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfc2V0IChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSkKK3sKKyAgbXBfcHRyIHJwLCB1cDsKKyAgbXBfc2l6ZV90IHNpemUsIGFzaXplOworICBtcF9zaXplX3QgcHJlYzsKKworICBwcmVjID0gci0+X21wX3ByZWMgKyAxOwkJLyogbGllIG5vdCB0byBsb3NlIHByZWNpc2lvbiBpbiBhc3NpZ25tZW50ICovCisgIHNpemUgPSB1LT5fbXBfc2l6ZTsKKyAgYXNpemUgPSBBQlMgKHNpemUpOworICBycCA9IHItPl9tcF9kOworICB1cCA9IHUtPl9tcF9kOworCisgIGlmIChhc2l6ZSA+IHByZWMpCisgICAgeworICAgICAgdXAgKz0gYXNpemUgLSBwcmVjOworICAgICAgYXNpemUgPSBwcmVjOworICAgIH0KKworICByLT5fbXBfZXhwID0gdS0+X21wX2V4cDsKKyAgci0+X21wX3NpemUgPSBzaXplID49IDAgPyBhc2l6ZSA6IC1hc2l6ZTsKKyAgTVBOX0NPUFlfSU5DUiAocnAsIHVwLCBhc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvc2V0X2QuYyBiL21wZi9zZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDJmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2V0X2QuYwpAQCAtMCwwICsxLDU5IEBACisvKiBtcGZfc2V0X2QgLS0gQXNzaWduIGEgZmxvYXQgZnJvbSBhIGRvdWJsZS4KKworQ29weXJpZ2h0IDE5OTMtMTk5NiwgMjAwMSwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9GTE9BVF9ICisjaW5jbHVkZSA8ZmxvYXQuaD4gIC8qIGZvciBEQkxfTUFYICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zZXRfZCAobXBmX3B0ciByLCBkb3VibGUgZCkKK3sKKyAgaW50IG5lZ2F0aXZlOworCisgIERPVUJMRV9OQU5fSU5GX0FDVElPTiAoZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAoKSk7CisKKyAgaWYgKFVOTElLRUxZIChkID09IDApKQorICAgIHsKKyAgICAgIFNJWihyKSA9IDA7CisgICAgICBFWFAocikgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKyAgbmVnYXRpdmUgPSBkIDwgMDsKKyAgZCA9IEFCUyAoZCk7CisKKyAgU0laKHIpID0gbmVnYXRpdmUgPyAtTElNQlNfUEVSX0RPVUJMRSA6IExJTUJTX1BFUl9ET1VCTEU7CisgIEVYUChyKSA9IF9fZ21wX2V4dHJhY3RfZG91YmxlIChQVFIociksIGQpOworfQpkaWZmIC0tZ2l0IGEvbXBmL3NldF9kZmxfcHJlYy5jIGIvbXBmL3NldF9kZmxfcHJlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTcxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2V0X2RmbF9wcmVjLmMKQEAgLTAsMCArMSwzOSBAQAorLyogbXBmX3NldF9kZWZhdWx0X3ByZWMgLS0KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK21wX3NpemVfdCBfX2dtcF9kZWZhdWx0X2ZwX2xpbWJfcHJlY2lzaW9uID0gX19HTVBGX0JJVFNfVE9fUFJFQyAoNTMpOworCit2b2lkCittcGZfc2V0X2RlZmF1bHRfcHJlYyAobXBfYml0Y250X3QgcHJlY19pbl9iaXRzKSBfX0dNUF9OT1RIUk9XCit7CisgIF9fZ21wX2RlZmF1bHRfZnBfbGltYl9wcmVjaXNpb24gPSBfX0dNUEZfQklUU19UT19QUkVDIChwcmVjX2luX2JpdHMpOworfQpkaWZmIC0tZ2l0IGEvbXBmL3NldF9wcmMuYyBiL21wZi9zZXRfcHJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjM2YwZQotLS0gL2Rldi9udWxsCisrKyBiL21wZi9zZXRfcHJjLmMKQEAgLTAsMCArMSw2OCBAQAorLyogbXBmX3NldF9wcmVjKHgpIC0tIENoYW5nZSB0aGUgcHJlY2lzaW9uIG9mIHguCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEEgZnVsbCBuZXdfcHJlYysxIGxpbWJzIGFyZSBhbHdheXMgcmV0YWluZWQsIGV2ZW4gdGhvdWdoIGp1c3QgbmV3X3ByZWMKKyAgIHdvdWxkIHNhdGlzZnkgdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24uICBJZiBzaXplPT1uZXdfcHJlYysxIHRoZW4KKyAgIGNlcnRhaW5seSBuZXdfcHJlYysxIHNob3VsZCBiZSBrZXB0IHNpbmNlIG5vIGNvcHlpbmcgaXMgbmVlZGVkIGluIHRoYXQKKyAgIGNhc2UuICBJZiBqdXN0IG5ld19wcmVjIHdhcyBrZXB0IGZvciBzaXplPm5ld19wcmVjKzEgaXQnZCBiZSBhIGJpdAorICAgaW5jb25zaXN0ZW50LiAgKi8KKwordm9pZAorbXBmX3NldF9wcmVjIChtcGZfcHRyIHgsIG1wX2JpdGNudF90IG5ld19wcmVjX2luX2JpdHMpCit7CisgIG1wX3NpemVfdCAgb2xkX3ByZWMsIG5ld19wcmVjLCBuZXdfcHJlY19wbHVzMTsKKyAgbXBfc2l6ZV90ICBzaXplLCBzaWduOworICBtcF9wdHIgICAgIHhwOworCisgIG5ld19wcmVjID0gX19HTVBGX0JJVFNfVE9fUFJFQyAobmV3X3ByZWNfaW5fYml0cyk7CisgIG9sZF9wcmVjID0gUFJFQyh4KTsKKworICAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgdGhlIHJpZ2h0IHByZWNpc2lvbiAqLworICBpZiAobmV3X3ByZWMgPT0gb2xkX3ByZWMpCisgICAgcmV0dXJuOworCisgIFBSRUMoeCkgPSBuZXdfcHJlYzsKKyAgbmV3X3ByZWNfcGx1czEgPSBuZXdfcHJlYyArIDE7CisKKyAgLyogcmV0YWluIG1vc3Qgc2lnbmlmaWNhbnQgbGltYnMgKi8KKyAgc2lnbiA9IFNJWih4KTsKKyAgc2l6ZSA9IEFCUyAoc2lnbik7CisgIHhwID0gUFRSKHgpOworICBpZiAoc2l6ZSA+IG5ld19wcmVjX3BsdXMxKQorICAgIHsKKyAgICAgIFNJWih4KSA9IChzaWduID49IDAgPyBuZXdfcHJlY19wbHVzMSA6IC1uZXdfcHJlY19wbHVzMSk7CisgICAgICBNUE5fQ09QWV9JTkNSICh4cCwgeHAgKyBzaXplIC0gbmV3X3ByZWNfcGx1czEsIG5ld19wcmVjX3BsdXMxKTsKKyAgICB9CisKKyAgUFRSKHgpID0gX19HTVBfUkVBTExPQ0FURV9GVU5DX0xJTUJTICh4cCwgb2xkX3ByZWMrMSwgbmV3X3ByZWNfcGx1czEpOworfQpkaWZmIC0tZ2l0IGEvbXBmL3NldF9wcmNfcmF3LmMgYi9tcGYvc2V0X3ByY19yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM1MmNjCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL3NldF9wcmNfcmF3LmMKQEAgLTAsMCArMSwzOSBAQAorLyogbXBmX3NldF9wcmVjX3Jhdyh4LGJpdHMpIC0tIENoYW5nZSB0aGUgcHJlY2lzaW9uIG9mIHggd2l0aG91dCBjaGFuZ2luZworICAgYWxsb2NhdGlvbi4gIEZvciBwcm9wZXIgb3BlcmF0aW9uLCB0aGUgb3JpZ2luYWwgcHJlY2lzaW9uIG5lZWQgdG8gYmUgcmVzZXQKKyAgIHNvb25lciBvciBsYXRlci4KKworQ29weXJpZ2h0IDE5OTYsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcGZfc2V0X3ByZWNfcmF3IChtcGZfcHRyIHgsIG1wX2JpdGNudF90IHByZWNfaW5fYml0cykgX19HTVBfTk9USFJPVworeworICB4LT5fbXBfcHJlYyA9IF9fR01QRl9CSVRTX1RPX1BSRUMgKHByZWNfaW5fYml0cyk7Cit9CmRpZmYgLS1naXQgYS9tcGYvc2V0X3EuYyBiL21wZi9zZXRfcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjFlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2V0X3EuYwpAQCAtMCwwICsxLDExOCBAQAorLyogbXBmX3NldF9xIChtcGZfdCByb3AsIG1wcV90IG9wKSAtLSBDb252ZXJ0IHRoZSByYXRpb25hbCBvcCB0byB0aGUgZmxvYXQgcm9wLgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQXMgdXN1YWwgdGhlIGFpbSBpcyB0byBwcm9kdWNlIFBSRUMocikgbGltYnMsIHdpdGggdGhlIGhpZ2ggbm9uLXplcm8uICBUaGUKKyAgIGJhc2ljIG1wbl9kaXZfcSBwcm9kdWNlcyBhIHF1b3RpZW50IG9mIG5zaXplLWRzaXplKzEgbGltYnMsIHdpdGggZWl0aGVyIHRoZQorICAgaGlnaCBvciBzZWNvbmQgaGlnaGVzdCBsaW1iIG5vbi16ZXJvLiAgV2UgYXJyYW5nZSBmb3IgbnNpemUtZHNpemUrMSB0byBlcXVhbAorICAgcHJlYysxLCBoZW5jZSBnaXZpbmcgZWl0aGVyIHByZWMgb3IgcHJlYysxIHJlc3VsdCBsaW1icyBhdCBQVFIocikuCisKKyAgIG5zaXplLWRzaXplKzEgPT0gcHJlYysxIGlzIGFjaGlldmVkIGJ5IGFkanVzdGluZyBudW0ocSksIGVpdGhlciBkcm9wcGluZyBsb3cKKyAgIGxpbWJzIGlmIGl0J3MgdG9vIGJpZywgb3IgcGFkZGluZyB3aXRoIGxvdyB6ZXJvcyBpZiBpdCdzIHRvbyBzbWFsbC4gIFRoZQorICAgZnVsbCBnaXZlbiBkZW4ocSkgaXMgYWx3YXlzIHVzZWQuCisKKyAgIFdlIGNhbm5vdCB0cnVuY2F0ZSBkZW4ocSksIGJlY2F1c2UgZXZlbiB3aGVuIGl0J3MgbXVjaCBiaWdnZXIgdGhhbiBwcmVjIHRoZQorICAgbGFzdCBsaW1icyBjYW4gc3RpbGwgaW5mbHVlbmNlIHRoZSBmaW5hbCBxdW90aWVudC4gIE9mdGVuIHRoZXkgZG9uJ3QsIGJ1dCB3ZQorICAgbGVhdmUgb3B0aW1pemF0aW9uIG9mIHRoYXQgdG8gbXBuX2Rpdl9xLgorCisgICBFbmhhbmNlbWVudHM6CisKKyAgIFRoZSBoaWdoIHF1b3RpZW50IGxpbWIgaXMgbm9uLXplcm8gd2hlbiBoaWdoe25wLGRzaXplfSA+IHtkcCxkc2l6ZX0uICBXZQorICAgY291bGQgbWFrZSB0aGF0IGNvbXBhcmlzb24gYW5kIHVzZSBxc2l6ZT09cHJlYyBpbnN0ZWFkIG9mIHFzaXplPT1wcmVjKzEsCisgICB0byBzYXZlIG9uZSBsaW1iIGluIHRoZSBkaXZpc2lvbi4gICovCisKK3ZvaWQKK21wZl9zZXRfcSAobXBmX3B0ciByLCBtcHFfc3JjcHRyIHEpCit7CisgIG1wX3NyY3B0ciBucCwgZHA7CisgIG1wX3NpemVfdCBwcmVjLCBuc2l6ZSwgZHNpemUsIHFzaXplLCBwcm9zcGVjdGl2ZV9xc2l6ZSwgdHNpemUsIHplcm9zOworICBtcF9zaXplX3Qgc2lnbl9xdW90aWVudCwgaGlnaF96ZXJvOworICBtcF9wdHIgcXAsIHRwOworICBtcF9leHBfdCBleHA7CisgIFRNUF9ERUNMOworCisgIEFTU0VSVCAoU0laKCZxLT5fbXBfZGVuKSA+IDApOyAgLyogY2Fub25pY2FsIHEgKi8KKworICBuc2l6ZSA9IFNJWiAoJnEtPl9tcF9udW0pOworICBkc2l6ZSA9IFNJWiAoJnEtPl9tcF9kZW4pOworCisgIGlmIChVTkxJS0VMWSAobnNpemUgPT0gMCkpCisgICAgeworICAgICAgU0laIChyKSA9IDA7CisgICAgICBFWFAgKHIpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisKKyAgcHJlYyA9IFBSRUMgKHIpOworICBxcCA9IFBUUiAocik7CisKKyAgc2lnbl9xdW90aWVudCA9IG5zaXplOworICBuc2l6ZSA9IEFCUyAobnNpemUpOworICBucCA9IFBUUiAoJnEtPl9tcF9udW0pOworICBkcCA9IFBUUiAoJnEtPl9tcF9kZW4pOworCisgIHByb3NwZWN0aXZlX3FzaXplID0gbnNpemUgLSBkc2l6ZSArIDE7ICAvKiBxIGZyb20gdXNpbmcgZ2l2ZW4gbixkIHNpemVzICovCisgIGV4cCA9IHByb3NwZWN0aXZlX3FzaXplOyAgICAgICAgICAgICAgICAvKiBpZS4gbnVtYmVyIG9mIGludGVnZXIgbGltYnMgKi8KKyAgcXNpemUgPSBwcmVjICsgMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlc2lyZWQgcSAqLworCisgIHplcm9zID0gcXNpemUgLSBwcm9zcGVjdGl2ZV9xc2l6ZTsgICAgICAvKiBuIHplcm9zIHRvIGdldCBkZXNpcmVkIHFzaXplICovCisgIHRzaXplID0gbnNpemUgKyB6ZXJvczsgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGludGVybWVkaWF0ZSBudW1lcmF0b3IgKi8KKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRzaXplICsgMSk7ICAgICAgIC8qICsxIGZvciBtcG5fZGl2X3EncyBzY3JhdGNoICovCisKKyAgaWYgKHplcm9zID4gMCkKKyAgICB7CisgICAgICAvKiBwYWQgbiB3aXRoIHplcm9zIGludG8gdGVtcG9yYXJ5IHNwYWNlICovCisgICAgICBNUE5fWkVSTyAodHAsIHplcm9zKTsKKyAgICAgIE1QTl9DT1BZICh0cCt6ZXJvcywgbnAsIG5zaXplKTsKKyAgICAgIG5wID0gdHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wbl9kaXZfcSBhbGxvd3MgdGhpcyBvdmVybGFwICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogc2hvcnRlbiBuIHRvIGdldCBkZXNpcmVkIHFzaXplICovCisgICAgICBucCAtPSB6ZXJvczsKKyAgICB9CisKKyAgQVNTRVJUICh0c2l6ZS1kc2l6ZSsxID09IHFzaXplKTsKKyAgbXBuX2Rpdl9xIChxcCwgbnAsIHRzaXplLCBkcCwgZHNpemUsIHRwKTsKKworICAvKiBzdHJpcCBwb3NzaWJsZSB6ZXJvIGhpZ2ggbGltYiAqLworICBoaWdoX3plcm8gPSAocXBbcXNpemUtMV0gPT0gMCk7CisgIHFzaXplIC09IGhpZ2hfemVybzsKKyAgZXhwIC09IGhpZ2hfemVybzsKKworICBFWFAgKHIpID0gZXhwOworICBTSVogKHIpID0gc2lnbl9xdW90aWVudCA+PSAwID8gcXNpemUgOiAtcXNpemU7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcGYvc2V0X3NpLmMgYi9tcGYvc2V0X3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmNzEzZAotLS0gL2Rldi9udWxsCisrKyBiL21wZi9zZXRfc2kuYwpAQCAtMCwwICsxLDUyIEBACisvKiBtcGZfc2V0X3NpKCkgLS0gQXNzaWduIGEgZmxvYXQgZnJvbSBhIHNpZ25lZCBpbnQuCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDIwMDAtMjAwMiwgMjAwNCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zZXRfc2kgKG1wZl9wdHIgZGVzdCwgbG9uZyB2YWwpCit7CisgIG1wX3NpemVfdCBzaXplOworICBtcF9saW1iX3Qgdmw7CisKKyAgdmwgPSAobXBfbGltYl90KSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZyBpbnQsIHZhbCk7CisKKyAgZGVzdC0+X21wX2RbMF0gPSB2bCAmIEdNUF9OVU1CX01BU0s7CisgIHNpemUgPSB2bCAhPSAwOworCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIHZsID4+PSBHTVBfTlVNQl9CSVRTOworICBkZXN0LT5fbXBfZFsxXSA9IHZsOworICBzaXplICs9ICh2bCAhPSAwKTsKKyNlbmRpZgorCisgIGRlc3QtPl9tcF9leHAgPSBzaXplOworICBkZXN0LT5fbXBfc2l6ZSA9IHZhbCA+PSAwID8gc2l6ZSA6IC1zaXplOworfQpkaWZmIC0tZ2l0IGEvbXBmL3NldF9zdHIuYyBiL21wZi9zZXRfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiZmUwYgotLS0gL2Rldi9udWxsCisrKyBiL21wZi9zZXRfc3RyLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qIG1wZl9zZXRfc3RyIChkZXN0LCBzdHJpbmcsIGJhc2UpIC0tIENvbnZlcnQgdGhlIHN0cmluZyBTVFJJTkcKKyAgIGluIGJhc2UgQkFTRSB0byBhIGZsb2F0IGluIGRlc3QuICBJZiBCQVNFIGlzIHplcm8sIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMKKyAgIG9mIFNUUklORyBpcyB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlIGJhc2UuCisKK0NvcHlyaWdodCAxOTkzLTE5OTcsIDIwMDAtMjAwMywgMjAwNSwgMjAwNywgMjAwOCwgMjAxMSwgMjAxMywgMjAxOSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qCisgIFRoaXMgc3RpbGwgbmVlZHMgd29yaywgYXMgc3VnZ2VzdGVkIGJ5IHNvbWUgRklYTUUgY29tbWVudHMuCisgIDEuIERvbid0IGRlcGVuZCBvbiBzdXBlcmZsdW91cyBtYW50aXNzYSBkaWdpdHMuCisgIDIuIEFsbG9jYXRlIHRlbXAgc3BhY2UgbW9yZSBjbGV2ZXJseS4KKyAgMy4gVXNlIG1wbl9kaXZfcSBpbnN0ZWFkIG9mIG1wbl9sc2hpZnQrbXBuX2RpdnJlbS4KKyovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgICAgLyogZm9yIERFQ0lNQUxfUE9JTlQgaW4gbGFuZ2luZm8uaCAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWYgSEFWRV9MQU5HSU5GT19ICisjaW5jbHVkZSA8bGFuZ2luZm8uaD4gIC8qIGZvciBubF9sYW5naW5mbyAqLworI2VuZGlmCisKKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+ICAgIC8qIGZvciBsb2NhbGVjb252ICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisjZGVmaW5lIGRpZ2l0X3ZhbHVlX3RhYiBfX2dtcF9kaWdpdF92YWx1ZV90YWIKKworLyogQ29tcHV0ZSBiYXNlXmV4cCBhbmQgcmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IHByZWMgbGltYnMgaW4gcnBbXS4KKyAgIFB1dCB0aGUgY291bnQgb2Ygb21pdHRlZCBsb3cgbGltYnMgaW4gKmlnbi4KKyAgIFJldHVybiB0aGUgYWN0dWFsIHNpemUgKHdoaWNoIG1pZ2h0IGJlIGxlc3MgdGhhbiBwcmVjKS4gICovCitzdGF0aWMgbXBfc2l6ZV90CittcG5fcG93XzFfaGlnaHBhcnQgKG1wX3B0ciBycCwgbXBfc2l6ZV90ICppZ25wLAorCQkgICAgbXBfbGltYl90IGJhc2UsIG1wX2V4cF90IGV4cCwKKwkJICAgIG1wX3NpemVfdCBwcmVjLCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBpZ247CQkvKiBjb3VudHMgbnVtYmVyIG9mIGlnbm9yZWQgbG93IGxpbWJzIGluIHIgKi8KKyAgbXBfc2l6ZV90IG9mZjsJCS8qIGtlZXBzIHRyYWNrIG9mIG9mZnNldCB3aGVyZSB2YWx1ZSBzdGFydHMgKi8KKyAgbXBfcHRyIHBhc3NlZF9ycCA9IHJwOworICBtcF9zaXplX3Qgcm47CisgIGludCBjbnQ7CisgIGludCBpOworCisgIHJwWzBdID0gYmFzZTsKKyAgcm4gPSAxOworICBvZmYgPSAwOworICBpZ24gPSAwOworICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIGV4cCk7CisgIGZvciAoaSA9IEdNUF9MSU1CX0JJVFMgLSBjbnQgLSAyOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBtcG5fc3FyICh0cCwgcnAgKyBvZmYsIHJuKTsKKyAgICAgIHJuID0gMiAqIHJuOworICAgICAgcm4gLT0gdHBbcm4gLSAxXSA9PSAwOworICAgICAgaWduIDw8PSAxOworCisgICAgICBvZmYgPSAwOworICAgICAgaWYgKHJuID4gcHJlYykKKwl7CisJICBpZ24gKz0gcm4gLSBwcmVjOworCSAgb2ZmID0gcm4gLSBwcmVjOworCSAgcm4gPSBwcmVjOworCX0KKyAgICAgIE1QX1BUUl9TV0FQIChycCwgdHApOworCisgICAgICBpZiAoKChleHAgPj4gaSkgJiAxKSAhPSAwKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKwkgIGN5ID0gbXBuX211bF8xIChycCwgcnAgKyBvZmYsIHJuLCBiYXNlKTsKKwkgIHJwW3JuXSA9IGN5OworCSAgcm4gKz0gY3kgIT0gMDsKKwkgIG9mZiA9IDA7CisJfQorICAgIH0KKworICBpZiAocm4gPiBwcmVjKQorICAgIHsKKyAgICAgIGlnbiArPSBybiAtIHByZWM7CisgICAgICBycCArPSBybiAtIHByZWM7CisgICAgICBybiA9IHByZWM7CisgICAgfQorCisgIE1QTl9DT1BZX0lOQ1IgKHBhc3NlZF9ycCwgcnAgKyBvZmYsIHJuKTsKKyAgKmlnbnAgPSBpZ247CisgIHJldHVybiBybjsKK30KKworaW50CittcGZfc2V0X3N0ciAobXBmX3B0ciB4LCBjb25zdCBjaGFyICpzdHIsIGludCBiYXNlKQoreworICBzaXplX3Qgc3RyX3NpemU7CisgIGNoYXIgKnMsICpiZWdzOworICBzaXplX3QgaSwgajsKKyAgaW50IGM7CisgIGludCBuZWdhdGl2ZTsKKyAgY2hhciAqZG90cG9zOworICBjb25zdCBjaGFyICpleHBwdHI7CisgIGludCBleHBfYmFzZTsKKyAgY29uc3QgY2hhciAgKnBvaW50ID0gR01QX0RFQ0lNQUxfUE9JTlQ7CisgIHNpemVfdCAgICAgIHBvaW50bGVuID0gc3RybGVuIChwb2ludCk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZ2l0X3ZhbHVlOworICBpbnQgaW5jcjsKKyAgc2l6ZV90IG5femVyb3Nfc2tpcHBlZDsKKworICBUTVBfREVDTDsKKworICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHI7CisKKyAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgd2hpbGUgKGlzc3BhY2UgKGMpKQorICAgIGMgPSAodW5zaWduZWQgY2hhcikgKisrc3RyOworCisgIG5lZ2F0aXZlID0gMDsKKyAgaWYgKGMgPT0gJy0nKQorICAgIHsKKyAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICAgIGMgPSAodW5zaWduZWQgY2hhcikgKisrc3RyOworICAgIH0KKworICAvKiBEZWZhdWx0IGJhc2UgdG8gZGVjaW1hbC4gICovCisgIGlmIChiYXNlID09IDApCisgICAgYmFzZSA9IDEwOworCisgIGV4cF9iYXNlID0gYmFzZTsKKworICBpZiAoYmFzZSA8IDApCisgICAgeworICAgICAgZXhwX2Jhc2UgPSAxMDsKKyAgICAgIGJhc2UgPSAtYmFzZTsKKyAgICB9CisKKyAgZGlnaXRfdmFsdWUgPSBkaWdpdF92YWx1ZV90YWI7CisgIGlmIChiYXNlID4gMzYpCisgICAgeworICAgICAgLyogRm9yIGJhc2VzID4gMzYsIHVzZSB0aGUgY29sbGF0aW5nIHNlcXVlbmNlCisJIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LiAgKi8KKyAgICAgIGRpZ2l0X3ZhbHVlICs9IDIwODsKKyAgICAgIGlmIChiYXNlID4gNjIpCisJcmV0dXJuIC0xOwkJLyogdG9vIGxhcmdlIGJhc2UgKi8KKyAgICB9CisKKyAgLyogUmVxdWlyZSBhdCBsZWFzdCBvbmUgZGlnaXQsIHBvc3NpYmx5IGFmdGVyIGFuIGluaXRpYWwgZGVjaW1hbCBwb2ludC4gICovCisgIGlmIChkaWdpdF92YWx1ZVtjXSA+PSBiYXNlKQorICAgIHsKKyAgICAgIC8qIG5vdCBhIGRpZ2l0LCBtdXN0IGJlIGEgZGVjaW1hbCBwb2ludCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHBvaW50bGVuOyBpKyspCisJaWYgKHN0cltpXSAhPSBwb2ludFtpXSkKKwkgIHJldHVybiAtMTsKKyAgICAgIGlmIChkaWdpdF92YWx1ZVsodW5zaWduZWQgY2hhcikgc3RyW3BvaW50bGVuXV0gPj0gYmFzZSkKKwlyZXR1cm4gLTE7CisgICAgfQorCisgIC8qIExvY2F0ZSBleHBvbmVudCBwYXJ0IG9mIHRoZSBpbnB1dC4gIExvb2sgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIHN0cmluZywKKyAgICAgc2luY2UgdGhlIGV4cG9uZW50IGlzIHVzdWFsbHkgYSBsb3Qgc2hvcnRlciB0aGFuIHRoZSBtYW50aXNzYS4gICovCisgIGV4cHB0ciA9IE5VTEw7CisgIHN0cl9zaXplID0gc3RybGVuIChzdHIpOworICBmb3IgKGkgPSBzdHJfc2l6ZSAtIDE7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSBzdHJbaV07CisgICAgICBpZiAoYyA9PSAnQCcgfHwgKGJhc2UgPD0gMTAgJiYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSkpCisJeworCSAgZXhwcHRyID0gc3RyICsgaSArIDE7CisJICBzdHJfc2l6ZSA9IGk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIFRNUF9NQVJLOworICBzID0gYmVncyA9IChjaGFyICopIFRNUF9BTExPQyAoc3RyX3NpemUgKyAxKTsKKworICBpbmNyID0gMDsKKyAgbl96ZXJvc19za2lwcGVkID0gMDsKKyAgZG90cG9zID0gTlVMTDsKKworICAvKiBMb29wIHRocm91Z2ggbWFudGlzc2EsIGNvbnZlcnRpbmcgaXQgZnJvbSBBU0NJSSB0byByYXcgYnl0ZSB2YWx1ZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc3RyX3NpemU7IGkrKykKKyAgICB7CisgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHI7CisgICAgICBpZiAoIWlzc3BhY2UgKGMpKQorCXsKKwkgIGludCBkaWc7CisKKwkgIGZvciAoaiA9IDA7IGogPCBwb2ludGxlbjsgaisrKQorCSAgICBpZiAoc3RyW2pdICE9IHBvaW50W2pdKQorCSAgICAgIGdvdG8gbm90X3BvaW50OworCSAgaWYgKDEpCisJICAgIHsKKwkgICAgICBpZiAoZG90cG9zICE9IDApCisJCXsKKwkJICAvKiBhbHJlYWR5IHNhdyBhIGRlY2ltYWwgcG9pbnQsIGFub3RoZXIgaXMgaW52YWxpZCAqLworCQkgIFRNUF9GUkVFOworCQkgIHJldHVybiAtMTsKKwkJfQorCSAgICAgIGRvdHBvcyA9IHM7CisJICAgICAgc3RyICs9IHBvaW50bGVuIC0gMTsKKwkgICAgICBpICs9IHBvaW50bGVuIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgIG5vdF9wb2ludDoKKwkgICAgICBkaWcgPSBkaWdpdF92YWx1ZVtjXTsKKwkgICAgICBpZiAoZGlnID49IGJhc2UpCisJCXsKKwkJICBUTVBfRlJFRTsKKwkJICByZXR1cm4gLTE7CisJCX0KKwkgICAgICAqcyA9IGRpZzsKKwkgICAgICBpbmNyIHw9IGRpZyAhPSAwOworCSAgICAgIHMgKz0gaW5jcjsJLyogSW5jcmVtZW50IGFmdGVyIGZpcnN0IG5vbi0wIGRpZ2l0IHNlZW4uICovCisJICAgICAgaWYgKGRvdHBvcyAhPSBOVUxMKQorCQkvKiBDb3VudCBza2lwcGVkIHplcm9zIGJldHdlZW4gcmFkaXggcG9pbnQgYW5kIGZpcnN0IG5vbi0wCisJCSAgIGRpZ2l0LiAqLworCQluX3plcm9zX3NraXBwZWQgKz0gMSAtIGluY3I7CisJICAgIH0KKwl9CisgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICorK3N0cjsKKyAgICB9CisKKyAgc3RyX3NpemUgPSBzIC0gYmVnczsKKworICB7CisgICAgbG9uZyBleHBfaW5fYmFzZTsKKyAgICBtcF9zaXplX3QgcmEsIG1hLCBybiwgbW47CisgICAgaW50IGNudDsKKyAgICBtcF9wdHIgbXAsIHRwLCBycDsKKyAgICBtcF9leHBfdCBleHBfaW5fbGltYnM7CisgICAgbXBfc2l6ZV90IHByZWMgPSBQUkVDKHgpICsgMTsKKyAgICBpbnQgZGl2ZmxhZzsKKyAgICBtcF9zaXplX3QgbWFkaiwgcmFkajsKKworI2lmIDAKKyAgICBzaXplX3Qgbl9jaGFyc19uZWVkZWQ7CisKKyAgICAvKiBUaGlzIG5lZWRzIGNhcmVmdWwgdGVzdGluZy4gIExlYXZlIGRpc2FibGVkIGZvciBub3cuICAqLworICAgIC8qIEp1c3QgY29uc2lkZXIgdGhlIHJlbGV2YW50IGxlYWRpbmcgZGlnaXRzIG9mIHRoZSBtYW50aXNzYS4gICovCisgICAgTElNQlNfUEVSX0RJR0lUX0lOX0JBU0UgKG5fY2hhcnNfbmVlZGVkLCBwcmVjLCBiYXNlKTsKKyAgICBpZiAoc3RyX3NpemUgPiBuX2NoYXJzX25lZWRlZCkKKyAgICAgIHN0cl9zaXplID0gbl9jaGFyc19uZWVkZWQ7CisjZW5kaWYKKworICAgIGlmIChzdHJfc2l6ZSA9PSAwKQorICAgICAgeworCVNJWih4KSA9IDA7CisJRVhQKHgpID0gMDsKKwlUTVBfRlJFRTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgIExJTUJTX1BFUl9ESUdJVF9JTl9CQVNFIChtYSwgc3RyX3NpemUsIGJhc2UpOworICAgIG1wID0gVE1QX0FMTE9DX0xJTUJTIChtYSk7CisgICAgbW4gPSBtcG5fc2V0X3N0ciAobXAsICh1bnNpZ25lZCBjaGFyICopIGJlZ3MsIHN0cl9zaXplLCBiYXNlKTsKKworICAgIG1hZGogPSAwOworICAgIC8qIElnbm9yZSBleGNlc3MgbGltYnMgaW4gTVAsTVNJWkUuICAqLworICAgIGlmIChtbiA+IHByZWMpCisgICAgICB7CisJbWFkaiA9IG1uIC0gcHJlYzsKKwltcCArPSBtbiAtIHByZWM7CisJbW4gPSBwcmVjOworICAgICAgfQorCisgICAgaWYgKGV4cHB0ciAhPSAwKQorICAgICAgeworCS8qIFNjYW4gYW5kIGNvbnZlcnQgdGhlIGV4cG9uZW50LCBpbiBiYXNlIGV4cF9iYXNlLiAgKi8KKwlsb25nIGRpZywgbWludXMsIHBsdXNtaW51czsKKwljID0gKHVuc2lnbmVkIGNoYXIpICpleHBwdHI7CisJbWludXMgPSAtKGxvbmcpIChjID09ICctJyk7CisJcGx1c21pbnVzID0gbWludXMgfCAtKGxvbmcpIChjID09ICcrJyk7CisJZXhwcHRyIC09IHBsdXNtaW51czsJCQkvKiBjb25kaXRpb25hbCBpbmNyZW1lbnQgKi8KKwljID0gKHVuc2lnbmVkIGNoYXIpICpleHBwdHIrKzsKKwlkaWcgPSBkaWdpdF92YWx1ZVtjXTsKKwlpZiAoZGlnID49IGV4cF9iYXNlKQorCSAgeworCSAgICBUTVBfRlJFRTsKKwkgICAgcmV0dXJuIC0xOworCSAgfQorCWV4cF9pbl9iYXNlID0gZGlnOworCWMgPSAodW5zaWduZWQgY2hhcikgKmV4cHB0cisrOworCWRpZyA9IGRpZ2l0X3ZhbHVlW2NdOworCXdoaWxlIChkaWcgPCBleHBfYmFzZSkKKwkgIHsKKwkgICAgZXhwX2luX2Jhc2UgPSBleHBfaW5fYmFzZSAqIGV4cF9iYXNlOworCSAgICBleHBfaW5fYmFzZSArPSBkaWc7CisJICAgIGMgPSAodW5zaWduZWQgY2hhcikgKmV4cHB0cisrOworCSAgICBkaWcgPSBkaWdpdF92YWx1ZVtjXTsKKwkgIH0KKwlleHBfaW5fYmFzZSA9IChleHBfaW5fYmFzZSBeIG1pbnVzKSAtIG1pbnVzOyAvKiBjb25kaXRpb25hbCBuZWdhdGlvbiAqLworICAgICAgfQorICAgIGVsc2UKKyAgICAgIGV4cF9pbl9iYXNlID0gMDsKKyAgICBpZiAoZG90cG9zICE9IDApCisgICAgICBleHBfaW5fYmFzZSAtPSBzIC0gZG90cG9zICsgbl96ZXJvc19za2lwcGVkOworICAgIGRpdmZsYWcgPSBleHBfaW5fYmFzZSA8IDA7CisgICAgZXhwX2luX2Jhc2UgPSBBQlMgKGV4cF9pbl9iYXNlKTsKKworICAgIGlmIChleHBfaW5fYmFzZSA9PSAwKQorICAgICAgeworCU1QTl9DT1BZIChQVFIoeCksIG1wLCBtbik7CisJU0laKHgpID0gbmVnYXRpdmUgPyAtbW4gOiBtbjsKKwlFWFAoeCkgPSBtbiArIG1hZGo7CisJVE1QX0ZSRUU7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICByYSA9IDIgKiAocHJlYyArIDEpOworICAgIFRNUF9BTExPQ19MSU1CU18yIChycCwgcmEsIHRwLCByYSk7CisgICAgcm4gPSBtcG5fcG93XzFfaGlnaHBhcnQgKHJwLCAmcmFkaiwgKG1wX2xpbWJfdCkgYmFzZSwgZXhwX2luX2Jhc2UsIHByZWMsIHRwKTsKKworICAgIGlmIChkaXZmbGFnKQorICAgICAgeworI2lmIDAKKwkvKiBGSVhNRTogU2hvdWxkIHVzZSBtcG5fZGl2X3EgaGVyZS4gICovCisJLi4uCisJbXBuX2Rpdl9xICh0cCwgbXAsIG1uLCBycCwgcm4sIHNjcmF0Y2gpOworCS4uLgorI2Vsc2UKKwltcF9wdHIgcXA7CisJbXBfbGltYl90IHFsaW1iOworCWlmIChtbiA8IHJuKQorCSAgeworCSAgICAvKiBQYWQgb3V0IE1QLE1TSVpFIGZvciBjdXJyZW50IGRpdnJlbSBzZW1hbnRpY3MuICAqLworCSAgICBtcF9wdHIgdG1wID0gVE1QX0FMTE9DX0xJTUJTIChybiArIDEpOworCSAgICBNUE5fWkVSTyAodG1wLCBybiAtIG1uKTsKKwkgICAgTVBOX0NPUFkgKHRtcCArIHJuIC0gbW4sIG1wLCBtbik7CisJICAgIG1wID0gdG1wOworCSAgICBtYWRqIC09IHJuIC0gbW47CisJICAgIG1uID0gcm47CisJICB9CisJaWYgKChycFtybiAtIDFdICYgR01QX05VTUJfSElHSEJJVCkgPT0gMCkKKwkgIHsKKwkgICAgbXBfbGltYl90IGN5OworCSAgICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIHJwW3JuIC0gMV0pOworCSAgICBjbnQgLT0gR01QX05BSUxfQklUUzsKKwkgICAgbXBuX2xzaGlmdCAocnAsIHJwLCBybiwgY250KTsKKwkgICAgY3kgPSBtcG5fbHNoaWZ0IChtcCwgbXAsIG1uLCBjbnQpOworCSAgICBpZiAoY3kpCisJICAgICAgbXBbbW4rK10gPSBjeTsKKwkgIH0KKworCXFwID0gVE1QX0FMTE9DX0xJTUJTIChwcmVjICsgMSk7CisJcWxpbWIgPSBtcG5fZGl2cmVtIChxcCwgcHJlYyAtIChtbiAtIHJuKSwgbXAsIG1uLCBycCwgcm4pOworCXRwID0gcXA7CisJZXhwX2luX2xpbWJzID0gcWxpbWIgKyAobW4gLSBybikgKyAobWFkaiAtIHJhZGopOworCXJuID0gcHJlYzsKKwlpZiAocWxpbWIgIT0gMCkKKwkgIHsKKwkgICAgdHBbcHJlY10gPSBxbGltYjsKKwkgICAgLyogU2tpcCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBub3QgdG8gb3ZlcnJ1biB0aGUgZGVzdGluYXRpb24KKwkgICAgICAgdmFyaWFibGUuICAqLworCSAgICB0cCsrOworCSAgfQorI2VuZGlmCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXRwID0gVE1QX0FMTE9DX0xJTUJTIChybiArIG1uKTsKKwlpZiAocm4gPiBtbikKKwkgIG1wbl9tdWwgKHRwLCBycCwgcm4sIG1wLCBtbik7CisJZWxzZQorCSAgbXBuX211bCAodHAsIG1wLCBtbiwgcnAsIHJuKTsKKwlybiArPSBtbjsKKwlybiAtPSB0cFtybiAtIDFdID09IDA7CisJZXhwX2luX2xpbWJzID0gcm4gKyBtYWRqICsgcmFkajsKKworCWlmIChybiA+IHByZWMpCisJICB7CisJICAgIHRwICs9IHJuIC0gcHJlYzsKKwkgICAgcm4gPSBwcmVjOworCSAgICBleHBfaW5fbGltYnMgKz0gMDsKKwkgIH0KKyAgICAgIH0KKworICAgIE1QTl9DT1BZIChQVFIoeCksIHRwLCBybik7CisgICAgU0laKHgpID0gbmVnYXRpdmUgPyAtcm4gOiBybjsKKyAgICBFWFAoeCkgPSBleHBfaW5fbGltYnM7CisgICAgVE1QX0ZSRUU7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL21wZi9zZXRfdWkuYyBiL21wZi9zZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRiYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL3NldF91aS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIG1wZl9zZXRfdWkoKSAtLSBBc3NpZ24gYSBmbG9hdCBmcm9tIGFuIHVuc2lnbmVkIGludC4KKworQ29weXJpZ2h0IDE5OTMtMTk5NSwgMjAwMSwgMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zZXRfdWkgKG1wZl9wdHIgZiwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisgIG1wX3NpemVfdCBzaXplOworCisgIGYtPl9tcF9kWzBdID0gdmFsICYgR01QX05VTUJfTUFTSzsKKyAgc2l6ZSA9IHZhbCAhPSAwOworCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIHZhbCA+Pj0gR01QX05VTUJfQklUUzsKKyAgZi0+X21wX2RbMV0gPSB2YWw7CisgIHNpemUgKz0gKHZhbCAhPSAwKTsKKyNlbmRpZgorCisgIGYtPl9tcF9leHAgPSBmLT5fbXBfc2l6ZSA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcGYvc2V0X3ouYyBiL21wZi9zZXRfei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjI2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2V0X3ouYwpAQCAtMCwwICsxLDU2IEBACisvKiBtcGZfc2V0X3ogLS0gQXNzaWduIGEgZmxvYXQgZnJvbSBhbiBpbnRlZ2VyLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zZXRfeiAobXBmX3B0ciByLCBtcHpfc3JjcHRyIHUpCit7CisgIG1wX3B0ciBycCwgdXA7CisgIG1wX3NpemVfdCBzaXplLCBhc2l6ZTsKKyAgbXBfc2l6ZV90IHByZWM7CisKKyAgcHJlYyA9IFBSRUMgKHIpICsgMTsKKyAgc2l6ZSA9IFNJWiAodSk7CisgIGFzaXplID0gQUJTIChzaXplKTsKKyAgcnAgPSBQVFIgKHIpOworICB1cCA9IFBUUiAodSk7CisKKyAgRVhQIChyKSA9IGFzaXplOworCisgIGlmIChhc2l6ZSA+IHByZWMpCisgICAgeworICAgICAgdXAgKz0gYXNpemUgLSBwcmVjOworICAgICAgYXNpemUgPSBwcmVjOworICAgIH0KKworICBTSVogKHIpID0gc2l6ZSA+PSAwID8gYXNpemUgOiAtYXNpemU7CisgIE1QTl9DT1BZIChycCwgdXAsIGFzaXplKTsKK30KZGlmZiAtLWdpdCBhL21wZi9zaXplLmMgYi9tcGYvc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTlkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvc2l6ZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIG1wZl9zaXplKHgpIC0tIHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbWJzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZQorICAgdmFsdWUgb2YgdGhlIGZsb2F0IFguCisKK0NvcHlyaWdodCAxOTkzLTE5OTUsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitzaXplX3QKK21wZl9zaXplIChtcGZfc3JjcHRyIGYpIF9fR01QX05PVEhST1cKK3sKKyAgcmV0dXJuIF9fR01QX0FCUyAoZi0+X21wX3NpemUpOworfQpkaWZmIC0tZ2l0IGEvbXBmL3NxcnQuYyBiL21wZi9zcXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiN2MxMAotLS0gL2Rldi9udWxsCisrKyBiL21wZi9zcXJ0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIG1wZl9zcXJ0IC0tIENvbXB1dGUgdGhlIHNxdWFyZSByb290IG9mIGEgZmxvYXQuCisKK0NvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA0LCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBBcyB1c3VhbCwgdGhlIGFpbSBpcyB0byBwcm9kdWNlIFBSRUMocikgbGltYnMgb2YgcmVzdWx0LCB3aXRoIHRoZSBoaWdoCisgICBsaW1iIG5vbi16ZXJvLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgYXBwbHlpbmcgbXBuX3NxcnRyZW0gdG8gZWl0aGVyCisgICAyKnByZWMgb3IgMipwcmVjLTEgbGltYnMsIGJvdGggc3VjaCBzaXplcyByZXN1bHRpbmcgaW4gcHJlYyBsaW1icy4KKworICAgVGhlIGNob2ljZSBiZXR3ZWVuIDIqcHJlYyBvciAyKnByZWMtMSBsaW1icyBpcyBiYXNlZCBvbiB0aGUgaW5wdXQKKyAgIGV4cG9uZW50LiAgV2l0aCBiPTJeR01QX05VTUJfQklUUyB0aGUgbGltYiBiYXNlIHRoZW4gd2UgY2FuIHRoaW5rIG9mCisgICBlZmZlY3RpdmVseSB0YWtpbmcgb3V0IGEgZmFjdG9yIGJeKDJrKSwgZm9yIHN1aXRhYmxlIGssIHRvIGdldCB0byBhbgorICAgaW50ZWdlciBpbnB1dCBvZiB0aGUgZGVzaXJlZCBzaXplIHJlYWR5IGZvciBtcG5fc3FydHJlbS4gIEl0IG11c3QgYmUgYW4KKyAgIGV2ZW4gcG93ZXIgdGFrZW4gb3V0LCBpZS4gYW4gZXZlbiBudW1iZXIgb2YgbGltYnMsIHNvIHRoZSBzcXVhcmUgcm9vdAorICAgZ2l2ZXMgZmFjdG9yIGJeayBhbmQgdGhlIHJhZGl4IHBvaW50IGlzIHN0aWxsIG9uIGEgbGltYiBib3VuZGFyeS4gIFNvIGlmCisgICBFWFAocikgaXMgZXZlbiB3ZSdsbCBnZXQgYW4gZXZlbiBudW1iZXIgb2YgaW5wdXQgbGltYnMgMipwcmVjLCBvciBpZgorICAgRVhQKHIpIGlzIG9kZCB3ZSBnZXQgYW4gb2RkIG51bWJlciAyKnByZWMtMS4KKworICAgRnVydGhlciBsaW1icyBiZWxvdyB0aGUgMipwcmVjIG9yIDIqcHJlYy0xIHVzZWQgZG9uJ3QgYWZmZWN0IHRoZSByZXN1bHQKKyAgIGFuZCBhcmUgc2ltcGx5IHRydW5jYXRlZC4gIFRoaXMgY2FuIGJlIHNlZW4gYnkgY29uc2lkZXJpbmcgYW4gaW50ZWdlciB4LAorICAgd2l0aCBzPWZsb29yKHNxcnQoeCkpLiAgcyBpcyB0aGUgdW5pcXVlIGludGVnZXIgc2F0aXNmeWluZyBzXjIgPD0geCA8CisgICAocysxKV4yLiAgTm90aWNlIHRoYXQgYWRkaW5nIGEgZnJhY3Rpb24gcGFydCB0byB4IChpZS4gc29tZSBmdXJ0aGVyIGJpdHMpCisgICBkb2Vzbid0IGNoYW5nZSB0aGUgaW5lcXVhbGl0eSwgcyByZW1haW5zIHRoZSB1bmlxdWUgc29sdXRpb24uICBXb3JraW5nCisgICBzdWl0YWJsZSBmYWN0b3JzIG9mIDIgaW50byB0aGlzIGFyZ3VtZW50IGxldHMgaXQgYXBwbHkgdG8gYW4gaW50ZW5kZWQKKyAgIHByZWNpc2lvbiBhdCBhbnkgcG9zaXRpb24gZm9yIGFueSB4LCBub3QganVzdCB0aGUgaW50ZWdlciBiaW5hcnkgcG9pbnQuCisKKyAgIElmIHRoZSBpbnB1dCBpcyBzbWFsbGVyIHRoYW4gMipwcmVjIG9yIDIqcHJlYy0xLCB0aGVuIHdlIGp1c3QgcGFkIHdpdGgKKyAgIHplcm9zLCB0aGF0IG9mIGNvdXJzZSBiZWluZyBvdXIgdXN1YWwgaW50ZXJwcmV0YXRpb24gb2Ygc2hvcnQgaW5wdXRzLgorICAgVGhlIGVmZmVjdCBpcyB0byBleHRlbmQgdGhlIHJvb3QgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBpbnB1dCAoZm9yCisgICBpbnN0YW5jZSBpbnRvIGZyYWN0aW9uYWwgbGltYnMgaWYgdSBpcyBhbiBpbnRlZ2VyKS4gICovCisKK3ZvaWQKK21wZl9zcXJ0IChtcGZfcHRyIHIsIG1wZl9zcmNwdHIgdSkKK3sKKyAgbXBfc2l6ZV90IHVzaXplOworICBtcF9wdHIgdXAsIHRwOworICBtcF9zaXplX3QgcHJlYywgdHNpemU7CisgIG1wX2V4cF90IHVleHAsIGV4cG9kZDsKKyAgVE1QX0RFQ0w7CisKKyAgdXNpemUgPSB1LT5fbXBfc2l6ZTsKKyAgaWYgKFVOTElLRUxZICh1c2l6ZSA8PSAwKSkKKyAgICB7CisgICAgICBpZiAodXNpemUgPCAwKQorICAgICAgICBTUVJUX09GX05FR0FUSVZFOworICAgICAgci0+X21wX3NpemUgPSAwOworICAgICAgci0+X21wX2V4cCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFRNUF9NQVJLOworCisgIHVleHAgPSB1LT5fbXBfZXhwOworICBwcmVjID0gci0+X21wX3ByZWM7CisgIHVwID0gdS0+X21wX2Q7CisKKyAgZXhwb2RkID0gKHVleHAgJiAxKTsKKyAgdHNpemUgPSAyICogcHJlYyAtIGV4cG9kZDsKKyAgci0+X21wX3NpemUgPSBwcmVjOworICByLT5fbXBfZXhwID0gKHVleHAgKyBleHBvZGQpIC8gMjsgICAgLyogY2VpbCh1ZXhwLzIpICovCisKKyAgLyogcm9vdCBzaXplIGlzIGNlaWwodHNpemUvMiksIHRoaXMgd2lsbCBiZSBvdXIgZGVzaXJlZCAicHJlYyIgbGltYnMgKi8KKyAgQVNTRVJUICgodHNpemUgKyAxKSAvIDIgPT0gcHJlYyk7CisKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRzaXplKTsKKworICBpZiAodXNpemUgPiB0c2l6ZSkKKyAgICB7CisgICAgICB1cCArPSB1c2l6ZSAtIHRzaXplOworICAgICAgdXNpemUgPSB0c2l6ZTsKKyAgICAgIE1QTl9DT1BZICh0cCwgdXAsIHRzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUE5fWkVSTyAodHAsIHRzaXplIC0gdXNpemUpOworICAgICAgTVBOX0NPUFkgKHRwICsgKHRzaXplIC0gdXNpemUpLCB1cCwgdXNpemUpOworICAgIH0KKworICBtcG5fc3FydHJlbSAoci0+X21wX2QsIE5VTEwsIHRwLCB0c2l6ZSk7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcGYvc3FydF91aS5jIGIvbXBmL3NxcnRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkxZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL3NxcnRfdWkuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogbXBmX3NxcnRfdWkgLS0gQ29tcHV0ZSB0aGUgc3F1YXJlIHJvb3Qgb2YgYW4gdW5zaWduZWQgaW50ZWdlci4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDUsIDIwMTUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4gLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEFzIHVzdWFsIHRoZSBhaW0gaXMgdG8gcHJvZHVjZSBQUkVDKHIpIGxpbWJzIG9mIHJlc3VsdCB3aXRoIHRoZSBoaWdoIGxpbWIKKyAgIG5vbi16ZXJvLiAgVGhhdCBoaWdoIGxpbWIgd2lsbCBlbmQgdXAgZmxvb3Ioc3FydCh1KSksIGFuZCBsaW1icyBiZWxvdyBhcmUKKyAgIHByb2R1Y2VkIGJ5IHBhZGRpbmcgdGhlIGlucHV0IHdpdGggemVyb3MsIHR3byBmb3IgZWFjaCBkZXNpcmVkIHJlc3VsdAorICAgbGltYiwgYmVpbmcgMioocHJlYy0xKSBmb3IgYSB0b3RhbCAyKnByZWMtMSBsaW1icyBwYXNzZWQgdG8gbXBuX3NxcnRyZW0uCisgICBUaGUgd2F5IG1wbl9zcXJ0cmVtIGNhbGN1bGF0ZXMgZmxvb3Ioc3FydCh4KSkgZW5zdXJlcyB0aGUgcm9vdCBpcyBjb3JyZWN0CisgICB0byB0aGUgaW50ZW5kZWQgYWNjdXJhY3ksIGllLiB0cnVuY2F0ZWQgdG8gcHJlYyBsaW1icy4KKworICAgV2l0aCBuYWlscywgdSBtaWdodCBiZSB0d28gbGltYnMsIGluIHdoaWNoIGNhc2UgYSB0b3RhbCAyKnByZWMgbGltYnMgaXMKKyAgIHBhc3NlZCB0byBtcG5fc3FydHJlbSAoc3RpbGwgZ2l2aW5nIGEgcHJlYyBsaW1iIHJlc3VsdCkuICBJZiB1aGlnaCBpcworICAgemVybyB3ZSBhZGp1c3QgYmFjayB0byAyKnByZWMtMSwgc2luY2UgbXBuX3NxcnRyZW0gcmVxdWlyZXMgdGhlIGhpZ2gKKyAgIG5vbi16ZXJvLiAgMipwcmVjIGxpbWJzIGFyZSBhbHdheXMgYWxsb2NhdGVkLCBldmVuIHdoZW4gdWhpZ2ggaXMgemVybywgc28KKyAgIHRoZSBzdG9yZSBvZiB1aGlnaCBjYW4gYmUgZG9uZSB3aXRob3V0IGEgY29uZGl0aW9uYWwuCisKKyAgIHU9PTAgaXMgYSBzcGVjaWFsIGNhc2Ugc28gdGhlIHJlc3Qgb2YgdGhlIGNvZGUgY2FuIGFzc3VtZSB0aGUgcmVzdWx0IGlzCisgICBub24temVybyAoaWUuIHdpbGwgaGF2ZSBhIG5vbi16ZXJvIGhpZ2ggbGltYiBvbiB0aGUgcmVzdWx0KS4KKworICAgTm90IGRvbmU6CisKKyAgIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBpZGVudGlmeSBwZXJmZWN0IHNxdWFyZXMuICBJdCdzIGNvbnNpZGVyZWQgdGhpcyBjYW4KKyAgIGJlIGxlZnQgdG8gYW4gYXBwbGljYXRpb24gaWYgaXQgbWlnaHQgb2NjdXIgd2l0aCBhbnkgZnJlcXVlbmN5LiAgQXMgaXQKKyAgIHN0YW5kcywgbXBuX3NxcnRyZW0gZG9lcyBpdHMgbm9ybWFsIGFtb3VudCBvZiB3b3JrIG9uIGEgcGVyZmVjdCBzcXVhcmUKKyAgIGZvbGxvd2VkIGJ5IHplcm8gbGltYnMsIHRob3VnaCBvZiBjb3Vyc2Ugb25seSBhbiBtcG5fc3FydHJlbTEgd291bGQgYmUKKyAgIGFjdHVhbGx5IG5lZWRlZC4gIFdlIGFsc28gZW5kIHVwIGxlYXZpbmcgb3VyIG1wZiByZXN1bHQgd2l0aCBsb3RzIG9mIGxvdworICAgdHJhaWxpbmcgemVyb3MsIHNsb3dpbmcgZG93biBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuCisKKyAgIFdlJ3JlIG5vdCBhd2FyZSBvZiBhbnkgb3B0aW1pemF0aW9ucyB0aGF0IGNhbiBiZSBtYWRlIHVzaW5nIHRoZSBmYWN0IHRoZQorICAgaW5wdXQgaGFzIGxvdHMgb2YgdHJhaWxpbmcgemVyb3MgKGFwYXJ0IGZyb20gdGhlIHBlcmZlY3Qgc3F1YXJlCisgICBjYXNlKS4gICovCisKKworLyogMSBpZiB3ZSAobWlnaHQpIG5lZWQgdHdvIGxpbWJzIGZvciB1ICovCisjZGVmaW5lIFUyICAgKEdNUF9OVU1CX0JJVFMgPCBCSVRTX1BFUl9VTE9ORykKKwordm9pZAorbXBmX3NxcnRfdWkgKG1wZl9wdHIgciwgdW5zaWduZWQgbG9uZyBpbnQgdSkKK3sKKyAgbXBfc2l6ZV90IHJzaXplLCB6ZXJvczsKKyAgbXBfcHRyIHRwOworICBtcF9zaXplX3QgcHJlYzsKKyAgVE1QX0RFQ0w7CisKKyAgaWYgKFVOTElLRUxZICh1IDw9IDEpKQorICAgIHsKKyAgICAgIFNJWiAocikgPSBFWFAgKHIpID0gdTsKKyAgICAgICpQVFIgKHIpID0gdTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisKKyAgcHJlYyA9IFBSRUMgKHIpOworICB6ZXJvcyA9IDIgKiBwcmVjIC0gMjsKKyAgcnNpemUgPSB6ZXJvcyArIDEgKyBVMjsKKworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAocnNpemUpOworCisgIE1QTl9aRVJPICh0cCwgemVyb3MpOworICB0cFt6ZXJvc10gPSB1ICYgR01QX05VTUJfTUFTSzsKKworI2lmIFUyCisgIHsKKyAgICBtcF9saW1iX3QgdWhpZ2ggPSB1ID4+IEdNUF9OVU1CX0JJVFM7CisgICAgdHBbemVyb3MgKyAxXSA9IHVoaWdoOworICAgIHJzaXplIC09ICh1aGlnaCA9PSAwKTsKKyAgfQorI2VuZGlmCisKKyAgbXBuX3NxcnRyZW0gKFBUUiAociksIE5VTEwsIHRwLCByc2l6ZSk7CisKKyAgU0laIChyKSA9IHByZWM7CisgIEVYUCAocikgPSAxOworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wZi9zdWIuYyBiL21wZi9zdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYyNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL3N1Yi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiBtcGZfc3ViIC0tIFN1YnRyYWN0IHR3byBmbG9hdHMuCisKK0NvcHlyaWdodCAxOTkzLTE5OTYsIDE5OTktMjAwMiwgMjAwNCwgMjAwNSwgMjAxMSwgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zdWIgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYpCit7CisgIG1wX3NyY3B0ciB1cCwgdnA7CisgIG1wX3B0ciBycCwgdHA7CisgIG1wX3NpemVfdCB1c2l6ZSwgdnNpemUsIHJzaXplOworICBtcF9zaXplX3QgcHJlYzsKKyAgbXBfZXhwX3QgZXhwOworICBtcF9zaXplX3QgZWRpZmY7CisgIGludCBuZWdhdGU7CisgIFRNUF9ERUNMOworCisgIHVzaXplID0gU0laICh1KTsKKyAgdnNpemUgPSBTSVogKHYpOworCisgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHRoYXQgZG9uJ3Qgd29yayBpbiBnZW5lcmljIGNvZGUgYmVsb3cuICAqLworICBpZiAodXNpemUgPT0gMCkKKyAgICB7CisgICAgICBtcGZfbmVnIChyLCB2KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGlmICh2c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChyICE9IHUpCisgICAgICAgIG1wZl9zZXQgKHIsIHUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBJZiBzaWducyBvZiBVIGFuZCBWIGFyZSBkaWZmZXJlbnQsIHBlcmZvcm0gYWRkaXRpb24uICAqLworICBpZiAoKHVzaXplIF4gdnNpemUpIDwgMCkKKyAgICB7CisgICAgICBfX21wZl9zdHJ1Y3Qgdl9uZWdhdGVkOworICAgICAgdl9uZWdhdGVkLl9tcF9zaXplID0gLXZzaXplOworICAgICAgdl9uZWdhdGVkLl9tcF9leHAgPSBFWFAgKHYpOworICAgICAgdl9uZWdhdGVkLl9tcF9kID0gUFRSICh2KTsKKyAgICAgIG1wZl9hZGQgKHIsIHUsICZ2X25lZ2F0ZWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBUTVBfTUFSSzsKKworICAvKiBTaWducyBhcmUgbm93IGtub3duIHRvIGJlIHRoZSBzYW1lLiAgKi8KKyAgbmVnYXRlID0gdXNpemUgPCAwOworCisgIC8qIE1ha2UgVSBiZSB0aGUgb3BlcmFuZCB3aXRoIHRoZSBsYXJnZXN0IGV4cG9uZW50LiAgKi8KKyAgaWYgKEVYUCAodSkgPCBFWFAgKHYpKQorICAgIHsKKyAgICAgIG1wZl9zcmNwdHIgdDsKKyAgICAgIHQgPSB1OyB1ID0gdjsgdiA9IHQ7CisgICAgICBuZWdhdGUgXj0gMTsKKyAgICAgIHVzaXplID0gU0laICh1KTsKKyAgICAgIHZzaXplID0gU0laICh2KTsKKyAgICB9CisKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgdnNpemUgPSBBQlMgKHZzaXplKTsKKyAgdXAgPSBQVFIgKHUpOworICB2cCA9IFBUUiAodik7CisgIHJwID0gUFRSIChyKTsKKyAgcHJlYyA9IFBSRUMgKHIpICsgMTsKKyAgZXhwID0gRVhQICh1KTsKKyAgZWRpZmYgPSBleHAgLSBFWFAgKHYpOworCisgIC8qIElmIGVkaWZmIGlzIDAgb3IgMSwgd2UgbWlnaHQgaGF2ZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgb3BlcmFuZHMgYXJlCisgICAgIGV4dHJlbWVseSBjbG9zZS4gIFdlIG5lZWQgdG8gc2NhbiB0aGUgb3BlcmFuZHMgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgICBlbmQgaWdub3JlIHRoZSBpbml0aWFsIHBhcnRzIHRoYXQgYXJlIGVxdWFsLiAgKi8KKyAgaWYgKGVkaWZmIDw9IDEpCisgICAgeworICAgICAgaWYgKGVkaWZmID09IDApCisJeworCSAgLyogU2tpcCBsZWFkaW5nIGxpbWJzIGluIFUgYW5kIFYgdGhhdCBhcmUgZXF1YWwuICAqLworCSAgICAgIC8qIFRoaXMgbG9vcCBub3JtYWxseSBleGl0cyBpbW1lZGlhdGVseS4gIE9wdGltaXplIGZvciB0aGF0LiAgKi8KKwkgICAgICB3aGlsZSAodXBbdXNpemUgLSAxXSA9PSB2cFt2c2l6ZSAtIDFdKQorCQl7CisJCSAgdXNpemUtLTsKKwkJICB2c2l6ZS0tOworCQkgIGV4cC0tOworCisJCSAgaWYgKHVzaXplID09IDApCisJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgLyogdSBjYW5jZWxzIGhpZ2ggbGltYnMgb2YgdiwgcmVzdWx0IGlzIHJlc3Qgb2YgdiAqLworCQkgICAgICBuZWdhdGUgXj0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgIC8qIHN0cmlwIGhpZ2ggemVyb3MgYmVmb3JlIHRydW5jYXRpbmcgdG8gcHJlYyAqLworICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh2c2l6ZSAhPSAwICYmIHZwW3ZzaXplIC0gMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdnNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCSAgICAgIGlmICh2c2l6ZSA+IHByZWMpCisJCQl7CisJCQkgIHZwICs9IHZzaXplIC0gcHJlYzsKKwkJCSAgdnNpemUgPSBwcmVjOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgIE1QTl9DT1BZX0lOQ1IgKHJwLCB2cCwgdnNpemUpOworICAgICAgICAgICAgICAgICAgICAgIHJzaXplID0gdnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworCQkgICAgfQorCQkgIGlmICh2c2l6ZSA9PSAwKQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgIHZwID0gdXA7CisgICAgICAgICAgICAgICAgICAgICAgdnNpemUgPSB1c2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhbmNlbGxhdGlvbjsKKwkJICAgIH0KKwkJfQorCisJICBpZiAodXBbdXNpemUgLSAxXSA8IHZwW3ZzaXplIC0gMV0pCisJICAgIHsKKwkgICAgICAvKiBGb3Igc2ltcGxpY2l0eSwgc3dhcCBVIGFuZCBWLiAgTm90ZSB0aGF0IHNpbmNlIHRoZSBsb29wIGFib3ZlCisJCSB3b3VsZG4ndCBoYXZlIGV4aXRlZCB1bmxlc3MgdXBbdXNpemUgLSAxXSBhbmQgdnBbdnNpemUgLSAxXQorCQkgd2VyZSBub24tZXF1YWwsIHRoaXMgaWYtc3RhdGVtZW50IGNhdGNoZXMgYWxsIGNhc2VzIHdoZXJlIFUKKwkJIGlzIHNtYWxsZXIgdGhhbiBWLiAgKi8KKwkgICAgICBNUE5fU1JDUFRSX1NXQVAgKHVwLHVzaXplLCB2cCx2c2l6ZSk7CisJICAgICAgbmVnYXRlIF49IDE7CisJICAgICAgLyogbmVnYXRpbmcgZWRpZmYgbm90IG5lY2Vzc2FyeSBzaW5jZSBpdCBpcyAwLiAgKi8KKwkgICAgfQorCisJICAvKiBDaGVjayBmb3IKKwkgICAgIHgrMSAwMDAwMDAwMCAuLi4KKwkgICAgICB4ICBmZmZmZmZmZiAuLi4gKi8KKwkgIGlmICh1cFt1c2l6ZSAtIDFdICE9IHZwW3ZzaXplIC0gMV0gKyAxKQorCSAgICBnb3RvIGdlbmVyYWxfY2FzZTsKKwkgIHVzaXplLS07CisJICB2c2l6ZS0tOworCSAgZXhwLS07CisJfQorICAgICAgZWxzZSAvKiBlZGlmZiA9PSAxICovCisJeworCSAgLyogQ2hlY2sgZm9yCisJICAgICAxIDAwMDAwMDAwIC4uLgorCSAgICAgMCBmZmZmZmZmZiAuLi4gKi8KKworCSAgaWYgKHVwW3VzaXplIC0gMV0gIT0gMSB8fCB2cFt2c2l6ZSAtIDFdICE9IEdNUF9OVU1CX01BWAorCSAgICAgIHx8ICh1c2l6ZSA+PSAyICYmIHVwW3VzaXplIC0gMl0gIT0gMCkpCisJICAgIGdvdG8gZ2VuZXJhbF9jYXNlOworCisJICB1c2l6ZS0tOworCSAgZXhwLS07CisJfQorCisgICAgICAvKiBTa2lwIHNlcXVlbmNlcyBvZiAwMDAwMDAwMC9mZmZmZmZmZiAqLworICAgICAgd2hpbGUgKHZzaXplICE9IDAgJiYgdXNpemUgIT0gMCAmJiB1cFt1c2l6ZSAtIDFdID09IDAKKwkgICAgICYmIHZwW3ZzaXplIC0gMV0gPT0gR01QX05VTUJfTUFYKQorCXsKKwkgIHVzaXplLS07CisJICB2c2l6ZS0tOworCSAgZXhwLS07CisJfQorCisgICAgICBpZiAodXNpemUgPT0gMCkKKwl7CisJICB3aGlsZSAodnNpemUgIT0gMCAmJiB2cFt2c2l6ZSAtIDFdID09IEdNUF9OVU1CX01BWCkKKwkgICAgeworCSAgICAgIHZzaXplLS07CisJICAgICAgZXhwLS07CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICh1c2l6ZSA+IHByZWMgLSAxKQorCXsKKwkgIHVwICs9IHVzaXplIC0gKHByZWMgLSAxKTsKKwkgIHVzaXplID0gcHJlYyAtIDE7CisJfQorICAgICAgaWYgKHZzaXplID4gcHJlYyAtIDEpCisJeworCSAgdnAgKz0gdnNpemUgLSAocHJlYyAtIDEpOworCSAgdnNpemUgPSBwcmVjIC0gMTsKKwl9CisKKyAgICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChwcmVjKTsKKyAgICAgIHsKKwltcF9saW1iX3QgY3lfbGltYjsKKwlpZiAodnNpemUgPT0gMCkKKwkgIHsKKwkgICAgTVBOX0NPUFkgKHRwLCB1cCwgdXNpemUpOworCSAgICB0cFt1c2l6ZV0gPSAxOworCSAgICByc2l6ZSA9IHVzaXplICsgMTsKKwkgICAgZXhwKys7CisJICAgIGdvdG8gbm9ybWFsaXplZDsKKwkgIH0KKwlpZiAodXNpemUgPT0gMCkKKwkgIHsKKwkgICAgY3lfbGltYiA9IG1wbl9uZWcgKHRwLCB2cCwgdnNpemUpOworCSAgICByc2l6ZSA9IHZzaXplOworCSAgfQorCWVsc2UgaWYgKHVzaXplID49IHZzaXplKQorCSAgeworCSAgICAvKiB1dXV1ICAgICAqLworCSAgICAvKiB2diAgICAgICAqLworCSAgICBtcF9zaXplX3Qgc2l6ZTsKKwkgICAgc2l6ZSA9IHVzaXplIC0gdnNpemU7CisJICAgIE1QTl9DT1BZICh0cCwgdXAsIHNpemUpOworCSAgICBjeV9saW1iID0gbXBuX3N1Yl9uICh0cCArIHNpemUsIHVwICsgc2l6ZSwgdnAsIHZzaXplKTsKKwkgICAgcnNpemUgPSB1c2l6ZTsKKwkgIH0KKwllbHNlIC8qICh1c2l6ZSA8IHZzaXplKSAqLworCSAgeworCSAgICAvKiB1dXV1ICAgICAqLworCSAgICAvKiB2dnZ2dnZ2ICAqLworCSAgICBtcF9zaXplX3Qgc2l6ZTsKKwkgICAgc2l6ZSA9IHZzaXplIC0gdXNpemU7CisJICAgIGN5X2xpbWIgPSBtcG5fbmVnICh0cCwgdnAsIHNpemUpOworCSAgICBjeV9saW1iID0gbXBuX3N1Yl9uYyAodHAgKyBzaXplLCB1cCwgdnAgKyBzaXplLCB1c2l6ZSwgY3lfbGltYik7CisJICAgIHJzaXplID0gdnNpemU7CisJICB9CisJaWYgKGN5X2xpbWIgPT0gMCkKKwkgIHsKKwkgICAgdHBbcnNpemVdID0gMTsKKwkgICAgcnNpemUrKzsKKwkgICAgZXhwKys7CisJICAgIGdvdG8gbm9ybWFsaXplZDsKKwkgIH0KKwlnb3RvIG5vcm1hbGl6ZTsKKyAgICAgIH0KKyAgICB9CisKK2dlbmVyYWxfY2FzZToKKyAgLyogSWYgVSBleHRlbmRzIGJleW9uZCBQUkVDLCBpZ25vcmUgdGhlIHBhcnQgdGhhdCBkb2VzLiAgKi8KKyAgaWYgKHVzaXplID4gcHJlYykKKyAgICB7CisgICAgICB1cCArPSB1c2l6ZSAtIHByZWM7CisgICAgICB1c2l6ZSA9IHByZWM7CisgICAgfQorCisgIC8qIElmIFYgZXh0ZW5kcyBiZXlvbmQgUFJFQywgaWdub3JlIHRoZSBwYXJ0IHRoYXQgZG9lcy4KKyAgICAgTm90ZSB0aGF0IHRoaXMgbWF5IG1ha2UgdnNpemUgbmVnYXRpdmUuICAqLworICBpZiAodnNpemUgKyBlZGlmZiA+IHByZWMpCisgICAgeworICAgICAgdnAgKz0gdnNpemUgKyBlZGlmZiAtIHByZWM7CisgICAgICB2c2l6ZSA9IHByZWMgLSBlZGlmZjsKKyAgICB9CisKKyAgaWYgKGVkaWZmID49IHByZWMpCisgICAgeworICAgICAgLyogViBjb21wbGV0ZWx5IGNhbmNlbGxlZC4gICovCisgICAgICBpZiAocnAgIT0gdXApCisJTVBOX0NPUFkgKHJwLCB1cCwgdXNpemUpOworICAgICAgcnNpemUgPSB1c2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSB0ZW1wIHNwYWNlIGZvciB0aGUgcmVzdWx0LiAgQWxsb2NhdGUKKwkganVzdCB2c2l6ZSArIGVkaWZmIGxhdGVyPz8/ICAqLworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHByZWMpOworCisgICAgICAvKiBMb2NhdGUgdGhlIGxlYXN0IHNpZ25pZmljYW50IG5vbi16ZXJvIGxpbWIgaW4gKHRoZSBuZWVkZWQKKwkgcGFydHMgb2YpIFUgYW5kIFYsIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGJlbG93LiAgKi8KKyAgICAgIGZvciAoOzspCisJeworCSAgaWYgKHZzaXplID09IDApCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocnAsIHVwLCB1c2l6ZSk7CisJICAgICAgcnNpemUgPSB1c2l6ZTsKKwkgICAgICBnb3RvIGRvbmU7CisJICAgIH0KKwkgIGlmICh2cFswXSAhPSAwKQorCSAgICBicmVhazsKKwkgIHZwKyssIHZzaXplLS07CisJfQorICAgICAgZm9yICg7OykKKwl7CisJICBpZiAodXNpemUgPT0gMCkKKwkgICAgeworCSAgICAgIE1QTl9DT1BZIChycCwgdnAsIHZzaXplKTsKKwkgICAgICByc2l6ZSA9IHZzaXplOworCSAgICAgIG5lZ2F0ZSBePSAxOworCSAgICAgIGdvdG8gZG9uZTsKKwkgICAgfQorCSAgaWYgKHVwWzBdICE9IDApCisJICAgIGJyZWFrOworCSAgdXArKywgdXNpemUtLTsKKwl9CisKKyAgICAgIC8qIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgIHwgIHV1dXUgICAgKi8KKyAgICAgIC8qIHZ2dnZ2dnYgIHwgIHZ2ICAgICAgIHwgICAgdnZ2dnYgIHwgICAgdiAgICAgIHwgICAgICAgdnYgKi8KKworICAgICAgaWYgKHVzaXplID4gZWRpZmYpCisJeworCSAgLyogVSBhbmQgViBwYXJ0aWFsbHkgb3ZlcmxhcHMuICAqLworCSAgaWYgKGVkaWZmID09IDApCisJICAgIHsKKwkgICAgICAvKiBIYXZlIHRvIGNvbXBhcmUgdGhlIGxlYWRpbmcgbGltYnMgb2YgdSBhbmQgdgorCQkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29tcHV0ZSB1IC0gdiBvciB2IC0gdS4gICovCisJICAgICAgaWYgKHVzaXplID49IHZzaXplKQorCQl7CisJCSAgLyogdXV1dSAgICAgKi8KKwkJICAvKiB2diAgICAgICAqLworCQkgIG1wX3NpemVfdCBzaXplOworCQkgIHNpemUgPSB1c2l6ZSAtIHZzaXplOworCQkgIE1QTl9DT1BZICh0cCwgdXAsIHNpemUpOworCQkgIG1wbl9zdWJfbiAodHAgKyBzaXplLCB1cCArIHNpemUsIHZwLCB2c2l6ZSk7CisJCSAgcnNpemUgPSB1c2l6ZTsKKwkJfQorCSAgICAgIGVsc2UgLyogKHVzaXplIDwgdnNpemUpICovCisJCXsKKwkJICAvKiB1dXV1ICAgICAqLworCQkgIC8qIHZ2dnZ2dnYgICovCisJCSAgbXBfc2l6ZV90IHNpemU7CisJCSAgc2l6ZSA9IHZzaXplIC0gdXNpemU7CisJCSAgQVNTRVJUX0NBUlJZIChtcG5fbmVnICh0cCwgdnAsIHNpemUpKTsKKwkJICBtcG5fc3ViX25jICh0cCArIHNpemUsIHVwLCB2cCArIHNpemUsIHVzaXplLCBDTlNUX0xJTUIgKDEpKTsKKwkJICByc2l6ZSA9IHZzaXplOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICh2c2l6ZSArIGVkaWZmIDw9IHVzaXplKQorCQl7CisJCSAgLyogdXV1dSAgICAgKi8KKwkJICAvKiAgIHYgICAgICAqLworCQkgIG1wX3NpemVfdCBzaXplOworCQkgIHNpemUgPSB1c2l6ZSAtIGVkaWZmIC0gdnNpemU7CisJCSAgTVBOX0NPUFkgKHRwLCB1cCwgc2l6ZSk7CisJCSAgbXBuX3N1YiAodHAgKyBzaXplLCB1cCArIHNpemUsIHVzaXplIC0gc2l6ZSwgdnAsIHZzaXplKTsKKwkJICByc2l6ZSA9IHVzaXplOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogdXV1dSAgICAgKi8KKwkJICAvKiAgIHZ2dnZ2ICAqLworCQkgIG1wX3NpemVfdCBzaXplOworCQkgIHJzaXplID0gdnNpemUgKyBlZGlmZjsKKwkJICBzaXplID0gcnNpemUgLSB1c2l6ZTsKKwkJICBBU1NFUlRfQ0FSUlkgKG1wbl9uZWcgKHRwLCB2cCwgc2l6ZSkpOworCQkgIG1wbl9zdWIgKHRwICsgc2l6ZSwgdXAsIHVzaXplLCB2cCArIHNpemUsIHVzaXplIC0gZWRpZmYpOworCQkgIC8qIFNob3VsZCB3ZSB1c2Ugc3ViX25jIHRoZW4gc3ViXzE/ICovCisJCSAgTVBOX0RFQ1JfVSAodHAgKyBzaXplLCB1c2l6ZSwgQ05TVF9MSU1CICgxKSk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiB1dXV1ICAgICAqLworCSAgLyogICAgICB2diAgKi8KKwkgIG1wX3NpemVfdCBzaXplLCBpOworCSAgc2l6ZSA9IHZzaXplICsgZWRpZmYgLSB1c2l6ZTsKKwkgIEFTU0VSVF9DQVJSWSAobXBuX25lZyAodHAsIHZwLCB2c2l6ZSkpOworCSAgZm9yIChpID0gdnNpemU7IGkgPCBzaXplOyBpKyspCisJICAgIHRwW2ldID0gR01QX05VTUJfTUFYOworCSAgbXBuX3N1Yl8xICh0cCArIHNpemUsIHVwLCB1c2l6ZSwgKG1wX2xpbWJfdCkgMSk7CisJICByc2l6ZSA9IHNpemUgKyB1c2l6ZTsKKwl9CisKKyAgICBub3JtYWxpemU6CisgICAgICAvKiBGdWxsIG5vcm1hbGl6ZS4gIE9wdGltaXplIGxhdGVyLiAgKi8KKyAgICAgIHdoaWxlIChyc2l6ZSAhPSAwICYmIHRwW3JzaXplIC0gMV0gPT0gMCkKKwl7CisJICByc2l6ZS0tOworCSAgZXhwLS07CisJfQorICAgIG5vcm1hbGl6ZWQ6CisgICAgICBNUE5fQ09QWSAocnAsIHRwLCByc2l6ZSk7CisgICAgfQorCisgZG9uZToKKyAgVE1QX0ZSRUU7CisgIGlmIChyc2l6ZSA9PSAwKSB7CisgICAgU0laIChyKSA9IDA7CisgICAgRVhQIChyKSA9IDA7CisgIH0gZWxzZSB7CisgICAgU0laIChyKSA9IG5lZ2F0ZSA/IC1yc2l6ZSA6IHJzaXplOworICAgIEVYUCAocikgPSBleHA7CisgIH0KK30KZGlmZiAtLWdpdCBhL21wZi9zdWJfdWkuYyBiL21wZi9zdWJfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNkMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL3N1Yl91aS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIG1wZl9zdWJfdWkgLS0gU3VidHJhY3QgYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgZmxvYXQuCisKK0NvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX3N1Yl91aSAobXBmX3B0ciBzdW0sIG1wZl9zcmNwdHIgdSwgdW5zaWduZWQgbG9uZyBpbnQgdikKK3sKKyAgX19tcGZfc3RydWN0IHZ2OworICBtcF9saW1iX3Qgdmw7CisKKyAgaWYgKHYgPT0gMCkKKyAgICB7CisgICAgICBtcGZfc2V0IChzdW0sIHUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB2bCA9IHY7CisgIHZ2Ll9tcF9zaXplID0gMTsKKyAgdnYuX21wX2QgPSAmdmw7CisgIHZ2Ll9tcF9leHAgPSAxOworICBtcGZfc3ViIChzdW0sIHUsICZ2dik7Cit9CmRpZmYgLS1naXQgYS9tcGYvc3dhcC5jIGIvbXBmL3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGIyZTliCi0tLSAvZGV2L251bGwKKysrIGIvbXBmL3N3YXAuYwpAQCAtMCwwICsxLDU2IEBACisvKiBtcGZfc3dhcCAoVSwgVikgLS0gU3dhcCBVIGFuZCBWLgorCitDb3B5cmlnaHQgMTk5NywgMTk5OCwgMjAwMCwgMjAwMSwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wZl9zd2FwIChtcGZfcHRyIHUsIG1wZl9wdHIgdikgX19HTVBfTk9USFJPVworeworICBtcF9wdHIgdHB0cjsKKyAgbXBfc2l6ZV90IHRwcmVjOworICBtcF9zaXplX3QgdHNpejsKKyAgbXBfZXhwX3QgIHRleHA7CisKKyAgdHByZWMgPSBQUkVDKHUpOworICBQUkVDKHUpID0gUFJFQyh2KTsKKyAgUFJFQyh2KSA9IHRwcmVjOworCisgIHRzaXogPSBTSVoodSk7CisgIFNJWih1KSA9IFNJWih2KTsKKyAgU0laKHYpID0gdHNpejsKKworICB0ZXhwID0gRVhQKHUpOworICBFWFAodSkgPSBFWFAodik7CisgIEVYUCh2KSA9IHRleHA7CisKKyAgdHB0ciA9IFBUUih1KTsKKyAgUFRSKHUpID0gUFRSKHYpOworICBQVFIodikgPSB0cHRyOworfQpkaWZmIC0tZ2l0IGEvbXBmL3RydW5jLmMgYi9tcGYvdHJ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWFmNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBmL3RydW5jLmMKQEAgLTAsMCArMSw3NCBAQAorLyogbXBmX3RydW5jIC0tIHRydW5jYXRlIGFuIG1wZiB0byBhbiBpbnRlZ2VyLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogTm90aWNlIHRoZSB1c2Ugb2YgcHJlYysxIGVuc3VyZXMgbXBmX3RydW5jIGlzIGVxdWl2YWxlbnQgdG8gbXBmX3NldCBpZiB1CisgICBpcyBhbHJlYWR5IGFuIGludGVnZXIuICAqLworCit2b2lkCittcGZfdHJ1bmMgKG1wZl9wdHIgciwgbXBmX3NyY3B0ciB1KQoreworICBtcF9wdHIgICAgIHJwOworICBtcF9zcmNwdHIgIHVwOworICBtcF9zaXplX3QgIHNpemUsIGFzaXplLCBwcmVjOworICBtcF9leHBfdCAgIGV4cDsKKworICBleHAgPSBFWFAodSk7CisgIHNpemUgPSBTSVoodSk7CisgIGlmIChzaXplID09IDAgfHwgZXhwIDw9IDApCisgICAgeworICAgICAgLyogdSBpcyBvbmx5IGEgZnJhY3Rpb24gKi8KKyAgICAgIFNJWihyKSA9IDA7CisgICAgICBFWFAocikgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICB1cCA9IFBUUih1KTsKKyAgRVhQKHIpID0gZXhwOworICBhc2l6ZSA9IEFCUyAoc2l6ZSk7CisgIHVwICs9IGFzaXplOworCisgIC8qIHNraXAgZnJhY3Rpb24gcGFydCBvZiB1ICovCisgIGFzaXplID0gTUlOIChhc2l6ZSwgZXhwKTsKKworICAvKiBkb24ndCBsb3NlIHByZWNpc2lvbiBpbiB0aGUgY29weSAqLworICBwcmVjID0gUFJFQyhyKSArIDE7CisKKyAgLyogc2tpcCBleGNlc3Mgb3ZlciB0YXJnZXQgcHJlY2lzaW9uICovCisgIGFzaXplID0gTUlOIChhc2l6ZSwgcHJlYyk7CisKKyAgdXAgLT0gYXNpemU7CisgIHJwID0gUFRSKHIpOworICBTSVoocikgPSAoc2l6ZSA+PSAwID8gYXNpemUgOiAtYXNpemUpOworICBpZiAocnAgIT0gdXApCisgICAgTVBOX0NPUFlfSU5DUiAocnAsIHVwLCBhc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcGYvdWlfZGl2LmMgYi9tcGYvdWlfZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyOGJkNAotLS0gL2Rldi9udWxsCisrKyBiL21wZi91aV9kaXYuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogbXBmX3VpX2RpdiAtLSBEaXZpZGUgYW4gdW5zaWduZWQgaW50ZWdlciB3aXRoIGEgZmxvYXQuCisKK0NvcHlyaWdodCAxOTkzLTE5OTYsIDIwMDAtMjAwMiwgMjAwNCwgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCit2b2lkCittcGZfdWlfZGl2IChtcGZfcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW50IHUsIG1wZl9zcmNwdHIgdikKK3sKKyAgbXBfc3JjcHRyIHZwOworICBtcF9wdHIgcnAsIHRwLCByZW1wLCBuZXdfdnA7CisgIG1wX3NpemVfdCB2c2l6ZTsKKyAgbXBfc2l6ZV90IHJzaXplLCBwcm9zcGVjdGl2ZV9yc2l6ZSwgemVyb3MsIHRzaXplLCBoaWdoX3plcm87CisgIG1wX3NpemVfdCBzaWduX3F1b3RpZW50OworICBtcF9zaXplX3QgcHJlYzsKKyAgbXBfZXhwX3QgcmV4cDsKKyAgVE1QX0RFQ0w7CisKKyAgdnNpemUgPSB2LT5fbXBfc2l6ZTsKKyAgc2lnbl9xdW90aWVudCA9IHZzaXplOworCisgIGlmIChVTkxJS0VMWSAodnNpemUgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgaWYgKFVOTElLRUxZICh1ID09IDApKQorICAgIHsKKyAgICAgIHItPl9tcF9zaXplID0gMDsKKyAgICAgIHItPl9tcF9leHAgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICB2c2l6ZSA9IEFCUyAodnNpemUpOworICBwcmVjID0gci0+X21wX3ByZWM7CisKKyAgVE1QX01BUks7CisgIHJleHAgPSAxIC0gdi0+X21wX2V4cCArIDE7CisKKyAgcnAgPSByLT5fbXBfZDsKKyAgdnAgPSB2LT5fbXBfZDsKKworICBwcm9zcGVjdGl2ZV9yc2l6ZSA9IDEgLSB2c2l6ZSArIDE7ICAgIC8qIHF1b3QgZnJvbSB1c2luZyBnaXZlbiB1LHYgc2l6ZXMgKi8KKyAgcnNpemUgPSBwcmVjICsgMTsgICAgICAgICAgICAgICAgICAgICAvKiBkZXNpcmVkIHF1b3Qgc2l6ZSAqLworCisgIHplcm9zID0gcnNpemUgLSBwcm9zcGVjdGl2ZV9yc2l6ZTsgICAgLyogcGFkZGluZyB1IHRvIGdpdmUgcnNpemUgKi8KKyAgdHNpemUgPSAxICsgemVyb3M7ICAgICAgICAgICAgICAgICAgICAvKiB1IHdpdGggemVyb3MgKi8KKworICBpZiAoV0FOVF9UTVBfREVCVUcpCisgICAgeworICAgICAgLyogc2VwYXJhdGUgYWxsb2MgYmxvY2tzLCBmb3IgbWFsbG9jIGRlYnVnZ2luZyAqLworICAgICAgcmVtcCA9IFRNUF9BTExPQ19MSU1CUyAodnNpemUpOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRzaXplKTsKKyAgICAgIG5ld192cCA9IE5VTEw7CisgICAgICBpZiAocnAgPT0gdnApCisgICAgICAgIG5ld192cCA9IFRNUF9BTExPQ19MSU1CUyAodnNpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG9uZSBhbGxvYyB3aXRoIGNhbGN1bGF0ZWQgc2l6ZSwgZm9yIGVmZmljaWVuY3kgKi8KKyAgICAgIG1wX3NpemVfdCBzaXplID0gdnNpemUgKyB0c2l6ZSArIChycCA9PSB2cCA/IHZzaXplIDogMCk7CisgICAgICByZW1wID0gVE1QX0FMTE9DX0xJTUJTIChzaXplKTsKKyAgICAgIHRwID0gcmVtcCArIHZzaXplOworICAgICAgbmV3X3ZwID0gdHAgKyB0c2l6ZTsKKyAgICB9CisKKyAgLyogZW5zdXJlIGRpdmlzb3IgZG9lc24ndCBvdmVybGFwIHF1b3RpZW50ICovCisgIGlmIChycCA9PSB2cCkKKyAgICB7CisgICAgICBNUE5fQ09QWSAobmV3X3ZwLCB2cCwgdnNpemUpOworICAgICAgdnAgPSBuZXdfdnA7CisgICAgfQorCisgIE1QTl9aRVJPICh0cCwgdHNpemUtMSk7CisKKyAgdHBbdHNpemUgLSAxXSA9IHUgJiBHTVBfTlVNQl9NQVNLOworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUworICBpZiAodSA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICAvKiB0c2l6ZS12c2l6ZSsxID09IHJzaXplLCBzbyB0c2l6ZSA+PSByc2l6ZS4gIHJzaXplID09IHByZWMrMSA+PSAyLAorICAgICAgICAgc28gdHNpemUgPj0gMiwgaGVuY2UgdGhlcmUncyByb29tIGZvciAyLWxpbWIgdSB3aXRoIG5haWxzICovCisgICAgICBBU1NFUlQgKHRzaXplID49IDIpOworICAgICAgdHBbdHNpemUgLSAxXSA9IHUgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIHRwW3RzaXplIC0gMl0gPSB1ICYgR01QX05VTUJfTUFTSzsKKyAgICAgIHJleHArKzsKKyAgICB9CisjZW5kaWYKKworICBBU1NFUlQgKHRzaXplLXZzaXplKzEgPT0gcnNpemUpOworICBtcG5fdGRpdl9xciAocnAsIHJlbXAsIChtcF9zaXplX3QpIDAsIHRwLCB0c2l6ZSwgdnAsIHZzaXplKTsKKworICAvKiBzdHJpcCBwb3NzaWJsZSB6ZXJvIGhpZ2ggbGltYiAqLworICBoaWdoX3plcm8gPSAocnBbcnNpemUtMV0gPT0gMCk7CisgIHJzaXplIC09IGhpZ2hfemVybzsKKyAgcmV4cCAtPSBoaWdoX3plcm87CisKKyAgci0+X21wX3NpemUgPSBzaWduX3F1b3RpZW50ID49IDAgPyByc2l6ZSA6IC1yc2l6ZTsKKyAgci0+X21wX2V4cCA9IHJleHA7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBmL3VpX3N1Yi5jIGIvbXBmL3VpX3N1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGE1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvdWlfc3ViLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIG1wZl91aV9zdWIgLS0gU3VidHJhY3QgYSBmbG9hdCBmcm9tIGFuIHVuc2lnbmVkIGxvbmcgaW50LgorCitDb3B5cmlnaHQgMTk5My0xOTk2LCAyMDAxLCAyMDAyLCAyMDA1LCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX3VpX3N1YiAobXBmX3B0ciByLCB1bnNpZ25lZCBsb25nIGludCB1LCBtcGZfc3JjcHRyIHYpCit7CisjaWYgMQorICBfX21wZl9zdHJ1Y3QgdXU7CisgIG1wX2xpbWJfdCB1bDsKKworICBpZiAodSA9PSAwKQorICAgIHsKKyAgICAgIG1wZl9uZWcgKHIsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB1bCA9IHU7CisgIHV1Ll9tcF9zaXplID0gMTsKKyAgdXUuX21wX2QgPSAmdWw7CisgIHV1Ll9tcF9leHAgPSAxOworICBtcGZfc3ViIChyLCAmdXUsIHYpOworCisjZWxzZQorICBtcF9zcmNwdHIgdXAsIHZwOworICBtcF9wdHIgcnAsIHRwOworICBtcF9zaXplX3QgdXNpemUsIHZzaXplLCByc2l6ZTsKKyAgbXBfc2l6ZV90IHByZWM7CisgIG1wX2V4cF90IHVleHA7CisgIG1wX3NpemVfdCBlZGlmZjsKKyAgaW50IG5lZ2F0ZTsKKyAgbXBfbGltYl90IHVsaW1iOworICBUTVBfREVDTDsKKworICB2c2l6ZSA9IHYtPl9tcF9zaXplOworCisgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2VzIHRoYXQgZG9uJ3Qgd29yayBpbiBnZW5lcmljIGNvZGUgYmVsb3cuICAqLworICBpZiAodSA9PSAwKQorICAgIHsKKyAgICAgIG1wZl9uZWcgKHIsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKHZzaXplID09IDApCisgICAgeworICAgICAgbXBmX3NldF91aSAociwgdSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElmIHNpZ25zIG9mIFUgYW5kIFYgYXJlIGRpZmZlcmVudCwgcGVyZm9ybSBhZGRpdGlvbi4gICovCisgIGlmICh2c2l6ZSA8IDApCisgICAgeworICAgICAgX19tcGZfc3RydWN0IHZfbmVnYXRlZDsKKyAgICAgIHZfbmVnYXRlZC5fbXBfc2l6ZSA9IC12c2l6ZTsKKyAgICAgIHZfbmVnYXRlZC5fbXBfZXhwID0gdi0+X21wX2V4cDsKKyAgICAgIHZfbmVnYXRlZC5fbXBfZCA9IHYtPl9tcF9kOworICAgICAgbXBmX2FkZF91aSAociwgJnZfbmVnYXRlZCwgdSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNpZ25zIGFyZSBub3cga25vd24gdG8gYmUgdGhlIHNhbWUuICAqLworICBBU1NFUlQgKHZzaXplID4gMCk7CisgIHVsaW1iID0gdTsKKyAgLyogTWFrZSBVIGJlIHRoZSBvcGVyYW5kIHdpdGggdGhlIGxhcmdlc3QgZXhwb25lbnQuICAqLworICBuZWdhdGUgPSAxIDwgdi0+X21wX2V4cDsKKyAgcHJlYyA9IHItPl9tcF9wcmVjICsgbmVnYXRlOworICBycCA9IHItPl9tcF9kOworICBpZiAobmVnYXRlKQorICAgIHsKKyAgICAgIHVzaXplID0gdnNpemU7CisgICAgICB2c2l6ZSA9IDE7CisgICAgICB1cCA9IHYtPl9tcF9kOworICAgICAgdnAgPSAmdWxpbWI7CisgICAgICB1ZXhwID0gdi0+X21wX2V4cDsKKyAgICAgIGVkaWZmID0gdWV4cCAtIDE7CisKKyAgICAgIC8qIElmIFUgZXh0ZW5kcyBiZXlvbmQgUFJFQywgaWdub3JlIHRoZSBwYXJ0IHRoYXQgZG9lcy4gICovCisgICAgICBpZiAodXNpemUgPiBwcmVjKQorCXsKKwkgIHVwICs9IHVzaXplIC0gcHJlYzsKKwkgIHVzaXplID0gcHJlYzsKKwl9CisgICAgICBBU1NFUlQgKGVkaWZmID4gMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdnAgPSB2LT5fbXBfZDsKKyAgICAgIGVkaWZmID0gMSAtIHYtPl9tcF9leHA7CisgIC8qIElnbm9yZSBsZWFkaW5nIGxpbWJzIGluIFUgYW5kIFYgdGhhdCBhcmUgZXF1YWwuICBEb2luZworICAgICB0aGlzIGhlbHBzIGluY3JlYXNlIHRoZSBwcmVjaXNpb24gb2YgdGhlIHJlc3VsdC4gICovCisgICAgICBpZiAoZWRpZmYgPT0gMCAmJiB1bGltYiA9PSB2cFt2c2l6ZSAtIDFdKQorCXsKKwkgIHVzaXplID0gMDsKKwkgIHZzaXplLS07CisJICB1ZXhwID0gMDsKKwkgIC8qIE5vdGUgdGhhdCBWIG1pZ2h0IG5vdyBoYXZlIGxlYWRpbmcgemVybyBsaW1icy4KKwkgICAgIEluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCB1ZXhwLiAgKi8KKwkgIGZvciAoOzspCisJICAgIHsKKwkgICAgICBpZiAodnNpemUgPT0gMCkgeworCQlyc2l6ZSA9IDA7CisJCXVleHAgPSAwOworCQlnb3RvIGRvbmU7CisJICAgICAgfQorCSAgICAgIGlmICggdnBbdnNpemUgLSAxXSAhPSAwKQorCQlicmVhazsKKwkgICAgICB2c2l6ZS0tLCB1ZXhwLS07CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgdXNpemUgPSAxOworCSAgdWV4cCA9IDE7CisJICB1cCA9ICZ1bGltYjsKKwl9CisgICAgICBBU1NFUlQgKHVzaXplIDw9IHByZWMpOworICAgIH0KKworICBpZiAoZWRpZmYgPj0gcHJlYykKKyAgICB7CisgICAgICAvKiBWIGNvbXBsZXRlbHkgY2FuY2VsbGVkLiAgKi8KKyAgICAgIGlmIChycCAhPSB1cCkKKwlNUE5fQ09QWSAocnAsIHVwLCB1c2l6ZSk7CisgICAgICByc2l6ZSA9IHVzaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgLyogSWYgViBleHRlbmRzIGJleW9uZCBQUkVDLCBpZ25vcmUgdGhlIHBhcnQgdGhhdCBkb2VzLgorICAgICBOb3RlIHRoYXQgdGhpcyBjYW4gbWFrZSB2c2l6ZSBuZWl0aGVyIHplcm8gbm9yIG5lZ2F0aXZlLiAgKi8KKyAgaWYgKHZzaXplICsgZWRpZmYgPiBwcmVjKQorICAgIHsKKyAgICAgIHZwICs9IHZzaXplICsgZWRpZmYgLSBwcmVjOworICAgICAgdnNpemUgPSBwcmVjIC0gZWRpZmY7CisgICAgfQorCisgICAgICAvKiBMb2NhdGUgdGhlIGxlYXN0IHNpZ25pZmljYW50IG5vbi16ZXJvIGxpbWIgaW4gKHRoZSBuZWVkZWQKKwkgcGFydHMgb2YpIFUgYW5kIFYsIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGJlbG93LiAgKi8KKyAgICAgIEFTU0VSVCAodnNpemUgPiAwKTsKKyAgICAgIGZvciAoOzspCisJeworCSAgaWYgKHZwWzBdICE9IDApCisJICAgIGJyZWFrOworCSAgdnArKywgdnNpemUtLTsKKwkgIGlmICh2c2l6ZSA9PSAwKQorCSAgICB7CisJICAgICAgTVBOX0NPUFkgKHJwLCB1cCwgdXNpemUpOworCSAgICAgIHJzaXplID0gdXNpemU7CisJICAgICAgZ290byBkb25lOworCSAgICB9CisJfQorICAgICAgZm9yICg7OykKKwl7CisJICBpZiAodXNpemUgPT0gMCkKKwkgICAgeworCSAgICAgIE1QTl9DT1BZIChycCwgdnAsIHZzaXplKTsKKwkgICAgICByc2l6ZSA9IHZzaXplOworCSAgICAgIG5lZ2F0ZSBePSAxOworCSAgICAgIGdvdG8gZG9uZTsKKwkgICAgfQorCSAgaWYgKHVwWzBdICE9IDApCisJICAgIGJyZWFrOworCSAgdXArKywgdXNpemUtLTsKKwl9CisKKyAgICAgIEFTU0VSVCAodXNpemUgPiAwICYmIHZzaXplID4gMCk7CisgICAgICBUTVBfTUFSSzsKKworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHByZWMpOworCisgICAgICAvKiB1dXV1ICAgICB8ICB1dXV1ICAgICB8ICB1dXV1ICAgICB8ICB1dXV1ICAgICB8ICB1dXV1ICAgICovCisgICAgICAvKiB2dnZ2dnZ2ICB8ICB2diAgICAgICB8ICAgIHZ2dnZ2ICB8ICAgIHYgICAgICB8ICAgICAgIHZ2ICovCisKKyAgICAgIGlmICh1c2l6ZSA+IGVkaWZmKQorCXsKKwkgIC8qIFUgYW5kIFYgcGFydGlhbGx5IG92ZXJsYXBzLiAgKi8KKwkgIGlmIChlZGlmZiA9PSAwKQorCSAgICB7CisJICAgICAgQVNTRVJUICh1c2l6ZSA9PSAxICYmIHZzaXplID49IDEgJiYgdWxpbWIgPT0gKnVwKTsgLyogdXNpemUgaXMgMT5lZGlmZiwgdnNpemUgPj0gMSAqLworCSAgICAgIGlmICgxIDwgdnNpemUpCisJCXsKKwkJICAvKiB1ICAgICAgICAqLworCQkgIC8qIHZ2dnZ2dnYgICovCisJCSAgcnNpemUgPSB2c2l6ZTsKKwkJICB2c2l6ZSAtPSAxOworCQkgIC8qIG1wbl9jbXAgKHVwLCB2cCArIHZzaXplIC0gdXNpemUsIHVzaXplKSA+IDAgKi8KKwkJICBpZiAodWxpbWIgPiB2cFt2c2l6ZV0pCisJCSAgICB7CisJCSAgICAgIHRwW3ZzaXplXSA9IHVsaW1iIC0gdnBbdnNpemVdIC0gMTsKKwkJICAgICAgQVNTRVJUX0NBUlJZIChtcG5fbmVnICh0cCwgdnAsIHZzaXplKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiB2dnZ2dnZ2ICAqLyAgLyogU3dhcCBVIGFuZCBWLiAqLworCQkgICAgICAvKiB1ICAgICAgICAqLworCQkgICAgICBNUE5fQ09QWSAodHAsIHZwLCB2c2l6ZSk7CisJCSAgICAgIHRwW3ZzaXplXSA9IHZwW3ZzaXplXSAtIHVsaW1iOworCQkgICAgICBuZWdhdGUgPSAxOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSAvKiB2c2l6ZSA9PSB1c2l6ZSA9PSAxICovCisJCXsKKwkJICAvKiB1ICAgICAqLworCQkgIC8qIHYgICAgICovCisJCSAgcnNpemUgPSAxOworCQkgIG5lZ2F0ZSA9IHVsaW1iIDwgdnBbMF07CisJCSAgdHBbMF0gPSBuZWdhdGUgPyB2cFswXSAtIHVsaW1iOiB1bGltYiAtIHZwWzBdOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEFTU0VSVCAodnNpemUgKyBlZGlmZiA8PSB1c2l6ZSk7CisJICAgICAgQVNTRVJUICh2c2l6ZSA9PSAxICYmIHVzaXplID49IDIgJiYgdWxpbWIgPT0gKnZwKTsKKwkJeworCQkgIC8qIHV1dXUgICAgICovCisJCSAgLyogICB2ICAgICAgKi8KKwkJICBtcF9zaXplX3Qgc2l6ZTsKKwkJICBzaXplID0gdXNpemUgLSBlZGlmZiAtIDE7CisJCSAgTVBOX0NPUFkgKHRwLCB1cCwgc2l6ZSk7CisJCSAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfMSAodHAgKyBzaXplLCB1cCArIHNpemUsIHVzaXplIC0gc2l6ZSwgdWxpbWIpKTsKKwkJICByc2l6ZSA9IHVzaXplOworCQl9CisJCS8qIE90aGVyIGNhc2VzIGFyZSBub3QgcG9zc2libGUgKi8KKwkJLyogdXV1dSAgICAgKi8KKwkJLyogICB2dnZ2diAgKi8KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiB1dXV1ICAgICAqLworCSAgLyogICAgICB2diAgKi8KKwkgIG1wX3NpemVfdCBzaXplLCBpOworCSAgQVNTRVJUX0NBUlJZIChtcG5fbmVnICh0cCwgdnAsIHZzaXplKSk7CisJICByc2l6ZSA9IHZzaXplICsgZWRpZmY7CisJICBzaXplID0gcnNpemUgLSB1c2l6ZTsKKwkgIGZvciAoaSA9IHZzaXplOyBpIDwgc2l6ZTsgaSsrKQorCSAgICB0cFtpXSA9IEdNUF9OVU1CX01BWDsKKwkgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViXzEgKHRwICsgc2l6ZSwgdXAsIHVzaXplLCBDTlNUX0xJTUIgKDEpKSk7CisJfQorCisgICAgICAvKiBGdWxsIG5vcm1hbGl6ZS4gIE9wdGltaXplIGxhdGVyLiAgKi8KKyAgICAgIHdoaWxlIChyc2l6ZSAhPSAwICYmIHRwW3JzaXplIC0gMV0gPT0gMCkKKwl7CisJICByc2l6ZS0tOworCSAgdWV4cC0tOworCX0KKyAgICAgIE1QTl9DT1BZIChycCwgdHAsIHJzaXplKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKworIGRvbmU6CisgIHItPl9tcF9zaXplID0gbmVnYXRlID8gLXJzaXplIDogcnNpemU7CisgIHItPl9tcF9leHAgPSB1ZXhwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tcGYvdXJhbmRvbWIuYyBiL21wZi91cmFuZG9tYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Mzk5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9tcGYvdXJhbmRvbWIuYwpAQCAtMCwwICsxLDY4IEBACisvKiBtcGZfdXJhbmRvbWIgKHJvcCwgc3RhdGUsIG5iaXRzKSAtLSBHZW5lcmF0ZSBhIHVuaWZvcm0gcHNldWRvcmFuZG9tCisgICByZWFsIG51bWJlciBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDEgKGV4Y2x1c2l2ZSkgb2Ygc2l6ZSBOQklUUywKKyAgIHVzaW5nIFNUQVRFIGFzIHRoZSByYW5kb20gc3RhdGUgcHJldmlvdXNseSBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8KKyAgIGdtcF9yYW5kaW5pdCgpLgorCitDb3B5cmlnaHQgMTk5OS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBmX3VyYW5kb21iIChtcGZfcHRyIHJvcCwgZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLCBtcF9iaXRjbnRfdCBuYml0cykKK3sKKyAgbXBfcHRyIHJwOworICBtcF9zaXplX3QgbmxpbWJzOworICBtcF9leHBfdCBleHA7CisgIG1wX3NpemVfdCBwcmVjOworCisgIHJwID0gUFRSIChyb3ApOworICBubGltYnMgPSBCSVRTX1RPX0xJTUJTIChuYml0cyk7CisgIHByZWMgPSBQUkVDIChyb3ApOworCisgIGlmIChubGltYnMgPiBwcmVjICsgMSB8fCBubGltYnMgPT0gMCkKKyAgICB7CisgICAgICBubGltYnMgPSBwcmVjICsgMTsKKyAgICAgIG5iaXRzID0gbmxpbWJzICogR01QX05VTUJfQklUUzsKKyAgICB9CisKKyAgX2dtcF9yYW5kIChycCwgcnN0YXRlLCBuYml0cyk7CisKKyAgLyogSWYgbmJpdHMgaXNuJ3QgYSBtdWx0aXBsZSBvZiBHTVBfTlVNQl9CSVRTLCBzaGlmdCB1cC4gICovCisgIGlmIChuYml0cyAlIEdNUF9OVU1CX0JJVFMgIT0gMCkKKyAgICBtcG5fbHNoaWZ0IChycCwgcnAsIG5saW1icywgR01QX05VTUJfQklUUyAtIG5iaXRzICUgR01QX05VTUJfQklUUyk7CisKKyAgZXhwID0gMDsKKyAgd2hpbGUgKG5saW1icyAhPSAwICYmIHJwW25saW1icyAtIDFdID09IDApCisgICAgeworICAgICAgbmxpbWJzLS07CisgICAgICBleHAtLTsKKyAgICB9CisgIEVYUCAocm9wKSA9IGV4cDsKKyAgU0laIChyb3ApID0gbmxpbWJzOworfQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9hb3JzX24uYXNtIGIvbXBuL2FybS9hb3JzX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTVlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL2FvcnNfbi5hc20KQEAgLTAsMCArMSwxMTIgQEAKK2RubCAgQVJNIG1wbl9hZGRfbiBhbmQgbXBuX3N1Yl9uCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFJvYmVydCBIYXJsZXkuCisKK2RubCAgQ29weXJpZ2h0IDE5OTcsIDIwMDAsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDIuNQlzbGlnaHRseSBmbHVjdHVhdGluZworQyBDb3J0ZXgtQTE1CSAyLjI1CisKK2RlZmluZShgcnAnLCBgcjAnKQorZGVmaW5lKGB1cCcsIGByMScpCitkZWZpbmUoYHZwJywgYHIyJykKK2RlZmluZShgbicsICBgcjMnKQorCitpZmRlZihgT1BFUkFUSU9OX2FkZF9uJywgYAorICBkZWZpbmUoYEFERFNVQicsCWFkZHMpCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgQ0xSQ1knLAlgY21uCXIwLCAjMCcpCisgIGRlZmluZShgU0VUQ1knLAlgY21wCSQxLCAjMScpCisgIGRlZmluZShgUkVUVkFMJywJYGFkYwlyMCwgbiwgIzAnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fYWRkX24pCisgIGRlZmluZShgZnVuY19uYycsCW1wbl9hZGRfbmMpJykKK2lmZGVmKGBPUEVSQVRJT05fc3ViX24nLCBgCisgIGRlZmluZShgQUREU1VCJywJc3VicykKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBDTFJDWScsCWBjbXAJcjAsIHIwJykKKyAgZGVmaW5lKGBTRVRDWScsCWByc2JzCSQxLCAkMSwgIzAnKQorICBkZWZpbmUoYFJFVFZBTCcsCWBzYmMJcjAsIHIwLCByMAorCQkJYW5kCXIwLCByMCwgIzEnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fc3ViX24pCisgIGRlZmluZShgZnVuY19uYycsCW1wbl9zdWJfbmMpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkX24gbXBuX2FkZF9uYyBtcG5fc3ViX24gbXBuX3N1Yl9uYykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKGZ1bmNfbmMpCisJbGRyCXIxMiwgW3NwLCAjMF0KKwlzdG1mZAlzcCEsIHsgcjgsIHI5LCBsciB9CisJU0VUQ1koCXIxMikKKwliCUwoZW50KQorRVBJTE9HVUUoKQorUFJPTE9HVUUoZnVuYykKKwlzdG1mZAlzcCEsIHsgcjgsIHI5LCBsciB9CisJQ0xSQ1koCXIxMikKK0woZW50KToJdHN0CW4sICMxCisJYmVxCUwoc2tpcDEpCisJbGRyCXIxMiwgW3VwXSwgIzQKKwlsZHIJbHIsIFt2cF0sICM0CisJQUREU1VCQwlyMTIsIHIxMiwgbHIKKwlzdHIJcjEyLCBbcnBdLCAjNAorTChza2lwMSk6CisJdHN0CW4sICMyCisJYmVxCUwoc2tpcDIpCisJbGRtaWEJdXAhLCB7IHI4LCByOSB9CisJbGRtaWEJdnAhLCB7IHIxMiwgbHIgfQorCUFERFNVQkMJcjgsIHI4LCByMTIKKwlBRERTVUJDCXI5LCByOSwgbHIKKwlzdG1pYQlycCEsIHsgcjgsIHI5IH0KK0woc2tpcDIpOgorCWJpY3MJbiwgbiwgIzMKKwliZXEJTChydG4pCisJc3RtZmQJc3AhLCB7IHI0LCByNSwgcjYsIHI3IH0KKworTCh0b3ApOglsZG1pYQl1cCEsIHsgcjQsIHI1LCByNiwgcjcgfQorCWxkbWlhCXZwISwgeyByOCwgcjksIHIxMiwgbHIgfQorCUFERFNVQkMJcjQsIHI0LCByOAorCXN1YgluLCBuLCAjNAorCUFERFNVQkMJcjUsIHI1LCByOQorCUFERFNVQkMJcjYsIHI2LCByMTIKKwlBRERTVUJDCXI3LCByNywgbHIKKwlzdG1pYQlycCEsIHsgcjQsIHI1LCByNiwgcjcgfQorCXRlcQluLCAjMAorCWJuZQlMKHRvcCkKKworCWxkbWZkCXNwISwgeyByNCwgcjUsIHI2LCByNyB9CisKK0wocnRuKToJUkVUVkFMCisJbGRtZmQJc3AhLCB7IHI4LCByOSwgcGMgfQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9hb3JzbHNoMV9uLmFzbSBiL21wbi9hcm0vYW9yc2xzaDFfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzYTczMwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vYW9yc2xzaDFfbi5hc20KQEAgLTAsMCArMSwxNjcgQEAKK2RubCAgQVJNIG1wbl9hZGRsc2gxX24gYW5kIG1wbl9zdWJsc2gxX24KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICAgYWRkbHNoMV9uICAgICAgIHN1YmxzaDFfbgorQwkgICAgIGN5Y2xlcy9saW1iICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk0JID8JCSA/CitDIFhTY2FsZQkgPwkJID8KK0MgQ29ydGV4LUE3CSA/CQkgPworQyBDb3J0ZXgtQTgJID8JCSA/CitDIENvcnRleC1BOQkgMy4xMgkJIDMuNworQyBDb3J0ZXgtQTE1CSA/CQkgPworCitDIFRPRE8KK0MgICogVGhlIGFkZGxzaDFfbiBjb2RlIHJ1bnMgd2VsbCwgYnV0IGlzIG9ubHkgYmFyZWx5IGZhc3RlciB0aGFuIG1wbl9hZGRtdWxfMS4KK0MgICAgVGhlIHN1YmxzaDFfbiBjb2RlIGNvdWxkIHN1cmVseSBiZSB0d2Vha2VkLCBpdHMgUkVWQ1kgc2xvd3MgZG93biB0aGluZ3MKK0MgICAgdmVyeSBtdWNoLiAgSWYgdHdvIGluc25zIGFyZSByZWFsbHkgbmVlZGVkLCBpdCBtaWdodCBoZWxwIHRvIHNlcGFyYXRlIHRoZW0KK0MgICAgZm9yIGJldHRlciBtaWNyby1wYXJhbGxlbGlzbS4KKworZGVmaW5lKGBycCcsIGByMCcpCitkZWZpbmUoYHVwJywgYHIxJykKK2RlZmluZShgdnAnLCBgcjInKQorZGVmaW5lKGBuJywgIGByMycpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkbHNoMV9uJywgYAorICBkZWZpbmUoYEFERFNVQicsCWFkZHMpCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgU0VUQ1knLAlgY21wCSQxLCAjMScpCisgIGRlZmluZShgUkVUVkFMJywJYGFkYwlyMCwgJDEsICMyJykKKyAgZGVmaW5lKGBTQVZFQ1knLAlgc2JjCSQxLCAkMiwgIzAnKQorICBkZWZpbmUoYFJFU1RDWScsCWBjbW4JJDEsICMxJykKKyAgZGVmaW5lKGBSRVZDWScsCWAnKQorICBkZWZpbmUoYElOSUNZUicsCWBtb3YJJDEsICMwJykKKyAgZGVmaW5lKGByMTByMTEnLAlgcjExJykKKyAgZGVmaW5lKGBmdW5jJywJbXBuX2FkZGxzaDFfbikKKyAgZGVmaW5lKGBmdW5jX25jJywJbXBuX2FkZGxzaDFfbmMpJykKK2lmZGVmKGBPUEVSQVRJT05fc3VibHNoMV9uJywgYAorICBkZWZpbmUoYEFERFNVQicsCXN1YnMpCisgIGRlZmluZShgQUREU1VCQycsCXNiY3MpCisgIGRlZmluZShgU0VUQ1knLAlgcnNicwkkMSwgJDEsICMwJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgYWRjCXIwLCAkMSwgIzEnKQorICBkZWZpbmUoYFNBVkVDWScsCWBzYmMJJDEsICQxLCAkMScpCisgIGRlZmluZShgUkVTVENZJywJYGNtbgkkMSwgIzEnKQorICBkZWZpbmUoYFJFVkNZJywJYHNiYwkkMSwgJDEsICQxCisJCQljbW4JJDEsICMxJykKKyAgZGVmaW5lKGBJTklDWVInLAlgbXZuCSQxLCAjMCcpCisgIGRlZmluZShgcjEwcjExJywJYHIxMCcpCisgIGRlZmluZShgZnVuYycsCW1wbl9zdWJsc2gxX24pCisgIGRlZmluZShgZnVuY19uYycsCW1wbl9zdWJsc2gxX25jKScpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FkZGxzaDFfbiBtcG5fc3VibHNoMV9uKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUoZnVuYykKKwlwdXNoCXtyNC1yMTByMTEsIHIxNH0KKworaWZkZWYoYE9QRVJBVElPTl9hZGRsc2gxX24nLCBgCisJbXZuCXIxMSwgIzAKKycpCisJSU5JQ1lSKAlyMTQpCisJc3VicwluLCBuLCAjMworCWJsdAlMKGxlMikJCQlDIGNhcnJ5IGNsZWFyIG9uIGJyYW5jaCBwYXRoCisKKwljbW4JcjAsICMwCQkJQyBjbGVhciBjYXJyeQorCWxkbWlhCXZwISwge3I4LCByOSwgcjEwfQorCWIJTChtaWQpCisKK0wodG9wKToJUkVTVENZKAlyMTQpCisJQUREU1VCQwlyNCwgcjQsIHI4CisJQUREU1VCQwlyNSwgcjUsIHI5CisJQUREU1VCQwlyNiwgcjYsIHIxMAorCWxkbWlhCXZwISwge3I4LCByOSwgcjEwfQorCXN0bWlhCXJwISwge3I0LCByNSwgcjZ9CisJUkVWQ1kocjE0KQorCWFkY3MJcjgsIHI4LCByOAorCWFkY3MJcjksIHI5LCByOQorCWFkY3MJcjEwLCByMTAsIHIxMAorCWxkbWlhCXVwISwge3I0LCByNSwgcjZ9CisJU0FWRUNZKAlyMTQsIHIxMSkKKwlzdWJzCW4sIG4sICMzCisJYmx0CUwoZXhpKQorCVJFU1RDWSgJcjEyKQorCUFERFNVQkMJcjQsIHI0LCByOAorCUFERFNVQkMJcjUsIHI1LCByOQorCUFERFNVQkMJcjYsIHI2LCByMTAKKwlsZG1pYQl2cCEsIHtyOCwgcjksIHIxMH0KKwlzdG1pYQlycCEsIHtyNCwgcjUsIHI2fQorCVJFVkNZKHIxMikKK0wobWlkKToJYWRjcwlyOCwgcjgsIHI4CisJYWRjcwlyOSwgcjksIHI5CisJYWRjcwlyMTAsIHIxMCwgcjEwCisJbGRtaWEJdXAhLCB7cjQsIHI1LCByNn0KKwlTQVZFQ1koCXIxMiwgcjExKQorCXN1YnMJbiwgbiwgIzMKKwliZ2UJTCh0b3ApCisKKwltb3YJcjcsIHIxMgkJCUMgc3dhcCBhbHRlcm5hdGluZy4uLgorCW1vdglyMTIsIHIxNAkJQyAuLi5jYXJyeS1zYXZlLi4uCisJbW92CXIxNCwgcjcJCQlDIC4uLnJlZ2lzdGVycworCitMKGV4aSk6CVJFU1RDWSgJcjEyKQorCUFERFNVQkMJcjQsIHI0LCByOAorCUFERFNVQkMJcjUsIHI1LCByOQorCUFERFNVQkMJcjYsIHI2LCByMTAKKwlzdG1pYQlycCEsIHtyNCwgcjUsIHI2fQorCisJUkVWQ1kocjEyKQorTChsZTIpOgl0c3QJbiwgIzEJCQlDIG4gPSB7LTEsLTIsLTN9IG1hcCB0byBbMl0sIFsxXSwgWzBdCisJYmVxCUwoZTEpCisKK0woZTAyKToJdHN0CW4sICMyCisJYmVxCUwocnQwKQorCWxkbQl2cCwge3I4LCByOX0KKwlhZGNzCXI4LCByOCwgcjgKKwlhZGNzCXI5LCByOSwgcjkKKwlsZG0JdXAsIHtyNCwgcjV9CisJU0FWRUNZKAlyMTIsIHIxMSkKKwlSRVNUQ1koCXIxNCkKKwlBRERTVUJDCXI0LCByNCwgcjgKKwlBRERTVUJDCXI1LCByNSwgcjkKKwlzdG0JcnAsIHtyNCwgcjV9CisJYglMKHJ0MSkKKworTChlMSk6CWxkcglyOCwgW3ZwXQorCWFkY3MJcjgsIHI4LCByOAorCWxkcglyNCwgW3VwXQorCVNBVkVDWSgJcjEyLCByMTEpCisJUkVTVENZKAlyMTQpCisJQUREU1VCQwlyNCwgcjQsIHI4CisJc3RyCXI0LCBbcnBdCisKK0wocnQxKToJbW92CXIxNCwgcjEyCisJUkVWQ1kocjEyKQorTChydDApOglSRVRWQUwoCXIxNCkKKwlwb3AJe3I0LXIxMHIxMSwgcjE0fQorCXJldHVybglyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vYW9yc211bF8xLmFzbSBiL21wbi9hcm0vYW9yc211bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ0ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9hb3JzbXVsXzEuYXNtCkBAIC0wLDAgKzEsMTM1IEBACitkbmwgIEFSTSBtcG5fYWRkbXVsXzEgYW5kIG1wbl9zdWJtdWxfMS4KKworZG5sICBDb3B5cmlnaHQgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMywgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNOiAgICAgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDUuMjUKK0MgQ29ydGV4LUExNQkgNAorCitkZWZpbmUoYHJwJywgYHIwJykKK2RlZmluZShgdXAnLCBgcjEnKQorZGVmaW5lKGBuJywgIGByMicpCitkZWZpbmUoYHZsJywgYHIzJykKK2RlZmluZShgcmwnLCBgcjEyJykKK2RlZmluZShgdWwnLCBgcjYnKQorZGVmaW5lKGByJywgIGBscicpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkbXVsXzEnLCBgCisgIGRlZmluZShgQUREU1VCJywJYWRkcykKKyAgZGVmaW5lKGBBRERTVUJDJywJYWRjcykKKyAgZGVmaW5lKGBDTFJSQ1knLAlgbW92CSQxLCAjMAorCQkJYWRkcwlyMCwgcjAsICMwJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgYWRjCXIwLCByNCwgIzAnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fYWRkbXVsXzEpJykKK2lmZGVmKGBPUEVSQVRJT05fc3VibXVsXzEnLCBgCisgIGRlZmluZShgQUREU1VCJywJc3VicykKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBDTFJSQ1knLAlgc3VicwkkMSwgcjAsIHIwJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgc2JjCXIwLCByMCwgcjAKKwkJCXN1YglyMCwgJDEsIHIwJykKKyAgZGVmaW5lKGBmdW5jJywJbXBuX3N1Ym11bF8xKScpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FkZG11bF8xIG1wbl9zdWJtdWxfMSkKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKGZ1bmMpCisJc3RtZmQJc3AhLCB7IHI0LXI2LCBsciB9CisJQ0xSUkNZKAlyNCkKKwl0c3QJbiwgIzEKKwliZXEJTChza2lwMSkKKwlsZHIJdWwsIFt1cF0sICM0CisJbGRyCXJsLCBbcnAsICMwXQorCXVtdWxsCXI1LCByNCwgdWwsIHZsCisJQUREU1VCCXIsIHJsLCByNQorCXN0cglyLCBbcnBdLCAjNAorTChza2lwMSk6CisJdHN0CW4sICMyCisJYmVxCUwoc2tpcDIpCisJbGRyCXVsLCBbdXBdLCAjNAorCWxkcglybCwgW3JwLCAjMF0KKwltb3YJcjUsICMwCisJdW1sYWwJcjQsIHI1LCB1bCwgdmwKKwlsZHIJdWwsIFt1cF0sICM0CisJQUREU1VCQwlyLCBybCwgcjQKKwlsZHIJcmwsIFtycCwgIzRdCisJbW92CXI0LCAjMAorCXVtbGFsCXI1LCByNCwgdWwsIHZsCisJc3RyCXIsIFtycF0sICM0CisJQUREU1VCQwlyLCBybCwgcjUKKwlzdHIJciwgW3JwXSwgIzQKK0woc2tpcDIpOgorCWJpY3MJbiwgbiwgIzMKKwliZXEJTChydG4pCisKKwlsZHIJdWwsIFt1cF0sICM0CisJbGRyCXJsLCBbcnAsICMwXQorCW1vdglyNSwgIzAKKwl1bWxhbAlyNCwgcjUsIHVsLCB2bAorCWIJTChpbikKKworTCh0b3ApOglsZHIJdWwsIFt1cF0sICM0CisJQUREU1VCQwlyLCBybCwgcjUKKwlsZHIJcmwsIFtycCwgIzRdCisJbW92CXI1LCAjMAorCXVtbGFsCXI0LCByNSwgdWwsIHZsCisJc3RyCXIsIFtycF0sICM0CitMKGluKToJbGRyCXVsLCBbdXBdLCAjNAorCUFERFNVQkMJciwgcmwsIHI0CisJbGRyCXJsLCBbcnAsICM0XQorCW1vdglyNCwgIzAKKwl1bWxhbAlyNSwgcjQsIHVsLCB2bAorCXN0cglyLCBbcnBdLCAjNAorCWxkcgl1bCwgW3VwXSwgIzQKKwlBRERTVUJDCXIsIHJsLCByNQorCWxkcglybCwgW3JwLCAjNF0KKwltb3YJcjUsICMwCisJdW1sYWwJcjQsIHI1LCB1bCwgdmwKKwlzdHIJciwgW3JwXSwgIzQKKwlsZHIJdWwsIFt1cF0sICM0CisJQUREU1VCQwlyLCBybCwgcjQKKwlsZHIJcmwsIFtycCwgIzRdCisJbW92CXI0LCAjMAorCXVtbGFsCXI1LCByNCwgdWwsIHZsCisJc3ViCW4sIG4sICM0CisJdHN0CW4sIG4KKwlzdHIJciwgW3JwXSwgIzQKKwlibmUJTCh0b3ApCisKKwlBRERTVUJDCXIsIHJsLCByNQorCXN0cglyLCBbcnBdCisKK0wocnRuKToJUkVUVkFMKAlyNCkKKwlsZG1mZAlzcCEsIHsgcjQtcjYsIHBjIH0KK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vYXJtLWRlZnMubTQgYi9tcG4vYXJtL2FybS1kZWZzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNGZhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL2FybS1kZWZzLm00CkBAIC0wLDAgKzEsMTAwIEBACitkaXZlcnQoLTEpCisKK2RubCAgbTQgbWFjcm9zIGZvciBBUk0gYXNzZW1ibGVyLgorCitkbmwgIENvcHlyaWdodCAyMDAxLCAyMDEyLTIwMTYsIDIwMTgtMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2RubCAgU3RhbmRhcmQgY29tbWVudGluZyBpcyB3aXRoIEAsIHRoZSBkZWZhdWx0IG00ICMgaXMgZm9yIGNvbnN0YW50cyBhbmQgd2UKK2RubCAgZG9uJ3Qgd2FudCB0byBkaXNhYmxlIG1hY3JvIGV4cGFuc2lvbnMgaW4gb3IgYWZ0ZXIgdGhlbS4KKworY2hhbmdlY29tKEAmKiQpCisKK2RlZmluZShgQVNNX1NUQVJUJywKK200X2Fzc2VydF9udW1hcmdzX3JhbmdlKDAsMSkKK2BpZmVsc2UoJDEsYG5lb24nLGAuZnB1CW5lb24nLAorICAgICAgICAkMSwsYCcsCisgICAgICAgIDEsMSxgbTRfZXJyb3IoYCQwIGdvdCBpbnZhbGlkIGFyZ3VtZW50ICQxJyknKScpCisKK2RubCAgQVBDUyByZWdpc3RlciBuYW1lcy4KKworZGVmbGl0KGExLHIwKQorZGVmbGl0KGEyLHIxKQorZGVmbGl0KGEzLHIyKQorZGVmbGl0KGE0LHIzKQorZG5sIGRlZmxpdCh2MSxyNCkKK2RubCBkZWZsaXQodjIscjUpCitkbmwgZGVmbGl0KHYzLHI2KQorZG5sIGRlZmxpdCh2NCxyNykKK2RubCBkZWZsaXQodjUscjgpCitkbmwgZGVmbGl0KHY2LHI5KQorZGVmbGl0KHNiLHI5KQorZG5sIGRlZmxpdCh2NyxyMTApCitkZWZsaXQoc2wscjEwKQorZGVmbGl0KGZwLHIxMSkKK2RlZmxpdChpcCxyMTIpCitkbmwgZGVmbGl0KHNwLHIxMykKK2RlZmxpdChscixyMTQpCitkZWZsaXQocGMscjE1KQorCisKK2RlZmluZShgbGVhX2xpc3QnLCBgJykKK2RlZmluZShgbGVhX251bScsMCkKKworZG5sICBMRUEocmVnLGdtcF9zeW1ib2wpCitkbmwKK2RubCAgTG9hZCB0aGUgYWRkcmVzcyBvZiBnbXBfc3ltYm9sIGludG8gYSByZWdpc3Rlci4gIFRoZSBnbXBfc3ltYm9sIG11c3QgYmUKK2RubCAgZWl0aGVyIGxvY2FsIG9yIHByb3RlY3RlZC9oaWRkZW4sIHNpbmNlIHdlIGFzc3VtZSBpdCBoYXMgYSBmaXhlZCBkaXN0YW5jZQorZG5sICBmcm9tIHRoZSBwb2ludCBvZiB1c2UuCisKK2RlZmluZShgTEVBJyxgZG5sCitsZHIJJDEsIEwocHRyYCdsZWFfbnVtKQoraWZkZWYoYFBJQycsZG5sCitgZG5sCitMKGJhc2AnbGVhX251bSk6ZG5sCisJYWRkCSQxLCAkMSwgcGNgJ2RubAorCW00YXBwZW5kKGBsZWFfbGlzdCcsYAorTChwdHInbGVhX251bWApOgkud29yZAlHU1lNX1BSRUZJWGAnJDItTChiYXMnbGVhX251bWApLTgnKQorCWRlZmluZShgbGVhX251bScsIGV2YWwobGVhX251bSsxKSlkbmwKKycsYGRubAorCW00YXBwZW5kKGBsZWFfbGlzdCcsYAorTChwdHInbGVhX251bWApOgkud29yZAlHU1lNX1BSRUZJWGAnJDInKQorCWRlZmluZShgbGVhX251bScsIGV2YWwobGVhX251bSsxKSlkbmwKKycpZG5sCisnKQorCitkZWZpbmUoYHJldHVybicsYGlmZGVmKGBOT1RIVU1CJyxgbW92CXBjLCAnLGBieCcpJykKKworCitkZWZpbmUoYEVQSUxPR1VFX2NwdScsCitgbGVhX2xpc3QKKwlTSVpFKGAkMScsLi1gJDEnKScKK2BkZWZpbmUoYGxlYV9saXN0JywgYCcpJykKKworZGl2ZXJ0CmRpZmYgLS1naXQgYS9tcG4vYXJtL2JkaXZfZGJtMWMuYXNtIGIvbXBuL2FybS9iZGl2X2RibTFjLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmMxY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9iZGl2X2RibTFjLmFzbQpAQCAtMCwwICsxLDExMyBAQAorZG5sICBBUk0gbXBuX2JkaXZfZGJtMWMuCisKK2RubCAgQ29weXJpZ2h0IDIwMDgsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDQuMjUKK0MgQ29ydGV4LUExNQkgMi41CisKK0MgVE9ETworQyAgKiBUcnkgdXNpbmcgdW1sYWwgb3IgdW1hYWwuCitDICAqIFRyeSB1c2luZyBsZG0vc3RtLgorCitkZWZpbmUoYHFwJywJICBgcjAnKQorZGVmaW5lKGB1cCcsCSAgYHIxJykKK2RlZmluZShgbicsCSAgYHIyJykKK2RlZmluZShgYmQnLAkgIGByMycpCitkZWZpbmUoYGN5JywJICBgc3AsIzAnKQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9iZGl2X2RibTFjKQorCXB1c2gJe3I0LCByNSwgcjYsIHI3LCByOH0KKwlsZHIJcjQsIFt1cF0sICM0CisJbGRyCXI1LCBbc3AsICMyMF0KKwlhbmRzCXIxMiwgbiwgIzMKKwliZXEJTChmaTApCisJY21wCXIxMiwgIzIKKwliY2MJTChmaTEpCisJYmVxCUwoZmkyKQorCitMKGZpMyk6CXVtdWxsCXI4LCByMTIsIHI0LCBiZAorCWxkcglyNCwgW3VwXSwgIzQKKwliCUwobG8zKQorCitMKGZpMCk6CXVtdWxsCXI2LCByNywgcjQsIGJkCisJbGRyCXI0LCBbdXBdLCAjNAorCWIJTChsbzApCisKK0woZmkxKToJc3VicwluLCBuLCAjMQorCXVtdWxsCXI4LCByMTIsIHI0LCBiZAorCWJscwlMKHdkMSkKKwlsZHIJcjQsIFt1cF0sICM0CisJYglMKGxvMSkKKworTChmaTIpOgl1bXVsbAlyNiwgcjcsIHI0LCBiZAorCWxkcglyNCwgW3VwXSwgIzQKKwliCUwobG8yKQorCitMKHRvcCk6CWxkcglyNCwgW3VwXSwgIzQKKwlzdWJzCXI1LCByNSwgcjYKKwlzdHIJcjUsIFtxcF0sICM0CisJc2JjCXI1LCByNSwgcjcKK0wobG8xKToJdW11bGwJcjYsIHI3LCByNCwgYmQKKwlsZHIJcjQsIFt1cF0sICM0CisJc3VicwlyNSwgcjUsIHI4CisJc3RyCXI1LCBbcXBdLCAjNAorCXNiYwlyNSwgcjUsIHIxMgorTChsbzApOgl1bXVsbAlyOCwgcjEyLCByNCwgYmQKKwlsZHIJcjQsIFt1cF0sICM0CisJc3VicwlyNSwgcjUsIHI2CisJc3RyCXI1LCBbcXBdLCAjNAorCXNiYwlyNSwgcjUsIHI3CitMKGxvMyk6CXVtdWxsCXI2LCByNywgcjQsIGJkCisJbGRyCXI0LCBbdXBdLCAjNAorCXN1YnMJcjUsIHI1LCByOAorCXN0cglyNSwgW3FwXSwgIzQKKwlzYmMJcjUsIHI1LCByMTIKK0wobG8yKToJc3VicwluLCBuLCAjNAorCXVtdWxsCXI4LCByMTIsIHI0LCBiZAorCWJoaQlMKHRvcCkKKworTCh3ZDIpOglzdWJzCXI1LCByNSwgcjYKKwlzdHIJcjUsIFtxcF0sICM0CisJc2JjCXI1LCByNSwgcjcKK0wod2QxKToJc3VicwlyNSwgcjUsIHI4CisJc3RyCXI1LCBbcXBdCisJc2JjCXIwLCByNSwgcjEyCisJcG9wCXtyNCwgcjUsIHI2LCByNywgcjh9CisJcmV0dXJuCWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL2JkaXZfcV8xLmFzbSBiL21wbi9hcm0vYmRpdl9xXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODljZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL2JkaXZfcV8xLmFzbQpAQCAtMCwwICsxLDE2MiBAQAorZG5sICBBUk0gdjQgbXBuX2JkaXZfcV8xLCBtcG5fcGkxX2JkaXZfcV8xIC0tIEhlbnNlbCBkaXZpc2lvbiBieSAxLWxpbWIgZGl2aXNvci4KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEyLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MgICAgICAgICAgICAgICBjeWNsZXMvbGltYgorQyAgICAgICAgICAgICAgIG5vcm0gICB1bm9ybQorQyAxMTc2CQkxMwkxOAorQyBDb3J0ZXgtQTUJIDgJMTIKK0MgQ29ydGV4LUE3CTEwLjUJMTgKK0MgQ29ydGV4LUE4CTE0CTE1CitDIENvcnRleC1BOQkxMAkxMgkJbm90IG1lYXN1cmVkIHNpbmNlIGxhdGVzdCBlZGl0cworQyBDb3J0ZXgtQTE1CSA5CSA5CitDIENvcnRleC1BNTMJMTQJMjAKKworQyBBcmNoaXRlY3R1cmUgcmVxdWlyZW1lbnRzOgorQyB2NQktCitDIHY1dAktCitDIHY1dGUJLQorQyB2NgktCitDIHY2dDIJLQorQyB2N2EJLQorCitkZWZpbmUoYHJwJywgIGByMCcpCitkZWZpbmUoYHVwJywgIGByMScpCitkZWZpbmUoYG4nLCAgIGByMicpCitkZWZpbmUoYGQnLCAgIGByMycpCitkZWZpbmUoYGRpX2FyZycsICBgc3BbMF0nKQkJQwlqdXN0IG1wbl9waTFfYmRpdl9xXzEKK2RlZmluZShgY250X2FyZycsIGBzcFs0XScpCQlDCWp1c3QgbXBuX3BpMV9iZGl2X3FfMQorCitkZWZpbmUoYGN5JywgIGByNycpCitkZWZpbmUoYGNudCcsIGByNicpCitkZWZpbmUoYHRuYycsIGByOCcpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fYmRpdl9xXzEpCisJdHN0CWQsICMxCisJcHVzaAl7cjYtcjExfQorCW1vdgljbnQsICMwCisJYm5lCUwoaW52KQorCitDIGNvdW50IHRyYWlsaW5nIHplcm9zCisJbW92cwlyMTAsIGQsIGxzbCAjMTYKKwltb3ZlcQlkLCBkLCBsc3IgIzE2CisJbW92ZXEJY250LCAjMTYKKwl0c3QJZCwgIzB4ZmYKKwltb3ZlcQlkLCBkLCBsc3IgIzgKKwlhZGRlcQljbnQsIGNudCwgIzgKKwlMRUEoCXIxMCwgY3R6X3RhYikKKwlhbmQJcjExLCBkLCAjMHhmZgorCWxkcmIJcjEwLCBbcjEwLCByMTFdCisJbW92CWQsIGQsIGxzciByMTAKKwlhZGQJY250LCBjbnQsIHIxMAorCitDIGJpbnZlcnQgbGltYgorTChpbnYpOglMRUEoCXIxMCwgYmludmVydF9saW1iX3RhYmxlKQorCWFuZAlyMTIsIGQsICMyNTQKKwlsZHJiCXIxMCwgW3IxMCwgcjEyLCBsc3IgIzFdCisJbXVsCXIxMiwgcjEwLCByMTAKKwltdWwJcjEyLCBkLCByMTIKKwlyc2IJcjEyLCByMTIsIHIxMCwgbHNsICMxCisJbXVsCXIxMCwgcjEyLCByMTIKKwltdWwJcjEwLCBkLCByMTAKKwlyc2IJcjEwLCByMTAsIHIxMiwgbHNsICMxCUMgcjEwID0gaW52ZXJzZQorCWIJTChwaTEpCitFUElMT0dVRSgpCisKK1BST0xPR1VFKG1wbl9waTFfYmRpdl9xXzEpCisJcHVzaAl7cjYtcjExfQorCisJbGRyCWNudCwgW3NwLCAjMjhdCisJbGRyCXIxMCwgW3NwLCAjMjRdCisKK0wocGkxKToJbGRyCXIxMSwgW3VwXSwgIzQJCUMgdXBbMF0KKwljbXAJY250LCAjMAorCW1vdgljeSwgIzAKKwlibmUJTCh1bm9ybSkKKworTChub3JtKToKKwlzdWJzCW4sIG4sICMxCQlDIHNldCBjYXJyeSBhcyBzaWRlLWVmZmVjdAorCWJlcQlMKGVkbikKKworCUFMSUdOKDE2KQorTCh0cG4pOglzYmNzCWN5LCByMTEsIGN5CisJbGRyCXIxMSwgW3VwXSwgIzQKKwlzdWIJbiwgbiwgIzEKKwltdWwJcjksIHIxMCwgY3kKKwl0c3QJbiwgbgorCXVtdWxsCXIxMiwgY3ksIGQsIHI5CisJc3RyCXI5LCBbcnBdLCAjNAorCWJuZQlMKHRwbikKKworTChlZG4pOglzYmMJY3ksIHIxMSwgY3kKKwltdWwJcjksIHIxMCwgY3kKKwlzdHIJcjksIFtycF0KKwlwb3AJe3I2LXIxMX0KKwlyZXR1cm4JcjE0CisKK0wodW5vcm0pOgorCXJzYgl0bmMsIGNudCwgIzMyCisJbW92CXIxMSwgcjExLCBsc3IgY250CisJc3VicwluLCBuLCAjMQkJQyBzZXQgY2FycnkgYXMgc2lkZS1lZmZlY3QKKwliZXEJTChlZHUpCisKKwlBTElHTigxNikKK0wodHB1KToJbGRyCXIxMiwgW3VwXSwgIzQKKwlvcnIJcjksIHIxMSwgcjEyLCBsc2wgdG5jCisJbW92CXIxMSwgcjEyLCBsc3IgY250CisJc2JjcwljeSwgcjksIGN5CQlDIGNyaXRpY2FsIHBhdGggLT5jeS0+Y3ktPgorCXN1YgluLCBuLCAjMQorCW11bAlyOSwgcjEwLCBjeQkJQyBjcml0aWNhbCBwYXRoIC0+Y3ktPnI5LT4KKwl0c3QJbiwgbgorCXVtdWxsCXIxMiwgY3ksIGQsIHI5CQlDIGNyaXRpY2FsIHBhdGggLT5yOS0+Y3ktPgorCXN0cglyOSwgW3JwXSwgIzQKKwlibmUJTCh0cHUpCisKK0woZWR1KToJc2JjCWN5LCByMTEsIGN5CisJbXVsCXI5LCByMTAsIGN5CisJc3RyCXI5LCBbcnBdCisJcG9wCXtyNi1yMTF9CisJcmV0dXJuCXIxNAorRVBJTE9HVUUoKQorCisJUk9EQVRBCitjdHpfdGFiOgorCS5ieXRlCTgsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTcsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTYsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMAorCS5ieXRlCTUsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAsNCwwLDEsMCwyLDAsMSwwLDMsMCwxLDAsMiwwLDEsMApkaWZmIC0tZ2l0IGEvbXBuL2FybS9jbmRfYW9yc19uLmFzbSBiL21wbi9hcm0vY25kX2FvcnNfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzZDFmYQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vY25kX2FvcnNfbi5hc20KQEAgLTAsMCArMSwxMzQgQEAKK2RubCAgQVJNIG1wbl9jbmRfYWRkX24sIG1wbl9jbmRfc3ViX24KKworZG5sICBDb3B5cmlnaHQgMjAxMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSA/CitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgMworQyBDb3J0ZXgtQTE1CSAyLjUKKworZGVmaW5lKGBjbmQnLAlgcjAnKQorZGVmaW5lKGBycCcsCWByMScpCitkZWZpbmUoYHVwJywJYHIyJykKK2RlZmluZShgdnAnLAlgcjMnKQorCitkZWZpbmUoYG4nLAlgcjEyJykKKworCitpZmRlZihgT1BFUkFUSU9OX2NuZF9hZGRfbicsIGAKKwlkZWZpbmUoYEFERFNVQicsICAgICAgYWRkcykKKwlkZWZpbmUoYEFERFNVQkMnLCAgICAgIGFkY3MpCisJZGVmaW5lKGBJTklUQ1knLCAgICAgIGBjbW4JcjAsICMwJykKKwlkZWZpbmUoYFJFVFZBTCcsICAgICAgYGFkYwlyMCwgbiwgIzAnKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fY25kX2FkZF9uKScpCitpZmRlZihgT1BFUkFUSU9OX2NuZF9zdWJfbicsIGAKKwlkZWZpbmUoYEFERFNVQicsICAgICAgc3VicykKKwlkZWZpbmUoYEFERFNVQkMnLCAgICAgIHNiY3MpCisJZGVmaW5lKGBJTklUQ1knLCAgICAgIGBjbXAJcjAsICMwJykKKwlkZWZpbmUoYFJFVFZBTCcsICAgICAgYGFkYwlyMCwgbiwgIzAKKwkJCSAgICAgIHJzYglyMCwgcjAsICMxJykKKwlkZWZpbmUoZnVuYywJICAgICAgbXBuX2NuZF9zdWJfbiknKQorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9jbmRfYWRkX24gbXBuX2NuZF9zdWJfbikKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKGZ1bmMpCisJcHVzaAl7cjQtcjExfQorCWxkcgluLCBbc3AsICMzMl0KKworCWNtcAljbmQsICMxCisJc2JjCWNuZCwgY25kLCBjbmQJCUMgY29uZGl0aW9uYWxseSBzZXQgdG8gMHhmZmZmZmZmZgorCisJSU5JVENZCQkJCUMgcmVhbGx5IG9ubHkgbmVlZGVkIGZvciBuID0gMCAobW9kIDQpCisKKwlhbmRzCXI0LCBuLCAjMworCWJlcQlMKHRvcCkKKwljbXAJcjQsICMyCisJYmNjCUwoYjEpCisJYmVxCUwoYjIpCisKK0woYjMpOglsZG0JdnAhLCB7cjQscjUscjZ9CisJbGRtCXVwISwge3I4LHI5LHIxMH0KKwliaWMJcjQsIHI0LCBjbmQKKwliaWMJcjUsIHI1LCBjbmQKKwliaWMJcjYsIHI2LCBjbmQKKwlBRERTVUIJcjgsIHI4LCByNAorCUFERFNVQkMJcjksIHI5LCByNQorCUFERFNVQkMJcjEwLCByMTAsIHI2CisJc3RtCXJwISwge3I4LHI5LHIxMH0KKwlzdWIJbiwgbiwgIzMKKwl0ZXEJbiwgIzAKKwlibmUJTCh0b3ApCisJYglMKGVuZCkKKworTChiMik6CWxkbQl2cCEsIHtyNCxyNX0KKwlsZG0JdXAhLCB7cjgscjl9CisJYmljCXI0LCByNCwgY25kCisJYmljCXI1LCByNSwgY25kCisJQUREU1VCCXI4LCByOCwgcjQKKwlBRERTVUJDCXI5LCByOSwgcjUKKwlzdG0JcnAhLCB7cjgscjl9CisJc3ViCW4sIG4sICMyCisJdGVxCW4sICMwCisJYm5lCUwodG9wKQorCWIJTChlbmQpCisKK0woYjEpOglsZHIJcjQsIFt2cF0sICM0CisJbGRyCXI4LCBbdXBdLCAjNAorCWJpYwlyNCwgcjQsIGNuZAorCUFERFNVQglyOCwgcjgsIHI0CisJc3RyCXI4LCBbcnBdLCAjNAorCXN1YgluLCBuLCAjMQorCXRlcQluLCAjMAorCWJlcQlMKGVuZCkKKworTCh0b3ApOglsZG0JdnAhLCB7cjQscjUscjYscjd9CisJbGRtCXVwISwge3I4LHI5LHIxMCxyMTF9CisJYmljCXI0LCByNCwgY25kCisJYmljCXI1LCByNSwgY25kCisJYmljCXI2LCByNiwgY25kCisJYmljCXI3LCByNywgY25kCisJQUREU1VCQwlyOCwgcjgsIHI0CisJQUREU1VCQwlyOSwgcjksIHI1CisJQUREU1VCQwlyMTAsIHIxMCwgcjYKKwlBRERTVUJDCXIxMSwgcjExLCByNworCXN1YgluLCBuLCAjNAorCXN0bQlycCEsIHtyOCxyOSxyMTAscjExfQorCXRlcQluLCAjMAorCWJuZQlMKHRvcCkKKworTChlbmQpOglSRVRWQUwKKwlwb3AJe3I0LXIxMX0KKwlyZXR1cm4JcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL2NvbS5hc20gYi9tcG4vYXJtL2NvbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5MDMzZgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vY29tLmFzbQpAQCAtMCwwICsxLDc1IEBACitkbmwgIEFSTSBtcG5fY29tLgorCitkbmwgIENvcHlyaWdodCAyMDAzLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk0JID8KK0MgWFNjYWxlCSA/CitDIENvcnRleC1BNwkgPworQyBDb3J0ZXgtQTgJID8KK0MgQ29ydGV4LUE5CSAyLjAKK0MgQ29ydGV4LUExNQkgMS43NQorCitkZWZpbmUoYHJwJywgYHIwJykKK2RlZmluZShgdXAnLCBgcjEnKQorZGVmaW5lKGBuJywgIGByMicpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fY29tKQorCXRzdAluLCAjMQorCWJlcQlMKHNraXAxKQorCWxkcglyMywgW3VwXSwgIzQKKwltdm4JcjMsIHIzCisJc3RyCXIzLCBbcnBdLCAjNAorTChza2lwMSk6CisJdHN0CW4sICMyCisJYmVxCUwoc2tpcDIpCisJbGRtaWEJdXAhLCB7IHIzLCByMTIgfQkJQyBsb2FkIDIgbGltYnMKKwltdm4JcjMsIHIzCisJbXZuCXIxMiwgcjEyCisJc3RtaWEJcnAhLCB7IHIzLCByMTIgfQkJQyBzdG9yZSAyIGxpbWJzCitMKHNraXAyKToKKwliaWNzCW4sIG4sICMzCisJYmVxCUwocnRuKQorCXN0bWZkCXNwISwgeyByNywgcjgsIHI5IH0JCUMgc2F2ZSByZWdzIG9uIHN0YWNrCisKK0wodG9wKToJbGRtaWEJdXAhLCB7IHIzLCByOCwgcjksIHIxMiB9CUMgbG9hZCA0IGxpbWJzCisJc3VicwluLCBuLCAjNAorCW12bglyMywgcjMKKwltdm4JcjgsIHI4CisJbXZuCXI5LCByOQorCW12bglyMTIsIHIxMgorCXN0bWlhCXJwISwgeyByMywgcjgsIHI5LCByMTIgfQlDIHN0b3JlIDQgbGltYnMKKwlibmUJTCh0b3ApCisKKwlsZG1mZAlzcCEsIHsgcjcsIHI4LCByOSB9CQlDIHJlc3RvcmUgcmVncyBmcm9tIHN0YWNrCitMKHJ0bik6CXJldHVybglscgorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9jb3B5ZC5hc20gYi9tcG4vYXJtL2NvcHlkLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjNjODY0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9jb3B5ZC5hc20KQEAgLTAsMCArMSw4NCBAQAorZG5sICBBUk0gbXBuX2NvcHlkLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBSb2JlcnQgSGFybGV5IGFuZCBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMDMsIDIwMTIsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDEuMjUtMS41CitDIENvcnRleC1BMTUJIDEuMjUKKworQyBUT0RPCitDICAqIENvbnNpZGVyIHdpZGVyIHVucm9sbGluZy4gIEFuYWxvZ291cyA4LXdheSBjb2RlIHJ1bnMgMTAlIGZhc3RlciBvbiBib3RoIEE5CitDICAgIGFuZCBBMTUuICBCdXQgaXQgcHJvYmFibHkgc2xvd3MgdGhpbmdzIGRvd24gZm9yIDggPD0gbiA8IGEgZmV3IGRvemVuLgorCitkZWZpbmUoYHJwJywgYHIwJykKK2RlZmluZShgdXAnLCBgcjEnKQorZGVmaW5lKGBuJywgIGByMicpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fY29weWQpCisJbW92CXIxMiwgbiwgbHNsICMyCisJc3ViCXIxMiwgcjEyLCAjNAorCWFkZAlycCwgcnAsIHIxMgorCWFkZAl1cCwgdXAsIHIxMgorCisJdHN0CW4sICMxCisJYmVxCUwoc2tpcDEpCisJbGRyCXIzLCBbdXBdLCAjLTQKKwlzdHIJcjMsIFtycF0sICMtNAorTChza2lwMSk6CisJdHN0CW4sICMyCisJYmVxCUwoc2tpcDIpCisJbGRtZGEJdXAhLCB7IHIzLHIxMiB9CisJc3RtZGEJcnAhLCB7IHIzLHIxMiB9CitMKHNraXAyKToKKwliaWNzCW4sIG4sICMzCisJYmVxCUwocnRuKQorCisJcHVzaAl7IHI0LXI1IH0KKwlzdWJzCW4sIG4sICM0CisJbGRtZGEJdXAhLCB7IHIzLHI0LHI1LHIxMiB9CisJYmVxCUwoZW5kKQorCitMKHRvcCk6CXN1YnMJbiwgbiwgIzQKKwlzdG1kYQlycCEsIHsgcjMscjQscjUscjEyIH0KKwlsZG1kYQl1cCEsIHsgcjMscjQscjUscjEyIH0KKwlibmUJTCh0b3ApCisKK0woZW5kKToJc3RtZGEJcnAsIHsgcjMscjQscjUscjEyIH0KKwlwb3AJeyByNC1yNSB9CitMKHJ0bik6CXJldHVybglscgorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9jb3B5aS5hc20gYi9tcG4vYXJtL2NvcHlpLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTcwNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9jb3B5aS5hc20KQEAgLTAsMCArMSw3OSBAQAorZG5sICBBUk0gbXBuX2NvcHlpLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBSb2JlcnQgSGFybGV5IGFuZCBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMDMsIDIwMTIsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDEuMjUtMS41CitDIENvcnRleC1BMTUJIDEuMjUKKworQyBUT0RPCitDICAqIENvbnNpZGVyIHdpZGVyIHVucm9sbGluZy4gIEFuYWxvZ291cyA4LXdheSBjb2RlIHJ1bnMgMTAlIGZhc3RlciBvbiBib3RoIEE5CitDICAgIGFuZCBBMTUuICBCdXQgaXQgcHJvYmFibHkgc2xvd3MgdGhpbmdzIGRvd24gZm9yIDggPD0gbiA8IGEgZmV3IGRvemVuLgorCitkZWZpbmUoYHJwJywgYHIwJykKK2RlZmluZShgdXAnLCBgcjEnKQorZGVmaW5lKGBuJywgIGByMicpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fY29weWkpCisJdHN0CW4sICMxCisJYmVxCUwoc2tpcDEpCisJbGRyCXIzLCBbdXBdLCAjNAorCXN0cglyMywgW3JwXSwgIzQKK0woc2tpcDEpOgorCXRzdAluLCAjMgorCWJlcQlMKHNraXAyKQorCWxkbWlhCXVwISwgeyByMyxyMTIgfQorCXN0bWlhCXJwISwgeyByMyxyMTIgfQorTChza2lwMik6CisJYmljcwluLCBuLCAjMworCWJlcQlMKHJ0bikKKworCXB1c2gJeyByNC1yNSB9CisJc3VicwluLCBuLCAjNAorCWxkbWlhCXVwISwgeyByMyxyNCxyNSxyMTIgfQorCWJlcQlMKGVuZCkKKworTCh0b3ApOglzdWJzCW4sIG4sICM0CisJc3RtaWEJcnAhLCB7IHIzLHI0LHI1LHIxMiB9CisJbGRtaWEJdXAhLCB7IHIzLHI0LHI1LHIxMiB9CisJYm5lCUwodG9wKQorCitMKGVuZCk6CXN0bQlycCwgeyByMyxyNCxyNSxyMTIgfQorCXBvcAl7IHI0LXI1IH0KK0wocnRuKToJcmV0dXJuCWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL2RpdmVfMS5hc20gYi9tcG4vYXJtL2RpdmVfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlZmIxYQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vZGl2ZV8xLmFzbQpAQCAtMCwwICsxLDE1MSBAQAorZG5sICBBUk0gdjQgbXBuX2RpdmV4YWN0XzEuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MgICAgICAgICAgICAgICBjeWNsZXMvbGltYiAgICAgICBjeWNsZXMvbGltYgorQyAgICAgICAgICAgICAgIG5vcm0gICAgdW5vcm0gICAgbW9kZXhhY3RfMWNfb2RkCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJMTAJMTIKK0MgQ29ydGV4LUExNQkgOQkgOQorCitDIEFyY2hpdGVjdHVyZSByZXF1aXJlbWVudHM6CitDIHY1CS0KK0MgdjV0CS0KK0MgdjV0ZQktCitDIHY2CS0KK0MgdjZ0MgktCitDIHY3YQktCisKK2RlZmluZShgcnAnLCBgcjAnKQorZGVmaW5lKGB1cCcsIGByMScpCitkZWZpbmUoYG4nLCAgYHIyJykKK2RlZmluZShgZCcsICBgcjMnKQorCitkZWZpbmUoYGN5JywgYHI3JykKK2RlZmluZShgY250JywgYHI2JykKK2RlZmluZShgdG5jJywgYHI4JykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9kaXZleGFjdF8xKQorCXRzdAlkLCAjMQorCXB1c2gJe3I0LXI5fQorCW1vdgljbnQsICMwCisJYm5lCUwoaW52KQorCitDIGNvdW50IHRyYWlsaW5nIHplcm9zCisJbW92cwlyNCwgZCwgbHNsICMxNgorCW1vdmVxCWQsIGQsIGxzciAjMTYKKwltb3ZlcQljbnQsICMxNgorCXRzdAlkLCAjMHhmZgorCW1vdmVxCWQsIGQsIGxzciAjOAorCWFkZGVxCWNudCwgY250LCAjOAorCUxFQSgJcjQsIGN0el90YWIpCisJYW5kCXI1LCBkLCAjMHhmZgorCWxkcmIJcjQsIFtyNCwgcjVdCisJbW92CWQsIGQsIGxzciByNAorCWFkZAljbnQsIGNudCwgcjQKKworQyBiaW52ZXJ0IGxpbWIKK0woaW52KToJTEVBKAlyNCwgYmludmVydF9saW1iX3RhYmxlKQorCWFuZAlyMTIsIGQsICMyNTQKKwlsZHJiCXI0LCBbcjQsIHIxMiwgbHNyICMxXQorCW11bAlyMTIsIHI0LCByNAorCW11bAlyMTIsIGQsIHIxMgorCXJzYglyMTIsIHIxMiwgcjQsIGxzbCAjMQorCW11bAlyNCwgcjEyLCByMTIKKwltdWwJcjQsIGQsIHI0CisJcnNiCXI0LCByNCwgcjEyLCBsc2wgIzEJQyByNCA9IGludmVyc2UKKworCXRzdAljbnQsIGNudAorCWxkcglyNSwgW3VwXSwgIzQJCUMgdXBbMF0KKwltb3YJY3ksICMwCisJYm5lCUwodW5ub3JtKQorCitMKG5vcm0pOgorCXN1YnMJbiwgbiwgIzEJCUMgc2V0IGNhcnJ5IGFzIHNpZGUtZWZmZWN0CisJYmVxCUwoZWRuKQorCisJQUxJR04oMTYpCitMKHRwbik6CXNiY3MJY3ksIHI1LCBjeQorCWxkcglyNSwgW3VwXSwgIzQKKwlzdWIJbiwgbiwgIzEKKwltdWwJcjksIHI0LCBjeQorCXRzdAluLCBuCisJdW11bGwJcjEyLCBjeSwgZCwgcjkKKwlzdHIJcjksIFtycF0sICM0CisJYm5lCUwodHBuKQorCitMKGVkbik6CXNiYwljeSwgcjUsIGN5CisJbXVsCXI5LCByNCwgY3kKKwlzdHIJcjksIFtycF0KKwlwb3AJe3I0LXI5fQorCXJldHVybglyMTQKKworTCh1bm5vcm0pOgorCXJzYgl0bmMsIGNudCwgIzMyCisJbW92CXI1LCByNSwgbHNyIGNudAorCXN1YnMJbiwgbiwgIzEJCUMgc2V0IGNhcnJ5IGFzIHNpZGUtZWZmZWN0CisJYmVxCUwoZWR1KQorCisJQUxJR04oMTYpCitMKHRwdSk6CWxkcglyMTIsIFt1cF0sICM0CisJb3JyCXI5LCByNSwgcjEyLCBsc2wgdG5jCisJbW92CXI1LCByMTIsIGxzciBjbnQKKwlzYmNzCWN5LCByOSwgY3kJCUMgY3JpdGljYWwgcGF0aCAtPmN5LT5jeS0+CisJc3ViCW4sIG4sICMxCisJbXVsCXI5LCByNCwgY3kJCUMgY3JpdGljYWwgcGF0aCAtPmN5LT5yOS0+CisJdHN0CW4sIG4KKwl1bXVsbAlyMTIsIGN5LCBkLCByOQkJQyBjcml0aWNhbCBwYXRoIC0+cjktPmN5LT4KKwlzdHIJcjksIFtycF0sICM0CisJYm5lCUwodHB1KQorCitMKGVkdSk6CXNiYwljeSwgcjUsIGN5CisJbXVsCXI5LCByNCwgY3kKKwlzdHIJcjksIFtycF0KKwlwb3AJe3I0LXI5fQorCXJldHVybglyMTQKK0VQSUxPR1VFKCkKKworCVJPREFUQQorY3R6X3RhYjoKKwkuYnl0ZQk4LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk2LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk3LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk2LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKKwkuYnl0ZQk1LDAsMSwwLDIsMCwxLDAsMywwLDEsMCwyLDAsMSwwLDQsMCwxLDAsMiwwLDEsMCwzLDAsMSwwLDIsMCwxLDAKZGlmZiAtLWdpdCBhL21wbi9hcm0vZ21wLW1wYXJhbS5oIGIvbXBuL2FybS9nbXAtbXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlZWMzYQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vZ21wLW1wYXJhbS5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiBnbXAtbXBhcmFtLmggLS0gQ29tcGlsZXIvbWFjaGluZSBwYXJhbWV0ZXIgaGVhZGVyIGZpbGUuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk5LTIwMDMsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgMzIKKyNkZWZpbmUgR01QX0xJTUJfQllURVMgNAorCisvKiAxMTkzTUh6IEFSTSAoZ2NjNTUuZnNmZnJhbmNlLm9yZykgKi8KKworI2RlZmluZSBESVZSRU1fMV9OT1JNX1RIUkVTSE9MRCAgICAgICAgICAgICAgMCAgLyogcHJlaW52IGFsd2F5cyAqLworI2RlZmluZSBESVZSRU1fMV9VTk5PUk1fVEhSRVNIT0xEICAgICAgICAgICAgMCAgLyogYWx3YXlzICovCisjZGVmaW5lIE1PRF8xX05PUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAwICAvKiBhbHdheXMgKi8KKyNkZWZpbmUgTU9EXzFfVU5OT1JNX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAqLworI2RlZmluZSBNT0RfMU5fVE9fTU9EXzFfMV9USFJFU0hPTEQgICAgICAgICA1NgorI2RlZmluZSBNT0RfMVVfVE9fTU9EXzFfMV9USFJFU0hPTEQgICAgICAgICAxMQorI2RlZmluZSBNT0RfMV8xX1RPX01PRF8xXzJfVEhSRVNIT0xEICAgICAgICAgMCAgLyogbmV2ZXIgbXBuX21vZF8xXzFwICovCisjZGVmaW5lIE1PRF8xXzJfVE9fTU9EXzFfNF9USFJFU0hPTEQgICAgIE1QX1NJWkVfVF9NQVgKKyNkZWZpbmUgUFJFSU5WX01PRF8xX1RPX01PRF8xX1RIUkVTSE9MRCAgICAgNzEKKyNkZWZpbmUgVVNFX1BSRUlOVl9ESVZSRU1fMSAgICAgICAgICAgICAgICAgIDEgIC8qIHByZWludiBhbHdheXMgKi8KKyNkZWZpbmUgRElWUkVNXzJfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgIDAgIC8qIHByZWludiBhbHdheXMgKi8KKyNkZWZpbmUgRElWRVhBQ1RfMV9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAqLworI2RlZmluZSBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEICAgICAgICAgICA0MQorCisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIE1VTF9UT09NMzNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMTI1CisjZGVmaW5lIE1VTF9UT09NNDRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMTkzCisjZGVmaW5lIE1VTF9UT09NNkhfVEhSRVNIT0xEICAgICAgICAgICAgICAgMzAzCisjZGVmaW5lIE1VTF9UT09NOEhfVEhSRVNIT0xEICAgICAgICAgICAgICAgNDE4CisKKyNkZWZpbmUgTVVMX1RPT00zMl9UT19UT09NNDNfVEhSRVNIT0xEICAgICAxMjUKKyNkZWZpbmUgTVVMX1RPT00zMl9UT19UT09NNTNfVEhSRVNIT0xEICAgICAxNzYKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNTNfVEhSRVNIT0xEICAgICAxMTQKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xEICAgICAxMjkKKworI2RlZmluZSBTUVJfQkFTRUNBU0VfVEhSRVNIT0xEICAgICAgICAgICAgICAxMgorI2RlZmluZSBTUVJfVE9PTTJfVEhSRVNIT0xEICAgICAgICAgICAgICAgICA3OAorI2RlZmluZSBTUVJfVE9PTTNfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDEzNworI2RlZmluZSBTUVJfVE9PTTRfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDIxMgorI2RlZmluZSBTUVJfVE9PTTZfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDMwNgorI2RlZmluZSBTUVJfVE9PTThfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDQyMgorCisjZGVmaW5lIE1VTE1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFNRUk1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDI2CisKKyNkZWZpbmUgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCAgICAgICAgICAgICA0MzYgIC8qIGsgPSA1ICovCisjZGVmaW5lIE1VTF9GRlRfVEFCTEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgeyAgICA0MzYsIDV9LCB7ICAgICAyNywgNn0sIHsgICAgIDI4LCA3fSwgeyAgICAgMTUsIDZ9LCBcCisgICAgeyAgICAgMzIsIDd9LCB7ICAgICAxNywgNn0sIHsgICAgIDM1LCA3fSwgeyAgICAgMTksIDZ9LCBcCisgICAgeyAgICAgMzksIDd9LCB7ICAgICAyOSwgOH0sIHsgICAgIDE1LCA3fSwgeyAgICAgMzUsIDh9LCBcCisgICAgeyAgICAgMTksIDd9LCB7ICAgICA0MSwgOH0sIHsgICAgIDIzLCA3fSwgeyAgICAgNDksIDh9LCBcCisgICAgeyAgICAgMjcsIDl9LCB7ICAgICAxNSwgOH0sIHsgICAgIDMxLCA3fSwgeyAgICAgNjMsIDh9LCBcCisgICAgeyAgICAyNTYsIDl9LCB7ICAgIDUxMiwxMH0sIHsgICAxMDI0LDExfSwgeyAgIDIwNDgsMTJ9LCBcCisgICAgeyAgIDQwOTYsMTN9LCB7ICAgODE5MiwxNH0sIHsgIDE2Mzg0LDE1fSwgeyAgMzI3NjgsMTZ9IH0KKyNkZWZpbmUgTVVMX0ZGVF9UQUJMRTNfU0laRSAyOAorI2RlZmluZSBNVUxfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgNTc2MAorCisjZGVmaW5lIFNRUl9GRlRfTU9ERl9USFJFU0hPTEQgICAgICAgICAgICAgNDA0ICAvKiBrID0gNSAqLworI2RlZmluZSBTUVJfRkZUX1RBQkxFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IHsgICAgNDA0LCA1fSwgeyAgICAgMTMsIDR9LCB7ICAgICAyNywgNX0sIHsgICAgIDI3LCA2fSwgXAorICAgIHsgICAgIDI4LCA3fSwgeyAgICAgMTUsIDZ9LCB7ICAgICAzMiwgN30sIHsgICAgIDE3LCA2fSwgXAorICAgIHsgICAgIDM1LCA3fSwgeyAgICAgMjksIDh9LCB7ICAgICAxNSwgN30sIHsgICAgIDM1LCA4fSwgXAorICAgIHsgICAgIDE5LCA3fSwgeyAgICAgNDEsIDh9LCB7ICAgICAyMywgN30sIHsgICAgIDQ3LCA4fSwgXAorICAgIHsgICAgIDI3LCA5fSwgeyAgICAgMTUsIDh9LCB7ICAgICAzOSwgOX0sIHsgICAgNTEyLDEwfSwgXAorICAgIHsgICAxMDI0LDExfSwgeyAgIDIwNDgsMTJ9LCB7ICAgNDA5NiwxM30sIHsgICA4MTkyLDE0fSwgXAorICAgIHsgIDE2Mzg0LDE1fSwgeyAgMzI3NjgsMTZ9IH0KKyNkZWZpbmUgU1FSX0ZGVF9UQUJMRTNfU0laRSAyNgorI2RlZmluZSBTUVJfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMzc3NgorCisjZGVmaW5lIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCAgICAgICAgICAgICAwICAvKiBhbHdheXMgKi8KKyNkZWZpbmUgTVVMTE9fRENfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAxMzcKKyNkZWZpbmUgTVVMTE9fTVVMX05fVEhSRVNIT0xEICAgICAgICAgICAgMTE0NzkKKworI2RlZmluZSBEQ19ESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDE1MAorI2RlZmluZSBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgICAgIDQ5NAorI2RlZmluZSBEQ19CRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDE0OAorI2RlZmluZSBEQ19CRElWX1FfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDM0NQorCisjZGVmaW5lIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQgICAgICAgICAgIDcwCisjZGVmaW5lIElOVl9ORVdUT05fVEhSRVNIT0xEICAgICAgICAgICAgICAgNDc0CisjZGVmaW5lIElOVl9BUFBSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgNDc4CisKKyNkZWZpbmUgQklOVl9ORVdUT05fVEhSRVNIT0xEICAgICAgICAgICAgICA1NDIKKyNkZWZpbmUgUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQgICAgICAgICAxMTcKKworI2RlZmluZSBNVV9ESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjA4OQorI2RlZmluZSBNVV9ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgICAgMjE3MgorI2RlZmluZSBNVVBJX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICAgICAgIDIyNQorI2RlZmluZSBNVV9CRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgICAgMTUyOAorI2RlZmluZSBNVV9CRElWX1FfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjA4OQorCisjZGVmaW5lIE1BVFJJWDIyX1NUUkFTU0VOX1RIUkVTSE9MRCAgICAgICAgIDE2CisjZGVmaW5lIEhHQ0RfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgMTk3CisjZGVmaW5lIEdDRF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgOTAyCisjZGVmaW5lIEdDREVYVF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgNjUwCisjZGVmaW5lIEpBQ09CSV9CQVNFX01FVEhPRCAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgR0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgICAgMzkKKyNkZWZpbmUgU0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgIDEwNDUKKyNkZWZpbmUgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgIDIxNDcKZGlmZiAtLWdpdCBhL21wbi9hcm0vaW52ZXJ0X2xpbWIuYXNtIGIvbXBuL2FybS9pbnZlcnRfbGltYi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1NWE2MAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vaW52ZXJ0X2xpbWIuYXNtCkBAIC0wLDAgKzEsOTMgQEAKK2RubCAgQVJNIG1wbl9pbnZlcnRfbGltYiAtLSBJbnZlcnQgYSBub3JtYWxpemVkIGxpbWIuCisKK2RubCAgQ29weXJpZ2h0IDIwMDEsIDIwMDksIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9pbnZlcnRfbGltYikKKwlMRUEoCXIyLCBhcHByb3hfdGFiLTUxMikKKwltb3YJcjMsIHIwLCBsc3IgIzIzCisJbW92CXIzLCByMywgYXNsICMxCisJbGRyaAlyMywgW3IzLCByMl0KKwltb3YJcjEsIHIzLCBhc2wgIzE3CisJbXVsCXIxMiwgcjMsIHIzCisJdW11bGwJcjMsIHIyLCByMTIsIHIwCisJc3ViCXIxLCByMSwgcjIsIGFzbCAjMQorCXVtdWxsCXIzLCByMiwgcjEsIHIxCisJdW11bGwJcjEyLCByMywgcjAsIHIzCisJdW11bGwJcjIsIHIxMiwgcjAsIHIyCisJYWRkcwlyMiwgcjIsIHIzCisJYWRjCXIxMiwgcjEyLCAjMAorCXJzYglyMSwgcjEyLCByMQorCW12bglyMiwgcjIsIGxzciAjMzAKKwlhZGQJcjIsIHIyLCByMSwgYXNsICMyCisJdW11bGwJcjEyLCByMywgcjAsIHIyCisJYWRkcwlyMSwgcjEyLCByMAorCWFkYwlyMywgcjMsIHIwCisJcnNiCXIwLCByMywgcjIKKwlyZXR1cm4JbHIKK0VQSUxPR1VFKCkKKworCVJPREFUQQorCUFMSUdOKDIpCithcHByb3hfdGFiOgorCS5zaG9ydCAgICAweGZmYzAsMHhmZWMwLDB4ZmRjMCwweGZjYzAsMHhmYmMwLDB4ZmFjMCwweGZhMDAsMHhmOTAwCisJLnNob3J0ICAgIDB4ZjgwMCwweGY3MDAsMHhmNjQwLDB4ZjU0MCwweGY0NDAsMHhmMzgwLDB4ZjI4MCwweGYxODAKKwkuc2hvcnQgICAgMHhmMGMwLDB4ZWZjMCwweGVmMDAsMHhlZTAwLDB4ZWQ0MCwweGVjNDAsMHhlYjgwLDB4ZWFjMAorCS5zaG9ydCAgICAweGU5YzAsMHhlOTAwLDB4ZTg0MCwweGU3NDAsMHhlNjgwLDB4ZTVjMCwweGU1MDAsMHhlNDAwCisJLnNob3J0ICAgIDB4ZTM0MCwweGUyODAsMHhlMWMwLDB4ZTEwMCwweGUwNDAsMHhkZjgwLDB4ZGVjMCwweGRlMDAKKwkuc2hvcnQgICAgMHhkZDQwLDB4ZGM4MCwweGRiYzAsMHhkYjAwLDB4ZGE0MCwweGQ5ODAsMHhkOGMwLDB4ZDgwMAorCS5zaG9ydCAgICAweGQ3NDAsMHhkNjgwLDB4ZDYwMCwweGQ1NDAsMHhkNDgwLDB4ZDNjMCwweGQzNDAsMHhkMjgwCisJLnNob3J0ICAgIDB4ZDFjMCwweGQxNDAsMHhkMDgwLDB4Y2ZjMCwweGNmNDAsMHhjZTgwLDB4Y2RjMCwweGNkNDAKKwkuc2hvcnQgICAgMHhjYzgwLDB4Y2MwMCwweGNiNDAsMHhjYWMwLDB4Y2EwMCwweGM5ODAsMHhjOGMwLDB4Yzg0MAorCS5zaG9ydCAgICAweGM3ODAsMHhjNzAwLDB4YzY0MCwweGM1YzAsMHhjNTQwLDB4YzQ4MCwweGM0MDAsMHhjMzgwCisJLnNob3J0ICAgIDB4YzJjMCwweGMyNDAsMHhjMWMwLDB4YzEwMCwweGMwODAsMHhjMDAwLDB4YmY4MCwweGJlYzAKKwkuc2hvcnQgICAgMHhiZTQwLDB4YmRjMCwweGJkNDAsMHhiYzgwLDB4YmMwMCwweGJiODAsMHhiYjAwLDB4YmE4MAorCS5zaG9ydCAgICAweGJhMDAsMHhiOTgwLDB4YjkwMCwweGI4NDAsMHhiN2MwLDB4Yjc0MCwweGI2YzAsMHhiNjQwCisJLnNob3J0ICAgIDB4YjVjMCwweGI1NDAsMHhiNGMwLDB4YjQ0MCwweGIzYzAsMHhiMzQwLDB4YjJjMCwweGIyNDAKKwkuc2hvcnQgICAgMHhiMWMwLDB4YjE0MCwweGIwYzAsMHhiMDgwLDB4YjAwMCwweGFmODAsMHhhZjAwLDB4YWU4MAorCS5zaG9ydCAgICAweGFlMDAsMHhhZDgwLDB4YWQ0MCwweGFjYzAsMHhhYzQwLDB4YWJjMCwweGFiNDAsMHhhYWMwCisJLnNob3J0ICAgIDB4YWE4MCwweGFhMDAsMHhhOTgwLDB4YTkwMCwweGE4YzAsMHhhODQwLDB4YTdjMCwweGE3NDAKKwkuc2hvcnQgICAgMHhhNzAwLDB4YTY4MCwweGE2MDAsMHhhNWMwLDB4YTU0MCwweGE0YzAsMHhhNDgwLDB4YTQwMAorCS5zaG9ydCAgICAweGEzODAsMHhhMzQwLDB4YTJjMCwweGEyNDAsMHhhMjAwLDB4YTE4MCwweGExNDAsMHhhMGMwCisJLnNob3J0ICAgIDB4YTA4MCwweGEwMDAsMHg5ZjgwLDB4OWY0MCwweDllYzAsMHg5ZTgwLDB4OWUwMCwweDlkYzAKKwkuc2hvcnQgICAgMHg5ZDQwLDB4OWQwMCwweDljODAsMHg5YzQwLDB4OWJjMCwweDliODAsMHg5YjAwLDB4OWFjMAorCS5zaG9ydCAgICAweDlhNDAsMHg5YTAwLDB4OTk4MCwweDk5NDAsMHg5OGMwLDB4OTg4MCwweDk4NDAsMHg5N2MwCisJLnNob3J0ICAgIDB4OTc4MCwweDk3MDAsMHg5NmMwLDB4OTY4MCwweDk2MDAsMHg5NWMwLDB4OTU4MCwweDk1MDAKKwkuc2hvcnQgICAgMHg5NGMwLDB4OTQ0MCwweDk0MDAsMHg5M2MwLDB4OTM0MCwweDkzMDAsMHg5MmMwLDB4OTI0MAorCS5zaG9ydCAgICAweDkyMDAsMHg5MWMwLDB4OTE4MCwweDkxMDAsMHg5MGMwLDB4OTA4MCwweDkwMDAsMHg4ZmMwCisJLnNob3J0ICAgIDB4OGY4MCwweDhmNDAsMHg4ZWMwLDB4OGU4MCwweDhlNDAsMHg4ZTAwLDB4OGQ4MCwweDhkNDAKKwkuc2hvcnQgICAgMHg4ZDAwLDB4OGNjMCwweDhjODAsMHg4YzAwLDB4OGJjMCwweDhiODAsMHg4YjQwLDB4OGIwMAorCS5zaG9ydCAgICAweDhhODAsMHg4YTQwLDB4OGEwMCwweDg5YzAsMHg4OTgwLDB4ODk0MCwweDg4YzAsMHg4ODgwCisJLnNob3J0ICAgIDB4ODg0MCwweDg4MDAsMHg4N2MwLDB4ODc4MCwweDg3NDAsMHg4NzAwLDB4ODY4MCwweDg2NDAKKwkuc2hvcnQgICAgMHg4NjAwLDB4ODVjMCwweDg1ODAsMHg4NTQwLDB4ODUwMCwweDg0YzAsMHg4NDgwLDB4ODQ0MAorCS5zaG9ydCAgICAweDg0MDAsMHg4MzgwLDB4ODM0MCwweDgzMDAsMHg4MmMwLDB4ODI4MCwweDgyNDAsMHg4MjAwCisJLnNob3J0ICAgIDB4ODFjMCwweDgxODAsMHg4MTQwLDB4ODEwMCwweDgwYzAsMHg4MDgwLDB4ODA0MCwweDgwMDAKK0FTTV9FTkQoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9sb2dvcHNfbi5hc20gYi9tcG4vYXJtL2xvZ29wc19uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRkYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9sb2dvcHNfbi5hc20KQEAgLTAsMCArMSwxMzkgQEAKK2RubCAgQVJNIG1wbl9hbmRfbiwgbXBuX2FuZG5fbi4gbXBuX25hbmRfbiwgZXRjLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDE5OTcsIDIwMDAsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQyAgICAgICAgICAgIGN5Y2xlcy9saW1iICAgICAgICAgICAgIGN5Y2xlcy9saW1iCitDICAgICAgICAgIGFuZCBhbmRuIGlvciB4b3IgICAgICAgICBuYW5kIGlvcm4gbmlvciB4bm9yCitDIFN0cm9uZ0FSTQkgPwkJCSA/CitDIFhTY2FsZQkgPwkJCSA/CitDIENvcnRleC1BNwkgPwkJCSA/CitDIENvcnRleC1BOAkgPwkJCSA/CitDIENvcnRleC1BOQkyLjUtMi43MgkJMi43NS0zCitDIENvcnRleC1BMTUJMi4yNQkJCTIuNzUKKworQyBUT0RPCitDICAqIEl0IHNlZW1zIHRoYXQgMi4yNSBjL2wgYW5kIDIuNzUgYy9sIGlzIHBvc3NpYmxlIGZvciBBOS4KK0MgICogRGVidWcgcG9wcGluZyBpc3N1ZSwgc2VlIGNvbW1lbnQgYmVsb3cuCisKK2RlZmluZShgcnAnLCBgcjAnKQorZGVmaW5lKGB1cCcsIGByMScpCitkZWZpbmUoYHZwJywgYHIyJykKK2RlZmluZShgbicsICBgcjMnKQorCitkZWZpbmUoYFBPU1RPUCcpCisKK2lmZGVmKGBPUEVSQVRJT05fYW5kX24nLGAKKyAgZGVmaW5lKGBmdW5jJywgICAgYG1wbl9hbmRfbicpCisgIGRlZmluZShgTE9HT1AnLCAgIGBhbmQJJDEsICQyLCAkMycpJykKK2lmZGVmKGBPUEVSQVRJT05fYW5kbl9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5fYW5kbl9uJykKKyAgZGVmaW5lKGBMT0dPUCcsICAgYGJpYwkkMSwgJDIsICQzJyknKQoraWZkZWYoYE9QRVJBVElPTl9uYW5kX24nLGAKKyAgZGVmaW5lKGBmdW5jJywgICAgYG1wbl9uYW5kX24nKQorICBkZWZpbmUoYFBPU1RPUCcsICBgbXZuCSQxLCAkMScpCisgIGRlZmluZShgTE9HT1AnLCAgIGBhbmQJJDEsICQyLCAkMycpJykKK2lmZGVmKGBPUEVSQVRJT05faW9yX24nLGAKKyAgZGVmaW5lKGBmdW5jJywgICAgYG1wbl9pb3JfbicpCisgIGRlZmluZShgTE9HT1AnLCAgIGBvcnIJJDEsICQyLCAkMycpJykKK2lmZGVmKGBPUEVSQVRJT05faW9ybl9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5faW9ybl9uJykKKyAgZGVmaW5lKGBQT1NUT1AnLCAgYG12bgkkMSwgJDEnKQorICBkZWZpbmUoYExPR09QJywgICBgYmljCSQxLCAkMywgJDInKScpCitpZmRlZihgT1BFUkFUSU9OX25pb3JfbicsYAorICBkZWZpbmUoYGZ1bmMnLCAgICBgbXBuX25pb3JfbicpCisgIGRlZmluZShgUE9TVE9QJywgIGBtdm4JJDEsICQxJykKKyAgZGVmaW5lKGBMT0dPUCcsICAgYG9ycgkkMSwgJDIsICQzJyknKQoraWZkZWYoYE9QRVJBVElPTl94b3JfbicsYAorICBkZWZpbmUoYGZ1bmMnLCAgICBgbXBuX3hvcl9uJykKKyAgZGVmaW5lKGBMT0dPUCcsICAgYGVvcgkkMSwgJDIsICQzJyknKQoraWZkZWYoYE9QRVJBVElPTl94bm9yX24nLGAKKyAgZGVmaW5lKGBmdW5jJywgICAgYG1wbl94bm9yX24nKQorICBkZWZpbmUoYFBPU1RPUCcsICBgbXZuCSQxLCAkMScpCisgIGRlZmluZShgTE9HT1AnLCAgIGBlb3IJJDEsICQyLCAkMycpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYW5kX24gbXBuX2FuZG5fbiBtcG5fbmFuZF9uIG1wbl9pb3JfbiBtcG5faW9ybl9uIG1wbl9uaW9yX24gbXBuX3hvcl9uIG1wbl94bm9yX24pCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShmdW5jKQorCXB1c2gJeyByOCwgcjksIHIxMCB9CisJdHN0CW4sICMxCisJYmVxCUwoc2tpcDEpCisJbGRyCXIxMCwgW3ZwXSwgIzQKKwlsZHIJcjEyLCBbdXBdLCAjNAorCUxPR09QKAlyMTIsIHIxMiwgcjEwKQorCVBPU1RPUCgJcjEyKQorCXN0cglyMTIsIFtycF0sICM0CitMKHNraXAxKToKKwl0c3QJbiwgIzIKKwliZXEJTChza2lwMikKKwlsZG1pYQl2cCEsIHsgcjEwLCByMTIgfQorCWxkbWlhCXVwISwgeyByOCwgcjkgfQorCUxPR09QKAlyOCwgcjgsIHIxMCkKKwlMT0dPUCgJcjksIHI5LCByMTIpCisJUE9TVE9QKAlyOCkKKwlQT1NUT1AoCXI5KQorCXN0bWlhCXJwISwgeyByOCwgcjkgfQorTChza2lwMik6CisJYmljcwluLCBuLCAjMworCWJlcQlMKHJ0bikKKwlwdXNoCXsgcjQsIHI1LCByNiwgcjcgfQorCisJbGRtaWEJdnAhLCB7IHI4LCByOSwgcjEwLCByMTIgfQorCWIJTChtaWQpCisKK0wodG9wKToJbGRtaWEJdnAhLCB7IHI4LCByOSwgcjEwLCByMTIgfQorCVBPU1RPUCgJcjQpCisJUE9TVE9QKAlyNSkKKwlQT1NUT1AoCXI2KQorCVBPU1RPUCgJcjcpCisJc3RtaWEJcnAhLCB7IHI0LCByNSwgcjYsIHI3IH0KK0wobWlkKToJc3ViCW4sIG4sICM0CisJbGRtaWEJdXAhLCB7IHI0LCByNSwgcjYsIHI3IH0KKwl0ZXEJbiwgIzAKKwlMT0dPUCgJcjQsIHI0LCByOCkKKwlMT0dPUCgJcjUsIHI1LCByOSkKKwlMT0dPUCgJcjYsIHI2LCByMTApCisJTE9HT1AoCXI3LCByNywgcjEyKQorCWJuZQlMKHRvcCkKKworCVBPU1RPUCgJcjQpCisJUE9TVE9QKAlyNSkKKwlQT1NUT1AoCXI2KQorCVBPU1RPUCgJcjcpCisJc3RtaWEJcnAhLCB7IHI0LCByNSwgcjYsIHI3IH0KKworCXBvcAl7IHI0LCByNSwgcjYsIHI3IH0JQyBwb3BwaW5nIHI4LXIxMCBoZXJlIHN0cmFuZ2VseSBmYWlscworCitMKHJ0bik6CXBvcAl7IHI4LCByOSwgcjEwIH0KKwlyZXR1cm4JcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL2xzaGlmdC5hc20gYi9tcG4vYXJtL2xzaGlmdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vbHNoaWZ0LmFzbQpAQCAtMCwwICsxLDg4IEBACitkbmwgIEFSTSBtcG5fbHNoaWZ0LgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgPworQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDMuNQorQyBDb3J0ZXgtQTE1CSA/CisKK2RlZmluZShgcnAnLCAgYHIwJykKK2RlZmluZShgdXAnLCAgYHIxJykKK2RlZmluZShgbicsICAgYHIyJykKK2RlZmluZShgY250JywgYHIzJykKK2RlZmluZShgdG5jJywgYHIxMicpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fbHNoaWZ0KQorCWFkZAl1cCwgdXAsIG4sIGxzbCAjMgorCXB1c2gJe3I0LCByNiwgcjcsIHI4fQorCWxkcglyNCwgW3VwLCAjLTRdIQorCWFkZAlycCwgcnAsIG4sIGxzbCAjMgorCXJzYgl0bmMsIGNudCwgIzMyCisKKwltb3YJcjcsIHI0LCBsc2wgY250CisJdHN0CW4sICMxCisJYmVxCUwoZXZuKQkJCUMgbiBldmVuCisKK0wob2RkKToJc3VicwluLCBuLCAjMgorCWJjYwlMKDEpCQkJQyBuID0gMQorCWxkcglyOCwgW3VwLCAjLTRdIQorCWIJTChtaWQpCisKK0woZXZuKToJbGRyCXI2LCBbdXAsICMtNF0hCisJc3VicwluLCBuLCAjMgorCWJlcQlMKGVuZCkKKworTCh0b3ApOglsZHIJcjgsIFt1cCwgIy00XSEKKwlvcnIJcjcsIHI3LCByNiwgbHNyIHRuYworCXN0cglyNywgW3JwLCAjLTRdIQorCW1vdglyNywgcjYsIGxzbCBjbnQKK0wobWlkKToJbGRyCXI2LCBbdXAsICMtNF0hCisJb3JyCXI3LCByNywgcjgsIGxzciB0bmMKKwlzdHIJcjcsIFtycCwgIy00XSEKKwltb3YJcjcsIHI4LCBsc2wgY250CisJc3VicwluLCBuLCAjMgorCWJndAlMKHRvcCkKKworTChlbmQpOglvcnIJcjcsIHI3LCByNiwgbHNyIHRuYworCXN0cglyNywgW3JwLCAjLTRdIQorCW1vdglyNywgcjYsIGxzbCBjbnQKK0woMSk6CXN0cglyNywgW3JwLCAjLTRdCisJbW92CXIwLCByNCwgbHNyIHRuYworCXBvcAl7cjQsIHI2LCByNywgcjh9CisJcmV0dXJuCXIxNAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9sc2hpZnRjLmFzbSBiL21wbi9hcm0vbHNoaWZ0Yy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZWZkOAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vbHNoaWZ0Yy5hc20KQEAgLTAsMCArMSw5NSBAQAorZG5sICBBUk0gbXBuX2xzaGlmdGMuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSA/CitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgNC4wCitDIENvcnRleC1BMTUJID8KKworZGVmaW5lKGBycCcsICBgcjAnKQorZGVmaW5lKGB1cCcsICBgcjEnKQorZGVmaW5lKGBuJywgICBgcjInKQorZGVmaW5lKGBjbnQnLCBgcjMnKQorZGVmaW5lKGB0bmMnLCBgcjEyJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9sc2hpZnRjKQorCWFkZAl1cCwgdXAsIG4sIGxzbCAjMgorCXB1c2gJe3I0LCByNiwgcjcsIHI4fQorCWxkcglyNCwgW3VwLCAjLTRdIQorCWFkZAlycCwgcnAsIG4sIGxzbCAjMgorCXJzYgl0bmMsIGNudCwgIzMyCisJbXZuCXI2LCByNAorCisJbW92CXI3LCByNiwgbHNsIGNudAorCXRzdAluLCAjMQorCWJlcQlMKGV2bikJCQlDIG4gZXZlbgorCitMKG9kZCk6CXN1YnMJbiwgbiwgIzIKKwliY2MJTCgxKQkJCUMgbiA9IDEKKwlsZHIJcjgsIFt1cCwgIy00XSEKKwltdm4JcjgsIHI4CisJYglMKG1pZCkKKworTChldm4pOglsZHIJcjYsIFt1cCwgIy00XSEKKwltdm4JcjYsIHI2CisJc3VicwluLCBuLCAjMgorCWJlcQlMKGVuZCkKKworTCh0b3ApOglsZHIJcjgsIFt1cCwgIy00XSEKKwlvcnIJcjcsIHI3LCByNiwgbHNyIHRuYworCXN0cglyNywgW3JwLCAjLTRdIQorCW12bglyOCwgcjgKKwltb3YJcjcsIHI2LCBsc2wgY250CitMKG1pZCk6CWxkcglyNiwgW3VwLCAjLTRdIQorCW9ycglyNywgcjcsIHI4LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbXZuCXI2LCByNgorCW1vdglyNywgcjgsIGxzbCBjbnQKKwlzdWJzCW4sIG4sICMyCisJYmd0CUwodG9wKQorCitMKGVuZCk6CW9ycglyNywgcjcsIHI2LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbW92CXI3LCByNiwgbHNsIGNudAorTCgxKToJbXZuCXI2LCAjMAorCW9ycglyNywgcjcsIHI2LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0KKwltb3YJcjAsIHI0LCBsc3IgdG5jCisJcG9wCXtyNCwgcjYsIHI3LCByOH0KKwlyZXR1cm4JcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL21vZF8zNGxzdWIxLmFzbSBiL21wbi9hcm0vbW9kXzM0bHN1YjEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL21vZF8zNGxzdWIxLmFzbQpAQCAtMCwwICsxLDEyNCBAQAorZG5sICBBUk0gbXBuX21vZF8zNGxzdWIxIC0tIHJlbWFpbmRlciBtb2R1bG8gMl4yNC0xLgorCitkbmwgIENvcHlyaWdodCAyMDEyLCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk0JID8KK0MgWFNjYWxlCSA/CitDIENvcnRleC1BNQkgMi42NworQyBDb3J0ZXgtQTcJIDIuMzUKK0MgQ29ydGV4LUE4CSAyLjAKK0MgQ29ydGV4LUE5CSAxLjMzCitDIENvcnRleC1BMTUJIDEuMzMKK0MgQ29ydGV4LUExNwkgMy4zNAorQyBDb3J0ZXgtQTUzCSAyLjAKKworZGVmaW5lKGBhcCcsCXIwKQorZGVmaW5lKGBuJywJcjEpCisKK0MgbXBfbGltYl90IG1wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbikKKworQyBUT0RPCitDICAqIFdyaXRlIGNsZXZlcmVyIHN1bW1hdGlvbiBjb2RlLgorQyAgKiBDb25zaWRlciBsb2FkaW5nIDYgNjQtYml0IGFsaWduZWQgcmVnaXN0ZXJzIGF0IGEgdGltZSwgdG8gYXBwcm9hY2ggMSBjL2wuCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDMyKQorUFJPTE9HVUUobXBuX21vZF8zNGxzdWIxKQorCXB1c2gJeyByNCwgcjUsIHI2LCByNyB9CisKKwlzdWJzCW4sIG4sICMzCisJbW92CXI3LCAjMAorCWJsdAlMKGxlMikJCQlDIG4gPD0gMgorCisJbGRtaWEJYXAhLCB7IHIyLCByMywgcjEyIH0KKwlzdWJzCW4sIG4sICMzCisJYmx0CUwoc3VtKQkJCUMgbiA8PSA1CisJY21uCXIwLCAjMAkJCUMgY2xlYXIgY2FycnkKKwlzdWIJbiwgbiwgIzMKKwliCUwobWlkKQorCitMKHRvcCk6CWFkY3MJcjIsIHIyLCByNAorCWFkY3MJcjMsIHIzLCByNQorCWFkY3MJcjEyLCByMTIsIHI2CitMKG1pZCk6CWxkbWlhCWFwISwgeyByNCwgcjUsIHI2IH0KKwl0c3QJbiwgbgorCXN1YgluLCBuLCAjMworCWJwbAlMKHRvcCkKKworCWFkZAluLCBuLCAjMworCisJYWRjcwlyMiwgcjIsIHI0CisJYWRjcwlyMywgcjMsIHI1CisJYWRjcwlyMTIsIHIxMiwgcjYKKwltb3ZjcwlyNywgIzEJCQlDIHI3IDw9IDEKKworTChzdW0pOgljbW4JbiwgIzIKKwltb3ZsbwlyNCwgIzAKKwlsZHJocwlyNCwgW2FwXSwgIzQKKwltb3ZscwlyNSwgIzAKKwlsZHJoaQlyNSwgW2FwXSwgIzQKKworCWFkZHMJcjIsIHIyLCByNAorCWFkY3MJcjMsIHIzLCByNQorCWFkY3MJcjEyLCByMTIsICMwCisJYWRjCXI3LCByNywgIzAJCUMgcjcgPD0gMgorCitMKHN1bTIpOgorCWJpYwlyMCwgcjIsICMweGZmMDAwMDAwCisJYWRkCXIwLCByMCwgcjIsIGxzciAjMjQKKwlhZGQJcjAsIHIwLCByNworCisJbW92CXI3LCByMywgbHNsICM4CisJYmljCXIxLCByNywgIzB4ZmYwMDAwMDAKKwlhZGQJcjAsIHIwLCByMQorCWFkZAlyMCwgcjAsIHIzLCBsc3IgIzE2CisKKwltb3YJcjcsIHIxMiwgbHNsICMxNgorCWJpYwlyMSwgcjcsICMweGZmMDAwMDAwCisJYWRkCXIwLCByMCwgcjEKKwlhZGQJcjAsIHIwLCByMTIsIGxzciAjOAorCisJcG9wCXsgcjQsIHI1LCByNiwgcjcgfQorCXJldHVybglscgorCitMKGxlMik6CWNtbgluLCAjMQorCWJuZQlMKDEpCisJbGRtaWEJYXAhLCB7IHIyLCByMyB9CisJbW92CXIxMiwgIzAKKwliCUwoc3VtMikKK0woMSk6CWxkcglyMiwgW2FwXQorCWJpYwlyMCwgcjIsICMweGZmMDAwMDAwCisJYWRkCXIwLCByMCwgcjIsIGxzciAjMjQKKwlwb3AJeyByNCwgcjUsIHI2LCByNyB9CisJcmV0dXJuCWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL21vZGUxby5hc20gYi9tcG4vYXJtL21vZGUxby5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlNGNmNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vbW9kZTFvLmFzbQpAQCAtMCwwICsxLDkyIEBACitkbmwgIEFSTSBtcG5fbW9kZXhhY3RfMWNfb2RkCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSA/CitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkxMAorQyBDb3J0ZXgtQTE1CSA5CisKK0MgQXJjaGl0ZWN0dXJlIHJlcXVpcmVtZW50czoKK0MgdjUJLQorQyB2NXQJLQorQyB2NXRlCS0KK0MgdjYJLQorQyB2NnQyCS0KK0MgdjdhCS0KKworZGVmaW5lKGB1cCcsIGByMCcpCitkZWZpbmUoYG4nLCAgYHIxJykKK2RlZmluZShgZCcsICBgcjInKQorZGVmaW5lKGBjeScsIGByMycpCisKKwkucHJvdGVjdGVkCWJpbnZlcnRfbGltYl90YWJsZQorQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9tb2RleGFjdF8xY19vZGQpCisJc3RtZmQJc3AhLCB7cjQsIHI1fQorCisJTEVBKAlyNCwgYmludmVydF9saW1iX3RhYmxlKQorCisJbGRyCXI1LCBbdXBdLCAjNAkJQyB1cFswXQorCisJYW5kCXIxMiwgZCwgIzI1NAorCWxkcmIJcjQsIFtyNCwgcjEyLCBsc3IgIzFdCisJbXVsCXIxMiwgcjQsIHI0CisJbXVsCXIxMiwgZCwgcjEyCisJcnNiCXIxMiwgcjEyLCByNCwgYXNsICMxCisJbXVsCXI0LCByMTIsIHIxMgorCW11bAlyNCwgZCwgcjQKKwlyc2IJcjQsIHI0LCByMTIsIGFzbCAjMQlDIHI0ID0gaW52ZXJzZQorCisJc3VicwluLCBuLCAjMQkJQyBzZXQgY2FycnkgYXMgc2lkZS1lZmZlY3QKKwliZXEJTChlbmQpCisKK0wodG9wKToJc2JjcwljeSwgcjUsIGN5CisJbGRyCXI1LCBbdXBdLCAjNAorCXN1YgluLCBuLCAjMQorCW11bAlyMTIsIHI0LCBjeQorCXRzdAluLCBuCisJdW11bGwJcjEyLCBjeSwgZCwgcjEyCisJYm5lCUwodG9wKQorCitMKGVuZCk6CXNiY3MJY3ksIHI1LCBjeQorCW11bAlyMTIsIHI0LCBjeQorCXVtdWxsCXIxMiwgcjAsIGQsIHIxMgorCWFkZGNjCXIwLCByMCwgIzEKKworCWxkbWZkCXNwISwge3I0LCByNX0KKwlyZXR1cm4JcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL211bF8xLmFzbSBiL21wbi9hcm0vbXVsXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODM2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL211bF8xLmFzbQpAQCAtMCwwICsxLDk0IEBACitkbmwgIEFSTSBtcG5fbXVsXzEgLS0gTXVsdGlwbHkgYSBsaW1iIHZlY3RvciB3aXRoIGEgbGltYiBhbmQgc3RvcmUgdGhlIHJlc3VsdAorZG5sICBpbiBhIHNlY29uZCBsaW1iIHZlY3Rvci4KK2RubCAgQ29udHJpYnV0ZWQgYnkgUm9iZXJ0IEhhcmxleS4KKworZG5sICBDb3B5cmlnaHQgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMywgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCTYtOAorQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDQuNzUKK0MgQ29ydGV4LUExNQkgPworCitDIFdlIHNob3VsZCByZXdyaXRlIHRoaXMgYWxvbmcgdGhlIGxpbmVzIG9mIGFkZG11bF8xLmFzbS4gIFRoYXQgc2hvdWxkIHNhdmUgYQorQyBjeWNsZSBvbiBTdHJvbmdBUk0sIGFuZCBzZXZlcmFsIGN5Y2xlcyBvbiBYU2NhbGUuCisKK2RlZmluZShgcnAnLGByMCcpCitkZWZpbmUoYHVwJyxgcjEnKQorZGVmaW5lKGBuJyxgcjInKQorZGVmaW5lKGB2bCcsYHIzJykKKworCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX211bF8xKQorCXN0bWZkCXNwISwgeyByOCwgcjksIGxyIH0KKwlhbmRzCXIxMiwgbiwgIzEKKwliZXEJTChza2lwMSkKKwlsZHIJbHIsIFt1cF0sICM0CisJdW11bGwJcjksIHIxMiwgbHIsIHZsCisJc3RyCXI5LCBbcnBdLCAjNAorTChza2lwMSk6CisJdHN0CW4sICMyCisJYmVxCUwoc2tpcDIpCisJbW92CXI4LCByMTIKKwlsZG1pYQl1cCEsIHsgcjEyLCBsciB9CisJbW92CXI5LCAjMAorCXVtbGFsCXI4LCByOSwgcjEyLCB2bAorCW1vdglyMTIsICMwCisJdW1sYWwJcjksIHIxMiwgbHIsIHZsCisJc3RtaWEJcnAhLCB7IHI4LCByOSB9CitMKHNraXAyKToKKwliaWNzCW4sIG4sICMzCisJYmVxCUwocnRuKQorCXN0bWZkCXNwISwgeyByNiwgcjcgfQorCitMKHRvcCk6CW1vdglyNiwgcjEyCisJbGRtaWEJdXAhLCB7IHI4LCByOSwgcjEyLCBsciB9CisJbGRyCXI3LCBbcnAsICMxMl0JCQlDIGNhY2hlIGFsbG9jYXRlCisJbW92CXI3LCAjMAorCXVtbGFsCXI2LCByNywgcjgsIHZsCisJbW92CXI4LCAjMAorCXVtbGFsCXI3LCByOCwgcjksIHZsCisJbW92CXI5LCAjMAorCXVtbGFsCXI4LCByOSwgcjEyLCB2bAorCW1vdglyMTIsICMwCisJdW1sYWwJcjksIHIxMiwgbHIsIHZsCisJc3VicwluLCBuLCAjNAorCXN0bWlhCXJwISwgeyByNiwgcjcsIHI4LCByOSB9CisJYm5lCUwodG9wKQorCisJbGRtZmQJc3AhLCB7IHI2LCByNyB9CisKK0wocnRuKToJbW92CXIwLCByMTIKKwlsZG1mZAlzcCEsIHsgcjgsIHI5LCBwYyB9CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL25lb24vaGFtZGlzdC5hc20gYi9tcG4vYXJtL25lb24vaGFtZGlzdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YWNiNAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vbmVvbi9oYW1kaXN0LmFzbQpAQCAtMCwwICsxLDE5NCBAQAorZG5sICBBUk0gTmVvbiBtcG5faGFtZGlzdCAtLSBtcG4gYml0IGhhbW1pbmcgZGlzdGFuY2UuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTToJIC0KK0MgWFNjYWxlCSAtCitDIENvcnRleC1BNwkgPworQyBDb3J0ZXgtQTgJID8KK0MgQ29ydGV4LUE5CSAxLjg5CitDIENvcnRleC1BMTUJIDAuOTUKKworQyBUT0RPCitDICAqIEV4cGxvcmUgdXNpbmcgdmxkciBhbmQgdmxkbS4gIERvZXMgaXQgaGVscCBvbiBBOT8gIChUaGVzZSBsb2FkcyBkbworQyAgICA2NC1iaXRzLWF0LWEtdGltZSwgd2hpY2ggd2lsbCBtZXNzIHVwIGluIGJpZy1lbmRpYW4gbW9kZS4gIEV4Y2VwdCBub3QgZm9yCitDICAgIHBvcGNvdW50LiBFeGNlcHQgcGVyaGFwcyBhbHNvIGZvciBwb3Bjb3VudCBmb3IgdGhlIGVkZ2UgbG9hZHMuKQorQyAgKiBBcnJhbmdlIHRvIGFsaWduIHRoZSBwb2ludGVyLCBpZiB0aGF0IGhlbHBzIHBlcmZvcm1hbmNlLiAgVXNlIHRoZSBzYW1lCitDICAgIHJlYWQtYW5kLW1hc2sgdHJpY2sgd2UgdXNlIG9uIFBDcywgZm9yIHNpbXBsaWNpdHkgYW5kIHBlcmZvcm1hbmNlLiAgKFNvcnJ5CitDICAgIHZhbGdyaW5kISkKK0MgICogRXhwbG9yZSBpZiBleHBsaWNpdCBhbGlnbiBkaXJlY3RpdmVzLCBlLmcuLCAiW3B0cjoxMjhdIiBoZWxwLgorQyAgKiBTZWUgcnRoJ3MgZ21wLWRldmVsIDIwMTMtMDIvMDMgbWVzc2FnZXMgYWJvdXQgZmluYWwgc3VtbWF0aW9uIHRyaWNrcy4KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYGFwJywgcjApCitkZWZpbmUoYGJwJywgcjEpCitkZWZpbmUoYG4nLCAgcjIpCisKK0MgV2Ugc3VtIGludG8gMTYgMTYtYml0IGNvdW50ZXJzIGluIHE4LHE5LCBidXQgYXQgdGhlIGVuZCB3ZSBzdW0gdGhlbSBhbmQgZW5kCitDIHVwIHdpdGggOCAxNi1iaXQgY291bnRlcnMuICBUaGVyZWZvcmUsIHdlIGNhbiBzdW0gdG8gOCgyXjE2LTEpIGJpdHMsIG9yCitDICg4KjJeMTYtMSkvMzIgPSAweDNmZmYgbGltYnMuICBXZSB1c2UgYSBjaHVua3NpemUgY2xvc2UgdG8gdGhhdCwgYnV0IHdoaWNoCitDIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIDgtYml0IEFSTSBjb25zdGFudC4KK0MKK2RlZmluZShgY2h1bmtzaXplJywweDNmODApCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5faGFtZGlzdCkKKworCWNtcAluLCAjY2h1bmtzaXplCisJYmhpCUwoZ3QxNmspCisKK0wobHQxNmspOgorCXZtb3YuaTY0ICAgcTgsICMwCQlDIGNsZWFyIHN1bW1hdGlvbiByZWdpc3RlcgorCXZtb3YuaTY0ICAgcTksICMwCQlDIGNsZWFyIHN1bW1hdGlvbiByZWdpc3RlcgorCisJdHN0CSAgIG4sICMxCisJYmVxCSAgIEwoeHh4MCkKKwl2bW92Lmk2NCAgIGQwLCAjMAorCXZtb3YuaTY0ICAgZDIwLCAjMAorCXN1YgkgICBuLCBuLCAjMQorCXZsZDEuMzIgICB7ZDBbMF19LCBbYXBdIQlDIGxvYWQgMSBsaW1iCisJdmxkMS4zMiAgIHtkMjBbMF19LCBbYnBdIQlDIGxvYWQgMSBsaW1iCisJdmVvcgkgICBkMCwgZDAsIGQyMAorCXZjbnQuOAkgICBkMjQsIGQwCisJdnBhZGFsLnU4ICBkMTYsIGQyNAkJQyBkMTYvcTggPSAwOyBjb3VsZCBqdXN0IHNwbGF0CisKK0woeHh4MCk6dHN0CSAgIG4sICMyCisJYmVxCSAgIEwoeHgwMCkKKwlzdWIJICAgbiwgbiwgIzIKKwl2bGQxLjMyICAgIHtkMH0sIFthcF0hCQlDIGxvYWQgMiBsaW1icworCXZsZDEuMzIgICAge2QyMH0sIFticF0hCQlDIGxvYWQgMiBsaW1icworCXZlb3IJICAgZDAsIGQwLCBkMjAKKwl2Y250LjgJICAgZDI0LCBkMAorCXZwYWRhbC51OCAgZDE2LCBkMjQKKworTCh4eDAwKTp0c3QJICAgbiwgIzQKKwliZXEJICAgTCh4MDAwKQorCXN1YgkgICBuLCBuLCAjNAorCXZsZDEuMzIgICAge3EwfSwgW2FwXSEJCUMgbG9hZCA0IGxpbWJzCisJdmxkMS4zMiAgICB7cTEwfSwgW2JwXSEJCUMgbG9hZCA0IGxpbWJzCisJdmVvcgkgICBxMCwgcTAsIHExMAorCXZjbnQuOAkgICBxMTIsIHEwCisJdnBhZGFsLnU4ICBxOCwgcTEyCisKK0woeDAwMCk6dHN0CSAgIG4sICM4CisJYmVxCSAgIEwoMDAwMCkKKworCXN1YnMJICAgbiwgbiwgIzgKKwl2bGQxLjMyICAgIHtxMCxxMX0sIFthcF0hCUMgbG9hZCA4IGxpbWJzCisJdmxkMS4zMiAgICB7cTEwLHExMX0sIFticF0hCUMgbG9hZCA4IGxpbWJzCisJYmxzCSAgIEwoc3VtKQorCitMKGd0OCk6CXZsZDEuMzIgICAge3EyLHEzfSwgW2FwXSEJQyBsb2FkIDggbGltYnMKKwl2bGQxLjMyICAgIHtxMTQscTE1fSwgW2JwXSEJQyBsb2FkIDggbGltYnMKKwl2ZW9yCSAgIHEwLCBxMCwgcTEwCisJdmVvcgkgICBxMSwgcTEsIHExMQorCXN1YgkgICBuLCBuLCAjOAorCXZjbnQuOAkgICBxMTIsIHEwCisJdmNudC44CSAgIHExMywgcTEKKwliCSAgIEwobWlkKQorCitMKDAwMDApOnN1YnMJICAgbiwgbiwgIzE2CisJYmxvCSAgIEwoZTApCisKKwl2bGQxLjMyICAgIHtxMixxM30sIFthcF0hCUMgbG9hZCA4IGxpbWJzCisJdmxkMS4zMiAgICB7cTAscTF9LCBbYXBdIQlDIGxvYWQgOCBsaW1icworCXZsZDEuMzIgICAge3ExNCxxMTV9LCBbYnBdIQlDIGxvYWQgOCBsaW1icworCXZsZDEuMzIgICAge3ExMCxxMTF9LCBbYnBdIQlDIGxvYWQgOCBsaW1icworCXZlb3IJICAgcTIsIHEyLCBxMTQKKwl2ZW9yCSAgIHEzLCBxMywgcTE1CisJdmNudC44CSAgIHExMiwgcTIKKwl2Y250LjgJICAgcTEzLCBxMworCXN1YnMJICAgbiwgbiwgIzE2CisJYmxvCSAgIEwoZW5kKQorCitMKHRvcCk6CXZsZDEuMzIgICAge3EyLHEzfSwgW2FwXSEJQyBsb2FkIDggbGltYnMKKwl2bGQxLjMyICAgIHtxMTQscTE1fSwgW2JwXSEJQyBsb2FkIDggbGltYnMKKwl2ZW9yCSAgIHEwLCBxMCwgcTEwCisJdmVvcgkgICBxMSwgcTEsIHExMQorCXZwYWRhbC51OCAgcTgsIHExMgorCXZjbnQuOAkgICBxMTIsIHEwCisJdnBhZGFsLnU4ICBxOSwgcTEzCisJdmNudC44CSAgIHExMywgcTEKK0wobWlkKToJdmxkMS4zMiAgICB7cTAscTF9LCBbYXBdIQlDIGxvYWQgOCBsaW1icworCXZsZDEuMzIgICAge3ExMCxxMTF9LCBbYnBdIQlDIGxvYWQgOCBsaW1icworCXZlb3IJICAgcTIsIHEyLCBxMTQKKwl2ZW9yCSAgIHEzLCBxMywgcTE1CisJc3VicwkgICBuLCBuLCAjMTYKKwl2cGFkYWwudTggIHE4LCBxMTIKKwl2Y250LjgJICAgcTEyLCBxMgorCXZwYWRhbC51OCAgcTksIHExMworCXZjbnQuOAkgICBxMTMsIHEzCisJYmhzCSAgIEwodG9wKQorCitMKGVuZCk6CXZwYWRhbC51OCAgcTgsIHExMgorCXZwYWRhbC51OCAgcTksIHExMworTChzdW0pOgl2ZW9yCSAgIHEwLCBxMCwgcTEwCisJdmVvcgkgICBxMSwgcTEsIHExMQorCXZjbnQuOAkgICBxMTIsIHEwCisJdmNudC44CSAgIHExMywgcTEKKwl2cGFkYWwudTggIHE4LCBxMTIKKwl2cGFkYWwudTggIHE5LCBxMTMKKwl2YWRkLmkxNiAgIHE4LCBxOCwgcTkKKwkJCQkJQyB3ZSBoYXZlIDggMTYtYml0IGNvdW50cworTChlMCk6CXZwYWRkbC51MTYgcTgsIHE4CQlDIHdlIGhhdmUgNCAzMi1iaXQgY291bnRzCisJdnBhZGRsLnUzMiBxOCwgcTgJCUMgd2UgaGF2ZSAyIDY0LWJpdCBjb3VudHMKKwl2bW92LjMyICAgIHIwLCBkMTZbMF0KKwl2bW92LjMyICAgIHIxLCBkMTdbMF0KKwlhZGQJICAgcjAsIHIwLCByMQorCWJ4CWxyCisKK0MgQ29kZSBmb3IgbGFyZ2UgY291bnQuICBTcGxpdHMgb3BlcmFuZCBhbmQgY2FsbHMgYWJvdmUgY29kZS4KK2RlZmluZShgYXAyJywgcjUpCitkZWZpbmUoYGJwMicsIHI2KQorTChndDE2ayk6CisJcHVzaAl7cjQscjUscjYscjE0fQorCW1vdglhcDIsIGFwCisJbW92CWJwMiwgYnAKKwltb3YJcjMsIG4JCQlDIGZ1bGwgY291bnQKKwltb3YJcjQsICMwCQkJQyB0b3RhbCBzdW0KKworMToJbW92CW4sICNjaHVua3NpemUJCUMgY291bnQgZm9yIHRoaXMgaW52b2NhdGlvbgorCWJsCUwobHQxNmspCQlDIGNvdWxkIGp1bXAgZGVlcCBpbnNpZGUgY29kZQorCWFkZAlhcDIsIGFwMiwgI2NodW5rc2l6ZSo0CUMgcG9pbnQgYXQgbmV4dCBjaHVuaworCWFkZAlicDIsIGJwMiwgI2NodW5rc2l6ZSo0CUMgcG9pbnQgYXQgbmV4dCBjaHVuaworCWFkZAlyNCwgcjQsIHIwCisJbW92CWFwLCBhcDIJCQlDIHB1dCBjaHVuayBwb2ludGVyIGluIHBsYWNlIGZvciBjYWxsCisJbW92CWJwLCBicDIJCQlDIHB1dCBjaHVuayBwb2ludGVyIGluIHBsYWNlIGZvciBjYWxsCisJc3ViCXIzLCByMywgI2NodW5rc2l6ZQorCWNtcAlyMywgI2NodW5rc2l6ZQorCWJoaQkxYgorCisJbW92CW4sIHIzCQkJQyBjb3VudCBmb3IgZmluYWwgaW52b2NhdGlvbgorCWJsCUwobHQxNmspCisJYWRkCXIwLCByNCwgcjAKKwlwb3AJe3I0LHI1LHI2LHBjfQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9uZW9uL2xvcnJzaGlmdC5hc20gYi9tcG4vYXJtL25lb24vbG9ycnNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk1MGRhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9uZW9uL2xvcnJzaGlmdC5hc20KQEAgLTAsMCArMSwyNzkgQEAKK2RubCAgQVJNIE5lb24gbXBuX2xzaGlmdCBhbmQgbXBuX3JzaGlmdC4KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYiAgICAgY3ljbGVzL2xpbWIgICAgIGN5Y2xlcy9saW1iICAgICAgZ29vZAorQyAgICAgICAgICAgICAgYWxpZ25lZAkgICAgICB1bmFsaWduZWQJICAgICAgYmVzdCBzZWVuCSAgICAgZm9yIGNwdT8KK0MgU3Ryb25nQVJNCSAtCQkgLQorQyBYU2NhbGUJIC0JCSAtCitDIENvcnRleC1BNwkgPwkJID8KK0MgQ29ydGV4LUE4CSA/CQkgPworQyBDb3J0ZXgtQTkJIDMJCSAzCQkJCVkKK0MgQ29ydGV4LUExNQkgMS41CQkgMS41CQkJCVkKKworCitDIFdlIHJlYWQgNjQgYml0cyBhdCBhIHRpbWUgYXQgMzItYml0IGFsaWduZWQgYWRkcmVzc2VzLCBhbmQgZXhjZXB0IGZvciB0aGUKK0MgZmlyc3QgYW5kIGxhc3Qgc3RvcmUsIHdlIHdyaXRlIHVzaW5nIDY0LWJpdCBhbGlnbmVkIGFkZHJlc3Nlcy4gIEFsbCBzaGlmdGluZworQyBpcyBkb25lIG9uIDY0LWJpdCB3b3JkcyBpbiAnZXh0ZW5zaW9uJyByZWdpc3RlcnMuCitDCitDIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZWFkIGFsc28gdXNpbmcgNjQtYml0IGFsaWdubWVudCwgYnkgbWFuaXB1bGF0aW5nCitDIHRoZSBzaGlmdCBjb3VudCBmb3IgdW5hbGlnbmVkIG9wZXJhbmRzLiAgTm90IGRvbmUsIHNpbmNlIGl0IGRvZXMgbm90IHNlZW0gdG8KK0MgbWF0dGVyIGZvciBBOSBvciBBMTUuCitDCitDIFRoaXMgd2lsbCBub3Qgd29yayBpbiBiaWctZW5kaWFuIG1vZGUuCisKK0MgVE9ETworQyAgKiBUcnkgdXNpbmcgMTI4LWJpdCBvcGVyYXRpb25zLiAgTm90ZSB0aGF0IE5lb24gbGFja3MgcHVyZSAxMjgtYml0IHNoaWZ0cywKK0MgICAgd2hpY2ggbWlnaHQgbWFrZSBpdCB0cmlja3kuCitDICAqIENsZWFuIHVwIGFuZCBzaW1wbGlmeS4KK0MgICogQ29uc2lkZXIgc2hhcmluZyBtb3N0IG9mIHRoZSBjb2RlIGZvciBsc2hpZnQgYW5kIHJzaGlmdCwgc2luY2UgdGhlIGZlZWQtaW4KK0MgICAgY29kZSwgdGhlIGxvb3AsIGFuZCBtb3N0IG9mIHRoZSB3aW5kLWRvd24gY29kZSBhcmUgaWRlbnRpY2FsLgorQyAgKiBSZXBsYWNlIHRoZSBiYXNlY2FzZSBjb2RlIHdpdGggY29kZSB1c2luZyAnZXh0ZW5zaW9uJyByZWdpc3RlcnMuCitDICAqIE9wdGltaXNlLiAgSXQgaXMgbm90IGNsZWFyIHRoYXQgdGhpcyBsb29wIGluc24gcGVybXV0YXRpb24gaXMgb3B0aW1hbCBmb3IKK0MgICAgZWl0aGVyIEE5IG9yIEExNS4KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywgIGByMCcpCitkZWZpbmUoYGFwJywgIGByMScpCitkZWZpbmUoYG4nLCAgIGByMicpCitkZWZpbmUoYGNudCcsIGByMycpCisKK2lmZGVmKGBPUEVSQVRJT05fbHNoaWZ0JyxgCisJZGVmaW5lKGBJRkxTSCcsIGAkMScpCisJZGVmaW5lKGBJRlJTSCcsIGAnKQorCWRlZmluZShgWCcsYDAnKQorCWRlZmluZShgWScsYDEnKQorCWRlZmluZShgZnVuYycsYG1wbl9sc2hpZnQnKQorJykKK2lmZGVmKGBPUEVSQVRJT05fcnNoaWZ0JyxgCisJZGVmaW5lKGBJRkxTSCcsIGAnKQorCWRlZmluZShgSUZSU0gnLCBgJDEnKQorCWRlZmluZShgWCcsYDEnKQorCWRlZmluZShgWScsYDAnKQorCWRlZmluZShgZnVuYycsYG1wbl9yc2hpZnQnKQorJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fbHNoaWZ0IG1wbl9yc2hpZnQpCisKK0FTTV9TVEFSVChuZW9uKQorCVRFWFQKKwlBTElHTig2NCkKK1BST0xPR1VFKGZ1bmMpCitJRkxTSChgCW1vdglyMTIsIG4sIGxzbCAjMgknKQorSUZMU0goYAlhZGQJcnAsIHJwLCByMTIJJykKK0lGTFNIKGAJYWRkCWFwLCBhcCwgcjEyCScpCisKKwljbXAJbiwgIzQJCQlDIFNJTUQgY29kZSBuIGxpbWl0CisJYmxlCUwoYmFzZSkKKworaWZkZWYoYE9QRVJBVElPTl9sc2hpZnQnLGAKKwl2ZHVwLjMyCWQ2LCByMwkJCUMgbGVmdCBzaGlmdCBjb3VudCBpcyBwb3NpdGl2ZQorCXN1YglyMywgcjMsICM2NAkJQyByaWdodCBzaGlmdCBjb3VudCBpcyBuZWdhdGl2ZQorCXZkdXAuMzIJZDcsIHIzCisJbW92CXIxMiwgIy04JykJCUMgbHNoaWZ0IHBvaW50ZXIgdXBkYXRlIG9mZnNldAoraWZkZWYoYE9QRVJBVElPTl9yc2hpZnQnLGAKKwlyc2IJcjMsIHIzLCAjMAkJQyByaWdodCBzaGlmdCBjb3VudCBpcyBuZWdhdGl2ZQorCXZkdXAuMzIJZDYsIHIzCisJYWRkCXIzLCByMywgIzY0CQlDIGxlZnQgc2hpZnQgY291bnQgaXMgcG9zaXRpdmUKKwl2ZHVwLjMyCWQ3LCByMworCW1vdglyMTIsICM4JykJCUMgcnNoaWZ0IHBvaW50ZXIgdXBkYXRlIG9mZnNldAorCitJRkxTSChgCXN1YglhcCwgYXAsICM4CScpCisJdmxkMS4zMgl7ZDE5fSwgW2FwXSwgcjEyCUMgbG9hZCBpbml0aWFsIDIgbGltYnMKKwl2c2hsLnU2NCBkMTgsIGQxOSwgZDcJCUMgcmV0dmFsCisKKwl0c3QJcnAsICM0CQkJQyBpcyBycCA2NC1iaXQgYWxpZ25lZCBhbHJlYWR5PworCWJlcQlMKHJwX2FsaWduZWQpCQlDIHllcywgc2tpcAorSUZMU0goYAlhZGQJYXAsIGFwLCAjNAknKQlDIG1vdmUgYmFjayBhcCBwb2ludGVyCitJRlJTSChgCXN1YglhcCwgYXAsICM0CScpCUMgbW92ZSBiYWNrIGFwIHBvaW50ZXIKKwl2c2hsLnU2NCBkNCwgZDE5LCBkNgorCXN1YgluLCBuLCAjMQkJQyBmaXJzdCBsaW1iIGhhbmRsZWQKK0lGTFNIKGAJc3ViCSBycCwgcnAsICM0CScpCisJdnN0MS4zMgkge2Q0W1ldfSwgW3JwXUlGUlNIKCEpCUMgc3RvcmUgZmlyc3QgbGltYiwgcnAgZ2V0cyBhbGlnbmVkCisJdmxkMS4zMgkge2QxOX0sIFthcF0sIHIxMglDIGxvYWQgYXBbMV0gYW5kIGFwWzJdCisKK0wocnBfYWxpZ25lZCk6CitJRkxTSChgCXN1YglycCwgcnAsICM4CScpCisJc3VicwluLCBuLCAjNgorCWJsdAlMKHR3b19vcl90aHJlZV9tb3JlKQorCXRzdAluLCAjMgorCWJlcQlMKDIpCisKK0woMSk6CXZsZDEuMzIJIHtkMTd9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkNSwgZDE5LCBkNgorCXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZzaGwudTY0IGQ0LCBkMTcsIGQ2CisJc3ViCW4sIG4sICMyCisJYgkgTChtaWQpCisKK0woMik6CXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkNCwgZDE5LCBkNgorCXZsZDEuMzIJIHtkMTd9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkMSwgZDE2LCBkNworCXZzaGwudTY0IGQ1LCBkMTYsIGQ2CisJc3VicwluLCBuLCAjNAorCWJsdAlMKGVuZCkKKworTCh0b3ApOgl2bGQxLjMyCSB7ZDE2fSwgW2FwXSwgcjEyCisJdm9ycgkgZDIsIGQ0LCBkMQorCXZzaGwudTY0IGQwLCBkMTcsIGQ3CisJdnNobC51NjQgZDQsIGQxNywgZDYKKwl2c3QxLjMyCSB7ZDJ9LCBbcnA6NjRdLCByMTIKK0wobWlkKToJdmxkMS4zMgkge2QxN30sIFthcF0sIHIxMgorCXZvcnIJIGQzLCBkNSwgZDAKKwl2c2hsLnU2NCBkMSwgZDE2LCBkNworCXZzaGwudTY0IGQ1LCBkMTYsIGQ2CisJdnN0MS4zMgkge2QzfSwgW3JwOjY0XSwgcjEyCisJc3VicwluLCBuLCAjNAorCWJnZQlMKHRvcCkKKworTChlbmQpOgl0c3QJIG4sICMxCisJYmVxCSBMKGV2bikKKworCXZvcnIJIGQyLCBkNCwgZDEKKwl2c3QxLjMyCSB7ZDJ9LCBbcnA6NjRdLCByMTIKKwliCSBMKGNqMSkKKworTChldm4pOgl2b3JyCSBkMiwgZDQsIGQxCisJdnNobC51NjQgZDAsIGQxNywgZDcKKwl2c2hsLnU2NCBkMTYsIGQxNywgZDYKKwl2c3QxLjMyCSB7ZDJ9LCBbcnA6NjRdLCByMTIKKwl2b3JyCSBkMiwgZDUsIGQwCisJYgkgTChjajIpCisKK0MgTG9hZCBsYXN0IDIgLSAzIGxpbWJzLCBzdG9yZSBsYXN0IDQgLSA1IGxpbWJzCitMKHR3b19vcl90aHJlZV9tb3JlKToKKwl0c3QJbiwgIzEKKwliZXEJTChsMikKKworTChsMyk6CXZzaGwudTY0IGQ1LCBkMTksIGQ2CisJdmxkMS4zMgkge2QxN30sIFthcF0sIHIxMgorTChjajEpOgl2ZW9yCSBkMTYsIGQxNiwgZDE2CitJRkxTSChgCWFkZAkgYXAsIGFwLCAjNAknKQorCXZsZDEuMzIJIHtkMTZbWV19LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZzaGwudTY0IGQ0LCBkMTcsIGQ2CisJdm9ycgkgZDMsIGQ1LCBkMAorCXZzaGwudTY0IGQxLCBkMTYsIGQ3CisJdnNobC51NjQgZDUsIGQxNiwgZDYKKwl2c3QxLjMyCSB7ZDN9LCBbcnA6NjRdLCByMTIKKwl2b3JyCSBkMiwgZDQsIGQxCisJdnN0MS4zMgkge2QyfSwgW3JwOjY0XSwgcjEyCitJRkxTSChgCWFkZAkgcnAsIHJwLCAjNAknKQorCXZzdDEuMzIJIHtkNVtZXX0sIFtycF0KKwl2bW92LjMyCSByMCwgZDE4W1hdCisJYngJbHIKKworTChsMik6CXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkNCwgZDE5LCBkNgorCXZzaGwudTY0IGQxLCBkMTYsIGQ3CisJdnNobC51NjQgZDE2LCBkMTYsIGQ2CisJdm9ycgkgZDIsIGQ0LCBkMQorTChjajIpOgl2c3QxLjMyCSB7ZDJ9LCBbcnA6NjRdLCByMTIKKwl2c3QxLjMyCSB7ZDE2fSwgW3JwXQorCXZtb3YuMzIJIHIwLCBkMThbWF0KKwlieAlscgorCisKK2RlZmluZShgdG5jJywgYHIxMicpCitMKGJhc2UpOgorCXB1c2gJe3I0LCByNiwgcjcsIHI4fQoraWZkZWYoYE9QRVJBVElPTl9sc2hpZnQnLGAKKwlsZHIJcjQsIFthcCwgIy00XSEKKwlyc2IJdG5jLCBjbnQsICMzMgorCisJbW92CXI3LCByNCwgbHNsIGNudAorCXRzdAluLCAjMQorCWJlcQlMKGV2KQkJCUMgbiBldmVuCisKK0wob2QpOglzdWJzCW4sIG4sICMyCisJYmNjCUwoZWQxKQkJCUMgbiA9IDEKKwlsZHIJcjgsIFthcCwgIy00XSEKKwliCUwobWQpCQkJQyBuID0gMworCitMKGV2KToJbGRyCXI2LCBbYXAsICMtNF0hCisJc3VicwluLCBuLCAjMgorCWJlcQlMKGVkKQkJCUMgbiA9IDMKKwkJCQkJQyBuID0gNAorTCh0cCk6CWxkcglyOCwgW2FwLCAjLTRdIQorCW9ycglyNywgcjcsIHI2LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbW92CXI3LCByNiwgbHNsIGNudAorTChtZCk6CWxkcglyNiwgW2FwLCAjLTRdIQorCW9ycglyNywgcjcsIHI4LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbW92CXI3LCByOCwgbHNsIGNudAorCitMKGVkKToJb3JyCXI3LCByNywgcjYsIGxzciB0bmMKKwlzdHIJcjcsIFtycCwgIy00XSEKKwltb3YJcjcsIHI2LCBsc2wgY250CitMKGVkMSk6CXN0cglyNywgW3JwLCAjLTRdCisJbW92CXIwLCByNCwgbHNyIHRuYworJykKK2lmZGVmKGBPUEVSQVRJT05fcnNoaWZ0JyxgCisJbGRyCXI0LCBbYXBdCisJcnNiCXRuYywgY250LCAjMzIKKworCW1vdglyNywgcjQsIGxzciBjbnQKKwl0c3QJbiwgIzEKKwliZXEJTChldikJCQlDIG4gZXZlbgorCitMKG9kKToJc3VicwluLCBuLCAjMgorCWJjYwlMKGVkMSkJCQlDIG4gPSAxCisJbGRyCXI4LCBbYXAsICM0XSEKKwliCUwobWQpCQkJQyBuID0gMworCitMKGV2KToJbGRyCXI2LCBbYXAsICM0XSEKKwlzdWJzCW4sIG4sICMyCisJYmVxCUwoZWQpCQkJQyBuID0gMgorCQkJCQlDIG4gPSA0CisKK0wodHApOglsZHIJcjgsIFthcCwgIzRdIQorCW9ycglyNywgcjcsIHI2LCBsc2wgdG5jCisJc3RyCXI3LCBbcnBdLCAjNAorCW1vdglyNywgcjYsIGxzciBjbnQKK0wobWQpOglsZHIJcjYsIFthcCwgIzRdIQorCW9ycglyNywgcjcsIHI4LCBsc2wgdG5jCisJc3RyCXI3LCBbcnBdLCAjNAorCW1vdglyNywgcjgsIGxzciBjbnQKKworTChlZCk6CW9ycglyNywgcjcsIHI2LCBsc2wgdG5jCisJc3RyCXI3LCBbcnBdLCAjNAorCW1vdglyNywgcjYsIGxzciBjbnQKK0woZWQxKToJc3RyCXI3LCBbcnBdLCAjNAorCW1vdglyMCwgcjQsIGxzbCB0bmMKKycpCisJcG9wCXtyNCwgcjYsIHI3LCByOH0KKwlieAlyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vbmVvbi9sc2hpZnRjLmFzbSBiL21wbi9hcm0vbmVvbi9sc2hpZnRjLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTdjYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9uZW9uL2xzaGlmdGMuYXNtCkBAIC0wLDAgKzEsMjQyIEBACitkbmwgIEFSTSBOZW9uIG1wbl9sc2hpZnRjLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iICAgICBjeWNsZXMvbGltYiAgICAgY3ljbGVzL2xpbWIgICAgICBnb29kCitDICAgICAgICAgICAgICBhbGlnbmVkCSAgICAgIHVuYWxpZ25lZAkgICAgICBiZXN0IHNlZW4JICAgICBmb3IgY3B1PworQyBTdHJvbmdBUk0JIC0JCSAtCitDIFhTY2FsZQkgLQkJIC0KK0MgQ29ydGV4LUE3CSA/CQkgPworQyBDb3J0ZXgtQTgJID8JCSA/CitDIENvcnRleC1BOQkgMy41CQkgMy41CQkJCVkKK0MgQ29ydGV4LUExNQkgMS43NQkJIDEuNzUJCQkJWQorCisKK0MgV2UgcmVhZCA2NCBiaXRzIGF0IGEgdGltZSBhdCAzMi1iaXQgYWxpZ25lZCBhZGRyZXNzZXMsIGFuZCBleGNlcHQgZm9yIHRoZQorQyBmaXJzdCBhbmQgbGFzdCBzdG9yZSwgd2Ugd3JpdGUgdXNpbmcgNjQtYml0IGFsaWduZWQgYWRkcmVzc2VzLiAgQWxsIHNoaWZ0aW5nCitDIGlzIGRvbmUgb24gNjQtYml0IHdvcmRzIGluICdleHRlbnNpb24nIHJlZ2lzdGVycy4KK0MKK0MgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlYWQgYWxzbyB1c2luZyA2NC1iaXQgYWxpZ25tZW50LCBieSBtYW5pcHVsYXRpbmcKK0MgdGhlIHNoaWZ0IGNvdW50IGZvciB1bmFsaWduZWQgb3BlcmFuZHMuICBOb3QgZG9uZSwgc2luY2UgaXQgZG9lcyBub3Qgc2VlbSB0bworQyBtYXR0ZXIgZm9yIEE5IG9yIEExNS4KK0MKK0MgVGhpcyB3aWxsIG5vdCB3b3JrIGluIGJpZy1lbmRpYW4gbW9kZS4KKworQyBUT0RPCitDICAqIFRyeSB1c2luZyAxMjgtYml0IG9wZXJhdGlvbnMuICBOb3RlIHRoYXQgTmVvbiBsYWNrcyBwdXJlIDEyOC1iaXQgc2hpZnRzLAorQyAgICB3aGljaCBtaWdodCBtYWtlIGl0IHRyaWNreS4KK0MgICogQ2xlYW4gdXAgYW5kIHNpbXBsaWZ5LgorQyAgKiBDb25zaWRlciBzaGFyaW5nIG1vc3Qgb2YgdGhlIGNvZGUgZm9yIGxzaGlmdCBhbmQgcnNoaWZ0LCBzaW5jZSB0aGUgZmVlZC1pbgorQyAgICBjb2RlLCB0aGUgbG9vcCwgYW5kIG1vc3Qgb2YgdGhlIHdpbmQtZG93biBjb2RlIGFyZSBpZGVudGljYWwuCitDICAqIFJlcGxhY2UgdGhlIGJhc2VjYXNlIGNvZGUgd2l0aCBjb2RlIHVzaW5nICdleHRlbnNpb24nIHJlZ2lzdGVycy4KK0MgICogT3B0aW1pc2UuICBJdCBpcyBub3QgY2xlYXIgdGhhdCB0aGlzIGxvb3AgaW5zbiBwZXJtdXRhdGlvbiBpcyBvcHRpbWFsIGZvcgorQyAgICBlaXRoZXIgQTkgb3IgQTE1LgorCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcnAnLCAgYHIwJykKK2RlZmluZShgYXAnLCAgYHIxJykKK2RlZmluZShgbicsICAgYHIyJykKK2RlZmluZShgY250JywgYHIzJykKKworQVNNX1NUQVJUKG5lb24pCisJVEVYVAorCUFMSUdOKDY0KQorUFJPTE9HVUUobXBuX2xzaGlmdGMpCisJbW92CXIxMiwgbiwgbHNsICMyCisJYWRkCXJwLCBycCwgcjEyCisJYWRkCWFwLCBhcCwgcjEyCisKKwljbXAJbiwgIzQJCQlDIFNJTUQgY29kZSBuIGxpbWl0CisJYmxlCUwoYmFzZSkKKworCXZkdXAuMzIJZDYsIHIzCQkJQyBsZWZ0IHNoaWZ0IGNvdW50IGlzIHBvc2l0aXZlCisJc3ViCXIzLCByMywgIzY0CQlDIHJpZ2h0IHNoaWZ0IGNvdW50IGlzIG5lZ2F0aXZlCisJdmR1cC4zMglkNywgcjMKKwltb3YJcjEyLCAjLTgJCUMgbHNoaWZ0IHBvaW50ZXIgdXBkYXRlIG9mZnNldAorCisJc3ViCWFwLCBhcCwgIzgKKwl2bGQxLjMyCXtkMTl9LCBbYXBdLCByMTIJQyBsb2FkIGluaXRpYWwgMiBsaW1icworCXZzaGwudTY0IGQxOCwgZDE5LCBkNwkJQyByZXR2YWwKKworCXRzdAlycCwgIzQJCQlDIGlzIHJwIDY0LWJpdCBhbGlnbmVkIGFscmVhZHk/CisJYmVxCUwocnBfYWxpZ25lZCkJCUMgeWVzLCBza2lwCisJdm12bgkgZDE5LCBkMTkKKwlhZGQJYXAsIGFwLCAjNAkJQyBtb3ZlIGJhY2sgYXAgcG9pbnRlcgorCXZzaGwudTY0IGQ0LCBkMTksIGQ2CisJc3ViCW4sIG4sICMxCQlDIGZpcnN0IGxpbWIgaGFuZGxlZAorCXN1YgkgcnAsIHJwLCAjNAorCXZzdDEuMzIJIHtkNFsxXX0sIFtycF0JCUMgc3RvcmUgZmlyc3QgbGltYiwgcnAgZ2V0cyBhbGlnbmVkCisJdmxkMS4zMgkge2QxOX0sIFthcF0sIHIxMglDIGxvYWQgYXBbMV0gYW5kIGFwWzJdCisKK0wocnBfYWxpZ25lZCk6CisJc3ViCXJwLCBycCwgIzgKKwlzdWJzCW4sIG4sICM2CisJdm12bgkgZDE5LCBkMTkKKwlibHQJTCh0d29fb3JfdGhyZWVfbW9yZSkKKwl0c3QJbiwgIzIKKwliZXEJTCgyKQorCitMKDEpOgl2bGQxLjMyCSB7ZDE3fSwgW2FwXSwgcjEyCisJdnNobC51NjQgZDUsIGQxOSwgZDYKKwl2bXZuCSBkMTcsIGQxNworCXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZzaGwudTY0IGQ0LCBkMTcsIGQ2CisJc3ViCW4sIG4sICMyCisJYgkgTChtaWQpCisKK0woMik6CXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkNCwgZDE5LCBkNgorCXZtdm4JIGQxNiwgZDE2CisJdmxkMS4zMgkge2QxN30sIFthcF0sIHIxMgorCXZzaGwudTY0IGQxLCBkMTYsIGQ3CisJdnNobC51NjQgZDUsIGQxNiwgZDYKKwlzdWJzCW4sIG4sICM0CisJYmx0CUwoZW5kKQorCitMKHRvcCk6CXZtdm4JIGQxNywgZDE3CisJdmxkMS4zMgkge2QxNn0sIFthcF0sIHIxMgorCXZvcnIJIGQyLCBkNCwgZDEKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZzaGwudTY0IGQ0LCBkMTcsIGQ2CisJdnN0MS4zMgkge2QyfSwgW3JwOjY0XSwgcjEyCitMKG1pZCk6CXZtdm4JIGQxNiwgZDE2CisJdmxkMS4zMgkge2QxN30sIFthcF0sIHIxMgorCXZvcnIJIGQzLCBkNSwgZDAKKwl2c2hsLnU2NCBkMSwgZDE2LCBkNworCXZzaGwudTY0IGQ1LCBkMTYsIGQ2CisJdnN0MS4zMgkge2QzfSwgW3JwOjY0XSwgcjEyCisJc3VicwluLCBuLCAjNAorCWJnZQlMKHRvcCkKKworTChlbmQpOgl0c3QJIG4sICMxCisJYmVxCSBMKGV2bikKKworCXZvcnIJIGQyLCBkNCwgZDEKKwl2c3QxLjMyCSB7ZDJ9LCBbcnA6NjRdLCByMTIKKwliCSBMKGNqMSkKKworTChldm4pOgl2bXZuCSBkMTcsIGQxNworCXZvcnIJIGQyLCBkNCwgZDEKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZzaGwudTY0IGQ0LCBkMTcsIGQ2CisJdnN0MS4zMgkge2QyfSwgW3JwOjY0XSwgcjEyCisJdm1vdi51OAkgZDE3LCAjMjU1CisJdm9ycgkgZDIsIGQ1LCBkMAorCXZzaGwudTY0IGQwLCBkMTcsIGQ3CisJdm9ycgkgZDMsIGQ0LCBkMAorCWIJIEwoY2oyKQorCitDIExvYWQgbGFzdCAyIC0gMyBsaW1icywgc3RvcmUgbGFzdCA0IC0gNSBsaW1icworTCh0d29fb3JfdGhyZWVfbW9yZSk6CisJdHN0CW4sICMxCisJYmVxCUwobDIpCisKK0wobDMpOgl2c2hsLnU2NCBkNSwgZDE5LCBkNgorCXZsZDEuMzIJIHtkMTd9LCBbYXBdLCByMTIKK0woY2oxKToJdm1vdi51OAkgZDE2LCAjMAorCWFkZAkgYXAsIGFwLCAjNAorCXZtdm4JIGQxNywgZDE3CisJdmxkMS4zMgkge2QxNlsxXX0sIFthcF0sIHIxMgorCXZzaGwudTY0IGQwLCBkMTcsIGQ3CisJdnNobC51NjQgZDQsIGQxNywgZDYKKwl2bXZuCSBkMTYsIGQxNgorCXZvcnIJIGQzLCBkNSwgZDAKKwl2c2hsLnU2NCBkMSwgZDE2LCBkNworCXZzaGwudTY0IGQ1LCBkMTYsIGQ2CisJdnN0MS4zMgkge2QzfSwgW3JwOjY0XSwgcjEyCisJdm9ycgkgZDIsIGQ0LCBkMQorCXZzdDEuMzIJIHtkMn0sIFtycDo2NF0sIHIxMgorCWFkZAkgcnAsIHJwLCAjNAorCXZzdDEuMzIJIHtkNVsxXX0sIFtycF0KKwl2bW92LjMyCSByMCwgZDE4WzBdCisJYngJbHIKKworTChsMik6CXZsZDEuMzIJIHtkMTZ9LCBbYXBdLCByMTIKKwl2c2hsLnU2NCBkNCwgZDE5LCBkNgorCXZtdm4JIGQxNiwgZDE2CisJdnNobC51NjQgZDEsIGQxNiwgZDcKKwl2c2hsLnU2NCBkNSwgZDE2LCBkNgorCXZtb3YudTgJIGQxNywgIzI1NQorCXZvcnIJIGQyLCBkNCwgZDEKKwl2c2hsLnU2NCBkMCwgZDE3LCBkNworCXZvcnIJIGQzLCBkNSwgZDAKK0woY2oyKToJdnN0MS4zMgkge2QyfSwgW3JwOjY0XSwgcjEyCisJdnN0MS4zMgkge2QzfSwgW3JwXQorCXZtb3YuMzIJIHIwLCBkMThbMF0KKwlieAlscgorCisKK2RlZmluZShgdG5jJywgYHIxMicpCitMKGJhc2UpOgorCXB1c2gJe3I0LCByNiwgcjcsIHI4fQorCWxkcglyNCwgW2FwLCAjLTRdIQorCXJzYgl0bmMsIGNudCwgIzMyCisJbXZuCXI2LCByNAorCisJbW92CXI3LCByNiwgbHNsIGNudAorCXRzdAluLCAjMQorCWJlcQlMKGV2KQkJCUMgbiBldmVuCisKK0wob2QpOglzdWJzCW4sIG4sICMyCisJYmNjCUwoZWQxKQkJCUMgbiA9IDEKKwlsZHIJcjgsIFthcCwgIy00XSEKKwltdm4JcjgsIHI4CisJYglMKG1kKQkJCUMgbiA9IDMKKworTChldik6CWxkcglyNiwgW2FwLCAjLTRdIQorCW12bglyNiwgcjYKKwlzdWJzCW4sIG4sICMyCisJYmVxCUwoZWQpCQkJQyBuID0gMworCQkJCQlDIG4gPSA0CitMKHRwKToJbGRyCXI4LCBbYXAsICMtNF0hCisJb3JyCXI3LCByNywgcjYsIGxzciB0bmMKKwlzdHIJcjcsIFtycCwgIy00XSEKKwltdm4JcjgsIHI4CisJbW92CXI3LCByNiwgbHNsIGNudAorTChtZCk6CWxkcglyNiwgW2FwLCAjLTRdIQorCW9ycglyNywgcjcsIHI4LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbXZuCXI2LCByNgorCW1vdglyNywgcjgsIGxzbCBjbnQKKworTChlZCk6CW9ycglyNywgcjcsIHI2LCBsc3IgdG5jCisJc3RyCXI3LCBbcnAsICMtNF0hCisJbW92CXI3LCByNiwgbHNsIGNudAorTChlZDEpOgltdm4JcjYsICMwCisJb3JyCXI3LCByNywgcjYsIGxzciB0bmMKKwlzdHIJcjcsIFtycCwgIy00XQorCW1vdglyMCwgcjQsIGxzciB0bmMKKwlwb3AJe3I0LCByNiwgcjcsIHI4fQorCWJ4CXIxNAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9uZW9uL3BvcGNvdW50LmFzbSBiL21wbi9hcm0vbmVvbi9wb3Bjb3VudC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYmJkYQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vbmVvbi9wb3Bjb3VudC5hc20KQEAgLTAsMCArMSwxNjYgQEAKK2RubCAgQVJNIE5lb24gbXBuX3BvcGNvdW50IC0tIG1wbiBiaXQgcG9wdWxhdGlvbiBjb3VudC4KKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNOgkgLQorQyBYU2NhbGUJIC0KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDEuMTI1CitDIENvcnRleC1BMTUJIDAuNTYKKworQyBUT0RPCitDICAqIEV4cGxvcmUgdXNpbmcgdmxkciBhbmQgdmxkbS4gIERvZXMgaXQgaGVscCBvbiBBOT8gIChUaGVzZSBsb2FkcyBkbworQyAgICA2NC1iaXRzLWF0LWEtdGltZSwgd2hpY2ggd2lsbCBtZXNzIHVwIGluIGJpZy1lbmRpYW4gbW9kZS4gIEV4Y2VwdCBub3QgZm9yCitDICAgIHBvcGNvdW50LiBFeGNlcHQgcGVyaGFwcyBhbHNvIGZvciBwb3Bjb3VudCBmb3IgdGhlIGVkZ2UgbG9hZHMuKQorQyAgKiBBcnJhbmdlIHRvIGFsaWduIHRoZSBwb2ludGVyLCBpZiB0aGF0IGhlbHBzIHBlcmZvcm1hbmNlLiAgVXNlIHRoZSBzYW1lCitDICAgIHJlYWQtYW5kLW1hc2sgdHJpY2sgd2UgdXNlIG9uIFBDcywgZm9yIHNpbXBsaWNpdHkgYW5kIHBlcmZvcm1hbmNlLiAgKFNvcnJ5CitDICAgIHZhbGdyaW5kISkKK0MgICogRXhwbG9yZSBpZiBleHBsaWNpdCBhbGlnbiBkaXJlY3RpdmVzLCBlLmcuLCAiW3B0cjoxMjhdIiBoZWxwLgorQyAgKiBTZWUgcnRoJ3MgZ21wLWRldmVsIDIwMTMtMDIvMDMgbWVzc2FnZXMgYWJvdXQgZmluYWwgc3VtbWF0aW9uIHRyaWNrcy4KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYGFwJywgcjApCitkZWZpbmUoYG4nLCAgcjEpCisKK0MgV2Ugc3VtIGludG8gMTYgMTYtYml0IGNvdW50ZXJzIGluIHE4LHE5LCBidXQgYXQgdGhlIGVuZCB3ZSBzdW0gdGhlbSBhbmQgZW5kCitDIHVwIHdpdGggOCAxNi1iaXQgY291bnRlcnMuICBUaGVyZWZvcmUsIHdlIGNhbiBzdW0gdG8gOCgyXjE2LTEpIGJpdHMsIG9yCitDICg4KjJeMTYtMSkvMzIgPSAweDNmZmYgbGltYnMuICBXZSB1c2UgYSBjaHVua3NpemUgY2xvc2UgdG8gdGhhdCwgYnV0IHdoaWNoCitDIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIDgtYml0IEFSTSBjb25zdGFudC4KK0MKK2RlZmluZShgY2h1bmtzaXplJywweDNmODApCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fcG9wY291bnQpCisKKwljbXAJbiwgI2NodW5rc2l6ZQorCWJoaQlMKGd0MTZrKQorCitMKGx0MTZrKToKKwl2bW92Lmk2NCAgIHE4LCAjMAkJQyBjbGVhciBzdW1tYXRpb24gcmVnaXN0ZXIKKwl2bW92Lmk2NCAgIHE5LCAjMAkJQyBjbGVhciBzdW1tYXRpb24gcmVnaXN0ZXIKKworCXRzdAkgICBuLCAjMQorCWJlcQkgICBMKHh4eDApCisJdm1vdi5pNjQgICBkMCwgIzAKKwlzdWIJICAgbiwgbiwgIzEKKwl2bGQxLjMyICAge2QwWzBdfSwgW2FwXSEJQyBsb2FkIDEgbGltYgorCXZjbnQuOAkgICBkMjQsIGQwCisJdnBhZGFsLnU4ICBkMTYsIGQyNAkJQyBkMTYvcTggPSAwOyBjb3VsZCBqdXN0IHNwbGF0CisKK0woeHh4MCk6dHN0CSAgIG4sICMyCisJYmVxCSAgIEwoeHgwMCkKKwlzdWIJICAgbiwgbiwgIzIKKwl2bGQxLjMyICAgIHtkMH0sIFthcF0hCQlDIGxvYWQgMiBsaW1icworCXZjbnQuOAkgICBkMjQsIGQwCisJdnBhZGFsLnU4ICBkMTYsIGQyNAorCitMKHh4MDApOnRzdAkgICBuLCAjNAorCWJlcQkgICBMKHgwMDApCisJc3ViCSAgIG4sIG4sICM0CisJdmxkMS4zMiAgICB7cTB9LCBbYXBdIQkJQyBsb2FkIDQgbGltYnMKKwl2Y250LjgJICAgcTEyLCBxMAorCXZwYWRhbC51OCAgcTgsIHExMgorCitMKHgwMDApOnRzdAkgICBuLCAjOAorCWJlcQkgICBMKDAwMDApCisKKwlzdWJzCSAgIG4sIG4sICM4CisJdmxkMS4zMiAgICB7cTAscTF9LCBbYXBdIQlDIGxvYWQgOCBsaW1icworCWJscwkgICBMKHN1bSkKKworTChndDgpOgl2bGQxLjMyICAgIHtxMixxM30sIFthcF0hCUMgbG9hZCA4IGxpbWJzCisJc3ViCSAgIG4sIG4sICM4CisJdmNudC44CSAgIHExMiwgcTAKKwl2Y250LjgJICAgcTEzLCBxMQorCWIJICAgTChtaWQpCisKK0woMDAwMCk6c3VicwkgICBuLCBuLCAjMTYKKwlibG8JICAgTChlMCkKKworCXZsZDEuMzIgICAge3EyLHEzfSwgW2FwXSEJQyBsb2FkIDggbGltYnMKKwl2bGQxLjMyICAgIHtxMCxxMX0sIFthcF0hCUMgbG9hZCA4IGxpbWJzCisJdmNudC44CSAgIHExMiwgcTIKKwl2Y250LjgJICAgcTEzLCBxMworCXN1YnMJICAgbiwgbiwgIzE2CisJYmxvCSAgIEwoZW5kKQorCitMKHRvcCk6CXZsZDEuMzIgICAge3EyLHEzfSwgW2FwXSEJQyBsb2FkIDggbGltYnMKKwl2cGFkYWwudTggIHE4LCBxMTIKKwl2Y250LjgJICAgcTEyLCBxMAorCXZwYWRhbC51OCAgcTksIHExMworCXZjbnQuOAkgICBxMTMsIHExCitMKG1pZCk6CXZsZDEuMzIgICAge3EwLHExfSwgW2FwXSEJQyBsb2FkIDggbGltYnMKKwlzdWJzCSAgIG4sIG4sICMxNgorCXZwYWRhbC51OCAgcTgsIHExMgorCXZjbnQuOAkgICBxMTIsIHEyCisJdnBhZGFsLnU4ICBxOSwgcTEzCisJdmNudC44CSAgIHExMywgcTMKKwliaHMJICAgTCh0b3ApCisKK0woZW5kKToJdnBhZGFsLnU4ICBxOCwgcTEyCisJdnBhZGFsLnU4ICBxOSwgcTEzCitMKHN1bSk6CXZjbnQuOAkgICBxMTIsIHEwCisJdmNudC44CSAgIHExMywgcTEKKwl2cGFkYWwudTggIHE4LCBxMTIKKwl2cGFkYWwudTggIHE5LCBxMTMKKwl2YWRkLmkxNiAgIHE4LCBxOCwgcTkKKwkJCQkJQyB3ZSBoYXZlIDggMTYtYml0IGNvdW50cworTChlMCk6CXZwYWRkbC51MTYgcTgsIHE4CQlDIHdlIGhhdmUgNCAzMi1iaXQgY291bnRzCisJdnBhZGRsLnUzMiBxOCwgcTgJCUMgd2UgaGF2ZSAyIDY0LWJpdCBjb3VudHMKKwl2bW92LjMyICAgIHIwLCBkMTZbMF0KKwl2bW92LjMyICAgIHIxLCBkMTdbMF0KKwlhZGQJICAgcjAsIHIwLCByMQorCWJ4CWxyCisKK0MgQ29kZSBmb3IgbGFyZ2UgY291bnQuICBTcGxpdHMgb3BlcmFuZCBhbmQgY2FsbHMgYWJvdmUgY29kZS4KK2RlZmluZShgYXAyJywgcjIpCQkJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCitMKGd0MTZrKToKKwlwdXNoCXtyNCxyMTR9CisJbW92CWFwMiwgYXAKKwltb3YJcjMsIG4JCQlDIGZ1bGwgY291bnQKKwltb3YJcjQsICMwCQkJQyB0b3RhbCBzdW0KKworMToJbW92CW4sICNjaHVua3NpemUJCUMgY291bnQgZm9yIHRoaXMgaW52b2NhdGlvbgorCWJsCUwobHQxNmspCQlDIGNvdWxkIGp1bXAgZGVlcCBpbnNpZGUgY29kZQorCWFkZAlhcDIsIGFwMiwgI2NodW5rc2l6ZSo0CUMgcG9pbnQgYXQgbmV4dCBjaHVuaworCWFkZAlyNCwgcjQsIHIwCisJbW92CWFwLCBhcDIJCQlDIHB1dCBjaHVuayBwb2ludGVyIGluIHBsYWNlIGZvciBjYWxsCisJc3ViCXIzLCByMywgI2NodW5rc2l6ZQorCWNtcAlyMywgI2NodW5rc2l6ZQorCWJoaQkxYgorCisJbW92CW4sIHIzCQkJQyBjb3VudCBmb3IgZmluYWwgaW52b2NhdGlvbgorCWJsCUwobHQxNmspCisJYWRkCXIwLCByNCwgcjAKKwlwb3AJe3I0LHBjfQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9uZW9uL3NlY190YWJzZWxlY3QuYXNtIGIvbXBuL2FybS9uZW9uL3NlY190YWJzZWxlY3QuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2ZlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL25lb24vc2VjX3RhYnNlbGVjdC5hc20KQEAgLTAsMCArMSwxNDAgQEAKK2RubCAgQVJNIE5lb24gbXBuX3NlY190YWJzZWxlY3QuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTQkgLQorQyBYU2NhbGUJIC0KK0MgQ29ydGV4LUE3CSA/CitDIENvcnRleC1BOAkgPworQyBDb3J0ZXgtQTkJIDEuMTUKK0MgQ29ydGV4LUExNQkgMC42NQorCitkZWZpbmUoYHJwJywgICAgIGByMCcpCitkZWZpbmUoYHRwJywgICAgIGByMScpCitkZWZpbmUoYG4nLCAgICAgIGByMicpCitkZWZpbmUoYG5lbnRzJywgIGByMycpCitDIGRlZmluZShgd2hpY2gnLCAgb24gc3RhY2spCisKK2RlZmluZShgaScsICAgICAgYHI0JykKK2RlZmluZShgaicsICAgICAgYHI1JykKKworZGVmaW5lKGBtYXNrcScsICBgcTEwJykKK2RlZmluZShgbWFza2QnLCAgYGQyMCcpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fc2VjX3RhYnNlbGVjdCkKKwlwdXNoCXtyNC1yNX0KKworCWFkZAkgIHI0LCBzcCwgIzgKKwl2bGQxLjMyCSAge2QzMFtdLCBkMzFbXX0sIFtyNF0JQyA0IGB3aGljaCcgY29waWVzCisJdm1vdi5pMzIgIHExNCwgIzEJCUMgNCBjb3BpZXMgb2YgMQorCisJc3VicwlqLCBuLCAjOAorCWJtaQlMKG91dGVyX2VuZCkKKworTChvdXRlcl90b3ApOgorCW1vdgkgIGksIG5lbnRzCisJbW92CSAgcjEyLCB0cAkJQyBwcmVzZXJ2ZSB0cAorCXZlb3IJICBxMTMsIHExMywgcTEzCQlDIDQgY291bnRlciBjb3BpZXMKKwl2ZW9yCSAgcTIsIHEyLCBxMgorCXZlb3IJICBxMywgcTMsIHEzCisJQUxJR04oMTYpCitMKHRvcCk6CXZjZXEuaTMyICBtYXNrcSwgcTEzLCBxMTUJQyBjb21wYXJlIGlkeCBjb3BpZXMgdG8gYHdoaWNoJyBjb3BpZXMKKwl2bGQxLjMyCSAge3EwLHExfSwgW3RwXQorCXZhZGQuaTMyICBxMTMsIHExMywgcTE0CisJdmJpdAkgIHEyLCBxMCwgbWFza3EKKwl2Yml0CSAgcTMsIHExLCBtYXNrcQorCWFkZAkgIHRwLCB0cCwgbiwgbHNsICMyCisJc3VicwkgIGksIGksICMxCisJYm5lCSAgTCh0b3ApCisJdnN0MS4zMgkgIHtxMixxM30sIFtycF0hCisJYWRkCSAgdHAsIHIxMiwgIzMyCQlDIHJlc3RvcmUgdHAsIHBvaW50IHRvIG5leHQgc2xpY2UKKwlzdWJzCSAgaiwgaiwgIzgKKwlicGwJICBMKG91dGVyX3RvcCkKK0wob3V0ZXJfZW5kKToKKworCXRzdAkgIG4sICM0CisJYmVxCSAgTChiMHh4KQorTChiMXh4KTptb3YJICBpLCBuZW50cworCW1vdgkgIHIxMiwgdHAKKwl2ZW9yCSAgcTEzLCBxMTMsIHExMworCXZlb3IJICBxMiwgcTIsIHEyCisJQUxJR04oMTYpCitMKHRwNCk6CXZjZXEuaTMyICBtYXNrcSwgcTEzLCBxMTUKKwl2bGQxLjMyCSAge3EwfSwgW3RwXQorCXZhZGQuaTMyICBxMTMsIHExMywgcTE0CisJdmJpdAkgIHEyLCBxMCwgbWFza3EKKwlhZGQJICB0cCwgdHAsIG4sIGxzbCAjMgorCXN1YnMJICBpLCBpLCAjMQorCWJuZQkgIEwodHA0KQorCXZzdDEuMzIJICB7cTJ9LCBbcnBdIQorCWFkZAkgIHRwLCByMTIsICMxNgorCitMKGIweHgpOnRzdAkgIG4sICMyCisJYmVxCSAgTChiMDB4KQorTChiMDF4KTptb3YJICBpLCBuZW50cworCW1vdgkgIHIxMiwgdHAKKwl2ZW9yCSAgZDI2LCBkMjYsIGQyNgorCXZlb3IJICBkNCwgZDQsIGQ0CisJQUxJR04oMTYpCitMKHRwMik6CXZjZXEuaTMyICBtYXNrZCwgZDI2LCBkMzAKKwl2bGQxLjMyCSAge2QwfSwgW3RwXQorCXZhZGQuaTMyICBkMjYsIGQyNiwgZDI4CisJdmJpdAkgIGQ0LCBkMCwgbWFza2QKKwlhZGQJICB0cCwgdHAsIG4sIGxzbCAjMgorCXN1YnMJICBpLCBpLCAjMQorCWJuZQkgIEwodHAyKQorCXZzdDEuMzIJICB7ZDR9LCBbcnBdIQorCWFkZAkgIHRwLCByMTIsICM4CisKK0woYjAweCk6dHN0CSAgbiwgIzEKKwliZXEJICBMKGIwMDApCitMKGIwMDEpOm1vdgkgIGksIG5lbnRzCisJbW92CSAgcjEyLCB0cAorCXZlb3IJICBkMjYsIGQyNiwgZDI2CisJdmVvcgkgIGQ0LCBkNCwgZDQKKwlBTElHTigxNikKK0wodHAxKToJdmNlcS5pMzIgIG1hc2tkLCBkMjYsIGQzMAorCXZsZDEuMzIJICB7ZDBbMF19LCBbdHBdCisJdmFkZC5pMzIgIGQyNiwgZDI2LCBkMjgKKwl2Yml0CSAgZDQsIGQwLCBtYXNrZAorCWFkZAkgIHRwLCB0cCwgbiwgbHNsICMyCisJc3VicwkgIGksIGksICMxCisJYm5lCSAgTCh0cDEpCisJdnN0MS4zMgkgIHtkNFswXX0sIFtycF0KKworTChiMDAwKTpwb3AJe3I0LXI1fQorCWJ4CXIxNAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS9yc2gxYW9yc19uLmFzbSBiL21wbi9hcm0vcnNoMWFvcnNfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ZjM0YwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vcnNoMWFvcnNfbi5hc20KQEAgLTAsMCArMSwxMjQgQEAKK2RubCAgQVJNIG1wbl9yc2gxYWRkX24gYW5kIG1wbl9yc2gxc3ViX24uCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSA/CitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkzLjY0LTMuNworQyBDb3J0ZXgtQTE1CSAyLjUKKworQyBUT0RPCitDICAqIE5vdCBvcHRpbWlzZWQuCisKK2RlZmluZShgcnAnLCBgcjAnKQorZGVmaW5lKGB1cCcsIGByMScpCitkZWZpbmUoYHZwJywgYHIyJykKK2RlZmluZShgbicsICBgcjMnKQorCitpZmRlZihgT1BFUkFUSU9OX3JzaDFhZGRfbicsIGAKKyAgZGVmaW5lKGBBRERTVUInLAlhZGRzKQorICBkZWZpbmUoYEFERFNVQkMnLAlhZGNzKQorICBkZWZpbmUoYFJTVENZJywJYGNtbgkkMSwgJDEnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fcnNoMWFkZF9uKQorICBkZWZpbmUoYGZ1bmNfbmMnLAltcG5fcnNoMWFkZF9uYyknKQoraWZkZWYoYE9QRVJBVElPTl9yc2gxc3ViX24nLCBgCisgIGRlZmluZShgQUREU1VCJywJc3VicykKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBSU1RDWScsCisJYG12bgkkMiwgIzB4ODAwMDAwMDAKKwljbXAJJDIsICQxJykKKyAgZGVmaW5lKGBmdW5jJywJbXBuX3JzaDFzdWJfbikKKyAgZGVmaW5lKGBmdW5jX25jJywJbXBuX3JzaDFzdWJfbmMpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fcnNoMWFkZF9uIG1wbl9yc2gxc3ViX24pCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShmdW5jKQorCXB1c2gJe3I0LXIxMX0KKwlsZHIJcjQsIFt1cF0sICM0CisJbGRyCXI4LCBbdnBdLCAjNAorCUFERFNVQglyNCwgcjQsIHI4CisJbW92cwlyMTIsIHI3LCBycngKKwlhbmQJcjExLCByNCwgIzEJQyByZXR1cm4gdmFsdWUKKwlzdWJzCW4sIG4sICM0CisJYmxvCUwoZW5kKQorCitMKHRvcCk6CWxkbWlhCXVwISwge3I1LHI2LHI3fQorCWxkbWlhCXZwISwge3I4LHI5LHIxMH0KKwljbW4JcjEyLCByMTIKKwlBRERTVUJDCXI1LCByNSwgcjgKKwlBRERTVUJDCXI2LCByNiwgcjkKKwlBRERTVUJDCXI3LCByNywgcjEwCisJbW92cwlyMTIsIHI3LCBycngKKwltb3ZzCXI2LCByNiwgcnJ4CisJbW92cwlyNSwgcjUsIHJyeAorCW1vdnMJcjQsIHI0LCBycngKKwlzdWJzCW4sIG4sICMzCisJc3RtaWEJcnAhLCB7cjQscjUscjZ9CisJbW92CXI0LCByNworCWJocwlMKHRvcCkKKworTChlbmQpOgljbW4JbiwgIzIKKwlibHMJTChlMikKKwlsZG0JdXAsIHtyNSxyNn0KKwlsZG0JdnAsIHtyOCxyOX0KKwljbW4JcjEyLCByMTIKKwlBRERTVUJDCXI1LCByNSwgcjgKKwlBRERTVUJDCXI2LCByNiwgcjkKKwltb3ZzCXIxMiwgcjYsIHJyeAorCW1vdnMJcjUsIHI1LCBycngKKwltb3ZzCXI0LCByNCwgcnJ4CisJc3RtaWEJcnAhLCB7cjQscjV9CisJbW92CXI0LCByNgorCWIJTChlMSkKKworTChlMik6CWJuZQlMKGUxKQorCWxkcglyNSwgW3VwLCAjMF0KKwlsZHIJcjgsIFt2cCwgIzBdCisJY21uCXIxMiwgcjEyCisJQUREU1VCQwlyNSwgcjUsIHI4CisJbW92cwlyMTIsIHI1LCBycngKKwltb3ZzCXI0LCByNCwgcnJ4CisJc3RyCXI0LCBbcnBdLCAjNAorCW1vdglyNCwgcjUKKworTChlMSk6CVJTVENZKAlyMTIsIHIxKQorCW1vdglyNCwgcjQsIHJyeAorCXN0cglyNCwgW3JwLCAjMF0KKwltb3YJcjAsIHIxMQorCXBvcAl7cjQtcjExfQorCXJldHVybglyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vcnNoaWZ0LmFzbSBiL21wbi9hcm0vcnNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM3YWUxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9yc2hpZnQuYXNtCkBAIC0wLDAgKzEsODYgQEAKK2RubCAgQVJNIG1wbl9yc2hpZnQuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSA/CitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgMy41CitDIENvcnRleC1BMTUJID8KKworZGVmaW5lKGBycCcsICBgcjAnKQorZGVmaW5lKGB1cCcsICBgcjEnKQorZGVmaW5lKGBuJywgICBgcjInKQorZGVmaW5lKGBjbnQnLCBgcjMnKQorZGVmaW5lKGB0bmMnLCBgcjEyJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9yc2hpZnQpCisJcHVzaAl7cjQsIHI2LCByNywgcjh9CisJbGRyCXI0LCBbdXBdCisJcnNiCXRuYywgY250LCAjMzIKKworCW1vdglyNywgcjQsIGxzciBjbnQKKwl0c3QJbiwgIzEKKwliZXEJTChldm4pCQkJQyBuIGV2ZW4KKworTChvZGQpOglzdWJzCW4sIG4sICMyCisJYmNjCUwoMSkJCQlDIG4gPSAxCisJbGRyCXI4LCBbdXAsICM0XSEKKwliCUwobWlkKQorCitMKGV2bik6CWxkcglyNiwgW3VwLCAjNF0hCisJc3VicwluLCBuLCAjMgorCWJlcQlMKGVuZCkKKworTCh0b3ApOglsZHIJcjgsIFt1cCwgIzRdIQorCW9ycglyNywgcjcsIHI2LCBsc2wgdG5jCisJc3RyCXI3LCBbcnBdLCAjNAorCW1vdglyNywgcjYsIGxzciBjbnQKK0wobWlkKToJbGRyCXI2LCBbdXAsICM0XSEKKwlvcnIJcjcsIHI3LCByOCwgbHNsIHRuYworCXN0cglyNywgW3JwXSwgIzQKKwltb3YJcjcsIHI4LCBsc3IgY250CisJc3VicwluLCBuLCAjMgorCWJndAlMKHRvcCkKKworTChlbmQpOglvcnIJcjcsIHI3LCByNiwgbHNsIHRuYworCXN0cglyNywgW3JwXSwgIzQKKwltb3YJcjcsIHI2LCBsc3IgY250CitMKDEpOglzdHIJcjcsIFtycF0KKwltb3YJcjAsIHI0LCBsc2wgdG5jCisJcG9wCXtyNCwgcjYsIHI3LCByOH0KKwlyZXR1cm4JcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3NlY190YWJzZWxlY3QuYXNtIGIvbXBuL2FybS9zZWNfdGFic2VsZWN0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhlZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS9zZWNfdGFic2VsZWN0LmFzbQpAQCAtMCwwICsxLDEzMSBAQAorZG5sICBBUk0gbXBuX3NlY190YWJzZWxlY3QKKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk0JID8KK0MgWFNjYWxlCSA/CitDIENvcnRleC1BNwkgPworQyBDb3J0ZXgtQTgJID8KK0MgQ29ydGV4LUE5CSAyLjMzCitDIENvcnRleC1BMTUJIDIuMgorCitDIFRPRE8KK0MgICogQ29uc2lkZXIgdXNpbmcgc3BlY2lhbCBjb2RlIGZvciBzbWFsbCBuZW50cywgZWl0aGVyIHN3YXBwaW5nIHRoZSBpbm5lciBhbmQKK0MgICAgb3V0ZXIgbG9vcHMsIG9yIHByb3ZpZGluZyBhIGZldyBjb21wbGV0ZWx5IHVucm9sbGluZyB0aGUgaW5uZXIgbG9vcHMuCisKK2RlZmluZShgcnAnLCAgICBgcjAnKQorZGVmaW5lKGB0cCcsICAgIGByMScpCitkZWZpbmUoYG4nLCAgICAgYHIyJykKK2RlZmluZShgbmVudHMnLCBgcjMnKQorQyAgICAgIHdoaWNoICBvbiBzdGFjaworCitkZWZpbmUoYGknLCAgICAgYHIxMScpCitkZWZpbmUoYGonLCAgICAgYHIxMicpCitkZWZpbmUoYGMnLCAgICAgYHIxNCcpCitkZWZpbmUoYG1hc2snLCAgYHI3JykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9zZWNfdGFic2VsZWN0KQorCXB1c2gJe3I0LXIxMSwgcjE0fQorCisJc3VicwlqLCBuLCAjMworCWJtaQlMKG91dGVyX2VuZCkKK0wob3V0ZXJfdG9wKToKKwlsZHIJYywgW3NwLCAjMzZdCisJbW92CWksIG5lbnRzCisJcHVzaAl7dHB9CisKKwltb3YJcjgsICMwCisJbW92CXI5LCAjMAorCW1vdglyMTAsICMwCisKK0wodG9wKToJc3VicwljLCBjLCAjMQorCWxkbQl0cCwge3I0LHI1LHI2fQorCXNiYwltYXNrLCBtYXNrLCBtYXNrCisJc3VicwlpLCBpLCAjMQorCWFkZAl0cCwgdHAsIG4sIGxzbCAjMgorCWFuZAlyNCwgcjQsIG1hc2sKKwlhbmQJcjUsIHI1LCBtYXNrCisJYW5kCXI2LCByNiwgbWFzaworCW9ycglyOCwgcjgsIHI0CisJb3JyCXI5LCByOSwgcjUKKwlvcnIJcjEwLCByMTAsIHI2CisJYmdlCUwodG9wKQorCisJc3RtaWEJcnAhLCB7cjgscjkscjEwfQorCXBvcAl7dHB9CisJYWRkCXRwLCB0cCwgIzEyCisJc3VicwlqLCBqLCAjMworCWJwbAlMKG91dGVyX3RvcCkKK0wob3V0ZXJfZW5kKToKKworCWNtcAlqLCAjLTEKKwlibmUJTChuMikKKworCWxkcgljLCBbc3AsICMzNl0KKwltb3YJaSwgbmVudHMKKwltb3YJcjgsICMwCisJbW92CXI5LCAjMAorTCh0cDIpOglzdWJzCWMsIGMsICMxCisJc2JjCW1hc2ssIG1hc2ssIG1hc2sKKwlsZG0JdHAsIHtyNCxyNX0KKwlzdWJzCWksIGksICMxCisJYWRkCXRwLCB0cCwgbiwgbHNsICMyCisJYW5kCXI0LCByNCwgbWFzaworCWFuZAlyNSwgcjUsIG1hc2sKKwlvcnIJcjgsIHI4LCByNAorCW9ycglyOSwgcjksIHI1CisJYmdlCUwodHAyKQorCXN0bWlhCXJwLCB7cjgscjl9CisJcG9wCXtyNC1yMTEsIHIxNH0KKwlyZXR1cm4JbHIKKworTChuMik6CWNtcAlqLCAjLTIKKwlibmUJTChuMSkKKworCWxkcgljLCBbc3AsICMzNl0KKwltb3YJaSwgbmVudHMKKwltb3YJcjgsICMwCitMKHRwMSk6CXN1YnMJYywgYywgIzEKKwlzYmMJbWFzaywgbWFzaywgbWFzaworCWxkcglyNCwgW3RwXQorCXN1YnMJaSwgaSwgIzEKKwlhZGQJdHAsIHRwLCBuLCBsc2wgIzIKKwlhbmQJcjQsIHI0LCBtYXNrCisJb3JyCXI4LCByOCwgcjQKKwliZ2UJTCh0cDEpCisJc3RyCXI4LCBbcnBdCitMKG4xKToJcG9wCXtyNC1yMTEsIHIxNH0KKwlyZXR1cm4JbHIKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdWRpdi5hc20gYi9tcG4vYXJtL3VkaXYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjQ0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3VkaXYuYXNtCkBAIC0wLDAgKzEsMTA0IEBACitkbmwgIEFSTSBtcG5fdWRpdl9xcm5uZCAtLSBkaXZpZGUgYSB0d28gbGltYiBkaXZpZGVuZCBhbmQgYSBvbmUgbGltYiBkaXZpc29yLgorZG5sICBSZXR1cm4gcXVvdGllbnQgYW5kIHN0b3JlIHJlbWFpbmRlciB0aHJvdWdoIGEgc3VwcGxpZWQgcG9pbnRlci4KKworZG5sICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcmVtX3B0cicsYHIwJykKK2RlZmluZShgbjEnLGByMScpCitkZWZpbmUoYG4wJyxgcjInKQorZGVmaW5lKGBkJyxgcjMnKQorCitDIGRpdnN0ZXAgLS0gZGV2ZWxvcCBvbmUgcXVvdGllbnQgYml0LiAgRGl2aWRlbmQgaW4gJDEkMiwgZGl2aXNvciBpbiAkMy4KK0MgUXVvdGllbnQgYml0IGlzIHNoaWZ0ZWQgaW50byAkMi4KK2RlZmluZShgZGl2c3RlcCcsCisgICAgICAgYGFkY3MJJDIsICQyLCAkMgorCWFkYwkkMSwgJDEsICQxCisJY21wCSQxLCAkMworCXN1YmNzCSQxLCAkMSwgJDMnKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX3VkaXZfcXJubmQpCisJbW92CXIxMiwgIzgJCQlDIGxvb3AgY291bnRlciBmb3IgYm90aCBsb29wcyBiZWxvdworCWNtcAlkLCAjMHg4MDAwMDAwMAkJQyBjaGVjayBkaXZpc29yIG1zYiBhbmQgY2xlYXIgY2FycnkKKwliY3MJTChfbGFyZ2VfZGl2aXNvcikKKworTChvb3ApOglkaXZzdGVwKG4xLG4wLGQpCisJZGl2c3RlcChuMSxuMCxkKQorCWRpdnN0ZXAobjEsbjAsZCkKKwlkaXZzdGVwKG4xLG4wLGQpCisJc3ViCXIxMiwgcjEyLCAjMQorCXRlcQlyMTIsICMwCisJYm5lCUwob29wKQorCisJc3RyCW4xLCBbcmVtX3B0cl0JCUMgc3RvcmUgcmVtYWluZGVyCisJYWRjCXIwLCBuMCwgbjAJCUMgcXVvdGllbnQ6IGFkZCBsYXN0IGNhcnJ5IGZyb20gZGl2c3RlcAorCXJldHVybglscgorCitMKF9sYXJnZV9kaXZpc29yKToKKwlzdG1mZAlzcCEsIHsgcjgsIGxyIH0KKworCWFuZAlyOCwgbjAsICMxCQlDIHNhdmUgbHNiIG9mIGRpdmlkZW5kCisJbW92CWxyLCBuMSwgbHNsICMzMQorCW9ycnMJbjAsIGxyLCBuMCwgbHNyICMxCUMgbjAgPSBsbyhuMW4wID4+IDEpCisJbW92CW4xLCBuMSwgbHNyICMxCQlDIG4xID0gaGkobjFuMCA+PiAxKQorCisJYW5kCWxyLCBkLCAjMQkJQyBzYXZlIGxzYiBvZiBkaXZpc29yCisJbW92cwlkLCBkLCBsc3IgIzEJCUMgZCA9IGZsb29yKG9yaWdfZCAvIDIpCisJYWRjCWQsIGQsICMwCQlDIGQgPSBjZWlsKG9yaWdfZCAvIDIpCisKK0wob29wMik6CisJZGl2c3RlcChuMSxuMCxkKQorCWRpdnN0ZXAobjEsbjAsZCkKKwlkaXZzdGVwKG4xLG4wLGQpCisJZGl2c3RlcChuMSxuMCxkKQorCXN1YglyMTIsIHIxMiwgIzEKKwl0ZXEJcjEyLCAjMAorCWJuZQlMKG9vcDIpCisKKwlhZGMJbjAsIG4wLCBuMAkJQyBzaGlmdCBhbmQgYWRkIGxhc3QgY2FycnkgZnJvbSBkaXZzdGVwCisJYWRkCW4xLCByOCwgbjEsIGxzbCAjMQlDIHNoaWZ0IGluIG9taXR0ZWQgZGl2aWRlbmQgbHNiCisJdHN0CWxyLCBscgkJCUMgdGVzdCBzYXZlZCBkaXZpc29yIGxzYgorCWJlcQlMKF9ldmVuX2Rpdmlzb3IpCisKKwlyc2IJZCwgbHIsIGQsIGxzbCAjMQlDIHJlc3RvcmUgb3JpZyBkIHZhbHVlCisJYWRkcwluMSwgbjEsIG4wCQlDIGZpeCByZW1haW5kZXIgZm9yIG9taXR0ZWQgZGl2aXNvciBsc2IKKwlhZGRjcwluMCwgbjAsICMxCQlDIGFkanVzdCBxdW90aWVudCBpZiByZW0uIGZpeCBjYXJyaWVkCisJc3ViY3MJbjEsIG4xLCBkCQlDIGFkanVzdCByZW1haW5kZXIgYWNjb3JkaW5nbHkKKwljbXAJbjEsIGQJCQlDIHJlbWFpbmRlciA+PSBkaXZpc29yPworCXN1YmNzCW4xLCBuMSwgZAkJQyBhZGp1c3QgcmVtYWluZGVyCisJYWRkY3MJbjAsIG4wLCAjMQkJQyBhZGp1c3QgcXVvdGllbnQKKworTChfZXZlbl9kaXZpc29yKToKKwlzdHIJbjEsIFtyZW1fcHRyXQkJQyBzdG9yZSByZW1haW5kZXIKKwltb3YJcjAsIG4wCQkJQyBxdW90aWVudAorCWxkbWZkCXNwISwgeyByOCwgcGMgfQorRVBJTE9HVUUobXBuX3VkaXZfcXJubmQpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3Y1L2djZF8xMS5hc20gYi9tcG4vYXJtL3Y1L2djZF8xMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzZWE0NAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vdjUvZ2NkXzExLmFzbQpAQCAtMCwwICsxLDcwIEBACitkbmwgIEFSTSB2NSBtcG5fZ2NkXzExLgorCitkbmwgIEJhc2VkIG9uIHRoZSBLNyBnY2RfMS5hc20sIGJ5IEtldmluIFJ5ZGUuICBSZWhhY2tlZCBmb3IgQVJNIGJ5IFRvcmJqw7ZybgorZG5sICBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDA1LCAyMDA5LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvYml0IChhcHByb3gpCitDIFN0cm9uZ0FSTQkgLQorQyBYU2NhbGUJID8KK0MgQ29ydGV4LUE1CSA2LjQ1CW9ic29sZXRlCitDIENvcnRleC1BNwkgNi40MQlvYnNvbGV0ZQorQyBDb3J0ZXgtQTgJIDUuMAlvYnNvbGV0ZQorQyBDb3J0ZXgtQTkJIDUuOQlvYnNvbGV0ZQorQyBDb3J0ZXgtQTE1CSA0LjQwCW9ic29sZXRlCitDIENvcnRleC1BMTcJIDUuNjgJb2Jzb2xldGUKK0MgQ29ydGV4LUE1MwkgNC4zNwlvYnNvbGV0ZQorQyBOdW1iZXJzIG1lYXN1cmVkIHdpdGg6IHNwZWVkIC1DRCAtczgtMzIgLXQyNCBtcG5fZ2NkXzEKKworZGVmaW5lKGB1MCcsICAgIGByMCcpCitkZWZpbmUoYHYwJywgICAgYHIxJykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fZ2NkXzExKQorCXN1YnMJcjMsIHUwLCB2MAlDCQkJMAorCWJlcQlMKGVuZCkJCUMKKworCUFMSUdOKDE2KQorTCh0b3ApOglzdWIJcjIsIHYwLCB1MAlDCQkJMCw1CisJYW5kCXIxMiwgcjIsIHIzCUMJCQkxCisJY2x6CXIxMiwgcjEyCUMJCQkyCisJcnNiCXIxMiwgcjEyLCAjMzEJQwkJCTMKKwlyc2JjYwlyMywgcjMsICMwCUMgdiA9IGFicyh1LXYpLCBldmVuCTEKKwltb3Zjcwl1MCwgdjAJCUMgdSA9IG1pbih1LHYpCQkxCisJbHNyCXYwLCByMywgcjEyCUMJCQk0CisJc3VicwlyMywgdTAsIHYwCUMJCQk1CisJYm5lCUwodG9wKQkJQworCitMKGVuZCk6CWJ4CWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3Y1L2djZF8yMi5hc20gYi9tcG4vYXJtL3Y1L2djZF8yMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4ODYxNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vdjUvZ2NkXzIyLmFzbQpAQCAtMCwwICsxLDExNyBAQAorZG5sICBBUk0gdjUgbXBuX2djZF8yMi4KKworZG5sICBDb3B5cmlnaHQgMjAxOSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvYml0IChhcHByb3gpCitDIFN0cm9uZ0FSTQkgLQorQyBYU2NhbGUJIC0KK0MgQVJNMTEJCTEzCitDIENvcnRleC1BNQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgPworQyBDb3J0ZXgtQTEyCSA/CitDIENvcnRleC1BMTUJID8KK0MgQ29ydGV4LUExNwkgPworQyBDb3J0ZXgtQTUzCSA/CisKKworZGVmaW5lKGBncCcsICAgIGByMCcpCisKK2RlZmluZShgdTEnLCAgICBgcjEnKQorZGVmaW5lKGB1MCcsICAgIGByMicpCitkZWZpbmUoYHYxJywgICAgYHIzJykKK2RlZmluZShgdjAnLCAgICBgcjQnKQorCitkZWZpbmUoYHQwJywgICAgYHI1JykKK2RlZmluZShgdDEnLCAgICBgcjYnKQorZGVmaW5lKGBjbnQnLCAgIGByNycpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fZ2NkXzIyKQorCXB1c2gJeyByNC1yNyB9CisKKwlsZHIJdjAsIFtzcCwjMTZdCQlDCisKK0wodG9wKToJc3Vicwl0MCwgdTAsIHYwCQlDIDAgNworCWJlcQlMKGxvd3opCisJc2Jjcwl0MSwgdTEsIHYxCQlDIDEgOAorCisJc3ViCWNudCwgdjAsIHUwCisJYW5kCWNudCwgY250LCB0MAorCisJbmVnY2MJdDAsIHQwCisJbXZuY2MJdDEsIHQxCitMKGJjayk6CW1vdmNjCXYwLCB1MAorCW1vdmNjCXYxLCB1MQorCisJY2x6CXIxMiwgY250CQlDIDIKKwlyc2IJY250LCByMTIsICMzMQkJQyAzCisJYWRkCXIxMiwgcjEyLCAjMQorCisJbHNyCXUwLCB0MCwgY250CQlDIDMKKwlsc2wJcjEyLCB0MSwgcjEyCQlDIDQKKwlsc3IJdTEsIHQxLCBjbnQJCUMgMworCW9ycgl1MCwgdTAsIHIxMgkJQyA1CisKKwlvcnJzCXIxMiwgdTEsIHYxCisJYm5lCUwodG9wKQorCisKKwlzdHIJcjEyLCBbZ3AsIzRdCQlDIGhpZ2ggcmVzdWx0IGxpbWIgPD0gMAorCisJbW92CXI2LCBncAorCW1vdglyMCwgdTAJCQlDIHBhc3MgMXN0IGFyZ3VtZW50CisJbW92CXIxLCB2MAkJCUMgcGFzcyAybmQgYXJndW1lbnQKKwltb3YJcjcsIHIxNAkJCUMgcHJlc2VydmUgbGluayByZWdpc3RlcgorCWJsCW1wbl9nY2RfMTEKKwlzdHIJcjAsIFtyNiwjMF0KKwltb3YJcjE0LCByNworCXBvcAl7IHI0LXI3IH0KKwlieAlyMTQKKworTChsb3d6KTpDIFdlIGNvbWUgaGVyZSB3aGVuIHYwIC0gdTAgPSAwCisJQyAxLiBJZiB2MSAtIHUxID0gMCwgdGhlbiBnY2QgaXMgdSA9IHYuCisJQyAyLiBFbHNlIGNvbXB1dGUgZ2NkXzIxKHt2MSx2MH0sIHx1MS12MXwpCisJc3Vicwl0MCwgdTEsIHYxCisJYmVxCUwoZW5kKQorCW1vdgl0MSwgIzAKKwlzdWIJY250LCB2MSwgdTEKKwlhbmQJY250LCBjbnQsIHQwCisJbmVnY2MJdDAsIHQwCisJYglMKGJjaykKKworTChlbmQpOglzdHIJdjAsIFtncCwjMF0KKwlzdHIJdjEsIFtncCwjNF0KKwlwb3AJeyByNC1yNyB9CisJYngJcjE0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3Y1L21vZF8xXzEuYXNtIGIvbXBuL2FybS92NS9tb2RfMV8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODAyMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS92NS9tb2RfMV8xLmFzbQpAQCAtMCwwICsxLDEyOSBAQAorZG5sICBBUk0gbXBuX21vZF8xXzFwCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSAtCitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgNworQyBDb3J0ZXgtQTE1CSA2CisKK2RlZmluZShgYXAnLCBgcjAnKQorZGVmaW5lKGBuJywgIGByMScpCitkZWZpbmUoYGQnLCAgYHIyJykKK2RlZmluZShgY3BzJyxgcjMnKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX21vZF8xXzFwKQorCXB1c2gJe3I0LXIxMH0KKwlhZGQJcjAsIHIwLCByMSwgYXNsICMyCisJbGRyCXI1LCBbcjAsICMtNF0hCisJbGRyCXIxMiwgW3IwLCAjLTRdIQorCXN1YnMJcjEsIHIxLCAjMgorCWJsZQlMKDQpCisJbGRyCXI4LCBbcjMsICMxMl0KKwltb3YJcjQsIHIxMgorCW1vdglyMTAsIHI1CisJdW11bGwJcjcsIHI1LCByMTAsIHI4CisJc3ViCXIxLCByMSwgIzEKKwliCUwobWlkKQorCitMKHRvcCk6CWFkZHMJcjEyLCByNiwgcjcKKwlhZGNzCXIxMCwgcjQsIHI1CisJc3ViCXIxLCByMSwgIzEKKwltb3YJcjYsICMwCisJbW92Y3MJcjYsIHI4CisJdW11bGwJcjcsIHI1LCByMTAsIHI4CisJYWRkcwlyNCwgcjEyLCByNgorCXN1YmNzCXI0LCByNCwgcjIKK0wobWlkKToJbGRyCXI2LCBbcjAsICMtNF0hCisJdGVxCXIxLCAjMAorCWJuZQlMKHRvcCkKKworCWFkZHMJcjEyLCByNiwgcjcKKwlhZGNzCXI1LCByNCwgcjUKKwlzdWJjcwlyNSwgcjUsIHIyCitMKDQpOglsZHIJcjEsIFtyMywgIzRdCisJY21wCXIxLCAjMAorCWJlcQlMKDcpCisJbGRyCXI0LCBbcjMsICM4XQorCXVtdWxsCXIwLCByNiwgcjUsIHI0CisJYWRkcwlyMTIsIHIwLCByMTIKKwlhZGRjcwlyNiwgcjYsICMxCisJcnNiCXIwLCByMSwgIzMyCisJbW92CXIwLCByMTIsIGxzciByMAorCW9ycglyNSwgcjAsIHI2LCBhc2wgcjEKKwltb3YJcjEyLCByMTIsIGFzbCByMQorCWIJTCg4KQorTCg3KToJY21wCXI1LCByMgorCXN1YmNzCXI1LCByNSwgcjIKK0woOCk6CWxkcglyMCwgW3IzLCAjMF0KKwl1bXVsbAlyNCwgcjMsIHI1LCByMAorCWFkZAlyNSwgcjUsICMxCisJYWRkcwlyMCwgcjQsIHIxMgorCWFkYwlyNSwgcjMsIHI1CisJbXVsCXI1LCByMiwgcjUKKwlzdWIJcjEyLCByMTIsIHI1CisJY21wCXIxMiwgcjAKKwlhZGRoaQlyMTIsIHIxMiwgcjIKKwljbXAJcjIsIHIxMgorCXN1YmxzCXIxMiwgcjEyLCByMgorCW1vdglyMCwgcjEyLCBsc3IgcjEKKwlwb3AJe3I0LXIxMH0KKwlieAlyMTQKK0VQSUxPR1VFKCkKKworUFJPTE9HVUUobXBuX21vZF8xXzFwX2NwcykKKwlzdG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByMTR9CisJbW92CXI1LCByMAorCWNseglyNCwgcjEKKwltb3YJcjAsIHIxLCBhc2wgcjQKKwlyc2IJcjYsIHIwLCAjMAorCWJsCW1wbl9pbnZlcnRfbGltYgorCXN0cglyMCwgW3I1LCAjMF0KKwlzdHIJcjQsIFtyNSwgIzRdCisJY21wCXI0LCAjMAorCWJlcQlMKDIpCisJcnNiCXIxLCByNCwgIzMyCisJbW92CXIzLCAjMQorCW1vdglyMywgcjMsIGFzbCByNAorCW9ycglyMywgcjMsIHIwLCBsc3IgcjEKKwltdWwJcjMsIHI2LCByMworCW1vdglyNCwgcjMsIGxzciByNAorCXN0cglyNCwgW3I1LCAjOF0KK0woMik6CW11bAlyMCwgcjYsIHIwCisJc3RyCXIwLCBbcjUsICMxMl0KKwlsZG1mZAlzcCEsIHtyNCwgcjUsIHI2LCBwY30KK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjUvbW9kXzFfMi5hc20gYi9tcG4vYXJtL3Y1L21vZF8xXzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzAwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3Y1L21vZF8xXzIuYXNtCkBAIC0wLDAgKzEsMTU2IEBACitkbmwgIEFSTSBtcG5fbW9kXzFzXzJwCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCSAtCitDIFhTY2FsZQkgPworQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgNC4yNQorQyBDb3J0ZXgtQTE1CSAzCisKK2RlZmluZShgYXAnLCBgcjAnKQorZGVmaW5lKGBuJywgIGByMScpCitkZWZpbmUoYGQnLCAgYHIyJykKK2RlZmluZShgY3BzJyxgcjMnKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX21vZF8xc18ycCkKKwlwdXNoCXtyNC1yMTB9CisJdHN0CW4sICMxCisJYWRkCXI3LCByMywgIzgKKwlsZG1pYQlyNywge3I3LCByOCwgcjEyfQlDIGxvYWQgQjEsIEIyLCBCMworCWFkZAlhcCwgYXAsIG4sIGxzbCAjMglDIHB1dCBhcCBhdCBvcGVyYW5kIGVuZAorCWJlcQlMKGV2bikKKworTChvZGQpOglzdWJzCW4sIG4sICMxCisJYmVxCUwoMSkKKwlsZG1kYglhcCEsIHtyNCxyNixyOX0KKwltb3YJcjEwLCAjMAorCXVtbGFsCXI0LCByMTAsIHI2LCByNworCXVtbGFsCXI0LCByMTAsIHI5LCByOAorCWIJTChjb20pCisKK0woZXZuKToJbGRtZGIJYXAhLCB7cjQscjEwfQorTChjb20pOglzdWJzCW4sIG4sICMyCisJYmxlCUwoZW5kKQorCWxkbWRiCWFwISwge3I1LHI2fQorCWIJTChtaWQpCisKK0wodG9wKToJbW92CXI5LCAjMAorCXVtbGFsCXI1LCByOSwgcjYsIHI3CQlDIEIxCisJdW1sYWwJcjUsIHI5LCByNCwgcjgJCUMgQjIKKwlsZG1kYglhcCEsIHtyNCxyNn0KKwl1bWxhbAlyNSwgcjksIHIxMCwgcjEyCUMgQjMKKwlibGUJTCh4aXQpCisJbW92CXIxMCwgIzAKKwl1bWxhbAlyNCwgcjEwLCByNiwgcjcJCUMgQjEKKwl1bWxhbAlyNCwgcjEwLCByNSwgcjgJCUMgQjIKKwlsZG1kYglhcCEsIHtyNSxyNn0KKwl1bWxhbAlyNCwgcjEwLCByOSwgcjEyCUMgQjMKK0wobWlkKToJc3VicwluLCBuLCAjNAorCWJnZQlMKHRvcCkKKworCW1vdglyOSwgIzAKKwl1bWxhbAlyNSwgcjksIHI2LCByNwkJQyBCMQorCXVtbGFsCXI1LCByOSwgcjQsIHI4CQlDIEIyCisJdW1sYWwJcjUsIHI5LCByMTAsIHIxMglDIEIzCisJbW92CXI0LCByNQorCitMKGVuZCk6CW1vdmdlCSAgIHI5LCByMTAJCUMgZXhlY3V0ZWQgaWZmIGNvbWluZyB2aWEgeGl0CisJbGRyCXI2LCBbcjMsICM0XQkJQyBjcHNbMV0gPSBjbnQKKwltb3YJcjUsICMwCisJdW1sYWwJcjQsIHI1LCByOSwgcjcKKwltb3YJcjcsIHI1LCBsc2wgcjYKK0woeCk6CXJzYglyMSwgcjYsICMzMgorCW9ycglyOCwgcjcsIHI0LCBsc3IgcjEKKwltb3YJcjksIHI0LCBsc2wgcjYKKwlsZHIJcjUsIFtyMywgIzBdCisJYWRkCXIwLCByOCwgIzEKKwl1bXVsbAlyMTIsIHIxLCByOCwgcjUKKwlhZGRzCXI0LCByMTIsIHI5CisJYWRjCXIxLCByMSwgcjAKKwltdWwJcjUsIHIyLCByMQorCXN1YglyOSwgcjksIHI1CisJY21wCXI5LCByNAorCWFkZGhpCXI5LCByOSwgcjIKKwljbXAJcjIsIHI5CisJc3VibHMJcjksIHI5LCByMgorCW1vdglyMCwgcjksIGxzciByNgorCXBvcAl7cjQtcjEwfQorCWJ4CXIxNAorCitMKHhpdCk6CW1vdglyMTAsICMwCisJdW1sYWwJcjQsIHIxMCwgcjYsIHI3CQlDIEIxCisJdW1sYWwJcjQsIHIxMCwgcjUsIHI4CQlDIEIyCisJdW1sYWwJcjQsIHIxMCwgcjksIHIxMglDIEIzCisJYglMKGVuZCkKKworTCgxKToJbGRyCXI2LCBbcjMsICM0XQkJQyBjcHNbMV0gPSBjbnQKKwlsZHIJcjQsIFthcCwgIy00XQkJQyBhcFswXQorCW1vdglyNywgIzAKKwliCUwoeCkKK0VQSUxPR1VFKCkKKworUFJPTE9HVUUobXBuX21vZF8xc18ycF9jcHMpCisJcHVzaAl7cjQtcjgsIHIxNH0KKwljbHoJcjQsIHIxCisJbW92CXI1LCByMSwgbHNsIHI0CQlDIGIgPDw9IGNudAorCW1vdglyNiwgcjAJCQlDIHI2ID0gY3BzCisJbW92CXIwLCByNQorCWJsCW1wbl9pbnZlcnRfbGltYgorCXJzYglyMywgcjQsICMzMgorCW1vdglyMywgcjAsIGxzciByMworCW1vdglyMiwgIzEKKwlvcnIJcjMsIHIzLCByMiwgbHNsIHI0CisJcnNiCXIxLCByNSwgIzAKKwltdWwJcjIsIHIxLCByMworCXVtdWxsCXIzLCByMTIsIHIyLCByMAorCWFkZAlyMTIsIHIyLCByMTIKKwltdm4JcjEyLCByMTIKKwltdWwJcjEsIHI1LCByMTIKKwljbXAJcjEsIHIzCisJYWRkaGkJcjEsIHIxLCByNQorCXVtdWxsCXIxMiwgcjcsIHIxLCByMAorCWFkZAlyNywgcjEsIHI3CisJbXZuCXI3LCByNworCW11bAlyMywgcjUsIHI3CisJY21wCXIzLCByMTIKKwlhZGRoaQlyMywgcjMsIHI1CisJbW92CXI1LCByMiwgbHNyIHI0CisJbW92CXI3LCByMSwgbHNyIHI0CisJbW92CXI4LCByMywgbHNyIHI0CisJc3RtaWEJcjYsIHtyMCxyNCxyNSxyNyxyOH0JQyBmaWxsIGNwcworCXBvcAl7cjQtcjgsIHBjfQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS92Ni9hZGRtdWxfMS5hc20gYi9tcG4vYXJtL3Y2L2FkZG11bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjAwNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS92Ni9hZGRtdWxfMS5hc20KQEAgLTAsMCArMSwxMTIgQEAKK2RubCAgQVJNIG1wbl9hZGRtdWxfMS4KKworZG5sICBDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNOgkgLQorQyBYU2NhbGUJIC0KK0MgQVJNMTEJCSA2LjQKK0MgQ29ydGV4LUE3CSA1LjI1CitDIENvcnRleC1BOAkgNworQyBDb3J0ZXgtQTkJIDMuMjUKK0MgQ29ydGV4LUExNQkgNAorCitDIFRPRE8KK0MgICogTWljcm8tb3B0aW1pc2UgZmVlZC1pbiBjb2RlLgorQyAgKiBPcHRpbWlzZSBmb3Igbj0xLDIgYnkgZGVsYXlpbmcgcmVnaXN0ZXIgc2F2aW5nLgorQyAgKiBUcnkgdXNpbmcgbGRtL3N0bS4KKworZGVmaW5lKGBycCcsYHIwJykKK2RlZmluZShgdXAnLGByMScpCitkZWZpbmUoYG4nLCBgcjInKQorZGVmaW5lKGB2MCcsYHIzJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9hZGRtdWxfMSkKKwlzdG1mZAlzcCEsIHsgcjQsIHI1LCByNiwgcjcgfQorCisJYW5kcwlyNiwgbiwgIzMKKwltb3YJcjEyLCAjMAorCWJlcQlMKGZpMCkKKwljbXAJcjYsICMyCisJYmNjCUwoZmkxKQorCWJlcQlMKGZpMikKKworTChmaTMpOglsZHIJcjQsIFt1cF0sICM0CisJbGRyCXI2LCBbcnAsICMwXQorCWxkcglyNSwgW3VwXSwgIzQKKwliCUwobG8zKQorCitMKGZpMCk6CWxkcglyNSwgW3VwXSwgIzQKKwlsZHIJcjcsIFtycF0sICM0CisJbGRyCXI0LCBbdXBdLCAjNAorCWIJTChsbzApCisKK0woZmkxKToJbGRyCXI0LCBbdXBdLCAjNAorCWxkcglyNiwgW3JwXSwgIzgKKwlzdWJzCW4sIG4sICMxCisJYmVxCUwoMSkKKwlsZHIJcjUsIFt1cF0sICM0CisJYglMKGxvMSkKKworTChmaTIpOglsZHIJcjUsIFt1cF0sICM0CisJbGRyCXI3LCBbcnBdLCAjMTIKKwlsZHIJcjQsIFt1cF0sICM0CisJYglMKGxvMikKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHIJcjYsIFtycCwgIy04XQorCWxkcglyNSwgW3VwXSwgIzQKKwlzdHIJcjcsIFtycCwgIy0xMl0KK0wobG8xKToJdW1hYWwJcjYsIHIxMiwgcjQsIHYwCisJbGRyCXI3LCBbcnAsICMtNF0KKwlsZHIJcjQsIFt1cF0sICM0CisJc3RyCXI2LCBbcnAsICMtOF0KK0wobG8wKToJdW1hYWwJcjcsIHIxMiwgcjUsIHYwCisJbGRyCXI2LCBbcnAsICMwXQorCWxkcglyNSwgW3VwXSwgIzQKKwlzdHIJcjcsIFtycCwgIy00XQorTChsbzMpOgl1bWFhbAlyNiwgcjEyLCByNCwgdjAKKwlsZHIJcjcsIFtycCwgIzRdCisJbGRyCXI0LCBbdXBdLCAjNAorCXN0cglyNiwgW3JwXSwgIzE2CitMKGxvMik6CXVtYWFsCXI3LCByMTIsIHI1LCB2MAorCXN1YnMJbiwgbiwgIzQKKwliaGkJTCh0b3ApCisKKwlsZHIJcjYsIFtycCwgIy04XQorCXN0cglyNywgW3JwLCAjLTEyXQorTCgxKToJdW1hYWwJcjYsIHIxMiwgcjQsIHYwCisJc3RyCXI2LCBbcnAsICMtOF0KKwltb3YJcjAsIHIxMgorCWxkbWZkCXNwISwgeyByNCwgcjUsIHI2LCByNyB9CisJYngJbHIKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjYvYWRkbXVsXzIuYXNtIGIvbXBuL2FybS92Ni9hZGRtdWxfMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZmZlYgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vdjYvYWRkbXVsXzIuYXNtCkBAIC0wLDAgKzEsMTI1IEBACitkbmwgIEFSTSBtcG5fYWRkbXVsXzIuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiwgMjAxMywgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNOgkgLQorQyBYU2NhbGUJIC0KK0MgQVJNMTEJCSA0LjY4CitDIENvcnRleC1BNQkgMy42MworQyBDb3J0ZXgtQTcJIDMuNjUKK0MgQ29ydGV4LUE4CSA0LjAKK0MgQ29ydGV4LUE5CSAyLjI1CitDIENvcnRleC1BMTUJIDIuNQorQyBDb3J0ZXgtQTE3CSAyLjEzCitDIENvcnRleC1BNTMJIDMuNQorCitkZWZpbmUoYHJwJyxgcjAnKQorZGVmaW5lKGB1cCcsYHIxJykKK2RlZmluZShgbicsIGByMicpCitkZWZpbmUoYHZwJyxgcjMnKQorCitkZWZpbmUoYHYwJyxgcjYnKQorZGVmaW5lKGB2MScsYHI3JykKK2RlZmluZShgdTAnLGByMycpCitkZWZpbmUoYHUxJyxgcjknKQorCitkZWZpbmUoYGN5YScsYHI4JykKK2RlZmluZShgY3liJyxgcjEyJykKKworCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX2FkZG11bF8yKQorCXB1c2gJeyByNC1yOSB9CisKKwlsZHJkCXYwLCB2MSwgW3ZwLCAjMF0KKwltb3YJY3lhLCAjMAorCW1vdgljeWIsICMwCisKKwl0c3QJbiwgIzEKKwliZXEJTChldm4pCisKK0wob2RkKToJbGRyCXUxLCBbdXAsICMwXQorCWxkcglyNCwgW3JwLCAjMF0KKwl0c3QJbiwgIzIKKwliZXEJTChmaTEpCitMKGZpMyk6CXN1Ygl1cCwgdXAsICM4CisJc3ViCXJwLCBycCwgIzgKKwliCUwobG8zKQorTChmaTEpOglzdWIJbiwgbiwgIzEKKwliCUwodG9wKQorCitMKGV2bik6CWxkcgl1MCwgW3VwLCAjMF0KKwlsZHIJcjUsIFtycCwgIzBdCisJdHN0CW4sICMyCisJYm5lCUwoZmkyKQorTChmaTApOglzdWIJdXAsIHVwLCAjNAorCXN1YglycCwgcnAsICM0CisJYglMKGxvMCkKK0woZmkyKToJc3ViCXVwLCB1cCwgIzEyCisJc3ViCXJwLCBycCwgIzEyCisJYglMKGxvMikKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHIJcjUsIFtycCwgIzRdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJbGRyCXUwLCBbdXAsICM0XQorCXVtYWFsCXI1LCBjeWIsIHUxLCB2MQorCXN0cglyNCwgW3JwLCAjMF0KK0wobG8wKToJbGRyCXI0LCBbcnAsICM4XQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCWxkcgl1MSwgW3VwLCAjOF0KKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIzRdCitMKGxvMyk6CWxkcglyNSwgW3JwLCAjMTJdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJbGRyCXUwLCBbdXAsICMxMl0KKwl1bWFhbAlyNSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzhdCitMKGxvMik6CWxkcglyNCwgW3JwLCAjMTZdIQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCWxkcgl1MSwgW3VwLCAjMTZdIQorCXVtYWFsCXI0LCBjeWIsIHUwLCB2MQorCXN0cglyNSwgW3JwLCAjLTRdCisJc3VicwluLCBuLCAjNAorCWJoaQlMKHRvcCkKKworTChlbmQpOgl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwl1bWFhbAljeWEsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICMwXQorCXN0cgljeWEsIFtycCwgIzRdCisJbW92CXIwLCBjeWIKKworCXBvcAl7IHI0LXI5IH0KKwlieAlyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjYvYWRkbXVsXzMuYXNtIGIvbXBuL2FybS92Ni9hZGRtdWxfMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0ZWEyNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vdjYvYWRkbXVsXzMuYXNtCkBAIC0wLDAgKzEsMTkxIEBACitkbmwgIEFSTSBtcG5fYWRkbXVsXzMuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNOgkgLQorQyBYU2NhbGUJIC0KK0MgQVJNMTEJCSA0LjMzCitDIENvcnRleC1BNQkgMy4yOAorQyBDb3J0ZXgtQTcJIDMuMjUKK0MgQ29ydGV4LUE4CSAzLjE3CitDIENvcnRleC1BOQkgMi4xMjUKK0MgQ29ydGV4LUExNQkgMgorQyBDb3J0ZXgtQTE3CSAyLjExCitDIENvcnRleC1BNTMJIDQuMTgKKworQyBUT0RPCitDICAqIFVzZSBhIGZhc3QgcGF0aCBmb3IgbiA8PSBLQVJBVFNVQkFfTVVMX1RIUkVTSE9MRCB1c2luZyBhIGp1bXAgdGFibGUsCitDICAgIGF2b2lkaW5nIHRoZSBjdXJyZW50IG11bHRpcGx5LgorQyAgKiBTdGFydCB0aGUgZmlyc3QgbXVsdGlwbHkgb3IgbXVsdGlwbGllcyBlYXJseS4KKworZGVmaW5lKGBycCcsYHIwJykKK2RlZmluZShgdXAnLGByMScpCitkZWZpbmUoYG4nLCBgcjInKQorZGVmaW5lKGB2cCcsYHIzJykKKworZGVmaW5lKGB2MCcsYHI0JykgIGRlZmluZShgdjEnLGByNScpICBkZWZpbmUoYHYyJyxgcjYnKQorZGVmaW5lKGB1MCcsYHIzJykgIGRlZmluZShgdTEnLGByMTQnKQorZGVmaW5lKGB3MCcsYHI3JykgIGRlZmluZShgdzEnLGByOCcpICBkZWZpbmUoYHcyJyxgcjknKQorZGVmaW5lKGBjeTAnLGByMTAnKSAgZGVmaW5lKGBjeTEnLGByMTEnKSBkZWZpbmUoYGN5MicsYHIxMicpCisKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9hZGRtdWxfMykKKwlwdXNoCXsgcjQtcjExLCByMTQgfQorCisJbGRyCXcwLCA9MHhhYWFhYWFhYgkJQyAzXnstMX0gbW9kIDJeMzIKKwlsZG0JdnAsIHsgdjAsdjEsdjIgfQorCW1vdgljeTAsICMwCisJbW92CWN5MSwgIzAKKwltb3YJY3kyLCAjMAorCitDIFRyaWNreSBuIG1vZCA2CisJbXVsCXcwLCB3MCwgbgkJQyBuICogM157LTF9IG1vZCAyXjMyCisJYW5kCXcwLCB3MCwgIzB4YzAwMDAwMDEJQyBwc2V1ZG8tQ1JUIG1vZCAzLDIKKwlzdWIJbiwgbiwgIzMKK2lmZGVmKGBQSUMnLGAKKwlhZGQJcGMsIHBjLCB3MCwgcm9yICQyOAorCW5vcAorCWIJTChiMCkKKwliCUwoYjIpCisJYglMKGI0KQorCS53b3JkCTB4ZTdmMDAwZjAJQyB1ZGYKKwliCUwoYjMpCisJYglMKGI1KQorCWIJTChiMSkKKycsYAorCWxkcglwYywgW3BjLCB3MCwgcm9yICQyOF0KKwlub3AKKwkud29yZAlMKGIwKSwgTChiMiksIEwoYjQpLCAwLCBMKGIzKSwgTChiNSksIEwoYjEpCisnKQorCitMKGI1KToJYWRkCXVwLCB1cCwgIy04CisJbGRyCXcxLCBbcnAsICMwXQorCWxkcgl3MiwgW3JwLCAjNF0KKwlsZHIJdTEsIFt1cCwgIzhdCisJYglMKGxvNSkKKworTChiNCk6CWFkZAlycCwgcnAsICMtNAorCWFkZAl1cCwgdXAsICMtMTIKKwlsZHIJdzIsIFtycCwgIzRdCisJbGRyCXcwLCBbcnAsICM4XQorCWxkcgl1MCwgW3VwLCAjMTJdCisJYglMKGxvNCkKKworTChiMyk6CWFkZAlycCwgcnAsICMtOAorCWFkZAl1cCwgdXAsICMtMTYKKwlsZHIJdzAsIFtycCwgIzhdCisJbGRyCXcxLCBbcnAsICMxMl0KKwlsZHIJdTEsIFt1cCwgIzE2XQorCWIJTChsbzMpCisKK0woYjEpOglhZGQJcnAsIHJwLCAjOAorCWxkcgl3MiwgW3JwLCAjLThdCisJbGRyCXcwLCBbcnAsICMtNF0KKwlsZHIJdTEsIFt1cCwgIzBdCisJYglMKGxvMSkKKworTChiMCk6CWFkZAlycCwgcnAsICM0CisJYWRkCXVwLCB1cCwgIy00CisJbGRyCXcwLCBbcnAsICMtNF0KKwlsZHIJdzEsIFtycCwgIzBdCisJbGRyCXUwLCBbdXAsICM0XQorCWIJTChsbzApCisKK0woYjIpOglhZGQJcnAsIHJwLCAjMTIKKwlhZGQJdXAsIHVwLCAjNAorCWxkcgl3MSwgW3JwLCAjLTEyXQorCWxkcgl3MiwgW3JwLCAjLThdCisJbGRyCXUwLCBbdXAsICMtNF0KKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHIJdzAsIFtycCwgIy00XQorCXVtYWFsCXcxLCBjeTAsIHUwLCB2MAorCWxkcgl1MSwgW3VwLCAjMF0KKwl1bWFhbAl3MiwgY3kxLCB1MCwgdjEKKwlzdHIJdzEsIFtycCwgIy0xMl0KKwl1bWFhbAl3MCwgY3kyLCB1MCwgdjIKK0wobG8xKToJbGRyCXcxLCBbcnAsICMwXQorCXVtYWFsCXcyLCBjeTAsIHUxLCB2MAorCWxkcgl1MCwgW3VwLCAjNF0KKwl1bWFhbAl3MCwgY3kxLCB1MSwgdjEKKwlzdHIJdzIsIFtycCwgIy04XQorCXVtYWFsCXcxLCBjeTIsIHUxLCB2MgorTChsbzApOglsZHIJdzIsIFtycCwgIzRdCisJdW1hYWwJdzAsIGN5MCwgdTAsIHYwCisJbGRyCXUxLCBbdXAsICM4XQorCXVtYWFsCXcxLCBjeTEsIHUwLCB2MQorCXN0cgl3MCwgW3JwLCAjLTRdCisJdW1hYWwJdzIsIGN5MiwgdTAsIHYyCitMKGxvNSk6CWxkcgl3MCwgW3JwLCAjOF0KKwl1bWFhbAl3MSwgY3kwLCB1MSwgdjAKKwlsZHIJdTAsIFt1cCwgIzEyXQorCXVtYWFsCXcyLCBjeTEsIHUxLCB2MQorCXN0cgl3MSwgW3JwLCAjMF0KKwl1bWFhbAl3MCwgY3kyLCB1MSwgdjIKK0wobG80KToJbGRyCXcxLCBbcnAsICMxMl0KKwl1bWFhbAl3MiwgY3kwLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzE2XQorCXVtYWFsCXcwLCBjeTEsIHUwLCB2MQorCXN0cgl3MiwgW3JwLCAjNF0KKwl1bWFhbAl3MSwgY3kyLCB1MCwgdjIKK0wobG8zKToJbGRyCXcyLCBbcnAsICMxNl0KKwl1bWFhbAl3MCwgY3kwLCB1MSwgdjAKKwlsZHIJdTAsIFt1cCwgIzIwXQorCXVtYWFsCXcxLCBjeTEsIHUxLCB2MQorCXN0cgl3MCwgW3JwLCAjOF0KKwl1bWFhbAl3MiwgY3kyLCB1MSwgdjIKK0wobG8yKToJc3VicwluLCBuLCAjNgorCWFkZAl1cCwgdXAsICMyNAorCWFkZAlycCwgcnAsICMyNAorCWJnZQlMKHRvcCkKKworTChlbmQpOgl1bWFhbAl3MSwgY3kwLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzBdCisJdW1hYWwJdzIsIGN5MSwgdTAsIHYxCisJc3RyCXcxLCBbcnAsICMtMTJdCisJbW92CXcwLCAjMAorCXVtYWFsCXcwLCBjeTIsIHUwLCB2MgorCXVtYWFsCXcyLCBjeTAsIHUxLCB2MAorCXVtYWFsCXcwLCBjeTEsIHUxLCB2MQorCXN0cgl3MiwgW3JwLCAjLThdCisJdW1hYWwJY3kxLCBjeTIsIHUxLCB2MgorCWFkZHMJdzAsIHcwLCBjeTAKKwlzdHIJdzAsIFtycCwgIy00XQorCWFkY3MJdzEsIGN5MSwgIzAKKwlzdHIJdzEsIFtycCwgIzBdCisJYWRjCXIwLCBjeTIsICMwCisKKwlwb3AJeyByNC1yMTEsIHBjIH0KK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjYvZGl2ZV8xLmFzbSBiL21wbi9hcm0vdjYvZGl2ZV8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRmOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS92Ni9kaXZlXzEuYXNtCkBAIC0wLDAgKzEsMTQ5IEBACitkbmwgIEFSTSB2NiBtcG5fZGl2ZXhhY3RfMQorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTIsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQyAgICAgICAgICAgICAgIGN5Y2xlcy9saW1iICAgICAgIGN5Y2xlcy9saW1iCitDICAgICAgICAgICAgICAgbm9ybSAgICB1bm9ybSAgICBtb2RleGFjdF8xY19vZGQKK0MgU3Ryb25nQVJNCSAtCSAtCitDIFhTY2FsZQkgLQkgLQorQyBDb3J0ZXgtQTcJID8JID8KK0MgQ29ydGV4LUE4CSA/CSA/CitDIENvcnRleC1BOQkgOQkxMAkJIDkKK0MgQ29ydGV4LUExNQkgNwkgNwkJIDcKKworQyBBcmNoaXRlY3R1cmUgcmVxdWlyZW1lbnRzOgorQyB2NQktCitDIHY1dAljbHoKK0MgdjV0ZQktCitDIHY2CXVtYWFsCitDIHY2dDIJLQorQyB2N2EJLQorCitkZWZpbmUoYHJwJywgYHIwJykKK2RlZmluZShgdXAnLCBgcjEnKQorZGVmaW5lKGBuJywgIGByMicpCitkZWZpbmUoYGQnLCAgYHIzJykKKworZGVmaW5lKGBjeScsICBgcjcnKQorZGVmaW5lKGBjbnQnLCBgcjYnKQorZGVmaW5lKGB0bmMnLCBgcjEwJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9kaXZleGFjdF8xKQorCXB1c2gJe3I0LHI1LHI2LHI3LHI4LHI5fQorCisJdHN0CWQsICMxCisKKwlyc2IJcjQsIGQsICMwCisJYW5kCXI0LCByNCwgZAorCWNseglyNCwgcjQKKwlyc2IJY250LCByNCwgIzMxCQlDIGNvdW50X3RyYWlsaW5nX3plcm9zCisJbW92CWQsIGQsIGxzciBjbnQKKworQyBiaW52ZXJ0IGxpbWIKKwlMRUEoCXI0LCBiaW52ZXJ0X2xpbWJfdGFibGUpCisJYW5kCXIxMiwgZCwgIzI1NAorCWxkcmIJcjQsIFtyNCwgcjEyLCBsc3IgIzFdCisJbXVsCXIxMiwgcjQsIHI0CisJbXVsCXIxMiwgZCwgcjEyCisJcnNiCXIxMiwgcjEyLCByNCwgbHNsICMxCisJbXVsCXI0LCByMTIsIHIxMgorCW11bAlyNCwgZCwgcjQKKwlyc2IJcjQsIHI0LCByMTIsIGxzbCAjMQlDIHI0ID0gaW52ZXJzZQorCisJbGRyCXI1LCBbdXBdLCAjNAkJQyB1cFswXQorCW1vdgljeSwgIzAKKwlyc2IJcjgsIHI0LCAjMAkJQyByOCA9IC1pbnZlcnNlCisJYmVxCUwodW5ub3JtKQorCitMKG5vcm0pOgorCXN1YnMJbiwgbiwgIzEKKwltdWwJcjUsIHI1LCByNAorCWJlcQlMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHIJcjksIFt1cF0sICM0CisJbW92CXIxMiwgIzAKKwlzdHIJcjUsIFtycF0sICM0CisJdW1hYWwJcjEyLCBjeSwgcjUsIGQKKwltdWwJcjUsIHI5LCByNAorCW1sYQlyNSwgY3ksIHI4LCByNQorCXN1YnMJbiwgbiwgIzEKKwlibmUJTCh0b3ApCisKK0woZW5kKToJc3RyCXI1LCBbcnBdCisJcG9wCXtyNCxyNSxyNixyNyxyOCxyOX0KKwlieAlyMTQKKworTCh1bm5vcm0pOgorCXB1c2gJe3IxMCxyMTF9CisJcnNiCXRuYywgY250LCAjMzIKKwltb3YJcjExLCByNSwgbHNyIGNudAorCXN1YnMJbiwgbiwgIzEKKwliZXEJTChlZHgpCisKKwlsZHIJcjEyLCBbdXBdLCAjNAorCW9ycglyOSwgcjExLCByMTIsIGxzbCB0bmMKKwltb3YJcjExLCByMTIsIGxzciBjbnQKKwltdWwJcjUsIHI5LCByNAorCXN1YnMJbiwgbiwgIzEKKwliZXEJTChlZHUpCisKKwlBTElHTigxNikKK0wodHB1KToJbGRyCXIxMiwgW3VwXSwgIzQKKwlvcnIJcjksIHIxMSwgcjEyLCBsc2wgdG5jCisJbW92CXIxMSwgcjEyLCBsc3IgY250CisJbW92CXIxMiwgIzAKKwlzdHIJcjUsIFtycF0sICM0CisJdW1hYWwJcjEyLCBjeSwgcjUsIGQKKwltdWwJcjUsIHI5LCByNAorCW1sYQlyNSwgY3ksIHI4LCByNQorCXN1YnMJbiwgbiwgIzEKKwlibmUJTCh0cHUpCisKK0woZWR1KToJc3RyCXI1LCBbcnBdLCAjNAorCW1vdglyMTIsICMwCisJdW1hYWwJcjEyLCBjeSwgcjUsIGQKKwltdWwJcjUsIHIxMSwgcjQKKwltbGEJcjUsIGN5LCByOCwgcjUKKwlzdHIJcjUsIFtycF0KKwlwb3AJe3IxMCxyMTF9CisJcG9wCXtyNCxyNSxyNixyNyxyOCxyOX0KKwlieAlyMTQKKworTChlZHgpOgltdWwJcjUsIHIxMSwgcjQKKwlzdHIJcjUsIFtycF0KKwlwb3AJe3IxMCxyMTF9CisJcG9wCXtyNCxyNSxyNixyNyxyOCxyOX0KKwlieAlyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjYvbW9kZTFvLmFzbSBiL21wbi9hcm0vdjYvbW9kZTFvLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNjOWJjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybS92Ni9tb2RlMW8uYXNtCkBAIC0wLDAgKzEsOTUgQEAKK2RubCAgQVJNIHY2IG1wbl9tb2RleGFjdF8xY19vZGQKKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk0JIC0KK0MgWFNjYWxlCSAtCitDIENvcnRleC1BNwkgPworQyBDb3J0ZXgtQTgJID8KK0MgQ29ydGV4LUE5CSA5CitDIENvcnRleC1BMTUJIDcKKworQyBBcmNoaXRlY3R1cmUgcmVxdWlyZW1lbnRzOgorQyB2NQktCitDIHY1dAktCitDIHY1dGUJc211bGJiCitDIHY2CXVtYWFsCitDIHY2dDIJLQorQyB2N2EJLQorCitkZWZpbmUoYHVwJywgYHIwJykKK2RlZmluZShgbicsICBgcjEnKQorZGVmaW5lKGBkJywgIGByMicpCitkZWZpbmUoYGN5JywgYHIzJykKKworCS5wcm90ZWN0ZWQJYmludmVydF9saW1iX3RhYmxlCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX21vZGV4YWN0XzFjX29kZCkKKwlzdG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByN30KKworCUxFQSgJcjQsIGJpbnZlcnRfbGltYl90YWJsZSkKKworCWxkcglyNiwgW3VwXSwgIzQJCUMgdXBbMF0KKworCWFuZAlyMTIsIGQsICMyNTQKKwlsZHJiCXI0LCBbcjQsIHIxMiwgbHNyICMxXQorCXNtdWxiYglyMTIsIHI0LCByNAorCW11bAlyMTIsIGQsIHIxMgorCXJzYglyMTIsIHIxMiwgcjQsIGFzbCAjMQorCW11bAlyNCwgcjEyLCByMTIKKwltdWwJcjQsIGQsIHI0CisJcnNiCXI0LCByNCwgcjEyLCBhc2wgIzEJQyByNCA9IGludmVyc2UKKworCXN1YnMJbiwgbiwgIzEKKwlzdWIJcjYsIHI2LCBjeQorCW11bAlyNiwgcjYsIHI0CisJYmVxCUwoZW5kKQorCisJcnNiCXI1LCByNCwgIzAJCUMgcjUgPSAtaW52ZXJzZQorCitMKHRvcCk6CWxkcglyNywgW3VwXSwgIzQKKwltb3YJcjEyLCAjMAorCXVtYWFsCXIxMiwgY3ksIHI2LCBkCisJbXVsCXI2LCByNywgcjQKKwltbGEJcjYsIGN5LCByNSwgcjYKKwlzdWJzCW4sIG4sICMxCisJYm5lCUwodG9wKQorCitMKGVuZCk6CW1vdglyMTIsICMwCisJdW1hYWwJcjEyLCBjeSwgcjYsIGQKKwltb3YJcjAsIGN5CisKKwlsZG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByN30KKwlieAlyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm0vdjYvbXVsXzEuYXNtIGIvbXBuL2FybS92Ni9tdWxfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxYjEyYgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm0vdjYvbXVsXzEuYXNtCkBAIC0wLDAgKzEsMTE1IEBACitkbmwgIEFSTSBtcG5fbXVsXzEuCisKK2RubCAgQ29weXJpZ2h0IDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTToJIC0KK0MgWFNjYWxlCSAtCitDIEFSTTExCQkgNi40CitDIENvcnRleC1BNwkgNS4yNQorQyBDb3J0ZXgtQTgJIDcKK0MgQ29ydGV4LUE5CSAzLjI1CitDIENvcnRleC1BMTUJIDQKKworQyBUT0RPCitDICAqIE1pY3JvLW9wdGltaXNlIGZlZWQtaW4gY29kZS4KK0MgICogT3B0aW1pc2UgZm9yIG49MSwyIGJ5IGRlbGF5aW5nIHJlZ2lzdGVyIHNhdmluZy4KK0MgICogVHJ5IHVzaW5nIGxkbS9zdG0uCisKK2RlZmluZShgcnAnLGByMCcpCitkZWZpbmUoYHVwJyxgcjEnKQorZGVmaW5lKGBuJywgYHIyJykKK2RlZmluZShgdjAnLGByMycpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fbXVsXzEpCisJc3RtZmQJc3AhLCB7IHI0LCByNSwgcjYsIHI3IH0KKworCWFuZHMJcjYsIG4sICMzCisJbW92CXIxMiwgIzAKKwliZXEJTChmaTApCisJY21wCXI2LCAjMgorCWJjYwlMKGZpMSkKKwliZXEJTChmaTIpCisKK0woZmkzKToJbGRyCXI0LCBbdXBdLCAjNAorCW1vdglyNiwgIzAKKwlsZHIJcjUsIFt1cF0sICM0CisJYglMKGxvMykKKworTChmaTApOglsZHIJcjUsIFt1cF0sICM0CisJYWRkCXJwLCBycCwgIzQKKwltb3YJcjcsICMwCisJbGRyCXI0LCBbdXBdLCAjNAorCWIJTChsbzApCisKK0woZmkxKToJbGRyCXI0LCBbdXBdLCAjNAorCW1vdglyNiwgIzAKKwlhZGQJcnAsIHJwLCAjOAorCXN1YnMJbiwgbiwgIzEKKwliZXEJTCgxKQorCWxkcglyNSwgW3VwXSwgIzQKKwliCUwobG8xKQorCitMKGZpMik6CWxkcglyNSwgW3VwXSwgIzQKKwlhZGQJcnAsIHJwLCAjMTIKKwltb3YJcjcsICMwCisJbGRyCXI0LCBbdXBdLCAjNAorCWIJTChsbzIpCisKKwlBTElHTigxNikKK0wodG9wKToJbW92CXI2LCAjMAorCWxkcglyNSwgW3VwXSwgIzQKKwlzdHIJcjcsIFtycCwgIy0xMl0KK0wobG8xKToJdW1hYWwJcjYsIHIxMiwgcjQsIHYwCisJbW92CXI3LCAjMAorCWxkcglyNCwgW3VwXSwgIzQKKwlzdHIJcjYsIFtycCwgIy04XQorTChsbzApOgl1bWFhbAlyNywgcjEyLCByNSwgdjAKKwltb3YJcjYsICMwCisJbGRyCXI1LCBbdXBdLCAjNAorCXN0cglyNywgW3JwLCAjLTRdCitMKGxvMyk6CXVtYWFsCXI2LCByMTIsIHI0LCB2MAorCW1vdglyNywgIzAKKwlsZHIJcjQsIFt1cF0sICM0CisJc3RyCXI2LCBbcnBdLCAjMTYKK0wobG8yKToJdW1hYWwJcjcsIHIxMiwgcjUsIHYwCisJc3VicwluLCBuLCAjNAorCWJoaQlMKHRvcCkKKworCW1vdglyNiwgIzAKKwlzdHIJcjcsIFtycCwgIy0xMl0KK0woMSk6CXVtYWFsCXI2LCByMTIsIHI0LCB2MAorCXN0cglyNiwgW3JwLCAjLThdCisJbW92CXIwLCByMTIKKwlsZG1mZAlzcCEsIHsgcjQsIHI1LCByNiwgcjcgfQorCWJ4CWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3Y2L211bF8yLmFzbSBiL21wbi9hcm0vdjYvbXVsXzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmFkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3Y2L211bF8yLmFzbQpAQCAtMCwwICsxLDEzNSBAQAorZG5sICBBUk0gbXBuX211bF8yLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIFN0cm9uZ0FSTToJIC0KK0MgWFNjYWxlCSAtCitDIEFSTTExCQkgNS4yNQorQyBDb3J0ZXgtQTUJIDMuNjMKK0MgQ29ydGV4LUE3CSAzLjE1CitDIENvcnRleC1BOAkgNS4wCitDIENvcnRleC1BOQkgMi4yNQorQyBDb3J0ZXgtQTE1CSAyLjUKK0MgQ29ydGV4LUExNwkgMi4xMworQyBDb3J0ZXgtQTUzCSAzLjUKKworQyBUT0RPCitDICAqIFRoaXMgaXMgYSB0cml2aWFsIGVkaXQgb2YgdGhlIGFkZG11bF8yIGNvZGUuICBDaGVjayBmb3Igc2ltcGxpZmljYXRpb25zLAorQyAgICBhbmQgcG9zc2libGUgc3BlZWR1cHMgdG8gMi4wIGMvbC4KKworZGVmaW5lKGBycCcsYHIwJykKK2RlZmluZShgdXAnLGByMScpCitkZWZpbmUoYG4nLCBgcjInKQorZGVmaW5lKGB2cCcsYHIzJykKKworZGVmaW5lKGB2MCcsYHI2JykKK2RlZmluZShgdjEnLGByNycpCitkZWZpbmUoYHUwJyxgcjMnKQorZGVmaW5lKGB1MScsYHI5JykKKworZGVmaW5lKGBjeWEnLGByOCcpCitkZWZpbmUoYGN5YicsYHIxMicpCisKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9tdWxfMikKKwlwdXNoCXsgcjQsIHI1LCByNiwgcjcsIHI4LCByOSB9CisKKwlsZG0JdnAsIHsgdjAsIHYxIH0KKwltb3YJY3lhLCAjMAorCW1vdgljeWIsICMwCisKKwl0c3QJbiwgIzEKKwliZXEJTChldm4pCitMKG9kZCk6CW1vdglyNSwgIzAKKwlsZHIJdTAsIFt1cCwgIzBdCisJbW92CXI0LCAjMAorCXRzdAluLCAjMgorCWJlcQlMKGZpMSkKK0woZmkzKToJc3ViCXVwLCB1cCwgIzEyCisJc3ViCXJwLCBycCwgIzE2CisJYglMKGxvMykKK0woZmkxKToJc3ViCW4sIG4sICMxCisJc3ViCXVwLCB1cCwgIzQKKwlzdWIJcnAsIHJwLCAjOAorCWIJTChsbzEpCitMKGV2bik6CW1vdglyNCwgIzAKKwlsZHIJdTEsIFt1cCwgIzBdCisJbW92CXI1LCAjMAorCXRzdAluLCAjMgorCWJuZQlMKGZpMikKK0woZmkwKToJc3ViCXVwLCB1cCwgIzgKKwlzdWIJcnAsIHJwLCAjMTIKKwliCUwobG8wKQorTChmaTIpOglzdWJzCW4sIG4sICMyCisJc3ViCXJwLCBycCwgIzQKKwlibHMJTChlbmQpCisKKwlBTElHTigxNikKK0wodG9wKToJbGRyCXUwLCBbdXAsICM0XQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCXN0cglyNCwgW3JwLCAjNF0KKwltb3YJcjQsICMwCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCitMKGxvMSk6CWxkcgl1MSwgW3VwLCAjOF0KKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlzdHIJcjUsIFtycCwgIzhdCisJbW92CXI1LCAjMAorCXVtYWFsCXI0LCBjeWIsIHUwLCB2MQorTChsbzApOglsZHIJdTAsIFt1cCwgIzEyXQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCXN0cglyNCwgW3JwLCAjMTJdCisJbW92CXI0LCAjMAorCXVtYWFsCXI1LCBjeWIsIHUxLCB2MQorTChsbzMpOglsZHIJdTEsIFt1cCwgIzE2XSEKKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlzdHIJcjUsIFtycCwgIzE2XSEKKwltb3YJcjUsICMwCisJdW1hYWwJcjQsIGN5YiwgdTAsIHYxCisJc3VicwluLCBuLCAjNAorCWJoaQlMKHRvcCkKKworTChlbmQpOgl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwlsZHIJdTAsIFt1cCwgIzRdCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICM0XQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCXVtYWFsCWN5YSwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIzhdCisJc3RyCWN5YSwgW3JwLCAjMTJdCisJbW92CXIwLCBjeWIKKworCXBvcAl7IHI0LCByNSwgcjYsIHI3LCByOCwgcjkgfQorCWJ4CXIxNAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS92Ni9wb3BoYW0uYXNtIGIvbXBuL2FybS92Ni9wb3BoYW0uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMmE2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3Y2L3BvcGhhbS5hc20KQEAgLTAsMCArMSwxMzkgQEAKK2RubCAgQVJNIG1wbl9wb3Bjb3VudCBhbmQgbXBuX2hhbWRpc3QuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCQkgICAgIHBvcGNvdW50CSAgICAgIGhhbWRpc3QKK0MJCSAgICBjeWNsZXMvbGltYgkgICAgY3ljbGVzL2xpbWIKK0MgU3Ryb25nQVJNCQkgLQorQyBYU2NhbGUJCSAtCitDIENvcnRleC1BNwkJID8KK0MgQ29ydGV4LUE4CQkgPworQyBDb3J0ZXgtQTkJCSA4Ljk0CQkgOS40NworQyBDb3J0ZXgtQTE1CQkgNS42NwkJIDYuNDQKKworQyBBcmNoaXRlY3R1cmUgcmVxdWlyZW1lbnRzOgorQyB2NQktCitDIHY1dAktCitDIHY1dGUJbGRyZCBzdHJkCitDIHY2CXVzYWRhOAorQyB2NnQyCS0KK0MgdjdhCS0KKworaWZkZWYoYE9QRVJBVElPTl9wb3Bjb3VudCcsYAorICBkZWZpbmUoYGZ1bmMnLGBtcG5fcG9wY291bnQnKQorICBkZWZpbmUoYGFwJywJCWByMCcpCisgIGRlZmluZShgbicsCQlgcjEnKQorICBkZWZpbmUoYGEwJywJCWByMicpCisgIGRlZmluZShgYTEnLAkJYHIzJykKKyAgZGVmaW5lKGBzJywJCWByNScpCisgIGRlZmluZShgYl8wMTAxMDEwMScsCWByNicpCisgIGRlZmluZShgYl8wMDExMDAxMScsCWByNycpCisgIGRlZmluZShgYl8wMDAwMTExMScsCWByOCcpCisgIGRlZmluZShgemVybycsCWByOScpCisgIGRlZmluZShgUE9QQycsCWAkMScpCisgIGRlZmluZShgSEFNRCcsCWBkbmwnKQorJykKK2lmZGVmKGBPUEVSQVRJT05faGFtZGlzdCcsYAorICBkZWZpbmUoYGZ1bmMnLGBtcG5faGFtZGlzdCcpCisgIGRlZmluZShgYXAnLAkJYHIwJykKKyAgZGVmaW5lKGBicCcsCQlgcjEnKQorICBkZWZpbmUoYG4nLAkJYHIyJykKKyAgZGVmaW5lKGBhMCcsCQlgcjYnKQorICBkZWZpbmUoYGExJywJCWByNycpCisgIGRlZmluZShgYjAnLAkJYHI0JykKKyAgZGVmaW5lKGBiMScsCQlgcjUnKQorICBkZWZpbmUoYHMnLAkJYHIxMScpCisgIGRlZmluZShgYl8wMTAxMDEwMScsCWByOCcpCisgIGRlZmluZShgYl8wMDExMDAxMScsCWByOScpCisgIGRlZmluZShgYl8wMDAwMTExMScsCWByMTAnKQorICBkZWZpbmUoYHplcm8nLAlgcjMnKQorICBkZWZpbmUoYFBPUEMnLAlgZG5sJykKKyAgZGVmaW5lKGBIQU1EJywJYCQxJykKKycpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX3BvcGNvdW50IG1wbl9oYW1kaXN0KQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUoZnVuYykKK1BPUEMoYAlwdXNoCXsgcjQtcjkgfQknKQorSEFNRChgCXB1c2gJeyByNC1yMTEgfQknKQorCisJbGRyCWJfMDEwMTAxMDEsID0weDU1NTU1NTU1CisJbW92CXIxMiwgIzAKKwlsZHIJYl8wMDExMDAxMSwgPTB4MzMzMzMzMzMKKwltb3YJemVybywgIzAKKwlsZHIJYl8wMDAwMTExMSwgPTB4MGYwZjBmMGYKKworCXRzdAluLCAjMQorCWJlcQlMKGV2bikKKworTChvZGQpOglsZHIJYTEsIFthcF0sICM0CQlDIDEgeCAzMiAxLWJpdCBhY2N1bXVsYXRvcnMsIDAtMQorSEFNRChgCWxkcgliMSwgW2JwXSwgIzQJJykJQyAxIHggMzIgMS1iaXQgYWNjdW11bGF0b3JzLCAwLTEKK0hBTUQoYAllb3IJYTEsIGExLCBiMQknKQorCWFuZAlyNCwgYl8wMTAxMDEwMSwgYTEsIGxzciAjMQorCXN1YglhMSwgYTEsIHI0CisJYW5kCXI0LCBhMSwgYl8wMDExMDAxMQorCWJpYwlyNSwgYTEsIGJfMDAxMTAwMTEKKwlhZGQJcjUsIHI0LCByNSwgbHNyICMyCUMgOCA0LWJpdCBhY2N1bXVsYXRvcnMsIDAtNAorCXN1YnMJbiwgbiwgIzEKKwliCUwobWlkKQorCitMKGV2bik6CW1vdglzLCAjMAorCitMKHRvcCk6CWxkcmQJYTAsIGExLCBbYXBdLCAjOAlDIDIgeCAzMiAxLWJpdCBhY2N1bXVsYXRvcnMsIDAtMQorSEFNRChgCWxkcmQJYjAsIGIxLCBbYnBdLCAjOCcpCitIQU1EKGAJZW9yCWEwLCBhMCwgYjAJJykKK0hBTUQoYAllb3IJYTEsIGExLCBiMQknKQorCXN1YnMJbiwgbiwgIzIKKwl1c2FkYTgJcjEyLCBzLCB6ZXJvLCByMTIKKwlhbmQJcjQsIGJfMDEwMTAxMDEsIGEwLCBsc3IgIzEKKwlzdWIJYTAsIGEwLCByNAorCWFuZAlyNCwgYl8wMTAxMDEwMSwgYTEsIGxzciAjMQorCXN1YglhMSwgYTEsIHI0CisJYW5kCXI0LCBhMCwgYl8wMDExMDAxMQorCWJpYwlyNSwgYTAsIGJfMDAxMTAwMTEKKwlhZGQJYTAsIHI0LCByNSwgbHNyICMyCUMgOCA0LWJpdCBhY2N1bXVsYXRvcnMsIDAtNAorCWFuZAlyNCwgYTEsIGJfMDAxMTAwMTEKKwliaWMJcjUsIGExLCBiXzAwMTEwMDExCisJYWRkCWExLCByNCwgcjUsIGxzciAjMglDIDggNC1iaXQgYWNjdW11bGF0b3JzLCAwLTQKKwlhZGQJcjUsIGEwLCBhMQkJQyA4IDQtYml0IGFjY3VtdWxhdG9ycywgMC04CitMKG1pZCk6CWFuZAlyNCwgcjUsIGJfMDAwMDExMTEKKwliaWMJcjUsIHI1LCBiXzAwMDAxMTExCisJYWRkCXMsIHI0LCByNSwgbHNyICM0CUMgNCA4LWJpdCBhY2N1bXVsYXRvcnMKKwlibmUJTCh0b3ApCisKKwl1c2FkYTgJcjAsIHMsIHplcm8sIHIxMgorUE9QQyhgCXBvcAl7IHI0LXI5IH0JJykKK0hBTUQoYAlwb3AJeyByNC1yMTEgfQknKQorCWJ4CXIxNAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybS92Ni9zcXJfYmFzZWNhc2UuYXNtIGIvbXBuL2FybS92Ni9zcXJfYmFzZWNhc2UuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDcwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3Y2L3Nxcl9iYXNlY2FzZS5hc20KQEAgLTAsMCArMSw1NDQgQEAKK2RubCAgQVJNIHY2IG1wbl9zcXJfYmFzZWNhc2UuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiwgMjAxMywgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDIENvZGUgc3RydWN0dXJlOgorQworQworQyAgICAgICAgbV8yKDBtNCkgICAgICAgIG1fMigybTQpICAgICAgICBtXzIoMW00KSAgICAgICAgbV8yKDNtNCkKK0MgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKK0MgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKK0MgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKK0MgICAgICAgICAgXHwvICAgICAgICAgICAgIFx8LyAgICAgICAgICAgICBcfC8gICAgICAgICAgICAgXHwvCitDICAgICAgICAgICAgICBfX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgX19fX19fX19fX19fCitDICAgICAgICAgICAgIC8gICAgICAgICAgICBcICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgXAorQyAgICAgICAgICAgIFx8LyAgICAgICAgICAgIFwgICAgICAgICAgICAgICBcfC8gICAgICAgICAgICBcCitDICAgICAgICAgYW1fMigzbTQpICAgICAgIGFtXzIoMW00KSAgICAgICBhbV8yKDBtNCkgICAgICAgYW1fMigybTQpCitDICAgICAgICAgICAgXCAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICBcICAgICAgICAgICAgL3xcCitDICAgICAgICAgICAgIFxfX19fX19fX19fX18vICAgICAgICAgICAgICAgICAgXF9fX19fX19fX19fXy8KK0MgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAvCitDICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAvCitDICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgIC8KK0MgICAgICAgICAgICAgICAgICAgICAgICAgY29yMyAgICAgICAgICAgICBjb3IyCitDICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAgIC8KK0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAvCitDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcl9kaWFnX2FkZGxzaDEKKworQyBUT0RPCitDICAqIEFsaWduIG1vcmUgbGFiZWxzLgorQyAgKiBGdXJ0aGVyIHR3ZWFrIGNvdW50ZXIgYW5kIHVwZGF0ZXMgaW4gb3V0ZXIgbG9vcHMuICAoVGhpcyBjb3VsZCBzYXZlCitDICAgIHBlcmhhcHMgNW4gY3ljbGVzKS4KK0MgICogQXZvaWQgc3ViLXdpdGgtbHNsIGluIG91dGVyIGxvb3BzLiAgV2UgY291bGQga2VlcCBuIHVwLXNoaWZ0ZWQsIHRoZW4KK0MgICAgaW5pdGlhbGlzZSBsb29wIGNvdW50ZXIgaSB3aXRoIGEgcmlnaHQgc2hpZnQuCitDICAqIFRyeSB0byB1c2UgZmV3ZXIgcmVnaXN0ZXIuICBQZXJoYXBzIGNvYWxlc2NlIHI5IGJyYW5jaCB0YXJnZXQgYW5kIG5fc2F2ZWQuCitDICAgIChUaGlzIGNvdWxkIHNhdmUgMi0zIGN5Y2xlcyBmb3IgbiA+IDQuKQorQyAgKiBPcHRpbWlzZSBzcXJfZGlhZ19hZGRsc2gxIGxvb3AuICBUaGUgY3VycmVudCBjb2RlIHVzZXMgb2xkLXN0eWxlIGNhcnJ5CitDICAgIHByb3BhZ2F0aW9uLgorQyAgKiBTdG9wIGxvb3BzIGVhcmxpZXIgc3VwcHJlc3Npbmcgd3JpdGVzIG9mIHVwcGVyLW1vc3QgcnBbXSB2YWx1ZXMuCitDICAqIFRoZSBhZGRtdWxfMiBsb29wcyBoZXJlIHJ1bnMgd2VsbCBvbiBhbGwgY29yZXMsIGJ1dCBtdWxfMiBydW5zIHBvb3JseQorQyAgICBwYXJ0aWN1bGFybHkgb24gQ29ydGV4LUE4LgorCisKK2RlZmluZShgcnAnLCAgICAgIHIwKQorZGVmaW5lKGB1cCcsICAgICAgcjEpCitkZWZpbmUoYG4nLCAgICAgICByMikKKworZGVmaW5lKGB2MCcsICAgICAgcjMpCitkZWZpbmUoYHYxJywgICAgICByNikKK2RlZmluZShgaScsICAgICAgIHI4KQorZGVmaW5lKGBuX3NhdmVkJywgcjE0KQorZGVmaW5lKGBjeWEnLCAgICAgcjExKQorZGVmaW5lKGBjeWInLCAgICAgcjEyKQorZGVmaW5lKGB1MCcsICAgICAgcjcpCitkZWZpbmUoYHUxJywgICAgICByOSkKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9zcXJfYmFzZWNhc2UpCisJYW5kCXIxMiwgbiwgIzMKKwljbXAJbiwgIzQKKwlhZGRndAlyMTIsIHIxMiwgIzQKKwlhZGQJcGMsIHBjLCByMTIsIGxzbCAjMgorCW5vcAorCWIJTCg0KQorCWIJTCgxKQorCWIJTCgyKQorCWIJTCgzKQorCWIJTCgwbTQpCisJYglMKDFtNCkKKwliCUwoMm00KQorCWIJTCgzbTQpCisKKworTCgxbTQpOglwdXNoCXtyNC1yMTEsIHIxNH0KKwltb3YJbl9zYXZlZCwgbgorCXN1YglpLCBuLCAjNAorCXN1YgluLCBuLCAjMgorCWFkZAlyMTAsIHBjLCAjTChhbTJfMm00KS0uLTgKKwlsZG0JdXAsIHt2MCx2MSx1MH0KKwlzdWIJdXAsIHVwLCAjNAorCW1vdgljeWIsICMwCisJbW92CXI1LCAjMAorCXVtdWxsCXI0LCBjeWEsIHYxLCB2MAorCXN0cglyNCwgW3JwXSwgIy0xMgorCW1vdglyNCwgIzAKKwliCUwoa28wKQorCitMKDNtNCk6CXB1c2gJe3I0LXIxMSwgcjE0fQorCW1vdgluX3NhdmVkLCBuCisJc3ViCWksIG4sICM0CisJc3ViCW4sIG4sICMyCisJYWRkCXIxMCwgcGMsICNMKGFtMl8wbTQpLS4tOAorCWxkbQl1cCwge3YwLHYxLHUwfQorCWFkZAl1cCwgdXAsICM0CisJbW92CWN5YiwgIzAKKwltb3YJcjUsICMwCisJdW11bGwJcjQsIGN5YSwgdjEsIHYwCisJc3RyCXI0LCBbcnBdLCAjLTQKKwltb3YJcjQsICMwCisJYglMKGtvMikKKworTCgybTQpOglwdXNoCXtyNC1yMTEsIHIxNH0KKwltb3YJbl9zYXZlZCwgbgorCXN1YglpLCBuLCAjNAorCXN1YgluLCBuLCAjMgorCWFkZAlyMTAsIHBjLCAjTChhbTJfM200KS0uLTgKKwlsZG0JdXAsIHt2MCx2MSx1MX0KKwltb3YJY3liLCAjMAorCW1vdglyNCwgIzAKKwl1bXVsbAlyNSwgY3lhLCB2MSwgdjAKKwlzdHIJcjUsIFtycF0sICMtOAorCW1vdglyNSwgIzAKKwliCUwoa28xKQorCitMKDBtNCk6CXB1c2gJe3I0LXIxMSwgcjE0fQorCW1vdgluX3NhdmVkLCBuCisJc3ViCWksIG4sICM0CisJc3ViCW4sIG4sICMyCisJYWRkCXIxMCwgcGMsICNMKGFtMl8xbTQpLS4tOAorCWxkbQl1cCwge3YwLHYxLHUxfQorCW1vdgljeWIsICMwCisJbW92CXI0LCAjMAorCWFkZAl1cCwgdXAsICM4CisJdW11bGwJcjUsIGN5YSwgdjEsIHYwCisJc3RyCXI1LCBbcnAsICMwXQorCW1vdglyNSwgIzAKKworTCh0b3ApOglsZHIJdTAsIFt1cCwgIzRdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJc3RyCXI0LCBbcnAsICM0XQorCW1vdglyNCwgIzAKKwl1bWFhbAlyNSwgY3liLCB1MSwgdjEKK0woa28yKToJbGRyCXUxLCBbdXAsICM4XQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCXN0cglyNSwgW3JwLCAjOF0KKwltb3YJcjUsICMwCisJdW1hYWwJcjQsIGN5YiwgdTAsIHYxCitMKGtvMSk6CWxkcgl1MCwgW3VwLCAjMTJdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJc3RyCXI0LCBbcnAsICMxMl0KKwltb3YJcjQsICMwCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCitMKGtvMCk6CWxkcgl1MSwgW3VwLCAjMTZdIQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCXN0cglyNSwgW3JwLCAjMTZdIQorCW1vdglyNSwgIzAKKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdWJzCWksIGksICM0CisJYmhpCUwodG9wKQorCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJbGRyCXUwLCBbdXAsICM0XQorCXVtYWFsCXI1LCBjeWIsIHUxLCB2MQorCXN0cglyNCwgW3JwLCAjNF0KKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwl1bWFhbAljeWEsIGN5YiwgdTAsIHYxCisJc3RyCXI1LCBbcnAsICM4XQorCXN0cgljeWEsIFtycCwgIzEyXQorCXN0cgljeWIsIFtycCwgIzE2XQorCisJYWRkCXVwLCB1cCwgIzQKKwlzdWIJbiwgbiwgIzEKKwlhZGQJcnAsIHJwLCAjOAorCWJ4CXIxMAorCitMKGV2bmxvb3ApOgorCXN1YnMJaSwgbiwgIzYKKwlzdWIJbiwgbiwgIzIKKwlibHQJTChjb3IyKQorCWxkbQl1cCwge3YwLHYxLHUxfQorCWFkZAl1cCwgdXAsICM4CisJbW92CWN5YSwgIzAKKwltb3YJY3liLCAjMAorCWxkcglyNCwgW3JwLCAjLTRdCisJdW1hYWwJcjQsIGN5YSwgdjEsIHYwCisJc3RyCXI0LCBbcnAsICMtNF0KKwlsZHIJcjQsIFtycCwgIzBdCisKKwlBTElHTigxNikKK0wodWEyKToJbGRyCXI1LCBbcnAsICM0XQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCWxkcgl1MCwgW3VwLCAjNF0KKwl1bWFhbAlyNSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzBdCisJbGRyCXI0LCBbcnAsICM4XQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCWxkcgl1MSwgW3VwLCAjOF0KKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIzRdCisJbGRyCXI1LCBbcnAsICMxMl0KKwl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwlsZHIJdTAsIFt1cCwgIzEyXQorCXVtYWFsCXI1LCBjeWIsIHUxLCB2MQorCXN0cglyNCwgW3JwLCAjOF0KKwlsZHIJcjQsIFtycCwgIzE2XSEKKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzE2XSEKKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIy00XQorCXN1YnMJaSwgaSwgIzQKKwliaHMJTCh1YTIpCisKKwl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwl1bWFhbAljeWEsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICMwXQorCXN0cgljeWEsIFtycCwgIzRdCisJc3RyCWN5YiwgW3JwLCAjOF0KK0woYW0yXzBtNCk6CisJc3ViCXJwLCBycCwgbiwgbHNsICMyCisJc3ViCXVwLCB1cCwgbiwgbHNsICMyCisJYWRkCXJwLCBycCwgIzgKKworCXN1YglpLCBuLCAjNAorCXN1YgluLCBuLCAjMgorCWxkbQl1cCwge3YwLHYxLHUxfQorCW1vdgljeWEsICMwCisJbW92CWN5YiwgIzAKKwlsZHIJcjQsIFtycCwgIzRdCisJdW1hYWwJcjQsIGN5YSwgdjEsIHYwCisJc3RyCXI0LCBbcnAsICM0XQorCWxkcglyNCwgW3JwLCAjOF0KKwliCUwobG8wKQorCisJQUxJR04oMTYpCitMKHVhMCk6CWxkcglyNSwgW3JwLCAjNF0KKwl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwlsZHIJdTAsIFt1cCwgIzRdCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICMwXQorCWxkcglyNCwgW3JwLCAjOF0KKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzhdCisJdW1hYWwJcjQsIGN5YiwgdTAsIHYxCisJc3RyCXI1LCBbcnAsICM0XQorTChsbzApOglsZHIJcjUsIFtycCwgIzEyXQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCWxkcgl1MCwgW3VwLCAjMTJdCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICM4XQorCWxkcglyNCwgW3JwLCAjMTZdIQorCXVtYWFsCXI1LCBjeWEsIHUwLCB2MAorCWxkcgl1MSwgW3VwLCAjMTZdIQorCXVtYWFsCXI0LCBjeWIsIHUwLCB2MQorCXN0cglyNSwgW3JwLCAjLTRdCisJc3VicwlpLCBpLCAjNAorCWJocwlMKHVhMCkKKworCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCXVtYWFsCWN5YSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzBdCisJc3RyCWN5YSwgW3JwLCAjNF0KKwlzdHIJY3liLCBbcnAsICM4XQorTChhbTJfMm00KToKKwlzdWIJcnAsIHJwLCBuLCBsc2wgIzIKKwlzdWIJdXAsIHVwLCBuLCBsc2wgIzIKKwlhZGQJcnAsIHJwLCAjMTYKKwliCUwoZXZubG9vcCkKKworCitMKG9kZGxvb3ApOgorCXN1YglpLCBuLCAjNQorCXN1YgluLCBuLCAjMgorCWxkbQl1cCwge3YwLHYxLHUwfQorCW1vdgljeWEsICMwCisJbW92CWN5YiwgIzAKKwlsZHIJcjUsIFtycCwgIzBdCisJdW1hYWwJcjUsIGN5YSwgdjEsIHYwCisJc3RyCXI1LCBbcnAsICMwXQorCWxkcglyNSwgW3JwLCAjNF0KKwlhZGQJdXAsIHVwLCAjNAorCWIJTChsbzEpCisKKwlBTElHTigxNikKK0wodWExKToJbGRyCXI1LCBbcnAsICM0XQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCWxkcgl1MCwgW3VwLCAjNF0KKwl1bWFhbAlyNSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzBdCitMKGxvMSk6CWxkcglyNCwgW3JwLCAjOF0KKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzhdCisJdW1hYWwJcjQsIGN5YiwgdTAsIHYxCisJc3RyCXI1LCBbcnAsICM0XQorCWxkcglyNSwgW3JwLCAjMTJdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJbGRyCXUwLCBbdXAsICMxMl0KKwl1bWFhbAlyNSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzhdCisJbGRyCXI0LCBbcnAsICMxNl0hCisJdW1hYWwJcjUsIGN5YSwgdTAsIHYwCisJbGRyCXUxLCBbdXAsICMxNl0hCisJdW1hYWwJcjQsIGN5YiwgdTAsIHYxCisJc3RyCXI1LCBbcnAsICMtNF0KKwlzdWJzCWksIGksICM0CisJYmhzCUwodWExKQorCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJdW1hYWwJY3lhLCBjeWIsIHUxLCB2MQorCXN0cglyNCwgW3JwLCAjMF0KKwlzdHIJY3lhLCBbcnAsICM0XQorCXN0cgljeWIsIFtycCwgIzhdCitMKGFtMl8zbTQpOgorCXN1YglycCwgcnAsIG4sIGxzbCAjMgorCXN1Ygl1cCwgdXAsIG4sIGxzbCAjMgorCWFkZAlycCwgcnAsICM0CisKKwlzdWJzCWksIG4sICMzCisJYmVxCUwoY29yMykKKwlzdWIJbiwgbiwgIzIKKwlsZG0JdXAsIHt2MCx2MSx1MH0KKwltb3YJY3lhLCAjMAorCW1vdgljeWIsICMwCisJbGRyCXI1LCBbcnAsICM4XQorCXN1Ygl1cCwgdXAsICM0CisJdW1hYWwJcjUsIGN5YSwgdjEsIHYwCisJc3RyCXI1LCBbcnAsICM4XQorCWxkcglyNSwgW3JwLCAjMTJdCisJYglMKGxvMykKKworCUFMSUdOKDE2KQorTCh1YTMpOglsZHIJcjUsIFtycCwgIzRdCisJdW1hYWwJcjQsIGN5YSwgdTEsIHYwCisJbGRyCXUwLCBbdXAsICM0XQorCXVtYWFsCXI1LCBjeWIsIHUxLCB2MQorCXN0cglyNCwgW3JwLCAjMF0KKwlsZHIJcjQsIFtycCwgIzhdCisJdW1hYWwJcjUsIGN5YSwgdTAsIHYwCisJbGRyCXUxLCBbdXAsICM4XQorCXVtYWFsCXI0LCBjeWIsIHUwLCB2MQorCXN0cglyNSwgW3JwLCAjNF0KKwlsZHIJcjUsIFtycCwgIzEyXQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCWxkcgl1MCwgW3VwLCAjMTJdCisJdW1hYWwJcjUsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICM4XQorTChsbzMpOglsZHIJcjQsIFtycCwgIzE2XSEKKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlsZHIJdTEsIFt1cCwgIzE2XSEKKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIy00XQorCXN1YnMJaSwgaSwgIzQKKwliaHMJTCh1YTMpCisKKwl1bWFhbAlyNCwgY3lhLCB1MSwgdjAKKwl1bWFhbAljeWEsIGN5YiwgdTEsIHYxCisJc3RyCXI0LCBbcnAsICMwXQorCXN0cgljeWEsIFtycCwgIzRdCisJc3RyCWN5YiwgW3JwLCAjOF0KK0woYW0yXzFtNCk6CisJc3ViCXJwLCBycCwgbiwgbHNsICMyCisJc3ViCXVwLCB1cCwgbiwgbHNsICMyCisJYWRkCXJwLCBycCwgIzEyCisJYglMKG9kZGxvb3ApCisKKworTChjb3IzKTpsZG0JdXAsIHt2MCx2MSx1MH0KKwlsZHIJcjUsIFtycCwgIzhdCisJbW92CWN5YSwgIzAKKwltb3YJY3liLCAjMAorCXVtYWFsCXI1LCBjeWEsIHYxLCB2MAorCXN0cglyNSwgW3JwLCAjOF0KKwlsZHIJcjUsIFtycCwgIzEyXQorCWxkcglyNCwgW3JwLCAjMTZdCisJdW1hYWwJcjUsIGN5YSwgdTAsIHYwCisJbGRyCXUxLCBbdXAsICMxMl0KKwl1bWFhbAlyNCwgY3liLCB1MCwgdjEKKwlzdHIJcjUsIFtycCwgIzEyXQorCXVtYWFsCXI0LCBjeWEsIHUxLCB2MAorCXVtYWFsCWN5YSwgY3liLCB1MSwgdjEKKwlzdHIJcjQsIFtycCwgIzE2XQorCXN0cgljeWEsIFtycCwgIzIwXQorCXN0cgljeWIsIFtycCwgIzI0XQorCWFkZAl1cCwgdXAsICMxNgorCW1vdgljeWEsIGN5YgorCWFkZHMJcnAsIHJwLCAjMzYJCUMgY2xlYXIgY3kKKwltb3YJY3liLCAjMAorCXVtYWFsCWN5YSwgY3liLCB1MSwgdTAKKwliCUwoc3FyX2RpYWdfYWRkbHNoMSkKKworTChjb3IyKToKKwlsZG0JdXAhLCB7djAsdjEsdTB9CisJbW92CXI0LCBjeWEKKwltb3YJcjUsIGN5YgorCW1vdgljeWEsICMwCisJdW1hYWwJcjQsIGN5YSwgdjEsIHYwCisJbW92CWN5YiwgIzAKKwl1bWFhbAlyNSwgY3lhLCB1MCwgdjAKKwlzdHJkCXI0LCByNSwgW3JwLCAjLTRdCisJdW1hYWwJY3lhLCBjeWIsIHUwLCB2MQorCWFkZAlycCwgcnAsICMxNgorQwliCUwoc3FyX2RpYWdfYWRkbHNoMSkKKworCitkZWZpbmUoYHcwJywgIHI2KQorZGVmaW5lKGB3MScsICByNykKK2RlZmluZShgdzInLCAgcjgpCitkZWZpbmUoYHJieCcsIHI5KQorCitMKHNxcl9kaWFnX2FkZGxzaDEpOgorCXN0cgljeWEsIFtycCwgIy0xMl0KKwlzdHIJY3liLCBbcnAsICMtOF0KKwlzdWIJbiwgbl9zYXZlZCwgIzEKKwlzdWIJdXAsIHVwLCBuX3NhdmVkLCBsc2wgIzIKKwlzdWIJcnAsIHJwLCBuX3NhdmVkLCBsc2wgIzMKKwlsZHIJcjMsIFt1cF0sICM0CisJdW11bGwJdzEsIHI1LCByMywgcjMKKwltb3YJdzIsICMwCisJbW92CXIxMCwgIzAKK0MJY21uCXIwLCAjMAkJCUMgY2xlYXIgY3kgKGFscmVhZHkgY2xlYXIpCisJYglMKGxtKQorCitMKHRzZCk6CWFkZHMJdzAsIHcwLCByYngKKwlhZGNzCXcxLCB3MSwgcjQKKwlzdHIJdzAsIFtycCwgIzBdCitMKGxtKToJbGRyCXcwLCBbcnAsICM0XQorCXN0cgl3MSwgW3JwLCAjNF0KKwlsZHIJdzEsIFtycCwgIzhdIQorCWFkZAlyYngsIHI1LCB3MgorCWFkY3MJdzAsIHcwLCB3MAorCWxkcglyMywgW3VwXSwgIzQKKwlhZGNzCXcxLCB3MSwgdzEKKwlhZGMJdzIsIHIxMCwgcjEwCisJdW11bGwJcjQsIHI1LCByMywgcjMKKwlzdWJzCW4sIG4sICMxCisJYm5lCUwodHNkKQorCisJYWRkcwl3MCwgdzAsIHJieAorCWFkY3MJdzEsIHcxLCByNAorCWFkYwl3MiwgcjUsIHcyCisJc3RtCXJwLCB7dzAsdzEsdzJ9CisKKwlwb3AJe3I0LXIxMSwgcGN9CisKKworQyBTdHJhaWdodCBsaW5lIGNvZGUgZm9yIG4gPD0gNAorCitMKDEpOglsZHIJcjMsIFt1cCwgIzBdCisJdW11bGwJcjEsIHIyLCByMywgcjMKKwlzdG0JcnAsIHtyMSxyMn0KKwlieAlyMTQKKworTCgyKToJcHVzaAl7cjQtcjV9CisJbGRtCXVwLCB7cjUscjEyfQorCXVtdWxsCXIxLCByMiwgcjUsIHI1CisJdW11bGwJcjMsIHI0LCByMTIsIHIxMgorCXVtdWxsCXI1LCByMTIsIHI1LCByMTIKKwlhZGRzCXI1LCByNSwgcjUKKwlhZGNzCXIxMiwgcjEyLCByMTIKKwlhZGMJcjQsIHI0LCAjMAorCWFkZHMJcjIsIHIyLCByNQorCWFkY3MJcjMsIHIzLCByMTIKKwlhZGMJcjQsIHI0LCAjMAorCXN0bQlycCwge3IxLHIyLHIzLHI0fQorCXBvcAl7cjQtcjV9CisJYngJcjE0CisKK0woMyk6CXB1c2gJe3I0LXIxMX0KKwlsZG0JdXAsIHtyNyxyOCxyOX0KKwl1bXVsbAlyMSwgcjIsIHI3LCByNworCXVtdWxsCXIzLCByNCwgcjgsIHI4CisJdW11bGwJcjUsIHI2LCByOSwgcjkKKwl1bXVsbAlyMTAsIHIxMSwgcjcsIHI4CisJbW92CXIxMiwgIzAKKwl1bWxhbAlyMTEsIHIxMiwgcjcsIHI5CisJbW92CXI3LCAjMAorCXVtbGFsCXIxMiwgcjcsIHI4LCByOQorCWFkZHMJcjEwLCByMTAsIHIxMAorCWFkY3MJcjExLCByMTEsIHIxMQorCWFkY3MJcjEyLCByMTIsIHIxMgorCWFkY3MJcjcsIHI3LCByNworCWFkYwlyNiwgcjYsICMwCisJYWRkcwlyMiwgcjIsIHIxMAorCWFkY3MJcjMsIHIzLCByMTEKKwlhZGNzCXI0LCByNCwgcjEyCisJYWRjcwlyNSwgcjUsIHI3CisJYWRjCXI2LCByNiwgIzAKKwlzdG0JcnAsIHtyMSxyMixyMyxyNCxyNSxyNn0KKwlwb3AJe3I0LXIxMX0KKwlieAlyMTQKKworTCg0KToJcHVzaAl7cjQtcjExLCByMTR9CisJbGRtCXVwLCB7cjkscjEwLHIxMSxyMTJ9CisJdW11bGwJcjEsIHIyLCByOSwgcjkKKwl1bXVsbAlyMywgcjQsIHIxMCwgcjEwCisJdW11bGwJcjUsIHI2LCByMTEsIHIxMQorCXVtdWxsCXI3LCByOCwgcjEyLCByMTIKKwlzdG0JcnAsIHtyMSxyMixyMyxyNCxyNSxyNixyN30KKwl1bXVsbAlyMSwgcjIsIHI5LCByMTAKKwltb3YJcjMsICMwCisJdW1sYWwJcjIsIHIzLCByOSwgcjExCisJbW92CXI0LCAjMAorCXVtbGFsCXIzLCByNCwgcjksIHIxMgorCW1vdglyNSwgIzAKKwl1bWxhbAlyMywgcjUsIHIxMCwgcjExCisJdW1hYWwJcjQsIHI1LCByMTAsIHIxMgorCW1vdglyNiwgIzAKKwl1bWxhbAlyNSwgcjYsIHIxMSwgcjEyCisJYWRkcwlyMSwgcjEsIHIxCisJYWRjcwlyMiwgcjIsIHIyCisJYWRjcwlyMywgcjMsIHIzCisJYWRjcwlyNCwgcjQsIHI0CisJYWRjcwlyNSwgcjUsIHI1CisJYWRjcwlyNiwgcjYsIHI2CisJYWRkCXJwLCBycCwgIzQKKwlhZGMJcjcsIHI4LCAjMAorCWxkbQlycCwge3I4LHI5LHIxMCxyMTEscjEyLHIxNH0KKwlhZGRzCXIxLCByMSwgcjgKKwlhZGNzCXIyLCByMiwgcjkKKwlhZGNzCXIzLCByMywgcjEwCisJYWRjcwlyNCwgcjQsIHIxMQorCWFkY3MJcjUsIHI1LCByMTIKKwlhZGNzCXI2LCByNiwgcjE0CisJYWRjCXI3LCByNywgIzAKKwlzdG0JcnAsIHtyMSxyMixyMyxyNCxyNSxyNixyN30KKwlwb3AJe3I0LXIxMSwgcGN9CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtL3Y2L3N1Ym11bF8xLmFzbSBiL21wbi9hcm0vdjYvc3VibXVsXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzcyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtL3Y2L3N1Ym11bF8xLmFzbQpAQCAtMCwwICsxLDEyNSBAQAorZG5sICBBUk0gbXBuX3N1Ym11bF8xLgorCitkbmwgIENvcHlyaWdodCAyMDEyLCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBTdHJvbmdBUk06CSAtCitDIFhTY2FsZQkgLQorQyBDb3J0ZXgtQTcJID8KK0MgQ29ydGV4LUE4CSA/CitDIENvcnRleC1BOQkgMy43NQorQyBDb3J0ZXgtQTE1CSA0LjAKKworQyBUaGlzIGxvb3AgY29tcGxlbWVudHMgVSBvbiB0aGUgZmx5LAorQyAgIFUnID0gQl5uIC0gMSAtIFUKK0MgYW5kIHRoZW4gdXNlcyB0aGF0CitDICAgUiAtIFUqdiA9IFIgKyBVJyp2ICsgdiAtIEJebiB2CisKK0MgVE9ETworQyAgKiBNaWNyby1vcHRpbWlzZSBmZWVkLWluIGNvZGUuCitDICAqIE9wdGltaXNlIGZvciBuPTEsMiBieSBkZWxheWluZyByZWdpc3RlciBzYXZpbmcuCitDICAqIFRyeSB1c2luZyBsZG0vc3RtLgorCitkZWZpbmUoYHJwJyxgcjAnKQorZGVmaW5lKGB1cCcsYHIxJykKK2RlZmluZShgbicsIGByMicpCitkZWZpbmUoYHYwJyxgcjMnKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX3N1Ym11bF8xKQorCXN0bWZkCXNwISwgeyByNCwgcjUsIHI2LCByNyB9CisKKwlhbmRzCXI2LCBuLCAjMworCW1vdglyMTIsIHYwCisJYmVxCUwoZmkwKQorCWNtcAlyNiwgIzIKKwliY2MJTChmaTEpCisJYmVxCUwoZmkyKQorCitMKGZpMyk6CWxkcglyNCwgW3VwXSwgIzEyCisJbXZuCXI0LCByNAorCWxkcglyNiwgW3JwLCAjMF0KKwlsZHIJcjUsIFt1cCwgIy04XQorCWIJTChsbzMpCisKK0woZmkwKToJbGRyCXI1LCBbdXBdLCAjMTYKKwltdm4JcjUsIHI1CisJbGRyCXI3LCBbcnBdLCAjNAorCWxkcglyNCwgW3VwLCAjLTEyXQorCWIJTChsbzApCisKK0woZmkxKToJbGRyCXI0LCBbdXBdLCAjNAorCW12bglyNCwgcjQKKwlsZHIJcjYsIFtycF0sICM4CisJc3VicwluLCBuLCAjMQorCWJlcQlMKDEpCisJbGRyCXI1LCBbdXBdCisJYglMKGxvMSkKKworTChmaTIpOglsZHIJcjUsIFt1cF0sICM4CisJbXZuCXI1LCByNQorCWxkcglyNywgW3JwXSwgIzEyCisJbGRyCXI0LCBbdXAsICMtNF0KKwliCUwobG8yKQorCisJQUxJR04oMTYpCitMKHRvcCk6CWxkcglyNiwgW3JwLCAjLThdCisJbGRyCXI1LCBbdXBdCisJc3RyCXI3LCBbcnAsICMtMTJdCitMKGxvMSk6CXVtYWFsCXI2LCByMTIsIHI0LCB2MAorCWFkZAl1cCwgdXAsICMxNgorCW12bglyNSwgcjUKKwlsZHIJcjcsIFtycCwgIy00XQorCWxkcglyNCwgW3VwLCAjLTEyXQorCXN0cglyNiwgW3JwLCAjLThdCitMKGxvMCk6CXVtYWFsCXI3LCByMTIsIHI1LCB2MAorCW12bglyNCwgcjQKKwlsZHIJcjYsIFtycCwgIzBdCisJbGRyCXI1LCBbdXAsICMtOF0KKwlzdHIJcjcsIFtycCwgIy00XQorTChsbzMpOgl1bWFhbAlyNiwgcjEyLCByNCwgdjAKKwltdm4JcjUsIHI1CisJbGRyCXI3LCBbcnAsICM0XQorCWxkcglyNCwgW3VwLCAjLTRdCisJc3RyCXI2LCBbcnBdLCAjMTYKK0wobG8yKToJdW1hYWwJcjcsIHIxMiwgcjUsIHYwCisJbXZuCXI0LCByNAorCXN1YnMJbiwgbiwgIzQKKwliaGkJTCh0b3ApCisKKwlsZHIJcjYsIFtycCwgIy04XQorCXN0cglyNywgW3JwLCAjLTEyXQorTCgxKToJdW1hYWwJcjYsIHIxMiwgcjQsIHYwCisJc3RyCXI2LCBbcnAsICMtOF0KKwlzdWIJcjAsIHYwLCByMTIKKwlsZG1mZAlzcCEsIHsgcjQsIHI1LCByNiwgcjcgfQorCWJ4CWxyCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvYW9yc19uLmFzbSBiL21wbi9hcm02NC9hb3JzX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODcwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvYW9yc19uLmFzbQpAQCAtMCwwICsxLDEyNSBAQAorZG5sICBBUk02NCBtcG5fYWRkX24gYW5kIG1wbl9zdWJfbgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJMi43NS0zLjI1CitDIENvcnRleC1BNTcJIDEuNQorQyBYLUdlbmUJIDIuMAorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBycCcsIGB4MCcpCitkZWZpbmUoYHVwJywgYHgxJykKK2RlZmluZShgdnAnLCBgeDInKQorZGVmaW5lKGBuJywgIGB4MycpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkX24nLCBgCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgQ0xSQ1knLAlgY21uCXh6ciwgeHpyJykKKyAgZGVmaW5lKGBTRVRDWScsCWBjbXAJJDEsICMxJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgY3NldAl4MCwgY3MnKQorICBkZWZpbmUoYGZ1bmNfbicsCW1wbl9hZGRfbikKKyAgZGVmaW5lKGBmdW5jX25jJywJbXBuX2FkZF9uYyknKQoraWZkZWYoYE9QRVJBVElPTl9zdWJfbicsIGAKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBDTFJDWScsCWBjbXAJeHpyLCB4enInKQorICBkZWZpbmUoYFNFVENZJywJYGNtcAl4enIsICQxJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgY3NldAl4MCwgY2MnKQorICBkZWZpbmUoYGZ1bmNfbicsCW1wbl9zdWJfbikKKyAgZGVmaW5lKGBmdW5jX25jJywJbXBuX3N1Yl9uYyknKQorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9hZGRfbiBtcG5fYWRkX25jIG1wbl9zdWJfbiBtcG5fc3ViX25jKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUoZnVuY19uYykKKwlTRVRDWSgJeDQpCisJYglMKGVudCkKK0VQSUxPR1VFKCkKK1BST0xPR1VFKGZ1bmNfbikKKwlDTFJDWQorTChlbnQpOglsc3IJeDE3LCBuLCAjMgorCXRiegluLCAjMCwgTChieDApCisKK0woYngxKToJbGRyCXg3LCBbdXBdCisJbGRyCXgxMSwgW3ZwXQorCUFERFNVQkMJeDEzLCB4NywgeDExCisJc3RyCXgxMywgW3JwXSwjOAorCXRibnoJbiwgIzEsIEwoYjExKQorCitMKGIwMSk6CWNiegl4MTcsIEwocmV0KQorCWxkcAl4NCwgeDUsIFt1cCwjOF0KKwlsZHAJeDgsIHg5LCBbdnAsIzhdCisJc3ViCXVwLCB1cCwgIzgKKwlzdWIJdnAsIHZwLCAjOAorCWIJTChtaWQpCisKK0woYjExKToJbGRwCXg2LCB4NywgW3VwLCM4XQorCWxkcAl4MTAsIHgxMSwgW3ZwLCM4XQorCWFkZAl1cCwgdXAsICM4CisJYWRkCXZwLCB2cCwgIzgKKwljYnoJeDE3LCBMKGVuZCkKKwliCUwodG9wKQorCitMKGJ4MCk6CXRibnoJbiwgIzEsIEwoYjEwKQorCitMKGIwMCk6CWxkcAl4NCwgeDUsIFt1cF0KKwlsZHAJeDgsIHg5LCBbdnBdCisJc3ViCXVwLCB1cCwgIzE2CisJc3ViCXZwLCB2cCwgIzE2CisJYglMKG1pZCkKKworTChiMTApOglsZHAJeDYsIHg3LCBbdXBdCisJbGRwCXgxMCwgeDExLCBbdnBdCisJY2J6CXgxNywgTChlbmQpCisKKwlBTElHTigxNikKK0wodG9wKToJbGRwCXg0LCB4NSwgW3VwLCMxNl0KKwlsZHAJeDgsIHg5LCBbdnAsIzE2XQorCUFERFNVQkMJeDEyLCB4NiwgeDEwCisJQUREU1VCQwl4MTMsIHg3LCB4MTEKKwlzdHAJeDEyLCB4MTMsIFtycF0sIzE2CitMKG1pZCk6CWxkcAl4NiwgeDcsIFt1cCwjMzJdIQorCWxkcAl4MTAsIHgxMSwgW3ZwLCMzMl0hCisJQUREU1VCQwl4MTIsIHg0LCB4OAorCUFERFNVQkMJeDEzLCB4NSwgeDkKKwlzdHAJeDEyLCB4MTMsIFtycF0sIzE2CisJc3ViCXgxNywgeDE3LCAjMQorCWNibnoJeDE3LCBMKHRvcCkKKworTChlbmQpOglBRERTVUJDCXgxMiwgeDYsIHgxMAorCUFERFNVQkMJeDEzLCB4NywgeDExCisJc3RwCXgxMiwgeDEzLCBbcnBdCitMKHJldCk6CVJFVFZBTAorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2FvcnNtdWxfMS5hc20gYi9tcG4vYXJtNjQvYW9yc211bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA3YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2FvcnNtdWxfMS5hc20KQEAgLTAsMCArMSwxNDUgQEAKK2RubCAgQVJNNjQgbXBuX2FkZG11bF8xIGFuZCBtcG5fc3VibXVsXzEKKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEzLCAyMDE1LCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICAgIGFkZG11bF8xICAgICAgICBzdWJtdWxfMQorQwkgICAgIGN5Y2xlcy9saW1iICAgICBjeWNsZXMvbGltYgorQyBDb3J0ZXgtQTUzCTkuMy05LjgJCTkuMy05LjgKK0MgQ29ydGV4LUE1NSAgICA5LjAtOS41CQk5LjMtOS44CitDIENvcnRleC1BNTcJIDcJCSA3CitDIENvcnRleC1BNzIKK0MgQ29ydGV4LUE3MwkgNgkJIDYKK0MgWC1HZW5lCSA1CQkgNQorQyBBcHBsZSBNMQkgMS43NQkJIDEuNzUKKworQyBOT1RFUworQyAgKiBJdCBpcyBwb3NzaWJsZSB0byBrZWVwIHRoZSBjYXJyeSBjaGFpbiBhbGl2ZSBiZXR3ZWVuIHRoZSBhZGRpdGlvbiBibG9ja3MKK0MgICAgYW5kIHRodXMgYXZvaWQgY3NpbmMsIGJ1dCBvbmx5IGZvciBhZGRtdWxfMS4gIFNpbmNlIHRoYXQgc2F2ZXMgbm8gdGltZQorQyAgICBvbiB0aGUgdGVzdGVkIHBpcGVsaW5lcywgd2Uga2VlcCBhZGRtdWxfMSBhbmQgc3VibXVsXzEgc2ltaWxhci4KK0MgICogV2UgY291bGQgc2VwYXJhdGUgZmVlZC1pbiBpbnRvIDQgYmxvY2tzLCBvbmUgZm9yIGVhY2ggcmVzaWR1ZSAobW9kIDQpLgorQyAgICBUaGF0IGlzIGxpa2VseSB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KKworY2hhbmdlY29tKGJsYWgpCisKK2RlZmluZShgcnAnLCBgeDAnKQorZGVmaW5lKGB1cCcsIGB4MScpCitkZWZpbmUoYG4nLCAgYHgyJykKK2RlZmluZShgdjAnLCBgeDMnKQorCitpZmRlZihgT1BFUkFUSU9OX2FkZG11bF8xJywgYAorICBkZWZpbmUoYEFERFNVQicsCWFkZHMpCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgQ09ORCcsCWBjYycpCisgIGRlZmluZShgZnVuYycsCW1wbl9hZGRtdWxfMSknKQoraWZkZWYoYE9QRVJBVElPTl9zdWJtdWxfMScsIGAKKyAgZGVmaW5lKGBBRERTVUInLAlzdWJzKQorICBkZWZpbmUoYEFERFNVQkMnLAlzYmNzKQorICBkZWZpbmUoYENPTkQnLAlgY3MnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fc3VibXVsXzEpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkbXVsXzEgbXBuX3N1Ym11bF8xKQorCitQUk9MT0dVRShmdW5jKQorCWFkZHMJeDE1LCB4enIsIHh6cgorCisJdGJ6CW4sICMwLCBMKDEpCisKKwlsZHIJeDQsIFt1cF0sIzgKKwltdWwJeDgsIHg0LCB2MAorCXVtdWxoCXgxMiwgeDQsIHYwCisJbGRyCXg0LCBbcnBdCisJQUREU1VCCXg4LCB4NCwgeDgKKwljc2luYwl4MTUsIHgxMiwgeDEyLCBDT05ECisJc3RyCXg4LCBbcnBdLCM4CisKK0woMSk6CXRiegluLCAjMSwgTCgyKQorCisJbGRwCXg0LCB4NSwgW3VwXSwjMTYKKwltdWwJeDgsIHg0LCB2MAorCXVtdWxoCXgxMiwgeDQsIHYwCisJbXVsCXg5LCB4NSwgdjAKKwl1bXVsaAl4MTMsIHg1LCB2MAorCWFkZHMJeDgsIHg4LCB4MTUKKwlhZGNzCXg5LCB4OSwgeDEyCisJbGRwCXg0LCB4NSwgW3JwXQorCWFkYwl4MTUsIHgxMywgeHpyCisJQUREU1VCCXg4LCB4NCwgeDgKKwlBRERTVUJDCXg5LCB4NSwgeDkKKwljc2luYwl4MTUsIHgxNSwgeDE1LCBDT05ECisJc3RwCXg4LCB4OSwgW3JwXSwjMTYKKworTCgyKToJbHNyCW4sIG4sICMyCisJY2J6CW4sIEwobGUzKQorCWxkcAl4NCwgeDUsIFt1cF0sIzMyCisJbGRwCXg2LCB4NywgW3VwLCMtMTZdCisJYglMKG1pZCkKK0wobGUzKToJbW92CXgwLCB4MTUKKwlyZXQKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHAJeDQsIHg1LCBbdXBdLCMzMgorCWxkcAl4NiwgeDcsIFt1cCwjLTE2XQorCUFERFNVQgl4OCwgeDE2LCB4OAorCUFERFNVQkMJeDksIHgxNywgeDkKKwlzdHAJeDgsIHg5LCBbcnBdLCMzMgorCUFERFNVQkMJeDEwLCB4MTIsIHgxMAorCUFERFNVQkMJeDExLCB4MTMsIHgxMQorCXN0cAl4MTAsIHgxMSwgW3JwLCMtMTZdCisJY3NpbmMJeDE1LCB4MTUsIHgxNSwgQ09ORAorTChtaWQpOglzdWIJbiwgbiwgIzEKKwltdWwJeDgsIHg0LCB2MAorCXVtdWxoCXgxMiwgeDQsIHYwCisJbXVsCXg5LCB4NSwgdjAKKwl1bXVsaAl4MTMsIHg1LCB2MAorCWFkZHMJeDgsIHg4LCB4MTUKKwltdWwJeDEwLCB4NiwgdjAKKwl1bXVsaAl4MTQsIHg2LCB2MAorCWFkY3MJeDksIHg5LCB4MTIKKwltdWwJeDExLCB4NywgdjAKKwl1bXVsaAl4MTUsIHg3LCB2MAorCWFkY3MJeDEwLCB4MTAsIHgxMworCWxkcAl4MTYsIHgxNywgW3JwXQorCWFkY3MJeDExLCB4MTEsIHgxNAorCWxkcAl4MTIsIHgxMywgW3JwLCMxNl0KKwlhZGMJeDE1LCB4MTUsIHh6cgorCWNibnoJbiwgTCh0b3ApCisKKwlBRERTVUIJeDgsIHgxNiwgeDgKKwlBRERTVUJDCXg5LCB4MTcsIHg5CisJQUREU1VCQwl4MTAsIHgxMiwgeDEwCisJQUREU1VCQwl4MTEsIHgxMywgeDExCisJc3RwCXg4LCB4OSwgW3JwXQorCXN0cAl4MTAsIHgxMSwgW3JwLCMxNl0KKwljc2luYwl4MCwgeDE1LCB4MTUsIENPTkQKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9hb3Jzb3JybHNoMV9uLmFzbSBiL21wbi9hcm02NC9hb3Jzb3JybHNoMV9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzk4OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2FvcnNvcnJsc2gxX24uYXNtCkBAIC0wLDAgKzEsNDMgQEAKK2RubCAgQVJNNjQgbXBuX2FkZGxzaDFfbiwgbXBuX3N1YmxzaDFfbiwgbXBuX3JzYmxzaDFfbi4KKworZG5sICBDb3B5cmlnaHQgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK2RlZmluZShMU0gsCQkxKQorZGVmaW5lKFJTSCwJCTYzKQorCitpZmRlZihgT1BFUkFUSU9OX2FkZGxzaDFfbicsYGRlZmluZShgRE9fYWRkJyknKQoraWZkZWYoYE9QRVJBVElPTl9zdWJsc2gxX24nLGBkZWZpbmUoYERPX3N1YicpJykKK2lmZGVmKGBPUEVSQVRJT05fcnNibHNoMV9uJyxgZGVmaW5lKGBET19yc2InKScpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FkZGxzaDFfbiBtcG5fc3VibHNoMV9uIG1wbl9yc2Jsc2gxX24pCisKK2luY2x1ZGVfbXBuKGBhcm02NC9hb3Jzb3JybHNoQ19uLmFzbScpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvYW9yc29ycmxzaDJfbi5hc20gYi9tcG4vYXJtNjQvYW9yc29ycmxzaDJfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzOTAyNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm02NC9hb3Jzb3JybHNoMl9uLmFzbQpAQCAtMCwwICsxLDQzIEBACitkbmwgIEFSTTY0IG1wbl9hZGRsc2gyX24sIG1wbl9zdWJsc2gyX24sIG1wbl9yc2Jsc2gyX24uCisKK2RubCAgQ29weXJpZ2h0IDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitkZWZpbmUoTFNILAkJMikKK2RlZmluZShSU0gsCQk2MikKKworaWZkZWYoYE9QRVJBVElPTl9hZGRsc2gyX24nLGBkZWZpbmUoYERPX2FkZCcpJykKK2lmZGVmKGBPUEVSQVRJT05fc3VibHNoMl9uJyxgZGVmaW5lKGBET19zdWInKScpCitpZmRlZihgT1BFUkFUSU9OX3JzYmxzaDJfbicsYGRlZmluZShgRE9fcnNiJyknKQorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9hZGRsc2gyX24gbXBuX3N1YmxzaDJfbiBtcG5fcnNibHNoMl9uKQorCitpbmNsdWRlX21wbihgYXJtNjQvYW9yc29ycmxzaENfbi5hc20nKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2FvcnNvcnJsc2hDX24uYXNtIGIvbXBuL2FybTY0L2FvcnNvcnJsc2hDX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzUwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvYW9yc29ycmxzaENfbi5hc20KQEAgLTAsMCArMSwxMzkgQEAKK2RubCAgQVJNNjQgbXBuX2FkZGxzaENfbiwgbXBuX3N1YmxzaENfbiwgbXBuX3JzYmxzaENfbi4KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBDb3J0ZXgtQTUzCTMuMjUtMy43NQorQyBDb3J0ZXgtQTU3CSAyLjE4CitDIFgtR2VuZQkgMi41CisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwJywgYHgwJykKK2RlZmluZShgdXAnLCBgeDEnKQorZGVmaW5lKGB2cCcsIGB4MicpCitkZWZpbmUoYG4nLCAgYHgzJykKKworaWZkZWYoYERPX2FkZCcsIGAKKyAgZGVmaW5lKGBBRERTVUInLAlgYWRkcwkkMSwgJDIsICQzJykKKyAgZGVmaW5lKGBBRERTVUJDJywJYGFkY3MJJDEsICQyLCAkMycpCisgIGRlZmluZShgQ0xSUkNZJywJYGFkZHMJJDEsIHh6ciwgeHpyJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgYWRjCXgwLCAkMSwgeHpyJykKKyAgZGVmaW5lKGBmdW5jX24nLAltcG5fYWRkbHNoYCdMU0hgJ19uKScpCitpZmRlZihgRE9fc3ViJywgYAorICBkZWZpbmUoYEFERFNVQicsCWBzdWJzCSQxLCAkMywgJDInKQorICBkZWZpbmUoYEFERFNVQkMnLAlgc2JjcwkkMSwgJDMsICQyJykKKyAgZGVmaW5lKGBDTFJSQ1knLAlgc3VicwkkMSwgeHpyLCB4enInKQorICBkZWZpbmUoYFJFVFZBTCcsCWBjaW5jCXgwLCAkMSwgY2MnKQorICBkZWZpbmUoYGZ1bmNfbicsCW1wbl9zdWJsc2hgJ0xTSGAnX24pJykKK2lmZGVmKGBET19yc2InLCBgCisgIGRlZmluZShgQUREU1VCJywJYHN1YnMJJDEsICQyLCAkMycpCisgIGRlZmluZShgQUREU1VCQycsCWBzYmNzCSQxLCAkMiwgJDMnKQorICBkZWZpbmUoYENMUlJDWScsCWBzdWJzCSQxLCB4enIsIHh6cicpCisgIGRlZmluZShgUkVUVkFMJywJYHNiYwl4MCwgJDEsIHh6cicpCisgIGRlZmluZShgZnVuY19uJywJbXBuX3JzYmxzaGAnTFNIYCdfbiknKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUoZnVuY19uKQorCWxzcgl4NiwgbiwgIzIKKwl0YnoJbiwgIzAsIEwoYngwKQorCitMKGJ4MSk6CWxkcgl4NSwgW3VwXQorCXRibnoJbiwgIzEsIEwoYjExKQorCitMKGIwMSk6CWxkcgl4MTEsIFt2cF0KKwljYnoJeDYsIEwoMSkKKwlsZHAJeDgsIHg5LCBbdnAsIzhdCisJbHNsCXgxMywgeDExLCAjTFNICisJQUREU1VCKAl4MTUsIHgxMywgeDUpCisJc3RyCXgxNSwgW3JwXSwjOAorCXN1Ygl1cCwgdXAsICMyNAorCXN1Ygl2cCwgdnAsICM4CisJYglMKG1pZCkKKworTCgxKToJbHNsCXgxMywgeDExLCAjTFNICisJQUREU1VCKAl4MTUsIHgxMywgeDUpCisJc3RyCXgxNSwgW3JwXQorCWxzcgl4MCwgeDExLCBSU0gKKwlSRVRWQUwoCSB4MCwgeDEpCisJcmV0CisKK0woYjExKToJbGRyCXg5LCBbdnBdCisJbGRwCXgxMCwgeDExLCBbdnAsIzhdIQorCWxzbAl4MTMsIHg5LCAjTFNICisJQUREU1VCKAl4MTcsIHgxMywgeDUpCisJc3RyCXgxNywgW3JwXSwjOAorCXN1Ygl1cCwgdXAsICM4CisJY2J6CXg2LCBMKGVuZCkKKwliCUwodG9wKQorCitMKGJ4MCk6CXRibnoJbiwgIzEsIEwoYjEwKQorCitMKGIwMCk6CUNMUlJDWSgJeDExKQorCWxkcAl4OCwgeDksIFt2cF0sIy0xNgorCXN1Ygl1cCwgdXAsICMzMgorCWIJTChtaWQpCisKK0woYjEwKToJQ0xSUkNZKAl4OSkKKwlsZHAJeDEwLCB4MTEsIFt2cF0KKwlzdWIJdXAsIHVwLCAjMTYKKwljYnoJeDYsIEwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CWxkcAl4NCwgeDUsIFt1cCwjMTZdCisJZXh0cgl4MTIsIHgxMCwgeDksICNSU0gKKwlsZHAJeDgsIHg5LCBbdnAsIzE2XQorCWV4dHIJeDEzLCB4MTEsIHgxMCwgI1JTSAorCUFERFNVQkMoeDE0LCB4MTIsIHg0KQorCUFERFNVQkMoeDE1LCB4MTMsIHg1KQorCXN0cAl4MTQsIHgxNSwgW3JwXSwjMTYKK0wobWlkKToJbGRwCXg0LCB4NSwgW3VwLCMzMl0hCisJZXh0cgl4MTIsIHg4LCB4MTEsICNSU0gKKwlsZHAJeDEwLCB4MTEsIFt2cCwjMzJdIQorCWV4dHIJeDEzLCB4OSwgeDgsICNSU0gKKwlBRERTVUJDKHgxNiwgeDEyLCB4NCkKKwlBRERTVUJDKHgxNywgeDEzLCB4NSkKKwlzdHAJeDE2LCB4MTcsIFtycF0sIzE2CisJc3ViCXg2LCB4NiwgIzEKKwljYm56CXg2LCBMKHRvcCkKKworTChlbmQpOglsZHAJeDQsIHg1LCBbdXAsIzE2XQorCWV4dHIJeDEyLCB4MTAsIHg5LCAjUlNICisJZXh0cgl4MTMsIHgxMSwgeDEwLCAjUlNICisJQUREU1VCQyh4MTQsIHgxMiwgeDQpCisJQUREU1VCQyh4MTUsIHgxMywgeDUpCisJc3RwCXgxNCwgeDE1LCBbcnBdCisJbHNyCXgwLCB4MTEsIFJTSAorCVJFVFZBTCgJIHgwLCB4MSkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9hcm02NC1kZWZzLm00IGIvbXBuL2FybTY0L2FybTY0LWRlZnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNDlmNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm02NC9hcm02NC1kZWZzLm00CkBAIC0wLDAgKzEsNTMgQEAKK2RpdmVydCgtMSkKKworZG5sICBtNCBtYWNyb3MgZm9yIEFSTTY0IEVMRiBhc3NlbWJsZXIuCisKK2RubCAgQ29weXJpZ2h0IDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitkbmwgIFN0YW5kYXJkIGNvbW1lbnRpbmcgaXMgd2l0aCBALCB0aGUgZGVmYXVsdCBtNCAjIGlzIGZvciBjb25zdGFudHMgYW5kIHdlCitkbmwgIGRvbid0IHdhbnQgdG8gZGlzYWJsZSBtYWNybyBleHBhbnNpb25zIGluIG9yIGFmdGVyIHRoZW0uCisKK2NoYW5nZWNvbQorCisKK2RubCAgTEVBX0hJKHJlZyxnbXBfc3ltYm9sKSwgTEVBX0xPKHJlZyxnbXBfc3ltYm9sKQorZG5sCitkbmwgIExvYWQgdGhlIGFkZHJlc3Mgb2YgZ21wX3N5bWJvbCBpbnRvIGEgcmVnaXN0ZXIuIFdlIHNwbGl0IHRoaXMgaW50byB0d28KK2RubCAgcGFydHMgdG8gYWxsb3cgc2VwYXJhdGlvbiBmb3IgbWFudWFsIGluc24gc2NoZWR1bGluZy4KKworaWZkZWYoYFBJQycsYGRubAorZGVmaW5lKGBMRUFfSEknLCBgYWRycAkkMSwgOmdvdDokMicpZG5sCitkZWZpbmUoYExFQV9MTycsIGBsZHIJJDEsIFskMSwgIzpnb3RfbG8xMjokMl0nKWRubAorJyxgZG5sCitkZWZpbmUoYExFQV9ISScsIGBhZHJwCSQxLCAkMicpZG5sCitkZWZpbmUoYExFQV9MTycsIGBhZGQJJDEsICQxLCA6bG8xMjokMicpZG5sCisnKWRubAorCitkaXZlcnRgJ2RubApkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2JkaXZfZGJtMWMuYXNtIGIvbXBuL2FybTY0L2JkaXZfZGJtMWMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODRkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvYmRpdl9kYm0xYy5hc20KQEAgLTAsMCArMSwxMTEgQEAKK2RubCAgQVJNNjQgbXBuX2JkaXZfZGJtMWMuCisKK2RubCAgQ29weXJpZ2h0IDIwMDgsIDIwMTEsIDIwMTIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIDgKK0MgQ29ydGV4LUE1NwkgNworQyBYLUdlbmUJIDQuMjUKKworZGVmaW5lKGBxcCcsCSAgYHgwJykKK2RlZmluZShgdXAnLAkgIGB4MScpCitkZWZpbmUoYG4nLAkgIGB4MicpCitkZWZpbmUoYGJkJywJICBgeDMnKQorZGVmaW5lKGBjeScsCSAgYHg0JykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fYmRpdl9kYm0xYykKKwlsZHIJeDUsIFt1cF0sICM4CisJYW5kcwl4NiwgbiwgIzMKKwliLmVxCUwoZmkwKQorCWNtcAl4NiwgIzIKKwliLmNjCUwoZmkxKQorCWIuZXEJTChmaTIpCisKK0woZmkzKToJbXVsCXgxMiwgeDUsIGJkCisJdW11bGgJeDEzLCB4NSwgYmQKKwlsZHIJeDUsIFt1cF0sICM4CisJYglMKGxvMykKKworTChmaTApOgltdWwJeDEwLCB4NSwgYmQKKwl1bXVsaAl4MTEsIHg1LCBiZAorCWxkcgl4NSwgW3VwXSwgIzgKKwliCUwobG8wKQorCitMKGZpMSk6CXN1YnMJbiwgbiwgIzEKKwltdWwJeDEyLCB4NSwgYmQKKwl1bXVsaAl4MTMsIHg1LCBiZAorCWIubHMJTCh3ZDEpCisJbGRyCXg1LCBbdXBdLCAjOAorCWIJTChsbzEpCisKK0woZmkyKToJbXVsCXgxMCwgeDUsIGJkCisJdW11bGgJeDExLCB4NSwgYmQKKwlsZHIJeDUsIFt1cF0sICM4CisJYglMKGxvMikKKworTCh0b3ApOglsZHIJeDUsIFt1cF0sICM4CisJc3Vicwl4NCwgeDQsIHgxMAorCXN0cgl4NCwgW3FwXSwgIzgKKwlzYmMJeDQsIHg0LCB4MTEKK0wobG8xKToJbXVsCXgxMCwgeDUsIGJkCisJdW11bGgJeDExLCB4NSwgYmQKKwlsZHIJeDUsIFt1cF0sICM4CisJc3Vicwl4NCwgeDQsIHgxMgorCXN0cgl4NCwgW3FwXSwgIzgKKwlzYmMJeDQsIHg0LCB4MTMKK0wobG8wKToJbXVsCXgxMiwgeDUsIGJkCisJdW11bGgJeDEzLCB4NSwgYmQKKwlsZHIJeDUsIFt1cF0sICM4CisJc3Vicwl4NCwgeDQsIHgxMAorCXN0cgl4NCwgW3FwXSwgIzgKKwlzYmMJeDQsIHg0LCB4MTEKK0wobG8zKToJbXVsCXgxMCwgeDUsIGJkCisJdW11bGgJeDExLCB4NSwgYmQKKwlsZHIJeDUsIFt1cF0sICM4CisJc3Vicwl4NCwgeDQsIHgxMgorCXN0cgl4NCwgW3FwXSwgIzgKKwlzYmMJeDQsIHg0LCB4MTMKK0wobG8yKToJc3VicwluLCBuLCAjNAorCW11bAl4MTIsIHg1LCBiZAorCXVtdWxoCXgxMywgeDUsIGJkCisJYi5oaQlMKHRvcCkKKworTCh3ZDIpOglzdWJzCXg0LCB4NCwgeDEwCisJc3RyCXg0LCBbcXBdLCAjOAorCXNiYwl4NCwgeDQsIHgxMQorTCh3ZDEpOglzdWJzCXg0LCB4NCwgeDEyCisJc3RyCXg0LCBbcXBdCisJc2JjCXgwLCB4NCwgeDEzCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvYmRpdl9xXzEuYXNtIGIvbXBuL2FybTY0L2JkaXZfcV8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDYxMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2JkaXZfcV8xLmFzbQpAQCAtMCwwICsxLDEyMiBAQAorZG5sICBBUk02NCBtcG5fYmRpdl9xXzEsIG1wbl9waTFfYmRpdl9xXzEgLS0gSGVuc2VsIGRpdmlzaW9uIGJ5IDEtbGltYiBkaXZpc29yLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTIsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQyAgICAgICAgICAgICAgIGN5Y2xlcy9saW1iCitDICAgICAgICAgICAgICAgbm9ybSAgIHVub3JtCitDIENvcnRleC1BNTMJMTIJMTUKK0MgQ29ydGV4LUE1NwkxMgkxMgorQyBDb3J0ZXgtQTcyCitDIENvcnRleC1BNzMKK0MgWC1HZW5lCTExCTExCisKK0MgVE9ETworQyAgKiBTY2hlZHVsaW5nIG9mIHVtdWxoIGxhdGVyIGluIHRoZSB1bm9ybSBsb29wIGJyaW5ncyBBNTMgdGltZSB0byAxMiBjL2wuCitDICAgIFVuZm9ydHVuYXRlbHksIHRoYXQgcmVxdWlyZXMgc29mdHdhcmUgcGlwZWxpbmluZy4KKworZGVmaW5lKGBycCcsICBgeDAnKQorZGVmaW5lKGB1cCcsICBgeDEnKQorZGVmaW5lKGBuJywgICBgeDInKQorZGVmaW5lKGBkJywgICBgeDMnKQorZGVmaW5lKGBkaScsICBgeDQnKQkJQwlqdXN0IG1wbl9waTFfYmRpdl9xXzEKK2RlZmluZShgY250JywgYHg1JykJCUMJanVzdCBtcG5fcGkxX2JkaXZfcV8xCisKK2RlZmluZShgY3knLCAgYHI3JykKK2RlZmluZShgdG5jJywgYHg4JykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9iZGl2X3FfMSkKKworCXJiaXQJeDYsIGQKKwljbHoJY250LCB4NgorCWxzcglkLCBkLCBjbnQKKworCUxFQV9ISSgJeDcsIGJpbnZlcnRfbGltYl90YWJsZSkKKwl1YmZ4CXg2LCBkLCAxLCA3CisJTEVBX0xPKAl4NywgYmludmVydF9saW1iX3RhYmxlKQorCWxkcmIJdzYsIFt4NywgeDZdCisJdWJmaXoJeDcsIHg2LCAxLCA4CisJdW11bGwJeDYsIHc2LCB3NgorCW1zdWIJeDYsIHg2LCBkLCB4NworCWxzbAl4NywgeDYsIDEKKwltdWwJeDYsIHg2LCB4NgorCW1zdWIJeDYsIHg2LCBkLCB4NworCWxzbAl4NywgeDYsIDEKKwltdWwJeDYsIHg2LCB4NgorCW1zdWIJZGksIHg2LCBkLCB4NworCisJYglHU1lNX1BSRUZJWGAnbXBuX3BpMV9iZGl2X3FfMQorRVBJTE9HVUUoKQorCitQUk9MT0dVRShtcG5fcGkxX2JkaXZfcV8xKQorCXN1YgluLCBuLCAjMQorCXN1YnMJeDYsIHg2LCB4NgkJQyBjbGVhciByNiBhbmQgQyBmbGFnCisJbGRyCXg5LCBbdXBdLCM4CisJY2J6CWNudCwgTChub3JtKQorCitMKHVub3JtKToKKwlsc3IJeDEyLCB4OSwgY250CisJY2J6CW4sIEwoZXUxKQorCXN1Ygl0bmMsIHh6ciwgY250CisKK0wodHB1KToJbGRyCXg5LCBbdXBdLCM4CisJbHNsCXg3LCB4OSwgdG5jCisJb3JyCXg3LCB4NywgeDEyCisJc2Jjcwl4NiwgeDcsIHg2CisJbXVsCXg3LCB4NiwgZGkKKwlzdHIJeDcsIFtycF0sIzgKKwlsc3IJeDEyLCB4OSwgY250CisJdW11bGgJeDYsIHg3LCBkCisJc3ViCW4sIG4sICMxCisJY2JuegluLCBMKHRwdSkKKworTChldTEpOglzYmNzCXg2LCB4MTIsIHg2CisJbXVsCXg2LCB4NiwgZGkKKwlzdHIJeDYsIFtycF0KKwlyZXQKKworTChub3JtKToKKwltdWwJeDUsIHg5LCBkaQorCXN0cgl4NSwgW3JwXSwjOAorCWNiegluLCBMKGVuMSkKKworTCh0cG4pOglsZHIJeDksIFt1cF0sIzgKKwl1bXVsaAl4NSwgeDUsIGQKKwlzYmNzCXg1LCB4OSwgeDUKKwltdWwJeDUsIHg1LCBkaQorCXN0cgl4NSwgW3JwXSwjOAorCXN1YgluLCBuLCAjMQorCWNibnoJbiwgTCh0cG4pCisKK0woZW4xKToJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvY25kX2FvcnNfbi5hc20gYi9tcG4vYXJtNjQvY25kX2FvcnNfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzOWQzNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm02NC9jbmRfYW9yc19uLmFzbQpAQCAtMCwwICsxLDEyOSBAQAorZG5sICBBUk02NCBtcG5fY25kX2FkZF9uLCBtcG5fY25kX3N1Yl9uCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMiwgMjAxMywgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQ29ydGV4LUE1MwkzLjg3LTQuMzcKK0MgQ29ydGV4LUE1NwkgMS43NQorQyBYLUdlbmUJIDIuMAorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBjbmQnLAlgeDAnKQorZGVmaW5lKGBycCcsCWB4MScpCitkZWZpbmUoYHVwJywJYHgyJykKK2RlZmluZShgdnAnLAlgeDMnKQorZGVmaW5lKGBuJywJYHg0JykKKworaWZkZWYoYE9QRVJBVElPTl9jbmRfYWRkX24nLCBgCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgQ0xSQ1knLAlgY21uCXh6ciwgeHpyJykKKyAgZGVmaW5lKGBSRVRWQUwnLAlgY3NldAl4MCwgY3MnKQorICBkZWZpbmUoYGZ1bmMnLAltcG5fY25kX2FkZF9uKScpCitpZmRlZihgT1BFUkFUSU9OX2NuZF9zdWJfbicsIGAKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBDTFJDWScsCWBjbXAJeHpyLCB4enInKQorICBkZWZpbmUoYFJFVFZBTCcsCWBjc2V0CXgwLCBjYycpCisgIGRlZmluZShgZnVuYycsCW1wbl9jbmRfc3ViX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fY25kX2FkZF9uIG1wbl9jbmRfc3ViX24pCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShmdW5jKQorCWNtcAljbmQsICMxCisJc2JjCWNuZCwgY25kLCBjbmQKKworCUNMUkNZCisKKwlsc3IJeDE3LCBuLCAjMgorCXRiegluLCAjMCwgTChieDApCisKK0woYngxKToJbGRyCXgxMywgW3ZwXQorCWxkcgl4MTEsIFt1cF0KKwliaWMJeDcsIHgxMywgY25kCisJQUREU1VCQwl4OSwgeDExLCB4NworCXN0cgl4OSwgW3JwXQorCXRibnoJbiwgIzEsIEwoYjExKQorCitMKGIwMSk6CWNiegl4MTcsIEwocnQpCisJbGRwCXgxMiwgeDEzLCBbdnAsIzhdCisJbGRwCXgxMCwgeDExLCBbdXAsIzhdCisJc3ViCXVwLCB1cCwgIzgKKwlzdWIJdnAsIHZwLCAjOAorCXN1YglycCwgcnAsICMyNAorCWIJTChtaWQpCisKK0woYjExKToJbGRwCXgxMiwgeDEzLCBbdnAsIzhdIQorCWxkcAl4MTAsIHgxMSwgW3VwLCM4XSEKKwlzdWIJcnAsIHJwLCAjOAorCWNiegl4MTcsIEwoZW5kKQorCWIJTCh0b3ApCisKK0woYngwKToJbGRwCXgxMiwgeDEzLCBbdnBdCisJbGRwCXgxMCwgeDExLCBbdXBdCisJdGJuegluLCAjMSwgTChiMTApCisKK0woYjAwKToJc3ViCXVwLCB1cCwgIzE2CisJc3ViCXZwLCB2cCwgIzE2CisJc3ViCXJwLCBycCwgIzMyCisJYglMKG1pZCkKKworTChiMTApOglzdWIJcnAsIHJwLCAjMTYKKwljYnoJeDE3LCBMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOgliaWMJeDYsIHgxMiwgY25kCisJYmljCXg3LCB4MTMsIGNuZAorCWxkcAl4MTIsIHgxMywgW3ZwLCMxNl0KKwlBRERTVUJDCXg4LCB4MTAsIHg2CisJQUREU1VCQwl4OSwgeDExLCB4NworCWxkcAl4MTAsIHgxMSwgW3VwLCMxNl0KKwlzdHAJeDgsIHg5LCBbcnAsIzE2XQorTChtaWQpOgliaWMJeDYsIHgxMiwgY25kCisJYmljCXg3LCB4MTMsIGNuZAorCWxkcAl4MTIsIHgxMywgW3ZwLCMzMl0hCisJQUREU1VCQwl4OCwgeDEwLCB4NgorCUFERFNVQkMJeDksIHgxMSwgeDcKKwlsZHAJeDEwLCB4MTEsIFt1cCwjMzJdIQorCXN0cAl4OCwgeDksIFtycCwjMzJdIQorCXN1Ygl4MTcsIHgxNywgIzEKKwljYm56CXgxNywgTCh0b3ApCisKK0woZW5kKToJYmljCXg2LCB4MTIsIGNuZAorCWJpYwl4NywgeDEzLCBjbmQKKwlBRERTVUJDCXg4LCB4MTAsIHg2CisJQUREU1VCQwl4OSwgeDExLCB4NworCXN0cAl4OCwgeDksIFtycCwjMTZdCitMKHJ0KToJUkVUVkFMCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvY29tLmFzbSBiL21wbi9hcm02NC9jb20uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTA1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvY29tLmFzbQpAQCAtMCwwICsxLDkyIEBACitkbmwgIEFSTTY0IG1wbl9jb20uCisKK2RubCAgQ29weXJpZ2h0IDIwMTMsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIAorQyBDb3J0ZXgtQTU1CSAKK0MgQ29ydGV4LUE1NwkgCitDIENvcnRleC1BNzIJIAorQyBDb3J0ZXgtQTczCSAKK0MgWC1HZW5lCSAKK0MgQXBwbGUgTTEJIAorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBycCcsIGB4MCcpCitkZWZpbmUoYHVwJywgYHgxJykKK2RlZmluZShgbicsICBgeDInKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX2NvbSkKKwljbXAJbiwgIzMKKwliLmxlCUwoYmMpCisKK0MgQ29weSB1bnRpbCBycCBpcyAxMjgtYml0IGFsaWduZWQKKwl0YnoJcnAsICMzLCBMKGFsMikKKwlsZHIJeDQsIFt1cF0sIzgKKwlzdWIJbiwgbiwgIzEKKwltdm4JeDQsIHg0CisJc3RyCXg0LCBbcnBdLCM4CisKK0woYWwyKToJbGRwCXg0LHg1LCBbdXBdLCMxNgorCXN1YgluLCBuLCAjNgorCXRibnoJbiwgIzYzLCBMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHAJeDYseDcsIFt1cF0sIzMyCisJbXZuCXg0LCB4NAorCW12bgl4NSwgeDUKKwlzdHAJeDQseDUsIFtycF0sIzMyCisJbGRwCXg0LHg1LCBbdXAsIy0xNl0KKwltdm4JeDYsIHg2CisJbXZuCXg3LCB4NworCXN0cAl4Nix4NywgW3JwLCMtMTZdCisJc3ViCW4sIG4sICM0CisJdGJ6CW4sICM2MywgTCh0b3ApCisKK0woZW5kKToJbXZuCXg0LCB4NAorCW12bgl4NSwgeDUKKwlzdHAJeDQseDUsIFtycF0sIzE2CisKK0MgQ29weSBsYXN0IDAtMyBsaW1icy4gIE5vdGUgdGhhdCBycCBpcyBhbGlnbmVkIGFmdGVyIGxvb3AsIGJ1dCBub3Qgd2hlbiB3ZQorQyBhcnJpdmUgaGVyZSB2aWEgTChiYykKK0woYmMpOgl0YnoJbiwgIzEsIEwodGwxKQorCWxkcAl4NCx4NSwgW3VwXSwjMTYKKwltdm4JeDQsIHg0CisJbXZuCXg1LCB4NQorCXN0cAl4NCx4NSwgW3JwXSwjMTYKK0wodGwxKToJdGJ6CW4sICMwLCBMKHRsMikKKwlsZHIJeDQsIFt1cF0KKwltdm4JeDQsIHg0CisJc3RyCXg0LCBbcnBdCitMKHRsMik6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2NvcHlkLmFzbSBiL21wbi9hcm02NC9jb3B5ZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3MDVhNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm02NC9jb3B5ZC5hc20KQEAgLTAsMCArMSw4NSBAQAorZG5sICBBUk02NCBtcG5fY29weWQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIDEuOAorQyBDb3J0ZXgtQTU1CSAxLjI4CitDIENvcnRleC1BNTcKK0MgQ29ydGV4LUE3MgkgMQorQyBDb3J0ZXgtQTczCSAxLjEtMS4zNSAoYWxpZ25tZW50IGRlcGVuZGVudCkKK0MgWC1HZW5lCSAxCitDIEFwcGxlIE0xCSAwLjMxCisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwJywgYHgwJykKK2RlZmluZShgdXAnLCBgeDEnKQorZGVmaW5lKGBuJywgIGB4MicpCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fY29weWQpCisJYWRkCXJwLCBycCwgbiwgbHNsICMzCisJYWRkCXVwLCB1cCwgbiwgbHNsICMzCisKKwljbXAJbiwgIzMKKwliLmxlCUwoYmMpCisKK0MgQ29weSB1bnRpbCBycCBpcyAxMjgtYml0IGFsaWduZWQKKwl0YnoJcnAsICMzLCBMKGFsMikKKwlsZHIJeDQsIFt1cCwjLThdIQorCXN1YgluLCBuLCAjMQorCXN0cgl4NCwgW3JwLCMtOF0hCisKK0woYWwyKToJbGRwCXg0LHg1LCBbdXAsIy0xNl0hCisJc3ViCW4sIG4sICM2CisJdGJuegluLCAjNjMsIEwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CWxkcAl4Nix4NywgW3VwLCMtMTZdCisJc3RwCXg0LHg1LCBbcnAsIy0xNl0KKwlsZHAJeDQseDUsIFt1cCwjLTMyXSEKKwlzdHAJeDYseDcsIFtycCwjLTMyXSEKKwlzdWIJbiwgbiwgIzQKKwl0YnoJbiwgIzYzLCBMKHRvcCkKKworTChlbmQpOglzdHAJeDQseDUsIFtycCwjLTE2XSEKKworQyBDb3B5IGxhc3QgMC0zIGxpbWJzLiAgTm90ZSB0aGF0IHJwIGlzIGFsaWduZWQgYWZ0ZXIgbG9vcCwgYnV0IG5vdCB3aGVuIHdlCitDIGFycml2ZSBoZXJlIHZpYSBMKGJjKQorTChiYyk6CXRiegluLCAjMSwgTCh0bDEpCisJbGRwCXg0LHg1LCBbdXAsIy0xNl0hCisJc3RwCXg0LHg1LCBbcnAsIy0xNl0hCitMKHRsMSk6CXRiegluLCAjMCwgTCh0bDIpCisJbGRyCXg0LCBbdXAsIy04XQorCXN0cgl4NCwgW3JwLCMtOF0KK0wodGwyKToJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvY29weWkuYXNtIGIvbXBuL2FybTY0L2NvcHlpLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJkYThjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2NvcHlpLmFzbQpAQCAtMCwwICsxLDgyIEBACitkbmwgIEFSTTY0IG1wbl9jb3B5aS4KKworZG5sICBDb3B5cmlnaHQgMjAxMywgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQ29ydGV4LUE1MwkgMS44CitDIENvcnRleC1BNTUJIDEuMjgKK0MgQ29ydGV4LUE1NworQyBDb3J0ZXgtQTcyCSAxCitDIENvcnRleC1BNzMJIDEuMS0xLjM1IChhbGlnbm1lbnQgZGVwZW5kZW50KQorQyBYLUdlbmUJIDEKK0MgQXBwbGUgTTEJIDAuMzEKKworY2hhbmdlY29tKGJsYWgpCisKK2RlZmluZShgcnAnLCBgeDAnKQorZGVmaW5lKGB1cCcsIGB4MScpCitkZWZpbmUoYG4nLCAgYHgyJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9jb3B5aSkKKwljbXAJbiwgIzMKKwliLmxlCUwoYmMpCisKK0MgQ29weSB1bnRpbCBycCBpcyAxMjgtYml0IGFsaWduZWQKKwl0YnoJcnAsICMzLCBMKGFsMikKKwlsZHIJeDQsIFt1cF0sIzgKKwlzdWIJbiwgbiwgIzEKKwlzdHIJeDQsIFtycF0sIzgKKworTChhbDIpOglsZHAJeDQseDUsIFt1cF0sIzE2CisJc3ViCW4sIG4sICM2CisJdGJuegluLCAjNjMsIEwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CWxkcAl4Nix4NywgW3VwXSwjMzIKKwlzdHAJeDQseDUsIFtycF0sIzMyCisJbGRwCXg0LHg1LCBbdXAsIy0xNl0KKwlzdHAJeDYseDcsIFtycCwjLTE2XQorCXN1YgluLCBuLCAjNAorCXRiegluLCAjNjMsIEwodG9wKQorCitMKGVuZCk6CXN0cAl4NCx4NSwgW3JwXSwjMTYKKworQyBDb3B5IGxhc3QgMC0zIGxpbWJzLiAgTm90ZSB0aGF0IHJwIGlzIGFsaWduZWQgYWZ0ZXIgbG9vcCwgYnV0IG5vdCB3aGVuIHdlCitDIGFycml2ZSBoZXJlIHZpYSBMKGJjKQorTChiYyk6CXRiegluLCAjMSwgTCh0bDEpCisJbGRwCXg0LHg1LCBbdXBdLCMxNgorCXN0cAl4NCx4NSwgW3JwXSwjMTYKK0wodGwxKToJdGJ6CW4sICMwLCBMKHRsMikKKwlsZHIJeDQsIFt1cF0KKwlzdHIJeDQsIFtycF0KK0wodGwyKToJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvZGFyd2luLm00IGIvbXBuL2FybTY0L2Rhcndpbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU3MmZlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2Rhcndpbi5tNApAQCAtMCwwICsxLDUwIEBACitkaXZlcnQoLTEpCisKK2RubCAgbTQgbWFjcm9zIGZvciBBUk02NCBEYXJ3aW4gYXNzZW1ibGVyLgorCitkbmwgIENvcHlyaWdodCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKKworZG5sICBTdGFuZGFyZCBjb21tZW50aW5nIGlzIHdpdGggQCwgdGhlIGRlZmF1bHQgbTQgIyBpcyBmb3IgY29uc3RhbnRzIGFuZCB3ZQorZG5sICBkb24ndCB3YW50IHRvIGRpc2FibGUgbWFjcm8gZXhwYW5zaW9ucyBpbiBvciBhZnRlciB0aGVtLgorCitjaGFuZ2Vjb20KKworCitkbmwgIExFQV9ISShyZWcsZ21wX3N5bWJvbCksIExFQV9MTyhyZWcsZ21wX3N5bWJvbCkKK2RubAorZG5sICBMb2FkIHRoZSBhZGRyZXNzIG9mIGdtcF9zeW1ib2wgaW50byBhIHJlZ2lzdGVyLiBXZSBzcGxpdCB0aGlzIGludG8gdHdvCitkbmwgIHBhcnRzIHRvIGFsbG93IHNlcGFyYXRpb24gZm9yIG1hbnVhbCBpbnNuIHNjaGVkdWxpbmcuICBUT0RPOiBEYXJ3aW4gYWxsb3dzCitkbmwgIGZvciByZWxheGluZyB0aGVzZSB0d28gaW5zbnMgaW50byBhbiBhZHIgYW5kIGEgbm9wLCBidXQgdGhhdCByZXF1aXJlcyB0aGUKK2RubCAgLmxvaCBwc2V1ZG8gZm9yIGNvbm5lY3RpbmcgdGhlbS4KKworZGVmaW5lKGBMRUFfSEknLGBhZHJwCSQxLCAkMkBHT1RQQUdFJylkbmwKK2RlZmluZShgTEVBX0xPJyxgbGRyCSQxLCBbJDEsICQyQEdPVFBBR0VPRkZdJylkbmwKKworZGl2ZXJ0YCdkbmwKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9kaXZyZW1fMS5hc20gYi9tcG4vYXJtNjQvZGl2cmVtXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDFiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvZGl2cmVtXzEuYXNtCkBAIC0wLDAgKzEsMjMxIEBACitkbmwgIEFSTTY0IG1wbl9kaXZyZW1fMSBhbmQgbXBuX3ByZWludl9kaXZyZW1fMS4KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK2RubCBUT0RPCitkbmwgICogSGFuZGxlIHRoZSBtb3N0IHNpZ25pZmljYW50IHF1b3RpZW50IGxpbWIgZm9yIHRoZSB1bm5vcm1hbGlzZWQgY2FzZQorZG5sICAgIHNwZWNpYWxseSwganVzdCBsaWtlIGluIHRoZSBDIGNvZGUuICAoSXQgaXMgdmVyeSBvZnRlbiAwLikKKworZGVmaW5lKGBxcF9hcmcnLCAgIHgwKQorZGVmaW5lKGBmbl9hcmcnLCAgIHgxKQorZGVmaW5lKGBucF9hcmcnLCAgIHgyKQorZGVmaW5lKGBuX2FyZycsICAgIHgzKQorZGVmaW5lKGBkX2FyZycsICAgIHg0KQorZGVmaW5lKGBkaW52X2FyZycsIHg1KQorZGVmaW5lKGBjbnRfYXJnJywgIHg2KQorCitkZWZpbmUoYHFwJywgICB4MTkpCitkZWZpbmUoYG5wJywgICB4MjApCitkZWZpbmUoYG4nLCAgICB4MjEpCitkZWZpbmUoYGQnLCAgICB4MjIpCitkZWZpbmUoYGZuJywgICB4MjQpCitkZWZpbmUoYGRpbnYnLCB4MCkKK2RlZmluZShgY250JywgIHgyMykKK2RlZmluZShgdG5jJywgIHg4KQorCitkbmwgbXBfbGltYl90CitkbmwgbXBuX2RpdnJlbV8xIChtcF9wdHIgcXAsIG1wX3NpemVfdCBmbiwKK2RubCAgICAgICAgICAgICAgIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG4sCitkbmwgICAgICAgICAgICAgICBtcF9saW1iX3QgZF91bm5vcm0pCisKK2RubCBtcF9saW1iX3QKK2RubCBtcG5fcHJlaW52X2RpdnJlbV8xIChtcF9wdHIgcXAsIG1wX3NpemVfdCBmbiwKK2RubCAgICAgICAgICAgICAgICAgICAgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBuLAorZG5sICAgICAgICAgICAgICAgICAgICAgIG1wX2xpbWJfdCBkX3Vubm9ybSwgbXBfbGltYl90IGRpbnYsIGludCBjbnQpCisKK0FTTV9TVEFSVCgpCisKK1BST0xPR1VFKG1wbl9wcmVpbnZfZGl2cmVtXzEpCisJY2J6CW5fYXJnLCBMKGZ6KQorCXN0cAl4MjksIHgzMCwgW3NwLCAjLTgwXSEKKwltb3YJeDI5LCBzcAorCXN0cAl4MTksIHgyMCwgW3NwLCAjMTZdCisJc3RwCXgyMSwgeDIyLCBbc3AsICMzMl0KKwlzdHAJeDIzLCB4MjQsIFtzcCwgIzQ4XQorCisJc3ViCW4sIG5fYXJnLCAjMQorCWFkZAl4NywgbiwgZm5fYXJnCisJYWRkCW5wLCBucF9hcmcsIG4sIGxzbCAjMworCWFkZAlxcCwgcXBfYXJnLCB4NywgbHNsICMzCisJbW92CWZuLCBmbl9hcmcKKwltb3YJZCwgZF9hcmcKKwltb3YJZGludiwgZGludl9hcmcKKwl0Ym56CWRfYXJnLCAjNjMsIEwobmVudHJ5KQorCW1vdgljbnQsIGNudF9hcmcKKwliCUwodWVudHJ5KQorRVBJTE9HVUUoKQorCitQUk9MT0dVRShtcG5fZGl2cmVtXzEpCisJY2J6CW5fYXJnLCBMKGZ6KQorCXN0cAl4MjksIHgzMCwgW3NwLCAjLTgwXSEKKwltb3YJeDI5LCBzcAorCXN0cAl4MTksIHgyMCwgW3NwLCAjMTZdCisJc3RwCXgyMSwgeDIyLCBbc3AsICMzMl0KKwlzdHAJeDIzLCB4MjQsIFtzcCwgIzQ4XQorCisJc3ViCW4sIG5fYXJnLCAjMQorCWFkZAl4NywgbiwgZm5fYXJnCisJYWRkCW5wLCBucF9hcmcsIG4sIGxzbCAjMworCWFkZAlxcCwgcXBfYXJnLCB4NywgbHNsICMzCisJbW92CWZuLCBmbl9hcmcKKwltb3YJZCwgZF9hcmcKKwl0Ym56CWRfYXJnLCAjNjMsIEwobm9ybWFsaXNlZCkKKworTCh1bm5vcm0pOgorCWNsegljbnQsIGQKKwlsc2wJeDAsIGQsIGNudAorCWJsCUdTWU1fUFJFRklYYCdNUE4oaW52ZXJ0X2xpbWIpCitMKHVlbnRyeSk6CisJbHNsCWQsIGQsIGNudAorCWxkcgl4NywgW25wXSwgIy04CisJc3ViCXRuYywgeHpyLCBjbnQKKwlsc3IJeDExLCB4NywgdG5jCQlDIHIKKwlsc2wJeDEsIHg3LCBjbnQKKwljYnoJbiwgTCh1ZW5kKQorCitMKHV0b3ApOmxkcgl4NywgW25wXSwgIy04CisJYWRkCXgyLCB4MTEsICMxCisJbXVsCXgxMCwgeDExLCBkaW52CisJdW11bGgJeDE3LCB4MTEsIGRpbnYKKwlsc3IJeDksIHg3LCB0bmMKKwlvcnIJeDEsIHgxLCB4OQorCWFkZHMJeDEwLCB4MSwgeDEwCisJYWRjCXgyLCB4MiwgeDE3CisJbXN1Ygl4MTEsIGQsIHgyLCB4MQorCWxzbAl4MSwgeDcsIGNudAorCWNtcAl4MTAsIHgxMQorCWFkZAl4MTQsIHgxMSwgZAorCWNzZWwJeDExLCB4MTQsIHgxMSwgY2MKKwlzYmMJeDIsIHgyLCB4enIKKwljbXAJeDExLCBkCisJYmNzCUwodWZ4KQorTCh1b2spOglzdHIJeDIsIFtxcF0sICMtOAorCXN1YgluLCBuLCAjMQorCWNibnoJbiwgTCh1dG9wKQorCitMKHVlbmQpOmFkZAl4MiwgeDExLCAjMQorCW11bAl4MTAsIHgxMSwgZGludgorCXVtdWxoCXgxNywgeDExLCBkaW52CisJYWRkcwl4MTAsIHgxLCB4MTAKKwlhZGMJeDIsIHgyLCB4MTcKKwltc3ViCXgxMSwgZCwgeDIsIHgxCisJY21wCXgxMCwgeDExCisJYWRkCXgxNCwgeDExLCBkCisJY3NlbAl4MTEsIHgxNCwgeDExLCBjYworCXNiYwl4MiwgeDIsIHh6cgorCXN1YnMJeDE0LCB4MTEsIGQKKwlhZGMJeDIsIHgyLCB4enIKKwljc2VsCXgxMSwgeDE0LCB4MTEsIGNzCisJc3RyCXgyLCBbcXBdLCAjLTgKKworCWNibnoJZm4sIEwoZnRvcCkKKwlsc3IJeDAsIHgxMSwgY250CisJbGRwCXgxOSwgeDIwLCBbc3AsICMxNl0KKwlsZHAJeDIxLCB4MjIsIFtzcCwgIzMyXQorCWxkcAl4MjMsIHgyNCwgW3NwLCAjNDhdCisJbGRwCXgyOSwgeDMwLCBbc3BdLCAjODAKKwlyZXQKKworTCh1ZngpOglhZGQJeDIsIHgyLCAjMQorCXN1Ygl4MTEsIHgxMSwgZAorCWIJTCh1b2spCisKKworTChub3JtYWxpc2VkKToKKwltb3YJeDAsIGQKKwlibAlHU1lNX1BSRUZJWGAnTVBOKGludmVydF9saW1iKQorTChuZW50cnkpOgorCWxkcgl4NywgW25wXSwgIy04CisJc3Vicwl4MTQsIHg3LCBkCisJYWRjCXgyLCB4enIsIHh6cgkJQyBoaSBxIGxpbWIKKwljc2VsCXgxMSwgeDE0LCB4NywgY3MKKwliCUwobm9rKQorCitMKG50b3ApOmxkcgl4MSwgW25wXSwgIy04CisJYWRkCXgyLCB4MTEsICMxCisJbXVsCXgxMCwgeDExLCBkaW52CisJdW11bGgJeDE3LCB4MTEsIGRpbnYKKwlhZGRzCXgxMCwgeDEsIHgxMAorCWFkYwl4MiwgeDIsIHgxNworCW1zdWIJeDExLCBkLCB4MiwgeDEKKwljbXAJeDEwLCB4MTEKKwlhZGQJeDE0LCB4MTEsIGQKKwljc2VsCXgxMSwgeDE0LCB4MTEsIGNjCUMgcmVtYWluZGVyCisJc2JjCXgyLCB4MiwgeHpyCisJY21wCXgxMSwgZAorCWJjcwlMKG5meCkKK0wobm9rKToJc3RyCXgyLCBbcXBdLCAjLTgKKwlzdWIJbiwgbiwgIzEKKwl0YnoJbiwgIzYzLCBMKG50b3ApCisKK0wobmVuZCk6Y2JueglmbiwgTChmcmFjKQorCW1vdgl4MCwgeDExCisJbGRwCXgxOSwgeDIwLCBbc3AsICMxNl0KKwlsZHAJeDIxLCB4MjIsIFtzcCwgIzMyXQorCWxkcAl4MjMsIHgyNCwgW3NwLCAjNDhdCisJbGRwCXgyOSwgeDMwLCBbc3BdLCAjODAKKwlyZXQKKworTChuZngpOglhZGQJeDIsIHgyLCAjMQorCXN1Ygl4MTEsIHgxMSwgZAorCWIJTChub2spCisKK0woZnJhYyk6bW92CWNudCwgIzAKK0woZnRvcCk6YWRkCXgyLCB4MTEsICMxCisJbXVsCXgxMCwgeDExLCBkaW52CisJdW11bGgJeDE3LCB4MTEsIGRpbnYKKwlhZGQJeDIsIHgyLCB4MTcKKwltc3ViCXgxMSwgZCwgeDIsIHh6cgorCWNtcAl4MTAsIHgxMQorCWFkZAl4MTQsIHgxMSwgZAorCWNzZWwJeDExLCB4MTQsIHgxMSwgY2MJQyByZW1haW5kZXIKKwlzYmMJeDIsIHgyLCB4enIKKwlzdHIJeDIsIFtxcF0sICMtOAorCXN1YglmbiwgZm4sICMxCisJY2JueglmbiwgTChmdG9wKQorCisJbHNyCXgwLCB4MTEsIGNudAorCWxkcAl4MTksIHgyMCwgW3NwLCAjMTZdCisJbGRwCXgyMSwgeDIyLCBbc3AsICMzMl0KKwlsZHAJeDIzLCB4MjQsIFtzcCwgIzQ4XQorCWxkcAl4MjksIHgzMCwgW3NwXSwgIzgwCisJcmV0CisKK0MgQmxvY2sgemVyby4gV2UgbmVlZCB0aGlzIGZvciB0aGUgZGVnZW5lcmF0ZWQgY2FzZSBvZiBuID0gMCwgZm4gIT0gMC4KK0woZnopOgljYnoJZm5fYXJnLCBMKHplbmQpCitMKHp0b3ApOnN0cgl4enIsIFtxcF9hcmddLCAjOAorCXN1Yglmbl9hcmcsIGZuX2FyZywgIzEKKwljYm56CWZuX2FyZywgTCh6dG9wKQorTCh6ZW5kKTptb3YJeDAsICMwCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvZ2NkXzExLmFzbSBiL21wbi9hcm02NC9nY2RfMTEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmRkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvZ2NkXzExLmFzbQpAQCAtMCwwICsxLDcwIEBACitkbmwgIEFSTSB2OGEgbXBuX2djZF8xMS4KKworZG5sICBCYXNlZCBvbiB0aGUgSzcgZ2NkXzEuYXNtLCBieSBLZXZpbiBSeWRlLiAgUmVoYWNrZWQgZm9yIEFSTSBieSBUb3Jiam9ybgorZG5sICBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDA1LCAyMDA5LCAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworY2hhbmdlY29tKGJsYWgpCisKK0MJICAgICBjeWNsZXMvYml0IChhcHByb3gpCitDIENvcnRleC1BMzUJID8KK0MgQ29ydGV4LUE1MwkgPworQyBDb3J0ZXgtQTU1CSA/CitDIENvcnRleC1BNTcJID8KK0MgQ29ydGV4LUE3MgkgPworQyBDb3J0ZXgtQTczCSA/CitDIENvcnRleC1BNzUJID8KK0MgQ29ydGV4LUE3NgkgPworQyBDb3J0ZXgtQTc3CSA/CitDIE51bWJlcnMgbWVhc3VyZWQgd2l0aDogc3BlZWQgLUNEIC1zMTYtNjQgLXQ0OCBtcG5fZ2NkXzEKKworZGVmaW5lKGB1MCcsICAgIGB4MCcpCitkZWZpbmUoYHYwJywgICAgYHgxJykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fZ2NkXzExKQorCXN1YnMJeDMsIHUwLCB2MAkJQwkJCTAKKwliLmVxCUwoZW5kKQkJCUMKKworCUFMSUdOKDE2KQorTCh0b3ApOglyYml0CXgxMiwgeDMJCQlDCQkJMSw1CisJY2x6CXgxMiwgeDEyCQlDCQkJMgorCWNzbmVnCXgzLCB4MywgeDMsIGNzCQlDIHYgPSBhYnModS12KSwgZXZlbgkxCisJY3NlbAl1MCwgdjAsIHUwLCBjcwkJQyB1ID0gbWluKHUsdikJCTEKKwlsc3IJdjAsIHgzLCB4MTIJCUMJCQkzCisJc3Vicwl4MywgdTAsIHYwCQlDCQkJNAorCWIubmUJTCh0b3ApCQkJQworCitMKGVuZCk6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2djZF8yMi5hc20gYi9tcG4vYXJtNjQvZ2NkXzIyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE2YWJlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2djZF8yMi5hc20KQEAgLTAsMCArMSwxMTIgQEAKK2RubCAgQVJNIHY4YSBtcG5fZ2NkXzIyLgorCitkbmwgIENvcHlyaWdodCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK2NoYW5nZWNvbShibGFoKQorCitDCSAgICAgY3ljbGVzL2JpdCAoYXBwcm94KQorQyBDb3J0ZXgtQTM1CSA/CitDIENvcnRleC1BNTMJIDcuMjYKK0MgQ29ydGV4LUE1NQkgPworQyBDb3J0ZXgtQTU3CSA/CitDIENvcnRleC1BNzIJIDUuNzIKK0MgQ29ydGV4LUE3MwkgNi40MworQyBDb3J0ZXgtQTc1CSA/CitDIENvcnRleC1BNzYJID8KK0MgQ29ydGV4LUE3NwkgPworCisKK2RlZmluZShgdTEnLCAgICBgeDAnKQorZGVmaW5lKGB1MCcsICAgIGB4MScpCitkZWZpbmUoYHYxJywgICAgYHgyJykKK2RlZmluZShgdjAnLCAgICBgeDMnKQorCitkZWZpbmUoYHQwJywgICAgYHg1JykKK2RlZmluZShgdDEnLCAgICBgeDYnKQorZGVmaW5lKGBjbnQnLCAgIGB4NycpCitkZWZpbmUoYHRuYycsICAgYHg4JykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9nY2RfMjIpCisKKwlBTElHTigxNikKK0wodG9wKToJc3Vicwl0MCwgdTAsIHYwCQlDIDAgNgorCWNiegl0MCwgTChsb3d6KQorCXNiY3MJdDEsIHUxLCB2MQkJQyAxIDcKKworCXJiaXQJY250LCB0MAkJCUMgMQorCisJY25lZwl0MCwgdDAsIGNjCQlDIDIKKwljaW52CXQxLCB0MSwgY2MJCUMgMiB1ID0gfHUgLSB2fAorTChiY2spOgljc2VsCXYwLCB2MCwgdTAsIGNzCQlDIDIKKwljc2VsCXYxLCB2MSwgdTEsIGNzCQlDIDIgdiA9IG1pbih1LHYpCisKKwljbHoJY250LCBjbnQJCUMgMgorCXN1Ygl0bmMsIHh6ciwgY250CQlDIDMKKworCWxzcgl1MCwgdDAsIGNudAkJQyAzCisJbHNsCXgxNCwgdDEsIHRuYwkJQyA0CisJbHNyCXUxLCB0MSwgY250CQlDIDMKKwlvcnIJdTAsIHUwLCB4MTQJCUMgNQorCisJb3JyCXgxMSwgdTEsIHYxCisJY2Juegl4MTEsIEwodG9wKQorCisKKwlzdWJzCXg0LCB1MCwgdjAJCUMJCQkwCisJYi5lcQlMKGVuZDEpCQkJQworCisJQUxJR04oMTYpCitMKHRvcDEpOnJiaXQJeDEyLCB4NAkJCUMJCQkxLDUKKwljbHoJeDEyLCB4MTIJCUMJCQkyCisJY3NuZWcJeDQsIHg0LCB4NCwgY3MJCUMgdiA9IGFicyh1LXYpLCBldmVuCTEKKwljc2VsCXUwLCB2MCwgdTAsIGNzCQlDIHUgPSBtaW4odSx2KQkJMQorCWxzcgl2MCwgeDQsIHgxMgkJQwkJCTMKKwlzdWJzCXg0LCB1MCwgdjAJCUMJCQk0CisJYi5uZQlMKHRvcDEpCQkJQworTChlbmQxKTptb3YJeDAsIHUwCisJbW92CXgxLCAjMAorCXJldAorCitMKGxvd3opOkMgV2UgY29tZSBoZXJlIHdoZW4gdjAgLSB1MCA9IDAKKwlDIDEuIElmIHYxIC0gdTEgPSAwLCB0aGVuIGdjZCBpcyB1ID0gdi4KKwlDIDIuIEVsc2UgY29tcHV0ZSBnY2RfMjEoe3YxLHYwfSwgfHUxLXYxfCkKKwlzdWJzCXQwLCB1MSwgdjEKKwliLmVxCUwoZW5kKQorCW1vdgl0MSwgIzAKKwlyYml0CWNudCwgdDAJCQlDIDEKKwljbmVnCXQwLCB0MCwgY2MJCUMgMgorCWIJTChiY2spCQkJQyBGSVhNRTogbWFrZSBjb25kaXRpb25hbAorCitMKGVuZCk6CW1vdgl4MCwgdjAKKwltb3YJeDEsIHYxCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvZ21wLW1wYXJhbS5oIGIvbXBuL2FybTY0L2dtcC1tcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBjMTkzCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2dtcC1tcGFyYW0uaApAQCAtMCwwICsxLDE5MiBAQAorLyogZ21wLW1wYXJhbS5oIC0tIENvbXBpbGVyL21hY2hpbmUgcGFyYW1ldGVyIGhlYWRlciBmaWxlLgorCitDb3B5cmlnaHQgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBHTVBfTElNQl9CSVRTIDY0CisjZGVmaW5lIEdNUF9MSU1CX0JZVEVTIDgKKworLyogMTUzNiBNSHogQ29ydGV4LUE1MyAqLworLyogRkZUIHR1bmluZyBsaW1pdCA9IDAuNSBNICovCisvKiBHZW5lcmF0ZWQgYnkgdHVuZXVwLmMsIDIwMTktMDktMjksIGdjYyA1LjQgKi8KKworI2RlZmluZSBESVZSRU1fMV9OT1JNX1RIUkVTSE9MRCAgICAgICAgICAgICAgMworI2RlZmluZSBESVZSRU1fMV9VTk5PUk1fVEhSRVNIT0xEICAgICAgICAgICAgNAorI2RlZmluZSBNT0RfMV8xUF9NRVRIT0QgICAgICAgICAgICAgICAgICAgICAgMiAgLyogMi4wOCUgZmFzdGVyIHRoYW4gMSAqLworI2RlZmluZSBNT0RfMV9OT1JNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNT0RfMV9VTk5PUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgNAorI2RlZmluZSBNT0RfMU5fVE9fTU9EXzFfMV9USFJFU0hPTEQgICAgICAgICAgOAorI2RlZmluZSBNT0RfMVVfVE9fTU9EXzFfMV9USFJFU0hPTEQgICAgICAgICAgNgorI2RlZmluZSBNT0RfMV8xX1RPX01PRF8xXzJfVEhSRVNIT0xEICAgICAgICAxMAorI2RlZmluZSBNT0RfMV8yX1RPX01PRF8xXzRfVEhSRVNIT0xEICAgICAgICAyMAorI2RlZmluZSBQUkVJTlZfTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEICAgICAyMQorI2RlZmluZSBVU0VfUFJFSU5WX0RJVlJFTV8xICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBESVZfUVJfMU5fUEkxX01FVEhPRCAgICAgICAgICAgICAgICAgMSAgLyogMzguMjYlIGZhc3RlciB0aGFuIDIgKi8KKyNkZWZpbmUgRElWX1FSXzFfTk9STV9USFJFU0hPTEQgICAgICAgICAgICAgMTMKKyNkZWZpbmUgRElWX1FSXzFfVU5OT1JNX1RIUkVTSE9MRCAgICAgICAgTVBfU0laRV9UX01BWCAgLyogbmV2ZXIgKi8KKyNkZWZpbmUgRElWX1FSXzJfUEkyX1RIUkVTSE9MRCAgICAgICAgICAgTVBfU0laRV9UX01BWCAgLyogbmV2ZXIgKi8KKyNkZWZpbmUgRElWRVhBQ1RfMV9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAqLworI2RlZmluZSBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEICAgICAgICAgICA0MAorCisjZGVmaW5lIERJVl8xX1ZTX01VTF8xX1BFUkNFTlQgICAgICAgICAgICAgMTU5CisKKyNkZWZpbmUgTVVMX1RPT00yMl9USFJFU0hPTEQgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTVVMX1RPT00zM19USFJFU0hPTEQgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgTVVMX1RPT000NF9USFJFU0hPTEQgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgTVVMX1RPT002SF9USFJFU0hPTEQgICAgICAgICAgICAgICAxNzMKKyNkZWZpbmUgTVVMX1RPT004SF9USFJFU0hPTEQgICAgICAgICAgICAgICAyMzYKKworI2RlZmluZSBNVUxfVE9PTTMyX1RPX1RPT000M19USFJFU0hPTEQgICAgICA4MQorI2RlZmluZSBNVUxfVE9PTTMyX1RPX1RPT001M19USFJFU0hPTEQgICAgICA3NgorI2RlZmluZSBNVUxfVE9PTTQyX1RPX1RPT001M19USFJFU0hPTEQgICAgICA4MQorI2RlZmluZSBNVUxfVE9PTTQyX1RPX1RPT002M19USFJFU0hPTEQgICAgICA4MAorI2RlZmluZSBNVUxfVE9PTTQzX1RPX1RPT001NF9USFJFU0hPTEQgICAgICA3NAorCisjZGVmaW5lIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQgICAgICAgICAgICAgICAwICAvKiBhbHdheXMgKi8KKyNkZWZpbmUgU1FSX1RPT00yX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgU1FSX1RPT00zX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgU1FSX1RPT000X1RIUkVTSE9MRCAgICAgICAgICAgICAgICAxNjYKKyNkZWZpbmUgU1FSX1RPT002X1RIUkVTSE9MRCAgICAgICAgICAgICAgICAyMjIKKyNkZWZpbmUgU1FSX1RPT004X1RIUkVTSE9MRCAgICAgICAgICAgICAgICAzMzMKKworI2RlZmluZSBNVUxNSURfVE9PTTQyX1RIUkVTSE9MRCAgICAgICAgICAgICAyMAorCisjZGVmaW5lIE1VTE1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNRUk1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCAgICAgICAgICAgICAzMTYgIC8qIGsgPSA1ICovCisjZGVmaW5lIE1VTF9GRlRfVEFCTEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgeyAgICAzMTYsIDV9LCB7ICAgICAxMywgNn0sIHsgICAgICA3LCA1fSwgeyAgICAgMTUsIDZ9LCBcCisgICAgeyAgICAgMTMsIDd9LCB7ICAgICAgNywgNn0sIHsgICAgIDE1LCA3fSwgeyAgICAgIDgsIDZ9LCBcCisgICAgeyAgICAgMTcsIDd9LCB7ICAgICAgOSwgNn0sIHsgICAgIDE5LCA3fSwgeyAgICAgMTcsIDh9LCBcCisgICAgeyAgICAgIDksIDd9LCB7ICAgICAyMCwgOH0sIHsgICAgIDExLCA3fSwgeyAgICAgMjMsIDh9LCBcCisgICAgeyAgICAgMTMsIDl9LCB7ICAgICAgNywgOH0sIHsgICAgIDE5LCA5fSwgeyAgICAgMTEsIDh9LCBcCisgICAgeyAgICAgMjcsIDl9LCB7ICAgICAxNSwgOH0sIHsgICAgIDMzLCA5fSwgeyAgICAgMTksIDh9LCBcCisgICAgeyAgICAgNDEsIDl9LCB7ICAgICAyMywgOH0sIHsgICAgIDQ5LCA5fSwgeyAgICAgMjcsMTB9LCBcCisgICAgeyAgICAgMTUsIDl9LCB7ICAgICAzOSwxMH0sIHsgICAgIDIzLCA5fSwgeyAgICAgNTEsMTF9LCBcCisgICAgeyAgICAgMTUsMTB9LCB7ICAgICAzMSwgOX0sIHsgICAgIDcxLDEwfSwgeyAgICAgMzksIDl9LCBcCisgICAgeyAgICAgODMsMTB9LCB7ICAgICA0NywgOX0sIHsgICAgIDk5LDEwfSwgeyAgICAgNTUsMTF9LCBcCisgICAgeyAgICAgMzEsMTB9LCB7ICAgICA2MywgOX0sIHsgICAgMTI3LCA4fSwgeyAgICAyNTUsIDl9LCBcCisgICAgeyAgICAxMzEsMTB9LCB7ICAgICA3MSwgOH0sIHsgICAgMjg3LDEwfSwgeyAgICAgNzksIDl9LCBcCisgICAgeyAgICAxNTksIDh9LCB7ICAgIDMxOSwxMH0sIHsgICAgIDg3LDExfSwgeyAgICAgNDcsMTB9LCBcCisgICAgeyAgICAgOTUsIDl9LCB7ICAgIDE5MSwgOH0sIHsgICAgMzgzLDEwfSwgeyAgICAxMDMsIDl9LCBcCisgICAgeyAgICAyMDcsIDh9LCB7ICAgIDQxNSwxMH0sIHsgICAgMTExLCA5fSwgeyAgICAyMjMsMTJ9LCBcCisgICAgeyAgICAgMzEsMTF9LCB7ICAgICA2MywgOX0sIHsgICAgMjU1LCA4fSwgeyAgICA1MTEsMTB9LCBcCisgICAgeyAgICAxMzUsIDl9LCB7ICAgIDI4NywgOH0sIHsgICAgNTc1LDExfSwgeyAgICAgNzksMTB9LCBcCisgICAgeyAgICAxNTksIDl9LCB7ICAgIDMxOSwgOH0sIHsgICAgNjM5LDEwfSwgeyAgICAxNzUsIDl9LCBcCisgICAgeyAgICAzNTEsIDh9LCB7ICAgIDcwMywxMX0sIHsgICAgIDk1LDEwfSwgeyAgICAxOTEsIDl9LCBcCisgICAgeyAgICAzODMsIDh9LCB7ICAgIDc2NywxMH0sIHsgICAgMjA3LCA5fSwgeyAgICA0MTUsMTF9LCBcCisgICAgeyAgICAxMTEsMTB9LCB7ICAgIDIyMywgOX0sIHsgICAgNDQ3LDEyfSwgeyAgICAgNjMsMTB9LCBcCisgICAgeyAgICAyNTUsIDl9LCB7ICAgIDUxMSwgOH0sIHsgICAxMDIzLCA5fSwgeyAgICA1NDMsMTB9LCBcCisgICAgeyAgICAyODcsIDl9LCB7ICAgIDU3NSwgOH0sIHsgICAxMTUxLDExfSwgeyAgICAxNTksMTB9LCBcCisgICAgeyAgICAzMTksIDl9LCB7ICAgIDYzOSwxMX0sIHsgICAgMTc1LDEwfSwgeyAgICAzNTEsIDl9LCBcCisgICAgeyAgICA3MDMsIDh9LCB7ICAgMTQwNywxMn0sIHsgICAgIDk1LDExfSwgeyAgICAxOTEsMTB9LCBcCisgICAgeyAgICAzODMsIDl9LCB7ICAgIDc2NywxMX0sIHsgICAgMjA3LDEwfSwgeyAgICA0MTUsIDl9LCBcCisgICAgeyAgICA4MzEsMTF9LCB7ICAgIDIyMywxMH0sIHsgICAgNDQ3LDEzfSwgeyAgIDgxOTIsMTR9LCBcCisgICAgeyAgMTYzODQsMTV9LCB7ICAzMjc2OCwxNn0sIHsgIDY1NTM2LDE3fSwgeyAxMzEwNzIsMTh9LCBcCisgICAgeyAyNjIxNDQsMTl9LCB7IDUyNDI4OCwyMH0sIHsxMDQ4NTc2LDIxfSwgezIwOTcxNTIsMjJ9LCBcCisgICAgezQxOTQzMDQsMjN9LCB7ODM4ODYwOCwyNH0gfQorI2RlZmluZSBNVUxfRkZUX1RBQkxFM19TSVpFIDExOAorI2RlZmluZSBNVUxfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMzIwMAorCisjZGVmaW5lIFNRUl9GRlRfTU9ERl9USFJFU0hPTEQgICAgICAgICAgICAgMjcyICAvKiBrID0gNSAqLworI2RlZmluZSBTUVJfRkZUX1RBQkxFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IHsgICAgMjcyLCA1fSwgeyAgICAgMTMsIDZ9LCB7ICAgICAgNywgNX0sIHsgICAgIDE1LCA2fSwgXAorICAgIHsgICAgICA4LCA1fSwgeyAgICAgMTcsIDZ9LCB7ICAgICAxNywgN30sIHsgICAgIDE3LCA4fSwgXAorICAgIHsgICAgICA5LCA3fSwgeyAgICAgMTksIDh9LCB7ICAgICAxMSwgN30sIHsgICAgIDIzLCA4fSwgXAorICAgIHsgICAgIDEzLCA5fSwgeyAgICAgIDcsIDh9LCB7ICAgICAxNSwgN30sIHsgICAgIDMxLCA4fSwgXAorICAgIHsgICAgIDE5LCA5fSwgeyAgICAgMTEsIDh9LCB7ICAgICAyNywgOX0sIHsgICAgIDE1LCA4fSwgXAorICAgIHsgICAgIDMzLCA5fSwgeyAgICAgMTksIDh9LCB7ICAgICAzOSwgOX0sIHsgICAgIDIzLCA4fSwgXAorICAgIHsgICAgIDQ3LCA5fSwgeyAgICAgMjcsMTB9LCB7ICAgICAxNSwgOX0sIHsgICAgIDM5LDEwfSwgXAorICAgIHsgICAgIDIzLCA5fSwgeyAgICAgNDcsMTF9LCB7ICAgICAxNSwxMH0sIHsgICAgIDMxLCA5fSwgXAorICAgIHsgICAgIDY3LDEwfSwgeyAgICAgMzksIDl9LCB7ICAgICA3OSwxMH0sIHsgICAgIDQ3LCA5fSwgXAorICAgIHsgICAgIDk1LCA4fSwgeyAgICAxOTEsMTB9LCB7ICAgICA1NSwxMX0sIHsgICAgIDMxLDEwfSwgXAorICAgIHsgICAgIDYzLCA4fSwgeyAgICAyNTUsMTB9LCB7ICAgICA3MSwgOX0sIHsgICAgMTQzLCA4fSwgXAorICAgIHsgICAgMjg3LDEwfSwgeyAgICAgNzksIDl9LCB7ICAgIDE1OSwxMX0sIHsgICAgIDQ3LDEwfSwgXAorICAgIHsgICAgIDk1LCA5fSwgeyAgICAxOTEsIDh9LCB7ICAgIDM4MywgN30sIHsgICAgNzY3LDEwfSwgXAorICAgIHsgICAgMTAzLCA5fSwgeyAgICAyMDcsMTJ9LCB7ICAgICAzMSwxMX0sIHsgICAgIDYzLCA5fSwgXAorICAgIHsgICAgMjU1LCA4fSwgeyAgICA1MTEsIDd9LCB7ICAgMTAyMywgOX0sIHsgICAgMjcxLDEwfSwgXAorICAgIHsgICAgMTQzLCA5fSwgeyAgICAyODcsMTF9LCB7ICAgICA3OSwxMH0sIHsgICAgMTU5LCA5fSwgXAorICAgIHsgICAgMzE5LCA4fSwgeyAgICA2MzksMTB9LCB7ICAgIDE3NSwgOX0sIHsgICAgMzUxLCA4fSwgXAorICAgIHsgICAgNzAzLDExfSwgeyAgICAgOTUsMTB9LCB7ICAgIDE5MSwgOX0sIHsgICAgMzgzLCA4fSwgXAorICAgIHsgICAgNzY3LDEwfSwgeyAgICAyMDcsIDl9LCB7ICAgIDQxNSwgOH0sIHsgICAgODMxLDEwfSwgXAorICAgIHsgICAgMjIzLDEyfSwgeyAgICAgNjMsMTB9LCB7ICAgIDI1NSwgOX0sIHsgICAgNTExLCA4fSwgXAorICAgIHsgICAxMDIzLDEwfSwgeyAgICAyNzEsMTF9LCB7ICAgIDE0MywxMH0sIHsgICAgMjg3LCA5fSwgXAorICAgIHsgICAgNTc1LCA4fSwgeyAgIDExNTEsMTF9LCB7ICAgIDE1OSwxMH0sIHsgICAgMzE5LCA5fSwgXAorICAgIHsgICAgNjM5LDExfSwgeyAgICAxNzUsMTB9LCB7ICAgIDM1MSwgOX0sIHsgICAgNzAzLDEyfSwgXAorICAgIHsgICAgIDk1LDExfSwgeyAgICAxOTEsMTB9LCB7ICAgIDM4MywgOX0sIHsgICAgNzY3LDExfSwgXAorICAgIHsgICAgMjA3LDEwfSwgeyAgICA0MTUsIDl9LCB7ICAgIDgzMSwxMX0sIHsgICAgMjIzLDEwfSwgXAorICAgIHsgICAgNDQ3LDEzfSwgeyAgIDgxOTIsMTR9LCB7ICAxNjM4NCwxNX0sIHsgIDMyNzY4LDE2fSwgXAorICAgIHsgIDY1NTM2LDE3fSwgeyAxMzEwNzIsMTh9LCB7IDI2MjE0NCwxOX0sIHsgNTI0Mjg4LDIwfSwgXAorICAgIHsxMDQ4NTc2LDIxfSwgezIwOTcxNTIsMjJ9LCB7NDE5NDMwNCwyM30sIHs4Mzg4NjA4LDI0fSB9CisjZGVmaW5lIFNRUl9GRlRfVEFCTEUzX1NJWkUgMTEyCisjZGVmaW5lIFNRUl9GRlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAyNjg4CisKKyNkZWZpbmUgTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xEICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAqLworI2RlZmluZSBNVUxMT19EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAzOAorI2RlZmluZSBNVUxMT19NVUxfTl9USFJFU0hPTEQgICAgICAgICAgICAgNjI1MworI2RlZmluZSBTUVJMT19CQVNFQ0FTRV9USFJFU0hPTEQgICAgICAgICAgICAgNAorI2RlZmluZSBTUVJMT19EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBTUVJMT19TUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgNTI0MAorCisjZGVmaW5lIERDX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDQyCisjZGVmaW5lIERDX0RJVkFQUFJfUV9USFJFU0hPTEQgICAgICAgICAgICAgMTUyCisjZGVmaW5lIERDX0JESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIERDX0JESVZfUV9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDkzCisKKyNkZWZpbmUgSU5WX01VTE1PRF9CTk0xX1RIUkVTSE9MRCAgICAgICAgICAgMzcKKyNkZWZpbmUgSU5WX05FV1RPTl9USFJFU0hPTEQgICAgICAgICAgICAgICAxNjMKKyNkZWZpbmUgSU5WX0FQUFJfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAxNjIKKworI2RlZmluZSBCSU5WX05FV1RPTl9USFJFU0hPTEQgICAgICAgICAgICAgIDE5NAorI2RlZmluZSBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCAgICAgICAgICA0MworCisjZGVmaW5lIE1VX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgOTk4CisjZGVmaW5lIE1VX0RJVkFQUFJfUV9USFJFU0hPTEQgICAgICAgICAgICAgOTk4CisjZGVmaW5lIE1VUElfRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDk4CisjZGVmaW5lIE1VX0JESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgODA3CisjZGVmaW5lIE1VX0JESVZfUV9USFJFU0hPTEQgICAgICAgICAgICAgICAgOTI0CisKKyNkZWZpbmUgUE9XTV9TRUNfVEFCTEUgIDYsMzAsMTk0LDU3OSwxNzMwCisKKyNkZWZpbmUgR0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgICAgMjkKKyNkZWZpbmUgU0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICA3ODgKKyNkZWZpbmUgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgIDE4MTYKKworI2RlZmluZSBGQUNfRFNDX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgIDIzNgorI2RlZmluZSBGQUNfT0REX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAyNAorCisjZGVmaW5lIE1BVFJJWDIyX1NUUkFTU0VOX1RIUkVTSE9MRCAgICAgICAgIDEwCisjZGVmaW5lIEhHQ0QyX0RJVjFfTUVUSE9EICAgICAgICAgICAgICAgICAgICAxICAvKiA3LjA1JSBmYXN0ZXIgdGhhbiAzICovCisjZGVmaW5lIEhHQ0RfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgMTAxCisjZGVmaW5lIEhHQ0RfQVBQUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgMTA0CisjZGVmaW5lIEhHQ0RfUkVEVUNFX1RIUkVTSE9MRCAgICAgICAgICAgICAxNjc5CisjZGVmaW5lIEdDRF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgMzMwCisjZGVmaW5lIEdDREVYVF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgMjQyCisjZGVmaW5lIEpBQ09CSV9CQVNFX01FVEhPRCAgICAgICAgICAgICAgICAgICA0ICAvKiAyMC4wMCUgZmFzdGVyIHRoYW4gMSAqLwpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2hhbWRpc3QuYXNtIGIvbXBuL2FybTY0L2hhbWRpc3QuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzZhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvaGFtZGlzdC5hc20KQEAgLTAsMCArMSwxODEgQEAKK2RubCAgQVJNNjQgTmVvbiBtcG5faGFtZGlzdCAtLSBtcG4gYml0IGhhbW1pbmcgZGlzdGFuY2UuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIDQuNQorQyBDb3J0ZXgtQTU3CSAxLjkKK0MgWC1HZW5lCSA0LjM2CisKK0MgVE9ETworQyAgKiBDb25zaWRlciBncmVhdGVyIHVucm9sbGluZy4KK0MgICogQXJyYW5nZSB0byBhbGlnbiB0aGUgcG9pbnRlciwgaWYgdGhhdCBoZWxwcyBwZXJmb3JtYW5jZS4gIFVzZSB0aGUgc2FtZQorQyAgICByZWFkLWFuZC1tYXNrIHRyaWNrIHdlIHVzZSBvbiBQQ3MsIGZvciBzaW1wbGljaXR5IGFuZCBwZXJmb3JtYW5jZS4gIChTb3JyeQorQyAgICB2YWxncmluZCEpCitDICAqIEV4cGxvcmUgaWYgZXhwbGljaXQgYWxpZ24gZGlyZWN0aXZlcywgZS5nLiwgIltwdHI6MTI4XSIgaGVscC4KK0MgICogU2VlIHJ0aCdzIGdtcC1kZXZlbCAyMDEzLTAyLzAzIG1lc3NhZ2VzIGFib3V0IGZpbmFsIHN1bW1hdGlvbiB0cmlja3MuCisKK2NoYW5nZWNvbShibGFoKQorCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgYXAnLCB4MCkKK2RlZmluZShgYnAnLCB4MSkKK2RlZmluZShgbicsICB4MikKKworQyBXZSBzdW0gaW50byAxNiAxNi1iaXQgY291bnRlcnMgaW4gdjQsdjUsIGJ1dCBhdCB0aGUgZW5kIHdlIHN1bSB0aGVtIGFuZCBlbmQKK0MgdXAgd2l0aCA4IDE2LWJpdCBjb3VudGVycy4gIFRoZXJlZm9yZSwgd2UgY2FuIHN1bSB0byA4KDJeMTYtMSkgYml0cywgb3IKK0MgKDgqMl4xNi0xKS82NCA9IDB4MWZmZiBsaW1icy4gIFdlIHVzZSBhIGNodW5rc2l6ZSBjbG9zZSB0byB0aGF0LCBidXQgd2hpY2gKK0MgIGFsbG93cyB0aGUgaHVnZSBjb3VudCBjb2RlIHRvIGp1bXAgZGVlcCBpbnRvIHRoZSBjb2RlIChhdCBMKGNodSkpLgorCitkZWZpbmUoYG1heHNpemUnLCAgMHgxZmZmKQorZGVmaW5lKGBjaHVua3NpemUnLDB4MWZmMCkKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9oYW1kaXN0KQorCisJbW92CXgxMSwgI21heHNpemUKKwljbXAJbiwgeDExCisJYi5oaQlMKGd0OGspCisKK0wobHQ4ayk6CisJbW92aQl2NC4xNmIsICMwCQkJQyBjbGVhciBzdW1tYXRpb24gcmVnaXN0ZXIKKwltb3ZpCXY1LjE2YiwgIzAJCQlDIGNsZWFyIHN1bW1hdGlvbiByZWdpc3RlcgorCisJdGJ6CW4sICMwLCBMKHh4MCkKKwlzdWIJbiwgbiwgIzEKKwlsZDEJe3YwLjFkfSwgW2FwXSwgIzgJCUMgbG9hZCAxIGxpbWIKKwlsZDEJe3YxNi4xZH0sIFticF0sICM4CQlDIGxvYWQgMSBsaW1iCisJZW9yCXYwLjE2YiwgdjAuMTZiLCB2MTYuMTZiCisJY250CXY2LjE2YiwgdjAuMTZiCisJdWFkYWxwCXY0LjhoLCAgdjYuMTZiCQkJQyBjb3VsZCBhbHNvIHNwbGF0CisKK0woeHgwKToJdGJ6CW4sICMxLCBMKHgwMCkKKwlzdWIJbiwgbiwgIzIKKwlsZDEJe3YwLjJkfSwgW2FwXSwgIzE2CQlDIGxvYWQgMiBsaW1icworCWxkMQl7djE2LjJkfSwgW2JwXSwgIzE2CQlDIGxvYWQgMiBsaW1icworCWVvcgl2MC4xNmIsIHYwLjE2YiwgdjE2LjE2YgorCWNudAl2Ni4xNmIsIHYwLjE2YgorCXVhZGFscAl2NC44aCwgIHY2LjE2YgorCitMKHgwMCk6CXRiegluLCAjMiwgTCgwMDApCisJc3VicwluLCBuLCAjNAorCWxkMQl7djAuMmQsdjEuMmR9LCBbYXBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YxNi4yZCx2MTcuMmR9LCBbYnBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwliLmxzCUwoc3VtKQorCitMKGd0NCk6CWxkMQl7djIuMmQsdjMuMmR9LCBbYXBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YxOC4yZCx2MTkuMmR9LCBbYnBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwllb3IJdjAuMTZiLCB2MC4xNmIsIHYxNi4xNmIKKwllb3IJdjEuMTZiLCB2MS4xNmIsIHYxNy4xNmIKKwlzdWIJbiwgbiwgIzQKKwljbnQJdjYuMTZiLCB2MC4xNmIKKwljbnQJdjcuMTZiLCB2MS4xNmIKKwliCUwobWlkKQorCitMKDAwMCk6CXN1YnMJbiwgbiwgIzgKKwliLmxvCUwoZTApCisKK0woY2h1KToJbGQxCXt2Mi4yZCx2My4yZH0sIFthcF0sICMzMglDIGxvYWQgNCBsaW1icworCWxkMQl7djAuMmQsdjEuMmR9LCBbYXBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YxOC4yZCx2MTkuMmR9LCBbYnBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YxNi4yZCx2MTcuMmR9LCBbYnBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwllb3IJdjIuMTZiLCB2Mi4xNmIsIHYxOC4xNmIKKwllb3IJdjMuMTZiLCB2My4xNmIsIHYxOS4xNmIKKwljbnQJdjYuMTZiLCB2Mi4xNmIKKwljbnQJdjcuMTZiLCB2My4xNmIKKwlzdWJzCW4sIG4sICM4CisJYi5sbwlMKGVuZCkKKworTCh0b3ApOglsZDEJe3YyLjJkLHYzLjJkfSwgW2FwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJbGQxCXt2MTguMmQsdjE5LjJkfSwgW2JwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJZW9yCXYwLjE2YiwgdjAuMTZiLCB2MTYuMTZiCisJZW9yCXYxLjE2YiwgdjEuMTZiLCB2MTcuMTZiCisJdWFkYWxwCXY0LjhoLCAgdjYuMTZiCisJY250CXY2LjE2YiwgdjAuMTZiCisJdWFkYWxwCXY1LjhoLCAgdjcuMTZiCisJY250CXY3LjE2YiwgdjEuMTZiCitMKG1pZCk6CWxkMQl7djAuMmQsdjEuMmR9LCBbYXBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YxNi4yZCx2MTcuMmR9LCBbYnBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwllb3IJdjIuMTZiLCB2Mi4xNmIsIHYxOC4xNmIKKwllb3IJdjMuMTZiLCB2My4xNmIsIHYxOS4xNmIKKwlzdWJzCW4sIG4sICM4CisJdWFkYWxwCXY0LjhoLCAgdjYuMTZiCisJY250CXY2LjE2YiwgdjIuMTZiCisJdWFkYWxwCXY1LjhoLCAgdjcuMTZiCisJY250CXY3LjE2YiwgdjMuMTZiCisJYi5ocwlMKHRvcCkKKworTChlbmQpOgl1YWRhbHAJdjQuOGgsICB2Ni4xNmIKKwl1YWRhbHAJdjUuOGgsICB2Ny4xNmIKK0woc3VtKToJZW9yCXYwLjE2YiwgdjAuMTZiLCB2MTYuMTZiCisJZW9yCXYxLjE2YiwgdjEuMTZiLCB2MTcuMTZiCisJY250CXY2LjE2YiwgdjAuMTZiCisJY250CXY3LjE2YiwgdjEuMTZiCisJdWFkYWxwCXY0LjhoLCAgdjYuMTZiCisJdWFkYWxwCXY1LjhoLCAgdjcuMTZiCisJYWRkCXY0LjhoLCB2NC44aCwgdjUuOGgKKwkJCQkJQyB3ZSBoYXZlIDggMTYtYml0IGNvdW50cworTChlMCk6CXVhZGRscAl2NC40cywgIHY0LjhoCQlDIHdlIGhhdmUgNCAzMi1iaXQgY291bnRzCisJdWFkZGxwCXY0LjJkLCAgdjQuNHMJCUMgd2UgaGF2ZSAyIDY0LWJpdCBjb3VudHMKKwltb3YJeDAsIHY0LmRbMF0KKwltb3YJeDEsIHY0LmRbMV0KKwlhZGQJeDAsIHgwLCB4MQorCXJldAorCitDIENvZGUgZm9yIGNvdW50ID4gbWF4c2l6ZS4gIFNwbGl0cyBvcGVyYW5kIGFuZCBjYWxscyBhYm92ZSBjb2RlLgorZGVmaW5lKGBhcDInLCB4NSkJCQlDIGNhbGxlci1zYXZlcyByZWcgbm90IHVzZWQgYWJvdmUKK2RlZmluZShgYnAyJywgeDYpCQkJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCitMKGd0OGspOgorCW1vdgl4OCwgeDMwCisJbW92CXg3LCBuCQkJQyBmdWxsIGNvdW50IChjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlKQorCW1vdgl4NCwgIzAJCQlDIHRvdGFsIHN1bSAgKGNhbGxlci1zYXZlcyByZWcgbm90IHVzZWQgYWJvdmUpCisJbW92CXg5LCAjY2h1bmtzaXplKjgJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCisJbW92CXgxMCwgI2NodW5rc2l6ZQkJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCisKKzE6CWFkZAlhcDIsIGFwLCB4OQkJQyBwb2ludCBhdCBzdWJzZXF1ZW50IGJsb2NrCisJYWRkCWJwMiwgYnAsIHg5CQlDIHBvaW50IGF0IHN1YnNlcXVlbnQgYmxvY2sKKwltb3YJbiwgI2NodW5rc2l6ZS04CQlDIGNvdW50IGZvciB0aGlzIGludm9jYXRpb24sIGFkanVzdGVkIGZvciBlbnRyeSBwdAorCW1vdmkJdjQuMTZiLCAjMAkJQyBjbGVhciBjaHVuayBzdW1tYXRpb24gcmVnaXN0ZXIKKwltb3ZpCXY1LjE2YiwgIzAJCUMgY2xlYXIgY2h1bmsgc3VtbWF0aW9uIHJlZ2lzdGVyCisJYmwJTChjaHUpCQkJQyBqdW1wIGRlZXAgaW5zaWRlIGNvZGUKKwlhZGQJeDQsIHg0LCB4MAorCW1vdglhcCwgYXAyCQkJQyBwdXQgY2h1bmsgcG9pbnRlciBpbiBwbGFjZSBmb3IgY2FsbHMKKwltb3YJYnAsIGJwMgkJCUMgcHV0IGNodW5rIHBvaW50ZXIgaW4gcGxhY2UgZm9yIGNhbGxzCisJc3ViCXg3LCB4NywgeDEwCisJY21wCXg3LCB4MTEKKwliLmhpCTFiCisKKwltb3YJbiwgeDcJCQlDIGNvdW50IGZvciBmaW5hbCBpbnZvY2F0aW9uCisJYmwJTChsdDhrKQorCWFkZAl4MCwgeDQsIHgwCisJbW92CXgzMCwgeDgKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9pbnZlcnRfbGltYi5hc20gYi9tcG4vYXJtNjQvaW52ZXJ0X2xpbWIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzJkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvaW52ZXJ0X2xpbWIuYXNtCkBAIC0wLDAgKzEsODMgQEAKK2RubCAgQVJNNjQgbXBuX2ludmVydF9saW1iIC0tIEludmVydCBhIG5vcm1hbGl6ZWQgbGltYi4KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MgICAgICAgICAgICBjeWNsZXMvbGltYgorQyBDb3J0ZXgtQTUzICAgICA/CitDIENvcnRleC1BNTcgICAgID8KKworQyBDb21waWxlciBnZW5lcmF0ZWQsIG1pbGRseSBlZGl0ZWQuICBDb3VsZCBzdXJlbHkgYmUgZnVydGhlciBvcHRpbWlzZWQuCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5faW52ZXJ0X2xpbWIpCisJbHNyCXgyLCB4MCwgIzU0CisJTEVBX0hJKAl4MSwgYXBwcm94X3RhYikKKwlhbmQJeDIsIHgyLCAjMHgxZmUKKwlMRUFfTE8oCXgxLCBhcHByb3hfdGFiKQorCWxkcmgJdzMsIFt4MSx4Ml0KKwlsc3IJeDQsIHgwLCAjMjQKKwlhZGQJeDQsIHg0LCAjMQorCXViZml6CXgyLCB4MywgIzExLCAjMTYKKwl1bXVsbAl4MywgdzMsIHczCisJbXVsCXgzLCB4MywgeDQKKwlzdWIJeDIsIHgyLCAjMQorCXN1Ygl4MiwgeDIsIHgzLCBsc3IgIzQwCisJbHNsCXgzLCB4MiwgIzYwCisJbXVsCXgxLCB4MiwgeDIKKwltc3ViCXgxLCB4MSwgeDQsIHgzCisJbHNsCXgyLCB4MiwgIzEzCisJYWRkCXgxLCB4MiwgeDEsIGxzciAjNDcKKwlhbmQJeDIsIHgwLCAjMQorCW5lZwl4MywgeDIKKwlhbmQJeDMsIHgzLCB4MSwgbHNyICMxCisJYWRkCXgyLCB4MiwgeDAsIGxzciAjMQorCW1zdWIJeDIsIHgxLCB4MiwgeDMKKwl1bXVsaAl4MiwgeDIsIHgxCisJbHNsCXgxLCB4MSwgIzMxCisJYWRkCXgxLCB4MSwgeDIsIGxzciAjMQorCW11bAl4MywgeDEsIHgwCisJdW11bGgJeDIsIHgxLCB4MAorCWFkZHMJeDQsIHgzLCB4MAorCWFkYwl4MCwgeDIsIHgwCisJc3ViCXgwLCB4MSwgeDAKKwlyZXQKK0VQSUxPR1VFKCkKKworCVJPREFUQQorCUFMSUdOKDIpCisJVFlQRSggICBhcHByb3hfdGFiLCBvYmplY3QpCisJU0laRSggICBhcHByb3hfdGFiLCA1MTIpCithcHByb3hfdGFiOgorZm9ybG9vcChpLDI1Niw1MTItMSxkbmwKK2AJLmh3b3JkCWV2YWwoMHg3ZmQwMC9pKQorJylkbmwKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9sb2dvcHNfbi5hc20gYi9tcG4vYXJtNjQvbG9nb3BzX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjA4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvbG9nb3BzX24uYXNtCkBAIC0wLDAgKzEsMTM5IEBACitkbmwgIEFSTTY0IG1wbl9hbmRfbiwgbXBuX2FuZG5fbi4gbXBuX25hbmRfbiwgZXRjLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iICAgICBjeWNsZXMvbGltYgorQwkgICAgICBuYW5kLG5pb3IJICAgICAgYWxsIG90aGVyCitDIENvcnRleC1BNTMJMy4yNS0zLjUJMi43NS0zCitDIENvcnRleC1BNTcJIDIuMAkJIDEuNQorQyBYLUdlbmUJIDIuMTQJCSAyLjAKKworY2hhbmdlY29tKGJsYWgpCisKK2RlZmluZShgcnAnLCBgeDAnKQorZGVmaW5lKGB1cCcsIGB4MScpCitkZWZpbmUoYHZwJywgYHgyJykKK2RlZmluZShgbicsICBgeDMnKQorCitkZWZpbmUoYFBPU1RPUCcsIGBkbmwnKQorCitpZmRlZihgT1BFUkFUSU9OX2FuZF9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5fYW5kX24nKQorICBkZWZpbmUoYExPR09QJywgICBgYW5kCSQxLCAkMiwgJDMnKScpCitpZmRlZihgT1BFUkFUSU9OX2FuZG5fbicsYAorICBkZWZpbmUoYGZ1bmMnLCAgICBgbXBuX2FuZG5fbicpCisgIGRlZmluZShgTE9HT1AnLCAgIGBiaWMJJDEsICQyLCAkMycpJykKK2lmZGVmKGBPUEVSQVRJT05fbmFuZF9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5fbmFuZF9uJykKKyAgZGVmaW5lKGBQT1NUT1AnLCAgYG12bgkkMSwgJDEnKQorICBkZWZpbmUoYExPR09QJywgICBgYW5kCSQxLCAkMiwgJDMnKScpCitpZmRlZihgT1BFUkFUSU9OX2lvcl9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5faW9yX24nKQorICBkZWZpbmUoYExPR09QJywgICBgb3JyCSQxLCAkMiwgJDMnKScpCitpZmRlZihgT1BFUkFUSU9OX2lvcm5fbicsYAorICBkZWZpbmUoYGZ1bmMnLCAgICBgbXBuX2lvcm5fbicpCisgIGRlZmluZShgTE9HT1AnLCAgIGBvcm4JJDEsICQyLCAkMycpJykKK2lmZGVmKGBPUEVSQVRJT05fbmlvcl9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5fbmlvcl9uJykKKyAgZGVmaW5lKGBQT1NUT1AnLCAgYG12bgkkMSwgJDEnKQorICBkZWZpbmUoYExPR09QJywgICBgb3JyCSQxLCAkMiwgJDMnKScpCitpZmRlZihgT1BFUkFUSU9OX3hvcl9uJyxgCisgIGRlZmluZShgZnVuYycsICAgIGBtcG5feG9yX24nKQorICBkZWZpbmUoYExPR09QJywgICBgZW9yCSQxLCAkMiwgJDMnKScpCitpZmRlZihgT1BFUkFUSU9OX3hub3JfbicsYAorICBkZWZpbmUoYGZ1bmMnLCAgICBgbXBuX3hub3JfbicpCisgIGRlZmluZShgTE9HT1AnLCAgIGBlb24JJDEsICQyLCAkMycpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYW5kX24gbXBuX2FuZG5fbiBtcG5fbmFuZF9uIG1wbl9pb3JfbiBtcG5faW9ybl9uIG1wbl9uaW9yX24gbXBuX3hvcl9uIG1wbl94bm9yX24pCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShmdW5jKQorCWxzcgl4MTcsIG4sICMyCisJdGJ6CW4sICMwLCBMKGJ4MCkKKworTChieDEpOglsZHIJeDcsIFt1cF0KKwlsZHIJeDExLCBbdnBdCisJTE9HT1AoCXgxNSwgeDcsIHgxMSkKKwlQT1NUT1AoCXgxNSkKKwlzdHIJeDE1LCBbcnBdLCM4CisJdGJuegluLCAjMSwgTChiMTEpCisKK0woYjAxKToJY2J6CXgxNywgTChyZXQpCisJbGRwCXg0LCB4NSwgW3VwLCM4XQorCWxkcAl4OCwgeDksIFt2cCwjOF0KKwlzdWIJdXAsIHVwLCAjOAorCXN1Ygl2cCwgdnAsICM4CisJYglMKG1pZCkKKworTChiMTEpOglsZHAJeDYsIHg3LCBbdXAsIzhdCisJbGRwCXgxMCwgeDExLCBbdnAsIzhdCisJYWRkCXVwLCB1cCwgIzgKKwlhZGQJdnAsIHZwLCAjOAorCWNiegl4MTcsIEwoZW5kKQorCWIJTCh0b3ApCisKK0woYngwKToJdGJuegluLCAjMSwgTChiMTApCisKK0woYjAwKToJbGRwCXg0LCB4NSwgW3VwXSwjLTE2CisJbGRwCXg4LCB4OSwgW3ZwXSwjLTE2CisJYglMKG1pZCkKKworTChiMTApOglsZHAJeDYsIHg3LCBbdXBdCisJbGRwCXgxMCwgeDExLCBbdnBdCisJY2J6CXgxNywgTChlbmQpCisKKwlBTElHTigxNikKK0wodG9wKToJbGRwCXg0LCB4NSwgW3VwLCMxNl0KKwlsZHAJeDgsIHg5LCBbdnAsIzE2XQorCUxPR09QKAl4MTIsIHg2LCB4MTApCisJTE9HT1AoCXgxMywgeDcsIHgxMSkKKwlQT1NUT1AoCXgxMikKKwlQT1NUT1AoCXgxMykKKwlzdHAJeDEyLCB4MTMsIFtycF0sIzE2CitMKG1pZCk6CWxkcAl4NiwgeDcsIFt1cCwjMzJdIQorCWxkcAl4MTAsIHgxMSwgW3ZwLCMzMl0hCisJTE9HT1AoCXgxMiwgeDQsIHg4KQorCUxPR09QKAl4MTMsIHg1LCB4OSkKKwlQT1NUT1AoCXgxMikKKwlQT1NUT1AoCXgxMykKKwlzdHAJeDEyLCB4MTMsIFtycF0sIzE2CisJc3ViCXgxNywgeDE3LCAjMQorCWNibnoJeDE3LCBMKHRvcCkKKworTChlbmQpOglMT0dPUCgJeDEyLCB4NiwgeDEwKQorCUxPR09QKAl4MTMsIHg3LCB4MTEpCisJUE9TVE9QKAl4MTIpCisJUE9TVE9QKAl4MTMpCisJc3RwCXgxMiwgeDEzLCBbcnBdCitMKHJldCk6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L2xzaGlmdC5hc20gYi9tcG4vYXJtNjQvbHNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzliMzlhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L2xzaGlmdC5hc20KQEAgLTAsMCArMSwxMzggQEAKK2RubCAgQVJNNjQgbXBuX2xzaGlmdC4KKworZG5sICBDb3B5cmlnaHQgMjAxMywgMjAxNCwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIgICBhc3N1bWVkIG9wdGltYWwgYy9sCitDIENvcnRleC1BNTMJMy41LTQuMAkJIDMuMjUKK0MgQ29ydGV4LUE1NwkgMi4wCQkgMi4wCitDIFgtR2VuZQkgMi42NwkJIDIuNQorCitDIFRPRE8KK0MgICogVGhlIGZlZWQtaW4gY29kZSB1c2VkIDEgbGRyIGZvciBvZGQgc2l6ZWQgYW5kIDIgbGRyIGZvciBldmVuIHNpemVzLiAgVGhlc2UKK0MgICAgbnVtYmVycyBzaG91bGQgYmUgMSBhbmQgMCwgcmVzcGVjdGl2ZWx5LiAgVGhlIHN0ciBpbiB3aW5kLWRvd24gc2hvdWxkIGFsc28KK0MgICAgZ28uCitDICAqIFVzaW5nIGV4dHIgYW5kIHdpdGggNjMgc2VwYXJhdGUgbG9vcHMgd2UgbWlnaHQgcmVhY2ggMS4yNSBjL2wgb24gQTU3LgorQyAgKiBBNTMncyBzcGVlZCBkZXBlbmRzIG9uIGFsaWdubWVudCwgdHVuZS9zcGVlZCAtdzEgZ2l2ZXMgMy41LCAtdzAgZ2l2ZXMgNC4wLgorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBycF9hcmcnLCBgeDAnKQorZGVmaW5lKGB1cCcsICAgICBgeDEnKQorZGVmaW5lKGBuJywgICAgICBgeDInKQorZGVmaW5lKGBjbnQnLCAgICBgeDMnKQorCitkZWZpbmUoYHJwJywgICAgIGB4MTYnKQorCitkZWZpbmUoYHRuYycsYHg4JykKKworZGVmaW5lKGBQU0hJRlQnLCBsc2wpCitkZWZpbmUoYE5TSElGVCcsIGxzcikKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9sc2hpZnQpCisJYWRkCXJwLCBycF9hcmcsIG4sIGxzbCAjMworCWFkZAl1cCwgdXAsIG4sIGxzbCAjMworCXN1Ygl0bmMsIHh6ciwgY250CisJbHNyCXgxNywgbiwgIzIKKwl0YnoJbiwgIzAsIEwoYngwKQorCitMKGJ4MSk6CWxkcgl4NCwgW3VwLCMtOF0KKwl0Ym56CW4sICMxLCBMKGIxMSkKKworTChiMDEpOglOU0hJRlQJeDAsIHg0LCB0bmMKKwlQU0hJRlQJeDIsIHg0LCBjbnQKKwljYm56CXgxNywgTChndDEpCisJc3RyCXgyLCBbcnAsIy04XQorCXJldAorTChndDEpOglsZHAJeDQsIHg1LCBbdXAsIy0yNF0KKwlzdWIJdXAsIHVwLCAjOAorCWFkZAlycCwgcnAsICMxNgorCWIJTChsbzIpCisKK0woYjExKToJTlNISUZUCXgwLCB4NCwgdG5jCisJUFNISUZUCXgyLCB4NCwgY250CisJbGRwCXg2LCB4NywgW3VwLCMtMjRdIQorCWIJTChsbzMpCisKK0woYngwKToJbGRwCXg0LCB4NSwgW3VwLCMtMTZdCisJdGJ6CW4sICMxLCBMKGIwMCkKKworTChiMTApOglOU0hJRlQJeDAsIHg1LCB0bmMKKwlQU0hJRlQJeDEzLCB4NSwgY250CisJTlNISUZUCXgxMCwgeDQsIHRuYworCVBTSElGVAl4MiwgeDQsIGNudAorCWNibnoJeDE3LCBMKGd0MikKKwlvcnIJeDEwLCB4MTAsIHgxMworCXN0cAl4MiwgeDEwLCBbcnAsIy0xNl0KKwlyZXQKK0woZ3QyKToJbGRwCXg0LCB4NSwgW3VwLCMtMzJdCisJb3JyCXgxMCwgeDEwLCB4MTMKKwlzdHIJeDEwLCBbcnAsIy04XQorCXN1Ygl1cCwgdXAsICMxNgorCWFkZAlycCwgcnAsICM4CisJYglMKGxvMikKKworTChiMDApOglOU0hJRlQJeDAsIHg1LCB0bmMKKwlQU0hJRlQJeDEzLCB4NSwgY250CisJTlNISUZUCXgxMCwgeDQsIHRuYworCVBTSElGVAl4MiwgeDQsIGNudAorCWxkcAl4NiwgeDcsIFt1cCwjLTMyXSEKKwlvcnIJeDEwLCB4MTAsIHgxMworCXN0cgl4MTAsIFtycCwjLThdIQorCWIJTChsbzApCisKKwlBTElHTigxNikKK0wodG9wKToJbGRwCXg0LCB4NSwgW3VwLCMtMTZdCisJb3JyCXgxMCwgeDEwLCB4MTMKKwlvcnIJeDExLCB4MTIsIHgyCisJc3RwCXgxMCwgeDExLCBbcnAsIy0xNl0KKwlQU0hJRlQJeDIsIHg2LCBjbnQKK0wobG8yKToJTlNISUZUCXgxMCwgeDQsIHRuYworCVBTSElGVAl4MTMsIHg1LCBjbnQKKwlOU0hJRlQJeDEyLCB4NSwgdG5jCisJbGRwCXg2LCB4NywgW3VwLCMtMzJdIQorCW9ycgl4MTAsIHgxMCwgeDEzCisJb3JyCXgxMSwgeDEyLCB4MgorCXN0cAl4MTAsIHgxMSwgW3JwLCMtMzJdIQorCVBTSElGVAl4MiwgeDQsIGNudAorTChsbzApOglzdWIJeDE3LCB4MTcsICMxCitMKGxvMyk6CU5TSElGVAl4MTAsIHg2LCB0bmMKKwlQU0hJRlQJeDEzLCB4NywgY250CisJTlNISUZUCXgxMiwgeDcsIHRuYworCWNibnoJeDE3LCBMKHRvcCkKKworTChlbmQpOglvcnIJeDEwLCB4MTAsIHgxMworCW9ycgl4MTEsIHgxMiwgeDIKKwlQU0hJRlQJeDIsIHg2LCBjbnQKKwlzdHAJeDEwLCB4MTEsIFtycCwjLTE2XQorCXN0cgl4MiwgW3JwLCMtMjRdCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvbHNoaWZ0Yy5hc20gYi9tcG4vYXJtNjQvbHNoaWZ0Yy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4Mjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hcm02NC9sc2hpZnRjLmFzbQpAQCAtMCwwICsxLDE0MSBAQAorZG5sICBBUk02NCBtcG5fbHNoaWZ0Yy4KKworZG5sICBDb3B5cmlnaHQgMjAxMywgMjAxNCwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIgICBhc3N1bWVkIG9wdGltYWwgYy9sCitDIENvcnRleC1BNTMJMy41LTQuMAkJIDMuMjUKK0MgQ29ydGV4LUE1NwkgMi4wCQkgMi4wCitDIFgtR2VuZQkgMi42NwkJIDIuNQorCitDIFRPRE8KK0MgICogVGhlIGZlZWQtaW4gY29kZSB1c2VkIDEgbGRyIGZvciBvZGQgc2l6ZWQgYW5kIDIgbGRyIGZvciBldmVuIHNpemVzLiAgVGhlc2UKK0MgICAgbnVtYmVycyBzaG91bGQgYmUgMSBhbmQgMCwgcmVzcGVjdGl2ZWx5LiAgVGhlIHN0ciBpbiB3aW5kLWRvd24gc2hvdWxkIGFsc28KK0MgICAgZ28uCitDICAqIFVzaW5nIGV4dHIgYW5kIHdpdGggNjMgc2VwYXJhdGUgbG9vcHMgd2UgbWlnaHQgcmVhY2ggMS41IGMvbCBvbiBBNTcuCitDICAqIEE1MydzIHNwZWVkIGRlcGVuZHMgb24gYWxpZ25tZW50LCB0dW5lL3NwZWVkIC13MSBnaXZlcyAzLjUsIC13MCBnaXZlcyA0LjAuCisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwX2FyZycsIGB4MCcpCitkZWZpbmUoYHVwJywgICAgIGB4MScpCitkZWZpbmUoYG4nLCAgICAgIGB4MicpCitkZWZpbmUoYGNudCcsICAgIGB4MycpCisKK2RlZmluZShgcnAnLCAgICAgYHgxNicpCisKK2RlZmluZShgdG5jJyxgeDgnKQorCitkZWZpbmUoYFBTSElGVCcsIGxzbCkKK2RlZmluZShgTlNISUZUJywgbHNyKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX2xzaGlmdGMpCisJYWRkCXJwLCBycF9hcmcsIG4sIGxzbCAjMworCWFkZAl1cCwgdXAsIG4sIGxzbCAjMworCXN1Ygl0bmMsIHh6ciwgY250CisJbHNyCXgxNywgbiwgIzIKKwl0YnoJbiwgIzAsIEwoYngwKQorCitMKGJ4MSk6CWxkcgl4NCwgW3VwLCMtOF0KKwl0Ym56CW4sICMxLCBMKGIxMSkKKworTChiMDEpOglOU0hJRlQJeDAsIHg0LCB0bmMKKwlQU0hJRlQJeDIsIHg0LCBjbnQKKwljYm56CXgxNywgTChndDEpCisJbXZuCXgyLCB4MgorCXN0cgl4MiwgW3JwLCMtOF0KKwlyZXQKK0woZ3QxKToJbGRwCXg0LCB4NSwgW3VwLCMtMjRdCisJc3ViCXVwLCB1cCwgIzgKKwlhZGQJcnAsIHJwLCAjMTYKKwliCUwobG8yKQorCitMKGIxMSk6CU5TSElGVAl4MCwgeDQsIHRuYworCVBTSElGVAl4MiwgeDQsIGNudAorCWxkcAl4NiwgeDcsIFt1cCwjLTI0XSEKKwliCUwobG8zKQorCitMKGJ4MCk6CWxkcAl4NCwgeDUsIFt1cCwjLTE2XQorCXRiegluLCAjMSwgTChiMDApCisKK0woYjEwKToJTlNISUZUCXgwLCB4NSwgdG5jCisJUFNISUZUCXgxMywgeDUsIGNudAorCU5TSElGVAl4MTAsIHg0LCB0bmMKKwlQU0hJRlQJeDIsIHg0LCBjbnQKKwljYm56CXgxNywgTChndDIpCisJZW9uCXgxMCwgeDEwLCB4MTMKKwltdm4JeDIsIHgyCisJc3RwCXgyLCB4MTAsIFtycCwjLTE2XQorCXJldAorTChndDIpOglsZHAJeDQsIHg1LCBbdXAsIy0zMl0KKwllb24JeDEwLCB4MTAsIHgxMworCXN0cgl4MTAsIFtycCwjLThdCisJc3ViCXVwLCB1cCwgIzE2CisJYWRkCXJwLCBycCwgIzgKKwliCUwobG8yKQorCitMKGIwMCk6CU5TSElGVAl4MCwgeDUsIHRuYworCVBTSElGVAl4MTMsIHg1LCBjbnQKKwlOU0hJRlQJeDEwLCB4NCwgdG5jCisJUFNISUZUCXgyLCB4NCwgY250CisJbGRwCXg2LCB4NywgW3VwLCMtMzJdIQorCWVvbgl4MTAsIHgxMCwgeDEzCisJc3RyCXgxMCwgW3JwLCMtOF0hCisJYglMKGxvMCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHAJeDQsIHg1LCBbdXAsIy0xNl0KKwllb24JeDEwLCB4MTAsIHgxMworCWVvbgl4MTEsIHgxMiwgeDIKKwlzdHAJeDEwLCB4MTEsIFtycCwjLTE2XQorCVBTSElGVAl4MiwgeDYsIGNudAorTChsbzIpOglOU0hJRlQJeDEwLCB4NCwgdG5jCisJUFNISUZUCXgxMywgeDUsIGNudAorCU5TSElGVAl4MTIsIHg1LCB0bmMKKwlsZHAJeDYsIHg3LCBbdXAsIy0zMl0hCisJZW9uCXgxMCwgeDEwLCB4MTMKKwllb24JeDExLCB4MTIsIHgyCisJc3RwCXgxMCwgeDExLCBbcnAsIy0zMl0hCisJUFNISUZUCXgyLCB4NCwgY250CitMKGxvMCk6CXN1Ygl4MTcsIHgxNywgIzEKK0wobG8zKToJTlNISUZUCXgxMCwgeDYsIHRuYworCVBTSElGVAl4MTMsIHg3LCBjbnQKKwlOU0hJRlQJeDEyLCB4NywgdG5jCisJY2Juegl4MTcsIEwodG9wKQorCitMKGVuZCk6CWVvbgl4MTAsIHgxMCwgeDEzCisJZW9uCXgxMSwgeDEyLCB4MgorCVBTSElGVAl4MiwgeDYsIGNudAorCXN0cAl4MTAsIHgxMSwgW3JwLCMtMTZdCisJbXZuCXgyLCB4MgorCXN0cgl4MiwgW3JwLCMtMjRdCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvbW9kXzM0bHN1YjEuYXNtIGIvbXBuL2FybTY0L21vZF8zNGxzdWIxLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzY0ODEyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L21vZF8zNGxzdWIxLmFzbQpAQCAtMCwwICsxLDEyNCBAQAorZG5sICBBUk02NCBtcG5fbW9kXzM0bHN1YjEgLS0gcmVtYWluZGVyIG1vZHVsbyAyXjQ4LTEuCisKK2RubCAgQ29weXJpZ2h0IDIwMTItMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQ29ydGV4LUE1MwkgMgorQyBDb3J0ZXgtQTU3CSAxCitDIFgtR2VuZQkgMS40NQorCitkZWZpbmUoYGFwJywJeDApCitkZWZpbmUoYG4nLAl4MSkKKworY2hhbmdlY29tKGJsYWgpCisKK0MgbXBfbGltYl90IG1wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbikKKworQyBUT0RPCitDICAqIEFuIGFsdGVybmF0aXZlIGlubmVyIGxvb3Agd2hpY2ggY291bGQgcnVuIGF0IDAuNzIyIGMvbCBvbiBBNTc6CitDCWFkZHMJeDgsIHg4LCB4MgorQwlhZGNzCXg5LCB4OSwgeDMKK0MJbGRwCXgyLCB4MywgW2FwLCAjLTMyXQorQwlhZGNzCXgxMCwgeDEwLCB4NAorQwlhZGMJeDEyLCB4MTIsIHh6cgorQwlhZGRzCXg4LCB4OCwgeDUKK0MJbGRwCXg0LCB4NSwgW2FwLCAjLTE2XQorQwlzdWIJbiwgbiwgIzYKK0MJYWRjcwl4OSwgeDksIHg2CitDCWFkY3MJeDEwLCB4MTAsIHg3CitDCWxkcAl4NiwgeDcsIFthcF0sICM0OAorQwlhZGMJeDEyLCB4MTIsIHh6cgorQwl0YnoJbiwgIzYzLCBMKHRvcCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShtcG5fbW9kXzM0bHN1YjEpCisJc3VicwluLCBuLCAjMworCW1vdgl4OCwgIzAKKwliLmx0CUwobGUyKQkJCUMgbiA8PSAyCisKKwlsZHAJeDIsIHgzLCBbYXAsICMwXQorCWxkcgl4NCwgW2FwLCAjMTZdCisJYWRkCWFwLCBhcCwgIzI0CisJc3VicwluLCBuLCAjMworCWIubHQJTChzdW0pCQkJQyBuIDw9IDUKKwljbW4JeDAsICMwCQkJQyBjbGVhciBjYXJyeQorCitMKHRvcCk6CWxkcAl4NSwgeDYsIFthcCwgIzBdCisJbGRyCXg3LCBbYXAsICMxNl0KKwlhZGQJYXAsIGFwLCAjMjQKKwlzdWIJbiwgbiwgIzMKKwlhZGNzCXgyLCB4MiwgeDUKKwlhZGNzCXgzLCB4MywgeDYKKwlhZGNzCXg0LCB4NCwgeDcKKwl0YnoJbiwgIzYzLCBMKHRvcCkKKworCWFkYwl4OCwgeHpyLCB4enIJCUMgeDggPD0gMQorCitMKHN1bSk6CWNtbgluLCAjMgorCW1vdgl4NSwgIzAKKwliLmxvCTFmCisJbGRyCXg1LCBbYXBdLCAjOAorMToJbW92CXg2LCAjMAorCWIubHMJMWYKKwlsZHIJeDYsIFthcF0sICM4CisxOglhZGRzCXgyLCB4MiwgeDUKKwlhZGNzCXgzLCB4MywgeDYKKwlhZGNzCXg0LCB4NCwgeHpyCisJYWRjCXg4LCB4OCwgeHpyCQlDIHg4IDw9IDIKKworTChzdW0yKToKKwlhbmQJeDAsIHgyLCAjMHhmZmZmZmZmZmZmZmYKKwlhZGQJeDAsIHgwLCB4MiwgbHNyICM0OAorCWFkZAl4MCwgeDAsIHg4CisKKwlsc2wJeDgsIHgzLCAjMTYKKwlhbmQJeDEsIHg4LCAjMHhmZmZmZmZmZmZmZmYKKwlhZGQJeDAsIHgwLCB4MQorCWFkZAl4MCwgeDAsIHgzLCBsc3IgIzMyCisKKwlsc2wJeDgsIHg0LCAjMzIKKwlhbmQJeDEsIHg4LCAjMHhmZmZmZmZmZmZmZmYKKwlhZGQJeDAsIHgwLCB4MQorCWFkZAl4MCwgeDAsIHg0LCBsc3IgIzE2CisJcmV0CisKK0wobGUyKToJY21uCW4sICMxCisJYi5uZQlMKDEpCisJbGRwCXgyLCB4MywgW2FwXQorCW1vdgl4NCwgIzAKKwliCUwoc3VtMikKK0woMSk6CWxkcgl4MiwgW2FwXQorCWFuZAl4MCwgeDIsICMweGZmZmZmZmZmZmZmZgorCWFkZAl4MCwgeDAsIHgyLCBsc3IgIzQ4CisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvbXVsXzEuYXNtIGIvbXBuL2FybTY0L211bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJmMjUxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L211bF8xLmFzbQpAQCAtMCwwICsxLDEyOCBAQAorZG5sICBBUk02NCBtcG5fbXVsXzEKKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitkbmwgIENvcHlyaWdodCAyMDEzLCAyMDE1LCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBDb3J0ZXgtQTUzCTcuNS04CitDIENvcnRleC1BNTcJIDcKK0MgQ29ydGV4LUE3MgorQyBYLUdlbmUJIDQKK0MgQXBwbGUgTTEJIDEKKworQyBUT0RPCitDICAqIFN0YXJ0IGZpcnN0IG11bHRpcGx5IGVhcmxpZXIuCisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwJywgYHgwJykKK2RlZmluZShgdXAnLCBgeDEnKQorZGVmaW5lKGBuJywgIGB4MicpCitkZWZpbmUoYHYwJywgYHgzJykKKworCitQUk9MT0dVRShtcG5fbXVsXzFjKQorCWFkZHMJeHpyLCB4enIsIHh6cgkJQyBjbGVhciBjeSBmbGFnCisJYglMKGNvbSkKK0VQSUxPR1VFKCkKKworUFJPTE9HVUUobXBuX211bF8xKQorCWFkZHMJeDQsIHh6ciwgeHpyCQlDIGNsZWFyIHJlZ2lzdGVyIGFuZCBjeSBmbGFnCitMKGNvbSk6CWxzcgl4MTcsIG4sICMyCisJdGJuegluLCAjMCwgTChieDEpCisKK0woYngwKToJbW92CXgxMSwgeDQKKwl0YnoJbiwgIzEsIEwoYjAwKQorCitMKGIxMCk6CWxkcAl4NCwgeDUsIFt1cF0KKwltdWwJeDgsIHg0LCB2MAorCXVtdWxoCXgxMCwgeDQsIHYwCisJY2J6CXgxNywgTCgyKQorCWxkcAl4NiwgeDcsIFt1cCwjMTZdIQorCW11bAl4OSwgeDUsIHYwCisJYglMKG1pZCktOAorCitMKDIpOgltdWwJeDksIHg1LCB2MAorCWIJTCgyZSkKKworTChieDEpOglsZHIJeDcsIFt1cF0sIzgKKwltdWwJeDksIHg3LCB2MAorCXVtdWxoCXgxMSwgeDcsIHYwCisJYWRkcwl4OSwgeDksIHg0CisJc3RyCXg5LCBbcnBdLCM4CisJdGJuegluLCAjMSwgTChiMTApCisKK0woYjAxKToJY2J6CXgxNywgTCgxKQorCitMKGIwMCk6CWxkcAl4NiwgeDcsIFt1cF0KKwltdWwJeDgsIHg2LCB2MAorCXVtdWxoCXgxMCwgeDYsIHYwCisJbGRwCXg0LCB4NSwgW3VwLCMxNl0KKwltdWwJeDksIHg3LCB2MAorCWFkY3MJeDEyLCB4OCwgeDExCisJdW11bGgJeDExLCB4NywgdjAKKwlhZGQJcnAsIHJwLCAjMTYKKwlzdWIJeDE3LCB4MTcsICMxCisJY2J6CXgxNywgTChlbmQpCisKKwlBTElHTigxNikKK0wodG9wKToJbXVsCXg4LCB4NCwgdjAKKwlsZHAJeDYsIHg3LCBbdXAsIzMyXSEKKwlhZGNzCXgxMywgeDksIHgxMAorCXVtdWxoCXgxMCwgeDQsIHYwCisJbXVsCXg5LCB4NSwgdjAKKwlzdHAJeDEyLCB4MTMsIFtycCwjLTE2XQorCWFkY3MJeDEyLCB4OCwgeDExCisJdW11bGgJeDExLCB4NSwgdjAKK0wobWlkKToJbXVsCXg4LCB4NiwgdjAKKwlsZHAJeDQsIHg1LCBbdXAsIzE2XQorCWFkY3MJeDEzLCB4OSwgeDEwCisJdW11bGgJeDEwLCB4NiwgdjAKKwltdWwJeDksIHg3LCB2MAorCXN0cAl4MTIsIHgxMywgW3JwXSwjMzIKKwlhZGNzCXgxMiwgeDgsIHgxMQorCXVtdWxoCXgxMSwgeDcsIHYwCisJc3ViCXgxNywgeDE3LCAjMQorCWNibnoJeDE3LCBMKHRvcCkKKworTChlbmQpOgltdWwJeDgsIHg0LCB2MAorCWFkY3MJeDEzLCB4OSwgeDEwCisJdW11bGgJeDEwLCB4NCwgdjAKKwltdWwJeDksIHg1LCB2MAorCXN0cAl4MTIsIHgxMywgW3JwLCMtMTZdCitMKDJlKToJYWRjcwl4MTIsIHg4LCB4MTEKKwl1bXVsaAl4MTEsIHg1LCB2MAorCWFkY3MJeDEzLCB4OSwgeDEwCisJc3RwCXgxMiwgeDEzLCBbcnBdCitMKDEpOglhZGMJeDAsIHgxMSwgeHpyCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXJtNjQvcG9wY291bnQuYXNtIGIvbXBuL2FybTY0L3BvcGNvdW50LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk1NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L3BvcGNvdW50LmFzbQpAQCAtMCwwICsxLDE1NyBAQAorZG5sICBBUk02NCBOZW9uIG1wbl9wb3Bjb3VudCAtLSBtcG4gYml0IHBvcHVsYXRpb24gY291bnQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIDIuNQorQyBDb3J0ZXgtQTU3CSAxLjE0CitDIFgtR2VuZQkgMworCitDIFRPRE8KK0MgICogQ29uc2lkZXIgZ3JlYXRlciB1bnJvbGxpbmcuCitDICAqIEFycmFuZ2UgdG8gYWxpZ24gdGhlIHBvaW50ZXIsIGlmIHRoYXQgaGVscHMgcGVyZm9ybWFuY2UuICBVc2UgdGhlIHNhbWUKK0MgICAgcmVhZC1hbmQtbWFzayB0cmljayB3ZSB1c2Ugb24gUENzLCBmb3Igc2ltcGxpY2l0eSBhbmQgcGVyZm9ybWFuY2UuICAoU29ycnkKK0MgICAgdmFsZ3JpbmQhKQorQyAgKiBFeHBsb3JlIGlmIGV4cGxpY2l0IGFsaWduIGRpcmVjdGl2ZXMsIGUuZy4sICJbcHRyOjEyOF0iIGhlbHAuCitDICAqIFNlZSBydGgncyBnbXAtZGV2ZWwgMjAxMy0wMi8wMyBtZXNzYWdlcyBhYm91dCBmaW5hbCBzdW1tYXRpb24gdHJpY2tzLgorCitjaGFuZ2Vjb20oYmxhaCkKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYGFwJywgeDApCitkZWZpbmUoYG4nLCAgeDEpCisKK0MgV2Ugc3VtIGludG8gMTYgMTYtYml0IGNvdW50ZXJzIGluIHY0LHY1LCBidXQgYXQgdGhlIGVuZCB3ZSBzdW0gdGhlbSBhbmQgZW5kCitDIHVwIHdpdGggOCAxNi1iaXQgY291bnRlcnMuICBUaGVyZWZvcmUsIHdlIGNhbiBzdW0gdG8gOCgyXjE2LTEpIGJpdHMsIG9yCitDICg4KjJeMTYtMSkvNjQgPSAweDFmZmYgbGltYnMuICBXZSB1c2UgYSBjaHVua3NpemUgY2xvc2UgdG8gdGhhdCwgYnV0IHdoaWNoCitDICBhbGxvd3MgdGhlIGh1Z2UgY291bnQgY29kZSB0byBqdW1wIGRlZXAgaW50byB0aGUgY29kZSAoYXQgTChjaHUpKS4KKworZGVmaW5lKGBtYXhzaXplJywgIDB4MWZmZikKK2RlZmluZShgY2h1bmtzaXplJywweDFmZjApCisKK0FTTV9TVEFSVCgpCitQUk9MT0dVRShtcG5fcG9wY291bnQpCisKKwltb3YJeDExLCAjbWF4c2l6ZQorCWNtcAluLCB4MTEKKwliLmhpCUwoZ3Q4aykKKworTChsdDhrKToKKwltb3ZpCXY0LjE2YiwgIzAJCQlDIGNsZWFyIHN1bW1hdGlvbiByZWdpc3RlcgorCW1vdmkJdjUuMTZiLCAjMAkJCUMgY2xlYXIgc3VtbWF0aW9uIHJlZ2lzdGVyCisKKwl0YnoJbiwgIzAsIEwoeHgwKQorCXN1YgluLCBuLCAjMQorCWxkMQl7djAuMWR9LCBbYXBdLCAjOAkJQyBsb2FkIDEgbGltYgorCWNudAl2Ni4xNmIsIHYwLjE2YgorCXVhZGFscAl2NC44aCwgIHY2LjE2YgkJCUMgY291bGQgYWxzbyBzcGxhdAorCitMKHh4MCk6CXRiegluLCAjMSwgTCh4MDApCisJc3ViCW4sIG4sICMyCisJbGQxCXt2MC4yZH0sIFthcF0sICMxNgkJQyBsb2FkIDIgbGltYnMKKwljbnQJdjYuMTZiLCB2MC4xNmIKKwl1YWRhbHAJdjQuOGgsICB2Ni4xNmIKKworTCh4MDApOgl0YnoJbiwgIzIsIEwoMDAwKQorCXN1YnMJbiwgbiwgIzQKKwlsZDEJe3YwLjJkLHYxLjJkfSwgW2FwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJYi5scwlMKHN1bSkKKworTChndDQpOglsZDEJe3YyLjJkLHYzLjJkfSwgW2FwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJc3ViCW4sIG4sICM0CisJY250CXY2LjE2YiwgdjAuMTZiCisJY250CXY3LjE2YiwgdjEuMTZiCisJYglMKG1pZCkKKworTCgwMDApOglzdWJzCW4sIG4sICM4CisJYi5sbwlMKGUwKQorCitMKGNodSk6CWxkMQl7djIuMmQsdjMuMmR9LCBbYXBdLCAjMzIJQyBsb2FkIDQgbGltYnMKKwlsZDEJe3YwLjJkLHYxLjJkfSwgW2FwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJY250CXY2LjE2YiwgdjIuMTZiCisJY250CXY3LjE2YiwgdjMuMTZiCisJc3VicwluLCBuLCAjOAorCWIubG8JTChlbmQpCisKK0wodG9wKToJbGQxCXt2Mi4yZCx2My4yZH0sIFthcF0sICMzMglDIGxvYWQgNCBsaW1icworCXVhZGFscAl2NC44aCwgIHY2LjE2YgorCWNudAl2Ni4xNmIsIHYwLjE2YgorCXVhZGFscAl2NS44aCwgIHY3LjE2YgorCWNudAl2Ny4xNmIsIHYxLjE2YgorTChtaWQpOglsZDEJe3YwLjJkLHYxLjJkfSwgW2FwXSwgIzMyCUMgbG9hZCA0IGxpbWJzCisJc3VicwluLCBuLCAjOAorCXVhZGFscAl2NC44aCwgIHY2LjE2YgorCWNudAl2Ni4xNmIsIHYyLjE2YgorCXVhZGFscAl2NS44aCwgIHY3LjE2YgorCWNudAl2Ny4xNmIsIHYzLjE2YgorCWIuaHMJTCh0b3ApCisKK0woZW5kKToJdWFkYWxwCXY0LjhoLCAgdjYuMTZiCisJdWFkYWxwCXY1LjhoLCAgdjcuMTZiCitMKHN1bSk6CWNudAl2Ni4xNmIsIHYwLjE2YgorCWNudAl2Ny4xNmIsIHYxLjE2YgorCXVhZGFscAl2NC44aCwgIHY2LjE2YgorCXVhZGFscAl2NS44aCwgIHY3LjE2YgorCWFkZAl2NC44aCwgdjQuOGgsIHY1LjhoCisJCQkJCUMgd2UgaGF2ZSA4IDE2LWJpdCBjb3VudHMKK0woZTApOgl1YWRkbHAJdjQuNHMsICB2NC44aAkJQyB3ZSBoYXZlIDQgMzItYml0IGNvdW50cworCXVhZGRscAl2NC4yZCwgIHY0LjRzCQlDIHdlIGhhdmUgMiA2NC1iaXQgY291bnRzCisJbW92CXgwLCB2NC5kWzBdCisJbW92CXgxLCB2NC5kWzFdCisJYWRkCXgwLCB4MCwgeDEKKwlyZXQKKworQyBDb2RlIGZvciBjb3VudCA+IG1heHNpemUuICBTcGxpdHMgb3BlcmFuZCBhbmQgY2FsbHMgYWJvdmUgY29kZS4KK2RlZmluZShgYXAyJywgeDUpCQkJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCitMKGd0OGspOgorCW1vdgl4OCwgeDMwCisJbW92CXg3LCBuCQkJQyBmdWxsIGNvdW50IChjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlKQorCW1vdgl4NCwgIzAJCQlDIHRvdGFsIHN1bSAgKGNhbGxlci1zYXZlcyByZWcgbm90IHVzZWQgYWJvdmUpCisJbW92CXg5LCAjY2h1bmtzaXplKjgJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCisJbW92CXgxMCwgI2NodW5rc2l6ZQkJQyBjYWxsZXItc2F2ZXMgcmVnIG5vdCB1c2VkIGFib3ZlCisKKzE6CWFkZAlhcDIsIGFwLCB4OQkJQyBwb2ludCBhdCBzdWJzZXF1ZW50IGJsb2NrCisJbW92CW4sICNjaHVua3NpemUtOAkJQyBjb3VudCBmb3IgdGhpcyBpbnZvY2F0aW9uLCBhZGp1c3RlZCBmb3IgZW50cnkgcHQKKwltb3ZpCXY0LjE2YiwgIzAJCUMgY2xlYXIgY2h1bmsgc3VtbWF0aW9uIHJlZ2lzdGVyCisJbW92aQl2NS4xNmIsICMwCQlDIGNsZWFyIGNodW5rIHN1bW1hdGlvbiByZWdpc3RlcgorCWJsCUwoY2h1KQkJCUMganVtcCBkZWVwIGluc2lkZSBjb2RlCisJYWRkCXg0LCB4NCwgeDAKKwltb3YJYXAsIGFwMgkJCUMgcHV0IGNodW5rIHBvaW50ZXIgaW4gcGxhY2UgZm9yIGNhbGxzCisJc3ViCXg3LCB4NywgeDEwCisJY21wCXg3LCB4MTEKKwliLmhpCTFiCisKKwltb3YJbiwgeDcJCQlDIGNvdW50IGZvciBmaW5hbCBpbnZvY2F0aW9uCisJYmwJTChsdDhrKQorCWFkZAl4MCwgeDQsIHgwCisJbW92CXgzMCwgeDgKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9yc2gxYW9yc19uLmFzbSBiL21wbi9hcm02NC9yc2gxYW9yc19uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2U4MWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L3JzaDFhb3JzX24uYXNtCkBAIC0wLDAgKzEsMTY4IEBACitkbmwgIEFSTTY0IG1wbl9yc2gxYWRkX24gYW5kIG1wbl9yc2gxc3ViX24uCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIgICBhc3N1bWVkIG9wdGltYWwgYy9sCitDIENvcnRleC1BNTMJMy4yNS0zLjc1CSAzLjAgc3RlYWR5CitDIENvcnRleC1BNTcJIDIuMTUJCSAxLjc1CitDIFgtR2VuZQkgMi43NQkJIDIuNQorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBycCcsIGB4MCcpCitkZWZpbmUoYHVwJywgYHgxJykKK2RlZmluZShgdnAnLCBgeDInKQorZGVmaW5lKGBuJywgIGB4MycpCisKK2lmZGVmKGBPUEVSQVRJT05fcnNoMWFkZF9uJywgYAorICBkZWZpbmUoYEFERFNVQicsCWFkZHMpCisgIGRlZmluZShgQUREU1VCQycsCWFkY3MpCisgIGRlZmluZShgQ09ORCcsCWBjcycpCisgIGRlZmluZShgZnVuY19uJywJbXBuX3JzaDFhZGRfbiknKQoraWZkZWYoYE9QRVJBVElPTl9yc2gxc3ViX24nLCBgCisgIGRlZmluZShgQUREU1VCJywJc3VicykKKyAgZGVmaW5lKGBBRERTVUJDJywJc2JjcykKKyAgZGVmaW5lKGBDT05EJywJYGNjJykKKyAgZGVmaW5lKGBmdW5jX24nLAltcG5fcnNoMXN1Yl9uKScpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX3JzaDFhZGRfbiBtcG5fcnNoMXN1Yl9uKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUoZnVuY19uKQorCWxzcgl4NiwgbiwgIzIKKworCXRiegluLCAjMCwgTChieDApCisKK0woYngxKToJbGRyCXg1LCBbdXBdLCM4CisJbGRyCXg5LCBbdnBdLCM4CisJdGJuegluLCAjMSwgTChiMTEpCisKK0woYjAxKToJQUREU1VCCXgxMywgeDUsIHg5CisJYW5kCXgxMCwgeDEzLCAjMQorCWNiegl4NiwgTCgxKQorCWxkcAl4NCwgeDUsIFt1cF0sIzQ4CisJbGRwCXg4LCB4OSwgW3ZwXSwjNDgKKwlBRERTVUJDCXgxNCwgeDQsIHg4CisJQUREU1VCQwl4MTUsIHg1LCB4OQorCWxkcAl4NCwgeDUsIFt1cCwjLTMyXQorCWxkcAl4OCwgeDksIFt2cCwjLTMyXQorCWV4dHIJeDE3LCB4MTQsIHgxMywgIzEKKwlBRERTVUJDCXgxMiwgeDQsIHg4CisJQUREU1VCQwl4MTMsIHg1LCB4OQorCXN0cgl4MTcsIFtycF0sICMyNAorCXN1Ygl4NiwgeDYsICMxCisJY2J6CXg2LCBMKGVuZCkKKwliCUwodG9wKQorCitMKDEpOgljc2V0CXgxNCwgQ09ORAorCWV4dHIJeDE3LCB4MTQsIHgxMywgIzEKKwlzdHIJeDE3LCBbcnBdCisJbW92CXgwLCB4MTAKKwlyZXQKKworTChiMTEpOglBRERTVUIJeDE1LCB4NSwgeDkKKwlhbmQJeDEwLCB4MTUsICMxCisKKwlsZHAJeDQsIHg1LCBbdXBdLCMzMgorCWxkcAl4OCwgeDksIFt2cF0sIzMyCisJQUREU1VCQwl4MTIsIHg0LCB4OAorCUFERFNVQkMJeDEzLCB4NSwgeDkKKwljYnoJeDYsIEwoMykKKwlsZHAJeDQsIHg1LCBbdXAsIy0xNl0KKwlsZHAJeDgsIHg5LCBbdnAsIy0xNl0KKwlleHRyCXgxNywgeDEyLCB4MTUsICMxCisJQUREU1VCQwl4MTQsIHg0LCB4OAorCUFERFNVQkMJeDE1LCB4NSwgeDkKKwlzdHIJeDE3LCBbcnBdLCAjOAorCWIJTChtaWQpCisKK0woMyk6CWV4dHIJeDE3LCB4MTIsIHgxNSwgIzEKKwlzdHIJeDE3LCBbcnBdLCAjOAorCWIJTCgyKQorCitMKGJ4MCk6CXRiegluLCAjMSwgTChiMDApCisKK0woYjEwKToJbGRwCXg0LCB4NSwgW3VwXSwjMzIKKwlsZHAJeDgsIHg5LCBbdnBdLCMzMgorCUFERFNVQgl4MTIsIHg0LCB4OAorCUFERFNVQkMJeDEzLCB4NSwgeDkKKwlhbmQJeDEwLCB4MTIsICMxCisJY2J6CXg2LCBMKDIpCisJbGRwCXg0LCB4NSwgW3VwLCMtMTZdCisJbGRwCXg4LCB4OSwgW3ZwLCMtMTZdCisJQUREU1VCQwl4MTQsIHg0LCB4OAorCUFERFNVQkMJeDE1LCB4NSwgeDkKKwliCUwobWlkKQorCitMKGIwMCk6CWxkcAl4NCwgeDUsIFt1cF0sIzQ4CisJbGRwCXg4LCB4OSwgW3ZwXSwjNDgKKwlBRERTVUIJeDE0LCB4NCwgeDgKKwlBRERTVUJDCXgxNSwgeDUsIHg5CisJYW5kCXgxMCwgeDE0LCAjMQorCWxkcAl4NCwgeDUsIFt1cCwjLTMyXQorCWxkcAl4OCwgeDksIFt2cCwjLTMyXQorCUFERFNVQkMJeDEyLCB4NCwgeDgKKwlBRERTVUJDCXgxMywgeDUsIHg5CisJYWRkCXJwLCBycCwgIzE2CisJc3ViCXg2LCB4NiwgIzEKKwljYnoJeDYsIEwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CWxkcAl4NCwgeDUsIFt1cCwjLTE2XQorCWxkcAl4OCwgeDksIFt2cCwjLTE2XQorCWV4dHIJeDE2LCB4MTUsIHgxNCwgIzEKKwlleHRyCXgxNywgeDEyLCB4MTUsICMxCisJQUREU1VCQwl4MTQsIHg0LCB4OAorCUFERFNVQkMJeDE1LCB4NSwgeDkKKwlzdHAJeDE2LCB4MTcsIFtycCwjLTE2XQorTChtaWQpOglsZHAJeDQsIHg1LCBbdXBdLCMzMgorCWxkcAl4OCwgeDksIFt2cF0sIzMyCisJZXh0cgl4MTYsIHgxMywgeDEyLCAjMQorCWV4dHIJeDE3LCB4MTQsIHgxMywgIzEKKwlBRERTVUJDCXgxMiwgeDQsIHg4CisJQUREU1VCQwl4MTMsIHg1LCB4OQorCXN0cAl4MTYsIHgxNywgW3JwXSwjMzIKKwlzdWIJeDYsIHg2LCAjMQorCWNibnoJeDYsIEwodG9wKQorCitMKGVuZCk6CWV4dHIJeDE2LCB4MTUsIHgxNCwgIzEKKwlleHRyCXgxNywgeDEyLCB4MTUsICMxCisJc3RwCXgxNiwgeDE3LCBbcnAsIy0xNl0KK0woMik6CWNzZXQJeDE0LCBDT05ECisJZXh0cgl4MTYsIHgxMywgeDEyLCAjMQorCWV4dHIJeDE3LCB4MTQsIHgxMywgIzEKKwlzdHAJeDE2LCB4MTcsIFtycF0KKworTChyZXQpOgltb3YJeDAsIHgxMAorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L3JzaGlmdC5hc20gYi9tcG4vYXJtNjQvcnNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIwYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L3JzaGlmdC5hc20KQEAgLTAsMCArMSwxMzYgQEAKK2RubCAgQVJNNjQgbXBuX3JzaGlmdC4KKworZG5sICBDb3B5cmlnaHQgMjAxMywgMjAxNCwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIgICBhc3N1bWVkIG9wdGltYWwgYy9sCitDIENvcnRleC1BNTMJMy41LTQuMAkJIDMuMjUKK0MgQ29ydGV4LUE1NwkgMi4wCQkgMi4wCitDIFgtR2VuZQkgMi42NwkJIDIuNQorCitDIFRPRE8KK0MgICogVGhlIGZlZWQtaW4gY29kZSB1c2VkIDEgbGRyIGZvciBvZGQgc2l6ZWQgYW5kIDIgbGRyIGZvciBldmVuIHNpemVzLiAgVGhlc2UKK0MgICAgbnVtYmVycyBzaG91bGQgYmUgMSBhbmQgMCwgcmVzcGVjdGl2ZWx5LiAgVGhlIHN0ciBpbiB3aW5kLWRvd24gc2hvdWxkIGFsc28KK0MgICAgZ28uCitDICAqIFVzaW5nIGV4dHIgYW5kIHdpdGggNjMgc2VwYXJhdGUgbG9vcHMgd2UgbWlnaHQgcmVhY2ggMS4yNSBjL2wgb24gQTU3LgorQyAgKiBBNTMncyBzcGVlZCBkZXBlbmRzIG9uIGFsaWdubWVudCwgYnV0IG5vdCBhcyBzaW1wbHkgYXMgZm9yIGxzaGlmdC9sc2hpZnRjLgorCitjaGFuZ2Vjb20oYmxhaCkKKworZGVmaW5lKGBycF9hcmcnLCBgeDAnKQorZGVmaW5lKGB1cCcsICAgICBgeDEnKQorZGVmaW5lKGBuJywgICAgICBgeDInKQorZGVmaW5lKGBjbnQnLCAgICBgeDMnKQorCitkZWZpbmUoYHJwJywgICAgIGB4MTYnKQorCitkZWZpbmUoYHRuYycsYHg4JykKKworZGVmaW5lKGBQU0hJRlQnLCBsc3IpCitkZWZpbmUoYE5TSElGVCcsIGxzbCkKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9yc2hpZnQpCisJbW92CXJwLCBycF9hcmcKKwlzdWIJdG5jLCB4enIsIGNudAorCWxzcgl4MTcsIG4sICMyCisJdGJ6CW4sICMwLCBMKGJ4MCkKKworTChieDEpOglsZHIJeDUsIFt1cF0KKwl0Ym56CW4sICMxLCBMKGIxMSkKKworTChiMDEpOglOU0hJRlQJeDAsIHg1LCB0bmMKKwlQU0hJRlQJeDIsIHg1LCBjbnQKKwljYm56CXgxNywgTChndDEpCisJc3RyCXgyLCBbcnBdCisJcmV0CitMKGd0MSk6CWxkcAl4NCwgeDUsIFt1cCwjOF0KKwlzdWIJdXAsIHVwLCAjOAorCXN1YglycCwgcnAsICMzMgorCWIJTChsbzIpCisKK0woYjExKToJTlNISUZUCXgwLCB4NSwgdG5jCisJUFNISUZUCXgyLCB4NSwgY250CisJbGRwCXg2LCB4NywgW3VwLCM4XSEKKwlzdWIJcnAsIHJwLCAjMTYKKwliCUwobG8zKQorCitMKGJ4MCk6CWxkcAl4NCwgeDUsIFt1cF0KKwl0YnoJbiwgIzEsIEwoYjAwKQorCitMKGIxMCk6CU5TSElGVAl4MCwgeDQsIHRuYworCVBTSElGVAl4MTMsIHg0LCBjbnQKKwlOU0hJRlQJeDEwLCB4NSwgdG5jCisJUFNISUZUCXgyLCB4NSwgY250CisJY2Juegl4MTcsIEwoZ3QyKQorCW9ycgl4MTAsIHgxMCwgeDEzCisJc3RwCXgxMCwgeDIsIFtycF0KKwlyZXQKK0woZ3QyKToJbGRwCXg0LCB4NSwgW3VwLCMxNl0KKwlvcnIJeDEwLCB4MTAsIHgxMworCXN0cgl4MTAsIFtycF0sIy0yNAorCWIJTChsbzIpCisKK0woYjAwKToJTlNISUZUCXgwLCB4NCwgdG5jCisJUFNISUZUCXgxMywgeDQsIGNudAorCU5TSElGVAl4MTAsIHg1LCB0bmMKKwlQU0hJRlQJeDIsIHg1LCBjbnQKKwlsZHAJeDYsIHg3LCBbdXAsIzE2XSEKKwlvcnIJeDEwLCB4MTAsIHgxMworCXN0cgl4MTAsIFtycF0sIy04CisJYglMKGxvMCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglsZHAJeDQsIHg1LCBbdXAsIzE2XQorCW9ycgl4MTAsIHgxMCwgeDEzCisJb3JyCXgxMSwgeDEyLCB4MgorCXN0cAl4MTEsIHgxMCwgW3JwLCMxNl0KKwlQU0hJRlQJeDIsIHg3LCBjbnQKK0wobG8yKToJTlNISUZUCXgxMCwgeDUsIHRuYworCU5TSElGVAl4MTIsIHg0LCB0bmMKKwlQU0hJRlQJeDEzLCB4NCwgY250CisJbGRwCXg2LCB4NywgW3VwLCMzMl0hCisJb3JyCXgxMCwgeDEwLCB4MTMKKwlvcnIJeDExLCB4MTIsIHgyCisJc3RwCXgxMSwgeDEwLCBbcnAsIzMyXSEKKwlQU0hJRlQJeDIsIHg1LCBjbnQKK0wobG8wKToJc3ViCXgxNywgeDE3LCAjMQorTChsbzMpOglOU0hJRlQJeDEwLCB4NywgdG5jCisJTlNISUZUCXgxMiwgeDYsIHRuYworCVBTSElGVAl4MTMsIHg2LCBjbnQKKwljYm56CXgxNywgTCh0b3ApCisKK0woZW5kKToJb3JyCXgxMCwgeDEwLCB4MTMKKwlvcnIJeDExLCB4MTIsIHgyCisJUFNISUZUCXgyLCB4NywgY250CisJc3RwCXgxMSwgeDEwLCBbcnAsIzE2XQorCXN0cgl4MiwgW3JwLCMzMl0KKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi9hcm02NC9zZWNfdGFic2VsZWN0LmFzbSBiL21wbi9hcm02NC9zZWNfdGFic2VsZWN0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JkM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2FybTY0L3NlY190YWJzZWxlY3QuYXNtCkBAIC0wLDAgKzEsMTIyIEBACitkbmwgIEFSTTY0IE5lb24gbXBuX3NlY190YWJzZWxlY3QuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMS0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIENvcnRleC1BNTMJIDIuMjUKK0MgQ29ydGV4LUE1NwkgMS4zMworQyBYLUdlbmUJIDIKKworQyB2b2lkCitDIG1wbl9zZWNfdGFic2VsZWN0IChtcF9wdHIgcnAsIG1wX3NyY3B0ciAqdGFiLAorQwkJICAgICBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IG5lbnRzLCBtcF9zaXplX3Qgd2hpY2gpCisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwJywgICAgIGB4MCcpCitkZWZpbmUoYHRwJywgICAgIGB4MScpCitkZWZpbmUoYG4nLCAgICAgIGB4MicpCitkZWZpbmUoYG5lbnRzJywgIGB4MycpCitkZWZpbmUoYHdoaWNoJywgIGB4NCcpCisKK2RlZmluZShgaScsICAgICAgYHg1JykKK2RlZmluZShgaicsICAgICAgYHg2JykKKworZGVmaW5lKGBtYXNrcScsICBgdjQnKQorCitBU01fU1RBUlQoKQorUFJPTE9HVUUobXBuX3NlY190YWJzZWxlY3QpCisJZHVwCXY3LjJkLCB4NAkJCUMgMiBgd2hpY2gnIGNvcGllcworCisJbW92CXgxMCwgIzEKKwlkdXAJdjYuMmQsIHgxMAkJCUMgMiBjb3BpZXMgb2YgMQorCisJc3VicwlqLCBuLCAjNAorCWIubWkJTChvdXRlcl9lbmQpCisKK0wob3V0ZXJfdG9wKToKKwltb3YJaSwgbmVudHMKKwltb3YJeDEyLCB0cAkJCQlDIHByZXNlcnZlIHRwCisJbW92aQl2NS4xNmIsICMwCQkJQyB6ZXJvIDIgY291bnRlciBjb3BpZXMKKwltb3ZpCXYyLjE2YiwgIzAKKwltb3ZpCXYzLjE2YiwgIzAKKwlBTElHTigxNikKK0wodHA0KToJY21lcQltYXNrcS4yZCwgdjUuMmQsIHY3LjJkCQlDIGNvbXBhcmUgaWR4IGNvcGllcyB0byBgd2hpY2gnIGNvcGllcworCWxkMQl7djAuMmQsdjEuMmR9LCBbdHBdCisJYWRkCXY1LjJkLCB2NS4yZCwgdjYuMmQKKwliaXQJdjIuMTZiLCB2MC4xNmIsIG1hc2txLjE2YgorCWJpdAl2My4xNmIsIHYxLjE2YiwgbWFza3EuMTZiCisJYWRkCXRwLCB0cCwgbiwgbHNsICMzCisJc3ViCWksIGksICMxCisJY2JueglpLCBMKHRwNCkKKwlzdDEJe3YyLjJkLHYzLjJkfSwgW3JwXSwgIzMyCisJYWRkCXRwLCB4MTIsICMzMgkJCUMgcmVzdG9yZSB0cCwgcG9pbnQgdG8gbmV4dCBzbGljZQorCXN1YnMJaiwgaiwgIzQKKwliLnBsCUwob3V0ZXJfdG9wKQorTChvdXRlcl9lbmQpOgorCisJdGJ6CW4sICMxLCBMKGIweCkKKwltb3YJaSwgbmVudHMKKwltb3YJeDEyLCB0cAorCW1vdmkJdjUuMTZiLCAjMAkJCUMgemVybyAyIGNvdW50ZXIgY29waWVzCisJbW92aQl2Mi4xNmIsICMwCisJQUxJR04oMTYpCitMKHRwMik6CWNtZXEJbWFza3EuMmQsIHY1LjJkLCB2Ny4yZAorCWxkMQl7djAuMmR9LCBbdHBdCisJYWRkCXY1LjJkLCB2NS4yZCwgdjYuMmQKKwliaXQJdjIuMTZiLCB2MC4xNmIsIG1hc2txLjE2YgorCWFkZAl0cCwgdHAsIG4sIGxzbCAjMworCXN1YglpLCBpLCAjMQorCWNibnoJaSwgTCh0cDIpCisJc3QxCXt2Mi4yZH0sIFtycF0sICMxNgorCWFkZAl0cCwgeDEyLCAjMTYKKworTChiMHgpOgl0YnoJbiwgIzAsIEwoYjAwKQorCW1vdglpLCBuZW50cworCW1vdgl4MTIsIHRwCisJbW92aQl2NS4xNmIsICMwCQkJQyB6ZXJvIDIgY291bnRlciBjb3BpZXMKKwltb3ZpCXYyLjE2YiwgIzAKKwlBTElHTigxNikKK0wodHAxKToJY21lcQltYXNrcS4yZCwgdjUuMmQsIHY3LjJkCisJbGQxCXt2MC4xZH0sIFt0cF0KKwlhZGQJdjUuMmQsIHY1LjJkLCB2Ni4yZAkJQyBGSVhNRSBzaXplIHNob3VsZCBiZSBgMWQnCisJYml0CXYyLjhiLCB2MC44YiwgbWFza3EuOGIKKwlhZGQJdHAsIHRwLCBuLCBsc2wgIzMKKwlzdWIJaSwgaSwgIzEKKwljYm56CWksIEwodHAxKQorCXN0MQl7djIuMWR9LCBbcnBdLCAjOAorCWFkZAl0cCwgeDEyLCAjOAorCitMKGIwMCk6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL2FybTY0L3Nxcl9kaWFnX2FkZGxzaDEuYXNtIGIvbXBuL2FybTY0L3Nxcl9kaWFnX2FkZGxzaDEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWRhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vYXJtNjQvc3FyX2RpYWdfYWRkbHNoMS5hc20KQEAgLTAsMCArMSwxMDIgQEAKK2RubCAgQVJNNjQgbXBuX3Nxcl9kaWFnX2FkZGxzaDEuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxNiwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQ29ydGV4LUE1MwkgNS42NQorQyBDb3J0ZXgtQTU3CSAzLjUKK0MgWC1HZW5lCSAzLjM4CisKK2NoYW5nZWNvbShibGFoKQorCitkZWZpbmUoYHJwJywgYHgwJykKK2RlZmluZShgdHAnLCBgeDEnKQorZGVmaW5lKGB1cCcsIGB4MicpCitkZWZpbmUoYG4nLCAgYHgzJykKKworQVNNX1NUQVJUKCkKK1BST0xPR1VFKG1wbl9zcXJfZGlhZ19hZGRsc2gxKQorCWxkcgl4MTUsIFt1cF0sIzgKKwlsc3IJeDE0LCBuLCAjMQorCXRiegluLCAjMCwgTChieDApCisKK0woYngxKToJYWRkcwl4NywgeHpyLCB4enIKKwltdWwJeDEyLCB4MTUsIHgxNQorCWxkcgl4MTYsIFt1cF0sIzgKKwlsZHAJeDQsIHg1LCBbdHBdLCMxNgorCXVtdWxoCXgxMSwgeDE1LCB4MTUKKwliCUwobWlkKQorCitMKGJ4MCk6CWFkZHMJeDUsIHh6ciwgeHpyCisJbXVsCXgxMiwgeDE1LCB4MTUKKwlsZHIJeDE3LCBbdXBdLCMxNgorCWxkcAl4NiwgeDcsIFt0cF0sIzMyCisJdW11bGgJeDExLCB4MTUsIHgxNQorCXN1Ygl4MTQsIHgxNCwgIzEKKwljYnoJeDE0LCBMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglleHRyCXg5LCB4NiwgeDUsICM2MworCW11bAl4MTAsIHgxNywgeDE3CisJbGRyCXgxNiwgW3VwLCMtOF0KKwlhZGNzCXgxMywgeDksIHgxMQorCWxkcAl4NCwgeDUsIFt0cCwjLTE2XQorCXVtdWxoCXgxMSwgeDE3LCB4MTcKKwlleHRyCXg4LCB4NywgeDYsICM2MworCXN0cAl4MTIsIHgxMywgW3JwXSwjMTYKKwlhZGNzCXgxMiwgeDgsIHgxMAorTChtaWQpOglleHRyCXg5LCB4NCwgeDcsICM2MworCW11bAl4MTAsIHgxNiwgeDE2CisJbGRyCXgxNywgW3VwXSwjMTYKKwlhZGNzCXgxMywgeDksIHgxMQorCWxkcAl4NiwgeDcsIFt0cF0sIzMyCisJdW11bGgJeDExLCB4MTYsIHgxNgorCWV4dHIJeDgsIHg1LCB4NCwgIzYzCisJc3RwCXgxMiwgeDEzLCBbcnBdLCMxNgorCWFkY3MJeDEyLCB4OCwgeDEwCisJc3ViCXgxNCwgeDE0LCAjMQorCWNibnoJeDE0LCBMKHRvcCkKKworTChlbmQpOglleHRyCXg5LCB4NiwgeDUsICM2MworCW11bAl4MTAsIHgxNywgeDE3CisJYWRjcwl4MTMsIHg5LCB4MTEKKwl1bXVsaAl4MTEsIHgxNywgeDE3CisJZXh0cgl4OCwgeDcsIHg2LCAjNjMKKwlzdHAJeDEyLCB4MTMsIFtycF0KKwlhZGNzCXgxMiwgeDgsIHgxMAorCWV4dHIJeDksIHh6ciwgeDcsICM2MworCWFkY3MJeDEzLCB4OSwgeDExCisJc3RwCXgxMiwgeDEzLCBbcnAsIzE2XQorCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4vYXNtLWRlZnMubTQgYi9tcG4vYXNtLWRlZnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyZDlmZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9hc20tZGVmcy5tNApAQCAtMCwwICsxLDE3NjYgQEAKK2RpdmVydCgtMSkKK2RubAorZG5sICBtNCBtYWNyb3MgZm9yIGdtcCBhc3NlbWJseSBjb2RlLCBzaGFyZWQgYnkgYWxsIENQVXMuCisKK2RubCAgQ29weXJpZ2h0IDE5OTktMjAwNiwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2RubCAgVGhlc2UgbWFjcm9zIGFyZSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggYW55IG00IGFuZCBoYXZlIGJlZW4gdXNlZCBvbgorZG5sICBHTlUsIEZyZWVCU0QsIE5ldEJTRCwgT3BlbkJTRCBhbmQgU3lzVi4KK2RubAorZG5sICBHTlUgbTQgYW5kIE9wZW5CU0QgMi43IG00IHdpbGwgZ2l2ZSBmaWxlbmFtZXMgYW5kIGxpbmUgbnVtYmVycyBpbiBlcnJvcgorZG5sICBtZXNzYWdlcy4KK2RubAorZG5sCitkbmwgIE1hY3JvczoKK2RubAorZG5sICBNb3N0IG5ldyBtNCBzcGVjaWZpYyBtYWNyb3MgaGF2ZSBhbiAibTRfIiBwcmVmaXggdG8gZW1waGFzaXNlIHRoZXkncmUKK2RubCAgbTQgZXhwYW5zaW9ucy4gIEJ1dCBuZXcgZGVmaW5pbmcgdGhpbmdzIGxpa2UgZGVmbGl0KCkgYW5kIGRlZnJlZygpIGFyZQorZG5sICBuYW1lZCBsaWtlIHRoZSBidWlsdGluIGRlZmluZSgpLCBhbmQgZm9ybG9vcCgpIGlzIG5hbWVkIGZvbGxvd2luZyB0aGUKK2RubCAgR05VIG00IGV4YW1wbGUgb24gd2hpY2ggaXQncyBiYXNlZC4KK2RubAorZG5sICBHTlUgbTQgd2l0aCB0aGUgLVAgb3B0aW9uIHVzZXMgIm00XyIgYXMgYSBwcmVmaXggZm9yIGJ1aWx0aW5zLCBidXQgdGhhdAorZG5sICBvcHRpb24gaXNuJ3QgZ29pbmcgdG8gYmUgdXNlZCwgc28gdGhlcmUncyBubyBjb25mbGljdCBvciBjb25mdXNpb24uCitkbmwKK2RubAorZG5sICBDb21tZW50cyBpbiBvdXRwdXQ6CitkbmwKK2RubCAgVGhlIG00IGNvbW1lbnQgZGVsaW1pdGVycyBhcmUgbGVmdCBhdCAjIGFuZCBcbiwgdGhlIG5vcm1hbCBhc3NlbWJsZXIKK2RubCAgY29tbWVudGluZyBmb3IgbW9zdCBDUFVzLiAgbTQgcGFzc2VzIGNvbW1lbnQgdGV4dCB0aHJvdWdoIHdpdGhvdXQKK2RubCAgZXhwYW5kaW5nIG1hY3JvcyBpbiBpdCwgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgZ29vZCB0aGluZyBzaW5jZSBpdCBzdG9wcworZG5sICB1bmV4cGVjdGVkIGV4cGFuc2lvbnMgYW5kIHBvc3NpYmxlIHJlc3VsdGFudCBlcnJvcnMuCitkbmwKK2RubCAgQnV0IG5vdGUgdGhhdCB3aGVuIGEgcXVvdGVkIHN0cmluZyBpcyBiZWluZyByZWFkLCBhICMgaXNuJ3Qgc3BlY2lhbCwgc28KK2RubCAgYXBvc3Ryb3BoZXMgaW4gY29tbWVudHMgaW4gcXVvdGVkIHN0cmluZ3MgbXVzdCBiZSBhdm9pZGVkIG9yIHRoZXknbGwgYmUKK2RubCAgaW50ZXJwcmV0ZWQgYXMgYSBjbG9zaW5nIHF1b3RlIG1hcmsuICBCdXQgd2hlbiB0aGUgcXVvdGVkIHRleHQgaXMKK2RubCAgcmUtcmVhZCAjIHdpbGwgc3RpbGwgYWN0IGxpa2UgYSBub3JtYWwgY29tbWVudCwgc3VwcHJlc3NpbmcgbWFjcm8KK2RubCAgZXhwYW5zaW9uLgorZG5sCitkbmwgIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICAgIyBhcG9zdHJvcGhlcyBpbiBjb21tZW50cyB0aGF0J3JlIG91dHNpZGUgcXVvdGVzIGFyZSBvaworZG5sICAgICAgICAgICMgYW5kIHVzaW5nIG1hY3JvIG5hbWVzIGxpa2UgUFJPTE9HVUUgaXMgb2sgdG9vCitkbmwgICAgICAgICAgLi4uCitkbmwgICAgICAgICAgaWZkZWYoYFBJQycsYAorZG5sICAgICAgICAgICAgICAgICAgIyBidXQgYXBvc3Ryb3BoZXMgYXJlbid0IG9rIGluc2lkZSBxdW90ZXMKK2RubCAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICBeLS13cm9uZworZG5sICAgICAgICAgICAgICAgICAgLi4uCitkbmwgICAgICAgICAgICAgICAgICAjIHRob3VnaCBtYWNybyBuYW1lcyBsaWtlIFBST0xPR1VFIGFyZSBzdGlsbCBvaworZG5sICAgICAgICAgICAgICAgICAgLi4uCitkbmwgICAgICAgICAgJykKK2RubAorZG5sICBJZiBtYWNybyBleHBhbnNpb24gaW4gYSBjb21tZW50IGlzIHdhbnRlZCwgdXNlIGAjJyBpbiB0aGUgLmFzbSAoaWUuIGEKK2RubCAgcXVvdGVkIGhhc2ggc3ltYm9sKSwgd2hpY2ggd2lsbCB0dXJuIGludG8gIyBpbiB0aGUgLnMgYnV0IGdldAorZG5sICBleHBhbnNpb25zIGRvbmUgb24gdGhhdCBsaW5lLiAgVGhpcyBjYW4gbWFrZSB0aGUgLnMgbW9yZSByZWFkYWJsZSB0bworZG5sICBodW1hbnMsIGJ1dCBpdCB3b24ndCBtYWtlIGEgYmxpbmQgYml0IG9mIGRpZmZlcmVuY2UgdG8gdGhlIGFzc2VtYmxlci4KK2RubAorZG5sICBBbGwgdGhlIGFib3ZlIGFwcGxpZXMsIG11dGF0aXMgbXV0YW5kaXMsIHdoZW4gY2hhbmdlY29tKCkgaXMgdXNlZCB0bworZG5sICBzZWxlY3QgQCAhIDsgb3Igd2hhdGV2ZXIgb3RoZXIgY29tbWVudGluZy4KK2RubAorZG5sCitkbmwgIFZhcmlhdGlvbnMgaW4gbTQgYWZmZWN0aW5nIGdtcDoKK2RubAorZG5sICAkIyAtIFdoZW4gYSBtYWNybyBpcyBjYWxsZWQgYXMgImZvbyIgd2l0aCBubyBicmFja2V0cywgQlNEIG00IHNldHMgJCMKK2RubCAgICAgICB0byAxLCB3aGVyZWFzIEdOVSBvciBTeXNWIG00IHNldCBpdCB0byAwLiAgSW4gYWxsIGNhc2VzIHRob3VnaAorZG5sICAgICAgICJmb28oKSIgc2V0cyAkIyB0byAxLiAgVGhpcyBpcyB3b3JrZWQgYXJvdW5kIGluIHZhcmlvdXMgcGxhY2VzLgorZG5sCitkbmwgIGxlbigpIC0gV2hlbiAibGVuKCkiIGlzIGdpdmVuIGFuIGVtcHR5IGFyZ3VtZW50LCBCU0QgbTQgZXZhbHVhdGVzIHRvCitkbmwgICAgICAgbm90aGluZywgd2hlcmVhcyBHTlUsIFN5c1YsIGFuZCB0aGUgbmV3IE9wZW5CU0QsIGV2YWx1YXRlIHRvIDAuCitkbmwgICAgICAgU2VlIG00X2xlbmd0aCgpIGJlbG93IHdoaWNoIHdvcmtzIGFyb3VuZCB0aGlzLgorZG5sCitkbmwgIHRyYW5zbGl0KCkgLSBHTlUgbTQgYWNjZXB0cyBjaGFyYWN0ZXIgcmFuZ2VzIGxpa2UgQS1aLCBhbmQgdGhlIG5ldworZG5sICAgICAgIE9wZW5CU0QgbTQgZG9lcyB1bmRlciBvcHRpb24gLWcsIGJ1dCBiYXNpYyBCU0QgYW5kIFN5c1YgZG9uJ3QuCitkbmwKK2RubCAgcG9wZGVmKCkgLSBpbiBCU0QgYW5kIFN5c1YgbTQgcG9wZGVmKCkgdGFrZXMgbXVsdGlwbGUgYXJndW1lbnRzIGFuZAorZG5sICAgICAgIHBvcHMgZWFjaCwgYnV0IEdOVSBtNCBvbmx5IHRha2VzIG9uZSBhcmd1bWVudC4KK2RubAorZG5sICBwdXNoIGJhY2sgLSBCU0QgbTQgaGFzIHNvbWUgbGltaXRzIG9uIHRoZSBhbW91bnQgb2YgdGV4dCB0aGF0IGNhbiBiZQorZG5sICAgICAgIHB1c2hlZCBiYWNrLiAgVGhlIGxpbWl0IGlzIHJlYXNvbmFibHkgYmlnIGFuZCBzbyBsb25nIGFzIG1hY3JvcworZG5sICAgICAgIGRvbid0IGdyYXR1aXRvdXNseSBkdXBsaWNhdGUgYmlnIGFyZ3VtZW50cyBpdCBpc24ndCBhIHByb2JsZW0uCitkbmwgICAgICAgTm9ybWFsbHkgYW4gZXJyb3IgbWVzc2FnZSBpcyBnaXZlbiwgYnV0IHNvbWV0aW1lcyBpdCBqdXN0IGhhbmdzLgorZG5sCitkbmwgIGV2YWwoKSAmLHwsXiAtIEdOVSBhbmQgU3lzViBtNCBoYXZlIGJpdHdpc2Ugb3BlcmF0b3JzICYsfCxeIGF2YWlsYWJsZSwKK2RubCAgICAgICBidXQgQlNEIG00IGRvZXNuJ3QgKGNvbnRyYXJ5IHRvIHdoYXQgdGhlIG1hbiBwYWdlIHN1Z2dlc3RzKSBhbmQKK2RubCAgICAgICBpbnN0ZWFkIF4gaXMgZXhwb25lbnRpYXRpb24uCitkbmwKK2RubCAgZXZhbCgpID86IC0gVGhlIEMgdGVybmFyeSBvcGVyYXRvciAiPzoiIGlzIGF2YWlsYWJsZSBpbiBCU0QgbTQsIGJ1dCBub3QKK2RubCAgICAgICBpbiBTeXNWIG9yIEdOVSBtNCAoYXMgb2YgR05VIG00IDEuNCBhbmQgYmV0YXMgb2YgMS41KS4KK2RubAorZG5sICBldmFsKCkgLTJeMzEgLSBCU0QgbTQgaGFzIGEgYnVnIHdoZXJlIGFuIGV2YWwoKSByZXN1bHRpbmcgaW4gLTJeMzEKK2RubCAgICAgICAoaWUuIC0yMTQ3NDgzNjQ4KSBnaXZlcyAiLSgiLiAgVXNpbmcgLTIxNDc0ODM2NDggd2l0aGluIGFuCitkbmwgICAgICAgZXhwcmVzc2lvbiBpcyBvaywgaXQganVzdCBjYW4ndCBiZSBhIGZpbmFsIHJlc3VsdC4gICItKCIgd2lsbCBvZgorZG5sICAgICAgIGNvdXJzZSB1cHNldCBwYXJzaW5nLCB3aXRoIGFsbCBzb3J0cyBvZiBzdHJhbmdlIGVmZmVjdHMuCitkbmwKK2RubCAgZXZhbCgpIDw8LD4+IC0gU3lzViBtNCBkb2Vzbid0IHN1cHBvcnQgc2hpZnQgb3BlcmF0b3JzIGluIGV2YWwoKSAob24KK2RubCAgICAgICBTb2xhcmlzIDcgL3Vzci94cGc0L200IGhhcyB0aGVtIGJ1dCAvdXNyL2Njcy9tNCBkb2Vzbid0KS4gIFNlZQorZG5sICAgICAgIG00X2xzaGlmdCgpIGFuZCBtNF9yc2hpZnQoKSBiZWxvdyBmb3Igd29ya2Fyb3VuZHMuCitkbmwKK2RubCAgaWZkZWYoKSAtIE9TRiA0LjAgbTQgY29uc2lkZXJzIGEgbWFjcm8gZGVmaW5lZCB0byBhIHplcm8gdmFsdWUgYDAnIG9yCitkbmwgICAgICAgYDAwJyBldGMgYXMgbm90IGRlZmluZWQuICBTZWUgbTRfaWZkZWYgYmVsb3cgZm9yIGEgd29ya2Fyb3VuZC4KK2RubAorZG5sICBtNHdyYXAoKSBzZXF1ZW5jZSAtIGluIEJTRCBtNCwgbTR3cmFwKCkgcmVwbGFjZXMgYW55IHByZXZpb3VzIG00d3JhcCgpCitkbmwgICAgICAgc3RyaW5nLCBpbiBTeXNWIG00IGl0IGFwcGVuZHMgdG8gaXQsIGFuZCBpbiBHTlUgbTQgaXQgcHJlcGVuZHMuCitkbmwgICAgICAgU2VlIG00d3JhcF9wcmVwZW5kKCkgYmVsb3cgd2hpY2ggYnJpbmdzIHVuaWZvcm1pdHkgdG8gdGhpcy4KK2RubAorZG5sICBtNHdyYXAoKSAweEZGIC0gb2xkIHZlcnNpb25zIG9mIEJTRCBtNCBzdG9yZSBFT0YgaW4gYSBDICJjaGFyIiB1bmRlciBhbgorZG5sICAgICAgIG00d3JhcCgpIGFuZCBvbiBzeXN0ZW1zIHdoZXJlIGNoYXIgaXMgdW5zaWduZWQgYnkgZGVmYXVsdCBhCitkbmwgICAgICAgc3B1cmlvdXMgMHhGRiBpcyBvdXRwdXQuICBUaGlzIGhhcyBiZWVuIG9ic2VydmVkIG9uIHJlY2VudCBDcmF5CitkbmwgICAgICAgVW5pY29zIEFscGhhLCBBcHBsZSBNYWNPUyBYLCBhbmQgSFBVWCAxMSBzeXN0ZW1zLiAgQW4gYXV0b2NvbmYKK2RubCAgICAgICB0ZXN0IGlzIHVzZWQgdG8gY2hlY2sgZm9yIHRoaXMsIHNlZSB0aGUgbTR3cmFwIGhhbmRsaW5nIGJlbG93LiAgSXQKK2RubCAgICAgICBtaWdodCB3b3JrIHRvIGVuZCB0aGUgbTR3cmFwIHN0cmluZyB3aXRoIGEgZG5sIHRvIGNvbnN1bWUgdGhlCitkbmwgICAgICAgMHhGRiwgYnV0IHRoYXQgcHJvYmFibHkgaW5kdWNlcyB0aGUgb2ZmZW5kaW5nIG00J3MgdG8gcmVhZCBmcm9tIGFuCitkbmwgICAgICAgYWxyZWFkeSBjbG9zZWQgIkZJTEUgKiIsIHdoaWNoIGNvdWxkIGJlIGJhZCBvbiBhIGdsaWJjIHN0eWxlCitkbmwgICAgICAgc3RkaW8uCitkbmwKK2RubCAgX19maWxlX18sX19saW5lX18gLSBHTlUgbTQgYW5kIE9wZW5CU0QgMi43IG00IHByb3ZpZGUgdGhlc2UsIGFuZAorZG5sICAgICAgIHRoZXkncmUgdXNlZCBoZXJlIHRvIG1ha2UgZXJyb3IgbWVzc2FnZXMgbW9yZSBpbmZvcm1hdGl2ZS4gIEdOVSBtNAorZG5sICAgICAgIGdpdmVzIGFuIHVuaGVscGZ1bCAiTk9ORSAwIiBpbiBhbiBtNHdyYXAoKSwgYnV0IHRoYXQncyB3b3JrZWQKK2RubCAgICAgICBhcm91bmQuCitkbmwKK2RubCAgX19maWxlX18gcXVvdGluZyAtIE9wZW5CU0QgbTQsIHVubGlrZSBHTlUgbTQsIGRvZXNuJ3QgcXVvdGUgdGhlCitkbmwgICAgICAgZmlsZW5hbWUgaW4gX19maWxlX18sIHNvIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRoYXQgbm8gbWFjcm8gaGFzCitkbmwgICAgICAgdGhlIHNhbWUgbmFtZSBhcyBhIGZpbGUsIG9yIGFuIHVud2FudGVkIGV4cGFuc2lvbiB3aWxsIG9jY3VyIHdoZW4KK2RubCAgICAgICBwcmludGluZyBhbiBlcnJvciBvciB3YXJuaW5nLgorZG5sCitkbmwgIGNoYW5nZWNvbSgpIC0gQlNEIG00IGNoYW5nZWNvbSBkb2Vzbid0IHF1aXRlIHdvcmsgbGlrZSB0aGUgbWFuIHBhZ2UKK2RubCAgICAgICBzdWdnZXN0cywgaW4gcGFydGljdWxhciAiY2hhbmdlY29tIiBvciAiY2hhbmdlY29tKCkiIGRvZXNuJ3QKK2RubCAgICAgICBkaXNhYmxlIHRoZSBjb21tZW50IGZlYXR1cmUsIGFuZCBtdWx0aS1jaGFyYWN0ZXIgY29tbWVudCBzZXF1ZW5jZXMKK2RubCAgICAgICBkb24ndCBzZWVtIHRvIHdvcmsuICBJZiB0aGUgZGVmYXVsdCBgIycgYW5kIG5ld2xpbmUgYXJlbid0CitkbmwgICAgICAgc3VpdGFibGUgaXQncyBuZWNlc3NhcnkgdG8gY2hhbmdlIGl0IHRvIHNvbWV0aGluZyBlbHNlLAorZG5sICAgICAgIGVnLiBjaGFuZ2Vjb20oOykuCitkbmwKK2RubCAgT3BlbkJTRCAyLjYgbTQgLSBpbiB0aGlzIG00LCBldmFsKCkgcmVqZWN0cyBkZWNpbWFsIGNvbnN0YW50cyBjb250YWluaW5nCitkbmwgICAgICAgYW4gOCBvciA5LCBtYWtpbmcgaXQgcHJldHR5IG11Y2ggdW51c2FibGUuICBUaGUgYnVnIGlzIGNvbmZpbmVkIHRvCitkbmwgICAgICAgdmVyc2lvbiAyLjYgKGl0J3Mgbm90IGluIDIuNSwgYW5kIHdhcyBmaXhlZCBpbiAyLjcpLgorZG5sCitkbmwgIFN1bk9TIC91c3IvYmluL200IC0gdGhpcyBtNCBsYWNrcyBhIG51bWJlciBvZiBkZXNpcmVkIGZlYXR1cmVzLAorZG5sICAgICAgIGluY2x1ZGluZyAkIyBhbmQgJEAsIGRlZm4oKSwgbTRleGl0KCksIG00d3JhcCgpLCBwdXNoZGVmKCksCitkbmwgICAgICAgcG9wZGVmKCkuICAvdXNyLzViaW4vbTQgaXMgYSBTeXNWIHN0eWxlIG00IHdoaWNoIHNob3VsZCBhbHdheXMgYmUKK2RubCAgICAgICBhdmFpbGFibGUsIGFuZCAiY29uZmlndXJlIiB3aWxsIHJlamVjdCAvdXNyL2Jpbi9tNCBpbiBmYXZvdXIgb2YKK2RubCAgICAgICAvdXNyLzViaW4vbTQgKGlmIG5lY2Vzc2FyeSkuCitkbmwKK2RubCAgICAgICBUaGUgc3BhcmMgY29kZSBhY3R1YWxseSBoYXMgbW9kZXN0IG00IHJlcXVpcmVtZW50cyBjdXJyZW50bHkgYW5kCitkbmwgICAgICAgY291bGQgbWFuYWdlIHdpdGggL3Vzci9iaW4vbTQsIGJ1dCB0aGVyZSdzIG5vIHJlYXNvbiB0byBwdXQgb3VyCitkbmwgICAgICAgbWFjcm9zIHRocm91Z2ggY29udG9ydGlvbnMgd2hlbiAvdXNyLzViaW4vbTQgaXMgYXZhaWxhYmxlIG9yIEdOVQorZG5sICAgICAgIG00IGNhbiBiZSBpbnN0YWxsZWQuCisKKworaWZkZWYoYF9fQVNNX0RFRlNfTTRfSU5DTFVERURfXycsCitgbTRfZXJyb3IoYGFzbS1kZWZzLm00IGFscmVhZHkgaW5jbHVkZWQsIGRvbnQgaW5jbHVkZSBpdCB0d2ljZQorJyltNGV4aXQoMSknKQorZGVmaW5lKGBfX0FTTV9ERUZTX000X0lOQ0xVREVEX18nKQorCisKK2RubCAgRGV0ZWN0IGFuZCBnaXZlIGEgbWVzc2FnZSBhYm91dCB0aGUgdW5zdWl0YWJsZSBPcGVuQlNEIDIuNiBtNC4KKworaWZlbHNlKGV2YWwoODkpLDg5LCwKK2BlcnJwcmludCgKK2BUaGlzIG00IGRvZXNudCBhY2NlcHQgOCBhbmQvb3IgOSBpbiBjb25zdGFudHMgaW4gZXZhbCgpLCBtYWtpbmcgaXQgdW51c2FibGUuCitUaGlzIGlzIHByb2JhYmx5IE9wZW5CU0QgMi42IG00IChTZXB0ZW1iZXIgMTk5OSkuICBVcGdyYWRlIHRvIE9wZW5CU0QgMi43LAorb3IgZ2V0IGEgYnVnIGZpeCBmcm9tIHRoZSBDVlMgKGV4cHIuYyByZXYgMS45KSwgb3IgZ2V0IEdOVSBtNC4gIERvbnQgZm9yZ2V0Cit0byBjb25maWd1cmUgd2l0aCBNND0vd2hlcmV2ZXIvbTQgaWYgeW91IGluc3RhbGwgb25lIG9mIHRoZXNlIGluIGEgZGlyZWN0b3J5Citub3QgaW4gJFBBVEguCisnKW00ZXhpdCgxKScpCisKKworZG5sICBEZXRlY3QgYW5kIGdpdmUgYSBtZXNzYWdlIGFib3V0IHRoZSB1bnN1aXRhYmxlIFN1bk9TIC91c3IvYmluL200LgorZG5sCitkbmwgIFVuZm9ydHVuYXRlbHkgdGhpcyB0ZXN0IGRvZXNuJ3Qgd29yayB3aGVuIG00IGlzIHJ1biBpbiB0aGUgbm9ybWFsIHdheQorZG5sICBmcm9tIG1wbi9NYWtlZmlsZSB3aXRoICJtNCAtRE9QRVJBVElPTl9mb28gZm9vLmFzbSIsIHNpbmNlIHRoZSBiYWQgbTQKK2RubCAgdGFrZXMgIi0iIGluICItRC4uLiIgdG8gbWVhbiByZWFkIHN0ZGluLCBzbyBpdCB3aWxsIGxvb2sgbGlrZSBpdCBqdXN0CitkbmwgIGhhbmdzLiAgQnV0IHJ1bm5pbmcgIm00IGFzbS1kZWZzLm00IiB0byB0cnkgaXQgb3V0IHdpbGwgd29yay4KK2RubAorZG5sICBXZSdkIGxpa2UgdG8gYWJvcnQgaW1tZWRpYXRlbHkgb24gZmluZGluZyBhIHByb2JsZW0sIGJ1dCB1bmZvcnR1bmF0ZWx5CitkbmwgIHRoZSBiYWQgbTQgZG9lc24ndCBoYXZlIGFuIG00ZXhpdCgpLCBub3IgZG9lcyBhbiBpbnZhbGlkIGV2YWwoKSBraWxsCitkbmwgIGl0LiAgVW5leHBhbmRlZCAkIydzIGluIHNvbWUgbTRfYXNzZXJ0X251bWFyZ3MoKSBsYXRlciBvbiB3aWxsIGNvbW1lbnQKK2RubCAgb3V0IHNvbWUgY2xvc2luZyBwYXJlbnRoZXNlcyBhbmQga2lsbCBpdCB3aXRoICJtNDogYXJnIHN0YWNrIG92ZXJmbG93Ii4KKworZGVmaW5lKG00X2RvbGxhcmhhc2hfd29ya3NfdGVzdCxgYCQjJycpCitpZmVsc2UobTRfZG9sbGFyaGFzaF93b3Jrc190ZXN0KHgpLDEsLAorYGVycnByaW50KAorYFRoaXMgbTQgZG9lc250IHN1cHBvcnQgJCMgYW5kIGNhbnQgYmUgdXNlZCBmb3IgR01QIGFzbSBwcm9jZXNzaW5nLgorSWYgdGhpcyBpcyBvbiBTdW5PUywgLi9jb25maWd1cmUgc2hvdWxkIGNob29zZSAvdXNyLzViaW4vbTQgaWYgeW91IGhhdmUgdGhhdAorb3IgY2FuIGdldCBpdCwgb3RoZXJ3aXNlIGluc3RhbGwgR05VIG00LiAgRG9udCBmb3JnZXQgdG8gY29uZmlndXJlIHdpdGgKK000PS93aGVyZXZlci9tNCBpZiB5b3UgaW5zdGFsbCBpbiBhIGRpcmVjdG9yeSBub3QgaW4gJFBBVEguCisnKScpCit1bmRlZmluZShgbTRfZG9sbGFyaGFzaF93b3Jrc190ZXN0JykKKworCitkbmwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkbmwgIEJhc2ljIGVycm9yIGhhbmRsaW5nIHRoaW5ncy4KKworCitkbmwgIFVzYWdlOiBtNF9kb2xsYXJoYXNoXzFfaWZfbm9wYXJlbl9wCitkbmwKK2RubCAgRXhwYW5kIHRvIDEgaWYgYSBjYWxsICJmb28iIGdpdmVzICQjIHNldCB0byAxIChhcyBvcHBvc2VkIHRvIDAgbGlrZSBHTlUKK2RubCAgYW5kIFN5c1YgbTQgZ2l2ZSkuCisKK2RlZmluZShtNF9kb2xsYXJoYXNoXzFfaWZfbm9wYXJlbl90ZXN0LGAkIycpCitkZWZpbmUobTRfZG9sbGFyaGFzaF8xX2lmX25vcGFyZW5fcCwKK2V2YWwobTRfZG9sbGFyaGFzaF8xX2lmX25vcGFyZW5fdGVzdD09MSkpCit1bmRlZmluZShgbTRfZG9sbGFyaGFzaF8xX2lmX25vcGFyZW5fdGVzdCcpCisKKworZG5sICBVc2FnZTogbTR3cmFwX3ByZXBlbmQoc3RyaW5nKQorZG5sCitkbmwgIFByZXBlbmQgdGhlIGdpdmVuIHN0cmluZyB0byB3aGF0IHdpbGwgYmUgZXhwYW5kZWQgdW5kZXIgbTR3cmFwIGF0IHRoZQorZG5sICBlbmQgb2YgaW5wdXQuCitkbmwKK2RubCAgVGhpcyBtYWNybyBleGlzdHMgdG8gd29yayBhcm91bmQgdmFyaWF0aW9ucyBpbiBtNHdyYXAoKSBiZWhhdmlvdXIgaW4KK2RubCAgdGhlIHZhcmlvdXMgbTRzIChub3RlcyBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmaWxlKS4gIERvbid0IHVzZSBtNHdyYXAoKQorZG5sICBkaXJlY3RseSBzaW5jZSBpdCB3aWxsIGludGVyZmVyZSB3aXRoIHRoaXMgc2NoZW1lLgorCitkZWZpbmUobTR3cmFwX3ByZXBlbmQsCittNF9hc3NlcnRfbnVtYXJncygxKQorYGRlZmluZShgbTR3cmFwX3N0cmluZycsYCQxJ2RlZm4oYG00d3JhcF9zdHJpbmcnKSknKQorCitkZWZpbmUobTR3cmFwX3N0cmluZyxgJykKKworZGVmaW5lKG00d3JhcF93b3Jrc19wLAorYGlmZWxzZShNNFdSQVBfU1BVUklPVVMseWVzLDAsMSknKQorCitpZmVsc2UobTR3cmFwX3dvcmtzX3AsMSwKK2BtNHdyYXAoYG00d3JhcF9zdHJpbmcnKScpCisKKworZG5sICBVc2FnZTogbTRfZmlsZV9hbmRfbGluZQorZG5sCitkbmwgIEV4cGFuZCB0byB0aGUgY3VycmVudCBmaWxlIGFuZCBsaW5lIG51bWJlciwgaWYgdGhlIEdOVSBtNCBleHRlbnNpb25zCitkbmwgIF9fZmlsZV9fIGFuZCBfX2xpbmVfXyBhcmUgYXZhaWxhYmxlLgorZG5sCitkbmwgIEluIEdOVSBtNCAxLjQgYXQgdGhlIGVuZCBvZiBpbnB1dCB3aGVuIG00d3JhcCB0ZXh0IGlzIGV4cGFuZGVkLAorZG5sICBfX2ZpbGVfXyBpcyBOT05FIGFuZCBfX2xpbmVfXyBpcyAwLCB3aGljaCBpcyBub3QgYSBoZWxwZnVsIHRoaW5nIHRvCitkbmwgIHByaW50LiAgSWYgbTRfZmlsZV9zZWVuKCkgaGFzIGJlZW4gY2FsbGVkIHRvIG5vdGUgdGhlIGxhc3QgZmlsZSBzZWVuLAorZG5sICB0aGVuIHRoYXQgZmlsZSBhdCBhIGJpZyBsaW5lIG51bWJlciBpcyB1c2VkLCBvdGhlcndpc2UgImVuZCBvZiBpbnB1dCIKK2RubCAgaXMgdXNlZCAoYWx0aG91Z2ggImVuZCBvZiBpbnB1dCIgd29uJ3QgcGFyc2UgYXMgYW4gZXJyb3IgbWVzc2FnZSkuCisKK2RlZmluZShtNF9maWxlX2FuZF9saW5lLAorYGlmZGVmKGBfX2ZpbGVfXycsCitgaWZlbHNlKF9fZmlsZV9fYCdfX2xpbmVfXyxgTk9ORTAnLAorYGlmZGVmKGBtNF9maWxlX3NlZW5fbGFzdCcsYG00X2ZpbGVfc2Vlbl9sYXN0OiA5OTk5OTk6ICcsYGVuZCBvZiBpbnB1dDogJyknLAorYF9fZmlsZV9fOiBfX2xpbmVfXzogJyknKScpCisKKworZG5sICBVc2FnZTogbTRfZXJycHJpbnRfY29tbWFzKGFyZywuLi4pCitkbmwKK2RubCAgVGhlIHNhbWUgYXMgZXJycHJpbnQoKSwgYnV0IGNvbW1hcyBhcmUgcHJpbnRlZCBiZXR3ZWVuIGFyZ3VtZW50cworZG5sICBpbnN0ZWFkIG9mIHNwYWNlcy4KKworZGVmaW5lKG00X2VycnByaW50X2NvbW1hcywKK2BlcnJwcmludChgJDEnKWRubAoraWZlbHNlKGV2YWwoJCM+MSksMSxgZXJycHJpbnQoYCwnKW00X2VycnByaW50X2NvbW1hcyhzaGlmdCgkQCkpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X2Vycm9yKGFyZ3MuLi4pCitkbmwgICAgICAgICBtNF93YXJuaW5nKGFyZ3MuLi4pCitkbmwKK2RubCAgUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSwgdXNpbmcgbTRfZXJycHJpbnRfY29tbWFzLCBwcmVmaXhlZCB3aXRoIHRoZQorZG5sICBjdXJyZW50IGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciAoaWYgYXZhaWxhYmxlKS4gIG00X2Vycm9yIHNldHMgdXAgdG8KK2RubCAgZ2l2ZSBhbiBlcnJvciBleGl0IGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZywgbTRfd2FybmluZyBqdXN0IHByaW50cy4KK2RubCAgVGhlc2UgbWFjcm9zIGFyZSB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIHByaW50IGVycm9ycy4KK2RubAorZG5sICBUaGUgYXJndW1lbnRzIGhlcmUgc2hvdWxkIGJlIHF1b3RlZCBpbiB0aGUgdXN1YWwgd2F5IHRvIHByZXZlbnQgdGhlbQorZG5sICBiZWluZyBleHBhbmRlZCB3aGVuIHRoZSBtYWNybyBjYWxsIGlzIHJlYWQuICAobTRfZXJyb3IgdGFrZXMgY2FyZSBub3QKK2RubCAgdG8gZG8gYW55IGZ1cnRoZXIgZXhwYW5zaW9uLikKK2RubAorZG5sICBGb3IgZXhhbXBsZSwKK2RubAorZG5sICAgICAgICAgbTRfZXJyb3IoYHNvbWUgZXJyb3IgbWVzc2FnZQorZG5sICAgICAgICAgJykKK2RubAorZG5sICB3aGljaCBwcmludHMKK2RubAorZG5sICAgICAgICAgZm9vLmFzbToxMjM6IHNvbWUgZXJyb3IgbWVzc2FnZQorZG5sCitkbmwgIG9yIGlmIF9fZmlsZV9fIGFuZCBfX2xpbmVfXyBhcmVuJ3QgYXZhaWxhYmxlCitkbmwKK2RubCAgICAgICAgIHNvbWUgZXJyb3IgbWVzc2FnZQorZG5sCitkbmwgIFRoZSAiZmlsZTpsaW5lOiIgZm9ybWF0IGlzIGEgYmFzaWMgc3R5bGUsIHVzZWQgYnkgZ2NjIGFuZCBHTlUgbTQsIHNvCitkbmwgIGVtYWNzIGFuZCBvdGhlciBlZGl0b3JzIHdpbGwgcmVjb2duaXNlIGl0IGluIHRoZWlyIG5vcm1hbCBlcnJvciBtZXNzYWdlCitkbmwgIHBhcnNpbmcuCisKK2RlZmluZShtNF93YXJuaW5nLAorYG00X2VycnByaW50X2NvbW1hcyhtNF9maWxlX2FuZF9saW5lYCckQCknKQorCitkZWZpbmUobTRfZXJyb3IsCitgZGVmaW5lKGBtNF9lcnJvcl9vY2N1cnJlZCcsMSltNF93YXJuaW5nKCRAKWRubAoraWZlbHNlKG00d3JhcF93b3Jrc19wLDAsYG00ZXhpdCgxKScpJykKKworZGVmaW5lKGBtNF9lcnJvcl9vY2N1cnJlZCcsMCkKKworZG5sICBUaGlzIG00d3JhcF9wcmVwZW5kKCkgaXMgZmlyc3QsIHNvIGl0J2xsIGJlIGV4ZWN1dGVkIGxhc3QuCittNHdyYXBfcHJlcGVuZCgKK2BpZmVsc2UobTRfZXJyb3Jfb2NjdXJyZWQsMSwKK2BtNF9lcnJvcihgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBtNCBwcm9jZXNzaW5nCisnKW00ZXhpdCgxKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9hc3NlcnRfbnVtYXJncyhudW0pCitkbmwKK2RubCAgUHV0IHRoaXMgdW5xdW90ZWQgb24gYSBsaW5lIG9uIGl0cyBvd24gYXQgdGhlIHN0YXJ0IG9mIGEgbWFjcm8KK2RubCAgZGVmaW5pdGlvbiB0byBhZGQgc29tZSBjb2RlIHRvIGNoZWNrIHRoYXQgbnVtIG1hbnkgYXJndW1lbnRzIGdldCBwYXNzZWQKK2RubCAgdG8gdGhlIG1hY3JvLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZmluZShmb28sCitkbmwgICAgICAgICBtNF9hc3NlcnRfbnVtYXJncygyKQorZG5sICAgICAgICAgYHNvbWV0aGluZyBgJDEnIGFuZCBgJDInIGJsYWggYmxhaCcpCitkbmwKK2RubCAgVGhlbiBhIGNhbGwgbGlrZSBmb28ob25lLHR3byx0aHJlZSkgd2lsbCBwcm92b2tlIGFuIGVycm9yIGxpa2UKK2RubAorZG5sICAgICAgICAgZmlsZToxMDogZm9vIGV4cGVjdGVkIDIgYXJndW1lbnRzLCBnb3QgMyBhcmd1bWVudHMKK2RubAorZG5sICBIZXJlIGFyZSBzb21lIGNhbGxzIGFuZCBob3cgbWFueSBhcmd1bWVudHMgdGhleSdyZSBpbnRlcnByZXRlZCBhcyBwYXNzaW5nLgorZG5sCitkbmwgICAgICAgICBmb28oYWJjLGRlZikgIDIKK2RubCAgICAgICAgIGZvbyh4eXopICAgICAgMQorZG5sICAgICAgICAgZm9vKCkgICAgICAgICAwCitkbmwgICAgICAgICBmb28gICAgICAgICAgLTEKK2RubAorZG5sICBUaGUgLTEgZm9yIG5vIHBhcmVudGhlc2VzIGF0IGFsbCBtZWFucyBhIG1hY3JvIHRoYXQncyBtZWFudCB0byBiZSB1c2VkCitkbmwgIHRoYXQgd2F5IGNhbiBiZSBjaGVja2VkIHdpdGggbTRfYXNzZXJ0X251bWFyZ3MoLTEpLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZmluZShTUEVDSUFMX1NVRkZJWCwKK2RubCAgICAgICAgIG00X2Fzc2VydF9udW1hcmdzKC0xKQorZG5sICAgICAgICAgYGlmZGVmKGBGT08nLGBfZm9vJyxgX2JhcicpJykKK2RubAorZG5sICBCdXQgYXMgYW4gYWx0ZXJuYXRpdmUgc2VlIGFsc28gZGVmbGl0KCkgYmVsb3cgd2hlcmUgcGFyZW50aGVzaXplZAorZG5sICBleHByZXNzaW9ucyBmb2xsb3dpbmcgYSBtYWNybyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG91dHB1dC4KK2RubAorZG5sICBOb3RlIHRoYXQgaW4gQlNEIG00IHRoZXJlJ3Mgbm8gd2F5IHRvIGRpZmZlcmVudGlhdGUgY2FsbHMgImZvbyIgYW5kCitkbmwgICJmb28oKSIsIHNvIGluIEJTRCBtNCB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgdHdvIGlzbid0IGVuZm9yY2VkLgorZG5sICAoSW4gR05VIGFuZCBTeXNWIG00IGl0IGNhbiBiZSBjaGVja2VkLCBhbmQgaXMuKQorCisKK2RubCAgbTRfYXNzZXJ0X251bWFyZ3MgaXMgYWJsZSB0byBjaGVjayBpdHMgb3duIGFyZ3VtZW50cyBieSBjYWxsaW5nCitkbmwgIGFzc2VydF9udW1hcmdzX2ludGVybmFsIGRpcmVjdGx5LgorZG5sCitkbmwgIG00X2RvdWJsZXF1b3RlKCRgJzApIGV4cGFuZHMgdG8gYGAkMCcnLCB3aGVyZWFzIGBgJGAnMCcnIHdvdWxkIGV4cGFuZAorZG5sICB0byBgJGAnMCcgYW5kIGRvIHRoZSB3cm9uZyB0aGluZywgYW5kIGxpa2V3aXNlIGZvciAkMS4gIFRoZSBzYW1lIGlzCitkbmwgIGRvbmUgaW4gb3RoZXIgYXNzZXJ0IG1hY3Jvcy4KK2RubAorZG5sICAkYCMnIGxlYXZlcyAkIyBpbiB0aGUgbmV3IG1hY3JvIGJlaW5nIGRlZmluZWQsIGFuZCBzdG9wcyAjIGJlaW5nCitkbmwgIGludGVycHJldGVkIGFzIGEgY29tbWVudCBjaGFyYWN0ZXIuCitkbmwKK2RubCAgYGRubCAnIG1lYW5zIGFuIGV4cGxpY2l0IGRubCBpc24ndCBuZWNlc3Nhcnkgd2hlbiBtNF9hc3NlcnRfbnVtYXJncyBpcworZG5sICB1c2VkLiAgVGhlIHNwYWNlIG1lYW5zIHRoYXQgaWYgdGhlcmUgaXMgYSBkbmwgaXQnbGwgc3RpbGwgd29yay4KKworZG5sICBVc2FnZTogbTRfZG91YmxlcXVvdGUoeCkgZXhwYW5kcyB0byBgYHgnJworZGVmaW5lKG00X2RvdWJsZXF1b3RlLAorYG00X2Fzc2VydF9udW1hcmdzX2ludGVybmFsKGAkMCcsMSwkIyxsZW4oYCQxJykpYGAkMScnJykKKworZGVmaW5lKG00X2Fzc2VydF9udW1hcmdzLAorYG00X2Fzc2VydF9udW1hcmdzX2ludGVybmFsKGAkMCcsMSwkIyxsZW4oYCQxJykpZG5sCitgbTRfYXNzZXJ0X251bWFyZ3NfaW50ZXJuYWwnKG00X2RvdWJsZXF1b3RlKCRgJzApLCQxLCRgIycsYGxlbicobTRfZG91YmxlcXVvdGUoJGAnMSkpKWBkbmwgJycpCisKK2RubCAgQ2FsbGVkOiBtNF9hc3NlcnRfbnVtYXJnc19pbnRlcm5hbChgbWFjcm9uYW1lJyx3YW50YXJncywkIyxsZW4oYCQxJykpCitkZWZpbmUobTRfYXNzZXJ0X251bWFyZ3NfaW50ZXJuYWwsCitgbTRfYXNzZXJ0X251bWFyZ3NfaW50ZXJuYWxfY2hlY2soYCQxJyxgJDInLG00X251bWFyZ3NfY291bnQoYCQzJyxgJDQnKSknKQorCitkbmwgIENhbGxlZDogbTRfYXNzZXJ0X251bWFyZ3NfaW50ZXJuYWxfY2hlY2soYG1hY3JvbmFtZScsd2FudGFyZ3MsZ290YXJncykKK2RubAorZG5sICBJZiBtNF9kb2xsYXJoYXNoXzFfaWZfbm9wYXJlbl9wIChCU0QgbTQpIHRoZW4gZ290YXJncyBjYW4gYmUgMCB3aGVuIGl0CitkbmwgIHNob3VsZCBiZSAtMS4gIElmIHdhbnRhcmdzIGlzIC0xIGJ1dCBnb3RhcmdzIGlzIDAgYW5kIHRoZSB0d28gY2FuJ3QgYmUKK2RubCAgZGlzdGluZ3Vpc2hlZCB0aGVuIGl0J3MgYWxsb3dlZCB0byBwYXNzLgorZG5sCitkZWZpbmUobTRfYXNzZXJ0X251bWFyZ3NfaW50ZXJuYWxfY2hlY2ssCitgaWZlbHNlKGV2YWwoJDIgPT0gJDMKKyAgICAgICAgICAgICB8fCAoJDI9PS0xICYmICQzPT0wICYmIG00X2RvbGxhcmhhc2hfMV9pZl9ub3BhcmVuX3ApKSwwLAorYG00X2Vycm9yKGAkMSBleHBlY3RlZCAnbTRfTmFyZ3VtZW50cyhgJDInKWAsIGdvdCAnbTRfTmFyZ3VtZW50cyhgJDMnKQorKScpJykKKworZG5sICBDYWxsZWQ6IG00X251bWFyZ3NfY291bnQoJCMsbGVuKGAkMScpKQorZG5sICBJZiAkIz09MCB0aGVuIC0xIGFyZ3MsIGlmICQjPT0xIGJ1dCBsZW4oYCQxJyk9PTAgdGhlbiAwIGFyZ3MsIG90aGVyd2lzZQorZG5sICAkIyBhcmdzLgorZGVmaW5lKG00X251bWFyZ3NfY291bnQsCitgaWZlbHNlKCQxLDAsIC0xLAorYGlmZWxzZShldmFsKCQxPT0xICYmICQyLTA9PTApLDEsIDAsICQxKScpJykKKworZG5sICBVc2FnZTogbTRfTmFyZ3VtZW50cyhOKQorZG5sICAiJDEgYXJndW1lbnQiIG9yICIkMSBhcmd1bWVudHMiIHdpdGggdGhlIHBsdXJhbCBhY2NvcmRpbmcgdG8gJDEuCitkZWZpbmUobTRfTmFyZ3VtZW50cywKK2AkMSBhcmd1bWVudGAnaWZlbHNlKGAkMScsMSwscyknKQorCisKK2RubCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RubCAgQWRkaXRpb25hbCBlcnJvciBjaGVja2luZyB0aGluZ3MuCisKKworZG5sICBVc2FnZTogbTRfZmlsZV9zZWVuKCkKK2RubAorZG5sICBSZWNvcmQgX19maWxlX18gZm9yIHRoZSBiZW5lZml0IG9mIG00X2ZpbGVfYW5kX2xpbmUgaW4gbTR3cmFwIHRleHQuCitkbmwKK2RubCAgVGhlIGJhc2ljIF9fZmlsZV9fIG1hY3JvIGNvbWVzIG91dCBxdW90ZWQgaW4gR05VIG00LCBsaWtlIGBmb28uYXNtJywKK2RubCAgYW5kIG00X2ZpbGVfc2Vlbl9sYXN0IGlzIGRlZmluZWQgbGlrZSB0aGF0IHRvby4KK2RubAorZG5sICBUaGlzIGlzIHVzZWQgYnkgUFJPTE9HVUUsIHNpbmNlIHRoYXQncyBub3JtYWxseSBpbiB0aGUgbWFpbiAuYXNtIGZpbGUsCitkbmwgIGFuZCBpbiBwYXJ0aWN1bGFyIGl0IHNldHMgdXAgbTR3cmFwIGVycm9yIGNoZWNrcyBmb3IgbWlzc2luZyBFUElMT0dVRS4KKworZGVmaW5lKG00X2ZpbGVfc2VlbiwKK200X2Fzc2VydF9udW1hcmdzKDApCitgaWZlbHNlKF9fZmlsZV9fLGBOT05FJywsCitgZGVmaW5lKGBtNF9maWxlX3NlZW5fbGFzdCcsbTRfZG91YmxlcXVvdGUoX19maWxlX18pKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9hc3NlcnRfb25lYXJnKCkKK2RubAorZG5sICBQdXQgdGhpcywgdW5xdW90ZWQsIGF0IHRoZSBzdGFydCBvZiBhIG1hY3JvIGRlZmluaXRpb24gdG8gYWRkIHNvbWUgY29kZQorZG5sICB0byBjaGVjayB0aGF0IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIG1hY3JvLCBidXQgd2l0aCB0aGF0CitkbmwgIGFyZ3VtZW50IGFsbG93ZWQgdG8gYmUgZW1wdHkuICBGb3IgZXhhbXBsZSwKK2RubAorZG5sICAgICAgICAgIGRlZmluZShmb28sCitkbmwgICAgICAgICAgbTRfYXNzZXJ0X29uZWFyZygpCitkbmwgICAgICAgICAgYGJsYWggYmxhaCAkMSBibGFoIGJsYWgnKQorZG5sCitkbmwgIENhbGxzICJmb28oeHl6KSIgb3IgImZvbygpIiBhcmUgYWNjZXB0ZWQuICBBIGNhbGwgImZvbyh4eXosYWJjKSIgZmFpbHMuCitkbmwgIEEgY2FsbCAiZm9vIiBmYWlscyB0b28sIGJ1dCBCU0QgbTQgY2FuJ3QgZGV0ZWN0IHRoaXMgY2FzZSAoR05VIGFuZCBTeXNWCitkbmwgIG00IGNhbikuCisKK2RlZmluZShtNF9hc3NlcnRfb25lYXJnLAorbTRfYXNzZXJ0X251bWFyZ3MoMCkKK2BtNF9hc3NlcnRfb25lYXJnX2ludGVybmFsJyhtNF9kb3VibGVxdW90ZSgkYCcwKSwkYCMnKWBkbmwgJykKKworZG5sICBDYWxsZWQ6IG00X2Fzc2VydF9vbmVhcmcoYG1hY3JvbmFtZScsJCMpCitkZWZpbmUobTRfYXNzZXJ0X29uZWFyZ19pbnRlcm5hbCwKK2BpZmVsc2UoJDIsMSwsCitgbTRfZXJyb3IoYCQxIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAnbTRfTmFyZ3VtZW50cyhgJDInKQorKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9hc3NlcnRfbnVtYXJnc19yYW5nZShsb3csaGlnaCkKK2RubAorZG5sICBQdXQgdGhpcywgdW5xdW90ZWQsIGF0IHRoZSBzdGFydCBvZiBhIG1hY3JvIGRlZmluaXRpb24gdG8gYWRkIHNvbWUgY29kZQorZG5sICB0byBjaGVjayB0aGF0IGJldHdlZW4gbG93IGFuZCBoaWdoIG1hbnkgYXJndW1lbnRzIGdldCBwYXNzZWQgdG8gdGhlCitkbmwgIG1hY3JvLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZmluZShmb28sCitkbmwgICAgICAgICBtNF9hc3NlcnRfbnVtYXJnc19yYW5nZSgzLDUpCitkbmwgICAgICAgICBgbWFuZGF0b3J5ICQxICQyICQzIG9wdGlvbmFsICQ0ICQ1IGVuZCcpCitkbmwKK2RubCAgU2VlIG00X2Fzc2VydF9udW1hcmdzKCkgZm9yIG1vcmUgaW5mby4KKworZGVmaW5lKG00X2Fzc2VydF9udW1hcmdzX3JhbmdlLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BgbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2VfaW50ZXJuYWwnKG00X2RvdWJsZXF1b3RlKCRgJzApLCQxLCQyLCRgIycsYGxlbicobTRfZG91YmxlcXVvdGUoJGAnMSkpKWBkbmwgJycpCisKK2RubCAgQ2FsbGVkOiBtNF9hc3NlcnRfbnVtYXJnc19yYW5nZV9pbnRlcm5hbChgbmFtZScsbG93LGhpZ2gsJCMsbGVuKGAkMScpKQorZGVmaW5lKG00X2Fzc2VydF9udW1hcmdzX3JhbmdlX2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3MoNSkKK2BtNF9hc3NlcnRfbnVtYXJnc19yYW5nZV9jaGVjayhgJDEnLGAkMicsYCQzJyxtNF9udW1hcmdzX2NvdW50KGAkNCcsYCQ1JykpJykKKworZG5sICBDYWxsZWQ6IG00X2Fzc2VydF9udW1hcmdzX3JhbmdlX2NoZWNrKGBuYW1lJyxsb3csaGlnaCxnb3RhcmdzKQorZG5sCitkbmwgIElmIG00X2RvbGxhcmhhc2hfMV9pZl9ub3BhcmVuX3AgKEJTRCBtNCkgdGhlbiBnb3RhcmdzIGNhbiBiZSAwIHdoZW4gaXQKK2RubCAgc2hvdWxkIGJlIC0xLiAgVG8gZW5zdXJlIGEgYGhpZ2gnIG9mIC0xIHdvcmtzLCBhIGZ1ZGdlIGlzIGFwcGxpZWQgdG8KK2RubCAgZ290YXJncyBpZiBpdCdzIDAgYW5kIHRoZSAwIGFuZCAtMSBjYXNlcyBjYW4ndCBiZSBkaXN0aW5ndWlzaGVkLgorZG5sCitkZWZpbmUobTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2VfY2hlY2ssCittNF9hc3NlcnRfbnVtYXJncyg0KQorYGlmZWxzZShldmFsKCQyIDw9ICQ0ICYmCisgICAgICAgICAgICAgKCQ0IC0gKCQ0PT0wICYmIG00X2RvbGxhcmhhc2hfMV9pZl9ub3BhcmVuX3ApIDw9ICQzKSksMCwKK2BtNF9lcnJvcihgJDEgZXhwZWN0ZWQgJDIgdG8gJDMgYXJndW1lbnRzLCBnb3QgJ200X05hcmd1bWVudHMoYCQ0JykKKyknKScpCisKKworZG5sICBVc2FnZTogbTRfYXNzZXJ0X2RlZmluZWQoc3ltYm9sKQorZG5sCitkbmwgIFB1dCB0aGlzIHVucXVvdGVkIG9uIGEgbGluZSBvZiBpdHMgb3duIGF0IHRoZSBzdGFydCBvZiBhIG1hY3JvCitkbmwgIGRlZmluaXRpb24gdG8gYWRkIHNvbWUgY29kZSB0byBjaGVjayB0aGF0IHRoZSBnaXZlbiBzeW1ib2wgaXMgZGVmaW5lZAorZG5sICB3aGVuIHRoZSBtYWNybyBpcyB1c2VkLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgICBkZWZpbmUoZm9vLAorZG5sICAgICAgICAgIG00X2Fzc2VydF9kZWZpbmVkKGBGT09fUFJFRklYJykKK2RubCAgICAgICAgICBgRk9PX1BSRUZJWCB3aGF0ZXZlcicpCitkbmwKK2RubCAgVGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IHRvIGNoZWNrIHRoYXQgdGhlIHVzZXIgb3IgLi9jb25maWd1cmUgb3IKK2RubCAgd2hhdGV2ZXIgaGFzIGRlZmluZWQgdGhlIHRoaW5ncyBuZWVkZWQgYnkgYSBtYWNybywgYXMgb3Bwb3NlZCB0bworZG5sICBzaWxlbnRseSBnZW5lcmF0aW5nIGdhcmJhZ2UuCisKK2RlZmluZShtNF9hc3NlcnRfZGVmaW5lZCwKK200X2Fzc2VydF9udW1hcmdzKDEpCitgYG00X2Fzc2VydF9kZWZpbmVkX2ludGVybmFsJyhtNF9kb3VibGVxdW90ZSgkYCcwKSxgYCQxJycpYGRubCAnJykKKworZG5sICBDYWxsZWQ6IG00X2Fzc2VydF9kZWZpbmVkX2ludGVybmFsKGBtYWNyb25hbWUnLGBkZWZpbmVfcmVxdWlyZWQnKQorZGVmaW5lKG00X2Fzc2VydF9kZWZpbmVkX2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BtNF9pZmRlZihgJDInLCwKK2BtNF9lcnJvcihgJDEgbmVlZHMgJDIgZGVmaW5lZAorJyknKScpCisKKworZG5sICBVc2FnZTogbTRfbm90X2Zvcl9leHBhbnNpb24oYFNZTUJPTCcpCitkbmwgICAgICAgICBkZWZpbmVfbm90X2Zvcl9leHBhbnNpb24oYFNZTUJPTCcpCitkbmwKK2RubCAgbTRfbm90X2Zvcl9leHBhbnNpb24gdHVybnMgU1lNQk9MLCBpZiBkZWZpbmVkLCBpbnRvIHNvbWV0aGluZyB3aGljaAorZG5sICB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgZXhwYW5kZWQuICBGb3IgZXhhbXBsZSwKK2RubAorZG5sICAgICAgICAgbTRfbm90X2Zvcl9leHBhbnNpb24oYFBJQycpCitkbmwKK2RubCAgZGVmaW5lX25vdF9mb3JfZXhwYW5zaW9uIGlzIHRoZSBzYW1lLCBidXQgYWx3YXlzIG1ha2VzIGEgZGVmaW5pdGlvbi4KK2RubAorZG5sICBUaGVzZSBhcmUgZm9yIHN5bWJvbHMgdGhhdCBzaG91bGQgYmUgdGVzdGVkIHdpdGggaWZkZWYoYEZPTycsLi4uKQorZG5sICByYXRoZXIgdGhhbiBiZSBleHBhbmRlZCBhcyBzdWNoLiAgVGhleSBndWFyZCBhZ2FpbnN0IGFjY2lkZW50YWxseQorZG5sICBvbWl0dGluZyB0aGUgcXVvdGVzLCBhcyBpbiBpZmRlZihGT08sLi4uKS4gIE5vdGUgdGhvdWdoIHRoYXQgdGhleSBvbmx5CitkbmwgIGNhdGNoZXMgdGhpcyB3aGVuIEZPTyBpcyBkZWZpbmVkLCBzbyBiZSBzdXJlIHRvIHRlc3QgY29kZSBib3RoIHdpdGggYW5kCitkbmwgIHdpdGhvdXQgZWFjaCBkZWZpbml0aW9uLgorCitkZWZpbmUobTRfbm90X2Zvcl9leHBhbnNpb24sCittNF9hc3NlcnRfbnVtYXJncygxKQorYGlmZGVmKGAkMScsYGRlZmluZV9ub3RfZm9yX2V4cGFuc2lvbihgJDEnKScpJykKKworZGVmaW5lKGRlZmluZV9ub3RfZm9yX2V4cGFuc2lvbiwKK200X2Fzc2VydF9udW1hcmdzKDEpCitgaWZlbHNlKGRlZm4oYCQxJyksLCwKK2BtNF9lcnJvcihgYCQxJyBoYXMgYSBub24tZW1wdHkgdmFsdWUsIG1heWJlIGl0IHNob3VsZG50IGJlIG11bmdlZCB3aXRoIG00X25vdF9mb3JfZXhwYW5zaW9uKCkKKycpJylkbmwKK2RlZmluZShgJDEnLGBtNF9ub3RfZm9yX2V4cGFuc2lvbl9pbnRlcm5hbChgJDEnKScpJykKKworZGVmaW5lKG00X25vdF9mb3JfZXhwYW5zaW9uX2ludGVybmFsLAorYG00X2Vycm9yKGBgJDEnIGlzIG5vdCBtZWFudCB0byBiZSBleHBhbmRlZCwgcGVyaGFwcyB5b3UgbWVhbiBgaWZkZWYoYCQxJywuLi4pJworJyknKQorCisKK2RubCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RubCAgVmFyaW91cyBnZW5lcmljIG00IHRoaW5ncy4KKworCitkbmwgIFVzYWdlOiBtNF91bnF1b3RlKG1hY3JvKQorZG5sCitkbmwgIEFsbG93IHRoZSBhcmd1bWVudCB0ZXh0IHRvIGJlIHJlLWV2YWx1YXRlZC4gIFRoaXMgaXMgdXNlZnVsIGZvciAidG9rZW4KK2RubCAgcGFzdGluZyIgbGlrZSBtNF91bnF1b3RlKGZvb2AnYmFyKS4KKworZGVmaW5lKG00X3VucXVvdGUsCittNF9hc3NlcnRfb25lYXJnKCkKK2AkMScpCisKKworZG5sICBVc2FnZTogbTRfaWZkZWYobmFtZSx5ZXNbLG5vXSkKK2RubAorZG5sICBFeHBhbmQgdG8gdGhlIHllcyBhcmd1bWVudCBpZiBuYW1lIGlzIGRlZmluZWQsIG9yIHRvIHRoZSBubyBhcmd1bWVudCBpZgorZG5sICBub3QuCitkbmwKK2RubCAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYnVpbHRpbiAiaWZkZWYiLCBidXQgYXZvaWRzIGFuIE9TRiA0LjAgbTQgYnVnCitkbmwgIGluIHdoaWNoIGEgbWFjcm8gd2l0aCBhIHplcm8gdmFsdWUgYDAnIG9yIGAwMCcgZXRjIGlzIGNvbnNpZGVyZWQgbm90CitkbmwgIGRlZmluZWQuCitkbmwKK2RubCAgVGhlcmUncyBubyBwYXJ0aWN1bGFyIG5lZWQgdG8gdXNlIHRoaXMgZXZlcnl3aGVyZSwgb25seSBpZiB0aGVyZSBtaWdodAorZG5sICBiZSBhIHplcm8gdmFsdWUuCisKK2RlZmluZShtNF9pZmRlZiwKK200X2Fzc2VydF9udW1hcmdzX3JhbmdlKDIsMykKK2BpZmVsc2UoZXZhbChpZmRlZihgJDEnLDEsMCkrbTRfbGVuZ3RoKGRlZm4oYCQxJykpKSwwLAorYCQzJyxgJDInKScpCisKKworZG5sICBVc2FnZTogbTRfaWZkZWZfYW55b2ZfcChgc3ltYm9sJywuLi4pCitkbmwKK2RubCAgRXhwYW5kIHRvIDEgaWYgYW55IG9mIHRoZSBzeW1ib2xzIGluIHRoZSBhcmd1bWVudCBsaXN0IGFyZSBkZWZpbmVkLCBvcgorZG5sICB0byAwIGlmIG5vdC4KKworZGVmaW5lKG00X2lmZGVmX2FueW9mX3AsCitgaWZlbHNlKGV2YWwoJCM8PTEgJiYgbTRfbGVuZ3RoKGAkMScpPT0wKSwxLCAwLAorYGlmZGVmKGAkMScsIDEsCitgbTRfaWZkZWZfYW55b2ZfcChzaGlmdCgkQCkpJyknKScpCisKKworZG5sICBVc2FnZTogbTRfbGVuZ3RoKHN0cmluZykKK2RubAorZG5sICBEZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiBhIHN0cmluZy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgbGVuKCksIGJ1dAorZG5sICBhbHdheXMgZXhwYW5kcyB0byBhIG51bWJlciwgd29ya2luZyBhcm91bmQgdGhlIEJTRCBsZW4oKSB3aGljaAorZG5sICBldmFsdWF0ZXMgdG8gbm90aGluZyBnaXZlbiBhbiBlbXB0eSBhcmd1bWVudC4KKworZGVmaW5lKG00X2xlbmd0aCwKK200X2Fzc2VydF9vbmVhcmcoKQorYGV2YWwobGVuKGAkMScpLTApJykKKworCitkbmwgIFVzYWdlOiBtNF9zdHJpbmdlcXVhbF9wKHgseSkKK2RubAorZG5sICBFeHBhbmQgdG8gMSBvciAwIGFjY29yZGluZyBhcyBzdHJpbmdzIHggYW5kIHkgYXJlIGVxdWFsIG9yIG5vdC4KKworZGVmaW5lKG00X3N0cmluZ2VxdWFsX3AsCitgaWZlbHNlKGAkMScsYCQyJywxLDApJykKKworCitkbmwgIFVzYWdlOiBtNF9pbmNyX29yX2RlY3IobixsYXN0KQorZG5sCitkbmwgIERvIGFuIGluY3Iobikgb3IgZGVjcihuKSwgd2hpY2hldmVyIGlzIGluIHRoZSBkaXJlY3Rpb24gb2YgImxhc3QiLgorZG5sICBCb3RoIG4gYW5kIGxhc3QgbXVzdCBiZSBudW1iZXJzIG9mIGNvdXJzZS4KKworZGVmaW5lKG00X2luY3Jfb3JfZGVjciwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgaWZlbHNlKGV2YWwoJDE8JDIpLDEsaW5jcigkMSksZGVjcigkMSkpJykKKworCitkbmwgIFVzYWdlOiBmb3Jsb29wKGksIGZpcnN0LCBsYXN0LCBzdGF0ZW1lbnQpCitkbmwKK2RubCAgQmFzZWQgb24gR05VIG00IGV4YW1wbGVzL2Zvcmxvb3AubTQsIGJ1dCBleHRlbmRlZC4KK2RubAorZG5sICBzdGF0ZW1lbnQgaXMgZXhwYW5kZWQgcmVwZWF0ZWRseSwgd2l0aCBpIHN1Y2Nlc3NpdmVseSBkZWZpbmVkIGFzCitkbmwKK2RubCAgICAgICAgIGZpcnN0LCBmaXJzdCsxLCAuLi4sIGxhc3QtMSwgbGFzdAorZG5sCitkbmwgIE9yIGlmIGZpcnN0ID4gbGFzdCwgdGhlbiBpdCdzCitkbmwKK2RubCAgICAgICAgIGZpcnN0LCBmaXJzdC0xLCAuLi4sIGxhc3QrMSwgbGFzdAorZG5sCitkbmwgIElmIGZpcnN0ID09IGxhc3QsIHRoZW4gb25lIGV4cGFuc2lvbiBpcyBkb25lLgorZG5sCitkbmwgIEEgcHVzaGRlZi9wb3BkZWYgb2YgaSBpcyBkb25lIHRvIHByZXNlcnZlIGFueSBwcmV2aW91cyBkZWZpbml0aW9uIChvcgorZG5sICBsYWNrIG9mIGRlZmluaXRpb24pLiAgZmlyc3QgYW5kIGxhc3QgYXJlIGV2YWwoKWVkIGFuZCBzbyBjYW4gYmUKK2RubCAgZXhwcmVzc2lvbnMuCitkbmwKK2RubCAgZm9ybG9vcF9maXJzdCBpcyBkZWZpbmVkIHRvIDEgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgMCBvbiB0aGUgcmVzdC4KK2RubCAgZm9ybG9vcF9sYXN0IGlzIGRlZmluZWQgdG8gMSBvbiB0aGUgbGFzdCBpdGVyYXRpb24sIDAgb24gdGhlIG90aGVycy4KK2RubCAgTmVzdGVkIGZvcmxvb3BzIGFyZSBhbGxvd2VkLCBpbiB3aGljaCBjYXNlIGZvcmxvb3BfZmlyc3QgYW5kCitkbmwgIGZvcmxvb3BfbGFzdCBhcHBseSB0byB0aGUgaW5uZXJtb3N0IGxvb3AgdGhhdCdzIG9wZW4uCitkbmwKK2RubCAgQSBzaW1wbGUgZXhhbXBsZSwKK2RubAorZG5sICAgICAgICAgZm9ybG9vcChpLCAxLCAyKjIrMSwgYGRubAorZG5sICAgICAgICAgaXRlcmF0aW9uIG51bWJlciBpIC4uLiBpZmVsc2UoZm9ybG9vcF9maXJzdCwxLEZJUlNUKQorZG5sICAgICAgICAgJykKKworCitkbmwgICJpIiBhbmQgInN0YXRlbWVudCIgYXJlIGNhcmVmdWxseSBxdW90ZWQsIGJ1dCAiZmlyc3QiIGFuZCAibGFzdCIgYXJlCitkbmwgIGp1c3QgcGxhaW4gbnVtYmVycyBvbmNlIGV2YWwoKWVkLgorCitkZWZpbmUoYGZvcmxvb3AnLAorbTRfYXNzZXJ0X251bWFyZ3MoNCkKK2BwdXNoZGVmKGAkMScsZXZhbChgJDInKSlkbmwKK3B1c2hkZWYoYGZvcmxvb3BfZmlyc3QnLDEpZG5sCitwdXNoZGVmKGBmb3Jsb29wX2xhc3QnLDApZG5sCitmb3Jsb29wX2ludGVybmFsKGAkMScsZXZhbChgJDMnKSxgJDQnKWAnZG5sCitwb3BkZWYoYGZvcmxvb3BfZmlyc3QnKWRubAorcG9wZGVmKGBmb3Jsb29wX2xhc3QnKWRubAorcG9wZGVmKGAkMScpJykKKworZG5sICBDYWxsZWQ6IGZvcmxvb3BfaW50ZXJuYWwoYHZhcicsbGFzdCxzdGF0ZW1lbnQpCitkZWZpbmUoYGZvcmxvb3BfaW50ZXJuYWwnLAorbTRfYXNzZXJ0X251bWFyZ3MoMykKK2BpZmVsc2UoJDEsJDIsCitgZGVmaW5lKGBmb3Jsb29wX2xhc3QnLDEpJDMnLAorYCQzYCdkbmwKK2RlZmluZShgZm9ybG9vcF9maXJzdCcsMClkbmwKK2RlZmluZShgJDEnLG00X2luY3Jfb3JfZGVjcigkMSwkMikpZG5sCitmb3Jsb29wX2ludGVybmFsKGAkMScsJDIsYCQzJyknKScpCisKKworZG5sICBVc2FnZTogZm9yZWFjaCh2YXIsYm9keSwgaXRlbTEsaXRlbTIsLi4uLGl0ZW1OKQorZG5sCitkbmwgIEZvciBlYWNoICJpdGVtIiBhcmd1bWVudCwgZGVmaW5lICJ2YXIiIHRvIHRoYXQgdmFsdWUgYW5kIGV4cGFuZCAiYm9keSIuCitkbmwgIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBmb3JlYWNoKGksIGBzb21ldGhpbmcgaQorZG5sICAgICAgICAgJywgb25lLCB0d28pCitkbmwgIGdpdmVzCitkbmwgICAgICAgICBzb21ldGhpbmcgb25lCitkbmwgICAgICAgICBzb21ldGhpbmcgdHdvCitkbmwKK2RubCAgQW55IHByZXZpb3VzIGRlZmluaXRpb24gb2YgInZhciIsIG9yIGxhY2sgdGhlcmVvZiwgaXMgc2F2ZWQgYW5kCitkbmwgIHJlc3RvcmVkLiAgRW1wdHkgIml0ZW0icyBhcmUgbm90IGFsbG93ZWQuCisKK2RlZmluZShmb3JlYWNoLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMiwxMDAwKQorYGlmZWxzZShgJDMnLCwsCitgcHVzaGRlZihgJDEnLGAkMycpJDJgJ3BvcGRlZihgJDEnKWRubAorZm9yZWFjaChgJDEnLGAkMicsc2hpZnQoc2hpZnQoc2hpZnQoJEApKSkpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X3RvdXBwZXIoeCkKK2RubCAgICAgICAgIG00X3RvbG93ZXIoeCkKK2RubAorZG5sICBDb252ZXJ0IHRoZSBhcmd1bWVudCBzdHJpbmcgdG8gdXBwZXIgb3IgbG93ZXIgY2FzZSwgcmVzcGVjdGl2ZWx5LgorZG5sICBPbmx5IG9uZSBhcmd1bWVudCBhY2NlcHRlZC4KK2RubAorZG5sICBCU0QgbTQgZG9lc24ndCB0YWtlIHJhbmdlcyBsaWtlIGEteiBpbiB0cmFuc2xpdCgpLCBzbyB0aGUgZnVsbCBhbHBoYWJldAorZG5sICBpcyB3cml0dGVuIG91dC4KKworZGVmaW5lKG00X2FscGhhYmV0X2xvd2VyLCBgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonKQorZGVmaW5lKG00X2FscGhhYmV0X3VwcGVyLCBgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonKQorCitkZWZpbmUobTRfdG91cHBlciwKK200X2Fzc2VydF9vbmVhcmcoKQorYHRyYW5zbGl0KGAkMScsIG00X2FscGhhYmV0X2xvd2VyLCBtNF9hbHBoYWJldF91cHBlciknKQorCitkZWZpbmUobTRfdG9sb3dlciwKK200X2Fzc2VydF9vbmVhcmcoKQorYHRyYW5zbGl0KGAkMScsIG00X2FscGhhYmV0X3VwcGVyLCBtNF9hbHBoYWJldF9sb3dlciknKQorCisKK2RubCAgVXNhZ2U6IG00X2VtcHR5X2lmX3plcm8oeCkKK2RubAorZG5sICBFdmFsdWF0ZSB0byB4LCBvciB0byBub3RoaW5nIGlmIHggaXMgMC4gIHggaXMgZXZhbCgpZWQgYW5kIHNvIGNhbiBiZSBhbgorZG5sICBleHByZXNzaW9uLgorZG5sCitkbmwgIFRoaXMgaXMgdXNlZnVsIGZvciB4ODYgYWRkcmVzc2luZyBtb2RlIGRpc3BsYWNlbWVudHMgc2luY2UgZm9ybXMgbGlrZQorZG5sICAoJWVieCkgYXJlIG9uZSBieXRlIHNob3J0ZXIgdGhhbiAwKCVlYngpLiAgQSBtYWNybyBgZm9vJyBmb3IgdXNlIGFzCitkbmwgIGZvbyglZWJ4KSBjb3VsZCBiZSBkZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBzbyBpdCdsbCBiZSBlbXB0eSBpZiB0aGUKK2RubCAgZXhwcmVzc2lvbiBjb21lcyBvdXQgemVyby4KK2RubAorZG5sCSAgIGRlZmxpdChgZm9vJywgYG00X2VtcHR5X2lmX3plcm8oYStiKjQtYyknKQorZG5sCitkbmwgIE5hdHVyYWxseSB0aGlzIHNob3VsZG4ndCBiZSBkb25lIGlmLCBzYXksIGEgY29tcHV0ZWQganVtcCBkZXBlbmRzIG9uCitkbmwgIHRoZSBjb2RlIGJlaW5nIGEgcGFydGljdWxhciBzaXplLgorCitkZWZpbmUobTRfZW1wdHlfaWZfemVybywKK200X2Fzc2VydF9vbmVhcmcoKQorYGlmZWxzZShldmFsKCQxKSwwLCxldmFsKCQxKSknKQorCisKK2RubCAgVXNhZ2U6IG00X2xvZzIoeCkKK2RubAorZG5sICBDYWxjdWxhdGUgYSBsb2dhcml0aG0gdG8gYmFzZSAyLgorZG5sICB4IG11c3QgYmUgYW4gaW50ZWdyYWwgcG93ZXIgb2YgMiwgYmV0d2VlbiAyKiowIGFuZCAyKiozMC4KK2RubCAgeCBpcyBldmFsKCllZCwgc28gaXQgY2FuIGJlIGFuIGV4cHJlc3Npb24uCitkbmwgIEFuIGVycm9yIHJlc3VsdHMgaWYgeCBpcyBpbnZhbGlkLgorZG5sCitkbmwgIDIqKjMxIGlzbid0IHN1cHBvcnRlZCwgYmVjYXVzZSBhbiB1bnNpZ25lZCAyMTQ3NDgzNjQ4IGlzIG91dCBvZiByYW5nZQorZG5sICBvZiBhIDMyLWJpdCBzaWduZWQgaW50LiAgQWxzbywgdGhlIGJ1ZyBpbiBCU0QgbTQgd2hlcmUgYW4gZXZhbCgpCitkbmwgIHJlc3VsdGluZyBpbiAyMTQ3NDgzNjQ4IChvciAtMjE0NzQ4MzY0OCBhcyB0aGUgY2FzZSBtYXkgYmUpIGdpdmVzIGAtKCcKK2RubCAgbWVhbnMgdGVzdHMgbGlrZSBldmFsKDE8PDMxPT0oeCkpIHdvdWxkIGJlIG5lY2Vzc2FyeSwgYnV0IHRoYXQgdGhlbgorZG5sICBnaXZlcyBhbiB1bmF0dHJhY3RpdmUgZXhwbG9zaW9uIG9mIGV2YWwoKSBlcnJvciBtZXNzYWdlcyBpZiB4IGlzbid0CitkbmwgIG51bWVyaWMuCisKK2RlZmluZShtNF9sb2cyLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BtNF9sb2cyX2ludGVybmFsKDAsMSxldmFsKGAkMScpKScpCisKK2RubCAgQ2FsbGVkOiBtNF9sb2cyX2ludGVybmFsKG4sMioqbix0YXJnZXQpCitkZWZpbmUobTRfbG9nMl9pbnRlcm5hbCwKK200X2Fzc2VydF9udW1hcmdzKDMpCitgaWZlbHNlKCQyLCQzLCQxLAorYGlmZWxzZSgkMSwzMCwKK2BtNF9lcnJvcihgbTRfbG9nMigpIGFyZ3VtZW50IHRvbyBiaWcgb3Igbm90IGEgcG93ZXIgb2YgdHdvOiAkMworJyknLAorYG00X2xvZzJfaW50ZXJuYWwoaW5jcigkMSksZXZhbCgyKiQyKSwkMyknKScpJykKKworCitkbmwgIFVzYWdlOiAgbTRfZGl2Ml90b3dhcmRzX3plcm8KK2RubAorZG5sICBtNCBkaXZpc2lvbiBpcyBwcm9iYWJseSB3aGF0ZXZlciBhIEMgc2lnbmVkIGRpdmlzaW9uIGlzLCBhbmQgQyBkb2Vzbid0CitkbmwgIHNwZWNpZnkgd2hhdCByb3VuZGluZyBnZXRzIHVzZWQgb24gbmVnYXRpdmVzLCBzbyB0aGlzIGV4cHJlc3Npb24gZm9yY2VzCitkbmwgIGEgcm91bmRpbmcgdG93YXJkcyB6ZXJvLgorCitkZWZpbmUobTRfZGl2Ml90b3dhcmRzX3plcm8sCittNF9hc3NlcnRfbnVtYXJncygxKQorYGV2YWwoKCgkMSkgKyAoKCgkMSk8MCkgJiAoJDEpKSkgLyAyKScpCisKKworZG5sICBVc2FnZTogbTRfbHNoaWZ0KG4sY291bnQpCitkbmwgICAgICAgICBtNF9yc2hpZnQobixjb3VudCkKK2RubAorZG5sICBDYWxjdWxhdGUgbiBzaGlmdGVkIGxlZnQgb3IgcmlnaHQgYnkgY291bnQgbWFueSBiaXRzLiAgQm90aCBuIGFuZCBjb3VudAorZG5sICBhcmUgZXZhbCgpZWQgYW5kIHNvIGNhbiBiZSBleHByZXNzaW9ucy4KK2RubAorZG5sICBOZWdhdGl2ZSBjb3VudHMgYXJlIGFsbG93ZWQgYW5kIG1lYW4gYSBzaGlmdCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorZG5sICBOZWdhdGl2ZSBuIGlzIGFsbG93ZWQgYW5kIHJpZ2h0IHNoaWZ0cyB3aWxsIGJlIGFyaXRobWV0aWMgKG1lYW5pbmcKK2RubCAgZGl2aWRlIGJ5IDIqKmNvdW50LCByb3VuZGluZyB0b3dhcmRzIHplcm8sIGFsc28gbWVhbmluZyB0aGUgc2lnbiBiaXQgaXMKK2RubCAgZHVwbGljYXRlZCkuCitkbmwKK2RubCAgVXNlIHRoZXNlIG1hY3JvcyBpbnN0ZWFkIG9mIDw8IGFuZCA+PiBpbiBldmFsKCkgc2luY2UgdGhlIGJhc2ljIGNjcworZG5sICBTeXNWIG00IGRvZXNuJ3QgaGF2ZSB0aG9zZSBvcGVyYXRvcnMuCisKK2RlZmluZShtNF9yc2hpZnQsCittNF9hc3NlcnRfbnVtYXJncygyKQorYG00X2xzaGlmdChgJDEnLC0oYCQyJykpJykKKworZGVmaW5lKG00X2xzaGlmdCwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgbTRfbHNoaWZ0X2ludGVybmFsKGV2YWwoYCQxJyksZXZhbChgJDInKSknKQorCitkZWZpbmUobTRfbHNoaWZ0X2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BpZmVsc2UoZXZhbCgkMi0wPT0wKSwxLCQxLAorYGlmZWxzZShldmFsKCQyPjApLDEsCitgbTRfbHNoaWZ0X2ludGVybmFsKGV2YWwoJDEqMiksZGVjcigkMikpJywKK2BtNF9sc2hpZnRfaW50ZXJuYWwobTRfZGl2Ml90b3dhcmRzX3plcm8oJDEpLGluY3IoJDIpKScpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X3BvcGNvdW50KG4pCitkbmwKK2RubCAgRXhwYW5kIHRvIHRoZSBudW1iZXIgMSBiaXRzIGluIG4uCisKK2RlZmluZShtNF9wb3Bjb3VudCwKK200X2Fzc2VydF9udW1hcmdzKDEpCitgbTRfcG9wY291bnRfaW50ZXJuYWwoMCxldmFsKGAkMScpKScpCisKK2RubCAgQ2FsbGVkOiBtNF9wb3Bjb3VudF9pbnRlcm5hbChjb3VudCxyZW0pCitkZWZpbmUobTRfcG9wY291bnRfaW50ZXJuYWwsCittNF9hc3NlcnRfbnVtYXJncygyKQorYGlmZWxzZSgkMiwwLCQxLAorYG00X3BvcGNvdW50X2ludGVybmFsKGV2YWwoJDErKCQyJTIpKSxldmFsKCQyLzIpKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9jb3VudF90cmFpbGluZ196ZXJvcyhOKQorZG5sCitkbmwgIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cyBvbiBOLiAgTiBpcyBldmFsKCllZCBhbmQgc28KK2RubCAgY2FuIGJlIGFuIGV4cHJlc3Npb24uICBJZiBOIGlzIHplcm8gYW4gZXJyb3IgaXMgZ2VuZXJhdGVkLgorCitkZWZpbmUobTRfY291bnRfdHJhaWxpbmdfemVyb3MsCittNF9hc3NlcnRfbnVtYXJncygxKQorYG00X2NvdW50X3RyYWlsaW5nX3plcm9zX2ludGVybmFsKGV2YWwoYCQxJyksMCknKQorCitkbmwgIENhbGxlZDogbTRfY291bnRfdHJhaWxpbmdfemVyb3NfaW50ZXJuYWwodmFsLGNvdW50KQorZGVmaW5lKG00X2NvdW50X3RyYWlsaW5nX3plcm9zX2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BpZmVsc2UoJDEsMCwKK2BtNF9lcnJvcihgbTRfY291bnRfdHJhaWxpbmdfemVyb3MoKSBnaXZlbiBhIHplcm8gdmFsdWUnKScsCitgaWZlbHNlKGV2YWwoKCQxKSUyKSwxLGAkMicsCitgbTRfY291bnRfdHJhaWxpbmdfemVyb3NfaW50ZXJuYWwoZXZhbCgkMS8yKSxpbmNyKCQyKSknKScpJykKKworCitkbmwgIFVzYWdlOiBkZWZsaXQobmFtZSx2YWx1ZSkKK2RubAorZG5sICBMaWtlIGRlZmluZSgpLCBidXQgIm5hbWUiIGV4cGFuZHMgbGlrZSBhIGxpdGVyYWwsIHJhdGhlciB0aGFuIHRha2luZworZG5sICBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSAibmFtZSglZWF4KSIgZXhwYW5kcyB0byAidmFsdWUoJWVheCkiLgorZG5sCitkbmwgIExpbWl0YXRpb25zOgorZG5sCitkbmwgICQgY2hhcmFjdGVycyBpbiB0aGUgdmFsdWUgcGFydCBtdXN0IGhhdmUgcXVvdGVzIHRvIHN0b3AgdGhlbSBsb29raW5nCitkbmwgIGxpa2UgbWFjcm8gcGFyYW1ldGVycy4gIEZvciBleGFtcGxlLCBkZWZsaXQocmVnLGAxMjMrJGAnNCs1NjcnKS4gIFNlZQorZG5sICBkZWZyZWcoKSBiZWxvdyBmb3IgaGFuZGxpbmcgc2ltcGxlIHJlZ2lzdGVyIGRlZmluaXRpb25zIGxpa2UgJDcgZXRjLgorZG5sCitkbmwgICJuYW1lKCkiIGlzIHR1cm5lZCBpbnRvICJuYW1lIiwgdW5mb3J0dW5hdGVseS4gIEluIEdOVSBhbmQgU3lzViBtNCBhbgorZG5sICBlcnJvciBpcyBnZW5lcmF0ZWQgd2hlbiB0aGlzIGhhcHBlbnMsIGJ1dCBpbiBCU0QgbTQgaXQgd2lsbCBoYXBwZW4KK2RubCAgc2lsZW50bHkuICBUaGUgcHJvYmxlbSBpcyB0aGF0IGluIEJTRCBtNCAkIyBpcyAxIGluIGJvdGggIm5hbWUiIG9yCitkbmwgICJuYW1lKCkiLCBzbyB0aGVyZSdzIG5vIHdheSB0byBkaWZmZXJlbnRpYXRlIHRoZW0uICBCZWNhdXNlIHdlIHdhbnQKK2RubCAgcGxhaW4gIm5hbWUiIHRvIHR1cm4gaW50byBwbGFpbiAidmFsdWUiLCB3ZSBlbmQgdXAgd2l0aCAibmFtZSgpIgorZG5sICB0dXJuaW5nIGludG8gcGxhaW4gInZhbHVlIiB0b28uCitkbmwKK2RubCAgIm5hbWUoZm9vKSIgd2lsbCBsb3NlIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGNvbW1hcyBpbiAiZm9vIiwgZm9yIGV4YW1wbGUKK2RubCAgImRpc3AoJWVheCwgJWVjeCkiIHdvdWxkIGJlY29tZSAiMTI4KCVlYXgsJWVjeCkiLgorZG5sCitkbmwgIFRoZXNlIHBhcmVudGhlc2VzIG9kZGl0aWVzIHNob3VsZG4ndCBtYXR0ZXIgaW4gYXNzZW1ibGVyIHRleHQsIGJ1dCBpZgorZG5sICB0aGV5IGRvIHRoZSBzdWdnZXN0ZWQgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSAibmFtZSAoKSIgb3IgIm5hbWUgKGZvbykiCitkbmwgIHRvIHN0b3AgdGhlIHBhcmVudGhlc2VzIGxvb2tpbmcgbGlrZSBhIG1hY3JvIGFyZ3VtZW50IGxpc3QuICBJZiBhIHNwYWNlCitkbmwgIGlzbid0IGFjY2VwdGFibGUgaW4gdGhlIG91dHB1dCwgdGhlbiB3cml0ZSAibmFtZWAnKCkiIG9yICJuYW1lYCcoZm9vKSIuCitkbmwgIFRoZSBgJyBpcyBzdHJpcHBlZCB3aGVuIHJlYWQsIGJ1dCBhZ2FpbiBzdG9wcyB0aGUgcGFyZW50aGVzZXMgbG9va2luZworZG5sICBsaWtlIHBhcmFtZXRlcnMuCisKK2RubCAgUXVvdGluZyBmb3IgZGVmbGl0X2VtcHR5YXJnY2hlY2sgaXMgc2ltaWxhciB0byBtNF9hc3NlcnRfbnVtYXJncy4gIFRoZQorZG5sICBzdHVmZiBpbiB0aGUgaWZlbHNlIGdpdmVzIGEgJCMsICQxIGFuZCAkQCBldmFsdWF0ZWQgaW4gdGhlIG5ldyBtYWNybworZG5sICBjcmVhdGVkLCBub3QgaW4gZGVmbGl0LgorZGVmaW5lKGRlZmxpdCwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgZGVmaW5lKGAkMScsCitgZGVmbGl0X2VtcHR5YXJnY2hlY2snKGBgJDEnJywkYCMnLG00X2RvdWJsZXF1b3RlKCRgJzEpKWBkbmwKKyQyYCdkbmwKK2lmZWxzZShldmFsKCQnYCM+MSB8fCBtNF9sZW5ndGgoJ200X2RvdWJsZXF1b3RlKCRgJzEpYCkhPTApLDEsKCQnYEApKScpJykKKworZG5sICBDYWxsZWQ6IGRlZmxpdF9lbXB0eWFyZ2NoZWNrKG1hY3JvbmFtZSwkIyxgJDEnKQorZGVmaW5lKGRlZmxpdF9lbXB0eWFyZ2NoZWNrLAorYGlmZWxzZShldmFsKCQyPT0xICYmICFtNF9kb2xsYXJoYXNoXzFfaWZfbm9wYXJlbl9wICYmIG00X2xlbmd0aChgJDMnKT09MCksMSwKK2BtNF9lcnJvcihgZG9udCB1c2UgYSBkZWZsaXQgYXMgJDEoKSBiZWNhdXNlIGl0IGxvc2VzIHRoZSBicmFja2V0cyAoc2VlIGRlZmxpdCBpbiBhc20tZGVmcy5tNCBmb3IgbW9yZSBpbmZvcm1hdGlvbikKKycpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X2Fzc2VydChgZXhwcicpCitkbmwKK2RubCAgVGVzdCBhIGNvbXBpbGUtdGltZSByZXF1aXJlbWVudCB3aXRoIGFuIG00IGV4cHJlc3Npb24uICBUaGUgZXhwcmVzc2lvbgorZG5sICBzaG91bGQgYmUgcXVvdGVkLCBhbmQgd2lsbCBiZSBldmFsKCllZCBhbmQgZXhwZWN0ZWQgdG8gYmUgbm9uLXplcm8uCitkbmwgIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBtNF9hc3NlcnQoYEZPTyoyKzYgPCAxNCcpCisKK2RlZmluZShtNF9hc3NlcnQsCittNF9hc3NlcnRfbnVtYXJncygxKQorYGlmZWxzZShldmFsKCQxKSwxLCwKK2BtNF9lcnJvcihgYXNzZXJ0aW9uIGZhaWxlZDogJDEKKycpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X3JlcGVhdChjb3VudCx0ZXh0KQorZG5sCitkbmwgIEV4cGFuZCB0byB0aGUgZ2l2ZW4gcmVwZXRpdGlvbnMgb2YgdGhlIGdpdmVuIHRleHQuICBBIHplcm8gY291bnQgaXMKK2RubCAgYWxsb3dlZCwgYW5kIGV4cGFuZHMgdG8gbm90aGluZy4KKworZGVmaW5lKG00X3JlcGVhdCwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgbTRfcmVwZWF0X2ludGVybmFsKGV2YWwoJDEpLGAkMicpJykKKworZGVmaW5lKG00X3JlcGVhdF9pbnRlcm5hbCwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgaWZlbHNlKGAkMScsMCwsCitgZm9ybG9vcChtNF9yZXBlYXRfaW50ZXJuYWxfY291bnRlciwxLCQxLGBgJDInJyknKScpCisKKworZG5sICBVc2FnZTogbTRfaGV4X2xvd21hc2soYml0cykKK2RubAorZG5sICBHZW5lcmF0ZSBhIGhleCBjb25zdGFudCB3aGljaCBpcyBhIGxvdyBtYXNrIG9mIHRoZSBnaXZlbiBudW1iZXIgb2YKK2RubCAgYml0cy4gIEZvciBleGFtcGxlIG00X2hleF9sb3dtYXNrKDEwKSB3b3VsZCBnaXZlIDB4M2ZmLgorCitkZWZpbmUobTRfaGV4X2xvd21hc2ssCittNF9hc3NlcnRfbnVtYXJncygxKQorYG00X2NwdV9oZXhfY29uc3RhbnQobTRfaGV4X2xvd21hc2tfaW50ZXJuYWwxKGV2YWwoYCQxJykpKScpCisKK2RubCAgQ2FsbGVkOiBtNF9oZXhfbG93bWFza19pbnRlcm5hbDEoYml0cykKK2RlZmluZShtNF9oZXhfbG93bWFza19pbnRlcm5hbDEsCittNF9hc3NlcnRfbnVtYXJncygxKQorYGlmZWxzZSgkMSwwLGAwJywKK2BtNF9oZXhfbG93bWFza19pbnRlcm5hbDIoZXZhbCgoJDEpJTQpLGV2YWwoKCQxKS80KSknKScpCisKK2RubCAgQ2FsbGVkOiBtNF9oZXhfbG93bWFza19pbnRlcm5hbChyZW1haW5kZXIsZGlnaXRzKQorZGVmaW5lKG00X2hleF9sb3dtYXNrX2ludGVybmFsMiwKK200X2Fzc2VydF9udW1hcmdzKDIpCitgaWZlbHNlKCQxLDEsYDEnLAorYGlmZWxzZSgkMSwyLGAzJywKK2BpZmVsc2UoJDEsMyxgNycpJyknKWRubAorbTRfcmVwZWF0KCQyLGBmJyknKQorCisKK2RubCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RubCAgVGhlIGZvbGxvd2luZyBtNF9saXN0IGZ1bmN0aW9ucyB0YWtlIGEgbGlzdCBhcyBtdWx0aXBsZSBhcmd1bWVudHMuCitkbmwgIEFyZ3VtZW50cyBhcmUgZXZhbHVhdGVkIG11bHRpcGxlIHRpbWVzLCB0aGVyZSdzIG5vIGF0dGVtcHQgYXQgc3RyaWN0CitkbmwgIHF1b3RpbmcuICBFbXB0eSBsaXN0IGVsZW1lbnRzIGFyZSBub3QgYWxsb3dlZCwgc2luY2UgYW4gZW1wdHkgZmluYWwKK2RubCAgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXNlIHJlc3RyaWN0aW9ucyBkb24ndCBhZmZlY3QgdGhlIGN1cnJlbnQgdXNlcywKK2RubCAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGVhc2llci4KKworCitkbmwgIFVzYWdlOiBtNF9saXN0X3F1b3RlKGxpc3QsLi4uKQorZG5sCitkbmwgIFByb2R1Y2UgYSBsaXN0IHdpdGggcXVvdGVkIGNvbW1hcywgc28gaXQgY2FuIGJlIGEgc2luZ2xlIGFyZ3VtZW50CitkbmwgIHN0cmluZy4gIEZvciBpbnN0YW5jZSBtNF9saXN0X3F1b3RlKGEsYixjKSBnaXZlcworZG5sCitkbmwgICAgICAgICBhYCwnYmAsJ2NgLCcKK2RubAorZG5sICBUaGlzIGNhbiBiZSB1c2VkIHRvIHB1dCBhIGxpc3QgaW4gYSBkZWZpbmUsCitkbmwKK2RubCAgICAgICAgIGRlZmluZShmb29saXN0LCBtNF9saXN0X3F1b3RlKGEsYixjKSkKK2RubAorZG5sICBXaGljaCBjYW4gdGhlbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBhcworZG5sCitkbmwgICAgICAgICBtNF9saXN0X2ZpbmQodGFyZ2V0LCBmb29saXN0KQorCitkZWZpbmUobTRfbGlzdF9xdW90ZSwKK2BpZmVsc2UoYCQxJywsLAorYCQxYCwnbTRfbGlzdF9xdW90ZShzaGlmdCgkQCkpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X2xpc3RfZmluZChrZXksbGlzdCwuLi4pCitkbmwKK2RubCAgRXZhbHVhdGUgdG8gMSBvciAwIGFjY29yZGluZyB0byB3aGV0aGVyIGtleSBpcyBpbiB0aGUgbGlzdCBlbGVtZW50cy4KKworZGVmaW5lKG00X2xpc3RfZmluZCwKK200X2Fzc2VydF9udW1hcmdzX3JhbmdlKDEsMTAwMCkKK2BpZmVsc2UoYCQyJywsMCwKK2BpZmVsc2UoYCQxJyxgJDInLDEsCitgbTRfbGlzdF9maW5kKGAkMScsc2hpZnQoc2hpZnQoJEApKSknKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9saXN0X3JlbW92ZShrZXksbGlzdCwuLi4pCitkbmwKK2RubCAgRXZhbHVhdGUgdG8gdGhlIGdpdmVuIGxpc3Qgd2l0aCBga2V5JyByZW1vdmVkIChpZiBwcmVzZW50KS4KKworZGVmaW5lKG00X2xpc3RfcmVtb3ZlLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMSwxMDAwKQorYGlmZWxzZShgJDInLCwsCitgaWZlbHNlKGAkMScsYCQyJywsYCQyLCcpZG5sCittNF9saXN0X3JlbW92ZShgJDEnLHNoaWZ0KHNoaWZ0KCRAKSkpJyknKQorCisKK2RubCAgVXNhZ2U6IG00X2xpc3RfZmlyc3QobGlzdCwuLi4pCitkbmwKK2RubCAgRXZhbHVhdGUgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKGlmIGFueSkuCisKK2RlZmluZShtNF9saXN0X2ZpcnN0LGAkMScpCisKKworZG5sICBVc2FnZTogbTRfbGlzdF9jb3VudChsaXN0LC4uLikKK2RubAorZG5sICBFdmFsdWF0ZSB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LiAgVGhpcyBjYW4ndCBqdXN0IHVzZSAkIworZG5sICBiZWNhdXNlIHRoZSBsYXN0IGVsZW1lbnQgbWlnaHQgYmUgZW1wdHkuCisKK2RlZmluZShtNF9saXN0X2NvdW50LAorYG00X2xpc3RfY291bnRfaW50ZXJuYWwoMCwkQCknKQorCitkbmwgIENhbGxlZDogbTRfbGlzdF9pbnRlcm5hbChjb3VudCxsaXN0LC4uLikKK2RlZmluZShtNF9saXN0X2NvdW50X2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMSwxMDAwKQorYGlmZWxzZShgJDInLCwkMSwKK2BtNF9saXN0X2NvdW50X2ludGVybmFsKGV2YWwoJDErMSksc2hpZnQoc2hpZnQoJEApKSknKScpCisKKworZG5sICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZG5sICBWYXJpb3VzIGFzc2VtYmxlciB0aGluZ3MsIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBDUFUuCitkbmwKKworCitkbmwgIFVzYWdlOiBpbmNsdWRlX21wbihgZmlsZW5hbWUnKQorZG5sCitkbmwgIExpa2UgaW5jbHVkZSgpLCBidXQgYWRkcyBhIHBhdGggdG8gdGhlIG1wbiBzb3VyY2UgZGlyZWN0b3J5LiAgRm9yCitkbmwgIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGluY2x1ZGVfbXBuKGBzcGFyYzY0L2FkZG11bF8xaC5hc20nKQorCitkZWZpbmUoaW5jbHVkZV9tcG4sCittNF9hc3NlcnRfbnVtYXJncygxKQorbTRfYXNzZXJ0X2RlZmluZWQoYENPTkZJR19UT1BfU1JDRElSJykKK2BpbmNsdWRlKENPTkZJR19UT1BfU1JDRElSYC9tcG4vJDEnKScpCisKKworZG5sICBVc2FnZTogQyBjb21tZW50IC4uLgorZG5sCitkbmwgIFRoaXMgd29ya3MgbGlrZSBhIEZPUlRSQU4tc3R5bGUgY29tbWVudCBjaGFyYWN0ZXIuICBJdCBjYW4gYmUgdXNlZCBmb3IKK2RubCAgY29tbWVudHMgdG8gdGhlIHJpZ2h0IG9mIGFzc2VtYmx5IGluc3RydWN0aW9ucywgd2hlcmUganVzdCBkbmwgd291bGQKK2RubCAgcmVtb3ZlIHRoZSBuZXdsaW5lIGFuZCBjb25jYXRlbmF0ZSBhZGphY2VudCBsaW5lcy4KK2RubAorZG5sICBDIGFuZC9vciBkbmwgYXJlIHVzZWZ1bCB3aGVuIGFuIGFzc2VtYmxlciBkb2Vzbid0IHN1cHBvcnQgY29tbWVudHMsIG9yCitkbmwgIHdoZXJlIGRpZmZlcmVudCBhc3NlbWJsZXJzIGZvciBhIHBhcnRpY3VsYXIgQ1BVIG5lZWQgZGlmZmVyZW50IHN0eWxlcy4KK2RubCAgVGhlIGludGVybWVkaWF0ZSAiLnMiIGZpbGVzIHdpbGwgZW5kIHVwIHdpdGggbm8gY29tbWVudHMsIGp1c3QgY29kZS4KK2RubAorZG5sICBVc2luZyBDIGlzIG5vdCBpbnRlbmRlZCB0byBjYXVzZSBvZmZlbmNlIHRvIGFueW9uZSB3aG8gZG9lc24ndCBsaWtlCitkbmwgIEZPUlRSQU47IGJ1dCBpZiB0aGF0IGhhcHBlbnMgaXQncyBhbiB1bmV4cGVjdGVkIGJvbnVzLgorZG5sCitkbmwgIER1cmluZyBkZXZlbG9wbWVudCwgaWYgY29tbWVudHMgYXJlIHdhbnRlZCBpbiB0aGUgLnMgZmlsZXMgdG8gaGVscCBzZWUKK2RubCAgd2hhdCdzIGV4cGFuZGluZyB3aGVyZSwgQyBjYW4gYmUgcmVkZWZpbmVkIHdpdGggc29tZXRoaW5nIGxpa2UKK2RubAorZG5sICAgICAgICAgZGVmaW5lKGBDJyxgIycpCisKK2RlZmluZShDLCBgCitkbmwnKQorCisKK2RubCAgTm9ybWFsbHkgUElDIGlzIGRlZmluZWQgKG9yIG5vdCkgYnkgbGlidG9vbCwgYnV0IGl0IGRvZXNuJ3Qgc2V0IGl0IG9uCitkbmwgIHN5c3RlbXMgd2hpY2ggYXJlIGFsd2F5cyBQSUMuICBQSUNfQUxXQVlTIGVzdGFibGlzaGVkIGluIGNvbmZpZy5tNAorZG5sICBpZGVudGlmaWVzIHRoZXNlIGZvciB1cy4KKworaWZlbHNlKFBJQ19BTFdBWVMsYHllcycsYGRlZmluZShgUElDJyknKQorCisKK2RubCAgVmFyaW91cyBwb3NzaWJsZSBkZWZpbmVzIHBhc3NlZCBmcm9tIHRoZSBNYWtlZmlsZSB0aGF0IGFyZSB0byBiZSB0ZXN0ZWQKK2RubCAgd2l0aCBpZmRlZigpIHJhdGhlciB0aGFuIGJlIGV4cGFuZGVkLgorCittNF9ub3RfZm9yX2V4cGFuc2lvbihgUElDJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBETExfRVhQT1JUJykKKworZG5sICBhb3JzX24KK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fYWRkX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9zdWJfbicpCisKK2RubCAgYW9yc19lcnIxX24KK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fYWRkX2VycjFfbicpCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3N1Yl9lcnIxX24nKQorCitkbmwgIGFvcnNfZXJyMl9uCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX2FkZF9lcnIyX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9zdWJfZXJyMl9uJykKKworZG5sICBhb3JzX2VycjNfbgorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9hZGRfZXJyM19uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fc3ViX2VycjNfbicpCisKK2RubCAgYW9yc211bF8xCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX2FkZG11bF8xJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fc3VibXVsXzEnKQorCitkbmwgIGxvZ29wc19uCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX2FuZF9uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fYW5kbl9uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fbmFuZF9uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05faW9yX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9pb3JuX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9uaW9yX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl94b3JfbicpCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3hub3JfbicpCisKK2RubCAgcG9waGFtCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3BvcGNvdW50JykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05faGFtZGlzdCcpCisKK2RubCAgbG9ycnNoaWZ0CittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX2xzaGlmdCcpCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3JzaGlmdCcpCisKK2RubCAgYW9yc2xzaDFfbgorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9hZGRsc2gxX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9zdWJsc2gxX24nKQorbTRfbm90X2Zvcl9leHBhbnNpb24oYE9QRVJBVElPTl9yc2Jsc2gxX24nKQorCitkbmwgIGFvcnNsc2gyX24KK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fYWRkbHNoMl9uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fc3VibHNoMl9uJykKK200X25vdF9mb3JfZXhwYW5zaW9uKGBPUEVSQVRJT05fcnNibHNoMl9uJykKKworZG5sICByc2gxYW9yc19uCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3JzaDFhZGRfbicpCittNF9ub3RfZm9yX2V4cGFuc2lvbihgT1BFUkFUSU9OX3JzaDFzdWJfbicpCisKKworZG5sICBVc2FnZTogbTRfY29uZmlnX2dtcF9tcGFyYW0oYHN5bWJvbCcpCitkbmwKK2RubCAgQ2hlY2sgdGhhdCBgc3ltYm9sJyBpcyBkZWZpbmVkLiAgSWYgaXQgaXNuJ3QsIGlzc3VlIGFuIGVycm9yIGFuZAorZG5sICB0ZXJtaW5hdGUgaW1tZWRpYXRlbHkuICBUaGUgZXJyb3IgbWVzc2FnZSBleHBsYWlucyB0aGF0IHRoZSBzeW1ib2wKK2RubCAgc2hvdWxkIGJlIGluIGNvbmZpZy5tNCwgY29waWVkIGZyb20gZ21wLW1wYXJhbS5oLgorZG5sCitkbmwgIFRlcm1pbmF0aW9uIGlzIGltbWVkaWF0ZSBzaW5jZSBtaXNzaW5nIHNheSBTUVJfVE9PTTJfVEhSRVNIT0xEIGNhbgorZG5sICBsZWFkIHRvIGluZmluaXRlIGxvb3BzIGFuZCBlbmRsZXNzIGVycm9yIG1lc3NhZ2VzLgorCitkZWZpbmUobTRfY29uZmlnX2dtcF9tcGFyYW0sCittNF9hc3NlcnRfbnVtYXJncygxKQorYGlmZGVmKGAkMScsLAorYG00X2Vycm9yKGAkMSBpcyBub3QgZGVmaW5lZC4KKwkiY29uZmlndXJlIiBzaG91bGQgaGF2ZSBleHRyYWN0ZWQgdGhpcyBmcm9tIGdtcC1tcGFyYW0uaCBhbmQgcHV0IGl0CisJaW4gY29uZmlnLm00IChvciBpbiA8Y3B1Pl88ZmlsZT4uYXNtIGZvciBhIGZhdCBiaW5hcnkpLCBidXQgc29tZWhvdworICAgICAgICB0aGlzIGhhcyBmYWlsZWQuCisnKW00ZXhpdCgxKScpJykKKworCitkbmwgIFVzYWdlOiBkZWZyZWcobmFtZSxyZWcpCitkbmwKK2RubCAgR2l2ZSBhIG5hbWUgdG8gYSAkIHN0eWxlIHJlZ2lzdGVyLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZnJlZyhmb28sJDEyKQorZG5sCitkbmwgIGRlZnJlZygpIGluc2VydHMgYW4gZXh0cmEgcGFpciBvZiBxdW90ZXMgYWZ0ZXIgdGhlICQgc28gdGhhdCBpdCdzIG5vdAorZG5sICBpbnRlcnByZXRlZCBhcyBhbiBtNCBtYWNybyBwYXJhbWV0ZXIsIGllLiBmb28gaXMgYWN0dWFsbHkgJGAnMTIuICBtNAorZG5sICBzdHJpcHMgdGhvc2UgcXVvdGVzIHdoZW4gZm9vIGlzIGV4cGFuZGVkLgorZG5sCitkbmwgIGRlZmxpdCgpIGlzIHVzZWQgdG8gbWFrZSB0aGUgbmV3IGRlZmluaXRpb24sIHNvIGl0IHdpbGwgZXhwYW5kCitkbmwgIGxpdGVyYWxseSBldmVuIGlmIGZvbGxvd2VkIGJ5IHBhcmVudGhlc2VzIGllLiBmb28oOTkpIHdpbGwgYmVjb21lCitkbmwgICQxMig5OSkuICAoQnV0IHRoZXJlJ3Mgbm93aGVyZSB0aGF0IHdvdWxkIGJlIHVzZWQgaXMgdGhlcmU/KQorZG5sCitkbmwgIFdoZW4gbWFraW5nIGZ1cnRoZXIgZGVmaW5pdGlvbnMgZnJvbSBleGlzdGluZyBkZWZyZWcoKSBtYWNyb3MsIHJlbWVtYmVyCitkbmwgIHRvIHVzZSBkZWZyZWcoKSBhZ2FpbiB0byBwcm90ZWN0IHRoZSAkIGluIHRoZSBuZXcgZGVmaW5pdGlvbnMgdG9vLiAgRm9yCitkbmwgIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZnJlZyhhMCwkNCkKK2RubCAgICAgICAgIGRlZnJlZyhhMSwkNSkKK2RubCAgICAgICAgIC4uLgorZG5sCitkbmwgICAgICAgICBkZWZyZWcoUEFSQU1fRFNULGEwKQorZG5sCitkbmwgIFRoaXMgaXMgb25seSBiZWNhdXNlIGEwIGlzIGV4cGFuZGluZyBhdCB0aGUgdGltZSB0aGUgUEFSQU1fRFNUCitkbmwgIGRlZmluaXRpb24gaXMgbWFkZSwgbGVhdmluZyBhIGxpdGVyYWwgJDQgdGhhdCBtdXN0IGJlIHJlLXF1b3RlZC4gIE9uCitkbmwgIHRoZSBvdGhlciBoYW5kIGluIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgcmEgaXMgb25seSBleHBhbmRlZCB3aGVuCitkbmwgIHJldCBpcyB1c2VkIGFuZCBpdHMgJGAnMzEgcHJvdGVjdGlvbiB3aWxsIGhhdmUgaXRzIGRlc2lyZWQgZWZmZWN0IGF0CitkbmwgIHRoYXQgdGltZS4KK2RubAorZG5sICAgICAgICAgZGVmcmVnKHJhLCQzMSkKK2RubCAgICAgICAgIC4uLgorZG5sICAgICAgICAgZGVmaW5lKHJldCxgaiByYScpCitkbmwKK2RubCAgTm90ZSB0aGF0IG9ubHkgJG4gZm9ybXMgYXJlIG1lYW50IHRvIGJlIHVzZWQgaGVyZSwgYW5kIHNvbWV0aGluZyBsaWtlCitkbmwgIDEyOCgkMzApIGRvZXNuJ3QgZ2V0IHByb3RlY3RlZCBhbmQgd2lsbCBjb21lIG91dCB3cm9uZy4KKworZGVmaW5lKGRlZnJlZywKK200X2Fzc2VydF9udW1hcmdzKDIpCitgZGVmbGl0KGAkMScsCitzdWJzdHIoYCQyJywwLDEpYGAnJ3N1YnN0cihgJDInLDEpKScpCisKKworZG5sICBVc2FnZTogbTRfaW5zdHJ1Y3Rpb25fd3JhcHBlcigpCitkbmwKK2RubCAgUHV0IHRoaXMsIHVucXVvdGVkLCBvbiBhIGxpbmUgb24gaXRzIG93biwgYXQgdGhlIHN0YXJ0IG9mIGEgbWFjcm8KK2RubCAgdGhhdCdzIGEgd3JhcHBlciBhcm91bmQgYW4gYXNzZW1ibGVyIGluc3RydWN0aW9uLiAgSXQgYWRkcyBjb2RlIHRvIGdpdmUKK2RubCAgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBtYWNybyBpcyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLgorZG5sCitkbmwgIEZvciBleGFtcGxlLCBzdXBwb3NlIGptcCBuZWVkcyB0byBiZSB3cmFwcGVkLAorZG5sCitkbmwgICAgICAgICBkZWZpbmUoam1wLAorZG5sICAgICAgICAgbTRfaW5zdHJ1Y3Rpb25fd3JhcHBlcigpCitkbmwgICAgICAgICBtNF9hc3NlcnRfbnVtYXJncygxKQorZG5sICAgICAgICAgICAgICAgICBgLmJ5dGUgMHg0MgorZG5sICAgICAgICAgICAgICAgICAubG9uZyAgJDEKK2RubCAgICAgICAgICAgICAgICAgbm9wJykKK2RubAorZG5sICBUaGUgcG9pbnQgb2YgbTRfaW5zdHJ1Y3Rpb25fd3JhcHBlciBpcyB0byBnZXQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQorZG5sICB0aGFuIG00X2Fzc2VydF9udW1hcmdzIHdvdWxkIGdpdmUgaWYgam1wIGlzIGFjY2lkZW50YWxseSB1c2VkIGFzIHBsYWluCitkbmwgICJqbXAgZm9vIiBpbnN0ZWFkIG9mIHRoZSBpbnRlbmRlZCAiam1wKCBmb28pIi4gICJqbXAoKSIgd2l0aCBubworZG5sICBhcmd1bWVudCBhbHNvIHByb3Zva2VzIHRoZSBlcnJvciBtZXNzYWdlLgorZG5sCitkbmwgIG00X2luc3RydWN0aW9uX3dyYXBwZXIgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHdyYXBwZWQgaW5zdHJ1Y3Rpb25zCitkbmwgIHRoYXQgdGFrZSBhcmd1bWVudHMsIHNpbmNlIG9idmlvdXNseSBzb21ldGhpbmcgbWVhbnQgdG8gYmUgdXNlZCBhcyBzYXkKK2RubCAgcGxhaW4gInJldCIgZG9lc24ndCB3YW50IHRvIGdpdmUgYW4gZXJyb3Igd2hlbiB1c2VkIHRoYXQgd2F5LgorCitkZWZpbmUobTRfaW5zdHJ1Y3Rpb25fd3JhcHBlciwKK200X2Fzc2VydF9udW1hcmdzKDApCitgYG00X2luc3RydWN0aW9uX3dyYXBwZXJfaW50ZXJuYWwnKG00X2RvdWJsZXF1b3RlKCRgJzApLGRubAoraWZkZWYoYF9fZmlsZV9fJyxgbTRfZG91YmxlcXVvdGUoX19maWxlX18pJyxgYHRoZSBtNCBzb3VyY2VzJycpLGRubAorJGAjJyxtNF9kb3VibGVxdW90ZSgkYCcxKSlgZG5sJycpCisKK2RubCAgQ2FsbGVkOiBtNF9pbnN0cnVjdGlvbl93cmFwcGVyX2ludGVybmFsKCQwLGBmaWxlbmFtZScsJCMsJDEpCitkZWZpbmUobTRfaW5zdHJ1Y3Rpb25fd3JhcHBlcl9pbnRlcm5hbCwKK2BpZmVsc2UoZXZhbCgkMzw9MSAmJiBtNF9sZW5ndGgoYCQ0Jyk9PTApLDEsCitgbTRfZXJyb3IoYCQxIGlzIGEgbWFjcm8gcmVwbGFjaW5nIHRoYXQgaW5zdHJ1Y3Rpb24gYW5kIG5lZWRzIGFyZ3VtZW50cywgc2VlICQyIGZvciBkZXRhaWxzCisnKScpJykKKworCitkbmwgIFVzYWdlOiBtNF9jcHVfaGV4X2NvbnN0YW50KHN0cmluZykKK2RubAorZG5sICBFeHBhbmQgdG8gdGhlIHN0cmluZyBwcmVmaXhlZCBieSBhIHN1aXRhYmxlIGAweCcgaGV4IG1hcmtlci4gIFRoaXMKK2RubCAgc2hvdWxkIGJlIHJlZGVmaW5lZCBhcyBuZWNlc3NhcnkgZm9yIENQVXMgd2l0aCBkaWZmZXJlbnQgY29udmVudGlvbnMuCisKK2RlZmluZShtNF9jcHVfaGV4X2NvbnN0YW50LAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2AweGAkMScnKQorCisKK2RubCAgVXNhZ2U6IFVOUk9MTF9MT0cyLCBVTlJPTExfTUFTSywgVU5ST0xMX0JZVEVTCitkbmwgICAgICAgICBDSFVOS19MT0cyLCBDSFVOS19NQVNLLCBDSFVOS19CWVRFUworZG5sCitkbmwgIFdoZW4gY29kZSBzdXBwb3J0cyBhIHZhcmlhYmxlIGFtb3VudCBvZiBsb29wIHVucm9sbGluZywgdGhlIGNvbnZlbnRpb24KK2RubCAgaXMgdG8gZGVmaW5lIFVOUk9MTF9DT1VOVCB0byB0aGUgbnVtYmVyIG9mIGxpbWJzIHByb2Nlc3NlZCBwZXIgbG9vcC4KK2RubCAgV2hlbiB0ZXN0aW5nIGNvZGUgdGhpcyBjYW4gYmUgdmFyaWVkIHRvIHNlZSBob3cgbXVjaCB0aGUgbG9vcCBvdmVyaGVhZAorZG5sICBpcyBjb3N0aW5nLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZmxpdChVTlJPTExfQ09VTlQsIDMyKQorZG5sCitkbmwgIElmIHRoZSBmb3Jsb29wKCkgZ2VuZXJhdGluZyB0aGUgdW5yb2xsZWQgbG9vcCBoYXMgYSBwYXR0ZXJuIHByb2Nlc3NpbmcKK2RubCAgbW9yZSB0aGFuIG9uZSBsaW1iLCB0aGUgY29udmVudGlvbiBpcyB0byBleHByZXNzIHRoaXMgd2l0aCBDSFVOS19DT1VOVC4KK2RubCAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGRlZmxpdChDSFVOS19DT1VOVCwgMikKK2RubAorZG5sICBUaGUgTE9HMiwgTUFTSyBhbmQgQllURVMgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIGRlcml2ZWQgZnJvbSB0aGVzZSBDT1VOVAorZG5sICBkZWZpbml0aW9ucy4gIElmIENPVU5UIGlzIHJlZGVmaW5lZCwgdGhlIExPRzIsIE1BU0sgYW5kIEJZVEVTIGZvbGxvdworZG5sICB0aGUgbmV3IGRlZmluaXRpb24gYXV0b21hdGljYWxseS4KK2RubAorZG5sICBMT0cyIGlzIHRoZSBsb2cgYmFzZSAyIG9mIENPVU5ULiAgTUFTSyBpcyBDT1VOVC0xLCB3aGljaCBjYW4gYmUgdXNlZCBhcworZG5sICBhIGJpdCBtYXNrLiAgQllURVMgaXMgR01QX0xJTUJfQllURVMqQ09VTlQsIHRoZSBudW1iZXIgb2YgYnl0ZXMKK2RubCAgcHJvY2Vzc2VkIGluIGVhY2ggdW5yb2xsZWQgbG9vcC4KK2RubAorZG5sICBHTVBfTElNQl9CWVRFUyBpcyBkZWZpbmVkIGluIGEgQ1BVIHNwZWNpZmljIG00IGluY2x1ZGUgZmlsZS4gIEl0CitkbmwgIGV4aXN0cyBvbmx5IHNvIHRoZSBCWVRFUyBkZWZpbml0aW9ucyBoZXJlIGNhbiBiZSBjb21tb24gdG8gYWxsIENQVXMuCitkbmwgIEluIHRoZSBhY3R1YWwgY29kZSBmb3IgYSBnaXZlbiBDUFUsIGFuIGV4cGxpY2l0IDQgb3IgOCBtYXkgYXMgd2VsbCBiZQorZG5sICB1c2VkIGJlY2F1c2UgdGhlIGNvZGUgaXMgb25seSBmb3IgYSBwYXJ0aWN1bGFyIENQVSwgaXQgZG9lc24ndCBuZWVkIHRvCitkbmwgIGJlIGdlbmVyYWwuCitkbmwKK2RubCAgTm90ZSB0aGF0IG5vbmUgb2YgdGhlc2UgbWFjcm9zIGRvIGFueXRoaW5nIGV4Y2VwdCBnaXZlIGNvbnZlbnRpb25hbAorZG5sICBuYW1lcyB0byBjb21tb25seSB1c2VkIHRoaW5ncy4gIFlvdSBzdGlsbCBoYXZlIHRvIHdyaXRlIHlvdXIgb3duCitkbmwgIGV4cHJlc3Npb25zIGZvciBhIGZvcmxvb3AoKSBhbmQgdGhlIHJlc3VsdGluZyBhZGRyZXNzIGRpc3BsYWNlbWVudHMuCitkbmwgIFNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdHlwaWNhbCBmb3IgNCBieXRlcyBwZXIgbGltYi4KK2RubAorZG5sICAgICAgICAgZm9ybG9vcChgaScsMCxVTlJPTExfQ09VTlQtMSxgCitkbmwgICAgICAgICAgICAgICAgIGRlZmxpdChgZGlzcCcsZXZhbChpKjQpKQorZG5sICAgICAgICAgICAgICAgICAuLi4KK2RubCAgICAgICAgICcpCitkbmwKK2RubCAgT3Igd2hlbiB1c2luZyBDSFVOS19DT1VOVCwKK2RubAorZG5sICAgICAgICAgZm9ybG9vcChgaScsMCxVTlJPTExfQ09VTlQvQ0hVTktfQ09VTlQtMSxgCitkbmwgICAgICAgICAgICAgICAgIGRlZmxpdChgZGlzcDAnLGV2YWwoaSpDSFVOS19DT1VOVCo0KSkKK2RubCAgICAgICAgICAgICAgICAgZGVmbGl0KGBkaXNwMScsZXZhbChkaXNwMCs0KSkKK2RubCAgICAgICAgICAgICAgICAgLi4uCitkbmwgICAgICAgICAnKQorZG5sCitkbmwgIENsZWFybHkgYGknIGNhbiBiZSBydW4gc3RhcnRpbmcgZnJvbSAxLCBvciBmcm9tIGhpZ2ggdG8gbG93IG9yIHdoYXRldmVyCitkbmwgIGJlc3Qgc3VpdHMuCisKK2RlZmxpdChVTlJPTExfTE9HMiwKK200X2Fzc2VydF9kZWZpbmVkKGBVTlJPTExfQ09VTlQnKQorYG00X2xvZzIoVU5ST0xMX0NPVU5UKScpCisKK2RlZmxpdChVTlJPTExfTUFTSywKK200X2Fzc2VydF9kZWZpbmVkKGBVTlJPTExfQ09VTlQnKQorYGV2YWwoVU5ST0xMX0NPVU5ULTEpJykKKworZGVmbGl0KFVOUk9MTF9CWVRFUywKK200X2Fzc2VydF9kZWZpbmVkKGBVTlJPTExfQ09VTlQnKQorbTRfYXNzZXJ0X2RlZmluZWQoYEdNUF9MSU1CX0JZVEVTJykKK2BldmFsKFVOUk9MTF9DT1VOVCAqIEdNUF9MSU1CX0JZVEVTKScpCisKK2RlZmxpdChDSFVOS19MT0cyLAorbTRfYXNzZXJ0X2RlZmluZWQoYENIVU5LX0NPVU5UJykKK2BtNF9sb2cyKENIVU5LX0NPVU5UKScpCisKK2RlZmxpdChDSFVOS19NQVNLLAorbTRfYXNzZXJ0X2RlZmluZWQoYENIVU5LX0NPVU5UJykKK2BldmFsKENIVU5LX0NPVU5ULTEpJykKKworZGVmbGl0KENIVU5LX0JZVEVTLAorbTRfYXNzZXJ0X2RlZmluZWQoYENIVU5LX0NPVU5UJykKK200X2Fzc2VydF9kZWZpbmVkKGBHTVBfTElNQl9CWVRFUycpCitgZXZhbChDSFVOS19DT1VOVCAqIEdNUF9MSU1CX0JZVEVTKScpCisKKworZG5sICBVc2FnZTogTVBOKG5hbWUpCitkbmwKK2RubCAgQWRkIE1QTl9QUkVGSVggdG8gYSBuYW1lLgorZG5sICBNUE5fUFJFRklYIGRlZmF1bHRzIHRvICJfX2dtcG5fIiBpZiBub3QgZGVmaW5lZC4KK2RubAorZG5sICBtNF91bnF1b3RlIGlzIHVzZWQgaW4gTVBOIHNvIHRoYXQgd2hlbiBpdCBleHBhbmRzIHRvIHNheSBfX2dtcG5fZm9vLAorZG5sICB0aGF0IGlkZW50aWZpZXIgd2lsbCBiZSBzdWJqZWN0IHRvIGZ1cnRoZXIgbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBpcworZG5sICB1c2VkIGJ5IHNvbWUgb2YgdGhlIGZhdCBiaW5hcnkgc3VwcG9ydCBmb3IgcmVuYW1pbmcgc3ltYm9scy4KKworaWZkZWYoYE1QTl9QUkVGSVgnLCwKK2BkZWZpbmUoYE1QTl9QUkVGSVgnLGBfX2dtcG5fJyknKQorCitkZWZpbmUoTVBOLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BtNF91bnF1b3RlKE1QTl9QUkVGSVhgJyQxKScpCisKKworZG5sICBVc2FnZTogbXBuX2FkZF9uLCBldGMKK2RubAorZG5sICBDb252ZW5pZW5jZSBkZWZpbml0aW9ucyB1c2luZyBNUE4oKSwgbGlrZSB0aGUgI2RlZmluZXMgaW4gZ21wLmguICBFYWNoCitkbmwgIGZ1bmN0aW9uIHRoYXQgbWlnaHQgYmUgaW1wbGVtZW50ZWQgaW4gYXNzZW1ibGVyIGlzIGhlcmUuCisKK2RlZmluZShkZWZpbmVfbXBuLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BkZWZsaXQoYG1wbl8kMScsYE1QTihgJDEnKScpJykKKworZGVmaW5lX21wbihhZGQpCitkZWZpbmVfbXBuKGFkZF8xKQorZGVmaW5lX21wbihhZGRfZXJyMV9uKQorZGVmaW5lX21wbihhZGRfZXJyMl9uKQorZGVmaW5lX21wbihhZGRfZXJyM19uKQorZGVmaW5lX21wbihhZGRfbikKK2RlZmluZV9tcG4oYWRkX25jKQorZGVmaW5lX21wbihhZGRsc2gxX24pCitkZWZpbmVfbXBuKGFkZGxzaDFfbmMpCitkZWZpbmVfbXBuKGFkZGxzaDJfbikKK2RlZmluZV9tcG4oYWRkbHNoMl9uYykKK2RlZmluZV9tcG4oYWRkbHNoX24pCitkZWZpbmVfbXBuKGFkZGxzaF9uYykKK2RlZmluZV9tcG4oYWRkbHNoMV9uX2lwMSkKK2RlZmluZV9tcG4oYWRkbHNoMV9uY19pcDEpCitkZWZpbmVfbXBuKGFkZGxzaDJfbl9pcDEpCitkZWZpbmVfbXBuKGFkZGxzaDJfbmNfaXAxKQorZGVmaW5lX21wbihhZGRsc2hfbl9pcDEpCitkZWZpbmVfbXBuKGFkZGxzaF9uY19pcDEpCitkZWZpbmVfbXBuKGFkZGxzaDFfbl9pcDIpCitkZWZpbmVfbXBuKGFkZGxzaDFfbmNfaXAyKQorZGVmaW5lX21wbihhZGRsc2gyX25faXAyKQorZGVmaW5lX21wbihhZGRsc2gyX25jX2lwMikKK2RlZmluZV9tcG4oYWRkbHNoX25faXAyKQorZGVmaW5lX21wbihhZGRsc2hfbmNfaXAyKQorZGVmaW5lX21wbihhZGRtdWxfMSkKK2RlZmluZV9tcG4oYWRkbXVsXzFjKQorZGVmaW5lX21wbihhZGRtdWxfMikKK2RlZmluZV9tcG4oYWRkbXVsXzMpCitkZWZpbmVfbXBuKGFkZG11bF80KQorZGVmaW5lX21wbihhZGRtdWxfNSkKK2RlZmluZV9tcG4oYWRkbXVsXzYpCitkZWZpbmVfbXBuKGFkZG11bF83KQorZGVmaW5lX21wbihhZGRtdWxfOCkKK2RlZmluZV9tcG4oYWRkbXVsXzJzKQorZGVmaW5lX21wbihhZGRfbl9zdWJfbikKK2RlZmluZV9tcG4oYWRkX25fc3ViX25jKQorZGVmaW5lX21wbihhZGRhZGRtdWxfMW1zYjApCitkZWZpbmVfbXBuKGFuZF9uKQorZGVmaW5lX21wbihhbmRuX24pCitkZWZpbmVfbXBuKGJkaXZfcV8xKQorZGVmaW5lX21wbihwaTFfYmRpdl9xXzEpCitkZWZpbmVfbXBuKGJkaXZfZGJtMWMpCitkZWZpbmVfbXBuKGNtcCkKK2RlZmluZV9tcG4oY25kX2FkZF9uKQorZGVmaW5lX21wbihjbmRfc3ViX24pCitkZWZpbmVfbXBuKGNvbSkKK2RlZmluZV9tcG4oY29weWQpCitkZWZpbmVfbXBuKGNvcHlpKQorZGVmaW5lX21wbihjb3VudF9sZWFkaW5nX3plcm9zKQorZGVmaW5lX21wbihjb3VudF90cmFpbGluZ196ZXJvcykKK2RlZmluZV9tcG4oZGl2X3FyXzFuX3BpMSkKK2RlZmluZV9tcG4oZGl2X3FyXzIpCitkZWZpbmVfbXBuKGRpdl9xcl8ybl9waTEpCitkZWZpbmVfbXBuKGRpdl9xcl8ydV9waTEpCitkZWZpbmVfbXBuKGRpdl9xcl8ybl9waTIpCitkZWZpbmVfbXBuKGRpdl9xcl8ydV9waTIpCitkZWZpbmVfbXBuKGRpdmV4YWN0XzEpCitkZWZpbmVfbXBuKGRpdmV4YWN0X2J5M2MpCitkZWZpbmVfbXBuKGRpdnJlbSkKK2RlZmluZV9tcG4oZGl2cmVtXzEpCitkZWZpbmVfbXBuKGRpdnJlbV8xYykKK2RlZmluZV9tcG4oZGl2cmVtXzIpCitkZWZpbmVfbXBuKGRpdnJlbV9jbGFzc2ljKQorZGVmaW5lX21wbihkaXZyZW1fbmV3dG9uKQorZGVmaW5lX21wbihkdW1wKQorZGVmaW5lX21wbihnY2QpCitkZWZpbmVfbXBuKGdjZF8xKQorZGVmaW5lX21wbihnY2RfMTEpCitkZWZpbmVfbXBuKGdjZF8yMikKK2RlZmluZV9tcG4oZ2NkZXh0KQorZGVmaW5lX21wbihnZXRfc3RyKQorZGVmaW5lX21wbihoYW1kaXN0KQorZGVmaW5lX21wbihpbnZlcnRfbGltYikKK2RlZmluZV9tcG4oaW52ZXJ0X2xpbWJfdGFibGUpCitkZWZpbmVfbXBuKGlvcl9uKQorZGVmaW5lX21wbihpb3JuX24pCitkZWZpbmVfbXBuKGxzaGlmdCkKK2RlZmluZV9tcG4obHNoaWZ0YykKK2RlZmluZV9tcG4obW9kXzFfMXApCitkZWZpbmVfbXBuKG1vZF8xXzFwX2NwcykKK2RlZmluZV9tcG4obW9kXzFzXzJwKQorZGVmaW5lX21wbihtb2RfMXNfMnBfY3BzKQorZGVmaW5lX21wbihtb2RfMXNfM3ApCitkZWZpbmVfbXBuKG1vZF8xc18zcF9jcHMpCitkZWZpbmVfbXBuKG1vZF8xc180cCkKK2RlZmluZV9tcG4obW9kXzFzXzRwX2NwcykKK2RlZmluZV9tcG4obW9kXzEpCitkZWZpbmVfbXBuKG1vZF8xYykKK2RlZmluZV9tcG4obW9kXzM0bHN1YjEpCitkZWZpbmVfbXBuKG1vZGV4YWN0XzFfb2RkKQorZGVmaW5lX21wbihtb2RleGFjdF8xY19vZGQpCitkZWZpbmVfbXBuKG11bCkKK2RlZmluZV9tcG4obXVsXzEpCitkZWZpbmVfbXBuKG11bF8xYykKK2RlZmluZV9tcG4obXVsXzIpCitkZWZpbmVfbXBuKG11bF8zKQorZGVmaW5lX21wbihtdWxfNCkKK2RlZmluZV9tcG4obXVsXzUpCitkZWZpbmVfbXBuKG11bF82KQorZGVmaW5lX21wbihtdWxfYmFzZWNhc2UpCitkZWZpbmVfbXBuKG11bF9uKQorZGVmaW5lX21wbihtdWxsb19iYXNlY2FzZSkKK2RlZmluZV9tcG4obXVsbWlkX2Jhc2VjYXNlKQorZGVmaW5lX21wbihwZXJmZWN0X3NxdWFyZV9wKQorZGVmaW5lX21wbihwb3Bjb3VudCkKK2RlZmluZV9tcG4ocHJlaW52X2RpdnJlbV8xKQorZGVmaW5lX21wbihwcmVpbnZfbW9kXzEpCitkZWZpbmVfbXBuKG5hbmRfbikKK2RlZmluZV9tcG4obmVnKQorZGVmaW5lX21wbihuaW9yX24pCitkZWZpbmVfbXBuKHBvd20pCitkZWZpbmVfbXBuKHBvd2xvKQorZGVmaW5lX21wbihyYW5kb20pCitkZWZpbmVfbXBuKHJhbmRvbTIpCitkZWZpbmVfbXBuKHJlZGNfMSkKK2RlZmluZV9tcG4ocmVkY18yKQorZGVmaW5lX21wbihyc2Jsc2gxX24pCitkZWZpbmVfbXBuKHJzYmxzaDFfbmMpCitkZWZpbmVfbXBuKHJzYmxzaDJfbikKK2RlZmluZV9tcG4ocnNibHNoMl9uYykKK2RlZmluZV9tcG4ocnNibHNoX24pCitkZWZpbmVfbXBuKHJzYmxzaF9uYykKK2RlZmluZV9tcG4ocnNoMWFkZF9uKQorZGVmaW5lX21wbihyc2gxYWRkX25jKQorZGVmaW5lX21wbihyc2gxc3ViX24pCitkZWZpbmVfbXBuKHJzaDFzdWJfbmMpCitkZWZpbmVfbXBuKHJzaGlmdCkKK2RlZmluZV9tcG4ocnNoaWZ0YykKK2RlZmluZV9tcG4oc2JwaTFfYmRpdl9xKQorZGVmaW5lX21wbihzYnBpMV9iZGl2X3FyKQorZGVmaW5lX21wbihzYnBpMV9iZGl2X3IpCitkZWZpbmVfbXBuKHNjYW4wKQorZGVmaW5lX21wbihzY2FuMSkKK2RlZmluZV9tcG4oc2V0X3N0cikKK2RlZmluZV9tcG4oc3FyX2Jhc2VjYXNlKQorZGVmaW5lX21wbihzcXJfZGlhZ29uYWwpCitkZWZpbmVfbXBuKHNxcl9kaWFnX2FkZGxzaDEpCitkZWZpbmVfbXBuKHN1Yl9uKQorZGVmaW5lX21wbihzdWJsc2gxX24pCitkZWZpbmVfbXBuKHN1YmxzaDFfbmMpCitkZWZpbmVfbXBuKHN1YmxzaDFfbl9pcDEpCitkZWZpbmVfbXBuKHN1YmxzaDFfbmNfaXAxKQorZGVmaW5lX21wbihzdWJsc2gyX24pCitkZWZpbmVfbXBuKHN1YmxzaDJfbmMpCitkZWZpbmVfbXBuKHN1YmxzaDJfbl9pcDEpCitkZWZpbmVfbXBuKHN1YmxzaDJfbmNfaXAxKQorZGVmaW5lX21wbihzdWJsc2hfbikKK2RlZmluZV9tcG4oc3VibHNoX25jKQorZGVmaW5lX21wbihzdWJsc2hfbl9pcDEpCitkZWZpbmVfbXBuKHN1YmxzaF9uY19pcDEpCitkZWZpbmVfbXBuKHNxcnRyZW0pCitkZWZpbmVfbXBuKHN1YikKK2RlZmluZV9tcG4oc3ViXzEpCitkZWZpbmVfbXBuKHN1Yl9lcnIxX24pCitkZWZpbmVfbXBuKHN1Yl9lcnIyX24pCitkZWZpbmVfbXBuKHN1Yl9lcnIzX24pCitkZWZpbmVfbXBuKHN1Yl9uKQorZGVmaW5lX21wbihzdWJfbmMpCitkZWZpbmVfbXBuKHN1Ym11bF8xKQorZGVmaW5lX21wbihzdWJtdWxfMWMpCitkZWZpbmVfbXBuKHNlY190YWJzZWxlY3QpCitkZWZpbmVfbXBuKHVtdWxfcHBtbSkKK2RlZmluZV9tcG4odW11bF9wcG1tX3IpCitkZWZpbmVfbXBuKHVkaXZfcXJubmQpCitkZWZpbmVfbXBuKHVkaXZfcXJubmRfcikKK2RlZmluZV9tcG4oeG5vcl9uKQorZGVmaW5lX21wbih4b3JfbikKKworCitkbmwgIERlZmluZXMgZm9yIEMgZ2xvYmFsIGFycmF5cyBhbmQgdmFyaWFibGVzLCB3aXRoIG5hbWVzIG1hdGNoaW5nIHdoYXQncworZG5sICB1c2VkIGluIHRoZSBDIGNvZGUuCitkbmwKK2RubCAgTm90aWNlIHRoYXQgR1NZTV9QUkVGSVggaXMgaW5jbHVkZWQsIHVubGlrZSB3aXRoIHRoZSBmdW5jdGlvbiBkZWZpbmVzCitkbmwgIGFib3ZlLiAgQWxzbywgImRlZmxpdCIgaXMgdXNlZCBzbyB0aGF0IHNvbWV0aGluZyBsaWtlIF9fY2x6X3RhYiglZWJ4KQorZG5sICBjb21lcyBvdXQgYXMgX19nbXBuX2Nsel90YWIoJWVieCksIGZvciB0aGUgYmVuZWZpdCBvZiBDUFVzIHdpdGggdGhhdAorZG5sICBzdHlsZSBhc3NlbWJsZXIgc3ludGF4LgorCitkZWZsaXQoX19jbHpfdGFiLAorbTRfYXNzZXJ0X2RlZmluZWQoYEdTWU1fUFJFRklYJykKK2BHU1lNX1BSRUZJWGAnTVBOKGBjbHpfdGFiJyknKQorCitkZWZsaXQoYmludmVydF9saW1iX3RhYmxlLAorbTRfYXNzZXJ0X2RlZmluZWQoYEdTWU1fUFJFRklYJykKK2BHU1lNX1BSRUZJWGAnX19nbXBfYmludmVydF9saW1iX3RhYmxlJykKKworCitkbmwgIFVzYWdlOiBBU01fU1RBUlQoKQorZG5sCitkbmwgIEVtaXQgYW55IGRpcmVjdGl2ZXMgbmVlZGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIGFuIGFzc2VtYmxlciBmaWxlLCBsaWtlCitkbmwgICIuc2V0IG5vcmVvcmRlciIgb3Igd2hhdGV2ZXIuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBpcyBub3RoaW5nLCBidXQKK2RubCAgaXQncyByZWRlZmluZWQgYnkgQ1BVIHNwZWNpZmljIG00IGZpbGVzLgorCitkZWZpbmUoQVNNX1NUQVJUKQorCisKK2RubCAgVXNhZ2U6IEFTTV9FTkQoKQorZG5sCitkbmwgIEVtaXQgYW55IGRpcmVjdGl2ZXMgbmVlZGVkIG9uY2UgYXQgdGhlIGVuZCBvZiBhbiBhc3NlbWJsZXIgZmlsZS4gIFRoZQorZG5sICBkZWZhdWx0IGZvciB0aGlzIGlzIG5vdGhpbmcsIGJ1dCBpdCdzIHJlZGVmaW5lZCBieSBDUFUgc3BlY2lmaWMgbTQgZmlsZXMuCisKK2RlZmluZShBU01fRU5EKQorCisKK2RubCAgVXNhZ2U6IFBST0xPR1VFKGZvb1sscGFyYW1dKQorZG5sICAgICAgICAgRVBJTE9HVUUoZm9vKQorZG5sCitkbmwgIEVtaXQgZGlyZWN0aXZlcyB0byBzdGFydCBvciBlbmQgYSBmdW5jdGlvbi4gIEdTWU1fUFJFRklYIGlzIGFkZGVkIGJ5CitkbmwgIHRoZXNlIG1hY3JvcyBpZiBuZWNlc3NhcnksIHNvIHRoZSBnaXZlbiAiZm9vIiBpcyB3aGF0IHRoZSBmdW5jdGlvbiB3aWxsCitkbmwgIGJlIGNhbGxlZCBpbiBDLgorZG5sCitkbmwgIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIFBST0xPR1VFIGlzIHVzZWQgb25seSBmb3Igc29tZSBDUFVzIGFuZCBzaG91bGQKK2RubCAgYmUgb21pdHRlZCBpZiBub3QgcmVxdWlyZWQuCitkbmwKK2RubCAgTmVzdGVkIG9yIG92ZXJsYXBwaW5nIFBST0xPR1VFL0VQSUxPR1VFIHBhaXJzIGFyZSBhbGxvd2VkLCBpZiB0aGF0CitkbmwgIG1ha2VzIHNlbnNlIGZvciB0aGUgc3lzdGVtLiAgVGhlIG5hbWUgZ2l2ZW4gdG8gRVBJTE9HVUUgbXVzdCBiZSBhCitkbmwgIGN1cnJlbnRseSBvcGVuIFBST0xPR1VFLgorZG5sCitkbmwgIElmIG9ubHkgb25lIFBST0xPR1VFIGlzIG9wZW4gdGhlbiB0aGUgbmFtZSBjYW4gYmUgb21pdHRlZCBmcm9tCitkbmwgIEVQSUxPR1VFLiAgVGhpcyBpcyBlbmNvdXJhZ2VkLCBzaW5jZSBpdCBtZWFucyB0aGUgbmFtZSBvbmx5IGhhcyB0bworZG5sICBhcHBlYXIgaW4gb25lIHBsYWNlLCBub3QgdHdvLgorZG5sCitkbmwgIFRoZSBnaXZlbiBuYW1lICJmb28iIGlzIG5vdCBmdWxseSBxdW90ZWQgaGVyZSwgaXQgd2lsbCBiZSBtYWNybworZG5sICBleHBhbmRlZCBtb3JlIHRoYW4gb25jZS4gIFRoaXMgaXMgdGhlIHdheSB0aGUgbTRfbGlzdCBtYWNyb3Mgd29yaywgYW5kCitkbmwgIGl0IGFsc28gaGVscHMgdGhlIHR1bmUvbWFueS5wbCBwcm9ncmFtIGRvIGEgcmVuYW1pbmcgbGlrZQorZG5sICAtRF9fZ21wbl9hZGRfbj1tcG5fYWRkX25fZm9vIHdoZW4gR1NZTV9QUkVGSVggaXMgbm90IGVtcHR5LgorCitkZWZpbmUoUFJPTE9HVUUsCittNF9hc3NlcnRfbnVtYXJnc19yYW5nZSgxLDIpCitgbTRfZmlsZV9zZWVuKClkbmwKK2RlZmluZShgUFJPTE9HVUVfbGlzdCcsbTRfbGlzdF9xdW90ZSgkMSxQUk9MT0dVRV9saXN0KSlkbmwKK2lmZWxzZShgJDInLCwKK2BQUk9MT0dVRV9jcHUoR1NZTV9QUkVGSVhgJyQxKScsCitgUFJPTE9HVUVfY3B1KEdTWU1fUFJFRklYYCckMSxgJDInKScpJykKKworZGVmaW5lKEVQSUxPR1VFLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMCwxKQorYGlmZWxzZShgJDEnLCwKK2BpZmVsc2UobTRfbGlzdF9jb3VudChQUk9MT0dVRV9saXN0KSwwLAorYG00X2Vycm9yKGBubyBvcGVuIGZ1bmN0aW9ucyBmb3IgRVBJTE9HVUUKKycpJywKK2BpZmVsc2UobTRfbGlzdF9jb3VudChQUk9MT0dVRV9saXN0KSwxLAorYEVQSUxPR1VFX2ludGVybmFsKFBST0xPR1VFX2N1cnJlbnRfZnVuY3Rpb24pJywKK2BtNF9lcnJvcihgbW9yZSB0aGFuIG9uZSBvcGVuIGZ1bmN0aW9uIGZvciBFUElMT0dVRQorJyknKScpJywKK2BFUElMT0dVRV9pbnRlcm5hbChgJDEnKScpJykKKworZGVmaW5lKEVQSUxPR1VFX2ludGVybmFsLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK200X2Fzc2VydF9kZWZpbmVkKGBFUElMT0dVRV9jcHUnKQorYGlmZWxzZShtNF9saXN0X2ZpbmQoJDEsUFJPTE9HVUVfbGlzdCksMCwKK2BtNF9lcnJvcihgRVBJTE9HVUUgd2l0aG91dCBQUk9MT0dVRTogJDEKKycpJylkbmwKK2RlZmluZShgUFJPTE9HVUVfbGlzdCcsbTRfbGlzdF9xdW90ZShtNF9saXN0X3JlbW92ZSgkMSxQUk9MT0dVRV9saXN0KSkpZG5sCitFUElMT0dVRV9jcHUoR1NZTV9QUkVGSVhgJDEnKScpCisKK2RubCAgQ3VycmVudGx5IG9wZW4gUFJPTE9HVUVzLCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgorZGVmaW5lKFBST0xPR1VFX2xpc3QpCisKKworZG5sICBDYWxsZWQ6IFBST0xPR1VFX2NoZWNrKGxpc3QsLi4uKQorZG5sICBDaGVjayB0aGVyZSdzIG5vIHJlbWFpbmluZyBvcGVuIFBST0xPR1VFcyBhdCB0aGUgZW5kIG9mIGlucHV0LgorZGVmaW5lKFBST0xPR1VFX2NoZWNrLAorYGlmZWxzZSgkMSwsLAorYG00X2Vycm9yKGBubyBFUElMT0dVRSBmb3I6ICQxCisnKWRubAorUFJPTE9HVUVfY2hlY2soc2hpZnQoJEApKScpJykKKworbTR3cmFwX3ByZXBlbmQoYFBST0xPR1VFX2NoZWNrKFBST0xPR1VFX2xpc3QpJykKKworCitkbmwgIFVzYWdlOiBQUk9MT0dVRV9jdXJyZW50X2Z1bmN0aW9uCitkbmwKK2RubCAgVGhpcyBtYWNybyBleHBhbmRzIHRvIHRoZSBjdXJyZW50IFBST0xPR1VFL0VQSUxPR1VFIGZ1bmN0aW9uLCBvciB0aGUKK2RubCAgbW9zdCByZWNlbnQgUFJPTE9HVUUgaWYgc3VjaCBwYWlycyBhcmUgbmVzdGVkIG9yIG92ZXJsYXBwZWQuCisKK2RlZmluZShQUk9MT0dVRV9jdXJyZW50X2Z1bmN0aW9uLAorbTRfYXNzZXJ0X251bWFyZ3MoLTEpCitgbTRfbGlzdF9maXJzdChQUk9MT0dVRV9saXN0KScpCisKKworZG5sICBVc2FnZTogUFJPTE9HVUVfY3B1KEdTWU1fUFJFRklYYCdmb29bLHBhcmFtXSkKK2RubCAgICAgICAgIEVQSUxPR1VFX2NwdShHU1lNX1BSRUZJWGAnZm9vKQorZG5sCitkbmwgIFRoZXNlIG1hY3JvcyBob2xkIHRoZSBDUFUtc3BlY2lmaWMgcGFydHMgb2YgUFJPTE9HVUUgYW5kIEVQSUxPR1VFLgorZG5sICBCb3RoIGFyZSBjYWxsZWQgd2l0aCB0aGUgZnVuY3Rpb24gbmFtZSwgd2l0aCBHU1lNX1BSRUZJWCBhbHJlYWR5CitkbmwgIHByZXBlbmRlZC4KK2RubAorZG5sICBUaGUgZGVmaW5pdGlvbnMgaGVyZSBhcmUgc29tZXRoaW5nIHR5cGljYWwgYW5kIHNlbnNpYmxlLCBidXQgQ1BVIG9yCitkbmwgIHN5c3RlbSBzcGVjaWZpYyBtNCBmaWxlcyBzaG91bGQgcmVkZWZpbmUgdGhlbSBhcyBuZWNlc3NhcnkuICBUaGUKK2RubCAgb3B0aW9uYWwgZXh0cmEgcGFyYW1ldGVyIHRvIFBST0xPR1VFX2NwdSBpcyBub3QgZXhwZWN0ZWQgYW5kIG5vdAorZG5sICBhY2NlcHRlZCBoZXJlLgorCitkZWZpbmUoUFJPTE9HVUVfY3B1LAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2AJVEVYVAorCUFMSUdOKDgpCisJR0xPQkwJYCQxJyBHTE9CTF9BVFRSCisJVFlQRShgJDEnLGBmdW5jdGlvbicpCitgJDEnTEFCRUxfU1VGRklYJykKKworZGVmaW5lKEVQSUxPR1VFX2NwdSwKK2AJU0laRShgJDEnLC4tYCQxJyknKQorCisKK2RubCAgVXNhZ2U6IEwobmFtZSkKK2RubAorZG5sICBHZW5lcmF0ZSBhIGxvY2FsIGxhYmVsIHdpdGggdGhlIGdpdmVuIG5hbWUuICBUaGlzIGlzIHNpbXBseSBhCitkbmwgIGNvbnZlbmllbnQgd2F5IHRvIGFkZCBMU1lNX1BSRUZJWC4KK2RubAorZG5sICBMU1lNX1BSRUZJWCBtaWdodCBiZSBMJCwgc28gZGVmbigpIG11c3QgYmUgdXNlZCB0byBxdW90ZSBpdCBvciB0aGUgTAorZG5sICB3aWxsIGV4cGFuZCBhZ2FpbiBhcyB0aGUgTCBtYWNybywgbWFraW5nIGFuIGluZmluaXRlIHJlY3Vyc2lvbi4KKworZGVmaW5lKGBMJywKK200X2Fzc2VydF9udW1hcmdzKDEpCitgZGVmbihgTFNZTV9QUkVGSVgnKSQxJykKKworCitkbmwgIFVzYWdlOiBMREVGKG5hbWUpCitkbmwKK2RubCAgR2VuZXJhdGUgYSBkaXJlY3RpdmUgdG8gZGVmaW5lIGEgbG9jYWwgbGFiZWwuCitkbmwKK2RubCAgT24gc3lzdGVtcyB3aXRoIGEgZml4ZWQgc3ludGF4IGZvciBkZWZpbmluZyBsYWJlbHMgdGhlcmUncyBubyBuZWVkIHRvCitkbmwgIHVzZSB0aGlzIG1hY3JvLCBpdCdzIG9ubHkgbWVhbnQgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIHN5bnRheCB2YXJpZXMsCitkbmwgIGxpa2UgaHBwYSB3aGljaCBpcyAiTChmb28pOiIgd2l0aCBnYXMsIGJ1dCBqdXN0ICJMKGZvbykiIGluIGNvbHVtbiAwCitkbmwgIHdpdGggdGhlIHN5c3RlbSBgYXMnLgorZG5sCitkbmwgIFRoZSBleHRyYSBgJyBhZnRlciBMQUJFTF9TVUZGSVggYXZvaWRzIGFueSBjaGFuY2Ugb2YgYSBmb2xsb3dpbmcKK2RubCAgIiguLi4pIiAgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4gYXJndW1lbnQgbGlzdC4gIE5vdCB0aGF0IGl0J2QgYmUKK2RubCAgc2Vuc2libGUgdG8gd3JpdGUgYW55dGhpbmcgbGlrZSB0aGF0IGFmdGVyIGFuIExERUYoKSwgYnV0IGp1c3QgaW4gY2FzZS4KKworZGVmaW5lKExERUYsCittNF9hc3NlcnRfbnVtYXJncygxKQorbTRfYXNzZXJ0X2RlZmluZWQoYExBQkVMX1NVRkZJWCcpCitgTChgJDEnKWAnTEFCRUxfU1VGRklYYCcnKQorCisKK2RubCAgVXNhZ2U6IElOVDMyKGxhYmVsLHZhbHVlKQorZG5sICAgICAgICAgSU5UNjQobGFiZWwsZmlyc3Qsc2Vjb25kKQorCitkZWZpbmUoYElOVDMyJywKK200X2Fzc2VydF9kZWZpbmVkKGBXMzInKQorYAlBTElHTig0KQorTERFRihgJDEnKQorCVczMgkkMicpCisKK2RlZmluZShgSU5UNjQnLAorbTRfYXNzZXJ0X2RlZmluZWQoYFczMicpCitgCUFMSUdOKDgpCitMREVGKGAkMScpCisJVzMyCSQyCisJVzMyCSQzJykKKworCitkbmwgIFVzYWdlOiBBTElHTihieXRlcykKK2RubAorZG5sICBFbWl0IGEgIi5hbGlnbiIgZGlyZWN0aXZlLiAgVGhlIGFsaWdubWVudCBpcyBzcGVjaWZpZWQgaW4gYnl0ZXMsIGFuZAorZG5sICB3aWxsIG5vcm1hbGx5IG5lZWQgdG8gYmUgYSBwb3dlciBvZiAyLiAgVGhlIGFjdHVhbCAiLmFsaWduIiBnZW5lcmF0ZWQKK2RubCAgaXMgZWl0aGVyIGJ5dGVzIG9yIGxvZ2FyaXRobWljIGFjY29yZGluZyB0byB3aGF0IC4vY29uZmlndXJlIGZpbmRzIHRoZQorZG5sICBhc3NlbWJsZXIgbmVlZHMuCitkbmwKK2RubCAgSWYgQUxJR05fRklMTF8weDkwIGlzIGRlZmluZWQgYW5kIGVxdWFsIHRvICJ5ZXMiLCB0aGVuICIsIDB4OTAiIGlzCitkbmwgIGFwcGVuZGVkLiAgVGhpcyBpcyBmb3IgeDg2LCBzZWUgbXBuL3g4Ni9SRUFETUUuCisKK2RlZmluZShBTElHTiwKK200X2Fzc2VydF9udW1hcmdzKDEpCittNF9hc3NlcnRfZGVmaW5lZChgQUxJR05fTE9HQVJJVEhNSUMnKQorYC5hbGlnbglpZmVsc2UoQUxJR05fTE9HQVJJVEhNSUMseWVzLGBtNF9sb2cyKCQxKScsYGV2YWwoJDEpJylkbmwKK2lmZWxzZShBTElHTl9GSUxMXzB4OTAseWVzLGAsIDB4OTAnKScpCisKKworZG5sICBVc2FnZTogTVVMRlVOQ19QUk9MT0dVRShmdW5jdGlvbiBmdW5jdGlvbi4uLikKK2RubAorZG5sICBBIGR1bW15IG1hY3JvIHdoaWNoIGlzIGdyZXBwZWQgZm9yIGJ5IC4vY29uZmlndXJlIHRvIGtub3cgd2hhdAorZG5sICBmdW5jdGlvbnMgYSBtdWx0aS1mdW5jdGlvbiBmaWxlIGlzIHByb3ZpZGluZy4gIFVzZSB0aGlzIGlmIHRoZXJlIGFyZW4ndAorZG5sICBleHBsaWNpdCBQUk9MT0dVRSgpcyBmb3IgZWFjaCBwb3NzaWJsZSBmdW5jdGlvbi4KK2RubAorZG5sICBNdWx0aXBsZSBNVUxGVU5DX1BST0xPR1VFcyBjYW4gYmUgdXNlZCwgb3IganVzdCBvbmUgd2l0aCB0aGUgZnVuY3Rpb24KK2RubCAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKworZGVmaW5lKGBNVUxGVU5DX1BST0xPR1VFJywKK200X2Fzc2VydF9udW1hcmdzKDEpCispCisKKworZG5sICBVc2FnZTogTkFJTFNfU1VQUE9SVChzcGVjIHNwZWMgLi4uKQorZG5sCitkbmwgIEEgZHVtbXkgbWFjcm8gd2hpY2ggaXMgZ3JlcHBlZCBmb3IgYnkgLi9jb25maWd1cmUgdG8ga25vdyB3aGF0IG5haWxzCitkbmwgIGFyZSBzdXBwb3J0ZWQgaW4gYW4gYXNtIGZpbGUuCitkbmwKK2RubCAgUmFuZ2VzIGNhbiBiZSBnaXZlbiwgb3IganVzdCBpbmRpdmlkdWFsIHZhbHVlcy4gIE11bHRpcGxlIHZhbHVlcyBvcgorZG5sICByYW5nZXMgY2FuIGJlIGdpdmVuLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgTXVsdGlwbGUgTkFJTFNfU1VQUE9SVAorZG5sICBkZWNsYXJhdGlvbnMgd29yayB0b28uICBTb21lIGV4YW1wbGVzLAorZG5sCitkbmwgICAgICAgICBOQUlMU19TVVBQT1JUKDEtMjApCitkbmwgICAgICAgICBOQUlMU19TVVBQT1JUKDEgNiA5LTEyKQorZG5sICAgICAgICAgTkFJTFNfU1VQUE9SVCgxLTEwIDE2LTIwKQorCitkZWZpbmUoTkFJTFNfU1VQUE9SVCwKK200X2Fzc2VydF9udW1hcmdzKDEpCispCisKKworZG5sICBVc2FnZTogQUJJX1NVUFBPUlQoYWJpKQorZG5sCitkbmwgIEEgZHVtbXkgbWFjcm8gd2hpY2ggaXMgZ3JlcHBlZCBmb3IgYnkgLi9jb25maWd1cmUgdG8ga25vdyB3aGF0IEFCSXMKK2RubCAgYXJlIHN1cHBvcnRlZCBpbiBhbiBhc20gZmlsZS4KK2RubAorZG5sICBJZiBtdWx0aXBsZSBub24tc3RhbmRhcmQgQUJJcyBhcmUgc3VwcG9ydGVkLCBzZXZlcmFsIEFCSV9TVVBQT1JUCitkbmwgIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgdXNlZDoKK2RubAorZG5sICAgICAgICAgQUJJX1NVUFBPUlQoRk9PQUJJKQorZG5sICAgICAgICAgQUJJX1NVUFBPUlQoQkFSQUJJKQorCitkZWZpbmUoQUJJX1NVUFBPUlQsCittNF9hc3NlcnRfbnVtYXJncygxKQorKQorCisKK2RubCAgVXNhZ2U6IEdNUF9OVU1CX01BU0sKK2RubAorZG5sICBBIGJpdCBtYXNrIGZvciB0aGUgbnVtYmVyIHBhcnQgb2YgYSBsaW1iLiAgRWcuIHdpdGggNiBiaXQgbmFpbHMgaW4gYQorZG5sICAzMiBiaXQgbGltYiwgR01QX05VTUJfTUFTSyB3b3VsZCBiZSAweDNmZmZmZmYuCisKK2RlZmluZShHTVBfTlVNQl9NQVNLLAorbTRfYXNzZXJ0X251bWFyZ3MoLTEpCittNF9hc3NlcnRfZGVmaW5lZChgR01QX05VTUJfQklUUycpCitgbTRfaGV4X2xvd21hc2soR01QX05VTUJfQklUUyknKQorCisKK2RubCAgVXNhZ2U6IG00YXBwZW5kKGB2YXJpYWJsZScsYHZhbHVlLXRvLWFwcGVuZCcpCisKK2RlZmluZShgbTRhcHBlbmQnLAorYGRlZmluZShgJDEnLCAgZGVmbihgJDEnKWAkMicpCisnCispCisKK2RpdmVydGAnZG5sCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9hZGQuYyBiL21wbi9nZW5lcmljL2FkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNmUzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9hZGQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBtcG5fYWRkIC0gYWRkIG1wbiB0byBtcG4uCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wbl9hZGQgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2FkZF8xLmMgYi9tcG4vZ2VuZXJpYy9hZGRfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9hZGRfMS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wbl9hZGRfMSAtIGFkZCBsaW1iIHRvIG1wbi4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXBuX2FkZF8xIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9hZGRfZXJyMV9uLmMgYi9tcG4vZ2VuZXJpYy9hZGRfZXJyMV9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0N2YxOQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2FkZF9lcnIxX24uYwpAQCAtMCwwICsxLDEwMCBAQAorLyogbXBuX2FkZF9lcnIxX24gLS0gYWRkX24gd2l0aCBvbmUgZXJyb3IgdGVybQorCisgICBDb250cmlidXRlZCBieSBEYXZpZCBIYXJ2ZXkuCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyoKKyAgQ29tcHV0ZXM6CisKKyAgKDEpIHtycCxufSA6PSB7dXAsbn0gKyB7dnAsbn0gKGp1c3QgbGlrZSBtcG5fYWRkX24pIHdpdGggaW5jb21pbmcgY2FycnkgY3ksCisgIHJldHVybiB2YWx1ZSBpcyBjYXJyeSBvdXQuCisKKyAgKDIpIExldCBjW2krMV0gPSBjYXJyeSBmcm9tIGktdGggbGltYiBhZGRpdGlvbiAoY1swXSA9IGN5KS4KKyAgQ29tcHV0ZXMgY1sxXSp5cFtuLTFdICsgLi4uICsgY1tuXSp5cFswXSwgc3RvcmVzIHR3by1saW1iIHJlc3VsdCBhdCBlcC4KKworICBSZXF1aXJlcyBuID49IDEuCisKKyAgTm9uZSBvZiB0aGUgb3V0cHV0cyBtYXkgb3ZlcmxhcCBlYWNoIG90aGVyIG9yIGFueSBvZiB0aGUgaW5wdXRzLCBleGNlcHQKKyAgdGhhdCB7cnAsbn0gbWF5IGJlIGVxdWFsIHRvIHt1cCxufSBvciB7dnAsbn0uCisqLworbXBfbGltYl90CittcG5fYWRkX2VycjFfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwKKwkJbXBfcHRyIGVwLCBtcF9zcmNwdHIgeXAsCisgICAgICAgICAgICAgICAgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBjeSkKK3sKKyAgbXBfbGltYl90IGVsLCBlaCwgdWwsIHZsLCB5bCwgemwsIHJsLCBzbCwgY3kxLCBjeTI7CisKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB2cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocnAsIG4sIHlwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgMiwgdXAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCAyLCB2cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDIsIHlwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgMiwgcnAsIG4pKTsKKworICB5cCArPSBuIC0gMTsKKyAgZWwgPSBlaCA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICB5bCA9ICp5cC0tOworICAgICAgdWwgPSAqdXArKzsKKyAgICAgIHZsID0gKnZwKys7CisKKyAgICAgIC8qIG9yZGluYXJ5IGFkZF9uICovCisgICAgICBBRERDX0xJTUIgKGN5MSwgc2wsIHVsLCB2bCk7CisgICAgICBBRERDX0xJTUIgKGN5MiwgcmwsIHNsLCBjeSk7CisgICAgICBjeSA9IGN5MSB8IGN5MjsKKyAgICAgICpycCsrID0gcmw7CisKKyAgICAgIC8qIHVwZGF0ZSAoZWg6ZWwpICovCisgICAgICB6bCA9ICgtY3kpICYgeWw7CisgICAgICBlbCArPSB6bDsKKyAgICAgIGVoICs9IGVsIDwgemw7CisgICAgfQorICB3aGlsZSAoLS1uKTsKKworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorICBlaCA9IChlaCA8PCBHTVBfTkFJTF9CSVRTKSArIChlbCA+PiBHTVBfTlVNQl9CSVRTKTsKKyAgZWwgJj0gR01QX05VTUJfTUFTSzsKKyNlbmRpZgorCisgIGVwWzBdID0gZWw7CisgIGVwWzFdID0gZWg7CisKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvYWRkX2VycjJfbi5jIGIvbXBuL2dlbmVyaWMvYWRkX2VycjJfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODRkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9hZGRfZXJyMl9uLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIG1wbl9hZGRfZXJyMl9uIC0tIGFkZF9uIHdpdGggdHdvIGVycm9yIHRlcm1zCisKKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhhcnZleS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKgorICBDb21wdXRlczoKKworICAoMSkge3JwLG59IDo9IHt1cCxufSArIHt2cCxufSAoanVzdCBsaWtlIG1wbl9hZGRfbikgd2l0aCBpbmNvbWluZyBjYXJyeSBjeSwKKyAgcmV0dXJuIHZhbHVlIGlzIGNhcnJ5IG91dC4KKworICAoMikgTGV0IGNbaSsxXSA9IGNhcnJ5IGZyb20gaS10aCBsaW1iIGFkZGl0aW9uIChjWzBdID0gY3kpLgorICBDb21wdXRlcyBjWzFdKnlwMVtuLTFdICsgLi4uICsgY1tuXSp5cDFbMF0sCisgICAgICAgICAgIGNbMV0qeXAyW24tMV0gKyAuLi4gKyBjW25dKnlwMlswXSwKKyAgc3RvcmVzIHR3by1saW1iIHJlc3VsdHMgYXQge2VwLDJ9IGFuZCB7ZXArMiwyfSByZXNwZWN0aXZlbHkuCisKKyAgUmVxdWlyZXMgbiA+PSAxLgorCisgIE5vbmUgb2YgdGhlIG91dHB1dHMgbWF5IG92ZXJsYXAgZWFjaCBvdGhlciBvciBhbnkgb2YgdGhlIGlucHV0cywgZXhjZXB0CisgIHRoYXQge3JwLG59IG1heSBiZSBlcXVhbCB0byB7dXAsbn0gb3Ige3ZwLG59LgorKi8KK21wX2xpbWJfdAorbXBuX2FkZF9lcnIyX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsCisgICAgICAgICAgICAgICAgbXBfcHRyIGVwLCBtcF9zcmNwdHIgeXAxLCBtcF9zcmNwdHIgeXAyLAorICAgICAgICAgICAgICAgIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgY3kpCit7CisgIG1wX2xpbWJfdCBlbDEsIGVoMSwgZWwyLCBlaDIsIHVsLCB2bCwgeWwxLCB5bDIsIHpsMSwgemwyLCBybCwgc2wsIGN5MSwgY3kyOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdXAsIG4pKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdnAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cDEsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cDIsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCA0LCB1cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDQsIHZwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNCwgeXAxLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNCwgeXAyLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNCwgcnAsIG4pKTsKKworICB5cDEgKz0gbiAtIDE7CisgIHlwMiArPSBuIC0gMTsKKyAgZWwxID0gZWgxID0gMDsKKyAgZWwyID0gZWgyID0gMDsKKworICBkbworICAgIHsKKyAgICAgIHlsMSA9ICp5cDEtLTsKKyAgICAgIHlsMiA9ICp5cDItLTsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrOworCisgICAgICAvKiBvcmRpbmFyeSBhZGRfbiAqLworICAgICAgQUREQ19MSU1CIChjeTEsIHNsLCB1bCwgdmwpOworICAgICAgQUREQ19MSU1CIChjeTIsIHJsLCBzbCwgY3kpOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworCisgICAgICAvKiB1cGRhdGUgKGVoMTplbDEpICovCisgICAgICB6bDEgPSAoLWN5KSAmIHlsMTsKKyAgICAgIGVsMSArPSB6bDE7CisgICAgICBlaDEgKz0gZWwxIDwgemwxOworCisgICAgICAvKiB1cGRhdGUgKGVoMjplbDIpICovCisgICAgICB6bDIgPSAoLWN5KSAmIHlsMjsKKyAgICAgIGVsMiArPSB6bDI7CisgICAgICBlaDIgKz0gZWwyIDwgemwyOworICAgIH0KKyAgd2hpbGUgKC0tbik7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgZWgxID0gKGVoMSA8PCBHTVBfTkFJTF9CSVRTKSArIChlbDEgPj4gR01QX05VTUJfQklUUyk7CisgIGVsMSAmPSBHTVBfTlVNQl9NQVNLOworICBlaDIgPSAoZWgyIDw8IEdNUF9OQUlMX0JJVFMpICsgKGVsMiA+PiBHTVBfTlVNQl9CSVRTKTsKKyAgZWwyICY9IEdNUF9OVU1CX01BU0s7CisjZW5kaWYKKworICBlcFswXSA9IGVsMTsKKyAgZXBbMV0gPSBlaDE7CisgIGVwWzJdID0gZWwyOworICBlcFszXSA9IGVoMjsKKworICByZXR1cm4gY3k7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9hZGRfZXJyM19uLmMgYi9tcG4vZ2VuZXJpYy9hZGRfZXJyM19uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlZDRkYwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2FkZF9lcnIzX24uYwpAQCAtMCwwICsxLDEzMSBAQAorLyogbXBuX2FkZF9lcnIzX24gLS0gYWRkX24gd2l0aCB0aHJlZSBlcnJvciB0ZXJtcworCisgICBDb250cmlidXRlZCBieSBEYXZpZCBIYXJ2ZXkuCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyoKKyAgQ29tcHV0ZXM6CisKKyAgKDEpIHtycCxufSA6PSB7dXAsbn0gKyB7dnAsbn0gKGp1c3QgbGlrZSBtcG5fYWRkX24pIHdpdGggaW5jb21pbmcgY2FycnkgY3ksCisgIHJldHVybiB2YWx1ZSBpcyBjYXJyeSBvdXQuCisKKyAgKDIpIExldCBjW2krMV0gPSBjYXJyeSBmcm9tIGktdGggbGltYiBhZGRpdGlvbiAoY1swXSA9IGN5KS4KKyAgQ29tcHV0ZXMgY1sxXSp5cDFbbi0xXSArIC4uLiArIGNbbl0qeXAxWzBdLAorICAgICAgICAgICBjWzFdKnlwMltuLTFdICsgLi4uICsgY1tuXSp5cDJbMF0sCisgICAgICAgICAgIGNbMV0qeXAzW24tMV0gKyAuLi4gKyBjW25dKnlwM1swXSwKKyAgc3RvcmVzIHR3by1saW1iIHJlc3VsdHMgYXQge2VwLDJ9LCB7ZXArMiwyfSBhbmQge2VwKzQsMn0gcmVzcGVjdGl2ZWx5LgorCisgIFJlcXVpcmVzIG4gPj0gMS4KKworICBOb25lIG9mIHRoZSBvdXRwdXRzIG1heSBvdmVybGFwIGVhY2ggb3RoZXIgb3IgYW55IG9mIHRoZSBpbnB1dHMsIGV4Y2VwdAorICB0aGF0IHtycCxufSBtYXkgYmUgZXF1YWwgdG8ge3VwLG59IG9yIHt2cCxufS4KKyovCittcF9saW1iX3QKK21wbl9hZGRfZXJyM19uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLAorICAgICAgICAgICAgICAgIG1wX3B0ciBlcCwgbXBfc3JjcHRyIHlwMSwgbXBfc3JjcHRyIHlwMiwgbXBfc3JjcHRyIHlwMywKKyAgICAgICAgICAgICAgICBtcF9zaXplX3QgbiwgbXBfbGltYl90IGN5KQoreworICBtcF9saW1iX3QgZWwxLCBlaDEsIGVsMiwgZWgyLCBlbDMsIGVoMywgdWwsIHZsLCB5bDEsIHlsMiwgeWwzLCB6bDEsIHpsMiwgemwzLCBybCwgc2wsIGN5MSwgY3kyOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdXAsIG4pKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdnAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cDEsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cDIsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cDMsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCA2LCB1cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDYsIHZwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNiwgeXAxLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNiwgeXAyLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNiwgeXAzLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNiwgcnAsIG4pKTsKKworICB5cDEgKz0gbiAtIDE7CisgIHlwMiArPSBuIC0gMTsKKyAgeXAzICs9IG4gLSAxOworICBlbDEgPSBlaDEgPSAwOworICBlbDIgPSBlaDIgPSAwOworICBlbDMgPSBlaDMgPSAwOworCisgIGRvCisgICAgeworICAgICAgeWwxID0gKnlwMS0tOworICAgICAgeWwyID0gKnlwMi0tOworICAgICAgeWwzID0gKnlwMy0tOworICAgICAgdWwgPSAqdXArKzsKKyAgICAgIHZsID0gKnZwKys7CisKKyAgICAgIC8qIG9yZGluYXJ5IGFkZF9uICovCisgICAgICBBRERDX0xJTUIgKGN5MSwgc2wsIHVsLCB2bCk7CisgICAgICBBRERDX0xJTUIgKGN5MiwgcmwsIHNsLCBjeSk7CisgICAgICBjeSA9IGN5MSB8IGN5MjsKKyAgICAgICpycCsrID0gcmw7CisKKyAgICAgIC8qIHVwZGF0ZSAoZWgxOmVsMSkgKi8KKyAgICAgIHpsMSA9ICgtY3kpICYgeWwxOworICAgICAgZWwxICs9IHpsMTsKKyAgICAgIGVoMSArPSBlbDEgPCB6bDE7CisKKyAgICAgIC8qIHVwZGF0ZSAoZWgyOmVsMikgKi8KKyAgICAgIHpsMiA9ICgtY3kpICYgeWwyOworICAgICAgZWwyICs9IHpsMjsKKyAgICAgIGVoMiArPSBlbDIgPCB6bDI7CisKKyAgICAgIC8qIHVwZGF0ZSAoZWgzOmVsMykgKi8KKyAgICAgIHpsMyA9ICgtY3kpICYgeWwzOworICAgICAgZWwzICs9IHpsMzsKKyAgICAgIGVoMyArPSBlbDMgPCB6bDM7CisgICAgfQorICB3aGlsZSAoLS1uKTsKKworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorICBlaDEgPSAoZWgxIDw8IEdNUF9OQUlMX0JJVFMpICsgKGVsMSA+PiBHTVBfTlVNQl9CSVRTKTsKKyAgZWwxICY9IEdNUF9OVU1CX01BU0s7CisgIGVoMiA9IChlaDIgPDwgR01QX05BSUxfQklUUykgKyAoZWwyID4+IEdNUF9OVU1CX0JJVFMpOworICBlbDIgJj0gR01QX05VTUJfTUFTSzsKKyAgZWgzID0gKGVoMyA8PCBHTVBfTkFJTF9CSVRTKSArIChlbDMgPj4gR01QX05VTUJfQklUUyk7CisgIGVsMyAmPSBHTVBfTlVNQl9NQVNLOworI2VuZGlmCisKKyAgZXBbMF0gPSBlbDE7CisgIGVwWzFdID0gZWgxOworICBlcFsyXSA9IGVsMjsKKyAgZXBbM10gPSBlaDI7CisgIGVwWzRdID0gZWwzOworICBlcFs1XSA9IGVoMzsKKworICByZXR1cm4gY3k7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9hZGRfbi5jIGIvbXBuL2dlbmVyaWMvYWRkX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJhYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYWRkX24uYwpAQCAtMCwwICsxLDg5IEBACisvKiBtcG5fYWRkX24gLS0gQWRkIGVxdWFsIGxlbmd0aCBsaW1iIHZlY3RvcnMuCisKK0NvcHlyaWdodCAxOTkyLTE5OTQsIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKworbXBfbGltYl90CittcG5fYWRkX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgdWwsIHZsLCBzbCwgcmwsIGN5LCBjeTEsIGN5MjsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfSU5DUl9QIChycCwgdXAsIG4pKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB2cCwgbikpOworCisgIGN5ID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgdmwgPSAqdnArKzsKKyAgICAgIHNsID0gdWwgKyB2bDsKKyAgICAgIGN5MSA9IHNsIDwgdWw7CisgICAgICBybCA9IHNsICsgY3k7CisgICAgICBjeTIgPSBybCA8IHNsOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gY3k7Cit9CisKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAxCisKK21wX2xpbWJfdAorbXBuX2FkZF9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfbGltYl90IHVsLCB2bCwgcmwsIGN5OworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX0lOQ1JfUCAocnAsIHZwLCBuKSk7CisKKyAgY3kgPSAwOworICBkbworICAgIHsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrOworICAgICAgcmwgPSB1bCArIHZsICsgY3k7CisgICAgICBjeSA9IHJsID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICAqcnArKyA9IHJsICYgR01QX05VTUJfTUFTSzsKKyAgICB9CisgIHdoaWxlICgtLW4gIT0gMCk7CisKKyAgcmV0dXJuIGN5OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2FkZF9uX3N1Yl9uLmMgYi9tcG4vZ2VuZXJpYy9hZGRfbl9zdWJfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzJiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9hZGRfbl9zdWJfbi5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBtcG5fYWRkX25fc3ViX24gLS0gQWRkIGFuZCBTdWJ0cmFjdCB0d28gbGltYiB2ZWN0b3JzIG9mIGVxdWFsLCBub24temVybyBsZW5ndGguCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAxOTk5LTIwMDEsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWZuZGVmIEwxX0NBQ0hFX1NJWkUKKyNkZWZpbmUgTDFfQ0FDSEVfU0laRSA4MTkyCS8qIG9ubHkgNjgwNDAgaGFzIGxlc3MgdGhhbiB0aGlzICovCisjZW5kaWYKKworI2RlZmluZSBQQVJUX1NJWkUgKEwxX0NBQ0hFX1NJWkUgLyBHTVBfTElNQl9CWVRFUyAvIDYpCisKKworLyogbXBuX2FkZF9uX3N1Yl9uLgorICAgcjFbXSA9IHMxW10gKyBzMltdCisgICByMltdID0gczFbXSAtIHMyW10KKyAgIEFsbCBvcGVyYW5kcyBoYXZlIG4gbGltYnMuCisgICBJbi1wbGFjZSBvcGVyYXRpb25zIGFsbG93ZWQuICAqLworbXBfbGltYl90CittcG5fYWRkX25fc3ViX24gKG1wX3B0ciByMXAsIG1wX3B0ciByMnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgYWN5biwgYWN5bzsJCS8qIGNhcnJ5IGZvciBhZGQgKi8KKyAgbXBfbGltYl90IHNjeW4sIHNjeW87CQkvKiBjYXJyeSBmb3Igc3VidHJhY3QgKi8KKyAgbXBfc2l6ZV90IG9mZjsJCS8qIG9mZnNldCBpbiBvcGVyYW5kcyAqLworICBtcF9zaXplX3QgdGhpc19uOwkJLyogc2l6ZSBvZiBjdXJyZW50IGNodW5rICovCisKKyAgLyogV2UgYWx0ZXJuYXRpbmdseSBhZGQgYW5kIHN1YnRyYWN0IGluIGNodW5rcyB0aGF0IGZpdCBpbnRvIHRoZSAoTDEpCisgICAgIGNhY2hlLiAgU2luY2UgdGhlIGNodW5rcyBhcmUgc2V2ZXJhbCBodW5kcmVkIGxpbWJzLCB0aGUgZnVuY3Rpb24gY2FsbAorICAgICBvdmVyaGVhZCBpcyBpbnNpZ25pZmljYW50LCBidXQgd2UgZ2V0IG11Y2ggYmV0dGVyIGxvY2FsaXR5LiAgKi8KKworICAvKiBXZSBoYXZlIHRocmVlIHZhcmlhbnQgb2YgdGhlIGlubmVyIGxvb3AsIHRoZSBwcm9wZXIgbG9vcCBpcyBjaG9zZW4KKyAgICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcjEgb3IgcjIgYXJlIHRoZSBzYW1lIG9wZXJhbmQgYXMgczEgb3IgczIuICAqLworCisgIGlmIChyMXAgIT0gczFwICYmIHIxcCAhPSBzMnApCisgICAgeworICAgICAgLyogcjEgaXMgbm90IGlkZW50aWNhbCB0byBlaXRoZXIgaW5wdXQgb3BlcmFuZC4gIFdlIGNhbiB0aGVyZWZvcmUgd3JpdGUKKwkgdG8gcjEgZGlyZWN0bHksIHdpdGhvdXQgdXNpbmcgdGVtcG9yYXJ5IHN0b3JhZ2UuICAqLworICAgICAgYWN5byA9IDA7CisgICAgICBzY3lvID0gMDsKKyAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgbjsgb2ZmICs9IFBBUlRfU0laRSkKKwl7CisJICB0aGlzX24gPSBNSU4gKG4gLSBvZmYsIFBBUlRfU0laRSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworCSAgYWN5byA9IG1wbl9hZGRfbmMgKHIxcCArIG9mZiwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbiwgYWN5byk7CisjZWxzZQorCSAgYWN5biA9IG1wbl9hZGRfbiAocjFwICsgb2ZmLCBzMXAgKyBvZmYsIHMycCArIG9mZiwgdGhpc19uKTsKKwkgIGFjeW8gPSBhY3luICsgbXBuX2FkZF8xIChyMXAgKyBvZmYsIHIxcCArIG9mZiwgdGhpc19uLCBhY3lvKTsKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJfbmMKKwkgIHNjeW8gPSBtcG5fc3ViX25jIChyMnAgKyBvZmYsIHMxcCArIG9mZiwgczJwICsgb2ZmLCB0aGlzX24sIHNjeW8pOworI2Vsc2UKKwkgIHNjeW4gPSBtcG5fc3ViX24gKHIycCArIG9mZiwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbik7CisJICBzY3lvID0gc2N5biArIG1wbl9zdWJfMSAocjJwICsgb2ZmLCByMnAgKyBvZmYsIHRoaXNfbiwgc2N5byk7CisjZW5kaWYKKwl9CisgICAgfQorICBlbHNlIGlmIChyMnAgIT0gczFwICYmIHIycCAhPSBzMnApCisgICAgeworICAgICAgLyogcjIgaXMgbm90IGlkZW50aWNhbCB0byBlaXRoZXIgaW5wdXQgb3BlcmFuZC4gIFdlIGNhbiB0aGVyZWZvcmUgd3JpdGUKKwkgdG8gcjIgZGlyZWN0bHksIHdpdGhvdXQgdXNpbmcgdGVtcG9yYXJ5IHN0b3JhZ2UuICAqLworICAgICAgYWN5byA9IDA7CisgICAgICBzY3lvID0gMDsKKyAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgbjsgb2ZmICs9IFBBUlRfU0laRSkKKwl7CisJICB0aGlzX24gPSBNSU4gKG4gLSBvZmYsIFBBUlRfU0laRSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1Yl9uYworCSAgc2N5byA9IG1wbl9zdWJfbmMgKHIycCArIG9mZiwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbiwgc2N5byk7CisjZWxzZQorCSAgc2N5biA9IG1wbl9zdWJfbiAocjJwICsgb2ZmLCBzMXAgKyBvZmYsIHMycCArIG9mZiwgdGhpc19uKTsKKwkgIHNjeW8gPSBzY3luICsgbXBuX3N1Yl8xIChyMnAgKyBvZmYsIHIycCArIG9mZiwgdGhpc19uLCBzY3lvKTsKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbmMKKwkgIGFjeW8gPSBtcG5fYWRkX25jIChyMXAgKyBvZmYsIHMxcCArIG9mZiwgczJwICsgb2ZmLCB0aGlzX24sIGFjeW8pOworI2Vsc2UKKwkgIGFjeW4gPSBtcG5fYWRkX24gKHIxcCArIG9mZiwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbik7CisJICBhY3lvID0gYWN5biArIG1wbl9hZGRfMSAocjFwICsgb2ZmLCByMXAgKyBvZmYsIHRoaXNfbiwgYWN5byk7CisjZW5kaWYKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcjEgYW5kIHIyIGFyZSBpZGVudGljYWwgdG8gczEgYW5kIHMyIChyMT09czEgYW5kIHIyPT1zMiBvciB2aWNlIHZlcnNhKQorCSBOZWVkIHRlbXBvcmFyeSBzdG9yYWdlLiAgKi8KKyAgICAgIG1wX2xpbWJfdCB0cFtQQVJUX1NJWkVdOworICAgICAgYWN5byA9IDA7CisgICAgICBzY3lvID0gMDsKKyAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgbjsgb2ZmICs9IFBBUlRfU0laRSkKKwl7CisJICB0aGlzX24gPSBNSU4gKG4gLSBvZmYsIFBBUlRfU0laRSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworCSAgYWN5byA9IG1wbl9hZGRfbmMgKHRwLCBzMXAgKyBvZmYsIHMycCArIG9mZiwgdGhpc19uLCBhY3lvKTsKKyNlbHNlCisJICBhY3luID0gbXBuX2FkZF9uICh0cCwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbik7CisJICBhY3lvID0gYWN5biArIG1wbl9hZGRfMSAodHAsIHRwLCB0aGlzX24sIGFjeW8pOworI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1Yl9uYworCSAgc2N5byA9IG1wbl9zdWJfbmMgKHIycCArIG9mZiwgczFwICsgb2ZmLCBzMnAgKyBvZmYsIHRoaXNfbiwgc2N5byk7CisjZWxzZQorCSAgc2N5biA9IG1wbl9zdWJfbiAocjJwICsgb2ZmLCBzMXAgKyBvZmYsIHMycCArIG9mZiwgdGhpc19uKTsKKwkgIHNjeW8gPSBzY3luICsgbXBuX3N1Yl8xIChyMnAgKyBvZmYsIHIycCArIG9mZiwgdGhpc19uLCBzY3lvKTsKKyNlbmRpZgorCSAgTVBOX0NPUFkgKHIxcCArIG9mZiwgdHAsIHRoaXNfbik7CisJfQorICAgIH0KKworICByZXR1cm4gMiAqIGFjeW8gKyBzY3lvOworfQorCisjaWZkZWYgTUFJTgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidGltaW5nLmgiCisKK2xvbmcgY3B1dGltZSAoKTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wX3B0ciByMXAsIHIycCwgczFwLCBzMnA7CisgIGRvdWJsZSB0OworICBtcF9zaXplX3QgbjsKKworICBuID0gc3RydG9sIChhcmd2WzFdLCAwLCAwKTsKKworICByMXAgPSBtYWxsb2MgKG4gKiBHTVBfTElNQl9CWVRFUyk7CisgIHIycCA9IG1hbGxvYyAobiAqIEdNUF9MSU1CX0JZVEVTKTsKKyAgczFwID0gbWFsbG9jIChuICogR01QX0xJTUJfQllURVMpOworICBzMnAgPSBtYWxsb2MgKG4gKiBHTVBfTElNQl9CWVRFUyk7CisgIFRJTUUgKHQsKG1wbl9hZGRfbihyMXAsczFwLHMycCxuKSxtcG5fc3ViX24ocjFwLHMxcCxzMnAsbikpKTsKKyAgcHJpbnRmICgiICAgICAgICAgICAgICBzZXBhcmF0ZSBhZGQgYW5kIHN1YjogJS4zZlxuIiwgdCk7CisgIFRJTUUgKHQsbXBuX2FkZF9uX3N1Yl9uKHIxcCxyMnAsczFwLHMycCxuKSk7CisgIHByaW50ZiAoImNvbWJpbmVkIGFkZHN1YiBzZXBhcmF0ZSB2YXJpYWJsZXM6ICUuM2ZcbiIsIHQpOworICBUSU1FICh0LG1wbl9hZGRfbl9zdWJfbihyMXAscjJwLHIxcCxzMnAsbikpOworICBwcmludGYgKCIgICAgICAgIGNvbWJpbmVkIGFkZHN1YiByMSBvdmVybGFwOiAlLjNmXG4iLCB0KTsKKyAgVElNRSAodCxtcG5fYWRkX25fc3ViX24ocjFwLHIycCxyMXAsczJwLG4pKTsKKyAgcHJpbnRmICgiICAgICAgICBjb21iaW5lZCBhZGRzdWIgcjIgb3ZlcmxhcDogJS4zZlxuIiwgdCk7CisgIFRJTUUgKHQsbXBuX2FkZF9uX3N1Yl9uKHIxcCxyMnAscjFwLHIycCxuKSk7CisgIHByaW50ZiAoIiAgICAgICAgICBjb21iaW5lZCBhZGRzdWIgaW4tcGxhY2U6ICUuM2ZcbiIsIHQpOworCisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9hZGRtdWxfMS5jIGIvbXBuL2dlbmVyaWMvYWRkbXVsXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQwZThlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYWRkbXVsXzEuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogbXBuX2FkZG11bF8xIC0tIG11bHRpcGx5IHRoZSBOIGxvbmcgbGltYiB2ZWN0b3IgcG9pbnRlZCB0byBieSBVUCBieSBWTCwKKyAgIGFkZCB0aGUgTiBsZWFzdCBzaWduaWZpY2FudCBsaW1icyBvZiB0aGUgcHJvZHVjdCB0byB0aGUgbGltYiB2ZWN0b3IKKyAgIHBvaW50ZWQgdG8gYnkgUlAuICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB0aGUgcHJvZHVjdCwKKyAgIGFkanVzdGVkIGZvciBjYXJyeS1vdXQgZnJvbSB0aGUgYWRkaXRpb24uCisKK0NvcHlyaWdodCAxOTkyLTE5OTQsIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDQsIDIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKworbXBfbGltYl90CittcG5fYWRkbXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHYwKQoreworICBtcF9saW1iX3QgdTAsIGNyZWMsIGMsIHAxLCBwMCwgcjA7CisKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworCisgIGNyZWMgPSAwOworICBkbworICAgIHsKKyAgICAgIHUwID0gKnVwKys7CisgICAgICB1bXVsX3BwbW0gKHAxLCBwMCwgdTAsIHYwKTsKKworICAgICAgcjAgPSAqcnA7CisKKyAgICAgIHAwID0gcjAgKyBwMDsKKyAgICAgIGMgPSByMCA+IHAwOworCisgICAgICBwMSA9IHAxICsgYzsKKworICAgICAgcjAgPSBwMCArIGNyZWM7CQkvKiBjeWNsZSAwLCAzLCAuLi4gKi8KKyAgICAgIGMgPSBwMCA+IHIwOwkJLyogY3ljbGUgMSwgNCwgLi4uICovCisKKyAgICAgIGNyZWMgPSBwMSArIGM7CQkvKiBjeWNsZSAyLCA1LCAuLi4gKi8KKworICAgICAgKnJwKysgPSByMDsKKyAgICB9CisgIHdoaWxlICgtLW4gIT0gMCk7CisKKyAgcmV0dXJuIGNyZWM7Cit9CisKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA9PSAxCisKK21wX2xpbWJfdAorbXBuX2FkZG11bF8xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCB2MCkKK3sKKyAgbXBfbGltYl90IHNoaWZ0ZWRfdjAsIHUwLCByMCwgcDAsIHAxLCBwcmV2X3AxLCBjcmVjLCB4bCwgYzEsIGMyLCBjMzsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVF9NUE4gKHJwLCBuKTsKKyAgQVNTRVJUX01QTiAodXAsIG4pOworICBBU1NFUlRfTElNQiAodjApOworCisgIHNoaWZ0ZWRfdjAgPSB2MCA8PCBHTVBfTkFJTF9CSVRTOworICBjcmVjID0gMDsKKyAgcHJldl9wMSA9IDA7CisgIGRvCisgICAgeworICAgICAgdTAgPSAqdXArKzsKKyAgICAgIHIwID0gKnJwOworICAgICAgdW11bF9wcG1tIChwMSwgcDAsIHUwLCBzaGlmdGVkX3YwKTsKKyAgICAgIHAwID4+PSBHTVBfTkFJTF9CSVRTOworICAgICAgQUREQ19MSU1CIChjMSwgeGwsIHByZXZfcDEsIHAwKTsKKyAgICAgIEFERENfTElNQiAoYzIsIHhsLCB4bCwgcjApOworICAgICAgQUREQ19MSU1CIChjMywgeGwsIHhsLCBjcmVjKTsKKyAgICAgIGNyZWMgPSBjMSArIGMyICsgYzM7CisgICAgICAqcnArKyA9IHhsOworICAgICAgcHJldl9wMSA9IHAxOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gcHJldl9wMSArIGNyZWM7Cit9CisKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAyCisKK21wX2xpbWJfdAorbXBuX2FkZG11bF8xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCB2MCkKK3sKKyAgbXBfbGltYl90IHNoaWZ0ZWRfdjAsIHUwLCByMCwgcDAsIHAxLCBwcmV2X3AxLCB4dywgY3JlYywgeGw7CisKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlRfTVBOIChycCwgbik7CisgIEFTU0VSVF9NUE4gKHVwLCBuKTsKKyAgQVNTRVJUX0xJTUIgKHYwKTsKKworICBzaGlmdGVkX3YwID0gdjAgPDwgR01QX05BSUxfQklUUzsKKyAgY3JlYyA9IDA7CisgIHByZXZfcDEgPSAwOworICBkbworICAgIHsKKyAgICAgIHUwID0gKnVwKys7CisgICAgICByMCA9ICpycDsKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCB1MCwgc2hpZnRlZF92MCk7CisgICAgICBwMCA+Pj0gR01QX05BSUxfQklUUzsKKyAgICAgIHh3ID0gcHJldl9wMSArIHAwICsgcjAgKyBjcmVjOworICAgICAgY3JlYyA9IHh3ID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICB4bCA9IHh3ICYgR01QX05VTUJfTUFTSzsKKyAgICAgICpycCsrID0geGw7CisgICAgICBwcmV2X3AxID0gcDE7CisgICAgfQorICB3aGlsZSAoLS1uICE9IDApOworCisgIHJldHVybiBwcmV2X3AxICsgY3JlYzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9iZGl2X2RibTFjLmMgYi9tcG4vZ2VuZXJpYy9iZGl2X2RibTFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzYmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2JkaXZfZGJtMWMuYwpAQCAtMCwwICsxLDU4IEBACisvKiBtcG5fYmRpdl9kYm0xYyAtLSBkaXZpZGUgYW4gbXBuIG51bWJlciBieSBhIGRpdmlzb3Igb2YgQi0xLCB3aGVyZSBCIGlzIHRoZQorICAgbGltYiBiYXNlLiAgVGhlIGRibTFjIG1vbmlrZXIgbWVhbnMgIkRpdmlzb3Igb2YgQiBNaW51cyAxIHdpdGggQ2FycnkiLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCittcF9saW1iX3QKK21wbl9iZGl2X2RibTFjIChtcF9wdHIgcXAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiZCwgbXBfbGltYl90IGgpCit7CisgIG1wX2xpbWJfdCBhLCBwMCwgcDEsIGN5OworICBtcF9zaXplX3QgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIGEgPSBhcFtpXTsKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCBhLCBiZCA8PCBHTVBfTkFJTF9CSVRTKTsKKyAgICAgIHAwID4+PSBHTVBfTkFJTF9CSVRTOworICAgICAgY3kgPSBoIDwgcDA7CisgICAgICBoID0gKGggLSBwMCkgJiBHTVBfTlVNQl9NQVNLOworICAgICAgcXBbaV0gPSBoOworICAgICAgaCA9IGggLSBwMSAtIGN5OworICAgIH0KKworICByZXR1cm4gaDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2JkaXZfcS5jIGIvbXBuL2dlbmVyaWMvYmRpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhYTQ3MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2JkaXZfcS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIG1wbl9iZGl2X3EgLS0gSGVuc2VsIGRpdmlzaW9uIHdpdGggcHJlY29tcHV0ZWQgaW52ZXJzZSwgcmV0dXJuaW5nIHF1b3RpZW50LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQ29tcHV0ZXMgUSA9IE4gLyBEIG1vZCBCXm4uICovCisKK3ZvaWQKK21wbl9iZGl2X3EgKG1wX3B0ciBxcCwKKwkgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCSAgICBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBkaTsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgRENfQkRJVl9RX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgTVBOX0NPUFkgKHRwLCBucCwgbm4pOworICAgICAgYmludmVydF9saW1iIChkaSwgZHBbMF0pOyAgZGkgPSAtZGk7CisgICAgICBtcG5fc2JwaTFfYmRpdl9xIChxcCwgdHAsIG5uLCBkcCwgZG4sIGRpKTsKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VX0JESVZfUV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIE1QTl9DT1BZICh0cCwgbnAsIG5uKTsKKyAgICAgIGJpbnZlcnRfbGltYiAoZGksIGRwWzBdKTsgIGRpID0gLWRpOworICAgICAgbXBuX2RjcGkxX2JkaXZfcSAocXAsIHRwLCBubiwgZHAsIGRuLCBkaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX211X2JkaXZfcSAocXAsIG5wLCBubiwgZHAsIGRuLCB0cCk7CisgICAgfQorICByZXR1cm47Cit9CisKK21wX3NpemVfdAorbXBuX2JkaXZfcV9pdGNoIChtcF9zaXplX3Qgbm4sIG1wX3NpemVfdCBkbikKK3sKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VX0JESVZfUV9USFJFU0hPTEQpKQorICAgIHJldHVybiBubjsKKyAgZWxzZQorICAgIHJldHVybiBtcG5fbXVfYmRpdl9xX2l0Y2ggKG5uLCBkbik7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9iZGl2X3FfMS5jIGIvbXBuL2dlbmVyaWMvYmRpdl9xXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmViOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYmRpdl9xXzEuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogbXBuX2JkaXZfcV8xLCBtcG5fcGkxX2JkaXZfcV8xIC0tIHNjaG9vbGJvb2sgSGVuc2VsIGRpdmlzaW9uIGJ5IDEtbGltYgorICAgZGl2aXNvciwgcmV0dXJuaW5nIHF1b3RpZW50IG9ubHkuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMC0yMDAzLCAyMDA1LCAyMDA5LCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcF9saW1iX3QKK21wbl9waTFfYmRpdl9xXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGQsCisJCSAgbXBfbGltYl90IGRpLCBpbnQgc2hpZnQpCit7CisgIG1wX3NpemVfdCAgaTsKKyAgbXBfbGltYl90ICBjLCBoLCBsLCB1LCB1X25leHQsIGR1bW15OworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChkICE9IDApOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9MSU1CIChkKTsKKworICBkIDw8PSBHTVBfTkFJTF9CSVRTOworCisgIGlmIChzaGlmdCAhPSAwKQorICAgIHsKKyAgICAgIGMgPSAwOworCisgICAgICB1ID0gdXBbMF07CisgICAgICBycC0tOworICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykKKwl7CisJICB1X25leHQgPSB1cFtpXTsKKwkgIHUgPSAoKHUgPj4gc2hpZnQpIHwgKHVfbmV4dCA8PCAoR01QX05VTUJfQklUUy1zaGlmdCkpKSAmIEdNUF9OVU1CX01BU0s7CisKKwkgIFNVQkNfTElNQiAoYywgbCwgdSwgYyk7CisKKwkgIGwgPSAobCAqIGRpKSAmIEdNUF9OVU1CX01BU0s7CisJICBycFtpXSA9IGw7CisKKwkgIHVtdWxfcHBtbSAoaCwgZHVtbXksIGwsIGQpOworCSAgYyArPSBoOworCSAgdSA9IHVfbmV4dDsKKwl9CisKKyAgICAgIHUgPSB1ID4+IHNoaWZ0OworICAgICAgU1VCQ19MSU1CIChjLCBsLCB1LCBjKTsKKworICAgICAgbCA9IChsICogZGkpICYgR01QX05VTUJfTUFTSzsKKyAgICAgIHJwW25dID0gbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1ID0gdXBbMF07CisgICAgICBsID0gKHUgKiBkaSkgJiBHTVBfTlVNQl9NQVNLOworICAgICAgcnBbMF0gPSBsOworICAgICAgYyA9IDA7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisJeworCSAgdW11bF9wcG1tIChoLCBkdW1teSwgbCwgZCk7CisJICBjICs9IGg7CisKKwkgIHUgPSB1cFtpXTsKKwkgIFNVQkNfTElNQiAoYywgbCwgdSwgYyk7CisKKwkgIGwgPSAobCAqIGRpKSAmIEdNUF9OVU1CX01BU0s7CisJICBycFtpXSA9IGw7CisJfQorICAgIH0KKworICByZXR1cm4gYzsKK30KKworbXBfbGltYl90CittcG5fYmRpdl9xXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGQpCit7CisgIG1wX2xpbWJfdCBkaTsKKyAgaW50IHNoaWZ0OworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChkICE9IDApOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9MSU1CIChkKTsKKworICBjb3VudF90cmFpbGluZ196ZXJvcyAoc2hpZnQsIGQpOworICBkID4+PSBzaGlmdDsKKworICBiaW52ZXJ0X2xpbWIgKGRpLCBkKTsKKyAgcmV0dXJuIG1wbl9waTFfYmRpdl9xXzEgKHJwLCB1cCwgbiwgZCwgZGksIHNoaWZ0KTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2JkaXZfcXIuYyBiL21wbi9nZW5lcmljL2JkaXZfcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGYwZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYmRpdl9xci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIG1wbl9iZGl2X3FyIC0tIEhlbnNlbCBkaXZpc2lvbiB3aXRoIHByZWNvbXB1dGVkIGludmVyc2UsIHJldHVybmluZyBxdW90aWVudAorICAgYW5kIHJlbWFpbmRlci4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDksIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIENvbXB1dGVzIFEgPSBOIC8gRCBtb2QgQl5uLAorCSAgICBSID0gTiAtIFFELiAgKi8KKworbXBfbGltYl90CittcG5fYmRpdl9xciAobXBfcHRyIHFwLCBtcF9wdHIgcnAsCisJICAgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkgICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCSAgICAgbXBfcHRyIHRwKQoreworICBtcF9saW1iX3QgZGk7CisgIG1wX2xpbWJfdCByaDsKKworICBBU1NFUlQgKG5uID4gZG4pOworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgRENfQkRJVl9RUl9USFJFU0hPTEQpIHx8CisgICAgICBCRUxPV19USFJFU0hPTEQgKG5uIC0gZG4sIERDX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBNUE5fQ09QWSAodHAsIG5wLCBubik7CisgICAgICBiaW52ZXJ0X2xpbWIgKGRpLCBkcFswXSk7ICBkaSA9IC1kaTsKKyAgICAgIHJoID0gbXBuX3NicGkxX2JkaXZfcXIgKHFwLCB0cCwgbm4sIGRwLCBkbiwgZGkpOworICAgICAgTVBOX0NPUFkgKHJwLCB0cCArIG5uIC0gZG4sIGRuKTsKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBNUE5fQ09QWSAodHAsIG5wLCBubik7CisgICAgICBiaW52ZXJ0X2xpbWIgKGRpLCBkcFswXSk7ICBkaSA9IC1kaTsKKyAgICAgIHJoID0gbXBuX2RjcGkxX2JkaXZfcXIgKHFwLCB0cCwgbm4sIGRwLCBkbiwgZGkpOworICAgICAgTVBOX0NPUFkgKHJwLCB0cCArIG5uIC0gZG4sIGRuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByaCA9IG1wbl9tdV9iZGl2X3FyIChxcCwgcnAsIG5wLCBubiwgZHAsIGRuLCB0cCk7CisgICAgfQorCisgIHJldHVybiByaDsKK30KKworbXBfc2l6ZV90CittcG5fYmRpdl9xcl9pdGNoIChtcF9zaXplX3Qgbm4sIG1wX3NpemVfdCBkbikKK3sKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICByZXR1cm4gbm47CisgIGVsc2UKKyAgICByZXR1cm4gIG1wbl9tdV9iZGl2X3FyX2l0Y2ggKG5uLCBkbik7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9iaW52ZXJ0LmMgYi9tcG4vZ2VuZXJpYy9iaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MGU2NgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2JpbnZlcnQuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogQ29tcHV0ZSB7dXAsbn1eKC0xKSBtb2QgQl5uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNywgMjAwOSwgMjAxMiwgMjAxNywgMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyoKKyAgcltrKzFdID0gcltrXSAtIHJba10gKiAodSpyW2tdIC0gMSkKKyAgcltrKzFdID0gcltrXSArIHJba10gLSByW2tdKih1KnJba10pCisqLworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisjZGVmaW5lIE5QT1dTIFwKKyAoKHNpemVvZihtcF9zaXplX3QpID4gNiA/IDQ4IDogOCpzaXplb2YobXBfc2l6ZV90KSkpCisjZWxzZQorI2RlZmluZSBOUE9XUyBcCisgKChzaXplb2YobXBfc2l6ZV90KSA+IDYgPyA0OCA6IDgqc2l6ZW9mKG1wX3NpemVfdCkpIC0gTE9HMkMgKEJJTlZfTkVXVE9OX1RIUkVTSE9MRCkpCisjZW5kaWYKKworbXBfc2l6ZV90CittcG5fYmludmVydF9pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGl0Y2hfbG9jYWwgPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChuKTsKKyAgbXBfc2l6ZV90IGl0Y2hfb3V0ID0gbXBuX211bG1vZF9ibm0xX2l0Y2ggKGl0Y2hfbG9jYWwsIG4sIChuICsgMSkgPj4gMSk7CisgIHJldHVybiBpdGNoX2xvY2FsICsgaXRjaF9vdXQ7Cit9CisKK3ZvaWQKK21wbl9iaW52ZXJ0IChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIG1wX3B0ciBzY3JhdGNoKQoreworICBtcF9wdHIgeHA7CisgIG1wX3NpemVfdCBybiwgbmV3cm47CisgIG1wX3NpemVfdCBzaXplc1tOUE9XU10sICpzaXpwOworICBtcF9saW1iX3QgZGk7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29tcHV0YXRpb24gcHJlY2lzaW9ucyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0LCBsZWF2aW5nIHRoZQorICAgICBiYXNlIGNhc2Ugc2l6ZSBpbiAncm4nLiAgKi8KKyAgc2l6cCA9IHNpemVzOworICBmb3IgKHJuID0gbjsgQUJPVkVfVEhSRVNIT0xEIChybiwgQklOVl9ORVdUT05fVEhSRVNIT0xEKTsgcm4gPSAocm4gKyAxKSA+PiAxKQorICAgICpzaXpwKysgPSBybjsKKworICB4cCA9IHNjcmF0Y2g7CisKKyAgLyogQ29tcHV0ZSBhIGJhc2UgdmFsdWUgb2Ygcm4gbGltYnMuICAqLworICBNUE5fWkVSTyAoeHAsIHJuKTsKKyAgeHBbMF0gPSAxOworICBiaW52ZXJ0X2xpbWIgKGRpLCB1cFswXSk7CisgIGlmIChCRUxPV19USFJFU0hPTEQgKHJuLCBEQ19CRElWX1FfVEhSRVNIT0xEKSkKKyAgICBtcG5fc2JwaTFfYmRpdl9xIChycCwgeHAsIHJuLCB1cCwgcm4sIC1kaSk7CisgIGVsc2UKKyAgICBtcG5fZGNwaTFfYmRpdl9xIChycCwgeHAsIHJuLCB1cCwgcm4sIC1kaSk7CisKKyAgbXBuX25lZyAocnAsIHJwLCBybik7CisKKyAgLyogVXNlIE5ld3RvbiBpdGVyYXRpb25zIHRvIGdldCB0aGUgZGVzaXJlZCBwcmVjaXNpb24uICAqLworICBmb3IgKDsgcm4gPCBuOyBybiA9IG5ld3JuKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBtOworICAgICAgbmV3cm4gPSAqLS1zaXpwOworCisgICAgICAvKiBYIDwtIFVSLiAqLworICAgICAgbSA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKG5ld3JuKTsKKyAgICAgIG1wbl9tdWxtb2RfYm5tMSAoeHAsIG0sIHVwLCBuZXdybiwgcnAsIHJuLCB4cCArIG0pOworICAgICAgLyogT25seSB0aGUgdmFsdWVzIGluIHRoZSByYW5nZSB4cCArIHJuIC4uIHhwICsgbmV3cm4gLSAxIGFyZQorCSB1c2VkIGJ5IHRoZSBfbXVsbG9fbiBiZWxvdy4KKwkgU2luY2UgbSA+PSBuZXdybiwgd2UgZG8gbm90IG5lZWQgdGhlIGZvbGxvd2luZy4gKi8KKyAgICAgIC8qIG1wbl9zdWJfMSAoeHAgKyBtLCB4cCwgcm4gLSAobSAtIG5ld3JuKSwgMSk7ICovCisKKyAgICAgIC8qIFIgPSBSKFgvQl5ybikgKi8KKyAgICAgIG1wbl9tdWxsb19uIChycCArIHJuLCBycCwgeHAgKyBybiwgbmV3cm4gLSBybik7CisgICAgICBtcG5fbmVnIChycCArIHJuLCBycCArIHJuLCBuZXdybiAtIHJuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9icm9vdC5jIGIvbXBuL2dlbmVyaWMvYnJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZlNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYnJvb3QuYwpAQCAtMCwwICsxLDE5NSBAQAorLyogbXBuX2Jyb290IC0tIENvbXB1dGUgaGVuc2VsIHNxcnQKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR01QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogQ29tcHV0ZXMgYV5lIChtb2QgQikuIFVzZXMgcmlnaHQtdG8tbGVmdCBiaW5hcnkgYWxnb3JpdGhtLCBzaW5jZQorICAgdHlwaWNhbCB1c2Ugd2lsbCBoYXZlIGUgc21hbGwuICovCitzdGF0aWMgbXBfbGltYl90Citwb3dsaW1iIChtcF9saW1iX3QgYSwgbXBfbGltYl90IGUpCit7CisgIG1wX2xpbWJfdCByID0gMTsKKyAgbXBfbGltYl90IHMgPSBhOworCisgIGZvciAociA9IDEsIHMgPSBhOyBlID4gMDsgZSA+Pj0gMSwgcyAqPSBzKQorICAgIGlmIChlICYgMSkKKyAgICAgIHIgKj0gczsKKworICByZXR1cm4gcjsKK30KKworLyogQ29tcHV0ZXMgYV57MS9rIC0gMX0gKG1vZCBCXm4pLiBCb3RoIGEgYW5kIGsgbXVzdCBiZSBvZGQuCisKKyAgIEl0ZXJhdGVzCisKKyAgICAgcicgPC0tIHIgLSByICogKGFee2stMX0gcl5rIC0gMSkgLyBuCisKKyAgIElmCisKKyAgICAgYV57ay0xfSByXmsgPSAxIChtb2QgMl5tKSwKKworICAgdGhlbgorCisgICAgIGFee2stMX0gcideayA9IDEgKG1vZCAyXnsybX0pLAorCisgICBDb21wdXRlIHRoZSB1cGRhdGUgdGVybSBhcworCisgICAgIHInID0gciAtIChhXntrLTF9IHJee2srMX0gLSByKSAvIGsKKworICAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBjYW5jZWxsYXRpb24gb2YgbG93IGxpbWJzLgorCisgKi8KK3ZvaWQKK21wbl9icm9vdF9pbnZtMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgaykKK3sKKyAgbXBfc2l6ZV90IHNpemVzW0dNUF9MSU1CX0JJVFMgKiAyXTsKKyAgbXBfcHRyIGFrbTEsIHRwLCBybnAsIGVwOworICBtcF9saW1iX3QgYTAsIHIwLCBrbTEsIGtwMWgsIGtpbnY7CisgIG1wX3NpemVfdCBybjsKKyAgdW5zaWduZWQgaTsKKworICBUTVBfREVDTDsKKworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUIChhcFswXSAmIDEpOworICBBU1NFUlQgKGsgJiAxKTsKKyAgQVNTRVJUIChrID49IDMpOworCisgIFRNUF9NQVJLOworCisgIGFrbTEgPSBUTVBfQUxMT0NfTElNQlMgKDQqbik7CisgIHRwID0gYWttMSArIG47CisKKyAga20xID0gay0xOworICAvKiBGSVhNRTogQ291bGQgYXJyYW5nZSB0aGUgaXRlcmF0aW9uIHNvIHdlIGRvbid0IG5lZWQgdG8gY29tcHV0ZQorICAgICB0aGlzIHVwIGZyb250LCBjb21wdXRpbmcgYV57ay0xfSAqIHJeayBhcyAoYSByKV57ay0xfSAqIHIuIE5vdGUKKyAgICAgdGhhdCB3ZSBjYW4gdXNlIHdyYXBhcm91bmQgYWxzbyBmb3IgYSpyLCBzaW5jZSB0aGUgbG93IGhhbGYgaXMKKyAgICAgdW5jaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbi4gT3IgcG9zc2libHkgbXVsbWlkLiBBbHNvLAorICAgICBhIHIgPSBhXnsxL2t9LCBzbyB3ZSBnZXQgdGhhdCB2YWx1ZSB0b28sIGZvciBmcmVlPyAqLworICBtcG5fcG93bG8gKGFrbTEsIGFwLCAma20xLCAxLCBuLCB0cCk7IC8qIDMgbiBzY3JhdGNoIHNwYWNlICovCisKKyAgYTAgPSBhcFswXTsKKyAgYmludmVydF9saW1iIChraW52LCBrKTsKKworICAvKiA0IGJpdHM6IGFeezEvayAtIDF9IChtb2QgMTYpOgorCisJYSAlIDgKKwkxIDMgNSA3CisgICBrJTQgKy0tLS0tLS0KKyAgICAgMSB8MSAxIDEgMQorICAgICAzIHwxIDkgOSAxCisgICovCisgIHIwID0gMSArICgoKGsgPDwgMikgJiAoKGEwIDw8IDEpIF4gKGEwIDw8IDIpKSkgJiA4KTsKKyAgcjAgPSBraW52ICogcjAgKiAoaysxIC0gYWttMVswXSAqIHBvd2xpbWIgKHIwLCBrICYgMHg3ZikpOyAvKiA4IGJpdHMgKi8KKyAgcjAgPSBraW52ICogcjAgKiAoaysxIC0gYWttMVswXSAqIHBvd2xpbWIgKHIwLCBrICYgMHg3ZmZmKSk7IC8qIDE2IGJpdHMgKi8KKyAgcjAgPSBraW52ICogcjAgKiAoaysxIC0gYWttMVswXSAqIHBvd2xpbWIgKHIwLCBrKSk7IC8qIDMyIGJpdHMgKi8KKyNpZiBHTVBfTlVNQl9CSVRTID4gMzIKKyAgeworICAgIHVuc2lnbmVkIHByZWMgPSAzMjsKKyAgICBkbworICAgICAgeworCXIwID0ga2ludiAqIHIwICogKGsrMSAtIGFrbTFbMF0gKiBwb3dsaW1iIChyMCwgaykpOworCXByZWMgKj0gMjsKKyAgICAgIH0KKyAgICB3aGlsZSAocHJlYyA8IEdNUF9OVU1CX0JJVFMpOworICB9CisjZW5kaWYKKworICBycFswXSA9IHIwOworICBpZiAobiA9PSAxKQorICAgIHsKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBGb3Igb2RkIGssIChrKzEpLzIgPSBrLzIrMSwgYW5kIHRoZSBsYXR0ZXIgYXZvaWRzIG92ZXJmbG93LiAqLworICBrcDFoID0gay8yICsgMTsKKworICAvKiBGSVhNRTogU3BlY2lhbCBjYXNlIGZvciB0d28gbGltYiBpdGVyYXRpb24uICovCisgIHJucCA9IFRNUF9BTExPQ19MSU1CUyAoMipuICsgMSk7CisgIGVwID0gcm5wICsgbjsKKworICAvKiBGSVhNRTogUG9zc2libGUgdG8gdGhpcyBvbiB0aGUgZmx5IHdpdGggc29tZSBiaXQgZmlkZGxpbmcuICovCisgIGZvciAoaSA9IDA7IG4gPiAxOyBuID0gKG4gKyAxKS8yKQorICAgIHNpemVzW2krK10gPSBuOworCisgIHJuID0gMTsKKworICB3aGlsZSAoaS0tID4gMCkKKyAgICB7CisgICAgICAvKiBDb21wdXRlIHhee2srMX0uICovCisgICAgICBtcG5fc3FyIChlcCwgcnAsIHJuKTsgLyogRm9yIG9kZCBuLCB3cml0ZXMgbisxIGxpbWJzIGluIHRoZQorCQkJICAgICAgIGZpbmFsIGl0ZXJhdGlvbi4gKi8KKyAgICAgIG1wbl9wb3dsbyAocm5wLCBlcCwgJmtwMWgsIDEsIHNpemVzW2ldLCB0cCk7CisKKyAgICAgIC8qIE11bHRpcGx5IGJ5IGFee2stMX0uIENhbiB1c2Ugd3JhcGFyb3VuZDsgbG93IHBhcnQgZXF1YWxzIHIuICovCisKKyAgICAgIG1wbl9tdWxsb19uIChlcCwgcm5wLCBha20xLCBzaXplc1tpXSk7CisgICAgICBBU1NFUlQgKG1wbl9jbXAgKGVwLCBycCwgcm4pID09IDApOworCisgICAgICBBU1NFUlQgKHNpemVzW2ldIDw9IDIqcm4pOworICAgICAgbXBuX3BpMV9iZGl2X3FfMSAocnAgKyBybiwgZXAgKyBybiwgc2l6ZXNbaV0gLSBybiwgaywga2ludiwgMCk7CisgICAgICBtcG5fbmVnIChycCArIHJuLCBycCArIHJuLCBzaXplc1tpXSAtIHJuKTsKKyAgICAgIHJuID0gc2l6ZXNbaV07CisgICAgfQorICBUTVBfRlJFRTsKK30KKworLyogQ29tcHV0ZXMgYV57MS9rfSAobW9kIEJebikuIEJvdGggYSBhbmQgayBtdXN0IGJlIG9kZC4gKi8KK3ZvaWQKK21wbl9icm9vdCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgaykKK3sKKyAgbXBfcHRyIHRwOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUIChhcFswXSAmIDEpOworICBBU1NFUlQgKGsgJiAxKTsKKworICBpZiAoayA9PSAxKQorICAgIHsKKyAgICAgIE1QTl9DT1BZIChycCwgYXAsIG4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBUTVBfTUFSSzsKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG4pOworCisgIG1wbl9icm9vdF9pbnZtMSAodHAsIGFwLCBuLCBrKTsKKyAgbXBuX211bGxvX24gKHJwLCB0cCwgYXAsIG4pOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvYnJvb3RpbnYuYyBiL21wbi9nZW5lcmljL2Jyb290aW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxYjU5NwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2Jyb290aW52LmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qIG1wbl9icm9vdGludiwgY29tcHV0ZSByIHN1Y2ggdGhhdCByXmsgKiB5ID0gMSAobW9kIDJeYikuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJ0aW4gQm9paiAoYXMgcGFydCBvZiBwZXJmcG93LmMpLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiwgMjAxMywgMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIENvbXB1dGVzIGFeMmUgKG1vZCBCKS4gVXNlcyByaWdodC10by1sZWZ0IGJpbmFyeSBhbGdvcml0aG0sIHNpbmNlCisgICB0eXBpY2FsIHVzZSB3aWxsIGhhdmUgZSBzbWFsbC4gKi8KK3N0YXRpYyBtcF9saW1iX3QKK3Bvd3NxdWFyZWRsaW1iIChtcF9saW1iX3QgYSwgbXBfbGltYl90IGUpCit7CisgIG1wX2xpbWJfdCByOworCisgIHIgPSAxOworICAvKiBpZiAoTElLRUxZIChlICE9IDApKSAqLworICBkbyB7CisgICAgYSAqPSBhOworICAgIGlmIChlICYgMSkKKyAgICAgIHIgKj0gYTsKKyAgICBlID4+PSAxOworICB9IHdoaWxlIChlICE9IDApOworCisgIHJldHVybiByOworfQorCisvKiBDb21wdXRlIHIgc3VjaCB0aGF0IHJeayAqIHkgPSAxIChtb2QgQl5uKS4KKworICAgSXRlcmF0ZXMKKyAgICAgcicgPC0tIGteey0xfSAoKGsrMSkgciAtIHJee2srMX0geSkgKG1vZCAyXmIpCisgICB1c2luZyBIZW5zZWwgbGlmdGluZywgZWFjaCB0aW1lIGRvdWJsaW5nIHRoZSBudW1iZXIgb2Yga25vd24gYml0cyBpbiByLgorCisgICBXb3JrcyBqdXN0IGZvciBvZGQgay4gIEVsc2UgdGhlIEhlbnNlbCBsaWZ0aW5nIGRlZ2VuZXJhdGVzLgorCisgICBGSVhNRToKKworICAgICAoMSkgTWFrZSBpdCB3b3JrIGZvciBrID09IEdNUF9MSU1CX01BWCAoaysxIGJlbG93IG92ZXJmbG93cykuCisKKyAgICAgKDIpIFJld3JpdGUgaXRlcmF0aW9uIGFzCisJICAgcicgPC0tIHIgLSBrXnstMX0gciAocl5rIHkgLSAxKQorCSBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHplcm8gbG93IHBhcnQgb2Ygcl5rIHkgLSAxLgorCisgICAgICgzKSBVc2Ugd3JhcC1hcm91bmQgdHJpY2suCisKKyAgICAgKDQpIFVzZSBhIHNtYWxsIHRhYmxlIHRvIGdldCBzdGFydGluZyB2YWx1ZS4KKworICAgU2NyYXRjaCBuZWVkOiBibiArICgoKGJuICsgMSkgPj4gMSkgKyAxKSArIHNjcmF0Y2ggZm9yIG1wbl9wb3dsbworICAgQ3VycmVudGx5IG1wbl9wb3dsbyByZXF1aXJlcyAzKmJuCisgICBzbyB0aGF0IDUqYm4gaXMgc3VyZWx5IGVub3VnaCwgd2hlcmUgYm4gPSBjZWlsIChibmIgLyBHTVBfTlVNQl9CSVRTKS4KKyovCisKK3ZvaWQKK21wbl9icm9vdGludiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgeXAsIG1wX3NpemVfdCBibiwgbXBfbGltYl90IGssIG1wX3B0ciB0cCkKK3sKKyAgbXBfcHRyIHRwMiwgdHAzOworICBtcF9saW1iX3Qga2ludiwgazIsIHIwLCB5MDsKKyAgbXBfc2l6ZV90IG9yZGVyW0dNUF9MSU1CX0JJVFMgKyAxXTsKKyAgaW50IGQ7CisKKyAgQVNTRVJUIChibiA+IDApOworICBBU1NFUlQgKChrICYgMSkgIT0gMCk7CisKKyAgdHAyID0gdHAgKyBibjsKKyAgdHAzID0gdHAgKyBibiArICgoYm4gKyAzKSA+PiAxKTsKKyAgazIgPSAoayA+PiAxKSArIDE7IC8qIChrICsgMSkgLyAyICwgYnV0IGF2b2lkIGsrMSBvdmVyZmxvdyAqLworCisgIGJpbnZlcnRfbGltYiAoa2ludiwgayk7CisKKyAgLyogNC1iaXQgaW5pdGlhbCBhcHByb3hpbWF0aW9uOgorCisgICB5JTE2IHwgMSAgMyAgNSAgNyAgOSAxMSAxMyAxNSwKKyAgICBrJTQgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0razIlMgorICAgICAxICB8IDEgMTEgMTMgIDcgIDkgIDMgIDUgMTUgIHwgIDEKKyAgICAgMyAgfCAxICAzICA1ICA3ICA5IDExIDEzIDE1ICB8ICAwCisKKyAgKi8KKyAgeTAgPSB5cFswXTsKKworICByMCA9IHkwIF4gKCgoeTAgPDwgMSkgXiAoeTAgPDwgMikpICYgKGsyIDw8IDMpICYgOCk7CQkJLyogNCBiaXRzICovCisgIHIwID0ga2ludiAqIChrMiAqIHIwICogMiAtIHkwICogcG93c3F1YXJlZGxpbWIocjAsIGsyICYgMHgzZikpOwkvKiA4IGJpdHMgKi8KKyAgcjAgPSBraW52ICogKGsyICogcjAgKiAyIC0geTAgKiBwb3dzcXVhcmVkbGltYihyMCwgazIgJiAweDNmZmYpKTsJLyogMTYgYml0cyAqLworI2lmIEdNUF9OVU1CX0JJVFMgPiAxNgorICB7CisgICAgdW5zaWduZWQgcHJlYyA9IDE2OworICAgIGRvCisgICAgICB7CisJcjAgPSBraW52ICogKGsyICogcjAgKiAyIC0geTAgKiBwb3dzcXVhcmVkbGltYihyMCwgazIpKTsKKwlwcmVjICo9IDI7CisgICAgICB9CisgICAgd2hpbGUgKHByZWMgPCBHTVBfTlVNQl9CSVRTKTsKKyAgfQorI2VuZGlmCisKKyAgcnBbMF0gPSByMDsKKyAgaWYgKGJuID09IDEpCisgICAgcmV0dXJuOworCisgIGQgPSAwOworICBmb3IgKDsgYm4gIT0gMjsgYm4gPSAoYm4gKyAxKSA+PiAxKQorICAgIG9yZGVyW2QrK10gPSBibjsKKworICBvcmRlcltkXSA9IDI7CisgIGJuID0gMTsKKworICBkbworICAgIHsKKyAgICAgIG1wbl9zcXIgKHRwLCBycCwgYm4pOyAvKiBSZXN1bHQgbWF5IG92ZXJsYXAgdHAyICovCisgICAgICB0cDJbYm5dID0gbXBuX211bF8xICh0cDIsIHJwLCBibiwgazIgPDwgMSk7CisKKyAgICAgIGJuID0gb3JkZXJbZF07CisKKyAgICAgIG1wbl9wb3dsbyAocnAsIHRwLCAmazIsIDEsIGJuLCB0cDMpOworICAgICAgbXBuX211bGxvX24gKHRwLCB5cCwgcnAsIGJuKTsKKworICAgICAgLyogbXBuX3N1YiAodHAsIHRwMiwgKChibiArIDEpID4+IDEpICsgMSwgdHAsIGJuKTsgKi8KKyAgICAgIC8qIFRoZSBmdW5jdGlvbiBhYm92ZSBpcyBub3QgaGFuZGxlZCwgKChibiArIDEpID4+IDEpICsgMSA8PSBibiovCisgICAgICB7CisJbXBfc2l6ZV90IHBibiA9IChibiArIDMpID4+IDE7IC8qIFNpemUgb2YgdHAyICovCisJaW50IGJvcnJvdzsKKwlib3Jyb3cgPSBtcG5fc3ViX24gKHRwLCB0cDIsIHRwLCBwYm4pICE9IDA7CisJaWYgKGJuID4gcGJuKSAvKiAzIDwgYm4gKi8KKwkgIHsKKwkgICAgaWYgKGJvcnJvdykKKwkgICAgICBtcG5fY29tICh0cCArIHBibiwgdHAgKyBwYm4sIGJuIC0gcGJuKTsKKwkgICAgZWxzZQorCSAgICAgIG1wbl9uZWcgKHRwICsgcGJuLCB0cCArIHBibiwgYm4gLSBwYm4pOworCSAgfQorICAgICAgfQorICAgICAgbXBuX3BpMV9iZGl2X3FfMSAocnAsIHRwLCBibiwgaywga2ludiwgMCk7CisgICAgfQorICB3aGlsZSAoLS1kID49IDApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvYnNxcnQuYyBiL21wbi9nZW5lcmljL2JzcXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxODRmMAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2JzcXJ0LmMKQEAgLTAsMCArMSw0NyBAQAorLyogbXBuX2JzcXJ0LCBhXnsxLzJ9IChtb2QgMl5uKS4KKworQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wbl9ic3FydCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX2JpdGNudF90IG5iLCBtcF9wdHIgdHApCit7CisgIG1wX3B0ciBzcDsKKyAgbXBfc2l6ZV90IG47CisKKyAgQVNTRVJUIChuYiA+IDApOworCisgIG4gPSBuYiAvIEdNUF9OVU1CX0JJVFM7CisgIHNwID0gdHAgKyBuOworCisgIG1wbl9ic3FydGludiAodHAsIGFwLCBuYiwgc3ApOworICBtcG5fbXVsbG9fbiAocnAsIHRwLCBhcCwgbik7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9ic3FydGludi5jIGIvbXBuL2dlbmVyaWMvYnNxcnRpbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg2NzczCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvYnNxcnRpbnYuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogbXBuX2JzcXJ0aW52LCBjb21wdXRlIHIgc3VjaCB0aGF0IHJeMiAqIHkgPSAxIChtb2QgMl57YisxfSkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJ0aW4gQm9paiAoYXMgcGFydCBvZiBwZXJmcG93LmMpLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIENvbXB1dGUgciBzdWNoIHRoYXQgcl4yICogeSA9IDEgKG1vZCAyXntiKzF9KS4KKyAgIFJldHVybiBub24temVybyBpZiBzdWNoIGFuIGludGVnZXIgciBleGlzdHMuCisKKyAgIEl0ZXJhdGVzCisgICAgIHInIDwtLSAoM3IgLSByXjMgeSkgLyAyCisgICB1c2luZyBIZW5zZWwgbGlmdGluZy4gIFNpbmNlIHdlIGRpdmlkZSBieSB0d28sIHRoZSBIZW5zZWwgbGlmdGluZyBpcworICAgc29tZXdoYXQgZGVnZW5lcmF0ZXMuICBUaGVyZWZvcmUsIHdlIGxpZnQgZnJvbSAyXmIgdG8gMl57YisxfS0xLgorCisgICBGSVhNRToKKyAgICAgKDEpIFNpbXBsaWZ5IHRvIGRvIHByZWNpc2lvbiBib29rLWtlZXBpbmcgaW4gbGltYnMgcmF0aGVyIHRoYW4gYml0cy4KKworICAgICAoMikgUmV3cml0ZSBpdGVyYXRpb24gYXMKKwkgICByJyA8LS0gciAtIHIgKHJeMiB5IC0gMSkgLyAyCisJIGFuZCB0YWtlIGFkdmFudGFnZSBvZiB6ZXJvIGxvdyBwYXJ0IG9mIHJeMiB5IC0gMS4KKworICAgICAoMykgVXNlIHdyYXAtYXJvdW5kIHRyaWNrLgorCisgICAgICg0KSBVc2UgYSBzbWFsbCB0YWJsZSB0byBnZXQgc3RhcnRpbmcgdmFsdWUuCisqLworaW50CittcG5fYnNxcnRpbnYgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHlwLCBtcF9iaXRjbnRfdCBibmIsIG1wX3B0ciB0cCkKK3sKKyAgbXBfcHRyIHRwMjsKKyAgbXBfc2l6ZV90IGJuLCBvcmRlcltHTVBfTElNQl9CSVRTICsgMV07CisgIGludCBpLCBkOworCisgIEFTU0VSVCAoYm5iID4gMCk7CisKKyAgYm4gPSAxICsgYm5iIC8gR01QX0xJTUJfQklUUzsKKworICB0cDIgPSB0cCArIGJuOworCisgIHJwWzBdID0gMTsKKyAgaWYgKGJuYiA9PSAxKQorICAgIHsKKyAgICAgIGlmICgoeXBbMF0gJiAzKSAhPSAxKQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoeXBbMF0gJiA3KSAhPSAxKQorCXJldHVybiAwOworCisgICAgICBkID0gMDsKKyAgICAgIGZvciAoOyBibmIgIT0gMjsgYm5iID0gKGJuYiArIDIpID4+IDEpCisJb3JkZXJbZCsrXSA9IGJuYjsKKworICAgICAgZm9yIChpID0gZCAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIGJuYiA9IG9yZGVyW2ldOworCSAgYm4gPSAxICsgYm5iIC8gR01QX0xJTUJfQklUUzsKKworCSAgbXBuX3NxcmxvICh0cCwgcnAsIGJuKTsKKwkgIG1wbl9tdWxsb19uICh0cDIsIHJwLCB0cCwgYm4pOyAvKiB0cDIgPC0gcnAgXiAzICovCisKKwkgIG1wbl9tdWxfMSAodHAsIHJwLCBibiwgMyk7CisKKwkgIG1wbl9tdWxsb19uIChycCwgeXAsIHRwMiwgYm4pOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbgorCSAgbXBuX3JzaDFzdWJfbiAocnAsIHRwLCBycCwgYm4pOworI2Vsc2UKKwkgIG1wbl9zdWJfbiAodHAyLCB0cCwgcnAsIGJuKTsKKwkgIG1wbl9yc2hpZnQgKHJwLCB0cDIsIGJuLCAxKTsKKyNlbmRpZgorCX0KKyAgICB9CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvY21wLmMgYi9tcG4vZ2VuZXJpYy9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAzMTRiCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvY21wLmMKQEAgLTAsMCArMSwzMyBAQAorLyogbXBuX2NtcCAtLSBDb21wYXJlIHR3byBsb3ctbGV2ZWwgbmF0dXJhbC1udW1iZXIgaW50ZWdlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wbl9jbXAgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NuZF9hZGRfbi5jIGIvbXBuL2dlbmVyaWMvY25kX2FkZF9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMTM3MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2NuZF9hZGRfbi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIG1wbl9jbmRfYWRkX24gLS0gQ29tcHV0ZSBSID0gVSArIFYgaWYgQ05EICE9IDAgb3IgUiA9IFUgaWYgQ05EID09IDAuCisgICBCb3RoIGNhc2VzIHNob3VsZCB0YWtlIHRoZSBzYW1lIHRpbWUgYW5kIHBlcmZvcm0gdGhlIGV4YWN0IHNhbWUgbWVtb3J5CisgICBhY2Nlc3Nlcywgc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZXJlIHNpZGUtY2hhbm5lbAorICAgYXR0YWNrIHJlc2lsaWVuY2UgaXMgcmVsZXZhbnQuCisKK0NvcHlyaWdodCAxOTkyLTE5OTQsIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDgsIDIwMDksIDIwMTEsIDIwMTMgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworbXBfbGltYl90CittcG5fY25kX2FkZF9uIChtcF9saW1iX3QgY25kLCBtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfbGltYl90IHVsLCB2bCwgc2wsIHJsLCBjeSwgY3kxLCBjeTIsIG1hc2s7CisKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHJwLCB2cCwgbikpOworCisgIG1hc2sgPSAtKG1wX2xpbWJfdCkgKGNuZCAhPSAwKTsKKyAgY3kgPSAwOworICBkbworICAgIHsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrICYgbWFzazsKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyAgICAgIHNsID0gdWwgKyB2bDsKKyAgICAgIGN5MSA9IHNsIDwgdWw7CisgICAgICBybCA9IHNsICsgY3k7CisgICAgICBjeTIgPSBybCA8IHNsOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworI2Vsc2UKKyAgICAgIHJsID0gdWwgKyB2bDsKKyAgICAgIHJsICs9IGN5OworICAgICAgY3kgPSBybCA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgKnJwKysgPSBybCAmIEdNUF9OVU1CX01BU0s7CisjZW5kaWYKKyAgICB9CisgIHdoaWxlICgtLW4gIT0gMCk7CisKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvY25kX3N1Yl9uLmMgYi9tcG4vZ2VuZXJpYy9jbmRfc3ViX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRhZDhhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvY25kX3N1Yl9uLmMKQEAgLTAsMCArMSw2OSBAQAorLyogbXBuX2NuZF9zdWJfbiAtLSBDb21wdXRlIFIgPSBVIC0gViBpZiBDTkQgIT0gMCBvciBSID0gVSBpZiBDTkQgPT0gMC4KKyAgIEJvdGggY2FzZXMgc2hvdWxkIHRha2UgdGhlIHNhbWUgdGltZSBhbmQgcGVyZm9ybSB0aGUgZXhhY3Qgc2FtZSBtZW1vcnkKKyAgIGFjY2Vzc2VzLCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlcmUgc2lkZS1jaGFubmVsCisgICBhdHRhY2sgcmVzaWxpZW5jZSBpcyByZWxldmFudC4KKworQ29weXJpZ2h0IDE5OTItMTk5NCwgMTk5NiwgMjAwMCwgMjAwMiwgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMyBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCittcF9saW1iX3QKK21wbl9jbmRfc3ViX24gKG1wX2xpbWJfdCBjbmQsIG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgdWwsIHZsLCBzbCwgcmwsIGN5LCBjeTEsIGN5MiwgbWFzazsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHZwLCBuKSk7CisKKyAgbWFzayA9IC0obXBfbGltYl90KSAoY25kICE9IDApOworICBjeSA9IDA7CisgIGRvCisgICAgeworICAgICAgdWwgPSAqdXArKzsKKyAgICAgIHZsID0gKnZwKysgJiBtYXNrOworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICAgICAgc2wgPSB1bCAtIHZsOworICAgICAgY3kxID0gc2wgPiB1bDsKKyAgICAgIHJsID0gc2wgLSBjeTsKKyAgICAgIGN5MiA9IHJsID4gc2w7CisgICAgICBjeSA9IGN5MSB8IGN5MjsKKyAgICAgICpycCsrID0gcmw7CisjZWxzZQorICAgICAgcmwgPSB1bCAtIHZsOworICAgICAgcmwgLT0gY3k7CisgICAgICBjeSA9IHJsID4+IChHTVBfTElNQl9CSVRTIC0gMSk7CisgICAgICAqcnArKyA9IHJsICYgR01QX05VTUJfTUFTSzsKKyNlbmRpZgorICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gY3k7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9jbmRfc3dhcC5jIGIvbXBuL2dlbmVyaWMvY25kX3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Q4NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvY25kX3N3YXAuYwpAQCAtMCwwICsxLDUwIEBACisvKiBtcG5fY25kX3N3YXAKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworQ29weXJpZ2h0IDIwMTMsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcG5fY25kX3N3YXAgKG1wX2xpbWJfdCBjbmQsIHZvbGF0aWxlIG1wX2xpbWJfdCAqYXAsIHZvbGF0aWxlIG1wX2xpbWJfdCAqYnAsCisJICAgICAgbXBfc2l6ZV90IG4pCit7CisgIHZvbGF0aWxlIG1wX2xpbWJfdCBtYXNrID0gLSAobXBfbGltYl90KSAoY25kICE9IDApOworICBtcF9zaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBtcF9saW1iX3QgYSwgYiwgdDsKKyAgICAgIGEgPSBhcFtpXTsKKyAgICAgIGIgPSBicFtpXTsKKyAgICAgIHQgPSAoYSBeIGIpICYgbWFzazsKKyAgICAgIGFwW2ldID0gYSBeIHQ7CisgICAgICBicFtpXSA9IGIgXiB0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NvbS5jIGIvbXBuL2dlbmVyaWMvY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlNTgyNAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2NvbS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIG1wbl9jb20gLSBjb21wbGVtZW50IGFuIG1wbi4KKworQ29weXJpZ2h0IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjdW5kZWYgbXBuX2NvbQorI2RlZmluZSBtcG5fY29tIF9fTVBOKGNvbSkKKwordm9pZAorbXBuX2NvbSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgdWw7CisgIGRvIHsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICAqcnArKyA9IH51bCAmIEdNUF9OVU1CX01BU0s7CisgIH0gd2hpbGUgKC0tbiAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NvbWJfdGFibGVzLmMgYi9tcG4vZ2VuZXJpYy9jb21iX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZGI3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9jb21iX3RhYmxlcy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvbnN0IHRhYmxlcyBzaGFyZWQgYW1vbmcgY29tYmluYXRvcmljIGZ1bmN0aW9ucy4KKworICAgVEhFIENPTlRFTlRTIE9GIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBBTkQgQVJFIEFMTU9TVCBDRVJUQUlOIFRPCisgICBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIElOIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRW50cnkgaSBjb250YWlucyAoaSEvMl50KSB3aGVyZSB0IGlzIGNob3NlbiBzdWNoIHRoYXQgdGhlIHBhcmVudGhlc2lzCisgICBpcyBhbiBvZGQgaW50ZWdlci4gKi8KK2NvbnN0IG1wX2xpbWJfdCBfX2dtcF9vZGRmYWNfdGFibGVbXSA9IHsgT05FX0xJTUJfT0REX0ZBQ1RPUklBTF9UQUJMRSwgT05FX0xJTUJfT0REX0ZBQ1RPUklBTF9FWFRUQUJMRSB9OworCisvKiBFbnRyeSBpIGNvbnRhaW5zICgoMmkrMSkhIS8yXnQpIHdoZXJlIHQgaXMgY2hvc2VuIHN1Y2ggdGhhdCB0aGUgcGFyZW50aGVzaXMKKyAgIGlzIGFuIG9kZCBpbnRlZ2VyLiAqLworY29uc3QgbXBfbGltYl90IF9fZ21wX29kZDJmYWNfdGFibGVbXSA9IHsgT05FX0xJTUJfT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRSB9OworCisvKiBFbnRyeSBpIGNvbnRhaW5zIDJpLXBvcGMoMmkpLiAqLworY29uc3QgdW5zaWduZWQgY2hhciBfX2dtcF9mYWMyY250X3RhYmxlW10gPSB7IFRBQkxFXzJOX01JTlVTX1BPUENfMk4gfTsKKworY29uc3QgbXBfbGltYl90IF9fZ21wX2xpbWJyb290c190YWJsZVtdID0geyBOVEhfUk9PVF9OVU1CX01BU0tfVEFCTEUgfTsKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NvbXB1dGVfcG93dGFiLmMgYi9tcG4vZ2VuZXJpYy9jb21wdXRlX3Bvd3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmJjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9jb21wdXRlX3Bvd3RhYi5jCkBAIC0wLDAgKzEsMzczIEBACisvKiBtcG5fY29tcHV0ZV9wb3d0YWIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAxOTkxLTIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qCisgIENBVkVBVFM6CisgICogVGhlIGV4cHRhYiBhbmQgcG93dGFiIHZlY3RvcnMgYXJlIGluIG9wcG9zaXRlIG9yZGVycy4gIFByb2JhYmx5IE9LLgorICAqIENvbnNpZGVyIGdldHRpbmcgcmlkIG9mIGV4cHRhYiwgZG9pbmcgYml0IG9wcyBvbiB0aGUgdW4gYXJndW1lbnQgaW5zdGVhZC4KKyAgKiBDb25zaWRlciByb3VuZGluZyBncmVhdGVzdCBwb3dlciBzbGlnaHRseSB1cHdhcmRzIHRvIHNhdmUgYWRqdXN0bWVudHMuCisgICogSW4gcG93dGFiX2RlY2lkZSwgY29uc2lkZXIgY29tcHV0aW5nIGNvc3QgZnJvbSBqdXN0IHRoZSAyLTMgbGFyZ2VzdAorICAgIG9wZXJhbmRzLCBzaW5jZSBzbWFsbGVyIG9wZXJhbmQgY29udHJpYnV0ZSBsaXR0bGUuICBUaGlzIG1ha2VzIG1vc3Qgc2Vuc2UKKyAgICBpZiBleHB0YWIgaXMgc3VwcHJlc3NlZC4KKyovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWZuZGVmIERJVl8xX1ZTX01VTF8xX1BFUkNFTlQKKyNkZWZpbmUgRElWXzFfVlNfTVVMXzFfUEVSQ0VOVCAxNTAKKyNlbmRpZgorCisjZGVmaW5lIFNFVF9wb3dlcnNfdChkZXN0LCBwdHIsIHNpemUsIGRpYiwgYiwgc2gpCVwKKyAgZG8gewkJCQkJCQlcCisgICAgZGVzdC5wID0gcHRyOwkJCQkJXAorICAgIGRlc3QubiA9IHNpemU7CQkJCQlcCisgICAgZGVzdC5kaWdpdHNfaW5fYmFzZSA9IGRpYjsJCQkJXAorICAgIGRlc3QuYmFzZSA9IGI7CQkJCQlcCisgICAgZGVzdC5zaGlmdCA9IHNoOwkJCQkJXAorICB9IHdoaWxlICgwKQorCisjaWYgRElWXzFfVlNfTVVMXzFfUEVSQ0VOVCA+IDEyMAorI2RlZmluZSBIQVZFX21wbl9jb21wdXRlX3Bvd3RhYl9tdWwgMQorc3RhdGljIHZvaWQKK21wbl9jb21wdXRlX3Bvd3RhYl9tdWwgKHBvd2Vyc190ICpwb3d0YWIsIG1wX3B0ciBwb3d0YWJfbWVtLCBtcF9zaXplX3QgdW4sCisJCQlpbnQgYmFzZSwgY29uc3Qgc2l6ZV90ICpleHB0YWIsIHNpemVfdCBuX3Bvd3MpCit7CisgIG1wX3NpemVfdCBuOworICBtcF9wdHIgcCwgdDsKKyAgbXBfbGltYl90IGN5OworICBsb25nIHN0YXJ0X2lkeDsKKyAgaW50IGM7CisKKyAgbXBfbGltYl90IGJpZ19iYXNlID0gbXBfYmFzZXNbYmFzZV0uYmlnX2Jhc2U7CisgIGludCBjaGFyc19wZXJfbGltYiA9IG1wX2Jhc2VzW2Jhc2VdLmNoYXJzX3Blcl9saW1iOworCisgIG1wX3B0ciBwb3d0YWJfbWVtX3B0ciA9IHBvd3RhYl9tZW07CisKKyAgc2l6ZV90IGRpZ2l0c19pbl9iYXNlID0gY2hhcnNfcGVyX2xpbWI7CisKKyAgcG93ZXJzX3QgKnB0ID0gcG93dGFiOworCisgIHAgPSBwb3d0YWJfbWVtX3B0cjsKKyAgcG93dGFiX21lbV9wdHIgKz0gMTsKKyAgcFswXSA9IGJpZ19iYXNlOworCisgIFNFVF9wb3dlcnNfdCAocHRbMF0sIHAsIDEsIGRpZ2l0c19pbl9iYXNlLCBiYXNlLCAwKTsKKyAgcHQrKzsKKworICB0ID0gcG93dGFiX21lbV9wdHI7CisgIHBvd3RhYl9tZW1fcHRyICs9IDI7CisgIHRbMV0gPSBtcG5fbXVsXzEgKHQsIHAsIDEsIGJpZ19iYXNlKTsKKyAgbiA9IDI7CisKKyAgZGlnaXRzX2luX2Jhc2UgKj0gMjsKKworICBjID0gdFswXSA9PSAwOworICB0ICs9IGM7CisgIG4gLT0gYzsKKyAgbXBfc2l6ZV90IHNoaWZ0ID0gYzsKKworICBTRVRfcG93ZXJzX3QgKHB0WzBdLCB0LCBuLCBkaWdpdHNfaW5fYmFzZSwgYmFzZSwgc2hpZnQpOworICBwID0gdDsKKyAgcHQrKzsKKworICBpZiAoZXhwdGFiWzBdID09ICgoc2l6ZV90KSBjaGFyc19wZXJfbGltYiA8PCBuX3Bvd3MpKQorICAgIHsKKyAgICAgIHN0YXJ0X2lkeCA9IG5fcG93cyAtIDI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCgoZGlnaXRzX2luX2Jhc2UgKyBjaGFyc19wZXJfbGltYikgPDwgKG5fcG93cy0yKSkgPD0gZXhwdGFiWzBdKQorCXsKKwkgIC8qIDMsIHNvbWV0aW1lcyBhZGp1c3RlZCB0byA0LiAgKi8KKwkgIHQgPSBwb3d0YWJfbWVtX3B0cjsKKwkgIHBvd3RhYl9tZW1fcHRyICs9IDQ7CisJICB0W25dID0gY3kgPSBtcG5fbXVsXzEgKHQsIHAsIG4sIGJpZ19iYXNlKTsKKwkgIG4gKz0gY3kgIT0gMDs7CisKKwkgIGRpZ2l0c19pbl9iYXNlICs9IGNoYXJzX3Blcl9saW1iOworCisJICBjICA9IHRbMF0gPT0gMDsKKwkgIHQgKz0gYzsKKwkgIG4gLT0gYzsKKwkgIHNoaWZ0ICs9IGM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIDIgY29weSwgd2lsbCBhbHdheXMgYmVjb21lIDMgd2l0aCBiYWNrLW11bHRpcGxpY2F0aW9uLiAgKi8KKwkgIHQgPSBwb3d0YWJfbWVtX3B0cjsKKwkgIHBvd3RhYl9tZW1fcHRyICs9IDM7CisJICB0WzBdID0gcFswXTsKKwkgIHRbMV0gPSBwWzFdOworCX0KKworICAgICAgU0VUX3Bvd2Vyc190IChwdFswXSwgdCwgbiwgZGlnaXRzX2luX2Jhc2UsIGJhc2UsIHNoaWZ0KTsKKyAgICAgIHAgPSB0OworICAgICAgcHQrKzsKKyAgICAgIHN0YXJ0X2lkeCA9IG5fcG93cyAtIDM7CisgICAgfQorCisgIGZvciAobG9uZyBwaSA9IHN0YXJ0X2lkeDsgcGkgPj0gMDsgcGktLSkKKyAgICB7CisgICAgICB0ID0gcG93dGFiX21lbV9wdHI7CisgICAgICBwb3d0YWJfbWVtX3B0ciArPSAyICogbiArIDI7CisKKyAgICAgIEFTU0VSVCAocG93dGFiX21lbV9wdHIgPCBwb3d0YWJfbWVtICsgbXBuX3N0cl9wb3d0YWJfYWxsb2MgKHVuKSk7CisKKyAgICAgIG1wbl9zcXIgKHQsIHAsIG4pOworCisgICAgICBkaWdpdHNfaW5fYmFzZSAqPSAyOworICAgICAgbiAqPSAyOworICAgICAgbiAtPSB0W24gLSAxXSA9PSAwOworICAgICAgc2hpZnQgKj0gMjsKKworICAgICAgYyA9IHRbMF0gPT0gMDsKKyAgICAgIHQgKz0gYzsKKyAgICAgIG4gLT0gYzsKKyAgICAgIHNoaWZ0ICs9IGM7CisKKyAgICAgIC8qIEFkanVzdCBuZXcgdmFsdWUgaWYgaXQgaXMgdG9vIHNtYWxsIGFzIGlucHV0IHRvIHRoZSBuZXh0IHNxdWFyaW5nLiAgKi8KKyAgICAgIGlmICgoKGRpZ2l0c19pbl9iYXNlICsgY2hhcnNfcGVyX2xpbWIpIDw8IHBpKSA8PSBleHB0YWJbMF0pCisJeworCSAgdFtuXSA9IGN5ID0gbXBuX211bF8xICh0LCB0LCBuLCBiaWdfYmFzZSk7CisJICBuICs9IGN5ICE9IDA7CisKKwkgIGRpZ2l0c19pbl9iYXNlICs9IGNoYXJzX3Blcl9saW1iOworCisJICBjICA9IHRbMF0gPT0gMDsKKwkgIHQgKz0gYzsKKwkgIG4gLT0gYzsKKwkgIHNoaWZ0ICs9IGM7CisJfQorCisgICAgICBTRVRfcG93ZXJzX3QgKHB0WzBdLCB0LCBuLCBkaWdpdHNfaW5fYmFzZSwgYmFzZSwgc2hpZnQpOworCisgICAgICAvKiBBZGp1c3QgcHJldmlvdXMgdmFsdWUgaWYgaXQgaXMgbm90IGF0IGl0cyB0YXJnZXQgcG93ZXIuICAqLworICAgICAgaWYgKHB0Wy0xXS5kaWdpdHNfaW5fYmFzZSA8IGV4cHRhYltwaSArIDFdKQorCXsKKwkgIG1wX3NpemVfdCBuID0gcHRbLTFdLm47CisJICBtcF9wdHIgcCA9IHB0Wy0xXS5wOworCSAgcFtuXSA9IGN5ID0gbXBuX211bF8xIChwLCBwLCBuLCBiaWdfYmFzZSk7CisJICBuICs9IGN5ICE9IDA7CisKKwkgIEFTU0VSVCAocHRbLTFdLmRpZ2l0c19pbl9iYXNlICsgY2hhcnNfcGVyX2xpbWIgPT0gZXhwdGFiW3BpICsgMV0pOworCSAgcHRbLTFdLmRpZ2l0c19pbl9iYXNlID0gZXhwdGFiW3BpICsgMV07CisKKwkgIGMgPSBwWzBdID09IDA7CisJICBwdFstMV0ucCA9IHAgKyBjOworCSAgcHRbLTFdLm4gPSBuIC0gYzsKKwkgIHB0Wy0xXS5zaGlmdCArPSBjOworCX0KKworICAgICAgcCA9IHQ7CisgICAgICBwdCsrOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgRElWXzFfVlNfTVVMXzFfUEVSQ0VOVCA8IDI3NQorI2RlZmluZSBIQVZFX21wbl9jb21wdXRlX3Bvd3RhYl9kaXYgMQorc3RhdGljIHZvaWQKK21wbl9jb21wdXRlX3Bvd3RhYl9kaXYgKHBvd2Vyc190ICpwb3d0YWIsIG1wX3B0ciBwb3d0YWJfbWVtLCBtcF9zaXplX3QgdW4sCisJCQlpbnQgYmFzZSwgY29uc3Qgc2l6ZV90ICpleHB0YWIsIHNpemVfdCBuX3Bvd3MpCit7CisgIG1wX3B0ciBwLCB0OworCisgIG1wX2xpbWJfdCBiaWdfYmFzZSA9IG1wX2Jhc2VzW2Jhc2VdLmJpZ19iYXNlOworICBpbnQgY2hhcnNfcGVyX2xpbWIgPSBtcF9iYXNlc1tiYXNlXS5jaGFyc19wZXJfbGltYjsKKworICBtcF9wdHIgcG93dGFiX21lbV9wdHIgPSBwb3d0YWJfbWVtOworCisgIHNpemVfdCBkaWdpdHNfaW5fYmFzZSA9IGNoYXJzX3Blcl9saW1iOworCisgIHBvd2Vyc190ICpwdCA9IHBvd3RhYjsKKworICBwID0gcG93dGFiX21lbV9wdHI7CisgIHBvd3RhYl9tZW1fcHRyICs9IDE7CisgIHBbMF0gPSBiaWdfYmFzZTsKKworICBTRVRfcG93ZXJzX3QgKHB0WzBdLCBwLCAxLCBkaWdpdHNfaW5fYmFzZSwgYmFzZSwgMCk7CisgIHB0Kys7CisKKyAgbXBfc2l6ZV90IG4gPSAxOworICBtcF9zaXplX3Qgc2hpZnQgPSAwOworICBmb3IgKGxvbmcgcGkgPSBuX3Bvd3MgLSAxOyBwaSA+PSAwOyBwaS0tKQorICAgIHsKKyAgICAgIHQgPSBwb3d0YWJfbWVtX3B0cjsKKyAgICAgIHBvd3RhYl9tZW1fcHRyICs9IDIgKiBuOworCisgICAgICBBU1NFUlQgKHBvd3RhYl9tZW1fcHRyIDwgcG93dGFiX21lbSArIG1wbl9zdHJfcG93dGFiX2FsbG9jICh1bikpOworCisgICAgICBtcG5fc3FyICh0LCBwLCBuKTsKKyAgICAgIG4gPSAyICogbiAtIDE7IG4gKz0gdFtuXSAhPSAwOworICAgICAgZGlnaXRzX2luX2Jhc2UgKj0gMjsKKworICAgICAgaWYgKGRpZ2l0c19pbl9iYXNlICE9IGV4cHRhYltwaV0pCS8qIGlmICgoKCh1biAtIDEpID4+IHBpKSAmIDIpID09IDApICovCisJeworI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEgfHwgISBIQVZFX05BVElWRV9tcG5fZGl2ZXhhY3RfMQorCSAgaWYgKF9fR01QX0xJS0VMWSAoYmFzZSA9PSAxMCkpCisJICAgIG1wbl9waTFfYmRpdl9xXzEgKHQsIHQsIG4sIGJpZ19iYXNlID4+IE1QX0JBU0VTX0JJR19CQVNFX0NUWl8xMCwKKwkJCSAgICAgIE1QX0JBU0VTX0JJR19CQVNFX0JJTlZFUlRFRF8xMCwKKwkJCSAgICAgIE1QX0JBU0VTX0JJR19CQVNFX0NUWl8xMCk7CisJICBlbHNlCisjZW5kaWYKKwkgICAgLyogRklYTUU6IFdlIGNvdWxkIHVzZSBfcGkxIGhlcmUgaWYgd2UgYWRkIGJpZ19iYXNlX2JpbnZlcnRlZCBhbmQKKwkgICAgICAgYmlnX2Jhc2VfY3R6IGZpZWxkcyB0byBzdHJ1Y3QgYmFzZXMuICBUaGF0IHdvdWxkIGFkZCBhYm91dCAyIEtpQgorCSAgICAgICB0byBtcF9iYXNlcy5jLgorCSAgICAgICBGSVhNRTogVXNlIG1wbl9iZGl2X3FfMSBoZXJlIHdoZW4gbXBuX2RpdmV4YWN0XzEgaXMgY29udmVydGVkIHRvCisJICAgICAgIG1wbl9iZGl2X3FfMSBmb3IgbW9yZSBtYWNoaW5lcy4gKi8KKwkgICAgbXBuX2RpdmV4YWN0XzEgKHQsIHQsIG4sIGJpZ19iYXNlKTsKKworCSAgbiAtPSB0W24gLSAxXSA9PSAwOworCSAgZGlnaXRzX2luX2Jhc2UgLT0gY2hhcnNfcGVyX2xpbWI7CisJfQorCisgICAgICBzaGlmdCAqPSAyOworICAgICAgLyogU3RyaXAgbG93IHplcm8gbGltYnMsIGJ1dCBiZSBjYXJlZnVsIHRvIGtlZXAgdGhlIHJlc3VsdCBkaXZpc2libGUgYnkKKwkgYmlnX2Jhc2UuICAqLworICAgICAgd2hpbGUgKHRbMF0gPT0gMCAmJiAodFsxXSAmICgoYmlnX2Jhc2UgJiAtYmlnX2Jhc2UpIC0gMSkpID09IDApCisJeworCSAgdCsrOworCSAgbi0tOworCSAgc2hpZnQrKzsKKwl9CisgICAgICBwID0gdDsKKworICAgICAgU0VUX3Bvd2Vyc190IChwdFswXSwgcCwgbiwgZGlnaXRzX2luX2Jhc2UsIGJhc2UsIHNoaWZ0KTsKKyAgICAgIHB0Kys7CisgICAgfQorCisgIC8qIFN0cmlwIGFueSByZW1haW5pbmcgbG93IHplcm8gbGltYnMuICAqLworICBwdCAtPSBuX3Bvd3MgKyAxOworICBmb3IgKGxvbmcgcGkgPSBuX3Bvd3M7IHBpID49IDA7IHBpLS0pCisgICAgeworICAgICAgbXBfcHRyIHQgPSBwdFtwaV0ucDsKKyAgICAgIG1wX3NpemVfdCBzaGlmdCA9IHB0W3BpXS5zaGlmdDsKKyAgICAgIG1wX3NpemVfdCBuID0gcHRbcGldLm47CisgICAgICBpbnQgYzsKKyAgICAgIGMgPSB0WzBdID09IDA7CisgICAgICB0ICs9IGM7CisgICAgICBuIC09IGM7CisgICAgICBzaGlmdCArPSBjOworICAgICAgcHRbcGldLnAgPSB0OworICAgICAgcHRbcGldLnNoaWZ0ID0gc2hpZnQ7CisgICAgICBwdFtwaV0ubiA9IG47CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBsb25nCitwb3d0YWJfZGVjaWRlIChzaXplX3QgKmV4cHRhYiwgc2l6ZV90IHVuLCBpbnQgYmFzZSkKK3sKKyAgaW50IGNoYXJzX3Blcl9saW1iID0gbXBfYmFzZXNbYmFzZV0uY2hhcnNfcGVyX2xpbWI7CisgIGxvbmcgbl9wb3dzID0gMDsKKyAgZm9yIChzaXplX3QgcG4gPSAodW4gKyAxKSA+PiAxOyBwbiAhPSAxOyBwbiA9IChwbiArIDEpID4+IDEpCisgICAgeworICAgICAgZXhwdGFiW25fcG93c10gPSBwbiAqIGNoYXJzX3Blcl9saW1iOworICAgICAgbl9wb3dzKys7CisgICAgfQorICBleHB0YWJbbl9wb3dzXSA9IGNoYXJzX3Blcl9saW1iOworCisjaWYgSEFWRV9tcG5fY29tcHV0ZV9wb3d0YWJfbXVsICYmIEhBVkVfbXBuX2NvbXB1dGVfcG93dGFiX2RpdgorICBzaXplX3QgcG4gPSB1biAtIDE7CisgIHNpemVfdCB4biA9ICh1biArIDEpID4+IDE7CisgIHVuc2lnbmVkIG1jb3N0ID0gMTsKKyAgdW5zaWduZWQgZGNvc3QgPSAxOworICBmb3IgKGxvbmcgaSA9IG5fcG93cyAtIDI7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIHNpemVfdCBwb3cgPSAocG4gPj4gKGkgKyAxKSkgKyAxOworCisgICAgICBpZiAocG93ICYgMSkKKwlkY29zdCArPSBwb3c7CisKKyAgICAgIGlmICh4biAhPSAocG93IDw8IGkpKQorCXsKKwkgIGlmIChwb3cgPiAyICYmIChwb3cgJiAxKSA9PSAwKQorCSAgICBtY29zdCArPSAyICogcG93OworCSAgZWxzZQorCSAgICBtY29zdCArPSBwb3c7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChwb3cgJiAxKQorCSAgICBtY29zdCArPSBwb3c7CisJfQorICAgIH0KKworICBkY29zdCA9IGRjb3N0ICogRElWXzFfVlNfTVVMXzFfUEVSQ0VOVCAvIDEwMDsKKworICBpZiAobWNvc3QgPD0gZGNvc3QpCisgICAgcmV0dXJuIG5fcG93czsKKyAgZWxzZQorICAgIHJldHVybiAtbl9wb3dzOworI2VsaWYgSEFWRV9tcG5fY29tcHV0ZV9wb3d0YWJfbXVsCisgIHJldHVybiBuX3Bvd3M7CisjZWxpZiBIQVZFX21wbl9jb21wdXRlX3Bvd3RhYl9kaXYKKyAgcmV0dXJuIC1uX3Bvd3M7CisjZWxzZQorI2Vycm9yICJubyBwb3d0YWIgZnVuY3Rpb24gYXZhaWxhYmxlIgorI2VuZGlmCit9CisKK3NpemVfdAorbXBuX2NvbXB1dGVfcG93dGFiIChwb3dlcnNfdCAqcG93dGFiLCBtcF9wdHIgcG93dGFiX21lbSwgbXBfc2l6ZV90IHVuLCBpbnQgYmFzZSkKK3sKKyAgc2l6ZV90IGV4cHRhYltHTVBfTElNQl9CSVRTXTsKKworICBsb25nIG5fcG93cyA9IHBvd3RhYl9kZWNpZGUgKGV4cHRhYiwgdW4sIGJhc2UpOworCisjaWYgSEFWRV9tcG5fY29tcHV0ZV9wb3d0YWJfbXVsICYmIEhBVkVfbXBuX2NvbXB1dGVfcG93dGFiX2RpdgorICBpZiAobl9wb3dzID49IDApCisgICAgeworICAgICAgbXBuX2NvbXB1dGVfcG93dGFiX211bCAocG93dGFiLCBwb3d0YWJfbWVtLCB1biwgYmFzZSwgZXhwdGFiLCBuX3Bvd3MpOworICAgICAgcmV0dXJuIG5fcG93czsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcG5fY29tcHV0ZV9wb3d0YWJfZGl2IChwb3d0YWIsIHBvd3RhYl9tZW0sIHVuLCBiYXNlLCBleHB0YWIsIC1uX3Bvd3MpOworICAgICAgcmV0dXJuIC1uX3Bvd3M7CisgICAgfQorI2VsaWYgSEFWRV9tcG5fY29tcHV0ZV9wb3d0YWJfbXVsCisgIEFTU0VSVCAobl9wb3dzID4gMCk7CisgIG1wbl9jb21wdXRlX3Bvd3RhYl9tdWwgKHBvd3RhYiwgcG93dGFiX21lbSwgdW4sIGJhc2UsIGV4cHRhYiwgbl9wb3dzKTsKKyAgcmV0dXJuIG5fcG93czsKKyNlbGlmIEhBVkVfbXBuX2NvbXB1dGVfcG93dGFiX2RpdgorICBBU1NFUlQgKG5fcG93cyA8IDApOworICBtcG5fY29tcHV0ZV9wb3d0YWJfZGl2IChwb3d0YWIsIHBvd3RhYl9tZW0sIHVuLCBiYXNlLCBleHB0YWIsIC1uX3Bvd3MpOworICByZXR1cm4gLW5fcG93czsKKyNlbHNlCisjZXJyb3IgIm5vIHBvd3RhYiBmdW5jdGlvbiBhdmFpbGFibGUiCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NvcHlkLmMgYi9tcG4vZ2VuZXJpYy9jb3B5ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWYwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9jb3B5ZC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIG1wbl9jb3B5ZAorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wbl9jb3B5ZCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgaTsKKworICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgcnBbaV0gPSB1cFtpXTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2NvcHlpLmMgYi9tcG4vZ2VuZXJpYy9jb3B5aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmUwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9jb3B5aS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIG1wbl9jb3B5aQorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wbl9jb3B5aSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgaTsKKworICB1cCArPSBuOworICBycCArPSBuOworICBmb3IgKGkgPSAtbjsgaSAhPSAwOyBpKyspCisgICAgcnBbaV0gPSB1cFtpXTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RjcGkxX2JkaXZfcS5jIGIvbXBuL2dlbmVyaWMvZGNwaTFfYmRpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTgxOAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2RjcGkxX2JkaXZfcS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBtcG5fZGNwaTFfYmRpdl9xIC0tIGRpdmlkZS1hbmQtY29ucXVlciBIZW5zZWwgZGl2aXNpb24gd2l0aCBwcmVjb21wdXRlZAorICAgaW52ZXJzZSwgcmV0dXJuaW5nIHF1b3RpZW50LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlciBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOS0yMDExLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWYgMAkJCQkvKiB1bnVzZWQsIHNvIGxlYXZlIG91dCBmb3Igbm93ICovCitzdGF0aWMgbXBfc2l6ZV90CittcG5fZGNwaTFfYmRpdl9xX25faXRjaCAobXBfc2l6ZV90IG4pCit7CisgIC8qIE5PVEU6IERlcGVuZHMgb24gbXVsbG9fbiBhbmQgbXBuX2RjcGkxX2JkaXZfcXJfbiBpbnRlcmZhY2UgKi8KKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyogQ29tcHV0ZXMgUSA9IC0gTiAvIEQgbW9kIEJebiwgZGVzdHJveXMgTi4KKworICAgTiA9IHtucCxufQorICAgRCA9IHtkcCxufQorKi8KKworc3RhdGljIHZvaWQKK21wbl9kY3BpMV9iZGl2X3FfbiAobXBfcHRyIHFwLAorCQkgICAgbXBfcHRyIG5wLCBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBuLAorCQkgICAgbXBfbGltYl90IGRpbnYsIG1wX3B0ciB0cCkKK3sKKyAgd2hpbGUgKEFCT1ZFX1RIUkVTSE9MRCAobiwgRENfQkRJVl9RX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfc2l6ZV90IGxvLCBoaTsKKyAgICAgIG1wX2xpbWJfdCBjeTsKKworICAgICAgbG8gPSBuID4+IDE7CQkJLyogZmxvb3Iobi8yKSAqLworICAgICAgaGkgPSBuIC0gbG87CQkJLyogY2VpbChuLzIpICovCisKKyAgICAgIGN5ID0gbXBuX2RjcGkxX2JkaXZfcXJfbiAocXAsIG5wLCBkcCwgbG8sIGRpbnYsIHRwKTsKKworICAgICAgbXBuX211bGxvX24gKHRwLCBxcCwgZHAgKyBoaSwgbG8pOworICAgICAgbXBuX2FkZF9uIChucCArIGhpLCBucCArIGhpLCB0cCwgbG8pOworCisgICAgICBpZiAobG8gPCBoaSkKKwl7CisJICBjeSArPSBtcG5fYWRkbXVsXzEgKG5wICsgbG8sIHFwLCBsbywgZHBbbG9dKTsKKwkgIG5wW24gLSAxXSArPSBjeTsKKwl9CisgICAgICBxcCArPSBsbzsKKyAgICAgIG5wICs9IGxvOworICAgICAgbiAtPSBsbzsKKyAgICB9CisgIG1wbl9zYnBpMV9iZGl2X3EgKHFwLCBucCwgbiwgZHAsIG4sIGRpbnYpOworfQorCisvKiBDb21wdXRlcyBRID0gLSBOIC8gRCBtb2QgQl5ubiwgZGVzdHJveXMgTi4KKworICAgTiA9IHtucCxubn0KKyAgIEQgPSB7ZHAsZG59CisqLworCit2b2lkCittcG5fZGNwaTFfYmRpdl9xIChtcF9wdHIgcXAsCisJCSAgbXBfcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJCSAgbXBfbGltYl90IGRpbnYpCit7CisgIG1wX3NpemVfdCBxbjsKKyAgbXBfbGltYl90IGN5OworICBtcF9wdHIgdHA7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworCisgIEFTU0VSVCAoZG4gPj0gMik7CisgIEFTU0VSVCAobm4gLSBkbiA+PSAwKTsKKyAgQVNTRVJUIChkcFswXSAmIDEpOworCisgIHRwID0gVE1QX1NBTExPQ19MSU1CUyAoZG4pOworCisgIHFuID0gbm47CisKKyAgaWYgKHFuID4gZG4pCisgICAgeworICAgICAgLyogUmVkdWNlIHFuIG1vZCBkbiBpbiBhIHN1cGVyLWVmZmljaWVudCBtYW5uZXIuICAqLworICAgICAgZG8KKwlxbiAtPSBkbjsKKyAgICAgIHdoaWxlIChxbiA+IGRuKTsKKworICAgICAgLyogUGVyZm9ybSB0aGUgdHlwaWNhbGx5IHNtYWxsZXIgYmxvY2sgZmlyc3QuICAqLworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIERDX0JESVZfUVJfVEhSRVNIT0xEKSkKKwljeSA9IG1wbl9zYnBpMV9iZGl2X3FyIChxcCwgbnAsIDIgKiBxbiwgZHAsIHFuLCBkaW52KTsKKyAgICAgIGVsc2UKKwljeSA9IG1wbl9kY3BpMV9iZGl2X3FyX24gKHFwLCBucCwgZHAsIHFuLCBkaW52LCB0cCk7CisKKyAgICAgIGlmIChxbiAhPSBkbikKKwl7CisJICBpZiAocW4gPiBkbiAtIHFuKQorCSAgICBtcG5fbXVsICh0cCwgcXAsIHFuLCBkcCArIHFuLCBkbiAtIHFuKTsKKwkgIGVsc2UKKwkgICAgbXBuX211bCAodHAsIGRwICsgcW4sIGRuIC0gcW4sIHFwLCBxbik7CisJICBtcG5faW5jcl91ICh0cCArIHFuLCBjeSk7CisKKwkgIG1wbl9hZGQgKG5wICsgcW4sIG5wICsgcW4sIG5uIC0gcW4sIHRwLCBkbik7CisJICBjeSA9IDA7CisJfQorCisgICAgICBucCArPSBxbjsKKyAgICAgIHFwICs9IHFuOworCisgICAgICBxbiA9IG5uIC0gcW47CisgICAgICB3aGlsZSAocW4gPiBkbikKKwl7CisJICBtcG5fYWRkXzEgKG5wICsgZG4sIG5wICsgZG4sIHFuIC0gZG4sIGN5KTsKKwkgIGN5ID0gbXBuX2RjcGkxX2JkaXZfcXJfbiAocXAsIG5wLCBkcCwgZG4sIGRpbnYsIHRwKTsKKwkgIHFwICs9IGRuOworCSAgbnAgKz0gZG47CisJICBxbiAtPSBkbjsKKwl9CisgICAgICBtcG5fZGNwaTFfYmRpdl9xX24gKHFwLCBucCwgZHAsIGRuLCBkaW52LCB0cCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIERDX0JESVZfUV9USFJFU0hPTEQpKQorCW1wbl9zYnBpMV9iZGl2X3EgKHFwLCBucCwgcW4sIGRwLCBxbiwgZGludik7CisgICAgICBlbHNlCisJbXBuX2RjcGkxX2JkaXZfcV9uIChxcCwgbnAsIGRwLCBxbiwgZGludiwgdHApOworICAgIH0KKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RjcGkxX2JkaXZfcXIuYyBiL21wbi9nZW5lcmljL2RjcGkxX2JkaXZfcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRhNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZGNwaTFfYmRpdl9xci5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiBtcG5fZGNwaTFfYmRpdl9xciAtLSBkaXZpZGUtYW5kLWNvbnF1ZXIgSGVuc2VsIGRpdmlzaW9uIHdpdGggcHJlY29tcHV0ZWQKKyAgIGludmVyc2UsIHJldHVybmluZyBxdW90aWVudCBhbmQgcmVtYWluZGVyLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlciBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQ29tcHV0ZXMgSGVuc2VsIGJpbmFyeSBkaXZpc2lvbiBvZiB7bnAsIDIqbn0gYnkge2RwLCBufS4KKworICAgT3V0cHV0OgorCisgICAgICBxID0gLW4gKiBkXnstMX0gbW9kIDJee3FuICogR01QX05VTUJfQklUU30sCisKKyAgICAgIHIgPSAobiArIHEgKiBkKSAqIDJeey1xbiAqIEdNUF9OVU1CX0JJVFN9CisKKyAgIFN0b3JlcyBxIGF0IHFwLiBTdG9yZXMgdGhlIG4gbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgciBhdCB0aGUgaGlnaCBoYWxmCisgICBvZiBucCwgYW5kIHJldHVybnMgdGhlIGNhcnJ5IGZyb20gdGhlIGFkZGl0aW9uIG4gKyBxKmQuCisKKyAgIGQgbXVzdCBiZSBvZGQuIGRpbnYgaXMgKC1kKV4tMSBtb2QgMl5HTVBfTlVNQl9CSVRTLiAqLworCittcF9zaXplX3QKK21wbl9kY3BpMV9iZGl2X3FyX25faXRjaCAobXBfc2l6ZV90IG4pCit7CisgIHJldHVybiBuOworfQorCittcF9saW1iX3QKK21wbl9kY3BpMV9iZGl2X3FyX24gKG1wX3B0ciBxcCwgbXBfcHRyIG5wLCBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBuLAorCQkgICAgIG1wX2xpbWJfdCBkaW52LCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBsbywgaGk7CisgIG1wX2xpbWJfdCBjeTsKKyAgbXBfbGltYl90IHJoOworCisgIGxvID0gbiA+PiAxOwkJCS8qIGZsb29yKG4vMikgKi8KKyAgaGkgPSBuIC0gbG87CQkJLyogY2VpbChuLzIpICovCisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobG8sIERDX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICBjeSA9IG1wbl9zYnBpMV9iZGl2X3FyIChxcCwgbnAsIDIgKiBsbywgZHAsIGxvLCBkaW52KTsKKyAgZWxzZQorICAgIGN5ID0gbXBuX2RjcGkxX2JkaXZfcXJfbiAocXAsIG5wLCBkcCwgbG8sIGRpbnYsIHRwKTsKKworICBtcG5fbXVsICh0cCwgZHAgKyBsbywgaGksIHFwLCBsbyk7CisKKyAgbXBuX2luY3JfdSAodHAgKyBsbywgY3kpOworICByaCA9IG1wbl9hZGQgKG5wICsgbG8sIG5wICsgbG8sIG4gKyBoaSwgdHAsIG4pOworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKGhpLCBEQ19CRElWX1FSX1RIUkVTSE9MRCkpCisgICAgY3kgPSBtcG5fc2JwaTFfYmRpdl9xciAocXAgKyBsbywgbnAgKyBsbywgMiAqIGhpLCBkcCwgaGksIGRpbnYpOworICBlbHNlCisgICAgY3kgPSBtcG5fZGNwaTFfYmRpdl9xcl9uIChxcCArIGxvLCBucCArIGxvLCBkcCwgaGksIGRpbnYsIHRwKTsKKworICBtcG5fbXVsICh0cCwgcXAgKyBsbywgaGksIGRwICsgaGksIGxvKTsKKworICBtcG5faW5jcl91ICh0cCArIGhpLCBjeSk7CisgIHJoICs9IG1wbl9hZGRfbiAobnAgKyBuLCBucCArIG4sIHRwLCBuKTsKKworICByZXR1cm4gcmg7Cit9CisKK21wX2xpbWJfdAorbXBuX2RjcGkxX2JkaXZfcXIgKG1wX3B0ciBxcCwgbXBfcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLCBtcF9saW1iX3QgZGludikKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9saW1iX3QgcnIsIGN5OworICBtcF9wdHIgdHA7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworCisgIEFTU0VSVCAoZG4gPj0gMik7CQkvKiB0byBhZGhlcmUgdG8gbXBuX3NicGkxX2Rpdl9xcidzIGxpbWl0cyAqLworICBBU1NFUlQgKG5uIC0gZG4gPj0gMSk7CS8qIHRvIGFkaGVyZSB0byBtcG5fc2JwaTFfZGl2X3FyJ3MgbGltaXRzICovCisgIEFTU0VSVCAoZHBbMF0gJiAxKTsKKworICB0cCA9IFRNUF9TQUxMT0NfTElNQlMgKGRuKTsKKworICBxbiA9IG5uIC0gZG47CisKKyAgaWYgKHFuID4gZG4pCisgICAgeworICAgICAgLyogUmVkdWNlIHFuIG1vZCBkbiB3aXRob3V0IGRpdmlzaW9uLCBvcHRpbWl6aW5nIHNtYWxsIG9wZXJhdGlvbnMuICAqLworICAgICAgZG8KKwlxbiAtPSBkbjsKKyAgICAgIHdoaWxlIChxbiA+IGRuKTsKKworICAgICAgLyogUGVyZm9ybSB0aGUgdHlwaWNhbGx5IHNtYWxsZXIgYmxvY2sgZmlyc3QuICAqLworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIERDX0JESVZfUVJfVEhSRVNIT0xEKSkKKwljeSA9IG1wbl9zYnBpMV9iZGl2X3FyIChxcCwgbnAsIDIgKiBxbiwgZHAsIHFuLCBkaW52KTsKKyAgICAgIGVsc2UKKwljeSA9IG1wbl9kY3BpMV9iZGl2X3FyX24gKHFwLCBucCwgZHAsIHFuLCBkaW52LCB0cCk7CisKKyAgICAgIHJyID0gMDsKKyAgICAgIGlmIChxbiAhPSBkbikKKwl7CisJICBpZiAocW4gPiBkbiAtIHFuKQorCSAgICBtcG5fbXVsICh0cCwgcXAsIHFuLCBkcCArIHFuLCBkbiAtIHFuKTsKKwkgIGVsc2UKKwkgICAgbXBuX211bCAodHAsIGRwICsgcW4sIGRuIC0gcW4sIHFwLCBxbik7CisJICBtcG5faW5jcl91ICh0cCArIHFuLCBjeSk7CisKKwkgIHJyID0gbXBuX2FkZCAobnAgKyBxbiwgbnAgKyBxbiwgbm4gLSBxbiwgdHAsIGRuKTsKKwkgIGN5ID0gMDsKKwl9CisKKyAgICAgIG5wICs9IHFuOworICAgICAgcXAgKz0gcW47CisKKyAgICAgIHFuID0gbm4gLSBkbiAtIHFuOworICAgICAgZG8KKwl7CisJICByciArPSBtcG5fYWRkXzEgKG5wICsgZG4sIG5wICsgZG4sIHFuLCBjeSk7CisJICBjeSA9IG1wbl9kY3BpMV9iZGl2X3FyX24gKHFwLCBucCwgZHAsIGRuLCBkaW52LCB0cCk7CisJICBxcCArPSBkbjsKKwkgIG5wICs9IGRuOworCSAgcW4gLT0gZG47CisJfQorICAgICAgd2hpbGUgKHFuID4gMCk7CisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybiByciArIGN5OworICAgIH0KKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChxbiwgRENfQkRJVl9RUl9USFJFU0hPTEQpKQorICAgIGN5ID0gbXBuX3NicGkxX2JkaXZfcXIgKHFwLCBucCwgMiAqIHFuLCBkcCwgcW4sIGRpbnYpOworICBlbHNlCisgICAgY3kgPSBtcG5fZGNwaTFfYmRpdl9xcl9uIChxcCwgbnAsIGRwLCBxbiwgZGludiwgdHApOworCisgIHJyID0gMDsKKyAgaWYgKHFuICE9IGRuKQorICAgIHsKKyAgICAgIGlmIChxbiA+IGRuIC0gcW4pCisJbXBuX211bCAodHAsIHFwLCBxbiwgZHAgKyBxbiwgZG4gLSBxbik7CisgICAgICBlbHNlCisJbXBuX211bCAodHAsIGRwICsgcW4sIGRuIC0gcW4sIHFwLCBxbik7CisgICAgICBtcG5faW5jcl91ICh0cCArIHFuLCBjeSk7CisKKyAgICAgIHJyID0gbXBuX2FkZCAobnAgKyBxbiwgbnAgKyBxbiwgbm4gLSBxbiwgdHAsIGRuKTsKKyAgICAgIGN5ID0gMDsKKyAgICB9CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiByciArIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZGNwaTFfZGl2X3EuYyBiL21wbi9nZW5lcmljL2RjcGkxX2Rpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwNWM5OAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2RjcGkxX2Rpdl9xLmMKQEAgLTAsMCArMSw4NiBAQAorLyogbXBuX2RjX2Rpdl9xIC0tIGRpdmlkZS1hbmQtY29ucXVlciBkaXZpc2lvbiwgcmV0dXJuaW5nIGV4YWN0IHF1b3RpZW50CisgICBvbmx5LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQgYW5kIE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK21wX2xpbWJfdAorbXBuX2RjcGkxX2Rpdl9xIChtcF9wdHIgcXAsIG1wX3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCQkgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sIGdtcF9waTFfdCAqZGludikKK3sKKyAgbXBfcHRyIHRwLCB3cDsKKyAgbXBfbGltYl90IHFoOworICBtcF9zaXplX3QgcW47CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworCisgIEFTU0VSVCAoZG4gPj0gNik7CisgIEFTU0VSVCAobm4gLSBkbiA+PSAzKTsKKyAgQVNTRVJUIChkcFtkbi0xXSAmIEdNUF9OVU1CX0hJR0hCSVQpOworCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChubiArIDEpOworICBNUE5fQ09QWSAodHAgKyAxLCBucCwgbm4pOworICB0cFswXSA9IDA7CisKKyAgcW4gPSBubiAtIGRuOworICB3cCA9IFRNUF9BTExPQ19MSU1CUyAocW4gKyAxKTsKKworICBxaCA9IG1wbl9kY3BpMV9kaXZhcHByX3EgKHdwLCB0cCwgbm4gKyAxLCBkcCwgZG4sIGRpbnYpOworCisgIGlmICh3cFswXSA9PSAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeTsKKworICAgICAgaWYgKHFuID4gZG4pCisJbXBuX211bCAodHAsIHdwICsgMSwgcW4sIGRwLCBkbik7CisgICAgICBlbHNlCisJbXBuX211bCAodHAsIGRwLCBkbiwgd3AgKyAxLCBxbik7CisKKyAgICAgIGN5ID0gKHFoICE9IDApID8gbXBuX2FkZF9uICh0cCArIHFuLCB0cCArIHFuLCBkcCwgZG4pIDogMDsKKworICAgICAgaWYgKGN5IHx8IG1wbl9jbXAgKHRwLCBucCwgbm4pID4gMCkgLyogQXQgbW9zdCBpcyB3cm9uZyBieSBvbmUsIG5vIGN5Y2xlLiAqLworCXFoIC09IG1wbl9zdWJfMSAocXAsIHdwICsgMSwgcW4sIDEpOworICAgICAgZWxzZSAvKiBTYW1lIGFzIGJlbG93ICovCisJTVBOX0NPUFkgKHFwLCB3cCArIDEsIHFuKTsKKyAgICB9CisgIGVsc2UKKyAgICBNUE5fQ09QWSAocXAsIHdwICsgMSwgcW4pOworCisgIFRNUF9GUkVFOworICByZXR1cm4gcWg7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kY3BpMV9kaXZfcXIuYyBiL21wbi9nZW5lcmljL2RjcGkxX2Rpdl9xci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTY1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kY3BpMV9kaXZfcXIuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogbXBuX2RjcGkxX2Rpdl9xcl9uIC0tIHJlY3Vyc2l2ZSBkaXZpZGUtYW5kLWNvbnF1ZXIgZGl2aXNpb24gZm9yIGFyYml0cmFyeQorICAgc2l6ZSBvcGVyYW5kcy4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworbXBfbGltYl90CittcG5fZGNwaTFfZGl2X3FyX24gKG1wX3B0ciBxcCwgbXBfcHRyIG5wLCBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBuLAorCQkgICAgZ21wX3BpMV90ICpkaW52LCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBsbywgaGk7CisgIG1wX2xpbWJfdCBjeSwgcWgsIHFsOworCisgIGxvID0gbiA+PiAxOwkJCS8qIGZsb29yKG4vMikgKi8KKyAgaGkgPSBuIC0gbG87CQkJLyogY2VpbChuLzIpICovCisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoaGksIERDX0RJVl9RUl9USFJFU0hPTEQpKQorICAgIHFoID0gbXBuX3NicGkxX2Rpdl9xciAocXAgKyBsbywgbnAgKyAyICogbG8sIDIgKiBoaSwgZHAgKyBsbywgaGksIGRpbnYtPmludjMyKTsKKyAgZWxzZQorICAgIHFoID0gbXBuX2RjcGkxX2Rpdl9xcl9uIChxcCArIGxvLCBucCArIDIgKiBsbywgZHAgKyBsbywgaGksIGRpbnYsIHRwKTsKKworICBtcG5fbXVsICh0cCwgcXAgKyBsbywgaGksIGRwLCBsbyk7CisKKyAgY3kgPSBtcG5fc3ViX24gKG5wICsgbG8sIG5wICsgbG8sIHRwLCBuKTsKKyAgaWYgKHFoICE9IDApCisgICAgY3kgKz0gbXBuX3N1Yl9uIChucCArIG4sIG5wICsgbiwgZHAsIGxvKTsKKworICB3aGlsZSAoY3kgIT0gMCkKKyAgICB7CisgICAgICBxaCAtPSBtcG5fc3ViXzEgKHFwICsgbG8sIHFwICsgbG8sIGhpLCAxKTsKKyAgICAgIGN5IC09IG1wbl9hZGRfbiAobnAgKyBsbywgbnAgKyBsbywgZHAsIG4pOworICAgIH0KKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChsbywgRENfRElWX1FSX1RIUkVTSE9MRCkpCisgICAgcWwgPSBtcG5fc2JwaTFfZGl2X3FyIChxcCwgbnAgKyBoaSwgMiAqIGxvLCBkcCArIGhpLCBsbywgZGludi0+aW52MzIpOworICBlbHNlCisgICAgcWwgPSBtcG5fZGNwaTFfZGl2X3FyX24gKHFwLCBucCArIGhpLCBkcCArIGhpLCBsbywgZGludiwgdHApOworCisgIG1wbl9tdWwgKHRwLCBkcCwgaGksIHFwLCBsbyk7CisKKyAgY3kgPSBtcG5fc3ViX24gKG5wLCBucCwgdHAsIG4pOworICBpZiAocWwgIT0gMCkKKyAgICBjeSArPSBtcG5fc3ViX24gKG5wICsgbG8sIG5wICsgbG8sIGRwLCBoaSk7CisKKyAgd2hpbGUgKGN5ICE9IDApCisgICAgeworICAgICAgbXBuX3N1Yl8xIChxcCwgcXAsIGxvLCAxKTsKKyAgICAgIGN5IC09IG1wbl9hZGRfbiAobnAsIG5wLCBkcCwgbik7CisgICAgfQorCisgIHJldHVybiBxaDsKK30KKworbXBfbGltYl90CittcG5fZGNwaTFfZGl2X3FyIChtcF9wdHIgcXAsCisJCSAgbXBfcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJCSAgZ21wX3BpMV90ICpkaW52KQoreworICBtcF9zaXplX3QgcW47CisgIG1wX2xpbWJfdCBxaCwgY3k7CisgIG1wX3B0ciB0cDsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgQVNTRVJUIChkbiA+PSA2KTsJCS8qIHRvIGFkaGVyZSB0byBtcG5fc2JwaTFfZGl2X3FyJ3MgbGltaXRzICovCisgIEFTU0VSVCAobm4gLSBkbiA+PSAzKTsJLyogdG8gYWRoZXJlIHRvIG1wbl9zYnBpMV9kaXZfcXIncyBsaW1pdHMgKi8KKyAgQVNTRVJUIChkcFtkbi0xXSAmIEdNUF9OVU1CX0hJR0hCSVQpOworCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChkbik7CisKKyAgcW4gPSBubiAtIGRuOworICBxcCArPSBxbjsKKyAgbnAgKz0gbm47CisgIGRwICs9IGRuOworCisgIGlmIChxbiA+IGRuKQorICAgIHsKKyAgICAgIC8qIFJlZHVjZSBxbiBtb2QgZG4gd2l0aG91dCBkaXZpc2lvbiwgb3B0aW1pemluZyBzbWFsbCBvcGVyYXRpb25zLiAgKi8KKyAgICAgIGRvCisJcW4gLT0gZG47CisgICAgICB3aGlsZSAocW4gPiBkbik7CisKKyAgICAgIHFwIC09IHFuOwkJCS8qIHBvaW50IGF0IGxvdyBsaW1iIG9mIG5leHQgcXVvdGllbnQgYmxvY2sgKi8KKyAgICAgIG5wIC09IHFuOwkJCS8qIHBvaW50IGluIHRoZSBtaWRkbGUgb2YgcGFydGlhbCByZW1haW5kZXIgKi8KKworICAgICAgLyogUGVyZm9ybSB0aGUgdHlwaWNhbGx5IHNtYWxsZXIgYmxvY2sgZmlyc3QuICAqLworICAgICAgaWYgKHFuID09IDEpCisJeworCSAgbXBfbGltYl90IHEsIG4yLCBuMSwgbjAsIGQxLCBkMDsKKworCSAgLyogSGFuZGxlIHFoIHVwIGZyb250LCBmb3Igc2ltcGxpY2l0eS4gKi8KKwkgIHFoID0gbXBuX2NtcCAobnAgLSBkbiArIDEsIGRwIC0gZG4sIGRuKSA+PSAwOworCSAgaWYgKHFoKQorCSAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChucCAtIGRuICsgMSwgbnAgLSBkbiArIDEsIGRwIC0gZG4sIGRuKSk7CisKKwkgIC8qIEEgc2luZ2xlIGl0ZXJhdGlvbiBvZiBzY2hvb2xib29rOiBPbmUgMy8yIGRpdmlzaW9uLAorCSAgICAgZm9sbG93ZWQgYnkgdGhlIGJpZ251bSB1cGRhdGUgYW5kIGFkanVzdG1lbnQuICovCisJICBuMiA9IG5wWzBdOworCSAgbjEgPSBucFstMV07CisJICBuMCA9IG5wWy0yXTsKKwkgIGQxID0gZHBbLTFdOworCSAgZDAgPSBkcFstMl07CisKKwkgIEFTU0VSVCAobjIgPCBkMSB8fCAobjIgPT0gZDEgJiYgbjEgPD0gZDApKTsKKworCSAgaWYgKFVOTElLRUxZIChuMiA9PSBkMSkgJiYgbjEgPT0gZDApCisJICAgIHsKKwkgICAgICBxID0gR01QX05VTUJfTUFTSzsKKwkgICAgICBjeSA9IG1wbl9zdWJtdWxfMSAobnAgLSBkbiwgZHAgLSBkbiwgZG4sIHEpOworCSAgICAgIEFTU0VSVCAoY3kgPT0gbjIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1ZGl2X3FyXzNieTIgKHEsIG4xLCBuMCwgbjIsIG4xLCBuMCwgZDEsIGQwLCBkaW52LT5pbnYzMik7CisKKwkgICAgICBpZiAoZG4gPiAyKQorCQl7CisJCSAgbXBfbGltYl90IGN5LCBjeTE7CisJCSAgY3kgPSBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwIC0gZG4sIGRuIC0gMiwgcSk7CisKKwkJICBjeTEgPSBuMCA8IGN5OworCQkgIG4wID0gKG4wIC0gY3kpICYgR01QX05VTUJfTUFTSzsKKwkJICBjeSA9IG4xIDwgY3kxOworCQkgIG4xID0gKG4xIC0gY3kxKSAmIEdNUF9OVU1CX01BU0s7CisJCSAgbnBbLTJdID0gbjA7CisKKwkJICBpZiAoVU5MSUtFTFkgKGN5ICE9IDApKQorCQkgICAgeworCQkgICAgICBuMSArPSBkMSArIG1wbl9hZGRfbiAobnAgLSBkbiwgbnAgLSBkbiwgZHAgLSBkbiwgZG4gLSAxKTsKKwkJICAgICAgcWggLT0gKHEgPT0gMCk7CisJCSAgICAgIHEgPSAocSAtIDEpICYgR01QX05VTUJfTUFTSzsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJbnBbLTJdID0gbjA7CisKKwkgICAgICBucFstMV0gPSBuMTsKKwkgICAgfQorCSAgcXBbMF0gPSBxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBEbyBhIDJxbiAvIHFuIGRpdmlzaW9uICovCisJICBpZiAocW4gPT0gMikKKwkgICAgcWggPSBtcG5fZGl2cmVtXzIgKHFwLCAwTCwgbnAgLSAyLCA0LCBkcCAtIDIpOyAvKiBGSVhNRTogb2Jzb2xldGUgZnVuY3Rpb24uIFVzZSA1LzMgZGl2aXNpb24/ICovCisJICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBEQ19ESVZfUVJfVEhSRVNIT0xEKSkKKwkgICAgcWggPSBtcG5fc2JwaTFfZGl2X3FyIChxcCwgbnAgLSBxbiwgMiAqIHFuLCBkcCAtIHFuLCBxbiwgZGludi0+aW52MzIpOworCSAgZWxzZQorCSAgICBxaCA9IG1wbl9kY3BpMV9kaXZfcXJfbiAocXAsIG5wIC0gcW4sIGRwIC0gcW4sIHFuLCBkaW52LCB0cCk7CisKKwkgIGlmIChxbiAhPSBkbikKKwkgICAgeworCSAgICAgIGlmIChxbiA+IGRuIC0gcW4pCisJCW1wbl9tdWwgKHRwLCBxcCwgcW4sIGRwIC0gZG4sIGRuIC0gcW4pOworCSAgICAgIGVsc2UKKwkJbXBuX211bCAodHAsIGRwIC0gZG4sIGRuIC0gcW4sIHFwLCBxbik7CisKKwkgICAgICBjeSA9IG1wbl9zdWJfbiAobnAgLSBkbiwgbnAgLSBkbiwgdHAsIGRuKTsKKwkgICAgICBpZiAocWggIT0gMCkKKwkJY3kgKz0gbXBuX3N1Yl9uIChucCAtIGRuICsgcW4sIG5wIC0gZG4gKyBxbiwgZHAgLSBkbiwgZG4gLSBxbik7CisKKwkgICAgICB3aGlsZSAoY3kgIT0gMCkKKwkJeworCQkgIHFoIC09IG1wbl9zdWJfMSAocXAsIHFwLCBxbiwgMSk7CisJCSAgY3kgLT0gbXBuX2FkZF9uIChucCAtIGRuLCBucCAtIGRuLCBkcCAtIGRuLCBkbik7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgcW4gPSBubiAtIGRuIC0gcW47CisgICAgICBkbworCXsKKwkgIHFwIC09IGRuOworCSAgbnAgLT0gZG47CisJICBtcG5fZGNwaTFfZGl2X3FyX24gKHFwLCBucCAtIGRuLCBkcCAtIGRuLCBkbiwgZGludiwgdHApOworCSAgcW4gLT0gZG47CisJfQorICAgICAgd2hpbGUgKHFuID4gMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcXAgLT0gcW47CQkJLyogcG9pbnQgYXQgbG93IGxpbWIgb2YgbmV4dCBxdW90aWVudCBibG9jayAqLworICAgICAgbnAgLT0gcW47CQkJLyogcG9pbnQgaW4gdGhlIG1pZGRsZSBvZiBwYXJ0aWFsIHJlbWFpbmRlciAqLworCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChxbiwgRENfRElWX1FSX1RIUkVTSE9MRCkpCisJcWggPSBtcG5fc2JwaTFfZGl2X3FyIChxcCwgbnAgLSBxbiwgMiAqIHFuLCBkcCAtIHFuLCBxbiwgZGludi0+aW52MzIpOworICAgICAgZWxzZQorCXFoID0gbXBuX2RjcGkxX2Rpdl9xcl9uIChxcCwgbnAgLSBxbiwgZHAgLSBxbiwgcW4sIGRpbnYsIHRwKTsKKworICAgICAgaWYgKHFuICE9IGRuKQorCXsKKwkgIGlmIChxbiA+IGRuIC0gcW4pCisJICAgIG1wbl9tdWwgKHRwLCBxcCwgcW4sIGRwIC0gZG4sIGRuIC0gcW4pOworCSAgZWxzZQorCSAgICBtcG5fbXVsICh0cCwgZHAgLSBkbiwgZG4gLSBxbiwgcXAsIHFuKTsKKworCSAgY3kgPSBtcG5fc3ViX24gKG5wIC0gZG4sIG5wIC0gZG4sIHRwLCBkbik7CisJICBpZiAocWggIT0gMCkKKwkgICAgY3kgKz0gbXBuX3N1Yl9uIChucCAtIGRuICsgcW4sIG5wIC0gZG4gKyBxbiwgZHAgLSBkbiwgZG4gLSBxbik7CisKKwkgIHdoaWxlIChjeSAhPSAwKQorCSAgICB7CisJICAgICAgcWggLT0gbXBuX3N1Yl8xIChxcCwgcXAsIHFuLCAxKTsKKwkgICAgICBjeSAtPSBtcG5fYWRkX24gKG5wIC0gZG4sIG5wIC0gZG4sIGRwIC0gZG4sIGRuKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBxaDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RjcGkxX2RpdmFwcHJfcS5jIGIvbXBuL2dlbmVyaWMvZGNwaTFfZGl2YXBwcl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiZTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2RjcGkxX2RpdmFwcHJfcS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiBtcG5fZGNwaTFfZGl2YXBwcl9xIC0tIGRpdmlkZS1hbmQtY29ucXVlciBkaXZpc2lvbiwgcmV0dXJuaW5nIGFwcHJveGltYXRlCisgICBxdW90aWVudC4gIFRoZSBxdW90aWVudCByZXR1cm5lZCBpcyBlaXRoZXIgY29ycmVjdCwgb3Igb25lIHRvbyBsYXJnZS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworc3RhdGljIG1wX2xpbWJfdAorbXBuX2RjcGkxX2RpdmFwcHJfcV9uIChtcF9wdHIgcXAsIG1wX3B0ciBucCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbiwKKwkJICAgICAgIGdtcF9waTFfdCAqZGludiwgbXBfcHRyIHRwKQoreworICBtcF9zaXplX3QgbG8sIGhpOworICBtcF9saW1iX3QgY3ksIHFoLCBxbDsKKworICBsbyA9IG4gPj4gMTsJCQkvKiBmbG9vcihuLzIpICovCisgIGhpID0gbiAtIGxvOwkJCS8qIGNlaWwobi8yKSAqLworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKGhpLCBEQ19ESVZfUVJfVEhSRVNIT0xEKSkKKyAgICBxaCA9IG1wbl9zYnBpMV9kaXZfcXIgKHFwICsgbG8sIG5wICsgMiAqIGxvLCAyICogaGksIGRwICsgbG8sIGhpLCBkaW52LT5pbnYzMik7CisgIGVsc2UKKyAgICBxaCA9IG1wbl9kY3BpMV9kaXZfcXJfbiAocXAgKyBsbywgbnAgKyAyICogbG8sIGRwICsgbG8sIGhpLCBkaW52LCB0cCk7CisKKyAgbXBuX211bCAodHAsIHFwICsgbG8sIGhpLCBkcCwgbG8pOworCisgIGN5ID0gbXBuX3N1Yl9uIChucCArIGxvLCBucCArIGxvLCB0cCwgbik7CisgIGlmIChxaCAhPSAwKQorICAgIGN5ICs9IG1wbl9zdWJfbiAobnAgKyBuLCBucCArIG4sIGRwLCBsbyk7CisKKyAgd2hpbGUgKGN5ICE9IDApCisgICAgeworICAgICAgcWggLT0gbXBuX3N1Yl8xIChxcCArIGxvLCBxcCArIGxvLCBoaSwgMSk7CisgICAgICBjeSAtPSBtcG5fYWRkX24gKG5wICsgbG8sIG5wICsgbG8sIGRwLCBuKTsKKyAgICB9CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobG8sIERDX0RJVkFQUFJfUV9USFJFU0hPTEQpKQorICAgIHFsID0gbXBuX3NicGkxX2RpdmFwcHJfcSAocXAsIG5wICsgaGksIDIgKiBsbywgZHAgKyBoaSwgbG8sIGRpbnYtPmludjMyKTsKKyAgZWxzZQorICAgIHFsID0gbXBuX2RjcGkxX2RpdmFwcHJfcV9uIChxcCwgbnAgKyBoaSwgZHAgKyBoaSwgbG8sIGRpbnYsIHRwKTsKKworICBpZiAoVU5MSUtFTFkgKHFsICE9IDApKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGxvOyBpKyspCisJcXBbaV0gPSBHTVBfTlVNQl9NQVNLOworICAgIH0KKworICByZXR1cm4gcWg7Cit9CisKK21wX2xpbWJfdAorbXBuX2RjcGkxX2RpdmFwcHJfcSAobXBfcHRyIHFwLCBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJICAgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwgZ21wX3BpMV90ICpkaW52KQoreworICBtcF9zaXplX3QgcW47CisgIG1wX2xpbWJfdCBxaCwgY3ksIHFzYXZlOworICBtcF9wdHIgdHA7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworCisgIEFTU0VSVCAoZG4gPj0gNik7CisgIEFTU0VSVCAobm4gPiBkbik7CisgIEFTU0VSVCAoZHBbZG4tMV0gJiBHTVBfTlVNQl9ISUdIQklUKTsKKworICBxbiA9IG5uIC0gZG47CisgIHFwICs9IHFuOworICBucCArPSBubjsKKyAgZHAgKz0gZG47CisKKyAgaWYgKHFuID49IGRuKQorICAgIHsKKyAgICAgIHFuKys7CQkJLyogcHJldGVuZCB3ZSdsbCBuZWVkIGFuIGV4dHJhIGxpbWIgKi8KKyAgICAgIC8qIFJlZHVjZSBxbiBtb2QgZG4gd2l0aG91dCBkaXZpc2lvbiwgb3B0aW1pemluZyBzbWFsbCBvcGVyYXRpb25zLiAgKi8KKyAgICAgIGRvCisJcW4gLT0gZG47CisgICAgICB3aGlsZSAocW4gPiBkbik7CisKKyAgICAgIHFwIC09IHFuOwkJCS8qIHBvaW50IGF0IGxvdyBsaW1iIG9mIG5leHQgcXVvdGllbnQgYmxvY2sgKi8KKyAgICAgIG5wIC09IHFuOwkJCS8qIHBvaW50IGluIHRoZSBtaWRkbGUgb2YgcGFydGlhbCByZW1haW5kZXIgKi8KKworICAgICAgdHAgPSBUTVBfU0FMTE9DX0xJTUJTIChkbik7CisKKyAgICAgIC8qIFBlcmZvcm0gdGhlIHR5cGljYWxseSBzbWFsbGVyIGJsb2NrIGZpcnN0LiAgKi8KKyAgICAgIGlmIChxbiA9PSAxKQorCXsKKwkgIG1wX2xpbWJfdCBxLCBuMiwgbjEsIG4wLCBkMSwgZDA7CisKKwkgIC8qIEhhbmRsZSBxaCB1cCBmcm9udCwgZm9yIHNpbXBsaWNpdHkuICovCisJICBxaCA9IG1wbl9jbXAgKG5wIC0gZG4gKyAxLCBkcCAtIGRuLCBkbikgPj0gMDsKKwkgIGlmIChxaCkKKwkgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAobnAgLSBkbiArIDEsIG5wIC0gZG4gKyAxLCBkcCAtIGRuLCBkbikpOworCisJICAvKiBBIHNpbmdsZSBpdGVyYXRpb24gb2Ygc2Nob29sYm9vazogT25lIDMvMiBkaXZpc2lvbiwKKwkgICAgIGZvbGxvd2VkIGJ5IHRoZSBiaWdudW0gdXBkYXRlIGFuZCBhZGp1c3RtZW50LiAqLworCSAgbjIgPSBucFswXTsKKwkgIG4xID0gbnBbLTFdOworCSAgbjAgPSBucFstMl07CisJICBkMSA9IGRwWy0xXTsKKwkgIGQwID0gZHBbLTJdOworCisJICBBU1NFUlQgKG4yIDwgZDEgfHwgKG4yID09IGQxICYmIG4xIDw9IGQwKSk7CisKKwkgIGlmIChVTkxJS0VMWSAobjIgPT0gZDEpICYmIG4xID09IGQwKQorCSAgICB7CisJICAgICAgcSA9IEdNUF9OVU1CX01BU0s7CisJICAgICAgY3kgPSBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwIC0gZG4sIGRuLCBxKTsKKwkgICAgICBBU1NFUlQgKGN5ID09IG4yKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdWRpdl9xcl8zYnkyIChxLCBuMSwgbjAsIG4yLCBuMSwgbjAsIGQxLCBkMCwgZGludi0+aW52MzIpOworCisJICAgICAgaWYgKGRuID4gMikKKwkJeworCQkgIG1wX2xpbWJfdCBjeSwgY3kxOworCQkgIGN5ID0gbXBuX3N1Ym11bF8xIChucCAtIGRuLCBkcCAtIGRuLCBkbiAtIDIsIHEpOworCisJCSAgY3kxID0gbjAgPCBjeTsKKwkJICBuMCA9IChuMCAtIGN5KSAmIEdNUF9OVU1CX01BU0s7CisJCSAgY3kgPSBuMSA8IGN5MTsKKwkJICBuMSA9IChuMSAtIGN5MSkgJiBHTVBfTlVNQl9NQVNLOworCQkgIG5wWy0yXSA9IG4wOworCisJCSAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwkJICAgIHsKKwkJICAgICAgbjEgKz0gZDEgKyBtcG5fYWRkX24gKG5wIC0gZG4sIG5wIC0gZG4sIGRwIC0gZG4sIGRuIC0gMSk7CisJCSAgICAgIHFoIC09IChxID09IDApOworCQkgICAgICBxID0gKHEgLSAxKSAmIEdNUF9OVU1CX01BU0s7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCW5wWy0yXSA9IG4wOworCisJICAgICAgbnBbLTFdID0gbjE7CisJICAgIH0KKwkgIHFwWzBdID0gcTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHFuID09IDIpCisJICAgIHFoID0gbXBuX2RpdnJlbV8yIChxcCwgMEwsIG5wIC0gMiwgNCwgZHAgLSAyKTsKKwkgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIERDX0RJVl9RUl9USFJFU0hPTEQpKQorCSAgICBxaCA9IG1wbl9zYnBpMV9kaXZfcXIgKHFwLCBucCAtIHFuLCAyICogcW4sIGRwIC0gcW4sIHFuLCBkaW52LT5pbnYzMik7CisJICBlbHNlCisJICAgIHFoID0gbXBuX2RjcGkxX2Rpdl9xcl9uIChxcCwgbnAgLSBxbiwgZHAgLSBxbiwgcW4sIGRpbnYsIHRwKTsKKworCSAgaWYgKHFuICE9IGRuKQorCSAgICB7CisJICAgICAgaWYgKHFuID4gZG4gLSBxbikKKwkJbXBuX211bCAodHAsIHFwLCBxbiwgZHAgLSBkbiwgZG4gLSBxbik7CisJICAgICAgZWxzZQorCQltcG5fbXVsICh0cCwgZHAgLSBkbiwgZG4gLSBxbiwgcXAsIHFuKTsKKworCSAgICAgIGN5ID0gbXBuX3N1Yl9uIChucCAtIGRuLCBucCAtIGRuLCB0cCwgZG4pOworCSAgICAgIGlmIChxaCAhPSAwKQorCQljeSArPSBtcG5fc3ViX24gKG5wIC0gZG4gKyBxbiwgbnAgLSBkbiArIHFuLCBkcCAtIGRuLCBkbiAtIHFuKTsKKworCSAgICAgIHdoaWxlIChjeSAhPSAwKQorCQl7CisJCSAgcWggLT0gbXBuX3N1Yl8xIChxcCwgcXAsIHFuLCAxKTsKKwkJICBjeSAtPSBtcG5fYWRkX24gKG5wIC0gZG4sIG5wIC0gZG4sIGRwIC0gZG4sIGRuKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgcW4gPSBubiAtIGRuIC0gcW4gKyAxOworICAgICAgd2hpbGUgKHFuID4gZG4pCisJeworCSAgcXAgLT0gZG47CisJICBucCAtPSBkbjsKKwkgIG1wbl9kY3BpMV9kaXZfcXJfbiAocXAsIG5wIC0gZG4sIGRwIC0gZG4sIGRuLCBkaW52LCB0cCk7CisJICBxbiAtPSBkbjsKKwl9CisKKyAgICAgIC8qIFNpbmNlIHdlIHByZXRlbmRlZCB3ZSdkIG5lZWQgYW4gZXh0cmEgcXVvdGllbnQgbGltYiBiZWZvcmUsIHdlIG5vdworCSBoYXZlIG1hZGUgc3VyZSB0aGUgY29kZSBhYm92ZSBsZWZ0IGp1c3QgZG4tMT1xbiBxdW90aWVudCBsaW1icyB0bworCSBkZXZlbG9wLiAgRGV2ZWxvcCB0aGF0IHBsdXMgYSBndWFyZCBsaW1iLiAqLworICAgICAgcW4tLTsKKyAgICAgIHFwIC09IHFuOworICAgICAgbnAgLT0gZG47CisgICAgICBxc2F2ZSA9IHFwW3FuXTsKKyAgICAgIG1wbl9kY3BpMV9kaXZhcHByX3FfbiAocXAsIG5wIC0gZG4sIGRwIC0gZG4sIGRuLCBkaW52LCB0cCk7CisgICAgICBNUE5fQ09QWV9JTkNSIChxcCwgcXAgKyAxLCBxbik7CisgICAgICBxcFtxbl0gPSBxc2F2ZTsKKyAgICB9CisgIGVsc2UgICAgLyogKHFuIDwgZG4pICovCisgICAgeworICAgICAgbXBfcHRyIHEycDsKKyNpZiAwCQkJCS8qIG5vdCBwb3NzaWJsZSBzaW5jZSB3ZSBkZW1hbmQgbm4gPiBkbiAqLworICAgICAgaWYgKHFuID09IDApCisJeworCSAgcWggPSBtcG5fY21wIChucCAtIGRuLCBkcCAtIGRuLCBkbikgPj0gMDsKKwkgIGlmIChxaCkKKwkgICAgbXBuX3N1Yl9uIChucCAtIGRuLCBucCAtIGRuLCBkcCAtIGRuLCBkbik7CisJICBUTVBfRlJFRTsKKwkgIHJldHVybiBxaDsKKwl9CisjZW5kaWYKKworICAgICAgcXAgLT0gcW47CQkJLyogcG9pbnQgYXQgbG93IGxpbWIgb2YgbmV4dCBxdW90aWVudCBibG9jayAqLworICAgICAgbnAgLT0gcW47CQkJLyogcG9pbnQgaW4gdGhlIG1pZGRsZSBvZiBwYXJ0aWFsIHJlbWFpbmRlciAqLworCisgICAgICBxMnAgPSBUTVBfU0FMTE9DX0xJTUJTIChxbiArIDEpOworICAgICAgLyogU2hvdWxkIHdlIGF0IGFsbCBjaGVjayBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEIGhlcmUsIG9yIHJlcGx5IG9uCisJIGNhbGxlcnMgbm90IHRvIGJlIHNpbGx5PyAgKi8KKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEKSkKKwl7CisJICBxaCA9IG1wbl9zYnBpMV9kaXZhcHByX3EgKHEycCwgbnAgLSBxbiAtIDIsIDIgKiAocW4gKyAxKSwKKwkJCQkgICAgZHAgLSAocW4gKyAxKSwgcW4gKyAxLCBkaW52LT5pbnYzMik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEl0IGlzIHRlbXB0aW5nIHRvIHVzZSBxcCBmb3IgcmVjdXJzaXZlIHNjcmF0Y2ggYW5kIHB1dCBxdW90aWVudCBpbgorCSAgICAgdHAsIGJ1dCB0aGUgcmVjdXJzaXZlIHNjcmF0Y2ggbmVlZHMgb25lIGxpbWIgdG9vIG1hbnkuICAqLworCSAgdHAgPSBUTVBfU0FMTE9DX0xJTUJTIChxbiArIDEpOworCSAgcWggPSBtcG5fZGNwaTFfZGl2YXBwcl9xX24gKHEycCwgbnAgLSBxbiAtIDIsIGRwIC0gKHFuICsgMSksIHFuICsgMSwgZGludiwgdHApOworCX0KKyAgICAgIE1QTl9DT1BZIChxcCwgcTJwICsgMSwgcW4pOworICAgIH0KKworICBUTVBfRlJFRTsKKyAgcmV0dXJuIHFoOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZGl2X3EuYyBiL21wbi9nZW5lcmljL2Rpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNGVjZgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2Rpdl9xLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIG1wbl9kaXZfcSAtLSBkaXZpc2lvbiBmb3IgYXJiaXRyYXJ5IHNpemUgb3BlcmFuZHMuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxNSwgMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBDb21wdXRlIFEgPSBOL0Qgd2l0aCB0cnVuY2F0aW9uLgorICAgICBOID0ge25wLG5ufQorICAgICBEID0ge2RwLGRufQorICAgICBRID0ge3FwLG5uLWRuKzF9CisgICAgIFQgPSB7c2NyYXRjaCxubisxfSBpcyBzY3JhdGNoIHNwYWNlCisgICBOIGFuZCBEIGFyZSBib3RoIHVudG91Y2hlZCBieSB0aGUgY29tcHV0YXRpb24uCisgICBOIGFuZCBUIG1heSBvdmVybGFwOyBwYXNzIHRoZSBzYW1lIHNwYWNlIGlmIE4gaXMgaXJyZWxldmFudCBhZnRlciB0aGUgY2FsbCwKKyAgIGJ1dCBub3RlIHRoYXQgdHAgbmVlZHMgYW4gZXh0cmEgbGltYi4KKworICAgT3BlcmFuZCByZXF1aXJlbWVudHM6CisgICAgIE4gPj0gRCA+IDAKKyAgICAgZHBbZG4tMV0gIT0gMAorICAgICBObyBvdmVybGFwIGJldHdlZW4gdGhlIE4sIEQsIGFuZCBRIGFyZWFzLgorCisgICBUaGlzIGRpdmlzaW9uIGZ1bmN0aW9uIGRvZXMgbm90IGNsb2JiZXIgaXRzIGlucHV0IG9wZXJhbmRzLCBzaW5jZSBpdCBpcworICAgaW50ZW5kZWQgdG8gc3VwcG9ydCBhdmVyYWdlLU8ocW4pIGRpdmlzaW9uLCBhbmQgZm9yIHRoYXQgdG8gYmUgZWZmZWN0aXZlLCBpdAorICAgY2Fubm90IHB1dCByZXF1aXJlbWVudHMgb24gY2FsbGVycyB0byBjb3B5IGEgTyhubikgb3BlcmFuZC4KKworICAgSWYgYSBjYWxsZXIgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgdmFsdWUgb2Yge25wLG5uKzF9IGFmdGVyIGNhbGxpbmcgdGhpcworICAgZnVuY3Rpb24sIGl0IHNob3VsZCBwYXNzIG5wIGFsc28gZm9yIHRoZSBzY3JhdGNoIGFyZ3VtZW50LiAgVGhpcyBmdW5jdGlvbgorICAgd2lsbCB0aGVuIHNhdmUgc29tZSB0aW1lIGFuZCBzcGFjZSBieSBhdm9pZGluZyBhbGxvY2F0aW9uIGFuZCBjb3B5aW5nLgorICAgKEZJWE1FOiBJcyB0aGlzIGEgZ29vZCBkZXNpZ24/ICBXZSBvbmx5IHJlYWxseSBzYXZlIGFueSBjb3B5aW5nIGZvcgorICAgYWxyZWFkeS1ub3JtYWxpc2VkIGRpdmlzb3JzLCB3aGljaCBzaG91bGQgYmUgcmFyZS4gIEl0IGFsc28gcHJldmVudHMgdXMgZnJvbQorICAgcmVhc29uYWJseSBhc2tpbmcgZm9yIGFsbCBzY3JhdGNoIHNwYWNlIHdlIG5lZWQuKQorCisgICBXZSB3cml0ZSBubi1kbisxIGxpbWJzIGZvciB0aGUgcXVvdGllbnQsIGJ1dCByZXR1cm4gdm9pZC4gIFdoeSBub3QgcmV0dXJuCisgICB0aGUgbW9zdCBzaWduaWZpY2FudCBxdW90aWVudCBsaW1iPyAgTG9vayBhdCB0aGUgNCBtYWluIGNvZGUgYmxvY2tzIGJlbG93CisgICAoY29uc2lzdGluZyBvZiBhbiBvdXRlciBpZi1lbHNlIHdoZXJlIGVhY2ggYXJtIGNvbnRhaW5zIGFuIGlmLWVsc2UpLiBJdCBpcworICAgdHJpY2t5IGZvciB0aGUgZmlyc3QgY29kZSBibG9jaywgc2luY2UgdGhlIG1wbl8qX2Rpdl9xIGNhbGxzIHdpbGwgdHlwaWNhbGx5CisgICBnZW5lcmF0ZSBhbGwgbm4tZG4rMSBhbmQgcmV0dXJuIDAgb3IgMS4gIEkgZG9uJ3Qgc2VlIGhvdyB0byBmaXggdGhhdCB1bmxlc3MKKyAgIHdlIGdlbmVyYXRlIHRoZSBtb3N0IHNpZ25pZmljYW50IHF1b3RpZW50IGxpbWIgaGVyZSwgYmVmb3JlIGNhbGxpbmcKKyAgIG1wbl8qX2Rpdl9xLCBvciBwdXQgdGhlIHF1b3RpZW50IGluIGEgdGVtcG9yYXJ5IGFyZWEuICBTaW5jZSB0aGlzIGlzIGEKKyAgIGNyaXRpY2FsIGRpdmlzaW9uIGNhc2UgKHRoZSBTQiBzdWItY2FzZSBpbiBwYXJ0aWN1bGFyKSBjb3B5aW5nIGlzIG5vdCBhIGdvb2QKKyAgIGlkZWEuCisKKyAgIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gc3BsaXQgdGhlIGlmLWVsc2UgcGFydHMgb2YgdGhlIChxbiArIEZVREdFCisgICA+PSBkbikgYmxvY2tzIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLCBzaW5jZSB3ZSBjb3VsZCBwcm9taXNlIHF1aXRlCisgICBkaWZmZXJlbnQgdGhpbmdzIHRvIGNhbGxlcnMgaW4gdGhlc2UgdHdvIGNhc2VzLiAgVGhlICd0aGVuJyBjYXNlCisgICBiZW5lZml0cyBmcm9tIG5wPXNjcmF0Y2gsIGFuZCBpdCBjb3VsZCBwZXJoYXBzIGV2ZW4gdG9sZXJhdGUgcXA9bnAsCisgICBzYXZpbmcgc29tZSBoZWFkYWNoZSBmb3IgbWFueSBjYWxsZXJzLgorCisgICBGSVhNRTogU2NyYXRjaCBhbGxvY2F0aW9uIGxlYXZlcyBhIGxvdCB0byBiZSBkZXNpcmVkLiAgRS5nLiwgZm9yIHRoZSBNVSBzaXplCisgICBvcGVyYW5kcywgd2UgZG8gbm90IHJldXNlIHRoZSBodWdlIHNjcmF0Y2ggZm9yIGFkanVzdG1lbnRzLiAgVGhpcyBjYW4gYmUgYQorICAgc2VyaW91cyB3YXN0ZSBvZiBtZW1vcnkgZm9yIHRoZSBsYXJnZXN0IG9wZXJhbmRzLgorKi8KKworLyogRlVER0UgZGV0ZXJtaW5lcyB3aGVuIHRvIHRyeSBnZXR0aW5nIGFuIGFwcHJveGltYXRlIHF1b3RpZW50IGZyb20gdGhlIHVwcGVyCisgICBwYXJ0cyBvZiB0aGUgZGl2aWRlbmQgYW5kIGRpdmlzb3IsIHRoZW4gYWRqdXN0LiAgTi5CLiBGVURHRSBtdXN0IGJlID49IDIKKyAgIGZvciB0aGUgY29kZSB0byBiZSBjb3JyZWN0LiAgKi8KKyNkZWZpbmUgRlVER0UgNQkJCS8qIEZJWE1FOiB0dW5lIHRoaXMgKi8KKworI2RlZmluZSBEQ19ESVZfUV9USFJFU0hPTEQgICAgICBEQ19ESVZBUFBSX1FfVEhSRVNIT0xECisjZGVmaW5lIE1VX0RJVl9RX1RIUkVTSE9MRCAgICAgIE1VX0RJVkFQUFJfUV9USFJFU0hPTEQKKyNkZWZpbmUgTVVQSV9ESVZfUV9USFJFU0hPTEQgIE1VUElfRElWQVBQUl9RX1RIUkVTSE9MRAorI2lmbmRlZiBNVVBJX0RJVkFQUFJfUV9USFJFU0hPTEQKKyNkZWZpbmUgTVVQSV9ESVZBUFBSX1FfVEhSRVNIT0xEICBNVVBJX0RJVl9RUl9USFJFU0hPTEQKKyNlbmRpZgorCit2b2lkCittcG5fZGl2X3EgKG1wX3B0ciBxcCwKKwkgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3B0ciBuZXdfZHAsIG5ld19ucCwgdHAsIHJwOworICBtcF9saW1iX3QgY3ksIGRoLCBxaDsKKyAgbXBfc2l6ZV90IG5ld19ubiwgcW47CisgIGdtcF9waTFfdCBkaW52OworICBpbnQgY250OworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisKKyAgQVNTRVJUIChubiA+PSBkbik7CisgIEFTU0VSVCAoZG4gPiAwKTsKKyAgQVNTRVJUIChkcFtkbiAtIDFdICE9IDApOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocXAsIG5uIC0gZG4gKyAxLCBucCwgbm4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHFwLCBubiAtIGRuICsgMSwgZHAsIGRuKSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAobnAsIHNjcmF0Y2gsIG5uKSk7CisKKyAgQVNTRVJUX0FMV0FZUyAoRlVER0UgPj0gMik7CisKKyAgZGggPSBkcFtkbiAtIDFdOworICBpZiAoZG4gPT0gMSkKKyAgICB7CisgICAgICBtcG5fZGl2cmVtXzEgKHFwLCAwTCwgbnAsIG5uLCBkaCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHFuID0gbm4gLSBkbiArIDE7CQkvKiBRdW90aWVudCBzaXplLCBoaWdoIGxpbWIgbWlnaHQgYmUgemVybyAqLworCisgIGlmIChxbiArIEZVREdFID49IGRuKQorICAgIHsKKyAgICAgIC8qIHxfX19fX19fX19fX19fX19fX19fX19fX198CisgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19ffCAgKi8KKyAgICAgIG5ld19ucCA9IHNjcmF0Y2g7CisKKyAgICAgIGlmIChMSUtFTFkgKChkaCAmIEdNUF9OVU1CX0hJR0hCSVQpID09IDApKQorCXsKKwkgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgZGgpOworCisJICBjeSA9IG1wbl9sc2hpZnQgKG5ld19ucCwgbnAsIG5uLCBjbnQpOworCSAgbmV3X25wW25uXSA9IGN5OworCSAgbmV3X25uID0gbm4gKyAoY3kgIT0gMCk7CisKKwkgIG5ld19kcCA9IFRNUF9BTExPQ19MSU1CUyAoZG4pOworCSAgbXBuX2xzaGlmdCAobmV3X2RwLCBkcCwgZG4sIGNudCk7CisKKwkgIGlmIChkbiA9PSAyKQorCSAgICB7CisJICAgICAgcWggPSBtcG5fZGl2cmVtXzIgKHFwLCAwTCwgbmV3X25wLCBuZXdfbm4sIG5ld19kcCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIERDX0RJVl9RX1RIUkVTSE9MRCkgfHwKKwkJICAgQkVMT1dfVEhSRVNIT0xEIChuZXdfbm4gLSBkbiwgRENfRElWX1FfVEhSRVNIT0xEKSkKKwkgICAgeworCSAgICAgIGludmVydF9waTEgKGRpbnYsIG5ld19kcFtkbiAtIDFdLCBuZXdfZHBbZG4gLSAyXSk7CisJICAgICAgcWggPSBtcG5fc2JwaTFfZGl2X3EgKHFwLCBuZXdfbnAsIG5ld19ubiwgbmV3X2RwLCBkbiwgZGludi5pbnYzMik7CisJICAgIH0KKwkgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VUElfRElWX1FfVEhSRVNIT0xEKSB8fCAgIC8qIGZhc3QgY29uZGl0aW9uICovCisJCSAgIEJFTE9XX1RIUkVTSE9MRCAobm4sIDIgKiBNVV9ESVZfUV9USFJFU0hPTEQpIHx8IC8qIGZhc3QgY29uZGl0aW9uICovCisJCSAgIChkb3VibGUpICgyICogKE1VX0RJVl9RX1RIUkVTSE9MRCAtIE1VUElfRElWX1FfVEhSRVNIT0xEKSkgKiBkbiAvKiBzbG93Li4uICovCisJCSAgICsgKGRvdWJsZSkgTVVQSV9ESVZfUV9USFJFU0hPTEQgKiBubiA+IChkb3VibGUpIGRuICogbm4pICAgLyogLi4uY29uZGl0aW9uICovCisJICAgIHsKKwkgICAgICBpbnZlcnRfcGkxIChkaW52LCBuZXdfZHBbZG4gLSAxXSwgbmV3X2RwW2RuIC0gMl0pOworCSAgICAgIHFoID0gbXBuX2RjcGkxX2Rpdl9xIChxcCwgbmV3X25wLCBuZXdfbm4sIG5ld19kcCwgZG4sICZkaW52KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbXBfc2l6ZV90IGl0Y2ggPSBtcG5fbXVfZGl2X3FfaXRjaCAobmV3X25uLCBkbiwgMCk7CisJICAgICAgbXBfcHRyIHNjcmF0Y2ggPSBUTVBfQUxMT0NfTElNQlMgKGl0Y2gpOworCSAgICAgIHFoID0gbXBuX211X2Rpdl9xIChxcCwgbmV3X25wLCBuZXdfbm4sIG5ld19kcCwgZG4sIHNjcmF0Y2gpOworCSAgICB9CisJICBpZiAoY3kgPT0gMCkKKwkgICAgcXBbcW4gLSAxXSA9IHFoOworCSAgZWxzZQorCSAgICBBU1NFUlQgKHFoID09IDApOworCX0KKyAgICAgIGVsc2UgIC8qIGRpdmlzb3IgaXMgYWxyZWFkeSBub3JtYWxpc2VkICovCisJeworCSAgaWYgKG5ld19ucCAhPSBucCkKKwkgICAgTVBOX0NPUFkgKG5ld19ucCwgbnAsIG5uKTsKKworCSAgaWYgKGRuID09IDIpCisJICAgIHsKKwkgICAgICBxaCA9IG1wbl9kaXZyZW1fMiAocXAsIDBMLCBuZXdfbnAsIG5uLCBkcCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIERDX0RJVl9RX1RIUkVTSE9MRCkgfHwKKwkJICAgQkVMT1dfVEhSRVNIT0xEIChubiAtIGRuLCBEQ19ESVZfUV9USFJFU0hPTEQpKQorCSAgICB7CisJICAgICAgaW52ZXJ0X3BpMSAoZGludiwgZGgsIGRwW2RuIC0gMl0pOworCSAgICAgIHFoID0gbXBuX3NicGkxX2Rpdl9xIChxcCwgbmV3X25wLCBubiwgZHAsIGRuLCBkaW52LmludjMyKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgTVVQSV9ESVZfUV9USFJFU0hPTEQpIHx8ICAgLyogZmFzdCBjb25kaXRpb24gKi8KKwkJICAgQkVMT1dfVEhSRVNIT0xEIChubiwgMiAqIE1VX0RJVl9RX1RIUkVTSE9MRCkgfHwgLyogZmFzdCBjb25kaXRpb24gKi8KKwkJICAgKGRvdWJsZSkgKDIgKiAoTVVfRElWX1FfVEhSRVNIT0xEIC0gTVVQSV9ESVZfUV9USFJFU0hPTEQpKSAqIGRuIC8qIHNsb3cuLi4gKi8KKwkJICAgKyAoZG91YmxlKSBNVVBJX0RJVl9RX1RIUkVTSE9MRCAqIG5uID4gKGRvdWJsZSkgZG4gKiBubikgICAvKiAuLi5jb25kaXRpb24gKi8KKwkgICAgeworCSAgICAgIGludmVydF9waTEgKGRpbnYsIGRoLCBkcFtkbiAtIDJdKTsKKwkgICAgICBxaCA9IG1wbl9kY3BpMV9kaXZfcSAocXAsIG5ld19ucCwgbm4sIGRwLCBkbiwgJmRpbnYpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcF9zaXplX3QgaXRjaCA9IG1wbl9tdV9kaXZfcV9pdGNoIChubiwgZG4sIDApOworCSAgICAgIG1wX3B0ciBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChpdGNoKTsKKwkgICAgICBxaCA9IG1wbl9tdV9kaXZfcSAocXAsIG5wLCBubiwgZHAsIGRuLCBzY3JhdGNoKTsKKwkgICAgfQorCSAgcXBbbm4gLSBkbl0gPSBxaDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogfF9fX19fX19fX19fX19fX19fX19fX19fX3wKKyAgICAgICAgICAgICAgICB8X19fX19fX19fX19fX19fX198ICAqLworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHFuICsgMSk7CisKKyAgICAgIG5ld19ucCA9IHNjcmF0Y2g7CisgICAgICBuZXdfbm4gPSAyICogcW4gKyAxOworICAgICAgaWYgKG5ld19ucCA9PSBucCkKKwkvKiBXZSBuZWVkIHtucCxubn0gdG8gcmVtYWluIHVudG91Y2hlZCB1bnRpbCB0aGUgZmluYWwgYWRqdXN0bWVudCwgc28KKwkgICB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNlcGFyYXRlIHNwYWNlIGZvciBuZXdfbnAuICAqLworCW5ld19ucCA9IFRNUF9BTExPQ19MSU1CUyAobmV3X25uICsgMSk7CisKKworICAgICAgaWYgKExJS0VMWSAoKGRoICYgR01QX05VTUJfSElHSEJJVCkgPT0gMCkpCisJeworCSAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBkaCk7CisKKwkgIGN5ID0gbXBuX2xzaGlmdCAobmV3X25wLCBucCArIG5uIC0gbmV3X25uLCBuZXdfbm4sIGNudCk7CisJICBuZXdfbnBbbmV3X25uXSA9IGN5OworCisJICBuZXdfbm4gKz0gKGN5ICE9IDApOworCisJICBuZXdfZHAgPSBUTVBfQUxMT0NfTElNQlMgKHFuICsgMSk7CisJICBtcG5fbHNoaWZ0IChuZXdfZHAsIGRwICsgZG4gLSAocW4gKyAxKSwgcW4gKyAxLCBjbnQpOworCSAgbmV3X2RwWzBdIHw9IGRwW2RuIC0gKHFuICsgMSkgLSAxXSA+PiAoR01QX05VTUJfQklUUyAtIGNudCk7CisKKwkgIGlmIChxbiArIDEgPT0gMikKKwkgICAgeworCSAgICAgIHFoID0gbXBuX2RpdnJlbV8yICh0cCwgMEwsIG5ld19ucCwgbmV3X25uLCBuZXdfZHApOworCSAgICB9CisJICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEIC0gMSkpCisJICAgIHsKKwkgICAgICBpbnZlcnRfcGkxIChkaW52LCBuZXdfZHBbcW5dLCBuZXdfZHBbcW4gLSAxXSk7CisJICAgICAgcWggPSBtcG5fc2JwaTFfZGl2YXBwcl9xICh0cCwgbmV3X25wLCBuZXdfbm4sIG5ld19kcCwgcW4gKyAxLCBkaW52LmludjMyKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChxbiwgTVVfRElWQVBQUl9RX1RIUkVTSE9MRCAtIDEpKQorCSAgICB7CisJICAgICAgaW52ZXJ0X3BpMSAoZGludiwgbmV3X2RwW3FuXSwgbmV3X2RwW3FuIC0gMV0pOworCSAgICAgIHFoID0gbXBuX2RjcGkxX2RpdmFwcHJfcSAodHAsIG5ld19ucCwgbmV3X25uLCBuZXdfZHAsIHFuICsgMSwgJmRpbnYpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcF9zaXplX3QgaXRjaCA9IG1wbl9tdV9kaXZhcHByX3FfaXRjaCAobmV3X25uLCBxbiArIDEsIDApOworCSAgICAgIG1wX3B0ciBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChpdGNoKTsKKwkgICAgICBxaCA9IG1wbl9tdV9kaXZhcHByX3EgKHRwLCBuZXdfbnAsIG5ld19ubiwgbmV3X2RwLCBxbiArIDEsIHNjcmF0Y2gpOworCSAgICB9CisJICBpZiAoY3kgPT0gMCkKKwkgICAgdHBbcW5dID0gcWg7CisJICBlbHNlIGlmIChVTkxJS0VMWSAocWggIT0gMCkpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGhhcHBlbnMgb25seSB3aGVuIHRoZSBxdW90aWVudCBpcyBjbG9zZSB0byBCXm4gYW5kCisJCSBtcG5fKl9kaXZhcHByX3EgcmV0dXJuZWQgQl5uLiAgKi8KKwkgICAgICBtcF9zaXplX3QgaSwgbjsKKwkgICAgICBuID0gbmV3X25uIC0gKHFuICsgMSk7CisJICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJdHBbaV0gPSBHTVBfTlVNQl9NQVg7CisJICAgICAgcWggPSAwOwkJLyogY3VycmVudGx5IGlnbm9yZWQgKi8KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgIC8qIGRpdmlzb3IgaXMgYWxyZWFkeSBub3JtYWxpc2VkICovCisJeworCSAgTVBOX0NPUFkgKG5ld19ucCwgbnAgKyBubiAtIG5ld19ubiwgbmV3X25uKTsgLyogcG9pbnRsZXNzIGlmIE1VIHdpbGwgYmUgdXNlZCAqLworCisJICBuZXdfZHAgPSAobXBfcHRyKSBkcCArIGRuIC0gKHFuICsgMSk7CisKKwkgIGlmIChxbiA9PSAyIC0gMSkKKwkgICAgeworCSAgICAgIHFoID0gbXBuX2RpdnJlbV8yICh0cCwgMEwsIG5ld19ucCwgbmV3X25uLCBuZXdfZHApOworCSAgICB9CisJICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEIC0gMSkpCisJICAgIHsKKwkgICAgICBpbnZlcnRfcGkxIChkaW52LCBkaCwgbmV3X2RwW3FuIC0gMV0pOworCSAgICAgIHFoID0gbXBuX3NicGkxX2RpdmFwcHJfcSAodHAsIG5ld19ucCwgbmV3X25uLCBuZXdfZHAsIHFuICsgMSwgZGludi5pbnYzMik7CisJICAgIH0KKwkgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIE1VX0RJVkFQUFJfUV9USFJFU0hPTEQgLSAxKSkKKwkgICAgeworCSAgICAgIGludmVydF9waTEgKGRpbnYsIGRoLCBuZXdfZHBbcW4gLSAxXSk7CisJICAgICAgcWggPSBtcG5fZGNwaTFfZGl2YXBwcl9xICh0cCwgbmV3X25wLCBuZXdfbm4sIG5ld19kcCwgcW4gKyAxLCAmZGludik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wX3NpemVfdCBpdGNoID0gbXBuX211X2RpdmFwcHJfcV9pdGNoIChuZXdfbm4sIHFuICsgMSwgMCk7CisJICAgICAgbXBfcHRyIHNjcmF0Y2ggPSBUTVBfQUxMT0NfTElNQlMgKGl0Y2gpOworCSAgICAgIHFoID0gbXBuX211X2RpdmFwcHJfcSAodHAsIG5ld19ucCwgbmV3X25uLCBuZXdfZHAsIHFuICsgMSwgc2NyYXRjaCk7CisJICAgIH0KKwkgIHRwW3FuXSA9IHFoOworCX0KKworICAgICAgTVBOX0NPUFkgKHFwLCB0cCArIDEsIHFuKTsKKyAgICAgIGlmICh0cFswXSA8PSA0KQorICAgICAgICB7CisJICBtcF9zaXplX3Qgcm47CisKKyAgICAgICAgICBycCA9IFRNUF9BTExPQ19MSU1CUyAoZG4gKyBxbik7CisgICAgICAgICAgbXBuX211bCAocnAsIGRwLCBkbiwgdHAgKyAxLCBxbik7CisJICBybiA9IGRuICsgcW47CisJICBybiAtPSBycFtybiAtIDFdID09IDA7CisKKyAgICAgICAgICBpZiAocm4gPiBubiB8fCBtcG5fY21wIChucCwgcnAsIG5uKSA8IDApCisgICAgICAgICAgICBNUE5fREVDUl9VIChxcCwgcW4sIDEpOworICAgICAgICB9CisgICAgfQorCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZGl2X3FyXzEuYyBiL21wbi9nZW5lcmljL2Rpdl9xcl8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4MGQzNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2Rpdl9xcl8xLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIG1wbl9kaXZfcXJfMSAtLSBtcG4gYnkgbGltYiBkaXZpc2lvbi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIgYW5kIFRvcmJqw7ZybiBHcmFubHVuZAorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5OC0yMDAwLCAyMDAyLCAyMDAzLCAyMDEzIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBESVZfUVJfMV9OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBESVZfUVJfMV9OT1JNX1RIUkVTSE9MRCAzCisjZW5kaWYKKyNpZm5kZWYgRElWX1FSXzFfVU5OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBESVZfUVJfMV9VTk5PUk1fVEhSRVNIT0xEIDMKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+IDAKKyNlcnJvciBOYWlsIGJpdHMgbm90IHN1cHBvcnRlZAorI2VuZGlmCisKKy8qIERpdmlkZXMge3VwLCBufSBieSBkLiBXcml0ZXMgdGhlIG4tMSBsb3cgcXVvdGllbnQgbGltYnMgYXQge3FwLAorICogbi0xfSwgYW5kIHRoZSBoaWdoIHF1b3RpZW50IGxpbWIgYXQgKnFoLiBSZXR1cm5zIHJlbWFpbmRlci4gKi8KK21wX2xpbWJfdAorbXBuX2Rpdl9xcl8xIChtcF9wdHIgcXAsIG1wX2xpbWJfdCAqcWgsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sCisJICAgICAgbXBfbGltYl90IGQpCit7CisgIHVuc2lnbmVkIGNudDsKKyAgbXBfbGltYl90IHVoOworCisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKGQgPiAwKTsKKworICBpZiAoZCAmIEdNUF9OVU1CX0hJR0hCSVQpCisgICAgeworICAgICAgLyogTm9ybWFsaXplZCBjYXNlICovCisgICAgICBtcF9saW1iX3QgZGludiwgcTsKKworICAgICAgdWggPSB1cFstLW5dOworCisgICAgICBxID0gKHVoID49IGQpOworICAgICAgKnFoID0gcTsKKyAgICAgIHVoIC09ICgtcSkgJiBkOworCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBESVZfUVJfMV9OT1JNX1RIUkVTSE9MRCkpCisJeworCSAgY250ID0gMDsKKwlwbGFpbjoKKwkgIHdoaWxlIChuID4gMCkKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdCB1bCA9IHVwWy0tbl07CisJICAgICAgdWRpdl9xcm5uZCAocXBbbl0sIHVoLCB1aCwgdWwsIGQpOworCSAgICB9CisJICByZXR1cm4gdWggPj4gY250OworCX0KKyAgICAgIGludmVydF9saW1iIChkaW52LCBkKTsKKyAgICAgIHJldHVybiBtcG5fZGl2X3FyXzFuX3BpMSAocXAsIHVwLCBuLCB1aCwgZCwgZGludik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVW5ub3JtYWxpemVkIGNhc2UgKi8KKyAgICAgIG1wX2xpbWJfdCBkaW52LCB1bDsKKworICAgICAgaWYgKCEgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OCisJICAmJiBCRUxPV19USFJFU0hPTEQgKG4sIERJVl9RUl8xX1VOTk9STV9USFJFU0hPTEQpKQorCXsKKwkgIHVoID0gdXBbLS1uXTsKKwkgIHVkaXZfcXJubmQgKCpxaCwgdWgsIENOU1RfTElNQigwKSwgdWgsIGQpOworCSAgY250ID0gMDsKKwkgIGdvdG8gcGxhaW47CisJfQorCisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIGQpOworICAgICAgZCA8PD0gY250OworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2Rpdl9xcl8xdV9waTEKKyAgICAgIC8qIEZJWE1FOiBDYWxsIGxvb3AgZG9pbmcgb24tdGhlLWZseSBub3JtYWxpemF0aW9uICovCisjZW5kaWYKKworICAgICAgLyogU2hpZnQgdXAgZnJvbnQsIHVzZSBxcCBhcmVhIGZvciBzaGlmdGVkIGNvcHkuIEEgYml0IG1lc3N5LAorCSBzaW5jZSB3ZSBoYXZlIG9ubHkgbi0xIGxpbWJzIGF2YWlsYWJsZSwgYW5kIHNoaWZ0IHRoZSBoaWdoCisJIGxpbWIgbWFudWFsbHkuICovCisgICAgICB1aCA9IHVwWy0tbl07CisgICAgICB1bCA9ICh1aCA8PCBjbnQpIHwgbXBuX2xzaGlmdCAocXAsIHVwLCBuLCBjbnQpOworICAgICAgdWggPj49IChHTVBfTElNQl9CSVRTIC0gY250KTsKKworICAgICAgaWYgKFVESVZfTkVFRFNfTk9STUFMSVpBVElPTgorCSAgJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBESVZfUVJfMV9VTk5PUk1fVEhSRVNIT0xEKSkKKwl7CisJICB1ZGl2X3Fybm5kICgqcWgsIHVoLCB1aCwgdWwsIGQpOworCSAgdXAgPSBxcDsKKwkgIGdvdG8gcGxhaW47CisJfQorICAgICAgaW52ZXJ0X2xpbWIgKGRpbnYsIGQpOworCisgICAgICB1ZGl2X3Fybm5kX3ByZWludiAoKnFoLCB1aCwgdWgsIHVsLCBkLCBkaW52KTsKKyAgICAgIHJldHVybiBtcG5fZGl2X3FyXzFuX3BpMSAocXAsIHFwLCBuLCB1aCwgZCwgZGludikgPj4gY250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2Rpdl9xcl8xbl9waTEuYyBiL21wbi9nZW5lcmljL2Rpdl9xcl8xbl9waTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc3MTMxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZGl2X3FyXzFuX3BpMS5jCkBAIC0wLDAgKzEsNTA1IEBACisvKiBtcG5fZGl2X3FyXzFuX3BpMQorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlcgorCisgICBUSElTIEZJTEUgQ09OVEFJTlMgSU5URVJOQUwgRlVOQ1RJT05TIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCisKK0NvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaWYgR01QX05BSUxfQklUUyA+IDAKKyNlcnJvciBOYWlsIGJpdHMgbm90IHN1cHBvcnRlZAorI2VuZGlmCisKKyNpZm5kZWYgRElWX1FSXzFOX01FVEhPRAorI2RlZmluZSBESVZfUVJfMU5fTUVUSE9EIDIKKyNlbmRpZgorCisvKiBGSVhNRTogRHVwbGljYXRlZCBpbiBtb2RfMV8xLmMuIE1vdmUgdG8gZ21wLWltcGwuaCAqLworCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmICEgZGVmaW5lZCAoTk9fQVNNKQorCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2ICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoICAiYWRkCSU2LCAlazJcblx0IgkJCQkJXAorCSAgICAgImFkYwklNCwgJWsxXG5cdCIJCQkJCVwKKwkgICAgICJzYmIJJWswLCAlazAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIxIiAgKChVU0l0eXBlKShhMSkpLCAiZyIgKChVU0l0eXBlKShiMSkpLAkJCVwKKwkgICAgICIlMiIgKChVU0l0eXBlKShhMCkpLCAiZyIgKChVU0l0eXBlKShiMCkpKQorI2VuZGlmCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODZfNjQgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICggICJhZGQJJTYsICVxMlxuXHQiCQkJCQlcCisJICAgICAiYWRjCSU0LCAlcTFcblx0IgkJCQkJXAorCSAgICAgInNiYgklcTAsICVxMCIJCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzMSksICI9JnIiIChzMCkJCQkJXAorCSAgIDogIjEiICAoKFVESXR5cGUpKGExKSksICJybWUiICgoVURJdHlwZSkoYjEpKSwJCVwKKwkgICAgICIlMiIgKChVREl0eXBlKShhMCkpLCAicm1lIiAoKFVESXR5cGUpKGIwKSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fc3BhcmNfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBfX2FzbV9fICggICJhZGRjYwklcjUsICU2LCAlMlxuXHQiCQkJCVwKKwkgICAgICJhZGR4Y2MJJXIzLCAlNCwgJTFcblx0IgkJCQlcCisJICAgICAic3VieAklJWcwLCAlJWcwLCAlMCIJCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCSAgIDogInJKIiAoYWgpLCAickkiIChiaCksICIlckoiIChhbCksICJySSIgKGJsKQkJXAorCSBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fc3BhcmNfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBfX2FzbV9fICggICJhZGRjYwklcjUsICU2LCAlMlxuXHQiCQkJCVwKKwkgICAgICJhZGRjY2MJJXI3LCAlOCwgJSVnMFxuXHQiCQkJCVwKKwkgICAgICJhZGRjY2MJJXIzLCAlNCwgJTFcblx0IgkJCQlcCisJICAgICAiY2xyCSUwXG5cdCIJCQkJCQlcCisJICAgICAibW92Y3MJJSV4Y2MsIC0xLCAlMCIJCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCSAgIDogInJKIiAoYWgpLCAickkiIChiaCksICIlckoiIChhbCksICJySSIgKGJsKSwJCVwKKwkgICAgICJySiIgKChhbCkgPj4gMzIpLCAickkiICgoYmwpID4+IDMyKQkJCVwKKwkgX19DTE9CQkVSX0NDKQorI2lmIF9fVklTX18gPj0gMHgzMDAKKyN1bmRlZiBhZGRfbXNzYWFhYQorI2RlZmluZSBhZGRfbXNzYWFhYShtLCBzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCisgIF9fYXNtX18gKCAgImFkZGNjCSVyNSwgJTYsICUyXG5cdCIJCQkJXAorCSAgICAgImFkZHhjY2MJJXIzLCAlNCwgJTFcblx0IgkJCQlcCisJICAgICAiY2xyCSUwXG5cdCIJCQkJCQlcCisJICAgICAibW92Y3MJJSV4Y2MsIC0xLCAlMCIJCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCSAgIDogInJKIiAoYWgpLCAickkiIChiaCksICIlckoiIChhbCksICJySSIgKGJsKQkJXAorCSBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJwYyAmJiAhZGVmaW5lZCAoX0xPTkdfTE9OR19MSU1CKQorLyogVGhpcyB3b3JrcyBmaW5lIGZvciAzMi1iaXQgYW5kIDY0LWJpdCBsaW1icywgZXhjZXB0IGZvciA2NC1iaXQgbGltYnMgd2l0aCBhCisgICBwcm9jZXNzb3IgcnVubmluZyBpbiAzMi1iaXQgbW9kZSwgc2luY2UgdGhlIGNhcnJ5IGZsYWcgdGhlbiBnZXRzIHRoZSAzMi1iaXQKKyAgIGNhcnJ5LiAgKi8KKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICggICJhZGQlSTZjCSUyLCAlNSwgJTZcblx0IgkJCQkJXAorCSAgICAgImFkZGUJJTEsICUzLCAlNFxuXHQiCQkJCQlcCisJICAgICAic3ViZmUJJTAsICUwLCAlMFxuXHQiCQkJCQlcCisJICAgICAibm9yCSUwLCAlMCwgJTAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICJyIiAgKGExKSwgInIiIChiMSksICIlciIgKGEwKSwgInJJIiAoYjApCQkJXAorCSAgICAgX19DTE9CQkVSX0NDKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3MzOTB4X18pICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoICAiYWxncgklMiwgJTZcblx0IgkJCQkJXAorCSAgICAgImFsY2dyCSUxLCAlNFxuXHQiCQkJCQlcCisJICAgICAibGdoaQklMCwgMFxuXHQiCQkJCQlcCisJICAgICAiYWxjZ3IJJTAsICUwXG5cdCIJCQkJCVwKKwkgICAgICJsY2dyCSUwLCAlMCIJCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIxIiAgKChVREl0eXBlKShhMSkpLCAiciIgKChVREl0eXBlKShiMSkpLAkJCVwKKwkgICAgICIlMiIgKChVREl0eXBlKShhMCkpLCAiciIgKChVREl0eXBlKShiMCkpIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm1fXykgJiYgIWRlZmluZWQgKF9fdGh1bWJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBfX2FzbV9fICggICJhZGRzCSUyLCAlNSwgJTZcblx0IgkJCQkJXAorCSAgICAgImFkY3MJJTEsICUzLCAlNFxuXHQiCQkJCQlcCisJICAgICAibW92Y2MJJTAsICMwXG5cdCIJCQkJCVwKKwkgICAgICJtb3ZjcwklMCwgIy0xIgkJCQkJXAorCSAgIDogIj1yIiAobSksICI9ciIgKHNoKSwgIj0mciIgKHNsKQkJCQlcCisJICAgOiAiciIgKGFoKSwgInJJIiAoYmgpLCAiJXIiIChhbCksICJySSIgKGJsKSBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYWFyY2g2NF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfbXNzYWFhYShtLCBzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCisgIF9fYXNtX18gKCAgImFkZHMJJTIsICV4NSwgJTZcblx0IgkJCQlcCisJICAgICAiYWRjcwklMSwgJXgzLCAleDRcblx0IgkJCQlcCisJICAgICAiY3NpbnYJJTAsIHh6ciwgeHpyLCBjY1xuXHQiCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCSAgIDogInJaIiAoYWgpLCAicloiIChiaCksICIlcloiIChhbCksICJySSIgKGJsKSBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkIChfX0dOVUNfXykgKi8KKworI2lmbmRlZiBhZGRfbXNzYWFhYQorI2RlZmluZSBhZGRfbXNzYWFhYShtLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fczAsIF9fczEsIF9fYzAsIF9fYzE7CQkJCQlcCisgICAgX19zMCA9IChhMCkgKyAoYjApOwkJCQkJCQlcCisgICAgX19zMSA9IChhMSkgKyAoYjEpOwkJCQkJCQlcCisgICAgX19jMCA9IF9fczAgPCAoYTApOwkJCQkJCQlcCisgICAgX19jMSA9IF9fczEgPCAoYTEpOwkJCQkJCQlcCisgICAgKHMwKSA9IF9fczA7CQkJCQkJCVwKKyAgICBfX3MxID0gX19zMSArIF9fYzA7CQkJCQkJCVwKKyAgICAoczEpID0gX19zMTsJCQkJCQkJXAorICAgIChtKSA9IC0gKF9fYzEgKyAoX19zMSA8IF9fYzApKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgRElWX1FSXzFOX01FVEhPRCA9PSAxCisKKy8qIERpdmlkZXMgKHVoIEJebiArIHt1cCwgbn0pIGJ5IGQsIHN0b3JpbmcgdGhlIHF1b3RpZW50IGF0IHtxcCwgbn0uCisgICBSZXF1aXJlcyB0aGF0IHVoIDwgZC4gKi8KK21wX2xpbWJfdAorbXBuX2Rpdl9xcl8xbl9waTEgKG1wX3B0ciBxcCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHVoLAorCQkgICBtcF9saW1iX3QgZCwgbXBfbGltYl90IGRpbnYpCit7CisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKHVoIDwgZCk7CisgIEFTU0VSVCAoZCAmIEdNUF9OVU1CX0hJR0hCSVQpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHFwLCB1cCwgbikpOworCisgIGRvCisgICAgeworICAgICAgbXBfbGltYl90IHEsIHVsOworCisgICAgICB1bCA9IHVwWy0tbl07CisgICAgICB1ZGl2X3Fybm5kX3ByZWludiAocSwgdWgsIHVoLCB1bCwgZCwgZGludik7CisgICAgICBxcFtuXSA9IHE7CisgICAgfQorICB3aGlsZSAobiA+IDApOworCisgIHJldHVybiB1aDsKK30KKworI2VsaWYgRElWX1FSXzFOX01FVEhPRCA9PSAyCisKKy8qIFRoZSBtYWluIGlkZWEgb2YgdGhpcyBhbGdvcml0aG0gaXMgdG8gd3JpdGUgQl4yID0gZCAoQiArIGRpbnYpICsKKyAgIEIyLCB3aGVyZSAxIDw9IEIyIDwgZC4gU2ltaWxhcmx5IHRvIG1wbl9tb2RfMV8xcCwgZWFjaCBpdGVyYXRpb24KKyAgIGNhbiB0aGVuIHJlcGxhY2UKKworICAgICB1MSBCXjIgPSB1MSBCMiAobW9kIGQpCisKKyAgIHdoaWNoIGdpdmVzIGEgdmVyeSBzaG9ydCBjcml0aWNhbCBwYXRoIGZvciBjb21wdXRpbmcgdGhlIHJlbWFpbmRlcgorICAgKHdpdGggc29tZSB0cmlja3MgdG8gaGFuZGxlIHRoZSBjYXJyeSB3aGVuIHRoZSBuZXh0IHR3byBsb3dlciBsaW1icworICAgYXJlIGFkZGVkIGluKS4gVG8gYWxzbyBnZXQgdGhlIHF1b3RpZW50LCBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nCisgICBtdWx0aXBsZSBvZiBkIGluIHRoZSBleHByZXNzaW9uLAorCisgICAgIHUxIEJeMiA9IHUxIEIyICsgKHUxIGRpbnYgKyB1MSBCKSBkCisKKyAgIFdlIGdldCB0aGUgcXVvdGllbnQgYnkgYWNjdW11bGF0aW5nIHRoZSAodTEgZGludiArIHUxIEIpIHRlcm1zLiBUaGUKKyAgIHR3byBtdWx0aXBsaWVzLCB1MSAqIEIyIGFuZCB1MSAqIGRpbnYsIGFyZSBpbmRlcGVuZGVudCwgYW5kIGNhbiBiZQorICAgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCisgKi8KK21wX2xpbWJfdAorbXBuX2Rpdl9xcl8xbl9waTEgKG1wX3B0ciBxcCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHUxLAorCQkgICBtcF9saW1iX3QgZCwgbXBfbGltYl90IGRpbnYpCit7CisgIG1wX2xpbWJfdCBCMjsKKyAgbXBfbGltYl90IHUwLCB1MjsKKyAgbXBfbGltYl90IHEwLCBxMTsKKyAgbXBfbGltYl90IHAwLCBwMTsKKyAgbXBfbGltYl90IHQ7CisgIG1wX3NpemVfdCBqOworCisgIEFTU0VSVCAoZCAmIEdNUF9MSU1CX0hJR0hCSVQpOworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUICh1MSA8IGQpOworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgdWRpdl9xcm5uZF9wcmVpbnYgKHFwWzBdLCB1MSwgdTEsIHVwWzBdLCBkLCBkaW52KTsKKyAgICAgIHJldHVybiB1MTsKKyAgICB9CisKKyAgLyogRklYTUU6IENvdWxkIGJlIHByZWNvbXB1dGVkICovCisgIEIyID0gLWQqZGludjsKKworICB1bXVsX3BwbW0gKHExLCBxMCwgZGludiwgdTEpOworICB1bXVsX3BwbW0gKHAxLCBwMCwgQjIsIHUxKTsKKyAgcTEgKz0gdTE7CisgIEFTU0VSVCAocTEgPj0gdTEpOworICB1MCA9IHVwW24tMV07CS8qIEVhcmx5IHJlYWQsIHRvIGFsbG93IHFwID09IHVwLiAqLworICBxcFtuLTFdID0gcTE7CisKKyAgYWRkX21zc2FhYWEgKHUyLCB1MSwgdTAsIHUwLCB1cFtuLTJdLCBwMSwgcDApOworCisgIC8qIEZJWE1FOiBLZWVwIHExIGluIGEgdmFyaWFibGUgYmV0d2VlbiBpdGVyYXRpb25zLCB0byByZWR1Y2UgbnVtYmVyCisgICAgIG9mIG1lbW9yeSBhY2Nlc3Nlcy4gKi8KKyAgZm9yIChqID0gbi0yOyBqLS0gPiAwOyApCisgICAgeworICAgICAgbXBfbGltYl90IHEyLCBjeTsKKworICAgICAgLyogQWRkaXRpb25zIGZvciB0aGUgcSB1cGRhdGU6CisgICAgICAgKgkrLS0tLS0tLSsKKyAgICAgICAqICAgICAgICB8dTEgKiB2IHwKKyAgICAgICAqICAgICAgICArLS0tKy0tLSsKKyAgICAgICAqICAgICAgICB8IHUxfAorICAgICAgICogICAgKy0tLSstLS0rCisgICAgICAgKiAgICB8IDEgfCB2IHwgIChjb25kaXRpb25hbCBvbiB1MikKKyAgICAgICAqICAgICstLS0rLS0tKworICAgICAgICogICAgICAgIHwgMSB8ICAoY29uZGl0aW9uYWwgb24gdTAgKyB1MiBCMiBjYXJyeSkKKyAgICAgICAqICAgICAgICArLS0tKworICAgICAgICogKyAgICAgIHwgcTB8CisgICAgICAgKiAgIC0rLS0tKy0tLSstLS0rCisgICAgICAgKiAgICB8IHEyfCBxMXwgcTB8CisgICAgICAgKiAgICArLS0tKy0tLSstLS0rCisgICAgICAqLworICAgICAgdW11bF9wcG1tIChwMSwgdCwgdTEsIGRpbnYpOworICAgICAgQUREQ19MSU1CIChjeSwgdTAsIHUwLCB1MiAmIEIyKTsKKyAgICAgIHUwIC09ICgtY3kpICYgZDsKKyAgICAgIGFkZF9zc2FhYWEgKHEyLCBxMSwgLXUyLCB1MiAmIGRpbnYsIENOU1RfTElNQigwKSwgdTEpOworICAgICAgYWRkX3NzYWFhYSAocTIsIHExLCBxMiwgcTEsIENOU1RfTElNQigwKSwgcTApOworICAgICAgcTAgPSB0OworCisgICAgICAvKiBOb3RlIHRoYXQgcDEgKyBjeSBjYW5ub3Qgb3ZlcmZsb3cgKi8KKyAgICAgIGFkZF9zc2FhYWEgKHEyLCBxMSwgcTIsIHExLCBDTlNUX0xJTUIoMCksIHAxICsgY3kpOworCisgICAgICB1bXVsX3BwbW0gKHAxLCBwMCwgdTEsIEIyKTsKKworICAgICAgcXBbaisxXSA9IHExOworICAgICAgTVBOX0lOQ1JfVSAocXAraisyLCBuLWotMiwgcTIpOworCisgICAgICBhZGRfbXNzYWFhYSAodTIsIHUxLCB1MCwgdTAsIHVwW2pdLCBwMSwgcDApOworICAgIH0KKworICBxMSA9ICh1MiA+IDApOworICB1MSAtPSAoLXExKSAmIGQ7CisKKyAgdCA9ICh1MSA+PSBkKTsKKyAgcTEgKz0gdDsKKyAgdTEgLT0gKC10KSAmIGQ7CisKKyAgdWRpdl9xcm5uZF9wcmVpbnYgKHQsIHUwLCB1MSwgdTAsIGQsIGRpbnYpOworICBhZGRfc3NhYWFhIChxMSwgcTAsIHExLCBxMCwgQ05TVF9MSU1CKDApLCB0KTsKKworICBNUE5fSU5DUl9VIChxcCsxLCBuLTEsIHExKTsKKworICBxcFswXSA9IHEwOworICByZXR1cm4gdTA7Cit9CisKKyNlbGlmIERJVl9RUl8xTl9NRVRIT0QgPT0gMworCisvKiBUaGlzIHZhcmlhbnQgaGFuZGxlcyBjYXJyeSBmcm9tIHRoZSB1IHVwZGF0ZSBlYXJsaWVyLiBUaGlzIGdpdmVzIGEKKyAgIGxvbmdlciBjcml0aWNhbCBwYXRoLCBidXQgcmVkdWNlcyB0aGUgd29yayBuZWVkZWQgZm9yIHRoZQorICAgcXVvdGllbnRzLiAqLworbXBfbGltYl90CittcG5fZGl2X3FyXzFuX3BpMSAobXBfcHRyIHFwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdTEsCisJCSAgIG1wX2xpbWJfdCBkLCBtcF9saW1iX3QgZGludikKK3sKKyAgbXBfbGltYl90IEIyOworICBtcF9saW1iX3QgY3ksIHUwOworICBtcF9saW1iX3QgcTAsIHExOworICBtcF9saW1iX3QgcDAsIHAxOworICBtcF9saW1iX3QgdDsKKyAgbXBfc2l6ZV90IGo7CisKKyAgQVNTRVJUIChkICYgR01QX0xJTUJfSElHSEJJVCk7CisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKHUxIDwgZCk7CisKKyAgaWYgKG4gPT0gMSkKKyAgICB7CisgICAgICB1ZGl2X3Fybm5kX3ByZWludiAocXBbMF0sIHUxLCB1MSwgdXBbMF0sIGQsIGRpbnYpOworICAgICAgcmV0dXJuIHUxOworICAgIH0KKworICAvKiBGSVhNRTogQ291bGQgYmUgcHJlY29tcHV0ZWQgKi8KKyAgQjIgPSAtZCpkaW52OworCisgIHVtdWxfcHBtbSAocTEsIHEwLCBkaW52LCB1MSk7CisgIHVtdWxfcHBtbSAocDEsIHAwLCBCMiwgdTEpOworICBxMSArPSB1MTsKKyAgQVNTRVJUIChxMSA+PSB1MSk7CisgIHUwID0gdXBbbi0xXTsJLyogRWFybHkgcmVhZCwgdG8gYWxsb3cgcXAgPT0gdXAuICovCisKKyAgYWRkX21zc2FhYWEgKGN5LCB1MSwgdTAsIHUwLCB1cFtuLTJdLCBwMSwgcDApOworICB1MSAtPSBjeSAmIGQ7CisgIHExIC09IGN5OworICBxcFtuLTFdID0gcTE7CisKKyAgLyogRklYTUU6IEtlZXAgcTEgaW4gYSB2YXJpYWJsZSBiZXR3ZWVuIGl0ZXJhdGlvbnMsIHRvIHJlZHVjZSBudW1iZXIKKyAgICAgb2YgbWVtb3J5IGFjY2Vzc2VzLiAqLworICBmb3IgKGogPSBuLTI7IGotLSA+IDA7ICkKKyAgICB7CisgICAgICBtcF9saW1iX3QgcTIsIGN5OworICAgICAgbXBfbGltYl90IHQxLCB0MDsKKworICAgICAgLyogQWRkaXRpb25zIGZvciB0aGUgcSB1cGRhdGU6CisgICAgICAgKgkrLS0tLS0tLSsKKyAgICAgICAqICAgICAgICB8dTEgKiB2IHwKKyAgICAgICAqICAgICAgICArLS0tKy0tLSsKKyAgICAgICAqICAgICAgICB8IHUxfAorICAgICAgICogICAgICAgICstLS0rCisgICAgICAgKiAgICAgICAgfCAxIHwgIChjb25kaXRpb25hbCBvbiB7dTEsIHUwfSBjYXJyeSkKKyAgICAgICAqICAgICAgICArLS0tKworICAgICAgICogKyAgICAgIHwgcTB8CisgICAgICAgKiAgIC0rLS0tKy0tLSstLS0rCisgICAgICAgKiAgICB8IHEyfCBxMXwgcTB8CisgICAgICAgKiAgICArLS0tKy0tLSstLS0rCisgICAgICAgKgorICAgICAgICogQWRkaXRpb25zIGZvciB0aGUgdSB1cGRhdGU6CisgICAgICAgKiAgICAgICAgKy0tLS0tLS0rCisgICAgICAgKiAgICAgICAgfHUxICogQjJ8CisgICAgICAgKiAgICAgICAgKy0tLSstLS0rCisgICAgICAgKiAgICAgICsgfHUwIHx1LTF8CisgICAgICAgKiAgICAgICAgKy0tLSstLS0rCisgICAgICAgKiAgICAgIC0gfCBkIHwgICAgIChjb25kaXRpb25hbCBvbiBjYXJyeSkKKyAgICAgICAqICAgICAtLS0rLS0tKy0tLSsKKyAgICAgICAqICAgICAgICB8dTEgfCB1MHwKKyAgICAgICAqICAgICAgICArLS0tKy0tLSsKKyAgICAgICAqCisgICAgICAqLworICAgICAgdW11bF9wcG1tIChwMSwgcDAsIHUxLCBCMik7CisgICAgICBBRERDX0xJTUIgKHEyLCBxMSwgdTEsIHEwKTsKKyAgICAgIHVtdWxfcHBtbSAodDEsIHQwLCB1MSwgZGludik7CisgICAgICBhZGRfbXNzYWFhYSAoY3ksIHUxLCB1MCwgdTAsIHVwW2pdLCBwMSwgcDApOworICAgICAgdTEgLT0gY3kgJiBkOworCisgICAgICAvKiB0MSA8PSBCLTIsIHNvIGN5IGNhbiBiZSBhZGRlZCBpbiB3aXRob3V0IG92ZXJmbG93LiAqLworICAgICAgYWRkX3NzYWFhYSAocTIsIHExLCBxMiwgcTEsIENOU1RfTElNQigwKSwgdDEgLSBjeSk7CisgICAgICBxMCA9IHQwOworCisgICAgICAvKiBGaW5hbCBxIHVwZGF0ZSAqLworICAgICAgcXBbaisxXSA9IHExOworICAgICAgTVBOX0lOQ1JfVSAocXAraisyLCBuLWotMiwgcTIpOworICAgIH0KKworICBxMSA9ICh1MSA+PSBkKTsKKyAgdTEgLT0gKC1xMSkgJiBkOworCisgIHVkaXZfcXJubmRfcHJlaW52ICh0LCB1MCwgdTEsIHUwLCBkLCBkaW52KTsKKyAgYWRkX3NzYWFhYSAocTEsIHEwLCBxMSwgcTAsIENOU1RfTElNQigwKSwgdCk7CisKKyAgTVBOX0lOQ1JfVSAocXArMSwgbi0xLCBxMSk7CisKKyAgcXBbMF0gPSBxMDsKKyAgcmV0dXJuIHUwOworfQorCisjZWxpZiBESVZfUVJfMU5fTUVUSE9EID09IDQKKworbXBfbGltYl90CittcG5fZGl2X3FyXzFuX3BpMSAobXBfcHRyIHFwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdTEsCisJCSAgIG1wX2xpbWJfdCBkLCBtcF9saW1iX3QgZGludikKK3sKKyAgbXBfbGltYl90IEIyOworICBtcF9saW1iX3QgdTIsIHUwOworICBtcF9saW1iX3QgcTAsIHExOworICBtcF9saW1iX3QgcDAsIHAxOworICBtcF9saW1iX3QgQjJkMCwgQjJkMTsKKyAgbXBfbGltYl90IHQ7CisgIG1wX3NpemVfdCBqOworCisgIEFTU0VSVCAoZCAmIEdNUF9MSU1CX0hJR0hCSVQpOworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUICh1MSA8IGQpOworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgdWRpdl9xcm5uZF9wcmVpbnYgKHFwWzBdLCB1MSwgdTEsIHVwWzBdLCBkLCBkaW52KTsKKyAgICAgIHJldHVybiB1MTsKKyAgICB9CisKKyAgLyogRklYTUU6IENvdWxkIGJlIHByZWNvbXB1dGVkICovCisgIEIyID0gLWQqZGludjsKKyAgLyogQjIgKiAoQi1kKSAqLworICB1bXVsX3BwbW0gKEIyZDEsIEIyZDAsIEIyLCAtZCk7CisKKyAgdW11bF9wcG1tIChxMSwgcTAsIGRpbnYsIHUxKTsKKyAgdW11bF9wcG1tIChwMSwgcDAsIEIyLCB1MSk7CisgIHExICs9IHUxOworICBBU1NFUlQgKHExID49IHUxKTsKKworICBhZGRfbXNzYWFhYSAodTIsIHUxLCB1MCwgdXBbbi0xXSwgdXBbbi0yXSwgcDEsIHAwKTsKKworICAvKiBBZnRlciByZWFkIG9mIHVwW24tMV0sIHRvIGFsbG93IHFwID09IHVwLiAqLworICBxcFtuLTFdID0gcTEgLSB1MjsKKworICAvKiBGSVhNRTogS2VlcCBxMSBpbiBhIHZhcmlhYmxlIGJldHdlZW4gaXRlcmF0aW9ucywgdG8gcmVkdWNlIG51bWJlcgorICAgICBvZiBtZW1vcnkgYWNjZXNzZXMuICovCisgIGZvciAoaiA9IG4tMjsgai0tID4gMDsgKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxMiwgY3k7CisgICAgICBtcF9saW1iX3QgdDEsIHQwOworCisgICAgICAvKiBBZGRpdGlvbnMgZm9yIHRoZSBxIHVwZGF0ZS4gKkFmdGVyKiB1MSAtPSB1MiAmIGQgYWRqdXN0bWVudC4KKyAgICAgICAqCSstLS0tLS0tKworICAgICAgICogICAgICAgIHx1MSAqIHYgfAorICAgICAgICogICAgICAgICstLS0rLS0tKworICAgICAgICogICAgICAgIHwgdTF8CisgICAgICAgKiAgICAgICAgKy0tLSsKKyAgICAgICAqICAgICAgICB8IDEgfCAgKGNvbmRpdGlvbmFsIG9uIHt1MSwgdTB9IGNhcnJ5KQorICAgICAgICogICAgICAgICstLS0rCisgICAgICAgKiArICAgICAgfCBxMHwKKyAgICAgICAqICAgLSstLS0rLS0tKy0tLSsKKyAgICAgICAqICAgIHwgcTJ8IHExfCBxMHwKKyAgICAgICAqICAgICstLS0rLS0tKy0tLSsKKyAgICAgICAqCisgICAgICAgKiBBZGRpdGlvbnMgZm9yIHRoZSB1IHVwZGF0ZS4gKkJlZm9yZSogdTEgLT0gdTIgJiBkIGFkanN0bWVudC4KKyAgICAgICAqICAgICAgICArLS0tLS0tLSsKKyAgICAgICAqICAgICAgICB8dTEgKiBCMnwKKyAgICAgICAqICAgICAgICArLS0tKy0tLSsKKyAgICAgICAqICAgICAgICB8dTAgfHUtMXwKKyAgICAgICAqICAgICAgICArLS0tKy0tLSsKKyAgICAgICArICsgICAgICB8QjIoQi1kKXwgKGNvbmRpdGlvbmFsIG9uIHUyKQorICAgICAgICogICAtKy0tLSstLS0rLS0tKworICAgICAgICogICAgfHUyIHx1MSB8IHUwfAorICAgICAgICogICAgKy0tLSstLS0rLS0tKworICAgICAgICoKKyAgICAgICovCisgICAgICAgLyogTXVsdGlwbHkgd2l0aCB1bmFkanVzdGVkIHUxLCB0byBzaG9ydGVuIGNyaXRpY2FsIHBhdGguICovCisgICAgICB1bXVsX3BwbW0gKHAxLCBwMCwgdTEsIEIyKTsKKyAgICAgIHUxIC09IChkICYgdTIpOworICAgICAgQUREQ19MSU1CIChxMiwgcTEsIHUxLCBxMCk7CisgICAgICB1bXVsX3BwbW0gKHQxLCB0MCwgdTEsIGRpbnYpOworCisgICAgICBhZGRfbXNzYWFhYSAoY3ksIHUxLCB1MCwgdTAsIHVwW2pdLCB1MiAmIEIyZDEsIHUyICYgQjJkMCk7CisgICAgICBhZGRfbXNzYWFhYSAodTIsIHUxLCB1MCwgdTEsIHUwLCBwMSwgcDApOworICAgICAgdTIgKz0gY3k7CisgICAgICBBU1NFUlQoLXUyIDw9IDEpOworCisgICAgICAvKiB0MSA8PSBCLTIsIHNvIHUyIGNhbiBiZSBhZGRlZCBpbiB3aXRob3V0IG92ZXJmbG93LiAqLworICAgICAgYWRkX3NzYWFhYSAocTIsIHExLCBxMiwgcTEsIENOU1RfTElNQigwKSwgdDEgLSB1Mik7CisgICAgICBxMCA9IHQwOworCisgICAgICAvKiBGaW5hbCBxIHVwZGF0ZSAqLworICAgICAgcXBbaisxXSA9IHExOworICAgICAgTVBOX0lOQ1JfVSAocXAraisyLCBuLWotMiwgcTIpOworICAgIH0KKyAgdTEgLT0gdTIgJiBkOworCisgIHExID0gKHUxID49IGQpOworICB1MSAtPSAoLXExKSAmIGQ7CisKKyAgdWRpdl9xcm5uZF9wcmVpbnYgKHQsIHUwLCB1MSwgdTAsIGQsIGRpbnYpOworICBhZGRfc3NhYWFhIChxMSwgcTAsIHExLCBxMCwgQ05TVF9MSU1CKDApLCB0KTsKKworICBNUE5fSU5DUl9VIChxcCsxLCBuLTEsIHExKTsKKworICBxcFswXSA9IHEwOworICByZXR1cm4gdTA7Cit9CisjZWxzZQorI2Vycm9yIFVua25vd24gRElWX1FSXzFOX01FVEhPRAorI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZfcXJfMW5fcGkyLmMgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMW5fcGkyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhZTY4ZgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2Rpdl9xcl8xbl9waTIuYwpAQCAtMCwwICsxLDIwMyBAQAorLyogbXBuX2Rpdl9xcl8xbl9waTIuCisKKyAgIFRISVMgRklMRSBDT05UQUlOUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUworICAgT05MWSBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTMsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIElTU1VFUzoKKworICAgKiBDYW4gd2UgcmVhbGx5IHVzZSB0aGUgaGlnaCBwaTIgaW52ZXJzZSBsaW1iIGZvciB1ZGl2X3Fybm5kX3ByZWludj8KKworICAgKiBBcmUgdGhlcmUgYW55IHByb2JsZW1zIHdpdGggZ2VuZXJhdGluZyBuIHF1b3RpZW50IGxpbWJzIGluIHRoZSBxIGFyZWE/ICBJdAorICAgICBzdXJlbHkgc2ltcGxpZmllcyB0aGluZ3MuCisKKyAgICogTm90IHlldCBhZGVxdWF0ZWx5IHRlc3RlZC4KKyovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIERlZmluZSBzb21lIGxvbmdsb25nLmgtc3R5bGUgbWFjcm9zLCBidXQgZm9yIHdpZGVyIG9wZXJhdGlvbnMuCisgICAqIGFkZF9zc3NhYWFhIGlzIGxpa2UgbG9uZ2xvbmcuaCdzIGFkZF9zc2FhYWEgYnV0IHByb3BhZ2F0aW5nIGNhcnJ5LW91dCBpbnRvCisgICAgIGFuIGFkZGl0aW9uYWwgc3VtIG9wZXJhbmQuCisqLworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAgJiYgISBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkKKworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3g4NiAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICgiYWRkXHQlNywgJWsyXG5cdGFkY1x0JTUsICVrMVxuXHRhZGNcdCQwLCAlazAiCQlcCisJICAgOiAiPXIiIChzMiksICI9JnIiIChzMSksICI9JnIiIChzMCkJCQkJXAorCSAgIDogIjAiICAoKFVTSXR5cGUpKHMyKSksCQkJCQlcCisJICAgICAiMSIgICgoVVNJdHlwZSkoYTEpKSwgImciICgoVVNJdHlwZSkoYjEpKSwJCQlcCisJICAgICAiJTIiICgoVVNJdHlwZSkoYTApKSwgImciICgoVVNJdHlwZSkoYjApKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hbWQ2NF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICgiYWRkXHQlNywgJXEyXG5cdGFkY1x0JTUsICVxMVxuXHRhZGNcdCQwLCAlcTAiCQlcCisJICAgOiAiPXIiIChzMiksICI9JnIiIChzMSksICI9JnIiIChzMCkJCQkJXAorCSAgIDogIjAiICAoKFVESXR5cGUpKHMyKSksCQkJCQlcCisJICAgICAiMSIgICgoVURJdHlwZSkoYTEpKSwgInJtZSIgKChVREl0eXBlKShiMSkpLAkJXAorCSAgICAgIiUyIiAoKFVESXR5cGUpKGEwKSksICJybWUiICgoVURJdHlwZSkoYjApKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hYXJjaDY0X18pICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIGFkZF9zc3NhYWFhKHMyLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIF9fYXNtX18gKCJhZGRzXHQlMiwgJXg2LCAlN1xuXHRhZGNzXHQlMSwgJXg0LCAleDVcblx0YWRjXHQlMCwgJXgzLCB4enIiXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICJyWiIgKHMyKSwgIiVyWiIgIChhMSksICJyWiIgKGIxKSwgIiVyWiIgKGEwKSwgInJJIiAoYjApCVwKKwkgICAgIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJwYyAmJiAhZGVmaW5lZCAoX0xPTkdfTE9OR19MSU1CKQorLyogVGhpcyB3b3JrcyBmaW5lIGZvciAzMi1iaXQgYW5kIDY0LWJpdCBsaW1icywgZXhjZXB0IGZvciA2NC1iaXQgbGltYnMgd2l0aCBhCisgICBwcm9jZXNzb3IgcnVubmluZyBpbiAzMi1iaXQgbW9kZSwgc2luY2UgdGhlIGNhcnJ5IGZsYWcgdGhlbiBnZXRzIHRoZSAzMi1iaXQKKyAgIGNhcnJ5LiAgKi8KKyNkZWZpbmUgYWRkX3Nzc2FhYWEoczIsIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoImFkZCVJN2NcdCUyLCU2LCU3XG5cdGFkZGVcdCUxLCU0LCU1XG5cdGFkZHplXHQlMCwlMyIJXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICJyIiAgKHMyKSwgInIiICAoYTEpLCAiciIgKGIxKSwgIiVyIiAoYTApLCAickkiIChiMCkJXAorCSAgICAgX19DTE9CQkVSX0NDKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjaWZuZGVmIGFkZF9zc3NhYWFhCisjZGVmaW5lIGFkZF9zc3NhYWFhKHMyLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fczAsIF9fczEsIF9fYzAsIF9fYzE7CQkJCQlcCisgICAgX19zMCA9IChhMCkgKyAoYjApOwkJCQkJCQlcCisgICAgX19zMSA9IChhMSkgKyAoYjEpOwkJCQkJCQlcCisgICAgX19jMCA9IF9fczAgPCAoYTApOwkJCQkJCQlcCisgICAgX19jMSA9IF9fczEgPCAoYTEpOwkJCQkJCQlcCisgICAgKHMwKSA9IF9fczA7CQkJCQkJCVwKKyAgICBfX3MxID0gX19zMSArIF9fYzA7CQkJCQkJCVwKKyAgICAoczEpID0gX19zMTsJCQkJCQkJXAorICAgIChzMikgKz0gX19jMSArIChfX3MxIDwgX19jMCk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RydWN0IHByZWNvbXBfZGl2XzFfcGkyCit7CisgIG1wX2xpbWJfdCBkaXBbMl07CisgIG1wX2xpbWJfdCBkOworICBpbnQgbm9ybV9jbnQ7Cit9OworCittcF9saW1iX3QKK21wbl9kaXZfcXJfMW5fcGkyIChtcF9wdHIgcXAsCisJCSAgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLAorCQkgICBzdHJ1Y3QgcHJlY29tcF9kaXZfMV9waTIgKnBkKQoreworICBtcF9saW1iX3QgbW9zdF9zaWduaWZpY2FudF9xX2xpbWI7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgciwgdTIsIHUxLCB1MDsKKyAgbXBfbGltYl90IGQwLCBkaTEsIGRpMDsKKyAgbXBfbGltYl90IHEzYSwgcTJhLCBxMmIsIHExYiwgcTJjLCBxMWMsIHExZCwgcTBkOworICBtcF9saW1iX3QgY25kOworCisgIEFTU0VSVCAodW4gPj0gMik7CisgIEFTU0VSVCAoKHBkLT5kICYgR01QX05VTUJfSElHSEJJVCkgIT0gMCk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChxcCwgdW4tMiwgdXAsIHVuKSB8fCBxcCsyID49IHVwKTsKKyAgQVNTRVJUX01QTiAodXAsIHVuKTsKKworI2RlZmluZSBxMyBxM2EKKyNkZWZpbmUgcTIgcTJiCisjZGVmaW5lIHExIHExYgorCisgIHVwICs9IHVuIC0gMzsKKyAgciA9IHVwWzJdOworICBkMCA9IHBkLT5kOworCisgIG1vc3Rfc2lnbmlmaWNhbnRfcV9saW1iID0gKHIgPj0gZDApOworICByIC09IGQwICYgLW1vc3Rfc2lnbmlmaWNhbnRfcV9saW1iOworCisgIHFwICs9IHVuIC0gMzsKKyAgcXBbMl0gPSBtb3N0X3NpZ25pZmljYW50X3FfbGltYjsKKworICBkaTEgPSBwZC0+ZGlwWzFdOworICBkaTAgPSBwZC0+ZGlwWzBdOworCisgIGZvciAoaSA9IHVuIC0gMzsgaSA+PSAwOyBpIC09IDIpCisgICAgeworICAgICAgdTIgPSByOworICAgICAgdTEgPSB1cFsxXTsKKyAgICAgIHUwID0gdXBbMF07CisKKyAgICAgIC8qIERpdmlkZW5kIGluIHtyLHUxLHUwfSAqLworCisgICAgICB1bXVsX3BwbW0gKHExZCxxMGQsIHUxLCBkaTApOworICAgICAgdW11bF9wcG1tIChxMmIscTFiLCB1MSwgZGkxKTsKKyAgICAgIHEyYisrOwkJCQkvKiBjYW5ub3Qgc3BpbGwgKi8KKyAgICAgIGFkZF9zc3NhYWFhIChyLHEyYixxMWIsIHEyYixxMWIsIHUxLHUwKTsKKworICAgICAgdW11bF9wcG1tIChxMmMscTFjLCB1MiwgIGRpMCk7CisgICAgICBhZGRfc3NzYWFhYSAocixxMmIscTFiLCBxMmIscTFiLCBxMmMscTFjKTsKKyAgICAgIHVtdWxfcHBtbSAocTNhLHEyYSwgdTIsIGRpMSk7CisKKyAgICAgIGFkZF9zc3NhYWFhIChyLHEyYixxMWIsIHEyYixxMWIsIHEyYSxxMWQpOworCisgICAgICBxMyArPSByOworCisgICAgICByID0gdTAgLSBxMiAqIGQwOworCisgICAgICBjbmQgPSAociA+PSBxMSk7CisgICAgICByICs9IGQwICYgLWNuZDsKKyAgICAgIHN1Yl9kZG1tc3MgKHEzLHEyLCAgcTMscTIsICAwLGNuZCk7CisKKyAgICAgIGlmIChVTkxJS0VMWSAociA+PSBkMCkpCisJeworCSAgciAtPSBkMDsKKwkgIGFkZF9zc2FhYWEgKHEzLHEyLCAgcTMscTIsICAwLDEpOworCX0KKworICAgICAgcXBbMF0gPSBxMjsKKyAgICAgIHFwWzFdID0gcTM7CisKKyAgICAgIHVwIC09IDI7CisgICAgICBxcCAtPSAyOworICAgIH0KKworICBpZiAoKHVuICYgMSkgPT0gMCkKKyAgICB7CisgICAgICB1MiA9IHI7CisgICAgICB1MSA9IHVwWzFdOworCisgICAgICB1ZGl2X3Fybm5kX3ByZWludiAocTMsIHIsIHUyLCB1MSwgZDAsIGRpMSk7CisgICAgICBxcFsxXSA9IHEzOworICAgIH0KKworICByZXR1cm4gcjsKKworI3VuZGVmIHEzCisjdW5kZWYgcTIKKyN1bmRlZiBxMQorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZGl2X3FyXzF1X3BpMi5jIGIvbXBuL2dlbmVyaWMvZGl2X3FyXzF1X3BpMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzhlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMXVfcGkyLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIG1wbl9kaXZfcXJfMXVfcGkyLgorCisgICBUSElTIEZJTEUgQ09OVEFJTlMgQU4gSU5URVJOQUwgRlVOQ1RJT04gV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMKKyAgIE9OTFkgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDEzLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBJU1NVRVM6CisKKyAgICogQ2FuIHdlIHJlYWxseSB1c2UgdGhlIGhpZ2ggcGkyIGludmVyc2UgbGltYiBmb3IgdWRpdl9xcm5uZF9wcmVpbnY/CisKKyAgICogQXJlIHRoZXJlIGFueSBwcm9ibGVtcyB3aXRoIGdlbmVyYXRpbmcgbiBxdW90aWVudCBsaW1icyBpbiB0aGUgcSBhcmVhPyAgSXQKKyAgICAgc3VyZWx5IHNpbXBsaWZpZXMgdGhpbmdzLgorCisgICAqIE5vdCB5ZXQgYWRlcXVhdGVseSB0ZXN0ZWQuCisqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBEZWZpbmUgc29tZSBsb25nbG9uZy5oLXN0eWxlIG1hY3JvcywgYnV0IGZvciB3aWRlciBvcGVyYXRpb25zLgorICAgKiBhZGRfc3NzYWFhYSBpcyBsaWtlIGxvbmdsb25nLmgncyBhZGRfc3NhYWFhIGJ1dCBwcm9wYWdhdGluZyBjYXJyeS1vdXQgaW50bworICAgICBhbiBhZGRpdGlvbmFsIHN1bSBvcGVyYW5kLgorKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgICYmICEgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikgJiYgISBkZWZpbmVkIChOT19BU00pCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3Nzc2FhYWEoczIsIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoImFkZFx0JTcsICVrMlxuXHRhZGNcdCU1LCAlazFcblx0YWRjXHQkMCwgJWswIgkJXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShzMikpLAkJCQkJXAorCSAgICAgIjEiICAoKFVTSXR5cGUpKGExKSksICJnIiAoKFVTSXR5cGUpKGIxKSksCQkJXAorCSAgICAgIiUyIiAoKFVTSXR5cGUpKGEwKSksICJnIiAoKFVTSXR5cGUpKGIwKSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYW1kNjRfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3Nzc2FhYWEoczIsIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoImFkZFx0JTcsICVxMlxuXHRhZGNcdCU1LCAlcTFcblx0YWRjXHQkMCwgJXEwIgkJXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIwIiAgKChVREl0eXBlKShzMikpLAkJCQkJXAorCSAgICAgIjEiICAoKFVESXR5cGUpKGExKSksICJybWUiICgoVURJdHlwZSkoYjEpKSwJCVwKKwkgICAgICIlMiIgKChVREl0eXBlKShhMCkpLCAicm1lIiAoKFVESXR5cGUpKGIwKSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYWFyY2g2NF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICgiYWRkc1x0JTIsICV4NiwgJTdcblx0YWRjc1x0JTEsICV4NCwgJXg1XG5cdGFkY1x0JTAsICV4MywgeHpyIlwKKwkgICA6ICI9ciIgKHMyKSwgIj0mciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAicloiIChzMiksICIlcloiICAoYTEpLCAicloiIChiMSksICIlcloiIChhMCksICJySSIgKGIwKQlcCisJICAgICBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMgJiYgIWRlZmluZWQgKF9MT05HX0xPTkdfTElNQikKKy8qIFRoaXMgd29ya3MgZmluZSBmb3IgMzItYml0IGFuZCA2NC1iaXQgbGltYnMsIGV4Y2VwdCBmb3IgNjQtYml0IGxpbWJzIHdpdGggYQorICAgcHJvY2Vzc29yIHJ1bm5pbmcgaW4gMzItYml0IG1vZGUsIHNpbmNlIHRoZSBjYXJyeSBmbGFnIHRoZW4gZ2V0cyB0aGUgMzItYml0CisgICBjYXJyeS4gICovCisjZGVmaW5lIGFkZF9zc3NhYWFhKHMyLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIF9fYXNtX18gKCJhZGQlSTdjXHQlMiwlNiwlN1xuXHRhZGRlXHQlMSwlNCwlNVxuXHRhZGR6ZVx0JTAsJTMiCVwKKwkgICA6ICI9ciIgKHMyKSwgIj0mciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAiciIgIChzMiksICJyIiAgKGExKSwgInIiIChiMSksICIlciIgKGEwKSwgInJJIiAoYjApCVwKKwkgICAgIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2lmbmRlZiBhZGRfc3NzYWFhYQorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3MwLCBfX3MxLCBfX2MwLCBfX2MxOwkJCQkJXAorICAgIF9fczAgPSAoYTApICsgKGIwKTsJCQkJCQkJXAorICAgIF9fczEgPSAoYTEpICsgKGIxKTsJCQkJCQkJXAorICAgIF9fYzAgPSBfX3MwIDwgKGEwKTsJCQkJCQkJXAorICAgIF9fYzEgPSBfX3MxIDwgKGExKTsJCQkJCQkJXAorICAgIChzMCkgPSBfX3MwOwkJCQkJCQlcCisgICAgX19zMSA9IF9fczEgKyBfX2MwOwkJCQkJCQlcCisgICAgKHMxKSA9IF9fczE7CQkJCQkJCVwKKyAgICAoczIpICs9IF9fYzEgKyAoX19zMSA8IF9fYzApOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0cnVjdCBwcmVjb21wX2Rpdl8xX3BpMgoreworICBtcF9saW1iX3QgZGlwWzJdOworICBtcF9saW1iX3QgZDsKKyAgaW50IG5vcm1fY250OworfTsKKworbXBfbGltYl90CittcG5fZGl2X3FyXzF1X3BpMiAobXBfcHRyIHFwLAorCQkgICBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwKKwkJICAgc3RydWN0IHByZWNvbXBfZGl2XzFfcGkyICpwZCkKK3sKKyAgbXBfc2l6ZV90IGk7CisgIG1wX2xpbWJfdCByLCB1MiwgdTEsIHUwOworICBtcF9saW1iX3QgZDAsIGRpMSwgZGkwOworICBtcF9saW1iX3QgcTNhLCBxMmEsIHEyYiwgcTFiLCBxMmMsIHExYywgcTFkLCBxMGQ7CisgIG1wX2xpbWJfdCBjbmQ7CisgIGludCBjbnQ7CisKKyAgQVNTRVJUICh1biA+PSAyKTsKKyAgQVNTRVJUICgocGQtPmQgJiBHTVBfTlVNQl9ISUdIQklUKSA9PSAwKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHFwLCB1bi0yLCB1cCwgdW4pIHx8IHFwKzIgPj0gdXApOworICBBU1NFUlRfTVBOICh1cCwgdW4pOworCisjZGVmaW5lIHEzIHEzYQorI2RlZmluZSBxMiBxMmIKKyNkZWZpbmUgcTEgcTFiCisKKyAgdXAgKz0gdW4gLSAzOworICBjbnQgPSBwZC0+bm9ybV9jbnQ7CisgIHIgPSB1cFsyXSA+PiAoR01QX05VTUJfQklUUyAtIGNudCk7CisgIGQwID0gcGQtPmQgPDwgY250OworCisgIHFwICs9IHVuIC0gMjsKKworICBkaTEgPSBwZC0+ZGlwWzFdOworICBkaTAgPSBwZC0+ZGlwWzBdOworCisgIGZvciAoaSA9IHVuIC0gMzsgaSA+PSAwOyBpIC09IDIpCisgICAgeworICAgICAgdTIgPSByOworICAgICAgdTEgPSAodXBbMl0gPDwgY250KSB8ICh1cFsxXSA+PiAoR01QX05VTUJfQklUUyAtIGNudCkpOworICAgICAgdTAgPSAodXBbMV0gPDwgY250KSB8ICh1cFswXSA+PiAoR01QX05VTUJfQklUUyAtIGNudCkpOworCisgICAgICAvKiBEaXZpZGVuZCBpbiB7cix1MSx1MH0gKi8KKworICAgICAgdW11bF9wcG1tIChxMWQscTBkLCB1MSwgZGkwKTsKKyAgICAgIHVtdWxfcHBtbSAocTJiLHExYiwgdTEsIGRpMSk7CisgICAgICBxMmIrKzsJCQkJLyogY2Fubm90IHNwaWxsICovCisgICAgICBhZGRfc3NzYWFhYSAocixxMmIscTFiLCBxMmIscTFiLCB1MSx1MCk7CisKKyAgICAgIHVtdWxfcHBtbSAocTJjLHExYywgdTIsICBkaTApOworICAgICAgYWRkX3Nzc2FhYWEgKHIscTJiLHExYiwgcTJiLHExYiwgcTJjLHExYyk7CisgICAgICB1bXVsX3BwbW0gKHEzYSxxMmEsIHUyLCBkaTEpOworCisgICAgICBhZGRfc3NzYWFhYSAocixxMmIscTFiLCBxMmIscTFiLCBxMmEscTFkKTsKKworICAgICAgcTMgKz0gcjsKKworICAgICAgciA9IHUwIC0gcTIgKiBkMDsKKworICAgICAgY25kID0gKHIgPj0gcTEpOworICAgICAgciArPSBkMCAmIC1jbmQ7CisgICAgICBzdWJfZGRtbXNzIChxMyxxMiwgIHEzLHEyLCAgMCxjbmQpOworCisgICAgICBpZiAoVU5MSUtFTFkgKHIgPj0gZDApKQorCXsKKwkgIHIgLT0gZDA7CisJICBhZGRfc3NhYWFhIChxMyxxMiwgIHEzLHEyLCAgMCwxKTsKKwl9CisKKyAgICAgIHFwWzBdID0gcTI7CisgICAgICBxcFsxXSA9IHEzOworCisgICAgICB1cCAtPSAyOworICAgICAgcXAgLT0gMjsKKyAgICB9CisKKyAgaWYgKCh1biAmIDEpICE9IDApCisgICAgeworICAgICAgdTIgPSByOworICAgICAgdTEgPSAodXBbMl0gPDwgY250KTsKKworICAgICAgdWRpdl9xcm5uZF9wcmVpbnYgKHEzLCByLCB1MiwgdTEsIGQwLCBkaTEpOworICAgICAgcXBbMV0gPSBxMzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB1MiA9IHI7CisgICAgICB1MSA9ICh1cFsyXSA8PCBjbnQpIHwgKHVwWzFdID4+IChHTVBfTlVNQl9CSVRTIC0gY250KSk7CisgICAgICB1MCA9ICh1cFsxXSA8PCBjbnQpOworCisgICAgICAvKiBEaXZpZGVuZCBpbiB7cix1MSx1MH0gKi8KKworICAgICAgdW11bF9wcG1tIChxMWQscTBkLCB1MSwgZGkwKTsKKyAgICAgIHVtdWxfcHBtbSAocTJiLHExYiwgdTEsIGRpMSk7CisgICAgICBxMmIrKzsJCQkJLyogY2Fubm90IHNwaWxsICovCisgICAgICBhZGRfc3NzYWFhYSAocixxMmIscTFiLCBxMmIscTFiLCB1MSx1MCk7CisKKyAgICAgIHVtdWxfcHBtbSAocTJjLHExYywgdTIsICBkaTApOworICAgICAgYWRkX3Nzc2FhYWEgKHIscTJiLHExYiwgcTJiLHExYiwgcTJjLHExYyk7CisgICAgICB1bXVsX3BwbW0gKHEzYSxxMmEsIHUyLCBkaTEpOworCisgICAgICBhZGRfc3NzYWFhYSAocixxMmIscTFiLCBxMmIscTFiLCBxMmEscTFkKTsKKworICAgICAgcTMgKz0gcjsKKworICAgICAgciA9IHUwIC0gcTIgKiBkMDsKKworICAgICAgY25kID0gKHIgPj0gcTEpOworICAgICAgciArPSBkMCAmIC1jbmQ7CisgICAgICBzdWJfZGRtbXNzIChxMyxxMiwgIHEzLHEyLCAgMCxjbmQpOworCisgICAgICBpZiAoVU5MSUtFTFkgKHIgPj0gZDApKQorCXsKKwkgIHIgLT0gZDA7CisJICBhZGRfc3NhYWFhIChxMyxxMiwgIHEzLHEyLCAgMCwxKTsKKwl9CisKKyAgICAgIHFwWzBdID0gcTI7CisgICAgICBxcFsxXSA9IHEzOworICAgIH0KKworICByZXR1cm4gciA+PiBjbnQ7CisKKyN1bmRlZiBxMworI3VuZGVmIHEyCisjdW5kZWYgcTEKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2Rpdl9xcl8yLmMgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzhmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMi5jCkBAIC0wLDAgKzEsMzE0IEBACisvKiBtcG5fZGl2X3FyXzIgLS0gRGl2aWRlIG5hdHVyYWwgbnVtYmVycywgcHJvZHVjaW5nIGJvdGggcmVtYWluZGVyIGFuZAorICAgcXVvdGllbnQuICBUaGUgZGl2aXNvciBpcyB0d28gbGltYnMuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTmllbHMgTcO2bGxlcgorCisgICBUSElTIEZJTEUgQ09OVEFJTlMgSU5URVJOQUwgRlVOQ1RJT05TIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCisKK0NvcHlyaWdodCAxOTkzLTE5OTYsIDE5OTktMjAwMiwgMjAxMSwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBESVZfUVJfMl9QSTJfVEhSRVNIT0xECisvKiBEaXNhYmxlZCB1bmxlc3MgZXhwbGljaXRseSB0dW5lZC4gKi8KKyNkZWZpbmUgRElWX1FSXzJfUEkyX1RIUkVTSE9MRCBNUF9MSU1CX1RfTUFYCisjZW5kaWYKKworI2lmbmRlZiBTQU5JVFlfQ0hFQ0sKKyNkZWZpbmUgU0FOSVRZX0NIRUNLIDAKKyNlbmRpZgorCisvKiBEZWZpbmUgc29tZSBsb25nbG9uZy5oLXN0eWxlIG1hY3JvcywgYnV0IGZvciB3aWRlciBvcGVyYXRpb25zLgorICAgKiBhZGRfc3NzYWFhYSBpcyBsaWtlIGxvbmdsb25nLmgncyBhZGRfc3NhYWFhIGJ1dCBwcm9wYWdhdGluZyBjYXJyeS1vdXQgaW50bworICAgICBhbiBhZGRpdGlvbmFsIHN1bSBvcGVyYW5kLgorICAgKiBhZGRfY3NhYWMgYWNjZXB0cyB0d28gYWRkZW5kcyBhbmQgYSBjYXJyeSBpbiwgYW5kIGdlbmVyYXRlcyBhIHN1bSBhbmQgYQorICAgICBjYXJyeSBvdXQuICBBIGxpdHRsZSBsaWtlIGEgImZ1bGwgYWRkZXIiLgorKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgICYmICEgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikgJiYgISBkZWZpbmVkIChOT19BU00pCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3Nzc2FhYWEoczIsIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoImFkZFx0JTcsICVrMlxuXHRhZGNcdCU1LCAlazFcblx0YWRjXHQkMCwgJWswIgkJXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIwIiAgKChVU0l0eXBlKShzMikpLAkJCQkJXAorCSAgICAgIjEiICAoKFVTSXR5cGUpKGExKSksICJnIiAoKFVTSXR5cGUpKGIxKSksCQkJXAorCSAgICAgIiUyIiAoKFVTSXR5cGUpKGEwKSksICJnIiAoKFVTSXR5cGUpKGIwKSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYW1kNjRfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX3Nzc2FhYWEoczIsIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoImFkZFx0JTcsICVxMlxuXHRhZGNcdCU1LCAlcTFcblx0YWRjXHQkMCwgJXEwIgkJXAorCSAgIDogIj1yIiAoczIpLCAiPSZyIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIwIiAgKChVREl0eXBlKShzMikpLAkJCQkJXAorCSAgICAgIjEiICAoKFVESXR5cGUpKGExKSksICJybWUiICgoVURJdHlwZSkoYjEpKSwJCVwKKwkgICAgICIlMiIgKChVREl0eXBlKShhMCkpLCAicm1lIiAoKFVESXR5cGUpKGIwKSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYWFyY2g2NF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBfX2FzbV9fICgiYWRkc1x0JTIsICV4NiwgJTdcblx0YWRjc1x0JTEsICV4NCwgJXg1XG5cdGFkY1x0JTAsICV4MywgeHpyIlwKKwkgICA6ICI9ciIgKHMyKSwgIj0mciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAicloiIChzMiksICIlcloiICAoYTEpLCAicloiIChiMSksICIlcloiIChhMCksICJySSIgKGIwKQlcCisJICAgICBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMgJiYgIWRlZmluZWQgKF9MT05HX0xPTkdfTElNQikKKy8qIFRoaXMgd29ya3MgZmluZSBmb3IgMzItYml0IGFuZCA2NC1iaXQgbGltYnMsIGV4Y2VwdCBmb3IgNjQtYml0IGxpbWJzIHdpdGggYQorICAgcHJvY2Vzc29yIHJ1bm5pbmcgaW4gMzItYml0IG1vZGUsIHNpbmNlIHRoZSBjYXJyeSBmbGFnIHRoZW4gZ2V0cyB0aGUgMzItYml0CisgICBjYXJyeS4gICovCisjZGVmaW5lIGFkZF9zc3NhYWFhKHMyLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIF9fYXNtX18gKCJhZGQlSTdjXHQlMiwlNiwlN1xuXHRhZGRlXHQlMSwlNCwlNVxuXHRhZGR6ZVx0JTAsJTMiCVwKKwkgICA6ICI9ciIgKHMyKSwgIj0mciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAiciIgIChzMiksICJyIiAgKGExKSwgInIiIChiMSksICIlciIgKGEwKSwgInJJIiAoYjApCVwKKwkgICAgIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2lmbmRlZiBhZGRfc3NzYWFhYQorI2RlZmluZSBhZGRfc3NzYWFhYShzMiwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3MwLCBfX3MxLCBfX2MwLCBfX2MxOwkJCQkJXAorICAgIF9fczAgPSAoYTApICsgKGIwKTsJCQkJCQkJXAorICAgIF9fczEgPSAoYTEpICsgKGIxKTsJCQkJCQkJXAorICAgIF9fYzAgPSBfX3MwIDwgKGEwKTsJCQkJCQkJXAorICAgIF9fYzEgPSBfX3MxIDwgKGExKTsJCQkJCQkJXAorICAgIChzMCkgPSBfX3MwOwkJCQkJCQlcCisgICAgX19zMSA9IF9fczEgKyBfX2MwOwkJCQkJCQlcCisgICAgKHMxKSA9IF9fczE7CQkJCQkJCVwKKyAgICAoczIpICs9IF9fYzEgKyAoX19zMSA8IF9fYzApOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIFR5cGljYWxseSB1c2VkIHdpdGggcjEsIHIwIHNhbWUgYXMgbjMsIG4yLiBPdGhlciB0eXBlcyBvZiBvdmVybGFwCisgICBiZXR3ZWVuIGlucHV0cyBhbmQgb3V0cHV0cyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KKyNkZWZpbmUgdWRpdl9xcl80YnkyKHExLHEwLCByMSxyMCwgbjMsbjIsbjEsbjAsIGQxLGQwLCBkaTEsZGkwKQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfcTMsIF9xMmEsIF9xMiwgX3ExLCBfcTJjLCBfcTFjLCBfcTFkLCBfcTA7CQlcCisgICAgbXBfbGltYl90IF90MSwgX3QwOwkJCQkJCQlcCisgICAgbXBfbGltYl90IF9tYXNrOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgLyogW3EzLHEyLHExLHEwXSA9IFtuMyxuMl0qW2RpMSxkaTBdICsgW24zLG4yLG4xLG4wXSArIFswLDEsMCwwXSAqLwlcCisgICAgdW11bF9wcG1tIChfcTIsX3ExLCBuMiwgZGkxKTsJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9xMyxfcTJhLCBuMywgZGkxKTsJCQkJCVwKKyAgICArK19xMjsJLyogX3EyIGNhbm5vdCBvdmVyZmxvdyAqLwkJCQlcCisgICAgYWRkX3NzYWFhYSAoX3EzLF9xMiwgX3EzLF9xMiwgbjMsX3EyYSk7CQkJCVwKKyAgICB1bXVsX3BwbW0gKF9xMmMsX3ExYywgbjMsIGRpMCk7CQkJCQlcCisgICAgYWRkX3Nzc2FhYWEgKF9xMyxfcTIsX3ExLCBfcTIsX3ExLCBuMixfcTFjKTsJCQlcCisgICAgdW11bF9wcG1tIChfcTFkLF9xMCwgbjIsIGRpMCk7CQkJCQlcCisgICAgYWRkX3Nzc2FhYWEgKF9xMmMsX3ExLF9xMCwgX3ExLF9xMCwgbjEsbjApOyAvKiBfcTJjIGNhbm5vdCBvdmVyZmxvdyAqLyBcCisgICAgYWRkX3Nzc2FhYWEgKF9xMyxfcTIsX3ExLCBfcTIsX3ExLCBfcTJjLF9xMWQpOwkJCVwKKwkJCQkJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF90MSxfdDAsIF9xMiwgZDApOwkJCQkJXAorICAgIF90MSArPSBfcTIgKiBkMSArIF9xMyAqIGQwOwkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBzdWJfZGRtbXNzIChyMSwgcjAsIG4xLCBuMCwgX3QxLCBfdDApOwkJCQlcCisJCQkJCQkJCQlcCisgICAgX21hc2sgPSAtKG1wX2xpbWJfdCkgKChyMSA+PSBfcTEpICYgKChyMSA+IF9xMSkgfCAocjAgPj0gX3EwKSkpOyAgLyogKHIxLHIwKSA+PSAocTEscTApICovICBcCisgICAgYWRkX3NzYWFhYSAocjEsIHIwLCByMSwgcjAsIGQxICYgX21hc2ssIGQwICYgX21hc2spOwkJXAorICAgIHN1Yl9kZG1tc3MgKF9xMywgX3EyLCBfcTMsIF9xMiwgQ05TVF9MSU1CKDApLCAtX21hc2spOwkJXAorCQkJCQkJCQkJXAorICAgIGlmIChVTkxJS0VMWSAocjEgPj0gZDEpKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJaWYgKHIxID4gZDEgfHwgcjAgPj0gZDApCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIHN1Yl9kZG1tc3MgKHIxLCByMCwgcjEsIHIwLCBkMSwgZDApOwkJCVwKKwkgICAgYWRkX3NzYWFhYSAoX3EzLCBfcTIsIF9xMywgX3EyLCBDTlNUX0xJTUIoMCksIENOU1RfTElNQigxKSk7XAorCSAgfQkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICAocTEpID0gX3EzOwkJCQkJCQkJXAorICAgIChxMCkgPSBfcTI7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCitpbnZlcnRfNGJ5MiAobXBfcHRyIGRpLCBtcF9saW1iX3QgZDEsIG1wX2xpbWJfdCBkMCkKK3sKKyAgbXBfbGltYl90IHYxLCB2MCwgcDEsIHQxLCB0MCwgcDAsIG1hc2s7CisgIGludmVydF9saW1iICh2MSwgZDEpOworICBwMSA9IGQxICogdjE7CisgIC8qIDwxLCB2MT4gKiBkMSA9IDxCLTEsIHAxPiAqLworICBwMSArPSBkMDsKKyAgaWYgKHAxIDwgZDApCisgICAgeworICAgICAgdjEtLTsKKyAgICAgIG1hc2sgPSAtKG1wX2xpbWJfdCkgKHAxID49IGQxKTsKKyAgICAgIHAxIC09IGQxOworICAgICAgdjEgKz0gbWFzazsKKyAgICAgIHAxIC09IG1hc2sgJiBkMTsKKyAgICB9CisgIC8qIDwxLCB2MT4gKiBkMSArIGQwID0gPEItMSwgcDE+ICovCisgIHVtdWxfcHBtbSAodDEsIHAwLCBkMCwgdjEpOworICBwMSArPSB0MTsKKyAgaWYgKHAxIDwgdDEpCisgICAgeworICAgICAgaWYgKFVOTElLRUxZIChwMSA+PSBkMSkpCisJeworCSAgaWYgKHAxID4gZDEgfHwgcDAgPj0gZDApCisJICAgIHsKKwkgICAgICBzdWJfZGRtbXNzIChwMSwgcDAsIHAxLCBwMCwgZDEsIGQwKTsKKwkgICAgICB2MS0tOworCSAgICB9CisJfQorICAgICAgc3ViX2RkbW1zcyAocDEsIHAwLCBwMSwgcDAsIGQxLCBkMCk7CisgICAgICB2MS0tOworICAgIH0KKyAgLyogTm93IHYxIGlzIHRoZSAzLzIgaW52ZXJzZSwgPDEsIHYxPiAqIDxkMSwgZDA+ID0gPEItMSwgcDEsIHAwPiwKKyAgICogd2l0aCA8cDEsIHAwPiArIDxkMSwgZDA+ID49IEJeMi4KKyAgICoKKyAgICogVGhlIDQvMiBpbnZlcnNlIGlzIChCXjQgLSAxKSAvIDxkMSwgZDA+ID0gPDEsIHYxLCB2MD4uIFRoZQorICAgKiBwYXJ0aWFsIHJlbWFpbmRlciBhZnRlciA8MSwgdjE+IGlzCisgICAqCisgICAqIEJeNCAtIDEgLSBCIDwxLCB2MT4gPGQxLCBkMD4gPSA8Qi0xLCBCLTEsIEItMSwgQi0xPiAtIDxCLTEsIHAxLCBwMCwgMD4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDx+cDEsIH5wMCwgQi0xPgorICAgKi8KKyAgdWRpdl9xcl8zYnkyICh2MCwgdDEsIHQwLCB+cDEsIH5wMCwgTVBfTElNQl9UX01BWCwgZDEsIGQwLCB2MSk7CisgIGRpWzBdID0gdjA7CisgIGRpWzFdID0gdjE7CisKKyNpZiBTQU5JVFlfQ0hFQ0sKKyAgeworICAgIG1wX2xpbWJfdCB0cFs0XTsKKyAgICBtcF9saW1iX3QgZHBbMl07CisgICAgZHBbMF0gPSBkMDsKKyAgICBkcFsxXSA9IGQxOworICAgIG1wbl9tdWxfbiAodHAsIGRwLCBkaSwgMik7CisgICAgQVNTRVJUX0FMV0FZUyAobXBuX2FkZF9uICh0cCsyLCB0cCsyLCBkcCwgMikgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAodHBbMl0gPT0gTVBfTElNQl9UX01BWCk7CisgICAgQVNTRVJUX0FMV0FZUyAodHBbM10gPT0gTVBfTElNQl9UX01BWCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBuX2FkZF9uICh0cCwgdHAsIGRwLCAyKSA9PSAxKTsKKyAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBtcF9saW1iX3QKK21wbl9kaXZfcXJfMm5fcGkyIChtcF9wdHIgcXAsIG1wX3B0ciBycCwgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSAgIG1wX2xpbWJfdCBkMSwgbXBfbGltYl90IGQwLCBtcF9saW1iX3QgZGkxLCBtcF9saW1iX3QgZGkwKQoreworICBtcF9saW1iX3QgcWg7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgcjEsIHIwOworCisgIEFTU0VSVCAobm4gPj0gMik7CisgIEFTU0VSVCAoZDEgJiBHTVBfTlVNQl9ISUdIQklUKTsKKworICByMSA9IG5wW25uLTFdOworICByMCA9IG5wW25uLTJdOworCisgIHFoID0gMDsKKyAgaWYgKHIxID49IGQxICYmIChyMSA+IGQxIHx8IHIwID49IGQwKSkKKyAgICB7CisjaWYgR01QX05BSUxfQklUUyA9PSAwCisgICAgICBzdWJfZGRtbXNzIChyMSwgcjAsIHIxLCByMCwgZDEsIGQwKTsKKyNlbHNlCisgICAgICByMCA9IHIwIC0gZDA7CisgICAgICByMSA9IHIxIC0gZDEgLSAocjAgPj4gR01QX0xJTUJfQklUUyAtIDEpOworICAgICAgcjAgJj0gR01QX05VTUJfTUFTSzsKKyNlbmRpZgorICAgICAgcWggPSAxOworICAgIH0KKworICBmb3IgKGkgPSBubiAtIDI7IGkgPj0gMjsgaSAtPSAyKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBuMSwgbjAsIHExLCBxMDsKKyAgICAgIG4xID0gbnBbaS0xXTsKKyAgICAgIG4wID0gbnBbaS0yXTsKKyAgICAgIHVkaXZfcXJfNGJ5MiAocTEsIHEwLCByMSwgcjAsIHIxLCByMCwgbjEsIG4wLCBkMSwgZDAsIGRpMSwgZGkwKTsKKyAgICAgIHFwW2ktMV0gPSBxMTsKKyAgICAgIHFwW2ktMl0gPSBxMDsKKyAgICB9CisKKyAgaWYgKGkgPiAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxOworICAgICAgdWRpdl9xcl8zYnkyIChxLCByMSwgcjAsIHIxLCByMCwgbnBbMF0sIGQxLCBkMCwgZGkxKTsKKyAgICAgIHFwWzBdID0gcTsKKyAgICB9CisgIHJwWzFdID0gcjE7CisgIHJwWzBdID0gcjA7CisKKyAgcmV0dXJuIHFoOworfQorCisKKy8qIERpdmlkZSBudW0ge25wLG5ufSBieSBkZW4ge2RwLDJ9IGFuZCB3cml0ZSB0aGUgbm4tMiBsZWFzdAorICAgc2lnbmlmaWNhbnQgcXVvdGllbnQgbGltYnMgYXQgcXAgYW5kIHRoZSAyIGxvbmcgcmVtYWluZGVyIGF0IG5wLgorICAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHF1b3RpZW50LgorCisgICBQcmVjb25kaXRpb25zOgorICAgMS4gcXAgbXVzdCBlaXRoZXIgbm90IG92ZXJsYXAgd2l0aCB0aGUgb3RoZXIgb3BlcmFuZHMgYXQgYWxsLCBvcgorICAgICAgcXAgPj0gbnAgKyAyIG11c3QgaG9sZCB0cnVlLiAgKFRoaXMgbWVhbnMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHB1dAorICAgICAgdGhlIHF1b3RpZW50IGluIHRoZSBoaWdoIHBhcnQgb2Yge25wLG5ufSwgcmlnaHQgYWJvdmUgdGhlIHJlbWFpbmRlci4pCisgICAyLiBubiA+PSAyLiAgKi8KKworbXBfbGltYl90CittcG5fZGl2X3FyXzIgKG1wX3B0ciBxcCwgbXBfcHRyIHJwLCBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkgICAgICBtcF9zcmNwdHIgZHApCit7CisgIG1wX2xpbWJfdCBkMTsKKyAgbXBfbGltYl90IGQwOworICBnbXBfcGkxX3QgZGludjsKKworICBBU1NFUlQgKG5uID49IDIpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocXAsIG5uLTIsIG5wLCBubikgfHwgcXAgPj0gbnAgKyAyKTsKKyAgQVNTRVJUX01QTiAobnAsIG5uKTsKKyAgQVNTRVJUX01QTiAoZHAsIDIpOworCisgIGQxID0gZHBbMV07IGQwID0gZHBbMF07CisKKyAgQVNTRVJUIChkMSA+IDApOworCisgIGlmIChVTkxJS0VMWSAoZDEgJiBHTVBfTlVNQl9ISUdIQklUKSkKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChubiwgRElWX1FSXzJfUEkyX1RIUkVTSE9MRCkpCisJeworCSAgZ21wX3BpMV90IGRpbnY7CisJICBpbnZlcnRfcGkxIChkaW52LCBkMSwgZDApOworCSAgcmV0dXJuIG1wbl9kaXZfcXJfMm5fcGkxIChxcCwgcnAsIG5wLCBubiwgZDEsIGQwLCBkaW52LmludjMyKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfbGltYl90IGRpWzJdOworCSAgaW52ZXJ0XzRieTIgKGRpLCBkMSwgZDApOworCSAgcmV0dXJuIG1wbl9kaXZfcXJfMm5fcGkyIChxcCwgcnAsIG5wLCBubiwgZDEsIGQwLCBkaVsxXSwgZGlbMF0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgc2hpZnQ7CisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChzaGlmdCwgZDEpOworICAgICAgZDEgPSAoZDEgPDwgc2hpZnQpIHwgKGQwID4+IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpKTsKKyAgICAgIGQwIDw8PSBzaGlmdDsKKyAgICAgIGludmVydF9waTEgKGRpbnYsIGQxLCBkMCk7CisgICAgICByZXR1cm4gbXBuX2Rpdl9xcl8ydV9waTEgKHFwLCBycCwgbnAsIG5uLCBkMSwgZDAsIHNoaWZ0LCBkaW52LmludjMyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZfcXJfMm5fcGkxLmMgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMm5fcGkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxYTgxMQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2Rpdl9xcl8ybl9waTEuYwpAQCAtMCwwICsxLDg0IEBACisvKiBtcG5fZGl2X3FyXzJuX3BpMQorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQgYW5kIE5pZWxzIE3DtmxsZXIKKworICAgVEhJUyBGSUxFIENPTlRBSU5TIElOVEVSTkFMIEZVTkNUSU9OUyBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworCitDb3B5cmlnaHQgMTk5My0xOTk2LCAxOTk5LTIwMDIsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogMy8yIGxvb3AsIGZvciBub3JtYWxpemVkIGRpdmlzb3IgKi8KK21wX2xpbWJfdAorbXBuX2Rpdl9xcl8ybl9waTEgKG1wX3B0ciBxcCwgbXBfcHRyIHJwLCBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJICAgbXBfbGltYl90IGQxLCBtcF9saW1iX3QgZDAsIG1wX2xpbWJfdCBkaSkKK3sKKyAgbXBfbGltYl90IHFoOworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IHIxLCByMDsKKworICBBU1NFUlQgKG5uID49IDIpOworICBBU1NFUlQgKGQxICYgR01QX05VTUJfSElHSEJJVCk7CisKKyAgbnAgKz0gbm4gLSAyOworICByMSA9IG5wWzFdOworICByMCA9IG5wWzBdOworCisgIHFoID0gMDsKKyAgaWYgKHIxID49IGQxICYmIChyMSA+IGQxIHx8IHIwID49IGQwKSkKKyAgICB7CisjaWYgR01QX05BSUxfQklUUyA9PSAwCisgICAgICBzdWJfZGRtbXNzIChyMSwgcjAsIHIxLCByMCwgZDEsIGQwKTsKKyNlbHNlCisgICAgICByMCA9IHIwIC0gZDA7CisgICAgICByMSA9IHIxIC0gZDEgLSAocjAgPj4gR01QX0xJTUJfQklUUyAtIDEpOworICAgICAgcjAgJj0gR01QX05VTUJfTUFTSzsKKyNlbmRpZgorICAgICAgcWggPSAxOworICAgIH0KKworICBmb3IgKGkgPSBubiAtIDIgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgbjAsIHE7CisgICAgICBuMCA9IG5wWy0xXTsKKyAgICAgIHVkaXZfcXJfM2J5MiAocSwgcjEsIHIwLCByMSwgcjAsIG4wLCBkMSwgZDAsIGRpKTsKKyAgICAgIG5wLS07CisgICAgICBxcFtpXSA9IHE7CisgICAgfQorCisgIHJwWzFdID0gcjE7CisgIHJwWzBdID0gcjA7CisKKyAgcmV0dXJuIHFoOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZGl2X3FyXzJ1X3BpMS5jIGIvbXBuL2dlbmVyaWMvZGl2X3FyXzJ1X3BpMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTYxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZfcXJfMnVfcGkxLmMKQEAgLTAsMCArMSw3NiBAQAorLyogbXBuX2Rpdl9xcl8ydV9waTEKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworICAgVEhJUyBGSUxFIENPTlRBSU5TIElOVEVSTkFMIEZVTkNUSU9OUyBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworCitDb3B5cmlnaHQgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiAzLzIgbG9vcCwgZm9yIHVubm9ybWFsaXplZCBkaXZpc29yLiBDYWxsZXIgbXVzdCBwYXNzIHNoaWZ0ZWQgZDEgYW5kCisgICBkMCwgd2hpbGUge25wLG5ufSBpcyBzaGlmdGVkIG9uIHRoZSBmbHkuICovCittcF9saW1iX3QKK21wbl9kaXZfcXJfMnVfcGkxIChtcF9wdHIgcXAsIG1wX3B0ciBycCwgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSAgIG1wX2xpbWJfdCBkMSwgbXBfbGltYl90IGQwLCBpbnQgc2hpZnQsIG1wX2xpbWJfdCBkaSkKK3sKKyAgbXBfbGltYl90IHFoOworICBtcF9saW1iX3QgcjIsIHIxLCByMDsKKyAgbXBfc2l6ZV90IGk7CisKKyAgQVNTRVJUIChubiA+PSAyKTsKKyAgQVNTRVJUIChkMSAmIEdNUF9OVU1CX0hJR0hCSVQpOworICBBU1NFUlQgKHNoaWZ0ID4gMCk7CisKKyAgcjIgPSBucFtubi0xXSA+PiAoR01QX0xJTUJfQklUUyAtIHNoaWZ0KTsKKyAgcjEgPSAobnBbbm4tMV0gPDwgc2hpZnQpIHwgKG5wW25uLTJdID4+IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpKTsKKyAgcjAgPSBucFtubi0yXSA8PCBzaGlmdDsKKworICB1ZGl2X3FyXzNieTIgKHFoLCByMiwgcjEsIHIyLCByMSwgcjAsIGQxLCBkMCwgZGkpOworCisgIGZvciAoaSA9IG5uIC0gMiAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxOworICAgICAgcjAgPSBucFtpXTsKKyAgICAgIHIxIHw9IHIwID4+IChHTVBfTElNQl9CSVRTIC0gc2hpZnQpOworICAgICAgcjAgPDw9IHNoaWZ0OworICAgICAgdWRpdl9xcl8zYnkyIChxLCByMiwgcjEsIHIyLCByMSwgcjAsIGQxLCBkMCwgZGkpOworICAgICAgcXBbaV0gPSBxOworICAgIH0KKworICBycFswXSA9IChyMSA+PiBzaGlmdCkgfCAocjIgPDwgKEdNUF9MSU1CX0JJVFMgLSBzaGlmdCkpOworICBycFsxXSA9IHIyID4+IHNoaWZ0OworCisgIHJldHVybiBxaDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RpdmVfMS5jIGIvbXBuL2dlbmVyaWMvZGl2ZV8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2ZjViOQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2RpdmVfMS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBtcG5fZGl2ZXhhY3RfMSAtLSBtcG4gYnkgbGltYiBleGFjdCBkaXZpc2lvbi4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMsIDIwMDUsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworCisvKiBEaXZpZGUgYT17c3JjLHNpemV9IGJ5IGQ9ZGl2aXNvciBhbmQgc3RvcmUgdGhlIHF1b3RpZW50IGluIHE9e2RzdCxzaXplfS4KKyAgIHEgd2lsbCBvbmx5IGJlIGNvcnJlY3QgaWYgZCBkaXZpZGVzIGEgZXhhY3RseS4KKworICAgQSBzZXBhcmF0ZSBsb29wIGlzIHVzZWQgZm9yIHNoaWZ0PT0wIGJlY2F1c2Ugbjw8R01QX0xJTUJfQklUUyBkb2Vzbid0CisgICBnaXZlIHplcm8gb24gYWxsIENQVXMgKGZvciBpbnN0YW5jZSBpdCBkb2Vzbid0IG9uIHRoZSB4ODZzKS4gIFRoaXMKKyAgIHNlcGFyYXRlIGxvb3AgbWlnaHQgcnVuIGZhc3RlciB0b28sIGhlbHBpbmcgb2RkIGRpdmlzb3JzLgorCisgICBQb3NzaWJpbGl0aWVzOgorCisgICBtcG5fZGl2ZXhhY3RfMWMgY291bGQgYmUgY3JlYXRlZCwgYWNjZXB0aW5nIGFuZCByZXR1cm5pbmcgYy4gIFRoaXMgd291bGQKKyAgIGxldCBhIGxvbmcgY2FsY3VsYXRpb24gYmUgZG9uZSBwaWVjZSBieSBwaWVjZS4gIEN1cnJlbnRseSB0aGVyZSdzIG5vCisgICBwYXJ0aWN1bGFyIG5lZWQgZm9yIHRoYXQsIGFuZCBub3QgcmV0dXJuaW5nIGMgbWVhbnMgdGhhdCBhIGZpbmFsIHVtdWwgY2FuCisgICBiZSBza2lwcGVkLgorCisgICBBbm90aGVyIHVzZSBmb3IgcmV0dXJuaW5nIGMgd291bGQgYmUgbGV0dGluZyB0aGUgY2FsbGVyIGtub3cgd2hldGhlciB0aGUKKyAgIGRpdmlzaW9uIHdhcyBpbiBmYWN0IGV4YWN0LiAgSXQgd291bGQgd29yayBqdXN0IHRvIHJldHVybiB0aGUgY2FycnkgYml0CisgICAiYz0obD5zKSIgYW5kIGxldCB0aGUgY2FsbGVyIGRvIGEgZmluYWwgdW11bCBpZiBpbnRlcmVzdGVkLgorCisgICBXaGVuIHRoZSBkaXZpc29yIGlzIGV2ZW4sIHRoZSBmYWN0b3JzIG9mIHR3byBjb3VsZCBiZSBoYW5kbGVkIHdpdGggYQorICAgc2VwYXJhdGUgbXBuX3JzaGlmdCwgaW5zdGVhZCBvZiBzaGlmdGluZyBvbiB0aGUgZmx5LiAgVGhhdCBtaWdodCBiZQorICAgZmFzdGVyIG9uIHNvbWUgQ1BVcyBhbmQgd291bGQgbWVhbiBqdXN0IHRoZSBzaGlmdD09MCBzdHlsZSBsb29wIHdvdWxkIGJlCisgICBuZWVkZWQuCisKKyAgIElmIG48PEdNUF9MSU1CX0JJVFMgZ2l2ZXMgemVybyBvbiBhIHBhcnRpY3VsYXIgQ1BVIHRoZW4gdGhlIHNlcGFyYXRlCisgICBzaGlmdD09MCBsb29wIGlzIHVubmVjZXNzYXJ5LCBhbmQgY291bGQgYmUgZWxpbWluYXRlZCBpZiB0aGVyZSdzIG5vIGdyZWF0CisgICBzcGVlZCBkaWZmZXJlbmNlLgorCisgICBJdCdzIG5vdCBjbGVhciB3aGV0aGVyICIvIiBpcyB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIHNpemU9PTEuICBBbHBoYSBnY2MKKyAgIDIuOTUgZm9yIGluc3RhbmNlIGhhcyBhIHBvb3IgIi8iIGFuZCBtaWdodCBwcmVmZXIgdGhlIG1vZHVsYXIgbWV0aG9kLgorICAgUGVyaGFwcyBhIHR1bmVkIHBhcmFtZXRlciBzaG91bGQgY29udHJvbCB0aGlzLgorCisgICBJZiBzcmNbc2l6ZS0xXSA8IGRpdmlzb3IgdGhlbiBkc3Rbc2l6ZS0xXSB3aWxsIGJlIHplcm8sIGFuZCBvbmUgZGl2aWRlCisgICBzdGVwIGNvdWxkIGJlIHNraXBwZWQuICBBIHRlc3QgYXQgbGFzdCBzdGVwIGZvciBzPGRpdmlzb3IgKG9yIGxzIGluIHRoZQorICAgZXZlbiBjYXNlKSBtaWdodCBiZSBhIGdvb2Qgd2F5IHRvIGRvIHRoYXQuICBCdXQgaWYgdGhpcyBjb2RlIGlzIG9mdGVuCisgICB1c2VkIHdpdGggc21hbGwgZGl2aXNvcnMgdGhlbiBpdCBtaWdodCBub3QgYmUgd29ydGggYm90aGVyaW5nICAqLworCit2b2lkCittcG5fZGl2ZXhhY3RfMSAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBkaXZpc29yKQoreworICBtcF9zaXplX3QgIGk7CisgIG1wX2xpbWJfdCAgYywgaCwgbCwgbHMsIHMsIHNfbmV4dCwgaW52ZXJzZSwgZHVtbXk7CisgIHVuc2lnbmVkICAgc2hpZnQ7CisKKyAgQVNTRVJUIChzaXplID49IDEpOworICBBU1NFUlQgKGRpdmlzb3IgIT0gMCk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoZHN0LCBzcmMsIHNpemUpKTsKKyAgQVNTRVJUX01QTiAoc3JjLCBzaXplKTsKKyAgQVNTRVJUX0xJTUIgKGRpdmlzb3IpOworCisgIGlmICgoZGl2aXNvciAmIDEpID09IDApCisgICAgeworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHNoaWZ0LCBkaXZpc29yKTsKKyAgICAgIGRpdmlzb3IgPj49IHNoaWZ0OworICAgIH0KKyAgZWxzZQorICAgIHNoaWZ0ID0gMDsKKworICBiaW52ZXJ0X2xpbWIgKGludmVyc2UsIGRpdmlzb3IpOworICBkaXZpc29yIDw8PSBHTVBfTkFJTF9CSVRTOworCisgIGlmIChzaGlmdCAhPSAwKQorICAgIHsKKyAgICAgIGMgPSAwOworCisgICAgICBzID0gc3JjWzBdOworCisgICAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorCXsKKwkgIHNfbmV4dCA9IHNyY1tpXTsKKwkgIGxzID0gKChzID4+IHNoaWZ0KSB8IChzX25leHQgPDwgKEdNUF9OVU1CX0JJVFMtc2hpZnQpKSkgJiBHTVBfTlVNQl9NQVNLOworCSAgcyA9IHNfbmV4dDsKKworCSAgU1VCQ19MSU1CIChjLCBsLCBscywgYyk7CisKKwkgIGwgPSAobCAqIGludmVyc2UpICYgR01QX05VTUJfTUFTSzsKKwkgIGRzdFtpIC0gMV0gPSBsOworCisJICB1bXVsX3BwbW0gKGgsIGR1bW15LCBsLCBkaXZpc29yKTsKKwkgIGMgKz0gaDsKKwl9CisKKyAgICAgIGxzID0gcyA+PiBzaGlmdDsKKyAgICAgIGwgPSBscyAtIGM7CisgICAgICBsID0gKGwgKiBpbnZlcnNlKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICBkc3Rbc2l6ZSAtIDFdID0gbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzID0gc3JjWzBdOworCisgICAgICBsID0gKHMgKiBpbnZlcnNlKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICBkc3RbMF0gPSBsOworICAgICAgYyA9IDA7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspCisJeworCSAgdW11bF9wcG1tIChoLCBkdW1teSwgbCwgZGl2aXNvcik7CisJICBjICs9IGg7CisKKwkgIHMgPSBzcmNbaV07CisJICBTVUJDX0xJTUIgKGMsIGwsIHMsIGMpOworCisJICBsID0gKGwgKiBpbnZlcnNlKSAmIEdNUF9OVU1CX01BU0s7CisJICBkc3RbaV0gPSBsOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZlYnkzLmMgYi9tcG4vZ2VuZXJpYy9kaXZlYnkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlZTBiYwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2RpdmVieTMuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogbXBuX2RpdmV4YWN0X2J5M2MgLS0gbXBuIGV4YWN0IGRpdmlzaW9uIGJ5IDMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWYgRElWRVhBQ1RfQlkzX01FVEhPRCA9PSAwCisKK21wX2xpbWJfdAorbXBuX2RpdmV4YWN0X2J5M2MgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgdW4sIG1wX2xpbWJfdCBjKQoreworICBtcF9saW1iX3QgcjsKKyAgciA9IG1wbl9iZGl2X2RibTFjIChycCwgdXAsIHVuLCBHTVBfTlVNQl9NQVNLIC8gMywgR01QX05VTUJfTUFTSyAvIDMgKiBjKTsKKworICAvKiBQb3NzaWJsZSBiZGl2X2RibTEgcmV0dXJuIHZhbHVlcyBhcmUgQyAqIChHTVBfTlVNQl9NQVNLIC8gMyksIDAgPD0gQyA8IDMuCisgICAgIFdlIHdhbnQgdG8gcmV0dXJuIEMuICBXZSBjb21wdXRlIHRoZSByZW1haW5kZXIgbW9kIDQgYW5kIG5vdGljZSB0aGF0IHRoZQorICAgICBpbnZlcnNlIG9mICgyXigyayktMSkvMyBtb2QgNCBpcyAxLiAgKi8KKyAgcmV0dXJuIHIgJiAzOworfQorCisjZW5kaWYKKworI2lmIERJVkVYQUNUX0JZM19NRVRIT0QgPT0gMQorCisvKiBUaGUgYWxnb3JpdGhtIGhlcmUgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIG1wbl9kaXZleGFjdF8xLCBhcyBkZXNjcmliZWQKKyAgIGluIHRoZSBtYW51YWwuICBOYW1lbHkgYXQgZWFjaCBzdGVwIHEgPSAoc3JjW2ldLWMpKmludmVyc2UsIGFuZCBuZXcgYyA9CisgICBib3Jyb3coc3JjW2ldLWMpICsgaGlnaChkaXZpc29yKnEpLiAgQnV0IGJlY2F1c2UgdGhlIGRpdmlzb3IgaXMganVzdCAzLAorICAgaGlnaChkaXZpc29yKnEpIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggdHdvIGNvbXBhcmlzb25zIGluc3RlYWQgb2YgYQorICAgbXVsdGlwbHkuCisKKyAgIFRoZSAiYyArPSAuLi4icyBhZGQgdGhlIGhpZ2ggbGltYiBvZiAzKmwgdG8gYy4gIFRoYXQgaGlnaCBsaW1iIHdpbGwgYmUgMCwKKyAgIDEgb3IgMi4gIERvaW5nIHR3byBzZXBhcmF0ZSAiKz0icyBzZWVtcyB0byBnaXZlIGJldHRlciBjb2RlIG9uIGdjYyAoYXMgb2YKKyAgIDIuOTUuMiBhdCBsZWFzdCkuCisKKyAgIEl0IHdpbGwgYmUgbm90ZWQgdGhhdCB0aGUgbmV3IGMgaXMgZm9ybWVkIGJ5IGFkZGluZyB0aHJlZSB2YWx1ZXMgZWFjaCAwCisgICBvciAxLiAgQnV0IHRoZSB0b3RhbCBpcyBvbmx5IDAsIDEgb3IgMi4gIFdoZW4gdGhlIHN1YnRyYWN0aW9uIHNyY1tpXS1jCisgICBjYXVzZXMgYSBib3Jyb3csIHRoYXQgbGVhdmVzIGEgbGltYiB2YWx1ZSBvZiBlaXRoZXIgMHhGRi4uLkZGIG9yCisgICAweEZGLi4uRkUuICBUaGUgbXVsdGlwbHkgYnkgTU9ETElNQl9JTlZFUlNFXzMgZ2l2ZXMgMHg1NS4uLjU1IG9yCisgICAweEFBLi4uQUEgcmVzcGVjdGl2ZWx5LCBhbmQgaW4gdGhvc2UgY2FzZXMgaGlnaCgzKnEpIGlzIG9ubHkgMCBvciAxCisgICByZXNwZWN0aXZlbHksIGhlbmNlIGEgdG90YWwgb2Ygbm8gbW9yZSB0aGFuIDIuCisKKyAgIEFsdGVybmF0aXZlczoKKworICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgZWFjaCBtdWx0aXBseSBvbiB0aGUgZGVwZW5kZW50IGNoYWluLCBkdWUgdG8KKyAgICJsPXMtYyIuICBTZWUgYmVsb3cgZm9yIGFsdGVybmF0aXZlIGNvZGUgd2hpY2ggYXZvaWRzIHRoYXQuICAqLworCittcF9saW1iX3QKK21wbl9kaXZleGFjdF9ieTNjIChtcF9wdHIgcmVzdHJpY3QgcnAsIG1wX3NyY3B0ciByZXN0cmljdCB1cCwgbXBfc2l6ZV90IHVuLCBtcF9saW1iX3QgYykKK3sKKyAgbXBfbGltYl90ICBsLCBxLCBzOworICBtcF9zaXplX3QgIGk7CisKKyAgQVNTRVJUICh1biA+PSAxKTsKKyAgQVNTRVJUIChjID09IDAgfHwgYyA9PSAxIHx8IGMgPT0gMik7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCB1bikpOworCisgIGkgPSAwOworICBkbworICAgIHsKKyAgICAgIHMgPSB1cFtpXTsKKyAgICAgIFNVQkNfTElNQiAoYywgbCwgcywgYyk7CisKKyAgICAgIHEgPSAobCAqIE1PRExJTUJfSU5WRVJTRV8zKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICBycFtpXSA9IHE7CisKKyAgICAgIGMgKz0gKHEgPj0gR01QX05VTUJfQ0VJTF9NQVhfRElWMyk7CisgICAgICBjICs9IChxID49IEdNUF9OVU1CX0NFSUxfMk1BWF9ESVYzKTsKKyAgICB9CisgIHdoaWxlICgrK2kgPCB1bik7CisKKyAgQVNTRVJUIChjID09IDAgfHwgYyA9PSAxIHx8IGMgPT0gMik7CisgIHJldHVybiBjOworfQorCisKKyNlbmRpZgorCisjaWYgRElWRVhBQ1RfQlkzX01FVEhPRCA9PSAyCisKKy8qIFRoZSBmb2xsb3dpbmcgYWx0ZXJuYXRpdmUgY29kZSByZS1hcnJhbmdlcyB0aGUgcXVvdGllbnQgY2FsY3VsYXRpb24gZnJvbQorICAgKHNyY1tpXS1jKSppbnZlcnNlIHRvIGluc3RlYWQKKworICAgICAgIHEgPSBzcmNbaV0qaW52ZXJzZSAtIGMqaW52ZXJzZQorCisgICB0aGVyZWJ5IGFsbG93aW5nIHNyY1tpXSppbnZlcnNlIHRvIGJlIHNjaGVkdWxlZCBiYWNrIGFzIGZhciBhcyBkZXNpcmVkLAorICAgbWFraW5nIGZ1bGwgdXNlIG9mIG11bHRpcGxpZXIgdGhyb3VnaHB1dCBhbmQgbGVhdmluZyBqdXN0IHNvbWUgY2FycnkKKyAgIGhhbmRpbmcgb24gdGhlIGRlcGVuZGVudCBjaGFpbi4KKworICAgVGhlIGNhcnJ5IGhhbmRsaW5nIGNvbnNpc3RzIG9mIGRldGVybWluaW5nIHRoZSBjIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICBUaGlzIGlzIHRoZSBzYW1lIGFzIGRlc2NyaWJlZCBhYm92ZSwgbmFtZWx5IGxvb2sgZm9yIGFueSBib3Jyb3cgZnJvbQorICAgc3JjW2ldLWMsIGFuZCBhdCB0aGUgaGlnaCBvZiAzKnEuCisKKyAgIGhpZ2goMypxKSBpcyBkb25lIHdpdGggdHdvIGNvbXBhcmlzb25zIGFzIGFib3ZlIChpbiBjMiBhbmQgYzMpLiAgVGhlCisgICBib3Jyb3cgZnJvbSBzcmNbaV0tYyBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aG9zZSBieSBub3RpbmcgdGhhdCBpZiB0aGVyZSdzCisgICBhIGNhcnJ5IHRoZW4gdGhlbiB3ZSBoYXZlIHNyY1tpXS1jID09IDB4RkYuLkZGIG9yIDB4RkYuLkZFLCBpbiB0dXJuCisgICBnaXZpbmcgcSA9IDB4NTUuLjU1IG9yIDB4QUEuLkFBLiAgQWRkaW5nIDEgdG8gZWl0aGVyIG9mIHRob3NlIHEgdmFsdWVzIGlzCisgICBlbm91Z2ggdG8gbWFrZSBoaWdoKDMqcSkgY29tZSBvdXQgMSBiaWdnZXIsIGFzIHJlcXVpcmVkLgorCisgICBsID0gLWMqaW52ZXJzZSBpcyBjYWxjdWxhdGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgYywgc2luY2UgZm9yIG1vc3QgY2hpcHMKKyAgIGl0IGNhbiBiZSBtb3JlIGNvbnZlbmllbnRseSBkZXJpdmVkIGZyb20gc2VwYXJhdGUgYzEvYzIvYzMgdmFsdWVzIHRoYW4KKyAgIGZyb20gYSBjb21iaW5lZCBjIGVxdWFsIHRvIDAsIDEgb3IgMi4KKworICAgVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCB3aXRoIGdvb2QgcGlwZWxpbmluZyB0aGlzIGxvb3Agc2hvdWxkIGJlIGFibGUgdG8KKyAgIHJ1biBhdCBwZXJoYXBzIDQgY3ljbGVzL2xpbWIsIGRlcGVuZGluZyBvbiBhdmFpbGFibGUgZXhlY3V0ZSByZXNvdXJjZXMKKyAgIGV0Yy4KKworICAgVXNhZ2U6CisKKyAgIFRoaXMgY29kZSBpcyBub3QgdXNlZCBieSBkZWZhdWx0LCBzaW5jZSB3ZSByZWFsbHkgY2FuJ3QgcmVseSBvbiB0aGUKKyAgIGNvbXBpbGVyIGdlbmVyYXRpbmcgYSBnb29kIHNvZnR3YXJlIHBpcGVsaW5lLCBub3Igb24gc3VjaCBhbiBhcHByb2FjaAorICAgZXZlbiBiZWluZyB3b3J0aHdoaWxlIG9uIGFsbCBDUFVzLgorCisgICBJdGFuaXVtIGlzIG9uZSBjaGlwIHdoZXJlIHRoaXMgYWxnb3JpdGhtIGhlbHBzIHRob3VnaCwgc2VlCisgICBtcG4vaWE2NC9kaXZlYnkzLmFzbS4gICovCisKK21wX2xpbWJfdAorbXBuX2RpdmV4YWN0X2J5M2MgKG1wX3B0ciByZXN0cmljdCBycCwgbXBfc3JjcHRyIHJlc3RyaWN0IHVwLCBtcF9zaXplX3QgdW4sIG1wX2xpbWJfdCBjeSkKK3sKKyAgbXBfbGltYl90ICBzLCBzbSwgY2wsIHEsIHF4LCBjMiwgYzM7CisgIG1wX3NpemVfdCAgaTsKKworICBBU1NFUlQgKHVuID49IDEpOworICBBU1NFUlQgKGN5ID09IDAgfHwgY3kgPT0gMSB8fCBjeSA9PSAyKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdXAsIHVuKSk7CisKKyAgY2wgPSBjeSA9PSAwID8gMCA6IGN5ID09IDEgPyAtTU9ETElNQl9JTlZFUlNFXzMgOiAtMipNT0RMSU1CX0lOVkVSU0VfMzsKKworICBmb3IgKGkgPSAwOyBpIDwgdW47IGkrKykKKyAgICB7CisgICAgICBzID0gdXBbaV07CisgICAgICBzbSA9IChzICogTU9ETElNQl9JTlZFUlNFXzMpICYgR01QX05VTUJfTUFTSzsKKworICAgICAgcSA9IChjbCArIHNtKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICBycFtpXSA9IHE7CisgICAgICBxeCA9IHEgKyAocyA8IGN5KTsKKworICAgICAgYzIgPSBxeCA+PSBHTVBfTlVNQl9DRUlMX01BWF9ESVYzOworICAgICAgYzMgPSBxeCA+PSBHTVBfTlVNQl9DRUlMXzJNQVhfRElWMyA7CisKKyAgICAgIGN5ID0gYzIgKyBjMzsKKyAgICAgIGNsID0gKC1jMiAmIC1NT0RMSU1CX0lOVkVSU0VfMykgKyAoLWMzICYgLU1PRExJTUJfSU5WRVJTRV8zKTsKKyAgICB9CisKKyAgcmV0dXJuIGN5OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RpdmV4YWN0LmMgYi9tcG4vZ2VuZXJpYy9kaXZleGFjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDE3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZleGFjdC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiBtcG5fZGl2ZXhhY3QocXAsbnAsbm4sZHAsZG4sdHApIC0tIERpdmlkZSBOID0ge25wLG5ufSBieSBEID0ge2RwLGRufSBzdG9yaW5nCisgICB0aGUgcmVzdWx0IGluIFEgPSB7cXAsbm4tZG4rMX0gZXhwZWN0aW5nIG5vIHJlbWFpbmRlci4gIE92ZXJsYXAgYWxsb3dlZAorICAgYmV0d2VlbiBRIGFuZCBOOyBhbGwgb3RoZXIgb3ZlcmxhcCBkaXNhbGxvd2VkLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOSwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaWYgMQordm9pZAorbXBuX2RpdmV4YWN0IChtcF9wdHIgcXAsCisJICAgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJICAgICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4pCit7CisgIHVuc2lnbmVkIHNoaWZ0OworICBtcF9zaXplX3QgcW47CisgIG1wX3B0ciB0cDsKKyAgVE1QX0RFQ0w7CisKKyAgQVNTRVJUIChkbiA+IDApOworICBBU1NFUlQgKG5uID49IGRuKTsKKyAgQVNTRVJUIChkcFtkbi0xXSA+IDApOworCisgIHdoaWxlIChkcFswXSA9PSAwKQorICAgIHsKKyAgICAgIEFTU0VSVCAobnBbMF0gPT0gMCk7CisgICAgICBkcCsrOworICAgICAgbnArKzsKKyAgICAgIGRuLS07CisgICAgICBubi0tOworICAgIH0KKworICBpZiAoZG4gPT0gMSkKKyAgICB7CisgICAgICBNUE5fRElWUkVNX09SX0RJVkVYQUNUXzEgKHFwLCBucCwgbm4sIGRwWzBdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisKKyAgcW4gPSBubiArIDEgLSBkbjsKKyAgY291bnRfdHJhaWxpbmdfemVyb3MgKHNoaWZ0LCBkcFswXSk7CisKKyAgaWYgKHNoaWZ0ID4gMCkKKyAgICB7CisgICAgICBtcF9wdHIgd3A7CisgICAgICBtcF9zaXplX3Qgc3M7CisgICAgICBzcyA9IChkbiA+IHFuKSA/IHFuICsgMSA6IGRuOworCisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoc3MpOworICAgICAgbXBuX3JzaGlmdCAodHAsIGRwLCBzcywgc2hpZnQpOworICAgICAgZHAgPSB0cDsKKworICAgICAgLyogU2luY2Ugd2UgaGF2ZSBleGNsdWRlZCBkbiA9PSAxLCB3ZSBoYXZlIG5uID4gcW4sIGFuZCB3ZSBuZWVkCisJIHRvIHNoaWZ0IG9uZSBsaW1iIGJleW9uZCBxbi4gKi8KKyAgICAgIHdwID0gVE1QX0FMTE9DX0xJTUJTIChxbiArIDEpOworICAgICAgbXBuX3JzaGlmdCAod3AsIG5wLCBxbiArIDEsIHNoaWZ0KTsKKyAgICAgIG5wID0gd3A7CisgICAgfQorCisgIGlmIChkbiA+IHFuKQorICAgIGRuID0gcW47CisKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG1wbl9iZGl2X3FfaXRjaCAocW4sIGRuKSk7CisgIG1wbl9iZGl2X3EgKHFwLCBucCwgcW4sIGRwLCBkbiwgdHApOworICBUTVBfRlJFRTsKKworICAvKiBTaW5jZSBiZGl2X3EgY29tcHV0ZXMgLU4vRCAobW9kIEJee3FufSksIHdlIG11c3QgbmVnYXRlIG5vdy4gKi8KKyAgbXBuX25lZyAocXAsIHFwLCBxbik7Cit9CisKKyNlbHNlCisKKy8qIFdlIHVzZSB0aGUgSmViZWxlYW4ncyBiaWRpcmVjdGlvbmFsIGV4YWN0IGRpdmlzaW9uIGFsZ29yaXRobS4gIFRoaXMgaXMKKyAgIHNvbWV3aGF0IG5haXZlbHkgaW1wbGVtZW50ZWQsIHdpdGggZXF1YWwgcXVvdGllbnQgcGFydHMgZG9uZSBieSAyLWFkaWMKKyAgIGRpdmlzaW9uIGFuZCB0cnVuY2F0aW5nIGRpdmlzaW9uLiAgU2luY2UgMi1hZGljIGRpdmlzaW9uIGlzIGZhc3RlciwgaXQKKyAgIHNob3VsZCBiZSB1c2VkIGZvciBhIGxhcmdlciBjaHVuay4KKworICAgVGhpcyBjb2RlIGlzIGhvcnJlbmRvdXNseSB1Z2x5LCBpbiBhbGwgc29ydHMgb2Ygd2F5cy4KKworICAgKiBJdCB3YXMgaGFja2VkIHdpdGhvdXQgbXVjaCBjYXJlIG9yIHRob3VnaHQsIGJ1dCB3aXRoIGEgdGVzdGluZyBwcm9ncmFtLgorICAgKiBJdCBoYW5kbGVzIHNjcmF0Y2ggc3BhY2UgZnJpdm9sb3VzbHksIGFuZCBmdXJ0aGVybW9yZSB0aGUgaXRjaCBmdW5jdGlvbgorICAgICBpcyBicm9rZW4uCisgICAqIERvZXNuJ3QgcHJvdmlkZSBhbnkgbWVhc3VyZXMgdG8gZGVhbCB3aXRoIG11X2RpdmFwcHJfcSdzICszIGVycm9yLiAgV2UKKyAgICAgaGF2ZSB5ZXQgdG8gcHJvdm9rZSBhbiBlcnJvciBkdWUgdG8gdGhpcywgdGhvdWdoLgorICAgKiBBbGdvcml0aG0gc2VsZWN0aW9uIGxlYXZlcyBhIGxvdCB0byBiZSBkZXNpcmVkLiAgSW4gcGFydGljdWxhciwgdGhlIGNob2ljZQorICAgICBiZXR3ZWVuIERDIGFuZCBNVSBpc24ndCBhIHBvaW50LCBidXQgd2UgdHJlYXQgaXQgbGlrZSBvbmUuCisgICAqIEl0IG1ha2VzIHRoZSBtc2IgcGFydCAxIG9yIDIgbGltYnMgbGFyZ2VyIHRoYW4gdGhlIGxzYiBwYXJ0LCBpbiBzcGl0ZSBvZgorICAgICB0aGF0IHRoZSBsYXR0ZXIgaXMgZmFzdGVyLiAgV2Ugc2hvdWxkIGF0IGxlYXN0IHJldmVyc2UgdGhpcywgYnV0IHBlcmhhcHMKKyAgICAgd2Ugc2hvdWxkIG1ha2UgdGhlIGxzYiBwYXJ0IGNvbnNpZGVyYWJseSBsYXJnZXIuICAoSG93IGRvIHdlIHR1bmUgdGhpcz8pCisqLworCittcF9zaXplX3QKK21wbl9kaXZleGFjdF9pdGNoIChtcF9zaXplX3Qgbm4sIG1wX3NpemVfdCBkbikKK3sKKyAgcmV0dXJuIG5uICsgZG47CQkvKiBGSVhNRSB0aGlzIGlzIG5vdCByaWdodCAqLworfQorCit2b2lkCittcG5fZGl2ZXhhY3QgKG1wX3B0ciBxcCwKKwkgICAgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwKKwkgICAgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwKKwkgICAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9zaXplX3Qgbm4wLCBxbjA7CisgIG1wX3NpemVfdCBubjEsIHFuMTsKKyAgbXBfcHRyIHRwOworICBtcF9saW1iX3QgcW1sOworICBtcF9saW1iX3QgcWg7CisgIGludCBjbnQ7CisgIG1wX3B0ciB4ZHA7CisgIG1wX2xpbWJfdCBkaTsKKyAgbXBfbGltYl90IGN5OworICBnbXBfcGkxX3QgZGludjsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgcW4gPSBubiAtIGRuICsgMTsKKworICAvKiBGb3Igc21hbGwgZGl2aXNvcnMsIGFuZCBzbWFsbCBxdW90aWVudHMsIGRvbid0IHVzZSBKZWJlbGVhbidzIGFsZ29yaXRobS4gKi8KKyAgaWYgKGRuIDwgRElWRVhBQ1RfSkVCX1RIUkVTSE9MRCB8fCBxbiA8IERJVkVYQUNUX0pFQl9USFJFU0hPTEQpCisgICAgeworICAgICAgdHAgPSBzY3JhdGNoOworICAgICAgTVBOX0NPUFkgKHRwLCBucCwgcW4pOworICAgICAgYmludmVydF9saW1iIChkaSwgZHBbMF0pOyAgZGkgPSAtZGk7CisgICAgICBkbiA9IE1JTiAoZG4sIHFuKTsKKyAgICAgIG1wbl9zYnBpMV9iZGl2X3EgKHFwLCB0cCwgcW4sIGRwLCBkbiwgZGkpOworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHFuMCA9ICgobm4gLSBkbikgPj4gMSkgKyAxOwkvKiBsb3cgcXVvdGllbnQgc2l6ZSAqLworCisgIC8qIElmIHF1b3RpZW50IGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGRpdmlzb3IsIHRoZSBiaWRpcmVjdGlvbmFsIGFsZ29yaXRobQorICAgICBkb2VzIG5vdCB3b3JrIGFzIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gIEZhbGwgYmFjayB0byBwbGFpbiBiZGl2LiAgKi8KKyAgaWYgKHFuMCA+IGRuKQorICAgIHsKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKGRuLCBEQ19CRElWX1FfVEhSRVNIT0xEKSkKKwl7CisJICB0cCA9IHNjcmF0Y2g7CisJICBNUE5fQ09QWSAodHAsIG5wLCBxbik7CisJICBiaW52ZXJ0X2xpbWIgKGRpLCBkcFswXSk7ICBkaSA9IC1kaTsKKwkgIGRuID0gTUlOIChkbiwgcW4pOworCSAgbXBuX3NicGkxX2JkaXZfcSAocXAsIHRwLCBxbiwgZHAsIGRuLCBkaSk7CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgTVVfQkRJVl9RX1RIUkVTSE9MRCkpCisJeworCSAgdHAgPSBzY3JhdGNoOworCSAgTVBOX0NPUFkgKHRwLCBucCwgcW4pOworCSAgYmludmVydF9saW1iIChkaSwgZHBbMF0pOyAgZGkgPSAtZGk7CisJICBtcG5fZGNwaTFfYmRpdl9xIChxcCwgdHAsIHFuLCBkcCwgZG4sIGRpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBuX211X2JkaXZfcSAocXAsIG5wLCBxbiwgZHAsIGRuLCBzY3JhdGNoKTsKKwl9CisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm4wID0gcW4wICsgcW4wOworCisgIG5uMSA9IG5uMCAtIDEgKyAoKG5uLWRuKSAmIDEpOworICBxbjEgPSBxbjA7CisgIGlmIChMSUtFTFkgKHFuMCAhPSBkbikpCisgICAgeworICAgICAgbm4xID0gbm4xICsgMTsKKyAgICAgIHFuMSA9IHFuMSArIDE7CisgICAgICBpZiAoVU5MSUtFTFkgKGRwW2RuIC0gMV0gPT0gMSAmJiBxbjEgIT0gZG4pKQorCXsKKwkgIC8qIElmIHRoZSBsZWFkaW5nIGRpdmlzb3IgbGltYiA9PSAxLCBpLmUuIGhhcyBqdXN0IG9uZSBiaXQsIHdlIGhhdmUKKwkgICAgIHRvIGluY2x1ZGUgYW4gZXh0cmEgbGltYiBpbiBvcmRlciB0byBnZXQgdGhlIG5lZWRlZCBvdmVybGFwLiAgKi8KKwkgIC8qIEZJWE1FOiBOb3cgd2l0aCB0aGUgbXVfZGl2YXBwcl9xIGZ1bmN0aW9uLCB3ZSBzaG91bGQgcmVhbGx5IG5lZWQKKwkgICAgIG1vcmUgb3ZlcmxhcC4gVGhhdCBpbmRpY2F0ZXMgb25lIG9mIHR3byB0aGluZ3M6ICgxKSBUaGUgdGVzdCBjb2RlCisJICAgICBpcyBub3QgZ29vZC4gKDIpIFdlIGFjdHVhbGx5IG92ZXJsYXAgdG9vIG11Y2ggYnkgZGVmYXVsdC4gICovCisJICBubjEgPSBubjEgKyAxOworCSAgcW4xID0gcW4xICsgMTsKKwl9CisgICAgfQorCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChubjEgKyAxKTsKKworICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIGRwW2RuIC0gMV0pOworCisgIC8qIE5vcm1hbGl6ZSBkaXZpc29yLCBzdG9yZSBpbnRvIHRtcCBhcmVhLiAgKi8KKyAgaWYgKGNudCAhPSAwKQorICAgIHsKKyAgICAgIHhkcCA9IFRNUF9BTExPQ19MSU1CUyAocW4xKTsKKyAgICAgIG1wbl9sc2hpZnQgKHhkcCwgZHAgKyBkbiAtIHFuMSwgcW4xLCBjbnQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHhkcCA9IChtcF9wdHIpIGRwICsgZG4gLSBxbjE7CisgICAgfQorCisgIC8qIFNoaWZ0IGRpdmlkZW5kIGFjY29yZGluZyB0byB0aGUgZGl2aXNvciBub3JtYWxpemF0aW9uLiAgKi8KKyAgLyogRklYTUU6IFdlIGNvbXB1dGUgdG9vIG11Y2ggaGVyZSBmb3IgWFhfZGl2YXBwcl9xLCBidXQgdGhlc2UgZnVuY3Rpb25zJworICAgICBpbnRlcmZhY2VzIHdhbnQgYSBwb2ludGVyIHRvIHRoZSBpbWFnaW5hdGl2ZSBsZWFzdCBzaWduaWZpY2FudCBsaW1iLCBub3QKKyAgICAgdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50ICp1c2VkKiBsaW1iLiAgT2YgY291cnNlLCB3ZSBjb3VsZCBsZWF2ZSBubjEtcW4xCisgICAgIHJ1YmJpc2ggbGltYnMgaW4gdGhlIGxvdyBwYXJ0LCB0byBzYXZlIHNvbWUgdGltZS4gICovCisgIGlmIChjbnQgIT0gMCkKKyAgICB7CisgICAgICBjeSA9IG1wbl9sc2hpZnQgKHRwLCBucCArIG5uIC0gbm4xLCBubjEsIGNudCk7CisgICAgICBpZiAoY3kgIT0gMCkKKwl7CisJICB0cFtubjFdID0gY3k7CisJICBubjErKzsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRklYTUU6IFRoaXMgY29weSBpcyBub3QgbmVlZGVkIGZvciBtcG5fbXVfZGl2YXBwcl9xLCBleGNlcHQgd2hlbiB0aGUKKwkgbXBuX3N1Yl9uIHJpZ2h0IGJlZm9yZSBpcyBleGVjdXRlZC4gICovCisgICAgICBNUE5fQ09QWSAodHAsIG5wICsgbm4gLSBubjEsIG5uMSk7CisgICAgfQorCisgIGludmVydF9waTEgKGRpbnYsIHhkcFtxbjEgLSAxXSwgeGRwW3FuMSAtIDJdKTsKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4xLCBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBxcFtxbjAgLSAxICsgbm4xIC0gcW4xXSA9IG1wbl9zYnBpMV9kaXZhcHByX3EgKHFwICsgcW4wIC0gMSwgdHAsIG5uMSwgeGRwLCBxbjEsIGRpbnYuaW52MzIpOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChxbjEsIE1VX0RJVkFQUFJfUV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIHFwW3FuMCAtIDEgKyBubjEgLSBxbjFdID0gbXBuX2RjcGkxX2RpdmFwcHJfcSAocXAgKyBxbjAgLSAxLCB0cCwgbm4xLCB4ZHAsIHFuMSwgJmRpbnYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBtcG5fbXVfZGl2YXBwcl9xIGRvZXNuJ3QgaGFuZGxlIHFoICE9IDAuICBXb3JrIGFyb3VuZCBpdCB3aXRoIGEKKwkgY29uZGl0aW9uYWwgc3VidHJhY3Rpb24gaGVyZS4gICovCisgICAgICBxaCA9IG1wbl9jbXAgKHRwICsgbm4xIC0gcW4xLCB4ZHAsIHFuMSkgPj0gMDsKKyAgICAgIGlmIChxaCkKKwltcG5fc3ViX24gKHRwICsgbm4xIC0gcW4xLCB0cCArIG5uMSAtIHFuMSwgeGRwLCBxbjEpOworICAgICAgbXBuX211X2RpdmFwcHJfcSAocXAgKyBxbjAgLSAxLCB0cCwgbm4xLCB4ZHAsIHFuMSwgc2NyYXRjaCk7CisgICAgICBxcFtxbjAgLSAxICsgbm4xIC0gcW4xXSA9IHFoOworICAgIH0KKyAgcW1sID0gcXBbcW4wIC0gMV07CisKKyAgYmludmVydF9saW1iIChkaSwgZHBbMF0pOyAgZGkgPSAtZGk7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4wLCBEQ19CRElWX1FfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBNUE5fQ09QWSAodHAsIG5wLCBxbjApOworICAgICAgbXBuX3NicGkxX2JkaXZfcSAocXAsIHRwLCBxbjAsIGRwLCBxbjAsIGRpKTsKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4wLCBNVV9CRElWX1FfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBNUE5fQ09QWSAodHAsIG5wLCBxbjApOworICAgICAgbXBuX2RjcGkxX2JkaXZfcSAocXAsIHRwLCBxbjAsIGRwLCBxbjAsIGRpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcG5fbXVfYmRpdl9xIChxcCwgbnAsIHFuMCwgZHAsIHFuMCwgc2NyYXRjaCk7CisgICAgfQorCisgIGlmIChxbWwgPCBxcFtxbjAgLSAxXSkKKyAgICBtcG5fZGVjcl91IChxcCArIHFuMCwgMSk7CisKKyAgVE1QX0ZSRUU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2RpdmlzLmMgYi9tcG4vZ2VuZXJpYy9kaXZpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODlkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZpcy5jCkBAIC0wLDAgKzEsMTk0IEBACisvKiBtcG5fZGl2aXNpYmxlX3AgLS0gbXBuIGJ5IG1wbiBkaXZpc2liaWxpdHkgdGVzdAorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTQsIDIwMTcsIDIwMTggRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIERldGVybWluZSB3aGV0aGVyIEE9e2FwLGFufSBpcyBkaXZpc2libGUgYnkgRD17ZHAsZG59LiAgTXVzdCBoYXZlIGJvdGgKKyAgIG9wZXJhbmRzIG5vcm1hbGl6ZWQsIG1lYW5pbmcgaGlnaCBsaW1icyBub24temVybywgZXhjZXB0IHRoYXQgYW49PTAgaXMKKyAgIGFsbG93ZWQuCisKKyAgIFRoZXJlIHVzdWFsbHkgd29uJ3QgYmUgbWFueSBsb3cgemVybyBiaXRzIG9uIEQsIGJ1dCB0aGUgY2hlY2tzIGZvciB0aGlzCisgICBhcmUgZmFzdCBhbmQgbWlnaHQgcGljayB1cCBhIGZldyBvcGVyYW5kIGNvbWJpbmF0aW9ucywgaW4gcGFydGljdWxhciB0aGV5CisgICBtaWdodCByZWR1Y2UgRCB0byBmaXQgdGhlIHNpbmdsZS1saW1iIG1vZF8xL21vZGV4YWN0XzEgY29kZS4KKworICAgRnV0dXJlOgorCisgICBHZXR0aW5nIHRoZSByZW1haW5kZXIgbGltYiBieSBsaW1iIHdvdWxkIG1ha2UgYW4gZWFybHkgZXhpdCBwb3NzaWJsZSBvbgorICAgZmluZGluZyBhIG5vbi16ZXJvLiAgVGhpcyB3b3VsZCBwcm9iYWJseSBoYXZlIHRvIGJlIGJkaXZtb2Qgc3R5bGUgc28KKyAgIHRoZXJlJ3Mgbm8gYWRkYmFjaywgYnV0IGl0IHdvdWxkIG5lZWQgYSBtdWx0aS1wcmVjaXNpb24gaW52ZXJzZSBhbmQgc28KKyAgIG1pZ2h0IGJlIHNsb3dlciB0aGFuIHRoZSBwbGFpbiBtZXRob2QgKG9uIHNtYWxsIHNpemVzIGF0IGxlYXN0KS4KKworICAgV2hlbiBEIG11c3QgYmUgbm9ybWFsaXplZCAoc2hpZnRlZCB0byBsb3cgYml0IHNldCksIGl0J3MgcG9zc2libGUgdG8KKyAgIHN1cHByZXNzIHRoZSBiaXQtc2hpZnRpbmcgb2YgQSBkb3duLCBhcyBsb25nIGFzIGl0J3MgYWxyZWFkeSBiZWVuIGNoZWNrZWQKKyAgIHRoYXQgQSBoYXMgYXQgbGVhc3QgYXMgbWFueSB0cmFpbGluZyB6ZXJvIGJpdHMgYXMgRC4gICovCisKK2ludAorbXBuX2RpdmlzaWJsZV9wIChtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwKKwkJIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuKQoreworICBtcF9saW1iX3QgIGFsb3csIGRsb3csIGRtYXNrOworICBtcF9wdHIgICAgIHFwLCBycCwgdHA7CisgIG1wX2xpbWJfdCBkaTsKKyAgdW5zaWduZWQgIHR3b3M7CisgIGludCBjOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGFuID49IDApOworICBBU1NFUlQgKGFuID09IDAgfHwgYXBbYW4tMV0gIT0gMCk7CisgIEFTU0VSVCAoZG4gPj0gMSk7CisgIEFTU0VSVCAoZHBbZG4tMV0gIT0gMCk7CisgIEFTU0VSVF9NUE4gKGFwLCBhbik7CisgIEFTU0VSVF9NUE4gKGRwLCBkbik7CisKKyAgLyogV2hlbiBhPGQgb25seSBhPT0wIGlzIGRpdmlzaWJsZS4KKyAgICAgTm90aWNlIHRoaXMgdGVzdCBjb3ZlcnMgYWxsIGNhc2VzIG9mIGFuPT0wLiAqLworICBpZiAoYW4gPCBkbikKKyAgICByZXR1cm4gKGFuID09IDApOworCisgIC8qIFN0cmlwIGxvdyB6ZXJvIGxpbWJzIGZyb20gZCwgcmVxdWlyaW5nIGE9PTAgb24gdGhvc2UuICovCisgIGZvciAoOzspCisgICAgeworICAgICAgYWxvdyA9ICphcDsKKyAgICAgIGRsb3cgPSAqZHA7CisKKyAgICAgIGlmIChkbG93ICE9IDApCisJYnJlYWs7CisKKyAgICAgIGlmIChhbG93ICE9IDApCisJcmV0dXJuIDA7ICAvKiBhIGhhcyBmZXdlciBsb3cgemVybyBsaW1icyB0aGFuIGQsIHNvIG5vdCBkaXZpc2libGUgKi8KKworICAgICAgLyogYSE9MCBhbmQgZCE9MCBzbyB3b24ndCBnZXQgdG8gbj09MCAqLworICAgICAgYW4tLTsgQVNTRVJUIChhbiA+PSAxKTsKKyAgICAgIGRuLS07IEFTU0VSVCAoZG4gPj0gMSk7CisgICAgICBhcCsrOworICAgICAgZHArKzsKKyAgICB9CisKKyAgLyogYSBtdXN0IGhhdmUgYXQgbGVhc3QgYXMgbWFueSBsb3cgemVybyBiaXRzIGFzIGQgKi8KKyAgZG1hc2sgPSBMT1dfWkVST1NfTUFTSyAoZGxvdyk7CisgIGlmICgoYWxvdyAmIGRtYXNrKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChkbiA9PSAxKQorICAgIHsKKyAgICAgIGlmIChBQk9WRV9USFJFU0hPTEQgKGFuLCBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEKSkKKwlyZXR1cm4gbXBuX21vZF8xIChhcCwgYW4sIGRsb3cpID09IDA7CisKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBkbG93KTsKKyAgICAgIGRsb3cgPj49IHR3b3M7CisgICAgICByZXR1cm4gbXBuX21vZGV4YWN0XzFfb2RkIChhcCwgYW4sIGRsb3cpID09IDA7CisgICAgfQorCisgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBkbG93KTsKKyAgaWYgKGRuID09IDIpCisgICAgeworICAgICAgbXBfbGltYl90ICBkc2Vjb25kID0gZHBbMV07CisgICAgICBpZiAoZHNlY29uZCA8PSBkbWFzaykKKwl7CisJICBkbG93ID0gKGRsb3cgPj4gdHdvcykgfCAoZHNlY29uZCA8PCAoR01QX05VTUJfQklUUy10d29zKSk7CisJICBBU1NFUlRfTElNQiAoZGxvdyk7CisJICByZXR1cm4gTVBOX01PRF9PUl9NT0RFWEFDVF8xX09ERCAoYXAsIGFuLCBkbG93KSA9PSAwOworCX0KKyAgICB9CisKKyAgLyogU2hvdWxkIHdlIGNvbXB1dGUgUSA9IEEgKiBEXigtMSkgbW9kIEJeaywKKyAgICAgICAgICAgICAgICAgICAgICAgUiA9IEEgLSBRICogRCAgbW9kIEJeaworICAgICBoZXJlLCBmb3Igc29tZSBzbWFsbCB2YWx1ZXMgb2Ygaz8gIFRoZW4gY2hlY2sgaWYgUiA9IDAgKG1vZCBCXmspLiAgKi8KKworICAvKiBXZSBjb3VsZCBhbHNvIGNvbXB1dGUgQScgPSBBIG1vZCBUIGFuZCBEJyA9IEQgbW9kIFAsIGZvciBzb21lCisgICAgIFAgPSAzICogNSAqIDcgKiAxMSAuLi4sIGFuZCB0aGVuIGNoZWNrIGlmIGFueSBwcmltZSBmYWN0b3IgZnJvbSBQCisgICAgIGRpdmlkaW5nIEQnIGFsc28gZGl2aWRlcyBBJy4gICovCisKKyAgVE1QX01BUks7CisKKyAgVE1QX0FMTE9DX0xJTUJTXzIgKHJwLCBhbiArIDEsCisJCSAgICAgcXAsIGFuIC0gZG4gKyAxKTsgLyogRklYTUU6IENvdWxkIHdlIGF2b2lkIHRoaXM/ICovCisKKyAgaWYgKHR3b3MgIT0gMCkKKyAgICB7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoZG4pOworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9yc2hpZnQgKHRwLCBkcCwgZG4sIHR3b3MpKTsKKyAgICAgIGRwID0gdHA7CisKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fcnNoaWZ0IChycCwgYXAsIGFuLCB0d29zKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgTVBOX0NPUFkgKHJwLCBhcCwgYW4pOworICAgIH0KKyAgaWYgKHJwW2FuIC0gMV0gPj0gZHBbZG4gLSAxXSkKKyAgICB7CisgICAgICBycFthbl0gPSAwOworICAgICAgYW4rKzsKKyAgICB9CisgIGVsc2UgaWYgKGFuID09IGRuKQorICAgIHsKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIEFTU0VSVCAoYW4gPiBkbik7CQkvKiByZXF1aXJlbWVudCBvZiBmdW5jdGlvbnMgYmVsb3cgKi8KKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgRENfQkRJVl9RUl9USFJFU0hPTEQpIHx8CisgICAgICBCRUxPV19USFJFU0hPTEQgKGFuIC0gZG4sIERDX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBiaW52ZXJ0X2xpbWIgKGRpLCBkcFswXSk7CisgICAgICBtcG5fc2JwaTFfYmRpdl9xciAocXAsIHJwLCBhbiwgZHAsIGRuLCAtZGkpOworICAgICAgcnAgKz0gYW4gLSBkbjsKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAoZG4sIE1VX0JESVZfUVJfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBiaW52ZXJ0X2xpbWIgKGRpLCBkcFswXSk7CisgICAgICBtcG5fZGNwaTFfYmRpdl9xciAocXAsIHJwLCBhbiwgZHAsIGRuLCAtZGkpOworICAgICAgcnAgKz0gYW4gLSBkbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX211X2JkaXZfcXJfaXRjaCAoYW4sIGRuKSk7CisgICAgICBtcG5fbXVfYmRpdl9xciAocXAsIHJwLCBycCwgYW4sIGRwLCBkbiwgdHApOworICAgIH0KKworICAvKiBJbiBnZW5lcmFsLCBiZGl2IG1heSByZXR1cm4gZWl0aGVyIFIgPSAwIG9yIFIgPSBEIHdoZW4gRCBkaXZpZGVzCisgICAgIEEuIEJ1dCBSID0gMCBjYW4gaGFwcGVuIG9ubHkgd2hlbiBBID0gMCwgd2hpY2ggd2UgYWxyZWFkeSBoYXZlCisgICAgIGV4Y2x1ZGVkLiBGdXJ0aGVybW9yZSwgUiA9PSBEIChtb2QgQl57ZG59KSBpbXBsaWVzIG5vIGNhcnJ5LCBzbworICAgICB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBjYXJyeSByZXR1cm5lZCBmcm9tIGJkaXYuICovCisKKyAgTVBOX0NNUCAoYywgcnAsIGRwLCBkbik7CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBjID09IDA7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZyZW0uYyBiL21wbi9nZW5lcmljL2RpdnJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYTg0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kaXZyZW0uYwpAQCAtMCwwICsxLDEwMyBAQAorLyogbXBuX2RpdnJlbSAtLSBEaXZpZGUgbmF0dXJhbCBudW1iZXJzLCBwcm9kdWNpbmcgYm90aCByZW1haW5kZXIgYW5kCisgICBxdW90aWVudC4gIFRoaXMgaXMgbm93IGp1c3QgYSBtaWRkbGUgbGF5ZXIgY2FsbGluZyBtcG5fdGRpdl9xci4KKworQ29weXJpZ2h0IDE5OTMtMTk5NywgMTk5OS0yMDAyLCAyMDA1LCAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcF9saW1iX3QKK21wbl9kaXZyZW0gKG1wX3B0ciBxcCwgbXBfc2l6ZV90IHF4biwKKwkgICAgbXBfcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuKQoreworICBBU1NFUlQgKHF4biA+PSAwKTsKKyAgQVNTRVJUIChubiA+PSBkbik7CisgIEFTU0VSVCAoZG4gPj0gMSk7CisgIEFTU0VSVCAoZHBbZG4tMV0gJiBHTVBfTlVNQl9ISUdIQklUKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKG5wLCBubiwgZHAsIGRuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChxcCwgbm4tZG4rcXhuLCBucCwgbm4pIHx8IHFwPT1ucCtkbitxeG4pOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocXAsIG5uLWRuK3F4biwgZHAsIGRuKSk7CisgIEFTU0VSVF9NUE4gKG5wLCBubik7CisgIEFTU0VSVF9NUE4gKGRwLCBkbik7CisKKyAgaWYgKGRuID09IDEpCisgICAgeworICAgICAgbXBfbGltYl90IHJldDsKKyAgICAgIG1wX3B0ciBxMnA7CisgICAgICBtcF9zaXplX3QgcW47CisgICAgICBUTVBfREVDTDsKKworICAgICAgVE1QX01BUks7CisgICAgICBxMnAgPSBUTVBfQUxMT0NfTElNQlMgKG5uICsgcXhuKTsKKworICAgICAgbnBbMF0gPSBtcG5fZGl2cmVtXzEgKHEycCwgcXhuLCBucCwgbm4sIGRwWzBdKTsKKyAgICAgIHFuID0gbm4gKyBxeG4gLSAxOworICAgICAgTVBOX0NPUFkgKHFwLCBxMnAsIHFuKTsKKyAgICAgIHJldCA9IHEycFtxbl07CisKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIGVsc2UgaWYgKGRuID09IDIpCisgICAgeworICAgICAgcmV0dXJuIG1wbl9kaXZyZW1fMiAocXAsIHF4biwgbnAsIG5uLCBkcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfcHRyIHEycDsKKyAgICAgIG1wX2xpbWJfdCBxaGw7CisgICAgICBtcF9zaXplX3QgcW47CisgICAgICBUTVBfREVDTDsKKworICAgICAgVE1QX01BUks7CisgICAgICBpZiAoVU5MSUtFTFkgKHF4biAhPSAwKSkKKwl7CisJICBtcF9wdHIgbjJwOworCSAgVE1QX0FMTE9DX0xJTUJTXzIgKG4ycCwgbm4gKyBxeG4sCisJCQkgICAgIHEycCwgbm4gLSBkbiArIHF4biArIDEpOworCSAgTVBOX1pFUk8gKG4ycCwgcXhuKTsKKwkgIE1QTl9DT1BZIChuMnAgKyBxeG4sIG5wLCBubik7CisJICBtcG5fdGRpdl9xciAocTJwLCBucCwgMEwsIG4ycCwgbm4gKyBxeG4sIGRwLCBkbik7CisJICBxbiA9IG5uIC0gZG4gKyBxeG47CisJICBNUE5fQ09QWSAocXAsIHEycCwgcW4pOworCSAgcWhsID0gcTJwW3FuXTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcTJwID0gVE1QX0FMTE9DX0xJTUJTIChubiAtIGRuICsgMSk7CisJICBtcG5fdGRpdl9xciAocTJwLCBucCwgMEwsIG5wLCBubiwgZHAsIGRuKTsKKwkgIHFuID0gbm4gLSBkbjsKKwkgIE1QTl9DT1BZIChxcCwgcTJwLCBxbik7CisJICBxaGwgPSBxMnBbcW5dOworCX0KKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuIHFobDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZyZW1fMS5jIGIvbXBuL2dlbmVyaWMvZGl2cmVtXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNhYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZGl2cmVtXzEuYwpAQCAtMCwwICsxLDI1NCBAQAorLyogbXBuX2RpdnJlbV8xIC0tIG1wbiBieSBsaW1iIGRpdmlzaW9uLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5OC0yMDAwLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBUaGUgc2l6ZSB3aGVyZSB1ZGl2X3Fybm5kX3ByZWludiBzaG91bGQgYmUgdXNlZCByYXRoZXIgdGhhbiB1ZGl2X3Fybm5kLAorICAgbWVhbmluZyB0aGUgcXVvdGllbnQgc2l6ZSB3aGVyZSB0aGF0IHNob3VsZCBoYXBwZW4sIHRoZSBxdW90aWVudCBzaXplCisgICBiZWluZyBob3cgbWFueSB1ZGl2IGRpdmlzaW9ucyB3aWxsIGJlIGRvbmUuCisKKyAgIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBwcmVpbnYgYWx3YXlzLCBDUFVzIHdoZXJlIHRoaXMgZG9lc24ndCBzdWl0IGhhdmUKKyAgIHR1bmVkIHRocmVzaG9sZHMuICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBwcmVpbnYgc2hvdWxkIGNlcnRhaW5seSBiZQorICAgdXNlZCBpZiB0aGF0J3MgdGhlIG9ubHkgZGl2aXNpb24gYXZhaWxhYmxlIChVU0VfUFJFSU5WX0FMV0FZUykuICAqLworCisjaWZuZGVmIERJVlJFTV8xX05PUk1fVEhSRVNIT0xECisjZGVmaW5lIERJVlJFTV8xX05PUk1fVEhSRVNIT0xEICAwCisjZW5kaWYKKyNpZm5kZWYgRElWUkVNXzFfVU5OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBESVZSRU1fMV9VTk5PUk1fVEhSRVNIT0xEICAwCisjZW5kaWYKKworCisKKy8qIElmIHRoZSBjcHUgb25seSBoYXMgbXVsdGlwbHktYnktaW52ZXJzZSBkaXZpc2lvbiAoZWcuIGFscGhhKSwgdGhlbiBOT1JNCisgICBhbmQgVU5OT1JNIHRocmVzaG9sZHMgYXJlIDAgYW5kIG9ubHkgdGhlIGludmVyc2lvbiBjb2RlIGlzIGluY2x1ZGVkLgorCisgICBJZiBtdWx0aXBseS1ieS1pbnZlcnNlIGlzIG5ldmVyIHZpYWJsZSwgdGhlbiBOT1JNIGFuZCBVTk5PUk0gdGhyZXNob2xkcworICAgd2lsbCBiZSBNUF9TSVpFX1RfTUFYIGFuZCBvbmx5IHRoZSBwbGFpbiBkaXZpc2lvbiBjb2RlIGlzIGluY2x1ZGVkLgorCisgICBPdGhlcndpc2UgbXVsLWJ5LWludmVyc2UgaXMgYmV0dGVyIHRoYW4gcGxhaW4gZGl2aXNpb24gYWJvdmUgc29tZQorICAgdGhyZXNob2xkLCBhbmQgYmVzdCByZXN1bHRzIGFyZSBvYnRhaW5lZCBieSBoYXZpbmcgY29kZSBmb3IgYm90aCBwcmVzZW50LgorCisgICBUaGUgbWFpbiByZWFzb24gZm9yIHNlcGFyYXRpbmcgdGhlIG5vcm0gYW5kIHVubm9ybSBjYXNlcyBpcyB0aGF0IG5vdCBhbGwKKyAgIENQVXMgZ2l2ZSB6ZXJvIGZvciAibjAgPj4gR01QX0xJTUJfQklUUyIgd2hpY2ggd291bGQgYXJpc2UgaW4gdGhlIHVubm9ybQorICAgY29kZSB1c2VkIG9uIGFuIGFscmVhZHkgbm9ybWFsaXplZCBkaXZpc29yLgorCisgICBJZiBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZmFsc2UgdGhlbiBwbGFpbiBkaXZpc2lvbiB1c2VzIHRoZSBzYW1lCisgICBub24tc2hpZnRpbmcgY29kZSBmb3IgYm90aCB0aGUgbm9ybSBhbmQgdW5ub3JtIGNhc2VzLCB0aG91Z2ggd2l0aAorICAgZGlmZmVyZW50IGNyaXRlcmlhIGZvciBza2lwcGluZyBhIGRpdmlzaW9uLCBhbmQgd2l0aCBkaWZmZXJlbnQgdGhyZXNob2xkcworICAgb2YgY291cnNlLiAgQW5kIGluIGZhY3QgaWYgaW52ZXJzaW9uIGlzIG5ldmVyIHZpYWJsZSwgdGhlbiB0aGF0IHNpbXBsZQorICAgbm9uLXNoaWZ0aW5nIGRpdmlzaW9uIHdvdWxkIGJlIGFsbCB0aGF0J3MgbGVmdC4KKworICAgVGhlIE5PUk0gYW5kIFVOTk9STSB0aHJlc2hvbGRzIG1pZ2h0IG5vdCBkaWZmZXIgbXVjaCwgYnV0IGlmIHRoZXJlJ3MKKyAgIGdvaW5nIHRvIGJlIHNlcGFyYXRlIGNvZGUgZm9yIG5vcm0gYW5kIHVubm9ybSB0aGVuIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUKKyAgIHNlcGFyYXRlIHRocmVzaG9sZHMuICBPbmUgdGhpbmcgdGhhdCdzIHBvc3NpYmxlIGlzIHRoYXQgdGhlCisgICBtdWwtYnktaW52ZXJzZSBtaWdodCBiZSBiZXR0ZXIgb25seSBmb3Igbm9ybWFsaXplZCBkaXZpc29ycywgZHVlIHRvIHRoYXQKKyAgIGNhc2Ugbm90IG5lZWRpbmcgdmFyaWFibGUgYml0IHNoaWZ0cy4KKworICAgTm90aWNlIHRoYXQgdGhlIHRocmVzaG9sZHMgYXJlIHRlc3RlZCBhZnRlciB0aGUgZGVjaXNpb24gdG8gcG9zc2libHkgc2tpcAorICAgb25lIGRpdmlkZSBzdGVwLCBzbyB0aGV5J3JlIGJhc2VkIG9uIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGRpdmlzaW9ucyBkb25lLgorCisgICBGb3IgdGhlIHVubm9ybSBjYXNlLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBjYWxsIG1wbl9sc2hpZnQgdG8gYWRqdXN0CisgICB0aGUgZGl2aWRlbmQgYWxsIGluIG9uZSBnbyAoaW50byB0aGUgcXVvdGllbnQgc3BhY2Ugc2F5KSwgcmF0aGVyIHRoYW4KKyAgIGxpbWItYnktbGltYiBpbiB0aGUgbG9vcC4gIFRoaXMgbWlnaHQgaGVscCBpZiBtcG5fbHNoaWZ0IGlzIGEgbG90IGZhc3RlcgorICAgdGhhbiB3aGF0IHRoZSBjb21waWxlciBjYW4gZ2VuZXJhdGUgZm9yIEVYVFJBQ1QuICBCdXQgdGhpcyBpcyBsZWZ0IHRvIENQVQorICAgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIGNvbnNpZGVyLCBlc3BlY2lhbGx5IHNpbmNlIEVYVFJBQ1QgaXNuJ3Qgb24KKyAgIHRoZSBkZXBlbmRlbnQgY2hhaW4uICAqLworCittcF9saW1iX3QKK21wbl9kaXZyZW1fMSAobXBfcHRyIHFwLCBtcF9zaXplX3QgcXhuLAorCSAgICAgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9saW1iX3QgZCkKK3sKKyAgbXBfc2l6ZV90ICBuOworICBtcF9zaXplX3QgIGk7CisgIG1wX2xpbWJfdCAgbjEsIG4wOworICBtcF9saW1iX3QgIHIgPSAwOworCisgIEFTU0VSVCAocXhuID49IDApOworICBBU1NFUlQgKHVuID49IDApOworICBBU1NFUlQgKGQgIT0gMCk7CisgIC8qIEZJWE1FOiBXaGF0J3MgdGhlIGNvcnJlY3Qgb3ZlcmxhcCBydWxlIHdoZW4gcXhuIT0wPyAqLworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKHFwK3F4biwgdXAsIHVuKSk7CisKKyAgbiA9IHVuICsgcXhuOworICBpZiAobiA9PSAwKQorICAgIHJldHVybiAwOworCisgIGQgPDw9IEdNUF9OQUlMX0JJVFM7CisKKyAgcXAgKz0gKG4gLSAxKTsgICAvKiBNYWtlIHFwIHBvaW50IGF0IG1vc3Qgc2lnbmlmaWNhbnQgcXVvdGllbnQgbGltYiAqLworCisgIGlmICgoZCAmIEdNUF9MSU1CX0hJR0hCSVQpICE9IDApCisgICAgeworICAgICAgaWYgKHVuICE9IDApCisJeworCSAgLyogSGlnaCBxdW90aWVudCBsaW1iIGlzIDAgb3IgMSwgc2tpcCBhIGRpdmlkZSBzdGVwLiAqLworCSAgbXBfbGltYl90IHE7CisJICByID0gdXBbdW4gLSAxXSA8PCBHTVBfTkFJTF9CSVRTOworCSAgcSA9IChyID49IGQpOworCSAgKnFwLS0gPSBxOworCSAgciAtPSAoZCAmIC1xKTsKKwkgIHIgPj49IEdNUF9OQUlMX0JJVFM7CisJICBuLS07CisJICB1bi0tOworCX0KKworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgRElWUkVNXzFfTk9STV9USFJFU0hPTEQpKQorCXsKKwlwbGFpbjoKKwkgIGZvciAoaSA9IHVuIC0gMTsgaSA+PSAwOyBpLS0pCisJICAgIHsKKwkgICAgICBuMCA9IHVwW2ldIDw8IEdNUF9OQUlMX0JJVFM7CisJICAgICAgdWRpdl9xcm5uZCAoKnFwLCByLCByLCBuMCwgZCk7CisJICAgICAgciA+Pj0gR01QX05BSUxfQklUUzsKKwkgICAgICBxcC0tOworCSAgICB9CisJICBmb3IgKGkgPSBxeG4gLSAxOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIHVkaXZfcXJubmQgKCpxcCwgciwgciwgQ05TVF9MSU1CKDApLCBkKTsKKwkgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIHFwLS07CisJICAgIH0KKwkgIHJldHVybiByOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBNdWx0aXBseS1ieS1pbnZlcnNlLCBkaXZpc29yIGFscmVhZHkgbm9ybWFsaXplZC4gKi8KKwkgIG1wX2xpbWJfdCBkaW52OworCSAgaW52ZXJ0X2xpbWIgKGRpbnYsIGQpOworCisJICBmb3IgKGkgPSB1biAtIDE7IGkgPj0gMDsgaS0tKQorCSAgICB7CisJICAgICAgbjAgPSB1cFtpXSA8PCBHTVBfTkFJTF9CSVRTOworCSAgICAgIHVkaXZfcXJubmRfcHJlaW52ICgqcXAsIHIsIHIsIG4wLCBkLCBkaW52KTsKKwkgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIHFwLS07CisJICAgIH0KKwkgIGZvciAoaSA9IHF4biAtIDE7IGkgPj0gMDsgaS0tKQorCSAgICB7CisJICAgICAgdWRpdl9xcm5uZF9wcmVpbnYgKCpxcCwgciwgciwgQ05TVF9MSU1CKDApLCBkLCBkaW52KTsKKwkgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIHFwLS07CisJICAgIH0KKwkgIHJldHVybiByOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBNb3N0IHNpZ25pZmljYW50IGJpdCBvZiBkaXZpc29yID09IDAuICAqLworICAgICAgaW50IGNudDsKKworICAgICAgLyogU2tpcCBhIGRpdmlzaW9uIGlmIGhpZ2ggPCBkaXZpc29yIChoaWdoIHF1b3RpZW50IDApLiAgVGVzdGluZyBoZXJlCisJIGJlZm9yZSBub3JtYWxpemluZyB3aWxsIHN0aWxsIHNraXAgYXMgb2Z0ZW4gYXMgcG9zc2libGUuICAqLworICAgICAgaWYgKHVuICE9IDApCisJeworCSAgbjEgPSB1cFt1biAtIDFdIDw8IEdNUF9OQUlMX0JJVFM7CisJICBpZiAobjEgPCBkKQorCSAgICB7CisJICAgICAgciA9IG4xID4+IEdNUF9OQUlMX0JJVFM7CisJICAgICAgKnFwLS0gPSAwOworCSAgICAgIG4tLTsKKwkgICAgICBpZiAobiA9PSAwKQorCQlyZXR1cm4gcjsKKwkgICAgICB1bi0tOworCSAgICB9CisJfQorCisgICAgICBpZiAoISBVRElWX05FRURTX05PUk1BTElaQVRJT04KKwkgICYmIEJFTE9XX1RIUkVTSE9MRCAobiwgRElWUkVNXzFfVU5OT1JNX1RIUkVTSE9MRCkpCisJZ290byBwbGFpbjsKKworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBkKTsKKyAgICAgIGQgPDw9IGNudDsKKyAgICAgIHIgPDw9IGNudDsKKworICAgICAgaWYgKFVESVZfTkVFRFNfTk9STUFMSVpBVElPTgorCSAgJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBESVZSRU1fMV9VTk5PUk1fVEhSRVNIT0xEKSkKKwl7CisJICBtcF9saW1iX3QgbnNoaWZ0OworCSAgaWYgKHVuICE9IDApCisJICAgIHsKKwkgICAgICBuMSA9IHVwW3VuIC0gMV0gPDwgR01QX05BSUxfQklUUzsKKwkgICAgICByIHw9IChuMSA+PiAoR01QX0xJTUJfQklUUyAtIGNudCkpOworCSAgICAgIGZvciAoaSA9IHVuIC0gMjsgaSA+PSAwOyBpLS0pCisJCXsKKwkJICBuMCA9IHVwW2ldIDw8IEdNUF9OQUlMX0JJVFM7CisJCSAgbnNoaWZ0ID0gKG4xIDw8IGNudCkgfCAobjAgPj4gKEdNUF9OVU1CX0JJVFMgLSBjbnQpKTsKKwkJICB1ZGl2X3Fybm5kICgqcXAsIHIsIHIsIG5zaGlmdCwgZCk7CisJCSAgciA+Pj0gR01QX05BSUxfQklUUzsKKwkJICBxcC0tOworCQkgIG4xID0gbjA7CisJCX0KKwkgICAgICB1ZGl2X3Fybm5kICgqcXAsIHIsIHIsIG4xIDw8IGNudCwgZCk7CisJICAgICAgciA+Pj0gR01QX05BSUxfQklUUzsKKwkgICAgICBxcC0tOworCSAgICB9CisJICBmb3IgKGkgPSBxeG4gLSAxOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIHVkaXZfcXJubmQgKCpxcCwgciwgciwgQ05TVF9MSU1CKDApLCBkKTsKKwkgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIHFwLS07CisJICAgIH0KKwkgIHJldHVybiByID4+IGNudDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfbGltYl90ICBkaW52LCBuc2hpZnQ7CisJICBpbnZlcnRfbGltYiAoZGludiwgZCk7CisJICBpZiAodW4gIT0gMCkKKwkgICAgeworCSAgICAgIG4xID0gdXBbdW4gLSAxXSA8PCBHTVBfTkFJTF9CSVRTOworCSAgICAgIHIgfD0gKG4xID4+IChHTVBfTElNQl9CSVRTIC0gY250KSk7CisJICAgICAgZm9yIChpID0gdW4gLSAyOyBpID49IDA7IGktLSkKKwkJeworCQkgIG4wID0gdXBbaV0gPDwgR01QX05BSUxfQklUUzsKKwkJICBuc2hpZnQgPSAobjEgPDwgY250KSB8IChuMCA+PiAoR01QX05VTUJfQklUUyAtIGNudCkpOworCQkgIHVkaXZfcXJubmRfcHJlaW52ICgqcXAsIHIsIHIsIG5zaGlmdCwgZCwgZGludik7CisJCSAgciA+Pj0gR01QX05BSUxfQklUUzsKKwkJICBxcC0tOworCQkgIG4xID0gbjA7CisJCX0KKwkgICAgICB1ZGl2X3Fybm5kX3ByZWludiAoKnFwLCByLCByLCBuMSA8PCBjbnQsIGQsIGRpbnYpOworCSAgICAgIHIgPj49IEdNUF9OQUlMX0JJVFM7CisJICAgICAgcXAtLTsKKwkgICAgfQorCSAgZm9yIChpID0gcXhuIC0gMTsgaSA+PSAwOyBpLS0pCisJICAgIHsKKwkgICAgICB1ZGl2X3Fybm5kX3ByZWludiAoKnFwLCByLCByLCBDTlNUX0xJTUIoMCksIGQsIGRpbnYpOworCSAgICAgIHIgPj49IEdNUF9OQUlMX0JJVFM7CisJICAgICAgcXAtLTsKKwkgICAgfQorCSAgcmV0dXJuIHIgPj4gY250OworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9kaXZyZW1fMi5jIGIvbXBuL2dlbmVyaWMvZGl2cmVtXzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdmMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZGl2cmVtXzIuYwpAQCAtMCwwICsxLDExOCBAQAorLyogbXBuX2RpdnJlbV8yIC0tIERpdmlkZSBuYXR1cmFsIG51bWJlcnMsIHByb2R1Y2luZyBib3RoIHJlbWFpbmRlciBhbmQKKyAgIHF1b3RpZW50LiAgVGhlIGRpdmlzb3IgaXMgdHdvIGxpbWJzLgorCisgICBUSElTIEZJTEUgQ09OVEFJTlMgSU5URVJOQUwgRlVOQ1RJT05TIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCisKK0NvcHlyaWdodCAxOTkzLTE5OTYsIDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBEaXZpZGUgbnVtIHtucCxubn0gYnkgZGVuIHtkcCwyfSBhbmQgd3JpdGUgdGhlIG5uLTIgbGVhc3Qgc2lnbmlmaWNhbnQKKyAgIHF1b3RpZW50IGxpbWJzIGF0IHFwIGFuZCB0aGUgMiBsb25nIHJlbWFpbmRlciBhdCBucC4gIElmIHF4biBpcyBub24temVybywKKyAgIGdlbmVyYXRlIHRoYXQgbWFueSBmcmFjdGlvbiBiaXRzIGFuZCBhcHBlbmQgdGhlbSBhZnRlciB0aGUgb3RoZXIgcXVvdGllbnQKKyAgIGxpbWJzLiAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHF1b3RpZW50LCB0aGlzIGlzIGFsd2F5cyAwCisgICBvciAxLgorCisgICBQcmVjb25kaXRpb25zOgorICAgMS4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBkaXZpc29yIG11c3QgYmUgc2V0LgorICAgMi4gcXAgbXVzdCBlaXRoZXIgbm90IG92ZXJsYXAgd2l0aCB0aGUgaW5wdXQgb3BlcmFuZHMgYXQgYWxsLCBvcgorICAgICAgcXAgPj0gbnAgKyAyIG11c3QgaG9sZCB0cnVlLiAgKFRoaXMgbWVhbnMgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIHB1dAorICAgICAgdGhlIHF1b3RpZW50IGluIHRoZSBoaWdoIHBhcnQgb2Yge25wLG5ufSwgcmlnaHQgYWJvdmUgdGhlIHJlbWFpbmRlci4KKyAgIDMuIG5uID49IDIsIGV2ZW4gaWYgcXhuIGlzIG5vbi16ZXJvLiAgKi8KKworbXBfbGltYl90CittcG5fZGl2cmVtXzIgKG1wX3B0ciBxcCwgbXBfc2l6ZV90IHF4biwKKwkgICAgICBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKwkgICAgICBtcF9zcmNwdHIgZHApCit7CisgIG1wX2xpbWJfdCBtb3N0X3NpZ25pZmljYW50X3FfbGltYjsKKyAgbXBfc2l6ZV90IGk7CisgIG1wX2xpbWJfdCByMSwgcjAsIGQxLCBkMDsKKyAgZ21wX3BpMV90IGRpOworCisgIEFTU0VSVCAobm4gPj0gMik7CisgIEFTU0VSVCAocXhuID49IDApOworICBBU1NFUlQgKGRwWzFdICYgR01QX05VTUJfSElHSEJJVCk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChxcCwgbm4tMitxeG4sIG5wLCBubikgfHwgcXAgPj0gbnArMik7CisgIEFTU0VSVF9NUE4gKG5wLCBubik7CisgIEFTU0VSVF9NUE4gKGRwLCAyKTsKKworICBucCArPSBubiAtIDI7CisgIGQxID0gZHBbMV07CisgIGQwID0gZHBbMF07CisgIHIxID0gbnBbMV07CisgIHIwID0gbnBbMF07CisKKyAgbW9zdF9zaWduaWZpY2FudF9xX2xpbWIgPSAwOworICBpZiAocjEgPj0gZDEgJiYgKHIxID4gZDEgfHwgcjAgPj0gZDApKQorICAgIHsKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyAgICAgIHN1Yl9kZG1tc3MgKHIxLCByMCwgcjEsIHIwLCBkMSwgZDApOworI2Vsc2UKKyAgICAgIHIwID0gcjAgLSBkMDsKKyAgICAgIHIxID0gcjEgLSBkMSAtIChyMCA+PiBHTVBfTElNQl9CSVRTIC0gMSk7CisgICAgICByMCAmPSBHTVBfTlVNQl9NQVNLOworI2VuZGlmCisgICAgICBtb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDE7CisgICAgfQorCisgIGludmVydF9waTEgKGRpLCBkMSwgZDApOworCisgIHFwICs9IHF4bjsKKworICBmb3IgKGkgPSBubiAtIDIgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgbjAsIHE7CisgICAgICBuMCA9IG5wWy0xXTsKKyAgICAgIHVkaXZfcXJfM2J5MiAocSwgcjEsIHIwLCByMSwgcjAsIG4wLCBkMSwgZDAsIGRpLmludjMyKTsKKyAgICAgIG5wLS07CisgICAgICBxcFtpXSA9IHE7CisgICAgfQorCisgIGlmIChVTkxJS0VMWSAocXhuICE9IDApKQorICAgIHsKKyAgICAgIHFwIC09IHF4bjsKKyAgICAgIGZvciAoaSA9IHF4biAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG1wX2xpbWJfdCBxOworCSAgdWRpdl9xcl8zYnkyIChxLCByMSwgcjAsIHIxLCByMCwgQ05TVF9MSU1CKDApLCBkMSwgZDAsIGRpLmludjMyKTsKKwkgIHFwW2ldID0gcTsKKwl9CisgICAgfQorCisgIG5wWzFdID0gcjE7CisgIG5wWzBdID0gcjA7CisKKyAgcmV0dXJuIG1vc3Rfc2lnbmlmaWNhbnRfcV9saW1iOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZHVtcC5jIGIvbXBuL2dlbmVyaWMvZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGRkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9kdW1wLmMKQEAgLTAsMCArMSw5OSBAQAorLyogVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBOT1QgU0FGRSBUTworICAgQ0FMTCBUSElTIEZVTkNUSU9OIERJUkVDVExZLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBUSElTCisgICBGVU5DVElPTiBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKKworQ29weXJpZ2h0IDE5OTYsIDIwMDAtMjAwMiwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2lmIEdNUF9OVU1CX0JJVFMgJSA0ID09IDAKK3ZvaWQKK21wbl9kdW1wIChtcF9zcmNwdHIgcHRyLCBtcF9zaXplX3QgbikKK3sKKyAgTVBOX05PUk1BTElaRSAocHRyLCBuKTsKKworICBpZiAobiA9PSAwKQorICAgIHByaW50ZiAoIjBcbiIpOworICBlbHNlCisgICAgeworICAgICAgbi0tOworI2lmIF9MT05HX0xPTkdfTElNQgorICAgICAgaWYgKChwdHJbbl0gPj4gR01QX0xJTUJfQklUUyAvIDIpICE9IDApCisJeworCSAgcHJpbnRmICgiJWxYIiwgKHVuc2lnbmVkIGxvbmcpIChwdHJbbl0gPj4gR01QX0xJTUJfQklUUyAvIDIpKTsKKwkgIHByaW50ZiAoIiUwKmxYIiwgKEdNUF9MSU1CX0JJVFMgLyAyIC8gNCksICh1bnNpZ25lZCBsb25nKSBwdHJbbl0pOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZgorCXByaW50ZiAoIiVsWCIsICh1bnNpZ25lZCBsb25nKSBwdHJbbl0pOworCisgICAgICB3aGlsZSAobikKKwl7CisJICBuLS07CisjaWYgX0xPTkdfTE9OR19MSU1CCisJICBwcmludGYgKCIlMCpsWCIsIChHTVBfTlVNQl9CSVRTIC0gR01QX0xJTUJfQklUUyAvIDIpIC8gNCwKKwkJICAodW5zaWduZWQgbG9uZykgKHB0cltuXSA+PiBHTVBfTElNQl9CSVRTIC8gMikpOworCSAgcHJpbnRmICgiJTAqbFgiLCBHTVBfTElNQl9CSVRTIC8gMiAvIDQsICh1bnNpZ25lZCBsb25nKSBwdHJbbl0pOworI2Vsc2UKKwkgIHByaW50ZiAoIiUwKmxYIiwgR01QX05VTUJfQklUUyAvIDQsICh1bnNpZ25lZCBsb25nKSBwdHJbbl0pOworI2VuZGlmCisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkCittcG5fcmVjZHVtcCAobXBfcHRyIHAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgbG87CisgIGlmIChuICE9IDApCisgICAgeworICAgICAgbG8gPSBwWzBdICYgMHhmOworICAgICAgbXBuX3JzaGlmdCAocCwgcCwgbiwgNCk7CisgICAgICBtcG5fcmVjZHVtcCAocCwgbik7CisgICAgICBwcmludGYgKCIlbFgiLCBsbyk7CisgICAgfQorfQorCit2b2lkCittcG5fZHVtcCAobXBfc3JjcHRyIHAsIG1wX3NpemVfdCBuKQoreworICBtcF9wdHIgdHA7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG4pOworICBNUE5fQ09QWSAodHAsIHAsIG4pOworICBUTVBfRlJFRTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9maWIyX3VpLmMgYi9tcG4vZ2VuZXJpYy9maWIyX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4MTU3MQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2ZpYjJfdWkuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogbXBuX2ZpYjJfdWkgLS0gY2FsY3VsYXRlIEZpYm9uYWNjaSBudW1iZXJzLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIGNoYW5nZSB0aGlzIHRvICIjZGVmaW5lIFRSQUNFKHgpIHgiIGZvciBkaWFnbm9zdGljcyAqLworI2RlZmluZSBUUkFDRSh4KQorCisKKy8qIFN0b3JlIEZbbl0gYXQgZnAgYW5kIEZbbi0xXSBhdCBmMXAuICBmcCBhbmQgZjFwIHNob3VsZCBoYXZlIHJvb20gZm9yCisgICBNUE5fRklCMl9TSVpFKG4pIGxpbWJzLgorCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxpbWJzIHN0b3JlZCwgdGhpcyB3aWxsIGJlIGF0CisgICBsZWFzdCAxLiAgZnBbc2l6ZS0xXSB3aWxsIGJlIG5vbi16ZXJvLCBleGNlcHQgd2hlbiBuPT0wLCBpbiB3aGljaCBjYXNlCisgICBmcFswXSBpcyAwIGFuZCBmMXBbMF0gaXMgMS4gIGYxcFtzaXplLTFdIGNhbiBiZSB6ZXJvLCBzaW5jZSBGW24tMV08RltuXQorICAgKGZvciBuPjApLgorCisgICBOb3RlczogRlsyaysxXSA9IDQqRltrXV4yIC0gRltrLTFdXjIgKyAyKigtMSleay4KKworICAgSW4gRlsyaysxXSB3aXRoIGsgZXZlbiwgKzIgaXMgYXBwbGllZCB0byA0KkZba11eMiBqdXN0IGJ5IE9SaW5nIGludG8gdGhlCisgICBsb3cgbGltYi4KKworICAgSW4gRlsyaysxXSB3aXRoIGsgb2RkLCAtMiBpcyBhcHBsaWVkIHRvIEZbay0xXV4yIGp1c3QgYnkgT1JpbmcgaW50byB0aGUKKyAgIGxvdyBsaW1iLgorKi8KKworbXBfc2l6ZV90CittcG5fZmliMl91aSAobXBfcHRyIGZwLCBtcF9wdHIgZjFwLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICBtcF9zaXplX3QgICAgICBzaXplOworICB1bnNpZ25lZCBsb25nICBuZmlyc3QsIG1hc2s7CisKKyAgVFJBQ0UgKHByaW50ZiAoIm1wbl9maWIyX3VpIG49JWx1XG4iLCBuKSk7CisKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGZwLCBNUE5fRklCMl9TSVpFKG4pLCBmMXAsIE1QTl9GSUIyX1NJWkUobikpKTsKKworICAvKiBUYWtlIGEgc3RhcnRpbmcgcGFpciBmcm9tIHRoZSB0YWJsZS4gKi8KKyAgbWFzayA9IDE7CisgIGZvciAobmZpcnN0ID0gbjsgbmZpcnN0ID4gRklCX1RBQkxFX0xJTUlUOyBuZmlyc3QgLz0gMikKKyAgICBtYXNrIDw8PSAxOworICBUUkFDRSAocHJpbnRmICgibmZpcnN0PSVsdSBtYXNrPTB4JWxYXG4iLCBuZmlyc3QsIG1hc2spKTsKKworICBmMXBbMF0gPSBGSUJfVEFCTEUgKChpbnQpIG5maXJzdCAtIDEpOworICBmcFswXSAgPSBGSUJfVEFCTEUgKG5maXJzdCk7CisgIHNpemUgPSAxOworCisgIC8qIFNraXAgdG8gdGhlIGVuZCBpZiB0aGUgdGFibGUgbG9va3VwIGdpdmVzIHRoZSBmaW5hbCBhbnN3ZXIuICovCisgIGlmIChtYXNrICE9IDEpCisgICAgeworICAgICAgbXBfc2l6ZV90ICBhbGxvYzsKKyAgICAgIG1wX3B0ciAgICAgICAgeHA7CisgICAgICBUTVBfREVDTDsKKworICAgICAgVE1QX01BUks7CisgICAgICBhbGxvYyA9IE1QTl9GSUIyX1NJWkUgKG4pOworICAgICAgeHAgPSBUTVBfQUxMT0NfTElNQlMgKGFsbG9jKTsKKworICAgICAgZG8KKwl7CisJICAvKiBIZXJlIGZwPT1GW2tdIGFuZCBmMXA9PUZbay0xXSwgd2l0aCBrIGJlaW5nIHRoZSBiaXRzIG9mIG4gZnJvbQorCSAgICAgbiZtYXNrIHVwd2FyZHMuCisKKwkgICAgIFRoZSBuZXh0IGJpdCBvZiBuIGlzIG4mKG1hc2s+PjEpIGFuZCB3ZSdsbCBkb3VibGUgdG8gdGhlIHBhaXIKKwkgICAgIGZwPT1GWzJrXSxmMXA9PUZbMmstMV0gb3IgZnA9PUZbMmsrMV0sZjFwPT1GWzJrXSwgYWNjb3JkaW5nIGFzCisJICAgICB0aGF0IGJpdCBpcyAwIG9yIDEgcmVzcGVjdGl2ZWx5LiAgKi8KKworCSAgVFJBQ0UgKHByaW50ZiAoIms9JWx1IG1hc2s9MHglbFggc2l6ZT0lbGQgYWxsb2M9JWxkXG4iLAorCQkJIG4gPj4gcmVmbXBuX2NvdW50X3RyYWlsaW5nX3plcm9zKG1hc2spLAorCQkJIG1hc2ssIHNpemUsIGFsbG9jKTsKKwkJIG1wbl90cmFjZSAoImZwICIsIGZwLCBzaXplKTsKKwkJIG1wbl90cmFjZSAoImYxcCIsIGYxcCwgc2l6ZSkpOworCisJICAvKiBmcCBub3JtYWxpemVkLCBmMXAgYXQgbW9zdCBvbmUgaGlnaCB6ZXJvICovCisJICBBU1NFUlQgKGZwW3NpemUtMV0gIT0gMCk7CisJICBBU1NFUlQgKGYxcFtzaXplLTFdICE9IDAgfHwgZjFwW3NpemUtMl0gIT0gMCk7CisKKwkgIC8qIGYxcFtzaXplLTFdIG1pZ2h0IGJlIHplcm8sIGJ1dCB0aGlzIG9jY3VycyByYXJlbHksIHNvIGl0J3Mgbm90CisJICAgICB3b3J0aCBib3RoZXJpbmcgY2hlY2tpbmcgZm9yIGl0ICovCisJICBBU1NFUlQgKGFsbG9jID49IDIqc2l6ZSk7CisJICBtcG5fc3FyICh4cCwgZnAsICBzaXplKTsKKwkgIG1wbl9zcXIgKGZwLCBmMXAsIHNpemUpOworCSAgc2l6ZSAqPSAyOworCisJICAvKiBTaHJpbmsgaWYgcG9zc2libGUuICBTaW5jZSBmcCB3YXMgbm9ybWFsaXplZCB0aGVyZSdsbCBiZSBhdAorCSAgICAgbW9zdCBvbmUgaGlnaCB6ZXJvIG9uIHhwIChhbmQgaWYgdGhlcmUgaXMgdGhlbiB0aGVyZSdzIG9uZSBvbgorCSAgICAgeXAgdG9vKS4gICovCisJICBBU1NFUlQgKHhwW3NpemUtMV0gIT0gMCB8fCBmcFtzaXplLTFdID09IDApOworCSAgc2l6ZSAtPSAoeHBbc2l6ZS0xXSA9PSAwKTsKKwkgIEFTU0VSVCAoeHBbc2l6ZS0xXSAhPSAwKTsgIC8qIG9ubHkgb25lIHhwIGhpZ2ggemVybyAqLworCisJICAvKiBDYWxjdWxhdGUgRlsyay0xXSA9IEZba11eMiArIEZbay0xXV4yLiAqLworCSAgZjFwW3NpemVdID0gbXBuX2FkZF9uIChmMXAsIHhwLCBmcCwgc2l6ZSk7CisKKwkgIC8qIENhbGN1bGF0ZSBGWzJrKzFdID0gNCpGW2tdXjIgLSBGW2stMV1eMiArIDIqKC0xKV5rLgorCSAgICAgbiZtYXNrIGlzIHRoZSBsb3cgYml0IG9mIG91ciBpbXBsaWVkIGsuICAqLworCisJICBBU1NFUlQgKChmcFswXSAmIDIpID09IDApOworCSAgLyogZnAgaXMgRltrLTFdXjIgPT0gMCBvciAxIG1vZCA0LCBsaWtlIGFsbCBzcXVhcmVzLiAqLworCSAgZnBbMF0gfD0gKG4gJiBtYXNrID8gMiA6IDApOwkJCS8qIHBvc3NpYmxlIC0yICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbgorCSAgZnBbc2l6ZV0gPSBtcG5fcnNibHNoMl9uIChmcCwgZnAsIHhwLCBzaXplKTsKKwkgIE1QTl9JTkNSX1UoZnAsIHNpemUgKyAxLCAobiAmIG1hc2sgPyAwIDogMikpOwkvKiBwb3NzaWJsZSArMiAqLworI2Vsc2UKKwkgIHsKKwkgICAgbXBfbGltYl90ICBjOworCisJICAgIGMgPSBtcG5fbHNoaWZ0ICh4cCwgeHAsIHNpemUsIDIpOworCSAgICB4cFswXSB8PSAobiAmIG1hc2sgPyAwIDogMik7CS8qIHBvc3NpYmxlICsyICovCisJICAgIGMgLT0gbXBuX3N1Yl9uIChmcCwgeHAsIGZwLCBzaXplKTsKKwkgICAgZnBbc2l6ZV0gPSBjOworCSAgfQorI2VuZGlmCisJICBBU1NFUlQgKGFsbG9jID49IHNpemUrMSk7CisJICBzaXplICs9IChmcFtzaXplXSAhPSAwKTsKKworCSAgLyogbm93IG4mbWFzayBpcyB0aGUgbmV3IGJpdCBvZiBuIGJlaW5nIGNvbnNpZGVyZWQgKi8KKwkgIG1hc2sgPj49IDE7CisKKwkgIC8qIENhbGN1bGF0ZSBGWzJrXSA9IEZbMmsrMV0gLSBGWzJrLTFdLCByZXBsYWNpbmcgdGhlIHVud2FudGVkIG9uZSBvZgorCSAgICAgRlsyaysxXSBhbmQgRlsyay0xXS4gICovCisJICBpZiAobiAmIG1hc2spCisJICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX24gKGYxcCwgZnAsIGYxcCwgc2l6ZSkpOworCSAgZWxzZSB7CisJICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX24gKCBmcCwgZnAsIGYxcCwgc2l6ZSkpOworCisJICAgIC8qIENhbiBoYXZlIGEgaGlnaCB6ZXJvIGFmdGVyIHJlcGxhY2luZyBGWzJrKzFdIHdpdGggRlsya10uCisJICAgICAgIGYxcCB3aWxsIGhhdmUgYSBoaWdoIHplcm8gaWYgZnAgZG9lcy4gKi8KKwkgICAgQVNTRVJUIChmcFtzaXplLTFdICE9IDAgfHwgZjFwW3NpemUtMV0gPT0gMCk7CisJICAgIHNpemUgLT0gKGZwW3NpemUtMV0gPT0gMCk7CisJICB9CisJfQorICAgICAgd2hpbGUgKG1hc2sgIT0gMSk7CisKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKworICBUUkFDRSAocHJpbnRmICgiZG9uZSBzaXplPSVsZFxuIiwgc2l6ZSk7CisJIG1wbl90cmFjZSAoImZwICIsIGZwLCBzaXplKTsKKwkgbXBuX3RyYWNlICgiZjFwIiwgZjFwLCBzaXplKSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9maWIybS5jIGIvbXBuL2dlbmVyaWMvZmliMm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQyYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZmliMm0uYwpAQCAtMCwwICsxLDI1MiBAQAorLyogbXBuX2ZpYjJtIC0tIGNhbGN1bGF0ZSBGaWJvbmFjY2kgbnVtYmVycywgbW9kdWxvIG0uCisKK0NvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLCBiYXNlZCBvbiB0aGUgcHJldmlvdXMKK2ZpYjJfdWkuYyBmaWxlLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDUsIDIwMDksIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBTdG9yZXMgfHthcCxufS17YnAsbn18IGluIHtycCxufSwKKyAgIHJldHVybnMgdGhlIHNpZ24gb2Yge2FwLG59LXticCxufS4gKi8KK3N0YXRpYyBpbnQKK2Fic19zdWJfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCAgeCwgeTsKKyAgd2hpbGUgKC0tbiA+PSAwKQorICAgIHsKKyAgICAgIHggPSBhcFtuXTsKKyAgICAgIHkgPSBicFtuXTsKKyAgICAgIGlmICh4ICE9IHkpCisgICAgICAgIHsKKyAgICAgICAgICArK247CisgICAgICAgICAgaWYgKHggPiB5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChycCwgYXAsIGJwLCBuKSk7CisgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAocnAsIGJwLCBhcCwgbikpOworICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIHJwW25dID0gMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBTdG9yZSBGW25dIGF0IGZwIGFuZCBGW24tMV0gYXQgZjFwLiAgQm90aCBhcmUgY29tcHV0ZWQgbW9kdWxvIG0uCisgICBmcCBhbmQgZjFwIHNob3VsZCBoYXZlIHJvb20gZm9yIG1uKjIrMSBsaW1icy4KKworICAgVGhlIHNpZ24gb2Ygb25lIG9yIGJvdGggdGhlIHZhbHVlcyBtYXkgYmUgZmxpcHBlZCAobi1GLCBpbnN0ZWFkIG9mIEYpLAorICAgdGhlIHJldHVybiB2YWx1ZSBpcyAwICh6ZXJvKSBpZiB0aGUgc2lnbnMgYXJlIGNvaGVyZW50IChib3RoIHBvc2l0aXZlCisgICBvciBib3RoIG5lZ2F0aXZlKSBhbmQgMSAob25lKSBvdGhlcndpc2UuCisKKyAgIE5vdGVzOgorCisgICBJbiBGWzJrKzFdIHdpdGggayBldmVuLCArMiBpcyBhcHBsaWVkIHRvIDQqRltrXV4yIGp1c3QgYnkgT1JpbmcgaW50byB0aGUKKyAgIGxvdyBsaW1iLgorCisgICBJbiBGWzJrKzFdIHdpdGggayBvZGQsIC0yIGlzIGFwcGxpZWQgdG8gRltrLTFdXjIganVzdCBieSBPUmluZyBpbnRvIHRoZQorICAgbG93IGxpbWIuCisKKyAgIFRPRE86IFNob3VsZCB7dHAsIDIgKiBtbn0gYmUgcGFzc2VkIGFzIGEgc2NyYXRjaCBwb2ludGVyPworICAgU2hvdWxkIHRoZSBjYWxsIHRvIG1wbl9maWIyX3VpKCkgb2J0YWluICh1cCB0bykgMiptbiBsaW1icz8KKyovCisKK2ludAorbXBuX2ZpYjJtIChtcF9wdHIgZnAsIG1wX3B0ciBmMXAsIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG5uLCBtcF9zcmNwdHIgbXAsIG1wX3NpemVfdCBtbikKK3sKKyAgdW5zaWduZWQgbG9uZwluZmlyc3Q7CisgIG1wX2xpbWJfdAluaDsKKyAgbXBfYml0Y250X3QJbmJpOworICBtcF9zaXplX3QJc24sIGZuOworICBpbnQJCWZjbnQsIG5jbnQ7CisKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGZwLCBNQVgoMiptbisxLDUpLCBmMXAsIE1BWCgyKm1uKzEsNSkpKTsKKyAgQVNTRVJUIChubiA+IDAgJiYgbnBbbm4gLSAxXSAhPSAwKTsKKworICAvKiBFc3RpbWF0ZSB0aGUgbWF4aW1hbCBuIHN1Y2ggdGhhdCBmaWJvbmFjY2kobikgZml0cyBpbiBtbiBsaW1icy4gKi8KKyNpZiBHTVBfTlVNQl9CSVRTICUgMTYgPT0gMAorICBpZiAoVU5MSUtFTFkgKFVMT05HX01BWCAvICgyMyAqIChHTVBfTlVNQl9CSVRTIC8gMTYpKSA8PSBtbikpCisgICAgbmZpcnN0ID0gVUxPTkdfTUFYOworICBlbHNlCisgICAgbmZpcnN0ID0gbW4gKiAoMjMgKiAoR01QX05VTUJfQklUUyAvIDE2KSk7CisjZWxzZQorICB7CisgICAgbXBfYml0Y250X3QJbWJpOworICAgIG1iaSA9IChtcF9iaXRjbnRfdCkgbW4gKiBHTVBfTlVNQl9CSVRTOworCisgICAgaWYgKFVOTElLRUxZIChVTE9OR19NQVggLyAyMyA8IG1iaSkpCisgICAgICB7CisJaWYgKFVOTElLRUxZIChVTE9OR19NQVggLyAyMyAqIDE2IDw9IG1iaSkpCisJICBuZmlyc3QgPSBVTE9OR19NQVg7CisJZWxzZQorCSAgbmZpcnN0ID0gbWJpIC8gMTYgKiAyMzsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBuZmlyc3QgPSBtYmkgKiAyMyAvIDE2OworICB9CisjZW5kaWYKKworICBzbiA9IG5uIC0gMTsKKyAgbmggPSBucFtzbl07CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKG5jbnQsIG5oKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoZmNudCwgbmZpcnN0KTsKKworICBpZiAoZmNudCA+PSBuY250KQorICAgIHsKKyAgICAgIG5jbnQgPSBmY250IC0gbmNudDsKKyAgICAgIG5oID4+PSBuY250OworICAgIH0KKyAgZWxzZSBpZiAoc24gPiAwKQorICAgIHsKKyAgICAgIG5jbnQgLT0gZmNudDsKKyAgICAgIG5oIDw8PSBuY250OworICAgICAgbmNudCA9IEdNUF9OVU1CX0JJVFMgLSBuY250OworICAgICAgLS1zbjsKKyAgICAgIG5oIHw9IG5wW3NuXSA+PiBuY250OworICAgIH0KKyAgZWxzZQorICAgIG5jbnQgPSAwOworCisgIG5iaSA9IHNuICogR01QX05VTUJfQklUUyArIG5jbnQ7CisgIGlmIChuaCA+IG5maXJzdCkKKyAgICB7CisgICAgICBuaCA+Pj0gMTsKKyAgICAgICsrbmJpOworICAgIH0KKworICBBU1NFUlQgKG5oIDw9IG5maXJzdCk7CisgIC8qIFRha2UgYSBzdGFydGluZyBwYWlyIGZyb20gbXBuX2ZpYjJfdWkuICovCisgIGZuID0gbXBuX2ZpYjJfdWkgKGZwLCBmMXAsIG5oKTsKKyAgTVBOX1pFUk8gKGZwICsgZm4sIG1uIC0gZm4pOworICBNUE5fWkVSTyAoZjFwICsgZm4sIG1uIC0gZm4pOworCisgIGlmIChuYmkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZm4gPT0gbW4pCisJeworCSAgbXBfbGltYl90IHFwWzJdOworCSAgbXBuX3RkaXZfcXIgKHFwLCBmcCwgMCwgZnAsIGZuLCBtcCwgbW4pOworCSAgbXBuX3RkaXZfcXIgKHFwLCBmMXAsIDAsIGYxcCwgZm4sIG1wLCBtbik7CisJfQorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIJdHA7CisgICAgICB1bnNpZ25lZAlwYiA9IG5oICYgMTsKKyAgICAgIGludAluZWc7CisgICAgICBUTVBfREVDTDsKKworICAgICAgVE1QX01BUks7CisKKyAgICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTICgyICogbW4gKyAobW4gPCAyKSk7CisKKyAgICAgIGRvCisJeworCSAgbXBfcHRyCXJwOworCSAgLyogSGVyZSBmcD09RltrXSBhbmQgZjFwPT1GW2stMV0sIHdpdGggayBiZWluZyB0aGUgYml0cyBvZiBuIGZyb20KKwkgICAgIG5iaSB1cHdhcmRzLgorCisJICAgICBCYXNlZCBvbiB0aGUgbmV4dCBiaXQgb2Ygbiwgd2UnbGwgZG91YmxlIHRvIHRoZSBwYWlyCisJICAgICBmcD09Rlsya10sZjFwPT1GWzJrLTFdIG9yIGZwPT1GWzJrKzFdLGYxcD09Rlsya10sIGFjY29yZGluZyBhcworCSAgICAgdGhhdCBiaXQgaXMgMCBvciAxIHJlc3BlY3RpdmVseS4gICovCisKKwkgIG1wbl9zcXIgKHRwLCBmcCwgIG1uKTsKKwkgIG1wbl9zcXIgKGZwLCBmMXAsIG1uKTsKKworCSAgLyogQ2FsY3VsYXRlIEZbMmstMV0gPSBGW2tdXjIgKyBGW2stMV1eMi4gKi8KKwkgIGYxcFsyICogbW5dID0gbXBuX2FkZF9uIChmMXAsIHRwLCBmcCwgMiAqIG1uKTsKKworCSAgLyogQ2FsY3VsYXRlIEZbMmsrMV0gPSA0KkZba11eMiAtIEZbay0xXV4yICsgMiooLTEpXmsuCisJICAgICBwYiBpcyB0aGUgbG93IGJpdCBvZiBvdXIgaW1wbGllZCBrLiAgKi8KKworCSAgLyogZnAgaXMgRltrLTFdXjIgPT0gMCBvciAxIG1vZCA0LCBsaWtlIGFsbCBzcXVhcmVzLiAqLworCSAgQVNTRVJUICgoZnBbMF0gJiAyKSA9PSAwKTsKKwkgIEFTU0VSVCAocGIgPT0gKHBiICYgMSkpOworCSAgQVNTRVJUICgoZnBbMF0gKyAocGIgPyAyIDogMCkpID09IChmcFswXSB8IChwYiA8PCAxKSkpOworCSAgZnBbMF0gfD0gcGIgPDwgMTsJCS8qIHBvc3NpYmxlIC0yICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbgorCSAgZnBbMiAqIG1uXSA9IDEgKyBtcG5fcnNibHNoMl9uIChmcCwgZnAsIHRwLCAyICogbW4pOworCSAgTVBOX0lOQ1JfVShmcCwgMiAqIG1uICsgMSwgKDEgXiBwYikgPDwgMSk7CS8qIHBvc3NpYmxlICsyICovCisJICBmcFsyICogbW5dID0gKGZwWzIgKiBtbl0gLSAxKSAmIEdNUF9OVU1CX01BWDsKKyNlbHNlCisJICB7CisJICAgIG1wX2xpbWJfdCAgYzsKKworCSAgICBjID0gbXBuX2xzaGlmdCAodHAsIHRwLCAyICogbW4sIDIpOworCSAgICB0cFswXSB8PSAoMSBeIHBiKSA8PCAxOwkvKiBwb3NzaWJsZSArMiAqLworCSAgICBjIC09IG1wbl9zdWJfbiAoZnAsIHRwLCBmcCwgMiAqIG1uKTsKKwkgICAgZnBbMiAqIG1uXSA9IGMgJiBHTVBfTlVNQl9NQVg7CisJICB9CisjZW5kaWYKKwkgIG5lZyA9IGZwWzIgKiBtbl0gPT0gR01QX05VTUJfTUFYOworCisJICAvKiBDYWxjdWxhdGUgRlsyay0xXSA9IEZba11eMiArIEZbay0xXV4yICovCisJICAvKiBDYWxjdWxhdGUgRlsyaysxXSA9IDQqRltrXV4yIC0gRltrLTFdXjIgKyAyKigtMSleayAqLworCisJICAvKiBDYWxjdWxhdGUgRlsya10gPSBGWzJrKzFdIC0gRlsyay0xXSwgcmVwbGFjaW5nIHRoZSB1bndhbnRlZCBvbmUgb2YKKwkgICAgIEZbMmsrMV0gYW5kIEZbMmstMV0uICAqLworCSAgLS1uYmk7CisJICBwYiA9IChucCBbbmJpIC8gR01QX05VTUJfQklUU10gPj4gKG5iaSAlIEdNUF9OVU1CX0JJVFMpKSAmIDE7CisJICBycCA9IHBiID8gZjFwIDogZnA7CisJICBpZiAobmVnKQorCSAgICB7CisJICAgICAgLyogQ2FsY3VsYXRlIC0oRlsyaysxXSAtIEZbMmstMV0pICovCisJICAgICAgcnBbMiAqIG1uXSA9IGYxcFsyICogbW5dICsgMSAtIG1wbl9zdWJfbiAocnAsIGYxcCwgZnAsIDIgKiBtbik7CisJICAgICAgbmVnID0gISBwYjsKKwkgICAgICBpZiAocGIpIC8qIGZwIG5vdCBvdmVyd3JpdHRlbiwgbmVnYXRlIGl0LiAqLworCQlmcCBbMiAqIG1uXSA9IDEgXiBtcG5fbmVnIChmcCwgZnAsIDIgKiBtbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5lZyA9IGFic19zdWJfbiAocnAsIGZwLCBmMXAsIDIgKiBtbiArIDEpIDwgMDsKKwkgICAgfQorCisJICBtcG5fdGRpdl9xciAodHAsIGZwLCAwLCBmcCwgMiAqIG1uICsgMSwgbXAsIG1uKTsKKwkgIG1wbl90ZGl2X3FyICh0cCwgZjFwLCAwLCBmMXAsIDIgKiBtbiArIDEsIG1wLCBtbik7CisJfQorICAgICAgd2hpbGUgKG5iaSAhPSAwKTsKKworICAgICAgVE1QX0ZSRUU7CisKKyAgICAgIHJldHVybiBuZWc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZ2NkLmMgYi9tcG4vZ2VuZXJpYy9nY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjkyY2JmCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qIG1wbi9nY2QuYzogbXBuX2djZCBmb3IgZ2NkIG9mIHR3byBvZGQgaW50ZWdlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTgsIDIwMDAtMjAwNSwgMjAwOCwgMjAxMCwgMjAxMiwgMjAxOSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIFVzZXMgdGhlIEhHQ0Qgb3BlcmF0aW9uIGRlc2NyaWJlZCBpbgorCisgICAgIE4uIE3DtmxsZXIsIE9uIFNjaMO2bmhhZ2UncyBhbGdvcml0aG0gYW5kIHN1YnF1YWRyYXRpYyBpbnRlZ2VyIGdjZAorICAgICBjb21wdXRhdGlvbiwgTWF0aC4gQ29tcC4gNzcgKDIwMDgpLCA1ODktNjA3LgorCisgIHRvIHJlZHVjZSBpbnB1dHMgdW50aWwgdGhleSBhcmUgb2Ygc2l6ZSBiZWxvdyBHQ0RfRENfVEhSRVNIT0xELCBhbmQKKyAgdGhlbiB1c2VzIExlaG1lcidzIGFsZ29yaXRobS4KKyovCisKKy8qIFNvbWUgcmVhc29uYWJsZSBjaG9pY2VzIGFyZSBuIC8gMiAoc2FtZSBhcyBpbiBoZ2NkKSwgYW5kIHAgPSAobiArCisgKiAyKS8zLCB3aGljaCBnaXZlcyBhIGJhbGFuY2VkIG11bHRpcGxpY2F0aW9uIGluCisgKiBtcG5faGdjZF9tYXRyaXhfYWRqdXN0LiBIb3dldmVyLCBwID0gMiBuLzMgZ2l2ZXMgc2xpZ2h0bHkgYmV0dGVyCisgKiBwZXJmb3JtYW5jZS4gVGhlIG1hdHJpeC12ZWN0b3IgbXVsdGlwbGljYXRpb24gaXMgdGhlbgorICogNDoxLXVuYmFsYW5jZWQsIHdpdGggbWF0cml4IGVsZW1lbnRzIG9mIHNpemUgbi82LCBhbmQgdmVjdG9yCisgKiBlbGVtZW50cyBvZiBzaXplIHAgPSAybi8zLiAqLworCisvKiBGcm9tIGFuYWx5c2lzIG9mIHRoZSB0aGVvcmV0aWNhbCBydW5uaW5nIHRpbWUsIGl0IGFwcGVhcnMgdGhhdCB3aGVuCisgKiBtdWx0aXBsaWNhdGlvbiB0YWtlcyB0aW1lIE8obl5hbHBoYSksIHAgc2hvdWxkIGJlIGNob3NlbiBzbyB0aGF0CisgKiB0aGUgcmF0aW8gb2YgdGhlIHRpbWUgZm9yIHRoZSBtcG5faGdjZCBjYWxsLCBhbmQgdGhlIHRpbWUgZm9yIHRoZQorICogbXVsdGlwbGljYXRpb24gaW4gbXBuX2hnY2RfbWF0cml4X2FkanVzdCwgaXMgcm91Z2hseSAxLyhhbHBoYSAtCisgKiAxKS4gKi8KKyNpZmRlZiBUVU5FX0dDRF9QCisjZGVmaW5lIFBfVEFCTEVfU0laRSAxMDAwMAorbXBfc2l6ZV90IHBfdGFibGVbUF9UQUJMRV9TSVpFXTsKKyNkZWZpbmUgQ0hPT1NFX1AobikgKCAobikgPCBQX1RBQkxFX1NJWkUgPyBwX3RhYmxlW25dIDogMioobikvMykKKyNlbHNlCisjZGVmaW5lIENIT09TRV9QKG4pICgyKihuKSAvIDMpCisjZW5kaWYKKworc3RydWN0IGdjZF9jdHgKK3sKKyAgbXBfcHRyIGdwOworICBtcF9zaXplX3QgZ247Cit9OworCitzdGF0aWMgdm9pZAorZ2NkX2hvb2sgKHZvaWQgKnAsIG1wX3NyY3B0ciBncCwgbXBfc2l6ZV90IGduLAorCSAgbXBfc3JjcHRyIHFwLCBtcF9zaXplX3QgcW4sIGludCBkKQoreworICBzdHJ1Y3QgZ2NkX2N0eCAqY3R4ID0gKHN0cnVjdCBnY2RfY3R4ICopIHA7CisgIE1QTl9DT1BZIChjdHgtPmdwLCBncCwgZ24pOworICBjdHgtPmduID0gZ247Cit9CisKK21wX3NpemVfdAorbXBuX2djZCAobXBfcHRyIGdwLCBtcF9wdHIgdXAsIG1wX3NpemVfdCB1c2l6ZSwgbXBfcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IHRhbGxvYzsKKyAgbXBfc2l6ZV90IHNjcmF0Y2g7CisgIG1wX3NpemVfdCBtYXRyaXhfc2NyYXRjaDsKKworICBzdHJ1Y3QgZ2NkX2N0eCBjdHg7CisgIG1wX3B0ciB0cDsKKyAgVE1QX0RFQ0w7CisKKyAgQVNTRVJUICh1c2l6ZSA+PSBuKTsKKyAgQVNTRVJUIChuID4gMCk7CisgIEFTU0VSVCAodnBbbi0xXSA+IDApOworCisgIC8qIEZJWE1FOiBDaGVjayBmb3Igc21hbGwgc2l6ZXMgZmlyc3QsIGJlZm9yZSBzZXR0aW5nIHVwIHRlbXBvcmFyeQorICAgICBzdG9yYWdlIGV0Yy4gKi8KKyAgdGFsbG9jID0gTVBOX0dDRF9TVUJESVZfU1RFUF9JVENIKG4pOworCisgIC8qIEZvciBpbml0aWFsIGRpdmlzaW9uICovCisgIHNjcmF0Y2ggPSB1c2l6ZSAtIG4gKyAxOworICBpZiAoc2NyYXRjaCA+IHRhbGxvYykKKyAgICB0YWxsb2MgPSBzY3JhdGNoOworCisjaWYgVFVORV9HQ0RfUAorICBpZiAoQ0hPT1NFX1AgKG4pID4gMCkKKyNlbHNlCisgIGlmIChBQk9WRV9USFJFU0hPTEQgKG4sIEdDRF9EQ19USFJFU0hPTEQpKQorI2VuZGlmCisgICAgeworICAgICAgbXBfc2l6ZV90IGhnY2Rfc2NyYXRjaDsKKyAgICAgIG1wX3NpemVfdCB1cGRhdGVfc2NyYXRjaDsKKyAgICAgIG1wX3NpemVfdCBwID0gQ0hPT1NFX1AgKG4pOworICAgICAgbXBfc2l6ZV90IHNjcmF0Y2g7CisjaWYgVFVORV9HQ0RfUAorICAgICAgLyogV29yc3QgY2FzZSwgc2luY2Ugd2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgbiAtIENIT09TRV9QKG4pCisJIGlzIGluY3JlYXNpbmcgKi8KKyAgICAgIG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobik7CisgICAgICBoZ2NkX3NjcmF0Y2ggPSBtcG5faGdjZF9pdGNoIChuKTsKKyAgICAgIHVwZGF0ZV9zY3JhdGNoID0gMioobiAtIDEpOworI2Vsc2UKKyAgICAgIG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobiAtIHApOworICAgICAgaGdjZF9zY3JhdGNoID0gbXBuX2hnY2RfaXRjaCAobiAtIHApOworICAgICAgdXBkYXRlX3NjcmF0Y2ggPSBwICsgbiAtIDE7CisjZW5kaWYKKyAgICAgIHNjcmF0Y2ggPSBtYXRyaXhfc2NyYXRjaCArIE1BWChoZ2NkX3NjcmF0Y2gsIHVwZGF0ZV9zY3JhdGNoKTsKKyAgICAgIGlmIChzY3JhdGNoID4gdGFsbG9jKQorCXRhbGxvYyA9IHNjcmF0Y2g7CisgICAgfQorCisgIFRNUF9NQVJLOworICB0cCA9IFRNUF9BTExPQ19MSU1CUyh0YWxsb2MpOworCisgIGlmICh1c2l6ZSA+IG4pCisgICAgeworICAgICAgbXBuX3RkaXZfcXIgKHRwLCB1cCwgMCwgdXAsIHVzaXplLCB2cCwgbik7CisKKyAgICAgIGlmIChtcG5femVyb19wICh1cCwgbikpCisJeworCSAgTVBOX0NPUFkgKGdwLCB2cCwgbik7CisJICBjdHguZ24gPSBuOworCSAgZ290byBkb25lOworCX0KKyAgICB9CisKKyAgY3R4LmdwID0gZ3A7CisKKyNpZiBUVU5FX0dDRF9QCisgIHdoaWxlIChDSE9PU0VfUCAobikgPiAwKQorI2Vsc2UKKyAgd2hpbGUgKEFCT1ZFX1RIUkVTSE9MRCAobiwgR0NEX0RDX1RIUkVTSE9MRCkpCisjZW5kaWYKKyAgICB7CisgICAgICBzdHJ1Y3QgaGdjZF9tYXRyaXggTTsKKyAgICAgIG1wX3NpemVfdCBwID0gQ0hPT1NFX1AgKG4pOworICAgICAgbXBfc2l6ZV90IG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobiAtIHApOworICAgICAgbXBfc2l6ZV90IG5uOworICAgICAgbXBuX2hnY2RfbWF0cml4X2luaXQgKCZNLCBuIC0gcCwgdHApOworICAgICAgbm4gPSBtcG5faGdjZCAodXAgKyBwLCB2cCArIHAsIG4gLSBwLCAmTSwgdHAgKyBtYXRyaXhfc2NyYXRjaCk7CisgICAgICBpZiAobm4gPiAwKQorCXsKKwkgIEFTU0VSVCAoTS5uIDw9IChuIC0gcCAtIDEpLzIpOworCSAgQVNTRVJUIChNLm4gKyBwIDw9IChwICsgbiAtIDEpIC8gMik7CisJICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSAyIChwICsgTS0+bikgPD0gcCArIG4gLSAxLiAqLworCSAgbiA9IG1wbl9oZ2NkX21hdHJpeF9hZGp1c3QgKCZNLCBwICsgbm4sIHVwLCB2cCwgcCwgdHAgKyBtYXRyaXhfc2NyYXRjaCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIG4gKi8KKwkgIG4gPSBtcG5fZ2NkX3N1YmRpdl9zdGVwICh1cCwgdnAsIG4sIDAsIGdjZF9ob29rLCAmY3R4LCB0cCk7CisJICBpZiAobiA9PSAwKQorCSAgICBnb3RvIGRvbmU7CisJfQorICAgIH0KKworICB3aGlsZSAobiA+IDIpCisgICAgeworICAgICAgc3RydWN0IGhnY2RfbWF0cml4MSBNOworICAgICAgbXBfbGltYl90IHVoLCB1bCwgdmgsIHZsOworICAgICAgbXBfbGltYl90IG1hc2s7CisKKyAgICAgIG1hc2sgPSB1cFtuLTFdIHwgdnBbbi0xXTsKKyAgICAgIEFTU0VSVCAobWFzayA+IDApOworCisgICAgICBpZiAobWFzayAmIEdNUF9OVU1CX0hJR0hCSVQpCisJeworCSAgdWggPSB1cFtuLTFdOyB1bCA9IHVwW24tMl07CisJICB2aCA9IHZwW24tMV07IHZsID0gdnBbbi0yXTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IHNoaWZ0OworCisJICBjb3VudF9sZWFkaW5nX3plcm9zIChzaGlmdCwgbWFzayk7CisJICB1aCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCB1cFtuLTFdLCB1cFtuLTJdKTsKKwkgIHVsID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIHVwW24tMl0sIHVwW24tM10pOworCSAgdmggPSBNUE5fRVhUUkFDVF9OVU1CIChzaGlmdCwgdnBbbi0xXSwgdnBbbi0yXSk7CisJICB2bCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCB2cFtuLTJdLCB2cFtuLTNdKTsKKwl9CisKKyAgICAgIC8qIFRyeSBhbiBtcG5faGdjZDIgc3RlcCAqLworICAgICAgaWYgKG1wbl9oZ2NkMiAodWgsIHVsLCB2aCwgdmwsICZNKSkKKwl7CisJICBuID0gbXBuX21hdHJpeDIyX211bDFfaW52ZXJzZV92ZWN0b3IgKCZNLCB0cCwgdXAsIHZwLCBuKTsKKwkgIE1QX1BUUl9TV0FQICh1cCwgdHApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBtcG5faGdjZDIgaGFzIGZhaWxlZC4gVGhlbiBlaXRoZXIgb25lIG9mIGEgb3IgYiBpcyB2ZXJ5CisJICAgICBzbWFsbCwgb3IgdGhlIGRpZmZlcmVuY2UgaXMgdmVyeSBzbWFsbC4gUGVyZm9ybSBvbmUKKwkgICAgIHN1YnRyYWN0aW9uIGZvbGxvd2VkIGJ5IG9uZSBkaXZpc2lvbi4gKi8KKworCSAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgbiAqLworCSAgbiA9IG1wbl9nY2Rfc3ViZGl2X3N0ZXAgKHVwLCB2cCwgbiwgMCwgJmdjZF9ob29rLCAmY3R4LCB0cCk7CisJICBpZiAobiA9PSAwKQorCSAgICBnb3RvIGRvbmU7CisJfQorICAgIH0KKworICBBU1NFUlQodXBbbi0xXSB8IHZwW24tMV0pOworCisgIC8qIER1ZSB0byB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciBtcG5fZ2NkLCBhdCBtb3N0IG9uZSBjYW4gYmUgZXZlbi4gKi8KKyAgaWYgKCh1cFswXSAmIDEpID09IDApCisgICAgTVBfUFRSX1NXQVAgKHVwLCB2cCk7CisgIEFTU0VSVCAoKHVwWzBdICYgMSkgIT0gMCk7CisKKyAgeworICAgIG1wX2xpbWJfdCB1MCwgdTEsIHYwLCB2MTsKKyAgICBtcF9kb3VibGVfbGltYl90IGc7CisKKyAgICB1MCA9IHVwWzBdOworICAgIHYwID0gdnBbMF07CisKKyAgICBpZiAobiA9PSAxKQorICAgICAgeworCWludCBjbnQ7CisJY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgdjApOworCSpncCA9IG1wbl9nY2RfMTEgKHUwLCB2MCA+PiBjbnQpOworCWN0eC5nbiA9IDE7CisJZ290byBkb25lOworICAgICAgfQorCisgICAgdjEgPSB2cFsxXTsKKyAgICBpZiAoVU5MSUtFTFkgKHYwID09IDApKQorICAgICAgeworCXYwID0gdjE7CisJdjEgPSAwOworCS8qIEZJWE1FOiBXZSBjb3VsZCBpbnZva2UgYSBtcG5fZ2NkXzIxIGhlcmUsIGp1c3QgbGlrZSBtcG5fZ2NkXzIyIGNvdWxkCisJICAgd2hlbiB0aGlzIHNpdHVhdGlvbiBvY2N1cnMgaW50ZXJuYWxseS4gICovCisgICAgICB9CisgICAgaWYgKCh2MCAmIDEpID09IDApCisgICAgICB7CisJaW50IGNudDsKKwljb3VudF90cmFpbGluZ196ZXJvcyAoY250LCB2MCk7CisJdjAgPSAoKHYxIDw8IChHTVBfTlVNQl9CSVRTIC0gY250KSkgJiBHTVBfTlVNQl9NQVNLKSB8ICh2MCA+PiBjbnQpOworCXYxID4+PSBjbnQ7CisgICAgICB9CisKKyAgICB1MSA9IHVwWzFdOworICAgIGcgPSBtcG5fZ2NkXzIyICh1MSwgdTAsIHYxLCB2MCk7CisgICAgZ3BbMF0gPSBnLmQwOworICAgIGdwWzFdID0gZy5kMTsKKyAgICBjdHguZ24gPSAxICsgKGcuZDEgPiAwKTsKKyAgfQorZG9uZToKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBjdHguZ247Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9nY2RfMS5jIGIvbXBuL2dlbmVyaWMvZ2NkXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmIxNDIyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkXzEuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogbXBuX2djZF8xIC0tIG1wbiBhbmQgbGltYiBncmVhdGVzdCBjb21tb24gZGl2aXNvci4KKworQ29weXJpZ2h0IDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMDksIDIwMTIsIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIERvZXMgbm90IHdvcmsgZm9yIFUgPT0gMCBvciBWID09IDAuICBJdCB3b3VsZCBiZSB0b3VnaCB0byBtYWtlIGl0IHdvcmsgZm9yCisgICBWID09IDAgc2luY2UgZ2NkKHgsMCkgPSB4LCBhbmQgVSBkb2VzIG5vdCBnZW5lcmFsbHkgZml0IGluIGFuIG1wX2xpbWJfdC4KKworICAgVGhlIHRocmVzaG9sZCBmb3IgZG9pbmcgdSV2IHdoZW4gc2l6ZT09MSB3aWxsIHZhcnkgYnkgQ1BVIGFjY29yZGluZyB0bworICAgdGhlIHNwZWVkIG9mIGEgZGl2aXNpb24gYW5kIHRoZSBjb2RlIGdlbmVyYXRlZCBmb3IgdGhlIG1haW4gbG9vcC4gIEFueQorICAgdHVuaW5nIGZvciB0aGlzIGlzIGxlZnQgdG8gYSBDUFUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uICAqLworCittcF9saW1iX3QKK21wbl9nY2RfMSAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IHZsaW1iKQoreworICBtcF9saW1iX3QgICAgICB1bGltYjsKKyAgdW5zaWduZWQgbG9uZyAgemVyb19iaXRzLCB1X2xvd196ZXJvX2JpdHM7CisgIGludCBjOworCisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKyAgQVNTRVJUICh2bGltYiAhPSAwKTsKKyAgQVNTRVJUX01QTl9OT05aRVJPX1AgKHVwLCBzaXplKTsKKworICB1bGltYiA9IHVwWzBdOworCisgIC8qIE5lZWQgdmxpbWIgb2RkIGZvciBtb2RleGFjdCwgd2FudCBpdCBvZGQgdG8gZ2V0IGNvbW1vbiB6ZXJvcy4gKi8KKyAgY291bnRfdHJhaWxpbmdfemVyb3MgKHplcm9fYml0cywgdmxpbWIpOworICB2bGltYiA+Pj0gemVyb19iaXRzOworCisgIGlmIChzaXplID4gMSkKKyAgICB7CisgICAgICAvKiBNdXN0IGdldCBjb21tb24gemVyb3MgYmVmb3JlIHRoZSBtb2QgcmVkdWN0aW9uLiAgSWYgdWxpbWI9PTAgdGhlbgorCSB2bGltYiBhbHJlYWR5IGdpdmVzIHRoZSBjb21tb24gemVyb3MuICAqLworICAgICAgaWYgKHVsaW1iICE9IDApCisJeworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKHVfbG93X3plcm9fYml0cywgdWxpbWIpOworCSAgemVyb19iaXRzID0gTUlOICh6ZXJvX2JpdHMsIHVfbG93X3plcm9fYml0cyk7CisJfQorCisgICAgICB1bGltYiA9IE1QTl9NT0RfT1JfTU9ERVhBQ1RfMV9PREQgKHVwLCBzaXplLCB2bGltYik7CisgICAgICBpZiAodWxpbWIgPT0gMCkKKwlnb3RvIGRvbmU7CisKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCB1bGltYik7CisgICAgICB1bGltYiA+Pj0gYzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBzaXplPT0xLCBzbyB1cFswXSE9MCAqLworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHVfbG93X3plcm9fYml0cywgdWxpbWIpOworICAgICAgdWxpbWIgPj49IHVfbG93X3plcm9fYml0czsKKyAgICAgIHplcm9fYml0cyA9IE1JTiAoemVyb19iaXRzLCB1X2xvd196ZXJvX2JpdHMpOworCisgICAgICAvKiBtYWtlIHUgYmlnZ2VyICovCisgICAgICBpZiAodmxpbWIgPiB1bGltYikKKwlNUF9MSU1CX1RfU1dBUCAodWxpbWIsIHZsaW1iKTsKKworICAgICAgLyogaWYgdSBpcyBtdWNoIGJpZ2dlciB0aGFuIHYsIHJlZHVjZSB1c2luZyBhIGRpdmlzaW9uIHJhdGhlciB0aGFuCisJIGNoaXBwaW5nIGF3YXkgYXQgaXQgYml0LWJ5LWJpdCAqLworICAgICAgaWYgKCh1bGltYiA+PiAxNikgPiB2bGltYikKKwl7CisJICB1bGltYiAlPSB2bGltYjsKKwkgIGlmICh1bGltYiA9PSAwKQorCSAgICBnb3RvIGRvbmU7CisKKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCB1bGltYik7CisJICB1bGltYiA+Pj0gYzsKKwl9CisgICAgfQorCisgIHZsaW1iID0gbXBuX2djZF8xMSAodWxpbWIsIHZsaW1iKTsKKworIGRvbmU6CisgIHJldHVybiB2bGltYiA8PCB6ZXJvX2JpdHM7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9nY2RfMTEuYyBiL21wbi9nZW5lcmljL2djZF8xMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGU0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9nY2RfMTEuYwpAQCAtMCwwICsxLDc0IEBACisvKiBtcG5fZ2NkXzExIC0tIGxpbWIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IuCisKK0NvcHlyaWdodCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA5LCAyMDEyLCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworbXBfbGltYl90CittcG5fZ2NkXzExIChtcF9saW1iX3QgdSwgbXBfbGltYl90IHYpCit7CisgIEFTU0VSVCAodSAmIHYgJiAxKTsKKworICAvKiBJbiB0aGlzIGxvb3AsIHdlIHJlcHJlc2VudCB0aGUgb2RkIG51bWJlcnMgdWxpbWIgYW5kIHZsaW1iCisgICAgIHdpdGhvdXQgdGhlIHJlZHVuZGFudCBsZWFzdCBzaWduaWZpY2FudCBvbmUgYml0LiBUaGlzIHJlZHVjdGlvbgorICAgICBpbiBzaXplIGJ5IG9uZSBiaXQgZW5zdXJlcyB0aGF0IHRoZSBoaWdoIGJpdCBvZiB0LCBiZWxvdywgaXMgc2V0CisgICAgIGlmIGFuZCBvbmx5IGlmIHZsaW1iID4gdWxpbWIuICovCisKKyAgdSA+Pj0gMTsKKyAgdiA+Pj0gMTsKKworICB3aGlsZSAodSAhPSB2KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB0OworICAgICAgbXBfbGltYl90IHZndHU7CisgICAgICBpbnQgYzsKKworICAgICAgdCA9IHUgLSB2OworICAgICAgdmd0dSA9IExJTUJfSElHSEJJVF9UT19NQVNLICh0KTsKKworICAgICAgLyogdiA8LS0gbWluICh1LCB2KSAqLworICAgICAgdiArPSAodmd0dSAmIHQpOworCisgICAgICAvKiB1IDwtLSB8dSAtIHZ8ICovCisgICAgICB1ID0gKHQgXiB2Z3R1KSAtIHZndHU7CisKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCB0KTsKKyAgICAgIC8qIFdlIGhhdmUgYyA8PSBHTVBfTElNQl9CSVRTIC0gMiBoZXJlLCBzbyB0aGF0CisKKwkgICB1bGltYiA+Pj0gKGMgKyAxKTsKKworCSB3b3VsZCBiZSBzYWZlLiBCdXQgdW5saWtlIHRoZSBhZGRpdGlvbiBjICsgMSwgYSBzZXBhcmF0ZQorCSBzaGlmdCBieSAxIGlzIGluZGVwZW5kZW50IG9mIGMsIGFuZCBjYW4gYmUgZXhlY3V0ZWQgaW4KKwkgcGFyYWxsZWwgd2l0aCBjb3VudF90cmFpbGluZ196ZXJvcy4gKi8KKyAgICAgIHUgPSAodSA+PiAxKSA+PiBjOworICAgIH0KKyAgcmV0dXJuICh1IDw8IDEpICsgMTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2djZF8yMi5jIGIvbXBuL2dlbmVyaWMvZ2NkXzIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZjA5NgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2djZF8yMi5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBtcG5fZ2NkXzIyIC0tIGRvdWJsZSBsaW1iIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yLgorCitDb3B5cmlnaHQgMTk5NCwgMTk5NiwgMjAwMCwgMjAwMSwgMjAwOSwgMjAxMiwgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmIEdNUF9OQUlMX0JJVFMgPiAwCisjZXJyb3IgTmFpbHMgbm90IHN1cHBvcnRlZC4KKyNlbmRpZgorCittcF9kb3VibGVfbGltYl90CittcG5fZ2NkXzIyIChtcF9saW1iX3QgdTEsIG1wX2xpbWJfdCB1MCwgbXBfbGltYl90IHYxLCBtcF9saW1iX3QgdjApCit7CisgIG1wX2RvdWJsZV9saW1iX3QgZzsKKyAgQVNTRVJUICh1MCAmIHYwICYgMSk7CisKKyAgLyogSW1wbGljaXQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0ICovCisgIHUwID0gKHUwID4+IDEpIHwgKHUxIDw8IChHTVBfTElNQl9CSVRTIC0gMSkpOworICB1MSA+Pj0gMTsKKworICB2MCA9ICh2MCA+PiAxKSB8ICh2MSA8PCAoR01QX0xJTUJfQklUUyAtIDEpKTsKKyAgdjEgPj49IDE7CisKKyAgd2hpbGUgKHUxIHx8IHYxKSAvKiB1MSA9PSAwIGNhbiBoYXBwZW4gYXQgbW9zdCB0d2ljZSBwZXIgY2FsbCAqLworICAgIHsKKyAgICAgIG1wX2xpbWJfdCB2Z3R1LCB0MSwgdDA7CisgICAgICBzdWJfZGRtbXNzICh0MSwgdDAsIHUxLCB1MCwgdjEsIHYwKTsKKyAgICAgIHZndHUgPSBMSU1CX0hJR0hCSVRfVE9fTUFTSyh0MSk7CisKKyAgICAgIGlmIChVTkxJS0VMWSAodDAgPT0gMCkpCisJeworCSAgaWYgKHQxID09IDApCisJICAgIHsKKwkgICAgICBnLmQxID0gKHUxIDw8IDEpIHwgKHUwID4+IChHTVBfTElNQl9CSVRTIC0gMSkpOworCSAgICAgIGcuZDAgPSAodTAgPDwgMSkgfCAxOworCSAgICAgIHJldHVybiBnOworCSAgICB9CisJICBpbnQgYzsKKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCB0MSk7CisKKwkgIC8qIHYxID0gbWluICh1MSwgdjEpICovCisJICB2MSArPSAodmd0dSAmIHQxKTsKKwkgIC8qIHUwID0gfHUxIC0gdjF8ICovCisJICB1MCA9ICh0MSBeIHZndHUpIC0gdmd0dTsKKwkgIEFTU0VSVCAoYyA8IEdNUF9MSU1CX0JJVFMgLSAxKTsKKwkgIHUwID4+PSBjICsgMTsKKwkgIHUxID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IGM7CisJICBjb3VudF90cmFpbGluZ196ZXJvcyAoYywgdDApOworCSAgYysrOworCSAgLyogViA8LS0gbWluIChVLCBWKS4KKworCSAgICAgQXNzZW1ibHkgdmVyc2lvbiBzaG91bGQgdXNlIGNtb3YuIEFub3RoZXIgYWx0ZXJuYXRpdmUsCisJICAgICBhdm9pZGluZyBjYXJyeSBwcm9wYWdhdGlvbiwgd291bGQgYmUKKworCSAgICAgdjAgKz0gdmd0dSAmIHQwOyB2MSArPSB2dGd1ICYgKHUxIC0gdjEpOworCSAgKi8KKwkgIGFkZF9zc2FhYWEgKHYxLCB2MCwgdjEsIHYwLCB2Z3R1ICYgdDEsIHZndHUgJiB0MCk7CisJICAvKiBVICA8LS0gIHxVIC0gVnwKKwkgICAgIE5vIGNhcnJ5IGhhbmRsaW5nIG5lZWRlZCBpbiB0aGlzIGNvbmRpdGlvbmFsIG5lZ2F0aW9uLAorCSAgICAgc2luY2UgdDAgIT0gMC4gKi8KKwkgIHUwID0gKHQwIF4gdmd0dSkgLSB2Z3R1OworCSAgdTEgPSB0MSBeIHZndHU7CisJICBpZiAoVU5MSUtFTFkgKGMgPT0gR01QX0xJTUJfQklUUykpCisJICAgIHsKKwkgICAgICB1MCA9IHUxOworCSAgICAgIHUxID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdTAgPSAodTAgPj4gYykgfCAodTEgPDwgKEdNUF9MSU1CX0JJVFMgLSBjKSk7CisJICAgICAgdTEgPj49IGM7CisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSAoKHYwIHwgdTApICYgR01QX0xJTUJfSElHSEJJVCkKKyAgICB7IC8qIEF0IG1vc3QgdHdvIGl0ZXJhdGlvbnMgKi8KKyAgICAgIG1wX2xpbWJfdCB2Z3R1LCB0MDsKKyAgICAgIGludCBjOworICAgICAgc3ViX2RkbW1zcyAodmd0dSwgdDAsIDAsIHUwLCAwLCB2MCk7CisgICAgICBpZiAoVU5MSUtFTFkgKHQwID09IDApKQorCXsKKwkgIGcuZDEgPSB1MCA+PiAoR01QX0xJTUJfQklUUyAtIDEpOworCSAgZy5kMCA9ICh1MCA8PCAxKSB8IDE7CisJICByZXR1cm4gZzsKKwl9CisKKyAgICAgIC8qIHYgPC0tIG1pbiAodSwgdikgKi8KKyAgICAgIHYwICs9ICh2Z3R1ICYgdDApOworCisgICAgICAvKiB1IDwtLSB8dSAtIHZ8ICovCisgICAgICB1MCA9ICh0MCBeIHZndHUpIC0gdmd0dTsKKworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIHQwKTsKKyAgICAgIHUwID0gKHUwID4+IDEpID4+IGM7CisgICAgfQorCisgIGcuZDAgPSBtcG5fZ2NkXzExICgodTAgPDwgMSkgKyAxLCAodjAgPDwgMSkgKyAxKTsKKyAgZy5kMSA9IDA7CisgIHJldHVybiBnOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZ2NkX3N1YmRpdl9zdGVwLmMgYi9tcG4vZ2VuZXJpYy9nY2Rfc3ViZGl2X3N0ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNiODhkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkX3N1YmRpdl9zdGVwLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIGdjZF9zdWJkaXZfc3RlcC5jLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDAzLTIwMDUsIDIwMDgsIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIGZvciBOVUxMICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIFVzZWQgd2hlbiBtcG5faGdjZCBvciBtcG5faGdjZDIgaGFzIGZhaWxlZC4gVGhlbiBlaXRoZXIgb25lIG9mIGEgb3IKKyAgIGIgaXMgc21hbGwsIG9yIHRoZSBkaWZmZXJlbmNlIGlzIHNtYWxsLiBQZXJmb3JtIG9uZSBzdWJ0cmFjdGlvbgorICAgZm9sbG93ZWQgYnkgb25lIGRpdmlzaW9uLiBUaGUgbm9ybWFsIGNhc2UgaXMgdG8gY29tcHV0ZSB0aGUgcmVkdWNlZAorICAgYSBhbmQgYiwgYW5kIHJldHVybiB0aGUgbmV3IHNpemUuCisKKyAgIElmIHMgPT0gMCAodXNlZCBmb3IgZ2NkIGFuZCBnY2RleHQpLCByZXR1cm5zIHplcm8gaWYgdGhlIGdjZCBpcworICAgZm91bmQuCisKKyAgIElmIHMgPiAwLCBkb24ndCByZWR1Y2UgdG8gc2l6ZSA8PSBzLCBhbmQgcmV0dXJuIHplcm8gaWYgbm8KKyAgIHJlZHVjdGlvbiBpcyBwb3NzaWJsZSAoaWYgZWl0aGVyIGEsIGIgb3IgfGEtYnwgaXMgb2Ygc2l6ZSA8PSBzKS4gKi8KKworLyogVGhlIGhvb2sgZnVuY3Rpb24gaXMgY2FsbGVkIGFzCisKKyAgICAgaG9vayhjdHgsIGdwLCBnbiwgcXAsIHFuLCBkKQorCisgICBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCisgICArIElmIEEgPSBCIGF0IHRoZSBzdGFydCwgRyBpcyB0aGUgZ2NkLCBRIGlzIE5VTEwsIGQgPSAtMS4KKworICAgKyBJZiBvbmUgaW5wdXQgaXMgemVybyBhdCB0aGUgc3RhcnQsIEcgaXMgdGhlIGdjZCwgUSBpcyBOVUxMLAorICAgICBkID0gMCBpZiBBID0gRyBhbmQgZCA9IDEgaWYgQiA9IEcuCisKKyAgIE90aGVyd2lzZSwgaWYgZCA9IDAgd2UgaGF2ZSBqdXN0IHN1YnRyYWN0ZWQgYSBtdWx0aXBsZSBvZiBBIGZyb20gQiwKKyAgIGFuZCBpZiBkID0gMSB3ZSBoYXZlIHN1YnRyYWN0ZWQgYSBtdWx0aXBsZSBvZiBCIGZyb20gQS4KKworICAgKyBJZiBBID0gQiBhZnRlciBzdWJ0cmFjdGlvbiwgRyBpcyB0aGUgZ2NkLCBRIGlzIE5VTEwuCisKKyAgICsgSWYgd2UgZ2V0IGEgemVybyByZW1haW5kZXIgYWZ0ZXIgZGl2aXNpb24sIEcgaXMgdGhlIGdjZCwgUSBpcyB0aGUKKyAgICAgcXVvdGllbnQuCisKKyAgICsgT3RoZXJ3aXNlLCBHIGlzIE5VTEwsIFEgaXMgdGhlIHF1b3RpZW50IChvZnRlbiAxKS4KKworICovCisKK21wX3NpemVfdAorbXBuX2djZF9zdWJkaXZfc3RlcCAobXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgcywKKwkJICAgICBnY2Rfc3ViZGl2X3N0ZXBfaG9vayAqaG9vaywgdm9pZCAqY3R4LAorCQkgICAgIG1wX3B0ciB0cCkKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBvbmUgPSBDTlNUX0xJTUIoMSk7CisgIG1wX3NpemVfdCBhbiwgYm4sIHFuOworCisgIGludCBzd2FwcGVkOworCisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKGFwW24tMV0gPiAwIHx8IGJwW24tMV0gPiAwKTsKKworICBhbiA9IGJuID0gbjsKKyAgTVBOX05PUk1BTElaRSAoYXAsIGFuKTsKKyAgTVBOX05PUk1BTElaRSAoYnAsIGJuKTsKKworICBzd2FwcGVkID0gMDsKKworICAvKiBBcnJhbmdlIHNvIHRoYXQgYSA8IGIsIHN1YnRyYWN0IGIgLT0gYSwgYW5kIG1haW50YWluCisgICAgIG5vcm1hbGl6YXRpb24uICovCisgIGlmIChhbiA9PSBibikKKyAgICB7CisgICAgICBpbnQgYzsKKyAgICAgIE1QTl9DTVAgKGMsIGFwLCBicCwgYW4pOworICAgICAgaWYgKFVOTElLRUxZIChjID09IDApKQorCXsKKwkgIC8qIEZvciBnY2RleHQsIHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBjb2ZhY3RvcnMsIHNvCisJICAgICBwYXNzIGQgPSAtMS4gKi8KKwkgIGlmIChzID09IDApCisJICAgIGhvb2sgKGN0eCwgYXAsIGFuLCBOVUxMLCAwLCAtMSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBlbHNlIGlmIChjID4gMCkKKwl7CisJICBNUF9QVFJfU1dBUCAoYXAsIGJwKTsKKwkgIHN3YXBwZWQgXj0gMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGFuID4gYm4pCisJeworCSAgTVBOX1BUUl9TV0FQIChhcCwgYW4sIGJwLCBibik7CisJICBzd2FwcGVkIF49IDE7CisJfQorICAgIH0KKyAgaWYgKGFuIDw9IHMpCisgICAgeworICAgICAgaWYgKHMgPT0gMCkKKwlob29rIChjdHgsIGJwLCBibiwgTlVMTCwgMCwgc3dhcHBlZCBeIDEpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViIChicCwgYnAsIGJuLCBhcCwgYW4pKTsKKyAgTVBOX05PUk1BTElaRSAoYnAsIGJuKTsKKyAgQVNTRVJUIChibiA+IDApOworCisgIGlmIChibiA8PSBzKQorICAgIHsKKyAgICAgIC8qIFVuZG8gc3VidHJhY3Rpb24uICovCisgICAgICBtcF9saW1iX3QgY3kgPSBtcG5fYWRkIChicCwgYXAsIGFuLCBicCwgYm4pOworICAgICAgaWYgKGN5ID4gMCkKKwlicFthbl0gPSBjeTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBBcnJhbmdlIHNvIHRoYXQgYSA8IGIgKi8KKyAgaWYgKGFuID09IGJuKQorICAgIHsKKyAgICAgIGludCBjOworICAgICAgTVBOX0NNUCAoYywgYXAsIGJwLCBhbik7CisgICAgICBpZiAoVU5MSUtFTFkgKGMgPT0gMCkpCisJeworCSAgaWYgKHMgPiAwKQorCSAgICAvKiBKdXN0IHJlY29yZCBzdWJ0cmFjdGlvbiBhbmQgcmV0dXJuICovCisJICAgIGhvb2sgKGN0eCwgTlVMTCwgMCwgJm9uZSwgMSwgc3dhcHBlZCk7CisJICBlbHNlCisJICAgIC8qIEZvdW5kIGdjZC4gKi8KKwkgICAgaG9vayAoY3R4LCBicCwgYm4sIE5VTEwsIDAsIHN3YXBwZWQpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBob29rIChjdHgsIE5VTEwsIDAsICZvbmUsIDEsIHN3YXBwZWQpOworCisgICAgICBpZiAoYyA+IDApCisJeworCSAgTVBfUFRSX1NXQVAgKGFwLCBicCk7CisJICBzd2FwcGVkIF49IDE7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhvb2sgKGN0eCwgTlVMTCwgMCwgJm9uZSwgMSwgc3dhcHBlZCk7CisKKyAgICAgIGlmIChhbiA+IGJuKQorCXsKKwkgIE1QTl9QVFJfU1dBUCAoYXAsIGFuLCBicCwgYm4pOworCSAgc3dhcHBlZCBePSAxOworCX0KKyAgICB9CisKKyAgbXBuX3RkaXZfcXIgKHRwLCBicCwgMCwgYnAsIGJuLCBhcCwgYW4pOworICBxbiA9IGJuIC0gYW4gKyAxOworICBibiA9IGFuOworICBNUE5fTk9STUFMSVpFIChicCwgYm4pOworCisgIGlmIChVTkxJS0VMWSAoYm4gPD0gcykpCisgICAgeworICAgICAgaWYgKHMgPT0gMCkKKwl7CisJICBob29rIChjdHgsIGFwLCBhbiwgdHAsIHFuLCBzd2FwcGVkKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogUXVvdGllbnQgaXMgb25lIHRvbyBsYXJnZSwgc28gZGVjcmVtZW50IGl0IGFuZCBhZGQgYmFjayBBLiAqLworICAgICAgaWYgKGJuID4gMCkKKwl7CisJICBtcF9saW1iX3QgY3kgPSBtcG5fYWRkIChicCwgYXAsIGFuLCBicCwgYm4pOworCSAgaWYgKGN5KQorCSAgICBicFthbisrXSA9IGN5OworCX0KKyAgICAgIGVsc2UKKwlNUE5fQ09QWSAoYnAsIGFwLCBhbik7CisKKyAgICAgIE1QTl9ERUNSX1UgKHRwLCBxbiwgMSk7CisgICAgfQorCisgIGhvb2sgKGN0eCwgTlVMTCwgMCwgdHAsIHFuLCBzd2FwcGVkKTsKKyAgcmV0dXJuIGFuOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvZ2NkZXh0LmMgYi9tcG4vZ2VuZXJpYy9nY2RleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAxNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkZXh0LmMKQEAgLTAsMCArMSw1NTcgQEAKKy8qIG1wbl9nY2RleHQgLS0gRXh0ZW5kZWQgR3JlYXRlc3QgQ29tbW9uIERpdmlzb3IuCisKK0NvcHlyaWdodCAxOTk2LCAxOTk4LCAyMDAwLTIwMDUsIDIwMDgsIDIwMDksIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBDb21wdXRlcyAocjtiKSA9IChhOyBiKSBNLiBSZXN1bHQgaXMgb2Ygc2l6ZSBuICsgTS0+biArLy0gMSwgYW5kCisgICB0aGUgc2l6ZSBpcyByZXR1cm5lZCAoaWYgaW5wdXRzIGFyZSBub24tbm9ybWFsaXplZCwgcmVzdWx0IG1heSBiZQorICAgbm9uLW5vcm1hbGl6ZWQgdG9vKS4gVGVtcG9yYXJ5IHNwYWNlIG5lZWRlZCBpcyBNLT5uICsgbi4KKyAqLworc3RhdGljIHNpemVfdAoraGdjZF9tdWxfbWF0cml4X3ZlY3RvciAoc3RydWN0IGhnY2RfbWF0cml4ICpNLAorCQkJbXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3B0ciBicCwgbXBfc2l6ZV90IG4sIG1wX3B0ciB0cCkKK3sKKyAgbXBfbGltYl90IGFoLCBiaDsKKworICAvKiBDb21wdXRlIChyLGIpIDwtLSAodTAwIGEgKyB1MTAgYiwgdTAxIGEgKyB1MTEgYikgYXMKKworICAgICB0ICA9IHUwMCAqIGEKKyAgICAgciAgPSB1MTAgKiBiCisgICAgIHIgKz0gdDsKKworICAgICB0ICA9IHUxMSAqIGIKKyAgICAgYiAgPSB1MDEgKiBhCisgICAgIGIgKz0gdDsKKyAgKi8KKworICBpZiAoTS0+biA+PSBuKQorICAgIHsKKyAgICAgIG1wbl9tdWwgKHRwLCBNLT5wWzBdWzBdLCBNLT5uLCBhcCwgbik7CisgICAgICBtcG5fbXVsIChycCwgTS0+cFsxXVswXSwgTS0+biwgYnAsIG4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9tdWwgKHRwLCBhcCwgbiwgTS0+cFswXVswXSwgTS0+bik7CisgICAgICBtcG5fbXVsIChycCwgYnAsIG4sIE0tPnBbMV1bMF0sIE0tPm4pOworICAgIH0KKworICBhaCA9IG1wbl9hZGRfbiAocnAsIHJwLCB0cCwgbiArIE0tPm4pOworCisgIGlmIChNLT5uID49IG4pCisgICAgeworICAgICAgbXBuX211bCAodHAsIE0tPnBbMV1bMV0sIE0tPm4sIGJwLCBuKTsKKyAgICAgIG1wbl9tdWwgKGJwLCBNLT5wWzBdWzFdLCBNLT5uLCBhcCwgbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX211bCAodHAsIGJwLCBuLCBNLT5wWzFdWzFdLCBNLT5uKTsKKyAgICAgIG1wbl9tdWwgKGJwLCBhcCwgbiwgTS0+cFswXVsxXSwgTS0+bik7CisgICAgfQorICBiaCA9IG1wbl9hZGRfbiAoYnAsIGJwLCB0cCwgbiArIE0tPm4pOworCisgIG4gKz0gTS0+bjsKKyAgaWYgKCAoYWggfCBiaCkgPiAwKQorICAgIHsKKyAgICAgIHJwW25dID0gYWg7CisgICAgICBicFtuXSA9IGJoOworICAgICAgbisrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vcm1hbGl6ZSAqLworICAgICAgd2hpbGUgKCAocnBbbi0xXSB8IGJwW24tMV0pID09IDApCisJbi0tOworICAgIH0KKworICByZXR1cm4gbjsKK30KKworI2RlZmluZSBDT01QVVRFX1ZfSVRDSChuKSAoMioobikpCisKKy8qIENvbXB1dGVzIHx2fCA9IHwoZyAtIHUgYSl8IC8gYiwgd2hlcmUgdSBtYXkgYmUgcG9zaXRpdmUgb3IKKyAgIG5lZ2F0aXZlLCBhbmQgdiBpcyBvZiB0aGUgb3Bwb3NpdGUgc2lnbi4gbWF4KGEsIGIpIGlzIG9mIHNpemUgbiwgdSBhbmQKKyAgIHYgYXQgbW9zdCBzaXplIG4sIGFuZCB2IG11c3QgaGF2ZSBzcGFjZSBmb3IgbisxIGxpbWJzLiAqLworc3RhdGljIG1wX3NpemVfdAorY29tcHV0ZV92IChtcF9wdHIgdnAsCisJICAgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBuLAorCSAgIG1wX3NyY3B0ciBncCwgbXBfc2l6ZV90IGduLAorCSAgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVzaXplLAorCSAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IHNpemU7CisgIG1wX3NpemVfdCBhbjsKKyAgbXBfc2l6ZV90IGJuOworICBtcF9zaXplX3Qgdm47CisKKyAgQVNTRVJUIChuID4gMCk7CisgIEFTU0VSVCAoZ24gPiAwKTsKKyAgQVNTRVJUICh1c2l6ZSAhPSAwKTsKKworICBzaXplID0gQUJTICh1c2l6ZSk7CisgIEFTU0VSVCAoc2l6ZSA8PSBuKTsKKyAgQVNTRVJUICh1cFtzaXplLTFdID4gMCk7CisKKyAgYW4gPSBuOworICBNUE5fTk9STUFMSVpFIChhcCwgYW4pOworICBBU1NFUlQgKGduIDw9IGFuKTsKKworICBpZiAoYW4gPj0gc2l6ZSkKKyAgICBtcG5fbXVsICh0cCwgYXAsIGFuLCB1cCwgc2l6ZSk7CisgIGVsc2UKKyAgICBtcG5fbXVsICh0cCwgdXAsIHNpemUsIGFwLCBhbik7CisKKyAgc2l6ZSArPSBhbjsKKworICBpZiAodXNpemUgPiAwKQorICAgIHsKKyAgICAgIC8qIHx2fCA9IC12ID0gKHUgYSAtIGcpIC8gYiAqLworCisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1YiAodHAsIHRwLCBzaXplLCBncCwgZ24pKTsKKyAgICAgIE1QTl9OT1JNQUxJWkUgKHRwLCBzaXplKTsKKyAgICAgIGlmIChzaXplID09IDApCisJcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeyAvKiB8dnwgPSB2ID0gKGcgLSB1IGEpIC8gYiA9IChnICsgfHV8IGEpIC8gYi4gU2luY2UgZyA8PSBhLAorCSAoZyArIHx1fCBhKSBhbHdheXMgZml0cyBpbiAofHVzaXplfCArIGFuKSBsaW1icy4gKi8KKworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGQgKHRwLCB0cCwgc2l6ZSwgZ3AsIGduKSk7CisgICAgICBzaXplIC09ICh0cFtzaXplIC0gMV0gPT0gMCk7CisgICAgfQorCisgIC8qIE5vdyBkaXZpZGUgdCAvIGIuIFRoZXJlIG11c3QgYmUgbm8gcmVtYWluZGVyICovCisgIGJuID0gbjsKKyAgTVBOX05PUk1BTElaRSAoYnAsIGJuKTsKKyAgQVNTRVJUIChzaXplID49IGJuKTsKKworICB2biA9IHNpemUgKyAxIC0gYm47CisgIEFTU0VSVCAodm4gPD0gbiArIDEpOworCisgIG1wbl9kaXZleGFjdCAodnAsIHRwLCBzaXplLCBicCwgYm4pOworICB2biAtPSAodnBbdm4tMV0gPT0gMCk7CisKKyAgcmV0dXJuIHZuOworfQorCisvKiBUZW1wb3Jhcnkgc3RvcmFnZToKKworICAgSW5pdGlhbCBkaXZpc2lvbjogUXVvdGllbnQgb2YgYXQgbW9zdCBhbiAtIG4gKyAxIDw9IGFuIGxpbWJzLgorCisgICBTdG9yYWdlIGZvciB1MCBhbmQgdTE6IDIobisxKS4KKworICAgU3RvcmFnZSBmb3IgaGdjZCBtYXRyaXggTSwgd2l0aCBpbnB1dCBjZWlsKG4vMik6IDUgKiBjZWlsKG4vNCkKKworICAgU3RvcmFnZSBmb3IgaGdjZCwgaW5wdXQgKG4gKyAxKS8yOiA5IG4vNCBwbHVzIHNvbWUuCisKKyAgIFdoZW4gaGdjZCBzdWNjZWVkczogMSArIGZsb29yKDNuLzIpIGZvciBhZGp1c3RpbmcgYSBhbmQgYiwgYW5kIDIobisxKSBmb3IgdGhlIGNvZmFjdG9ycy4KKworICAgV2hlbiBoZ2NkIGZhaWxzOiAybiArIDEgZm9yIG1wbl9nY2RleHRfc3ViZGl2X3N0ZXAsIHdoaWNoIGlzIGxlc3MuCisKKyAgIEZvciB0aGUgbGVobWVyIGNhbGwgYWZ0ZXIgdGhlIGxvb3AsIExldCBUIGRlbm90ZQorICAgR0NERVhUX0RDX1RIUkVTSE9MRC4gRm9yIHRoZSBnY2RleHRfbGVobWVyIGNhbGwsIHdlIG5lZWQgVCBlYWNoIGZvcgorICAgdSwgYSBhbmQgYiwgYW5kIDRUKzMgc2NyYXRjaCBzcGFjZS4gTmV4dCwgZm9yIGNvbXB1dGVfdiwgd2UgbmVlZCBUCisgICBmb3IgdSwgVCsxIGZvciB2IGFuZCAyVCBzY3JhdGNoIHNwYWNlLiBJbiBhbGwsIDdUICsgMyBpcworICAgc3VmZmljaWVudCBmb3IgYm90aCBvcGVyYXRpb25zLgorCisqLworCisvKiBPcHRpbWFsIGNob2ljZSBvZiBwIHNlZW1zIGRpZmZpY3VsdC4gSW4gZWFjaCBpdGVyYXRpb24gdGhlIGRpdmlzaW9uCisgKiBvZiB3b3JrIGJldHdlZW4gaGdjZCBhbmQgdGhlIHVwZGF0ZXMgb2YgdTAgYW5kIHUxIGRlcGVuZHMgb24gdGhlCisgKiBjdXJyZW50IHNpemUgb2YgdGhlIHUuIEl0IG1heSBiZSBkZXNpcmFibGUgdG8gdXNlIGEgZGlmZmVyZW50CisgKiBjaG9pY2Ugb2YgcCBpbiBlYWNoIGl0ZXJhdGlvbi4gQWxzbyB0aGUgaW5wdXQgc2l6ZSBzZWVtcyB0byBtYXR0ZXI7CisgKiBjaG9vc2luZyBwID0gbiAvIDMgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiBzZWVtcyB0byBpbXByb3ZlCisgKiBwZXJmb3JtYW5jZSBzbGlnaHRseSBmb3IgaW5wdXQgc2l6ZSBqdXN0IGFib3ZlIHRoZSB0aHJlc2hvbGQsIGJ1dAorICogZGVncmFkZSBwZXJmb3JtYW5jZSBmb3IgbGFyZ2VyIGlucHV0cy4gKi8KKyNkZWZpbmUgQ0hPT1NFX1BfMShuKSAoKG4pIC8gMikKKyNkZWZpbmUgQ0hPT1NFX1BfMihuKSAoKG4pIC8gMykKKworbXBfc2l6ZV90CittcG5fZ2NkZXh0IChtcF9wdHIgZ3AsIG1wX3B0ciB1cCwgbXBfc2l6ZV90ICp1c2l6ZXAsCisJICAgIG1wX3B0ciBhcCwgbXBfc2l6ZV90IGFuLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgdGFsbG9jOworICBtcF9zaXplX3Qgc2NyYXRjaDsKKyAgbXBfc2l6ZV90IG1hdHJpeF9zY3JhdGNoOworICBtcF9zaXplX3QgdWFsbG9jID0gbiArIDE7CisKKyAgc3RydWN0IGdjZGV4dF9jdHggY3R4OworICBtcF9zaXplX3QgdW47CisgIG1wX3B0ciB1MDsKKyAgbXBfcHRyIHUxOworCisgIG1wX3B0ciB0cDsKKworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGFuID49IG4pOworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUIChicFtuLTFdID4gMCk7CisKKyAgVE1QX01BUks7CisKKyAgLyogRklYTUU6IENoZWNrIGZvciBzbWFsbCBzaXplcyBmaXJzdCwgYmVmb3JlIHNldHRpbmcgdXAgdGVtcG9yYXJ5CisgICAgIHN0b3JhZ2UgZXRjLiAqLworICB0YWxsb2MgPSBNUE5fR0NERVhUX0xFSE1FUl9OX0lUQ0gobik7CisKKyAgLyogRm9yIGluaXRpYWwgZGl2aXNpb24gKi8KKyAgc2NyYXRjaCA9IGFuIC0gbiArIDE7CisgIGlmIChzY3JhdGNoID4gdGFsbG9jKQorICAgIHRhbGxvYyA9IHNjcmF0Y2g7CisKKyAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAobiwgR0NERVhUX0RDX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgLyogRm9yIGhnY2QgbG9vcC4gKi8KKyAgICAgIG1wX3NpemVfdCBoZ2NkX3NjcmF0Y2g7CisgICAgICBtcF9zaXplX3QgdXBkYXRlX3NjcmF0Y2g7CisgICAgICBtcF9zaXplX3QgcDEgPSBDSE9PU0VfUF8xIChuKTsKKyAgICAgIG1wX3NpemVfdCBwMiA9IENIT09TRV9QXzIgKG4pOworICAgICAgbXBfc2l6ZV90IG1pbl9wID0gTUlOKHAxLCBwMik7CisgICAgICBtcF9zaXplX3QgbWF4X3AgPSBNQVgocDEsIHAyKTsKKyAgICAgIG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobiAtIG1pbl9wKTsKKyAgICAgIGhnY2Rfc2NyYXRjaCA9IG1wbl9oZ2NkX2l0Y2ggKG4gLSBtaW5fcCk7CisgICAgICB1cGRhdGVfc2NyYXRjaCA9IG1heF9wICsgbiAtIDE7CisKKyAgICAgIHNjcmF0Y2ggPSBtYXRyaXhfc2NyYXRjaCArIE1BWChoZ2NkX3NjcmF0Y2gsIHVwZGF0ZV9zY3JhdGNoKTsKKyAgICAgIGlmIChzY3JhdGNoID4gdGFsbG9jKQorCXRhbGxvYyA9IHNjcmF0Y2g7CisKKyAgICAgIC8qIEZpbmFsIG1wbl9nY2RleHRfbGVobWVyX24gY2FsbC4gTmVlZCBzcGFjZSBmb3IgdSBhbmQgZm9yCisJIGNvcGllcyBvZiBhIGFuZCBiLiAqLworICAgICAgc2NyYXRjaCA9IE1QTl9HQ0RFWFRfTEVITUVSX05fSVRDSCAoR0NERVhUX0RDX1RIUkVTSE9MRCkKKwkrIDMqR0NERVhUX0RDX1RIUkVTSE9MRDsKKworICAgICAgaWYgKHNjcmF0Y2ggPiB0YWxsb2MpCisJdGFsbG9jID0gc2NyYXRjaDsKKworICAgICAgLyogQ29mYWN0b3JzIHUwIGFuZCB1MSAqLworICAgICAgdGFsbG9jICs9IDIqKG4rMSk7CisgICAgfQorCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTKHRhbGxvYyk7CisKKyAgaWYgKGFuID4gbikKKyAgICB7CisgICAgICBtcG5fdGRpdl9xciAodHAsIGFwLCAwLCBhcCwgYW4sIGJwLCBuKTsKKworICAgICAgaWYgKG1wbl96ZXJvX3AgKGFwLCBuKSkKKwl7CisJICBNUE5fQ09QWSAoZ3AsIGJwLCBuKTsKKwkgICp1c2l6ZXAgPSAwOworCSAgVE1QX0ZSRUU7CisJICByZXR1cm4gbjsKKwl9CisgICAgfQorCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIEdDREVYVF9EQ19USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBnbiA9IG1wbl9nY2RleHRfbGVobWVyX24oZ3AsIHVwLCB1c2l6ZXAsIGFwLCBicCwgbiwgdHApOworCisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybiBnbjsKKyAgICB9CisKKyAgTVBOX1pFUk8gKHRwLCAyKnVhbGxvYyk7CisgIHUwID0gdHA7IHRwICs9IHVhbGxvYzsKKyAgdTEgPSB0cDsgdHAgKz0gdWFsbG9jOworCisgIGN0eC5ncCA9IGdwOworICBjdHgudXAgPSB1cDsKKyAgY3R4LnVzaXplID0gdXNpemVwOworCisgIHsKKyAgICAvKiBGb3IgdGhlIGZpcnN0IGhnY2QgY2FsbCwgdGhlcmUgYXJlIG5vIHUgdXBkYXRlcywgYW5kIGl0IG1ha2VzCisgICAgICAgc29tZSBzZW5zZSB0byB1c2UgYSBkaWZmZXJlbnQgY2hvaWNlIGZvciBwLiAqLworCisgICAgLyogRklYTUU6IFdlIGNvdWxkIHRyaW0gdXNlIG9mIHRlbXBvcmFyeSBzdG9yYWdlLCBzaW5jZSB1MCBhbmQgdTEKKyAgICAgICBhcmUgbm90IHVzZWQgeWV0LiBGb3IgdGhlIGhnY2QgY2FsbCwgd2UgY291bGQgc3dhcCBpbiB0aGUgdTAKKyAgICAgICBhbmQgdTEgcG9pbnRlcnMgZm9yIHRoZSByZWxldmFudCBtYXRyaXggZWxlbWVudHMuICovCisKKyAgICBzdHJ1Y3QgaGdjZF9tYXRyaXggTTsKKyAgICBtcF9zaXplX3QgcCA9IENIT09TRV9QXzEgKG4pOworICAgIG1wX3NpemVfdCBubjsKKworICAgIG1wbl9oZ2NkX21hdHJpeF9pbml0ICgmTSwgbiAtIHAsIHRwKTsKKyAgICBubiA9IG1wbl9oZ2NkIChhcCArIHAsIGJwICsgcCwgbiAtIHAsICZNLCB0cCArIG1hdHJpeF9zY3JhdGNoKTsKKyAgICBpZiAobm4gPiAwKQorICAgICAgeworCUFTU0VSVCAoTS5uIDw9IChuIC0gcCAtIDEpLzIpOworCUFTU0VSVCAoTS5uICsgcCA8PSAocCArIG4gLSAxKSAvIDIpOworCisJLyogVGVtcG9yYXJ5IHN0b3JhZ2UgMiAocCArIE0tPm4pIDw9IHAgKyBuIC0gMSAqLworCW4gPSBtcG5faGdjZF9tYXRyaXhfYWRqdXN0ICgmTSwgcCArIG5uLCBhcCwgYnAsIHAsIHRwICsgbWF0cml4X3NjcmF0Y2gpOworCisJTVBOX0NPUFkgKHUwLCBNLnBbMV1bMF0sIE0ubik7CisJTVBOX0NPUFkgKHUxLCBNLnBbMV1bMV0sIE0ubik7CisJdW4gPSBNLm47CisJd2hpbGUgKCAodTBbdW4tMV0gfCB1MVt1bi0xXSApID09IDApCisJICB1bi0tOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwkvKiBtcG5faGdjZCBoYXMgZmFpbGVkLiBUaGVuIGVpdGhlciBvbmUgb2YgYSBvciBiIGlzIHZlcnkKKwkgICBzbWFsbCwgb3IgdGhlIGRpZmZlcmVuY2UgaXMgdmVyeSBzbWFsbC4gUGVyZm9ybSBvbmUKKwkgICBzdWJ0cmFjdGlvbiBmb2xsb3dlZCBieSBvbmUgZGl2aXNpb24uICovCisJdTFbMF0gPSAxOworCisJY3R4LnUwID0gdTA7CisJY3R4LnUxID0gdTE7CisJY3R4LnRwID0gdHAgKyBuOyAvKiB1YWxsb2MgKi8KKwljdHgudW4gPSAxOworCisJLyogVGVtcG9yYXJ5IHN0b3JhZ2UgbiAqLworCW4gPSBtcG5fZ2NkX3N1YmRpdl9zdGVwIChhcCwgYnAsIG4sIDAsIG1wbl9nY2RleHRfaG9vaywgJmN0eCwgdHApOworCWlmIChuID09IDApCisJICB7CisJICAgIFRNUF9GUkVFOworCSAgICByZXR1cm4gY3R4LmduOworCSAgfQorCisJdW4gPSBjdHgudW47CisJQVNTRVJUICh1biA8IHVhbGxvYyk7CisgICAgICB9CisgIH0KKworICB3aGlsZSAoQUJPVkVfVEhSRVNIT0xEIChuLCBHQ0RFWFRfRENfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgaGdjZF9tYXRyaXggTTsKKyAgICAgIG1wX3NpemVfdCBwID0gQ0hPT1NFX1BfMiAobik7CisgICAgICBtcF9zaXplX3Qgbm47CisKKyAgICAgIG1wbl9oZ2NkX21hdHJpeF9pbml0ICgmTSwgbiAtIHAsIHRwKTsKKyAgICAgIG5uID0gbXBuX2hnY2QgKGFwICsgcCwgYnAgKyBwLCBuIC0gcCwgJk0sIHRwICsgbWF0cml4X3NjcmF0Y2gpOworICAgICAgaWYgKG5uID4gMCkKKwl7CisJICBtcF9wdHIgdDA7CisKKwkgIHQwID0gdHAgKyBtYXRyaXhfc2NyYXRjaDsKKwkgIEFTU0VSVCAoTS5uIDw9IChuIC0gcCAtIDEpLzIpOworCSAgQVNTRVJUIChNLm4gKyBwIDw9IChwICsgbiAtIDEpIC8gMik7CisKKwkgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIDIgKHAgKyBNLT5uKSA8PSBwICsgbiAtIDEgKi8KKwkgIG4gPSBtcG5faGdjZF9tYXRyaXhfYWRqdXN0ICgmTSwgcCArIG5uLCBhcCwgYnAsIHAsIHQwKTsKKworCSAgLyogQnkgdGhlIHNhbWUgYW5hbHlzaXMgYXMgZm9yIG1wbl9oZ2NkX21hdHJpeF9tdWwgKi8KKwkgIEFTU0VSVCAoTS5uICsgdW4gPD0gdWFsbG9jKTsKKworCSAgLyogRklYTUU6IFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkIGJ5IHNvbWUgc3dhcHBpbmcgb2YKKwkgICAqIHBvaW50ZXJzLiBNYXkgbmVlZCBtb3JlIHRlbXBvcmFyeSBzdG9yYWdlLCB0aG91Z2guICovCisJICBNUE5fQ09QWSAodDAsIHUwLCB1bik7CisKKwkgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIHVhbGxvYyAqLworCSAgdW4gPSBoZ2NkX211bF9tYXRyaXhfdmVjdG9yICgmTSwgdTAsIHQwLCB1MSwgdW4sIHQwICsgdW4pOworCisJICBBU1NFUlQgKHVuIDwgdWFsbG9jKTsKKwkgIEFTU0VSVCAoICh1MFt1bi0xXSB8IHUxW3VuLTFdKSA+IDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBtcG5faGdjZCBoYXMgZmFpbGVkLiBUaGVuIGVpdGhlciBvbmUgb2YgYSBvciBiIGlzIHZlcnkKKwkgICAgIHNtYWxsLCBvciB0aGUgZGlmZmVyZW5jZSBpcyB2ZXJ5IHNtYWxsLiBQZXJmb3JtIG9uZQorCSAgICAgc3VidHJhY3Rpb24gZm9sbG93ZWQgYnkgb25lIGRpdmlzaW9uLiAqLworCSAgY3R4LnUwID0gdTA7CisJICBjdHgudTEgPSB1MTsKKwkgIGN0eC50cCA9IHRwICsgbjsgLyogdWFsbG9jICovCisJICBjdHgudW4gPSB1bjsKKworCSAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgbiAqLworCSAgbiA9IG1wbl9nY2Rfc3ViZGl2X3N0ZXAgKGFwLCBicCwgbiwgMCwgbXBuX2djZGV4dF9ob29rLCAmY3R4LCB0cCk7CisJICBpZiAobiA9PSAwKQorCSAgICB7CisJICAgICAgVE1QX0ZSRUU7CisJICAgICAgcmV0dXJuIGN0eC5nbjsKKwkgICAgfQorCisJICB1biA9IGN0eC51bjsKKwkgIEFTU0VSVCAodW4gPCB1YWxsb2MpOworCX0KKyAgICB9CisgIC8qIFdlIGhhdmUgQSA9IC4uLiBhICsgLi4uIGIKKwkgICAgIEIgPSAgdTAgYSArICB1MSBiCisKKwkgICAgIGEgPSB1MSAgQSArIC4uLiBCCisJICAgICBiID0gLXUwIEEgKyAuLi4gQgorCisgICAgIHdpdGggYm91bmRzCisKKyAgICAgICB8dTB8LCB8dTF8IDw9IEIgLyBtaW4oYSwgYikKKworICAgICBXZSBhbHdheXMgaGF2ZSB1MSA+IDAsIGFuZCB1MCA9PSAwIGlzIHBvc3NpYmxlIG9ubHkgaWYgdTEgPT0gMSwKKyAgICAgaW4gd2hpY2ggY2FzZSB0aGUgb25seSByZWR1Y3Rpb24gZG9uZSBzbyBmYXIgaXMgYSA9IEEgLSBrIEIgZm9yCisgICAgIHNvbWUgay4KKworICAgICBDb21wdXRlIGcgPSB1IGEgKyB2IGIgPSAodSB1MSAtIHYgdTApIEEgKyAoLi4uKSBCCisgICAgIEhlcmUsIHUsIHYgYXJlIGJvdW5kZWQgYnkKKworICAgICAgIHx1fCA8PSBiLAorICAgICAgIHx2fCA8PSBhCisgICovCisKKyAgQVNTRVJUICggKGFwW24tMV0gfCBicFtuLTFdKSA+IDApOworCisgIGlmIChVTkxJS0VMWSAobXBuX2NtcCAoYXAsIGJwLCBuKSA9PSAwKSkKKyAgICB7CisgICAgICAvKiBNdXN0IHJldHVybiB0aGUgc21hbGxlc3QgY29mYWN0b3IsICt1MSBvciAtdTAgKi8KKyAgICAgIGludCBjOworCisgICAgICBNUE5fQ09QWSAoZ3AsIGFwLCBuKTsKKworICAgICAgTVBOX0NNUCAoYywgdTAsIHUxLCB1bik7CisgICAgICAvKiBjID09IDAgY2FuIGhhcHBlbiBvbmx5IHdoZW4gQSA9ICgyaysxKSBHLCBCID0gMiBHLiBBbmQgaW4KKwkgdGhpcyBjYXNlIHdlIGNob29zZSB0aGUgY29mYWN0b3IgKyAxLCBjb3JyZXNwb25kaW5nIHRvIEcgPSBBCisJIC0gayBCLCByYXRoZXIgdGhhbiAtMSwgY29ycmVzcG9uZGluZyB0byBHID0gLSBBICsgKGsrMSkgQi4gKi8KKyAgICAgIEFTU0VSVCAoYyAhPSAwIHx8ICh1biA9PSAxICYmIHUwWzBdID09IDEgJiYgdTFbMF0gPT0gMSkpOworICAgICAgaWYgKGMgPCAwKQorCXsKKwkgIE1QTl9OT1JNQUxJWkUgKHUwLCB1bik7CisJICBNUE5fQ09QWSAodXAsIHUwLCB1bik7CisJICAqdXNpemVwID0gLXVuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fTk9STUFMSVpFX05PVF9aRVJPICh1MSwgdW4pOworCSAgTVBOX0NPUFkgKHVwLCB1MSwgdW4pOworCSAgKnVzaXplcCA9IHVuOworCX0KKworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm4gbjsKKyAgICB9CisgIGVsc2UgaWYgKFVOTElLRUxZICh1MFswXSA9PSAwKSAmJiB1biA9PSAxKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBnbjsKKyAgICAgIEFTU0VSVCAodTFbMF0gPT0gMSk7CisKKyAgICAgIC8qIGcgPSB1IGEgKyB2IGIgPSAodSB1MSAtIHYgdTApIEEgKyAoLi4uKSBCID0gdSBBICsgKC4uLikgQiAqLworICAgICAgZ24gPSBtcG5fZ2NkZXh0X2xlaG1lcl9uIChncCwgdXAsIHVzaXplcCwgYXAsIGJwLCBuLCB0cCk7CisKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuIGduOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCB1MG47CisgICAgICBtcF9zaXplX3QgdTFuOworICAgICAgbXBfc2l6ZV90IGxlaG1lcl91bjsKKyAgICAgIG1wX3NpemVfdCBsZWhtZXJfdm47CisgICAgICBtcF9zaXplX3QgZ247CisKKyAgICAgIG1wX3B0ciBsZWhtZXJfdXA7CisgICAgICBtcF9wdHIgbGVobWVyX3ZwOworICAgICAgaW50IG5lZ2F0ZTsKKworICAgICAgbGVobWVyX3VwID0gdHA7IHRwICs9IG47CisKKyAgICAgIC8qIENhbGwgbXBuX2djZGV4dF9sZWhtZXJfbiB3aXRoIGNvcGllcyBvZiBhIGFuZCBiLiAqLworICAgICAgTVBOX0NPUFkgKHRwLCBhcCwgbik7CisgICAgICBNUE5fQ09QWSAodHAgKyBuLCBicCwgbik7CisgICAgICBnbiA9IG1wbl9nY2RleHRfbGVobWVyX24gKGdwLCBsZWhtZXJfdXAsICZsZWhtZXJfdW4sIHRwLCB0cCArIG4sIG4sIHRwICsgMipuKTsKKworICAgICAgdTBuID0gdW47CisgICAgICBNUE5fTk9STUFMSVpFICh1MCwgdTBuKTsKKyAgICAgIEFTU0VSVCAodTBuID4gMCk7CisKKyAgICAgIGlmIChsZWhtZXJfdW4gPT0gMCkKKwl7CisJICAvKiB1ID09IDAgID09PiAgdiA9IGcgLyBiID09IDEgID09PiBnID0gLSB1MCBBICsgKC4uLikgQiAqLworCSAgTVBOX0NPUFkgKHVwLCB1MCwgdTBuKTsKKwkgICp1c2l6ZXAgPSAtdTBuOworCisJICBUTVBfRlJFRTsKKwkgIHJldHVybiBnbjsKKwl9CisKKyAgICAgIGxlaG1lcl92cCA9IHRwOworICAgICAgLyogQ29tcHV0ZSB2ID0gKGcgLSB1IGEpIC8gYiAqLworICAgICAgbGVobWVyX3ZuID0gY29tcHV0ZV92IChsZWhtZXJfdnAsCisJCQkgICAgIGFwLCBicCwgbiwgZ3AsIGduLCBsZWhtZXJfdXAsIGxlaG1lcl91biwgdHAgKyBuICsgMSk7CisKKyAgICAgIGlmIChsZWhtZXJfdW4gPiAwKQorCW5lZ2F0ZSA9IDA7CisgICAgICBlbHNlCisJeworCSAgbGVobWVyX3VuID0gLWxlaG1lcl91bjsKKwkgIG5lZ2F0ZSA9IDE7CisJfQorCisgICAgICB1MW4gPSB1bjsKKyAgICAgIE1QTl9OT1JNQUxJWkUgKHUxLCB1MW4pOworICAgICAgQVNTRVJUICh1MW4gPiAwKTsKKworICAgICAgQVNTRVJUIChsZWhtZXJfdW4gKyB1MW4gPD0gdWFsbG9jKTsKKyAgICAgIEFTU0VSVCAobGVobWVyX3ZuICsgdTBuIDw9IHVhbGxvYyk7CisKKyAgICAgIC8qIFdlIG1heSBzdGlsbCBoYXZlIHYgPT0gMCAqLworCisgICAgICAvKiBDb21wdXRlIHUgdTAgKi8KKyAgICAgIGlmIChsZWhtZXJfdW4gPD0gdTFuKQorCS8qIFNob3VsZCBiZSB0aGUgY29tbW9uIGNhc2UgKi8KKwltcG5fbXVsICh1cCwgdTEsIHUxbiwgbGVobWVyX3VwLCBsZWhtZXJfdW4pOworICAgICAgZWxzZQorCW1wbl9tdWwgKHVwLCBsZWhtZXJfdXAsIGxlaG1lcl91biwgdTEsIHUxbik7CisKKyAgICAgIHVuID0gdTFuICsgbGVobWVyX3VuOworICAgICAgdW4gLT0gKHVwW3VuIC0gMV0gPT0gMCk7CisKKyAgICAgIGlmIChsZWhtZXJfdm4gPiAwKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKworCSAgLyogT3ZlcndyaXRlcyBvbGQgdTEgdmFsdWUgKi8KKwkgIGlmIChsZWhtZXJfdm4gPD0gdTBuKQorCSAgICAvKiBTaG91bGQgYmUgdGhlIGNvbW1vbiBjYXNlICovCisJICAgIG1wbl9tdWwgKHUxLCB1MCwgdTBuLCBsZWhtZXJfdnAsIGxlaG1lcl92bik7CisJICBlbHNlCisJICAgIG1wbl9tdWwgKHUxLCBsZWhtZXJfdnAsIGxlaG1lcl92biwgdTAsIHUwbik7CisKKwkgIHUxbiA9IHUwbiArIGxlaG1lcl92bjsKKwkgIHUxbiAtPSAodTFbdTFuIC0gMV0gPT0gMCk7CisKKwkgIGlmICh1MW4gPD0gdW4pCisJICAgIHsKKwkgICAgICBjeSA9IG1wbl9hZGQgKHVwLCB1cCwgdW4sIHUxLCB1MW4pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjeSA9IG1wbl9hZGQgKHVwLCB1MSwgdTFuLCB1cCwgdW4pOworCSAgICAgIHVuID0gdTFuOworCSAgICB9CisJICB1cFt1bl0gPSBjeTsKKwkgIHVuICs9IChjeSAhPSAwKTsKKworCSAgQVNTRVJUICh1biA8IHVhbGxvYyk7CisJfQorICAgICAgKnVzaXplcCA9IG5lZ2F0ZSA/IC11biA6IHVuOworCisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybiBnbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9nY2RleHRfMS5jIGIvbXBuL2dlbmVyaWMvZ2NkZXh0XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIxYTkyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkZXh0XzEuYwpAQCAtMCwwICsxLDI3NSBAQAorLyogbXBuX2djZGV4dCAtLSBFeHRlbmRlZCBHcmVhdGVzdCBDb21tb24gRGl2aXNvci4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTgsIDIwMDAtMjAwNSwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBHQ0RFWFRfMV9VU0VfQklOQVJZCisjZGVmaW5lIEdDREVYVF8xX1VTRV9CSU5BUlkgMAorI2VuZGlmCisKKyNpZm5kZWYgR0NERVhUXzFfQklOQVJZX01FVEhPRAorI2RlZmluZSBHQ0RFWFRfMV9CSU5BUllfTUVUSE9EIDIKKyNlbmRpZgorCisjaWYgR0NERVhUXzFfVVNFX0JJTkFSWQorCittcF9saW1iX3QKK21wbl9nY2RleHRfMSAobXBfbGltYl9zaWduZWRfdCAqc3AsIG1wX2xpbWJfc2lnbmVkX3QgKnRwLAorCSAgICAgIG1wX2xpbWJfdCB1LCBtcF9saW1iX3QgdikKK3sKKyAgLyogTWFpbnRhaW4KKworICAgICBVID0gdDEgdSArIHQwIHYKKyAgICAgViA9IHMxIHUgKyBzMCB2CisKKyAgICAgd2hlcmUgVSwgViBhcmUgdGhlIGlucHV0cyAod2l0aG91dCBhbnkgc2hhcmVkIHBvd2VyIG9mIHR3byksCisgICAgIGFuZCB0aGUgbWF0cml4IGhhcyBkZXRlcm1pbmFudCCxIDJee3NoaWZ0fS4KKyAgKi8KKyAgbXBfbGltYl90IHMwID0gMTsKKyAgbXBfbGltYl90IHQwID0gMDsKKyAgbXBfbGltYl90IHMxID0gMDsKKyAgbXBfbGltYl90IHQxID0gMTsKKyAgbXBfbGltYl90IHVnOworICBtcF9saW1iX3Qgdmc7CisgIG1wX2xpbWJfdCB1Z2g7CisgIG1wX2xpbWJfdCB2Z2g7CisgIHVuc2lnbmVkIHplcm9fYml0czsKKyAgdW5zaWduZWQgc2hpZnQ7CisgIHVuc2lnbmVkIGk7CisjaWYgR0NERVhUXzFfQklOQVJZX01FVEhPRCA9PSAyCisgIG1wX2xpbWJfdCBkZXRfc2lnbjsKKyNlbmRpZgorCisgIEFTU0VSVCAodSA+IDApOworICBBU1NFUlQgKHYgPiAwKTsKKworICBjb3VudF90cmFpbGluZ196ZXJvcyAoemVyb19iaXRzLCB1IHwgdik7CisgIHUgPj49IHplcm9fYml0czsKKyAgdiA+Pj0gemVyb19iaXRzOworCisgIGlmICgodSAmIDEpID09IDApCisgICAgeworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHNoaWZ0LCB1KTsKKyAgICAgIHUgPj49IHNoaWZ0OworICAgICAgdDEgPDw9IHNoaWZ0OworICAgIH0KKyAgZWxzZSBpZiAoKHYgJiAxKSA9PSAwKQorICAgIHsKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChzaGlmdCwgdik7CisgICAgICB2ID4+PSBzaGlmdDsKKyAgICAgIHMwIDw8PSBzaGlmdDsKKyAgICB9CisgIGVsc2UKKyAgICBzaGlmdCA9IDA7CisKKyNpZiBHQ0RFWFRfMV9CSU5BUllfTUVUSE9EID09IDEKKyAgd2hpbGUgKHUgIT0gdikKKyAgICB7CisgICAgICB1bnNpZ25lZCBjb3VudDsKKyAgICAgIGlmICh1ID4gdikKKwl7CisJICB1IC09IHY7CisKKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjb3VudCwgdSk7CisJICB1ID4+PSBjb3VudDsKKworCSAgdDAgKz0gdDE7IHQxIDw8PSBjb3VudDsKKwkgIHMwICs9IHMxOyBzMSA8PD0gY291bnQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHYgLT0gdTsKKworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNvdW50LCB2KTsKKwkgIHYgPj49IGNvdW50OworCisJICB0MSArPSB0MDsgdDAgPDw9IGNvdW50OworCSAgczEgKz0gczA7IHMwIDw8PSBjb3VudDsKKwl9CisgICAgICBzaGlmdCArPSBjb3VudDsKKyAgICB9CisjZWxzZQorIyBpZiBHQ0RFWFRfMV9CSU5BUllfTUVUSE9EID09IDIKKyAgdSA+Pj0gMTsKKyAgdiA+Pj0gMTsKKworICBkZXRfc2lnbiA9IDA7CisKKyAgd2hpbGUgKHUgIT0gdikKKyAgICB7CisgICAgICB1bnNpZ25lZCBjb3VudDsKKyAgICAgIG1wX2xpbWJfdCBkID0gIHUgLSB2OworICAgICAgbXBfbGltYl90IHZndHUgPSBMSU1CX0hJR0hCSVRfVE9fTUFTSyAoZCk7CisgICAgICBtcF9saW1iX3Qgc3g7CisgICAgICBtcF9saW1iX3QgdHg7CisKKyAgICAgIC8qIFdoZW4gdiA8PSB1ICh2Z3R1ID09IDApLCB0aGUgdXBkYXRlcyBhcmU6CisKKwkgICAodTsgdikgICA8LS0gKCAodSAtIHYpID4+IGNvdW50OyB2KSAgICAoZGV0ID0gKygxPDxjb3VudCkgZm9yIGNvcnIuIE0gZmFjdG9yKQorCSAgICh0MSwgdDApIDwtLSAodDEgPDwgY291bnQsIHQwICsgdDEpCisKKwkgYW5kIHdoZW4gdiA+IDAsIHRoZSB1cGRhdGVzIGFyZQorCisJICAgKHU7IHYpICAgPC0tICggKHYgLSB1KSA+PiBjb3VudDsgdSkgICAgKGRldCA9IC0oMTw8Y291bnQpKQorCSAgICh0MSwgdDApIDwtLSAodDAgPDwgY291bnQsIHQwICsgdDEpCisKKwkgYW5kIHNpbWlsYXJseSBmb3IgczEsIHMwCisgICAgICAqLworCisgICAgICAvKiB2IDwtLSBtaW4gKHUsIHYpICovCisgICAgICB2ICs9ICh2Z3R1ICYgZCk7CisKKyAgICAgIC8qIHUgPC0tIHx1IC0gdnwgKi8KKyAgICAgIHUgPSAoZCBeIHZndHUpIC0gdmd0dTsKKworICAgICAgLyogTnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zIGlzIHRoZSBzYW1lIG5vIG1hdHRlciBpZiB3ZSBsb29rIGF0CisgICAgICAgKiBkIG9yIHUsIGJ1dCB1c2luZyBkIGdpdmVzIG1vcmUgcGFyYWxsZWxpc20uICovCisgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAoY291bnQsIGQpOworCisgICAgICBkZXRfc2lnbiBePSB2Z3R1OworCisgICAgICB0eCA9IHZndHUgJiAodDAgLSB0MSk7CisgICAgICBzeCA9IHZndHUgJiAoczAgLSBzMSk7CisgICAgICB0MCArPSB0MTsKKyAgICAgIHMwICs9IHMxOworICAgICAgdDEgKz0gdHg7CisgICAgICBzMSArPSBzeDsKKworICAgICAgY291bnQrKzsKKyAgICAgIHUgPj49IGNvdW50OworICAgICAgdDEgPDw9IGNvdW50OworICAgICAgczEgPDw9IGNvdW50OworICAgICAgc2hpZnQgKz0gY291bnQ7CisgICAgfQorICB1ID0gKHUgPDwgMSkgKyAxOworIyBlbHNlIC8qIEdDREVYVF8xX0JJTkFSWV9NRVRIT0QgPT0gMiAqLworIyAgZXJyb3IgVW5rbm93biBHQ0RFWFRfMV9CSU5BUllfTUVUSE9ECisjIGVuZGlmCisjZW5kaWYKKworICAvKiBOb3cgdSA9IHYgPSBnID0gZ2NkICh1LHYpLiBDb21wdXRlIFUvZyBhbmQgVi9nICovCisgIHVnID0gdDAgKyB0MTsKKyAgdmcgPSBzMCArIHMxOworCisgIHVnaCA9IHVnLzIgKyAodWcgJiAxKTsKKyAgdmdoID0gdmcvMiArICh2ZyAmIDEpOworCisgIC8qIE5vdyAyXntzaGlmdH0gZyA9IHMwIFUgLSB0MCBWLiBHZXQgcmlkIG9mIHRoZSBwb3dlciBvZiB0d28sIHVzaW5nCisgICAgIHMwIFUgLSB0MCBWID0gKHMwICsgVi9nKSBVIC0gKHQwICsgVS9nKSBWLiAqLworICBmb3IgKGkgPSAwOyBpIDwgc2hpZnQ7IGkrKykKKyAgICB7CisgICAgICBtcF9saW1iX3QgbWFzayA9IC0gKCAoczAgfCB0MCkgJiAxKTsKKworICAgICAgczAgLz0gMjsKKyAgICAgIHQwIC89IDI7CisgICAgICBzMCArPSBtYXNrICYgdmdoOworICAgICAgdDAgKz0gbWFzayAmIHVnaDsKKyAgICB9CisKKyAgQVNTRVJUX0FMV0FZUyAoczAgPD0gdmcpOworICBBU1NFUlRfQUxXQVlTICh0MCA8PSB1Zyk7CisKKyAgaWYgKHMwID4gdmcgLSBzMCkKKyAgICB7CisgICAgICBzMCAtPSB2ZzsKKyAgICAgIHQwIC09IHVnOworICAgIH0KKyNpZiBHQ0RFWFRfMV9CSU5BUllfTUVUSE9EID09IDIKKyAgLyogQ29uZGl0aW9uYWwgbmVnYXRpb24uICovCisgIHMwID0gKHMwIF4gZGV0X3NpZ24pIC0gZGV0X3NpZ247CisgIHQwID0gKHQwIF4gZGV0X3NpZ24pIC0gZGV0X3NpZ247CisjZW5kaWYKKyAgKnNwID0gczA7CisgICp0cCA9IC10MDsKKworICByZXR1cm4gdSA8PCB6ZXJvX2JpdHM7Cit9CisKKyNlbHNlIC8qICFHQ0RFWFRfMV9VU0VfQklOQVJZICovCisKKworLyogRklYTUU6IFRha2VzIHR3byBzaW5nbGUtd29yZCBsaW1icy4gSXQgY291bGQgYmUgZXh0ZW5kZWQgdG8gYQorICogZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgYmlnbnVtIGZvciB0aGUgZmlyc3QgaW5wdXQsIGFuZCBvbmx5CisgKiByZXR1cm5zIHRoZSBmaXJzdCBjby1mYWN0b3IuICovCisKK21wX2xpbWJfdAorbXBuX2djZGV4dF8xIChtcF9saW1iX3NpZ25lZF90ICp1cCwgbXBfbGltYl9zaWduZWRfdCAqdnAsCisJICAgICAgbXBfbGltYl90IGEsIG1wX2xpbWJfdCBiKQoreworICAvKiBNYWludGFpbgorCisgICAgIGEgPSAgdTAgQSArIHYwIEIKKyAgICAgYiA9ICB1MSBBICsgdjEgQgorCisgICAgIHdoZXJlIEEsIEIgYXJlIHRoZSBvcmlnaW5hbCBpbnB1dHMuCisgICovCisgIG1wX2xpbWJfc2lnbmVkX3QgdTAgPSAxOworICBtcF9saW1iX3NpZ25lZF90IHYwID0gMDsKKyAgbXBfbGltYl9zaWduZWRfdCB1MSA9IDA7CisgIG1wX2xpbWJfc2lnbmVkX3QgdjEgPSAxOworCisgIEFTU0VSVCAoYSA+IDApOworICBBU1NFUlQgKGIgPiAwKTsKKworICBpZiAoYSA8IGIpCisgICAgZ290byBkaXZpZGVfYnlfYjsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxOworCisgICAgICBxID0gYSAvIGI7CisgICAgICBhIC09IHEgKiBiOworCisgICAgICBpZiAoYSA9PSAwKQorCXsKKwkgICp1cCA9IHUxOworCSAgKnZwID0gdjE7CisJICByZXR1cm4gYjsKKwl9CisgICAgICB1MCAtPSBxICogdTE7CisgICAgICB2MCAtPSBxICogdjE7CisKKyAgICBkaXZpZGVfYnlfYjoKKyAgICAgIHEgPSBiIC8gYTsKKyAgICAgIGIgLT0gcSAqIGE7CisKKyAgICAgIGlmIChiID09IDApCisJeworCSAgKnVwID0gdTA7CisJICAqdnAgPSB2MDsKKwkgIHJldHVybiBhOworCX0KKyAgICAgIHUxIC09IHEgKiB1MDsKKyAgICAgIHYxIC09IHEgKiB2MDsKKyAgICB9Cit9CisjZW5kaWYgLyogIUdDREVYVF8xX1VTRV9CSU5BUlkgKi8KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2djZGV4dF9sZWhtZXIuYyBiL21wbi9nZW5lcmljL2djZGV4dF9sZWhtZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRlODZkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2NkZXh0X2xlaG1lci5jCkBAIC0wLDAgKzEsMzM2IEBACisvKiBtcG5fZ2NkZXh0IC0tIEV4dGVuZGVkIEdyZWF0ZXN0IENvbW1vbiBEaXZpc29yLgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OCwgMjAwMC0yMDA1LCAyMDA4LCAyMDA5LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogSGVyZSwgZCBpcyB0aGUgaW5kZXggb2YgdGhlIGNvZmFjdG9yIHRvIHVwZGF0ZS4gRklYTUU6IENvdWxkIHVzZSBxbgorICAgPSAwIGZvciB0aGUgY29tbW9uIGNhc2UgcSA9IDEuICovCit2b2lkCittcG5fZ2NkZXh0X2hvb2sgKHZvaWQgKnAsIG1wX3NyY3B0ciBncCwgbXBfc2l6ZV90IGduLAorCQkgbXBfc3JjcHRyIHFwLCBtcF9zaXplX3QgcW4sIGludCBkKQoreworICBzdHJ1Y3QgZ2NkZXh0X2N0eCAqY3R4ID0gKHN0cnVjdCBnY2RleHRfY3R4ICopIHA7CisgIG1wX3NpemVfdCB1biA9IGN0eC0+dW47CisKKyAgaWYgKGdwKQorICAgIHsKKyAgICAgIG1wX3NyY3B0ciB1cDsKKworICAgICAgQVNTRVJUIChnbiA+IDApOworICAgICAgQVNTRVJUIChncFtnbi0xXSA+IDApOworCisgICAgICBNUE5fQ09QWSAoY3R4LT5ncCwgZ3AsIGduKTsKKyAgICAgIGN0eC0+Z24gPSBnbjsKKworICAgICAgaWYgKGQgPCAwKQorCXsKKwkgIGludCBjOworCisJICAvKiBNdXN0IHJldHVybiB0aGUgc21hbGxlc3QgY29mYWN0b3IsICt1MSBvciAtdTAgKi8KKwkgIE1QTl9DTVAgKGMsIGN0eC0+dTAsIGN0eC0+dTEsIHVuKTsKKwkgIEFTU0VSVCAoYyAhPSAwIHx8ICh1biA9PSAxICYmIGN0eC0+dTBbMF0gPT0gMSAmJiBjdHgtPnUxWzBdID09IDEpKTsKKworCSAgZCA9IGMgPCAwOworCX0KKworICAgICAgdXAgPSBkID8gY3R4LT51MCA6IGN0eC0+dTE7CisKKyAgICAgIE1QTl9OT1JNQUxJWkUgKHVwLCB1bik7CisgICAgICBNUE5fQ09QWSAoY3R4LT51cCwgdXAsIHVuKTsKKworICAgICAgKmN0eC0+dXNpemUgPSBkID8gLXVuIDogdW47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90IGN5OworICAgICAgbXBfcHRyIHUwID0gY3R4LT51MDsKKyAgICAgIG1wX3B0ciB1MSA9IGN0eC0+dTE7CisKKyAgICAgIEFTU0VSVCAoZCA+PSAwKTsKKworICAgICAgaWYgKGQpCisJTVBfUFRSX1NXQVAgKHUwLCB1MSk7CisKKyAgICAgIHFuIC09IChxcFtxbi0xXSA9PSAwKTsKKworICAgICAgLyogVXBkYXRlIHUwICs9IHEgICogdTEgKi8KKyAgICAgIGlmIChxbiA9PSAxKQorCXsKKwkgIG1wX2xpbWJfdCBxID0gcXBbMF07CisKKwkgIGlmIChxID09IDEpCisJICAgIC8qIEEgY29tbW9uIGNhc2UuICovCisJICAgIGN5ID0gbXBuX2FkZF9uICh1MCwgdTAsIHUxLCB1bik7CisJICBlbHNlCisJICAgIGN5ID0gbXBuX2FkZG11bF8xICh1MCwgdTEsIHVuLCBxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfc2l6ZV90IHUxbjsKKwkgIG1wX3B0ciB0cDsKKworCSAgdTFuID0gdW47CisJICBNUE5fTk9STUFMSVpFICh1MSwgdTFuKTsKKworCSAgaWYgKHUxbiA9PSAwKQorCSAgICByZXR1cm47CisKKwkgIC8qIFNob3VsZCBhbHdheXMgaGF2ZSB1MW4gPT0gdW4gaGVyZSwgYW5kIHUxID49IHUwLiBUaGUKKwkgICAgIHJlYXNvbiBpcyB0aGF0IHdlIGFsdGVybmF0ZSBhZGRpbmcgdTAgdG8gdTEgYW5kIHUxIHRvIHUwCisJICAgICAoY29ycmVzcG9uZGluZyB0byBzdWJ0cmFjdGlvbnMgYSAtIGIgYW5kIGIgLSBhKSwgYW5kIHdlCisJICAgICBjYW4gZ2V0IGEgbGFyZ2UgcXVvdGllbnQgb25seSBqdXN0IGFmdGVyIGEgc3dpdGNoLCB3aGljaAorCSAgICAgbWVhbnMgdGhhdCB3ZSdsbCBhZGQgKGEgbXVsdGlwbGUgb2YpIHRoZSBsYXJnZXIgdSB0byB0aGUKKwkgICAgIHNtYWxsZXIuICovCisKKwkgIHRwID0gY3R4LT50cDsKKworCSAgaWYgKHFuID4gdTFuKQorCSAgICBtcG5fbXVsICh0cCwgcXAsIHFuLCB1MSwgdTFuKTsKKwkgIGVsc2UKKwkgICAgbXBuX211bCAodHAsIHUxLCB1MW4sIHFwLCBxbik7CisKKwkgIHUxbiArPSBxbjsKKwkgIHUxbiAtPSB0cFt1MW4tMV0gPT0gMDsKKworCSAgaWYgKHUxbiA+PSB1bikKKwkgICAgeworCSAgICAgIGN5ID0gbXBuX2FkZCAodTAsIHRwLCB1MW4sIHUwLCB1bik7CisJICAgICAgdW4gPSB1MW47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogTm90ZTogVW5saWtlbHkgY2FzZSwgbWF5YmUgbmV2ZXIgaGFwcGVucz8gKi8KKwkgICAgY3kgPSBtcG5fYWRkICh1MCwgdTAsIHVuLCB0cCwgdTFuKTsKKworCX0KKyAgICAgIHUwW3VuXSA9IGN5OworICAgICAgY3R4LT51biA9IHVuICsgKGN5ID4gMCk7CisgICAgfQorfQorCisvKiBUZW1wb3Jhcnkgc3RvcmFnZTogMyoobisxKSBmb3IgdS4gSWYgaGdjZDIgc3VjY2VlZHMsIHdlIG5lZWQgbiBmb3IKKyAgIHRoZSBtYXRyaXgtdmVjdG9yIG11bHRpcGxpY2F0aW9uIGFkanVzdGluZyBhLCBiLiBJZiBoZ2NkIGZhaWxzLCB3ZQorICAgbmVlZCBhdCBtb3N0IG4gZm9yIHRoZSBxdW90aWVudCBhbmQgbisxIGZvciB0aGUgdSB1cGRhdGUgKHJldXNpbmcKKyAgIHRoZSBleHRyYSB1KS4gSW4gYWxsLCA0biArIDMuICovCisKK21wX3NpemVfdAorbXBuX2djZGV4dF9sZWhtZXJfbiAobXBfcHRyIGdwLCBtcF9wdHIgdXAsIG1wX3NpemVfdCAqdXNpemUsCisJCSAgICAgbXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLAorCQkgICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IHVhbGxvYyA9IG4gKyAxOworCisgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBzZWNvbmQgcm93IG9mIHRoZSByZWR1Y3Rpb24gbWF0cml4CisgICAqCisgICAqICAgTSA9ICh2MCwgdjEgOyB1MCwgdTEpCisgICAqCisgICAqIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgaW52ZXJzZQorICAgKgorICAgKiAgIE1eey0xfSA9ICh1MSwgLXYxOyAtdTAsIHYwKQorICAgKgorICAgKiBUaGlzIGltcGxpZXMgdGhhdAorICAgKgorICAgKiAgIGEgPSAgdTEgQSAobW9kIEIpCisgICAqICAgYiA9IC11MCBBIChtb2QgQikKKyAgICoKKyAgICogd2hlcmUgQSwgQiBkZW5vdGVzIHRoZSBpbnB1dCB2YWx1ZXMuCisgICAqLworCisgIHN0cnVjdCBnY2RleHRfY3R4IGN0eDsKKyAgbXBfc2l6ZV90IHVuOworICBtcF9wdHIgdTA7CisgIG1wX3B0ciB1MTsKKyAgbXBfcHRyIHUyOworCisgIE1QTl9aRVJPICh0cCwgMyp1YWxsb2MpOworICB1MCA9IHRwOyB0cCArPSB1YWxsb2M7CisgIHUxID0gdHA7IHRwICs9IHVhbGxvYzsKKyAgdTIgPSB0cDsgdHAgKz0gdWFsbG9jOworCisgIHUxWzBdID0gMTsgdW4gPSAxOworCisgIGN0eC5ncCA9IGdwOworICBjdHgudXAgPSB1cDsKKyAgY3R4LnVzaXplID0gdXNpemU7CisKKyAgLyogRklYTUU6IEhhbmRsZSBuID09IDIgZGlmZmVyZW50bHksIGFmdGVyIHRoZSBsb29wPyAqLworICB3aGlsZSAobiA+PSAyKQorICAgIHsKKyAgICAgIHN0cnVjdCBoZ2NkX21hdHJpeDEgTTsKKyAgICAgIG1wX2xpbWJfdCBhaCwgYWwsIGJoLCBibDsKKyAgICAgIG1wX2xpbWJfdCBtYXNrOworCisgICAgICBtYXNrID0gYXBbbi0xXSB8IGJwW24tMV07CisgICAgICBBU1NFUlQgKG1hc2sgPiAwKTsKKworICAgICAgaWYgKG1hc2sgJiBHTVBfTlVNQl9ISUdIQklUKQorCXsKKwkgIGFoID0gYXBbbi0xXTsgYWwgPSBhcFtuLTJdOworCSAgYmggPSBicFtuLTFdOyBibCA9IGJwW24tMl07CisJfQorICAgICAgZWxzZSBpZiAobiA9PSAyKQorCXsKKwkgIC8qIFdlIHVzZSB0aGUgZnVsbCBpbnB1dHMgd2l0aG91dCB0cnVuY2F0aW9uLCBzbyB3ZSBjYW4KKwkgICAgIHNhZmVseSBzaGlmdCBsZWZ0LiAqLworCSAgaW50IHNoaWZ0OworCisJICBjb3VudF9sZWFkaW5nX3plcm9zIChzaGlmdCwgbWFzayk7CisJICBhaCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBhcFsxXSwgYXBbMF0pOworCSAgYWwgPSBhcFswXSA8PCBzaGlmdDsKKwkgIGJoID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGJwWzFdLCBicFswXSk7CisJICBibCA9IGJwWzBdIDw8IHNoaWZ0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgc2hpZnQ7CisKKwkgIGNvdW50X2xlYWRpbmdfemVyb3MgKHNoaWZ0LCBtYXNrKTsKKwkgIGFoID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGFwW24tMV0sIGFwW24tMl0pOworCSAgYWwgPSBNUE5fRVhUUkFDVF9OVU1CIChzaGlmdCwgYXBbbi0yXSwgYXBbbi0zXSk7CisJICBiaCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBicFtuLTFdLCBicFtuLTJdKTsKKwkgIGJsID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGJwW24tMl0sIGJwW24tM10pOworCX0KKworICAgICAgLyogVHJ5IGFuIG1wbl9uaGdjZDIgc3RlcCAqLworICAgICAgaWYgKG1wbl9oZ2NkMiAoYWgsIGFsLCBiaCwgYmwsICZNKSkKKwl7CisJICBuID0gbXBuX21hdHJpeDIyX211bDFfaW52ZXJzZV92ZWN0b3IgKCZNLCB0cCwgYXAsIGJwLCBuKTsKKwkgIE1QX1BUUl9TV0FQIChhcCwgdHApOworCSAgdW4gPSBtcG5faGdjZF9tdWxfbWF0cml4MV92ZWN0b3IoJk0sIHUyLCB1MCwgdTEsIHVuKTsKKwkgIE1QX1BUUl9TV0FQICh1MCwgdTIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBtcG5faGdjZDIgaGFzIGZhaWxlZC4gVGhlbiBlaXRoZXIgb25lIG9mIGEgb3IgYiBpcyB2ZXJ5CisJICAgICBzbWFsbCwgb3IgdGhlIGRpZmZlcmVuY2UgaXMgdmVyeSBzbWFsbC4gUGVyZm9ybSBvbmUKKwkgICAgIHN1YnRyYWN0aW9uIGZvbGxvd2VkIGJ5IG9uZSBkaXZpc2lvbi4gKi8KKwkgIGN0eC51MCA9IHUwOworCSAgY3R4LnUxID0gdTE7CisJICBjdHgudHAgPSB1MjsKKwkgIGN0eC51biA9IHVuOworCisJICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBuIGZvciB0aGUgcXVvdGllbnQgYW5kIHVhbGxvYyBmb3IgdGhlCisJICAgICBuZXcgY29mYWN0b3IuICovCisJICBuID0gbXBuX2djZF9zdWJkaXZfc3RlcCAoYXAsIGJwLCBuLCAwLCBtcG5fZ2NkZXh0X2hvb2ssICZjdHgsIHRwKTsKKwkgIGlmIChuID09IDApCisJICAgIHJldHVybiBjdHguZ247CisKKwkgIHVuID0gY3R4LnVuOworCX0KKyAgICB9CisgIEFTU0VSVF9BTFdBWVMgKGFwWzBdID4gMCk7CisgIEFTU0VSVF9BTFdBWVMgKGJwWzBdID4gMCk7CisKKyAgaWYgKGFwWzBdID09IGJwWzBdKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICAvKiBXaGljaCBjb2ZhY3RvciB0byByZXR1cm4gbm93PyBDYW5kaWRhdGVzIGFyZSArdTEgYW5kIC11MCwKKwkgZGVwZW5kaW5nIG9uIHdoaWNoIG9mIGEgYW5kIGIgd2FzIG1vc3QgcmVjZW50bHkgcmVkdWNlZCwKKwkgd2hpY2ggd2UgZG9uJ3Qga2VlcCB0cmFjayBvZi4gU28gY29tcGFyZSBhbmQgZ2V0IHRoZSBzbWFsbGVzdAorCSBvbmUuICovCisKKyAgICAgIGdwWzBdID0gYXBbMF07CisKKyAgICAgIE1QTl9DTVAgKGMsIHUwLCB1MSwgdW4pOworICAgICAgQVNTRVJUIChjICE9IDAgfHwgKHVuID09IDEgJiYgdTBbMF0gPT0gMSAmJiB1MVswXSA9PSAxKSk7CisgICAgICBpZiAoYyA8IDApCisJeworCSAgTVBOX05PUk1BTElaRSAodTAsIHVuKTsKKwkgIE1QTl9DT1BZICh1cCwgdTAsIHVuKTsKKwkgICp1c2l6ZSA9IC11bjsKKwl9CisgICAgICBlbHNlCisJeworCSAgTVBOX05PUk1BTElaRV9OT1RfWkVSTyAodTEsIHVuKTsKKwkgIE1QTl9DT1BZICh1cCwgdTEsIHVuKTsKKwkgICp1c2l6ZSA9IHVuOworCX0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB1aCwgdmg7CisgICAgICBtcF9saW1iX3NpZ25lZF90IHU7CisgICAgICBtcF9saW1iX3NpZ25lZF90IHY7CisgICAgICBpbnQgbmVnYXRlOworCisgICAgICBncFswXSA9IG1wbl9nY2RleHRfMSAoJnUsICZ2LCBhcFswXSwgYnBbMF0pOworCisgICAgICAvKiBTZXQgdXAgPSB1IHUxIC0gdiB1MC4gS2VlcCB0cmFjayBvZiBzaXplLCB1biBncm93cyBieSBvbmUgb3IKKwkgdHdvIGxpbWJzLiAqLworCisgICAgICBpZiAodSA9PSAwKQorCXsKKwkgIEFTU0VSVCAodiA9PSAxKTsKKwkgIE1QTl9OT1JNQUxJWkUgKHUwLCB1bik7CisJICBNUE5fQ09QWSAodXAsIHUwLCB1bik7CisJICAqdXNpemUgPSAtdW47CisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlIGlmICh2ID09IDApCisJeworCSAgQVNTRVJUICh1ID09IDEpOworCSAgTVBOX05PUk1BTElaRSAodTEsIHVuKTsKKwkgIE1QTl9DT1BZICh1cCwgdTEsIHVuKTsKKwkgICp1c2l6ZSA9IHVuOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAodSA+IDApCisJeworCSAgbmVnYXRlID0gMDsKKwkgIEFTU0VSVCAodiA8IDApOworCSAgdiA9IC12OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBuZWdhdGUgPSAxOworCSAgQVNTRVJUICh2ID4gMCk7CisJICB1ID0gLXU7CisJfQorCisgICAgICB1aCA9IG1wbl9tdWxfMSAodXAsIHUxLCB1biwgdSk7CisgICAgICB2aCA9IG1wbl9hZGRtdWxfMSAodXAsIHUwLCB1biwgdik7CisKKyAgICAgIGlmICggKHVoIHwgdmgpID4gMCkKKwl7CisJICB1aCArPSB2aDsKKwkgIHVwW3VuKytdID0gdWg7CisJICBpZiAodWggPCB2aCkKKwkgICAgdXBbdW4rK10gPSAxOworCX0KKworICAgICAgTVBOX05PUk1BTElaRV9OT1RfWkVSTyAodXAsIHVuKTsKKworICAgICAgKnVzaXplID0gbmVnYXRlID8gLXVuIDogdW47CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9nZXRfZC5jIGIvbXBuL2dlbmVyaWMvZ2V0X2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFmM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ2V0X2QuYwpAQCAtMCwwICsxLDQzOCBAQAorLyogbXBuX2dldF9kIC0tIGxpbWJzIHRvIGRvdWJsZSBjb252ZXJzaW9uLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTIsIDIwMTggRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0ZMT0FUX0gKKyNpbmNsdWRlIDxmbG9hdC5oPiAgLyogZm9yIERCTF9NQU5UX0RJRyBhbmQgRkxUX1JBRElYICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBfR01QX0lFRUVfRkxPQVRTCisjZGVmaW5lIF9HTVBfSUVFRV9GTE9BVFMgMAorI2VuZGlmCisKKy8qIFRvIGZvcmNlIHVzZSBvZiB0aGUgZ2VuZXJpYyBDIGNvZGUgZm9yIHRlc3RpbmcsIHB1dAorICAgIiNkZWZpbmUgX0dNUF9JRUVFX0ZMT0FUUyAwIiBhdCB0aGlzIHBvaW50LiAgKi8KKworCisvKiBJbiBhbHBoYSBnY2MgcHJpb3IgdG8gMy40LCBzaWduZWQgREkgY29tcGFyaXNvbnMgaW52b2x2aW5nIGNvbnN0YW50cyBhcmUKKyAgIHJlYXJyYW5nZWQgZnJvbSAieCA8IG4iIHRvICJ4KygtbikgPCAwIiwgd2hpY2ggaXMgb2YgY291cnNlIGhvcGVsZXNzbHkKKyAgIHdyb25nIGlmIHRoYXQgYWRkaXRpb24gb3ZlcmZsb3dzLgorCisgICBUaGUgd29ya2Fyb3VuZCBoZXJlIGF2b2lkcyB0aGlzIGJ1ZyBieSBlbnN1cmluZyBuIGlzIG5vdCBhIGxpdGVyYWwgY29uc3RhbnQuCisgICBOb3RlIHRoYXQgdGhpcyBpcyBhbHBoYSBzcGVjaWZpYy4gIFRoZSBvZmZlbmRpbmcgdHJhbnNmb3JtYXRpb24gaXMvd2FzIGluCisgICBhbHBoYS5jIGFscGhhX2VtaXRfY29uZGl0aW9uYWxfYnJhbmNoKCkgdW5kZXIgIldlIHdhbnQgdG8gdXNlIGNtcGNjL2JjYyIuCisKKyAgIEJpemFycmVseSwgdGhpcyBoYXBwZW5zIGFsc28gd2l0aCBDcmF5IGNjIG9uIGFscGhhZXY1LWNyYXktdW5pY29zbWsyLjAuNi5YLAorICAgYW5kIGhhcyB0aGUgc2FtZSBzb2x1dGlvbi4gIERvbid0IGtub3cgd2h5IG9yIGhvdy4gICovCisKKyNpZiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV9hbHBoYQkJCQlcCisgICYmICgoZGVmaW5lZCAoX19HTlVDX18pICYmICEgX19HTVBfR05VQ19QUkVSRVEoMyw0KSkJXAorICAgICAgfHwgZGVmaW5lZCAoX0NSQVkpKQorc3RhdGljIHZvbGF0aWxlIGNvbnN0IGxvbmcgQ09OU1RfMTAyNCA9IDEwMjQ7CitzdGF0aWMgdm9sYXRpbGUgY29uc3QgbG9uZyBDT05TVF9ORUdfMTAyMyA9IC0xMDIzOworc3RhdGljIHZvbGF0aWxlIGNvbnN0IGxvbmcgQ09OU1RfTkVHXzEwMjJfU1VCXzUzID0gLTEwMjIgLSA1MzsKKyNlbHNlCisjZGVmaW5lIENPTlNUXzEwMjQJICAgICAgKDEwMjQpCisjZGVmaW5lIENPTlNUX05FR18xMDIzCSAgICAgICgtMTAyMykKKyNkZWZpbmUgQ09OU1RfTkVHXzEwMjJfU1VCXzUzICgtMTAyMiAtIDUzKQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSB2YWx1ZSB7cHRyLHNpemV9KjJeZXhwLCBhbmQgbmVnYXRpdmUgaWYgc2lnbjwwLiAgTXVzdCBoYXZlCisgICBzaXplPj0xLCBhbmQgYSBub24temVybyBoaWdoIGxpbWIgcHRyW3NpemUtMV0uCisKKyAgIFdoZW4gd2Uga25vdyB0aGUgZnAgZm9ybWF0LCB0aGUgcmVzdWx0IGlzIHRydW5jYXRlZCB0b3dhcmRzIHplcm8uICBUaGlzIGlzCisgICBjb25zaXN0ZW50IHdpdGggb3RoZXIgZ21wIGNvbnZlcnNpb25zLCBsaWtlIG1wel9zZXRfZiBvciBtcHpfc2V0X3EsIGFuZCBpcworICAgZWFzeSB0byBpbXBsZW1lbnQgYW5kIHRlc3QuCisKKyAgIFdoZW4gd2UgZG8gbm90IGtub3cgdGhlIGZvcm1hdCwgc3VjaCB0cnVuY2F0aW9uIHNlZW1zIG11Y2ggaGFyZGVyLiAgT25lCisgICB3b3VsZCBuZWVkIHRvIGRlZmVhdCBhbnkgcm91bmRpbmcgbW9kZSwgaW5jbHVkaW5nIHJvdW5kLXVwLgorCisgICBJdCdzIGZlbHQgdGhhdCBHTVAgaXMgbm90IHByaW1hcmlseSBjb25jZXJuZWQgd2l0aCBoYXJkd2FyZSBmbG9hdHMsIGFuZAorICAgcmVhbGx5IGlzbid0IGVuaGFuY2VkIGJ5IGdldHRpbmcgaW52b2x2ZWQgd2l0aCBoYXJkd2FyZSByb3VuZGluZyBtb2RlcworICAgKHdoaWNoIGNvdWxkIGV2ZW4gYmUgc29tZSB3ZWlyZCB1bmtub3duIHN0eWxlKSwgc28gc29tZXRoaW5nIHVuYW1iaWd1b3VzIGFuZAorICAgc3RyYWlnaHRmb3J3YXJkIGlzIGJlc3QuCisKKworICAgVGhlIElFRUUgY29kZSBiZWxvdyBpcyB0aGUgdXN1YWwgY2FzZSwgaXQga25vd3MgZWl0aGVyIGEgMzItYml0IG9yIDY0LWJpdAorICAgbGltYiBhbmQgaXMgZG9uZSB3aXRoIHNoaWZ0cyBhbmQgbWFza3MuICBUaGUgNjQtYml0IGNhc2UgaW4gcGFydGljdWxhcgorICAgc2hvdWxkIGNvbWUgb3V0IG5pY2UgYW5kIGNvbXBhY3QuCisKKyAgIFRoZSBnZW5lcmljIGNvZGUgdXNlZCB0byB3b3JrIG9uZSBiaXQgYXQgYSB0aW1lLCB3aGljaCB3YXMgbm90IG9ubHkgc2xvdywKKyAgIGJ1dCBpbXBsaWNpdGx5IHJlbGllZCB1cG9uIGRlbm9ybXMgZm9yIGludGVybWVkaWF0ZXMsIHNpbmNlIHRoZSBsb3dlc3QgYml0cycKKyAgIHdlaWdodCBvZiBhIHBlcmZlY3RseSB2YWxpZCBmcCBudW1iZXIgdW5kZXJmbG93cyBpbiBub24tZGVub3JtLiAgVGhlcmVmb3JlLAorICAgdGhlIGdlbmVyaWMgY29kZSBub3cgd29ya3MgbGltYi1wZXItbGltYiwgaW5pdGlhbGx5IGNyZWF0aW5nIGEgbnVtYmVyIHggc3VjaAorICAgdGhhdCAxIDw9IHggPD0gQkFTRS4gIChCQVNFIGlzIHJlYWNoZWQgb25seSBhcyByZXN1bHQgb2Ygcm91bmRpbmcuKSAgVGhlbgorICAgeCdzIGV4cG9uZW50IGlzIHNjYWxlZCB3aXRoIGV4cGxpY2l0IGNvZGUgKG5vdCBsZGV4cCB0byBhdm9pZCBsaWJtCisgICBkZXBlbmRlbmN5KS4gIEl0IGlzIGEgdGFwLWRhbmNlIHRvIGF2b2lkIHVuZGVyZmxvdyBvciBvdmVyZmxvdywgYmV3YXJlIQorCisKKyAgIFRyYXBzOgorCisgICBIYXJkd2FyZSB0cmFwcyBmb3Igb3ZlcmZsb3cgdG8gaW5maW5pdHksIHVuZGVyZmxvdyB0byB6ZXJvLCBvciB1bnN1cHBvcnRlZAorICAgZGVub3JtcyBtYXkgb3IgbWF5IG5vdCBiZSB0YWtlbi4gIFRoZSBJRUVFIGNvZGUgd29ya3MgYml0d2lzZSBhbmQgc28KKyAgIHByb2JhYmx5IHdvbid0IHRyaWdnZXIgdGhlbSwgdGhlIGdlbmVyaWMgY29kZSB3b3JrcyBieSBmbG9hdCBvcGVyYXRpb25zIGFuZAorICAgc28gcHJvYmFibHkgd2lsbC4gIFRoaXMgZGlmZmVyZW5jZSBtaWdodCBiZSB0aG91Z2h0IGxlc3MgdGhhbiBpZGVhbCwgYnV0CisgICBhZ2FpbiBpdHMgZmVsdCBzdHJhaWdodGZvcndhcmQgY29kZSBpcyBiZXR0ZXIgdGhhbiB0cnlpbmcgdG8gZ2V0IGludGltYXRlCisgICB3aXRoIGhhcmR3YXJlIGV4Y2VwdGlvbnMgKG9mIHBlcmhhcHMgdW5rbm93biBuYXR1cmUpLgorCisKKyAgIE5vdCBkb25lOgorCisgICBtcHpfZ2V0X2QgaW4gdGhlIHBhc3QgaGFuZGxlZCBzaXplPT0xIHdpdGggYSBjYXN0IGxpbWItPmRvdWJsZS4gIFRoaXMgbWlnaHQKKyAgIHN0aWxsIGJlIHdvcnRod2hpbGUgdGhlcmUgKGZvciB1cCB0byB0aGUgbWFudGlzc2EgbWFueSBiaXRzKSwgYnV0IGZvcgorICAgbXBuX2dldF9kIGhlcmUsIHRoZSBjb3N0IG9mIGFwcGx5aW5nICJleHAiIHRvIHRoZSByZXN1bHRpbmcgZXhwb25lbnQgd291bGQKKyAgIHByb2JhYmx5IHVzZSB1cCBhbnkgYmVuZWZpdCBhIGNhc3QgbWF5IGhhdmUgb3ZlciBiaXQgdHdpZGRsaW5nLiAgQWxzbywgaWYKKyAgIHRoZSBleHBvbmVudCBpcyBwdXNoZWQgaW50byBkZW5vcm0gcmFuZ2UgdGhlbiBiaXQgdHdpZGRsaW5nIGlzIHRoZSBvbmx5CisgICBvcHRpb24sIHRvIGVuc3VyZSB0aGUgZGVzaXJlZCB0cnVuY2F0aW9uIGlzIG9idGFpbmVkLgorCisKKyAgIE90aGVyOgorCisgICBGb3IgcmVmZXJlbmNlLCBub3RlIHRoYXQgSFBQQSA4MDAwLCA4MjAwLCA4NTAwIGFuZCA4NjAwIHRyYXAgRkNOVixVRFcsREJMCisgICB0byB0aGUga2VybmVsIGZvciB2YWx1ZXMgPj0gMl42My4gIFRoaXMgbWFrZXMgaXQgc2xvdywgYW5kIHdvcnNlIHRoZSBrZXJuZWwKKyAgIExpbnV4ICh3aGF0IHZlcnNpb25zPykgYXBwYXJlbnRseSB1c2VzIHVudGVzdGVkIGNvZGUgaW4gaXRzIHRyYXAgaGFuZGxpbmcKKyAgIHJvdXRpbmVzLCBhbmQgZ2V0cyB0aGUgc2lnbiB3cm9uZy4gIFdlIGRvbid0IHVzZSBzdWNoIGEgbGltYi10by1kb3VibGUKKyAgIGNhc3QsIG5laXRoZXIgaW4gdGhlIElFRUUgb3IgZ2VuZXJpYyBjb2RlLiAgKi8KKworCisKKyN1bmRlZiBGT1JNQVRfUkVDT0dOSVpFRAorCitkb3VibGUKK21wbl9nZXRfZCAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfc2l6ZV90IHNpZ24sIGxvbmcgZXhwKQoreworICBpbnQgbHNoaWZ0LCBuYml0czsKKyAgbXBfbGltYl90IHgsIG1oaSwgbWxvOworCisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgQVNTRVJUX01QTiAodXAsIHNpemUpOworICBBU1NFUlQgKHNpemUgPT0gMCB8fCB1cFtzaXplLTFdICE9IDApOworCisgIGlmIChzaXplID09IDApCisgICAgcmV0dXJuIDAuMDsKKworICAvKiBBZGp1c3QgZXhwIHRvIGEgcmFkaXggcG9pbnQganVzdCBhYm92ZSB7dXAsc2l6ZX0sIGd1YXJkaW5nIGFnYWluc3QKKyAgICAgb3ZlcmZsb3cuICBBZnRlciB0aGlzIGV4cCBjYW4gb2YgY291cnNlIGJlIHJlZHVjZWQgdG8gYW55d2hlcmUgd2l0aGluCisgICAgIHRoZSB7dXAsc2l6ZX0gcmVnaW9uIHdpdGhvdXQgdW5kZXJmbG93LiAgKi8KKyAgaWYgKFVOTElLRUxZICgodW5zaWduZWQgbG9uZykgKEdNUF9OVU1CX0JJVFMpICogKHVuc2lnbmVkIGxvbmcpIChzaXplKQorCQk+IChMT05HX01BWCAtICh1bnNpZ25lZCBsb25nKSBleHApKSkKKyAgICB7CisjaWYgX0dNUF9JRUVFX0ZMT0FUUworICAgICAgZ290byBpZWVlX2luZmluaXR5OworI2VuZGlmCisKKyAgICAgIC8qIGdlbmVyaWMgKi8KKyAgICAgIGV4cCA9IExPTkdfTUFYOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4cCArPSBHTVBfTlVNQl9CSVRTICogc2l6ZTsKKyAgICB9CisKKyNpZiBfR01QX0lFRUVfRkxPQVRTCisgICAgeworICAgICAgdW5pb24gaWVlZV9kb3VibGVfZXh0cmFjdCB1OworCisgICAgICB1cCArPSBzaXplOworCisjaWYgR01QX0xJTUJfQklUUyA9PSA2NAorICAgICAgbWxvID0gdXBbLTFdOworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAobHNoaWZ0LCBtbG8pOworCisgICAgICBleHAgLT0gKGxzaGlmdCAtIEdNUF9OQUlMX0JJVFMpICsgMTsKKyAgICAgIG1sbyA8PD0gbHNoaWZ0OworCisgICAgICBuYml0cyA9IEdNUF9MSU1CX0JJVFMgLSBsc2hpZnQ7CisKKyAgICAgIGlmIChuYml0cyA8IDUzICYmIHNpemUgPiAxKQorCXsKKwkgIHggPSB1cFstMl07CisJICB4IDw8PSBHTVBfTkFJTF9CSVRTOworCSAgeCA+Pj0gbmJpdHM7CisJICBtbG8gfD0geDsKKwkgIG5iaXRzICs9IEdNUF9OVU1CX0JJVFM7CisKKwkgIGlmIChMSU1CU19QRVJfRE9VQkxFID49IDMgJiYgbmJpdHMgPCA1MyAmJiBzaXplID4gMikKKwkgICAgeworCSAgICAgIHggPSB1cFstM107CisJICAgICAgeCA8PD0gR01QX05BSUxfQklUUzsKKwkgICAgICB4ID4+PSBuYml0czsKKwkgICAgICBtbG8gfD0geDsKKwkgICAgICBuYml0cyArPSBHTVBfTlVNQl9CSVRTOworCSAgICB9CisJfQorICAgICAgbWhpID0gbWxvID4+ICgzMiArIDExKTsKKyAgICAgIG1sbyA9IG1sbyA+PiAxMTsJCS8qIGxhdGVyIGltcGxpY2l0bHkgdHJ1bmNhdGVkIHRvIDMyIGJpdHMgKi8KKyNlbmRpZgorI2lmIEdNUF9MSU1CX0JJVFMgPT0gMzIKKyAgICAgIHggPSAqLS11cDsKKyAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGxzaGlmdCwgeCk7CisKKyAgICAgIGV4cCAtPSAobHNoaWZ0IC0gR01QX05BSUxfQklUUykgKyAxOworICAgICAgeCA8PD0gbHNoaWZ0OworICAgICAgbWhpID0geCA+PiAxMTsKKworICAgICAgaWYgKGxzaGlmdCA8IDExKQkJLyogRklYTUU6IG5ldmVyIHRydWUgaWYgTlVNQiA8IDIwIGJpdHMgKi8KKwl7CisJICAvKiBBbGwgMjAgYml0cyBpbiBtaGkgKi8KKwkgIG1sbyA9IHggPDwgMjE7CisJICAvKiA+PSAxIGJpdCBpbiBtbG8gKi8KKwkgIG5iaXRzID0gR01QX0xJTUJfQklUUyAtIGxzaGlmdCAtIDIxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoc2l6ZSA+IDEpCisJICAgIHsKKwkgICAgICBuYml0cyA9IEdNUF9MSU1CX0JJVFMgLSBsc2hpZnQ7CisKKwkgICAgICB4ID0gKi0tdXAsIHNpemUtLTsKKwkgICAgICB4IDw8PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIG1oaSB8PSB4ID4+IG5iaXRzID4+IDExOworCisJICAgICAgbWxvID0geCA8PCAoR01QX0xJTUJfQklUUyAtIG5iaXRzIC0gMTEpOworCSAgICAgIG5iaXRzID0gbmJpdHMgKyAxMSAtIEdNUF9OQUlMX0JJVFM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1sbyA9IDA7CisJICAgICAgZ290byBkb25lOworCSAgICB9CisJfQorCisgICAgICAvKiBOb3cgYWxsIG5lZWRlZCBiaXRzIGluIG1oaSBoYXZlIGJlZW4gYWNjdW11bGF0ZWQuICBBZGQgYml0cyB0byBtbG8uICAqLworCisgICAgICBpZiAoTElNQlNfUEVSX0RPVUJMRSA+PSAyICYmIG5iaXRzIDwgMzIgJiYgc2l6ZSA+IDEpCisJeworCSAgeCA9IHVwWy0xXTsKKwkgIHggPDw9IEdNUF9OQUlMX0JJVFM7CisJICB4ID4+PSBuYml0czsKKwkgIG1sbyB8PSB4OworCSAgbmJpdHMgKz0gR01QX05VTUJfQklUUzsKKworCSAgaWYgKExJTUJTX1BFUl9ET1VCTEUgPj0gMyAmJiBuYml0cyA8IDMyICYmIHNpemUgPiAyKQorCSAgICB7CisJICAgICAgeCA9IHVwWy0yXTsKKwkgICAgICB4IDw8PSBHTVBfTkFJTF9CSVRTOworCSAgICAgIHggPj49IG5iaXRzOworCSAgICAgIG1sbyB8PSB4OworCSAgICAgIG5iaXRzICs9IEdNUF9OVU1CX0JJVFM7CisKKwkgICAgICBpZiAoTElNQlNfUEVSX0RPVUJMRSA+PSA0ICYmIG5iaXRzIDwgMzIgJiYgc2l6ZSA+IDMpCisJCXsKKwkJICB4ID0gdXBbLTNdOworCQkgIHggPDw9IEdNUF9OQUlMX0JJVFM7CisJCSAgeCA+Pj0gbmJpdHM7CisJCSAgbWxvIHw9IHg7CisJCSAgbmJpdHMgKz0gR01QX05VTUJfQklUUzsKKwkJfQorCSAgICB9CisJfQorCisgICAgZG9uZTo7CisKKyNlbmRpZgorICAgICAgaWYgKFVOTElLRUxZIChleHAgPj0gQ09OU1RfMTAyNCkpCisJeworCSAgLyogb3ZlcmZsb3csIHJldHVybiBpbmZpbml0eSAqLworCWllZWVfaW5maW5pdHk6CisJICBtaGkgPSAwOworCSAgbWxvID0gMDsKKwkgIGV4cCA9IDEwMjQ7CisJfQorICAgICAgZWxzZSBpZiAoVU5MSUtFTFkgKGV4cCA8PSBDT05TVF9ORUdfMTAyMykpCisJeworCSAgaW50IHJzaGlmdDsKKworCSAgaWYgKExJS0VMWSAoZXhwIDw9IENPTlNUX05FR18xMDIyX1NVQl81MykpCisJICAgIHJldHVybiAwLjA7CSAvKiBkZW5vcm0gdW5kZXJmbG93cyB0byB6ZXJvICovCisKKwkgIHJzaGlmdCA9IC0xMDIyIC0gZXhwOworCSAgQVNTRVJUIChyc2hpZnQgPiAwICYmIHJzaGlmdCA8IDUzKTsKKyNpZiBHTVBfTElNQl9CSVRTID4gNTMKKwkgIG1sbyA+Pj0gcnNoaWZ0OworCSAgbWhpID0gbWxvID4+IDMyOworI2Vsc2UKKwkgIGlmIChyc2hpZnQgPj0gMzIpCisJICAgIHsKKwkgICAgICBtbG8gPSBtaGk7CisJICAgICAgbWhpID0gMDsKKwkgICAgICByc2hpZnQgLT0gMzI7CisJICAgIH0KKwkgIGxzaGlmdCA9IEdNUF9MSU1CX0JJVFMgLSByc2hpZnQ7CisJICBtbG8gPSAobWxvID4+IHJzaGlmdCkgfCAocnNoaWZ0ID09IDAgPyAwIDogbWhpIDw8IGxzaGlmdCk7CisJICBtaGkgPj49IHJzaGlmdDsKKyNlbmRpZgorCSAgZXhwID0gLTEwMjM7CisJfQorICAgICAgdS5zLm1hbmggPSBtaGk7CisgICAgICB1LnMubWFubCA9IG1sbzsKKyAgICAgIHUucy5leHAgPSBleHAgKyAxMDIzOworICAgICAgdS5zLnNpZyA9IChzaWduIDwgMCk7CisgICAgICByZXR1cm4gdS5kOworICAgIH0KKyNkZWZpbmUgRk9STUFUX1JFQ09HTklaRUQgMQorI2VuZGlmCisKKyNpZiBIQVZFX0RPVUJMRV9WQVhfRAorICAgIHsKKyAgICAgIHVuaW9uIGRvdWJsZV9leHRyYWN0IHU7CisKKyAgICAgIHVwICs9IHNpemU7CisKKyAgICAgIG1oaSA9IHVwWy0xXTsKKworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAobHNoaWZ0LCBtaGkpOworICAgICAgZXhwIC09IGxzaGlmdDsKKyAgICAgIG1oaSA8PD0gbHNoaWZ0OworCisgICAgICBtbG8gPSAwOworICAgICAgaWYgKHNpemUgPiAxKQorCXsKKwkgIG1sbyA9IHVwWy0yXTsKKwkgIGlmIChsc2hpZnQgIT0gMCkKKwkgICAgbWhpICs9IG1sbyA+PiAoR01QX0xJTUJfQklUUyAtIGxzaGlmdCk7CisJICBtbG8gPDw9IGxzaGlmdDsKKworCSAgaWYgKHNpemUgPiAyICYmIGxzaGlmdCA+IDgpCisJICAgIHsKKwkgICAgICB4ID0gdXBbLTNdOworCSAgICAgIG1sbyArPSB4ID4+IChHTVBfTElNQl9CSVRTIC0gbHNoaWZ0KTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKFVOTElLRUxZIChleHAgPj0gMTI4KSkKKwl7CisJICAvKiBvdmVyZmxvdywgcmV0dXJuIG1heGltdW0gbnVtYmVyICovCisJICBtaGkgPSAweGZmZmZmZmZmOworCSAgbWxvID0gMHhmZmZmZmZmZjsKKwkgIGV4cCA9IDEyNzsKKwl9CisgICAgICBlbHNlIGlmIChVTkxJS0VMWSAoZXhwIDwgLTEyOCkpCisJeworCSAgcmV0dXJuIDAuMDsJIC8qIHVuZGVyZmxvd3MgdG8gemVybyAqLworCX0KKworICAgICAgdS5zLm1hbjMgPSBtaGkgPj4gMjQ7CS8qIGRyb3AgbXNiLCBzaW5jZSBpbXBsaWNpdCAqLworICAgICAgdS5zLm1hbjIgPSBtaGkgPj4gODsKKyAgICAgIHUucy5tYW4xID0gKG1oaSA8PCA4KSArIChtbG8gPj4gMjQpOworICAgICAgdS5zLm1hbjAgPSBtbG8gPj4gODsKKyAgICAgIHUucy5leHAgPSBleHAgKyAxMjg7CisgICAgICB1LnMuc2lnID0gc2lnbiA8IDA7CisgICAgICByZXR1cm4gdS5kOworICAgIH0KKyNkZWZpbmUgRk9STUFUX1JFQ09HTklaRUQgMQorI2VuZGlmCisKKyNpZiAhIEZPUk1BVF9SRUNPR05JWkVECisKKyNpZiAhZGVmaW5lZChHTVBfREJMX01BTlRfQklUUykKKyNpZiBkZWZpbmVkKERCTF9NQU5UX0RJRykgJiYgRkxUX1JBRElYID09IDIKKyNkZWZpbmUgR01QX0RCTF9NQU5UX0JJVFMgREJMX01BTlRfRElHCisjZWxzZQorLyogRklYTUU6IENob3NlIGEgc21hcnRlciBkZWZhdWx0IHZhbHVlLiAqLworI2RlZmluZSBHTVBfREJMX01BTlRfQklUUyAoMTYgKiBzaXplb2YgKGRvdWJsZSkpCisjZW5kaWYKKyNlbmRpZgorCisgICAgeyAvKiBOb24tSUVFRSBvciBzdHJhbmdlIGxpbWIgc2l6ZSwgZ2VuZXJpY2FsbHkgY29udmVydAorCSBHTVBfREJMX01BTlRfQklUUyBiaXRzLiAqLworICAgICAgbXBfbGltYl90IGw7CisgICAgICBpbnQgbTsKKyAgICAgIG1wX3NpemVfdCBpOworICAgICAgZG91YmxlIGQsIHdlaWdodDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdWV4cDsKKworICAgICAgLyogRmlyc3QgZ2VuZXJhdGUgYW4gZnAgbnVtYmVyIGRpc3JlZ2FyZGluZyBleHAsIGluc3RlYWQga2VlcGluZyB0aGluZ3MKKwkgd2l0aGluIHRoZSBudW1iIGJhc2UgZmFjdG9yIGZyb20gMSwgd2hpY2ggc2hvdWxkIHByZXZlbnQgb3ZlcmZsb3cgYW5kCisJIHVuZGVyZmxvdyBldmVuIGZvciB0aGUgbW9zdCBleHBvbmVudCBsaW1pdGVkIGZwIGZvcm1hdHMuICAqLworICAgICAgaSA9IHNpemUgLSAxOworICAgICAgbCA9IHVwW2ldOworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAobSwgbCk7CisgICAgICBtID0gbSArIEdNUF9EQkxfTUFOVF9CSVRTIC0gR01QX0xJTUJfQklUUzsKKyAgICAgIGlmIChtIDwgMCkKKwlsICY9IEdNUF9OVU1CX01BWCA8PCAtbTsKKyAgICAgIGQgPSBsOworICAgICAgZm9yICh3ZWlnaHQgPSAxL01QX0JBU0VfQVNfRE9VQkxFOyBtID4gMCAmJiAtLWkgPj0gMDspCisJeworCSAgbCA9IHVwW2ldOworCSAgbSAtPSBHTVBfTlVNQl9CSVRTOworCSAgaWYgKG0gPCAwKQorCSAgICBsICY9IEdNUF9OVU1CX01BWCA8PCAtbTsKKwkgIGQgKz0gbCAqIHdlaWdodDsKKwkgIHdlaWdodCAvPSBNUF9CQVNFX0FTX0RPVUJMRTsKKwkgIGlmICh3ZWlnaHQgPT0gMCkKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvKiBOb3cgYXBwbHkgZXhwLiAgKi8KKyAgICAgIGV4cCAtPSBHTVBfTlVNQl9CSVRTOworICAgICAgaWYgKGV4cCA+IDApCisJeworCSAgd2VpZ2h0ID0gMi4wOworCSAgdWV4cCA9IGV4cDsKKwl9CisgICAgICBlbHNlCisJeworCSAgd2VpZ2h0ID0gMC41OworCSAgdWV4cCA9IE5FR19DQVNUICh1bnNpZ25lZCBsb25nLCBleHApOworCX0KKyNpZiAxCisgICAgICAvKiBTcXVhcmUtYW5kLW11bHRpcGx5IGV4cG9uZW50aWF0aW9uLiAgKi8KKyAgICAgIGlmICh1ZXhwICYgMSkKKwlkICo9IHdlaWdodDsKKyAgICAgIHdoaWxlICh1ZXhwID4+PSAxKQorCXsKKwkgIHdlaWdodCAqPSB3ZWlnaHQ7CisJICBpZiAodWV4cCAmIDEpCisJICAgIGQgKj0gd2VpZ2h0OworCX0KKyNlbHNlCisgICAgICAvKiBQbGFpbiBleHBvbmVudGlhdGlvbi4gICovCisgICAgICB3aGlsZSAodWV4cCA+IDApCisJeworCSAgZCAqPSB3ZWlnaHQ7CisJICB1ZXhwLS07CisJfQorI2VuZGlmCisKKyAgICAgIHJldHVybiBzaWduID49IDAgPyBkIDogLWQ7CisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9nZXRfc3RyLmMgYi9tcG4vZ2VuZXJpYy9nZXRfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljYzU4MQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2dldF9zdHIuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyogbXBuX2dldF9zdHIgLS0gQ29udmVydCB7VVAsVVNJWkV9IHRvIGEgYmFzZSBCQVNFIHN0cmluZyBpbiBTVFIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUsIEVYQ0VQVCBtcG5fZ2V0X3N0ciwgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRQorICAgSU5URVJGQUNFUy4gIElUIElTIE9OTFkgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLgorICAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAxOTkxLTIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIENvbnZlcnNpb24gb2YgVSB7dXAsdW59IHRvIGEgc3RyaW5nIGluIGJhc2UgYi4gIEludGVybmFsbHksIHdlIGNvbnZlcnQgdG8KKyAgIGJhc2UgQiA9IGJebSwgdGhlIGxhcmdlc3QgcG93ZXIgb2YgYiB0aGF0IGZpdHMgYSBsaW1iLiAgQmFzaWMgYWxnb3JpdGhtczoKKworICBBKSBEaXZpZGUgVSByZXBlYXRlZGx5IGJ5IEIsIGdlbmVyYXRpbmcgYSBxdW90aWVudCBhbmQgcmVtYWluZGVyLCB1bnRpbCB0aGUKKyAgICAgcXVvdGllbnQgYmVjb21lcyB6ZXJvLiAgVGhlIHJlbWFpbmRlcnMgaG9sZCB0aGUgY29udmVydGVkIGRpZ2l0cy4gIERpZ2l0cworICAgICBjb21lIG91dCBmcm9tIHJpZ2h0IHRvIGxlZnQuICAoVXNlZCBpbiBtcG5fYmNfZ2V0X3N0ci4pCisKKyAgQikgRGl2aWRlIFUgYnkgYl5nLCBmb3IgZyBzdWNoIHRoYXQgMS9iIDw9IFUvYl5nIDwgMSwgZ2VuZXJhdGluZyBhIGZyYWN0aW9uLgorICAgICBUaGVuIGRldmVsb3AgZGlnaXRzIGJ5IG11bHRpcGx5aW5nIHRoZSBmcmFjdGlvbiByZXBlYXRlZGx5IGJ5IGIuICBEaWdpdHMKKyAgICAgY29tZSBvdXQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiAgKEN1cnJlbnRseSBub3QgdXNlZCBoZXJlaW4sIGV4Y2VwdCBmb3IgaW4KKyAgICAgY29kZSBmb3IgY29udmVydGluZyBzaW5nbGUgbGltYnMgdG8gaW5kaXZpZHVhbCBkaWdpdHMuKQorCisgIEMpIENvbXB1dGUgQl4xLCBCXjIsIEJeNCwgLi4uLCBCXnMsIGZvciBzIHN1Y2ggdGhhdCBCXnMgaXMganVzdCBhYm92ZQorICAgICBzcXJ0KFUpLiAgVGhlbiBkaXZpZGUgVSBieSBCXnMsIGdlbmVyYXRpbmcgcXVvdGllbnQgYW5kIHJlbWFpbmRlci4KKyAgICAgUmVjdXJzaXZlbHkgY29udmVydCB0aGUgcXVvdGllbnQsIHRoZW4gdGhlIHJlbWFpbmRlciwgdXNpbmcgdGhlCisgICAgIHByZWNvbXB1dGVkIHBvd2Vycy4gIERpZ2l0cyBjb21lIG91dCBmcm9tIGxlZnQgdG8gcmlnaHQuICAoVXNlZCBpbgorICAgICBtcG5fZGNfZ2V0X3N0ci4pCisKKyAgV2hlbiB1c2luZyBhbGdvcml0aG0gQywgYWxnb3JpdGhtIEIgbWlnaHQgYmUgc3VpdGFibGUgZm9yIGJhc2VjYXNlIGNvZGUsCisgIHNpbmNlIHRoZSByZXF1aXJlZCBiXmcgcG93ZXIgd2lsbCBiZSByZWFkaWx5IGFjY2Vzc2libGUuCisKKyAgT3B0aW1pemF0aW9uIGlkZWFzOgorICAxLiBUaGUgcmVjdXJzaXZlIGZ1bmN0aW9uIG9mIChDKSBjb3VsZCB1c2UgbGVzcyB0ZW1wb3JhcnkgbWVtb3J5LiAgVGhlIHBvd3RhYgorICAgICBhbGxvY2F0aW9uIGNvdWxkIGJlIHRyaW1tZWQgd2l0aCBzb21lIGNvbXB1dGF0aW9uLCBhbmQgdGhlIHRtcCBhcmVhIGNvdWxkCisgICAgIGJlIHJlZHVjZWQsIG9yIHBlcmhhcHMgZWxpbWluYXRlZCBpZiB1cCBpcyByZXVzZWQgZm9yIGJvdGggcXVvdGllbnQgYW5kCisgICAgIHJlbWFpbmRlciAoaXQgaXMgY3VycmVudGx5IHVzZWQganVzdCBmb3IgcmVtYWluZGVyKS4KKyAgMi4gU3RvcmUgdGhlIHBvd2VycyBvZiAoQykgaW4gbm9ybWFsaXplZCBmb3JtLCB3aXRoIHRoZSBub3JtYWxpemF0aW9uIGNvdW50LgorICAgICBRdW90aWVudHMgd2lsbCB1c3VhbGx5IG5lZWQgdG8gYmUgbGVmdC1zaGlmdGVkIGJlZm9yZSBlYWNoIGRpdmlkZSwgYW5kCisgICAgIHJlbWFpbmRlcnMgd2lsbCBlaXRoZXIgbmVlZCB0byBiZSBsZWZ0LXNoaWZ0ZWQgb2YgcmlnaHQtc2hpZnRlZC4KKyAgMy4gSW4gdGhlIGNvZGUgZm9yIGRldmVsb3BpbmcgZGlnaXRzIGZyb20gYSBzaW5nbGUgbGltYiwgd2UgY291bGQgYXZvaWQgdXNpbmcKKyAgICAgYSBmdWxsIHVtdWxfcHBtbSBleGNlcHQgZm9yIHRoZSBmaXJzdCAob3IgZmlyc3QgZmV3KSBkaWdpdHMsIHByb3ZpZGVkIGJhc2UKKyAgICAgaXMgZXZlbi4gIFN1YnNlcXVlbnQgZGlnaXRzIGNhbiBiZSBkZXZlbG9wZWQgdXNpbmcgcGxhaW4gbXVsdGlwbGljYXRpb24uCisgICAgIChUaGlzIHNhdmVzIG9uIHJlZ2lzdGVyLXN0YXJ2ZWQgbWFjaGluZXMgKHJlYWQgeDg2KSBhbmQgb24gYWxsIG1hY2hpbmVzCisgICAgIHRoYXQgZ2VuZXJhdGUgdGhlIHVwcGVyIHByb2R1Y3QgaGFsZiB1c2luZyBhIHNlcGFyYXRlIGluc3RydWN0aW9uIChhbHBoYSwKKyAgICAgcG93ZXJwYywgSUEtNjQpIG9yIGxhY2tzIHN1Y2ggc3VwcG9ydCBhbHRvZ2V0aGVyIChzcGFyYzY0LCBocHBhNjQpLgorICA0LiBTZXBhcmF0ZSBtcG5fZGNfZ2V0X3N0ciBiYXNlY2FzZSBjb2RlIGZyb20gY29kZSBmb3Igc21hbGwgY29udmVyc2lvbnMuIFRoZQorICAgICBmb3JtZXIgY29kZSB3aWxsIGhhdmUgdGhlIGV4YWN0IHJpZ2h0IHBvd2VyIHJlYWRpbHkgYXZhaWxhYmxlIGluIHRoZQorICAgICBwb3d0YWIgcGFyYW1ldGVyIGZvciBkaXZpZGluZyB0aGUgY3VycmVudCBudW1iZXIgaW50byBhIGZyYWN0aW9uLiAgQ29udmVydAorICAgICB0aGF0IHVzaW5nIGFsZ29yaXRobSBCLgorICA1LiBDb21wbGV0ZWx5IGF2b2lkIGRpdmlzaW9uLiAgQ29tcHV0ZSB0aGUgaW52ZXJzZXMgb2YgdGhlIHBvd2VycyBub3cgaW4KKyAgICAgcG93dGFiIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBwb3dlcnMuCisgIDYuIERlY3JlYXNlIHBvd3RhYiBhbGxvY2F0aW9uIGZvciBldmVuIGJhc2VzLiAgRS5nLiBmb3IgYmFzZSAxMCB3ZSBjb3VsZCBzYXZlCisgICAgIGFib3V0IDMwJSAoMS1sb2coNSkvbG9nKDEwKSkuCisKKyAgQmFzaWMgc3RydWN0dXJlIG9mIChDKToKKyAgICBtcG5fZ2V0X3N0cjoKKyAgICAgIGlmIFBPVzJfUCAobikKKwkuLi4KKyAgICAgIGVsc2UKKwlpZiAodW4gPCBHRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xEKQorCSAgbXBuX2J4X2dldF9zdHIgKHN0ciwgYmFzZSwgdXAsIHVuKTsKKwllbHNlCisJICBwcmVjb21wdXRlX3Bvd2VyX3RhYmxlcworCSAgbXBuX2RjX2dldF9zdHIKKworICAgIG1wbl9kY19nZXRfc3RyOgorCW1wbl90ZGl2X3FyCisJaWYgKHFuIDwgR0VUX1NUUl9EQ19USFJFU0hPTEQpCisJICBtcG5fYmNfZ2V0X3N0cgorCWVsc2UKKwkgIG1wbl9kY19nZXRfc3RyCisJaWYgKHJuIDwgR0VUX1NUUl9EQ19USFJFU0hPTEQpCisJICBtcG5fYmNfZ2V0X3N0cgorCWVsc2UKKwkgIG1wbl9kY19nZXRfc3RyCisKKworICBUaGUgcmVhc29uIGZvciB0aGUgdHdvIHRocmVzaG9sZCB2YWx1ZXMgaXMgdGhlIGNvc3Qgb2YKKyAgcHJlY29tcHV0ZV9wb3dlcl90YWJsZXMuICBHRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xEIHdpbGwgYmUKKyAgY29uc2lkZXJhYmx5IGxhcmdlciB0aGFuIEdFVF9TVFJfRENfVEhSRVNIT0xELiAgKi8KKworCisvKiBUaGUgeDg2cyBhbmQgbTY4MDIwIGhhdmUgYSBxdW90aWVudCBhbmQgcmVtYWluZGVyICJkaXYiIGluc3RydWN0aW9uIGFuZAorICAgZ2NjIHJlY29nbmlzZXMgYW4gYWRqYWNlbnQgIi8iIGFuZCAiJSIgY2FuIGJlIGNvbWJpbmVkIHVzaW5nIHRoYXQuCisgICBFbHNld2hlcmUgIi8iIGFuZCAiJSIgYXJlIGVpdGhlciBzZXBhcmF0ZSBpbnN0cnVjdGlvbnMsIG9yIHNlcGFyYXRlCisgICBsaWJnY2MgY2FsbHMgKHdoaWNoIHVuZm9ydHVuYXRlbHkgZ2NjIGFzIG9mIHZlcnNpb24gMy4wIGRvZXNuJ3QgY29tYmluZSkuCisgICBBIG11bHRpcGx5IGFuZCBzdWJ0cmFjdCBzaG91bGQgYmUgZmFzdGVyIHRoYW4gYSAiJSIgaW4gdGhvc2UgY2FzZXMuICAqLworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3g4NiAgICAgICAgICAgIFwKKyAgfHwgSEFWRV9IT1NUX0NQVV9tNjgwMjAgICAgICAgICAgICAgICBcCisgIHx8IEhBVkVfSE9TVF9DUFVfbTY4MDMwICAgICAgICAgICAgICAgXAorICB8fCBIQVZFX0hPU1RfQ1BVX202ODA0MCAgICAgICAgICAgICAgIFwKKyAgfHwgSEFWRV9IT1NUX0NQVV9tNjgwNjAgICAgICAgICAgICAgICBcCisgIHx8IEhBVkVfSE9TVF9DUFVfbTY4MzYwIC8qIENQVTMyICovCisjZGVmaW5lIHVkaXZfcXJuZF91bm5vcm0ocSxyLG4sZCkgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIF9fcSA9IChuKSAvIChkKTsgICAgICAgICBcCisgICAgbXBfbGltYl90ICBfX3IgPSAobikgJSAoZCk7ICAgICAgICAgXAorICAgIChxKSA9IF9fcTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocikgPSBfX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSB1ZGl2X3FybmRfdW5ub3JtKHEscixuLGQpICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90ICBfX3EgPSAobikgLyAoZCk7ICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgX19yID0gKG4pIC0gX19xKihkKTsgICAgIFwKKyAgICAocSkgPSBfX3E7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHIpID0gX19yOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKwwKKy8qIENvbnZlcnQge3VwLHVufSB0byBhIHN0cmluZyBpbiBiYXNlIGJhc2UsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBzdHIuCisgICBHZW5lcmF0ZSBsZW4gY2hhcmFjdGVycywgcG9zc2libHkgcGFkZGluZyB3aXRoIHplcm9zIHRvIHRoZSBsZWZ0LiAgSWYgbGVuIGlzCisgICB6ZXJvLCBnZW5lcmF0ZSBhcyBtYW55IGNoYXJhY3RlcnMgYXMgcmVxdWlyZWQuICBSZXR1cm4gYSBwb2ludGVyIGltbWVkaWF0ZWx5CisgICBhZnRlciB0aGUgbGFzdCBkaWdpdCBvZiB0aGUgcmVzdWx0IHN0cmluZy4gIENvbXBsZXhpdHkgaXMgTyh1bl4yKTsgaW50ZW5kZWQKKyAgIGZvciBzbWFsbCBjb252ZXJzaW9ucy4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCittcG5fYmNfZ2V0X3N0ciAodW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3QgbGVuLAorCQltcF9wdHIgdXAsIG1wX3NpemVfdCB1biwgaW50IGJhc2UpCit7CisgIG1wX2xpbWJfdCBybCwgdWw7CisgIHVuc2lnbmVkIGNoYXIgKnM7CisgIHNpemVfdCBsOworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGxhcmdlc3QgcG9zc2libGUgc3RyaW5nLCBnaXZlbiB0aGF0IHdlIG9ubHkgZ2V0IGhlcmUKKyAgICAgZm9yIG9wZXJhbmRzIHdpdGggdW4gPCBHRVRfU1RSX1BSRUNPTVBVVEVfVEhSRVNIT0xEIGFuZCB0aGF0IHRoZSBzbWFsbGVzdAorICAgICBiYXNlIGlzIDMuICA3LzExIGlzIGFuIGFwcHJveGltYXRpb24gdG8gMS9sb2cyKDMpLiAgKi8KKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQKKyNkZWZpbmUgQlVGX0FMTE9DIChHRVRfU1RSX1RIUkVTSE9MRF9MSU1JVCAqIEdNUF9MSU1CX0JJVFMgKiA3IC8gMTEpCisjZWxzZQorI2RlZmluZSBCVUZfQUxMT0MgKEdFVF9TVFJfUFJFQ09NUFVURV9USFJFU0hPTEQgKiBHTVBfTElNQl9CSVRTICogNyAvIDExKQorI2VuZGlmCisgIHVuc2lnbmVkIGNoYXIgYnVmW0JVRl9BTExPQ107CisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisgIG1wX2xpbWJfdCBycFtHRVRfU1RSX1RIUkVTSE9MRF9MSU1JVF07CisjZWxzZQorICBtcF9saW1iX3QgcnBbR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRF07CisjZW5kaWYKKworICBpZiAoYmFzZSA9PSAxMCkKKyAgICB7CisgICAgICAvKiBTcGVjaWFsIGNhc2UgY29kZSBmb3IgYmFzZT09MTAgc28gdGhhdCB0aGUgY29tcGlsZXIgaGFzIGEgY2hhbmNlIHRvCisJIG9wdGltaXplIHRoaW5ncy4gICovCisKKyAgICAgIE1QTl9DT1BZIChycCArIDEsIHVwLCB1bik7CisKKyAgICAgIHMgPSBidWYgKyBCVUZfQUxMT0M7CisgICAgICB3aGlsZSAodW4gPiAxKQorCXsKKwkgIGludCBpOworCSAgbXBfbGltYl90IGZyYWMsIGRpZ2l0OworCSAgTVBOX0RJVlJFTV9PUl9QUkVJTlZfRElWUkVNXzEgKHJwLCAobXBfc2l6ZV90KSAxLCBycCArIDEsIHVuLAorCQkJCQkgTVBfQkFTRVNfQklHX0JBU0VfMTAsCisJCQkJCSBNUF9CQVNFU19CSUdfQkFTRV9JTlZFUlRFRF8xMCwKKwkJCQkJIE1QX0JBU0VTX05PUk1BTElaQVRJT05fU1RFUFNfMTApOworCSAgdW4gLT0gcnBbdW5dID09IDA7CisJICBmcmFjID0gKHJwWzBdICsgMSkgPDwgR01QX05BSUxfQklUUzsKKwkgIHMgLT0gTVBfQkFTRVNfQ0hBUlNfUEVSX0xJTUJfMTA7CisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2CisJICAvKiBUaGUgY29kZSBiZWxvdyB0dXJucyBvdXQgdG8gYmUgYSBiaXQgc2xvd2VyIGZvciB4ODYgdXNpbmcgZ2NjLgorCSAgICAgVXNlIHBsYWluIGNvZGUuICAqLworCSAgaSA9IE1QX0JBU0VTX0NIQVJTX1BFUl9MSU1CXzEwOworCSAgZG8KKwkgICAgeworCSAgICAgIHVtdWxfcHBtbSAoZGlnaXQsIGZyYWMsIGZyYWMsIDEwKTsKKwkgICAgICAqcysrID0gZGlnaXQ7CisJICAgIH0KKwkgIHdoaWxlICgtLWkpOworI2Vsc2UKKwkgIC8qIFVzZSB0aGUgZmFjdCB0aGF0IDEwIGluIGJpbmFyeSBpcyAxMDEwLCB3aXRoIHRoZSBsb3dlc3QgYml0IDAuCisJICAgICBBZnRlciBhIGZldyB1bXVsX3BwbW0sIHdlIHdpbGwgaGF2ZSBhY2N1bXVsYXRlZCBlbm91Z2ggbG93IHplcm9zCisJICAgICB0byB1c2UgYSBwbGFpbiBtdWx0aXBseS4gICovCisJICBpZiAoTVBfQkFTRVNfTk9STUFMSVpBVElPTl9TVEVQU18xMCA9PSAwKQorCSAgICB7CisJICAgICAgdW11bF9wcG1tIChkaWdpdCwgZnJhYywgZnJhYywgMTApOworCSAgICAgICpzKysgPSBkaWdpdDsKKwkgICAgfQorCSAgaWYgKE1QX0JBU0VTX05PUk1BTElaQVRJT05fU1RFUFNfMTAgPD0gMSkKKwkgICAgeworCSAgICAgIHVtdWxfcHBtbSAoZGlnaXQsIGZyYWMsIGZyYWMsIDEwKTsKKwkgICAgICAqcysrID0gZGlnaXQ7CisJICAgIH0KKwkgIGlmIChNUF9CQVNFU19OT1JNQUxJWkFUSU9OX1NURVBTXzEwIDw9IDIpCisJICAgIHsKKwkgICAgICB1bXVsX3BwbW0gKGRpZ2l0LCBmcmFjLCBmcmFjLCAxMCk7CisJICAgICAgKnMrKyA9IGRpZ2l0OworCSAgICB9CisJICBpZiAoTVBfQkFTRVNfTk9STUFMSVpBVElPTl9TVEVQU18xMCA8PSAzKQorCSAgICB7CisJICAgICAgdW11bF9wcG1tIChkaWdpdCwgZnJhYywgZnJhYywgMTApOworCSAgICAgICpzKysgPSBkaWdpdDsKKwkgICAgfQorCSAgaSA9IChNUF9CQVNFU19DSEFSU19QRVJfTElNQl8xMCAtICgoTVBfQkFTRVNfTk9STUFMSVpBVElPTl9TVEVQU18xMCA8IDQpCisJCQkJCSAgICAgPyAoNC1NUF9CQVNFU19OT1JNQUxJWkFUSU9OX1NURVBTXzEwKQorCQkJCQkgICAgIDogMCkpOworCSAgZnJhYyA9IChmcmFjICsgMHhmKSA+PiA0OworCSAgZG8KKwkgICAgeworCSAgICAgIGZyYWMgKj0gMTA7CisJICAgICAgZGlnaXQgPSBmcmFjID4+IChHTVBfTElNQl9CSVRTIC0gNCk7CisJICAgICAgKnMrKyA9IGRpZ2l0OworCSAgICAgIGZyYWMgJj0gKH4obXBfbGltYl90KSAwKSA+PiA0OworCSAgICB9CisJICB3aGlsZSAoLS1pKTsKKyNlbmRpZgorCSAgcyAtPSBNUF9CQVNFU19DSEFSU19QRVJfTElNQl8xMDsKKwl9CisKKyAgICAgIHVsID0gcnBbMV07CisgICAgICB3aGlsZSAodWwgIT0gMCkKKwl7CisJICB1ZGl2X3FybmRfdW5ub3JtICh1bCwgcmwsIHVsLCAxMCk7CisJICAqLS1zID0gcmw7CisJfQorICAgIH0KKyAgZWxzZSAvKiBub3QgYmFzZSAxMCAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXJzX3Blcl9saW1iOworICAgICAgbXBfbGltYl90IGJpZ19iYXNlLCBiaWdfYmFzZV9pbnZlcnRlZDsKKyAgICAgIHVuc2lnbmVkIG5vcm1hbGl6YXRpb25fc3RlcHM7CisKKyAgICAgIGNoYXJzX3Blcl9saW1iID0gbXBfYmFzZXNbYmFzZV0uY2hhcnNfcGVyX2xpbWI7CisgICAgICBiaWdfYmFzZSA9IG1wX2Jhc2VzW2Jhc2VdLmJpZ19iYXNlOworICAgICAgYmlnX2Jhc2VfaW52ZXJ0ZWQgPSBtcF9iYXNlc1tiYXNlXS5iaWdfYmFzZV9pbnZlcnRlZDsKKyAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKG5vcm1hbGl6YXRpb25fc3RlcHMsIGJpZ19iYXNlKTsKKworICAgICAgTVBOX0NPUFkgKHJwICsgMSwgdXAsIHVuKTsKKworICAgICAgcyA9IGJ1ZiArIEJVRl9BTExPQzsKKyAgICAgIHdoaWxlICh1biA+IDEpCisJeworCSAgaW50IGk7CisJICBtcF9saW1iX3QgZnJhYzsKKwkgIE1QTl9ESVZSRU1fT1JfUFJFSU5WX0RJVlJFTV8xIChycCwgKG1wX3NpemVfdCkgMSwgcnAgKyAxLCB1biwKKwkJCQkJIGJpZ19iYXNlLCBiaWdfYmFzZV9pbnZlcnRlZCwKKwkJCQkJIG5vcm1hbGl6YXRpb25fc3RlcHMpOworCSAgdW4gLT0gcnBbdW5dID09IDA7CisJICBmcmFjID0gKHJwWzBdICsgMSkgPDwgR01QX05BSUxfQklUUzsKKwkgIHMgLT0gY2hhcnNfcGVyX2xpbWI7CisJICBpID0gY2hhcnNfcGVyX2xpbWI7CisJICBkbworCSAgICB7CisJICAgICAgbXBfbGltYl90IGRpZ2l0OworCSAgICAgIHVtdWxfcHBtbSAoZGlnaXQsIGZyYWMsIGZyYWMsIGJhc2UpOworCSAgICAgICpzKysgPSBkaWdpdDsKKwkgICAgfQorCSAgd2hpbGUgKC0taSk7CisJICBzIC09IGNoYXJzX3Blcl9saW1iOworCX0KKworICAgICAgdWwgPSBycFsxXTsKKyAgICAgIHdoaWxlICh1bCAhPSAwKQorCXsKKwkgIHVkaXZfcXJuZF91bm5vcm0gKHVsLCBybCwgdWwsIGJhc2UpOworCSAgKi0tcyA9IHJsOworCX0KKyAgICB9CisKKyAgbCA9IGJ1ZiArIEJVRl9BTExPQyAtIHM7CisgIHdoaWxlIChsIDwgbGVuKQorICAgIHsKKyAgICAgICpzdHIrKyA9IDA7CisgICAgICBsZW4tLTsKKyAgICB9CisgIHdoaWxlIChsICE9IDApCisgICAgeworICAgICAgKnN0cisrID0gKnMrKzsKKyAgICAgIGwtLTsKKyAgICB9CisgIHJldHVybiBzdHI7Cit9CisKKwwKKy8qIENvbnZlcnQge1VQLFVOfSB0byBhIHN0cmluZyB3aXRoIGEgYmFzZSBhcyByZXByZXNlbnRlZCBpbiBQT1dUQUIsIGFuZCBwdXQKKyAgIHRoZSBzdHJpbmcgaW4gU1RSLiAgR2VuZXJhdGUgTEVOIGNoYXJhY3RlcnMsIHBvc3NpYmx5IHBhZGRpbmcgd2l0aCB6ZXJvcyB0bworICAgdGhlIGxlZnQuICBJZiBMRU4gaXMgemVybywgZ2VuZXJhdGUgYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHJlcXVpcmVkLgorICAgUmV0dXJuIGEgcG9pbnRlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBkaWdpdCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KKyAgIFRoaXMgdXNlcyBkaXZpZGUtYW5kLWNvbnF1ZXIgYW5kIGlzIGludGVuZGVkIGZvciBsYXJnZSBjb252ZXJzaW9ucy4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCittcG5fZGNfZ2V0X3N0ciAodW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3QgbGVuLAorCQltcF9wdHIgdXAsIG1wX3NpemVfdCB1biwKKwkJY29uc3QgcG93ZXJzX3QgKnBvd3RhYiwgbXBfcHRyIHRtcCkKK3sKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAodW4sIEdFVF9TVFJfRENfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBpZiAodW4gIT0gMCkKKwlzdHIgPSBtcG5fYmNfZ2V0X3N0ciAoc3RyLCBsZW4sIHVwLCB1biwgcG93dGFiLT5iYXNlKTsKKyAgICAgIGVsc2UKKwl7CisJICB3aGlsZSAobGVuICE9IDApCisJICAgIHsKKwkgICAgICAqc3RyKysgPSAwOworCSAgICAgIGxlbi0tOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3B0ciBwd3AsIHFwLCBycDsKKyAgICAgIG1wX3NpemVfdCBwd24sIHFuOworICAgICAgbXBfc2l6ZV90IHNuOworCisgICAgICBwd3AgPSBwb3d0YWItPnA7CisgICAgICBwd24gPSBwb3d0YWItPm47CisgICAgICBzbiA9IHBvd3RhYi0+c2hpZnQ7CisKKyAgICAgIGlmICh1biA8IHB3biArIHNuIHx8ICh1biA9PSBwd24gKyBzbiAmJiBtcG5fY21wICh1cCArIHNuLCBwd3AsIHVuIC0gc24pIDwgMCkpCisJeworCSAgc3RyID0gbXBuX2RjX2dldF9zdHIgKHN0ciwgbGVuLCB1cCwgdW4sIHBvd3RhYiAtIDEsIHRtcCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHFwID0gdG1wOwkJLyogKHVuIC0gcHduICsgMSkgbGltYnMgZm9yIHFwICovCisJICBycCA9IHVwOwkJLyogcHduIGxpbWJzIGZvciBycDsgb3ZlcndyaXRlIHVwIGFyZWEgKi8KKworCSAgbXBuX3RkaXZfcXIgKHFwLCBycCArIHNuLCAwTCwgdXAgKyBzbiwgdW4gLSBzbiwgcHdwLCBwd24pOworCSAgcW4gPSB1biAtIHNuIC0gcHduOyBxbiArPSBxcFtxbl0gIT0gMDsJCS8qIHF1b3RpZW50IHNpemUgKi8KKworCSAgQVNTRVJUIChxbiA8IHB3biArIHNuIHx8IChxbiA9PSBwd24gKyBzbiAmJiBtcG5fY21wIChxcCArIHNuLCBwd3AsIHB3bikgPCAwKSk7CisKKwkgIGlmIChsZW4gIT0gMCkKKwkgICAgbGVuID0gbGVuIC0gcG93dGFiLT5kaWdpdHNfaW5fYmFzZTsKKworCSAgc3RyID0gbXBuX2RjX2dldF9zdHIgKHN0ciwgbGVuLCBxcCwgcW4sIHBvd3RhYiAtIDEsIHRtcCArIHFuKTsKKwkgIHN0ciA9IG1wbl9kY19nZXRfc3RyIChzdHIsIHBvd3RhYi0+ZGlnaXRzX2luX2Jhc2UsIHJwLCBwd24gKyBzbiwgcG93dGFiIC0gMSwgdG1wKTsKKwl9CisgICAgfQorICByZXR1cm4gc3RyOworfQorCisvKiBUaGVyZSBhcmUgbm8gbGVhZGluZyB6ZXJvcyBvbiB0aGUgZGlnaXRzIGdlbmVyYXRlZCBhdCBzdHIsIGJ1dCB0aGF0J3Mgbm90CisgICBjdXJyZW50bHkgYSBkb2N1bWVudGVkIGZlYXR1cmUuICBUaGUgY3VycmVudCBtcHpfb3V0X3N0ciBhbmQgbXB6X2dldF9zdHIKKyAgIHJlbHkgb24gaXQuICAqLworCitzaXplX3QKK21wbl9nZXRfc3RyICh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBiYXNlLCBtcF9wdHIgdXAsIG1wX3NpemVfdCB1bikKK3sKKyAgbXBfcHRyIHBvd3RhYl9tZW07CisgIHBvd2Vyc190IHBvd3RhYltHTVBfTElNQl9CSVRTXTsKKyAgaW50IHBpOworICBzaXplX3Qgb3V0X2xlbjsKKyAgbXBfcHRyIHRtcDsKKyAgVE1QX0RFQ0w7CisKKyAgLyogU3BlY2lhbCBjYXNlIHplcm8sIGFzIHRoZSBjb2RlIGJlbG93IGRvZXNuJ3QgaGFuZGxlIGl0LiAgKi8KKyAgaWYgKHVuID09IDApCisgICAgeworICAgICAgc3RyWzBdID0gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoUE9XMl9QIChiYXNlKSkKKyAgICB7CisgICAgICAvKiBUaGUgYmFzZSBpcyBhIHBvd2VyIG9mIDIuICBDb252ZXJ0IGZyb20gbW9zdCBzaWduaWZpY2FudCBlbmQuICAqLworICAgICAgbXBfbGltYl90IG4xLCBuMDsKKyAgICAgIGludCBiaXRzX3Blcl9kaWdpdCA9IG1wX2Jhc2VzW2Jhc2VdLmJpZ19iYXNlOworICAgICAgaW50IGNudDsKKyAgICAgIGludCBiaXRfcG9zOworICAgICAgbXBfc2l6ZV90IGk7CisgICAgICB1bnNpZ25lZCBjaGFyICpzID0gc3RyOworICAgICAgbXBfYml0Y250X3QgYml0czsKKworICAgICAgbjEgPSB1cFt1biAtIDFdOworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBuMSk7CisKKyAgICAgIC8qIEJJVF9QT1Mgc2hvdWxkIGJlIFIgd2hlbiBpbnB1dCBlbmRzIGluIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSwKKwkgUiArIGJpdHNfcGVyX2RpZ2l0ICogbiB3aGVuIGlucHV0IGVuZHMgaW4gbnRoIGxlYXN0IHNpZ25pZmljYW50CisJIG5pYmJsZS4gKi8KKworICAgICAgYml0cyA9IChtcF9iaXRjbnRfdCkgR01QX05VTUJfQklUUyAqIHVuIC0gY250ICsgR01QX05BSUxfQklUUzsKKyAgICAgIGNudCA9IGJpdHMgJSBiaXRzX3Blcl9kaWdpdDsKKyAgICAgIGlmIChjbnQgIT0gMCkKKwliaXRzICs9IGJpdHNfcGVyX2RpZ2l0IC0gY250OworICAgICAgYml0X3BvcyA9IGJpdHMgLSAobXBfYml0Y250X3QpICh1biAtIDEpICogR01QX05VTUJfQklUUzsKKworICAgICAgLyogRmFzdCBsb29wIGZvciBiaXQgb3V0cHV0LiAgKi8KKyAgICAgIGkgPSB1biAtIDE7CisgICAgICBmb3IgKDs7KQorCXsKKwkgIGJpdF9wb3MgLT0gYml0c19wZXJfZGlnaXQ7CisJICB3aGlsZSAoYml0X3BvcyA+PSAwKQorCSAgICB7CisJICAgICAgKnMrKyA9IChuMSA+PiBiaXRfcG9zKSAmICgoMSA8PCBiaXRzX3Blcl9kaWdpdCkgLSAxKTsKKwkgICAgICBiaXRfcG9zIC09IGJpdHNfcGVyX2RpZ2l0OworCSAgICB9CisJICBpLS07CisJICBpZiAoaSA8IDApCisJICAgIGJyZWFrOworCSAgbjAgPSAobjEgPDwgLWJpdF9wb3MpICYgKCgxIDw8IGJpdHNfcGVyX2RpZ2l0KSAtIDEpOworCSAgbjEgPSB1cFtpXTsKKwkgIGJpdF9wb3MgKz0gR01QX05VTUJfQklUUzsKKwkgICpzKysgPSBuMCB8IChuMSA+PiBiaXRfcG9zKTsKKwl9CisKKyAgICAgIHJldHVybiBzIC0gc3RyOworICAgIH0KKworICAvKiBHZW5lcmFsIGNhc2UuICBUaGUgYmFzZSBpcyBub3QgYSBwb3dlciBvZiAyLiAgKi8KKworICBpZiAoQkVMT1dfVEhSRVNIT0xEICh1biwgR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG1wbl9iY19nZXRfc3RyIChzdHIsIChzaXplX3QpIDAsIHVwLCB1biwgYmFzZSkgLSBzdHI7CisKKyAgVE1QX01BUks7CisKKyAgLyogQWxsb2NhdGUgb25lIGxhcmdlIGJsb2NrIGZvciB0aGUgcG93ZXJzIG9mIGJpZ19iYXNlLiAgKi8KKyAgcG93dGFiX21lbSA9IFRNUF9CQUxMT0NfTElNQlMgKG1wbl9zdHJfcG93dGFiX2FsbG9jICh1bikpOworCisgIC8qIENvbXB1dGUgYSB0YWJsZSBvZiBwb3dlcnMsIHdlcmUgdGhlIGxhcmdlc3QgcG93ZXIgaXMgPj0gc3FydChVKS4gICovCisgIHNpemVfdCBuZGlnOworICBtcF9zaXplX3QgeG47CisgIERJR0lUU19JTl9CQVNFX1BFUl9MSU1CIChuZGlnLCB1biwgYmFzZSk7CisgIHhuID0gMSArIG5kaWcgLyBtcF9iYXNlc1tiYXNlXS5jaGFyc19wZXJfbGltYjsgLyogRklYTUU6IHNjYWxhciBpbnRlZ2VyIGRpdmlzaW9uICovCisKKyAgcGkgPSAxICsgbXBuX2NvbXB1dGVfcG93dGFiIChwb3d0YWIsIHBvd3RhYl9tZW0sIHhuLCBiYXNlKTsKKworICAvKiBVc2luZyBvdXIgcHJlY29tcHV0ZWQgcG93ZXJzLCBub3cgaW4gcG93dGFiW10sIGNvbnZlcnQgb3VyIG51bWJlci4gICovCisgIHRtcCA9IFRNUF9CQUxMT0NfTElNQlMgKG1wbl9kY19nZXRfc3RyX2l0Y2ggKHVuKSk7CisgIG91dF9sZW4gPSBtcG5fZGNfZ2V0X3N0ciAoc3RyLCAwLCB1cCwgdW4sIHBvd3RhYiArIChwaSAtIDEpLCB0bXApIC0gc3RyOworICBUTVBfRlJFRTsKKworICByZXR1cm4gb3V0X2xlbjsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2dtcC1tcGFyYW0uaCBiL21wbi9nZW5lcmljL2dtcC1tcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGMwNTdhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvZ21wLW1wYXJhbS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIEdlbmVyaWMgQyBnbXAtbXBhcmFtLmggLS0gQ29tcGlsZXIvbWFjaGluZSBwYXJhbWV0ZXIgaGVhZGVyIGZpbGUuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIFZhbHVlcyBmb3IgR01QX0xJTUJfQklUUyBldGMgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IC4vY29uZmlndXJlIGFuZCBwdXQKKyAgIGluIGNvbmZpZy5oLiAqLwpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvaGdjZC5jIGIvbXBuL2dlbmVyaWMvaGdjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTljNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9oZ2NkLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qIGhnY2QuYy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA4LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIFNpemUgYW5hbHlzaXMgZm9yIGhnY2Q6CisKKyAgIEZvciB0aGUgcmVjdXJzaXZlIGNhbGxzLCB3ZSBoYXZlIG4xIDw9IGNlaWwobiAvIDIpLiBUaGVuIHRoZQorICAgc3RvcmFnZSBuZWVkIGlzIGRldGVybWluZWQgYnkgdGhlIHN0b3JhZ2UgZm9yIHRoZSByZWN1cnNpdmUgY2FsbAorICAgY29tcHV0aW5nIE0xLCBhbmQgaGdjZF9tYXRyaXhfYWRqdXN0IGFuZCBoZ2NkX21hdHJpeF9tdWwgY2FsbHMgdGhhdCB1c2UgTTEKKyAgIChhZnRlciB0aGlzLCB0aGUgc3RvcmFnZSBuZWVkZWQgZm9yIE0xIGNhbiBiZSByZWN5Y2xlZCkuCisKKyAgIExldCBTKHIpIGRlbm90ZSB0aGUgcmVxdWlyZWQgc3RvcmFnZS4gRm9yIE0xIHdlIG5lZWQgNCAqIChjZWlsKG4xLzIpICsgMSkKKyAgID0gNCAqIChjZWlsKG4vNCkgKyAxKSwgZm9yIHRoZSBoZ2NkX21hdHJpeF9hZGp1c3QgY2FsbCwgd2UgbmVlZCBuICsgMiwKKyAgIGFuZCBmb3IgdGhlIGhnY2RfbWF0cml4X211bCwgd2UgbWF5IG5lZWQgMyBjZWlsKG4vMikgKyA4LiBJbiB0b3RhbCwKKyAgIDQgKiBjZWlsKG4vNCkgKyAzIGNlaWwobi8yKSArIDEyIDw9IDEwIGNlaWwobi80KSArIDEyLgorCisgICBGb3IgdGhlIHJlY3Vyc2l2ZSBjYWxsLCB3ZSBuZWVkIFMobjEpID0gUyhjZWlsKG4vMikpLgorCisgICBTKG4pIDw9IDEwKmNlaWwobi80KSArIDEyICsgUyhjZWlsKG4vMikpCisJPD0gMTAqKGNlaWwobi80KSArIC4uLiArIGNlaWwobi8yXigxK2spKSkgKyAxMmsgKyBTKGNlaWwobi8yXmspKQorCTw9IDEwKigyIGNlaWwobi80KSArIGspICsgMTJrICsgUyhjZWlsKG4vMl5rKSkKKwk8PSAyMCBjZWlsKG4vNCkgKyAyMmsgKyBTKGNlaWwobi8yXmspKQorKi8KKworbXBfc2l6ZV90CittcG5faGdjZF9pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgdW5zaWduZWQgazsKKyAgaW50IGNvdW50OworICBtcF9zaXplX3QgbnNjYWxlZDsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBIR0NEX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG47CisKKyAgLyogR2V0IHRoZSByZWN1cnNpb24gZGVwdGguICovCisgIG5zY2FsZWQgPSAobiAtIDEpIC8gKEhHQ0RfVEhSRVNIT0xEIC0gMSk7CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNvdW50LCBuc2NhbGVkKTsKKyAgayA9IEdNUF9MSU1CX0JJVFMgLSBjb3VudDsKKworICByZXR1cm4gMjAgKiAoKG4rMykgLyA0KSArIDIyICogayArIEhHQ0RfVEhSRVNIT0xEOworfQorCisvKiBSZWR1Y2VzIGEsYiB1bnRpbCB8YS1ifCBmaXRzIGluIG4vMiArIDEgbGltYnMuIENvbnN0cnVjdHMgbWF0cml4IE0KKyAgIHdpdGggZWxlbWVudHMgb2Ygc2l6ZSBhdCBtb3N0IChuKzEpLzIgLSAxLiBSZXR1cm5zIG5ldyBzaXplIG9mIGEsCisgICBiLCBvciB6ZXJvIGlmIG5vIHJlZHVjdGlvbiBpcyBwb3NzaWJsZS4gKi8KKworbXBfc2l6ZV90CittcG5faGdjZCAobXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLAorCSAgc3RydWN0IGhnY2RfbWF0cml4ICpNLCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBzID0gbi8yICsgMTsKKworICBtcF9zaXplX3Qgbm47CisgIGludCBzdWNjZXNzID0gMDsKKworICBpZiAobiA8PSBzKQorICAgIC8qIEhhcHBlbnMgd2hlbiBuIDw9IDIsIGEgZmFpcmx5IHVuaW50ZXJlc3RpbmcgY2FzZSBidXQgZXhlcmNpc2VkCisgICAgICAgYnkgdGhlIHJhbmRvbSBpbnB1dHMgb2YgdGhlIHRlc3RzdWl0ZS4gKi8KKyAgICByZXR1cm4gMDsKKworICBBU1NFUlQgKChhcFtuLTFdIHwgYnBbbi0xXSkgPiAwKTsKKworICBBU1NFUlQgKChuKzEpLzIgLSAxIDwgTS0+YWxsb2MpOworCisgIGlmIChBQk9WRV9USFJFU0hPTEQgKG4sIEhHQ0RfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9zaXplX3QgbjIgPSAoMypuKS80ICsgMTsKKyAgICAgIG1wX3NpemVfdCBwID0gbi8yOworCisgICAgICBubiA9IG1wbl9oZ2NkX3JlZHVjZSAoTSwgYXAsIGJwLCBuLCBwLCB0cCk7CisgICAgICBpZiAobm4pCisJeworCSAgbiA9IG5uOworCSAgc3VjY2VzcyA9IDE7CisJfQorCisgICAgICAvKiBOT1RFOiBJdCBhcHBlYXJzIHRoaXMgbG9vcCBuZXZlciBydW5zIG1vcmUgdGhhbiBvbmNlIChhdAorCSBsZWFzdCB3aGVuIG5vdCByZWN1cnNpbmcgdG8gaGdjZF9hcHByKS4gKi8KKyAgICAgIHdoaWxlIChuID4gbjIpCisJeworCSAgLyogTmVlZHMgbiArIDEgc3RvcmFnZSAqLworCSAgbm4gPSBtcG5faGdjZF9zdGVwIChuLCBhcCwgYnAsIHMsIE0sIHRwKTsKKwkgIGlmICghbm4pCisJICAgIHJldHVybiBzdWNjZXNzID8gbiA6IDA7CisKKwkgIG4gPSBubjsKKwkgIHN1Y2Nlc3MgPSAxOworCX0KKworICAgICAgaWYgKG4gPiBzICsgMikKKwl7CisJICBzdHJ1Y3QgaGdjZF9tYXRyaXggTTE7CisJICBtcF9zaXplX3Qgc2NyYXRjaDsKKworCSAgcCA9IDIqcyAtIG4gKyAxOworCSAgc2NyYXRjaCA9IE1QTl9IR0NEX01BVFJJWF9JTklUX0lUQ0ggKG4tcCk7CisKKwkgIG1wbl9oZ2NkX21hdHJpeF9pbml0KCZNMSwgbiAtIHAsIHRwKTsKKworCSAgLyogRklYTUU6IFNob3VsZCB1c2UgaGdjZF9yZWR1Y2UsIGJ1dCB0aGF0IG1heSByZXF1aXJlIG1vcmUKKwkgICAgIHNjcmF0Y2ggc3BhY2UsIHdoaWNoIHJlcXVpcmVzIHJldmlldy4gKi8KKworCSAgbm4gPSBtcG5faGdjZCAoYXAgKyBwLCBicCArIHAsIG4gLSBwLCAmTTEsIHRwICsgc2NyYXRjaCk7CisJICBpZiAobm4gPiAwKQorCSAgICB7CisJICAgICAgLyogV2UgYWx3YXlzIGhhdmUgbWF4KE0pID4gMl57LShHTVBfTlVNQl9CSVRTICsgMSl9IG1heChNMSkgKi8KKwkgICAgICBBU1NFUlQgKE0tPm4gKyAyID49IE0xLm4pOworCisJICAgICAgLyogRnVydGhlcm1vcmUsIGFzc3VtZSBNIGVuZHMgd2l0aCBhIHF1b3RpZW50ICgxLCBxOyAwLCAxKSwKKwkJIHRoZW4gZWl0aGVyIHEgb3IgcSArIDEgaXMgYSBjb3JyZWN0IHF1b3RpZW50LCBhbmQgTTEgd2lsbAorCQkgc3RhcnQgd2l0aCBlaXRoZXIgKDEsIDA7IDEsIDEpIG9yICgyLCAxOyAxLCAxKS4gVGhpcworCQkgcnVsZXMgb3V0IHRoZSBjYXNlIHRoYXQgdGhlIHNpemUgb2YgTSAqIE0xIGlzIG11Y2gKKwkJIHNtYWxsZXIgdGhhbiB0aGUgZXhwZWN0ZWQgTS0+biArIE0xLT5uLiAqLworCisJICAgICAgQVNTRVJUIChNLT5uICsgTTEubiA8IE0tPmFsbG9jKTsKKworCSAgICAgIC8qIE5lZWRzIDIgKHAgKyBNLT5uKSA8PSAyICgyKnMgLSBuMiArIDEgKyBuMiAtIHMgLSAxKQorCQkgPSAyKnMgPD0gMiooZmxvb3Iobi8yKSArIDEpIDw9IG4gKyAyLiAqLworCSAgICAgIG4gPSBtcG5faGdjZF9tYXRyaXhfYWRqdXN0ICgmTTEsIHAgKyBubiwgYXAsIGJwLCBwLCB0cCArIHNjcmF0Y2gpOworCisJICAgICAgLyogV2UgbmVlZCBhIGJvdW5kIGZvciBvZiBNLT5uICsgTTEubi4gTGV0IG4gYmUgdGhlIG9yaWdpbmFsCisJCSBpbnB1dCBzaXplLiBUaGVuCisKKwkJIGNlaWwobi8yKSAtIDEgPj0gc2l6ZSBvZiBwcm9kdWN0ID49IE0ubiArIE0xLm4gLSAyCisKKwkJIGFuZCBpdCBmb2xsb3dzIHRoYXQKKworCQkgTS5uICsgTTEubiA8PSBjZWlsKG4vMikgKyAxCisKKwkJIFRoZW4gMyooTS5uICsgTTEubikgKyA1IDw9IDMgKiBjZWlsKG4vMikgKyA4IGlzIHRoZQorCQkgYW1vdW50IG9mIG5lZWRlZCBzY3JhdGNoIHNwYWNlLiAqLworCSAgICAgIG1wbl9oZ2NkX21hdHJpeF9tdWwgKE0sICZNMSwgdHAgKyBzY3JhdGNoKTsKKwkgICAgICBzdWNjZXNzID0gMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBOZWVkcyBzKzMgPCBuICovCisgICAgICBubiA9IG1wbl9oZ2NkX3N0ZXAgKG4sIGFwLCBicCwgcywgTSwgdHApOworICAgICAgaWYgKCFubikKKwlyZXR1cm4gc3VjY2VzcyA/IG4gOiAwOworCisgICAgICBuID0gbm47CisgICAgICBzdWNjZXNzID0gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9oZ2NkMi1kaXYuaCBiL21wbi9nZW5lcmljL2hnY2QyLWRpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmE0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9oZ2NkMi1kaXYuaApAQCAtMCwwICsxLDUwNCBAQAorLyogaGdjZDItZGl2LmgKKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OCwgMjAwMC0yMDA0LCAyMDA4LCAyMDEyLCAyMDE5LCAyMDIwIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBIR0NEMl9ESVYxX01FVEhPRAorI2RlZmluZSBIR0NEMl9ESVYxX01FVEhPRCAzCisjZW5kaWYKKworI2lmbmRlZiBIR0NEMl9ESVYyX01FVEhPRAorI2RlZmluZSBIR0NEMl9ESVYyX01FVEhPRCAyCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9kaXZfMTEKKworI2RlZmluZSBkaXYxIG1wbl9kaXZfMTEKKy8qIFNpbmdsZS1saW1iIGRpdmlzaW9uIG9wdGltaXplZCBmb3Igc21hbGwgcXVvdGllbnRzLgorICAgUmV0dXJuZWQgdmFsdWUgaG9sZHMgZDAgPSByLCBkMSA9IHEuICovCittcF9kb3VibGVfbGltYl90IGRpdjEgKG1wX2xpbWJfdCwgbXBfbGltYl90KTsKKworI2VsaWYgSEdDRDJfRElWMV9NRVRIT0QgPT0gMQorCitzdGF0aWMgaW5saW5lIG1wX2RvdWJsZV9saW1iX3QKK2RpdjEgKG1wX2xpbWJfdCBuMCwgbXBfbGltYl90IGQwKQoreworICBtcF9kb3VibGVfbGltYl90IHJlczsKKyAgcmVzLmQxID0gbjAgLyBkMDsKKyAgcmVzLmQwID0gbjAgLSByZXMuZDEgKiBkMDsKKworICByZXR1cm4gcmVzOworfQorCisjZWxpZiBIR0NEMl9ESVYxX01FVEhPRCA9PSAyCisKK3N0YXRpYyBtcF9kb3VibGVfbGltYl90CitkaXYxIChtcF9saW1iX3QgbjAsIG1wX2xpbWJfdCBkMCkKK3sKKyAgbXBfZG91YmxlX2xpbWJfdCByZXM7CisgIGludCBuY250LCBkY250LCBjbnQ7CisgIG1wX2xpbWJfdCBxOworICBtcF9saW1iX3QgbWFzazsKKworICBBU1NFUlQgKG4wID49IGQwKTsKKworICBjb3VudF9sZWFkaW5nX3plcm9zIChuY250LCBuMCk7CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKGRjbnQsIGQwKTsKKyAgY250ID0gZGNudCAtIG5jbnQ7CisKKyAgZDAgPDw9IGNudDsKKworICBxID0gLShtcF9saW1iX3QpIChuMCA+PSBkMCk7CisgIG4wIC09IGQwICYgcTsKKyAgZDAgPj49IDE7CisgIHEgPSAtcTsKKworICB3aGlsZSAoLS1jbnQgPj0gMCkKKyAgICB7CisgICAgICBtYXNrID0gLShtcF9saW1iX3QpIChuMCA+PSBkMCk7CisgICAgICBuMCAtPSBkMCAmIG1hc2s7CisgICAgICBkMCA+Pj0gMTsKKyAgICAgIHEgPSAocSA8PCAxKSAtIG1hc2s7CisgICAgfQorCisgIHJlcy5kMCA9IG4wOworICByZXMuZDEgPSBxOworICByZXR1cm4gcmVzOworfQorCisjZWxpZiBIR0NEMl9ESVYxX01FVEhPRCA9PSAzCisKK3N0YXRpYyBpbmxpbmUgbXBfZG91YmxlX2xpbWJfdAorZGl2MSAobXBfbGltYl90IG4wLCBtcF9saW1iX3QgZDApCit7CisgIG1wX2RvdWJsZV9saW1iX3QgcmVzOworICBpZiAoVU5MSUtFTFkgKChkMCA+PiAoR01QX0xJTUJfQklUUyAtIDMpKSAhPSAwKQorICAgICAgfHwgVU5MSUtFTFkgKG4wID49IChkMCA8PCAzKSkpCisgICAgeworICAgICAgcmVzLmQxID0gbjAgLyBkMDsKKyAgICAgIHJlcy5kMCA9IG4wIC0gcmVzLmQxICogZDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90IHEsIG1hc2s7CisKKyAgICAgIGQwIDw8PSAyOworCisgICAgICBtYXNrID0gLShtcF9saW1iX3QpIChuMCA+PSBkMCk7CisgICAgICBuMCAtPSBkMCAmIG1hc2s7CisgICAgICBxID0gNCAmIG1hc2s7CisKKyAgICAgIGQwID4+PSAxOworICAgICAgbWFzayA9IC0obXBfbGltYl90KSAobjAgPj0gZDApOworICAgICAgbjAgLT0gZDAgJiBtYXNrOworICAgICAgcSArPSAyICYgbWFzazsKKworICAgICAgZDAgPj49IDE7CisgICAgICBtYXNrID0gLShtcF9saW1iX3QpIChuMCA+PSBkMCk7CisgICAgICBuMCAtPSBkMCAmIG1hc2s7CisgICAgICBxIC09IG1hc2s7CisKKyAgICAgIHJlcy5kMCA9IG4wOworICAgICAgcmVzLmQxID0gcTsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisKKyNlbGlmIEhHQ0QyX0RJVjFfTUVUSE9EID09IDQKKworLyogVGFibGUgcXVvdGllbnRzLiAgV2UgZXh0cmFjdCB0aGUgTkJJVFMgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZQorICAgbnVtZXJhdG9yIGxpbWIsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBiaXRzIGZyb20gdGhlIGRpdmlzb3IgbGltYiwgYW5kIHVzZQorICAgdGhlc2UgdG8gZm9ybSBhbiBpbmRleCBpbnRvIHRoZSB0YWJsZS4gIFRoaXMgbWV0aG9kIGlzIHByb2JhYmx5IG9ubHkgdXNlZnVsCisgICBmb3Igc2hvcnQgcGlwZWxpbmVzIHdpdGggc2xvdyBtdWx0aXBsaWNhdGlvbi4KKworICAgUG9zc2libGUgaW1wcm92ZW1lbnRzOgorCisgICAqIFBlcmhhcHMgZXh0cmFjdCB0aGUgaGlnaGVzdCBOQklUUyBvZiB0aGUgZGl2aXNvciBpbnN0ZWFkIG9mIHRoZSBzYW1lIGJpdHMKKyAgICAgYXMgZnJvbSB0aGUgbnVtZXJhdG9yLiAgVGhhdCB3b3VsZCByZXF1aXJlIGFub3RoZXIgY291bnRfbGVhZGluZ196ZXJvcywKKyAgICAgYW5kIGEgcG9zdC1tdWx0aXBseSBzaGlmdCBvZiB0aGUgcXVvdGllbnQuCisKKyAgICogQ29tcHJlc3MgdGFibGVzPyAgVGhlaXIgdmFsdWVzIGFyZSB0aW55LCBhbmQgdGhlcmUgYXJlIGxvdHMgb2YgemVybworICAgICBlbnRyaWVzICh3aGljaCBhcmUgbmV2ZXIgdXNlZCkuCisKKyAgICogUm91bmQgdGhlIHRhYmxlIGVudHJpZXMgbW9yZSBjbGV2ZXJseT8KKyovCisKKyNpZm5kZWYgTkJJVFMKKyNkZWZpbmUgTkJJVFMgNQorI2VuZGlmCisKKyNpZiBOQklUUyA9PSA1CisvKiBUaGlzIG5lZWRzIGZ1bGwgZGl2aXNpb24gYWJvdXQgMTMuMiUgb2YgdGhlIHRpbWUuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJbNTEyXSA9IHsKKzE3LCA5LCA1LDQsMywyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzE4LCA5LCA2LDQsMywyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzE5LDEwLCA2LDQsMywzLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzIwLDEwLCA2LDUsMywzLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzIxLDExLCA3LDUsNCwzLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzIyLDExLCA3LDUsNCwzLDMsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzIzLDEyLCA3LDUsNCwzLDMsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKKzI0LDEyLCA4LDYsNCwzLDMsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwKKzI1LDEzLCA4LDYsNSw0LDMsMywyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwKKzI2LDEzLCA4LDYsNSw0LDMsMywyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwKKzI3LDE0LCA5LDYsNSw0LDMsMywyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwKKzI4LDE0LCA5LDcsNSw0LDMsMywzLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwKKzI5LDE1LDEwLDcsNSw0LDQsMywzLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwKKzMwLDE1LDEwLDcsNiw1LDQsMywzLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwKKzMxLDE2LDEwLDcsNiw1LDQsMywzLDMsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwKKzMyLDE2LDExLDgsNiw1LDQsMywzLDMsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMQorfTsKKyNlbGlmIE5CSVRTID09IDYKKy8qIFRoaXMgbmVlZHMgZnVsbCBkaXZpc2lvbiBhYm91dCA5LjglIG9mIHRoZSB0aW1lLiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFiWzIwNDhdID0geworMzMsMTcsMTEsIDgsIDYsIDUsNCw0LDMsMywyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDAsIDAsIDAsIDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzQsMTcsMTEsIDgsIDYsIDUsNCw0LDMsMywzLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDAsIDAsIDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzUsMTgsMTIsIDksIDcsIDUsNSw0LDMsMywzLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDAsIDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzYsMTgsMTIsIDksIDcsIDYsNSw0LDMsMywzLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzcsMTksMTMsIDksIDcsIDYsNSw0LDQsMywzLDMsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzgsMTksMTMsIDksIDcsIDYsNSw0LDQsMywzLDMsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMzksMjAsMTMsMTAsIDcsIDYsNSw0LDQsMywzLDMsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDAsMjAsMTQsMTAsIDgsIDYsNSw1LDQsMywzLDMsMywyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDEsMjEsMTQsMTAsIDgsIDYsNSw1LDQsNCwzLDMsMywyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDIsMjEsMTQsMTAsIDgsIDcsNiw1LDQsNCwzLDMsMywyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDMsMjIsMTUsMTEsIDgsIDcsNiw1LDQsNCwzLDMsMywzLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDQsMjIsMTUsMTEsIDksIDcsNiw1LDQsNCwzLDMsMywzLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDUsMjMsMTUsMTEsIDksIDcsNiw1LDUsNCw0LDMsMywzLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDYsMjMsMTYsMTEsIDksIDcsNiw1LDUsNCw0LDMsMywzLDMsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDcsMjQsMTYsMTIsIDksIDcsNiw1LDUsNCw0LDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDgsMjQsMTYsMTIsIDksIDgsNiw2LDUsNCw0LDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNDksMjUsMTcsMTIsMTAsIDgsNyw2LDUsNCw0LDQsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTAsMjUsMTcsMTMsMTAsIDgsNyw2LDUsNSw0LDQsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTEsMjYsMTgsMTMsMTAsIDgsNyw2LDUsNSw0LDQsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTIsMjYsMTgsMTMsMTAsIDgsNyw2LDUsNSw0LDQsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTMsMjcsMTgsMTMsMTAsIDksNyw2LDUsNSw0LDQsNCwzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTQsMjcsMTksMTQsMTEsIDksNyw2LDYsNSw0LDQsNCwzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAorNTUsMjgsMTksMTQsMTEsIDksNyw2LDYsNSw1LDQsNCwzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAorNTYsMjgsMTksMTQsMTEsIDksOCw3LDYsNSw1LDQsNCwzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLAorNTcsMjksMjAsMTQsMTEsIDksOCw3LDYsNSw1LDQsNCw0LDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLAorNTgsMjksMjAsMTUsMTEsIDksOCw3LDYsNSw1LDQsNCw0LDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwxLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLAorNTksMzAsMjAsMTUsMTIsMTAsOCw3LDYsNSw1LDQsNCw0LDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLAorNjAsMzAsMjEsMTUsMTIsMTAsOCw3LDYsNiw1LDUsNCw0LDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLAorNjEsMzEsMjEsMTUsMTIsMTAsOCw3LDYsNiw1LDUsNCw0LDQsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLAorNjIsMzEsMjIsMTYsMTIsMTAsOSw3LDYsNiw1LDUsNCw0LDQsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLAorNjMsMzIsMjIsMTYsMTMsMTAsOSw3LDcsNiw1LDUsNCw0LDQsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLAorNjQsMzIsMjIsMTYsMTMsMTAsOSw4LDcsNiw1LDUsNCw0LDQsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLAorIDEsIDEsIDEsIDEsIDEsIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxCit9OworI2Vsc2UKKyNlcnJvciBObyB0YWJsZSBmb3IgcHJvdmlkZWQgTkJJVFMKKyNlbmRpZgorCisvKiBEb2luZyB0YWJwIHdpdGggYSAjZGVmaW5lIG1ha2VzIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHBvaW50aW5nIG91dHNpZGUgYW4KKyAgIG9iamVjdCBnbyBhd2F5LiAgV2UgdXNlZCB0byBkZWZpbmUgdGhpcyBhcyBhIHZhcmlhYmxlLiAgSXQgaXMgbm90IGNsZWFyIGlmCisgICBlLmcuICAodmVjdG9yWzEwMF0gLSAxMCkgKyAxMCBpcyB3ZWxsLSBkZWZpbmVkIGFzIHBlciB0aGUgQyBzdGFuZGFyZDsKKyAgICh2ZWN0b3JbMTAwXSArIDEwKSAtIDEwIHN1cmVseSBpcyBhbmQgdGhlcmUgaXMgbm8gc2VxdWVuY2UgcG9pbnQgc28gdGhlCisgICBleHByZXNzaW9ucyBzaG91bGQgYmUgZXF1aXZhbGVudC4gIFRvIG1ha2UgdGhpcyBzYWZlLCB3ZSBtaWdodCB3YW50IHRvCisgICBkZWZpbmUgdGFicCBhcyBhIG1hY3JvIHdpdGggdGhlIGluZGV4IGFzIGFuIGFyZ3VtZW50LiAgRGVwZW5kaW5nIG9uIHRoZQorICAgcGxhdGZvcm0sIHJlbG9jcyBtaWdodCBhbGxvdyBmb3IgYXNzZW1ibHktdGltZSBvciBsaW5rZXItdGltZSByZXNvbHV0aW9uIHRvCisgICB0YWtlIHBsYWNlLiAqLworI2RlZmluZSB0YWJwICh0YWIgLSAoMSA8PCAoTkJJVFMgLSAxKSA8PCBOQklUUykpCisKK3N0YXRpYyBpbmxpbmUgbXBfZG91YmxlX2xpbWJfdAorZGl2MSAobXBfbGltYl90IG4wLCBtcF9saW1iX3QgZDApCit7CisgIGludCBuY250OworICBzaXplX3QgbmJpLCBkYmk7CisgIG1wX2xpbWJfdCBxMDsKKyAgbXBfbGltYl90IHIwOworICBtcF9saW1iX3QgbWFzazsKKyAgbXBfZG91YmxlX2xpbWJfdCByZXM7CisKKyAgQVNTRVJUIChuMCA+PSBkMCk7CQkvKiBBY3R1YWxseSBvbmx5IG1zYiBwb3NpdGlvbiBpcyBjcml0aWNhbC4gKi8KKworICBjb3VudF9sZWFkaW5nX3plcm9zIChuY250LCBuMCk7CisgIG5iaSA9IG4wIDw8IG5jbnQgPj4gKEdNUF9MSU1CX0JJVFMgLSBOQklUUyk7CisgIGRiaSA9IGQwIDw8IG5jbnQgPj4gKEdNUF9MSU1CX0JJVFMgLSBOQklUUyk7CisKKyAgcTAgPSB0YWJwWyhuYmkgPDwgTkJJVFMpICsgZGJpXTsKKyAgcjAgPSBuMCAtIHEwICogZDA7CisgIG1hc2sgPSAtKG1wX2xpbWJfdCkgKHIwID49IGQwKTsKKyAgcTAgLT0gbWFzazsKKyAgcjAgLT0gZDAgJiBtYXNrOworCisgIGlmIChVTkxJS0VMWSAocjAgPj0gZDApKQorICAgIHsKKyAgICAgIHEwID0gbjAgLyBkMDsKKyAgICAgIHIwID0gbjAgLSBxMCAqIGQwOworICAgIH0KKworICByZXMuZDEgPSBxMDsKKyAgcmVzLmQwID0gcjA7CisgIHJldHVybiByZXM7Cit9CisKKyNlbGlmIEhHQ0QyX0RJVjFfTUVUSE9EID09IDUKKworLyogVGFibGUgaW52ZXJzZXMgb2YgZGl2aXNvcnMuICBXZSBkb24ndCBib3RoZXIgd2l0aCBzdXBwcmVzc2luZyB0aGUgbXNiIGZyb20KKyAgIHRoZSB0YWJsZXMuICBXZSBpbmRleCB3aXRoIHRoZSBOQklUUyBtb3N0IHNpZ25pZmljYW50IGRpdmlzb3IgYml0cywKKyAgIGluY2x1ZGluZyB0aGUgYWx3YXlzLXNldCBoaWdoZXN0IGJpdCwgYnV0IHVzZSBhZGRyZXNzaW5nIHRyaWNrZXJ5IHZpYSB0YWJwCisgICB0byBzdXBwcmVzcyBpdC4KKworICAgUG9zc2libGUgaW1wcm92ZW1lbnRzOgorCisgICAqIERvIGZpcnN0IG11bHRpcGx5IHVzaW5nIDMyLWJpdCBvcGVyYXRpb25zIG9uIDY0LWJpdCBjb21wdXRlcnMuICBBdCBsZWFzdAorICAgICBvbiBtb3N0IEFybTY0IGNvcmVzLCB0aGF0IHVzZXMgMyB0aW1lcyBsZXNzIHJlc291cmNlcy4gIEl0IGFsc28gc2F2ZXMgb24KKyAgICAgbWFueSB4ODYtNjQgcHJvY2Vzc29ycy4KKyovCisKKyNpZm5kZWYgTkJJVFMKKyNkZWZpbmUgTkJJVFMgNworI2VuZGlmCisKKyNpZiBOQklUUyA9PSA1CisvKiBUaGlzIG5lZWRzIGZ1bGwgZGl2aXNpb24gYWJvdXQgMS42MyUgb2YgdGhlIHRpbWUuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJbMTZdID0geworIDYzLCA1OSwgNTUsIDUyLCA1MCwgNDcsIDQ1LCA0MywgNDEsIDM5LCAzOCwgMzYsIDM1LCAzNCwgMzMsIDMyCit9OworI2VsaWYgTkJJVFMgPT0gNgorLyogVGhpcyBuZWVkcyBmdWxsIGRpdmlzaW9uIGFib3V0IDAuOTMlIG9mIHRoZSB0aW1lLiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFiWzMyXSA9IHsKKzEyNywxMjMsMTE5LDExNiwxMTIsMTA5LDEwNiwxMDQsMTAxLCA5OCwgOTYsIDk0LCA5MiwgOTAsIDg4LCA4NiwKKyA4NCwgODIsIDgwLCA3OSwgNzcsIDc2LCA3NCwgNzMsIDcyLCA3MCwgNjksIDY4LCA2NywgNjYsIDY1LCA2NAorfTsKKyNlbGlmIE5CSVRTID09IDcKKy8qIFRoaXMgbmVlZHMgZnVsbCBkaXZpc2lvbiBhYm91dCAwLjQ5JSBvZiB0aGUgdGltZS4gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYls2NF0gPSB7CisyNTUsMjUxLDI0NywyNDMsMjM5LDIzNiwyMzMsMjI5LDIyNiwyMjMsMjIwLDIxNywyMTQsMjExLDIwOSwyMDYsCisyMDMsMjAxLDE5OCwxOTYsMTk0LDE5MSwxODksMTg3LDE4NSwxODMsMTgxLDE3OSwxNzcsMTc1LDE3MywxNzEsCisxNjksMTY3LDE2NiwxNjQsMTYyLDE2MSwxNTksMTU4LDE1NiwxNTUsMTUzLDE1MiwxNTAsMTQ5LDE0NywxNDYsCisxNDUsMTQzLDE0MiwxNDEsMTQwLDEzOSwxMzcsMTM2LDEzNSwxMzQsMTMzLDEzMiwxMzEsMTMwLDEyOSwxMjgKK307CisjZWxpZiBOQklUUyA9PSA4CisvKiBUaGlzIG5lZWRzIGZ1bGwgZGl2aXNpb24gYWJvdXQgMC4yNiUgb2YgdGhlIHRpbWUuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdGFiWzEyOF0gPSB7Cis1MTEsNTA3LDUwMyw0OTksNDk1LDQ5MSw0ODgsNDg0LDQ4MCw0NzcsNDczLDQ3MCw0NjcsNDYzLDQ2MCw0NTcsCis0NTQsNDUwLDQ0Nyw0NDQsNDQxLDQzOCw0MzUsNDMzLDQzMCw0MjcsNDI0LDQyMSw0MTksNDE2LDQxMyw0MTEsCis0MDgsNDA2LDQwMyw0MDEsMzk4LDM5NiwzOTMsMzkxLDM4OSwzODYsMzg0LDM4MiwzODAsMzc3LDM3NSwzNzMsCiszNzEsMzY5LDM2NywzNjUsMzYzLDM2MSwzNTksMzU3LDM1NSwzNTMsMzUxLDM0OSwzNDcsMzQ1LDM0MywzNDIsCiszNDAsMzM4LDMzNiwzMzUsMzMzLDMzMSwzMjksMzI4LDMyNiwzMjUsMzIzLDMyMSwzMjAsMzE4LDMxNywzMTUsCiszMTQsMzEyLDMxMSwzMDksMzA4LDMwNiwzMDUsMzAzLDMwMiwzMDEsMjk5LDI5OCwyOTYsMjk1LDI5NCwyOTIsCisyOTEsMjkwLDI4OCwyODcsMjg2LDI4NSwyODMsMjgyLDI4MSwyODAsMjc5LDI3NywyNzYsMjc1LDI3NCwyNzMsCisyNzIsMjcwLDI2OSwyNjgsMjY3LDI2NiwyNjUsMjY0LDI2MywyNjIsMjYxLDI2MCwyNTksMjU4LDI1NywyNTYKK307CisjZWxzZQorI2Vycm9yIE5vIHRhYmxlIGZvciBwcm92aWRlZCBOQklUUworI2VuZGlmCisKKy8qIERvaW5nIHRhYnAgd2l0aCBhICNkZWZpbmUgbWFrZXMgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgcG9pbnRpbmcgb3V0c2lkZSBhbgorICAgb2JqZWN0IGdvIGF3YXkuICBXZSB1c2VkIHRvIGRlZmluZSB0aGlzIGFzIGEgdmFyaWFibGUuICBJdCBpcyBub3QgY2xlYXIgaWYKKyAgIGUuZy4gICh2ZWN0b3JbMTAwXSAtIDEwKSArIDEwIGlzIHdlbGwtIGRlZmluZWQgYXMgcGVyIHRoZSBDIHN0YW5kYXJkOworICAgKHZlY3RvclsxMDBdICsgMTApIC0gMTAgc3VyZWx5IGlzIGFuZCB0aGVyZSBpcyBubyBzZXF1ZW5jZSBwb2ludCBzbyB0aGUKKyAgIGV4cHJlc3Npb25zIHNob3VsZCBiZSBlcXVpdmFsZW50LiAgVG8gbWFrZSB0aGlzIHNhZmUsIHdlIG1pZ2h0IHdhbnQgdG8KKyAgIGRlZmluZSB0YWJwIGFzIGEgbWFjcm8gd2l0aCB0aGUgaW5kZXggYXMgYW4gYXJndW1lbnQuICBEZXBlbmRpbmcgb24gdGhlCisgICBwbGF0Zm9ybSwgcmVsb2NzIG1pZ2h0IGFsbG93IGZvciBhc3NlbWJseS10aW1lIG9yIGxpbmtlci10aW1lIHJlc29sdXRpb24gdG8KKyAgIHRha2UgcGxhY2UuICovCisjZGVmaW5lIHRhYnAgKHRhYiAtICgxIDw8IChOQklUUyAtIDEpKSkKKworc3RhdGljIGlubGluZSBtcF9kb3VibGVfbGltYl90CitkaXYxIChtcF9saW1iX3QgbjAsIG1wX2xpbWJfdCBkMCkKK3sKKyAgaW50IG5jbnQsIGRjbnQ7CisgIHNpemVfdCBkYmk7CisgIG1wX2xpbWJfdCBpbnY7CisgIG1wX2xpbWJfdCBxMDsKKyAgbXBfbGltYl90IHIwOworICBtcF9saW1iX3QgbWFzazsKKyAgbXBfZG91YmxlX2xpbWJfdCByZXM7CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAobmNudCwgbjApOworICBjb3VudF9sZWFkaW5nX3plcm9zIChkY250LCBkMCk7CisKKyAgZGJpID0gZDAgPDwgZGNudCA+PiAoR01QX0xJTUJfQklUUyAtIE5CSVRTKTsKKyAgaW52ID0gdGFicFtkYmldOworICBxMCA9ICgobjAgPDwgbmNudCkgPj4gKE5CSVRTICsgMSkpICogaW52ID4+IChHTVBfTElNQl9CSVRTIC0gMSArIG5jbnQgLSBkY250KTsKKyAgcjAgPSBuMCAtIHEwICogZDA7CisgIG1hc2sgPSAtKG1wX2xpbWJfdCkgKHIwID49IGQwKTsKKyAgcTAgLT0gbWFzazsKKyAgcjAgLT0gZDAgJiBtYXNrOworCisgIGlmIChVTkxJS0VMWSAocjAgPj0gZDApKQorICAgIHsKKyAgICAgIHEwID0gbjAgLyBkMDsKKyAgICAgIHIwID0gbjAgLSBxMCAqIGQwOworICAgIH0KKworICByZXMuZDEgPSBxMDsKKyAgcmVzLmQwID0gcjA7CisgIHJldHVybiByZXM7Cit9CisKKyNlbHNlCisjZXJyb3IgVW5rbm93biBIR0NEMl9ESVYxX01FVEhPRAorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fZGl2XzIyCisKKyNkZWZpbmUgZGl2MiBtcG5fZGl2XzIyCisvKiBUd28tbGltYiBkaXZpc2lvbiBvcHRpbWl6ZWQgZm9yIHNtYWxsIHF1b3RpZW50cy4gICovCittcF9saW1iX3QgZGl2MiAobXBfcHRyLCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCisjZWxpZiBIR0NEMl9ESVYyX01FVEhPRCA9PSAxCisKK3N0YXRpYyBtcF9saW1iX3QKK2RpdjIgKG1wX3B0ciBycCwKKyAgICAgIG1wX2xpbWJfdCBuMSwgbXBfbGltYl90IG4wLAorICAgICAgbXBfbGltYl90IGQxLCBtcF9saW1iX3QgZDApCit7CisgIG1wX2RvdWJsZV9saW1iX3QgcnEgPSBkaXYxIChuMSwgZDEpOworICBpZiAoVU5MSUtFTFkgKHJxLmQxID4gZDEpKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBuMiwgcSwgdDEsIHQwOworICAgICAgaW50IGM7CisKKyAgICAgIC8qIE5vcm1hbGl6ZSAqLworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAoYywgZDEpOworICAgICAgQVNTRVJUIChjID4gMCk7CisKKyAgICAgIG4yID0gbjEgPj4gKEdNUF9MSU1CX0JJVFMgLSBjKTsKKyAgICAgIG4xID0gKG4xIDw8IGMpIHwgKG4wID4+IChHTVBfTElNQl9CSVRTIC0gYykpOworICAgICAgbjAgPDw9IGM7CisgICAgICBkMSA9IChkMSA8PCBjKSB8IChkMCA+PiAoR01QX0xJTUJfQklUUyAtIGMpKTsKKyAgICAgIGQwIDw8PSBjOworCisgICAgICB1ZGl2X3Fybm5kIChxLCBuMSwgbjIsIG4xLCBkMSk7CisgICAgICB1bXVsX3BwbW0gKHQxLCB0MCwgcSwgZDApOworICAgICAgaWYgKHQxID4gbjEgfHwgKHQxID09IG4xICYmIHQwID4gbjApKQorCXsKKwkgIEFTU0VSVCAocSA+IDApOworCSAgcS0tOworCSAgc3ViX2RkbW1zcyAodDEsIHQwLCB0MSwgdDAsIGQxLCBkMCk7CisJfQorICAgICAgc3ViX2RkbW1zcyAobjEsIG4wLCBuMSwgbjAsIHQxLCB0MCk7CisKKyAgICAgIC8qIFVuZG8gbm9ybWFsaXphdGlvbiAqLworICAgICAgcnBbMF0gPSAobjAgPj4gYykgfCAobjEgPDwgKEdNUF9MSU1CX0JJVFMgLSBjKSk7CisgICAgICBycFsxXSA9IG4xID4+IGM7CisKKyAgICAgIHJldHVybiBxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxLCB0MSwgdDA7CisgICAgICBuMSA9IHJxLmQwOworICAgICAgcSA9IHJxLmQxOworICAgICAgdW11bF9wcG1tICh0MSwgdDAsIHEsIGQwKTsKKyAgICAgIGlmIChVTkxJS0VMWSAodDEgPj0gbjEpICYmICh0MSA+IG4xIHx8IHQwID4gbjApKQorCXsKKwkgIEFTU0VSVCAocSA+IDApOworCSAgcS0tOworCSAgc3ViX2RkbW1zcyAodDEsIHQwLCB0MSwgdDAsIGQxLCBkMCk7CisJfQorICAgICAgc3ViX2RkbW1zcyAocnBbMV0sIHJwWzBdLCBuMSwgbjAsIHQxLCB0MCk7CisgICAgICByZXR1cm4gcTsKKyAgICB9Cit9CisKKyNlbGlmIEhHQ0QyX0RJVjJfTUVUSE9EID09IDIKKworLyogQml0LXdpc2UgZGl2Mi4gUmVsaWVzIG9uIGZhc3QgY291bnRfbGVhZGluZ196ZXJvcy4gKi8KK3N0YXRpYyBtcF9saW1iX3QKK2RpdjIgKG1wX3B0ciBycCwKKyAgICAgIG1wX2xpbWJfdCBuMSwgbXBfbGltYl90IG4wLAorICAgICAgbXBfbGltYl90IGQxLCBtcF9saW1iX3QgZDApCit7CisgIG1wX2xpbWJfdCBxID0gMDsKKyAgaW50IG5jbnQ7CisgIGludCBkY250OworCisgIGNvdW50X2xlYWRpbmdfemVyb3MgKG5jbnQsIG4xKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoZGNudCwgZDEpOworICBkY250IC09IG5jbnQ7CisKKyAgZDEgPSAoZDEgPDwgZGNudCkgKyAoZDAgPj4gMSA+PiAoR01QX0xJTUJfQklUUyAtIDEgLSBkY250KSk7CisgIGQwIDw8PSBkY250OworCisgIGRvCisgICAgeworICAgICAgbXBfbGltYl90IG1hc2s7CisgICAgICBxIDw8PSAxOworICAgICAgaWYgKFVOTElLRUxZIChuMSA9PSBkMSkpCisJbWFzayA9IC0objAgPj0gZDApOworICAgICAgZWxzZQorCW1hc2sgPSAtKG4xID4gZDEpOworCisgICAgICBxIC09IG1hc2s7CisKKyAgICAgIHN1Yl9kZG1tc3MgKG4xLCBuMCwgbjEsIG4wLCBtYXNrICYgZDEsIG1hc2sgJiBkMCk7CisKKyAgICAgIGQwID0gKGQxIDw8IChHTVBfTElNQl9CSVRTIC0gMSkpIHwgKGQwID4+IDEpOworICAgICAgZDEgPSBkMSA+PiAxOworICAgIH0KKyAgd2hpbGUgKGRjbnQtLSk7CisKKyAgcnBbMF0gPSBuMDsKKyAgcnBbMV0gPSBuMTsKKworICByZXR1cm4gcTsKK30KKyNlbHNlCisjZXJyb3IgVW5rbm93biBIR0NEMl9ESVYyX01FVEhPRAorI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9oZ2NkMi5jIGIvbXBuL2dlbmVyaWMvaGdjZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q0ZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvaGdjZDIuYwpAQCAtMCwwICsxLDI4MyBAQAorLyogaGdjZDIuYworCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAxOTk2LCAxOTk4LCAyMDAwLTIwMDQsIDIwMDgsIDIwMTIsIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaW5jbHVkZSAibXBuL2dlbmVyaWMvaGdjZDItZGl2LmgiCisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyNlcnJvciBOYWlscyBub3QgaW1wbGVtZW50ZWQKKyNlbmRpZgorCisvKiBSZWR1Y2VzIGEsYiB1bnRpbCB8YS1ifCAoYWxtb3N0KSBmaXRzIGluIG9uZSBsaW1iICsgMSBiaXQuIENvbnN0cnVjdHMKKyAgIG1hdHJpeCBNLiBSZXR1cm5zIDEgaWYgd2UgbWFrZSBwcm9ncmVzcywgaS5lLiBjYW4gcGVyZm9ybSBhdCBsZWFzdAorICAgb25lIHN1YnRyYWN0aW9uLiBPdGhlcndpc2UgcmV0dXJucyB6ZXJvLiAqLworCisvKiBGSVhNRTogUG9zc2libGUgb3B0aW1pemF0aW9uczoKKworICAgVGhlIGRpdjIgZnVuY3Rpb24gc3RhcnRzIHdpdGggY2hlY2tpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mCisgICB0aGUgbnVtZXJhdG9yLiBXZSBjYW4gbWFpbnRhaW5lZCBub3JtYWxpemVkIG9wZXJhbmRzIGhlcmUsIGNhbGwKKyAgIGhnY2Qgd2l0aCBub3JtYWxpemVkIG9wZXJhbmRzIG9ubHksIHdoaWNoIHNob3VsZCBtYWtlIHRoZSBjb2RlCisgICBzaW1wbGVyIGFuZCBwb3NzaWJseSBmYXN0ZXIuCisKKyAgIEV4cGVyaW1lbnQgd2l0aCB0YWJsZSBsb29rdXBzIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhIGNhbmRpZGF0ZSBmb3IgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgorKi8KK2ludAorbXBuX2hnY2QyIChtcF9saW1iX3QgYWgsIG1wX2xpbWJfdCBhbCwgbXBfbGltYl90IGJoLCBtcF9saW1iX3QgYmwsCisJICAgc3RydWN0IGhnY2RfbWF0cml4MSAqTSkKK3sKKyAgbXBfbGltYl90IHUwMCwgdTAxLCB1MTAsIHUxMTsKKworICBpZiAoYWggPCAyIHx8IGJoIDwgMikKKyAgICByZXR1cm4gMDsKKworICBpZiAoYWggPiBiaCB8fCAoYWggPT0gYmggJiYgYWwgPiBibCkpCisgICAgeworICAgICAgc3ViX2RkbW1zcyAoYWgsIGFsLCBhaCwgYWwsIGJoLCBibCk7CisgICAgICBpZiAoYWggPCAyKQorCXJldHVybiAwOworCisgICAgICB1MDAgPSB1MDEgPSB1MTEgPSAxOworICAgICAgdTEwID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdWJfZGRtbXNzIChiaCwgYmwsIGJoLCBibCwgYWgsIGFsKTsKKyAgICAgIGlmIChiaCA8IDIpCisJcmV0dXJuIDA7CisKKyAgICAgIHUwMCA9IHUxMCA9IHUxMSA9IDE7CisgICAgICB1MDEgPSAwOworICAgIH0KKworICBpZiAoYWggPCBiaCkKKyAgICBnb3RvIHN1YnRyYWN0X2E7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBBU1NFUlQgKGFoID49IGJoKTsKKyAgICAgIGlmIChhaCA9PSBiaCkKKwlnb3RvIGRvbmU7CisKKyAgICAgIGlmIChhaCA8IChDTlNUX0xJTUIoMSkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkpCisJeworCSAgYWggPSAoYWggPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSApICsgKGFsID4+IChHTVBfTElNQl9CSVRTIC8gMikpOworCSAgYmggPSAoYmggPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSApICsgKGJsID4+IChHTVBfTElNQl9CSVRTIC8gMikpOworCisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFN1YnRyYWN0IGEgLT0gcSBiLCBhbmQgbXVsdGlwbHkgTSBmcm9tIHRoZSByaWdodCBieSAoMSBxIDsgMAorCSAxKSwgYWZmZWN0aW5nIHRoZSBzZWNvbmQgY29sdW1uIG9mIE0uICovCisgICAgICBBU1NFUlQgKGFoID4gYmgpOworICAgICAgc3ViX2RkbW1zcyAoYWgsIGFsLCBhaCwgYWwsIGJoLCBibCk7CisKKyAgICAgIGlmIChhaCA8IDIpCisJZ290byBkb25lOworCisgICAgICBpZiAoYWggPD0gYmgpCisJeworCSAgLyogVXNlIHEgPSAxICovCisJICB1MDEgKz0gdTAwOworCSAgdTExICs9IHUxMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfbGltYl90IHJbMl07CisJICBtcF9saW1iX3QgcSA9IGRpdjIgKHIsIGFoLCBhbCwgYmgsIGJsKTsKKwkgIGFsID0gclswXTsgYWggPSByWzFdOworCSAgaWYgKGFoIDwgMikKKwkgICAgeworCSAgICAgIC8qIEEgaXMgdG9vIHNtYWxsLCBidXQgcSBpcyBjb3JyZWN0LiAqLworCSAgICAgIHUwMSArPSBxICogdTAwOworCSAgICAgIHUxMSArPSBxICogdTEwOworCSAgICAgIGdvdG8gZG9uZTsKKwkgICAgfQorCSAgcSsrOworCSAgdTAxICs9IHEgKiB1MDA7CisJICB1MTEgKz0gcSAqIHUxMDsKKwl9CisgICAgc3VidHJhY3RfYToKKyAgICAgIEFTU0VSVCAoYmggPj0gYWgpOworICAgICAgaWYgKGFoID09IGJoKQorCWdvdG8gZG9uZTsKKworICAgICAgaWYgKGJoIDwgKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSkKKwl7CisJICBhaCA9IChhaCA8PCAoR01QX0xJTUJfQklUUyAvIDIpICkgKyAoYWwgPj4gKEdNUF9MSU1CX0JJVFMgLyAyKSk7CisJICBiaCA9IChiaCA8PCAoR01QX0xJTUJfQklUUyAvIDIpICkgKyAoYmwgPj4gKEdNUF9MSU1CX0JJVFMgLyAyKSk7CisKKwkgIGdvdG8gc3VidHJhY3RfYTE7CisJfQorCisgICAgICAvKiBTdWJ0cmFjdCBiIC09IHEgYSwgYW5kIG11bHRpcGx5IE0gZnJvbSB0aGUgcmlnaHQgYnkgKDEgMCA7IHEKKwkgMSksIGFmZmVjdGluZyB0aGUgZmlyc3QgY29sdW1uIG9mIE0uICovCisgICAgICBzdWJfZGRtbXNzIChiaCwgYmwsIGJoLCBibCwgYWgsIGFsKTsKKworICAgICAgaWYgKGJoIDwgMikKKwlnb3RvIGRvbmU7CisKKyAgICAgIGlmIChiaCA8PSBhaCkKKwl7CisJICAvKiBVc2UgcSA9IDEgKi8KKwkgIHUwMCArPSB1MDE7CisJICB1MTAgKz0gdTExOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9saW1iX3QgclsyXTsKKwkgIG1wX2xpbWJfdCBxID0gZGl2MiAociwgYmgsIGJsLCBhaCwgYWwpOworCSAgYmwgPSByWzBdOyBiaCA9IHJbMV07CisJICBpZiAoYmggPCAyKQorCSAgICB7CisJICAgICAgLyogQiBpcyB0b28gc21hbGwsIGJ1dCBxIGlzIGNvcnJlY3QuICovCisJICAgICAgdTAwICs9IHEgKiB1MDE7CisJICAgICAgdTEwICs9IHEgKiB1MTE7CisJICAgICAgZ290byBkb25lOworCSAgICB9CisJICBxKys7CisJICB1MDAgKz0gcSAqIHUwMTsKKwkgIHUxMCArPSBxICogdTExOworCX0KKyAgICB9CisKKyAgLyogTk9URTogU2luY2Ugd2UgZGlzY2FyZCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaGFsZiBsaW1iLCB3ZSBkb24ndCBnZXQgYQorICAgICB0cnVseSBtYXhpbWFsIE0gKGNvcnJlc3BvbmRpbmcgdG8gfGEgLSBifCA8IDJee0dNUF9MSU1CX0JJVFMgKzF9KS4gKi8KKyAgLyogU2luZ2xlIHByZWNpc2lvbiBsb29wICovCisgIGZvciAoOzspCisgICAgeworICAgICAgQVNTRVJUIChhaCA+PSBiaCk7CisKKyAgICAgIGFoIC09IGJoOworICAgICAgaWYgKGFoIDwgKENOU1RfTElNQiAoMSkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyICsgMSkpKQorCWJyZWFrOworCisgICAgICBpZiAoYWggPD0gYmgpCisJeworCSAgLyogVXNlIHEgPSAxICovCisJICB1MDEgKz0gdTAwOworCSAgdTExICs9IHUxMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfZG91YmxlX2xpbWJfdCBycSA9IGRpdjEgKGFoLCBiaCk7CisJICBtcF9saW1iX3QgcSA9IHJxLmQxOworCSAgYWggPSBycS5kMDsKKworCSAgaWYgKGFoIDwgKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIgKyAxKSkpCisJICAgIHsKKwkgICAgICAvKiBBIGlzIHRvbyBzbWFsbCwgYnV0IHEgaXMgY29ycmVjdC4gKi8KKwkgICAgICB1MDEgKz0gcSAqIHUwMDsKKwkgICAgICB1MTEgKz0gcSAqIHUxMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcSsrOworCSAgdTAxICs9IHEgKiB1MDA7CisJICB1MTEgKz0gcSAqIHUxMDsKKwl9CisgICAgc3VidHJhY3RfYTE6CisgICAgICBBU1NFUlQgKGJoID49IGFoKTsKKworICAgICAgYmggLT0gYWg7CisgICAgICBpZiAoYmggPCAoQ05TVF9MSU1CICgxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIgKyAxKSkpCisJYnJlYWs7CisKKyAgICAgIGlmIChiaCA8PSBhaCkKKwl7CisJICAvKiBVc2UgcSA9IDEgKi8KKwkgIHUwMCArPSB1MDE7CisJICB1MTAgKz0gdTExOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9kb3VibGVfbGltYl90IHJxID0gZGl2MSAoYmgsIGFoKTsKKwkgIG1wX2xpbWJfdCBxID0gcnEuZDE7CisJICBiaCA9IHJxLmQwOworCisJICBpZiAoYmggPCAoQ05TVF9MSU1CKDEpIDw8IChHTVBfTElNQl9CSVRTIC8gMiArIDEpKSkKKwkgICAgeworCSAgICAgIC8qIEIgaXMgdG9vIHNtYWxsLCBidXQgcSBpcyBjb3JyZWN0LiAqLworCSAgICAgIHUwMCArPSBxICogdTAxOworCSAgICAgIHUxMCArPSBxICogdTExOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBxKys7CisJICB1MDAgKz0gcSAqIHUwMTsKKwkgIHUxMCArPSBxICogdTExOworCX0KKyAgICB9CisKKyBkb25lOgorICBNLT51WzBdWzBdID0gdTAwOyBNLT51WzBdWzFdID0gdTAxOworICBNLT51WzFdWzBdID0gdTEwOyBNLT51WzFdWzFdID0gdTExOworCisgIHJldHVybiAxOworfQorCisvKiBTZXRzIChyO2IpID0gKGE7YikgTSwgd2l0aCBNID0gKHUwMCwgdTAxOyB1MTAsIHUxMSkuIFZlY3RvciBtdXN0CisgKiBoYXZlIHNwYWNlIGZvciBuICsgMSBsaW1icy4gVXNlcyB0aHJlZSBidWZmZXJzIHRvIGF2b2lkIGEgY29weSovCittcF9zaXplX3QKK21wbl9oZ2NkX211bF9tYXRyaXgxX3ZlY3RvciAoY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4MSAqTSwKKwkJCSAgICAgbXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3B0ciBicCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCBhaCwgYmg7CisKKyAgLyogQ29tcHV0ZSAocixiKSA8LS0gKHUwMCBhICsgdTEwIGIsIHUwMSBhICsgdTExIGIpIGFzCisKKyAgICAgciAgPSB1MDAgKiBhCisgICAgIHIgKz0gdTEwICogYgorICAgICBiICo9IHUxMQorICAgICBiICs9IHUwMSAqIGEKKyAgKi8KKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRhZGRtdWxfMW1zYjAKKyAgYWggPSBtcG5fYWRkYWRkbXVsXzFtc2IwIChycCwgYXAsIGJwLCBuLCBNLT51WzBdWzBdLCBNLT51WzFdWzBdKTsKKyAgYmggPSBtcG5fYWRkYWRkbXVsXzFtc2IwIChicCwgYnAsIGFwLCBuLCBNLT51WzFdWzFdLCBNLT51WzBdWzFdKTsKKyNlbHNlCisgIGFoID0gICAgIG1wbl9tdWxfMSAocnAsIGFwLCBuLCBNLT51WzBdWzBdKTsKKyAgYWggKz0gbXBuX2FkZG11bF8xIChycCwgYnAsIG4sIE0tPnVbMV1bMF0pOworCisgIGJoID0gICAgIG1wbl9tdWxfMSAoYnAsIGJwLCBuLCBNLT51WzFdWzFdKTsKKyAgYmggKz0gbXBuX2FkZG11bF8xIChicCwgYXAsIG4sIE0tPnVbMF1bMV0pOworI2VuZGlmCisgIHJwW25dID0gYWg7CisgIGJwW25dID0gYmg7CisKKyAgbiArPSAoYWggfCBiaCkgPiAwOworICByZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2hnY2QyX2phY29iaS5jIGIvbXBuL2dlbmVyaWMvaGdjZDJfamFjb2JpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkNGFmMQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2hnY2QyX2phY29iaS5jCkBAIC0wLDAgKzEsMjUxIEBACisvKiBoZ2NkMl9qYWNvYmkuYworCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAxOTk2LCAxOTk4LCAyMDAwLTIwMDQsIDIwMDgsIDIwMTEsIDIwMjAgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaW5jbHVkZSAibXBuL2dlbmVyaWMvaGdjZDItZGl2LmgiCisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyNlcnJvciBOYWlscyBub3QgaW1wbGVtZW50ZWQKKyNlbmRpZgorCitpbnQKK21wbl9oZ2NkMl9qYWNvYmkgKG1wX2xpbWJfdCBhaCwgbXBfbGltYl90IGFsLCBtcF9saW1iX3QgYmgsIG1wX2xpbWJfdCBibCwKKwkJICBzdHJ1Y3QgaGdjZF9tYXRyaXgxICpNLCB1bnNpZ25lZCAqYml0c3ApCit7CisgIG1wX2xpbWJfdCB1MDAsIHUwMSwgdTEwLCB1MTE7CisgIHVuc2lnbmVkIGJpdHMgPSAqYml0c3A7CisKKyAgaWYgKGFoIDwgMiB8fCBiaCA8IDIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGFoID4gYmggfHwgKGFoID09IGJoICYmIGFsID4gYmwpKQorICAgIHsKKyAgICAgIHN1Yl9kZG1tc3MgKGFoLCBhbCwgYWgsIGFsLCBiaCwgYmwpOworICAgICAgaWYgKGFoIDwgMikKKwlyZXR1cm4gMDsKKworICAgICAgdTAwID0gdTAxID0gdTExID0gMTsKKyAgICAgIHUxMCA9IDA7CisgICAgICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDEsIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN1Yl9kZG1tc3MgKGJoLCBibCwgYmgsIGJsLCBhaCwgYWwpOworICAgICAgaWYgKGJoIDwgMikKKwlyZXR1cm4gMDsKKworICAgICAgdTAwID0gdTEwID0gdTExID0gMTsKKyAgICAgIHUwMSA9IDA7CisgICAgICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDAsIDEpOworICAgIH0KKworICBpZiAoYWggPCBiaCkKKyAgICBnb3RvIHN1YnRyYWN0X2E7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBBU1NFUlQgKGFoID49IGJoKTsKKyAgICAgIGlmIChhaCA9PSBiaCkKKwlnb3RvIGRvbmU7CisKKyAgICAgIGlmIChhaCA8IChDTlNUX0xJTUIoMSkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkpCisJeworCSAgYWggPSAoYWggPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSApICsgKGFsID4+IChHTVBfTElNQl9CSVRTIC8gMikpOworCSAgYmggPSAoYmggPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSApICsgKGJsID4+IChHTVBfTElNQl9CSVRTIC8gMikpOworCisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFN1YnRyYWN0IGEgLT0gcSBiLCBhbmQgbXVsdGlwbHkgTSBmcm9tIHRoZSByaWdodCBieSAoMSBxIDsgMAorCSAxKSwgYWZmZWN0aW5nIHRoZSBzZWNvbmQgY29sdW1uIG9mIE0uICovCisgICAgICBBU1NFUlQgKGFoID4gYmgpOworICAgICAgc3ViX2RkbW1zcyAoYWgsIGFsLCBhaCwgYWwsIGJoLCBibCk7CisKKyAgICAgIGlmIChhaCA8IDIpCisJZ290byBkb25lOworCisgICAgICBpZiAoYWggPD0gYmgpCisJeworCSAgLyogVXNlIHEgPSAxICovCisJICB1MDEgKz0gdTAwOworCSAgdTExICs9IHUxMDsKKwkgIGJpdHMgPSBtcG5famFjb2JpX3VwZGF0ZSAoYml0cywgMSwgMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wX2xpbWJfdCByWzJdOworCSAgbXBfbGltYl90IHEgPSBkaXYyIChyLCBhaCwgYWwsIGJoLCBibCk7CisJICBhbCA9IHJbMF07IGFoID0gclsxXTsKKwkgIGlmIChhaCA8IDIpCisJICAgIHsKKwkgICAgICAvKiBBIGlzIHRvbyBzbWFsbCwgYnV0IHEgaXMgY29ycmVjdC4gKi8KKwkgICAgICB1MDEgKz0gcSAqIHUwMDsKKwkgICAgICB1MTEgKz0gcSAqIHUxMDsKKwkgICAgICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDEsIHEgJiAzKTsKKwkgICAgICBnb3RvIGRvbmU7CisJICAgIH0KKwkgIHErKzsKKwkgIHUwMSArPSBxICogdTAwOworCSAgdTExICs9IHEgKiB1MTA7CisJICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDEsIHEgJiAzKTsKKwl9CisgICAgc3VidHJhY3RfYToKKyAgICAgIEFTU0VSVCAoYmggPj0gYWgpOworICAgICAgaWYgKGFoID09IGJoKQorCWdvdG8gZG9uZTsKKworICAgICAgaWYgKGJoIDwgKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSkKKwl7CisJICBhaCA9IChhaCA8PCAoR01QX0xJTUJfQklUUyAvIDIpICkgKyAoYWwgPj4gKEdNUF9MSU1CX0JJVFMgLyAyKSk7CisJICBiaCA9IChiaCA8PCAoR01QX0xJTUJfQklUUyAvIDIpICkgKyAoYmwgPj4gKEdNUF9MSU1CX0JJVFMgLyAyKSk7CisKKwkgIGdvdG8gc3VidHJhY3RfYTE7CisJfQorCisgICAgICAvKiBTdWJ0cmFjdCBiIC09IHEgYSwgYW5kIG11bHRpcGx5IE0gZnJvbSB0aGUgcmlnaHQgYnkgKDEgMCA7IHEKKwkgMSksIGFmZmVjdGluZyB0aGUgZmlyc3QgY29sdW1uIG9mIE0uICovCisgICAgICBzdWJfZGRtbXNzIChiaCwgYmwsIGJoLCBibCwgYWgsIGFsKTsKKworICAgICAgaWYgKGJoIDwgMikKKwlnb3RvIGRvbmU7CisKKyAgICAgIGlmIChiaCA8PSBhaCkKKwl7CisJICAvKiBVc2UgcSA9IDEgKi8KKwkgIHUwMCArPSB1MDE7CisJICB1MTAgKz0gdTExOworCSAgYml0cyA9IG1wbl9qYWNvYmlfdXBkYXRlIChiaXRzLCAwLCAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfbGltYl90IHJbMl07CisJICBtcF9saW1iX3QgcSA9IGRpdjIgKHIsIGJoLCBibCwgYWgsIGFsKTsKKwkgIGJsID0gclswXTsgYmggPSByWzFdOworCSAgaWYgKGJoIDwgMikKKwkgICAgeworCSAgICAgIC8qIEIgaXMgdG9vIHNtYWxsLCBidXQgcSBpcyBjb3JyZWN0LiAqLworCSAgICAgIHUwMCArPSBxICogdTAxOworCSAgICAgIHUxMCArPSBxICogdTExOworCSAgICAgIGJpdHMgPSBtcG5famFjb2JpX3VwZGF0ZSAoYml0cywgMCwgcSAmIDMpOworCSAgICAgIGdvdG8gZG9uZTsKKwkgICAgfQorCSAgcSsrOworCSAgdTAwICs9IHEgKiB1MDE7CisJICB1MTAgKz0gcSAqIHUxMTsKKwkgIGJpdHMgPSBtcG5famFjb2JpX3VwZGF0ZSAoYml0cywgMCwgcSAmIDMpOworCX0KKyAgICB9CisKKyAgLyogTk9URTogU2luY2Ugd2UgZGlzY2FyZCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaGFsZiBsaW1iLCB3ZSBkb24ndCBnZXQgYQorICAgICB0cnVseSBtYXhpbWFsIE0gKGNvcnJlc3BvbmRpbmcgdG8gfGEgLSBifCA8IDJee0dNUF9MSU1CX0JJVFMgKzF9KS4gKi8KKyAgLyogU2luZ2xlIHByZWNpc2lvbiBsb29wICovCisgIGZvciAoOzspCisgICAgeworICAgICAgQVNTRVJUIChhaCA+PSBiaCk7CisKKyAgICAgIGFoIC09IGJoOworICAgICAgaWYgKGFoIDwgKENOU1RfTElNQiAoMSkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyICsgMSkpKQorCWJyZWFrOworCisgICAgICBpZiAoYWggPD0gYmgpCisJeworCSAgLyogVXNlIHEgPSAxICovCisJICB1MDEgKz0gdTAwOworCSAgdTExICs9IHUxMDsKKwkgIGJpdHMgPSBtcG5famFjb2JpX3VwZGF0ZSAoYml0cywgMSwgMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wX2RvdWJsZV9saW1iX3QgcnEgPSBkaXYxIChhaCwgYmgpOworCSAgbXBfbGltYl90IHEgPSBycS5kMTsKKwkgIGFoID0gcnEuZDA7CisKKwkgIGlmIChhaCA8IChDTlNUX0xJTUIoMSkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyICsgMSkpKQorCSAgICB7CisJICAgICAgLyogQSBpcyB0b28gc21hbGwsIGJ1dCBxIGlzIGNvcnJlY3QuICovCisJICAgICAgdTAxICs9IHEgKiB1MDA7CisJICAgICAgdTExICs9IHEgKiB1MTA7CisJICAgICAgYml0cyA9IG1wbl9qYWNvYmlfdXBkYXRlIChiaXRzLCAxLCBxICYgMyk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHErKzsKKwkgIHUwMSArPSBxICogdTAwOworCSAgdTExICs9IHEgKiB1MTA7CisJICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDEsIHEgJiAzKTsKKwl9CisgICAgc3VidHJhY3RfYTE6CisgICAgICBBU1NFUlQgKGJoID49IGFoKTsKKworICAgICAgYmggLT0gYWg7CisgICAgICBpZiAoYmggPCAoQ05TVF9MSU1CICgxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIgKyAxKSkpCisJYnJlYWs7CisKKyAgICAgIGlmIChiaCA8PSBhaCkKKwl7CisJICAvKiBVc2UgcSA9IDEgKi8KKwkgIHUwMCArPSB1MDE7CisJICB1MTAgKz0gdTExOworCSAgYml0cyA9IG1wbl9qYWNvYmlfdXBkYXRlIChiaXRzLCAwLCAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBfZG91YmxlX2xpbWJfdCBycSA9IGRpdjEgKGJoLCBhaCk7CisJICBtcF9saW1iX3QgcSA9IHJxLmQxOworCSAgYmggPSBycS5kMDsKKworCSAgaWYgKGJoIDwgKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUyAvIDIgKyAxKSkpCisJICAgIHsKKwkgICAgICAvKiBCIGlzIHRvbyBzbWFsbCwgYnV0IHEgaXMgY29ycmVjdC4gKi8KKwkgICAgICB1MDAgKz0gcSAqIHUwMTsKKwkgICAgICB1MTAgKz0gcSAqIHUxMTsKKwkgICAgICBiaXRzID0gbXBuX2phY29iaV91cGRhdGUgKGJpdHMsIDAsIHEgJiAzKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcSsrOworCSAgdTAwICs9IHEgKiB1MDE7CisJICB1MTAgKz0gcSAqIHUxMTsKKwkgIGJpdHMgPSBtcG5famFjb2JpX3VwZGF0ZSAoYml0cywgMCwgcSAmIDMpOworCX0KKyAgICB9CisKKyBkb25lOgorICBNLT51WzBdWzBdID0gdTAwOyBNLT51WzBdWzFdID0gdTAxOworICBNLT51WzFdWzBdID0gdTEwOyBNLT51WzFdWzFdID0gdTExOworICAqYml0c3AgPSBiaXRzOworCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvaGdjZF9hcHByLmMgYi9tcG4vZ2VuZXJpYy9oZ2NkX2FwcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjAxNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvaGdjZF9hcHByLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qIGhnY2RfYXBwci5jLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBJZGVudGljYWwgdG8gbXBuX2hnY2RfaXRjaC4gRklYTUU6IERvIHdlIHJlYWxseSBuZWVkIHRvIGFkZAorICAgSEdDRF9USFJFU0hPTEQgYXQgdGhlIGVuZD8gKi8KK21wX3NpemVfdAorbXBuX2hnY2RfYXBwcl9pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgSEdDRF9BUFBSX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG47CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBrOworICAgICAgaW50IGNvdW50OworICAgICAgbXBfc2l6ZV90IG5zY2FsZWQ7CisKKyAgICAgIC8qIEdldCB0aGUgcmVjdXJzaW9uIGRlcHRoLiAqLworICAgICAgbnNjYWxlZCA9IChuIC0gMSkgLyAoSEdDRF9BUFBSX1RIUkVTSE9MRCAtIDEpOworICAgICAgY291bnRfbGVhZGluZ196ZXJvcyAoY291bnQsIG5zY2FsZWQpOworICAgICAgayA9IEdNUF9MSU1CX0JJVFMgLSBjb3VudDsKKworICAgICAgcmV0dXJuIDIwICogKChuKzMpIC8gNCkgKyAyMiAqIGsgKyBIR0NEX1RIUkVTSE9MRDsKKyAgICB9Cit9CisKKy8qIERlc3Ryb3lzIGlucHV0cy4gKi8KK2ludAorbXBuX2hnY2RfYXBwciAobXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLAorCSAgICAgICBzdHJ1Y3QgaGdjZF9tYXRyaXggKk0sIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IHM7CisgIGludCBzdWNjZXNzID0gMDsKKworICBBU1NFUlQgKG4gPiAwKTsKKworICBBU1NFUlQgKChhcFtuLTFdIHwgYnBbbi0xXSkgIT0gMCk7CisKKyAgaWYgKG4gPD0gMikKKyAgICAvKiBJbXBsaWVzIHMgPSBuLiBBIGZhaXJseSB1bmludGVyZXN0aW5nIGNhc2UgYnV0IGV4ZXJjaXNlZCBieSB0aGUKKyAgICAgICByYW5kb20gaW5wdXRzIG9mIHRoZSB0ZXN0c3VpdGUuICovCisgICAgcmV0dXJuIDA7CisKKyAgQVNTRVJUICgobisxKS8yIC0gMSA8IE0tPmFsbG9jKTsKKworICAvKiBXZSBhaW0gZm9yIHJlZHVjdGlvbiBvZiB0byBHTVBfTlVNQl9CSVRTICogcyBiaXRzLiBCdXQgZWFjaCB0aW1lCisgICAgIHdlIGRpc2NhcmQgc29tZSBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMsIHdlIG11c3Qga2VlcCBvbmUKKyAgICAgYWRkaXRpb25hbCBiaXQgdG8gYWNjb3VudCBmb3IgdGhlIHRydW5jYXRpb24gZXJyb3IuIFdlIG1haW50YWluCisgICAgIHRoZSBHTVBfTlVNQl9CSVRTICogcyAtIGV4dHJhX2JpdHMgYXMgdGhlIGN1cnJlbnQgdGFyZ2V0IHNpemUuICovCisKKyAgcyA9IG4vMiArIDE7CisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIEhHQ0RfQVBQUl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGV4dHJhX2JpdHMgPSAwOworCisgICAgICB3aGlsZSAobiA+IDIpCisJeworCSAgbXBfc2l6ZV90IG5uOworCisJICBBU1NFUlQgKG4gPiBzKTsKKwkgIEFTU0VSVCAobiA8PSAyKnMpOworCisJICBubiA9IG1wbl9oZ2NkX3N0ZXAgKG4sIGFwLCBicCwgcywgTSwgdHApOworCSAgaWYgKCFubikKKwkgICAgYnJlYWs7CisKKwkgIG4gPSBubjsKKwkgIHN1Y2Nlc3MgPSAxOworCisJICAvKiBXZSBjYW4gdHJ1bmNhdGUgYW5kIGRpc2NhcmQgdGhlIGxvd2VyIHAgYml0cyB3aGVuZXZlciBuYml0cyA8PQorCSAgICAgMipzYml0cyAtIHAuIFRvIGFjY291bnQgZm9yIHRoZSB0cnVuY2F0aW9uIGVycm9yLCB3ZSBtdXN0CisJICAgICBhZGp1c3QKKworCSAgICAgc2JpdHMgPC0tIHNiaXRzICsgMSAtIHAsCisKKwkgICAgIHJhdGhlciB0aGFuIGp1c3Qgc2JpdHMgPC0tIHNiaXRzIC0gcC4gVGhpcyBhZGp1c3RtZW50IG1ha2VzCisJICAgICB0aGUgcHJvZHVjZWQgbWF0cml4IHNsaWdodGx5IHNtYWxsZXIgdGhhbiBpdCBjb3VsZCBiZS4gKi8KKworCSAgaWYgKEdNUF9OVU1CX0JJVFMgKiAobiArIDEpICsgMiAqIGV4dHJhX2JpdHMgPD0gMipHTVBfTlVNQl9CSVRTICogcykKKwkgICAgeworCSAgICAgIG1wX3NpemVfdCBwID0gKEdNUF9OVU1CX0JJVFMgKiAoMipzIC0gbikgLSAyKmV4dHJhX2JpdHMpIC8gR01QX05VTUJfQklUUzsKKworCSAgICAgIGlmIChleHRyYV9iaXRzID09IDApCisJCXsKKwkJICAvKiBXZSBjcm9zcyBhIGxpbWIgYm91bmRhcnkgYW5kIGJ1bXAgcy4gV2UgY2FuJ3QgZG8gdGhhdAorCQkgICAgIGlmIHRoZSByZXN1bHQgaXMgdGhhdCBpdCBtYWtlcyBtYWtlcyBtaW4oVSwgVikKKwkJICAgICBzbWFsbGVyIHRoYW4gMl57R01QX05VTUJfQklUU30gcy4gKi8KKwkJICBpZiAocyArIDEgPT0gbgorCQkgICAgICB8fCBtcG5femVyb19wIChhcCArIHMgKyAxLCBuIC0gcyAtIDEpCisJCSAgICAgIHx8IG1wbl96ZXJvX3AgKGJwICsgcyArIDEsIG4gLSBzIC0gMSkpCisJCSAgICBjb250aW51ZTsKKworCQkgIGV4dHJhX2JpdHMgPSBHTVBfTlVNQl9CSVRTIC0gMTsKKwkJICBzKys7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBleHRyYV9iaXRzLS07CisJCX0KKworCSAgICAgIC8qIERyb3AgdGhlIHAgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgKi8KKwkgICAgICBhcCArPSBwOyBicCArPSBwOyBuIC09IHA7IHMgLT0gcDsKKwkgICAgfQorCX0KKworICAgICAgQVNTRVJUIChzID4gMCk7CisKKyAgICAgIGlmIChleHRyYV9iaXRzID4gMCkKKwl7CisJICAvKiBXZSBjYW4gZ2V0IGhlcmUgb25seSBvZiB3ZSBoYXZlIGRyb3BwZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBsZWFzdAorCSAgICAgc2lnbmlmaWNhbnQgYml0cywgc28gd2UgY2FuIGRlY3JlbWVudCBhcCBhbmQgYnAuIFdlIGNhbiB0aGVuIHNoaWZ0CisJICAgICBsZWZ0IGV4dHJhIGJpdHMgdXNpbmcgbXBuX3JzaGlmdC4gKi8KKwkgIC8qIE5PVEU6IEluIHRoZSB1bmxpa2VseSBjYXNlIHRoYXQgbiBpcyBsYXJnZSwgaXQgd291bGQgYmUgcHJlZmVyYWJsZQorCSAgICAgdG8gZG8gYW4gaW5pdGlhbCBzdWJkaXYgc3RlcCB0byByZWR1Y2UgdGhlIHNpemUgYmVmb3JlIHNoaWZ0aW5nLAorCSAgICAgYnV0IHRoYXQgd291bGQgbWVhbiBkdXBsaWNhdGluZyBtcG5fZ2NkX3N1YmRpdl9zdGVwIHdpdGggYSBiaXQKKwkgICAgIGNvdW50IHJhdGhlciB0aGFuIGEgbGltYiBjb3VudC4gKi8KKwkgIGFwLS07IGJwLS07CisJICBhcFswXSA9IG1wbl9yc2hpZnQgKGFwKzEsIGFwKzEsIG4sIEdNUF9OVU1CX0JJVFMgLSBleHRyYV9iaXRzKTsKKwkgIGJwWzBdID0gbXBuX3JzaGlmdCAoYnArMSwgYnArMSwgbiwgR01QX05VTUJfQklUUyAtIGV4dHJhX2JpdHMpOworCSAgbiArPSAoYXBbbl0gfCBicFtuXSkgPiAwOworCisJICBBU1NFUlQgKHN1Y2Nlc3MpOworCisJICB3aGlsZSAobiA+IDIpCisJICAgIHsKKwkgICAgICBtcF9zaXplX3Qgbm47CisKKwkgICAgICBBU1NFUlQgKG4gPiBzKTsKKwkgICAgICBBU1NFUlQgKG4gPD0gMipzKTsKKworCSAgICAgIG5uID0gbXBuX2hnY2Rfc3RlcCAobiwgYXAsIGJwLCBzLCBNLCB0cCk7CisKKwkgICAgICBpZiAoIW5uKQorCQlyZXR1cm4gMTsKKworCSAgICAgIG4gPSBubjsKKwkgICAgfQorCX0KKworICAgICAgaWYgKG4gPT0gMikKKwl7CisJICBzdHJ1Y3QgaGdjZF9tYXRyaXgxIE0xOworCSAgQVNTRVJUIChzID09IDEpOworCisJICBpZiAobXBuX2hnY2QyIChhcFsxXSwgYXBbMF0sIGJwWzFdLCBicFswXSwgJk0xKSkKKwkgICAgeworCSAgICAgIC8qIE11bHRpcGx5IE0gPC0gTSAqIE0xICovCisJICAgICAgbXBuX2hnY2RfbWF0cml4X211bF8xIChNLCAmTTEsIHRwKTsKKwkgICAgICBzdWNjZXNzID0gMTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBuMiA9ICgzKm4pLzQgKyAxOworICAgICAgbXBfc2l6ZV90IHAgPSBuLzI7CisgICAgICBtcF9zaXplX3Qgbm47CisKKyAgICAgIG5uID0gbXBuX2hnY2RfcmVkdWNlIChNLCBhcCwgYnAsIG4sIHAsIHRwKTsKKyAgICAgIGlmIChubikKKwl7CisJICBuID0gbm47CisJICAvKiBGSVhNRTogRGlzY2FyZCBzb21lIG9mIHRoZSBsb3cgbGltYnMgaW1tZWRpYXRlbHk/ICovCisJICBzdWNjZXNzID0gMTsKKwl9CisKKyAgICAgIHdoaWxlIChuID4gbjIpCisJeworCSAgbXBfc2l6ZV90IG5uOworCisJICAvKiBOZWVkcyBuICsgMSBzdG9yYWdlICovCisJICBubiA9IG1wbl9oZ2NkX3N0ZXAgKG4sIGFwLCBicCwgcywgTSwgdHApOworCSAgaWYgKCFubikKKwkgICAgcmV0dXJuIHN1Y2Nlc3M7CisKKwkgIG4gPSBubjsKKwkgIHN1Y2Nlc3MgPSAxOworCX0KKyAgICAgIGlmIChuID4gcyArIDIpCisJeworCSAgc3RydWN0IGhnY2RfbWF0cml4IE0xOworCSAgbXBfc2l6ZV90IHNjcmF0Y2g7CisKKwkgIHAgPSAyKnMgLSBuICsgMTsKKwkgIHNjcmF0Y2ggPSBNUE5fSEdDRF9NQVRSSVhfSU5JVF9JVENIIChuLXApOworCisJICBtcG5faGdjZF9tYXRyaXhfaW5pdCgmTTEsIG4gLSBwLCB0cCk7CisJICBpZiAobXBuX2hnY2RfYXBwciAoYXAgKyBwLCBicCArIHAsIG4gLSBwLCAmTTEsIHRwICsgc2NyYXRjaCkpCisJICAgIHsKKwkgICAgICAvKiBXZSBhbHdheXMgaGF2ZSBtYXgoTSkgPiAyXnstKEdNUF9OVU1CX0JJVFMgKyAxKX0gbWF4KE0xKSAqLworCSAgICAgIEFTU0VSVCAoTS0+biArIDIgPj0gTTEubik7CisKKwkgICAgICAvKiBGdXJ0aGVybW9yZSwgYXNzdW1lIE0gZW5kcyB3aXRoIGEgcXVvdGllbnQgKDEsIHE7IDAsIDEpLAorCQkgdGhlbiBlaXRoZXIgcSBvciBxICsgMSBpcyBhIGNvcnJlY3QgcXVvdGllbnQsIGFuZCBNMSB3aWxsCisJCSBzdGFydCB3aXRoIGVpdGhlciAoMSwgMDsgMSwgMSkgb3IgKDIsIDE7IDEsIDEpLiBUaGlzCisJCSBydWxlcyBvdXQgdGhlIGNhc2UgdGhhdCB0aGUgc2l6ZSBvZiBNICogTTEgaXMgbXVjaAorCQkgc21hbGxlciB0aGFuIHRoZSBleHBlY3RlZCBNLT5uICsgTTEtPm4uICovCisKKwkgICAgICBBU1NFUlQgKE0tPm4gKyBNMS5uIDwgTS0+YWxsb2MpOworCisJICAgICAgLyogV2UgbmVlZCBhIGJvdW5kIGZvciBvZiBNLT5uICsgTTEubi4gTGV0IG4gYmUgdGhlIG9yaWdpbmFsCisJCSBpbnB1dCBzaXplLiBUaGVuCisKKwkJIGNlaWwobi8yKSAtIDEgPj0gc2l6ZSBvZiBwcm9kdWN0ID49IE0ubiArIE0xLm4gLSAyCisKKwkJIGFuZCBpdCBmb2xsb3dzIHRoYXQKKworCQkgTS5uICsgTTEubiA8PSBjZWlsKG4vMikgKyAxCisKKwkJIFRoZW4gMyooTS5uICsgTTEubikgKyA1IDw9IDMgKiBjZWlsKG4vMikgKyA4IGlzIHRoZQorCQkgYW1vdW50IG9mIG5lZWRlZCBzY3JhdGNoIHNwYWNlLiAqLworCSAgICAgIG1wbl9oZ2NkX21hdHJpeF9tdWwgKE0sICZNMSwgdHAgKyBzY3JhdGNoKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKworICAgICAgZm9yKDs7KQorCXsKKwkgIG1wX3NpemVfdCBubjsKKworCSAgQVNTRVJUIChuID4gcyk7CisJICBBU1NFUlQgKG4gPD0gMipzKTsKKworCSAgbm4gPSBtcG5faGdjZF9zdGVwIChuLCBhcCwgYnAsIHMsIE0sIHRwKTsKKworCSAgaWYgKCFubikKKwkgICAgcmV0dXJuIHN1Y2Nlc3M7CisKKwkgIG4gPSBubjsKKwkgIHN1Y2Nlc3MgPSAxOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9oZ2NkX2phY29iaS5jIGIvbXBuL2dlbmVyaWMvaGdjZF9qYWNvYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAxNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvaGdjZF9qYWNvYmkuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogaGdjZF9qYWNvYmkuYy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA4LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBUaGlzIGZpbGUgaXMgYWxtb3N0IGEgY29weSBvZiBoZ2NkLmMsIHdpdGggc29tZSBhZGRlZCBjYWxscyB0bworICAgbXBuX2phY29iaV91cGRhdGUgKi8KKworc3RydWN0IGhnY2RfamFjb2JpX2N0eAoreworICBzdHJ1Y3QgaGdjZF9tYXRyaXggKk07CisgIHVuc2lnbmVkICpiaXRzcDsKK307CisKK3N0YXRpYyB2b2lkCitoZ2NkX2phY29iaV9ob29rICh2b2lkICpwLCBtcF9zcmNwdHIgZ3AsIG1wX3NpemVfdCBnbiwKKwkJICBtcF9zcmNwdHIgcXAsIG1wX3NpemVfdCBxbiwgaW50IGQpCit7CisgIEFTU0VSVCAoIWdwKTsKKyAgQVNTRVJUIChkID49IDApOworCisgIE1QTl9OT1JNQUxJWkUgKHFwLCBxbik7CisgIGlmIChxbiA+IDApCisgICAgeworICAgICAgc3RydWN0IGhnY2RfamFjb2JpX2N0eCAqY3R4ID0gKHN0cnVjdCBoZ2NkX2phY29iaV9jdHggKikgcDsKKyAgICAgIC8qIE5PVEVTOiBUaGlzIGlzIGEgYml0IHVnbHkuIEEgdHAgYXJlYSBpcyBwYXNzZWQgdG8KKwkgZ2NkX3N1YmRpdl9zdGVwLCB3aGljaCBzdG9yZXMgcSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBhcmVhLiBXZQorCSBub3cgdXNlIHRoZSByZXN0LiAqLworICAgICAgbXBfcHRyIHRwID0gKG1wX3B0cikgcXAgKyBxbjsKKworICAgICAgbXBuX2hnY2RfbWF0cml4X3VwZGF0ZV9xIChjdHgtPk0sIHFwLCBxbiwgZCwgdHApOworICAgICAgKmN0eC0+Yml0c3AgPSBtcG5famFjb2JpX3VwZGF0ZSAoKmN0eC0+Yml0c3AsIGQsIHFwWzBdICYgMyk7CisgICAgfQorfQorCisvKiBQZXJmb3JtIGEgZmV3IHN0ZXBzLCB1c2luZyBzb21lIG9mIG1wbl9oZ2NkMiwgc3VidHJhY3Rpb24gYW5kCisgICBkaXZpc2lvbi4gUmVkdWNlcyB0aGUgc2l6ZSBieSBhbG1vc3Qgb25lIGxpbWIgb3IgbW9yZSwgYnV0IG5ldmVyCisgICBiZWxvdyB0aGUgZ2l2ZW4gc2l6ZSBzLiBSZXR1cm4gbmV3IHNpemUgZm9yIGEgYW5kIGIsIG9yIDAgaWYgbm8KKyAgIG1vcmUgc3RlcHMgYXJlIHBvc3NpYmxlLgorCisgICBJZiBoZ2NkMiBzdWNjZWVkcywgbmVlZHMgdGVtcG9yYXJ5IHNwYWNlIGZvciBoZ2NkX21hdHJpeF9tdWxfMSwgTS0+bgorICAgbGltYnMsIGFuZCBoZ2NkX211bF9tYXRyaXgxX2ludmVyc2VfdmVjdG9yLCBuIGxpbWJzLiBJZiBoZ2NkMgorICAgZmFpbHMsIG5lZWRzIHNwYWNlIGZvciB0aGUgcXVvdGllbnQsIHFuIDw9IG4gLSBzICsgMSBsaW1icywgZm9yIGFuZAorICAgaGdjZF9tYXRyaXhfdXBkYXRlX3EsIHFuICsgKHNpemUgb2YgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBvZiBNKSA8PQorICAgcmVzdWx0aW5nIHNpemUgb2YgTS4KKworICAgSWYgTiBpcyB0aGUgaW5wdXQgc2l6ZSB0byB0aGUgY2FsbGluZyBoZ2NkLCB0aGVuIHMgPSBmbG9vcihOLzIpICsKKyAgIDEsIE0tPm4gPCBOLCBxbiArIG1hdHJpeCBzaXplIDw9IG4gLSBzICsgMSArIG4gLSBzID0gMiAobiAtIHMpICsgMQorICAgPCBOLCBzbyBOIGlzIHN1ZmZpY2llbnQuCisqLworCitzdGF0aWMgbXBfc2l6ZV90CitoZ2NkX2phY29iaV9zdGVwIChtcF9zaXplX3QgbiwgbXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBzLAorCQkgIHN0cnVjdCBoZ2NkX21hdHJpeCAqTSwgdW5zaWduZWQgKmJpdHNwLCBtcF9wdHIgdHApCit7CisgIHN0cnVjdCBoZ2NkX21hdHJpeDEgTTE7CisgIG1wX2xpbWJfdCBtYXNrOworICBtcF9saW1iX3QgYWgsIGFsLCBiaCwgYmw7CisKKyAgQVNTRVJUIChuID4gcyk7CisKKyAgbWFzayA9IGFwW24tMV0gfCBicFtuLTFdOworICBBU1NFUlQgKG1hc2sgPiAwKTsKKworICBpZiAobiA9PSBzICsgMSkKKyAgICB7CisgICAgICBpZiAobWFzayA8IDQpCisJZ290byBzdWJ0cmFjdDsKKworICAgICAgYWggPSBhcFtuLTFdOyBhbCA9IGFwW24tMl07CisgICAgICBiaCA9IGJwW24tMV07IGJsID0gYnBbbi0yXTsKKyAgICB9CisgIGVsc2UgaWYgKG1hc2sgJiBHTVBfTlVNQl9ISUdIQklUKQorICAgIHsKKyAgICAgIGFoID0gYXBbbi0xXTsgYWwgPSBhcFtuLTJdOworICAgICAgYmggPSBicFtuLTFdOyBibCA9IGJwW24tMl07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IHNoaWZ0OworCisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChzaGlmdCwgbWFzayk7CisgICAgICBhaCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBhcFtuLTFdLCBhcFtuLTJdKTsKKyAgICAgIGFsID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGFwW24tMl0sIGFwW24tM10pOworICAgICAgYmggPSBNUE5fRVhUUkFDVF9OVU1CIChzaGlmdCwgYnBbbi0xXSwgYnBbbi0yXSk7CisgICAgICBibCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBicFtuLTJdLCBicFtuLTNdKTsKKyAgICB9CisKKyAgLyogVHJ5IGFuIG1wbl9oZ2NkMiBzdGVwICovCisgIGlmIChtcG5faGdjZDJfamFjb2JpIChhaCwgYWwsIGJoLCBibCwgJk0xLCBiaXRzcCkpCisgICAgeworICAgICAgLyogTXVsdGlwbHkgTSA8LSBNICogTTEgKi8KKyAgICAgIG1wbl9oZ2NkX21hdHJpeF9tdWxfMSAoTSwgJk0xLCB0cCk7CisKKyAgICAgIC8qIENhbid0IHN3YXAgaW5wdXRzLCBzbyB3ZSBuZWVkIHRvIGNvcHkuICovCisgICAgICBNUE5fQ09QWSAodHAsIGFwLCBuKTsKKyAgICAgIC8qIE11bHRpcGx5IE0xXnstMX0gKGE7YikgKi8KKyAgICAgIHJldHVybiBtcG5fbWF0cml4MjJfbXVsMV9pbnZlcnNlX3ZlY3RvciAoJk0xLCBhcCwgdHAsIGJwLCBuKTsKKyAgICB9CisKKyBzdWJ0cmFjdDoKKyAgeworICAgIHN0cnVjdCBoZ2NkX2phY29iaV9jdHggY3R4OworICAgIGN0eC5NID0gTTsKKyAgICBjdHguYml0c3AgPSBiaXRzcDsKKworICAgIHJldHVybiBtcG5fZ2NkX3N1YmRpdl9zdGVwIChhcCwgYnAsIG4sIHMsIGhnY2RfamFjb2JpX2hvb2ssICZjdHgsIHRwKTsKKyAgfQorfQorCisvKiBSZWR1Y2VzIGEsYiB1bnRpbCB8YS1ifCBmaXRzIGluIG4vMiArIDEgbGltYnMuIENvbnN0cnVjdHMgbWF0cml4IE0KKyAgIHdpdGggZWxlbWVudHMgb2Ygc2l6ZSBhdCBtb3N0IChuKzEpLzIgLSAxLiBSZXR1cm5zIG5ldyBzaXplIG9mIGEsCisgICBiLCBvciB6ZXJvIGlmIG5vIHJlZHVjdGlvbiBpcyBwb3NzaWJsZS4gKi8KKworLyogU2FtZSBzY3JhdGNoIHJlcXVpcmVtZW50cyBhcyBmb3IgbXBuX2hnY2QuICovCittcF9zaXplX3QKK21wbl9oZ2NkX2phY29iaSAobXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLAorCQkgc3RydWN0IGhnY2RfbWF0cml4ICpNLCB1bnNpZ25lZCAqYml0c3AsIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IHMgPSBuLzIgKyAxOworCisgIG1wX3NpemVfdCBubjsKKyAgaW50IHN1Y2Nlc3MgPSAwOworCisgIGlmIChuIDw9IHMpCisgICAgLyogSGFwcGVucyB3aGVuIG4gPD0gMiwgYSBmYWlybHkgdW5pbnRlcmVzdGluZyBjYXNlIGJ1dCBleGVyY2lzZWQKKyAgICAgICBieSB0aGUgcmFuZG9tIGlucHV0cyBvZiB0aGUgdGVzdHN1aXRlLiAqLworICAgIHJldHVybiAwOworCisgIEFTU0VSVCAoKGFwW24tMV0gfCBicFtuLTFdKSA+IDApOworCisgIEFTU0VSVCAoKG4rMSkvMiAtIDEgPCBNLT5hbGxvYyk7CisKKyAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAobiwgSEdDRF9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBuMiA9ICgzKm4pLzQgKyAxOworICAgICAgbXBfc2l6ZV90IHAgPSBuLzI7CisKKyAgICAgIG5uID0gbXBuX2hnY2RfamFjb2JpIChhcCArIHAsIGJwICsgcCwgbiAtIHAsIE0sIGJpdHNwLCB0cCk7CisgICAgICBpZiAobm4gPiAwKQorCXsKKwkgIC8qIE5lZWRzIDIqKHAgKyBNLT5uKSA8PSAyKihmbG9vcihuLzIpICsgY2VpbChuLzIpIC0gMSkKKwkgICAgID0gMiAobiAtIDEpICovCisJICBuID0gbXBuX2hnY2RfbWF0cml4X2FkanVzdCAoTSwgcCArIG5uLCBhcCwgYnAsIHAsIHRwKTsKKwkgIHN1Y2Nlc3MgPSAxOworCX0KKyAgICAgIHdoaWxlIChuID4gbjIpCisJeworCSAgLyogTmVlZHMgbiArIDEgc3RvcmFnZSAqLworCSAgbm4gPSBoZ2NkX2phY29iaV9zdGVwIChuLCBhcCwgYnAsIHMsIE0sIGJpdHNwLCB0cCk7CisJICBpZiAoIW5uKQorCSAgICByZXR1cm4gc3VjY2VzcyA/IG4gOiAwOworCSAgbiA9IG5uOworCSAgc3VjY2VzcyA9IDE7CisJfQorCisgICAgICBpZiAobiA+IHMgKyAyKQorCXsKKwkgIHN0cnVjdCBoZ2NkX21hdHJpeCBNMTsKKwkgIG1wX3NpemVfdCBzY3JhdGNoOworCisJICBwID0gMipzIC0gbiArIDE7CisJICBzY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobi1wKTsKKworCSAgbXBuX2hnY2RfbWF0cml4X2luaXQoJk0xLCBuIC0gcCwgdHApOworCSAgbm4gPSBtcG5faGdjZF9qYWNvYmkgKGFwICsgcCwgYnAgKyBwLCBuIC0gcCwgJk0xLCBiaXRzcCwgdHAgKyBzY3JhdGNoKTsKKwkgIGlmIChubiA+IDApCisJICAgIHsKKwkgICAgICAvKiBXZSBhbHdheXMgaGF2ZSBtYXgoTSkgPiAyXnstKEdNUF9OVU1CX0JJVFMgKyAxKX0gbWF4KE0xKSAqLworCSAgICAgIEFTU0VSVCAoTS0+biArIDIgPj0gTTEubik7CisKKwkgICAgICAvKiBGdXJ0aGVybW9yZSwgYXNzdW1lIE0gZW5kcyB3aXRoIGEgcXVvdGllbnQgKDEsIHE7IDAsIDEpLAorCQkgdGhlbiBlaXRoZXIgcSBvciBxICsgMSBpcyBhIGNvcnJlY3QgcXVvdGllbnQsIGFuZCBNMSB3aWxsCisJCSBzdGFydCB3aXRoIGVpdGhlciAoMSwgMDsgMSwgMSkgb3IgKDIsIDE7IDEsIDEpLiBUaGlzCisJCSBydWxlcyBvdXQgdGhlIGNhc2UgdGhhdCB0aGUgc2l6ZSBvZiBNICogTTEgaXMgbXVjaAorCQkgc21hbGxlciB0aGFuIHRoZSBleHBlY3RlZCBNLT5uICsgTTEtPm4uICovCisKKwkgICAgICBBU1NFUlQgKE0tPm4gKyBNMS5uIDwgTS0+YWxsb2MpOworCisJICAgICAgLyogTmVlZHMgMiAocCArIE0tPm4pIDw9IDIgKDIqcyAtIG4yICsgMSArIG4yIC0gcyAtIDEpCisJCSA9IDIqcyA8PSAyKihmbG9vcihuLzIpICsgMSkgPD0gbiArIDIuICovCisJICAgICAgbiA9IG1wbl9oZ2NkX21hdHJpeF9hZGp1c3QgKCZNMSwgcCArIG5uLCBhcCwgYnAsIHAsIHRwICsgc2NyYXRjaCk7CisKKwkgICAgICAvKiBXZSBuZWVkIGEgYm91bmQgZm9yIG9mIE0tPm4gKyBNMS5uLiBMZXQgbiBiZSB0aGUgb3JpZ2luYWwKKwkJIGlucHV0IHNpemUuIFRoZW4KKworCQkgY2VpbChuLzIpIC0gMSA+PSBzaXplIG9mIHByb2R1Y3QgPj0gTS5uICsgTTEubiAtIDIKKworCQkgYW5kIGl0IGZvbGxvd3MgdGhhdAorCisJCSBNLm4gKyBNMS5uIDw9IGNlaWwobi8yKSArIDEKKworCQkgVGhlbiAzKihNLm4gKyBNMS5uKSArIDUgPD0gMyAqIGNlaWwobi8yKSArIDggaXMgdGhlCisJCSBhbW91bnQgb2YgbmVlZGVkIHNjcmF0Y2ggc3BhY2UuICovCisJICAgICAgbXBuX2hnY2RfbWF0cml4X211bCAoTSwgJk0xLCB0cCArIHNjcmF0Y2gpOworCSAgICAgIHN1Y2Nlc3MgPSAxOworCSAgICB9CisJfQorICAgIH0KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIC8qIE5lZWRzIHMrMyA8IG4gKi8KKyAgICAgIG5uID0gaGdjZF9qYWNvYmlfc3RlcCAobiwgYXAsIGJwLCBzLCBNLCBiaXRzcCwgdHApOworICAgICAgaWYgKCFubikKKwlyZXR1cm4gc3VjY2VzcyA/IG4gOiAwOworCisgICAgICBuID0gbm47CisgICAgICBzdWNjZXNzID0gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9oZ2NkX21hdHJpeC5jIGIvbXBuL2dlbmVyaWMvaGdjZF9tYXRyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGM3OTVkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvaGdjZF9tYXRyaXguYwpAQCAtMCwwICsxLDI2NSBAQAorLyogaGdjZF9tYXRyaXguYy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA4LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBGb3IgaW5wdXQgb2Ygc2l6ZSBuLCBtYXRyaXggZWxlbWVudHMgYXJlIG9mIHNpemUgYXQgbW9zdCBjZWlsKG4vMikKKyAgIC0gMSwgYnV0IHdlIG5lZWQgdHdvIGxpbWJzIGV4dHJhLiAqLwordm9pZAorbXBuX2hnY2RfbWF0cml4X2luaXQgKHN0cnVjdCBoZ2NkX21hdHJpeCAqTSwgbXBfc2l6ZV90IG4sIG1wX3B0ciBwKQoreworICBtcF9zaXplX3QgcyA9IChuKzEpLzIgKyAxOworICBNLT5hbGxvYyA9IHM7CisgIE0tPm4gPSAxOworICBNUE5fWkVSTyAocCwgNCAqIHMpOworICBNLT5wWzBdWzBdID0gcDsKKyAgTS0+cFswXVsxXSA9IHAgKyBzOworICBNLT5wWzFdWzBdID0gcCArIDIgKiBzOworICBNLT5wWzFdWzFdID0gcCArIDMgKiBzOworCisgIE0tPnBbMF1bMF1bMF0gPSBNLT5wWzFdWzFdWzBdID0gMTsKK30KKworLyogVXBkYXRlIGNvbHVtbiBDT0wsIGFkZGluZyBpbiBRICogY29sdW1uICgxLUNPTCkuIFRlbXBvcmFyeSBzdG9yYWdlOgorICogcW4gKyBuIDw9IE0tPmFsbG9jLCB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4KKyAqIGNvbHVtbiAxIC0gQ09MLiAqLwordm9pZAorbXBuX2hnY2RfbWF0cml4X3VwZGF0ZV9xIChzdHJ1Y3QgaGdjZF9tYXRyaXggKk0sIG1wX3NyY3B0ciBxcCwgbXBfc2l6ZV90IHFuLAorCQkJICB1bnNpZ25lZCBjb2wsIG1wX3B0ciB0cCkKK3sKKyAgQVNTRVJUIChjb2wgPCAyKTsKKworICBpZiAocW4gPT0gMSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgcSA9IHFwWzBdOworICAgICAgbXBfbGltYl90IGMwLCBjMTsKKworICAgICAgYzAgPSBtcG5fYWRkbXVsXzEgKE0tPnBbMF1bY29sXSwgTS0+cFswXVsxLWNvbF0sIE0tPm4sIHEpOworICAgICAgYzEgPSBtcG5fYWRkbXVsXzEgKE0tPnBbMV1bY29sXSwgTS0+cFsxXVsxLWNvbF0sIE0tPm4sIHEpOworCisgICAgICBNLT5wWzBdW2NvbF1bTS0+bl0gPSBjMDsKKyAgICAgIE0tPnBbMV1bY29sXVtNLT5uXSA9IGMxOworCisgICAgICBNLT5uICs9IChjMCB8IGMxKSAhPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHJvdzsKKworICAgICAgLyogQ2FycmllcyBmb3IgdGhlIHVubGlrZWx5IGNhc2UgdGhhdCB3ZSBnZXQgYm90aCBoaWdoIHdvcmRzCisJIGZyb20gdGhlIG11bHRpcGxpY2F0aW9uIGFuZCBjYXJyaWVzIGZyb20gdGhlIGFkZGl0aW9uLiAqLworICAgICAgbXBfbGltYl90IGNbMl07CisgICAgICBtcF9zaXplX3QgbjsKKworICAgICAgLyogVGhlIG1hdHJpeCB3aWxsIG5vdCBuZWNlc3NhcmlseSBncm93IGluIHNpemUgYnkgcW4sIHNvIHdlCisJIG5lZWQgbm9ybWFsaXphdGlvbiBpbiBvcmRlciBub3QgdG8gb3ZlcmZsb3cgTS4gKi8KKworICAgICAgZm9yIChuID0gTS0+bjsgbiArIHFuID4gTS0+bjsgbi0tKQorCXsKKwkgIEFTU0VSVCAobiA+IDApOworCSAgaWYgKE0tPnBbMF1bMS1jb2xdW24tMV0gPiAwIHx8IE0tPnBbMV1bMS1jb2xdW24tMV0gPiAwKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIEFTU0VSVCAocW4gKyBuIDw9IE0tPmFsbG9jKTsKKworICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCAyOyByb3crKykKKwl7CisJICBpZiAocW4gPD0gbikKKwkgICAgbXBuX211bCAodHAsIE0tPnBbcm93XVsxLWNvbF0sIG4sIHFwLCBxbik7CisJICBlbHNlCisJICAgIG1wbl9tdWwgKHRwLCBxcCwgcW4sIE0tPnBbcm93XVsxLWNvbF0sIG4pOworCisJICBBU1NFUlQgKG4gKyBxbiA+PSBNLT5uKTsKKwkgIGNbcm93XSA9IG1wbl9hZGQgKE0tPnBbcm93XVtjb2xdLCB0cCwgbiArIHFuLCBNLT5wW3Jvd11bY29sXSwgTS0+bik7CisJfQorCisgICAgICBuICs9IHFuOworCisgICAgICBpZiAoY1swXSB8IGNbMV0pCisJeworCSAgTS0+cFswXVtjb2xdW25dID0gY1swXTsKKwkgIE0tPnBbMV1bY29sXVtuXSA9IGNbMV07CisJICBuKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG4gLT0gKE0tPnBbMF1bY29sXVtuLTFdIHwgTS0+cFsxXVtjb2xdW24tMV0pID09IDA7CisJICBBU1NFUlQgKG4gPj0gTS0+bik7CisJfQorICAgICAgTS0+biA9IG47CisgICAgfQorCisgIEFTU0VSVCAoTS0+biA8IE0tPmFsbG9jKTsKK30KKworLyogTXVsdGlwbHkgTSBieSBNMSBmcm9tIHRoZSByaWdodC4gU2luY2UgdGhlIE0xIGVsZW1lbnRzIGZpdCBpbgorICAgR01QX05VTUJfQklUUyAtIDEgYml0cywgTSBncm93cyBieSBhdCBtb3N0IG9uZSBsaW1iLiBOZWVkcworICAgdGVtcG9yYXJ5IHNwYWNlIE0tPm4gKi8KK3ZvaWQKK21wbl9oZ2NkX21hdHJpeF9tdWxfMSAoc3RydWN0IGhnY2RfbWF0cml4ICpNLCBjb25zdCBzdHJ1Y3QgaGdjZF9tYXRyaXgxICpNMSwKKwkJICAgICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IG4wLCBuMTsKKworICAvKiBDb3VsZCBhdm9pZCBjb3B5IGJ5IHNvbWUgc3dhcHBpbmcgb2YgcG9pbnRlcnMuICovCisgIE1QTl9DT1BZICh0cCwgTS0+cFswXVswXSwgTS0+bik7CisgIG4wID0gbXBuX2hnY2RfbXVsX21hdHJpeDFfdmVjdG9yIChNMSwgTS0+cFswXVswXSwgdHAsIE0tPnBbMF1bMV0sIE0tPm4pOworICBNUE5fQ09QWSAodHAsIE0tPnBbMV1bMF0sIE0tPm4pOworICBuMSA9IG1wbl9oZ2NkX211bF9tYXRyaXgxX3ZlY3RvciAoTTEsIE0tPnBbMV1bMF0sIHRwLCBNLT5wWzFdWzFdLCBNLT5uKTsKKworICAvKiBEZXBlbmRzIG9uIHplcm8gaW5pdGlhbGl6YXRpb24gKi8KKyAgTS0+biA9IE1BWChuMCwgbjEpOworICBBU1NFUlQgKE0tPm4gPCBNLT5hbGxvYyk7Cit9CisKKy8qIE11bHRpcGx5IE0gYnkgTTEgZnJvbSB0aGUgcmlnaHQuIE5lZWRzIDMqKE0tPm4gKyBNMS0+bikgKyA1IGxpbWJzCisgICBvZiB0ZW1wb3Jhcnkgc3RvcmFnZSAoc2VlIG1wbl9tYXRyaXgyMl9tdWxfaXRjaCkuICovCit2b2lkCittcG5faGdjZF9tYXRyaXhfbXVsIChzdHJ1Y3QgaGdjZF9tYXRyaXggKk0sIGNvbnN0IHN0cnVjdCBoZ2NkX21hdHJpeCAqTTEsCisJCSAgICAgbXBfcHRyIHRwKQoreworICBtcF9zaXplX3QgbjsKKworICAvKiBBYm91dCB0aGUgbmV3IHNpemUgb2YgTTpzIGVsZW1lbnRzLiBTaW5jZSBNMSdzIGRpYWdvbmFsIGVsZW1lbnRzCisgICAgIGFyZSA+IDAsIG5vIGVsZW1lbnQgY2FuIGRlY3JlYXNlLiBUaGUgbmV3IGVsZW1lbnRzIGFyZSBvZiBzaXplCisgICAgIE0tPm4gKyBNMS0+biwgb25lIGxpbWIgbW9yZSBvciBsZXNzLiBUaGUgY29tcHV0YXRpb24gb2YgdGhlCisgICAgIG1hdHJpeCBwcm9kdWN0IHByb2R1Y2VzIGVsZW1lbnRzIG9mIHNpemUgTS0+biArIE0xLT5uICsgMS4gQnV0CisgICAgIHRoZSB0cnVlIHNpemUsIGFmdGVyIG5vcm1hbGl6YXRpb24sIG1heSBiZSB0aHJlZSBsaW1icyBzbWFsbGVyLgorCisgICAgIFRoZSByZWFzb24gdGhhdCB0aGUgcHJvZHVjdCBoYXMgbm9ybWFsaXplZCBzaXplID49IE0tPm4gKyBNMS0+biAtCisgICAgIDIgaXMgc3VidGxlLiBJdCBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgTSBhbmQgTTEgY2FuIGJlIGZhY3RvcmVkCisgICAgIGFzIHByb2R1Y3RzIG9mICgxLDE7IDAsMSkgYW5kICgxLDA7IDEsMSksIGFuZCB0aGF0IHdlIGNhbid0IGhhdmUKKyAgICAgTSBlbmRpbmcgd2l0aCBhIGxhcmdlIHBvd2VyIGFuZCBNMSBzdGFydGluZyB3aXRoIGEgbGFyZ2UgcG93ZXIgb2YKKyAgICAgdGhlIHNhbWUgbWF0cml4LiAqLworCisgIC8qIEZJWE1FOiBTdHJhc3NlbiBtdWx0aXBsaWNhdGlvbiBnaXZlcyBvbmx5IGEgc21hbGwgc3BlZWR1cC4gSW4gRkZUCisgICAgIG11bHRpcGxpY2F0aW9uIHJhbmdlLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHNwZWQgdXAgcXVpdGUgYSBsb3QKKyAgICAgdXNpbmcgaW52YXJpYW5jZS4gKi8KKyAgQVNTRVJUIChNLT5uICsgTTEtPm4gPCBNLT5hbGxvYyk7CisKKyAgQVNTRVJUICgoTS0+cFswXVswXVtNLT5uLTFdIHwgTS0+cFswXVsxXVtNLT5uLTFdCisJICAgfCBNLT5wWzFdWzBdW00tPm4tMV0gfCBNLT5wWzFdWzFdW00tPm4tMV0pID4gMCk7CisKKyAgQVNTRVJUICgoTTEtPnBbMF1bMF1bTTEtPm4tMV0gfCBNMS0+cFswXVsxXVtNMS0+bi0xXQorCSAgIHwgTTEtPnBbMV1bMF1bTTEtPm4tMV0gfCBNMS0+cFsxXVsxXVtNMS0+bi0xXSkgPiAwKTsKKworICBtcG5fbWF0cml4MjJfbXVsIChNLT5wWzBdWzBdLCBNLT5wWzBdWzFdLAorCQkgICAgTS0+cFsxXVswXSwgTS0+cFsxXVsxXSwgTS0+biwKKwkJICAgIE0xLT5wWzBdWzBdLCBNMS0+cFswXVsxXSwKKwkJICAgIE0xLT5wWzFdWzBdLCBNMS0+cFsxXVsxXSwgTTEtPm4sIHRwKTsKKworICAvKiBJbmRleCBvZiBsYXN0IHBvdGVudGlhbGx5IG5vbi16ZXJvIGxpbWIsIHNpemUgaXMgb25lIGdyZWF0ZXIuICovCisgIG4gPSBNLT5uICsgTTEtPm47CisKKyAgbiAtPSAoKE0tPnBbMF1bMF1bbl0gfCBNLT5wWzBdWzFdW25dIHwgTS0+cFsxXVswXVtuXSB8IE0tPnBbMV1bMV1bbl0pID09IDApOworICBuIC09ICgoTS0+cFswXVswXVtuXSB8IE0tPnBbMF1bMV1bbl0gfCBNLT5wWzFdWzBdW25dIHwgTS0+cFsxXVsxXVtuXSkgPT0gMCk7CisgIG4gLT0gKChNLT5wWzBdWzBdW25dIHwgTS0+cFswXVsxXVtuXSB8IE0tPnBbMV1bMF1bbl0gfCBNLT5wWzFdWzFdW25dKSA9PSAwKTsKKworICBBU1NFUlQgKChNLT5wWzBdWzBdW25dIHwgTS0+cFswXVsxXVtuXSB8IE0tPnBbMV1bMF1bbl0gfCBNLT5wWzFdWzFdW25dKSA+IDApOworCisgIE0tPm4gPSBuICsgMTsKK30KKworLyogTXVsdGlwbGllcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcCBsaW1icyBvZiAoYTtiKSBieSBNXi0xLgorICAgVGVtcG9yYXJ5IHNwYWNlIG5lZWRlZDogMiAqIChwICsgTS0+bikqLworbXBfc2l6ZV90CittcG5faGdjZF9tYXRyaXhfYWRqdXN0IChjb25zdCBzdHJ1Y3QgaGdjZF9tYXRyaXggKk0sCisJCQltcF9zaXplX3QgbiwgbXBfcHRyIGFwLCBtcF9wdHIgYnAsCisJCQltcF9zaXplX3QgcCwgbXBfcHRyIHRwKQoreworICAvKiBNXi0xIChhO2IpID0gKHIxMSwgLXIwMTsgLXIxMCwgcjAwKSAoYSA7IGIpCisgICAgID0gKHIxMSBhIC0gcjAxIGI7IC0gcjEwIGEgKyByMDAgYiAqLworCisgIG1wX3B0ciB0MCA9IHRwOworICBtcF9wdHIgdDEgPSB0cCArIHAgKyBNLT5uOworICBtcF9saW1iX3QgYWgsIGJoOworICBtcF9saW1iX3QgY3k7CisKKyAgQVNTRVJUIChwICsgTS0+biAgPCBuKTsKKworICAvKiBGaXJzdCBjb21wdXRlIHRoZSB0d28gdmFsdWVzIGRlcGVuZGluZyBvbiBhLCBiZWZvcmUgb3ZlcndyaXRpbmcgYSAqLworCisgIGlmIChNLT5uID49IHApCisgICAgeworICAgICAgbXBuX211bCAodDAsIE0tPnBbMV1bMV0sIE0tPm4sIGFwLCBwKTsKKyAgICAgIG1wbl9tdWwgKHQxLCBNLT5wWzFdWzBdLCBNLT5uLCBhcCwgcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX211bCAodDAsIGFwLCBwLCBNLT5wWzFdWzFdLCBNLT5uKTsKKyAgICAgIG1wbl9tdWwgKHQxLCBhcCwgcCwgTS0+cFsxXVswXSwgTS0+bik7CisgICAgfQorCisgIC8qIFVwZGF0ZSBhICovCisgIE1QTl9DT1BZIChhcCwgdDAsIHApOworICBhaCA9IG1wbl9hZGQgKGFwICsgcCwgYXAgKyBwLCBuIC0gcCwgdDAgKyBwLCBNLT5uKTsKKworICBpZiAoTS0+biA+PSBwKQorICAgIG1wbl9tdWwgKHQwLCBNLT5wWzBdWzFdLCBNLT5uLCBicCwgcCk7CisgIGVsc2UKKyAgICBtcG5fbXVsICh0MCwgYnAsIHAsIE0tPnBbMF1bMV0sIE0tPm4pOworCisgIGN5ID0gbXBuX3N1YiAoYXAsIGFwLCBuLCB0MCwgcCArIE0tPm4pOworICBBU1NFUlQgKGN5IDw9IGFoKTsKKyAgYWggLT0gY3k7CisKKyAgLyogVXBkYXRlIGIgKi8KKyAgaWYgKE0tPm4gPj0gcCkKKyAgICBtcG5fbXVsICh0MCwgTS0+cFswXVswXSwgTS0+biwgYnAsIHApOworICBlbHNlCisgICAgbXBuX211bCAodDAsIGJwLCBwLCBNLT5wWzBdWzBdLCBNLT5uKTsKKworICBNUE5fQ09QWSAoYnAsIHQwLCBwKTsKKyAgYmggPSBtcG5fYWRkIChicCArIHAsIGJwICsgcCwgbiAtIHAsIHQwICsgcCwgTS0+bik7CisgIGN5ID0gbXBuX3N1YiAoYnAsIGJwLCBuLCB0MSwgcCArIE0tPm4pOworICBBU1NFUlQgKGN5IDw9IGJoKTsKKyAgYmggLT0gY3k7CisKKyAgaWYgKGFoID4gMCB8fCBiaCA+IDApCisgICAgeworICAgICAgYXBbbl0gPSBhaDsKKyAgICAgIGJwW25dID0gYmg7CisgICAgICBuKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIHN1YnRyYWN0aW9uIGNhbiByZWR1Y2UgdGhlIHNpemUgYnkgYXQgbW9zdCBvbmUgbGltYi4gKi8KKyAgICAgIGlmIChhcFtuLTFdID09IDAgJiYgYnBbbi0xXSA9PSAwKQorCW4tLTsKKyAgICB9CisgIEFTU0VSVCAoYXBbbi0xXSA+IDAgfHwgYnBbbi0xXSA+IDApOworICByZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2hnY2RfcmVkdWNlLmMgYi9tcG4vZ2VuZXJpYy9oZ2NkX3JlZHVjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZWU3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9oZ2NkX3JlZHVjZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBoZ2NkX3JlZHVjZS5jLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBDb21wdXRlcyBSIC09IEEgKiBCLiBSZXN1bHQgbXVzdCBiZSBub24tbmVnYXRpdmUuIE5vcm1hbGl6ZWQgZG93bgorICAgdG8gc2l6ZSBhbiwgYW5kIHJlc3VsdGluZyBzaXplIGlzIHJldHVybmVkLiAqLworc3RhdGljIG1wX3NpemVfdAorc3VibXVsIChtcF9wdHIgcnAsIG1wX3NpemVfdCBybiwKKwltcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX3B0ciB0cDsKKyAgVE1QX0RFQ0w7CisKKyAgQVNTRVJUIChibiA+IDApOworICBBU1NFUlQgKGFuID49IGJuKTsKKyAgQVNTRVJUIChybiA+PSBhbik7CisgIEFTU0VSVCAoYW4gKyBibiA8PSBybiArIDEpOworCisgIFRNUF9NQVJLOworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoYW4gKyBibik7CisKKyAgbXBuX211bCAodHAsIGFwLCBhbiwgYnAsIGJuKTsKKyAgQVNTRVJUICgoYW4gKyBibiA8PSBybikgfHwgKHRwW3JuXSA9PSAwKSk7CisgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViIChycCwgcnAsIHJuLCB0cCwgYW4gKyBibiAtIChhbiArIGJuID4gcm4pKSk7CisgIFRNUF9GUkVFOworCisgIHdoaWxlIChybiA+IGFuICYmIChycFtybi0xXSA9PSAwKSkKKyAgICBybi0tOworCisgIHJldHVybiBybjsKK30KKworLyogQ29tcHV0ZXMgKGEsIGIpICA8LS0gIE1eey0xfSAoYTsgYikgKi8KKy8qIEZJWE1FOgorICAgIHggVGFrZSBzY3JhdGNoIHBhcmFtZXRlciwgYW5kIGZpZ3VyZSBvdXQgc2NyYXRjaCBuZWVkLgorCisgICAgeCBVc2Ugc29tZSBmYWxsYmFjayBmb3Igc21hbGwgTS0+bj8KKyovCitzdGF0aWMgbXBfc2l6ZV90CitoZ2NkX21hdHJpeF9hcHBseSAoY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4ICpNLAorCQkgICBtcF9wdHIgYXAsIG1wX3B0ciBicCwKKwkJICAgbXBfc2l6ZV90IG4pCit7CisgIG1wX3NpemVfdCBhbiwgYm4sIHVuLCB2biwgbm47CisgIG1wX3NpemVfdCBtblsyXVsyXTsKKyAgbXBfc2l6ZV90IG1vZG47CisgIG1wX3B0ciB0cCwgc3AsIHNjcmF0Y2g7CisgIG1wX2xpbWJfdCBjeTsKKyAgdW5zaWduZWQgaSwgajsKKworICBUTVBfREVDTDsKKworICBBU1NFUlQgKCAoYXBbbi0xXSB8IGJwW24tMV0pID4gMCk7CisKKyAgYW4gPSBuOworICBNUE5fTk9STUFMSVpFIChhcCwgYW4pOworICBibiA9IG47CisgIE1QTl9OT1JNQUxJWkUgKGJwLCBibik7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgeworCW1wX3NpemVfdCBrOworCWsgPSBNLT5uOworCU1QTl9OT1JNQUxJWkUgKE0tPnBbaV1bal0sIGspOworCW1uW2ldW2pdID0gazsKKyAgICAgIH0KKworICBBU1NFUlQgKG1uWzBdWzBdID4gMCk7CisgIEFTU0VSVCAobW5bMV1bMV0gPiAwKTsKKyAgQVNTRVJUICggKG1uWzBdWzFdIHwgbW5bMV1bMF0pID4gMCk7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKG1uWzBdWzFdID09IDApCisgICAgeworICAgICAgLyogQSB1bmNoYW5nZWQsIE0gPSAoMSwgMDsgcSwgMSkgKi8KKyAgICAgIEFTU0VSVCAobW5bMF1bMF0gPT0gMSk7CisgICAgICBBU1NFUlQgKE0tPnBbMF1bMF1bMF0gPT0gMSk7CisgICAgICBBU1NFUlQgKG1uWzFdWzFdID09IDEpOworICAgICAgQVNTRVJUIChNLT5wWzFdWzFdWzBdID09IDEpOworCisgICAgICAvKiBQdXQgQiA8LS0gQiAtIHEgQSAqLworICAgICAgbm4gPSBzdWJtdWwgKGJwLCBibiwgYXAsIGFuLCBNLT5wWzFdWzBdLCBtblsxXVswXSk7CisgICAgfQorICBlbHNlIGlmIChtblsxXVswXSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEIgdW5jaGFuZ2VkLCBNID0gKDEsIHE7IDAsIDEpICovCisgICAgICBBU1NFUlQgKG1uWzBdWzBdID09IDEpOworICAgICAgQVNTRVJUIChNLT5wWzBdWzBdWzBdID09IDEpOworICAgICAgQVNTRVJUIChtblsxXVsxXSA9PSAxKTsKKyAgICAgIEFTU0VSVCAoTS0+cFsxXVsxXVswXSA9PSAxKTsKKworICAgICAgLyogUHV0IEEgIDwtLSBBIC0gcSAqIEIgKi8KKyAgICAgIG5uID0gc3VibXVsIChhcCwgYW4sIGJwLCBibiwgTS0+cFswXVsxXSwgbW5bMF1bMV0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEEgPSBtMDAgYSArIG0wMSBiICA9PT4gYSA8PSBBIC8gbTAwLCBiIDw9IEEgLyBtMDEuCisJIEIgPSBtMTAgYSArIG0xMSBiICA9PT4gYSA8PSBCIC8gbTEwLCBiIDw9IEIgLyBtMTEuICovCisgICAgICB1biA9IE1JTiAoYW4gLSBtblswXVswXSwgYm4gLSBtblsxXVswXSkgKyAxOworICAgICAgdm4gPSBNSU4gKGFuIC0gbW5bMF1bMV0sIGJuIC0gbW5bMV1bMV0pICsgMTsKKworICAgICAgbm4gPSBNQVggKHVuLCB2bik7CisgICAgICAvKiBJbiB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QsIG11bG1vZF9ibm0xIHNob3VsZCBhbHdheXMgYmVhdCBtdWxsby4gKi8KKyAgICAgIG1vZG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChubiArIDEpOworCisgICAgICBUTVBfQUxMT0NfTElNQlNfMyAodHAsIG1vZG4sCisJCQkgc3AsIG1vZG4sCisJCQkgc2NyYXRjaCwgbXBuX211bG1vZF9ibm0xX2l0Y2ggKG1vZG4sIG1vZG4sIE0tPm4pKTsKKworICAgICAgQVNTRVJUIChuIDw9IDIqbW9kbik7CisKKyAgICAgIGlmIChuID4gbW9kbikKKwl7CisJICBjeSA9IG1wbl9hZGQgKGFwLCBhcCwgbW9kbiwgYXAgKyBtb2RuLCBuIC0gbW9kbik7CisJICBNUE5fSU5DUl9VIChhcCwgbW9kbiwgY3kpOworCisJICBjeSA9IG1wbl9hZGQgKGJwLCBicCwgbW9kbiwgYnAgKyBtb2RuLCBuIC0gbW9kbik7CisJICBNUE5fSU5DUl9VIChicCwgbW9kbiwgY3kpOworCisJICBuID0gbW9kbjsKKwl9CisKKyAgICAgIG1wbl9tdWxtb2RfYm5tMSAodHAsIG1vZG4sIGFwLCBuLCBNLT5wWzFdWzFdLCBtblsxXVsxXSwgc2NyYXRjaCk7CisgICAgICBtcG5fbXVsbW9kX2JubTEgKHNwLCBtb2RuLCBicCwgbiwgTS0+cFswXVsxXSwgbW5bMF1bMV0sIHNjcmF0Y2gpOworCisgICAgICAvKiBGSVhNRTogSGFuZGxlIHRoZSBzbWFsbCBuIGNhc2UgaW4gc29tZSBiZXR0ZXIgd2F5LiAqLworICAgICAgaWYgKG4gKyBtblsxXVsxXSA8IG1vZG4pCisJTVBOX1pFUk8gKHRwICsgbiArIG1uWzFdWzFdLCBtb2RuIC0gbiAtIG1uWzFdWzFdKTsKKyAgICAgIGlmIChuICsgbW5bMF1bMV0gPCBtb2RuKQorCU1QTl9aRVJPIChzcCArIG4gKyBtblswXVsxXSwgbW9kbiAtIG4gLSBtblswXVsxXSk7CisKKyAgICAgIGN5ID0gbXBuX3N1Yl9uICh0cCwgdHAsIHNwLCBtb2RuKTsKKyAgICAgIE1QTl9ERUNSX1UgKHRwLCBtb2RuLCBjeSk7CisKKyAgICAgIEFTU0VSVCAobXBuX3plcm9fcCAodHAgKyBubiwgbW9kbiAtIG5uKSk7CisKKyAgICAgIG1wbl9tdWxtb2RfYm5tMSAoc3AsIG1vZG4sIGFwLCBuLCBNLT5wWzFdWzBdLCBtblsxXVswXSwgc2NyYXRjaCk7CisgICAgICBNUE5fQ09QWSAoYXAsIHRwLCBubik7CisgICAgICBtcG5fbXVsbW9kX2JubTEgKHRwLCBtb2RuLCBicCwgbiwgTS0+cFswXVswXSwgbW5bMF1bMF0sIHNjcmF0Y2gpOworCisgICAgICBpZiAobiArIG1uWzFdWzBdIDwgbW9kbikKKwlNUE5fWkVSTyAoc3AgKyBuICsgbW5bMV1bMF0sIG1vZG4gLSBuIC0gbW5bMV1bMF0pOworICAgICAgaWYgKG4gKyBtblswXVswXSA8IG1vZG4pCisJTVBOX1pFUk8gKHRwICsgbiArIG1uWzBdWzBdLCBtb2RuIC0gbiAtIG1uWzBdWzBdKTsKKworICAgICAgY3kgPSBtcG5fc3ViX24gKHRwLCB0cCwgc3AsIG1vZG4pOworICAgICAgTVBOX0RFQ1JfVSAodHAsIG1vZG4sIGN5KTsKKworICAgICAgQVNTRVJUIChtcG5femVyb19wICh0cCArIG5uLCBtb2RuIC0gbm4pKTsKKyAgICAgIE1QTl9DT1BZIChicCwgdHAsIG5uKTsKKworICAgICAgd2hpbGUgKCAoYXBbbm4tMV0gfCBicFtubi0xXSkgPT0gMCkKKwl7CisJICBubi0tOworCSAgQVNTRVJUIChubiA+IDApOworCX0KKyAgICB9CisgIFRNUF9GUkVFOworCisgIHJldHVybiBubjsKK30KKworbXBfc2l6ZV90CittcG5faGdjZF9yZWR1Y2VfaXRjaCAobXBfc2l6ZV90IG4sIG1wX3NpemVfdCBwKQoreworICBtcF9zaXplX3QgaXRjaDsKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgSEdDRF9SRURVQ0VfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBpdGNoID0gbXBuX2hnY2RfaXRjaCAobi1wKTsKKworICAgICAgLyogRm9yIGFyYml0cmFyeSBwLCB0aGUgc3RvcmFnZSBmb3IgX2FkanVzdCBpcyAyKihwICsgTS0+bikgPSAyICoKKwkgKHAgKyBjZWlsKChuLXApLzIpIC0gMSA8PSBuICsgcCAtIDEgKi8KKyAgICAgIGlmIChpdGNoIDwgbiArIHAgLSAxKQorCWl0Y2ggPSBuICsgcCAtIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaXRjaCA9IDIqKG4tcCkgKyBtcG5faGdjZF9pdGNoIChuLXApOworICAgICAgLyogQ3VycmVudGx5LCBoZ2NkX21hdHJpeF9hcHBseSBhbGxvY2F0ZXMgaXRzIG93biBzdG9yYWdlLiAqLworICAgIH0KKyAgcmV0dXJuIGl0Y2g7Cit9CisKKy8qIEZJWE1FOiBEb2N1bWVudCBzdG9yYWdlIG5lZWQuICovCittcF9zaXplX3QKK21wbl9oZ2NkX3JlZHVjZSAoc3RydWN0IGhnY2RfbWF0cml4ICpNLAorCQkgbXBfcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgcCwKKwkJIG1wX3B0ciB0cCkKK3sKKyAgbXBfc2l6ZV90IG5uOworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBIR0NEX1JFRFVDRV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG5uID0gbXBuX2hnY2QgKGFwICsgcCwgYnAgKyBwLCBuIC0gcCwgTSwgdHApOworICAgICAgaWYgKG5uID4gMCkKKwkvKiBOZWVkcyAyKihwICsgTS0+bikgPD0gMiooZmxvb3Iobi8yKSArIGNlaWwobi8yKSAtIDEpCisJICAgPSAyIChuIC0gMSkgKi8KKwlyZXR1cm4gbXBuX2hnY2RfbWF0cml4X2FkanVzdCAoTSwgcCArIG5uLCBhcCwgYnAsIHAsIHRwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUE5fQ09QWSAodHAsIGFwICsgcCwgbiAtIHApOworICAgICAgTVBOX0NPUFkgKHRwICsgbiAtIHAsIGJwICsgcCwgbiAtIHApOworICAgICAgaWYgKG1wbl9oZ2NkX2FwcHIgKHRwLCB0cCArIG4gLSBwLCBuIC0gcCwgTSwgdHAgKyAyKihuLXApKSkKKwlyZXR1cm4gaGdjZF9tYXRyaXhfYXBwbHkgKE0sIGFwLCBicCwgbik7CisgICAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2hnY2Rfc3RlcC5jIGIvbXBuL2dlbmVyaWMvaGdjZF9zdGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3OGE4OAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL2hnY2Rfc3RlcC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBoZ2NkX3N0ZXAuYy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA4LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKK3N0YXRpYyB2b2lkCitoZ2NkX2hvb2sgKHZvaWQgKnAsIG1wX3NyY3B0ciBncCwgbXBfc2l6ZV90IGduLAorCSAgIG1wX3NyY3B0ciBxcCwgbXBfc2l6ZV90IHFuLCBpbnQgZCkKK3sKKyAgQVNTRVJUICghZ3ApOworICBBU1NFUlQgKGQgPj0gMCk7CisgIEFTU0VSVCAoZCA8PSAxKTsKKworICBNUE5fTk9STUFMSVpFIChxcCwgcW4pOworICBpZiAocW4gPiAwKQorICAgIHsKKyAgICAgIHN0cnVjdCBoZ2NkX21hdHJpeCAqTSA9IChzdHJ1Y3QgaGdjZF9tYXRyaXggKikgcDsKKyAgICAgIC8qIE5PVEVTOiBUaGlzIGlzIGEgYml0IHVnbHkuIEEgdHAgYXJlYSBpcyBwYXNzZWQgdG8KKwkgZ2NkX3N1YmRpdl9zdGVwLCB3aGljaCBzdG9yZXMgcSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBhcmVhLiBXZQorCSBub3cgdXNlIHRoZSByZXN0LiAqLworICAgICAgbXBfcHRyIHRwID0gKG1wX3B0cikgcXAgKyBxbjsKKyAgICAgIG1wbl9oZ2NkX21hdHJpeF91cGRhdGVfcSAoTSwgcXAsIHFuLCBkLCB0cCk7CisgICAgfQorfQorCisvKiBQZXJmb3JtIGEgZmV3IHN0ZXBzLCB1c2luZyBzb21lIG9mIG1wbl9oZ2NkMiwgc3VidHJhY3Rpb24gYW5kCisgICBkaXZpc2lvbi4gUmVkdWNlcyB0aGUgc2l6ZSBieSBhbG1vc3Qgb25lIGxpbWIgb3IgbW9yZSwgYnV0IG5ldmVyCisgICBiZWxvdyB0aGUgZ2l2ZW4gc2l6ZSBzLiBSZXR1cm4gbmV3IHNpemUgZm9yIGEgYW5kIGIsIG9yIDAgaWYgbm8KKyAgIG1vcmUgc3RlcHMgYXJlIHBvc3NpYmxlLgorCisgICBJZiBoZ2NkMiBzdWNjZWVkcywgbmVlZHMgdGVtcG9yYXJ5IHNwYWNlIGZvciBoZ2NkX21hdHJpeF9tdWxfMSwgTS0+bgorICAgbGltYnMsIGFuZCBoZ2NkX211bF9tYXRyaXgxX2ludmVyc2VfdmVjdG9yLCBuIGxpbWJzLiBJZiBoZ2NkMgorICAgZmFpbHMsIG5lZWRzIHNwYWNlIGZvciB0aGUgcXVvdGllbnQsIHFuIDw9IG4gLSBzIGxpbWJzLCBmb3IgYW5kCisgICBoZ2NkX21hdHJpeF91cGRhdGVfcSwgcW4gKyAoc2l6ZSBvZiB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG9mIE0pIDw9CisgICAocmVzdWx0aW5nIHNpemUgb2YgTSkgKyAxLgorCisgICBJZiBOIGlzIHRoZSBpbnB1dCBzaXplIHRvIHRoZSBjYWxsaW5nIGhnY2QsIHRoZW4gcyA9IGZsb29yKE4vMikgKworICAgMSwgTS0+biA8IE4sIHFuICsgcHJvZHVjdCBzaXplIDw9IG4gLSBzICsgbiAtIHMgKyAxID0gMiAobiAtIHMpICsgMQorICAgPD0gTi4KKyovCisKK21wX3NpemVfdAorbXBuX2hnY2Rfc3RlcCAobXBfc2l6ZV90IG4sIG1wX3B0ciBhcCwgbXBfcHRyIGJwLCBtcF9zaXplX3QgcywKKwkgICAgICAgc3RydWN0IGhnY2RfbWF0cml4ICpNLCBtcF9wdHIgdHApCit7CisgIHN0cnVjdCBoZ2NkX21hdHJpeDEgTTE7CisgIG1wX2xpbWJfdCBtYXNrOworICBtcF9saW1iX3QgYWgsIGFsLCBiaCwgYmw7CisKKyAgQVNTRVJUIChuID4gcyk7CisKKyAgbWFzayA9IGFwW24tMV0gfCBicFtuLTFdOworICBBU1NFUlQgKG1hc2sgPiAwKTsKKworICBpZiAobiA9PSBzICsgMSkKKyAgICB7CisgICAgICBpZiAobWFzayA8IDQpCisJZ290byBzdWJ0cmFjdDsKKworICAgICAgYWggPSBhcFtuLTFdOyBhbCA9IGFwW24tMl07CisgICAgICBiaCA9IGJwW24tMV07IGJsID0gYnBbbi0yXTsKKyAgICB9CisgIGVsc2UgaWYgKG1hc2sgJiBHTVBfTlVNQl9ISUdIQklUKQorICAgIHsKKyAgICAgIGFoID0gYXBbbi0xXTsgYWwgPSBhcFtuLTJdOworICAgICAgYmggPSBicFtuLTFdOyBibCA9IGJwW24tMl07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IHNoaWZ0OworCisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChzaGlmdCwgbWFzayk7CisgICAgICBhaCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBhcFtuLTFdLCBhcFtuLTJdKTsKKyAgICAgIGFsID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGFwW24tMl0sIGFwW24tM10pOworICAgICAgYmggPSBNUE5fRVhUUkFDVF9OVU1CIChzaGlmdCwgYnBbbi0xXSwgYnBbbi0yXSk7CisgICAgICBibCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBicFtuLTJdLCBicFtuLTNdKTsKKyAgICB9CisKKyAgLyogVHJ5IGFuIG1wbl9oZ2NkMiBzdGVwICovCisgIGlmIChtcG5faGdjZDIgKGFoLCBhbCwgYmgsIGJsLCAmTTEpKQorICAgIHsKKyAgICAgIC8qIE11bHRpcGx5IE0gPC0gTSAqIE0xICovCisgICAgICBtcG5faGdjZF9tYXRyaXhfbXVsXzEgKE0sICZNMSwgdHApOworCisgICAgICAvKiBDYW4ndCBzd2FwIGlucHV0cywgc28gd2UgbmVlZCB0byBjb3B5LiAqLworICAgICAgTVBOX0NPUFkgKHRwLCBhcCwgbik7CisgICAgICAvKiBNdWx0aXBseSBNMV57LTF9IChhO2IpICovCisgICAgICByZXR1cm4gbXBuX21hdHJpeDIyX211bDFfaW52ZXJzZV92ZWN0b3IgKCZNMSwgYXAsIHRwLCBicCwgbik7CisgICAgfQorCisgc3VidHJhY3Q6CisKKyAgcmV0dXJuIG1wbl9nY2Rfc3ViZGl2X3N0ZXAgKGFwLCBicCwgbiwgcywgaGdjZF9ob29rLCBNLCB0cCk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9pbnZlcnQuYyBiL21wbi9nZW5lcmljL2ludmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2ZmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9pbnZlcnQuYwpAQCAtMCwwICsxLDg2IEBACisvKiBpbnZlcnQuYyAtLSBDb21wdXRlIGZsb29yKChCXnsybn0tMSkvVSkgLSBCXm4uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwLCAyMDEyLCAyMDE0LTIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK3ZvaWQKK21wbl9pbnZlcnQgKG1wX3B0ciBpcCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKGRwW24tMV0gJiBHTVBfTlVNQl9ISUdIQklUKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGlwLCBuLCBkcCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoaXAsIG4sIHNjcmF0Y2gsIG1wbl9pbnZlcnRhcHByX2l0Y2gobikpKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGRwLCBuLCBzY3JhdGNoLCBtcG5faW52ZXJ0YXBwcl9pdGNoKG4pKSk7CisKKyAgaWYgKG4gPT0gMSkKKyAgICBpbnZlcnRfbGltYiAoKmlwLCAqZHApOworICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIElOVl9BUFBSX1RIUkVTSE9MRCkpCisgICAgeworCS8qIE1heGltdW0gc2NyYXRjaCBuZWVkZWQgYnkgdGhpcyBicmFuY2g6IDIqbiAqLworCW1wX3B0ciB4cDsKKworCXhwID0gc2NyYXRjaDsJCQkJLyogMiAqIG4gbGltYnMgKi8KKwkvKiBuID4gMSBoZXJlICovCisJTVBOX0ZJTEwgKHhwLCBuLCBHTVBfTlVNQl9NQVgpOworCW1wbl9jb20gKHhwICsgbiwgZHAsIG4pOworCWlmIChuID09IDIpIHsKKwkgIG1wbl9kaXZyZW1fMiAoaXAsIDAsIHhwLCA0LCBkcCk7CisJfSBlbHNlIHsKKwkgIGdtcF9waTFfdCBpbnY7CisJICBpbnZlcnRfcGkxIChpbnYsIGRwW24tMV0sIGRwW24tMl0pOworCSAgLyogRklYTUU6IHNob3VsZCB3ZSB1c2UgZGNwaTFfZGl2X3EsIGZvciBiaWcgc2l6ZXM/ICovCisJICBtcG5fc2JwaTFfZGl2X3EgKGlwLCB4cCwgMiAqIG4sIGRwLCBuLCBpbnYuaW52MzIpOworCX0KKyAgICB9CisgIGVsc2UgeyAvKiBVc2UgYXBwcm94aW1hdGVkIGludmVyc2U7IGNvcnJlY3QgdGhlIHJlc3VsdCBpZiBuZWVkZWQuICovCisgICAgICBtcF9saW1iX3QgZTsgLyogVGhlIHBvc3NpYmxlIGVycm9yIGluIHRoZSBhcHByb3hpbWF0ZSBpbnZlcnNlICovCisKKyAgICAgIEFTU0VSVCAoIG1wbl9pbnZlcnRfaXRjaCAobikgPj0gbXBuX2ludmVydGFwcHJfaXRjaCAobikgKTsKKyAgICAgIGUgPSBtcG5fbmlfaW52ZXJ0YXBwciAoaXAsIGRwLCBuLCBzY3JhdGNoKTsKKworICAgICAgaWYgKFVOTElLRUxZIChlKSkgeyAvKiBBc3N1bWUgdGhlIGVycm9yIGNhbiBvbmx5IGJlICIwIiAobm8gZXJyb3IpIG9yICIxIi4gKi8KKwkvKiBDb2RlIHRvIGRldGVjdCBhbmQgY29ycmVjdCB0aGUgIm9mZiBieSBvbmUiIGFwcHJveGltYXRpb24uICovCisJbXBuX211bF9uIChzY3JhdGNoLCBpcCwgZHAsIG4pOworCWUgPSBtcG5fYWRkX24gKHNjcmF0Y2gsIHNjcmF0Y2gsIGRwLCBuKTsgLyogRklYTUU6IHdlIG9ubHkgbmVlZCBlLiovCisJaWYgKExJS0VMWShlKSkgLyogVGhlIGhpZ2ggcGFydCBjYW4gbm90IGdpdmUgYSBjYXJyeSBieSBpdHNlbGYuICovCisJICBlID0gbXBuX2FkZF9uYyAoc2NyYXRjaCArIG4sIHNjcmF0Y2ggKyBuLCBkcCwgbiwgZSk7IC8qIEZJWE1FOmUgKi8KKwkvKiBJZiB0aGUgdmFsdWUgd2FzIHdyb25nIChubyBjYXJyeSksIGNvcnJlY3QgaXQgKGluY3JlbWVudCkuICovCisJZSBePSBDTlNUX0xJTUIgKDEpOworCU1QTl9JTkNSX1UgKGlwLCBuLCBlKTsKKyAgICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvaW52ZXJ0YXBwci5jIGIvbXBuL2dlbmVyaWMvaW52ZXJ0YXBwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTU1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9pbnZlcnRhcHByLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qIG1wbl9pbnZlcnRhcHByIGFuZCBoZWxwZXIgZnVuY3Rpb25zLiAgQ29tcHV0ZSBJIHN1Y2ggdGhhdAorICAgZmxvb3IoKEJeezJufS0xKS9VIC0gMSA8PSBJICsgQl5uIDw9IGZsb29yKChCXnsybn0tMSkvVS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRoZSBhbGdvcml0aG0gdXNlZCBoZXJlIHdhcyBpbnNwaXJlZCBieSBBcHByb3hpbWF0ZVJlY2lwcm9jYWwgZnJvbSAiTW9kZXJuCisgICBDb21wdXRlciBBcml0aG1ldGljIiwgYnkgUmljaGFyZCBQLiBCcmVudCBhbmQgUGF1bCBaaW1tZXJtYW5uLiAgU3BlY2lhbAorICAgdGhhbmtzIHRvIFBhdWwgWmltbWVybWFubiBmb3IgaGlzIHZlcnkgdmFsdWFibGUgc3VnZ2VzdGlvbnMgb24gYWxsIHRoZQorICAgdGhlb3JldGljYWwgYXNwZWN0cyBkdXJpbmcgdGhlIHdvcmsgb24gdGhpcyBjb2RlLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwLCAyMDEyLCAyMDE1LCAyMDE2IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogRklYTUU6IFRoZSBpdGVyYXRpdmUgdmVyc2lvbiBzcGxpdHMgdGhlIG9wZXJhbmQgaW4gdHdvIHNsaWdodGx5IHVuYmFsYW5jZWQKKyAgIHBhcnRzLCB0aGUgdXNlIG9mIGxvZ18yIChvciBjb3VudGluZyB0aGUgYml0cykgdW5kZXJlc3RpbWF0ZSB0aGUgbWF4aW11bQorICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICAqLworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisjZGVmaW5lIE5QT1dTIFwKKyAoKHNpemVvZihtcF9zaXplX3QpID4gNiA/IDQ4IDogOCpzaXplb2YobXBfc2l6ZV90KSkpCisjZGVmaW5lIE1BWUJFX2RjcGkxX2RpdmFwcHIgICAxCisjZWxzZQorI2RlZmluZSBOUE9XUyBcCisgKChzaXplb2YobXBfc2l6ZV90KSA+IDYgPyA0OCA6IDgqc2l6ZW9mKG1wX3NpemVfdCkpIC0gTE9HMkMgKElOVl9ORVdUT05fVEhSRVNIT0xEKSkKKyNkZWZpbmUgTUFZQkVfZGNwaTFfZGl2YXBwciBcCisgIChJTlZfTkVXVE9OX1RIUkVTSE9MRCA8IERDX0RJVkFQUFJfUV9USFJFU0hPTEQpCisjaWYgKElOVl9ORVdUT05fVEhSRVNIT0xEID4gSU5WX01VTE1PRF9CTk0xX1RIUkVTSE9MRCkgJiYgXAorICAgIChJTlZfQVBQUl9USFJFU0hPTEQgPiBJTlZfTVVMTU9EX0JOTTFfVEhSRVNIT0xEKQorI3VuZGVmICBJTlZfTVVMTU9EX0JOTTFfVEhSRVNIT0xECisjZGVmaW5lIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQgMCAvKiBhbHdheXMgd2hlbiBOZXd0b24gKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIEFsbCB0aGUgdGhyZWUgZnVuY3Rpb25zIG1wbnssX2JjLF9uaX1faW52ZXJ0YXBwciAoaXAsIGRwLCBuLCBzY3JhdGNoKSwgdGFrZQorICAgdGhlIHN0cmljdGx5IG5vcm1hbGlzZWQgdmFsdWUge2RwLG59IChpLmUuLCBtb3N0IHNpZ25pZmljYW50IGJpdCBtdXN0IGJlIHNldCkKKyAgIGFzIGFuIGlucHV0LCBhbmQgY29tcHV0ZSB7aXAsbn06IHRoZSBhcHByb3hpbWF0ZSByZWNpcHJvY2FsIG9mIHtkcCxufS4KKworICAgTGV0IGUgPSBtcG4qX2ludmVydGFwcHIgKGlwLCBkcCwgbiwgc2NyYXRjaCkgYmUgdGhlIHJldHVybmVkIHZhbHVlOyB0aGUKKyAgIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgYnkgdGhlIG91dHB1dDoKKyAgICAgMCA8PSBlIDw9IDE7CisgICAgIHtkcCxufSooQl5uK3tpcCxufSkgPCBCXnsybn0gPD0ge2RwLG59KihCXm4re2lwLG59KzErZSkgLgorICAgSS5lLiBlPTAgbWVhbnMgdGhhdCB0aGUgcmVzdWx0IHtpcCxufSBlcXVhbHMgdGhlIG9uZSBnaXZlbiBieSBtcG5faW52ZXJ0LgorCWU9MSBtZWFucyB0aGF0IHRoZSByZXN1bHQgX21heV8gYmUgb25lIGxlc3MgdGhhbiBleHBlY3RlZC4KKworICAgVGhlIF9iYyB2ZXJzaW9uIHJldHVybnMgZT0xIG1vc3Qgb2YgdGhlIHRpbWUuCisgICBUaGUgX25pIHZlcnNpb24gc2hvdWxkIHJldHVybiBlPTAgbW9zdCBvZiB0aGUgdGltZTsgb25seSBhYm91dCAxJSBvZgorICAgcG9zc2libGUgcmFuZG9tIGlucHV0IHNob3VsZCBnaXZlIGU9MS4KKworICAgV2hlbiB0aGUgc3RyaWN0IHJlc3VsdCBpcyBuZWVkZWQsIGkuZS4sIGU9MCBpbiB0aGUgcmVsYXRpb24gYWJvdmU6CisgICAgIHtkcCxufSooQl5uK3tpcCxufSkgPCBCXnsybn0gPD0ge2RwLG59KihCXm4re2lwLG59KzEpIDsKKyAgIHRoZSBmdW5jdGlvbiBtcG5faW52ZXJ0IChpcCwgZHAsIG4sIHNjcmF0Y2gpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuICAqLworCisvKiBNYXhpbXVtIHNjcmF0Y2ggbmVlZGVkIGJ5IHRoaXMgYnJhbmNoIChhdCB4cCk6IDIqbiAqLworc3RhdGljIG1wX2xpbWJfdAorbXBuX2JjX2ludmVydGFwcHIgKG1wX3B0ciBpcCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHhwKQoreworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUIChkcFtuLTFdICYgR01QX05VTUJfSElHSEJJVCk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChpcCwgbiwgZHAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGlwLCBuLCB4cCwgbXBuX2ludmVydGFwcHJfaXRjaChuKSkpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZHAsIG4sIHhwLCBtcG5faW52ZXJ0YXBwcl9pdGNoKG4pKSk7CisKKyAgLyogQ29tcHV0ZSBhIGJhc2UgdmFsdWUgb2YgciBsaW1icy4gKi8KKyAgaWYgKG4gPT0gMSkKKyAgICBpbnZlcnRfbGltYiAoKmlwLCAqZHApOworICBlbHNlIHsKKyAgICAvKiBuID4gMSBoZXJlICovCisgICAgTVBOX0ZJTEwgKHhwLCBuLCBHTVBfTlVNQl9NQVgpOworICAgIG1wbl9jb20gKHhwICsgbiwgZHAsIG4pOworCisgICAgLyogTm93IHhwIGNvbnRhaW5zIEJeMm4gLSB7ZHAsbn0qQl5uIC0gMSAqLworCisgICAgLyogRklYTUU6IGlmIG1wbl8qcGkxX2RpdmFwcHJfcSBoYW5kbGVzIG49PTIsIHVzZSBpdCEgKi8KKyAgICBpZiAobiA9PSAyKSB7CisgICAgICBtcG5fZGl2cmVtXzIgKGlwLCAwLCB4cCwgNCwgZHApOworICAgIH0gZWxzZSB7CisgICAgICBnbXBfcGkxX3QgaW52OworICAgICAgaW52ZXJ0X3BpMSAoaW52LCBkcFtuLTFdLCBkcFtuLTJdKTsKKyAgICAgIGlmICghIE1BWUJFX2RjcGkxX2RpdmFwcHIKKwkgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgRENfRElWQVBQUl9RX1RIUkVTSE9MRCkpCisJbXBuX3NicGkxX2RpdmFwcHJfcSAoaXAsIHhwLCAyICogbiwgZHAsIG4sIGludi5pbnYzMik7CisgICAgICBlbHNlCisJbXBuX2RjcGkxX2RpdmFwcHJfcSAoaXAsIHhwLCAyICogbiwgZHAsIG4sICZpbnYpOworICAgICAgTVBOX0RFQ1JfVShpcCwgbiwgQ05TVF9MSU1CICgxKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIG1wbl9uaV9pbnZlcnRhcHByOiBjb21wdXRlcyB0aGUgYXBwcm94aW1hdGUgcmVjaXByb2NhbCB1c2luZyBOZXd0b24ncworICAgaXRlcmF0aW9ucyAoYXQgbGVhc3Qgb25lKS4KKworICAgSW5zcGlyZWQgYnkgQWxnb3JpdGhtICJBcHByb3hpbWF0ZVJlY2lwcm9jYWwiLCBwdWJsaXNoZWQgaW4gIk1vZGVybiBDb21wdXRlcgorICAgQXJpdGhtZXRpYyIgYnkgUmljaGFyZCBQLiBCcmVudCBhbmQgUGF1bCBaaW1tZXJtYW5uLCBhbGdvcml0aG0gMy41LCBwYWdlIDEyMQorICAgaW4gdmVyc2lvbiAwLjQgb2YgdGhlIGJvb2suCisKKyAgIFNvbWUgYWRhcHRhdGlvbnMgd2VyZSBpbnRyb2R1Y2VkLCB0byBhbGxvdyBwcm9kdWN0IG1vZCBCXm0tMSBhbmQgcmV0dXJuIHRoZQorICAgdmFsdWUgZS4KKworICAgV2UgaW50cm9kdWNlZCBhIGNvcnJlY3Rpb24gaW4gc3VjaCBhIHdheSB0aGF0ICJ0aGUgdmFsdWUgb2YKKyAgIEJee24raH0tVCBjb21wdXRlZCBhdCBzdGVwIDggY2Fubm90IGV4Y2VlZCBCXm4tMSIgKHRoZSBib29rIHJlYWRzCisgICAiMkJebi0xIikuCisKKyAgIE1heGltdW0gc2NyYXRjaCBuZWVkZWQgYnkgdGhpcyBicmFuY2ggPD0gMipuLCBidXQgaGF2ZSB0byBmaXQgMypybgorICAgaW4gdGhlIHNjcmF0Y2gsIGkuZS4gMypybiA8PSAyKm46IHdlIHJlcXVpcmUgbj40LgorCisgICBXZSB1c2UgYSB3cmFwcGVkIHByb2R1Y3QgbW9kdWxvIEJebS0xLiAgTk9URTogaXMgdGhlcmUgYW55IG5vcm1hbGlzYXRpb24KKyAgIHByb2JsZW0gZm9yIHRoZSBbMF0gY2xhc3M/ICBJdCBzaG91bGRuJ3Q6IHdlIGNvbXB1dGUgMip8QSpYX2ggLSBCXntuK2h9fCA8CisgICBCXm0tMS4gIFdlIG1heSBnZXQgWzBdIGlmIGFuZCBvbmx5IGlmIHdlIGdldCBBWF9oID0gQl57bitofS4gIFRoaXMgY2FuCisgICBoYXBwZW4gb25seSBpZiBBPUJee259LzIsIGJ1dCB0aGlzIGltcGxpZXMgWF9oID0gQl57aH0qMi0xIGkuZS4sIEFYX2ggPQorICAgQl57bitofSAtIEEsIHRoZW4gd2UgZ2V0IGludG8gdGhlICJuZWdhdGl2ZSIgYnJhbmNoLCB3aGVyZSBYX2ggaXMgbm90CisgICBpbmNyZW1lbnRlZCAoYmVjYXVzZSBBIDwgQl5uKS4KKworICAgRklYTUU6IHRoZSBzY3JhdGNoIGZvciBtdWxtb2RfYm5tMSBkb2VzIG5vdCBjdXJyZW50bHkgZml0IGluIHRoZSBzY3JhdGNoLCBpdAorICAgaXMgYWxsb2NhdGVkIGFwYXJ0LgorICovCisKK21wX2xpbWJfdAorbXBuX25pX2ludmVydGFwcHIgKG1wX3B0ciBpcCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX2xpbWJfdCBjeTsKKyAgbXBfc2l6ZV90IHJuLCBtbjsKKyAgbXBfc2l6ZV90IHNpemVzW05QT1dTXSwgKnNpenA7CisgIG1wX3B0ciB0cDsKKyAgVE1QX0RFQ0w7CisjZGVmaW5lIHhwIHNjcmF0Y2gKKworICBBU1NFUlQgKG4gPiA0KTsKKyAgQVNTRVJUIChkcFtuLTFdICYgR01QX05VTUJfSElHSEJJVCk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChpcCwgbiwgZHAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGlwLCBuLCBzY3JhdGNoLCBtcG5faW52ZXJ0YXBwcl9pdGNoKG4pKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChkcCwgbiwgc2NyYXRjaCwgbXBuX2ludmVydGFwcHJfaXRjaChuKSkpOworCisgIC8qIENvbXB1dGUgdGhlIGNvbXB1dGF0aW9uIHByZWNpc2lvbnMgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwgbGVhdmluZyB0aGUKKyAgICAgYmFzZSBjYXNlIHNpemUgaW4gJ3JuJy4gICovCisgIHNpenAgPSBzaXplczsKKyAgcm4gPSBuOworICBkbyB7CisgICAgKnNpenAgPSBybjsKKyAgICBybiA9IChybiA+PiAxKSArIDE7CisgICAgKytzaXpwOworICB9IHdoaWxlIChBQk9WRV9USFJFU0hPTEQgKHJuLCBJTlZfTkVXVE9OX1RIUkVTSE9MRCkpOworCisgIC8qIFdlIHNlYXJjaCB0aGUgaW52ZXJzZSBvZiAwLntkcCxufSwgd2UgY29tcHV0ZSBpdCBhcyAxLntpcCxufSAqLworICBkcCArPSBuOworICBpcCArPSBuOworCisgIC8qIENvbXB1dGUgYSBiYXNlIHZhbHVlIG9mIHJuIGxpbWJzLiAqLworICBtcG5fYmNfaW52ZXJ0YXBwciAoaXAgLSBybiwgZHAgLSBybiwgcm4sIHNjcmF0Y2gpOworCisgIFRNUF9NQVJLOworCisgIGlmIChBQk9WRV9USFJFU0hPTEQgKG4sIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1uID0gbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAobiArIDEpOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG1wbl9tdWxtb2RfYm5tMV9pdGNoIChtbiwgbiwgKG4gPj4gMSkgKyAxKSk7CisgICAgfQorICAvKiBVc2UgTmV3dG9uJ3MgaXRlcmF0aW9ucyB0byBnZXQgdGhlIGRlc2lyZWQgcHJlY2lzaW9uLiovCisKKyAgd2hpbGUgKDEpIHsKKyAgICBuID0gKi0tc2l6cDsKKyAgICAvKgorICAgICAgdiAgICBuICB2CisgICAgICArLS0tLSstLSsKKyAgICAgIF4gcm4gXgorICAgICovCisKKyAgICAvKiBDb21wdXRlIGlfamQgLiAqLworICAgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQpCisJfHwgKChtbiA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKG4gKyAxKSkgPiAobiArIHJuKSkpIHsKKyAgICAgIC8qIEZJWE1FOiBXZSBkbyBvbmx5IG5lZWQge3hwLG4rMX0qLworICAgICAgbXBuX211bCAoeHAsIGRwIC0gbiwgbiwgaXAgLSBybiwgcm4pOworICAgICAgbXBuX2FkZF9uICh4cCArIHJuLCB4cCArIHJuLCBkcCAtIG4sIG4gLSBybiArIDEpOworICAgICAgY3kgPSBDTlNUX0xJTUIoMSk7IC8qIFJlbWVtYmVyIHdlIHRydW5jYXRlZCwgTW9kIEJeKG4rMSkgKi8KKyAgICAgIC8qIFdlIGNvbXB1dGVkICh0cnVuY2F0ZWQpIHt4cCxuKzF9IDwtIDEue2lwLHJufSAqIDAue2RwLG59ICovCisgICAgfSBlbHNlIHsgLyogVXNlIEJebW4tMSB3cmFwYXJvdW5kICovCisgICAgICBtcG5fbXVsbW9kX2JubTEgKHhwLCBtbiwgZHAgLSBuLCBuLCBpcCAtIHJuLCBybiwgdHApOworICAgICAgLyogV2UgY29tcHV0ZWQge3hwLG1ufSA8LSB7aXAscm59ICoge2RwLG59IG1vZCAoQl5tbi0xKSAqLworICAgICAgLyogV2Uga25vdyB0aGF0IDIqfGlwKmRwICsgZHAqQl5ybiAtIEJee3JuK259fCA8IEJebW4tMSAqLworICAgICAgLyogQWRkIGRwKkJecm4gbW9kIChCXm1uLTEpICovCisgICAgICBBU1NFUlQgKG4gPj0gbW4gLSBybik7CisgICAgICBjeSA9IG1wbl9hZGRfbiAoeHAgKyBybiwgeHAgKyBybiwgZHAgLSBuLCBtbiAtIHJuKTsKKyAgICAgIGN5ID0gbXBuX2FkZF9uYyAoeHAsIHhwLCBkcCAtIChuIC0gKG1uIC0gcm4pKSwgbiAtIChtbiAtIHJuKSwgY3kpOworICAgICAgLyogU3VidHJhY3QgQl57cm4rbn0sIG1heWJlIG9ubHkgY29tcGVuc2F0ZSB0aGUgY2FycnkqLworICAgICAgeHBbbW5dID0gQ05TVF9MSU1CICgxKTsgLyogc2V0IGEgbGltaXQgZm9yIERFQ1JfVSAqLworICAgICAgTVBOX0RFQ1JfVSAoeHAgKyBybiArIG4gLSBtbiwgMiAqIG1uICsgMSAtIHJuIC0gbiwgQ05TVF9MSU1CICgxKSAtIGN5KTsKKyAgICAgIE1QTl9ERUNSX1UgKHhwLCBtbiwgQ05TVF9MSU1CICgxKSAtIHhwW21uXSk7IC8qIGlmIERFQ1JfVSBlcm9kZWQgeHBbbW5dICovCisgICAgICBjeSA9IENOU1RfTElNQigwKTsgLyogUmVtZW1iZXIgd2UgYXJlIHdvcmtpbmcgTW9kIEJebW4tMSAqLworICAgIH0KKworICAgIGlmICh4cFtuXSA8IENOU1RfTElNQiAoMikpIHsgLyogInBvc2l0aXZlIiByZXNpZHVlIGNsYXNzICovCisgICAgICBjeSA9IHhwW25dOyAvKiAwIDw9IGN5IDw9IDEgaGVyZS4gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uCisgICAgICBpZiAoY3krKykgeworCWlmIChtcG5fY21wICh4cCwgZHAgLSBuLCBuKSA+IDApIHsKKwkgIG1wX2xpbWJfdCBjaGs7CisJICBjaGsgPSBtcG5fc3VibHNoMV9uICh4cCwgeHAsIGRwIC0gbiwgbik7CisJICBBU1NFUlQgKGNoayA9PSB4cFtuXSk7CisJICArKyBjeTsKKwl9IGVsc2UKKwkgIEFTU0VSVF9DQVJSWSAobXBuX3N1Yl9uICh4cCwgeHAsIGRwIC0gbiwgbikpOworICAgICAgfQorI2Vsc2UgLyogbm8gbXBuX3N1YmxzaDFfbiovCisgICAgICBpZiAoY3krKyAmJiAhbXBuX3N1Yl9uICh4cCwgeHAsIGRwIC0gbiwgbikpIHsKKwlBU1NFUlRfQ0FSUlkgKG1wbl9zdWJfbiAoeHAsIHhwLCBkcCAtIG4sIG4pKTsKKwkrK2N5OworICAgICAgfQorI2VuZGlmCisgICAgICAvKiAxIDw9IGN5IDw9IDMgaGVyZS4gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uCisgICAgICBpZiAobXBuX2NtcCAoeHAsIGRwIC0gbiwgbikgPiAwKSB7CisJQVNTRVJUX05PQ0FSUlkgKG1wbl9yc2Jsc2gxX24gKHhwICsgbiwgeHAsIGRwIC0gbiwgbikpOworCSsrY3k7CisgICAgICB9IGVsc2UKKwlBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uYyAoeHAgKyAyICogbiAtIHJuLCBkcCAtIHJuLCB4cCArIG4gLSBybiwgcm4sIG1wbl9jbXAgKHhwLCBkcCAtIG4sIG4gLSBybikgPiAwKSk7CisjZWxzZSAvKiBubyBtcG5fcnNibHNoMV9uKi8KKyAgICAgIGlmIChtcG5fY21wICh4cCwgZHAgLSBuLCBuKSA+IDApIHsKKwlBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uICh4cCwgeHAsIGRwIC0gbiwgbikpOworCSsrY3k7CisgICAgICB9CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uYyAoeHAgKyAyICogbiAtIHJuLCBkcCAtIHJuLCB4cCArIG4gLSBybiwgcm4sIG1wbl9jbXAgKHhwLCBkcCAtIG4sIG4gLSBybikgPiAwKSk7CisjZW5kaWYKKyAgICAgIE1QTl9ERUNSX1UoaXAgLSBybiwgcm4sIGN5KTsgLyogMSA8PSBjeSA8PSA0IGhlcmUuICovCisgICAgfSBlbHNlIHsgLyogIm5lZ2F0aXZlIiByZXNpZHVlIGNsYXNzICovCisgICAgICBBU1NFUlQgKHhwW25dID49IEdNUF9OVU1CX01BWCAtIENOU1RfTElNQigxKSk7CisgICAgICBNUE5fREVDUl9VKHhwLCBuICsgMSwgY3kpOworICAgICAgaWYgKHhwW25dICE9IEdNUF9OVU1CX01BWCkgeworCU1QTl9JTkNSX1UoaXAgLSBybiwgcm4sIENOU1RfTElNQiAoMSkpOworCUFTU0VSVF9DQVJSWSAobXBuX2FkZF9uICh4cCwgeHAsIGRwIC0gbiwgbikpOworICAgICAgfQorICAgICAgbXBuX2NvbSAoeHAgKyAyICogbiAtIHJuLCB4cCArIG4gLSBybiwgcm4pOworICAgIH0KKworICAgIC8qIENvbXB1dGUgeF9qdV9qLiBGSVhNRTpXZSBuZWVkIHt4cCtybixybn0sIG11bGhpPyAqLworICAgIG1wbl9tdWxfbiAoeHAsIHhwICsgMiAqIG4gLSBybiwgaXAgLSBybiwgcm4pOworICAgIGN5ID0gbXBuX2FkZF9uICh4cCArIHJuLCB4cCArIHJuLCB4cCArIDIgKiBuIC0gcm4sIDIgKiBybiAtIG4pOworICAgIGN5ID0gbXBuX2FkZF9uYyAoaXAgLSBuLCB4cCArIDMgKiBybiAtIG4sIHhwICsgbiArIHJuLCBuIC0gcm4sIGN5KTsKKyAgICBNUE5fSU5DUl9VIChpcCAtIHJuLCBybiwgY3kpOworICAgIGlmIChzaXpwID09IHNpemVzKSB7IC8qIEdldCBvdXQgb2YgdGhlIGN5Y2xlICovCisgICAgICAvKiBDaGVjayBmb3IgcG9zc2libGUgY2FycnkgcHJvcGFnYXRpb24gZnJvbSBiZWxvdy4gKi8KKyAgICAgIGN5ID0geHBbMyAqIHJuIC0gbiAtIDFdID4gR01QX05VTUJfTUFYIC0gQ05TVF9MSU1CICg3KTsgLyogQmUgY29uc2VydmF0aXZlLiAqLworICAgICAgLyogICAgY3kgPSBtcG5fYWRkXzEgKHhwICsgcm4sIHhwICsgcm4sIDIqcm4gLSBuLCA0KTsgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBybiA9IG47CisgIH0KKyAgVE1QX0ZSRUU7CisKKyAgcmV0dXJuIGN5OworI3VuZGVmIHhwCit9CisKK21wX2xpbWJfdAorbXBuX2ludmVydGFwcHIgKG1wX3B0ciBpcCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKGRwW24tMV0gJiBHTVBfTlVNQl9ISUdIQklUKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGlwLCBuLCBkcCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoaXAsIG4sIHNjcmF0Y2gsIG1wbl9pbnZlcnRhcHByX2l0Y2gobikpKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGRwLCBuLCBzY3JhdGNoLCBtcG5faW52ZXJ0YXBwcl9pdGNoKG4pKSk7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgSU5WX05FV1RPTl9USFJFU0hPTEQpKQorICAgIHJldHVybiBtcG5fYmNfaW52ZXJ0YXBwciAoaXAsIGRwLCBuLCBzY3JhdGNoKTsKKyAgZWxzZQorICAgIHJldHVybiBtcG5fbmlfaW52ZXJ0YXBwciAoaXAsIGRwLCBuLCBzY3JhdGNoKTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2phY2Jhc2UuYyBiL21wbi9nZW5lcmljL2phY2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFjZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvamFjYmFzZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBtcG5famFjb2JpX2Jhc2UgLS0gbGltYi9saW1iIEphY29iaSBzeW1ib2wgd2l0aCByZXN0cmljdGVkIGFyZ3VtZW50cy4KKworICAgVEhJUyBJTlRFUkZBQ0UgSVMgUFJFTElNSU5BUlkgQU5EIE1JR0hUIERJU0FQUEVBUiBPUiBCRSBTVUJKRUNUIFRPCisgICBJTkNPTVBBVElCTEUgQ0hBTkdFUyBJTiBBIEZVVFVSRSBSRUxFQVNFIE9GIEdNUC4KKworQ29weXJpZ2h0IDE5OTktMjAwMiwgMjAxMCwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBVc2UgdGhlIHNpbXBsZSBsb29wIGJ5IGRlZmF1bHQuICBUaGUgZ2VuZXJpYyBjb3VudF90cmFpbGluZ196ZXJvcyBpcyBub3QKKyAgIHZlcnkgZmFzdCwgYW5kIHRoZSBleHRyYSB0cmlja2VyeSBvZiBtZXRob2QgMyBoYXMgcHJvdmVuIHRvIGJlIGxlc3MgdXNlCisgICB0aGFuIG1pZ2h0IGhhdmUgYmVlbiB0aG91Z2guICAqLworI2lmbmRlZiBKQUNPQklfQkFTRV9NRVRIT0QKKyNkZWZpbmUgSkFDT0JJX0JBU0VfTUVUSE9EICAyCisjZW5kaWYKKworCisvKiBVc2UgY291bnRfdHJhaWxpbmdfemVyb3MuICAqLworI2lmIEpBQ09CSV9CQVNFX01FVEhPRCA9PSAxCisjZGVmaW5lIFBST0NFU1NfVFdPU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgdHdvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHR3b3MsIGEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXN1bHRfYml0MSBePSBKQUNPQklfVFdPU19VX0JJVDEgKHR3b3MsIGIpOyAgICAgICAgXAorICAgIGEgPj49IHR3b3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgUFJPQ0VTU19UV09TX0VWRU4gIFBST0NFU1NfVFdPU19BTlkKKyNlbmRpZgorCisvKiBVc2UgYSBzaW1wbGUgbG9vcC4gIEEgZGlzYWR2YW50YWdlIG9mIHRoaXMgaXMgdGhhdCB0aGVyZSdzIGEgYnJhbmNoIG9uIGEKKyAgIDUwLzUwIGNoYW5jZSBvZiBhIDAgb3IgMSBsb3cgYml0LiAgKi8KKyNpZiBKQUNPQklfQkFTRV9NRVRIT0QgPT0gMgorI2RlZmluZSBQUk9DRVNTX1RXT1NfRVZFTiAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICB0d287ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR3byA9IEpBQ09CSV9UV09fVV9CSVQxIChiKTsgICAgICAgIFwKKyAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWEgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJlc3VsdF9iaXQxIF49IHR3bzsgICAgICAgICAgICAgXAorCUFTU0VSVCAoYSAhPSAwKTsgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKGEgJiAxKSA9PSAwKTsgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgUFJPQ0VTU19UV09TX0FOWSAgICAgICAgXAorICBpZiAoKGEgJiAxKSA9PSAwKSAgICAgICAgICAgICBcCisgICAgUFJPQ0VTU19UV09TX0VWRU47CisjZW5kaWYKKworLyogUHJvY2VzcyBvbmUgYml0IGFyaXRobWV0aWNhbGx5LCB0aGVuIGEgc2ltcGxlIGxvb3AuICBUaGlzIGN1dHMgdGhlIGxvb3AKKyAgIGNvbmRpdGlvbiBkb3duIHRvIGEgMjUvNzUgY2hhbmNlLCB3aGljaCBzaG91bGQgYnJhbmNoIHByZWRpY3QgYmV0dGVyLgorICAgVGhlIENQVSB3aWxsIG5lZWQgYSByZWFzb25hYmxlIHZhcmlhYmxlIGxlZnQgc2hpZnQuICAqLworI2lmIEpBQ09CSV9CQVNFX01FVEhPRCA9PSAzCisjZGVmaW5lIFBST0NFU1NfVFdPU19FVkVOICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgIHR3bywgbWFzaywgc2hpZnQ7ICAgICAgICAgICAgICBcCisJCQkJCVwKKyAgICB0d28gPSBKQUNPQklfVFdPX1VfQklUMSAoYik7ICAgICAgICBcCisgICAgbWFzayA9ICh+YSAmIDIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJXAorICAgIHNoaWZ0ID0gKH5hICYgMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID4+PSBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0X2JpdDEgXj0gdHdvIF4gKHR3byAmIG1hc2spOyAgXAorCQkJCQlcCisgICAgd2hpbGUgKChhICYgMSkgPT0gMCkgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlhID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlyZXN1bHRfYml0MSBePSB0d287ICAgICAgICAgICAgIFwKKwlBU1NFUlQgKGEgIT0gMCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgUFJPQ0VTU19UV09TX0FOWSAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgdHdvLCBtYXNrLCBzaGlmdDsgICAgICAgICAgICAgIFwKKwkJCQkJXAorICAgIHR3byA9IEpBQ09CSV9UV09fVV9CSVQxIChiKTsgICAgICAgIFwKKyAgICBzaGlmdCA9ICh+YSAmIDEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgYSA+Pj0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQlcCisgICAgbWFzayA9IHNoaWZ0IDw8IDE7ICAgICAgICAgICAgICAgICAgXAorICAgIHJlc3VsdF9iaXQxIF49ICh0d28gJiBtYXNrKTsgICAgICAgIFwKKwkJCQkJXAorICAgIHdoaWxlICgoYSAmIDEpID09IDApICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJYSA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmVzdWx0X2JpdDEgXj0gdHdvOyAgICAgICAgICAgICBcCisJQVNTRVJUIChhICE9IDApOyAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYKKworI2lmIEpBQ09CSV9CQVNFX01FVEhPRCA8IDQKKy8qIENhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgdGhlIEphY29iaSBzeW1ib2wgKGEvYikgb2YgdHdvIG1wX2xpbWJfdCdzLCBidXQKKyAgIHdpdGggYSByZXN0cmljdGVkIHJhbmdlIG9mIGlucHV0cyBhY2NlcHRlZCwgbmFtZWx5IGI+MSwgYiBvZGQuCisKKyAgIFRoZSBpbml0aWFsIHJlc3VsdF9iaXQxIGlzIHRha2VuIGFzIGEgcGFyYW1ldGVyIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKKyAgIG1wel9rcm9uZWNrZXJfdWkoKSBldCBhbC4gIFRoZSBzaWduIGNoYW5nZXMgYm90aCBoZXJlIGFuZCBpbiB0aG9zZQorICAgcm91dGluZXMgYWNjdW11bGF0ZSBuaWNlbHkgaW4gYml0IDEsIHNlZSB0aGUgSkFDT0JJIG1hY3Jvcy4KKworICAgVGhlIHJldHVybiB2YWx1ZSBoZXJlIGlzIHRoZSBub3JtYWwgKzEsIDAsIG9yIC0xLiAgTm90ZSB0aGF0ICsxIGFuZCAtMQorICAgaGF2ZSBiaXQgMSBpbiB0aGUgIkJJVDEiIHNlbnNlLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwgaWYgdGhlIGNhbGxlciBpcworICAgYWNjdW11bGF0aW5nIGl0IGludG8gc29tZSBleHRlbmRlZCBjYWxjdWxhdGlvbi4KKworICAgRHVwbGljYXRpbmcgdGhlIGxvb3AgYm9keSB0byBhdm9pZCB0aGUgTVBfTElNQl9UX1NXQVAoYSxiKSB3b3VsZCBiZQorICAgcG9zc2libGUsIGJ1dCBhIGNvdXBsZSBvZiB0ZXN0cyBzdWdnZXN0IGl0J3Mgbm90IGEgc2lnbmlmaWNhbnQgc3BlZWR1cCwKKyAgIGFuZCBtYXkgZXZlbiBiZSBhIHNsb3dkb3duLCBzbyB3aGF0J3MgaGVyZSBpcyBnb29kIGVub3VnaCBmb3Igbm93LiAqLworCitpbnQKK21wbl9qYWNvYmlfYmFzZSAobXBfbGltYl90IGEsIG1wX2xpbWJfdCBiLCBpbnQgcmVzdWx0X2JpdDEpCit7CisgIEFTU0VSVCAoYiAmIDEpOyAgLyogYiBvZGQgKi8KKyAgQVNTRVJUIChiICE9IDEpOworCisgIGlmIChhID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgUFJPQ0VTU19UV09TX0FOWTsKKyAgaWYgKGEgPT0gMSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGEgPj0gYikKKyAgICBnb3RvIGFfZ3RfYjsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9SRUNJUF9VVV9CSVQxIChhLCBiKTsKKyAgICAgIE1QX0xJTUJfVF9TV0FQIChhLCBiKTsKKworICAgIGFfZ3RfYjoKKyAgICAgIGRvCisJeworCSAgLyogd29ya2luZyBvbiAoYS9iKSwgYSxiIG9kZCwgYT49YiAqLworCSAgQVNTRVJUIChhICYgMSk7CisJICBBU1NFUlQgKGIgJiAxKTsKKwkgIEFTU0VSVCAoYSA+PSBiKTsKKworCSAgaWYgKChhIC09IGIpID09IDApCisJICAgIHJldHVybiAwOworCisJICBQUk9DRVNTX1RXT1NfRVZFTjsKKwkgIGlmIChhID09IDEpCisJICAgIGdvdG8gZG9uZTsKKwl9CisgICAgICB3aGlsZSAoYSA+PSBiKTsKKyAgICB9CisKKyBkb25lOgorICByZXR1cm4gSkFDT0JJX0JJVDFfVE9fUE4gKHJlc3VsdF9iaXQxKTsKK30KKyNlbmRpZgorCisjaWYgSkFDT0JJX0JBU0VfTUVUSE9EID09IDQKKy8qIENvbXB1dGVzIChhL2IpIGZvciBvZGQgYiA+IDEgYW5kIGFueSBhLiBUaGUgaW5pdGlhbCBiaXQgaXMgdGFrZW4gYXMgYQorICogcGFyYW1ldGVyLiBXZSBoYXZlIG5vIG5lZWQgZm9yIHRoZSBjb252ZW50aW9uIHRoYXQgdGhlIHNpZ24gaXMgaW4KKyAqIGJpdCAxLCBpbnRlcm5hbGx5IHdlIHVzZSBiaXQgMC4gKi8KKworLyogRklYTUU6IENvdWxkIHRyeSB0YWJsZS1iYXNlZCBjb3VudF90cmFpbGluZ196ZXJvcy4gKi8KK2ludAorbXBuX2phY29iaV9iYXNlIChtcF9saW1iX3QgYSwgbXBfbGltYl90IGIsIGludCBiaXQpCit7CisgIGludCBjOworCisgIEFTU0VSVCAoYiAmIDEpOworICBBU1NFUlQgKGIgPiAxKTsKKworICBpZiAoYSA9PSAwKQorICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgbGluZSB3aGljaCBkZXBlbmRzIG9uIGIgPiAxICovCisgICAgcmV0dXJuIDA7CisKKyAgYml0ID4+PSAxOworCisgIC8qIEJlbG93LCB3ZSByZXByZXNlbnQgYSBhbmQgYiBzaGlmdGVkIHJpZ2h0IHNvIHRoYXQgdGhlIGxlYXN0CisgICAgIHNpZ25pZmljYW50IG9uZSBiaXQgaXMgaW1wbGljaXQuICovCisKKyAgYiA+Pj0gMTsKKworICBjb3VudF90cmFpbGluZ196ZXJvcyAoYywgYSk7CisgIGJpdCBePSBjICYgKGIgXiAoYiA+PiAxKSk7CisKKyAgLyogV2UgbWF5IGhhdmUgYz09R01QX0xJTUJfQklUUy0xLCBzbyB3ZSBjYW4ndCB1c2UgYT4+YysxLiAqLworICBhID4+PSBjOworICBhID4+PSAxOworCisgIGRvCisgICAgeworICAgICAgbXBfbGltYl90IHQgPSBhIC0gYjsKKyAgICAgIG1wX2xpbWJfdCBiZ3RhID0gTElNQl9ISUdIQklUX1RPX01BU0sgKHQpOworCisgICAgICBpZiAodCA9PSAwKQorCXJldHVybiAwOworCisgICAgICAvKiBJZiBiID4gYSwgaW52b2tlIHJlY2lwcm9jaXR5ICovCisgICAgICBiaXQgXj0gKGJndGEgJiBhICYgYik7CisKKyAgICAgIC8qIGIgPC0tIG1pbiAoYSwgYikgKi8KKyAgICAgIGIgKz0gKGJndGEgJiB0KTsKKworICAgICAgLyogYSA8LS0gfGEgLSBifCAqLworICAgICAgYSA9ICh0IF4gYmd0YSkgLSBiZ3RhOworCisgICAgICAvKiBOdW1iZXIgb2YgdHJhaWxpbmcgemVyb3MgaXMgdGhlIHNhbWUgbm8gbWF0dGVyIGlmIHdlIGxvb2sgYXQKKyAgICAgICAqIHQgb3IgYSwgYnV0IHVzaW5nIHQgZ2l2ZXMgbW9yZSBwYXJhbGxlbGlzbS4gKi8KKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCB0KTsKKyAgICAgIGMgKys7CisgICAgICAvKiAoMi9iKSA9IC0xIGlmIGIgPSAzIG9yIDUgbW9kIDggKi8KKyAgICAgIGJpdCBePSBjICYgKGIgXiAoYiA+PiAxKSk7CisgICAgICBhID4+PSBjOworICAgIH0KKyAgd2hpbGUgKGEgPiAwKTsKKworICByZXR1cm4gMS0yKihiaXQgJiAxKTsKK30KKyNlbmRpZiAvKiBKQUNPQklfQkFTRV9NRVRIT0QgPT0gNCAqLwpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvamFjb2JpLmMgYi9tcG4vZ2VuZXJpYy9qYWNvYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThiMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvamFjb2JpLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIGphY29iaS5jCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTgsIDIwMDAtMjAwNCwgMjAwOCwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNpZm5kZWYgSkFDT0JJX0RDX1RIUkVTSE9MRAorI2RlZmluZSBKQUNPQklfRENfVEhSRVNIT0xEIEdDRF9EQ19USFJFU0hPTEQKKyNlbmRpZgorCisvKiBTY2jDtm5oYWdlJ3MgcnVsZXM6CisgKgorICogQXNzdW1lIHIwID0gcjEgcTEgKyByMiwgd2l0aCByMCBvZGQsIGFuZCByMSA9IHEyIHIyICsgcjMKKyAqCisgKiBJZiByMSBpcyBvZGQsIHRoZW4KKyAqCisgKiAgIChyMSB8IHIwKSA9IHMocjEsIHIwKSAocjAgfCByMSkgPSBzKHIxLCByMCkgKHIyLCByMSkKKyAqCisgKiB3aGVyZSBzKHgseSkgPSAoLTEpXnsoeC0xKSh5LTEpLzR9ID0gKC0xKV5beCA9IHkgPSAzIChtb2QgNCldLgorICoKKyAqIElmIHIxIGlzIGV2ZW4sIHIyIG11c3QgYmUgb2RkLiBXZSBoYXZlCisgKgorICogICAocjEgfCByMCkgPSAocjEgLSByMCB8IHIwKSA9ICgtMSleKHIwLTEpLzIgKHIwIC0gcjEgfCByMCkKKyAqICAgICAgICAgICAgID0gKC0xKV4ocjAtMSkvMiBzKHIwLCByMCAtIHIxKSAocjAgfCByMCAtIHIxKQorICogICAgICAgICAgICAgPSAoLTEpXihyMC0xKS8yIHMocjAsIHIwIC0gcjEpIChyMSB8IHIwIC0gcjEpCisgKgorICogTm93LCBpZiByMSA9IDAgKG1vZCA0KSwgdGhlbiB0aGUgc2lnbiBmYWN0b3IgaXMgKzEsIGFuZCByZXBlYXRpbmcKKyAqIHExIHRpbWVzIGdpdmVzCisgKgorICogICAocjEgfCByMCkgPSAocjEgfCByMikgPSAocjMgfCByMikKKyAqCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgcjEgPSAyIChtb2QgNCksIHRoZSBzaWduIGZhY3RvciBpcworICogKC0xKV57KHIwLTEpLzJ9LCBhbmQgcmVwZWF0aW5nIHExIHRpbWVzIGdpdmVzIHRoZSBleHBvbmVudAorICoKKyAqICAgKHIwLTEpLzIgKyAocjAtcjEtMSkvMiArIC4uLiArIChyMCAtIChxMS0xKSByMSkvMgorICogICA9IHExIChyMC0xKS8yICsgcTEgKHExLTEpLzIKKyAqCisgKiBhbmQgd2UgY2FuIHN1bW1hcml6ZSB0aGUgZXZlbiBjYXNlIGFzCisgKgorICogICAocjEgfCByMCkgPSB0KHIxLCByMCwgcTEpIChyMyB8IHIyKQorICoKKyAqIHdoZXJlIHQoeCx5LHEpID0gKC0xKV57W3ggPSAyIChtb2QgNCldIChxKHktMSkvMiArIHkocS0xKS8yKX0KKyAqCisgKiBXaGF0IGFib3V0IHRlcm1pbmF0aW9uPyBUaGUgcmVtYWluZGVyIHNlcXVlbmNlIGVuZHMgd2l0aCAoMHwxKSA9IDEKKyAqIChvciAoMCB8IHIpID0gMCBpZiByICE9IDEpLiBXaGF0IGFyZSB0aGUgcG9zc2libGUgY2FzZXM/IElmIHIxIGlzCisgKiBvZGQsIHIyIG1heSBiZSB6ZXJvLiBJZiByMSBpcyBldmVuLCB0aGVuIHIyID0gcjAgLSBxMSByMSBpcyBvZGQgYW5kCisgKiBoZW5jZSBub24temVyby4gV2UgbWF5IGhhdmUgcjMgPSByMSAtIHEyIHIyID0gMC4KKyAqCisgKiBFeGFtcGxlczogKDExfDE1KSA9IC0gKDE1fDExKSA9IC0gKDR8MTEpCisgKiAgICAgICAgICAgICg0fDExKSA9ICAgICg0fCAzKSA9ICAgKDF8IDMpCisgKiAgICAgICAgICAgICgxfCAzKSA9ICgzfDEpID0gKDB8MSkgPSAxCisgKgorICogICAgICAgICAgICAgKDJ8NykgPSAoMnwxKSA9ICgwfDEpID0gMQorICoKKyAqIERldGFpbDogICAgICgyfDcpID0gKDItN3w3KSA9ICgtMXw3KSg1fDcpID0gLSg3fDUpID0gLSgyfDUpCisgKiAgICAgICAgICAgICAoMnw1KSA9ICgyLTV8NSkgPSAoLTF8NSkoM3w1KSA9ICAoNXwzKSA9ICAoMnwzKQorICogICAgICAgICAgICAgKDJ8MykgPSAoMi0zfDMpID0gKC0xfDMpKDF8MykgPSAtKDN8MSkgPSAtKDJ8MSkKKyAqCisgKi8KKworLyogSW4gcHJpbmNpcGxlLCB0aGUgc3RhdGUgY29uc2lzdHMgb2YgZm91ciB2YXJpYWJsZXM6IGUgKG9uZSBiaXQpLCBhLAorICAgYiAodHdvIGJpdHMgZWFjaCksIGQgKG9uZSBiaXQpLiBDb2xsZWN0ZWQgZmFjdG9ycyBhcmUgKC0xKV5lLiBhIGFuZAorICAgYiBhcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGN1cnJlbnQgcmVtYWluZGVycy4gZAorICAgKGRlbm9taW5hdG9yKSBpcyAwIGlmIHdlJ3JlIGN1cnJlbnRseSBzdWJ0cmFjdGluZyBtdWx0aXBsaWVzIG9mIGEKKyAgIGZyb20gYiwgYW5kIDEgaWYgd2UncmUgc3VidHJhY3RpbmcgYiBmcm9tIGEuCisKKyAgIGUgaXMgc3RvcmVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQsIHdoaWxlIGEsIGIgYW5kIGQgYXJlCisgICBjb2RlZCBhcyBvbmx5IDEzIGRpc3RpbmN0IHZhbHVlcyBpbiBiaXRzIDEtNCwgYWNjb3JkaW5nIHRvIHRoZQorICAgZm9sbG93aW5nIHRhYmxlLiBGb3Igcm93cyBub3QgbWVudGlvbmluZyBkLCB0aGUgdmFsdWUgaXMgZWl0aGVyCisgICBpbXBsaWVkLCBvciBpdCBkb2Vzbid0IG1hdHRlci4gKi8KKworI2lmIFdBTlRfQVNTRVJUCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgYTsKKyAgdW5zaWduZWQgY2hhciBiOworfSBkZWNvZGVfdGFibGVbMTNdID0geworICAvKiAgMCAqLyB7IDAsIDEgfSwKKyAgLyogIDEgKi8geyAwLCAzIH0sCisgIC8qICAyICovIHsgMSwgMSB9LAorICAvKiAgMyAqLyB7IDEsIDMgfSwKKyAgLyogIDQgKi8geyAyLCAxIH0sCisgIC8qICA1ICovIHsgMiwgMyB9LAorICAvKiAgNiAqLyB7IDMsIDEgfSwKKyAgLyogIDcgKi8geyAzLCAzIH0sIC8qIGQgPSAxICovCisgIC8qICA4ICovIHsgMSwgMCB9LAorICAvKiAgOSAqLyB7IDEsIDIgfSwKKyAgLyogMTAgKi8geyAzLCAwIH0sCisgIC8qIDExICovIHsgMywgMiB9LAorICAvKiAxMiAqLyB7IDMsIDMgfSwgLyogZCA9IDAgKi8KK307CisjZGVmaW5lIEpBQ09CSV9BKGJpdHMpIChkZWNvZGVfdGFibGVbKGJpdHMpPj4xXS5hKQorI2RlZmluZSBKQUNPQklfQihiaXRzKSAoZGVjb2RlX3RhYmxlWyhiaXRzKT4+MV0uYikKKyNlbmRpZiAvKiBXQU5UX0FTU0VSVCAqLworCitjb25zdCB1bnNpZ25lZCBjaGFyIGphY29iaV90YWJsZVsyMDhdID0geworI2luY2x1ZGUgImphY29iaXRhYi5oIgorfTsKKworI2RlZmluZSBCSVRTX0ZBSUwgMzEKKworc3RhdGljIHZvaWQKK2phY29iaV9ob29rICh2b2lkICpwLCBtcF9zcmNwdHIgZ3AsIG1wX3NpemVfdCBnbiwKKwkgICAgIG1wX3NyY3B0ciBxcCwgbXBfc2l6ZV90IHFuLCBpbnQgZCkKK3sKKyAgdW5zaWduZWQgKmJpdHNwID0gKHVuc2lnbmVkICopIHA7CisKKyAgaWYgKGdwKQorICAgIHsKKyAgICAgIEFTU0VSVCAoZ24gPiAwKTsKKyAgICAgIGlmIChnbiAhPSAxIHx8IGdwWzBdICE9IDEpCisJeworCSAgKmJpdHNwID0gQklUU19GQUlMOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaWYgKHFwKQorICAgIHsKKyAgICAgIEFTU0VSVCAocW4gPiAwKTsKKyAgICAgIEFTU0VSVCAoZCA+PSAwKTsKKyAgICAgICpiaXRzcCA9IG1wbl9qYWNvYmlfdXBkYXRlICgqYml0c3AsIGQsIHFwWzBdICYgMyk7CisgICAgfQorfQorCisjZGVmaW5lIENIT09TRV9QKG4pICgyKihuKSAvIDMpCisKK2ludAorbXBuX2phY29iaV9uIChtcF9wdHIgYXAsIG1wX3B0ciBicCwgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGJpdHMpCit7CisgIG1wX3NpemVfdCBzY3JhdGNoOworICBtcF9zaXplX3QgbWF0cml4X3NjcmF0Y2g7CisgIG1wX3B0ciB0cDsKKworICBUTVBfREVDTDsKKworICBBU1NFUlQgKG4gPiAwKTsKKyAgQVNTRVJUICggKGFwW24tMV0gfCBicFtuLTFdKSA+IDApOworICBBU1NFUlQgKCAoYnBbMF0gfCBhcFswXSkgJiAxKTsKKworICAvKiBGSVhNRTogQ2hlY2sgZm9yIHNtYWxsIHNpemVzIGZpcnN0LCBiZWZvcmUgc2V0dGluZyB1cCB0ZW1wb3JhcnkKKyAgICAgc3RvcmFnZSBldGMuICovCisgIHNjcmF0Y2ggPSBNUE5fR0NEX1NVQkRJVl9TVEVQX0lUQ0gobik7CisKKyAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAobiwgSkFDT0JJX0RDX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfc2l6ZV90IGhnY2Rfc2NyYXRjaDsKKyAgICAgIG1wX3NpemVfdCB1cGRhdGVfc2NyYXRjaDsKKyAgICAgIG1wX3NpemVfdCBwID0gQ0hPT1NFX1AgKG4pOworICAgICAgbXBfc2l6ZV90IGRjX3NjcmF0Y2g7CisKKyAgICAgIG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobiAtIHApOworICAgICAgaGdjZF9zY3JhdGNoID0gbXBuX2hnY2RfaXRjaCAobiAtIHApOworICAgICAgdXBkYXRlX3NjcmF0Y2ggPSBwICsgbiAtIDE7CisKKyAgICAgIGRjX3NjcmF0Y2ggPSBtYXRyaXhfc2NyYXRjaCArIE1BWChoZ2NkX3NjcmF0Y2gsIHVwZGF0ZV9zY3JhdGNoKTsKKyAgICAgIGlmIChkY19zY3JhdGNoID4gc2NyYXRjaCkKKwlzY3JhdGNoID0gZGNfc2NyYXRjaDsKKyAgICB9CisKKyAgVE1QX01BUks7CisgIHRwID0gVE1QX0FMTE9DX0xJTUJTKHNjcmF0Y2gpOworCisgIHdoaWxlIChBQk9WRV9USFJFU0hPTEQgKG4sIEpBQ09CSV9EQ19USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIHN0cnVjdCBoZ2NkX21hdHJpeCBNOworICAgICAgbXBfc2l6ZV90IHAgPSAyKm4vMzsKKyAgICAgIG1wX3NpemVfdCBtYXRyaXhfc2NyYXRjaCA9IE1QTl9IR0NEX01BVFJJWF9JTklUX0lUQ0ggKG4gLSBwKTsKKyAgICAgIG1wX3NpemVfdCBubjsKKyAgICAgIG1wbl9oZ2NkX21hdHJpeF9pbml0ICgmTSwgbiAtIHAsIHRwKTsKKworICAgICAgbm4gPSBtcG5faGdjZF9qYWNvYmkgKGFwICsgcCwgYnAgKyBwLCBuIC0gcCwgJk0sICZiaXRzLAorCQkJICAgIHRwICsgbWF0cml4X3NjcmF0Y2gpOworICAgICAgaWYgKG5uID4gMCkKKwl7CisJICBBU1NFUlQgKE0ubiA8PSAobiAtIHAgLSAxKS8yKTsKKwkgIEFTU0VSVCAoTS5uICsgcCA8PSAocCArIG4gLSAxKSAvIDIpOworCSAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgMiAocCArIE0tPm4pIDw9IHAgKyBuIC0gMS4gKi8KKwkgIG4gPSBtcG5faGdjZF9tYXRyaXhfYWRqdXN0ICgmTSwgcCArIG5uLCBhcCwgYnAsIHAsIHRwICsgbWF0cml4X3NjcmF0Y2gpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBuICovCisJICBuID0gbXBuX2djZF9zdWJkaXZfc3RlcCAoYXAsIGJwLCBuLCAwLCBqYWNvYmlfaG9vaywgJmJpdHMsIHRwKTsKKwkgIGlmICghbikKKwkgICAgeworCSAgICAgIFRNUF9GUkVFOworCSAgICAgIHJldHVybiBiaXRzID09IEJJVFNfRkFJTCA/IDAgOiBtcG5famFjb2JpX2ZpbmlzaCAoYml0cyk7CisJICAgIH0KKwl9CisgICAgfQorCisgIHdoaWxlIChuID4gMikKKyAgICB7CisgICAgICBzdHJ1Y3QgaGdjZF9tYXRyaXgxIE07CisgICAgICBtcF9saW1iX3QgYWgsIGFsLCBiaCwgYmw7CisgICAgICBtcF9saW1iX3QgbWFzazsKKworICAgICAgbWFzayA9IGFwW24tMV0gfCBicFtuLTFdOworICAgICAgQVNTRVJUIChtYXNrID4gMCk7CisKKyAgICAgIGlmIChtYXNrICYgR01QX05VTUJfSElHSEJJVCkKKwl7CisJICBhaCA9IGFwW24tMV07IGFsID0gYXBbbi0yXTsKKwkgIGJoID0gYnBbbi0xXTsgYmwgPSBicFtuLTJdOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgc2hpZnQ7CisKKwkgIGNvdW50X2xlYWRpbmdfemVyb3MgKHNoaWZ0LCBtYXNrKTsKKwkgIGFoID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGFwW24tMV0sIGFwW24tMl0pOworCSAgYWwgPSBNUE5fRVhUUkFDVF9OVU1CIChzaGlmdCwgYXBbbi0yXSwgYXBbbi0zXSk7CisJICBiaCA9IE1QTl9FWFRSQUNUX05VTUIgKHNoaWZ0LCBicFtuLTFdLCBicFtuLTJdKTsKKwkgIGJsID0gTVBOX0VYVFJBQ1RfTlVNQiAoc2hpZnQsIGJwW24tMl0sIGJwW24tM10pOworCX0KKworICAgICAgLyogVHJ5IGFuIG1wbl9uaGdjZDIgc3RlcCAqLworICAgICAgaWYgKG1wbl9oZ2NkMl9qYWNvYmkgKGFoLCBhbCwgYmgsIGJsLCAmTSwgJmJpdHMpKQorCXsKKwkgIG4gPSBtcG5fbWF0cml4MjJfbXVsMV9pbnZlcnNlX3ZlY3RvciAoJk0sIHRwLCBhcCwgYnAsIG4pOworCSAgTVBfUFRSX1NXQVAgKGFwLCB0cCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIG1wbl9oZ2NkMiBoYXMgZmFpbGVkLiBUaGVuIGVpdGhlciBvbmUgb2YgYSBvciBiIGlzIHZlcnkKKwkgICAgIHNtYWxsLCBvciB0aGUgZGlmZmVyZW5jZSBpcyB2ZXJ5IHNtYWxsLiBQZXJmb3JtIG9uZQorCSAgICAgc3VidHJhY3Rpb24gZm9sbG93ZWQgYnkgb25lIGRpdmlzaW9uLiAqLworCSAgbiA9IG1wbl9nY2Rfc3ViZGl2X3N0ZXAgKGFwLCBicCwgbiwgMCwgJmphY29iaV9ob29rLCAmYml0cywgdHApOworCSAgaWYgKCFuKQorCSAgICB7CisJICAgICAgVE1QX0ZSRUU7CisJICAgICAgcmV0dXJuIGJpdHMgPT0gQklUU19GQUlMID8gMCA6IG1wbl9qYWNvYmlfZmluaXNoIChiaXRzKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGJpdHMgPj0gMTYpCisgICAgTVBfUFRSX1NXQVAgKGFwLCBicCk7CisKKyAgQVNTRVJUIChicFswXSAmIDEpOworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgbXBfbGltYl90IGFsLCBibDsKKyAgICAgIGFsID0gYXBbMF07CisgICAgICBibCA9IGJwWzBdOworCisgICAgICBUTVBfRlJFRTsKKyAgICAgIGlmIChibCA9PSAxKQorCXJldHVybiAxIC0gMiooYml0cyAmIDEpOworICAgICAgZWxzZQorCXJldHVybiBtcG5famFjb2JpX2Jhc2UgKGFsLCBibCwgYml0cyA8PCAxKTsKKyAgICB9CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCByZXMgPSBtcG5famFjb2JpXzIgKGFwLCBicCwgYml0cyAmIDEpOworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL2phY29iaV8yLmMgYi9tcG4vZ2VuZXJpYy9qYWNvYmlfMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOGI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9qYWNvYmlfMi5jCkBAIC0wLDAgKzEsMzUxIEBACisvKiBqYWNvYmlfMi5jCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTgsIDIwMDAtMjAwNCwgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBKQUNPQklfMl9NRVRIT0QKKyNkZWZpbmUgSkFDT0JJXzJfTUVUSE9EIDIKKyNlbmRpZgorCisvKiBDb21wdXRlcyAoYSAvIGIpIHdoZXJlIGIgaXMgb2RkLCBhbmQgYSBhbmQgYiBhcmUgb3RoZXJ3aXNlIGFyYml0cmFyeQorICAgdHdvLWxpbWIgbnVtYmVycy4gKi8KKyNpZiBKQUNPQklfMl9NRVRIT0QgPT0gMQoraW50CittcG5famFjb2JpXzIgKG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCB1bnNpZ25lZCBiaXQpCit7CisgIG1wX2xpbWJfdCBhaCwgYWwsIGJoLCBibDsKKyAgaW50IGM7CisKKyAgYWwgPSBhcFswXTsKKyAgYWggPSBhcFsxXTsKKyAgYmwgPSBicFswXTsKKyAgYmggPSBicFsxXTsKKworICBBU1NFUlQgKGJsICYgMSk7CisKKyAgYmwgPSAoKGJoIDw8IChHTVBfTlVNQl9CSVRTIC0gMSkpICYgR01QX05VTUJfTUFTSykgfCAoYmwgPj4gMSk7CisgIGJoID4+PSAxOworCisgIGlmICggKGJoIHwgYmwpID09IDApCisgICAgcmV0dXJuIDEgLSAyKihiaXQgJiAxKTsKKworICBpZiAoIChhaCB8IGFsKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChhbCA9PSAwKQorICAgIHsKKyAgICAgIGFsID0gYWg7CisgICAgICBhaCA9IDA7CisgICAgICBiaXQgXj0gR01QX05VTUJfQklUUyAmIChibCBeIChibCA+PiAxKSk7CisgICAgfQorICBjb3VudF90cmFpbGluZ196ZXJvcyAoYywgYWwpOworICBiaXQgXj0gYyAmIChibCBeIChibCA+PiAxKSk7CisKKyAgYysrOworICBpZiAoVU5MSUtFTFkgKGMgPT0gR01QX05VTUJfQklUUykpCisgICAgeworICAgICAgYWwgPSBhaDsKKyAgICAgIGFoID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhbCA9ICgoYWggPDwgKEdNUF9OVU1CX0JJVFMgLSBjKSkgJiBHTVBfTlVNQl9NQVNLKSB8IChhbCA+PiBjKTsKKyAgICAgIGFoID4+PSBjOworICAgIH0KKyAgd2hpbGUgKCAoYWggfCBiaCkgPiAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB0aCwgdGw7CisgICAgICBtcF9saW1iX3QgYmd0YTsKKworICAgICAgc3ViX2RkbW1zcyAodGgsIHRsLCBhaCwgYWwsIGJoLCBibCk7CisgICAgICBpZiAoICh0bCB8IHRoKSA9PSAwKQorCXJldHVybiAwOworCisgICAgICBiZ3RhID0gTElNQl9ISUdIQklUX1RPX01BU0sgKHRoKTsKKworICAgICAgLyogSWYgYiA+IGEsIGludm9rZSByZWNpcHJvY2l0eSAqLworICAgICAgYml0IF49IChiZ3RhICYgYWwgJiBibCk7CisKKyAgICAgIC8qIGIgPC0tIG1pbiAoYSwgYikgKi8KKyAgICAgIGFkZF9zc2FhYWEgKGJoLCBibCwgYmgsIGJsLCB0aCAmIGJndGEsIHRsICYgYmd0YSk7CisKKyAgICAgIGlmICggKGJoIHwgYmwpID09IDApCisJcmV0dXJuIDEgLSAyKihiaXQgJiAxKTsKKworICAgICAgLyogYSA8LS0gfGEgLSBifCAqLworICAgICAgYWwgPSAoYmd0YSBeIHRsKSAtIGJndGE7CisgICAgICBhaCA9IChiZ3RhIF4gdGgpOworCisgICAgICBpZiAoVU5MSUtFTFkgKGFsID09IDApKQorCXsKKwkgIC8qIElmIGIgPiBhLCBhbCA9PSAwIGltcGxpZXMgdGhhdCB3ZSBoYXZlIGEgY2FycnkgdG8KKwkgICAgIHByb3BhZ2F0ZS4gKi8KKwkgIGFsID0gYWggLSBiZ3RhOworCSAgYWggPSAwOworCSAgYml0IF49IEdNUF9OVU1CX0JJVFMgJiAoYmwgXiAoYmwgPj4gMSkpOworCX0KKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCBhbCk7CisgICAgICBjKys7CisgICAgICBiaXQgXj0gYyAmIChibCBeIChibCA+PiAxKSk7CisKKyAgICAgIGlmIChVTkxJS0VMWSAoYyA9PSBHTVBfTlVNQl9CSVRTKSkKKwl7CisJICBhbCA9IGFoOworCSAgYWggPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhbCA9ICgoYWggPDwgKEdNUF9OVU1CX0JJVFMgLSBjKSkgJiBHTVBfTlVNQl9NQVNLKSB8IChhbCA+PiBjKTsKKwkgIGFoID4+PSBjOworCX0KKyAgICB9CisKKyAgQVNTRVJUIChibCA+IDApOworCisgIHdoaWxlICggKGFsIHwgYmwpICYgR01QX0xJTUJfSElHSEJJVCkKKyAgICB7CisgICAgICAvKiBOZWVkIGFuIGV4dHJhIGNvbXBhcmlzb24gdG8gZ2V0IHRoZSBtYXNrLiAqLworICAgICAgbXBfbGltYl90IHQgPSBhbCAtIGJsOworICAgICAgbXBfbGltYl90IGJndGEgPSAtIChibCA+IGFsKTsKKworICAgICAgaWYgKHQgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgICAgLyogSWYgYiA+IGEsIGludm9rZSByZWNpcHJvY2l0eSAqLworICAgICAgYml0IF49IChiZ3RhICYgYWwgJiBibCk7CisKKyAgICAgIC8qIGIgPC0tIG1pbiAoYSwgYikgKi8KKyAgICAgIGJsICs9IChiZ3RhICYgdCk7CisKKyAgICAgIC8qIGEgPC0tIHxhIC0gYnwgKi8KKyAgICAgIGFsID0gKHQgXiBiZ3RhKSAtIGJndGE7CisKKyAgICAgIC8qIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpcyB0aGUgc2FtZSBubyBtYXR0ZXIgaWYgd2UgbG9vayBhdAorICAgICAgICogdCBvciBhLCBidXQgdXNpbmcgdCBnaXZlcyBtb3JlIHBhcmFsbGVsaXNtLiAqLworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIHQpOworICAgICAgYyArKzsKKyAgICAgIC8qICgyL2IpID0gLTEgaWYgYiA9IDMgb3IgNSBtb2QgOCAqLworICAgICAgYml0IF49IGMgJiAoYmwgXiAoYmwgPj4gMSkpOworCisgICAgICBpZiAoVU5MSUtFTFkgKGMgPT0gR01QX05VTUJfQklUUykpCisJcmV0dXJuIDEgLSAyKihiaXQgJiAxKTsKKworICAgICAgYWwgPj49IGM7CisgICAgfQorCisgIC8qIEhlcmUgd2UgaGF2ZSBhIGxpdHRsZSBpbXBlZGFuY2UgbWlzbWF0Y2guIEJldHRlciB0byBpbmxpbmUgaXQ/ICovCisgIHJldHVybiBtcG5famFjb2JpX2Jhc2UgKDIqYWwrMSwgMipibCsxLCBiaXQgPDwgMSk7Cit9CisjZWxpZiBKQUNPQklfMl9NRVRIT0QgPT0gMgoraW50CittcG5famFjb2JpXzIgKG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCB1bnNpZ25lZCBiaXQpCit7CisgIG1wX2xpbWJfdCBhaCwgYWwsIGJoLCBibDsKKyAgaW50IGM7CisKKyAgYWwgPSBhcFswXTsKKyAgYWggPSBhcFsxXTsKKyAgYmwgPSBicFswXTsKKyAgYmggPSBicFsxXTsKKworICBBU1NFUlQgKGJsICYgMSk7CisKKyAgLyogVXNlIGJpdCAxLiAqLworICBiaXQgPDw9IDE7CisKKyAgaWYgKGJoID09IDAgJiYgYmwgPT0gMSkKKyAgICAvKiAoYXwxKSA9IDEgKi8KKyAgICByZXR1cm4gMSAtIChiaXQgJiAyKTsKKworICBpZiAoYWwgPT0gMCkKKyAgICB7CisgICAgICBpZiAoYWggPT0gMCkKKwkvKiAoMHxiKSA9IDAsIGIgPiAxICovCisJcmV0dXJuIDA7CisKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCBhaCk7CisgICAgICBiaXQgXj0gKChHTVBfTlVNQl9CSVRTICsgYykgPDwgMSkgJiAoYmwgXiAoYmwgPj4gMSkpOworCisgICAgICBhbCA9IGJsOworICAgICAgYmwgPSBhaCA+PiBjOworCisgICAgICBpZiAoYmwgPT0gMSkKKwkvKiAoMXxiKSA9IDEgKi8KKwlyZXR1cm4gMSAtIChiaXQgJiAyKTsKKworICAgICAgYWggPSBiaDsKKworICAgICAgYml0IF49IGFsICYgYmw7CisKKyAgICAgIGdvdG8gYl9yZWR1Y2VkOworICAgIH0KKyAgaWYgKCAoYWwgJiAxKSA9PSAwKQorICAgIHsKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCBhbCk7CisKKyAgICAgIGFsID0gKChhaCA8PCAoR01QX05VTUJfQklUUyAtIGMpKSAmIEdNUF9OVU1CX01BU0spIHwgKGFsID4+IGMpOworICAgICAgYWggPj49IGM7CisgICAgICBiaXQgXj0gKGMgPDwgMSkgJiAoYmwgXiAoYmwgPj4gMSkpOworICAgIH0KKyAgaWYgKGFoID09IDApCisgICAgeworICAgICAgaWYgKGJoID4gMCkKKwl7CisJICBiaXQgXj0gYWwgJiBibDsKKwkgIE1QX0xJTUJfVF9TV0FQIChhbCwgYmwpOworCSAgYWggPSBiaDsKKwkgIGdvdG8gYl9yZWR1Y2VkOworCX0KKyAgICAgIGdvdG8gYWJfcmVkdWNlZDsKKyAgICB9CisKKyAgd2hpbGUgKGJoID4gMCkKKyAgICB7CisgICAgICAvKiBDb21wdXRlIChhfGIpICovCisgICAgICB3aGlsZSAoYWggPiBiaCkKKwl7CisJICBzdWJfZGRtbXNzIChhaCwgYWwsIGFoLCBhbCwgYmgsIGJsKTsKKwkgIGlmIChhbCA9PSAwKQorCSAgICB7CisJICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIGFoKTsKKwkgICAgICBiaXQgXj0gKChHTVBfTlVNQl9CSVRTICsgYykgPDwgMSkgJiAoYmwgXiAoYmwgPj4gMSkpOworCisJICAgICAgYWwgPSBibDsKKwkgICAgICBibCA9IGFoID4+IGM7CisJICAgICAgYWggPSBiaDsKKworCSAgICAgIGJpdCBePSBhbCAmIGJsOworCSAgICAgIGdvdG8gYl9yZWR1Y2VkOworCSAgICB9CisJICBjb3VudF90cmFpbGluZ196ZXJvcyAoYywgYWwpOworCSAgYml0IF49IChjIDw8IDEpICYgKGJsIF4gKGJsID4+IDEpKTsKKwkgIGFsID0gKChhaCA8PCAoR01QX05VTUJfQklUUyAtIGMpKSAmIEdNUF9OVU1CX01BU0spIHwgKGFsID4+IGMpOworCSAgYWggPj49IGM7CisJfQorICAgICAgaWYgKGFoID09IGJoKQorCWdvdG8gY2FuY2VsX2hpOworCisgICAgICBpZiAoYWggPT0gMCkKKwl7CisJICBiaXQgXj0gYWwgJiBibDsKKwkgIE1QX0xJTUJfVF9TV0FQIChhbCwgYmwpOworCSAgYWggPSBiaDsKKwkgIGJyZWFrOworCX0KKworICAgICAgYml0IF49IGFsICYgYmw7CisKKyAgICAgIC8qIENvbXB1dGUgKGJ8YSkgKi8KKyAgICAgIHdoaWxlIChiaCA+IGFoKQorCXsKKwkgIHN1Yl9kZG1tc3MgKGJoLCBibCwgYmgsIGJsLCBhaCwgYWwpOworCSAgaWYgKGJsID09IDApCisJICAgIHsKKwkgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAoYywgYmgpOworCSAgICAgIGJpdCBePSAoKEdNUF9OVU1CX0JJVFMgKyBjKSA8PCAxKSAmIChhbCBeIChhbCA+PiAxKSk7CisKKwkgICAgICBibCA9IGJoID4+IGM7CisJICAgICAgYml0IF49IGFsICYgYmw7CisJICAgICAgZ290byBiX3JlZHVjZWQ7CisJICAgIH0KKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjLCBibCk7CisJICBiaXQgXj0gKGMgPDwgMSkgJiAoYWwgXiAoYWwgPj4gMSkpOworCSAgYmwgPSAoKGJoIDw8IChHTVBfTlVNQl9CSVRTIC0gYykpICYgR01QX05VTUJfTUFTSykgfCAoYmwgPj4gYyk7CisJICBiaCA+Pj0gYzsKKwl9CisgICAgICBiaXQgXj0gYWwgJiBibDsKKworICAgICAgLyogQ29tcHV0ZSAoYXxiKSAqLworICAgICAgaWYgKGFoID09IGJoKQorCXsKKwljYW5jZWxfaGk6CisJICBpZiAoYWwgPCBibCkKKwkgICAgeworCSAgICAgIE1QX0xJTUJfVF9TV0FQIChhbCwgYmwpOworCSAgICAgIGJpdCBePSBhbCAmIGJsOworCSAgICB9CisJICBhbCAtPSBibDsKKwkgIGlmIChhbCA9PSAwKQorCSAgICByZXR1cm4gMDsKKworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIGFsKTsKKwkgIGJpdCBePSAoYyA8PCAxKSAmIChibCBeIChibCA+PiAxKSk7CisJICBhbCA+Pj0gYzsKKworCSAgaWYgKGFsID09IDEpCisJICAgIHJldHVybiAxIC0gKGJpdCAmIDIpOworCisJICBNUF9MSU1CX1RfU1dBUCAoYWwsIGJsKTsKKwkgIGJpdCBePSBhbCAmIGJsOworCSAgYnJlYWs7CisJfQorICAgIH0KKworIGJfcmVkdWNlZDoKKyAgLyogQ29tcHV0ZSAoYXxiKSwgd2l0aCBiIGEgc2luZ2xlIGxpbWIuICovCisgIEFTU0VSVCAoYmwgJiAxKTsKKworICBpZiAoYmwgPT0gMSkKKyAgICAvKiAoYXwxKSA9IDEgKi8KKyAgICByZXR1cm4gMSAtIChiaXQgJiAyKTsKKworICB3aGlsZSAoYWggPiAwKQorICAgIHsKKyAgICAgIGFoIC09IChhbCA8IGJsKTsKKyAgICAgIGFsIC09IGJsOworICAgICAgaWYgKGFsID09IDApCisJeworCSAgaWYgKGFoID09IDApCisJICAgIHJldHVybiAwOworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIGFoKTsKKwkgIGJpdCBePSAoKEdNUF9OVU1CX0JJVFMgKyBjKSA8PCAxKSAmIChibCBeIChibCA+PiAxKSk7CisJICBhbCA9IGFoID4+IGM7CisJICBnb3RvIGFiX3JlZHVjZWQ7CisJfQorICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIGFsKTsKKworICAgICAgYWwgPSAoKGFoIDw8IChHTVBfTlVNQl9CSVRTIC0gYykpICYgR01QX05VTUJfTUFTSykgfCAoYWwgPj4gYyk7CisgICAgICBhaCA+Pj0gYzsKKyAgICAgIGJpdCBePSAoYyA8PCAxKSAmIChibCBeIChibCA+PiAxKSk7CisgICAgfQorIGFiX3JlZHVjZWQ6CisgIEFTU0VSVCAoYmwgJiAxKTsKKyAgQVNTRVJUIChibCA+IDEpOworCisgIHJldHVybiBtcG5famFjb2JpX2Jhc2UgKGFsLCBibCwgYml0KTsKK30KKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIEpBQ09CSV8yX01FVEhPRAorI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9sb2dvcHNfbi5jIGIvbXBuL2dlbmVyaWMvbG9nb3BzX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWRiYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbG9nb3BzX24uYwpAQCAtMCwwICsxLDc3IEBACisvKiBtcG5fYW5kX24sIG1wbl9pb3JfbiwgZXRjIC0tIG1wbiBsb2dpY2FsIG9wZXJhdGlvbnMuCisKK0NvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2lmZGVmIE9QRVJBVElPTl9hbmRfbgorI2RlZmluZSBmdW5jIF9fTVBOKGFuZF9uKQorI2RlZmluZSBjYWxsIG1wbl9hbmRfbgorI2VuZGlmCisKKyNpZmRlZiBPUEVSQVRJT05fYW5kbl9uCisjZGVmaW5lIGZ1bmMgX19NUE4oYW5kbl9uKQorI2RlZmluZSBjYWxsIG1wbl9hbmRuX24KKyNlbmRpZgorCisjaWZkZWYgT1BFUkFUSU9OX25hbmRfbgorI2RlZmluZSBmdW5jIF9fTVBOKG5hbmRfbikKKyNkZWZpbmUgY2FsbCBtcG5fbmFuZF9uCisjZW5kaWYKKworI2lmZGVmIE9QRVJBVElPTl9pb3JfbgorI2RlZmluZSBmdW5jIF9fTVBOKGlvcl9uKQorI2RlZmluZSBjYWxsIG1wbl9pb3JfbgorI2VuZGlmCisKKyNpZmRlZiBPUEVSQVRJT05faW9ybl9uCisjZGVmaW5lIGZ1bmMgX19NUE4oaW9ybl9uKQorI2RlZmluZSBjYWxsIG1wbl9pb3JuX24KKyNlbmRpZgorCisjaWZkZWYgT1BFUkFUSU9OX25pb3JfbgorI2RlZmluZSBmdW5jIF9fTVBOKG5pb3JfbikKKyNkZWZpbmUgY2FsbCBtcG5fbmlvcl9uCisjZW5kaWYKKworI2lmZGVmIE9QRVJBVElPTl94b3JfbgorI2RlZmluZSBmdW5jIF9fTVBOKHhvcl9uKQorI2RlZmluZSBjYWxsIG1wbl94b3JfbgorI2VuZGlmCisKKyNpZmRlZiBPUEVSQVRJT05feG5vcl9uCisjZGVmaW5lIGZ1bmMgX19NUE4oeG5vcl9uKQorI2RlZmluZSBjYWxsIG1wbl94bm9yX24KKyNlbmRpZgorCit2b2lkCitmdW5jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgY2FsbCAocnAsIHVwLCB2cCwgbik7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9sc2hpZnQuYyBiL21wbi9nZW5lcmljL2xzaGlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMWZkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9sc2hpZnQuYwpAQCAtMCwwICsxLDcyIEBACisvKiBtcG5fbHNoaWZ0IC0tIFNoaWZ0IGxlZnQgbG93IGxldmVsLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogU2hpZnQgVSAocG9pbnRlZCB0byBieSB1cCBhbmQgbiBsaW1icyBsb25nKSBjbnQgYml0cyB0byB0aGUgbGVmdAorICAgYW5kIHN0b3JlIHRoZSBuIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzIG9mIHRoZSByZXN1bHQgYXQgcnAuCisgICBSZXR1cm4gdGhlIGJpdHMgc2hpZnRlZCBvdXQgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iLgorCisgICBBcmd1bWVudCBjb25zdHJhaW50czoKKyAgIDEuIDAgPCBjbnQgPCBHTVBfTlVNQl9CSVRTLgorICAgMi4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZSB3cml0dGVuIG92ZXIgdGhlIGlucHV0LCBycCBtdXN0IGJlID49IHVwLgorKi8KKworbXBfbGltYl90CittcG5fbHNoaWZ0IChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBjbnQpCit7CisgIG1wX2xpbWJfdCBoaWdoX2xpbWIsIGxvd19saW1iOworICB1bnNpZ25lZCBpbnQgdG5jOworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IHJldHZhbDsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoY250ID49IDEpOworICBBU1NFUlQgKGNudCA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX0RFQ1JfUCAocnAsIHVwLCBuKSk7CisKKyAgdXAgKz0gbjsKKyAgcnAgKz0gbjsKKworICB0bmMgPSBHTVBfTlVNQl9CSVRTIC0gY250OworICBsb3dfbGltYiA9ICotLXVwOworICByZXR2YWwgPSBsb3dfbGltYiA+PiB0bmM7CisgIGhpZ2hfbGltYiA9IChsb3dfbGltYiA8PCBjbnQpICYgR01QX05VTUJfTUFTSzsKKworICBmb3IgKGkgPSBuIC0gMTsgaSAhPSAwOyBpLS0pCisgICAgeworICAgICAgbG93X2xpbWIgPSAqLS11cDsKKyAgICAgICotLXJwID0gaGlnaF9saW1iIHwgKGxvd19saW1iID4+IHRuYyk7CisgICAgICBoaWdoX2xpbWIgPSAobG93X2xpbWIgPDwgY250KSAmIEdNUF9OVU1CX01BU0s7CisgICAgfQorICAqLS1ycCA9IGhpZ2hfbGltYjsKKworICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvbHNoaWZ0Yy5jIGIvbXBuL2dlbmVyaWMvbHNoaWZ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODM2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9sc2hpZnRjLmMKQEAgLTAsMCArMSw3MyBAQAorLyogbXBuX2xzaGlmdGMgLS0gU2hpZnQgbGVmdCBsb3cgbGV2ZWwgd2l0aCBjb21wbGVtZW50LgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIFNoaWZ0IFUgKHBvaW50ZWQgdG8gYnkgdXAgYW5kIG4gbGltYnMgbG9uZykgY250IGJpdHMgdG8gdGhlIGxlZnQKKyAgIGFuZCBzdG9yZSB0aGUgbiBsZWFzdCBzaWduaWZpY2FudCBsaW1icyBvZiB0aGUgcmVzdWx0IGF0IHJwLgorICAgUmV0dXJuIHRoZSBiaXRzIHNoaWZ0ZWQgb3V0IGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYi4KKworICAgQXJndW1lbnQgY29uc3RyYWludHM6CisgICAxLiAwIDwgY250IDwgR01QX05VTUJfQklUUy4KKyAgIDIuIElmIHRoZSByZXN1bHQgaXMgdG8gYmUgd3JpdHRlbiBvdmVyIHRoZSBpbnB1dCwgcnAgbXVzdCBiZSA+PSB1cC4KKyovCisKK21wX2xpbWJfdAorbXBuX2xzaGlmdGMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgdW5zaWduZWQgaW50IGNudCkKK3sKKyAgbXBfbGltYl90IGhpZ2hfbGltYiwgbG93X2xpbWI7CisgIHVuc2lnbmVkIGludCB0bmM7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgcmV0dmFsOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChjbnQgPj0gMSk7CisgIEFTU0VSVCAoY250IDwgR01QX05VTUJfQklUUyk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfREVDUl9QIChycCwgdXAsIG4pKTsKKworICB1cCArPSBuOworICBycCArPSBuOworCisgIHRuYyA9IEdNUF9OVU1CX0JJVFMgLSBjbnQ7CisgIGxvd19saW1iID0gKi0tdXA7CisgIHJldHZhbCA9IGxvd19saW1iID4+IHRuYzsKKyAgaGlnaF9saW1iID0gKGxvd19saW1iIDw8IGNudCk7CisKKyAgZm9yIChpID0gbiAtIDE7IGkgIT0gMDsgaS0tKQorICAgIHsKKyAgICAgIGxvd19saW1iID0gKi0tdXA7CisgICAgICAqLS1ycCA9ICh+KGhpZ2hfbGltYiB8IChsb3dfbGltYiA+PiB0bmMpKSkgJiBHTVBfTlVNQl9NQVNLOworICAgICAgaGlnaF9saW1iID0gbG93X2xpbWIgPDwgY250OworICAgIH0KKyAgKi0tcnAgPSAofmhpZ2hfbGltYikgJiBHTVBfTlVNQl9NQVNLOworCisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tYXRyaXgyMl9tdWwuYyBiL21wbi9nZW5lcmljL21hdHJpeDIyX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tYXRyaXgyMl9tdWwuYwpAQCAtMCwwICsxLDMyMSBAQAorLyogbWF0cml4MjJfbXVsLmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IE5pZWxzIE3DtmxsZXIgYW5kIE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDMtMjAwNSwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2RlZmluZSBNVUwocnAsIGFwLCBhbiwgYnAsIGJuKSBkbyB7CQlcCisgIGlmIChhbiA+PSBibikJCQkJCVwKKyAgICBtcG5fbXVsIChycCwgYXAsIGFuLCBicCwgYm4pOwkJXAorICBlbHNlCQkJCQkJXAorICAgIG1wbl9tdWwgKHJwLCBicCwgYm4sIGFwLCBhbik7CQlcCit9IHdoaWxlICgwKQorCisvKiBJbnB1dHMgYXJlIHVuc2lnbmVkLiAqLworc3RhdGljIGludAorYWJzX3N1Yl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgbikKK3sKKyAgaW50IGM7CisgIE1QTl9DTVAgKGMsIGFwLCBicCwgbik7CisgIGlmIChjID49IDApCisgICAgeworICAgICAgbXBuX3N1Yl9uIChycCwgYXAsIGJwLCBuKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9zdWJfbiAocnAsIGJwLCBhcCwgbik7CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2FkZF9zaWduZWRfbiAobXBfcHRyIHJwLAorCSAgICAgIG1wX3NyY3B0ciBhcCwgaW50IGFzLCBtcF9zcmNwdHIgYnAsIGludCBicywgbXBfc2l6ZV90IG4pCit7CisgIGlmIChhcyAhPSBicykKKyAgICByZXR1cm4gYXMgXiBhYnNfc3ViX24gKHJwLCBhcCwgYnAsIG4pOworICBlbHNlCisgICAgeworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfbiAocnAsIGFwLCBicCwgbikpOworICAgICAgcmV0dXJuIGFzOworICAgIH0KK30KKworbXBfc2l6ZV90CittcG5fbWF0cml4MjJfbXVsX2l0Y2ggKG1wX3NpemVfdCBybiwgbXBfc2l6ZV90IG1uKQoreworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChybiwgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xEKQorICAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChtbiwgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xEKSkKKyAgICByZXR1cm4gMypybiArIDIqbW47CisgIGVsc2UKKyAgICByZXR1cm4gMyoocm4gKyBtbikgKyA1OworfQorCisvKiBBbGdvcml0aG06CisKKyAgICAvIHMwIFwgICAvICAxICAwICAwICAwIFwgLyByMCBcCisgICAgfCBzMSB8ICAgfCAgMCAgMSAgMCAgMSB8IHwgcjEgfAorICAgIHwgczIgfCAgIHwgIDAgIDAgLTEgIDEgfCB8IHIyIHwKKyAgICB8IHMzIHwgPSB8ICAwICAxIC0xICAxIHwgXCByMyAvCisgICAgfCBzNCB8ICAgfCAtMSAgMSAtMSAgMSB8CisgICAgfCBzNSB8ICAgfCAgMCAgMSAgMCAgMCB8CisgICAgXCBzNiAvICAgXCAgMCAgMCAgMSAgMCAvCisKKyAgICAvIHQwIFwgICAvICAxICAwICAwICAwIFwgLyBtMCBcCisgICAgfCB0MSB8ICAgfCAgMCAgMSAgMCAgMSB8IHwgbTEgfAorICAgIHwgdDIgfCAgIHwgIDAgIDAgLTEgIDEgfCB8IG0yIHwKKyAgICB8IHQzIHwgPSB8ICAwICAxIC0xICAxIHwgXCBtMyAvCisgICAgfCB0NCB8ICAgfCAtMSAgMSAtMSAgMSB8CisgICAgfCB0NSB8ICAgfCAgMCAgMSAgMCAgMCB8CisgICAgXCB0NiAvICAgXCAgMCAgMCAgMSAgMCAvCisKKyAgTm90ZTogdGhlIHR3byBtYXRyaWNlcyBhYm92ZSBhcmUgdGhlIHNhbWUsIGJ1dCBzX2kgYW5kIHRfaSBhcmUgdXNlZAorICBpbiB0aGUgc2FtZSBwcm9kdWN0LCBvbmx5IGZvciBpPDQsIHNlZSAiQSBTdHJhc3Nlbi1saWtlIE1hdHJpeAorICBNdWx0aXBsaWNhdGlvbiBzdWl0ZWQgZm9yIHNxdWFyaW5nIGFuZCBoaWdoZXIgcG93ZXIgY29tcHV0YXRpb24iIGJ5CisgIE0uIEJvZHJhdG8sIGluIFByb2NlZWRpbmdzIG9mIElTU0FDIDIwMTAuCisKKyAgICAvIHIwIFwgICAvIDEgMCAgMCAgMCAgMCAgMSAgMCBcIC8gczAqdDAgXAorICAgIHwgcjEgfCA9IHwgMCAwIC0xICAxIC0xICAxICAwIHwgfCBzMSp0MSB8CisgICAgfCByMiB8ICAgfCAwIDEgIDAgLTEgIDAgLTEgLTEgfCB8IHMyKnQyIHwKKyAgICBcIHIzIC8gICBcIDAgMSAgMSAtMSAgMCAtMSAgMCAvIHwgczMqdDMgfAorCQkJCSAgICB8IHM0KnQ1IHwKKwkJCQkgICAgfCBzNSp0NiB8CisJCQkJICAgIFwgczYqdDQgLworCisgIFRoZSBzY2hlZHVsaW5nIHVzZXMgdHdvIHRlbXBvcmFyaWVzIFUwIGFuZCBVMSB0byBzdG9yZSBwcm9kdWN0cywgYW5kCisgIHR3bywgUzAgYW5kIFQwLCB0byBzdG9yZSBjb21iaW5hdGlvbnMgb2YgZW50cmllcyBvZiB0aGUgdHdvCisgIG9wZXJhbmRzLgorKi8KKworLyogQ29tcHV0ZXMgUiA9IFIgKiBNLiBFbGVtZW50cyBhcmUgbnVtYmVycyBSID0gKHIwLCByMTsgcjIsIHIzKS4KKyAqCisgKiBSZXN1bHRpbmcgZWxlbWVudHMgYXJlIG9mIHNpemUgdXAgdG8gcm4gKyBtbiArIDEuCisgKgorICogVGVtcG9yYXJ5IHN0b3JhZ2U6IDMgcm4gKyAzIG1uICsgNS4gKi8KK3N0YXRpYyB2b2lkCittcG5fbWF0cml4MjJfbXVsX3N0cmFzc2VuIChtcF9wdHIgcjAsIG1wX3B0ciByMSwgbXBfcHRyIHIyLCBtcF9wdHIgcjMsIG1wX3NpemVfdCBybiwKKwkJCSAgIG1wX3NyY3B0ciBtMCwgbXBfc3JjcHRyIG0xLCBtcF9zcmNwdHIgbTIsIG1wX3NyY3B0ciBtMywgbXBfc2l6ZV90IG1uLAorCQkJICAgbXBfcHRyIHRwKQoreworICBtcF9wdHIgczAsIHQwLCB1MCwgdTE7CisgIGludCByMXMsIHIzcywgczBzLCB0MHMsIHUxczsKKyAgczAgPSB0cDsgdHAgKz0gcm4gKyAxOworICB0MCA9IHRwOyB0cCArPSBtbiArIDE7CisgIHUwID0gdHA7IHRwICs9IHJuICsgbW4gKyAxOworICB1MSA9IHRwOyAvKiBybiArIG1uICsgMiAqLworCisgIE1VTCAodTAsIHIxLCBybiwgbTIsIG1uKTsJCS8qIHU1ID0gczUgKiB0NiAqLworICByM3MgPSBhYnNfc3ViX24gKHIzLCByMywgcjIsIHJuKTsJLyogcjMgLSByMiAqLworICBpZiAocjNzKQorICAgIHsKKyAgICAgIHIxcyA9IGFic19zdWJfbiAocjEsIHIxLCByMywgcm4pOworICAgICAgcjFbcm5dID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByMVtybl0gPSBtcG5fYWRkX24gKHIxLCByMSwgcjMsIHJuKTsKKyAgICAgIHIxcyA9IDA7CQkJCS8qIHIxIC0gcjIgKyByMyAgKi8KKyAgICB9CisgIGlmIChyMXMpCisgICAgeworICAgICAgczBbcm5dID0gbXBuX2FkZF9uIChzMCwgcjEsIHIwLCBybik7CisgICAgICBzMHMgPSAwOworICAgIH0KKyAgZWxzZSBpZiAocjFbcm5dICE9IDApCisgICAgeworICAgICAgczBbcm5dID0gcjFbcm5dIC0gbXBuX3N1Yl9uIChzMCwgcjEsIHIwLCBybik7CisgICAgICBzMHMgPSAxOwkJCQkvKiBzNCA9IC1yMCArIHIxIC0gcjIgKyByMyAqLworCQkJCQkvKiBSZXZlcnNlIHNpZ24hICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgczBzID0gYWJzX3N1Yl9uIChzMCwgcjAsIHIxLCBybik7CisgICAgICBzMFtybl0gPSAwOworICAgIH0KKyAgTVVMICh1MSwgcjAsIHJuLCBtMCwgbW4pOwkJLyogdTAgPSBzMCAqIHQwICovCisgIHIwW3JuK21uXSA9IG1wbl9hZGRfbiAocjAsIHUwLCB1MSwgcm4gKyBtbik7CisgIEFTU0VSVCAocjBbcm4rbW5dIDwgMik7CQkvKiB1MCArIHU1ICovCisKKyAgdDBzID0gYWJzX3N1Yl9uICh0MCwgbTMsIG0yLCBtbik7CisgIHUxcyA9IHIzc150MHNeMTsJCQkvKiBSZXZlcnNlIHNpZ24hICovCisgIE1VTCAodTEsIHIzLCBybiwgdDAsIG1uKTsJCS8qIHUyID0gczIgKiB0MiAqLworICB1MVtybittbl0gPSAwOworICBpZiAodDBzKQorICAgIHsKKyAgICAgIHQwcyA9IGFic19zdWJfbiAodDAsIG0xLCB0MCwgbW4pOworICAgICAgdDBbbW5dID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0MFttbl0gPSBtcG5fYWRkX24gKHQwLCB0MCwgbTEsIG1uKTsKKyAgICB9CisKKyAgLyogRklYTUU6IENvdWxkIGJlIHNpbXBsaWZpZWQgaWYgd2UgaGFkIHNwYWNlIGZvciBybiArIG1uICsgMiBsaW1icworICAgICBhdCByMy4gSSdkIGV4cGVjdCB0aGF0IGZvciBtYXRyaWNlcyBvZiByYW5kb20gc2l6ZSwgdGhlIGhpZ2gKKyAgICAgd29yZHMgdDBbbW5dIGFuZCByMVtybl0gYXJlIG5vbi16ZXJvIHdpdGggYSBwcmV0dHkgc21hbGwKKyAgICAgcHJvYmFiaWxpdHkuIElmIHRoYXQgY2FuIGJlIGNvbmZpcm1lZCB0aGlzIHNob3VsZCBiZSBkb25lIGFzIGFuCisgICAgIHVuY29uZGl0aW9uYWwgcm4geCAobW4rMSkgZm9sbG93ZWQgYnkgYW4gaWYgKFVOTElLRUxZIChyMVtybl0pKQorICAgICBhZGRfbi4gKi8KKyAgaWYgKHQwW21uXSAhPSAwKQorICAgIHsKKyAgICAgIE1VTCAocjMsIHIxLCBybiwgdDAsIG1uICsgMSk7CS8qIHUzID0gczMgKiB0MyAqLworICAgICAgQVNTRVJUIChyMVtybl0gPCAyKTsKKyAgICAgIGlmIChyMVtybl0gIT0gMCkKKwltcG5fYWRkX24gKHIzICsgcm4sIHIzICsgcm4sIHQwLCBtbiArIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIE1VTCAocjMsIHIxLCBybiArIDEsIHQwLCBtbik7CisgICAgfQorCisgIEFTU0VSVCAocjNbcm4rbW5dIDwgNCk7CisKKyAgdTBbcm4rbW5dID0gMDsKKyAgaWYgKHIxc150MHMpCisgICAgeworICAgICAgcjNzID0gYWJzX3N1Yl9uIChyMywgdTAsIHIzLCBybiArIG1uICsgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfbiAocjMsIHIzLCB1MCwgcm4gKyBtbiArIDEpKTsKKyAgICAgIHIzcyA9IDA7CQkJCS8qIHUzICsgdTUgKi8KKyAgICB9CisKKyAgaWYgKHQwcykKKyAgICB7CisgICAgICB0MFttbl0gPSBtcG5fYWRkX24gKHQwLCB0MCwgbTAsIG1uKTsKKyAgICB9CisgIGVsc2UgaWYgKHQwW21uXSAhPSAwKQorICAgIHsKKyAgICAgIHQwW21uXSAtPSBtcG5fc3ViX24gKHQwLCB0MCwgbTAsIG1uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0MHMgPSBhYnNfc3ViX24gKHQwLCB0MCwgbTAsIG1uKTsKKyAgICB9CisgIE1VTCAodTAsIHIyLCBybiwgdDAsIG1uICsgMSk7CQkvKiB1NiA9IHM2ICogdDQgKi8KKyAgQVNTRVJUICh1MFtybittbl0gPCAyKTsKKyAgaWYgKHIxcykKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChyMSwgcjIsIHIxLCBybikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHIxW3JuXSArPSBtcG5fYWRkX24gKHIxLCByMSwgcjIsIHJuKTsKKyAgICB9CisgIHJuKys7CisgIHQwcyA9IGFkZF9zaWduZWRfbiAocjIsIHIzLCByM3MsIHUwLCB0MHMsIHJuICsgbW4pOworCQkJCQkvKiB1MyArIHU1ICsgdTYgKi8KKyAgQVNTRVJUIChyMltybittbi0xXSA8IDQpOworICByM3MgPSBhZGRfc2lnbmVkX24gKHIzLCByMywgcjNzLCB1MSwgdTFzLCBybiArIG1uKTsKKwkJCQkJLyogLXUyICsgdTMgKyB1NSAgKi8KKyAgQVNTRVJUIChyM1tybittbi0xXSA8IDMpOworICBNVUwgKHUwLCBzMCwgcm4sIG0xLCBtbik7CQkvKiB1NCA9IHM0ICogdDUgKi8KKyAgQVNTRVJUICh1MFtybittbi0xXSA8IDIpOworICB0MFttbl0gPSBtcG5fYWRkX24gKHQwLCBtMywgbTEsIG1uKTsKKyAgTVVMICh1MSwgcjEsIHJuLCB0MCwgbW4gKyAxKTsJCS8qIHUxID0gczEgKiB0MSAqLworICBtbiArPSBybjsKKyAgQVNTRVJUICh1MVttbi0xXSA8IDQpOworICBBU1NFUlQgKHUxW21uXSA9PSAwKTsKKyAgQVNTRVJUX05PQ0FSUlkgKGFkZF9zaWduZWRfbiAocjEsIHIzLCByM3MsIHUwLCBzMHMsIG1uKSk7CisJCQkJCS8qIC11MiArIHUzIC0gdTQgKyB1NSAgKi8KKyAgQVNTRVJUIChyMVttbi0xXSA8IDIpOworICBpZiAocjNzKQorICAgIHsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkX24gKHIzLCB1MSwgcjMsIG1uKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAocjMsIHUxLCByMywgbW4pKTsKKwkJCQkJLyogdTEgKyB1MiAtIHUzIC0gdTUgICovCisgICAgfQorICBBU1NFUlQgKHIzW21uLTFdIDwgMik7CisgIGlmICh0MHMpCisgICAgeworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfbiAocjIsIHUxLCByMiwgbW4pKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChyMiwgdTEsIHIyLCBtbikpOworCQkJCQkvKiB1MSAtIHUzIC0gdTUgLSB1NiAgKi8KKyAgICB9CisgIEFTU0VSVCAocjJbbW4tMV0gPCAyKTsKK30KKwordm9pZAorbXBuX21hdHJpeDIyX211bCAobXBfcHRyIHIwLCBtcF9wdHIgcjEsIG1wX3B0ciByMiwgbXBfcHRyIHIzLCBtcF9zaXplX3Qgcm4sCisJCSAgbXBfc3JjcHRyIG0wLCBtcF9zcmNwdHIgbTEsIG1wX3NyY3B0ciBtMiwgbXBfc3JjcHRyIG0zLCBtcF9zaXplX3QgbW4sCisJCSAgbXBfcHRyIHRwKQoreworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChybiwgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xEKQorICAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChtbiwgTUFUUklYMjJfU1RSQVNTRU5fVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgcDAsIHAxOworICAgICAgdW5zaWduZWQgaTsKKworICAgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2U6IDMgcm4gKyAyIG1uICovCisgICAgICBwMCA9IHRwICsgcm47CisgICAgICBwMSA9IHAwICsgcm4gKyBtbjsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwl7CisJICBNUE5fQ09QWSAodHAsIHIwLCBybik7CisKKwkgIGlmIChybiA+PSBtbikKKwkgICAgeworCSAgICAgIG1wbl9tdWwgKHAwLCByMCwgcm4sIG0wLCBtbik7CisJICAgICAgbXBuX211bCAocDEsIHIxLCBybiwgbTMsIG1uKTsKKwkgICAgICBtcG5fbXVsIChyMCwgcjEsIHJuLCBtMiwgbW4pOworCSAgICAgIG1wbl9tdWwgKHIxLCB0cCwgcm4sIG0xLCBtbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wbl9tdWwgKHAwLCBtMCwgbW4sIHIwLCBybik7CisJICAgICAgbXBuX211bCAocDEsIG0zLCBtbiwgcjEsIHJuKTsKKwkgICAgICBtcG5fbXVsIChyMCwgbTIsIG1uLCByMSwgcm4pOworCSAgICAgIG1wbl9tdWwgKHIxLCBtMSwgbW4sIHRwLCBybik7CisJICAgIH0KKwkgIHIwW3JuK21uXSA9IG1wbl9hZGRfbiAocjAsIHIwLCBwMCwgcm4gKyBtbik7CisJICByMVtybittbl0gPSBtcG5fYWRkX24gKHIxLCByMSwgcDEsIHJuICsgbW4pOworCisJICByMCA9IHIyOyByMSA9IHIzOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBtcG5fbWF0cml4MjJfbXVsX3N0cmFzc2VuIChyMCwgcjEsIHIyLCByMywgcm4sCisJCQkgICAgICAgbTAsIG0xLCBtMiwgbTMsIG1uLCB0cCk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yLmMgYi9tcG4vZ2VuZXJpYy9tYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNTBiNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL21hdHJpeDIyX211bDFfaW52ZXJzZV92ZWN0b3IuYwpAQCAtMCwwICsxLDY0IEBACisvKiBtYXRyaXgyMl9tdWwxX2ludmVyc2VfdmVjdG9yLmMKKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOCwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogU2V0cyAocjtiKSA9IE1eey0xfShhO2IpLCB3aXRoIE1eey0xfSA9ICh1MTEsIC11MDE7IC11MTAsIHUwMCkgZnJvbQorICAgdGhlIGxlZnQuIFVzZXMgdGhyZWUgYnVmZmVycywgdG8gYXZvaWQgYSBjb3B5LiAqLworbXBfc2l6ZV90CittcG5fbWF0cml4MjJfbXVsMV9pbnZlcnNlX3ZlY3RvciAoY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4MSAqTSwKKwkJCQkgIG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9wdHIgYnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgaDAsIGgxOworCisgIC8qIENvbXB1dGUgKHI7YikgPC0tICh1MTEgYSAtIHUwMSBiOyAtdTEwIGEgKyB1MDAgYikgYXMKKworICAgICByICA9IHUxMSAqIGEKKyAgICAgciAtPSB1MDEgKiBiCisgICAgIGIgKj0gdTAwCisgICAgIGIgLT0gdTEwICogYQorICAqLworCisgIGgwID0gICAgbXBuX211bF8xIChycCwgYXAsIG4sIE0tPnVbMV1bMV0pOworICBoMSA9IG1wbl9zdWJtdWxfMSAocnAsIGJwLCBuLCBNLT51WzBdWzFdKTsKKyAgQVNTRVJUIChoMCA9PSBoMSk7CisKKyAgaDAgPSAgICBtcG5fbXVsXzEgKGJwLCBicCwgbiwgTS0+dVswXVswXSk7CisgIGgxID0gbXBuX3N1Ym11bF8xIChicCwgYXAsIG4sIE0tPnVbMV1bMF0pOworICBBU1NFUlQgKGgwID09IGgxKTsKKworICBuIC09IChycFtuLTFdIHwgYnBbbi0xXSkgPT0gMDsKKyAgcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tb2RfMS5jIGIvbXBuL2dlbmVyaWMvbW9kXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM3YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbW9kXzEuYwpAQCAtMCwwICsxLDI3OCBAQAorLyogbXBuX21vZF8xKGRpdmlkZW5kX3B0ciwgZGl2aWRlbmRfc2l6ZSwgZGl2aXNvcl9saW1iKSAtLQorICAgRGl2aWRlIChESVZJREVORF9QVFIsLERJVklERU5EX1NJWkUpIGJ5IERJVklTT1JfTElNQi4KKyAgIFJldHVybiB0aGUgc2luZ2xlLWxpbWIgcmVtYWluZGVyLgorICAgVGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZGl2aXNvci4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDctMjAwOSwgMjAxMiwgMjAyMAorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogVGhlIHNpemUgd2hlcmUgdWRpdl9xcm5uZF9wcmVpbnYgc2hvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdWRpdl9xcm5uZCwKKyAgIG1lYW5pbmcgdGhlIHF1b3RpZW50IHNpemUgd2hlcmUgdGhhdCBzaG91bGQgaGFwcGVuLCB0aGUgcXVvdGllbnQgc2l6ZQorICAgYmVpbmcgaG93IG1hbnkgdWRpdiBkaXZpc2lvbnMgd2lsbCBiZSBkb25lLgorCisgICBUaGUgZGVmYXVsdCBpcyB0byB1c2UgcHJlaW52IGFsd2F5cywgQ1BVcyB3aGVyZSB0aGlzIGRvZXNuJ3Qgc3VpdCBoYXZlCisgICB0dW5lZCB0aHJlc2hvbGRzLiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgcHJlaW52IHNob3VsZCBjZXJ0YWlubHkgYmUKKyAgIHVzZWQgaWYgdGhhdCdzIHRoZSBvbmx5IGRpdmlzaW9uIGF2YWlsYWJsZSAoVVNFX1BSRUlOVl9BTFdBWVMpLiAgKi8KKworI2lmbmRlZiBNT0RfMV9OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBNT0RfMV9OT1JNX1RIUkVTSE9MRCAgMAorI2VuZGlmCisKKyNpZm5kZWYgTU9EXzFfVU5OT1JNX1RIUkVTSE9MRAorI2RlZmluZSBNT0RfMV9VTk5PUk1fVEhSRVNIT0xEICAwCisjZW5kaWYKKworI2lmbmRlZiBNT0RfMVVfVE9fTU9EXzFfMV9USFJFU0hPTEQKKyNkZWZpbmUgTU9EXzFVX1RPX01PRF8xXzFfVEhSRVNIT0xEICBNUF9TSVpFX1RfTUFYIC8qIGRlZmF1bHQgaXMgbm90IHRvIHVzZSBtcG5fbW9kXzFzICovCisjZW5kaWYKKworI2lmbmRlZiBNT0RfMU5fVE9fTU9EXzFfMV9USFJFU0hPTEQKKyNkZWZpbmUgTU9EXzFOX1RPX01PRF8xXzFfVEhSRVNIT0xEICBNUF9TSVpFX1RfTUFYIC8qIGRlZmF1bHQgaXMgbm90IHRvIHVzZSBtcG5fbW9kXzFzICovCisjZW5kaWYKKworI2lmbmRlZiBNT0RfMV8xX1RPX01PRF8xXzJfVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xXzFfVE9fTU9EXzFfMl9USFJFU0hPTEQgIDEwCisjZW5kaWYKKworI2lmbmRlZiBNT0RfMV8yX1RPX01PRF8xXzRfVEhSRVNIT0xECisjZGVmaW5lIE1PRF8xXzJfVE9fTU9EXzFfNF9USFJFU0hPTEQgIDIwCisjZW5kaWYKKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRCAmJiAhSEFWRV9OQVRJVkVfbXBuX21vZF8xXzFwCisvKiBEdXBsaWNhdGVzIGRlY2xhcmF0aW9ucyBpbiB0dW5lL3NwZWVkLmggKi8KK21wX2xpbWJfdCBtcG5fbW9kXzFfMXBfMSAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90IFs0XSk7CittcF9saW1iX3QgbXBuX21vZF8xXzFwXzIgKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCBbNF0pOworCit2b2lkIG1wbl9tb2RfMV8xcF9jcHNfMSAobXBfbGltYl90IFs0XSwgbXBfbGltYl90KTsKK3ZvaWQgbXBuX21vZF8xXzFwX2Nwc18yIChtcF9saW1iX3QgWzRdLCBtcF9saW1iX3QpOworCisjdW5kZWYgbXBuX21vZF8xXzFwCisjZGVmaW5lIG1wbl9tb2RfMV8xcChhcCwgbiwgYiwgcHJlKQkJCSAgICAgXAorICAobW9kXzFfMXBfbWV0aG9kID09IDEgPyBtcG5fbW9kXzFfMXBfMSAoYXAsIG4sIGIsIHByZSkgICAgIFwKKyAgIDogKG1vZF8xXzFwX21ldGhvZCA9PSAyID8gbXBuX21vZF8xXzFwXzIgKGFwLCBuLCBiLCBwcmUpICBcCisgICAgICA6IF9fZ21wbl9tb2RfMV8xcCAoYXAsIG4sIGIsIHByZSkpKQorCisjdW5kZWYgbXBuX21vZF8xXzFwX2NwcworI2RlZmluZSBtcG5fbW9kXzFfMXBfY3BzKHByZSwgYikJCQkJXAorICAobW9kXzFfMXBfbWV0aG9kID09IDEgPyBtcG5fbW9kXzFfMXBfY3BzXzEgKHByZSwgYikJCVwKKyAgIDogKG1vZF8xXzFwX21ldGhvZCA9PSAyID8gbXBuX21vZF8xXzFwX2Nwc18yIChwcmUsIGIpCVwKKyAgICAgIDogX19nbXBuX21vZF8xXzFwX2NwcyAocHJlLCBiKSkpCisjZW5kaWYgLyogVFVORV9QUk9HUkFNX0JVSUxEICYmICFIQVZFX05BVElWRV9tcG5fbW9kXzFfMXAgKi8KKworCisvKiBUaGUgY29tbWVudHMgaW4gbXBuL2dlbmVyaWMvZGl2cmVtXzEuYyBhcHBseSBoZXJlIHRvby4KKworICAgQXMgbm90ZWQgaW4gdGhlIGFsZ29yaXRobXMgc2VjdGlvbiBvZiB0aGUgbWFudWFsLCB0aGUgc2hpZnRzIGluIHRoZSBsb29wCisgICBmb3IgdGhlIHVubm9ybSBjYXNlIGNhbiBiZSBhdm9pZGVkIGJ5IGNhbGN1bGF0aW5nIHIgPSBhJShkKjJebiksIGZvbGxvd2VkCisgICBieSBhIGZpbmFsIChyKjJebiklKGQqMl5uKS4gIEluIGZhY3QgaWYgaXQgaGFwcGVucyB0aGF0IGElKGQqMl5uKSBjYW4KKyAgIHNraXAgYSBkaXZpc2lvbiB3aGVyZSAoYSoyXm4pJShkKjJebikgY2FuJ3QgdGhlbiB0aGVyZSdzIHRoZSBzYW1lIG51bWJlcgorICAgb2YgZGl2aWRlIHN0ZXBzLCB0aG91Z2ggaG93IG9mdGVuIHRoYXQgaGFwcGVucyBkZXBlbmRzIG9uIHRoZSBhc3N1bWVkCisgICBkaXN0cmlidXRpb25zIG9mIGRpdmlkZW5kIGFuZCBkaXZpc29yLiAgSW4gYW55IGNhc2UgdGhpcyBpZGVhIGlzIGxlZnQgdG8KKyAgIENQVSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgdG8gY29uc2lkZXIuICAqLworCitzdGF0aWMgbXBfbGltYl90CittcG5fbW9kXzFfdW5ub3JtIChtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwgbXBfbGltYl90IGQpCit7CisgIG1wX3NpemVfdCAgaTsKKyAgbXBfbGltYl90ICBuMSwgbjAsIHI7CisgIG1wX2xpbWJfdCAgZHVtbXk7CisgIGludCBjbnQ7CisKKyAgQVNTRVJUICh1biA+IDApOworICBBU1NFUlQgKGQgIT0gMCk7CisKKyAgLyogU2tpcCBhIGRpdmlzaW9uIGlmIGhpZ2ggPCBkaXZpc29yLiAgSGF2aW5nIHRoZSB0ZXN0IGhlcmUgYmVmb3JlCisgICAgIG5vcm1hbGl6aW5nIHdpbGwgc3RpbGwgc2tpcCBhcyBvZnRlbiBhcyBwb3NzaWJsZS4gICovCisgIHIgPSB1cFt1biAtIDFdOworICBpZiAociA8IGQpCisgICAgeworICAgICAgaWYgKC0tdW4gPT0gMCkKKwlyZXR1cm4gcjsKKyAgICB9CisgIGVsc2UKKyAgICByID0gMDsKKworICBkIDw8PSBHTVBfTkFJTF9CSVRTOworCisgIC8qIElmIHVkaXZfcXJubmQgZG9lc24ndCBuZWVkIGEgbm9ybWFsaXplZCBkaXZpc29yLCBjYW4gdXNlIHRoZSBzaW1wbGUKKyAgICAgY29kZSBhYm92ZS4gKi8KKyAgaWYgKCEgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OCisgICAgICAmJiBCRUxPV19USFJFU0hPTEQgKHVuLCBNT0RfMV9VTk5PUk1fVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBmb3IgKGkgPSB1biAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG4wID0gdXBbaV0gPDwgR01QX05BSUxfQklUUzsKKwkgIHVkaXZfcXJubmQgKGR1bW15LCByLCByLCBuMCwgZCk7CisJICByID4+PSBHTVBfTkFJTF9CSVRTOworCX0KKyAgICAgIHJldHVybiByOworICAgIH0KKworICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIGQpOworICBkIDw8PSBjbnQ7CisKKyAgbjEgPSB1cFt1biAtIDFdIDw8IEdNUF9OQUlMX0JJVFM7CisgIHIgPSAociA8PCBjbnQpIHwgKG4xID4+IChHTVBfTElNQl9CSVRTIC0gY250KSk7CisKKyAgaWYgKFVESVZfTkVFRFNfTk9STUFMSVpBVElPTgorICAgICAgJiYgQkVMT1dfVEhSRVNIT0xEICh1biwgTU9EXzFfVU5OT1JNX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfbGltYl90IG5zaGlmdDsKKyAgICAgIGZvciAoaSA9IHVuIC0gMjsgaSA+PSAwOyBpLS0pCisJeworCSAgbjAgPSB1cFtpXSA8PCBHTVBfTkFJTF9CSVRTOworCSAgbnNoaWZ0ID0gKG4xIDw8IGNudCkgfCAobjAgPj4gKEdNUF9OVU1CX0JJVFMgLSBjbnQpKTsKKwkgIHVkaXZfcXJubmQgKGR1bW15LCByLCByLCBuc2hpZnQsIGQpOworCSAgciA+Pj0gR01QX05BSUxfQklUUzsKKwkgIG4xID0gbjA7CisJfQorICAgICAgdWRpdl9xcm5uZCAoZHVtbXksIHIsIHIsIG4xIDw8IGNudCwgZCk7CisgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworICAgICAgcmV0dXJuIHIgPj4gY250OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBpbnYsIG5zaGlmdDsKKyAgICAgIGludmVydF9saW1iIChpbnYsIGQpOworCisgICAgICBmb3IgKGkgPSB1biAtIDI7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG4wID0gdXBbaV0gPDwgR01QX05BSUxfQklUUzsKKwkgIG5zaGlmdCA9IChuMSA8PCBjbnQpIHwgKG4wID4+IChHTVBfTlVNQl9CSVRTIC0gY250KSk7CisJICB1ZGl2X3JubmRfcHJlaW52IChyLCByLCBuc2hpZnQsIGQsIGludik7CisJICByID4+PSBHTVBfTkFJTF9CSVRTOworCSAgbjEgPSBuMDsKKwl9CisgICAgICB1ZGl2X3JubmRfcHJlaW52IChyLCByLCBuMSA8PCBjbnQsIGQsIGludik7CisgICAgICByID4+PSBHTVBfTkFJTF9CSVRTOworICAgICAgcmV0dXJuIHIgPj4gY250OworICAgIH0KK30KKworc3RhdGljIG1wX2xpbWJfdAorbXBuX21vZF8xX25vcm0gKG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9saW1iX3QgZCkKK3sKKyAgbXBfc2l6ZV90ICBpOworICBtcF9saW1iX3QgIG4wLCByOworICBtcF9saW1iX3QgIGR1bW15OworCisgIEFTU0VSVCAodW4gPiAwKTsKKworICBkIDw8PSBHTVBfTkFJTF9CSVRTOworCisgIEFTU0VSVCAoZCAmIEdNUF9MSU1CX0hJR0hCSVQpOworCisgIC8qIEhpZ2ggbGltYiBpcyBpbml0aWFsIHJlbWFpbmRlciwgcG9zc2libHkgd2l0aCBvbmUgc3VidHJhY3Qgb2YKKyAgICAgZCB0byBnZXQgcjxkLiAgKi8KKyAgciA9IHVwW3VuIC0gMV0gPDwgR01QX05BSUxfQklUUzsKKyAgaWYgKHIgPj0gZCkKKyAgICByIC09IGQ7CisgIHIgPj49IEdNUF9OQUlMX0JJVFM7CisgIHVuLS07CisgIGlmICh1biA9PSAwKQorICAgIHJldHVybiByOworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKHVuLCBNT0RfMV9OT1JNX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgZm9yIChpID0gdW4gLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBuMCA9IHVwW2ldIDw8IEdNUF9OQUlMX0JJVFM7CisJICB1ZGl2X3Fybm5kIChkdW1teSwgciwgciwgbjAsIGQpOworCSAgciA+Pj0gR01QX05BSUxfQklUUzsKKwl9CisgICAgICByZXR1cm4gcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGludjsKKyAgICAgIGludmVydF9saW1iIChpbnYsIGQpOworICAgICAgZm9yIChpID0gdW4gLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBuMCA9IHVwW2ldIDw8IEdNUF9OQUlMX0JJVFM7CisJICB1ZGl2X3JubmRfcHJlaW52IChyLCByLCBuMCwgZCwgaW52KTsKKwkgIHIgPj49IEdNUF9OQUlMX0JJVFM7CisJfQorICAgICAgcmV0dXJuIHI7CisgICAgfQorfQorCittcF9saW1iX3QKK21wbl9tb2RfMSAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGIpCit7CisgIEFTU0VSVCAobiA+PSAwKTsKKyAgQVNTRVJUIChiICE9IDApOworCisgIC8qIFNob3VsZCB0aGlzIGJlIGhhbmRsZWQgYXQgYWxsPyAgUmVseSBvbiBjYWxsZXJzPyAgTm90ZSB1bj09MCBpcyBjdXJyZW50bHkKKyAgICAgcmVxdWlyZWQgYnkgbXB6L2ZkaXZfcl91aS5jIGFuZCBwb3NzaWJseSBvdGhlciBwbGFjZXMuICAqLworICBpZiAobiA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChVTkxJS0VMWSAoKGIgJiBHTVBfTlVNQl9ISUdIQklUKSAhPSAwKSkKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNT0RfMU5fVE9fTU9EXzFfMV9USFJFU0hPTEQpKQorCXsKKwkgIHJldHVybiBtcG5fbW9kXzFfbm9ybSAoYXAsIG4sIGIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9saW1iX3QgcHJlWzRdOworCSAgbXBuX21vZF8xXzFwX2NwcyAocHJlLCBiKTsKKwkgIHJldHVybiBtcG5fbW9kXzFfMXAgKGFwLCBuLCBiLCBwcmUpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNT0RfMVVfVE9fTU9EXzFfMV9USFJFU0hPTEQpKQorCXsKKwkgIHJldHVybiBtcG5fbW9kXzFfdW5ub3JtIChhcCwgbiwgYik7CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNT0RfMV8xX1RPX01PRF8xXzJfVEhSRVNIT0xEKSkKKwl7CisJICBtcF9saW1iX3QgcHJlWzRdOworCSAgbXBuX21vZF8xXzFwX2NwcyAocHJlLCBiKTsKKwkgIHJldHVybiBtcG5fbW9kXzFfMXAgKGFwLCBuLCBiIDw8IHByZVsxXSwgcHJlKTsKKwl9CisgICAgICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1PRF8xXzJfVE9fTU9EXzFfNF9USFJFU0hPTEQpIHx8IFVOTElLRUxZIChiID4gR01QX05VTUJfTUFTSyAvIDQpKQorCXsKKwkgIG1wX2xpbWJfdCBwcmVbNV07CisJICBtcG5fbW9kXzFzXzJwX2NwcyAocHJlLCBiKTsKKwkgIHJldHVybiBtcG5fbW9kXzFzXzJwIChhcCwgbiwgYiA8PCBwcmVbMV0sIHByZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wX2xpbWJfdCBwcmVbN107CisJICBtcG5fbW9kXzFzXzRwX2NwcyAocHJlLCBiKTsKKwkgIHJldHVybiBtcG5fbW9kXzFzXzRwIChhcCwgbiwgYiA8PCBwcmVbMV0sIHByZSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL21vZF8xXzEuYyBiL21wbi9nZW5lcmljL21vZF8xXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE5OWZmCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbW9kXzFfMS5jCkBAIC0wLDAgKzEsMzQxIEBACisvKiBtcG5fbW9kXzFfMXAgKGFwLCBuLCBiLCBjcHMpCisgICBEaXZpZGUgKGFwLCxuKSBieSBiLiAgUmV0dXJuIHRoZSBzaW5nbGUtbGltYiByZW1haW5kZXIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTmllbHMgTcO2bGxlci4KKyAgIEJhc2VkIG9uIGEgc3VnZ2VzdGlvbiBieSBQZXRlciBMLiBNb250Z29tZXJ5LgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDgtMjAxMSwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmbmRlZiBNT0RfMV8xUF9NRVRIT0QKKyMgZGVmaW5lIE1PRF8xXzFQX01FVEhPRCAxICAgIC8qIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgMiBmb3IgYXNtIHRlc3RpbmcgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgc29tZSBsb25nbG9uZy5oLXN0eWxlIG1hY3JvcywgYnV0IGZvciB3aWRlciBvcGVyYXRpb25zLgorICogYWRkX21zc2FhYWEgaXMgbGlrZSBsb25nbG9uZy5oJ3MgYWRkX3NzYWFhYSwgYnV0IGFsc28gZ2VuZXJhdGVzCisgKiBjYXJyeSBvdXQsIGluIHRoZSBmb3JtIG9mIGEgbWFzay4gKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkKKworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3g4NiAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfbXNzYWFhYShtLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIF9fYXNtX18gKCAgImFkZAklNiwgJWsyXG5cdCIJCQkJCVwKKwkgICAgICJhZGMJJTQsICVrMVxuXHQiCQkJCQlcCisJICAgICAic2JiCSVrMCwgJWswIgkJCQkJXAorCSAgIDogIj1yIiAobSksICI9ciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAiMSIgICgoVVNJdHlwZSkoYTEpKSwgImciICgoVVNJdHlwZSkoYjEpKSwJCQlcCisJICAgICAiJTIiICgoVVNJdHlwZSkoYTApKSwgImciICgoVVNJdHlwZSkoYjApKSkKKyNlbmRpZgorCisjaWYgSEFWRV9IT1NUX0NQVV9GQU1JTFlfeDg2XzY0ICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoICAiYWRkCSU2LCAlcTJcblx0IgkJCQkJXAorCSAgICAgImFkYwklNCwgJXExXG5cdCIJCQkJCVwKKwkgICAgICJzYmIJJXEwLCAlcTAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoczEpLCAiPSZyIiAoczApCQkJCVwKKwkgICA6ICIxIiAgKChVREl0eXBlKShhMSkpLCAicm1lIiAoKFVESXR5cGUpKGIxKSksCQlcCisJICAgICAiJTIiICgoVURJdHlwZSkoYTApKSwgInJtZSIgKChVREl0eXBlKShiMCkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3NwYXJjX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgX19hc21fXyAoICAiYWRkY2MJJXI1LCAlNiwgJTJcblx0IgkJCQlcCisJICAgICAiYWRkeGNjCSVyMywgJTQsICUxXG5cdCIJCQkJXAorCSAgICAgInN1YngJJSVnMCwgJSVnMCwgJTAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkgICA6ICJySiIgKGFoKSwgInJJIiAoYmgpLCAiJXJKIiAoYWwpLCAickkiIChibCkJCVwKKwkgX19DTE9CQkVSX0NDKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX3NwYXJjX18pICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgX19hc21fXyAoICAiYWRkY2MJJXI1LCAlNiwgJTJcblx0IgkJCQlcCisJICAgICAiYWRkY2NjCSVyNywgJTgsICUlZzBcblx0IgkJCQlcCisJICAgICAiYWRkY2NjCSVyMywgJTQsICUxXG5cdCIJCQkJXAorCSAgICAgImNscgklMFxuXHQiCQkJCQkJXAorCSAgICAgIm1vdmNzCSUleGNjLCAtMSwgJTAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkgICA6ICJySiIgKGFoKSwgInJJIiAoYmgpLCAiJXJKIiAoYWwpLCAickkiIChibCksCQlcCisJICAgICAickoiICgoYWwpID4+IDMyKSwgInJJIiAoKGJsKSA+PiAzMikJCQlcCisJIF9fQ0xPQkJFUl9DQykKKyNpZiBfX1ZJU19fID49IDB4MzAwCisjdW5kZWYgYWRkX21zc2FhYWEKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBfX2FzbV9fICggICJhZGRjYwklcjUsICU2LCAlMlxuXHQiCQkJCVwKKwkgICAgICJhZGR4Y2NjCSVyMywgJTQsICUxXG5cdCIJCQkJXAorCSAgICAgImNscgklMFxuXHQiCQkJCQkJXAorCSAgICAgIm1vdmNzCSUleGNjLCAtMSwgJTAiCQkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkgICA6ICJySiIgKGFoKSwgInJJIiAoYmgpLCAiJXJKIiAoYWwpLCAickkiIChibCkJCVwKKwkgX19DTE9CQkVSX0NDKQorI2VuZGlmCisjZW5kaWYKKworI2lmIEhBVkVfSE9TVF9DUFVfRkFNSUxZX3Bvd2VycGMgJiYgIWRlZmluZWQgKF9MT05HX0xPTkdfTElNQikKKy8qIFRoaXMgd29ya3MgZmluZSBmb3IgMzItYml0IGFuZCA2NC1iaXQgbGltYnMsIGV4Y2VwdCBmb3IgNjQtYml0IGxpbWJzIHdpdGggYQorICAgcHJvY2Vzc29yIHJ1bm5pbmcgaW4gMzItYml0IG1vZGUsIHNpbmNlIHRoZSBjYXJyeSBmbGFnIHRoZW4gZ2V0cyB0aGUgMzItYml0CisgICBjYXJyeS4gICovCisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHMxLCBzMCwgYTEsIGEwLCBiMSwgYjApCQkJCVwKKyAgX19hc21fXyAoICAiYWRkJUk2YwklMiwgJTUsICU2XG5cdCIJCQkJCVwKKwkgICAgICJhZGRlCSUxLCAlMywgJTRcblx0IgkJCQkJXAorCSAgICAgInN1YmZlCSUwLCAlMCwgJTBcblx0IgkJCQkJXAorCSAgICAgIm5vcgklMCwgJTAsICUwIgkJCQkJXAorCSAgIDogIj1yIiAobSksICI9ciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAiciIgIChhMSksICJyIiAoYjEpLCAiJXIiIChhMCksICJySSIgKGIwKQkJCVwKKwkgICAgIF9fQ0xPQkJFUl9DQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19zMzkweF9fKSAmJiBXX1RZUEVfU0laRSA9PSA2NAorI2RlZmluZSBhZGRfbXNzYWFhYShtLCBzMSwgczAsIGExLCBhMCwgYjEsIGIwKQkJCQlcCisgIF9fYXNtX18gKCAgImFsZ3IJJTIsICU2XG5cdCIJCQkJCVwKKwkgICAgICJhbGNncgklMSwgJTRcblx0IgkJCQkJXAorCSAgICAgImxnaGkJJTAsIDBcblx0IgkJCQkJXAorCSAgICAgImFsY2dyCSUwLCAlMFxuXHQiCQkJCQlcCisJICAgICAibGNncgklMCwgJTAiCQkJCQkJXAorCSAgIDogIj1yIiAobSksICI9ciIgKHMxKSwgIj0mciIgKHMwKQkJCQlcCisJICAgOiAiMSIgICgoVURJdHlwZSkoYTEpKSwgInIiICgoVURJdHlwZSkoYjEpKSwJCQlcCisJICAgICAiJTIiICgoVURJdHlwZSkoYTApKSwgInIiICgoVURJdHlwZSkoYjApKSBfX0NMT0JCRVJfQ0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtX18pICYmICFkZWZpbmVkIChfX3RodW1iX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9tc3NhYWFhKG0sIHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgX19hc21fXyAoICAiYWRkcwklMiwgJTUsICU2XG5cdCIJCQkJCVwKKwkgICAgICJhZGNzCSUxLCAlMywgJTRcblx0IgkJCQkJXAorCSAgICAgIm1vdmNjCSUwLCAjMFxuXHQiCQkJCQlcCisJICAgICAibW92Y3MJJTAsICMtMSIJCQkJCVwKKwkgICA6ICI9ciIgKG0pLCAiPXIiIChzaCksICI9JnIiIChzbCkJCQkJXAorCSAgIDogInIiIChhaCksICJySSIgKGJoKSwgIiVyIiAoYWwpLCAickkiIChibCkgX19DTE9CQkVSX0NDKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FhcmNoNjRfXykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkJCQkJXAorICBfX2FzbV9fICggICJhZGRzCSUyLCAleDUsICU2XG5cdCIJCQkJXAorCSAgICAgImFkY3MJJTEsICV4MywgJXg0XG5cdCIJCQkJXAorCSAgICAgImNzaW52CSUwLCB4enIsIHh6ciwgY2Ncblx0IgkJCQlcCisJICAgOiAiPXIiIChtKSwgIj1yIiAoc2gpLCAiPSZyIiAoc2wpCQkJCVwKKwkgICA6ICJyWiIgKGFoKSwgInJaIiAoYmgpLCAiJXJaIiAoYWwpLCAickkiIChibCkgX19DTE9CQkVSX0NDKQorI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZCAoX19HTlVDX18pICovCisKKyNpZm5kZWYgYWRkX21zc2FhYWEKKyNkZWZpbmUgYWRkX21zc2FhYWEobSwgczEsIHMwLCBhMSwgYTAsIGIxLCBiMCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX3MwLCBfX3MxLCBfX2MwLCBfX2MxOwkJCQkJXAorICAgIF9fczAgPSAoYTApICsgKGIwKTsJCQkJCQkJXAorICAgIF9fczEgPSAoYTEpICsgKGIxKTsJCQkJCQkJXAorICAgIF9fYzAgPSBfX3MwIDwgKGEwKTsJCQkJCQkJXAorICAgIF9fYzEgPSBfX3MxIDwgKGExKTsJCQkJCQkJXAorICAgIChzMCkgPSBfX3MwOwkJCQkJCQlcCisgICAgX19zMSA9IF9fczEgKyBfX2MwOwkJCQkJCQlcCisgICAgKHMxKSA9IF9fczE7CQkJCQkJCVwKKyAgICAobSkgPSAtIChfX2MxICsgKF9fczEgPCBfX2MwKSk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIE1PRF8xXzFQX01FVEhPRCA9PSAxCit2b2lkCittcG5fbW9kXzFfMXBfY3BzIChtcF9saW1iX3QgY3BzWzRdLCBtcF9saW1iX3QgYikKK3sKKyAgbXBfbGltYl90IGJpOworICBtcF9saW1iX3QgQjFtb2RiLCBCMm1vZGI7CisgIGludCBjbnQ7CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBiKTsKKworICBiIDw8PSBjbnQ7CisgIGludmVydF9saW1iIChiaSwgYik7CisKKyAgY3BzWzBdID0gYmk7CisgIGNwc1sxXSA9IGNudDsKKworICBCMW1vZGIgPSAtYjsKKyAgaWYgKExJS0VMWSAoY250ICE9IDApKQorICAgIEIxbW9kYiAqPSAoKGJpID4+IChHTVBfTElNQl9CSVRTLWNudCkpIHwgKENOU1RfTElNQigxKSA8PCBjbnQpKTsKKyAgQVNTRVJUIChCMW1vZGIgPD0gYik7CQkvKiBOQjogbm90IGZ1bGx5IHJlZHVjZWQgbW9kIGIgKi8KKyAgY3BzWzJdID0gQjFtb2RiID4+IGNudDsKKworICAvKiBJbiB0aGUgbm9ybWFsaXplZCBjYXNlLCB0aGlzIGNhbiBiZSBzaW1wbGlmaWVkIHRvCisgICAqCisgICAqICAgQjJtb2RiID0gLSBiICogYmk7CisgICAqICAgQVNTRVJUIChCMm1vZGIgPD0gYik7ICAgIC8vIE5COiBlcXVhbGl0eSBpZmYgYiA9IEIvMgorICAgKi8KKyAgdWRpdl9ybm5kX3ByZWludiAoQjJtb2RiLCBCMW1vZGIsIENOU1RfTElNQigwKSwgYiwgYmkpOworICBjcHNbM10gPSBCMm1vZGIgPj4gY250OworfQorCittcF9saW1iX3QKK21wbl9tb2RfMV8xcCAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGIsIGNvbnN0IG1wX2xpbWJfdCBibW9kYls0XSkKK3sKKyAgbXBfbGltYl90IHJoLCBybCwgYmksIHBoLCBwbCwgcjsKKyAgbXBfbGltYl90IEIxbW9kYiwgQjJtb2RiOworICBtcF9zaXplX3QgaTsKKyAgaW50IGNudDsKKyAgbXBfbGltYl90IG1hc2s7CisKKyAgQVNTRVJUIChuID49IDIpOwkJLyogZml4IHR1bmV1cC5jIGlmIHRoaXMgaXMgY2hhbmdlZCAqLworCisgIEIxbW9kYiA9IGJtb2RiWzJdOworICBCMm1vZGIgPSBibW9kYlszXTsKKworICBybCA9IGFwW24gLSAxXTsKKyAgdW11bF9wcG1tIChwaCwgcGwsIHJsLCBCMW1vZGIpOworICBhZGRfc3NhYWFhIChyaCwgcmwsIHBoLCBwbCwgQ05TVF9MSU1CKDApLCBhcFtuIC0gMl0pOworCisgIGZvciAoaSA9IG4gLSAzOyBpID49IDA7IGkgLT0gMSkKKyAgICB7CisgICAgICAvKiByciA9IGFwW2ldCQkJCTwgQgorCSAgICArIExPKHJyKSAgKiAoQiBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBISShycikgICogKEJeMiBtb2QgYikJCTw9IChCLTEpKGItMSkKKyAgICAgICovCisgICAgICB1bXVsX3BwbW0gKHBoLCBwbCwgcmwsIEIxbW9kYik7CisgICAgICBhZGRfc3NhYWFhIChwaCwgcGwsIHBoLCBwbCwgQ05TVF9MSU1CKDApLCBhcFtpXSk7CisKKyAgICAgIHVtdWxfcHBtbSAocmgsIHJsLCByaCwgQjJtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHJoLCBybCwgcmgsIHJsLCBwaCwgcGwpOworICAgIH0KKworICBjbnQgPSBibW9kYlsxXTsKKyAgYmkgPSBibW9kYlswXTsKKworICBpZiAoTElLRUxZIChjbnQgIT0gMCkpCisgICAgcmggPSAocmggPDwgY250KSB8IChybCA+PiAoR01QX0xJTUJfQklUUyAtIGNudCkpOworCisgIG1hc2sgPSAtKG1wX2xpbWJfdCkgKHJoID49IGIpOworICByaCAtPSBtYXNrICYgYjsKKworICB1ZGl2X3JubmRfcHJlaW52IChyLCByaCwgcmwgPDwgY250LCBiLCBiaSk7CisKKyAgcmV0dXJuIHIgPj4gY250OworfQorI2VuZGlmIC8qIE1PRF8xXzFQX01FVEhPRCA9PSAxICovCisKKyNpZiBNT0RfMV8xUF9NRVRIT0QgPT0gMgordm9pZAorbXBuX21vZF8xXzFwX2NwcyAobXBfbGltYl90IGNwc1s0XSwgbXBfbGltYl90IGIpCit7CisgIG1wX2xpbWJfdCBiaTsKKyAgbXBfbGltYl90IEIybW9kYjsKKyAgaW50IGNudDsKKworICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQsIGIpOworCisgIGIgPDw9IGNudDsKKyAgaW52ZXJ0X2xpbWIgKGJpLCBiKTsKKworICBjcHNbMF0gPSBiaTsKKyAgY3BzWzFdID0gY250OworCisgIGlmIChMSUtFTFkgKGNudCAhPSAwKSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgQjFtb2RiID0gLWI7CisgICAgICBCMW1vZGIgKj0gKChiaSA+PiAoR01QX0xJTUJfQklUUy1jbnQpKSB8IChDTlNUX0xJTUIoMSkgPDwgY250KSk7CisgICAgICBBU1NFUlQgKEIxbW9kYiA8PSBiKTsJCS8qIE5COiBub3QgZnVsbHkgcmVkdWNlZCBtb2QgYiAqLworICAgICAgY3BzWzJdID0gQjFtb2RiID4+IGNudDsKKyAgICB9CisgIEIybW9kYiA9IC0gYiAqIGJpOworICBBU1NFUlQgKEIybW9kYiA8PSBiKTsgICAgLy8gTkI6IGVxdWFsaXR5IGlmZiBiID0gQi8yCisgIGNwc1szXSA9IEIybW9kYjsKK30KKworbXBfbGltYl90CittcG5fbW9kXzFfMXAgKG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiLCBjb25zdCBtcF9saW1iX3QgYm1vZGJbNF0pCit7CisgIGludCBjbnQ7CisgIG1wX2xpbWJfdCBiaSwgQjFtb2RiOworICBtcF9saW1iX3QgcjAsIHIxOworICBtcF9saW1iX3QgcjsKKworICBBU1NFUlQgKG4gPj0gMik7CQkvKiBmaXggdHVuZXVwLmMgaWYgdGhpcyBpcyBjaGFuZ2VkICovCisKKyAgcjAgPSBhcFtuLTJdOworICByMSA9IGFwW24tMV07CisKKyAgaWYgKG4gPiAyKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBCMm1vZGIsIEIybWI7CisgICAgICBtcF9saW1iX3QgcDAsIHAxOworICAgICAgbXBfbGltYl90IHIyOworICAgICAgbXBfc2l6ZV90IGo7CisKKyAgICAgIEIybW9kYiA9IGJtb2RiWzNdOworICAgICAgQjJtYiA9IEIybW9kYiAtIGI7CisKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCByMSwgQjJtb2RiKTsKKyAgICAgIGFkZF9tc3NhYWFhIChyMiwgcjEsIHIwLCByMCwgYXBbbi0zXSwgcDEsIHAwKTsKKworICAgICAgZm9yIChqID0gbi00OyBqID49IDA7IGotLSkKKwl7CisJICBtcF9saW1iX3QgY3k7CisJICAvKiBtcF9saW1iX3QgdCA9IHIwICsgQjJtYjsgKi8KKwkgIHVtdWxfcHBtbSAocDEsIHAwLCByMSwgQjJtb2RiKTsKKworCSAgQUREQ19MSU1CIChjeSwgcjAsIHIwLCByMiAmIEIybW9kYik7CisJICAvKiBBbHRlcm5hdGl2ZSwgZm9yIGNtb3Y6IGlmIChjeSkgcjAgPSB0OyAqLworCSAgcjAgLT0gKC1jeSkgJiBiOworCSAgYWRkX21zc2FhYWEgKHIyLCByMSwgcjAsIHIwLCBhcFtqXSwgcDEsIHAwKTsKKwl9CisKKyAgICAgIHIxIC09IChyMiAmIGIpOworICAgIH0KKworICBjbnQgPSBibW9kYlsxXTsKKworICBpZiAoTElLRUxZIChjbnQgIT0gMCkpCisgICAgeworICAgICAgbXBfbGltYl90IHQ7CisgICAgICBtcF9saW1iX3QgQjFtb2RiID0gYm1vZGJbMl07CisKKyAgICAgIHVtdWxfcHBtbSAocjEsIHQsIHIxLCBCMW1vZGIpOworICAgICAgcjAgKz0gdDsKKyAgICAgIHIxICs9IChyMCA8IHQpOworCisgICAgICAvKiBOb3JtYWxpemUgKi8KKyAgICAgIHIxID0gKHIxIDw8IGNudCkgfCAocjAgPj4gKEdNUF9MSU1CX0JJVFMgLSBjbnQpKTsKKyAgICAgIHIwIDw8PSBjbnQ7CisKKyAgICAgIC8qIE5PVEU6IE1pZ2h0IGdldCByMSA9PSBiIGhlcmUsIGJ1dCB1ZGl2X3JubmRfcHJlaW52IGFsbG93cyB0aGF0LiAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBtYXNrID0gLShtcF9saW1iX3QpIChyMSA+PSBiKTsKKyAgICAgIHIxIC09IG1hc2sgJiBiOworICAgIH0KKworICBiaSA9IGJtb2RiWzBdOworCisgIHVkaXZfcm5uZF9wcmVpbnYgKHIsIHIxLCByMCwgYiwgYmkpOworICByZXR1cm4gciA+PiBjbnQ7Cit9CisjZW5kaWYgLyogTU9EXzFfMVBfTUVUSE9EID09IDIgKi8KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL21vZF8xXzIuYyBiL21wbi9nZW5lcmljL21vZF8xXzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBkMTllCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbW9kXzFfMi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBtcG5fbW9kXzFzXzJwIChhcCwgbiwgYiwgY3BzKQorICAgRGl2aWRlIChhcCwsbikgYnkgYi4gIFJldHVybiB0aGUgc2luZ2xlLWxpbWIgcmVtYWluZGVyLgorICAgUmVxdWlyZXMgdGhhdCBiIDwgQiAvIDIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKyAgIEJhc2VkIG9uIGEgc3VnZ2VzdGlvbiBieSBQZXRlciBMLiBNb250Z29tZXJ5LgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKwordm9pZAorbXBuX21vZF8xc18ycF9jcHMgKG1wX2xpbWJfdCBjcHNbNV0sIG1wX2xpbWJfdCBiKQoreworICBtcF9saW1iX3QgYmk7CisgIG1wX2xpbWJfdCBCMW1vZGIsIEIybW9kYiwgQjNtb2RiOworICBpbnQgY250OworCisgIEFTU0VSVCAoYiA8PSAofihtcF9saW1iX3QpIDApIC8gMik7CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBiKTsKKworICBiIDw8PSBjbnQ7CisgIGludmVydF9saW1iIChiaSwgYik7CisKKyAgY3BzWzBdID0gYmk7CisgIGNwc1sxXSA9IGNudDsKKworICBCMW1vZGIgPSAtYiAqICgoYmkgPj4gKEdNUF9MSU1CX0JJVFMtY250KSkgfCAoQ05TVF9MSU1CKDEpIDw8IGNudCkpOworICBBU1NFUlQgKEIxbW9kYiA8PSBiKTsJCS8qIE5COiBub3QgZnVsbHkgcmVkdWNlZCBtb2QgYiAqLworICBjcHNbMl0gPSBCMW1vZGIgPj4gY250OworCisgIHVkaXZfcm5uZF9wcmVpbnYgKEIybW9kYiwgQjFtb2RiLCBDTlNUX0xJTUIoMCksIGIsIGJpKTsKKyAgY3BzWzNdID0gQjJtb2RiID4+IGNudDsKKworICB1ZGl2X3JubmRfcHJlaW52IChCM21vZGIsIEIybW9kYiwgQ05TVF9MSU1CKDApLCBiLCBiaSk7CisgIGNwc1s0XSA9IEIzbW9kYiA+PiBjbnQ7CisKKyNpZiBXQU5UX0FTU0VSVAorICB7CisgICAgaW50IGk7CisgICAgYiA9IGNwc1syXTsKKyAgICBmb3IgKGkgPSAzOyBpIDw9IDQ7IGkrKykKKyAgICAgIHsKKwliICs9IGNwc1tpXTsKKwlBU1NFUlQgKGIgPj0gY3BzW2ldKTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCit9CisKK21wX2xpbWJfdAorbXBuX21vZF8xc18ycCAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGIsIGNvbnN0IG1wX2xpbWJfdCBjcHNbNV0pCit7CisgIG1wX2xpbWJfdCByaCwgcmwsIGJpLCBwaCwgcGwsIGNoLCBjbCwgcjsKKyAgbXBfbGltYl90IEIxbW9kYiwgQjJtb2RiLCBCM21vZGI7CisgIG1wX3NpemVfdCBpOworICBpbnQgY250OworCisgIEFTU0VSVCAobiA+PSAxKTsKKworICBCMW1vZGIgPSBjcHNbMl07CisgIEIybW9kYiA9IGNwc1szXTsKKyAgQjNtb2RiID0gY3BzWzRdOworCisgIGlmICgobiAmIDEpICE9IDApCisgICAgeworICAgICAgaWYgKG4gPT0gMSkKKwl7CisJICBybCA9IGFwW24gLSAxXTsKKwkgIGJpID0gY3BzWzBdOworCSAgY250ID0gY3BzWzFdOworCSAgdWRpdl9ybm5kX3ByZWludiAociwgcmwgPj4gKEdNUF9MSU1CX0JJVFMgLSBjbnQpLAorCQkJICAgICBybCA8PCBjbnQsIGIsIGJpKTsKKwkgIHJldHVybiByID4+IGNudDsKKwl9CisKKyAgICAgIHVtdWxfcHBtbSAocGgsIHBsLCBhcFtuIC0gMl0sIEIxbW9kYik7CisgICAgICBhZGRfc3NhYWFhIChwaCwgcGwsIHBoLCBwbCwgQ05TVF9MSU1CKDApLCBhcFtuIC0gM10pOworICAgICAgdW11bF9wcG1tIChyaCwgcmwsIGFwW24gLSAxXSwgQjJtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHJoLCBybCwgcmgsIHJsLCBwaCwgcGwpOworICAgICAgbi0tOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJoID0gYXBbbiAtIDFdOworICAgICAgcmwgPSBhcFtuIC0gMl07CisgICAgfQorCisgIGZvciAoaSA9IG4gLSA0OyBpID49IDA7IGkgLT0gMikKKyAgICB7CisgICAgICAvKiByciA9IGFwW2ldCQkJCTwgQgorCSAgICArIGFwW2krMV0gKiAoQiBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBMTyhycikgICogKEJeMiBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBISShycikgICogKEJeMyBtb2QgYikJCTw9IChCLTEpKGItMSkKKyAgICAgICovCisgICAgICB1bXVsX3BwbW0gKHBoLCBwbCwgYXBbaSArIDFdLCBCMW1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIENOU1RfTElNQigwKSwgYXBbaSArIDBdKTsKKworICAgICAgdW11bF9wcG1tIChjaCwgY2wsIHJsLCBCMm1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIGNoLCBjbCk7CisKKyAgICAgIHVtdWxfcHBtbSAocmgsIHJsLCByaCwgQjNtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHJoLCBybCwgcmgsIHJsLCBwaCwgcGwpOworICAgIH0KKworICB1bXVsX3BwbW0gKHJoLCBjbCwgcmgsIEIxbW9kYik7CisgIGFkZF9zc2FhYWEgKHJoLCBybCwgcmgsIHJsLCBDTlNUX0xJTUIoMCksIGNsKTsKKworICBjbnQgPSBjcHNbMV07CisgIGJpID0gY3BzWzBdOworCisgIHIgPSAocmggPDwgY250KSB8IChybCA+PiAoR01QX0xJTUJfQklUUyAtIGNudCkpOworICB1ZGl2X3JubmRfcHJlaW52IChyLCByLCBybCA8PCBjbnQsIGIsIGJpKTsKKworICByZXR1cm4gciA+PiBjbnQ7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tb2RfMV8zLmMgYi9tcG4vZ2VuZXJpYy9tb2RfMV8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhOTA4ZAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL21vZF8xXzMuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogbXBuX21vZF8xc18zcCAoYXAsIG4sIGIsIGNwcykKKyAgIERpdmlkZSAoYXAsLG4pIGJ5IGIuICBSZXR1cm4gdGhlIHNpbmdsZS1saW1iIHJlbWFpbmRlci4KKyAgIFJlcXVpcmVzIHRoYXQgYiA8IEIgLyAzLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisgICBCYXNlZCBvbiBhIHN1Z2dlc3Rpb24gYnkgUGV0ZXIgTC4gTW9udGdvbWVyeS4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA4LTIwMTAsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK3ZvaWQKK21wbl9tb2RfMXNfM3BfY3BzIChtcF9saW1iX3QgY3BzWzZdLCBtcF9saW1iX3QgYikKK3sKKyAgbXBfbGltYl90IGJpOworICBtcF9saW1iX3QgQjFtb2RiLCBCMm1vZGIsIEIzbW9kYiwgQjRtb2RiOworICBpbnQgY250OworCisgIEFTU0VSVCAoYiA8PSAofihtcF9saW1iX3QpIDApIC8gMyk7CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBiKTsKKworICBiIDw8PSBjbnQ7CisgIGludmVydF9saW1iIChiaSwgYik7CisKKyAgY3BzWzBdID0gYmk7CisgIGNwc1sxXSA9IGNudDsKKworICBCMW1vZGIgPSAtYiAqICgoYmkgPj4gKEdNUF9MSU1CX0JJVFMtY250KSkgfCAoQ05TVF9MSU1CKDEpIDw8IGNudCkpOworICBBU1NFUlQgKEIxbW9kYiA8PSBiKTsJCS8qIE5COiBub3QgZnVsbHkgcmVkdWNlZCBtb2QgYiAqLworICBjcHNbMl0gPSBCMW1vZGIgPj4gY250OworCisgIHVkaXZfcm5uZF9wcmVpbnYgKEIybW9kYiwgQjFtb2RiLCBDTlNUX0xJTUIoMCksIGIsIGJpKTsKKyAgY3BzWzNdID0gQjJtb2RiID4+IGNudDsKKworICB1ZGl2X3JubmRfcHJlaW52IChCM21vZGIsIEIybW9kYiwgQ05TVF9MSU1CKDApLCBiLCBiaSk7CisgIGNwc1s0XSA9IEIzbW9kYiA+PiBjbnQ7CisKKyAgdWRpdl9ybm5kX3ByZWludiAoQjRtb2RiLCBCM21vZGIsIENOU1RfTElNQigwKSwgYiwgYmkpOworICBjcHNbNV0gPSBCNG1vZGIgPj4gY250OworCisjaWYgV0FOVF9BU1NFUlQKKyAgeworICAgIGludCBpOworICAgIGIgPSBjcHNbMl07CisgICAgZm9yIChpID0gMzsgaSA8PSA1OyBpKyspCisgICAgICB7CisJYiArPSBjcHNbaV07CisJQVNTRVJUIChiID49IGNwc1tpXSk7CisgICAgICB9CisgIH0KKyNlbmRpZgorfQorCittcF9saW1iX3QKK21wbl9tb2RfMXNfM3AgKG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiLCBjb25zdCBtcF9saW1iX3QgY3BzWzZdKQoreworICBtcF9saW1iX3QgcmgsIHJsLCBiaSwgcGgsIHBsLCBjaCwgY2wsIHI7CisgIG1wX2xpbWJfdCBCMW1vZGIsIEIybW9kYiwgQjNtb2RiLCBCNG1vZGI7CisgIG1wX3NpemVfdCBpOworICBpbnQgY250OworCisgIEFTU0VSVCAobiA+PSAxKTsKKworICBCMW1vZGIgPSBjcHNbMl07CisgIEIybW9kYiA9IGNwc1szXTsKKyAgQjNtb2RiID0gY3BzWzRdOworICBCNG1vZGIgPSBjcHNbNV07CisKKyAgLyogV2UgY29tcHV0ZSBuIG1vZCAzIGluIGEgdHJpY2t5IHdheSwgd2hpY2ggd29ya3MgZXhjZXB0IGZvciB3aGVuIG4gaXMgc28KKyAgICAgY2xvc2UgdG8gdGhlIG1heGltdW0gc2l6ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBpdC4gIFRoZSBmaW5hbAorICAgICBjYXN0IHRvIGludCBpcyBhIHdvcmthcm91bmQgZm9yIEhQIGNjLiAgKi8KKyAgc3dpdGNoICgoaW50KSAoKG1wX2xpbWJfdCkgbiAqIE1PRExJTUJfSU5WRVJTRV8zID4+IChHTVBfTlVNQl9CSVRTIC0gMikpKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICB1bXVsX3BwbW0gKHBoLCBwbCwgYXBbbiAtIDJdLCBCMW1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIENOU1RfTElNQigwKSwgYXBbbiAtIDNdKTsKKyAgICAgIHVtdWxfcHBtbSAocmgsIHJsLCBhcFtuIC0gMV0sIEIybW9kYik7CisgICAgICBhZGRfc3NhYWFhIChyaCwgcmwsIHJoLCBybCwgcGgsIHBsKTsKKyAgICAgIG4gLT0gMzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CS8qIG4gbW9kIDMgPSAxOyAoY2FzZSAyKSovCisgICAgICByaCA9IDA7CisgICAgICBybCA9IGFwWy0tbl07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CS8qIG4gbW9kIDMgPSAyICovCisgICAgICByaCA9IGFwW24gLSAxXTsKKyAgICAgIHJsID0gYXBbbiAtIDJdOworICAgICAgbiAtPSAyOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGZvciAoaSA9IG4gLSAzOyBpID49IDA7IGkgLT0gMykKKyAgICB7CisgICAgICAvKiByciA9IGFwW2ldCQkJCTwgQgorCSAgICArIGFwW2krMV0gKiAoQiBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBhcFtpKzJdICogKEJeMiBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBMTyhycikgICogKEJeMyBtb2QgYikJCTw9IChCLTEpKGItMSkKKwkgICAgKyBISShycikgICogKEJeNCBtb2QgYikJCTw9IChCLTEpKGItMSkKKyAgICAgICovCisgICAgICB1bXVsX3BwbW0gKHBoLCBwbCwgYXBbaSArIDFdLCBCMW1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIENOU1RfTElNQigwKSwgYXBbaSArIDBdKTsKKworICAgICAgdW11bF9wcG1tIChjaCwgY2wsIGFwW2kgKyAyXSwgQjJtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHBoLCBwbCwgcGgsIHBsLCBjaCwgY2wpOworCisgICAgICB1bXVsX3BwbW0gKGNoLCBjbCwgcmwsIEIzbW9kYik7CisgICAgICBhZGRfc3NhYWFhIChwaCwgcGwsIHBoLCBwbCwgY2gsIGNsKTsKKworICAgICAgdW11bF9wcG1tIChyaCwgcmwsIHJoLCBCNG1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocmgsIHJsLCByaCwgcmwsIHBoLCBwbCk7CisgICAgfQorCisgIHVtdWxfcHBtbSAocmgsIGNsLCByaCwgQjFtb2RiKTsKKyAgYWRkX3NzYWFhYSAocmgsIHJsLCByaCwgcmwsIENOU1RfTElNQigwKSwgY2wpOworCisgIGNudCA9IGNwc1sxXTsKKyAgYmkgPSBjcHNbMF07CisKKyAgciA9IChyaCA8PCBjbnQpIHwgKHJsID4+IChHTVBfTElNQl9CSVRTIC0gY250KSk7CisgIHVkaXZfcm5uZF9wcmVpbnYgKHIsIHIsIHJsIDw8IGNudCwgYiwgYmkpOworCisgIHJldHVybiByID4+IGNudDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL21vZF8xXzQuYyBiL21wbi9nZW5lcmljL21vZF8xXzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI0MmJhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbW9kXzFfNC5jCkBAIC0wLDAgKzEsMTcwIEBACisvKiBtcG5fbW9kXzFzXzRwIChhcCwgbiwgYiwgY3BzKQorICAgRGl2aWRlIChhcCwsbikgYnkgYi4gIFJldHVybiB0aGUgc2luZ2xlLWxpbWIgcmVtYWluZGVyLgorICAgUmVxdWlyZXMgdGhhdCBiIDwgQiAvIDQuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKyAgIEJhc2VkIG9uIGEgc3VnZ2VzdGlvbiBieSBQZXRlciBMLiBNb250Z29tZXJ5LgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKwordm9pZAorbXBuX21vZF8xc180cF9jcHMgKG1wX2xpbWJfdCBjcHNbN10sIG1wX2xpbWJfdCBiKQoreworICBtcF9saW1iX3QgYmk7CisgIG1wX2xpbWJfdCBCMW1vZGIsIEIybW9kYiwgQjNtb2RiLCBCNG1vZGIsIEI1bW9kYjsKKyAgaW50IGNudDsKKworICBBU1NFUlQgKGIgPD0gKH4obXBfbGltYl90KSAwKSAvIDQpOworCisgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgYik7CisKKyAgYiA8PD0gY250OworICBpbnZlcnRfbGltYiAoYmksIGIpOworCisgIGNwc1swXSA9IGJpOworICBjcHNbMV0gPSBjbnQ7CisKKyAgQjFtb2RiID0gLWIgKiAoKGJpID4+IChHTVBfTElNQl9CSVRTLWNudCkpIHwgKENOU1RfTElNQigxKSA8PCBjbnQpKTsKKyAgQVNTRVJUIChCMW1vZGIgPD0gYik7CQkvKiBOQjogbm90IGZ1bGx5IHJlZHVjZWQgbW9kIGIgKi8KKyAgY3BzWzJdID0gQjFtb2RiID4+IGNudDsKKworICB1ZGl2X3JubmRfcHJlaW52IChCMm1vZGIsIEIxbW9kYiwgQ05TVF9MSU1CKDApLCBiLCBiaSk7CisgIGNwc1szXSA9IEIybW9kYiA+PiBjbnQ7CisKKyAgdWRpdl9ybm5kX3ByZWludiAoQjNtb2RiLCBCMm1vZGIsIENOU1RfTElNQigwKSwgYiwgYmkpOworICBjcHNbNF0gPSBCM21vZGIgPj4gY250OworCisgIHVkaXZfcm5uZF9wcmVpbnYgKEI0bW9kYiwgQjNtb2RiLCBDTlNUX0xJTUIoMCksIGIsIGJpKTsKKyAgY3BzWzVdID0gQjRtb2RiID4+IGNudDsKKworICB1ZGl2X3JubmRfcHJlaW52IChCNW1vZGIsIEI0bW9kYiwgQ05TVF9MSU1CKDApLCBiLCBiaSk7CisgIGNwc1s2XSA9IEI1bW9kYiA+PiBjbnQ7CisKKyNpZiBXQU5UX0FTU0VSVAorICB7CisgICAgaW50IGk7CisgICAgYiA9IGNwc1syXTsKKyAgICBmb3IgKGkgPSAzOyBpIDw9IDY7IGkrKykKKyAgICAgIHsKKwliICs9IGNwc1tpXTsKKwlBU1NFUlQgKGIgPj0gY3BzW2ldKTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCit9CisKK21wX2xpbWJfdAorbXBuX21vZF8xc180cCAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGIsIGNvbnN0IG1wX2xpbWJfdCBjcHNbN10pCit7CisgIG1wX2xpbWJfdCByaCwgcmwsIGJpLCBwaCwgcGwsIGNoLCBjbCwgcjsKKyAgbXBfbGltYl90IEIxbW9kYiwgQjJtb2RiLCBCM21vZGIsIEI0bW9kYiwgQjVtb2RiOworICBtcF9zaXplX3QgaTsKKyAgaW50IGNudDsKKworICBBU1NFUlQgKG4gPj0gMSk7CisKKyAgQjFtb2RiID0gY3BzWzJdOworICBCMm1vZGIgPSBjcHNbM107CisgIEIzbW9kYiA9IGNwc1s0XTsKKyAgQjRtb2RiID0gY3BzWzVdOworICBCNW1vZGIgPSBjcHNbNl07CisKKyAgc3dpdGNoIChuICYgMykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgdW11bF9wcG1tIChwaCwgcGwsIGFwW24gLSAzXSwgQjFtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHBoLCBwbCwgcGgsIHBsLCBDTlNUX0xJTUIoMCksIGFwW24gLSA0XSk7CisgICAgICB1bXVsX3BwbW0gKGNoLCBjbCwgYXBbbiAtIDJdLCBCMm1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIGNoLCBjbCk7CisgICAgICB1bXVsX3BwbW0gKHJoLCBybCwgYXBbbiAtIDFdLCBCM21vZGIpOworICAgICAgYWRkX3NzYWFhYSAocmgsIHJsLCByaCwgcmwsIHBoLCBwbCk7CisgICAgICBuIC09IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICByaCA9IDA7CisgICAgICBybCA9IGFwW24gLSAxXTsKKyAgICAgIG4gLT0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHJoID0gYXBbbiAtIDFdOworICAgICAgcmwgPSBhcFtuIC0gMl07CisgICAgICBuIC09IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB1bXVsX3BwbW0gKHBoLCBwbCwgYXBbbiAtIDJdLCBCMW1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocGgsIHBsLCBwaCwgcGwsIENOU1RfTElNQigwKSwgYXBbbiAtIDNdKTsKKyAgICAgIHVtdWxfcHBtbSAocmgsIHJsLCBhcFtuIC0gMV0sIEIybW9kYik7CisgICAgICBhZGRfc3NhYWFhIChyaCwgcmwsIHJoLCBybCwgcGgsIHBsKTsKKyAgICAgIG4gLT0gMzsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmb3IgKGkgPSBuIC0gNDsgaSA+PSAwOyBpIC09IDQpCisgICAgeworICAgICAgLyogcnIgPSBhcFtpXQkJCQk8IEIKKwkgICAgKyBhcFtpKzFdICogKEIgbW9kIGIpCQk8PSAoQi0xKShiLTEpCisJICAgICsgYXBbaSsyXSAqIChCXjIgbW9kIGIpCQk8PSAoQi0xKShiLTEpCisJICAgICsgYXBbaSszXSAqIChCXjMgbW9kIGIpCQk8PSAoQi0xKShiLTEpCisJICAgICsgTE8ocnIpICAqIChCXjQgbW9kIGIpCQk8PSAoQi0xKShiLTEpCisJICAgICsgSEkocnIpICAqIChCXjUgbW9kIGIpCQk8PSAoQi0xKShiLTEpCisgICAgICAqLworICAgICAgdW11bF9wcG1tIChwaCwgcGwsIGFwW2kgKyAxXSwgQjFtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHBoLCBwbCwgcGgsIHBsLCBDTlNUX0xJTUIoMCksIGFwW2kgKyAwXSk7CisKKyAgICAgIHVtdWxfcHBtbSAoY2gsIGNsLCBhcFtpICsgMl0sIEIybW9kYik7CisgICAgICBhZGRfc3NhYWFhIChwaCwgcGwsIHBoLCBwbCwgY2gsIGNsKTsKKworICAgICAgdW11bF9wcG1tIChjaCwgY2wsIGFwW2kgKyAzXSwgQjNtb2RiKTsKKyAgICAgIGFkZF9zc2FhYWEgKHBoLCBwbCwgcGgsIHBsLCBjaCwgY2wpOworCisgICAgICB1bXVsX3BwbW0gKGNoLCBjbCwgcmwsIEI0bW9kYik7CisgICAgICBhZGRfc3NhYWFhIChwaCwgcGwsIHBoLCBwbCwgY2gsIGNsKTsKKworICAgICAgdW11bF9wcG1tIChyaCwgcmwsIHJoLCBCNW1vZGIpOworICAgICAgYWRkX3NzYWFhYSAocmgsIHJsLCByaCwgcmwsIHBoLCBwbCk7CisgICAgfQorCisgIHVtdWxfcHBtbSAocmgsIGNsLCByaCwgQjFtb2RiKTsKKyAgYWRkX3NzYWFhYSAocmgsIHJsLCByaCwgcmwsIENOU1RfTElNQigwKSwgY2wpOworCisgIGNudCA9IGNwc1sxXTsKKyAgYmkgPSBjcHNbMF07CisKKyAgciA9IChyaCA8PCBjbnQpIHwgKHJsID4+IChHTVBfTElNQl9CSVRTIC0gY250KSk7CisgIHVkaXZfcm5uZF9wcmVpbnYgKHIsIHIsIHJsIDw8IGNudCwgYiwgYmkpOworCisgIHJldHVybiByID4+IGNudDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL21vZF8zNGxzdWIxLmMgYi9tcG4vZ2VuZXJpYy9tb2RfMzRsc3ViMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWM2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tb2RfMzRsc3ViMS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBtcG5fbW9kXzM0bHN1YjEgLS0gcmVtYWluZGVyIG1vZHVsbyAyXihHTVBfTlVNQl9CSVRTKjMvNCktMS4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQ2FsY3VsYXRlIGEgcmVtYWluZGVyIGZyb20ge3Asbn0gZGl2aWRlZCBieSAyXihHTVBfTlVNQl9CSVRTKjMvNCktMS4KKyAgIFRoZSByZW1haW5kZXIgaXMgbm90IGZ1bGx5IHJlZHVjZWQsIGl0J3MgYW55IGxpbWIgdmFsdWUgY29uZ3J1ZW50IHRvCisgICB7cCxufSBtb2R1bG8gdGhhdCBkaXZpc29yLgorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG9ubHkgY29ycmVjdCB3aGVuIEdNUF9OVU1CX0JJVFMgaXMgYSBtdWx0aXBsZSBvZgorICAgNC4KKworICAgRklYTUU6IElmIEdNUF9OQUlMX0JJVFMgaXMgc29tZSBzaWxseSBiaWcgdmFsdWUgZHVyaW5nIGRldmVsb3BtZW50IHRoZW4KKyAgIGl0J3MgcG9zc2libGUgdGhlIGNhcnJ5IGFjY3VtdWxhdG9ycyBjMCxjMSxjMiBjb3VsZCBvdmVyZmxvdy4KKworICAgR2VuZXJhbCBub3RlczoKKworICAgVGhlIGJhc2ljIGlkZWEgaXMgdG8gdXNlIGEgc2V0IG9mIE4gYWNjdW11bGF0b3JzIChOPTMgaW4gdGhpcyBjYXNlKSB0bworICAgZWZmZWN0aXZlbHkgZ2V0IGEgcmVtYWluZGVyIG1vZCAyXihHTVBfTlVNQl9CSVRTKk4pLTEgZm9sbG93ZWQgYXQgdGhlIGVuZAorICAgYnkgYSByZWR1Y3Rpb24gdG8gR01QX05VTUJfQklUUypOL00gYml0cyAoTT00IGluIHRoaXMgY2FzZSkgZm9yIGEKKyAgIHJlbWFpbmRlciBtb2QgMl4oR01QX05VTUJfQklUUypOL00pLTEuICBOIGFuZCBNIGFyZSBjaG9zZW4gdG8gZ2l2ZSBhIGdvb2QKKyAgIHNldCBvZiBzbWFsbCBwcmltZSBmYWN0b3JzIGluIDJeKEdNUF9OVU1CX0JJVFMqTi9NKS0xLgorCisgICBOPTMgTT00IHN1aXRzIEdNUF9OVU1CX0JJVFM9PTMyIGFuZCBHTVBfTlVNQl9CSVRTPT02NCBxdWl0ZSB3ZWxsLCBnaXZpbmcKKyAgIGEgZmV3IG1vcmUgcHJpbWVzIHRoYW4gYSBzaW5nbGUgYWNjdW11bGF0b3IgTj0xIGRvZXMsIGFuZCBmb3Igbm8gZXh0cmEKKyAgIGNvc3QgKGFzc3VtaW5nIHRoZSBwcm9jZXNzb3IgaGFzIGEgZGVjZW50IG51bWJlciBvZiByZWdpc3RlcnMpLgorCisgICBGb3Igc3RyYW5nZSBuYWlsaWZpZWQgdmFsdWVzIG9mIEdNUF9OVU1CX0JJVFMgdGhlIGlkZWEgd291bGQgYmUgdG8gbG9vaworICAgZm9yIHdoYXQgTiBhbmQgTSBnaXZlIGdvb2QgcHJpbWVzLiAgV2l0aCBHTVBfTlVNQl9CSVRTIG5vdCBhIHBvd2VyIG9mIDIKKyAgIHRoZSBjaG9pY2VzIGZvciBNIG1heSBiZSBvcGVuZWQgdXAgYSBiaXQuICBCdXQgc3VjaCB0aGluZ3MgYXJlIHByb2JhYmx5CisgICBiZXN0IGRvbmUgaW4gc2VwYXJhdGUgY29kZSwgbm90IGdyYWZ0ZWQgb24gaGVyZS4gICovCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgNCA9PSAwCisKKyNkZWZpbmUgQjEgIChHTVBfTlVNQl9CSVRTIC8gNCkKKyNkZWZpbmUgQjIgIChCMSAqIDIpCisjZGVmaW5lIEIzICAoQjEgKiAzKQorCisjZGVmaW5lIE0xICAoKENOU1RfTElNQigxKSA8PCBCMSkgLSAxKQorI2RlZmluZSBNMiAgKChDTlNUX0xJTUIoMSkgPDwgQjIpIC0gMSkKKyNkZWZpbmUgTTMgICgoQ05TVF9MSU1CKDEpIDw8IEIzKSAtIDEpCisKKyNkZWZpbmUgTE9XMChuKSAgICAgICgobikgJiBNMykKKyNkZWZpbmUgSElHSDAobikgICAgICgobikgPj4gQjMpCisKKyNkZWZpbmUgTE9XMShuKSAgICAgICgoKG4pICYgTTIpIDw8IEIxKQorI2RlZmluZSBISUdIMShuKSAgICAgKChuKSA+PiBCMikKKworI2RlZmluZSBMT1cyKG4pICAgICAgKCgobikgJiBNMSkgPDwgQjIpCisjZGVmaW5lIEhJR0gyKG4pICAgICAoKG4pID4+IEIxKQorCisjZGVmaW5lIFBBUlRTMChuKSAgICAoTE9XMChuKSArIEhJR0gwKG4pKQorI2RlZmluZSBQQVJUUzEobikgICAgKExPVzEobikgKyBISUdIMShuKSkKKyNkZWZpbmUgUEFSVFMyKG4pICAgIChMT1cyKG4pICsgSElHSDIobikpCisKKyNkZWZpbmUgQUREKGMsYSx2YWwpICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgbmV3X2M7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBBRERDX0xJTUIgKG5ld19jLCBhLCBhLCB2YWwpOyAgICAgICBcCisgICAgKGMpICs9IG5ld19jOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCittcF9saW1iX3QKK21wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyIHAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgIGMwLCBjMSwgYzI7CisgIG1wX2xpbWJfdCAgYTAsIGExLCBhMjsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAobi8zIDwgR01QX05VTUJfTUFYKTsKKworICBhMCA9IGExID0gYTIgPSAwOworICBjMCA9IGMxID0gYzIgPSAwOworCisgIHdoaWxlICgobiAtPSAzKSA+PSAwKQorICAgIHsKKyAgICAgIEFERCAoYzAsIGEwLCBwWzBdKTsKKyAgICAgIEFERCAoYzEsIGExLCBwWzFdKTsKKyAgICAgIEFERCAoYzIsIGEyLCBwWzJdKTsKKyAgICAgIHAgKz0gMzsKKyAgICB9CisKKyAgaWYgKG4gIT0gLTMpCisgICAgeworICAgICAgQUREIChjMCwgYTAsIHBbMF0pOworICAgICAgaWYgKG4gIT0gLTIpCisJQUREIChjMSwgYTEsIHBbMV0pOworICAgIH0KKworICByZXR1cm4KKyAgICBQQVJUUzAgKGEwKSArIFBBUlRTMSAoYTEpICsgUEFSVFMyIChhMikKKyAgICArIFBBUlRTMSAoYzApICsgUEFSVFMyIChjMSkgKyBQQVJUUzAgKGMyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tb2RlMW8uYyBiL21wbi9nZW5lcmljL21vZGUxby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTBhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tb2RlMW8uYwpAQCAtMCwwICsxLDIzNSBAQAorLyogbXBuX21vZGV4YWN0XzFjX29kZCAtLSBtcG4gYnkgbGltYiBleGFjdCBkaXZpc2lvbiBzdHlsZSByZW1haW5kZXIuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMC0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIENhbGN1bGF0ZSBhbiByIHNhdGlzZnlpbmcKKworICAgICAgICAgICByKkJeayArIGEgLSBjID09IHEqZAorCisgICB3aGVyZSBCPTJeR01QX0xJTUJfQklUUywgYSBpcyB7c3JjLHNpemV9LCBrIGlzIGVpdGhlciBzaXplIG9yIHNpemUtMQorICAgKHRoZSBjYWxsZXIgd29uJ3Qga25vdyB3aGljaCksIGFuZCBxIGlzIHRoZSBxdW90aWVudCAoZGlzY2FyZGVkKS4gIGQgbXVzdAorICAgYmUgb2RkLCBjIGNhbiBiZSBhbnkgbGltYiB2YWx1ZS4KKworICAgSWYgYzxkIHRoZW4gciB3aWxsIGJlIGluIHRoZSByYW5nZSAwPD1yPGQsIG9yIGlmIGM+PWQgdGhlbiAwPD1yPD1kLgorCisgICBUaGlzIHNsaWdodGx5IHN0cmFuZ2UgZnVuY3Rpb24gc3VpdHMgdGhlIGluaXRpYWwgTngxIHJlZHVjdGlvbiBmb3IgR0NEcworICAgb3IgSmFjb2JpIHN5bWJvbHMgc2luY2UgdGhlIGZhY3RvcnMgb2YgMiBpbiBCXmsgY2FuIGJlIGlnbm9yZWQsIGxlYXZpbmcKKyAgIC1yID09IGEgbW9kIGQgKGJ5IHBhc3NpbmcgYz0wKS4gIEZvciBhIEdDRCB0aGUgZmFjdG9yIG9mIC0xIG9uIHIgY2FuIGJlCisgICBpZ25vcmVkLCBvciBmb3IgdGhlIEphY29iaSBzeW1ib2wgaXQgY2FuIGJlIGFjY291bnRlZCBmb3IuICBUaGUgZnVuY3Rpb24KKyAgIGFsc28gc3VpdHMgZGl2aXNpYmlsaXR5IGFuZCBjb25ncnVlbmNlIHRlc3Rpbmcgc2luY2UgaWYgcj0wIChvciByPWQpIGlzCisgICBvYnRhaW5lZCB0aGVuIGE9PWMgbW9kIGQuCisKKworICAgciBpcyBhIGJpdCBsaWtlIHRoZSByZW1haW5kZXIgcmV0dXJuZWQgYnkgbXBuX2RpdmV4YWN0X2J5M2MsIGFuZCBpcyB0aGUKKyAgIHNvcnQgb2YgcmVtYWluZGVyIG1wbl9kaXZleGFjdF8xIG1pZ2h0IHJldHVybi4gIExpa2UgbXBuX2RpdmV4YWN0X2J5M2MsIHIKKyAgIHJlcHJlc2VudHMgYSBib3Jyb3csIHNpbmNlIGVmZmVjdGl2ZWx5IHF1b3RpZW50IGxpbWJzIGFyZSBjaG9zZW4gc28gdGhhdAorICAgc3VidHJhY3RpbmcgdGhhdCBtdWx0aXBsZSBvZiBkIGZyb20gc3JjIGF0IGVhY2ggc3RlcCB3aWxsIHByb2R1Y2UgYSB6ZXJvCisgICBsaW1iLgorCisgICBBIGxvbmcgY2FsY3VsYXRpb24gY2FuIGJlIGRvbmUgcGllY2UgYnkgcGllY2UgZnJvbSBsb3cgdG8gaGlnaCBieSBwYXNzaW5nCisgICB0aGUgcmV0dXJuIHZhbHVlIGZyb20gb25lIHBhcnQgYXMgdGhlIGNhcnJ5IHBhcmFtZXRlciB0byB0aGUgbmV4dCBwYXJ0LgorICAgVGhlIGVmZmVjdGl2ZSBmaW5hbCBrIGJlY29tZXMgYW55dGhpbmcgYmV0d2VlbiBzaXplIGFuZCBzaXplLW4sIGlmIG4KKyAgIHBpZWNlcyBhcmUgdXNlZC4KKworCisgICBBIHNpbWlsYXIgc29ydCBvZiByb3V0aW5lIGNvdWxkIGJlIGNvbnN0cnVjdGVkIGJhc2VkIG9uIGFkZGluZyBtdWx0aXBsZXMKKyAgIG9mIGQgYXQgZWFjaCBsaW1iLCBtdWNoIGxpa2UgcmVkYyBpbiBtcHpfcG93bSBkb2VzLiAgU3VidHJhY3RpbmcgaG93ZXZlcgorICAgaGFzIGEgc21hbGwgYWR2YW50YWdlIHRoYXQgd2hlbiBzdWJ0cmFjdGluZyB0byBjYW5jZWwgb3V0IGwgdGhlcmUncyBuZXZlcgorICAgYSBib3Jyb3cgaW50byBoLCB3aGVyZWFzIHVzaW5nIGFuIGFkZGl0aW9uIHdvdWxkIHB1dCBhIGNhcnJ5IGludG8gaAorICAgZGVwZW5kaW5nIHdoZXRoZXIgbD09MCBvciBsIT0wLgorCisKKyAgIEluIHRlcm1zIG9mIGVmZmljaWVuY3ksIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBhIG11bC1ieS1pbnZlcnNlCisgICBtcG5fbW9kXzEuICBCb3RoIGFyZSBlc3NlbnRpYWxseSB0d28gbXVsdGlwbGllcyBhbmQgYXJlIGJlc3Qgc3VpdGVkIHRvCisgICBDUFVzIHdpdGggbG93IGxhdGVuY3kgbXVsdGlwbGllcnMgKGluIGNvbXBhcmlzb24gdG8gYSBkaXZpZGUgaW5zdHJ1Y3Rpb24KKyAgIGF0IGxlYXN0LikgIEJ1dCBtb2RleGFjdCBoYXMgYSBmZXcgbGVzcyBzdXBwbGVtZW50YXJ5IG9wZXJhdGlvbnMsIG9ubHkKKyAgIG5lZWRzIGxvdyBwYXJ0IGFuZCBoaWdoIHBhcnQgbXVsdGlwbGllcywgYW5kIGhhcyBmZXdlciB3b3JraW5nIHF1YW50aXRpZXMKKyAgIChoZWxwaW5nIENQVXMgd2l0aCBmZXcgcmVnaXN0ZXJzKS4KKworCisgICBJbiB0aGUgbWFpbiBsb29wIGl0IHdpbGwgYmUgbm90ZWQgdGhhdCB0aGUgbmV3IGNhcnJ5IChjYWxsIGl0IHIpIGlzIHRoZQorICAgc3VtIG9mIHRoZSBoaWdoIHByb2R1Y3QgaCBhbmQgYW55IGJvcnJvdyBmcm9tIGw9cy1jLiAgSWYgYzxkIHRoZW4gd2Ugd2lsbAorICAgaGF2ZSByPGQgdG9vLCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zLiAgTGV0IHE9bCppbnZlcnNlIGJlIHRoZSBxdW90aWVudAorICAgbGltYiwgc28gdGhhdCBxKmQgPSBCKmggKyBsLCB3aGVyZSBCPTJeR01QX05VTUJfQklUUy4gIE5vdyBpZiBoPWQtMSB0aGVuCisKKyAgICAgICBsID0gcSpkIC0gQiooZC0xKSA8PSAoQi0xKSpkIC0gQiooZC0xKSA9IEItZAorCisgICBCdXQgaWYgbD1zLWMgcHJvZHVjZXMgYSBib3Jyb3cgd2hlbiBjPGQsIHRoZW4gbD49Qi1kKzEgYW5kIGhlbmNlIHdpbGwKKyAgIG5ldmVyIGhhdmUgaD1kLTEgYW5kIHNvIHI9aCtib3Jyb3cgPD0gZC0xLgorCisgICBXaGVuIGM+PWQsIG9uIHRoZSBvdGhlciBoYW5kLCBoPWQtMSBjYW4gY2VydGFpbmx5IG9jY3VyIHRvZ2V0aGVyIHdpdGggYQorICAgYm9ycm93LCB0aGVyZWJ5IGdpdmluZyBvbmx5IHI8PWQsIGFzIHBlciB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBhYm92ZS4KKworICAgQXMgYSBkZXNpZ24gZGVjaXNpb24gaXQncyBsZWZ0IHRvIHRoZSBjYWxsZXIgdG8gY2hlY2sgZm9yIHI9ZCBpZiBpdCBtaWdodAorICAgYmUgcGFzc2luZyBjPj1kLiAgU2V2ZXJhbCBhcHBsaWNhdGlvbnMgaGF2ZSBjPGQgaW5pdGlhbGx5IHNvIHRoZSBleHRyYQorICAgdGVzdCBpcyBvZnRlbiB1bm5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUgdGhlIEdDRHMgb3IgYSBwbGFpbiBkaXZpc2liaWxpdHkKKyAgIGR8YSB0ZXN0IHdpbGwgcGFzcyBjPTAuCisKKworICAgVGhlIHNwZWNpYWwgY2FzZSBmb3Igc2l6ZT09MSBpcyBzbyB0aGF0IGl0IGNhbiBiZSBhc3N1bWVkIGM8PWQgaW4gdGhlCisgICBoaWdoPD1kaXZpc29yIHRlc3QgYXQgdGhlIGVuZC4gIGM8PWQgaXMgb25seSBndWFyYW50ZWVkIGFmdGVyIGF0IGxlYXN0CisgICBvbmUgaXRlcmF0aW9uIG9mIHRoZSBtYWluIGxvb3AuICBUaGVyZSdzIGFsc28gYSBkZWNlbnQgY2hhbmNlIG9uZSAlIGlzCisgICBmYXN0ZXIgdGhhbiBhIGJpbnZlcnRfbGltYiwgdGhvdWdoIHRoYXQgd2lsbCBkZXBlbmQgb24gdGhlIHByb2Nlc3Nvci4KKworICAgQSBDUFUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gbWlnaHQgd2FudCB0byBvbWl0IHRoZSBzaXplPT0xIGNvZGUgb3IgdGhlCisgICBoaWdoPGRpdmlzb3IgdGVzdC4gIG1wbi94ODYvazYvbW9kZTFvLmFzbSBmb3IgaW5zdGFuY2UgZmluZHMgbmVpdGhlcgorICAgdXNlZnVsLiAgKi8KKworCittcF9saW1iX3QKK21wbl9tb2RleGFjdF8xY19vZGQgKG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgZCwKKyAgICAgICAgICAgICAgICAgICAgIG1wX2xpbWJfdCBvcmlnX2MpCit7CisgIG1wX2xpbWJfdCAgcywgaCwgbCwgaW52ZXJzZSwgZHVtbXksIGRtdWwsIHJldDsKKyAgbXBfbGltYl90ICBjID0gb3JpZ19jOworICBtcF9zaXplX3QgIGk7CisKKyAgQVNTRVJUIChzaXplID49IDEpOworICBBU1NFUlQgKGQgJiAxKTsKKyAgQVNTRVJUX01QTiAoc3JjLCBzaXplKTsKKyAgQVNTRVJUX0xJTUIgKGQpOworICBBU1NFUlRfTElNQiAoYyk7CisKKyAgaWYgKHNpemUgPT0gMSkKKyAgICB7CisgICAgICBzID0gc3JjWzBdOworICAgICAgaWYgKHMgPiBjKQorCXsKKwkgIGwgPSBzLWM7CisJICBoID0gbCAlIGQ7CisJICBpZiAoaCAhPSAwKQorCSAgICBoID0gZCAtIGg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGwgPSBjLXM7CisJICBoID0gbCAlIGQ7CisJfQorICAgICAgcmV0dXJuIGg7CisgICAgfQorCisKKyAgYmludmVydF9saW1iIChpbnZlcnNlLCBkKTsKKyAgZG11bCA9IGQgPDwgR01QX05BSUxfQklUUzsKKworICBpID0gMDsKKyAgZG8KKyAgICB7CisgICAgICBzID0gc3JjW2ldOworICAgICAgU1VCQ19MSU1CIChjLCBsLCBzLCBjKTsKKyAgICAgIGwgPSAobCAqIGludmVyc2UpICYgR01QX05VTUJfTUFTSzsKKyAgICAgIHVtdWxfcHBtbSAoaCwgZHVtbXksIGwsIGRtdWwpOworICAgICAgYyArPSBoOworICAgIH0KKyAgd2hpbGUgKCsraSA8IHNpemUtMSk7CisKKworICBzID0gc3JjW2ldOworICBpZiAocyA8PSBkKQorICAgIHsKKyAgICAgIC8qIFdpdGggaGlnaDw9ZCB0aGUgZmluYWwgc3RlcCBjYW4gYmUgYSBzdWJ0cmFjdCBhbmQgYWRkYmFjay4gIElmIGM9PTAKKwkgdGhlbiB0aGUgYWRkYmFjayB3aWxsIHJlc3RvcmUgdG8gbD49MC4gIElmIGM9PWQgdGhlbiB3aWxsIGdldCBsPT1kCisJIGlmIHM9PTAsIGJ1dCB0aGF0J3Mgb2sgcGVyIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKi8KKworICAgICAgbCA9IGMgLSBzOworICAgICAgaWYgKGMgPCBzKQorCWwgKz0gZDsKKworICAgICAgcmV0ID0gbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDYW4ndCBza2lwIGEgZGl2aWRlLCBqdXN0IGRvIHRoZSBsb29wIGNvZGUgb25jZSBtb3JlLiAqLworCisgICAgICBTVUJDX0xJTUIgKGMsIGwsIHMsIGMpOworICAgICAgbCA9IChsICogaW52ZXJzZSkgJiBHTVBfTlVNQl9NQVNLOworICAgICAgdW11bF9wcG1tIChoLCBkdW1teSwgbCwgZG11bCk7CisgICAgICBjICs9IGg7CisgICAgICByZXQgPSBjOworICAgIH0KKworICBBU1NFUlQgKG9yaWdfYyA8IGQgPyByZXQgPCBkIDogcmV0IDw9IGQpOworICByZXR1cm4gcmV0OworfQorCisKKworI2lmIDAKKworLyogVGhlIGZvbGxvd2luZyBpcyBhbiBhbHRlcm5hdGUgZm9ybSB0aGF0IG1pZ2h0IHNoYXZlIG9uZSBjeWNsZSBvbiBhCisgICBzdXBlcnNjYWxhciBwcm9jZXNzb3Igc2luY2UgaXQgdGFrZXMgYys9aCBvZmYgdGhlIGRlcGVuZGVudCBjaGFpbiwKKyAgIGxlYXZpbmcganVzdCBhIGxvdyBwcm9kdWN0LCBoaWdoIHByb2R1Y3QsIGFuZCBhIHN1YnRyYWN0LgorCisgICBUaGlzIGlzIGZvciBDUFUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIGNvbnNpZGVyLiAgQSBzcGVjaWFsIGNhc2UgZm9yCisgICBoaWdoPGRpdmlzb3IgYW5kL29yIHNpemU9PTEgY2FuIGJlIGFkZGVkIGlmIGRlc2lyZWQuCisKKyAgIE5vdGljZSB0aGF0IGMgaXMgb25seSBldmVyIDAgb3IgMSwgc2luY2UgaWYgcy1jIHByb2R1Y2VzIGEgYm9ycm93IHRoZW4KKyAgIHg9MHhGRi4uRkYgYW5kIHgtaCBjYW5ub3QgcHJvZHVjZSBhIGJvcnJvdy4gIFRoZSBjPSh4PnMpIGNvdWxkIGJlY29tZQorICAgYz0oeD09MHhGRi4uRkYpIHRvbywgaWYgdGhhdCBoZWxwZWQuICAqLworCittcF9saW1iX3QKK21wbl9tb2RleGFjdF8xY19vZGQgKG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgZCwgbXBfbGltYl90IGgpCit7CisgIG1wX2xpbWJfdCAgcywgeCwgeSwgaW52ZXJzZSwgZHVtbXksIGRtdWwsIGMxLCBjMjsKKyAgbXBfbGltYl90ICBjID0gMDsKKyAgbXBfc2l6ZV90ICBpOworCisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKyAgQVNTRVJUIChkICYgMSk7CisKKyAgYmludmVydF9saW1iIChpbnZlcnNlLCBkKTsKKyAgZG11bCA9IGQgPDwgR01QX05BSUxfQklUUzsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIEFTU0VSVCAoYz09MCB8fCBjPT0xKTsKKworICAgICAgcyA9IHNyY1tpXTsKKyAgICAgIFNVQkNfTElNQiAoYzEsIHgsIHMsIGMpOworCisgICAgICBTVUJDX0xJTUIgKGMyLCB5LCB4LCBoKTsKKyAgICAgIGMgPSBjMSArIGMyOworCisgICAgICB5ID0gKHkgKiBpbnZlcnNlKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICB1bXVsX3BwbW0gKGgsIGR1bW15LCB5LCBkbXVsKTsKKyAgICB9CisKKyAgaCArPSBjOworICByZXR1cm4gaDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdV9iZGl2X3EuYyBiL21wbi9nZW5lcmljL211X2JkaXZfcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjNiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdV9iZGl2X3EuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogbXBuX211X2JkaXZfcShxcCxucCxubixkcCxkbix0cCkgLS0gQ29tcHV0ZSB7bnAsbm59IC8ge2RwLGRufSBtb2QgQl5ubi4KKyAgIHN0b3JpbmcgdGhlIHJlc3VsdCBpbiB7cXAsbm59LiAgT3ZlcmxhcCBhbGxvd2VkIGJldHdlZW4gUSBhbmQgTjsgYWxsIG90aGVyCisgICBvdmVybGFwIGRpc2FsbG93ZWQuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR01QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA1LTIwMDcsIDIwMDksIDIwMTAsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyoKKyAgIFRoZSBpZGVhIG9mIHRoZSBhbGdvcml0aG0gdXNlZCBoZXJlaW4gaXMgdG8gY29tcHV0ZSBhIHNtYWxsZXIgaW52ZXJ0ZWQgdmFsdWUKKyAgIHRoYW4gdXNlZCBpbiB0aGUgc3RhbmRhcmQgQmFycmV0dCBhbGdvcml0aG0sIGFuZCB0aHVzIHNhdmUgdGltZSBpbiB0aGUKKyAgIE5ld3RvbiBpdGVyYXRpb25zLCBhbmQgcGF5IGp1c3QgYSBzbWFsbCBwcmljZSB3aGVuIHVzaW5nIHRoZSBpbnZlcnRlZCB2YWx1ZQorICAgZm9yIGRldmVsb3BpbmcgcXVvdGllbnQgYml0cy4gIFRoaXMgYWxnb3JpdGhtIHdhcyBwcmVzZW50ZWQgYXQgSUNNUyAyMDA2LgorKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogTiA9IHtucCxubn0KKyAgIEQgPSB7ZHAsZG59CisKKyAgIFJlcXVpcmVtZW50czogTiA+PSBECisJCSBEID49IDEKKwkJIEQgb2RkCisJCSBkbiA+PSAyCisJCSBubiA+PSAyCisJCSBzY3JhdGNoIHNwYWNlIGFzIGRldGVybWluZWQgYnkgbXBuX211X2JkaXZfcV9pdGNoKG5uLGRuKS4KKworICAgV3JpdGUgcXVvdGllbnQgdG8gUSA9IHtxcCxubn0uCisKKyAgIEZJWE1FOiBXaGVuIGl0ZXJhdGluZywgcGVyaGFwcyBkbyB0aGUgc21hbGwgc3RlcCBiZWZvcmUgbG9vcCwgbm90IGFmdGVyLgorICAgRklYTUU6IFRyeSB0byBhdm9pZCB0aGUgc2NhbGFyIGRpdmlzaW9ucyB3aGVuIGNvbXB1dGluZyBpbnZlcnNlIHNpemUuCisgICBGSVhNRTogVHJpbSBhbGxvY2F0aW9uIGZvciAocW4gPiBkbikgY2FzZSwgMypkbiBtaWdodCBiZSBwb3NzaWJsZS4gIEluCisJICBwYXJ0aWN1bGFyLCB3aGVuIGRuPT1pbiwgdHAgYW5kIHJwIGNvdWxkIHVzZSB0aGUgc2FtZSBzcGFjZS4KKyAgIEZJWE1FOiBUcmltIGZpbmFsIHF1b3RpZW50IGNhbGN1bGF0aW9uIHRvIHFuIGxpbWJzIG9mIHByZWNpc2lvbi4KKyovCitzdGF0aWMgdm9pZAorbXBuX211X2JkaXZfcV9vbGQgKG1wX3B0ciBxcCwKKwkgICAgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJICAgICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCSAgICAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9zaXplX3QgaW47CisgIGludCBjeSwgYzA7CisgIG1wX3NpemVfdCB0biwgd247CisKKyAgcW4gPSBubjsKKworICBBU1NFUlQgKGRuID49IDIpOworICBBU1NFUlQgKHFuID49IDIpOworCisgIGlmIChxbiA+IGRuKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBiOworCisgICAgICAvKiB8X19fX19fX19fX19fX19fX19fX19fX198ICAgZGl2aWRlbmQKKwkJCXxfX19fX19fX3wgICBkaXZpc29yICAqLworCisjZGVmaW5lIGlwICAgICAgICAgICBzY3JhdGNoCQkJLyogaW4gKi8KKyNkZWZpbmUgcnAgICAgICAgICAgIChzY3JhdGNoICsgaW4pCQkvKiBkbiBvciByZXN0ID49IGJpbnZlcnRfaXRjaChpbikgKi8KKyNkZWZpbmUgdHAgICAgICAgICAgIChzY3JhdGNoICsgaW4gKyBkbikJLyogZG4raW4gb3IgbmV4dF9zaXplKGRuKSAqLworI2RlZmluZSBzY3JhdGNoX291dCAgKHNjcmF0Y2ggKyBpbiArIGRuICsgdG4pCS8qIG11bG1vZF9ibm0xX2l0Y2gobmV4dF9zaXplKGRuKSkgKi8KKworICAgICAgLyogQ29tcHV0ZSBhbiBpbnZlcnNlIHNpemUgdGhhdCBpcyBhIG5pY2UgcGFydGl0aW9uIG9mIHRoZSBxdW90aWVudC4gICovCisgICAgICBiID0gKHFuIC0gMSkgLyBkbiArIDE7CS8qIGNlaWwocW4vZG4pLCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICBpbiA9IChxbiAtIDEpIC8gYiArIDE7CS8qIGNlaWwocW4vYikgPSBjZWlsKHFuIC8gY2VpbChxbi9kbikpICovCisKKyAgICAgIC8qIFNvbWUgbm90ZXMgb24gYWxsb2NhdGlvbjoKKworCSBXaGVuIGluID0gZG4sIFIgZGllcyB3aGVuIG1wbl9tdWxsbyByZXR1cm5zLCBpZiBpbiA8IGRuIHRoZSBsb3cgaW4KKwkgbGltYnMgb2YgUiBkaWVzIGF0IHRoYXQgcG9pbnQuICBXZSBjb3VsZCBzYXZlIG1lbW9yeSBieSBsZXR0aW5nIFQgbGl2ZQorCSBqdXN0IHVuZGVyIFIsIGFuZCBsZXQgdGhlIHVwcGVyIHBhcnQgb2YgVCBleHBhbmQgaW50byBSLiBUaGVzZSBjaGFuZ2VzCisJIHNob3VsZCByZWR1Y2UgaXRjaCB0byBwZXJoYXBzIDNkbi4KKyAgICAgICAqLworCisgICAgICBtcG5fYmludmVydCAoaXAsIGRwLCBpbiwgcnApOworCisgICAgICBjeSA9IDA7CisKKyAgICAgIE1QTl9DT1BZIChycCwgbnAsIGRuKTsKKyAgICAgIG5wICs9IGRuOworICAgICAgbXBuX211bGxvX24gKHFwLCBycCwgaXAsIGluKTsKKyAgICAgIHFuIC09IGluOworCisgICAgICB3aGlsZSAocW4gPiBpbikKKwl7CisJICBpZiAoQkVMT1dfVEhSRVNIT0xEIChpbiwgTVVMX1RPX01VTE1PRF9CTk0xX0ZPUl8yTlhOX1RIUkVTSE9MRCkpCisJICAgIG1wbl9tdWwgKHRwLCBkcCwgZG4sIHFwLCBpbik7CS8qIG11bGhpLCBuZWVkIHRwW2RuK2luLTEuLi5pbl0gKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHRuID0gbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAoZG4pOworCSAgICAgIG1wbl9tdWxtb2RfYm5tMSAodHAsIHRuLCBkcCwgZG4sIHFwLCBpbiwgc2NyYXRjaF9vdXQpOworCSAgICAgIHduID0gZG4gKyBpbiAtIHRuOwkJLyogbnVtYmVyIG9mIHdyYXBwZWQgbGltYnMgKi8KKwkgICAgICBpZiAod24gPiAwKQorCQl7CisJCSAgYzAgPSBtcG5fc3ViX24gKHRwICsgdG4sIHRwLCBycCwgd24pOworCQkgIG1wbl9kZWNyX3UgKHRwICsgd24sIGMwKTsKKwkJfQorCSAgICB9CisKKwkgIHFwICs9IGluOworCSAgaWYgKGRuICE9IGluKQorCSAgICB7CisJICAgICAgLyogU3VidHJhY3QgdHBbZG4tMS4uLmluXSBmcm9tIHBhcnRpYWwgcmVtYWluZGVyLiAgKi8KKwkgICAgICBjeSArPSBtcG5fc3ViX24gKHJwLCBycCArIGluLCB0cCArIGluLCBkbiAtIGluKTsKKwkgICAgICBpZiAoY3kgPT0gMikKKwkJeworCQkgIG1wbl9pbmNyX3UgKHRwICsgZG4sIDEpOworCQkgIGN5ID0gMTsKKwkJfQorCSAgICB9CisJICAvKiBTdWJ0cmFjdCB0cFtkbitpbi0xLi4uZG5dIGZyb20gZGl2aWRlbmQuICAqLworCSAgY3kgPSBtcG5fc3ViX25jIChycCArIGRuIC0gaW4sIG5wLCB0cCArIGRuLCBpbiwgY3kpOworCSAgbnAgKz0gaW47CisJICBtcG5fbXVsbG9fbiAocXAsIHJwLCBpcCwgaW4pOworCSAgcW4gLT0gaW47CisJfQorCisgICAgICAvKiBHZW5lcmF0ZSBsYXN0IHFuIGxpbWJzLgorCSBGSVhNRTogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGxpbWl0IHByZWNpc2lvbiBoZXJlLCBzaW5jZSBxbiBpcworCSB0eXBpY2FsbHkgc29tZXdoYXQgc21hbGxlciB0aGFuIGRuLiAgTm8gYmlnIGdhaW5zIGV4cGVjdGVkLiAgKi8KKworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoaW4sIE1VTF9UT19NVUxNT0RfQk5NMV9GT1JfMk5YTl9USFJFU0hPTEQpKQorCW1wbl9tdWwgKHRwLCBkcCwgZG4sIHFwLCBpbik7CQkvKiBtdWxoaSwgbmVlZCB0cFtxbitpbi0xLi4uaW5dICovCisgICAgICBlbHNlCisJeworCSAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbik7CisJICBtcG5fbXVsbW9kX2JubTEgKHRwLCB0biwgZHAsIGRuLCBxcCwgaW4sIHNjcmF0Y2hfb3V0KTsKKwkgIHduID0gZG4gKyBpbiAtIHRuOwkJCS8qIG51bWJlciBvZiB3cmFwcGVkIGxpbWJzICovCisJICBpZiAod24gPiAwKQorCSAgICB7CisJICAgICAgYzAgPSBtcG5fc3ViX24gKHRwICsgdG4sIHRwLCBycCwgd24pOworCSAgICAgIG1wbl9kZWNyX3UgKHRwICsgd24sIGMwKTsKKwkgICAgfQorCX0KKworICAgICAgcXAgKz0gaW47CisgICAgICBpZiAoZG4gIT0gaW4pCisJeworCSAgY3kgKz0gbXBuX3N1Yl9uIChycCwgcnAgKyBpbiwgdHAgKyBpbiwgZG4gLSBpbik7CisJICBpZiAoY3kgPT0gMikKKwkgICAgeworCSAgICAgIG1wbl9pbmNyX3UgKHRwICsgZG4sIDEpOworCSAgICAgIGN5ID0gMTsKKwkgICAgfQorCX0KKworICAgICAgbXBuX3N1Yl9uYyAocnAgKyBkbiAtIGluLCBucCwgdHAgKyBkbiwgcW4gLSAoZG4gLSBpbiksIGN5KTsKKyAgICAgIG1wbl9tdWxsb19uIChxcCwgcnAsIGlwLCBxbik7CisKKyN1bmRlZiBpcAorI3VuZGVmIHJwCisjdW5kZWYgdHAKKyN1bmRlZiBzY3JhdGNoX291dAorICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogfF9fX19fX19fX19fX19fX19fX19fX19ffCAgIGRpdmlkZW5kCisJCXxfX19fX19fX19fX19fX19ffCAgIGRpdmlzb3IgICovCisKKyNkZWZpbmUgaXAgICAgICAgICAgIHNjcmF0Y2gJCS8qIGluICovCisjZGVmaW5lIHRwICAgICAgICAgICAoc2NyYXRjaCArIGluKQkvKiBxbitpbiBvciBuZXh0X3NpemUocW4pIG9yIHJlc3QgPj0gYmludmVydF9pdGNoKGluKSAqLworI2RlZmluZSBzY3JhdGNoX291dCAgKHNjcmF0Y2ggKyBpbiArIHRuKS8qIG11bG1vZF9ibm0xX2l0Y2gobmV4dF9zaXplKHFuKSkgKi8KKworICAgICAgLyogQ29tcHV0ZSBoYWxmLXNpemVkIGludmVyc2UuICAqLworICAgICAgaW4gPSBxbiAtIChxbiA+PiAxKTsKKworICAgICAgbXBuX2JpbnZlcnQgKGlwLCBkcCwgaW4sIHRwKTsKKworICAgICAgbXBuX211bGxvX24gKHFwLCBucCwgaXAsIGluKTsJCS8qIGxvdyBgaW4nIHF1b3RpZW50IGxpbWJzICovCisKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKGluLCBNVUxfVE9fTVVMTU9EX0JOTTFfRk9SXzJOWE5fVEhSRVNIT0xEKSkKKwltcG5fbXVsICh0cCwgZHAsIHFuLCBxcCwgaW4pOwkJLyogbXVsaGlnaCAqLworICAgICAgZWxzZQorCXsKKwkgIHRuID0gbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAocW4pOworCSAgbXBuX211bG1vZF9ibm0xICh0cCwgdG4sIGRwLCBxbiwgcXAsIGluLCBzY3JhdGNoX291dCk7CisJICB3biA9IHFuICsgaW4gLSB0bjsJCQkvKiBudW1iZXIgb2Ygd3JhcHBlZCBsaW1icyAqLworCSAgaWYgKHduID4gMCkKKwkgICAgeworCSAgICAgIGMwID0gbXBuX2NtcCAodHAsIG5wLCB3bikgPCAwOworCSAgICAgIG1wbl9kZWNyX3UgKHRwICsgd24sIGMwKTsKKwkgICAgfQorCX0KKworICAgICAgbXBuX3N1Yl9uICh0cCwgbnAgKyBpbiwgdHAgKyBpbiwgcW4gLSBpbik7CisgICAgICBtcG5fbXVsbG9fbiAocXAgKyBpbiwgdHAsIGlwLCBxbiAtIGluKTsJLyogaGlnaCBxbi1pbiBxdW90aWVudCBsaW1icyAqLworCisjdW5kZWYgaXAKKyN1bmRlZiB0cAorI3VuZGVmIHNjcmF0Y2hfb3V0CisgICAgfQorfQorCit2b2lkCittcG5fbXVfYmRpdl9xIChtcF9wdHIgcXAsCisJICAgICAgIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCSAgICAgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwKKwkgICAgICAgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wbl9tdV9iZGl2X3Ffb2xkIChxcCwgbnAsIG5uLCBkcCwgZG4sIHNjcmF0Y2gpOworICBtcG5fbmVnIChxcCwgcXAsIG5uKTsKK30KKworbXBfc2l6ZV90CittcG5fbXVfYmRpdl9xX2l0Y2ggKG1wX3NpemVfdCBubiwgbXBfc2l6ZV90IGRuKQoreworICBtcF9zaXplX3QgcW4sIGluLCB0biwgaXRjaF9iaW52ZXJ0LCBpdGNoX291dCwgaXRjaGVzOworICBtcF9zaXplX3QgYjsKKworICBBU1NFUlRfQUxXQVlTIChEQ19CRElWX1FfVEhSRVNIT0xEIDwgTVVfQkRJVl9RX1RIUkVTSE9MRCk7CisKKyAgcW4gPSBubjsKKworICBpZiAocW4gPiBkbikKKyAgICB7CisgICAgICBiID0gKHFuIC0gMSkgLyBkbiArIDE7CS8qIGNlaWwocW4vZG4pLCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICBpbiA9IChxbiAtIDEpIC8gYiArIDE7CS8qIGNlaWwocW4vYikgPSBjZWlsKHFuIC8gY2VpbChxbi9kbikpICovCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChpbiwgTVVMX1RPX01VTE1PRF9CTk0xX0ZPUl8yTlhOX1RIUkVTSE9MRCkpCisJeworCSAgdG4gPSBkbiArIGluOworCSAgaXRjaF9vdXQgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0biA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKGRuKTsKKwkgIGl0Y2hfb3V0ID0gbXBuX211bG1vZF9ibm0xX2l0Y2ggKHRuLCBkbiwgaW4pOworCX0KKyAgICAgIGl0Y2hlcyA9IGRuICsgdG4gKyBpdGNoX291dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbiA9IHFuIC0gKHFuID4+IDEpOworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoaW4sIE1VTF9UT19NVUxNT0RfQk5NMV9GT1JfMk5YTl9USFJFU0hPTEQpKQorCXsKKwkgIHRuID0gcW4gKyBpbjsKKwkgIGl0Y2hfb3V0ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChxbik7CisJICBpdGNoX291dCA9IG1wbl9tdWxtb2RfYm5tMV9pdGNoICh0biwgcW4sIGluKTsKKwl9CisgICAgICBpdGNoZXMgPSB0biArIGl0Y2hfb3V0OworICAgIH0KKworICBpdGNoX2JpbnZlcnQgPSBtcG5fYmludmVydF9pdGNoIChpbik7CisgIHJldHVybiBpbiArIE1BWCAoaXRjaGVzLCBpdGNoX2JpbnZlcnQpOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvbXVfYmRpdl9xci5jIGIvbXBuL2dlbmVyaWMvbXVfYmRpdl9xci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdV9iZGl2X3FyLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qIG1wbl9tdV9iZGl2X3FyKHFwLHJwLG5wLG5uLGRwLGRuLHRwKSAtLSBDb21wdXRlIHtucCxubn0gLyB7ZHAsZG59IG1vZCBCXnFuLAorICAgd2hlcmUgcW4gPSBubi1kbiwgc3RvcmluZyB0aGUgcmVzdWx0IGluIHtxcCxxbn0uICBPdmVybGFwIGFsbG93ZWQgYmV0d2VlbiBRCisgICBhbmQgTjsgYWxsIG90aGVyIG92ZXJsYXAgZGlzYWxsb3dlZC4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDUtMjAwNywgMjAwOSwgMjAxMCwgMjAxMiwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKgorICAgVGhlIGlkZWEgb2YgdGhlIGFsZ29yaXRobSB1c2VkIGhlcmVpbiBpcyB0byBjb21wdXRlIGEgc21hbGxlciBpbnZlcnRlZCB2YWx1ZQorICAgdGhhbiB1c2VkIGluIHRoZSBzdGFuZGFyZCBCYXJyZXR0IGFsZ29yaXRobSwgYW5kIHRodXMgc2F2ZSB0aW1lIGluIHRoZQorICAgTmV3dG9uIGl0ZXJhdGlvbnMsIGFuZCBwYXkganVzdCBhIHNtYWxsIHByaWNlIHdoZW4gdXNpbmcgdGhlIGludmVydGVkIHZhbHVlCisgICBmb3IgZGV2ZWxvcGluZyBxdW90aWVudCBiaXRzLiAgVGhpcyBhbGdvcml0aG0gd2FzIHByZXNlbnRlZCBhdCBJQ01TIDIwMDYuCisqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBOID0ge25wLG5ufQorICAgRCA9IHtkcCxkbn0KKworICAgUmVxdWlyZW1lbnRzOiBOID49IEQKKwkJIEQgPj0gMQorCQkgRCBvZGQKKwkJIGRuID49IDIKKwkJIG5uID49IDIKKwkJIHNjcmF0Y2ggc3BhY2UgYXMgZGV0ZXJtaW5lZCBieSBtcG5fbXVfYmRpdl9xcl9pdGNoKG5uLGRuKS4KKworICAgV3JpdGUgcXVvdGllbnQgdG8gUSA9IHtxcCxubi1kbn0uCisKKyAgIEZJWE1FOiBXaGVuIGl0ZXJhdGluZywgcGVyaGFwcyBkbyB0aGUgc21hbGwgc3RlcCBiZWZvcmUgbG9vcCwgbm90IGFmdGVyLgorICAgRklYTUU6IFRyeSB0byBhdm9pZCB0aGUgc2NhbGFyIGRpdmlzaW9ucyB3aGVuIGNvbXB1dGluZyBpbnZlcnNlIHNpemUuCisgICBGSVhNRTogVHJpbSBhbGxvY2F0aW9uIGZvciAocW4gPiBkbikgY2FzZSwgMypkbiBtaWdodCBiZSBwb3NzaWJsZS4gIEluCisJICBwYXJ0aWN1bGFyLCB3aGVuIGRuPT1pbiwgdHAgYW5kIHJwIGNvdWxkIHVzZSB0aGUgc2FtZSBzcGFjZS4KKyovCitzdGF0aWMgbXBfbGltYl90CittcG5fbXVfYmRpdl9xcl9vbGQgKG1wX3B0ciBxcCwKKwkJICAgIG1wX3B0ciBycCwKKwkJICAgIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCQkgICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJCSAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9zaXplX3QgaW47CisgIG1wX2xpbWJfdCBjeSwgYzA7CisgIG1wX3NpemVfdCB0biwgd247CisKKyAgcW4gPSBubiAtIGRuOworCisgIEFTU0VSVCAoZG4gPj0gMik7CisgIEFTU0VSVCAocW4gPj0gMik7CisKKyAgaWYgKHFuID4gZG4pCisgICAgeworICAgICAgbXBfc2l6ZV90IGI7CisKKyAgICAgIC8qIHxfX19fX19fX19fX19fX19fX19fX19fX3wgICBkaXZpZGVuZAorCQkJfF9fX19fX19ffCAgIGRpdmlzb3IgICovCisKKyNkZWZpbmUgaXAgICAgICAgICAgIHNjcmF0Y2gJCS8qIGluICovCisjZGVmaW5lIHRwICAgICAgICAgICAoc2NyYXRjaCArIGluKQkvKiBkbitpbiBvciBuZXh0X3NpemUoZG4pIG9yIHJlc3QgPj0gYmludmVydF9pdGNoKGluKSAqLworI2RlZmluZSBzY3JhdGNoX291dCAgKHNjcmF0Y2ggKyBpbiArIHRuKS8qIG11bG1vZF9ibm0xX2l0Y2gobmV4dF9zaXplKGRuKSkgKi8KKworICAgICAgLyogQ29tcHV0ZSBhbiBpbnZlcnNlIHNpemUgdGhhdCBpcyBhIG5pY2UgcGFydGl0aW9uIG9mIHRoZSBxdW90aWVudC4gICovCisgICAgICBiID0gKHFuIC0gMSkgLyBkbiArIDE7CS8qIGNlaWwocW4vZG4pLCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICBpbiA9IChxbiAtIDEpIC8gYiArIDE7CS8qIGNlaWwocW4vYikgPSBjZWlsKHFuIC8gY2VpbChxbi9kbikpICovCisKKyAgICAgIC8qIFNvbWUgbm90ZXMgb24gYWxsb2NhdGlvbjoKKworCSBXaGVuIGluID0gZG4sIFIgZGllcyB3aGVuIG1wbl9tdWxsbyByZXR1cm5zLCBpZiBpbiA8IGRuIHRoZSBsb3cgaW4KKwkgbGltYnMgb2YgUiBkaWVzIGF0IHRoYXQgcG9pbnQuICBXZSBjb3VsZCBzYXZlIG1lbW9yeSBieSBsZXR0aW5nIFQgbGl2ZQorCSBqdXN0IHVuZGVyIFIsIGFuZCBsZXQgdGhlIHVwcGVyIHBhcnQgb2YgVCBleHBhbmQgaW50byBSLiBUaGVzZSBjaGFuZ2VzCisJIHNob3VsZCByZWR1Y2UgaXRjaCB0byBwZXJoYXBzIDNkbi4KKyAgICAgICAqLworCisgICAgICBtcG5fYmludmVydCAoaXAsIGRwLCBpbiwgdHApOworCisgICAgICBNUE5fQ09QWSAocnAsIG5wLCBkbik7CisgICAgICBucCArPSBkbjsKKyAgICAgIGN5ID0gMDsKKworICAgICAgd2hpbGUgKHFuID4gaW4pCisJeworCSAgbXBuX211bGxvX24gKHFwLCBycCwgaXAsIGluKTsKKworCSAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoaW4sIE1VTF9UT19NVUxNT0RfQk5NMV9GT1JfMk5YTl9USFJFU0hPTEQpKQorCSAgICBtcG5fbXVsICh0cCwgZHAsIGRuLCBxcCwgaW4pOwkvKiBtdWxoaSwgbmVlZCB0cFtkbitpbi0xLi4uaW5dICovCisJICBlbHNlCisJICAgIHsKKwkgICAgICB0biA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKGRuKTsKKwkgICAgICBtcG5fbXVsbW9kX2JubTEgKHRwLCB0biwgZHAsIGRuLCBxcCwgaW4sIHNjcmF0Y2hfb3V0KTsKKwkgICAgICB3biA9IGRuICsgaW4gLSB0bjsJCS8qIG51bWJlciBvZiB3cmFwcGVkIGxpbWJzICovCisJICAgICAgaWYgKHduID4gMCkKKwkJeworCQkgIGMwID0gbXBuX3N1Yl9uICh0cCArIHRuLCB0cCwgcnAsIHduKTsKKwkJICBtcG5fZGVjcl91ICh0cCArIHduLCBjMCk7CisJCX0KKwkgICAgfQorCisJICBxcCArPSBpbjsKKwkgIHFuIC09IGluOworCisJICBpZiAoZG4gIT0gaW4pCisJICAgIHsKKwkgICAgICAvKiBTdWJ0cmFjdCB0cFtkbi0xLi4uaW5dIGZyb20gcGFydGlhbCByZW1haW5kZXIuICAqLworCSAgICAgIGN5ICs9IG1wbl9zdWJfbiAocnAsIHJwICsgaW4sIHRwICsgaW4sIGRuIC0gaW4pOworCSAgICAgIGlmIChjeSA9PSAyKQorCQl7CisJCSAgbXBuX2luY3JfdSAodHAgKyBkbiwgMSk7CisJCSAgY3kgPSAxOworCQl9CisJICAgIH0KKwkgIC8qIFN1YnRyYWN0IHRwW2RuK2luLTEuLi5kbl0gZnJvbSBkaXZpZGVuZC4gICovCisJICBjeSA9IG1wbl9zdWJfbmMgKHJwICsgZG4gLSBpbiwgbnAsIHRwICsgZG4sIGluLCBjeSk7CisJICBucCArPSBpbjsKKwl9CisKKyAgICAgIC8qIEdlbmVyYXRlIGxhc3QgcW4gbGltYnMuICAqLworICAgICAgbXBuX211bGxvX24gKHFwLCBycCwgaXAsIHFuKTsKKworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAocW4sIE1VTF9UT19NVUxNT0RfQk5NMV9GT1JfMk5YTl9USFJFU0hPTEQpKQorCW1wbl9tdWwgKHRwLCBkcCwgZG4sIHFwLCBxbik7CQkvKiBtdWxoaSwgbmVlZCB0cFtxbitpbi0xLi4uaW5dICovCisgICAgICBlbHNlCisJeworCSAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbik7CisJICBtcG5fbXVsbW9kX2JubTEgKHRwLCB0biwgZHAsIGRuLCBxcCwgcW4sIHNjcmF0Y2hfb3V0KTsKKwkgIHduID0gZG4gKyBxbiAtIHRuOwkJCS8qIG51bWJlciBvZiB3cmFwcGVkIGxpbWJzICovCisJICBpZiAod24gPiAwKQorCSAgICB7CisJICAgICAgYzAgPSBtcG5fc3ViX24gKHRwICsgdG4sIHRwLCBycCwgd24pOworCSAgICAgIG1wbl9kZWNyX3UgKHRwICsgd24sIGMwKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGRuICE9IHFuKQorCXsKKwkgIGN5ICs9IG1wbl9zdWJfbiAocnAsIHJwICsgcW4sIHRwICsgcW4sIGRuIC0gcW4pOworCSAgaWYgKGN5ID09IDIpCisJICAgIHsKKwkgICAgICBtcG5faW5jcl91ICh0cCArIGRuLCAxKTsKKwkgICAgICBjeSA9IDE7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gbXBuX3N1Yl9uYyAocnAgKyBkbiAtIHFuLCBucCwgdHAgKyBkbiwgcW4sIGN5KTsKKworI3VuZGVmIGlwCisjdW5kZWYgdHAKKyN1bmRlZiBzY3JhdGNoX291dAorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHxfX19fX19fX19fX19fX19fX19fX19fX3wgICBkaXZpZGVuZAorCQl8X19fX19fX19fX19fX19fX3wgICBkaXZpc29yICAqLworCisjZGVmaW5lIGlwICAgICAgICAgICBzY3JhdGNoCQkvKiBpbiAqLworI2RlZmluZSB0cCAgICAgICAgICAgKHNjcmF0Y2ggKyBpbikJLyogZG4raW4gb3IgbmV4dF9zaXplKGRuKSBvciByZXN0ID49IGJpbnZlcnRfaXRjaChpbikgKi8KKyNkZWZpbmUgc2NyYXRjaF9vdXQgIChzY3JhdGNoICsgaW4gKyB0bikvKiBtdWxtb2RfYm5tMV9pdGNoKG5leHRfc2l6ZShkbikpICovCisKKyAgICAgIC8qIENvbXB1dGUgaGFsZi1zaXplZCBpbnZlcnNlLiAgKi8KKyAgICAgIGluID0gcW4gLSAocW4gPj4gMSk7CisKKyAgICAgIG1wbl9iaW52ZXJ0IChpcCwgZHAsIGluLCB0cCk7CisKKyAgICAgIG1wbl9tdWxsb19uIChxcCwgbnAsIGlwLCBpbik7CQkvKiBsb3cgYGluJyBxdW90aWVudCBsaW1icyAqLworCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChpbiwgTVVMX1RPX01VTE1PRF9CTk0xX0ZPUl8yTlhOX1RIUkVTSE9MRCkpCisJbXBuX211bCAodHAsIGRwLCBkbiwgcXAsIGluKTsJCS8qIG11bGhpZ2ggKi8KKyAgICAgIGVsc2UKKwl7CisJICB0biA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKGRuKTsKKwkgIG1wbl9tdWxtb2RfYm5tMSAodHAsIHRuLCBkcCwgZG4sIHFwLCBpbiwgc2NyYXRjaF9vdXQpOworCSAgd24gPSBkbiArIGluIC0gdG47CQkJLyogbnVtYmVyIG9mIHdyYXBwZWQgbGltYnMgKi8KKwkgIGlmICh3biA+IDApCisJICAgIHsKKwkgICAgICBjMCA9IG1wbl9zdWJfbiAodHAgKyB0biwgdHAsIG5wLCB3bik7CisJICAgICAgbXBuX2RlY3JfdSAodHAgKyB3biwgYzApOworCSAgICB9CisJfQorCisgICAgICBxcCArPSBpbjsKKyAgICAgIHFuIC09IGluOworCisgICAgICBjeSA9IG1wbl9zdWJfbiAocnAsIG5wICsgaW4sIHRwICsgaW4sIGRuKTsKKyAgICAgIG1wbl9tdWxsb19uIChxcCwgcnAsIGlwLCBxbik7CQkvKiBoaWdoIHFuIHF1b3RpZW50IGxpbWJzICovCisKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBNVUxfVE9fTVVMTU9EX0JOTTFfRk9SXzJOWE5fVEhSRVNIT0xEKSkKKwltcG5fbXVsICh0cCwgZHAsIGRuLCBxcCwgcW4pOwkJLyogbXVsaGlnaCAqLworICAgICAgZWxzZQorCXsKKwkgIHRuID0gbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAoZG4pOworCSAgbXBuX211bG1vZF9ibm0xICh0cCwgdG4sIGRwLCBkbiwgcXAsIHFuLCBzY3JhdGNoX291dCk7CisJICB3biA9IGRuICsgcW4gLSB0bjsJCQkvKiBudW1iZXIgb2Ygd3JhcHBlZCBsaW1icyAqLworCSAgaWYgKHduID4gMCkKKwkgICAgeworCSAgICAgIGMwID0gbXBuX3N1Yl9uICh0cCArIHRuLCB0cCwgcnAsIHduKTsKKwkgICAgICBtcG5fZGVjcl91ICh0cCArIHduLCBjMCk7CisJICAgIH0KKwl9CisKKyAgICAgIGN5ICs9IG1wbl9zdWJfbiAocnAsIHJwICsgcW4sIHRwICsgcW4sIGRuIC0gcW4pOworICAgICAgaWYgKGN5ID09IDIpCisJeworCSAgbXBuX2luY3JfdSAodHAgKyBkbiwgMSk7CisJICBjeSA9IDE7CisJfQorICAgICAgcmV0dXJuIG1wbl9zdWJfbmMgKHJwICsgZG4gLSBxbiwgbnAgKyBkbiArIGluLCB0cCArIGRuLCBxbiwgY3kpOworCisjdW5kZWYgaXAKKyN1bmRlZiB0cAorI3VuZGVmIHNjcmF0Y2hfb3V0CisgICAgfQorfQorCittcF9saW1iX3QKK21wbl9tdV9iZGl2X3FyIChtcF9wdHIgcXAsCisJCW1wX3B0ciBycCwKKwkJbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCW1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCQltcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfbGltYl90IGN5ID0gbXBuX211X2JkaXZfcXJfb2xkIChxcCwgcnAsIG5wLCBubiwgZHAsIGRuLCBzY3JhdGNoKTsKKworICAvKiBSJyBCXntxbn0gPSBVIC0gUScgRAorICAgKgorICAgKiBRID0gQl57cW59IC0gUScgKGFzc3VtaW5nIFEnICE9IDApCisgICAqCisgICAqIFIgQl57cW59ID0gVSArIFEgRCA9IFUgKyBCXntxbn0gRCAtIFEnIEQKKyAgICogICAgICAgICAgPSBCXntxbn0gRCArIFInCisgICAqLworCisgIGlmIChVTkxJS0VMWSAoIW1wbl9uZWcgKHFwLCBxcCwgbm4gLSBkbikpKQorICAgIHsKKyAgICAgIC8qIFplcm8gcXVvdGllbnQuICovCisgICAgICBBU1NFUlQgKGN5ID09IDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90IGN5MiA9IG1wbl9hZGRfbiAocnAsIHJwLCBkcCwgZG4pOworICAgICAgQVNTRVJUIChjeTIgPj0gY3kpOworCisgICAgICByZXR1cm4gY3kyIC0gY3k7CisgICAgfQorfQorCisKK21wX3NpemVfdAorbXBuX211X2JkaXZfcXJfaXRjaCAobXBfc2l6ZV90IG5uLCBtcF9zaXplX3QgZG4pCit7CisgIG1wX3NpemVfdCBxbiwgaW4sIHRuLCBpdGNoX2JpbnZlcnQsIGl0Y2hfb3V0LCBpdGNoZXM7CisgIG1wX3NpemVfdCBiOworCisgIEFTU0VSVF9BTFdBWVMgKERDX0JESVZfUV9USFJFU0hPTEQgPCBNVV9CRElWX1FfVEhSRVNIT0xEKTsKKworICBxbiA9IG5uIC0gZG47CisKKyAgaWYgKHFuID4gZG4pCisgICAgeworICAgICAgYiA9IChxbiAtIDEpIC8gZG4gKyAxOwkvKiBjZWlsKHFuL2RuKSwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgaW4gPSAocW4gLSAxKSAvIGIgKyAxOwkvKiBjZWlsKHFuL2IpID0gY2VpbChxbiAvIGNlaWwocW4vZG4pKSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGluID0gcW4gLSAocW4gPj4gMSk7CisgICAgfQorCisgIGlmIChCRUxPV19USFJFU0hPTEQgKGluLCBNVUxfVE9fTVVMTU9EX0JOTTFfRk9SXzJOWE5fVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICB0biA9IGRuICsgaW47CisgICAgICBpdGNoX291dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbik7CisgICAgICBpdGNoX291dCA9IG1wbl9tdWxtb2RfYm5tMV9pdGNoICh0biwgZG4sIGluKTsKKyAgICB9CisKKyAgaXRjaF9iaW52ZXJ0ID0gbXBuX2JpbnZlcnRfaXRjaCAoaW4pOworICBpdGNoZXMgPSB0biArIGl0Y2hfb3V0OworICByZXR1cm4gaW4gKyBNQVggKGl0Y2hlcywgaXRjaF9iaW52ZXJ0KTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211X2Rpdl9xLmMgYi9tcG4vZ2VuZXJpYy9tdV9kaXZfcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Y2ZiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdV9kaXZfcS5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiBtcG5fbXVfZGl2X3EuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR01QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA1LTIwMDcsIDIwMDksIDIwMTAsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyoKKyAgIFRoZSBpZGVhIG9mIHRoZSBhbGdvcml0aG0gdXNlZCBoZXJlaW4gaXMgdG8gY29tcHV0ZSBhIHNtYWxsZXIgaW52ZXJ0ZWQgdmFsdWUKKyAgIHRoYW4gdXNlZCBpbiB0aGUgc3RhbmRhcmQgQmFycmV0dCBhbGdvcml0aG0sIGFuZCB0aHVzIHNhdmUgdGltZSBpbiB0aGUKKyAgIE5ld3RvbiBpdGVyYXRpb25zLCBhbmQgcGF5IGp1c3QgYSBzbWFsbCBwcmljZSB3aGVuIHVzaW5nIHRoZSBpbnZlcnRlZCB2YWx1ZQorICAgZm9yIGRldmVsb3BpbmcgcXVvdGllbnQgYml0cy4gIFRoaXMgYWxnb3JpdGhtIHdhcyBwcmVzZW50ZWQgYXQgSUNNUyAyMDA2LgorKi8KKworLyoKKyAgVGhpbmdzIHRvIHdvcmsgb246CisKKyAgMS4gVGhpcyBpcyBhIHJ1ZGltZW50YXJ5IGltcGxlbWVudGF0aW9uIG9mIG1wbl9tdV9kaXZfcS4gIFRoZSBhbGdvcml0aG0gaXMKKyAgICAgcHJvYmFibHkgY2xvc2UgdG8gb3B0aW1hbCwgZXhjZXB0IHdoZW4gbXBuX211X2RpdmFwcHJfcSBmYWlscy4KKworICAyLiBXZSB1c2VkIHRvIGZhbGwgYmFjayB0byBtcG5fbXVfZGl2X3FyIHdoZW4gd2UgZGV0ZWN0IGEgcG9zc2libGUKKyAgICAgbXBuX211X2RpdmFwcHJfcSByb3VuZGluZyBwcm9ibGVtLCBub3cgd2UgbXVsdGlwbHkgYW5kIGNvbXBhcmUuCisgICAgIFVuZm9ydHVuYXRlbHksIHNpbmNlIG1wbl9tdV9kaXZhcHByX3EgZG9lcyBub3QgcmV0dXJuIHRoZSBwYXJ0aWFsCisgICAgIHJlbWFpbmRlciwgdGhpcyBhbHNvIGRvZXNuJ3QgYmVjb21lIG9wdGltYWwuICBBIG1wbl9tdV9kaXZhcHByX3FyIGNvdWxkCisgICAgIHNvbHZlIHRoYXQuCisKKyAgMy4gVGhlIGFsbG9jYXRpb25zIGRvbmUgaGVyZSBzaG91bGQgYmUgbWFkZSBmcm9tIHRoZSBzY3JhdGNoIGFyZWEsIHdoaWNoCisgICAgIHRoZW4gd291bGQgbmVlZCB0byBiZSBhbWVuZGVkLgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK21wX2xpbWJfdAorbXBuX211X2Rpdl9xIChtcF9wdHIgcXAsCisJICAgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJICAgICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJICAgICAgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3B0ciB0cCwgcnA7CisgIG1wX3NpemVfdCBxbjsKKyAgbXBfbGltYl90IGN5LCBxaDsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgcW4gPSBubiAtIGRuOworCisgIHRwID0gVE1QX0JBTExPQ19MSU1CUyAocW4gKyAxKTsKKworICBpZiAocW4gPj0gZG4pCQkJLyogbm4gPj0gMipkbiArIDEgKi8KKyAgICB7CisgICAgICAgLyogfF9fX19fX19fX19fX19fX19fX19fX19ffCAgIGRpdmlkZW5kCisJCQkgfF9fX19fX19ffCAgIGRpdmlzb3IgICovCisKKyAgICAgIHJwID0gVE1QX0JBTExPQ19MSU1CUyAobm4gKyAxKTsKKyAgICAgIE1QTl9DT1BZIChycCArIDEsIG5wLCBubik7CisgICAgICBycFswXSA9IDA7CisKKyAgICAgIHFoID0gbXBuX2NtcCAocnAgKyAxICsgbm4gLSBkbiwgZHAsIGRuKSA+PSAwOworICAgICAgaWYgKHFoICE9IDApCisJbXBuX3N1Yl9uIChycCArIDEgKyBubiAtIGRuLCBycCArIDEgKyBubiAtIGRuLCBkcCwgZG4pOworCisgICAgICBjeSA9IG1wbl9tdV9kaXZhcHByX3EgKHRwLCBycCwgbm4gKyAxLCBkcCwgZG4sIHNjcmF0Y2gpOworCisgICAgICBpZiAoVU5MSUtFTFkgKGN5ICE9IDApKQorCXsKKwkgIC8qIFNpbmNlIHRoZSBwYXJ0aWFsIHJlbWFpbmRlciBmZWQgdG8gbXBuX3ByZWludl9tdV9kaXZhcHByX3Egd2FzCisJICAgICBjYW5vbmljYWxseSByZWR1Y2VkLCByZXBsYWNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiBCXihxbi1kbikrZXBzCisJICAgICBieSB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZS4gICovCisJICBtcF9zaXplX3QgaTsKKwkgIGZvciAoaSA9IDA7IGkgPCBxbiArIDE7IGkrKykKKwkgICAgdHBbaV0gPSBHTVBfTlVNQl9NQVg7CisJfQorCisgICAgICAvKiBUaGUgbWF4IGVycm9yIG9mIG1wbl9tdV9kaXZhcHByX3EgaXMgKzQuICBJZiB0aGUgbG93IHF1b3RpZW50IGxpbWIgaXMKKwkgc21hbGxlciB0aGFuIHRoZSBtYXggZXJyb3IsIHdlIGNhbm5vdCB0cnVzdCB0aGUgcXVvdGllbnQuICAqLworICAgICAgaWYgKHRwWzBdID4gNCkKKwl7CisJICBNUE5fQ09QWSAocXAsIHRwICsgMSwgcW4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9saW1iX3QgY3k7CisJICBtcF9wdHIgcHA7CisKKwkgIHBwID0gcnA7CisJICBtcG5fbXVsIChwcCwgdHAgKyAxLCBxbiwgZHAsIGRuKTsKKworCSAgY3kgPSAocWggIT0gMCkgPyBtcG5fYWRkX24gKHBwICsgcW4sIHBwICsgcW4sIGRwLCBkbikgOiAwOworCisJICBpZiAoY3kgfHwgbXBuX2NtcCAocHAsIG5wLCBubikgPiAwKSAvKiBBdCBtb3N0IGlzIHdyb25nIGJ5IG9uZSwgbm8gY3ljbGUuICovCisJICAgIHFoIC09IG1wbl9zdWJfMSAocXAsIHRwICsgMSwgcW4sIDEpOworCSAgZWxzZSAvKiBTYW1lIGFzIGFib3ZlICovCisJICAgIE1QTl9DT1BZIChxcCwgdHAgKyAxLCBxbik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICAvKiB8X19fX19fX19fX19fX19fX19fX19fX198ICAgZGl2aWRlbmQKKwkJIHxfX19fX19fX19fX19fX19ffCAgIGRpdmlzb3IgICovCisKKyAgICAgIC8qIEZJWE1FOiBXaGVuIG5uID0gMmRuLTEsIHFuIGJlY29tZXMgZG4tMSwgYW5kIHRoZSBudW1lcmF0b3Igc2l6ZSBwYXNzZWQKKwkgaGVyZSBiZWNvbWVzIDJkbiwgaS5lLiwgbW9yZSB0aGFuIG5uLiAgVGhpcyBzaG91bGRuJ3QgaHVydCwgc2luY2Ugb25seQorCSB0aGUgbW9zdCBzaWduaWZpY2FudCBkbi0xIGxpbWJzIHdpbGwgYWN0dWFsbHkgYmUgcmVhZCwgYnV0IGl0IGlzIG5vdAorCSBwcmV0dHkuICAqLworCisgICAgICBxaCA9IG1wbl9tdV9kaXZhcHByX3EgKHRwLCBucCArIG5uIC0gKDIgKiBxbiArIDIpLCAyICogcW4gKyAyLAorCQkJICAgICBkcCArIGRuIC0gKHFuICsgMSksIHFuICsgMSwgc2NyYXRjaCk7CisKKyAgICAgIC8qIFRoZSBtYXggZXJyb3Igb2YgbXBuX211X2RpdmFwcHJfcSBpcyArNCwgYnV0IHdlIGdldCBhbiBhZGRpdGlvbmFsCisgICAgICAgICBlcnJvciBmcm9tIHRoZSBkaXZpc29yIHRydW5jYXRpb24uICAqLworICAgICAgaWYgKHRwWzBdID4gNikKKwl7CisJICBNUE5fQ09QWSAocXAsIHRwICsgMSwgcW4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9saW1iX3QgY3k7CisKKwkgIC8qIEZJWE1FOiBhIHNob3J0ZXIgcHJvZHVjdCBzaG91bGQgYmUgZW5vdWdoOyB3ZSBtYXkgdXNlIGFscmVhZHkKKwkgICAgIGFsbG9jYXRlZCBzcGFjZS4uLiAqLworCSAgcnAgPSBUTVBfQkFMTE9DX0xJTUJTIChubik7CisJICBtcG5fbXVsIChycCwgZHAsIGRuLCB0cCArIDEsIHFuKTsKKworCSAgY3kgPSAocWggIT0gMCkgPyBtcG5fYWRkX24gKHJwICsgcW4sIHJwICsgcW4sIGRwLCBkbikgOiAwOworCisJICBpZiAoY3kgfHwgbXBuX2NtcCAocnAsIG5wLCBubikgPiAwKSAvKiBBdCBtb3N0IGlzIHdyb25nIGJ5IG9uZSwgbm8gY3ljbGUuICovCisJICAgIHFoIC09IG1wbl9zdWJfMSAocXAsIHRwICsgMSwgcW4sIDEpOworCSAgZWxzZSAvKiBTYW1lIGFzIGFib3ZlICovCisJICAgIE1QTl9DT1BZIChxcCwgdHAgKyAxLCBxbik7CisJfQorICAgIH0KKworICBUTVBfRlJFRTsKKyAgcmV0dXJuIHFoOworfQorCittcF9zaXplX3QKK21wbl9tdV9kaXZfcV9pdGNoIChtcF9zaXplX3Qgbm4sIG1wX3NpemVfdCBkbiwgaW50IG11YV9rKQoreworICBtcF9zaXplX3QgcW47CisKKyAgcW4gPSBubiAtIGRuOworICBpZiAocW4gPj0gZG4pCisgICAgeworICAgICAgcmV0dXJuIG1wbl9tdV9kaXZhcHByX3FfaXRjaCAobm4gKyAxLCBkbiwgbXVhX2spOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBtcG5fbXVfZGl2YXBwcl9xX2l0Y2ggKDIgKiBxbiArIDIsIHFuICsgMSwgbXVhX2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211X2Rpdl9xci5jIGIvbXBuL2dlbmVyaWMvbXVfZGl2X3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5YzcwMgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL211X2Rpdl9xci5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBtcG5fbXVfZGl2X3FyLCBtcG5fcHJlaW52X211X2Rpdl9xci4KKworICAgQ29tcHV0ZSBRID0gZmxvb3IoTiAvIEQpIGFuZCBSID0gTi1RRC4gIE4gaXMgbm4gbGltYnMgYW5kIEQgaXMgZG4gbGltYnMgYW5kCisgICBtdXN0IGJlIG5vcm1hbGl6ZWQsIGFuZCBRIG11c3QgYmUgbm4tZG4gbGltYnMuICBUaGUgcmVxdWlyZW1lbnQgdGhhdCBRIGlzCisgICBubi1kbiBsaW1icyAoYW5kIG5vdCBubi1kbisxIGxpbWJzKSB3YXMgcHV0IGluIHBsYWNlIGluIG9yZGVyIHRvIGFsbG93IHVzIHRvCisgICBsZXQgTiBiZSB1bm1vZGlmaWVkIGR1cmluZyB0aGUgb3BlcmF0aW9uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNS0yMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qCisgICBUaGUgaWRlYSBvZiB0aGUgYWxnb3JpdGhtIHVzZWQgaGVyZWluIGlzIHRvIGNvbXB1dGUgYSBzbWFsbGVyIGludmVydGVkIHZhbHVlCisgICB0aGFuIHVzZWQgaW4gdGhlIHN0YW5kYXJkIEJhcnJldHQgYWxnb3JpdGhtLCBhbmQgdGh1cyBzYXZlIHRpbWUgaW4gdGhlCisgICBOZXd0b24gaXRlcmF0aW9ucywgYW5kIHBheSBqdXN0IGEgc21hbGwgcHJpY2Ugd2hlbiB1c2luZyB0aGUgaW52ZXJ0ZWQgdmFsdWUKKyAgIGZvciBkZXZlbG9waW5nIHF1b3RpZW50IGJpdHMuICBUaGlzIGFsZ29yaXRobSB3YXMgcHJlc2VudGVkIGF0IElDTVMgMjAwNi4KKyovCisKKy8qIENBVVRJT046IFRoaXMgY29kZSBhbmQgdGhlIGNvZGUgaW4gbXVfZGl2YXBwcl9xLmMgc2hvdWxkIGJlIGVkaXRlZCBpbiBzeW5jLgorCisgVGhpbmdzIHRvIHdvcmsgb246CisKKyAgKiBUaGlzIGlzbid0IG9wdGltYWwgd2hlbiB0aGUgcXVvdGllbnQgaXNuJ3QgbmVlZGVkLCBhcyBpdCBtaWdodCB0YWtlIGEgbG90CisgICAgb2Ygc3BhY2UuICBUaGUgY29tcHV0YXRpb24gaXMgYWx3YXlzIG5lZWRlZCwgdGhvdWdoLCBzbyB0aGVyZSBpcyBubyB0aW1lIHRvCisgICAgc2F2ZSB3aXRoIHNwZWNpYWwgY29kZS4KKworICAqIFRoZSBpdGNoL3NjcmF0Y2ggc2NoZW1lIGlzbid0IHBlcmhhcHMgc3VjaCBhIGdvb2QgaWRlYSBhcyBpdCBvbmNlIHNlZW1lZCwKKyAgICBkZW1vbnN0cmF0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgbXBuX2ludmVydGFwcHIgZnVuY3Rpb24ncyBzY3JhdGNoIG5lZWRzCisgICAgbWVhbiB0aGF0IHdlIG5lZWQgdG8ga2VlcCBhIGxhcmdlIGFsbG9jYXRpb24gbG9uZyBhZnRlciBpdCBpcyBuZWVkZWQuCisgICAgVGhpbmdzIGFyZSB3b3JzZSBhcyBtcG5fbXVsX2ZmdCBkb2VzIG5vdCBhY2NlcHQgYW55IHNjcmF0Y2ggcGFyYW1ldGVyLAorICAgIHdoaWNoIG1lYW5zIHdlJ2xsIGhhdmUgYSBsYXJnZSBtZW1vcnkgaG9sZSB3aGlsZSBpbiBtcG5fbXVsX2ZmdC4gIEluCisgICAgZ2VuZXJhbCwgYSBwZWFrIHNjcmF0Y2ggbmVlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGEgZnVuY3Rpb24gaXNuJ3QKKyAgICB3ZWxsLWhhbmRsZWQgYnkgdGhlIGl0Y2gvc2NyYXRjaCBzY2hlbWUuCisqLworCisjaWZkZWYgU1RBVAorI3VuZGVmIFNUQVQKKyNkZWZpbmUgU1RBVCh4KSB4CisjZWxzZQorI2RlZmluZSBTVEFUKHgpCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEZJWE1FOiBUaGUgTVVfRElWX1FSX1NLRVdfVEhSRVNIT0xEIHdhcyBub3QgYW5hbHlzZWQgcHJvcGVybHkuICBJdCBnaXZlcyBhCisgICBzcGVlZHVwIGFjY29yZGluZyB0byBvbGQgbWVhc3VyZW1lbnRzLCBidXQgZG9lcyB0aGUgZGVjaXNpb24gbWVjaGFuaXNtCisgICByZWFsbHkgbWFrZSBzZW5zZT8gIEl0IHNlZW0gbGlrZSB0aGUgcXVvdGllbnQgYmV0d2VlbiBkbiBhbmQgcW4gbWlnaHQgYmUKKyAgIHdoYXQgd2UgcmVhbGx5IHNob3VsZCBiZSBjaGVja2luZy4gICovCisjaWZuZGVmIE1VX0RJVl9RUl9TS0VXX1RIUkVTSE9MRAorI2RlZmluZSBNVV9ESVZfUVJfU0tFV19USFJFU0hPTEQgMTAwCisjZW5kaWYKKworI2lmZGVmIENIRUNLCQkJCS8qIEZJWE1FOiBFbmFibGUgaW4gbWluaXRocmVzICovCisjdW5kZWYgIE1VX0RJVl9RUl9TS0VXX1RIUkVTSE9MRAorI2RlZmluZSBNVV9ESVZfUVJfU0tFV19USFJFU0hPTEQgMQorI2VuZGlmCisKKworc3RhdGljIG1wX2xpbWJfdCBtcG5fbXVfZGl2X3FyMiAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfcHRyKTsKK3N0YXRpYyBtcF9zaXplX3QgbXBuX211X2Rpdl9xcl9jaG9vc2VfaW4gKG1wX3NpemVfdCwgbXBfc2l6ZV90LCBpbnQpOworCisKK21wX2xpbWJfdAorbXBuX211X2Rpdl9xciAobXBfcHRyIHFwLAorCSAgICAgICBtcF9wdHIgcnAsCisJICAgICAgIG1wX3NyY3B0ciBucCwKKwkgICAgICAgbXBfc2l6ZV90IG5uLAorCSAgICAgICBtcF9zcmNwdHIgZHAsCisJICAgICAgIG1wX3NpemVfdCBkbiwKKwkgICAgICAgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBxbjsKKyAgbXBfbGltYl90IGN5LCBxaDsKKworICBxbiA9IG5uIC0gZG47CisgIGlmIChxbiArIE1VX0RJVl9RUl9TS0VXX1RIUkVTSE9MRCA8IGRuKQorICAgIHsKKyAgICAgIC8qIHxfX19fX19fX19fX19fX3xfaWduX2ZpcnN0X198ICAgZGl2aWRlbmQJCQkgIG5uCisJCXxfX19fX19ffF9pZ25fZmlyc3RfX3wgICBkaXZpc29yCQkJICBkbgorCisJCXxfX19fX198CSAgICAgcXVvdGllbnQgKHByZWwpCQkJICBxbgorCisJCSB8X19fX19fX19fX19fX19fX19fX3wgICBxdW90aWVudCAqIGlnbm9yZWQtZGl2aXNvci1wYXJ0ICBkbi0xCisgICAgICAqLworCisgICAgICAvKiBDb21wdXRlIGEgcHJlbGltaW5hcnkgcXVvdGllbnQgYW5kIGEgcGFydGlhbCByZW1haW5kZXIgYnkgZGl2aWRpbmcgdGhlCisJIG1vc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgZWFjaCBvcGVyYW5kLiAgKi8KKyAgICAgIHFoID0gbXBuX211X2Rpdl9xcjIgKHFwLCBycCArIG5uIC0gKDIgKiBxbiArIDEpLAorCQkJICAgbnAgKyBubiAtICgyICogcW4gKyAxKSwgMiAqIHFuICsgMSwKKwkJCSAgIGRwICsgZG4gLSAocW4gKyAxKSwgcW4gKyAxLAorCQkJICAgc2NyYXRjaCk7CisKKyAgICAgIC8qIE11bHRpcGx5IHRoZSBxdW90aWVudCBieSB0aGUgZGl2aXNvciBsaW1icyBpZ25vcmVkIGFib3ZlLiAgKi8KKyAgICAgIGlmIChkbiAtIChxbiArIDEpID4gcW4pCisJbXBuX211bCAoc2NyYXRjaCwgZHAsIGRuIC0gKHFuICsgMSksIHFwLCBxbik7ICAvKiBwcm9kIGlzIGRuLTEgbGltYnMgKi8KKyAgICAgIGVsc2UKKwltcG5fbXVsIChzY3JhdGNoLCBxcCwgcW4sIGRwLCBkbiAtIChxbiArIDEpKTsgIC8qIHByb2QgaXMgZG4tMSBsaW1icyAqLworCisgICAgICBpZiAocWgpCisJY3kgPSBtcG5fYWRkX24gKHNjcmF0Y2ggKyBxbiwgc2NyYXRjaCArIHFuLCBkcCwgZG4gLSAocW4gKyAxKSk7CisgICAgICBlbHNlCisJY3kgPSAwOworICAgICAgc2NyYXRjaFtkbiAtIDFdID0gY3k7CisKKyAgICAgIGN5ID0gbXBuX3N1Yl9uIChycCwgbnAsIHNjcmF0Y2gsIG5uIC0gKDIgKiBxbiArIDEpKTsKKyAgICAgIGN5ID0gbXBuX3N1Yl9uYyAocnAgKyBubiAtICgyICogcW4gKyAxKSwKKwkJICAgICAgIHJwICsgbm4gLSAoMiAqIHFuICsgMSksCisJCSAgICAgICBzY3JhdGNoICsgbm4gLSAoMiAqIHFuICsgMSksCisJCSAgICAgICBxbiArIDEsIGN5KTsKKyAgICAgIGlmIChjeSkKKwl7CisJICBxaCAtPSBtcG5fc3ViXzEgKHFwLCBxcCwgcW4sIDEpOworCSAgbXBuX2FkZF9uIChycCwgcnAsIGRwLCBkbik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHFoID0gbXBuX211X2Rpdl9xcjIgKHFwLCBycCwgbnAsIG5uLCBkcCwgZG4sIHNjcmF0Y2gpOworICAgIH0KKworICByZXR1cm4gcWg7Cit9CisKK3N0YXRpYyBtcF9saW1iX3QKK21wbl9tdV9kaXZfcXIyIChtcF9wdHIgcXAsCisJCW1wX3B0ciBycCwKKwkJbXBfc3JjcHRyIG5wLAorCQltcF9zaXplX3Qgbm4sCisJCW1wX3NyY3B0ciBkcCwKKwkJbXBfc2l6ZV90IGRuLAorCQltcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuLCBpbjsKKyAgbXBfbGltYl90IGN5LCBxaDsKKyAgbXBfcHRyIGlwLCB0cDsKKworICBBU1NFUlQgKGRuID4gMSk7CisKKyAgcW4gPSBubiAtIGRuOworCisgIC8qIENvbXB1dGUgdGhlIGludmVyc2Ugc2l6ZS4gICovCisgIGluID0gbXBuX211X2Rpdl9xcl9jaG9vc2VfaW4gKHFuLCBkbiwgMCk7CisgIEFTU0VSVCAoaW4gPD0gZG4pOworCisjaWYgMQorICAvKiBUaGlzIGFsdGVybmF0aXZlIGludmVyc2UgY29tcHV0YXRpb24gbWV0aG9kIGdldHMgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZQorICAgICByZXN1bHRzLiAgRklYTUVzOiAoMSkgVGVtcCBhbGxvY2F0aW9uIG5lZWRzIG5vdCBhbmFseXNlZCAoMikgaXRjaCBmdW5jdGlvbgorICAgICBub3QgYWRhcHRlZCAoMykgbXBuX2ludmVydGFwcHIgc2NyYXRjaCBuZWVkcyBub3QgbWV0LiAgKi8KKyAgaXAgPSBzY3JhdGNoOworICB0cCA9IHNjcmF0Y2ggKyBpbiArIDE7CisKKyAgLyogY29tcHV0ZSBhbiBhcHByb3hpbWF0ZSBpbnZlcnNlIG9uIChpbisxKSBsaW1icyAqLworICBpZiAoZG4gPT0gaW4pCisgICAgeworICAgICAgTVBOX0NPUFkgKHRwICsgMSwgZHAsIGluKTsKKyAgICAgIHRwWzBdID0gMTsKKyAgICAgIG1wbl9pbnZlcnRhcHByIChpcCwgdHAsIGluICsgMSwgdHAgKyBpbiArIDEpOworICAgICAgTVBOX0NPUFlfSU5DUiAoaXAsIGlwICsgMSwgaW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF8xICh0cCwgZHAgKyBkbiAtIChpbiArIDEpLCBpbiArIDEsIDEpOworICAgICAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwlNUE5fWkVSTyAoaXAsIGluKTsKKyAgICAgIGVsc2UKKwl7CisJICBtcG5faW52ZXJ0YXBwciAoaXAsIHRwLCBpbiArIDEsIHRwICsgaW4gKyAxKTsKKwkgIE1QTl9DT1BZX0lOQ1IgKGlwLCBpcCArIDEsIGluKTsKKwl9CisgICAgfQorI2Vsc2UKKyAgLyogVGhpcyBvbGRlciBpbnZlcnNlIGNvbXB1dGF0aW9uIG1ldGhvZCBnZXRzIHNsaWdodGx5IHdvcnNlIHJlc3VsdHMgdGhhbiB0aGUKKyAgICAgb25lIGFib3ZlLiAgKi8KKyAgaXAgPSBzY3JhdGNoOworICB0cCA9IHNjcmF0Y2ggKyBpbjsKKworICAvKiBDb21wdXRlIGludmVyc2Ugb2YgRCB0byBpbisxIGxpbWJzLCB0aGVuIHJvdW5kIHRvICdpbicgbGltYnMuICBJZGVhbGx5IHRoZQorICAgICBpbnZlcnNpb24gZnVuY3Rpb24gc2hvdWxkIGRvIHRoaXMgYXV0b21hdGljYWxseS4gICovCisgIGlmIChkbiA9PSBpbikKKyAgICB7CisgICAgICB0cFtpbiArIDFdID0gMDsKKyAgICAgIE1QTl9DT1BZICh0cCArIGluICsgMiwgZHAsIGluKTsKKyAgICAgIG1wbl9pbnZlcnRhcHByICh0cCwgdHAgKyBpbiArIDEsIGluICsgMSwgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX2ludmVydGFwcHIgKHRwLCBkcCArIGRuIC0gKGluICsgMSksIGluICsgMSwgTlVMTCk7CisgICAgfQorICBjeSA9IG1wbl9zdWJfMSAodHAsIHRwLCBpbiArIDEsIEdNUF9OVU1CX0hJR0hCSVQpOworICBpZiAoVU5MSUtFTFkgKGN5ICE9IDApKQorICAgIE1QTl9aRVJPICh0cCArIDEsIGluKTsKKyAgTVBOX0NPUFkgKGlwLCB0cCArIDEsIGluKTsKKyNlbmRpZgorCisgIHFoID0gbXBuX3ByZWludl9tdV9kaXZfcXIgKHFwLCBycCwgbnAsIG5uLCBkcCwgZG4sIGlwLCBpbiwgc2NyYXRjaCArIGluKTsKKworICByZXR1cm4gcWg7Cit9CisKK21wX2xpbWJfdAorbXBuX3ByZWludl9tdV9kaXZfcXIgKG1wX3B0ciBxcCwKKwkJICAgICAgbXBfcHRyIHJwLAorCQkgICAgICBtcF9zcmNwdHIgbnAsCisJCSAgICAgIG1wX3NpemVfdCBubiwKKwkJICAgICAgbXBfc3JjcHRyIGRwLAorCQkgICAgICBtcF9zaXplX3QgZG4sCisJCSAgICAgIG1wX3NyY3B0ciBpcCwKKwkJICAgICAgbXBfc2l6ZV90IGluLAorCQkgICAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9saW1iX3QgY3ksIGN4LCBxaDsKKyAgbXBfbGltYl90IHI7CisgIG1wX3NpemVfdCB0biwgd247CisKKyNkZWZpbmUgdHAgICAgICAgICAgIHNjcmF0Y2gKKyNkZWZpbmUgc2NyYXRjaF9vdXQgIChzY3JhdGNoICsgdG4pCisKKyAgcW4gPSBubiAtIGRuOworCisgIG5wICs9IHFuOworICBxcCArPSBxbjsKKworICBxaCA9IG1wbl9jbXAgKG5wLCBkcCwgZG4pID49IDA7CisgIGlmIChxaCAhPSAwKQorICAgIG1wbl9zdWJfbiAocnAsIG5wLCBkcCwgZG4pOworICBlbHNlCisgICAgTVBOX0NPUFlfSU5DUiAocnAsIG5wLCBkbik7CisKKyAgLyogaWYgKHFuID09IDApICovCQkJLyogVGhlIHdoaWxlIGJlbG93IGhhbmRsZXMgdGhpcyBjYXNlICovCisgIC8qICAgcmV0dXJuIHFoOyAqLwkJCS8qIERlZ2VuZXJhdGUgdXNlLiAgU2hvdWxkIHdlIGFsbG93IHRoaXM/ICovCisKKyAgd2hpbGUgKHFuID4gMCkKKyAgICB7CisgICAgICBpZiAocW4gPCBpbikKKwl7CisJICBpcCArPSBpbiAtIHFuOworCSAgaW4gPSBxbjsKKwl9CisgICAgICBucCAtPSBpbjsKKyAgICAgIHFwIC09IGluOworCisgICAgICAvKiBDb21wdXRlIHRoZSBuZXh0IGJsb2NrIG9mIHF1b3RpZW50IGxpbWJzIGJ5IG11bHRpcGx5aW5nIHRoZSBpbnZlcnNlIEkKKwkgYnkgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhcnRpYWwgcmVtYWluZGVyIFIuICAqLworICAgICAgbXBuX211bF9uICh0cCwgcnAgKyBkbiAtIGluLCBpcCwgaW4pOwkJLyogbXVsaGkgICovCisgICAgICBjeSA9IG1wbl9hZGRfbiAocXAsIHRwICsgaW4sIHJwICsgZG4gLSBpbiwgaW4pOwkvKiBJJ3MgbXNiIGltcGxpY2l0ICovCisgICAgICBBU1NFUlRfQUxXQVlTIChjeSA9PSAwKTsKKworICAgICAgcW4gLT0gaW47CisKKyAgICAgIC8qIENvbXB1dGUgdGhlIHByb2R1Y3Qgb2YgdGhlIHF1b3RpZW50IGJsb2NrIGFuZCB0aGUgZGl2aXNvciBELCB0byBiZQorCSBzdWJ0cmFjdGVkIGZyb20gdGhlIHBhcnRpYWwgcmVtYWluZGVyIGNvbWJpbmVkIHdpdGggbmV3IGxpbWJzIGZyb20gdGhlCisJIGRpdmlkZW5kIE4uICBXZSBvbmx5IHJlYWxseSBuZWVkIHRoZSBsb3cgZG4rMSBsaW1icy4gICovCisKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKGluLCBNVUxfVE9fTVVMTU9EX0JOTTFfRk9SXzJOWE5fVEhSRVNIT0xEKSkKKwltcG5fbXVsICh0cCwgZHAsIGRuLCBxcCwgaW4pOwkJLyogZG4raW4gbGltYnMsIGhpZ2ggJ2luJyBjYW5jZWxzICovCisgICAgICBlbHNlCisJeworCSAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbiArIDEpOworCSAgbXBuX211bG1vZF9ibm0xICh0cCwgdG4sIGRwLCBkbiwgcXAsIGluLCBzY3JhdGNoX291dCk7CisJICB3biA9IGRuICsgaW4gLSB0bjsJCQkvKiBudW1iZXIgb2Ygd3JhcHBlZCBsaW1icyAqLworCSAgaWYgKHduID4gMCkKKwkgICAgeworCSAgICAgIGN5ID0gbXBuX3N1Yl9uICh0cCwgdHAsIHJwICsgZG4gLSB3biwgd24pOworCSAgICAgIGN5ID0gbXBuX3N1Yl8xICh0cCArIHduLCB0cCArIHduLCB0biAtIHduLCBjeSk7CisJICAgICAgY3ggPSBtcG5fY21wIChycCArIGRuIC0gaW4sIHRwICsgZG4sIHRuIC0gZG4pIDwgMDsKKwkgICAgICBBU1NFUlRfQUxXQVlTIChjeCA+PSBjeSk7CisJICAgICAgbXBuX2luY3JfdSAodHAsIGN4IC0gY3kpOworCSAgICB9CisJfQorCisgICAgICByID0gcnBbZG4gLSBpbl0gLSB0cFtkbl07CisKKyAgICAgIC8qIFN1YnRyYWN0IHRoZSBwcm9kdWN0IGZyb20gdGhlIHBhcnRpYWwgcmVtYWluZGVyIGNvbWJpbmVkIHdpdGggbmV3CisJIGxpbWJzIGZyb20gdGhlIGRpdmlkZW5kIE4sIGdlbmVyYXRpbmcgYSBuZXcgcGFydGlhbCByZW1haW5kZXIgUi4gICovCisgICAgICBpZiAoZG4gIT0gaW4pCisJeworCSAgY3kgPSBtcG5fc3ViX24gKHRwLCBucCwgdHAsIGluKTsJLyogZ2V0IG5leHQgJ2luJyBsaW1icyBmcm9tIE4gKi8KKwkgIGN5ID0gbXBuX3N1Yl9uYyAodHAgKyBpbiwgcnAsIHRwICsgaW4sIGRuIC0gaW4sIGN5KTsKKwkgIE1QTl9DT1BZIChycCwgdHAsIGRuKTsJCS8qIEZJWE1FOiB0cnkgdG8gYXZvaWQgdGhpcyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjeSA9IG1wbl9zdWJfbiAocnAsIG5wLCB0cCwgaW4pOwkvKiBnZXQgbmV4dCAnaW4nIGxpbWJzIGZyb20gTiAqLworCX0KKworICAgICAgU1RBVCAoaW50IGk7IGludCBlcnIgPSAwOworCSAgICBzdGF0aWMgaW50IGVycmFycls1XTsgc3RhdGljIGludCBlcnJfcmVjOyBzdGF0aWMgaW50IHRvdCk7CisKKyAgICAgIC8qIENoZWNrIHRoZSByZW1haW5kZXIgUiBhbmQgYWRqdXN0IHRoZSBxdW90aWVudCBhcyBuZWVkZWQuICAqLworICAgICAgciAtPSBjeTsKKyAgICAgIHdoaWxlIChyICE9IDApCisJeworCSAgLyogV2UgbG9vcCAwIHRpbWVzIHdpdGggYWJvdXQgNjklIHByb2JhYmlsaXR5LCAxIHRpbWUgd2l0aCBhYm91dCAzMSUKKwkgICAgIHByb2JhYmlsaXR5LCAyIHRpbWVzIHdpdGggYWJvdXQgMC42JSBwcm9iYWJpbGl0eSwgaWYgaW52ZXJzZSBpcworCSAgICAgY29tcHV0ZWQgYXMgcmVjb21tZW5kZWQuICAqLworCSAgbXBuX2luY3JfdSAocXAsIDEpOworCSAgY3kgPSBtcG5fc3ViX24gKHJwLCBycCwgZHAsIGRuKTsKKwkgIHIgLT0gY3k7CisJICBTVEFUIChlcnIrKyk7CisJfQorICAgICAgaWYgKG1wbl9jbXAgKHJwLCBkcCwgZG4pID49IDApCisJeworCSAgLyogVGhpcyBpcyBleGVjdXRlZCB3aXRoIGFib3V0IDc2JSBwcm9iYWJpbGl0eS4gICovCisJICBtcG5faW5jcl91IChxcCwgMSk7CisJICBjeSA9IG1wbl9zdWJfbiAocnAsIHJwLCBkcCwgZG4pOworCSAgU1RBVCAoZXJyKyspOworCX0KKworICAgICAgU1RBVCAoCisJICAgIHRvdCsrOworCSAgICBlcnJhcnJbZXJyXSsrOworCSAgICBpZiAoZXJyID4gZXJyX3JlYykKKwkgICAgICBlcnJfcmVjID0gZXJyOworCSAgICBpZiAodG90ICUgMHgxMDAwMCA9PSAwKQorCSAgICAgIHsKKwkJZm9yIChpID0gMDsgaSA8PSBlcnJfcmVjOyBpKyspCisJCSAgcHJpbnRmICgiICAlZCglLjFmJSUpIiwgZXJyYXJyW2ldLCAxMDAuMCplcnJhcnJbaV0vdG90KTsKKwkJcHJpbnRmICgiXG4iKTsKKwkgICAgICB9CisJICAgICk7CisgICAgfQorCisgIHJldHVybiBxaDsKK30KKworLyogSW4gY2FzZSBrPTAgKGF1dG9tYXRpYyBjaG9pY2UpLCB3ZSBkaXN0aW5ndWlzaCAzIGNhc2VzOgorICAgKGEpIGRuIDwgcW46ICAgICAgICAgaW4gPSBjZWlsKHFuIC8gY2VpbChxbi9kbikpCisgICAoYikgZG4vMyA8IHFuIDw9IGRuOiBpbiA9IGNlaWwocW4gLyAyKQorICAgKGMpIHFuIDwgZG4vMzogICAgICAgaW4gPSBxbgorICAgSW4gYWxsIGNhc2VzIHdlIGhhdmUgaW4gPD0gZG4uCisgKi8KK3N0YXRpYyBtcF9zaXplX3QKK21wbl9tdV9kaXZfcXJfY2hvb3NlX2luIChtcF9zaXplX3QgcW4sIG1wX3NpemVfdCBkbiwgaW50IGspCit7CisgIG1wX3NpemVfdCBpbjsKKworICBpZiAoayA9PSAwKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBiOworICAgICAgaWYgKHFuID4gZG4pCisJeworCSAgLyogQ29tcHV0ZSBhbiBpbnZlcnNlIHNpemUgdGhhdCBpcyBhIG5pY2UgcGFydGl0aW9uIG9mIHRoZSBxdW90aWVudC4gICovCisJICBiID0gKHFuIC0gMSkgLyBkbiArIDE7CS8qIGNlaWwocW4vZG4pLCBudW1iZXIgb2YgYmxvY2tzICovCisJICBpbiA9IChxbiAtIDEpIC8gYiArIDE7CS8qIGNlaWwocW4vYikgPSBjZWlsKHFuIC8gY2VpbChxbi9kbikpICovCisJfQorICAgICAgZWxzZSBpZiAoMyAqIHFuID4gZG4pCisJeworCSAgaW4gPSAocW4gLSAxKSAvIDIgKyAxOwkvKiBiID0gMiAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbiA9IChxbiAtIDEpIC8gMSArIDE7CS8qIGIgPSAxICovCisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCB4bjsKKyAgICAgIHhuID0gTUlOIChkbiwgcW4pOworICAgICAgaW4gPSAoeG4gLSAxKSAvIGsgKyAxOworICAgIH0KKworICByZXR1cm4gaW47Cit9CisKK21wX3NpemVfdAorbXBuX211X2Rpdl9xcl9pdGNoIChtcF9zaXplX3Qgbm4sIG1wX3NpemVfdCBkbiwgaW50IG11YV9rKQoreworICBtcF9zaXplX3QgaW4gPSBtcG5fbXVfZGl2X3FyX2Nob29zZV9pbiAobm4gLSBkbiwgZG4sIG11YV9rKTsKKyAgbXBfc2l6ZV90IGl0Y2hfcHJlaW52ID0gbXBuX3ByZWludl9tdV9kaXZfcXJfaXRjaCAobm4sIGRuLCBpbik7CisgIG1wX3NpemVfdCBpdGNoX2ludmFwcCA9IG1wbl9pbnZlcnRhcHByX2l0Y2ggKGluICsgMSkgKyBpbiArIDI7IC8qIDNpbiArIDQgKi8KKworICBBU1NFUlQgKGl0Y2hfcHJlaW52ID49IGl0Y2hfaW52YXBwKTsKKyAgcmV0dXJuIGluICsgTUFYIChpdGNoX2ludmFwcCwgaXRjaF9wcmVpbnYpOworfQorCittcF9zaXplX3QKK21wbl9wcmVpbnZfbXVfZGl2X3FyX2l0Y2ggKG1wX3NpemVfdCBubiwgbXBfc2l6ZV90IGRuLCBtcF9zaXplX3QgaW4pCit7CisgIG1wX3NpemVfdCBpdGNoX2xvY2FsID0gbXBuX211bG1vZF9ibm0xX25leHRfc2l6ZSAoZG4gKyAxKTsKKyAgbXBfc2l6ZV90IGl0Y2hfb3V0ID0gbXBuX211bG1vZF9ibm0xX2l0Y2ggKGl0Y2hfbG9jYWwsIGRuLCBpbik7CisKKyAgcmV0dXJuIGl0Y2hfbG9jYWwgKyBpdGNoX291dDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211X2RpdmFwcHJfcS5jIGIvbXBuL2dlbmVyaWMvbXVfZGl2YXBwcl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmN2UwMwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL211X2RpdmFwcHJfcS5jCkBAIC0wLDAgKzEsMzY4IEBACisvKiBtcG5fbXVfZGl2YXBwcl9xLCBtcG5fcHJlaW52X211X2RpdmFwcHJfcS4KKworICAgQ29tcHV0ZSBRID0gZmxvb3IoTiAvIEQpICsgZS4gIE4gaXMgbm4gbGltYnMsIEQgaXMgZG4gbGltYnMgYW5kIG11c3QgYmUKKyAgIG5vcm1hbGl6ZWQsIGFuZCBRIG11c3QgYmUgbm4tZG4gbGltYnMsIDAgPD0gZSA8PSA0LiAgVGhlIHJlcXVpcmVtZW50IHRoYXQgUQorICAgaXMgbm4tZG4gbGltYnMgKGFuZCBub3Qgbm4tZG4rMSBsaW1icykgd2FzIHB1dCBpbiBwbGFjZSBpbiBvcmRlciB0byBhbGxvdyB1cworICAgdG8gbGV0IE4gYmUgdW5tb2RpZmllZCBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDUtMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKgorICAgVGhlIGlkZWEgb2YgdGhlIGFsZ29yaXRobSB1c2VkIGhlcmVpbiBpcyB0byBjb21wdXRlIGEgc21hbGxlciBpbnZlcnRlZCB2YWx1ZQorICAgdGhhbiB1c2VkIGluIHRoZSBzdGFuZGFyZCBCYXJyZXR0IGFsZ29yaXRobSwgYW5kIHRodXMgc2F2ZSB0aW1lIGluIHRoZQorICAgTmV3dG9uIGl0ZXJhdGlvbnMsIGFuZCBwYXkganVzdCBhIHNtYWxsIHByaWNlIHdoZW4gdXNpbmcgdGhlIGludmVydGVkIHZhbHVlCisgICBmb3IgZGV2ZWxvcGluZyBxdW90aWVudCBiaXRzLiAgVGhpcyBhbGdvcml0aG0gd2FzIHByZXNlbnRlZCBhdCBJQ01TIDIwMDYuCisqLworCisvKiBDQVVUSU9OOiBUaGlzIGNvZGUgYW5kIHRoZSBjb2RlIGluIG11X2Rpdl9xci5jIHNob3VsZCBiZSBlZGl0ZWQgaW4gc3luYy4KKworIFRoaW5ncyB0byB3b3JrIG9uOgorCisgICogVGhlIGl0Y2gvc2NyYXRjaCBzY2hlbWUgaXNuJ3QgcGVyaGFwcyBzdWNoIGEgZ29vZCBpZGVhIGFzIGl0IG9uY2Ugc2VlbWVkLAorICAgIGRlbW9uc3RyYXRlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBtcG5faW52ZXJ0YXBwciBmdW5jdGlvbidzIHNjcmF0Y2ggbmVlZHMKKyAgICBtZWFuIHRoYXQgd2UgbmVlZCB0byBrZWVwIGEgbGFyZ2UgYWxsb2NhdGlvbiBsb25nIGFmdGVyIGl0IGlzIG5lZWRlZC4KKyAgICBUaGluZ3MgYXJlIHdvcnNlIGFzIG1wbl9tdWxfZmZ0IGRvZXMgbm90IGFjY2VwdCBhbnkgc2NyYXRjaCBwYXJhbWV0ZXIsCisgICAgd2hpY2ggbWVhbnMgd2UnbGwgaGF2ZSBhIGxhcmdlIG1lbW9yeSBob2xlIHdoaWxlIGluIG1wbl9tdWxfZmZ0LiAgSW4KKyAgICBnZW5lcmFsLCBhIHBlYWsgc2NyYXRjaCBuZWVkIGluIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbiBpc24ndAorICAgIHdlbGwtaGFuZGxlZCBieSB0aGUgaXRjaC9zY3JhdGNoIHNjaGVtZS4KKyovCisKKyNpZmRlZiBTVEFUCisjdW5kZWYgU1RBVAorI2RlZmluZSBTVEFUKHgpIHgKKyNlbHNlCisjZGVmaW5lIFNUQVQoeCkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3N0YXRpYyBtcF9saW1iX3QgbXBuX3ByZWludl9tdV9kaXZhcHByX3EgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsCisJCQkgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworc3RhdGljIG1wX3NpemVfdCBtcG5fbXVfZGl2YXBwcl9xX2Nob29zZV9pbiAobXBfc2l6ZV90LCBtcF9zaXplX3QsIGludCk7CisKK21wX2xpbWJfdAorbXBuX211X2RpdmFwcHJfcSAobXBfcHRyIHFwLAorCQkgIG1wX3NyY3B0ciBucCwKKwkJICBtcF9zaXplX3Qgbm4sCisJCSAgbXBfc3JjcHRyIGRwLAorCQkgIG1wX3NpemVfdCBkbiwKKwkJICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuLCBpbjsKKyAgbXBfbGltYl90IGN5LCBxaDsKKyAgbXBfcHRyIGlwLCB0cDsKKworICBBU1NFUlQgKGRuID4gMSk7CisKKyAgcW4gPSBubiAtIGRuOworCisgIC8qIElmIFEgaXMgc21hbGxlciB0aGFuIEQsIHRydW5jYXRlIG9wZXJhbmRzLiAqLworICBpZiAocW4gKyAxIDwgZG4pCisgICAgeworICAgICAgbnAgKz0gZG4gLSAocW4gKyAxKTsKKyAgICAgIG5uIC09IGRuIC0gKHFuICsgMSk7CisgICAgICBkcCArPSBkbiAtIChxbiArIDEpOworICAgICAgZG4gPSBxbiArIDE7CisgICAgfQorCisgIC8qIENvbXB1dGUgdGhlIGludmVyc2Ugc2l6ZS4gICovCisgIGluID0gbXBuX211X2RpdmFwcHJfcV9jaG9vc2VfaW4gKHFuLCBkbiwgMCk7CisgIEFTU0VSVCAoaW4gPD0gZG4pOworCisjaWYgMQorICAvKiBUaGlzIGFsdGVybmF0aXZlIGludmVyc2UgY29tcHV0YXRpb24gbWV0aG9kIGdldHMgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZQorICAgICByZXN1bHRzLiAgRklYTUVzOiAoMSkgVGVtcCBhbGxvY2F0aW9uIG5lZWRzIG5vdCBhbmFseXNlZCAoMikgaXRjaCBmdW5jdGlvbgorICAgICBub3QgYWRhcHRlZCAoMykgbXBuX2ludmVydGFwcHIgc2NyYXRjaCBuZWVkcyBub3QgbWV0LiAgKi8KKyAgaXAgPSBzY3JhdGNoOworICB0cCA9IHNjcmF0Y2ggKyBpbiArIDE7CisKKyAgLyogY29tcHV0ZSBhbiBhcHByb3hpbWF0ZSBpbnZlcnNlIG9uIChpbisxKSBsaW1icyAqLworICBpZiAoZG4gPT0gaW4pCisgICAgeworICAgICAgTVBOX0NPUFkgKHRwICsgMSwgZHAsIGluKTsKKyAgICAgIHRwWzBdID0gMTsKKyAgICAgIG1wbl9pbnZlcnRhcHByIChpcCwgdHAsIGluICsgMSwgdHAgKyBpbiArIDEpOworICAgICAgTVBOX0NPUFlfSU5DUiAoaXAsIGlwICsgMSwgaW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF8xICh0cCwgZHAgKyBkbiAtIChpbiArIDEpLCBpbiArIDEsIDEpOworICAgICAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwlNUE5fWkVSTyAoaXAsIGluKTsKKyAgICAgIGVsc2UKKwl7CisJICBtcG5faW52ZXJ0YXBwciAoaXAsIHRwLCBpbiArIDEsIHRwICsgaW4gKyAxKTsKKwkgIE1QTl9DT1BZX0lOQ1IgKGlwLCBpcCArIDEsIGluKTsKKwl9CisgICAgfQorI2Vsc2UKKyAgLyogVGhpcyBvbGRlciBpbnZlcnNlIGNvbXB1dGF0aW9uIG1ldGhvZCBnZXRzIHNsaWdodGx5IHdvcnNlIHJlc3VsdHMgdGhhbiB0aGUKKyAgICAgb25lIGFib3ZlLiAgKi8KKyAgaXAgPSBzY3JhdGNoOworICB0cCA9IHNjcmF0Y2ggKyBpbjsKKworICAvKiBDb21wdXRlIGludmVyc2Ugb2YgRCB0byBpbisxIGxpbWJzLCB0aGVuIHJvdW5kIHRvICdpbicgbGltYnMuICBJZGVhbGx5IHRoZQorICAgICBpbnZlcnNpb24gZnVuY3Rpb24gc2hvdWxkIGRvIHRoaXMgYXV0b21hdGljYWxseS4gICovCisgIGlmIChkbiA9PSBpbikKKyAgICB7CisgICAgICB0cFtpbiArIDFdID0gMDsKKyAgICAgIE1QTl9DT1BZICh0cCArIGluICsgMiwgZHAsIGluKTsKKyAgICAgIG1wbl9pbnZlcnRhcHByICh0cCwgdHAgKyBpbiArIDEsIGluICsgMSwgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX2ludmVydGFwcHIgKHRwLCBkcCArIGRuIC0gKGluICsgMSksIGluICsgMSwgTlVMTCk7CisgICAgfQorICBjeSA9IG1wbl9zdWJfMSAodHAsIHRwLCBpbiArIDEsIEdNUF9OVU1CX0hJR0hCSVQpOworICBpZiAoVU5MSUtFTFkgKGN5ICE9IDApKQorICAgIE1QTl9aRVJPICh0cCArIDEsIGluKTsKKyAgTVBOX0NPUFkgKGlwLCB0cCArIDEsIGluKTsKKyNlbmRpZgorCisgIHFoID0gbXBuX3ByZWludl9tdV9kaXZhcHByX3EgKHFwLCBucCwgbm4sIGRwLCBkbiwgaXAsIGluLCBzY3JhdGNoICsgaW4pOworCisgIHJldHVybiBxaDsKK30KKworc3RhdGljIG1wX2xpbWJfdAorbXBuX3ByZWludl9tdV9kaXZhcHByX3EgKG1wX3B0ciBxcCwKKwkJCSBtcF9zcmNwdHIgbnAsCisJCQkgbXBfc2l6ZV90IG5uLAorCQkJIG1wX3NyY3B0ciBkcCwKKwkJCSBtcF9zaXplX3QgZG4sCisJCQkgbXBfc3JjcHRyIGlwLAorCQkJIG1wX3NpemVfdCBpbiwKKwkJCSBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IHFuOworICBtcF9saW1iX3QgY3ksIGN4LCBxaDsKKyAgbXBfbGltYl90IHI7CisgIG1wX3NpemVfdCB0biwgd247CisKKyNkZWZpbmUgcnAgICAgICAgICAgIHNjcmF0Y2gKKyNkZWZpbmUgdHAgICAgICAgICAgIChzY3JhdGNoICsgZG4pCisjZGVmaW5lIHNjcmF0Y2hfb3V0ICAoc2NyYXRjaCArIGRuICsgdG4pCisKKyAgcW4gPSBubiAtIGRuOworCisgIG5wICs9IHFuOworICBxcCArPSBxbjsKKworICBxaCA9IG1wbl9jbXAgKG5wLCBkcCwgZG4pID49IDA7CisgIGlmIChxaCAhPSAwKQorICAgIG1wbl9zdWJfbiAocnAsIG5wLCBkcCwgZG4pOworICBlbHNlCisgICAgTVBOX0NPUFkgKHJwLCBucCwgZG4pOworCisgIGlmIChVTkxJS0VMWSAocW4gPT0gMCkpCisgICAgcmV0dXJuIHFoOwkJCS8qIERlZ2VuZXJhdGUgdXNlLiAgU2hvdWxkIHdlIGFsbG93IHRoaXM/ICovCisKKyAgZm9yICg7OykgLyogVGhlIGV4aXQgY29uZGl0aW9uIChxbiA9PSAwKSBpcyB2ZXJpZmllZCBpbiB0aGUgbG9vcC4gKi8KKyAgICB7CisgICAgICBpZiAocW4gPCBpbikKKwl7CisJICBpcCArPSBpbiAtIHFuOworCSAgaW4gPSBxbjsKKwl9CisgICAgICBucCAtPSBpbjsKKyAgICAgIHFwIC09IGluOworCisgICAgICAvKiBDb21wdXRlIHRoZSBuZXh0IGJsb2NrIG9mIHF1b3RpZW50IGxpbWJzIGJ5IG11bHRpcGx5aW5nIHRoZSBpbnZlcnNlIEkKKwkgYnkgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhcnRpYWwgcmVtYWluZGVyIFIuICAqLworICAgICAgbXBuX211bF9uICh0cCwgcnAgKyBkbiAtIGluLCBpcCwgaW4pOwkJLyogbXVsaGkgICovCisgICAgICBjeSA9IG1wbl9hZGRfbiAocXAsIHRwICsgaW4sIHJwICsgZG4gLSBpbiwgaW4pOwkvKiBJJ3MgbXNiIGltcGxpY2l0ICovCisgICAgICBBU1NFUlRfQUxXQVlTIChjeSA9PSAwKTsKKworICAgICAgcW4gLT0gaW47CisgICAgICBpZiAocW4gPT0gMCkKKwlicmVhazsKKworICAgICAgLyogQ29tcHV0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgcXVvdGllbnQgYmxvY2sgYW5kIHRoZSBkaXZpc29yIEQsIHRvIGJlCisJIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcGFydGlhbCByZW1haW5kZXIgY29tYmluZWQgd2l0aCBuZXcgbGltYnMgZnJvbSB0aGUKKwkgZGl2aWRlbmQgTi4gIFdlIG9ubHkgcmVhbGx5IG5lZWQgdGhlIGxvdyBkbiBsaW1icy4gICovCisKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKGluLCBNVUxfVE9fTVVMTU9EX0JOTTFfRk9SXzJOWE5fVEhSRVNIT0xEKSkKKwltcG5fbXVsICh0cCwgZHAsIGRuLCBxcCwgaW4pOwkJLyogZG4raW4gbGltYnMsIGhpZ2ggJ2luJyBjYW5jZWxzICovCisgICAgICBlbHNlCisJeworCSAgdG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbiArIDEpOworCSAgbXBuX211bG1vZF9ibm0xICh0cCwgdG4sIGRwLCBkbiwgcXAsIGluLCBzY3JhdGNoX291dCk7CisJICB3biA9IGRuICsgaW4gLSB0bjsJCQkvKiBudW1iZXIgb2Ygd3JhcHBlZCBsaW1icyAqLworCSAgaWYgKHduID4gMCkKKwkgICAgeworCSAgICAgIGN5ID0gbXBuX3N1Yl9uICh0cCwgdHAsIHJwICsgZG4gLSB3biwgd24pOworCSAgICAgIGN5ID0gbXBuX3N1Yl8xICh0cCArIHduLCB0cCArIHduLCB0biAtIHduLCBjeSk7CisJICAgICAgY3ggPSBtcG5fY21wIChycCArIGRuIC0gaW4sIHRwICsgZG4sIHRuIC0gZG4pIDwgMDsKKwkgICAgICBBU1NFUlRfQUxXQVlTIChjeCA+PSBjeSk7CisJICAgICAgbXBuX2luY3JfdSAodHAsIGN4IC0gY3kpOworCSAgICB9CisJfQorCisgICAgICByID0gcnBbZG4gLSBpbl0gLSB0cFtkbl07CisKKyAgICAgIC8qIFN1YnRyYWN0IHRoZSBwcm9kdWN0IGZyb20gdGhlIHBhcnRpYWwgcmVtYWluZGVyIGNvbWJpbmVkIHdpdGggbmV3CisJIGxpbWJzIGZyb20gdGhlIGRpdmlkZW5kIE4sIGdlbmVyYXRpbmcgYSBuZXcgcGFydGlhbCByZW1haW5kZXIgUi4gICovCisgICAgICBpZiAoZG4gIT0gaW4pCisJeworCSAgY3kgPSBtcG5fc3ViX24gKHRwLCBucCwgdHAsIGluKTsJLyogZ2V0IG5leHQgJ2luJyBsaW1icyBmcm9tIE4gKi8KKwkgIGN5ID0gbXBuX3N1Yl9uYyAodHAgKyBpbiwgcnAsIHRwICsgaW4sIGRuIC0gaW4sIGN5KTsKKwkgIE1QTl9DT1BZIChycCwgdHAsIGRuKTsJCS8qIEZJWE1FOiB0cnkgdG8gYXZvaWQgdGhpcyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjeSA9IG1wbl9zdWJfbiAocnAsIG5wLCB0cCwgaW4pOwkvKiBnZXQgbmV4dCAnaW4nIGxpbWJzIGZyb20gTiAqLworCX0KKworICAgICAgU1RBVCAoaW50IGk7IGludCBlcnIgPSAwOworCSAgICBzdGF0aWMgaW50IGVycmFycls1XTsgc3RhdGljIGludCBlcnJfcmVjOyBzdGF0aWMgaW50IHRvdCk7CisKKyAgICAgIC8qIENoZWNrIHRoZSByZW1haW5kZXIgUiBhbmQgYWRqdXN0IHRoZSBxdW90aWVudCBhcyBuZWVkZWQuICAqLworICAgICAgciAtPSBjeTsKKyAgICAgIHdoaWxlIChyICE9IDApCisJeworCSAgLyogV2UgbG9vcCAwIHRpbWVzIHdpdGggYWJvdXQgNjklIHByb2JhYmlsaXR5LCAxIHRpbWUgd2l0aCBhYm91dCAzMSUKKwkgICAgIHByb2JhYmlsaXR5LCAyIHRpbWVzIHdpdGggYWJvdXQgMC42JSBwcm9iYWJpbGl0eSwgaWYgaW52ZXJzZSBpcworCSAgICAgY29tcHV0ZWQgYXMgcmVjb21tZW5kZWQuICAqLworCSAgbXBuX2luY3JfdSAocXAsIDEpOworCSAgY3kgPSBtcG5fc3ViX24gKHJwLCBycCwgZHAsIGRuKTsKKwkgIHIgLT0gY3k7CisJICBTVEFUIChlcnIrKyk7CisJfQorICAgICAgaWYgKG1wbl9jbXAgKHJwLCBkcCwgZG4pID49IDApCisJeworCSAgLyogVGhpcyBpcyBleGVjdXRlZCB3aXRoIGFib3V0IDc2JSBwcm9iYWJpbGl0eS4gICovCisJICBtcG5faW5jcl91IChxcCwgMSk7CisJICBjeSA9IG1wbl9zdWJfbiAocnAsIHJwLCBkcCwgZG4pOworCSAgU1RBVCAoZXJyKyspOworCX0KKworICAgICAgU1RBVCAoCisJICAgIHRvdCsrOworCSAgICBlcnJhcnJbZXJyXSsrOworCSAgICBpZiAoZXJyID4gZXJyX3JlYykKKwkgICAgICBlcnJfcmVjID0gZXJyOworCSAgICBpZiAodG90ICUgMHgxMDAwMCA9PSAwKQorCSAgICAgIHsKKwkJZm9yIChpID0gMDsgaSA8PSBlcnJfcmVjOyBpKyspCisJCSAgcHJpbnRmICgiICAlZCglLjFmJSUpIiwgZXJyYXJyW2ldLCAxMDAuMCplcnJhcnJbaV0vdG90KTsKKwkJcHJpbnRmICgiXG4iKTsKKwkgICAgICB9CisJICAgICk7CisgICAgfQorCisgIC8qIEZJWE1FOiBXZSBzaG91bGQgcGVyaGFwcyBiZSBzb21ld2hhdCBtb3JlIGVsZWdhbnQgaW4gb3VyIHJvdW5kaW5nIG9mIHRoZQorICAgICBxdW90aWVudC4gIEZvciBub3csIGp1c3QgbWFrZSBzdXJlIHRoZSByZXR1cm5lZCBxdW90aWVudCBpcyA+PSB0aGUgcmVhbAorICAgICBxdW90aWVudDsgYWRkIDMgd2l0aCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworICBxbiA9IG5uIC0gZG47CisgIGN5ICs9IG1wbl9hZGRfMSAocXAsIHFwLCBxbiwgMyk7CisgIGlmIChjeSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChxaCAhPSAwKQorCXsKKwkgIC8qIFJldHVybiBhIHF1b3RpZW50IG9mIGp1c3QgMS1iaXRzLCB3aXRoIHFoIHNldC4gICovCisJICBtcF9zaXplX3QgaTsKKwkgIGZvciAoaSA9IDA7IGkgPCBxbjsgaSsrKQorCSAgICBxcFtpXSA9IEdNUF9OVU1CX01BWDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogUHJvcGFnYXRlIGNhcnJ5IGludG8gcWguICAqLworCSAgcWggPSAxOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHFoOworfQorCisvKiBJbiBjYXNlIGs9MCAoYXV0b21hdGljIGNob2ljZSksIHdlIGRpc3Rpbmd1aXNoIDMgY2FzZXM6CisgICAoYSkgZG4gPCBxbjogICAgICAgICBpbiA9IGNlaWwocW4gLyBjZWlsKHFuL2RuKSkKKyAgIChiKSBkbi8zIDwgcW4gPD0gZG46IGluID0gY2VpbChxbiAvIDIpCisgICAoYykgcW4gPCBkbi8zOiAgICAgICBpbiA9IHFuCisgICBJbiBhbGwgY2FzZXMgd2UgaGF2ZSBpbiA8PSBkbi4KKyAqLworc3RhdGljIG1wX3NpemVfdAorbXBuX211X2RpdmFwcHJfcV9jaG9vc2VfaW4gKG1wX3NpemVfdCBxbiwgbXBfc2l6ZV90IGRuLCBpbnQgaykKK3sKKyAgbXBfc2l6ZV90IGluOworCisgIGlmIChrID09IDApCisgICAgeworICAgICAgbXBfc2l6ZV90IGI7CisgICAgICBpZiAocW4gPiBkbikKKwl7CisJICAvKiBDb21wdXRlIGFuIGludmVyc2Ugc2l6ZSB0aGF0IGlzIGEgbmljZSBwYXJ0aXRpb24gb2YgdGhlIHF1b3RpZW50LiAgKi8KKwkgIGIgPSAocW4gLSAxKSAvIGRuICsgMTsJLyogY2VpbChxbi9kbiksIG51bWJlciBvZiBibG9ja3MgKi8KKwkgIGluID0gKHFuIC0gMSkgLyBiICsgMTsJLyogY2VpbChxbi9iKSA9IGNlaWwocW4gLyBjZWlsKHFuL2RuKSkgKi8KKwl9CisgICAgICBlbHNlIGlmICgzICogcW4gPiBkbikKKwl7CisJICBpbiA9IChxbiAtIDEpIC8gMiArIDE7CS8qIGIgPSAyICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIGluID0gKHFuIC0gMSkgLyAxICsgMTsJLyogYiA9IDEgKi8KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfc2l6ZV90IHhuOworICAgICAgeG4gPSBNSU4gKGRuLCBxbik7CisgICAgICBpbiA9ICh4biAtIDEpIC8gayArIDE7CisgICAgfQorCisgIHJldHVybiBpbjsKK30KKworbXBfc2l6ZV90CittcG5fbXVfZGl2YXBwcl9xX2l0Y2ggKG1wX3NpemVfdCBubiwgbXBfc2l6ZV90IGRuLCBpbnQgbXVhX2spCit7CisgIG1wX3NpemVfdCBxbiwgaW4sIGl0Y2hfbG9jYWwsIGl0Y2hfb3V0LCBpdGNoX2ludmFwcDsKKworICBxbiA9IG5uIC0gZG47CisgIGlmIChxbiArIDEgPCBkbikKKyAgICB7CisgICAgICBkbiA9IHFuICsgMTsKKyAgICB9CisgIGluID0gbXBuX211X2RpdmFwcHJfcV9jaG9vc2VfaW4gKHFuLCBkbiwgbXVhX2spOworCisgIGl0Y2hfbG9jYWwgPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChkbiArIDEpOworICBpdGNoX291dCA9IG1wbl9tdWxtb2RfYm5tMV9pdGNoIChpdGNoX2xvY2FsLCBkbiwgaW4pOworICBpdGNoX2ludmFwcCA9IG1wbl9pbnZlcnRhcHByX2l0Y2ggKGluICsgMSkgKyBpbiArIDI7IC8qIDNpbiArIDQgKi8KKworICBBU1NFUlQgKGRuICsgaXRjaF9sb2NhbCArIGl0Y2hfb3V0ID49IGl0Y2hfaW52YXBwKTsKKyAgcmV0dXJuIGluICsgTUFYIChkbiArIGl0Y2hfbG9jYWwgKyBpdGNoX291dCwgaXRjaF9pbnZhcHApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvbXVsLmMgYi9tcG4vZ2VuZXJpYy9tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQ0NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbXVsLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qIG1wbl9tdWwgLS0gTXVsdGlwbHkgdHdvIG5hdHVyYWwgbnVtYmVycy4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMTk5OS0yMDAzLCAyMDA1LTIwMDcsIDIwMDksIDIwMTAsIDIwMTIsCisyMDE0LCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWZuZGVmIE1VTF9CQVNFQ0FTRV9NQVhfVU4KKyNkZWZpbmUgTVVMX0JBU0VDQVNFX01BWF9VTiA1MDAKKyNlbmRpZgorCisvKiBBcmVhcyB3aGVyZSB0aGUgZGlmZmVyZW50IHRvb20gYWxnb3JpdGhtcyBjYW4gYmUgY2FsbGVkIChleHRyYWN0ZWQKKyAgIGZyb20gdGhlIHQtdG9vbSouYyBmaWxlcywgYW5kIGlnbm9yaW5nIHNtYWxsIGNvbnN0YW50IG9mZnNldHMpOgorCisgICAxLzYgIDEvNSAxLzQgNC8xMyAxLzMgMy84IDIvNSA1LzExIDEvMiAzLzUgMi8zIDMvNCA0LzUgICAxIHZuL3VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC83ICAgICAgICAgICAgICA2LzcKKwkJCQkgICAgICAgNi8xMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tfCB0b29tMjIgKHNtYWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0b29tMjIgKGxhcmdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx4eHh4fCB0b29tMjIgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHRvb20zMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8eHh4eHh4eHh4eHh4eHh4eHwgfCB0b29tMzIgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS18IHRvb20zMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx4fCB0b29tMzMgY2FsbGVkCisgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICB8IHRvb200MgorCSAgICAgICAgICAgICAgfHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHwgICAgICAgICAgICB8IHRvb200MiBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLXwgdG9vbTQzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx4eHh4eHh4eHh4fCAgIHRvb200MyBjYWxsZWQKKyAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgdG9vbTUyICh1bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS18IHRvb200NAorCQkJCQkJICAgfHh4eHh4eHh4fCB0b29tNDQgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICB8IHRvb201MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx4eHh4eHh8ICAgICAgICAgICAgICB0b29tNTMgY2FsbGVkCisgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb202MiAodW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tfCB0b29tNTQgKHVudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgICAgdG9vbTYzCisJICAgICAgICAgICAgICAgICAgICAgIHx4eHh4eHh4eHh8ICAgICAgICAgICAgICAgICAgIHwgdG9vbTYzIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB0b29tNmgKKwkJCQkJCSAgIHx4eHh4eHh4eHwgdG9vbTZoIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB0b29tOGggKDMyIGJpdCkKKyAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgdG9vbThoICg2NCBiaXQpCisJCQkJCQkgICB8eHh4eHh4eHh8IHRvb204aCBjYWxsZWQKKyovCisKKyNkZWZpbmUgVE9PTTMzX09LKGFuLGJuKSAoNiArIDIgKiBhbiA8IDMgKiBibikKKyNkZWZpbmUgVE9PTTQ0X09LKGFuLGJuKSAoMTIgKyAzICogYW4gPCA0ICogYm4pCisKKy8qIE11bHRpcGx5IHRoZSBuYXR1cmFsIG51bWJlcnMgdSAocG9pbnRlZCB0byBieSBVUCwgd2l0aCBVTiBsaW1icykgYW5kIHYKKyAgIChwb2ludGVkIHRvIGJ5IFZQLCB3aXRoIFZOIGxpbWJzKSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgYXQgUFJPRFAuICBUaGUKKyAgIHJlc3VsdCBpcyBVTiArIFZOIGxpbWJzLiAgUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHJlc3VsdC4KKworICAgTk9URTogVGhlIHNwYWNlIHBvaW50ZWQgdG8gYnkgUFJPRFAgaXMgb3ZlcndyaXR0ZW4gYmVmb3JlIGZpbmlzaGVkIHdpdGggVQorICAgYW5kIFYsIHNvIG92ZXJsYXAgaXMgYW4gZXJyb3IuCisKKyAgIEFyZ3VtZW50IGNvbnN0cmFpbnRzOgorICAgMS4gVU4gPj0gVk4uCisgICAyLiBQUk9EUCAhPSBVUCBhbmQgUFJPRFAgIT0gVlAsIGkuZS4gdGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgZGlzdGluY3QgZnJvbQorICAgICAgdGhlIG11bHRpcGxpZXIgYW5kIHRoZSBtdWx0aXBsaWNhbmQuICAqLworCisvKgorICAqIFRoZSBjdXRvZmYgbGluZXMgaW4gdGhlIHRvb21YMiBhbmQgdG9vbVgzIGNvZGUgYXJlIG5vdyBleGFjdGx5IGJldHdlZW4gdGhlCisgICAgaWRlYWwgbGluZXMgb2YgdGhlIHN1cnJvdW5kaW5nIGFsZ29yaXRobXMuICBJcyB0aGF0IG9wdGltYWw/CisKKyAgKiBUaGUgdG9vbVgzIGNvZGUgbm93IHVzZXMgYSBzdHJ1Y3R1cmUgc2ltaWxhciB0byB0aGUgb25lIG9mIHRvb21YMiwgZXhjZXB0CisgICAgdGhhdCBpdCBsb29wcyBsb25nZXIgaW4gdGhlIHVuYmFsYW5jZWQgY2FzZS4gIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKyAgICByZW1haW5pbmcgYXJlYSBtaWdodCBoYXZlIHVuIDwgdm4uICBTaG91bGQgd2UgZml4IHRoZSB0b29tWDIgY29kZSBpbiBhCisgICAgc2ltaWxhciB3YXk/CisKKyAgKiBUaGUgdG9vbVgzIGNvZGUgaXMgdXNlZCBmb3IgdGhlIGxhcmdlc3Qgbm9uLUZGVCB1bmJhbGFuY2VkIG9wZXJhbmRzLiAgSXQKKyAgICB0aGVyZWZvcmUgY2FsbHMgbXBuX211bCByZWN1cnNpdmVseSBmb3IgY2VydGFpbiBjYXNlcy4KKworICAqIEFsbG9jYXRlIHN0YXRpYyB0ZW1wIHNwYWNlIHVzaW5nIFRIUkVTSE9MRCB2YXJpYWJsZXMgKGV4Y2VwdCBmb3IgdG9vbTQ0CisgICAgd2hlbiAhV0FOVF9GRlQpLiAgVGhhdCB3YXksIHdlIGNhbiB0eXBpY2FsbHkgaGF2ZSBubyBUTVBfQUxMT0MgYXQgYWxsLgorCisgICogV2Ugc29ydCBUb29tWDIgYWxnb3JpdGhtcyB0b2dldGhlciwgYXNzdW1pbmcgdGhlIHRvb20yMiwgdG9vbTMyLCB0b29tNDIKKyAgICBoYXZlIHRoZSBzYW1lIHZuIHRocmVzaG9sZC4gIFRoaXMgaXMgbm90IHRydWUsIHdlIHNob3VsZCBhY3R1YWxseSB1c2UKKyAgICBtdWxfYmFzZWNhc2UgZm9yIHNsaWdodGx5IGxhcmdlciBvcGVyYW5kcyBmb3IgdG9vbTMyIHRoYW4gZm9yIHRvb20yMiwgYW5kCisgICAgZXZlbiBsYXJnZXIgZm9yIHRvb200Mi4KKworICAqIFRoYXQgcHJvYmxlbSBpcyBldmVuIG1vcmUgcHJldmFsZW50IGZvciB0b29tWDMuICBXZSB0aGVyZWZvcmUgdXNlIHNwZWNpYWwKKyAgICBUSFJFU0hPTEQgdmFyaWFibGVzIHRoZXJlLgorKi8KKworbXBfbGltYl90CittcG5fbXVsIChtcF9wdHIgcHJvZHAsCisJIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLAorCSBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCB2bikKK3sKKyAgQVNTRVJUICh1biA+PSB2bik7CisgIEFTU0VSVCAodm4gPj0gMSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChwcm9kcCwgdW4rdm4sIHVwLCB1bikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocHJvZHAsIHVuK3ZuLCB2cCwgdm4pKTsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEICh1biwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIC8qIFdoZW4gdW4gKGFuZCB0aHVzIHZuKSBpcyBiZWxvdyB0aGUgdG9vbTIyIHJhbmdlLCBkbyBtdWxfYmFzZWNhc2UuCisJIFRlc3QgdW4gYW5kIG5vdCB2biBoZXJlIG5vdCB0byB0aHdhcnQgdGhlIHVuID4+IHZuIGNvZGUgYmVsb3cuCisJIFRoaXMgc3BlY2lhbCBjYXNlIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBjdXRzIHRoZSBvdmVyaGVhZCBmb3IgdGhlCisJIHNtYWxsZXN0IG9wZXJhbmRzLiAqLworICAgICAgbXBuX211bF9iYXNlY2FzZSAocHJvZHAsIHVwLCB1biwgdnAsIHZuKTsKKyAgICB9CisgIGVsc2UgaWYgKHVuID09IHZuKQorICAgIHsKKyAgICAgIG1wbl9tdWxfbiAocHJvZHAsIHVwLCB2cCwgdW4pOworICAgIH0KKyAgZWxzZSBpZiAodm4gPCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyAgICB7IC8qIHBsYWluIHNjaG9vbGJvb2sgbXVsdGlwbGljYXRpb24gKi8KKworICAgICAgLyogVW5sZXNzIHVuIGlzIHZlcnkgbGFyZ2UsIG9yIGVsc2UgaWYgaGF2ZSBhbiBhcHBsaWNhYmxlIG1wbl9tdWxfTiwKKwkgcGVyZm9ybSBiYXNlY2FzZSBtdWx0aXBseSBkaXJlY3RseS4gICovCisgICAgICBpZiAodW4gPD0gTVVMX0JBU0VDQVNFX01BWF9VTgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMgorCSAgfHwgdm4gPD0gMgorI2Vsc2UKKwkgIHx8IHZuID09IDEKKyNlbmRpZgorCSAgKQorCW1wbl9tdWxfYmFzZWNhc2UgKHByb2RwLCB1cCwgdW4sIHZwLCB2bik7CisgICAgICBlbHNlCisJeworCSAgLyogV2UgaGF2ZSB1biA+PiBNVUxfQkFTRUNBU0VfTUFYX1VOID4gdm4uICBGb3IgYmV0dGVyIG1lbW9yeQorCSAgICAgbG9jYWxpdHksIHNwbGl0IHVwW10gaW50byBNVUxfQkFTRUNBU0VfTUFYX1VOIHBpZWNlcyBhbmQgbXVsdGlwbHkKKwkgICAgIHRoZXNlIHBpZWNlcyB3aXRoIHRoZSB2cFtdIG9wZXJhbmQuICBBZnRlciBlYWNoIHN1Y2ggcGFydGlhbAorCSAgICAgbXVsdGlwbGljYXRpb24gKGJ1dCB0aGUgbGFzdCkgd2UgY29weSB0aGUgbW9zdCBzaWduaWZpY2FudCB2bgorCSAgICAgbGltYnMgaW50byBhIHRlbXBvcmFyeSBidWZmZXIgc2luY2UgdGhhdCBwYXJ0IHdvdWxkIG90aGVyd2lzZSBiZQorCSAgICAgb3ZlcndyaXR0ZW4gYnkgdGhlIG5leHQgbXVsdGlwbGljYXRpb24uICBBZnRlciB0aGUgbmV4dAorCSAgICAgbXVsdGlwbGljYXRpb24sIHdlIGFkZCBpdCBiYWNrLiAgVGhpcyBpbGx1c3RyYXRlcyB0aGUgc2l0dWF0aW9uOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+dm48LS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHw8LS0tLS0tLSB1biAtLS0tLS0tPnwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgL3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9YWF9fX19fX19fX19fX19fX19fXy8gIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9YWF9fX19fX19fX19fX19fX19fXy8gICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIC9fX19fX19fX19fX19fX19fX19fXy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkgICAgVGhlIHBhcnRzIG1hcmtlZCB3aXRoIFggYXJlIHRoZSBwYXJ0cyB3aG9zZSBzdW1zIGFyZSBjb3BpZWQgaW50bworCSAgICB0aGUgdGVtcG9yYXJ5IGJ1ZmZlci4gICovCisKKwkgIG1wX2xpbWJfdCB0cFtNVUxfVE9PTTIyX1RIUkVTSE9MRF9MSU1JVF07CisJICBtcF9saW1iX3QgY3k7CisJICBBU1NFUlQgKE1VTF9UT09NMjJfVEhSRVNIT0xEIDw9IE1VTF9UT09NMjJfVEhSRVNIT0xEX0xJTUlUKTsKKworCSAgbXBuX211bF9iYXNlY2FzZSAocHJvZHAsIHVwLCBNVUxfQkFTRUNBU0VfTUFYX1VOLCB2cCwgdm4pOworCSAgcHJvZHAgKz0gTVVMX0JBU0VDQVNFX01BWF9VTjsKKwkgIE1QTl9DT1BZICh0cCwgcHJvZHAsIHZuKTsJCS8qIHByZXNlcnZlIGhpZ2ggdHJpYW5nbGUgKi8KKwkgIHVwICs9IE1VTF9CQVNFQ0FTRV9NQVhfVU47CisJICB1biAtPSBNVUxfQkFTRUNBU0VfTUFYX1VOOworCSAgd2hpbGUgKHVuID4gTVVMX0JBU0VDQVNFX01BWF9VTikKKwkgICAgeworCSAgICAgIG1wbl9tdWxfYmFzZWNhc2UgKHByb2RwLCB1cCwgTVVMX0JBU0VDQVNFX01BWF9VTiwgdnAsIHZuKTsKKwkgICAgICBjeSA9IG1wbl9hZGRfbiAocHJvZHAsIHByb2RwLCB0cCwgdm4pOyAvKiBhZGQgYmFjayBwcmVzZXJ2ZWQgdHJpYW5nbGUgKi8KKwkgICAgICBtcG5faW5jcl91IChwcm9kcCArIHZuLCBjeSk7CisJICAgICAgcHJvZHAgKz0gTVVMX0JBU0VDQVNFX01BWF9VTjsKKwkgICAgICBNUE5fQ09QWSAodHAsIHByb2RwLCB2bik7CQkvKiBwcmVzZXJ2ZSBoaWdoIHRyaWFuZ2xlICovCisJICAgICAgdXAgKz0gTVVMX0JBU0VDQVNFX01BWF9VTjsKKwkgICAgICB1biAtPSBNVUxfQkFTRUNBU0VfTUFYX1VOOworCSAgICB9CisJICBpZiAodW4gPiB2bikKKwkgICAgeworCSAgICAgIG1wbl9tdWxfYmFzZWNhc2UgKHByb2RwLCB1cCwgdW4sIHZwLCB2bik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIEFTU0VSVCAodW4gPiAwKTsKKwkgICAgICBtcG5fbXVsX2Jhc2VjYXNlIChwcm9kcCwgdnAsIHZuLCB1cCwgdW4pOworCSAgICB9CisJICBjeSA9IG1wbl9hZGRfbiAocHJvZHAsIHByb2RwLCB0cCwgdm4pOyAvKiBhZGQgYmFjayBwcmVzZXJ2ZWQgdHJpYW5nbGUgKi8KKwkgIG1wbl9pbmNyX3UgKHByb2RwICsgdm4sIGN5KTsKKwl9CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKHZuLCBNVUxfVE9PTTMzX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgLyogVXNlIFRvb21YMiB2YXJpYW50cyAqLworICAgICAgbXBfcHRyIHNjcmF0Y2g7CisgICAgICBUTVBfU0RFQ0w7IFRNUF9TTUFSSzsKKworI2RlZmluZSBJVENIX1RPT01YMiAoOSAqIHZuIC8gMiArIEdNUF9OVU1CX0JJVFMgKiAyKQorICAgICAgc2NyYXRjaCA9IFRNUF9TQUxMT0NfTElNQlMgKElUQ0hfVE9PTVgyKTsKKyAgICAgIEFTU0VSVCAobXBuX3Rvb20yMl9tdWxfaXRjaCAoKDUqdm4tMSkvNCwgdm4pIDw9IElUQ0hfVE9PTVgyKTsgLyogNXZuLzIrICovCisgICAgICBBU1NFUlQgKG1wbl90b29tMzJfbXVsX2l0Y2ggKCg3KnZuLTEpLzQsIHZuKSA8PSBJVENIX1RPT01YMik7IC8qIDd2bi82KyAqLworICAgICAgQVNTRVJUIChtcG5fdG9vbTQyX211bF9pdGNoICgzICogdm4gLSAxLCB2bikgPD0gSVRDSF9UT09NWDIpOyAvKiA5dm4vMisgKi8KKyN1bmRlZiBJVENIX1RPT01YMgorCisgICAgICAvKiBGSVhNRTogVGhpcyBjb25kaXRpb24gKHJlcGVhdGVkIGluIHRoZSBsb29wIGJlbG93KSBsZWF2ZXMgZnJvbSBhIHZuKnZuCisJIHNxdWFyZSB0byBhICgzdm4tMSkqdm4gcmVjdGFuZ2xlLiAgTGVhdmluZyBzdWNoIGEgcmVjdGFuZ2xlIGlzIGhhcmRseQorCSB3aXNlOyB3ZSB3b3VsZCBnZXQgYmV0dGVyIGJhbGFuY2UgYnkgc2xpZ2h0bHkgbW92aW5nIHRoZSBib3VuZC4gIFdlCisJIHdpbGwgc29tZXRpbWVzIGVuZCB1cCB3aXRoIHVuIDwgdm4sIGxpa2UgaW4gdGhlIFgzIGFybSBiZWxvdy4gICovCisgICAgICBpZiAodW4gPj0gMyAqIHZuKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKwkgIG1wX3B0ciB3czsKKworCSAgLyogVGhlIG1heGltdW0gd3MgdXNhZ2UgaXMgZm9yIHRoZSBtcG5fbXVsIHJlc3VsdC4gICovCisJICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKDQgKiB2bik7CisKKwkgIG1wbl90b29tNDJfbXVsIChwcm9kcCwgdXAsIDIgKiB2biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgIHVuIC09IDIgKiB2bjsKKwkgIHVwICs9IDIgKiB2bjsKKwkgIHByb2RwICs9IDIgKiB2bjsKKworCSAgd2hpbGUgKHVuID49IDMgKiB2bikKKwkgICAgeworCSAgICAgIG1wbl90b29tNDJfbXVsICh3cywgdXAsIDIgKiB2biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgICAgICB1biAtPSAyICogdm47CisJICAgICAgdXAgKz0gMiAqIHZuOworCSAgICAgIGN5ID0gbXBuX2FkZF9uIChwcm9kcCwgcHJvZHAsIHdzLCB2bik7CisJICAgICAgTVBOX0NPUFkgKHByb2RwICsgdm4sIHdzICsgdm4sIDIgKiB2bik7CisJICAgICAgbXBuX2luY3JfdSAocHJvZHAgKyB2biwgY3kpOworCSAgICAgIHByb2RwICs9IDIgKiB2bjsKKwkgICAgfQorCisJICAvKiB2biA8PSB1biA8IDN2biAqLworCisJICBpZiAoNCAqIHVuIDwgNSAqIHZuKQorCSAgICBtcG5fdG9vbTIyX211bCAod3MsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgIGVsc2UgaWYgKDQgKiB1biA8IDcgKiB2bikKKwkgICAgbXBuX3Rvb20zMl9tdWwgKHdzLCB1cCwgdW4sIHZwLCB2biwgc2NyYXRjaCk7CisJICBlbHNlCisJICAgIG1wbl90b29tNDJfbXVsICh3cywgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCisJICBjeSA9IG1wbl9hZGRfbiAocHJvZHAsIHByb2RwLCB3cywgdm4pOworCSAgTVBOX0NPUFkgKHByb2RwICsgdm4sIHdzICsgdm4sIHVuKTsKKwkgIG1wbl9pbmNyX3UgKHByb2RwICsgdm4sIGN5KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKDQgKiB1biA8IDUgKiB2bikKKwkgICAgbXBuX3Rvb20yMl9tdWwgKHByb2RwLCB1cCwgdW4sIHZwLCB2biwgc2NyYXRjaCk7CisJICBlbHNlIGlmICg0ICogdW4gPCA3ICogdm4pCisJICAgIG1wbl90b29tMzJfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCSAgZWxzZQorCSAgICBtcG5fdG9vbTQyX211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwl9CisgICAgICBUTVBfU0ZSRUU7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKCh1biArIHZuKSA+PiAxLCBNVUxfRkZUX1RIUkVTSE9MRCkgfHwKKwkgICBCRUxPV19USFJFU0hPTEQgKDMgKiB2biwgTVVMX0ZGVF9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSB0aGUgbGFyZ2VzdCBvcGVyYW5kcyB0aGF0IGFyZSBub3QgaW4gdGhlIEZGVCByYW5nZS4gIFRoZSAybmQKKwkgY29uZGl0aW9uIG1ha2VzIHZlcnkgdW5iYWxhbmNlZCBvcGVyYW5kcyBhdm9pZCB0aGUgRkZUIGNvZGUgKGV4Y2VwdAorCSBwZXJoYXBzIGFzIGNvZWZmaWNpZW50IHByb2R1Y3RzIG9mIHRoZSBUb29tIGNvZGUuICAqLworCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT000NF9USFJFU0hPTEQpIHx8ICFUT09NNDRfT0sgKHVuLCB2bikpCisJeworCSAgLyogVXNlIFRvb21YMyB2YXJpYW50cyAqLworCSAgbXBfcHRyIHNjcmF0Y2g7CisJICBUTVBfREVDTDsgVE1QX01BUks7CisKKyNkZWZpbmUgSVRDSF9UT09NWDMgKDQgKiB2biArIEdNUF9OVU1CX0JJVFMpCisJICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChJVENIX1RPT01YMyk7CisJICBBU1NFUlQgKG1wbl90b29tMzNfbXVsX2l0Y2ggKCg3KnZuLTEpLzYsIHZuKSA8PSBJVENIX1RPT01YMyk7IC8qIDd2bi8yKyAqLworCSAgQVNTRVJUIChtcG5fdG9vbTQzX211bF9pdGNoICgoMyp2bi0xKS8yLCB2bikgPD0gSVRDSF9UT09NWDMpOyAvKiA5dm4vNCsgKi8KKwkgIEFTU0VSVCAobXBuX3Rvb20zMl9tdWxfaXRjaCAoKDcqdm4tMSkvNCwgdm4pIDw9IElUQ0hfVE9PTVgzKTsgLyogN3ZuLzYrICovCisJICBBU1NFUlQgKG1wbl90b29tNTNfbXVsX2l0Y2ggKCgxMSp2bi0xKS82LCB2bikgPD0gSVRDSF9UT09NWDMpOyAvKiAxMXZuLzMrICovCisJICBBU1NFUlQgKG1wbl90b29tNDJfbXVsX2l0Y2ggKCg1KnZuLTEpLzIsIHZuKSA8PSBJVENIX1RPT01YMyk7IC8qIDE1dm4vNCsgKi8KKwkgIEFTU0VSVCAobXBuX3Rvb202M19tdWxfaXRjaCAoKDUqdm4tMSkvMiwgdm4pIDw9IElUQ0hfVE9PTVgzKTsgLyogMTV2bi80KyAqLworI3VuZGVmIElUQ0hfVE9PTVgzCisKKwkgIGlmICgyICogdW4gPj0gNSAqIHZuKQorCSAgICB7CisJICAgICAgbXBfbGltYl90IGN5OworCSAgICAgIG1wX3B0ciB3czsKKworCSAgICAgIC8qIFRoZSBtYXhpbXVtIHdzIHVzYWdlIGlzIGZvciB0aGUgbXBuX211bCByZXN1bHQuICAqLworCSAgICAgIHdzID0gVE1QX0FMTE9DX0xJTUJTICg3ICogdm4gPj4gMSk7CisKKwkgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xEKSkKKwkJbXBuX3Rvb200Ml9tdWwgKHByb2RwLCB1cCwgMiAqIHZuLCB2cCwgdm4sIHNjcmF0Y2gpOworCSAgICAgIGVsc2UKKwkJbXBuX3Rvb202M19tdWwgKHByb2RwLCB1cCwgMiAqIHZuLCB2cCwgdm4sIHNjcmF0Y2gpOworCSAgICAgIHVuIC09IDIgKiB2bjsKKwkgICAgICB1cCArPSAyICogdm47CisJICAgICAgcHJvZHAgKz0gMiAqIHZuOworCisJICAgICAgd2hpbGUgKDIgKiB1biA+PSA1ICogdm4pCS8qIHVuID49IDIuNXZuICovCisJCXsKKwkJICBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xEKSkKKwkJICAgIG1wbl90b29tNDJfbXVsICh3cywgdXAsIDIgKiB2biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkJICBlbHNlCisJCSAgICBtcG5fdG9vbTYzX211bCAod3MsIHVwLCAyICogdm4sIHZwLCB2biwgc2NyYXRjaCk7CisJCSAgdW4gLT0gMiAqIHZuOworCQkgIHVwICs9IDIgKiB2bjsKKwkJICBjeSA9IG1wbl9hZGRfbiAocHJvZHAsIHByb2RwLCB3cywgdm4pOworCQkgIE1QTl9DT1BZIChwcm9kcCArIHZuLCB3cyArIHZuLCAyICogdm4pOworCQkgIG1wbl9pbmNyX3UgKHByb2RwICsgdm4sIGN5KTsKKwkJICBwcm9kcCArPSAyICogdm47CisJCX0KKworCSAgICAgIC8qIHZuIC8gMiA8PSB1biA8IDIuNXZuICovCisKKwkgICAgICBpZiAodW4gPCB2bikKKwkJbXBuX211bCAod3MsIHZwLCB2biwgdXAsIHVuKTsKKwkgICAgICBlbHNlCisJCW1wbl9tdWwgKHdzLCB1cCwgdW4sIHZwLCB2bik7CisKKwkgICAgICBjeSA9IG1wbl9hZGRfbiAocHJvZHAsIHByb2RwLCB3cywgdm4pOworCSAgICAgIE1QTl9DT1BZIChwcm9kcCArIHZuLCB3cyArIHZuLCB1bik7CisJICAgICAgbXBuX2luY3JfdSAocHJvZHAgKyB2biwgY3kpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoNiAqIHVuIDwgNyAqIHZuKQorCQltcG5fdG9vbTMzX211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgICAgICBlbHNlIGlmICgyICogdW4gPCAzICogdm4pCisJCXsKKwkJICBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT00zMl9UT19UT09NNDNfVEhSRVNIT0xEKSkKKwkJICAgIG1wbl90b29tMzJfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCQkgIGVsc2UKKwkJICAgIG1wbl90b29tNDNfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCQl9CisJICAgICAgZWxzZSBpZiAoNiAqIHVuIDwgMTEgKiB2bikKKwkJeworCQkgIGlmICg0ICogdW4gPCA3ICogdm4pCisJCSAgICB7CisJCSAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKHZuLCBNVUxfVE9PTTMyX1RPX1RPT001M19USFJFU0hPTEQpKQorCQkJbXBuX3Rvb20zMl9tdWwgKHByb2RwLCB1cCwgdW4sIHZwLCB2biwgc2NyYXRjaCk7CisJCSAgICAgIGVsc2UKKwkJCW1wbl90b29tNTNfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAodm4sIE1VTF9UT09NNDJfVE9fVE9PTTUzX1RIUkVTSE9MRCkpCisJCQltcG5fdG9vbTQyX211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkJICAgICAgZWxzZQorCQkJbXBuX3Rvb201M19tdWwgKHByb2RwLCB1cCwgdW4sIHZwLCB2biwgc2NyYXRjaCk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xEKSkKKwkJICAgIG1wbl90b29tNDJfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCQkgIGVsc2UKKwkJICAgIG1wbl90b29tNjNfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCQl9CisJICAgIH0KKwkgIFRNUF9GUkVFOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9wdHIgc2NyYXRjaDsKKwkgIFRNUF9ERUNMOyBUTVBfTUFSSzsKKworCSAgaWYgKEJFTE9XX1RIUkVTSE9MRCAodm4sIE1VTF9UT09NNkhfVEhSRVNIT0xEKSkKKwkgICAgeworCSAgICAgIHNjcmF0Y2ggPSBUTVBfU0FMTE9DX0xJTUJTIChtcG5fdG9vbTQ0X211bF9pdGNoICh1biwgdm4pKTsKKwkgICAgICBtcG5fdG9vbTQ0X211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEICh2biwgTVVMX1RPT004SF9USFJFU0hPTEQpKQorCSAgICB7CisJICAgICAgc2NyYXRjaCA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tNmhfbXVsX2l0Y2ggKHVuLCB2bikpOworCSAgICAgIG1wbl90b29tNmhfbXVsIChwcm9kcCwgdXAsIHVuLCB2cCwgdm4sIHNjcmF0Y2gpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbThoX211bF9pdGNoICh1biwgdm4pKTsKKwkgICAgICBtcG5fdG9vbThoX211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuLCBzY3JhdGNoKTsKKwkgICAgfQorCSAgVE1QX0ZSRUU7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh1biA+PSA4ICogdm4pCisJeworCSAgbXBfbGltYl90IGN5OworCSAgbXBfcHRyIHdzOworCSAgVE1QX0RFQ0w7IFRNUF9NQVJLOworCisJICAvKiBUaGUgbWF4aW11bSB3cyB1c2FnZSBpcyBmb3IgdGhlIG1wbl9tdWwgcmVzdWx0LiAgKi8KKwkgIHdzID0gVE1QX0JBTExPQ19MSU1CUyAoOSAqIHZuID4+IDEpOworCisJICBtcG5fZmZ0X211bCAocHJvZHAsIHVwLCAzICogdm4sIHZwLCB2bik7CisJICB1biAtPSAzICogdm47CisJICB1cCArPSAzICogdm47CisJICBwcm9kcCArPSAzICogdm47CisKKwkgIHdoaWxlICgyICogdW4gPj0gNyAqIHZuKQkvKiB1biA+PSAzLjV2biAgKi8KKwkgICAgeworCSAgICAgIG1wbl9mZnRfbXVsICh3cywgdXAsIDMgKiB2biwgdnAsIHZuKTsKKwkgICAgICB1biAtPSAzICogdm47CisJICAgICAgdXAgKz0gMyAqIHZuOworCSAgICAgIGN5ID0gbXBuX2FkZF9uIChwcm9kcCwgcHJvZHAsIHdzLCB2bik7CisJICAgICAgTVBOX0NPUFkgKHByb2RwICsgdm4sIHdzICsgdm4sIDMgKiB2bik7CisJICAgICAgbXBuX2luY3JfdSAocHJvZHAgKyB2biwgY3kpOworCSAgICAgIHByb2RwICs9IDMgKiB2bjsKKwkgICAgfQorCisJICAvKiB2biAvIDIgPD0gdW4gPCAzLjV2biAqLworCisJICBpZiAodW4gPCB2bikKKwkgICAgbXBuX211bCAod3MsIHZwLCB2biwgdXAsIHVuKTsKKwkgIGVsc2UKKwkgICAgbXBuX211bCAod3MsIHVwLCB1biwgdnAsIHZuKTsKKworCSAgY3kgPSBtcG5fYWRkX24gKHByb2RwLCBwcm9kcCwgd3MsIHZuKTsKKwkgIE1QTl9DT1BZIChwcm9kcCArIHZuLCB3cyArIHZuLCB1bik7CisJICBtcG5faW5jcl91IChwcm9kcCArIHZuLCBjeSk7CisKKwkgIFRNUF9GUkVFOworCX0KKyAgICAgIGVsc2UKKwltcG5fZmZ0X211bCAocHJvZHAsIHVwLCB1biwgdnAsIHZuKTsKKyAgICB9CisKKyAgcmV0dXJuIHByb2RwW3VuICsgdm4gLSAxXTsJLyogaGlzdG9yaWMgKi8KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211bF8xLmMgYi9tcG4vZ2VuZXJpYy9tdWxfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdWxfMS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIG1wbl9tdWxfMSAtLSBNdWx0aXBseSBhIGxpbWIgdmVjdG9yIHdpdGggYSBzaW5nbGUgbGltYiBhbmQgc3RvcmUgdGhlCisgICBwcm9kdWN0IGluIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorCitDb3B5cmlnaHQgMTk5MS0xOTk0LCAxOTk2LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorCittcF9saW1iX3QKK21wbl9tdWxfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdmwpCit7CisgIG1wX2xpbWJfdCB1bCwgY2wsIGhwbCwgbHBsOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB1cCwgbikpOworCisgIGNsID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgdW11bF9wcG1tIChocGwsIGxwbCwgdWwsIHZsKTsKKworICAgICAgbHBsICs9IGNsOworICAgICAgY2wgPSAobHBsIDwgY2wpICsgaHBsOworCisgICAgICAqcnArKyA9IGxwbDsKKyAgICB9CisgIHdoaWxlICgtLW4gIT0gMCk7CisKKyAgcmV0dXJuIGNsOworfQorCisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgPj0gMQorCittcF9saW1iX3QKK21wbl9tdWxfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdmwpCit7CisgIG1wX2xpbWJfdCBzaGlmdGVkX3ZsLCB1bCwgbHBsLCBocGwsIHByZXZfaHBsLCB4dywgY2wsIHhsOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9MSU1CICh2bCk7CisKKyAgc2hpZnRlZF92bCA9IHZsIDw8IEdNUF9OQUlMX0JJVFM7CisgIGNsID0gMDsKKyAgcHJldl9ocGwgPSAwOworICBkbworICAgIHsKKyAgICAgIHVsID0gKnVwKys7CisKKyAgICAgIHVtdWxfcHBtbSAoaHBsLCBscGwsIHVsLCBzaGlmdGVkX3ZsKTsKKyAgICAgIGxwbCA+Pj0gR01QX05BSUxfQklUUzsKKyAgICAgIHh3ID0gcHJldl9ocGwgKyBscGwgKyBjbDsKKyAgICAgIGNsID0geHcgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIHhsID0geHcgJiBHTVBfTlVNQl9NQVNLOworICAgICAgKnJwKysgPSB4bDsKKyAgICAgIHByZXZfaHBsID0gaHBsOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gcHJldl9ocGwgKyBjbDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdWxfYmFzZWNhc2UuYyBiL21wbi9nZW5lcmljL211bF9iYXNlY2FzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODdmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdWxfYmFzZWNhc2UuYwpAQCAtMCwwICsxLDE2NSBAQAorLyogbXBuX211bF9iYXNlY2FzZSAtLSBJbnRlcm5hbCByb3V0aW5lIHRvIG11bHRpcGx5IHR3byBuYXR1cmFsIG51bWJlcnMKKyAgIG9mIGxlbmd0aCBtIGFuZCBuLgorCisgICBUSElTIElTIEFOIElOVEVSTkFMIEZVTkNUSU9OIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhJUyBGVU5DVElPTiBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4KKworQ29weXJpZ2h0IDE5OTEtMTk5NCwgMTk5NiwgMTk5NywgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBNdWx0aXBseSB7dXAsdXNpemV9IGJ5IHt2cCx2c2l6ZX0gYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8KKyAgIHtwcm9kcCx1c2l6ZSt2c2l6ZX0uICBNdXN0IGhhdmUgdXNpemU+PXZzaXplLgorCisgICBOb3RlIHRoYXQgcHJvZHAgZ2V0cyB1c2l6ZSt2c2l6ZSBsaW1icyBzdG9yZWQsIGV2ZW4gaWYgdGhlIGFjdHVhbCByZXN1bHQKKyAgIG9ubHkgbmVlZHMgdXNpemUrdnNpemUtMS4KKworICAgVGhlcmUncyBubyBnb29kIHJlYXNvbiB0byBjYWxsIGhlcmUgd2l0aCB2c2l6ZT49TVVMX1RPT00yMl9USFJFU0hPTEQuCisgICBDdXJyZW50bHkgdGhpcyBpcyBhbGxvd2VkLCBidXQgaXQgbWlnaHQgbm90IGJlIGluIHRoZSBmdXR1cmUuCisKKyAgIFRoaXMgaXMgdGhlIG1vc3QgY3JpdGljYWwgY29kZSBmb3IgbXVsdGlwbGljYXRpb24uICBBbGwgbXVsdGlwbGllcyByZWx5CisgICBvbiB0aGlzLCBib3RoIHNtYWxsIGFuZCBodWdlLiAgU21hbGwgb25lcyBhcnJpdmUgaGVyZSBpbW1lZGlhdGVseSwgaHVnZQorICAgb25lcyBhcnJpdmUgaGVyZSBhcyB0aGlzIGlzIHRoZSBiYXNlIGNhc2UgZm9yIEthcmF0c3ViYSdzIHJlY3Vyc2l2ZQorICAgYWxnb3JpdGhtLiAgKi8KKwordm9pZAorbXBuX211bF9iYXNlY2FzZSAobXBfcHRyIHJwLAorCQkgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLAorCQkgIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IHZuKQoreworICBBU1NFUlQgKHVuID49IHZuKTsKKyAgQVNTRVJUICh2biA+PSAxKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCB1bit2biwgdXAsIHVuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgdW4rdm4sIHZwLCB2bikpOworCisgIC8qIFdlIGZpcnN0IG11bHRpcGx5IGJ5IHRoZSBsb3cgb3JkZXIgbGltYiAob3IgZGVwZW5kaW5nIG9uIG9wdGlvbmFsIGZ1bmN0aW9uCisgICAgIGF2YWlsYWJpbGl0eSwgbGltYnMpLiAgVGhpcyByZXN1bHQgY2FuIGJlIHN0b3JlZCwgbm90IGFkZGVkLCB0byBycC4gIFdlCisgICAgIGFsc28gYXZvaWQgYSBsb29wIGZvciB6ZXJvaW5nIHRoaXMgd2F5LiAgKi8KKworI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMgorICBpZiAodm4gPj0gMikKKyAgICB7CisgICAgICBycFt1biArIDFdID0gbXBuX211bF8yIChycCwgdXAsIHVuLCB2cCk7CisgICAgICBycCArPSAyLCB2cCArPSAyLCB2biAtPSAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJwW3VuXSA9IG1wbl9tdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlCisgIHJwW3VuXSA9IG1wbl9tdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICBycCArPSAxLCB2cCArPSAxLCB2biAtPSAxOworI2VuZGlmCisKKyAgLyogTm93IGFjY3VtdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdXBbXSBhbmQgdGhlIG5leHQgaGlnaGVyIGxpbWIgKG9yIGRlcGVuZGluZworICAgICBvbiBvcHRpb25hbCBmdW5jdGlvbiBhdmFpbGFiaWxpdHksIGxpbWJzKSBmcm9tIHZwW10uICAqLworCisjZGVmaW5lIE1BWF9MRUZUIE1QX1NJWkVfVF9NQVgJLyogVXNlZCB0byBzaW1wbGlmeSBsb29wcyBpbnRvIGlmIHN0YXRlbWVudHMgKi8KKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF82CisgIHdoaWxlICh2biA+PSA2KQorICAgIHsKKyAgICAgIHJwW3VuICsgNiAtIDFdID0gbXBuX2FkZG11bF82IChycCwgdXAsIHVuLCB2cCk7CisgICAgICBpZiAoTUFYX0xFRlQgPT0gNikKKwlyZXR1cm47CisgICAgICBycCArPSA2LCB2cCArPSA2LCB2biAtPSA2OworICAgICAgaWYgKE1BWF9MRUZUIDwgMiAqIDYpCisJYnJlYWs7CisgICAgfQorI3VuZGVmIE1BWF9MRUZUCisjZGVmaW5lIE1BWF9MRUZUICg2IC0gMSkKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF81CisgIHdoaWxlICh2biA+PSA1KQorICAgIHsKKyAgICAgIHJwW3VuICsgNSAtIDFdID0gbXBuX2FkZG11bF81IChycCwgdXAsIHVuLCB2cCk7CisgICAgICBpZiAoTUFYX0xFRlQgPT0gNSkKKwlyZXR1cm47CisgICAgICBycCArPSA1LCB2cCArPSA1LCB2biAtPSA1OworICAgICAgaWYgKE1BWF9MRUZUIDwgMiAqIDUpCisJYnJlYWs7CisgICAgfQorI3VuZGVmIE1BWF9MRUZUCisjZGVmaW5lIE1BWF9MRUZUICg1IC0gMSkKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF80CisgIHdoaWxlICh2biA+PSA0KQorICAgIHsKKyAgICAgIHJwW3VuICsgNCAtIDFdID0gbXBuX2FkZG11bF80IChycCwgdXAsIHVuLCB2cCk7CisgICAgICBpZiAoTUFYX0xFRlQgPT0gNCkKKwlyZXR1cm47CisgICAgICBycCArPSA0LCB2cCArPSA0LCB2biAtPSA0OworICAgICAgaWYgKE1BWF9MRUZUIDwgMiAqIDQpCisJYnJlYWs7CisgICAgfQorI3VuZGVmIE1BWF9MRUZUCisjZGVmaW5lIE1BWF9MRUZUICg0IC0gMSkKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF8zCisgIHdoaWxlICh2biA+PSAzKQorICAgIHsKKyAgICAgIHJwW3VuICsgMyAtIDFdID0gbXBuX2FkZG11bF8zIChycCwgdXAsIHVuLCB2cCk7CisgICAgICBpZiAoTUFYX0xFRlQgPT0gMykKKwlyZXR1cm47CisgICAgICBycCArPSAzLCB2cCArPSAzLCB2biAtPSAzOworICAgICAgaWYgKE1BWF9MRUZUIDwgMiAqIDMpCisJYnJlYWs7CisgICAgfQorI3VuZGVmIE1BWF9MRUZUCisjZGVmaW5lIE1BWF9MRUZUICgzIC0gMSkKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF8yCisgIHdoaWxlICh2biA+PSAyKQorICAgIHsKKyAgICAgIHJwW3VuICsgMiAtIDFdID0gbXBuX2FkZG11bF8yIChycCwgdXAsIHVuLCB2cCk7CisgICAgICBpZiAoTUFYX0xFRlQgPT0gMikKKwlyZXR1cm47CisgICAgICBycCArPSAyLCB2cCArPSAyLCB2biAtPSAyOworICAgICAgaWYgKE1BWF9MRUZUIDwgMiAqIDIpCisJYnJlYWs7CisgICAgfQorI3VuZGVmIE1BWF9MRUZUCisjZGVmaW5lIE1BWF9MRUZUICgyIC0gMSkKKyNlbmRpZgorCisgIHdoaWxlICh2biA+PSAxKQorICAgIHsKKyAgICAgIHJwW3VuXSA9IG1wbl9hZGRtdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICAgICAgaWYgKE1BWF9MRUZUID09IDEpCisJcmV0dXJuOworICAgICAgcnAgKz0gMSwgdnAgKz0gMSwgdm4gLT0gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdWxfZmZ0LmMgYi9tcG4vZ2VuZXJpYy9tdWxfZmZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhMjEwNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL211bF9mZnQuYwpAQCAtMCwwICsxLDExMDUgQEAKKy8qIFNjaG9lbmhhZ2UncyBmYXN0IG11bHRpcGxpY2F0aW9uIG1vZHVsbyAyXk4rMS4KKworICAgQ29udHJpYnV0ZWQgYnkgUGF1bCBaaW1tZXJtYW5uLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDE5OTgtMjAxMCwgMjAxMiwgMjAxMywgMjAxOCwgMjAyMCwgMjAyMiBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyogUmVmZXJlbmNlczoKKworICAgU2NobmVsbGUgTXVsdGlwbGlrYXRpb24gZ3Jvc3NlciBaYWhsZW4sIGJ5IEFybm9sZCBTY2hvZW5oYWdlIGFuZCBWb2xrZXIKKyAgIFN0cmFzc2VuLCBDb21wdXRpbmcgNywgcC4gMjgxLTI5MiwgMTk3MS4KKworICAgQXN5bXB0b3RpY2FsbHkgZmFzdCBhbGdvcml0aG1zIGZvciB0aGUgbnVtZXJpY2FsIG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbgorICAgb2YgcG9seW5vbWlhbHMgd2l0aCBjb21wbGV4IGNvZWZmaWNpZW50cywgYnkgQXJub2xkIFNjaG9lbmhhZ2UsIENvbXB1dGVyCisgICBBbGdlYnJhLCBFVVJPQ0FNJzgyLCBMTkNTIDE0NCwgcC4gMy0xNSwgMTk4Mi4KKworICAgVGFwZXMgdmVyc3VzIFBvaW50ZXJzLCBhIHN0dWR5IGluIGltcGxlbWVudGluZyBmYXN0IGFsZ29yaXRobXMsIGJ5IEFybm9sZAorICAgU2Nob2VuaGFnZSwgQnVsbGV0aW4gb2YgdGhlIEVBVENTLCAzMCwgcC4gMjMtMzIsIDE5ODYuCisKKyAgIFRPRE86CisKKyAgIEltcGxlbWVudCBzb21lIG9mIHRoZSB0cmlja3MgcHVibGlzaGVkIGF0IElTU0FDJzIwMDcgYnkgR2F1ZHJ5LCBLcnVwcGEsIGFuZAorICAgWmltbWVybWFubi4KKworICAgSXQgbWlnaHQgYmUgcG9zc2libGUgdG8gYXZvaWQgYSBzbWFsbCBudW1iZXIgb2YgTVBOX0NPUFlzIGJ5IHVzaW5nIGEKKyAgIHJvdGF0aW5nIHRlbXBvcmFyeSBvciB0d28uCisKKyAgIENsZWFudXAgYW5kIHNpbXBsaWZ5IHRoZSBjb2RlIQorKi8KKworI2lmZGVmIFRSQUNFCisjdW5kZWYgVFJBQ0UKKyNkZWZpbmUgVFJBQ0UoeCkgeAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZWxzZQorI2RlZmluZSBUUkFDRSh4KQorI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWZkZWYgV0FOVF9BRERTVUIKKyNpbmNsdWRlICJnZW5lcmljL2FkZF9uX3N1Yl9uLmMiCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbiAxCisjZW5kaWYKKworc3RhdGljIG1wX2xpbWJfdCBtcG5fbXVsX2ZmdF9pbnRlcm5hbCAobXBfcHRyLCBtcF9zaXplX3QsIGludCwgbXBfcHRyICosCisJCQkJICAgICAgIG1wX3B0ciAqLCBtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LAorCQkJCSAgICAgICBtcF9zaXplX3QsIG1wX3NpemVfdCwgaW50ICoqLCBtcF9wdHIsIGludCk7CitzdGF0aWMgdm9pZCBtcG5fbXVsX2ZmdF9kZWNvbXBvc2UgKG1wX3B0ciwgbXBfcHRyICosIG1wX3NpemVfdCwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsCisJCQkJICAgbXBfc2l6ZV90LCBtcF9zaXplX3QsIG1wX3NpemVfdCwgbXBfcHRyKTsKKworCisvKiBGaW5kIHRoZSBiZXN0IGsgdG8gdXNlIGZvciBhIG1vZCAyXihtKkdNUF9OVU1CX0JJVFMpKzEgRkZUIGZvciBtID49IG4uCisgICBXZSBoYXZlIHNxcj0wIGlmIGZvciBhIG11bHRpcGx5LCBzcXI9MSBmb3IgYSBzcXVhcmUuCisgICBUaGVyZSBhcmUgdGhyZWUgZ2VuZXJhdGlvbnMgb2YgdGhpcyBjb2RlOyB3ZSBrZWVwIHRoZSBvbGQgb25lcyBhcyBsb25nIGFzCisgICBzb21lIGdtcC1tcGFyYW0uaCBpcyBub3QgdXBkYXRlZC4gICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxEIHx8IChkZWZpbmVkIChNVUxfRkZUX1RBQkxFMykgJiYgZGVmaW5lZCAoU1FSX0ZGVF9UQUJMRTMpKQorCisjaWZuZGVmIEZGVF9UQUJMRTNfU0laRQkJLyogV2hlbiB0dW5pbmcgdGhpcyBpcyBkZWZpbmVkIGluIGdtcC1pbXBsLmggKi8KKyNpZiBkZWZpbmVkIChNVUxfRkZUX1RBQkxFM19TSVpFKSAmJiBkZWZpbmVkIChTUVJfRkZUX1RBQkxFM19TSVpFKQorI2lmIE1VTF9GRlRfVEFCTEUzX1NJWkUgPiBTUVJfRkZUX1RBQkxFM19TSVpFCisjZGVmaW5lIEZGVF9UQUJMRTNfU0laRSBNVUxfRkZUX1RBQkxFM19TSVpFCisjZWxzZQorI2RlZmluZSBGRlRfVEFCTEUzX1NJWkUgU1FSX0ZGVF9UQUJMRTNfU0laRQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZGVF9UQUJMRTNfU0laRQorI2RlZmluZSBGRlRfVEFCTEUzX1NJWkUgMjAwCisjZW5kaWYKKworRkZUX1RBQkxFX0FUVFJTIHN0cnVjdCBmZnRfdGFibGVfbmsgbXBuX2ZmdF90YWJsZTNbMl1bRkZUX1RBQkxFM19TSVpFXSA9Cit7CisgIE1VTF9GRlRfVEFCTEUzLAorICBTUVJfRkZUX1RBQkxFMworfTsKKworaW50CittcG5fZmZ0X2Jlc3RfayAobXBfc2l6ZV90IG4sIGludCBzcXIpCit7CisgIGNvbnN0IHN0cnVjdCBmZnRfdGFibGVfbmsgKmZmdF90YWIsICp0YWI7CisgIG1wX3NpemVfdCB0YWJfbiwgdGhyZXM7CisgIGludCBsYXN0X2s7CisKKyAgZmZ0X3RhYiA9IG1wbl9mZnRfdGFibGUzW3Nxcl07CisgIGxhc3RfayA9IGZmdF90YWItPms7CisgIGZvciAodGFiID0gZmZ0X3RhYiArIDE7IDsgdGFiKyspCisgICAgeworICAgICAgdGFiX24gPSB0YWItPm47CisgICAgICB0aHJlcyA9IHRhYl9uIDw8IGxhc3RfazsKKyAgICAgIGlmIChuIDw9IHRocmVzKQorCWJyZWFrOworICAgICAgbGFzdF9rID0gdGFiLT5rOworICAgIH0KKyAgcmV0dXJuIGxhc3RfazsKK30KKworI2RlZmluZSBNUE5fRkZUX0JFU1RfUkVBRFkgMQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICEgZGVmaW5lZCAoTVBOX0ZGVF9CRVNUX1JFQURZKQorRkZUX1RBQkxFX0FUVFJTIG1wX3NpemVfdCBtcG5fZmZ0X3RhYmxlWzJdW01QTl9GRlRfVEFCTEVfU0laRV0gPQoreworICBNVUxfRkZUX1RBQkxFLAorICBTUVJfRkZUX1RBQkxFCit9OworCitpbnQKK21wbl9mZnRfYmVzdF9rIChtcF9zaXplX3QgbiwgaW50IHNxcikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgbXBuX2ZmdF90YWJsZVtzcXJdW2ldICE9IDA7IGkrKykKKyAgICBpZiAobiA8IG1wbl9mZnRfdGFibGVbc3FyXVtpXSkKKyAgICAgIHJldHVybiBpICsgRkZUX0ZJUlNUX0s7CisKKyAgLyogdHJlYXQgNCpsYXN0IGFzIG9uZSBmdXJ0aGVyIGVudHJ5ICovCisgIGlmIChpID09IDAgfHwgbiA8IDQgKiBtcG5fZmZ0X3RhYmxlW3Nxcl1baSAtIDFdKQorICAgIHJldHVybiBpICsgRkZUX0ZJUlNUX0s7CisgIGVsc2UKKyAgICByZXR1cm4gaSArIEZGVF9GSVJTVF9LICsgMTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogUmV0dXJucyBzbWFsbGVzdCBwb3NzaWJsZSBudW1iZXIgb2YgbGltYnMgPj0gcGwgZm9yIGEgZmZ0IG9mIHNpemUgMl5rLAorICAgaS5lLiBzbWFsbGVzdCBtdWx0aXBsZSBvZiAyXmsgPj0gcGwuCisKKyAgIERvbid0IGRlY2xhcmUgc3RhdGljOiBuZWVkZWQgYnkgdHVuZXVwLgorKi8KKworbXBfc2l6ZV90CittcG5fZmZ0X25leHRfc2l6ZSAobXBfc2l6ZV90IHBsLCBpbnQgaykKK3sKKyAgcGwgPSAxICsgKChwbCAtIDEpID4+IGspOyAvKiBjZWlsIChwbC8yXmspICovCisgIHJldHVybiBwbCA8PCBrOworfQorCisKKy8qIEluaXRpYWxpemUgbFtpXVtqXSB3aXRoIGJpdHJldihqKSAqLworc3RhdGljIHZvaWQKK21wbl9mZnRfaW5pdGwgKGludCAqKmwsIGludCBrKQoreworICBpbnQgaSwgaiwgSzsKKyAgaW50ICpsaTsKKworICBsWzBdWzBdID0gMDsKKyAgZm9yIChpID0gMSwgSyA9IDE7IGkgPD0gazsgaSsrLCBLICo9IDIpCisgICAgeworICAgICAgbGkgPSBsW2ldOworICAgICAgZm9yIChqID0gMDsgaiA8IEs7IGorKykKKwl7CisJICBsaVtqXSA9IDIgKiBsW2kgLSAxXVtqXTsKKwkgIGxpW0sgKyBqXSA9IDEgKyBsaVtqXTsKKwl9CisgICAgfQorfQorCisKKy8qIHIgPC0gYSoyXmQgbW9kIDJeKG4qR01QX05VTUJfQklUUykrMSB3aXRoIGEgPSB7YSwgbisxfQorICAgQXNzdW1lcyBhIGlzIHNlbWktbm9ybWFsaXplZCwgaS5lLiBhW25dIDw9IDEuCisgICByIGFuZCBhIG11c3QgaGF2ZSBuKzEgbGltYnMsIGFuZCBub3Qgb3ZlcmxhcC4KKyovCitzdGF0aWMgdm9pZAorbXBuX2ZmdF9tdWxfMmV4cF9tb2RGIChtcF9wdHIgciwgbXBfc3JjcHRyIGEsIG1wX2JpdGNudF90IGQsIG1wX3NpemVfdCBuKQoreworICB1bnNpZ25lZCBpbnQgc2g7CisgIG1wX3NpemVfdCBtOworICBtcF9saW1iX3QgY2MsIHJkOworCisgIHNoID0gZCAlIEdNUF9OVU1CX0JJVFM7CisgIG0gPSBkIC8gR01QX05VTUJfQklUUzsKKworICBpZiAobSA+PSBuKQkJCS8qIG5lZ2F0ZSAqLworICAgIHsKKyAgICAgIC8qIHJbMC4ubS0xXSAgPC0tIGxzaGlmdChhW24tbV0uLmFbbi0xXSwgc2gpCisJIHJbbS4ubi0xXSAgPC0tIC1sc2hpZnQoYVswXS4uYVtuLW0tMV0sICBzaCkgKi8KKworICAgICAgbSAtPSBuOworICAgICAgaWYgKHNoICE9IDApCisJeworCSAgLyogbm8gb3V0IHNoaWZ0IGJlbG93IHNpbmNlIGFbbl0gPD0gMSAqLworCSAgbXBuX2xzaGlmdCAociwgYSArIG4gLSBtLCBtICsgMSwgc2gpOworCSAgcmQgPSByW21dOworCSAgY2MgPSBtcG5fbHNoaWZ0YyAociArIG0sIGEsIG4gLSBtLCBzaCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIE1QTl9DT1BZIChyLCBhICsgbiAtIG0sIG0pOworCSAgcmQgPSBhW25dOworCSAgbXBuX2NvbSAociArIG0sIGEsIG4gLSBtKTsKKwkgIGNjID0gMDsKKwl9CisKKyAgICAgIC8qIGFkZCBjYyB0byByWzBdLCBhbmQgYWRkIHJkIHRvIHJbbV0gKi8KKworICAgICAgLyogbm93IGFkZCAxIGluIHJbbV0sIHN1YnRyYWN0IDEgaW4gcltuXSwgaS5lLiBhZGQgMSBpbiByWzBdICovCisKKyAgICAgIHJbbl0gPSAwOworICAgICAgLyogY2MgPCAyXnNoIDw9IDJeKEdNUF9OVU1CX0JJVFMtMSkgdGh1cyBubyBvdmVyZmxvdyBoZXJlICovCisgICAgICArK2NjOworICAgICAgTVBOX0lOQ1JfVSAociwgbiArIDEsIGNjKTsKKworICAgICAgKytyZDsKKyAgICAgIC8qIHJkIG1pZ2h0IG92ZXJmbG93IHdoZW4gc2g9R01QX05VTUJfQklUUy0xICovCisgICAgICBjYyA9IHJkICsgKHJkID09IDApOworICAgICAgciA9IHIgKyBtICsgKHJkID09IDApOworICAgICAgTVBOX0lOQ1JfVSAociwgbiArIDEgLSBtIC0gKHJkID09IDApLCBjYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogclswLi5tLTFdICA8LS0gLWxzaGlmdChhW24tbV0uLmFbbi0xXSwgc2gpCisJIHJbbS4ubi0xXSAgPC0tIGxzaGlmdChhWzBdLi5hW24tbS0xXSwgIHNoKSAgKi8KKyAgICAgIGlmIChzaCAhPSAwKQorCXsKKwkgIC8qIG5vIG91dCBiaXRzIGJlbG93IHNpbmNlIGFbbl0gPD0gMSAqLworCSAgbXBuX2xzaGlmdGMgKHIsIGEgKyBuIC0gbSwgbSArIDEsIHNoKTsKKwkgIHJkID0gfnJbbV07CisJICAvKiB7ciwgbSsxfSA9IHthK24tbSwgbSsxfSA8PCBzaCAqLworCSAgY2MgPSBtcG5fbHNoaWZ0IChyICsgbSwgYSwgbiAtIG0sIHNoKTsgLyoge3IrbSwgbi1tfSA9IHthLCBuLW19PDxzaCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiByW21dIGlzIG5vdCB1c2VkIGJlbG93LCBidXQgd2Ugc2F2ZSBhIHRlc3QgZm9yIG09MCAqLworCSAgbXBuX2NvbSAociwgYSArIG4gLSBtLCBtICsgMSk7CisJICByZCA9IGFbbl07CisJICBNUE5fQ09QWSAociArIG0sIGEsIG4gLSBtKTsKKwkgIGNjID0gMDsKKwl9CisKKyAgICAgIC8qIG5vdyBjb21wbGVtZW50IHtyLCBtfSwgc3VidHJhY3QgY2MgZnJvbSByWzBdLCBzdWJ0cmFjdCByZCBmcm9tIHJbbV0gKi8KKworICAgICAgLyogaWYgbT0wIHdlIGp1c3QgaGF2ZSByWzBdPWFbbl0gPDwgc2ggKi8KKyAgICAgIGlmIChtICE9IDApCisJeworCSAgLyogbm93IGFkZCAxIGluIHJbMF0sIHN1YnRyYWN0IDEgaW4gclttXSAqLworCSAgaWYgKGNjLS0gPT0gMCkgLyogdGhlbiBhZGQgMSB0byByWzBdICovCisJICAgIGNjID0gbXBuX2FkZF8xIChyLCByLCBuLCBDTlNUX0xJTUIoMSkpOworCSAgY2MgPSBtcG5fc3ViXzEgKHIsIHIsIG0sIGNjKSArIDE7CisJICAvKiBhZGQgMSB0byBjYyBpbnN0ZWFkIG9mIHJkIHNpbmNlIHJkIG1pZ2h0IG92ZXJmbG93ICovCisJfQorCisgICAgICAvKiBub3cgc3VidHJhY3QgY2MgYW5kIHJkIGZyb20gclttLi5uXSAqLworCisgICAgICByW25dID0gMjsgLyogQWRkIGEgdmFsdWUsIHRvIGF2b2lkIGJvcnJvdyBwcm9wYWdhdGlvbiAqLworICAgICAgTVBOX0RFQ1JfVSAociArIG0sIG4gLSBtICsgMSwgY2MpOworICAgICAgTVBOX0RFQ1JfVSAociArIG0sIG4gLSBtICsgMSwgcmQpOworICAgICAgLyogUmVtb3ZlIHRoZSBhZGRlZCB2YWx1ZSwgYW5kIGNoZWNrIGZvciBhIHBvc3NpYmxlIGJvcnJvdy4gKi8KKyAgICAgIGlmIChVTkxJS0VMWSAoKHJbbl0gLT0gMikgIT0gMCkpCisJeworCSAgbXBfbGltYl90IGN5ID0gLXJbbl07CisJICAvKiBjeSBzaG91bGQgYWx3YXlzIGJlIDEsIGV4Y2VwdCBpbiB0aGUgdmVyeSB1bmxpa2VseSBjYXNlCisJICAgICBtPW4tMSwgclttXT0wLCBjYytyZD5HTVBfTlVNQl9NQVgrMS4gTmV2ZXIgdHJpZ2dlcmVkLgorCSAgICAgSXMgaXQgYWN0dWFsbHkgcG9zc2libGU/ICovCisJICByW25dID0gMDsKKwkgIE1QTl9JTkNSX1UgKHIsIG4gKyAxLCBjeSk7CisJfQorICAgIH0KK30KKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorc3RhdGljIGlubGluZSB2b2lkCittcG5fZmZ0X2FkZF9zdWJfbW9kRiAobXBfcHRyIEEwLCBtcF9wdHIgQWksIG1wX3NyY3B0ciB0cCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCBjeWFzLCBjLCB4OworCisgIGN5YXMgPSBtcG5fYWRkX25fc3ViX24gKEEwLCBBaSwgQTAsIHRwLCBuKTsKKworICBjID0gQTBbbl0gLSB0cFtuXSAtIChjeWFzICYgMSk7CisgIHggPSAoLWMpICYgLSgoYyAmIEdNUF9MSU1CX0hJR0hCSVQpICE9IDApOworICBBaVtuXSA9IHggKyBjOworICBNUE5fSU5DUl9VIChBaSwgbiArIDEsIHgpOworCisgIGMgPSBBMFtuXSArIHRwW25dICsgKGN5YXMgPj4gMSk7CisgIHggPSAoYyAtIDEpICYgLShjICE9IDApOworICBBMFtuXSA9IGMgLSB4OworICBNUE5fREVDUl9VIChBMCwgbiArIDEsIHgpOworfQorCisjZWxzZSAvKiAhIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbiAgKi8KKworLyogciA8LSBhK2IgbW9kIDJeKG4qR01QX05VTUJfQklUUykrMS4KKyAgIEFzc3VtZXMgYSBhbmQgYiBhcmUgc2VtaS1ub3JtYWxpemVkLgorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbXBuX2ZmdF9hZGRfbW9kRiAobXBfcHRyIHIsIG1wX3NyY3B0ciBhLCBtcF9zcmNwdHIgYiwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCBjLCB4OworCisgIGMgPSBhW25dICsgYltuXSArIG1wbl9hZGRfbiAociwgYSwgYiwgbik7CisgIC8qIDAgPD0gYyA8PSAzICovCisKKyNpZiAxCisgIC8qIEdDQyA0LjEgb3V0c21hcnRzIG1vc3QgZXhwcmVzc2lvbnMgaGVyZSwgYW5kIGdlbmVyYXRlcyBhIDUwJSBicmFuY2guICBUaGUKKyAgICAgcmVzdWx0IGlzIHNsb3dlciBjb2RlLCBvZiBjb3Vyc2UuICBCdXQgdGhlIGZvbGxvd2luZyBvdXRzbWFydHMgR0NDLiAgKi8KKyAgeCA9IChjIC0gMSkgJiAtKGMgIT0gMCk7CisgIHJbbl0gPSBjIC0geDsKKyAgTVBOX0RFQ1JfVSAociwgbiArIDEsIHgpOworI2VuZGlmCisjaWYgMAorICBpZiAoYyA+IDEpCisgICAgeworICAgICAgcltuXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiByW25dIC0gYyA9IDEgKi8KKyAgICAgIE1QTl9ERUNSX1UgKHIsIG4gKyAxLCBjIC0gMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcltuXSA9IGM7CisgICAgfQorI2VuZGlmCit9CisKKy8qIHIgPC0gYS1iIG1vZCAyXihuKkdNUF9OVU1CX0JJVFMpKzEuCisgICBBc3N1bWVzIGEgYW5kIGIgYXJlIHNlbWktbm9ybWFsaXplZC4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQKK21wbl9mZnRfc3ViX21vZEYgKG1wX3B0ciByLCBtcF9zcmNwdHIgYSwgbXBfc3JjcHRyIGIsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgYywgeDsKKworICBjID0gYVtuXSAtIGJbbl0gLSBtcG5fc3ViX24gKHIsIGEsIGIsIG4pOworICAvKiAtMiA8PSBjIDw9IDEgKi8KKworI2lmIDEKKyAgLyogR0NDIDQuMSBvdXRzbWFydHMgbW9zdCBleHByZXNzaW9ucyBoZXJlLCBhbmQgZ2VuZXJhdGVzIGEgNTAlIGJyYW5jaC4gIFRoZQorICAgICByZXN1bHQgaXMgc2xvd2VyIGNvZGUsIG9mIGNvdXJzZS4gIEJ1dCB0aGUgZm9sbG93aW5nIG91dHNtYXJ0cyBHQ0MuICAqLworICB4ID0gKC1jKSAmIC0oKGMgJiBHTVBfTElNQl9ISUdIQklUKSAhPSAwKTsKKyAgcltuXSA9IHggKyBjOworICBNUE5fSU5DUl9VIChyLCBuICsgMSwgeCk7CisjZW5kaWYKKyNpZiAwCisgIGlmICgoYyAmIEdNUF9MSU1CX0hJR0hCSVQpICE9IDApCisgICAgeworICAgICAgcltuXSA9IDA7CisgICAgICBNUE5fSU5DUl9VIChyLCBuICsgMSwgLWMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJbbl0gPSBjOworICAgIH0KKyNlbmRpZgorfQorI2VuZGlmIC8qIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbiAqLworCisvKiBpbnB1dDogQVswXSAuLi4gQVtpbmMqKEstMSldIGFyZSByZXNpZHVlcyBtb2QgMl5OKzEgd2hlcmUKKwkgIE49bipHTVBfTlVNQl9CSVRTLCBhbmQgMl5vbWVnYSBpcyBhIHByaW1pdGl2ZSByb290IG1vZCAyXk4rMQorICAgb3V0cHV0OiBBW2luYypsW2tdW2ldXSA8LSBcc3VtICgyXm9tZWdhKV4oaWopIEFbaW5jKmpdIG1vZCAyXk4rMSAqLworCitzdGF0aWMgdm9pZAorbXBuX2ZmdF9mZnQgKG1wX3B0ciAqQXAsIG1wX3NpemVfdCBLLCBpbnQgKipsbCwKKwkgICAgIG1wX3NpemVfdCBvbWVnYSwgbXBfc2l6ZV90IG4sIG1wX3NpemVfdCBpbmMsIG1wX3B0ciB0cCkKK3sKKyAgaWYgKEsgPT0gMikKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3k7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgICAgICBjeSA9IG1wbl9hZGRfbl9zdWJfbiAoQXBbMF0sIEFwW2luY10sIEFwWzBdLCBBcFtpbmNdLCBuICsgMSkgJiAxOworI2Vsc2UKKyAgICAgIE1QTl9DT1BZICh0cCwgQXBbMF0sIG4gKyAxKTsKKyAgICAgIG1wbl9hZGRfbiAoQXBbMF0sIEFwWzBdLCBBcFtpbmNdLCBuICsgMSk7CisgICAgICBjeSA9IG1wbl9zdWJfbiAoQXBbaW5jXSwgdHAsIEFwW2luY10sIG4gKyAxKTsKKyNlbmRpZgorICAgICAgaWYgKEFwWzBdW25dID4gMSkgLyogY2FuIGJlIDIgb3IgMyAqLworCXsgLyogQXBbMF1bbl0gPSAxIC0gbXBuX3N1Yl8xIChBcFswXSwgQXBbMF0sIG4sIEFwWzBdW25dIC0gMSk7ICovCisJICBtcF9saW1iX3QgY2MgPSBBcFswXVtuXSAtIDE7CisJICBBcFswXVtuXSA9IDE7CisJICBNUE5fREVDUl9VIChBcFswXSwgbiArIDEsIGNjKTsKKwl9CisgICAgICBpZiAoY3kpIC8qIEFwW2luY11bbl0gY2FuIGJlIC0xIG9yIC0yICovCisJeyAvKiBBcFtpbmNdW25dID0gbXBuX2FkZF8xIChBcFtpbmNdLCBBcFtpbmNdLCBuLCB+QXBbaW5jXVtuXSArIDEpOyAqLworCSAgbXBfbGltYl90IGNjID0gfkFwW2luY11bbl0gKyAxOworCSAgQXBbaW5jXVtuXSA9IDA7CisJICBNUE5fSU5DUl9VIChBcFtpbmNdLCBuICsgMSwgY2MpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9zaXplX3QgaiwgSzIgPSBLID4+IDE7CisgICAgICBpbnQgKmxrID0gKmxsOworCisgICAgICBtcG5fZmZ0X2ZmdCAoQXAsICAgICBLMiwgbGwtMSwgMiAqIG9tZWdhLCBuLCBpbmMgKiAyLCB0cCk7CisgICAgICBtcG5fZmZ0X2ZmdCAoQXAraW5jLCBLMiwgbGwtMSwgMiAqIG9tZWdhLCBuLCBpbmMgKiAyLCB0cCk7CisgICAgICAvKiBBWzIqaippbmNdICAgPC0gQVsyKmoqaW5jXSArIG9tZWdhXmxba11bMipqKmluY10gQVsoMmorMSlpbmNdCisJIEFbKDJqKzEpaW5jXSA8LSBBWzIqaippbmNdICsgb21lZ2FebFtrXVsoMmorMSlpbmNdIEFbKDJqKzEpaW5jXSAqLworICAgICAgZm9yIChqID0gMDsgaiA8IEsyOyBqKyssIGxrICs9IDIsIEFwICs9IDIgKiBpbmMpCisJeworCSAgLyogQXBbaW5jXSA8LSBBcFswXSArIEFwW2luY10gKiAyXihsa1sxXSAqIG9tZWdhKQorCSAgICAgQXBbMF0gICA8LSBBcFswXSArIEFwW2luY10gKiAyXihsa1swXSAqIG9tZWdhKSAqLworCSAgbXBuX2ZmdF9tdWxfMmV4cF9tb2RGICh0cCwgQXBbaW5jXSwgbGtbMF0gKiBvbWVnYSwgbik7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisJICBtcG5fZmZ0X2FkZF9zdWJfbW9kRiAoQXBbMF0sIEFwW2luY10sIHRwLCBuKTsKKyNlbHNlCisJICBtcG5fZmZ0X3N1Yl9tb2RGIChBcFtpbmNdLCBBcFswXSwgdHAsIG4pOworCSAgbXBuX2ZmdF9hZGRfbW9kRiAoQXBbMF0sICAgQXBbMF0sIHRwLCBuKTsKKyNlbmRpZgorCX0KKyAgICB9Cit9CisKKy8qIGlucHV0OiBBWzBdIC4uLiBBW2luYyooSy0xKV0gYXJlIHJlc2lkdWVzIG1vZCAyXk4rMSB3aGVyZQorCSAgTj1uKkdNUF9OVU1CX0JJVFMsIGFuZCAyXm9tZWdhIGlzIGEgcHJpbWl0aXZlIHJvb3QgbW9kIDJeTisxCisgICBvdXRwdXQ6IEFbaW5jKmxba11baV1dIDwtIFxzdW0gKDJeb21lZ2EpXihpaikgQVtpbmMqal0gbW9kIDJeTisxCisgICB0cCBtdXN0IGhhdmUgc3BhY2UgZm9yIDIqKG4rMSkgbGltYnMuCisqLworCisKKy8qIEdpdmVuIGFwWzAuLm5dIHdpdGggYXBbbl08PTEsIHJlZHVjZSBpdCBtb2R1bG8gMl4obipHTVBfTlVNQl9CSVRTKSsxLAorICAgYnkgc3VidHJhY3RpbmcgdGhhdCBtb2R1bHVzIGlmIG5lY2Vzc2FyeS4KKworICAgSWYgYXBbMC4ubl0gaXMgZXhhY3RseSAyXihuKkdNUF9OVU1CX0JJVFMpIHRoZW4gbXBuX3N1Yl8xIHByb2R1Y2VzIGEKKyAgIGJvcnJvdyBhbmQgdGhlIGxpbWJzIG11c3QgYmUgemVyb2VkIG91dCBhZ2Fpbi4gIFRoaXMgd2lsbCBvY2N1ciB2ZXJ5CisgICBpbmZyZXF1ZW50bHkuICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK21wbl9mZnRfbm9ybWFsaXplIChtcF9wdHIgYXAsIG1wX3NpemVfdCBuKQoreworICBpZiAoYXBbbl0gIT0gMCkKKyAgICB7CisgICAgICBNUE5fREVDUl9VIChhcCwgbiArIDEsIENOU1RfTElNQigxKSk7CisgICAgICBpZiAoYXBbbl0gPT0gMCkKKwl7CisJICAvKiBUaGlzIGhhcHBlbnMgd2l0aCB2ZXJ5IGxvdyBwcm9iYWJpbGl0eTsgd2UgaGF2ZSB5ZXQgdG8gdHJpZ2dlciBpdCwKKwkgICAgIGFuZCB0aGVyZWJ5IG1ha2Ugc3VyZSB0aGlzIGNvZGUgaXMgY29ycmVjdC4gICovCisJICBNUE5fWkVSTyAoYXAsIG4pOworCSAgYXBbbl0gPSAxOworCX0KKyAgICAgIGVsc2UKKwlhcFtuXSA9IDA7CisgICAgfQorfQorCisvKiBhW2ldIDwtIGFbaV0qYltpXSBtb2QgMl4obipHTVBfTlVNQl9CSVRTKSsxIGZvciAwIDw9IGkgPCBLICovCitzdGF0aWMgdm9pZAorbXBuX2ZmdF9tdWxfbW9kRl9LIChtcF9wdHIgKmFwLCBtcF9wdHIgKmJwLCBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IEspCit7CisgIGludCBpOworICB1bnNpZ25lZCBrOworICBpbnQgc3FyID0gKGFwID09IGJwKTsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKG4gPj0gKHNxciA/IFNRUl9GRlRfTU9ERl9USFJFU0hPTEQgOiBNVUxfRkZUX01PREZfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9zaXplX3QgSzIsIG5wcmltZTIsIE5wcmltZTIsIE0yLCBtYXhMSywgbCwgTXAyOworICAgICAgaW50IGs7CisgICAgICBpbnQgKipmZnRfbCwgKnRtcDsKKyAgICAgIG1wX3B0ciAqQXAsICpCcCwgQSwgQiwgVDsKKworICAgICAgayA9IG1wbl9mZnRfYmVzdF9rIChuLCBzcXIpOworICAgICAgSzIgPSAobXBfc2l6ZV90KSAxIDw8IGs7CisgICAgICBBU1NFUlRfQUxXQVlTKChuICYgKEsyIC0gMSkpID09IDApOworICAgICAgbWF4TEsgPSAoSzIgPiBHTVBfTlVNQl9CSVRTKSA/IEsyIDogR01QX05VTUJfQklUUzsKKyAgICAgIE0yID0gbiAqIEdNUF9OVU1CX0JJVFMgPj4gazsKKyAgICAgIGwgPSBuID4+IGs7CisgICAgICBOcHJpbWUyID0gKCgyICogTTIgKyBrICsgMiArIG1heExLKSAvIG1heExLKSAqIG1heExLOworICAgICAgLyogTnByaW1lMiA9IGNlaWwoKDIqTTIrayszKS9tYXhMSykqbWF4TEsqLworICAgICAgbnByaW1lMiA9IE5wcmltZTIgLyBHTVBfTlVNQl9CSVRTOworCisgICAgICAvKiB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgbnByaW1lMiBpcyBhIG11bHRpcGxlIG9mIHRoZSBuZXh0IEsgKi8KKyAgICAgIGlmIChucHJpbWUyID49IChzcXIgPyBTUVJfRkZUX01PREZfVEhSRVNIT0xEIDogTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisJeworCSAgbXBfc2l6ZV90IEszOworCSAgZm9yICg7OykKKwkgICAgeworCSAgICAgIEszID0gKG1wX3NpemVfdCkgMSA8PCBtcG5fZmZ0X2Jlc3RfayAobnByaW1lMiwgc3FyKTsKKwkgICAgICBpZiAoKG5wcmltZTIgJiAoSzMgLSAxKSkgPT0gMCkKKwkJYnJlYWs7CisJICAgICAgbnByaW1lMiA9IChucHJpbWUyICsgSzMgLSAxKSAmIC1LMzsKKwkgICAgICBOcHJpbWUyID0gbnByaW1lMiAqIEdNUF9MSU1CX0JJVFM7CisJICAgICAgLyogd2FybmluZzogc2luY2UgbnByaW1lMiBjaGFuZ2VkLCBLMyBtYXkgY2hhbmdlIHRvbyEgKi8KKwkgICAgfQorCX0KKyAgICAgIEFTU0VSVF9BTFdBWVMobnByaW1lMiA8IG4pOyAvKiBvdGhlcndpc2Ugd2UnbGwgbG9vcCAqLworCisgICAgICBNcDIgPSBOcHJpbWUyID4+IGs7CisKKyAgICAgIEFwID0gVE1QX0JBTExPQ19NUF9QVFJTIChLMik7CisgICAgICBCcCA9IFRNUF9CQUxMT0NfTVBfUFRSUyAoSzIpOworICAgICAgQSA9IFRNUF9CQUxMT0NfTElNQlMgKDIgKiAobnByaW1lMiArIDEpIDw8IGspOworICAgICAgVCA9IFRNUF9CQUxMT0NfTElNQlMgKDIgKiAobnByaW1lMiArIDEpKTsKKyAgICAgIEIgPSBBICsgKChucHJpbWUyICsgMSkgPDwgayk7CisgICAgICBmZnRfbCA9IFRNUF9CQUxMT0NfVFlQRSAoayArIDEsIGludCAqKTsKKyAgICAgIHRtcCA9IFRNUF9CQUxMT0NfVFlQRSAoKHNpemVfdCkgMiA8PCBrLCBpbnQpOworICAgICAgZm9yIChpID0gMDsgaSA8PSBrOyBpKyspCisJeworCSAgZmZ0X2xbaV0gPSB0bXA7CisJICB0bXAgKz0gKG1wX3NpemVfdCkgMSA8PCBpOworCX0KKworICAgICAgbXBuX2ZmdF9pbml0bCAoZmZ0X2wsIGspOworCisgICAgICBUUkFDRSAocHJpbnRmICgicmVjdXJzZTogJWxkeCVsZCBsaW1icyAtPiAlbGQgdGltZXMgJWxkeCVsZCAoJTEuMmYpXG4iLCBuLAorCQkgICAgbiwgSzIsIG5wcmltZTIsIG5wcmltZTIsIDIuMCooZG91YmxlKW4vbnByaW1lMi9LMikpOworICAgICAgZm9yIChpID0gMDsgaSA8IEs7IGkrKywgYXArKywgYnArKykKKwl7CisJICBtcF9saW1iX3QgY3k7CisJICBtcG5fZmZ0X25vcm1hbGl6ZSAoKmFwLCBuKTsKKwkgIGlmICghc3FyKQorCSAgICBtcG5fZmZ0X25vcm1hbGl6ZSAoKmJwLCBuKTsKKworCSAgbXBuX211bF9mZnRfZGVjb21wb3NlIChBLCBBcCwgSzIsIG5wcmltZTIsICphcCwgKGwgPDwgaykgKyAxLCBsLCBNcDIsIFQpOworCSAgaWYgKCFzcXIpCisJICAgIG1wbl9tdWxfZmZ0X2RlY29tcG9zZSAoQiwgQnAsIEsyLCBucHJpbWUyLCAqYnAsIChsIDw8IGspICsgMSwgbCwgTXAyLCBUKTsKKworCSAgY3kgPSBtcG5fbXVsX2ZmdF9pbnRlcm5hbCAoKmFwLCBuLCBrLCBBcCwgQnAsIEEsIEIsIG5wcmltZTIsCisJCQkJICAgICBsLCBNcDIsIGZmdF9sLCBULCBzcXIpOworCSAgKCphcClbbl0gPSBjeTsKKwl9CisgICAgfQorI2lmICEgVFVORV9QUk9HUkFNX0JVSUxECisgIGVsc2UgaWYgKE1QTl9NVUxNT0RfQktOUDFfVVNBQkxFIChuLCBrLCBNVUxfRkZUX01PREZfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgYTsKKyAgICAgIG1wX3NpemVfdCBuX2sgPSBuIC8gazsKKworICAgICAgaWYgKHNxcikKKyAgICAgICB7CisJIG1wX3B0ciB0cCA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl9zcXJtb2RfYmtucDFfaXRjaCAobikpOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IEs7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgIGEgPSAqYXArKzsKKyAgICAgICAgICAgICBtcG5fc3FybW9kX2JrbnAxIChhLCBhLCBuX2ssIGssIHRwKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICB7CisJIG1wX3B0ciBiLCB0cCA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl9tdWxtb2RfYmtucDFfaXRjaCAobikpOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IEs7IGkrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAgIGEgPSAqYXArKzsKKyAgICAgICAgICAgICBiID0gKmJwKys7CisgICAgICAgICAgICAgbXBuX211bG1vZF9ia25wMSAoYSwgYSwgYiwgbl9rLCBrLCB0cCk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgYSwgYiwgdHAsIHRwbjsKKyAgICAgIG1wX2xpbWJfdCBjYzsKKyAgICAgIG1wX3NpemVfdCBuMiA9IDIgKiBuOworICAgICAgdHAgPSBUTVBfQkFMTE9DX0xJTUJTIChuMik7CisgICAgICB0cG4gPSB0cCArIG47CisgICAgICBUUkFDRSAocHJpbnRmICgiICBtcG5fbXVsX24gJWxkIG9mICVsZCBsaW1ic1xuIiwgSywgbikpOworICAgICAgZm9yIChpID0gMDsgaSA8IEs7IGkrKykKKwl7CisJICBhID0gKmFwKys7CisJICBiID0gKmJwKys7CisJICBpZiAoc3FyKQorCSAgICBtcG5fc3FyICh0cCwgYSwgbik7CisJICBlbHNlCisJICAgIG1wbl9tdWxfbiAodHAsIGIsIGEsIG4pOworCSAgaWYgKGFbbl0gIT0gMCkKKwkgICAgY2MgPSBtcG5fYWRkX24gKHRwbiwgdHBuLCBiLCBuKTsKKwkgIGVsc2UKKwkgICAgY2MgPSAwOworCSAgaWYgKGJbbl0gIT0gMCkKKwkgICAgY2MgKz0gbXBuX2FkZF9uICh0cG4sIHRwbiwgYSwgbikgKyBhW25dOworCSAgaWYgKGNjICE9IDApCisJICAgIHsKKwkgICAgICBjYyA9IG1wbl9hZGRfMSAodHAsIHRwLCBuMiwgY2MpOworCSAgICAgIC8qIElmIG1wbl9hZGRfMSBnaXZlIGEgY2FycnkgKGNjICE9IDApLAorCQkgdGhlIHJlc3VsdCAodHApIGlzIGF0IG1vc3QgR01QX05VTUJfTUFYIC0gMSwKKwkJIHNvIHRoZSBmb2xsb3dpbmcgYWRkaXRpb24gY2FuJ3Qgb3ZlcmZsb3cuCisJICAgICAgKi8KKwkgICAgICB0cFswXSArPSBjYzsKKwkgICAgfQorCSAgY2MgPSBtcG5fc3ViX24gKGEsIHRwLCB0cG4sIG4pOworCSAgYVtuXSA9IDA7CisJICBNUE5fSU5DUl9VIChhLCBuICsgMSwgY2MpOworCX0KKyAgICB9CisgIFRNUF9GUkVFOworfQorCisKKy8qIGlucHV0OiBBXltsW2tdWzBdXSBBXltsW2tdWzFdXSAuLi4gQV5bbFtrXVtLLTFdXQorICAgb3V0cHV0OiBLKkFbMF0gSypBW0stMV0gLi4uIEsqQVsxXS4KKyAgIEFzc3VtZXMgdGhlIEFwW10gYXJlIHBzZXVkby1ub3JtYWxpemVkLCBpLmUuIDAgPD0gQXBbXVtuXSA8PSAxLgorICAgVGhpcyBjb25kaXRpb24gaXMgYWxzbyBmdWxmaWxsZWQgYXQgZXhpdC4KKyovCitzdGF0aWMgdm9pZAorbXBuX2ZmdF9mZnRpbnYgKG1wX3B0ciAqQXAsIG1wX3NpemVfdCBLLCBtcF9zaXplX3Qgb21lZ2EsIG1wX3NpemVfdCBuLCBtcF9wdHIgdHApCit7CisgIGlmIChLID09IDIpCisgICAgeworICAgICAgbXBfbGltYl90IGN5OworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICAgICAgY3kgPSBtcG5fYWRkX25fc3ViX24gKEFwWzBdLCBBcFsxXSwgQXBbMF0sIEFwWzFdLCBuICsgMSkgJiAxOworI2Vsc2UKKyAgICAgIE1QTl9DT1BZICh0cCwgQXBbMF0sIG4gKyAxKTsKKyAgICAgIG1wbl9hZGRfbiAoQXBbMF0sIEFwWzBdLCBBcFsxXSwgbiArIDEpOworICAgICAgY3kgPSBtcG5fc3ViX24gKEFwWzFdLCB0cCwgQXBbMV0sIG4gKyAxKTsKKyNlbmRpZgorICAgICAgaWYgKEFwWzBdW25dID4gMSkgLyogY2FuIGJlIDIgb3IgMyAqLworCXsgLyogQXBbMF1bbl0gPSAxIC0gbXBuX3N1Yl8xIChBcFswXSwgQXBbMF0sIG4sIEFwWzBdW25dIC0gMSk7ICovCisJICBtcF9saW1iX3QgY2MgPSBBcFswXVtuXSAtIDE7CisJICBBcFswXVtuXSA9IDE7CisJICBNUE5fREVDUl9VIChBcFswXSwgbiArIDEsIGNjKTsKKwl9CisgICAgICBpZiAoY3kpIC8qIEFwWzFdW25dIGNhbiBiZSAtMSBvciAtMiAqLworCXsgLyogQXBbMV1bbl0gPSBtcG5fYWRkXzEgKEFwWzFdLCBBcFsxXSwgbiwgfkFwWzFdW25dICsgMSk7ICovCisJICBtcF9saW1iX3QgY2MgPSB+QXBbMV1bbl0gKyAxOworCSAgQXBbMV1bbl0gPSAwOworCSAgTVBOX0lOQ1JfVSAoQXBbMV0sIG4gKyAxLCBjYyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBqLCBLMiA9IEsgPj4gMTsKKworICAgICAgbXBuX2ZmdF9mZnRpbnYgKEFwLCAgICAgIEsyLCAyICogb21lZ2EsIG4sIHRwKTsKKyAgICAgIG1wbl9mZnRfZmZ0aW52IChBcCArIEsyLCBLMiwgMiAqIG9tZWdhLCBuLCB0cCk7CisgICAgICAvKiBBW2pdICAgICA8LSBBW2pdICsgb21lZ2FeaiBBW2orSy8yXQorCSBBW2orSy8yXSA8LSBBW2pdICsgb21lZ2FeKGorSy8yKSBBW2orSy8yXSAqLworICAgICAgZm9yIChqID0gMDsgaiA8IEsyOyBqKyssIEFwKyspCisJeworCSAgLyogQXBbSzJdIDwtIEFwWzBdICsgQXBbSzJdICogMl4oKGogKyBLMikgKiBvbWVnYSkKKwkgICAgIEFwWzBdICA8LSBBcFswXSArIEFwW0syXSAqIDJeKGogKiBvbWVnYSkgKi8KKwkgIG1wbl9mZnRfbXVsXzJleHBfbW9kRiAodHAsIEFwW0syXSwgaiAqIG9tZWdhLCBuKTsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKwkgIG1wbl9mZnRfYWRkX3N1Yl9tb2RGIChBcFswXSwgQXBbSzJdLCB0cCwgbik7CisjZWxzZQorCSAgbXBuX2ZmdF9zdWJfbW9kRiAoQXBbSzJdLCBBcFswXSwgdHAsIG4pOworCSAgbXBuX2ZmdF9hZGRfbW9kRiAoQXBbMF0sICBBcFswXSwgdHAsIG4pOworI2VuZGlmCisJfQorICAgIH0KK30KKworCisvKiBSIDwtIEEvMl5rIG1vZCAyXihuKkdNUF9OVU1CX0JJVFMpKzEgKi8KK3N0YXRpYyB2b2lkCittcG5fZmZ0X2Rpdl8yZXhwX21vZEYgKG1wX3B0ciByLCBtcF9zcmNwdHIgYSwgbXBfYml0Y250X3QgaywgbXBfc2l6ZV90IG4pCit7CisgIG1wX2JpdGNudF90IGk7CisKKyAgQVNTRVJUIChyICE9IGEpOworICBpID0gKG1wX2JpdGNudF90KSAyICogbiAqIEdNUF9OVU1CX0JJVFMgLSBrOworICBtcG5fZmZ0X211bF8yZXhwX21vZEYgKHIsIGEsIGksIG4pOworICAvKiAxLzJeayA9IDJeKDJuTC1rKSBtb2QgMl4obipHTVBfTlVNQl9CSVRTKSsxICovCisgIC8qIG5vcm1hbGl6ZSBzbyB0aGF0IFIgPCAyXihuKkdNUF9OVU1CX0JJVFMpKzEgKi8KKyAgbXBuX2ZmdF9ub3JtYWxpemUgKHIsIG4pOworfQorCisKKy8qIHtycCxufSA8LSB7YXAsYW59IG1vZCAyXihuKkdNUF9OVU1CX0JJVFMpKzEsIG4gPD0gYW4gPD0gMypuLgorICAgUmV0dXJucyBjYXJyeSBvdXQsIGkuZS4gMSBpZmYge2FwLGFufSA9IC0xIG1vZCAyXihuKkdNUF9OVU1CX0JJVFMpKzEsCisgICB0aGVuIHtycCxufT0wLgorKi8KK3N0YXRpYyBtcF9zaXplX3QKK21wbl9mZnRfbm9ybV9tb2RGIChtcF9wdHIgcnAsIG1wX3NpemVfdCBuLCBtcF9wdHIgYXAsIG1wX3NpemVfdCBhbikKK3sKKyAgbXBfc2l6ZV90IGwsIG0sIHJwbjsKKyAgbXBfbGltYl90IGNjOworCisgIEFTU0VSVCAoKG4gPD0gYW4pICYmIChhbiA8PSAzICogbikpOworICBtID0gYW4gLSAyICogbjsKKyAgaWYgKG0gPiAwKQorICAgIHsKKyAgICAgIGwgPSBuOworICAgICAgLyogYWRkIHthcCwgbX0gYW5kIHthcCsybiwgbX0gaW4ge3JwLCBtfSAqLworICAgICAgY2MgPSBtcG5fYWRkX24gKHJwLCBhcCwgYXAgKyAyICogbiwgbSk7CisgICAgICAvKiBjb3B5IHthcCttLCBuLW19IHRvIHtycCttLCBuLW19ICovCisgICAgICBycG4gPSBtcG5fYWRkXzEgKHJwICsgbSwgYXAgKyBtLCBuIC0gbSwgY2MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGwgPSBhbiAtIG47IC8qIGwgPD0gbiAqLworICAgICAgTVBOX0NPUFkgKHJwLCBhcCwgbik7CisgICAgICBycG4gPSAwOworICAgIH0KKworICAvKiByZW1haW5zIHRvIHN1YnRyYWN0IHthcCtuLCBsfSBmcm9tIHtycCwgbisxfSAqLworICBycG4gLT0gbXBuX3N1YiAocnAsIHJwLCBuLCBhcCArIG4sIGwpOworICBpZiAocnBuIDwgMCkgLyogbmVjZXNzYXJpbHkgcnBuID0gLTEgKi8KKyAgICBycG4gPSBtcG5fYWRkXzEgKHJwLCBycCwgbiwgQ05TVF9MSU1CKDEpKTsKKyAgcmV0dXJuIHJwbjsKK30KKworLyogc3RvcmUgaW4gQVswLi5ucHJpbWVdIHRoZSBmaXJzdCBNIGJpdHMgZnJvbSB7biwgbmx9LAorICAgaW4gQVtucHJpbWUrMS4uXSB0aGUgZm9sbG93aW5nIE0gYml0cywgLi4uCisgICBBc3N1bWVzIE0gaXMgYSBtdWx0aXBsZSBvZiBHTVBfTlVNQl9CSVRTIChNID0gbCAqIEdNUF9OVU1CX0JJVFMpLgorICAgVCBtdXN0IGhhdmUgc3BhY2UgZm9yIGF0IGxlYXN0IChucHJpbWUgKyAxKSBsaW1icy4KKyAgIFdlIG11c3QgaGF2ZSBubCA8PSAyKksqbC4KKyovCitzdGF0aWMgdm9pZAorbXBuX211bF9mZnRfZGVjb21wb3NlIChtcF9wdHIgQSwgbXBfcHRyICpBcCwgbXBfc2l6ZV90IEssIG1wX3NpemVfdCBucHJpbWUsCisJCSAgICAgICBtcF9zcmNwdHIgbiwgbXBfc2l6ZV90IG5sLCBtcF9zaXplX3QgbCwgbXBfc2l6ZV90IE1wLAorCQkgICAgICAgbXBfcHRyIFQpCit7CisgIG1wX3NpemVfdCBpLCBqOworICBtcF9wdHIgdG1wOworICBtcF9zaXplX3QgS2wgPSBLICogbDsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIGlmIChubCA+IEtsKSAvKiBub3JtYWxpemUge24sIG5sfSBtb2QgMl4oS2wqR01QX05VTUJfQklUUykrMSAqLworICAgIHsKKyAgICAgIG1wX3NpemVfdCBkaWYgPSBubCAtIEtsOworCisgICAgICB0bXAgPSBUTVBfQkFMTE9DX0xJTUJTKEtsICsgMSk7CisgICAgICB0bXBbS2xdID0gMDsKKworI2lmICEgV0FOVF9PTERfRkZUX0ZVTEwKKyAgICAgIEFTU0VSVF9BTFdBWVMgKGRpZiA8PSBLbCk7CisjZWxzZQorICAgICAgLyogVGhlIGNvbW1lbnQgIldlIG11c3QgaGF2ZSBubCA8PSAyKksqbC4iIHNheXMgdGhhdAorCSAoKGRpZiA9IG5sIC0gS2wpID4gS2wpIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisgICAgICBpZiAoVU5MSUtFTFkgKGRpZiA+IEtsKSkKKwl7CisJICBtcF9saW1iX3NpZ25lZF90IGN5OworCSAgaW50IHN1YnAgPSAwOworCisJICBjeSA9IG1wbl9zdWJfbiAodG1wLCBuLCBuICsgS2wsIEtsKTsKKwkgIG4gKz0gMiAqIEtsOworCSAgZGlmIC09IEtsOworCisJICAvKiBub3cgZGlmID4gMCAqLworCSAgd2hpbGUgKGRpZiA+IEtsKQorCSAgICB7CisJICAgICAgaWYgKHN1YnApCisJCWN5ICs9IG1wbl9zdWJfbiAodG1wLCB0bXAsIG4sIEtsKTsKKwkgICAgICBlbHNlCisJCWN5IC09IG1wbl9hZGRfbiAodG1wLCB0bXAsIG4sIEtsKTsKKwkgICAgICBzdWJwIF49IDE7CisJICAgICAgbiArPSBLbDsKKwkgICAgICBkaWYgLT0gS2w7CisJICAgIH0KKwkgIC8qIG5vdyBkaWYgPD0gS2wgKi8KKwkgIGlmIChzdWJwKQorCSAgICBjeSArPSBtcG5fc3ViICh0bXAsIHRtcCwgS2wsIG4sIGRpZik7CisJICBlbHNlCisJICAgIGN5IC09IG1wbl9hZGQgKHRtcCwgdG1wLCBLbCwgbiwgZGlmKTsKKwkgIGlmIChjeSA+PSAwKQorCSAgICBNUE5fSU5DUl9VICh0bXAsIEtsICsgMSwgY3kpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgdG1wW0tsXSA9IDE7CisJICAgICAgTVBOX0RFQ1JfVSAodG1wLCBLbCArIDEsIC1jeSAtIDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSAvKiBkaWYgPD0gS2wsIGkuZS4gbmwgPD0gMiAqIEtsICovCisjZW5kaWYKKwl7CisJICBtcF9saW1iX3QgY3k7CisJICBjeSA9IG1wbl9zdWIgKHRtcCwgbiwgS2wsIG4gKyBLbCwgZGlmKTsKKwkgIE1QTl9JTkNSX1UgKHRtcCwgS2wgKyAxLCBjeSk7CisJfQorICAgICAgbmwgPSBLbCArIDE7CisgICAgICBuID0gdG1wOworICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IEs7IGkrKykKKyAgICB7CisgICAgICBBcFtpXSA9IEE7CisgICAgICAvKiBzdG9yZSB0aGUgbmV4dCBNIGJpdHMgb2YgbiBpbnRvIEFbMC4ubnByaW1lXSAqLworICAgICAgaWYgKG5sID4gMCkgLyogbmwgaXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgbGltYnMgKi8KKwl7CisJICBqID0gKGwgPD0gbmwgJiYgaSA8IEsgLSAxKSA/IGwgOiBubDsgLyogc3RvcmUgaiBuZXh0IGxpbWJzICovCisJICBubCAtPSBqOworCSAgTVBOX0NPUFkgKFQsIG4sIGopOworCSAgTVBOX1pFUk8gKFQgKyBqLCBucHJpbWUgKyAxIC0gaik7CisJICBuICs9IGw7CisJICBtcG5fZmZ0X211bF8yZXhwX21vZEYgKEEsIFQsIGkgKiBNcCwgbnByaW1lKTsKKwl9CisgICAgICBlbHNlCisJTVBOX1pFUk8gKEEsIG5wcmltZSArIDEpOworICAgICAgQSArPSBucHJpbWUgKyAxOworICAgIH0KKyAgQVNTRVJUX0FMV0FZUyAobmwgPT0gMCk7CisgIFRNUF9GUkVFOworfQorCisvKiBvcCA8LSBuKm0gbW9kIDJeTisxIHdpdGggZmZ0IG9mIHNpemUgMl5rIHdoZXJlIE49cGwqR01QX05VTUJfQklUUworICAgb3AgaXMgcGwgbGltYnMsIGl0cyBoaWdoIGJpdCBpcyByZXR1cm5lZC4KKyAgIE9uZSBtdXN0IGhhdmUgcGwgPSBtcG5fZmZ0X25leHRfc2l6ZSAocGwsIGspLgorICAgVCBtdXN0IGhhdmUgc3BhY2UgZm9yIDIgKiAobnByaW1lICsgMSkgbGltYnMuCisqLworCitzdGF0aWMgbXBfbGltYl90CittcG5fbXVsX2ZmdF9pbnRlcm5hbCAobXBfcHRyIG9wLCBtcF9zaXplX3QgcGwsIGludCBrLAorCQkgICAgICBtcF9wdHIgKkFwLCBtcF9wdHIgKkJwLCBtcF9wdHIgdW51c2VkQSwgbXBfcHRyIEIsCisJCSAgICAgIG1wX3NpemVfdCBucHJpbWUsIG1wX3NpemVfdCBsLCBtcF9zaXplX3QgTXAsCisJCSAgICAgIGludCAqKmZmdF9sLCBtcF9wdHIgVCwgaW50IHNxcikKK3sKKyAgbXBfc2l6ZV90IEssIGksIHBsYSwgbG8sIHNoLCBqOworICBtcF9wdHIgcDsKKyAgbXBfbGltYl90IGNjOworCisgIEsgPSAobXBfc2l6ZV90KSAxIDw8IGs7CisKKyAgLyogZGlyZWN0IGZmdCdzICovCisgIG1wbl9mZnRfZmZ0IChBcCwgSywgZmZ0X2wgKyBrLCAyICogTXAsIG5wcmltZSwgMSwgVCk7CisgIGlmICghc3FyKQorICAgIG1wbl9mZnRfZmZ0IChCcCwgSywgZmZ0X2wgKyBrLCAyICogTXAsIG5wcmltZSwgMSwgVCk7CisKKyAgLyogdGVybSB0byB0ZXJtIG11bHRpcGxpY2F0aW9ucyAqLworICBtcG5fZmZ0X211bF9tb2RGX0sgKEFwLCBzcXIgPyBBcCA6IEJwLCBucHJpbWUsIEspOworCisgIC8qIGludmVyc2UgZmZ0J3MgKi8KKyAgbXBuX2ZmdF9mZnRpbnYgKEFwLCBLLCAyICogTXAsIG5wcmltZSwgVCk7CisKKyAgLyogZGl2aXNpb24gb2YgdGVybXMgYWZ0ZXIgaW52ZXJzZSBmZnQgKi8KKyAgQnBbMF0gPSBUICsgbnByaW1lICsgMTsKKyAgbXBuX2ZmdF9kaXZfMmV4cF9tb2RGIChCcFswXSwgQXBbMF0sIGssIG5wcmltZSk7CisgIGZvciAoaSA9IDE7IGkgPCBLOyBpKyspCisgICAgeworICAgICAgQnBbaV0gPSBBcFtpIC0gMV07CisgICAgICBtcG5fZmZ0X2Rpdl8yZXhwX21vZEYgKEJwW2ldLCBBcFtpXSwgayArIChLIC0gaSkgKiBNcCwgbnByaW1lKTsKKyAgICB9CisKKyAgLyogYWRkaXRpb24gb2YgdGVybXMgaW4gcmVzdWx0IHAgKi8KKyAgTVBOX1pFUk8gKFQsIG5wcmltZSArIDEpOworICBwbGEgPSBsICogKEsgLSAxKSArIG5wcmltZSArIDE7IC8qIG51bWJlciBvZiByZXF1aXJlZCBsaW1icyBmb3IgcCAqLworICBwID0gQjsgLyogQiBoYXMgSyoobicgKyAxKSBsaW1icywgd2hpY2ggaXMgPj0gcGxhLCBpLmUuIGVub3VnaCAqLworICBNUE5fWkVSTyAocCwgcGxhKTsKKyAgY2MgPSAwOyAvKiB3aWxsIGFjY3VtdWxhdGUgdGhlIChzaWduZWQpIGNhcnJ5IGF0IHBbcGxhXSAqLworICBmb3IgKGkgPSBLIC0gMSwgbG8gPSBsICogaSArIG5wcmltZSxzaCA9IGwgKiBpOyBpID49IDA7IGktLSxsbyAtPSBsLHNoIC09IGwpCisgICAgeworICAgICAgbXBfcHRyIG4gPSBwICsgc2g7CisKKyAgICAgIGogPSAoSyAtIGkpICYgKEsgLSAxKTsKKworICAgICAgY2MgKz0gbXBuX2FkZCAobiwgbiwgcGxhIC0gc2gsIEJwW2pdLCBucHJpbWUgKyAxKTsKKyAgICAgIFRbMiAqIGxdID0gaSArIDE7IC8qIFQgPSAoaSArIDEpKjJeKDIqTSkgKi8KKyAgICAgIGlmIChtcG5fY21wIChCcFtqXSwgVCwgbnByaW1lICsgMSkgPiAwKQorCXsgLyogc3VidHJhY3QgMl5OJysxICovCisJICBjYyAtPSBtcG5fc3ViXzEgKG4sIG4sIHBsYSAtIHNoLCBDTlNUX0xJTUIoMSkpOworCSAgY2MgLT0gbXBuX3N1Yl8xIChwICsgbG8sIHAgKyBsbywgcGxhIC0gbG8sIENOU1RfTElNQigxKSk7CisJfQorICAgIH0KKyAgaWYgKGNjID09IC1DTlNUX0xJTUIoMSkpCisgICAgeworICAgICAgaWYgKChjYyA9IG1wbl9hZGRfMSAocCArIHBsYSAtIHBsLCBwICsgcGxhIC0gcGwsIHBsLCBDTlNUX0xJTUIoMSkpKSkKKwl7CisJICAvKiBwW3BsYS1wbF0uLi5wW3BsYS0xXSBhcmUgYWxsIHplcm8gKi8KKwkgIG1wbl9zdWJfMSAocCArIHBsYSAtIHBsIC0gMSwgcCArIHBsYSAtIHBsIC0gMSwgcGwgKyAxLCBDTlNUX0xJTUIoMSkpOworCSAgbXBuX3N1Yl8xIChwICsgcGxhIC0gMSwgcCArIHBsYSAtIDEsIDEsIENOU1RfTElNQigxKSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoY2MgPT0gMSkKKyAgICB7CisgICAgICBpZiAocGxhID49IDIgKiBwbCkKKwl7CisJICB3aGlsZSAoKGNjID0gbXBuX2FkZF8xIChwICsgcGxhIC0gMiAqIHBsLCBwICsgcGxhIC0gMiAqIHBsLCAyICogcGwsIGNjKSkpCisJICAgIDsKKwl9CisgICAgICBlbHNlCisJeworCSAgTVBOX0RFQ1JfVSAocCArIHBsYSAtIHBsLCBwbCwgY2MpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBBU1NFUlQgKGNjID09IDApOworCisgIC8qIGhlcmUgcCA8IDJeKDJNKSBbSyAyXihNKEstMSkpICsgKEstMSkgMl4oTShLLTIpKSArIC4uLiBdCisgICAgIDwgSyAyXigyTSkgWzJeKE0oSy0xKSkgKyAyXihNKEstMikpICsgLi4uIF0KKyAgICAgPCBLIDJeKDJNKSAyXihNKEstMSkpKjIgPSAyXihNKksrTStrKzEpICovCisgIHJldHVybiBtcG5fZmZ0X25vcm1fbW9kRiAob3AsIHBsLCBwLCBwbGEpOworfQorCisvKiByZXR1cm4gdGhlIGxjbSBvZiBhIGFuZCAyXmsgKi8KK3N0YXRpYyBtcF9iaXRjbnRfdAorbXBuX211bF9mZnRfbGNtIChtcF9iaXRjbnRfdCBhLCBpbnQgaykKK3sKKyAgbXBfYml0Y250X3QgbCA9IGs7CisKKyAgd2hpbGUgKGEgJSAyID09IDAgJiYgayA+IDApCisgICAgeworICAgICAgYSA+Pj0gMTsKKyAgICAgIGsgLS07CisgICAgfQorICByZXR1cm4gYSA8PCBsOworfQorCisKK21wX2xpbWJfdAorbXBuX211bF9mZnQgKG1wX3B0ciBvcCwgbXBfc2l6ZV90IHBsLAorCSAgICAgbXBfc3JjcHRyIG4sIG1wX3NpemVfdCBubCwKKwkgICAgIG1wX3NyY3B0ciBtLCBtcF9zaXplX3QgbWwsCisJICAgICBpbnQgaykKK3sKKyAgaW50IGk7CisgIG1wX3NpemVfdCBLLCBtYXhMSzsKKyAgbXBfc2l6ZV90IE4sIE5wcmltZSwgbnByaW1lLCBNLCBNcCwgbDsKKyAgbXBfcHRyICpBcCwgKkJwLCBBLCBULCBCOworICBpbnQgKipmZnRfbCwgKnRtcDsKKyAgaW50IHNxciA9IChuID09IG0gJiYgbmwgPT0gbWwpOworICBtcF9saW1iX3QgaDsKKyAgVE1QX0RFQ0w7CisKKyAgVFJBQ0UgKHByaW50ZiAoIlxubXBuX211bF9mZnQgcGw9JWxkIG5sPSVsZCBtbD0lbGQgaz0lZFxuIiwgcGwsIG5sLCBtbCwgaykpOworICBBU1NFUlRfQUxXQVlTIChtcG5fZmZ0X25leHRfc2l6ZSAocGwsIGspID09IHBsKTsKKworICBUTVBfTUFSSzsKKyAgTiA9IHBsICogR01QX05VTUJfQklUUzsKKyAgZmZ0X2wgPSBUTVBfQkFMTE9DX1RZUEUgKGsgKyAxLCBpbnQgKik7CisgIHRtcCA9IFRNUF9CQUxMT0NfVFlQRSAoKHNpemVfdCkgMiA8PCBrLCBpbnQpOworICBmb3IgKGkgPSAwOyBpIDw9IGs7IGkrKykKKyAgICB7CisgICAgICBmZnRfbFtpXSA9IHRtcDsKKyAgICAgIHRtcCArPSAobXBfc2l6ZV90KSAxIDw8IGk7CisgICAgfQorCisgIG1wbl9mZnRfaW5pdGwgKGZmdF9sLCBrKTsKKyAgSyA9IChtcF9zaXplX3QpIDEgPDwgazsKKyAgTSA9IE4gPj4gazsJLyogTiA9IDJeayBNICovCisgIGwgPSAxICsgKE0gLSAxKSAvIEdNUF9OVU1CX0JJVFM7CisgIG1heExLID0gbXBuX211bF9mZnRfbGNtIChHTVBfTlVNQl9CSVRTLCBrKTsgLyogbGNtIChHTVBfTlVNQl9CSVRTLCAyXmspICovCisKKyAgTnByaW1lID0gKDEgKyAoMiAqIE0gKyBrICsgMikgLyBtYXhMSykgKiBtYXhMSzsKKyAgLyogTnByaW1lID0gY2VpbCgoMipNK2srMykvbWF4TEspKm1heExLOyAqLworICBucHJpbWUgPSBOcHJpbWUgLyBHTVBfTlVNQl9CSVRTOworICBUUkFDRSAocHJpbnRmICgiTj0lbGQgSz0lbGQsIE09JWxkLCBsPSVsZCwgbWF4TEs9JWxkLCBOcD0lbGQsIG5wPSVsZFxuIiwKKwkJIE4sIEssIE0sIGwsIG1heExLLCBOcHJpbWUsIG5wcmltZSkpOworICAvKiB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgcmVjdXJzaXZlbHksIG5wcmltZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBuZXh0IEsgKi8KKyAgaWYgKG5wcmltZSA+PSAoc3FyID8gU1FSX0ZGVF9NT0RGX1RIUkVTSE9MRCA6IE1VTF9GRlRfTU9ERl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBLMjsKKyAgICAgIGZvciAoOzspCisJeworCSAgSzIgPSAobXBfc2l6ZV90KSAxIDw8IG1wbl9mZnRfYmVzdF9rIChucHJpbWUsIHNxcik7CisJICBpZiAoKG5wcmltZSAmIChLMiAtIDEpKSA9PSAwKQorCSAgICBicmVhazsKKwkgIG5wcmltZSA9IChucHJpbWUgKyBLMiAtIDEpICYgLUsyOworCSAgTnByaW1lID0gbnByaW1lICogR01QX0xJTUJfQklUUzsKKwkgIC8qIHdhcm5pbmc6IHNpbmNlIG5wcmltZSBjaGFuZ2VkLCBLMiBtYXkgY2hhbmdlIHRvbyEgKi8KKwl9CisgICAgICBUUkFDRSAocHJpbnRmICgibmV3IG1heExLPSVsZCwgTnA9JWxkLCBucD0lbGRcbiIsIG1heExLLCBOcHJpbWUsIG5wcmltZSkpOworICAgIH0KKyAgQVNTRVJUX0FMV0FZUyAobnByaW1lIDwgcGwpOyAvKiBvdGhlcndpc2Ugd2UnbGwgbG9vcCAqLworCisgIFQgPSBUTVBfQkFMTE9DX0xJTUJTICgyICogKG5wcmltZSArIDEpKTsKKyAgTXAgPSBOcHJpbWUgPj4gazsKKworICBUUkFDRSAocHJpbnRmICgiJWxkeCVsZCBsaW1icyAtPiAlbGQgdGltZXMgJWxkeCVsZCBsaW1icyAoJTEuMmYpXG4iLAorCQlwbCwgcGwsIEssIG5wcmltZSwgbnByaW1lLCAyLjAgKiAoZG91YmxlKSBOIC8gTnByaW1lIC8gSyk7CisJIHByaW50ZiAoIiAgIHRlbXAgc3BhY2UgJWxkXG4iLCAyICogSyAqIChucHJpbWUgKyAxKSkpOworCisgIEEgPSBUTVBfQkFMTE9DX0xJTUJTIChLICogKG5wcmltZSArIDEpKTsKKyAgQXAgPSBUTVBfQkFMTE9DX01QX1BUUlMgKEspOworICBCcCA9IFRNUF9CQUxMT0NfTVBfUFRSUyAoSyk7CisgIG1wbl9tdWxfZmZ0X2RlY29tcG9zZSAoQSwgQXAsIEssIG5wcmltZSwgbiwgbmwsIGwsIE1wLCBUKTsKKyAgaWYgKHNxcikKKyAgICB7CisgICAgICBtcF9zaXplX3QgcGxhOworICAgICAgcGxhID0gbCAqIChLIC0gMSkgKyBucHJpbWUgKyAxOyAvKiBudW1iZXIgb2YgcmVxdWlyZWQgbGltYnMgZm9yIHAgKi8KKyAgICAgIEIgPSBUTVBfQkFMTE9DX0xJTUJTIChwbGEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEIgPSBUTVBfQkFMTE9DX0xJTUJTIChLICogKG5wcmltZSArIDEpKTsKKyAgICAgIG1wbl9tdWxfZmZ0X2RlY29tcG9zZSAoQiwgQnAsIEssIG5wcmltZSwgbSwgbWwsIGwsIE1wLCBUKTsKKyAgICB9CisgIGggPSBtcG5fbXVsX2ZmdF9pbnRlcm5hbCAob3AsIHBsLCBrLCBBcCwgQnAsIEEsIEIsIG5wcmltZSwgbCwgTXAsIGZmdF9sLCBULCBzcXIpOworCisgIFRNUF9GUkVFOworICByZXR1cm4gaDsKK30KKworI2lmIFdBTlRfT0xEX0ZGVF9GVUxMCisvKiBtdWx0aXBseSB7biwgbmx9IGJ5IHttLCBtbH0sIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB7b3AsIG5sK21sfSAqLwordm9pZAorbXBuX211bF9mZnRfZnVsbCAobXBfcHRyIG9wLAorCQkgIG1wX3NyY3B0ciBuLCBtcF9zaXplX3QgbmwsCisJCSAgbXBfc3JjcHRyIG0sIG1wX3NpemVfdCBtbCkKK3sKKyAgbXBfcHRyIHBhZF9vcDsKKyAgbXBfc2l6ZV90IHBsLCBwbDIsIHBsMywgbDsKKyAgbXBfc2l6ZV90IGNjLCBjMiwgb2xkY2M7CisgIGludCBrMiwgazM7CisgIGludCBzcXIgPSAobiA9PSBtICYmIG5sID09IG1sKTsKKworICBwbCA9IG5sICsgbWw7IC8qIHRvdGFsIG51bWJlciBvZiBsaW1icyBvZiB0aGUgcmVzdWx0ICovCisKKyAgLyogcGVyZm9ybSBhIGZmdCBtb2QgMl4oMk4pKzEgYW5kIG9uZSBtb2QgMl4oM04pKzEuCisgICAgIFdlIG11c3QgaGF2ZSBwbDMgPSAzLzIgKiBwbDIsIHdpdGggcGwyIGEgbXVsdGlwbGUgb2YgMl5rMiwgYW5kCisgICAgIHBsMyBhIG11bHRpcGxlIG9mIDJeazMuIFNpbmNlIGszID49IGsyLCBib3RoIGFyZSBtdWx0aXBsZXMgb2YgMl5rMiwKKyAgICAgYW5kIHBsMiBtdXN0IGJlIGFuIGV2ZW4gbXVsdGlwbGUgb2YgMl5rMi4gVGh1cyAocGwyLHBsMykgPQorICAgICAoMipqKjJeazIsMypqKjJeazIpLCB3aGljaCB3b3JrcyBmb3IgMypqIDw9IHBsLzJeazIgPD0gNSpqLgorICAgICBXZSBuZWVkIHRoYXQgY29uc2VjdXRpdmUgaW50ZXJ2YWxzIG92ZXJsYXAsIGkuZS4gNSpqID49IDMqKGorMSksCisgICAgIHdoaWNoIHJlcXVpcmVzIGo+PTIuIFRodXMgdGhpcyBzY2hlbWUgcmVxdWlyZXMgcGwgPj0gNiAqIDJeRkZUX0ZJUlNUX0suICovCisKKyAgLyogIEFTU0VSVF9BTFdBWVMocGwgPj0gNiAqICgxIDw8IEZGVF9GSVJTVF9LKSk7ICovCisKKyAgcGwyID0gKDIgKiBwbCAtIDEpIC8gNTsgLyogY2VpbCAoMnBsLzUpIC0gMSAqLworICBkbworICAgIHsKKyAgICAgIHBsMisrOworICAgICAgazIgPSBtcG5fZmZ0X2Jlc3RfayAocGwyLCBzcXIpOyAvKiBiZXN0IGZmdCBzaXplIGZvciBwbDIgbGltYnMgKi8KKyAgICAgIHBsMiA9IG1wbl9mZnRfbmV4dF9zaXplIChwbDIsIGsyKTsKKyAgICAgIHBsMyA9IDMgKiBwbDIgLyAyOyAvKiBzaW5jZSBrPj1GRlRfRklSU1RfSz00LCBwbDIgaXMgYSBtdWx0aXBsZSBvZiAyXjQsCisJCQkgICAgdGh1cyBwbDIgLyAyIGlzIGV4YWN0ICovCisgICAgICBrMyA9IG1wbl9mZnRfYmVzdF9rIChwbDMsIHNxcik7CisgICAgfQorICB3aGlsZSAobXBuX2ZmdF9uZXh0X3NpemUgKHBsMywgazMpICE9IHBsMyk7CisKKyAgVFJBQ0UgKHByaW50ZiAoIm1wbl9tdWxfZmZ0X2Z1bGwgbmw9JWxkIG1sPSVsZCAtPiBwbDI9JWxkIHBsMz0lbGQgaz0lZFxuIiwKKwkJIG5sLCBtbCwgcGwyLCBwbDMsIGsyKSk7CisKKyAgQVNTRVJUX0FMV0FZUyhwbDMgPD0gcGwpOworICBjYyA9IG1wbl9tdWxfZmZ0IChvcCwgcGwzLCBuLCBubCwgbSwgbWwsIGszKTsgICAgIC8qIG11ICovCisgIEFTU0VSVChjYyA9PSAwKTsKKyAgcGFkX29wID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAocGwyKTsKKyAgY2MgPSBtcG5fbXVsX2ZmdCAocGFkX29wLCBwbDIsIG4sIG5sLCBtLCBtbCwgazIpOyAvKiBsYW1iZGEgKi8KKyAgY2MgPSAtY2MgKyBtcG5fc3ViX24gKHBhZF9vcCwgcGFkX29wLCBvcCwgcGwyKTsgICAgLyogbGFtYmRhIC0gbG93KG11KSAqLworICAvKiAwIDw9IGNjIDw9IDEgKi8KKyAgQVNTRVJUKDAgPD0gY2MgJiYgY2MgPD0gMSk7CisgIGwgPSBwbDMgLSBwbDI7IC8qIGwgPSBwbDIgLyAyIHNpbmNlIHBsMyA9IDMvMiAqIHBsMiAqLworICBjMiA9IG1wbl9hZGRfbiAocGFkX29wLCBwYWRfb3AsIG9wICsgcGwyLCBsKTsKKyAgY2MgPSBtcG5fYWRkXzEgKHBhZF9vcCArIGwsIHBhZF9vcCArIGwsIGwsIChtcF9saW1iX3QpIGMyKSAtIGNjOworICBBU1NFUlQoLTEgPD0gY2MgJiYgY2MgPD0gMSk7CisgIGlmIChjYyA8IDApCisgICAgY2MgPSBtcG5fYWRkXzEgKHBhZF9vcCwgcGFkX29wLCBwbDIsIChtcF9saW1iX3QpIC1jYyk7CisgIEFTU0VSVCgwIDw9IGNjICYmIGNjIDw9IDEpOworICAvKiBub3cgbGFtYmRhLW11ID0ge3BhZF9vcCwgcGwyfSAtIGNjIG1vZCAyXihwbDIqR01QX05VTUJfQklUUykrMSAqLworICBvbGRjYyA9IGNjOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBjMiA9IG1wbl9hZGRfbl9zdWJfbiAocGFkX29wICsgbCwgcGFkX29wLCBwYWRfb3AsIHBhZF9vcCArIGwsIGwpOworICBjYyArPSBjMiA+PiAxOyAvKiBjYXJyeSBvdXQgZnJvbSBoaWdoIDwtIGxvdyArIGhpZ2ggKi8KKyAgYzIgPSBjMiAmIDE7IC8qIGJvcnJvdyBvdXQgZnJvbSBsb3cgPC0gbG93IC0gaGlnaCAqLworI2Vsc2UKKyAgeworICAgIG1wX3B0ciB0bXA7CisgICAgVE1QX0RFQ0w7CisKKyAgICBUTVBfTUFSSzsKKyAgICB0bXAgPSBUTVBfQkFMTE9DX0xJTUJTIChsKTsKKyAgICBNUE5fQ09QWSAodG1wLCBwYWRfb3AsIGwpOworICAgIGMyID0gbXBuX3N1Yl9uIChwYWRfb3AsICAgICAgcGFkX29wLCBwYWRfb3AgKyBsLCBsKTsKKyAgICBjYyArPSBtcG5fYWRkX24gKHBhZF9vcCArIGwsIHRtcCwgICAgcGFkX29wICsgbCwgbCk7CisgICAgVE1QX0ZSRUU7CisgIH0KKyNlbmRpZgorICBjMiArPSBvbGRjYzsKKyAgLyogZmlyc3Qgbm9ybWFsaXplIHtwYWRfb3AsIHBsMn0gYmVmb3JlIGRpdmlkaW5nIGJ5IDI6IGMyIGlzIHRoZSBib3Jyb3cKKyAgICAgYXQgcGFkX29wICsgbCwgY2MgaXMgdGhlIGNhcnJ5IGF0IHBhZF9vcCArIHBsMiAqLworICAvKiAwIDw9IGNjIDw9IDIgKi8KKyAgY2MgLT0gbXBuX3N1Yl8xIChwYWRfb3AgKyBsLCBwYWRfb3AgKyBsLCBsLCAobXBfbGltYl90KSBjMik7CisgIC8qIC0xIDw9IGNjIDw9IDIgKi8KKyAgaWYgKGNjID4gMCkKKyAgICBjYyA9IC1tcG5fc3ViXzEgKHBhZF9vcCwgcGFkX29wLCBwbDIsIChtcF9saW1iX3QpIGNjKTsKKyAgLyogbm93IC0xIDw9IGNjIDw9IDAgKi8KKyAgaWYgKGNjIDwgMCkKKyAgICBjYyA9IG1wbl9hZGRfMSAocGFkX29wLCBwYWRfb3AsIHBsMiwgKG1wX2xpbWJfdCkgLWNjKTsKKyAgLyogbm93IHtwYWRfb3AsIHBsMn0gaXMgbm9ybWFsaXplZCwgd2l0aCAwIDw9IGNjIDw9IDEgKi8KKyAgaWYgKHBhZF9vcFswXSAmIDEpIC8qIGlmIG9kZCwgYWRkIDJeKHBsMipHTVBfTlVNQl9CSVRTKSsxICovCisgICAgY2MgKz0gMSArIG1wbl9hZGRfMSAocGFkX29wLCBwYWRfb3AsIHBsMiwgQ05TVF9MSU1CKDEpKTsKKyAgLyogbm93IDAgPD0gY2MgPD0gMiwgYnV0IGNjPTIgY2Fubm90IG9jY3VyIHNpbmNlIGl0IHdvdWxkIGdpdmUgYSBjYXJyeQorICAgICBvdXQgYmVsb3cgKi8KKyAgbXBuX3JzaGlmdCAocGFkX29wLCBwYWRfb3AsIHBsMiwgMSk7IC8qIGRpdmlkZSBieSB0d28gKi8KKyAgaWYgKGNjKSAvKiB0aGVuIGNjPTEgKi8KKyAgICBwYWRfb3AgW3BsMiAtIDFdIHw9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9OVU1CX0JJVFMgLSAxKTsKKyAgLyogbm93IHtwYWRfb3AscGwyfS1jYyA9IChsYW1iZGEtbXUpLygxLTJeKGwqR01QX05VTUJfQklUUykpCisgICAgIG1vZCAyXihwbDIqR01QX05VTUJfQklUUykgKyAxICovCisgIGMyID0gbXBuX2FkZF9uIChvcCwgb3AsIHBhZF9vcCwgcGwyKTsgLyogbm8gbmVlZCB0byBhZGQgY2MgKGlzIDApICovCisgIC8qIHNpbmNlIHBsMitwbDMgPj0gcGwsIG5lY2Vzc2FyeSB0aGUgZXh0cmEgbGltYnMgKGluY2x1ZGluZyBjYykgYXJlIHplcm8gKi8KKyAgTVBOX0NPUFkgKG9wICsgcGwzLCBwYWRfb3AsIHBsIC0gcGwzKTsKKyAgQVNTRVJUX01QTl9aRVJPX1AgKHBhZF9vcCArIHBsIC0gcGwzLCBwbDIgKyBwbDMgLSBwbCk7CisgIF9fR01QX0ZSRUVfRlVOQ19MSU1CUyAocGFkX29wLCBwbDIpOworICAvKiBzaW5jZSB0aGUgZmluYWwgcmVzdWx0IGhhcyBhdCBtb3N0IHBsIGxpbWJzLCBubyBjYXJyeSBvdXQgYmVsb3cgKi8KKyAgTVBOX0lOQ1JfVSAob3AgKyBwbDIsIHBsIC0gcGwyLCAobXBfbGltYl90KSBjMik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211bF9uLmMgYi9tcG4vZ2VuZXJpYy9tdWxfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmQ5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdWxfbi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIG1wbl9tdWxfbiAtLSBtdWx0aXBseSBuYXR1cmFsIG51bWJlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LTIwMDMsIDIwMDUsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCit2b2lkCittcG5fbXVsX24gKG1wX3B0ciBwLCBtcF9zcmNwdHIgYSwgbXBfc3JjcHRyIGIsIG1wX3NpemVfdCBuKQoreworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChwLCAyICogbiwgYSwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocCwgMiAqIG4sIGIsIG4pKTsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBuX211bF9iYXNlY2FzZSAocCwgYSwgbiwgYiwgbik7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NMzNfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2Ugb2YgZml4ZWQgc2l6ZSBvbiBzdGFjazogZmFzdCEgKi8KKyAgICAgIG1wX2xpbWJfdCB3c1ttcG5fdG9vbTIyX211bF9pdGNoIChNVUxfVE9PTTMzX1RIUkVTSE9MRF9MSU1JVC0xLAorCQkJCQlNVUxfVE9PTTMzX1RIUkVTSE9MRF9MSU1JVC0xKV07CisgICAgICBBU1NFUlQgKE1VTF9UT09NMzNfVEhSRVNIT0xEIDw9IE1VTF9UT09NMzNfVEhSRVNIT0xEX0xJTUlUKTsKKyAgICAgIG1wbl90b29tMjJfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NNDRfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tMzNfbXVsX2l0Y2ggKG4sIG4pKTsKKyAgICAgIG1wbl90b29tMzNfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CisgICAgICBUTVBfU0ZSRUU7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NNkhfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tNDRfbXVsX2l0Y2ggKG4sIG4pKTsKKyAgICAgIG1wbl90b29tNDRfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CisgICAgICBUTVBfU0ZSRUU7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NOEhfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tNl9tdWxfbl9pdGNoIChuKSk7CisgICAgICBtcG5fdG9vbTZoX211bCAocCwgYSwgbiwgYiwgbiwgd3MpOworICAgICAgVE1QX1NGUkVFOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfRkZUX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfcHRyIHdzOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIHdzID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbThfbXVsX25faXRjaCAobikpOworICAgICAgbXBuX3Rvb204aF9tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBjdXJyZW50IEZGVCBjb2RlIGFsbG9jYXRlcyBpdHMgb3duIHNwYWNlLiAgVGhhdCBzaG91bGQgcHJvYmFibHkKKwkgY2hhbmdlLiAgKi8KKyAgICAgIG1wbl9mZnRfbXVsIChwLCBhLCBuLCBiLCBuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdWxsb19iYXNlY2FzZS5jIGIvbXBuL2dlbmVyaWMvbXVsbG9fYmFzZWNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbXVsbG9fYmFzZWNhc2UuYwpAQCAtMCwwICsxLDkwIEBACisvKiBtcG5fbXVsbG9fYmFzZWNhc2UgLS0gSW50ZXJuYWwgcm91dGluZSB0byBtdWx0aXBseSB0d28gbmF0dXJhbAorICAgbnVtYmVycyBvZiBsZW5ndGggbiBhbmQgcmV0dXJuIHRoZSBsb3cgcGFydC4KKworICAgVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRISVMgRlVOQ1RJT04gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuCisKKworQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDA0LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRklYTUU6IFNob3VsZCBvcHRpb25hbGx5IHVzZSBtcG5fbXVsXzIvbXBuX2FkZG11bF8yLiAgKi8KKworI2lmbmRlZiBNVUxMT19WQVJJQU5UCisjZGVmaW5lIE1VTExPX1ZBUklBTlQgMgorI2VuZGlmCisKKworI2lmIE1VTExPX1ZBUklBTlQgPT0gMQordm9pZAorbXBuX211bGxvX2Jhc2VjYXNlIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisKKyAgbXBuX211bF8xIChycCwgdXAsIG4sIHZwWzBdKTsKKworICBmb3IgKGkgPSBuIC0gMTsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICB2cCsrOworICAgICAgcnArKzsKKyAgICAgIG1wbl9hZGRtdWxfMSAocnAsIHVwLCBpLCB2cFswXSk7CisgICAgfQorfQorI2VuZGlmCisKKworI2lmIE1VTExPX1ZBUklBTlQgPT0gMgordm9pZAorbXBuX211bGxvX2Jhc2VjYXNlIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfbGltYl90IGg7CisKKyAgaCA9IHVwWzBdICogdnBbbiAtIDFdOworCisgIGlmIChuICE9IDEpCisgICAgeworICAgICAgbXBfc2l6ZV90IGk7CisgICAgICBtcF9saW1iX3QgdjA7CisKKyAgICAgIHYwID0gKnZwKys7CisgICAgICBoICs9IHVwW24gLSAxXSAqIHYwICsgbXBuX211bF8xIChycCwgdXAsIG4gLSAxLCB2MCk7CisgICAgICBycCsrOworCisgICAgICBmb3IgKGkgPSBuIC0gMjsgaSA+IDA7IGktLSkKKwl7CisJICB2MCA9ICp2cCsrOworCSAgaCArPSB1cFtpXSAqIHYwICsgbXBuX2FkZG11bF8xIChycCwgdXAsIGksIHYwKTsKKwkgIHJwKys7CisJfQorICAgIH0KKworICBycFswXSA9IGg7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211bGxvX24uYyBiL21wbi9nZW5lcmljL211bGxvX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRlN2FlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbXVsbG9fbi5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBtcG5fbXVsbG9fbiAtLSBtdWx0aXBseSB0d28gbi1saW1iIG51bWJlcnMgYW5kIHJldHVybiB0aGUgbG93IG4gbGltYnMKKyAgIG9mIHRoZWlyIHByb2R1Y3RzLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQgYW5kIE1hcmNvIEJvZHJhdG8uCisKKyAgIFRISVMgSVMgKEZPUiBOT1cpIEFOIElOVEVSTkFMIEZVTkNUSU9OLiAgSVQgSVMgT05MWSBTQUZFIFRPIFJFQUNIIFRISVMKKyAgIEZVTkNUSU9OIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUIEdVQVJBTlRFRUQKKyAgIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDQsIDIwMDUsIDIwMDksIDIwMTAsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQgfHwgV0FOVF9GQVRfQklOQVJZCisjZGVmaW5lIE1BWUJFX3JhbmdlX2Jhc2VjYXNlIDEKKyNkZWZpbmUgTUFZQkVfcmFuZ2VfdG9vbTIyICAgMQorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfcmFuZ2VfYmFzZWNhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE1VTExPX0RDX1RIUkVTSE9MRCA9PSAwID8gTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xEIDogTVVMTE9fRENfVEhSRVNIT0xEKSA8IE1VTF9UT09NMjJfVEhSRVNIT0xEKjM2LygzNi0xMSkpCisjZGVmaW5lIE1BWUJFX3JhbmdlX3Rvb20yMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChNVUxMT19EQ19USFJFU0hPTEQgPT0gMCA/IE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCA6IE1VTExPX0RDX1RIUkVTSE9MRCkgPCBNVUxfVE9PTTMzX1RIUkVTSE9MRCozNi8oMzYtMTEpICkKKyNlbmRpZgorCisvKiAgVEhJTks6IFRoZSBEQyBzdHJhdGVneSB1c2VzIGRpZmZlcmVudCBjb25zdGFudHMgaW4gZGlmZmVyZW50IFRvb20ncworCSByYW5nZXMuIFNvbWV0aGluZyBzbW9vdGhlcj8KKyovCisKKy8qCisgIENvbXB1dGUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGhhbGYgb2YgdGhlIHByb2R1Y3Qge3h5LG59Knt5cCxufSwgb3IKKyAgZm9ybWFsbHkge3JwLG59ID0ge3h5LG59Knt5cCxufSBNb2QgKEJebikuCisKKyAgQWJvdmUgdGhlIGdpdmVuIHRocmVzaG9sZCwgdGhlIERpdmlkZSBhbmQgQ29ucXVlciBzdHJhdGVneSBpcyB1c2VkLgorICBUaGUgb3BlcmFuZHMgYXJlIHNwbGl0IGluIHR3bywgYW5kIGEgZnVsbCBwcm9kdWN0IHBsdXMgdHdvIG11bGxvCisgIGFyZSB1c2VkIHRvIG9idGFpbiB0aGUgZmluYWwgcmVzdWx0LiBUaGUgbW9yZSBuYXR1cmFsIHN0cmF0ZWd5IGlzIHRvCisgIHNwbGl0IGluIHR3byBoYWx2ZXMsIGJ1dCB0aGlzIGlzIGZhciBmcm9tIG9wdGltYWwgd2hlbiBhCisgIHN1Yi1xdWFkcmF0aWMgbXVsdGlwbGljYXRpb24gaXMgdXNlZC4KKworICBNdWxkZXJzIHN1Z2dlc3RzIGFuIHVuYmFsYW5jZWQgc3BsaXQgaW4gZmF2b3VyIG9mIHRoZSBmdWxsIHByb2R1Y3QsCisgIHNwbGl0IG4gPSBuMSArIG4yLCB3aGVyZSBhbiA9IG4xIDw9IG4yID0gKDEtYSluOyBpLmUuIDAgPCBhIDw9IDEvMi4KKworICBUbyBjb21wdXRlIHRoZSB2YWx1ZSBvZiBhLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY29zdCBvZiBtdWxsbyBmb3IgYQorICBnaXZlbiBzaXplIE1MKG4pIGlzIGEgZnJhY3Rpb24gb2YgdGhlIGNvc3Qgb2YgYSBmdWxsIHByb2R1Y3Qgd2l0aAorICBzYW1lIHNpemUgTShuKSwgYW5kIHRoZSBjb3N0IE0obik9bl5lIGZvciBzb21lIGV4cG9uZW50IDEgPCBlIDw9IDI7CisgIHRoZW4gd2UgY2FuIHdyaXRlOgorCisgIE1MKG4pID0gMipNTChhbikgKyBNKCgxLWEpbikgPT4gaypNKG4pID0gMiprKk0obikqYV5lICsgTShuKSooMS1hKV5lCisKKyAgR2l2ZW4gYSB2YWx1ZSBmb3IgZSwgd2FudCB0byBtaW5pbWlzZSB0aGUgdmFsdWUgb2YgaywgaS5lLiB0aGUKKyAgZnVuY3Rpb24gaz0oMS1hKV5lLygxLTIqYV5lKS4KKworICBXaXRoIGU9MiwgdGhlIGV4cG9uZW50IGZvciBzY2hvb2xib29rIG11bHRpcGxpY2F0aW9uLCB0aGUgbWluaW11bSBpcworICBnaXZlbiBieSB0aGUgdmFsdWVzIGE9MS1hPTEvMi4KKworICBXaXRoIGU9bG9nKDMpL2xvZygyKSwgdGhlIGV4cG9uZW50IGZvciBLYXJhdHN1YmEgKGFrYSB0b29tMjIpLAorICBNdWxkZXJzIGNvbXB1dGUgKDEtYSkgPSAwLjY5NC4uLiBhbmQgd2UgYXBwcm94aW1hdGUgYSB3aXRoIDExLzM2LgorCisgIE90aGVyIHBvc3NpYmxlIGFwcHJveGltYXRpb25zIGZvbGxvdzoKKyAgZT1sb2coNSkvbG9nKDMpIFtUb29tLTNdIC0+IGEgfj0gOS80MAorICBlPWxvZyg3KS9sb2coNCkgW1Rvb20tNF0gLT4gYSB+PSA3LzM5CisgIGU9bG9nKDExKS9sb2coNikgW1Rvb20tNl0gLT4gYSB+PSAxLzgKKyAgZT1sb2coMTUpL2xvZyg4KSBbVG9vbS04XSAtPiBhIH49IDEvMTAKKworICBUaGUgdmFsdWVzIGFib3ZlIHdoZXJlIG9idGFpbmVkIHdpdGggdGhlIGZvbGxvd2luZyB0cml2aWFsIGNvbW1hbmRzCisgIGluIHRoZSBncC1wYXJpIHNoZWxsOgorCitmdW4oZSxhKT0oMS1hKV5lLygxLTIqYV5lKQorbXVsKGEsYixjKT17bG9jYWwobSx4LHApO2lmKGItYzwxLzEwMDAwLChiK2MpLzIsbT0xO3g9Yjtmb3JzdGVwKHA9YyxiLChiLWMpLzgsaWYoZnVuKGEscCk8bSxtPWZ1bihhLHApO3g9cCkpO211bChhLChiK3gpLzIsKGMreCkvMikpfQorY29udGZyYWNwbnFuKGNvbnRmcmFjKG11bChsb2coMioyLTEpL2xvZygyKSwxLzIsMCksNSkpCitjb250ZnJhY3BucW4oY29udGZyYWMobXVsKGxvZygzKjItMSkvbG9nKDMpLDEvMiwwKSw1KSkKK2NvbnRmcmFjcG5xbihjb250ZnJhYyhtdWwobG9nKDQqMi0xKS9sb2coNCksMS8yLDApLDUpKQorY29udGZyYWNwbnFuKGNvbnRmcmFjKG11bChsb2coNioyLTEpL2xvZyg2KSwxLzIsMCksMykpCitjb250ZnJhY3BucW4oY29udGZyYWMobXVsKGxvZyg4KjItMSkvbG9nKDgpLDEvMiwwKSwzKSkKKworICAsCisgIHxcCisgIHwgXAorICArLS0tLSwKKyAgfCAgICB8CisgIHwgICAgfAorICB8ICAgIHxcCisgIHwgICAgfCBcCisgICstLS0tKy0tYAorICBeIG4yIF5uMV4KKworICBGb3IgYW4gYWN0dWFsIGltcGxlbWVudGF0aW9uLCB0aGUgYXNzdW1wdGlvbiB0aGF0IE0obik9bl5lIGlzCisgIGluY29ycmVjdCwgYXMgYSBjb25zZXF1ZW5jZSBhbHNvIHRoZSBhc3N1bXB0aW9uIHRoYXQgTUwobik9aypNKG4pCisgIHdpdGggYSBjb25zdGFudCBrIGlzIHdyb25nLgorCisgIEJ1dCB0aGVvcnkgc3VnZ2VzdCB1cyB0d28gdGhpbmdzOgorICAtIHRoZSBiZXN0IHRoZSBtdWx0aXBsaWNhdGlvbiBwcm9kdWN0IGlzIChsb3dlciBlKSwgdGhlIG1vcmUgaworICAgIGFwcHJvYWNoZXMgMSwgYW5kIGEgYXBwcm9hY2hlcyAwLgorCisgIC0gQSB2YWx1ZSBmb3IgYSBzbWFsbGVyIHRoYW4gb3B0aW1hbCBpcyBwcm9iYWJseSBsZXNzIGJhZCB0aGFuIGEKKyAgICBiaWdnZXIgb25lOiBlLmcuIGxldCBlPWxvZygzKS9sb2coMiksIGE9MC4zMDU4XyB0aGUgb3B0aW1hbAorICAgIHZhbHVlLCBhbmQgayhhKT0wLjgwOF8gdGhlIG11bC9tdWxsbyBzcGVlZCByYXRpby4gV2UgZ2V0CisgICAgayhhKzEvNik9MC45MjlfIGJ1dCBrKGEtMS82KT0wLjg2NV8uCisqLworCitzdGF0aWMgbXBfc2l6ZV90CittcG5fbXVsbG9fbl9pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIDIqbjsKK30KKworLyoKKyAgICBtcG5fZGNfbXVsbG9fbiByZXF1aXJlcyBhIHNjcmF0Y2ggc3BhY2Ugb2YgMipuIGxpbWJzIGF0IHRwLgorICAgIEl0IGFjY2VwdHMgdHAgPT0gcnAuCisqLworc3RhdGljIHZvaWQKK21wbl9kY19tdWxsb19uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB4cCwgbXBfc3JjcHRyIHlwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHRwKQoreworICBtcF9zaXplX3QgbjIsIG4xOworICBBU1NFUlQgKG4gPj0gMik7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeHAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFMl9QKHJwLCBuLCB0cCwgMipuKSk7CisKKyAgLyogRGl2aWRlLWFuZC1jb25xdWVyICovCisKKyAgLyogV2UgbmVlZCBmcmFjdGlvbmFsIGFwcHJveGltYXRpb24gb2YgdGhlIHZhbHVlIDAgPCBhIDw9IDEvMgorICAgICBnaXZpbmcgdGhlIG1pbmltdW0gaW4gdGhlIGZ1bmN0aW9uIGs9KDEtYSleZS8oMS0yKmFeZSkuCisgICovCisgIGlmIChNQVlCRV9yYW5nZV9iYXNlY2FzZSAmJiBCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NMjJfVEhSRVNIT0xEKjM2LygzNi0xMSkpKQorICAgIG4xID0gbiA+PiAxOworICBlbHNlIGlmIChNQVlCRV9yYW5nZV90b29tMjIgJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTMzX1RIUkVTSE9MRCozNi8oMzYtMTEpKSkKKyAgICBuMSA9IG4gKiAxMSAvIChzaXplX3QpIDM2OwkvKiBuMSB+PSBuKigxLS42OTQuLi4pICovCisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT000NF9USFJFU0hPTEQqNDAvKDQwLTkpKSkKKyAgICBuMSA9IG4gKiA5IC8gKHNpemVfdCkgNDA7CS8qIG4xIH49IG4qKDEtLjc3NS4uLikgKi8KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTThIX1RIUkVTSE9MRCoxMC85KSkKKyAgICBuMSA9IG4gKiA3IC8gKHNpemVfdCkgMzk7CS8qIG4xIH49IG4qKDEtLjgyMS4uLikgKi8KKyAgLyogbjEgPSBuICogNCAvIChzaXplX3QpIDMxOwkvLyBuMSB+PSBuKigxLS44NzEuLi4pIFtUT09NNjZdICovCisgIGVsc2UKKyAgICBuMSA9IG4gLyAoc2l6ZV90KSAxMDsJCS8qIG4xIH49IG4qKDEtLjg5OS4uLikgW1RPT004OF0gKi8KKworICBuMiA9IG4gLSBuMTsKKworICAvKiBTcGxpdCBhcyB4ID0geDEgMl4objIgR01QX05VTUJfQklUUykgKyB4MCwKKwkgICAgICB5ID0geTEgMl4objIgR01QX05VTUJfQklUUykgKyB5MCAqLworCisgIC8qIHgwICogeTAgKi8KKyAgbXBuX211bF9uICh0cCwgeHAsIHlwLCBuMik7CisgIE1QTl9DT1BZIChycCwgdHAsIG4yKTsKKworICAvKiB4MSAqIHkwICogMl4objIgR01QX05VTUJfQklUUykgKi8KKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobjEsIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisgICAgbXBuX211bF9iYXNlY2FzZSAodHAgKyBuLCB4cCArIG4yLCBuMSwgeXAsIG4xKTsKKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuMSwgTVVMTE9fRENfVEhSRVNIT0xEKSkKKyAgICBtcG5fbXVsbG9fYmFzZWNhc2UgKHRwICsgbiwgeHAgKyBuMiwgeXAsIG4xKTsKKyAgZWxzZQorICAgIG1wbl9kY19tdWxsb19uICh0cCArIG4sIHhwICsgbjIsIHlwLCBuMSwgdHAgKyBuKTsKKyAgbXBuX2FkZF9uIChycCArIG4yLCB0cCArIG4yLCB0cCArIG4sIG4xKTsKKworICAvKiB4MCAqIHkxICogMl4objIgR01QX05VTUJfQklUUykgKi8KKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobjEsIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisgICAgbXBuX211bF9iYXNlY2FzZSAodHAgKyBuLCB4cCwgbjEsIHlwICsgbjIsIG4xKTsKKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuMSwgTVVMTE9fRENfVEhSRVNIT0xEKSkKKyAgICBtcG5fbXVsbG9fYmFzZWNhc2UgKHRwICsgbiwgeHAsIHlwICsgbjIsIG4xKTsKKyAgZWxzZQorICAgIG1wbl9kY19tdWxsb19uICh0cCArIG4sIHhwLCB5cCArIG4yLCBuMSwgdHAgKyBuKTsKKyAgbXBuX2FkZF9uIChycCArIG4yLCBycCArIG4yLCB0cCArIG4sIG4xKTsKK30KKworLyogQXZvaWQgemVybyBhbGxvY2F0aW9ucyB3aGVuIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCBpcyAwLiAgKi8KKyNkZWZpbmUgTVVMX0JBU0VDQVNFX0FMTE9DIFwKKyAoTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xEX0xJTUlUID09IDAgPyAxIDogMipNVUxMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQpCisKKy8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgYSB0ZW1wb3JhcnkgYXJlYTsgZGNfbXVsbG93X24KKyAgIGFjY2VwdHMgYSBwb2ludGVyIHRwLCBhbmQgaGFuZGxlIHRoZSBjYXNlIHRwID09IHJwLCBkbyB0aGUgc2FtZSBoZXJlLgorICAgTWF5YmUgcmVjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLgorICAgVEhJTks6IElmIG1wbl9tdWxfYmFzZWNhc2UgaXMgYWx3YXlzIGZhc3RlciB0aGFuIG1wbl9tdWxsb19iYXNlY2FzZQorCSAgKHR5cGljYWxseSB0aGFua3MgdG8gbXBuX2FkZG11bF8yKSBzaG91bGQgd2UgdW5jb25kaXRpb25hbGx5IHVzZQorCSAgbXBuX211bF9uPworKi8KKwordm9pZAorbXBuX211bGxvX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHhwLCBtcF9zcmNwdHIgeXAsIG1wX3NpemVfdCBuKQoreworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeHAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cCwgbikpOworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgd29ya3NwYWNlIG9mIGZpeGVkIHNpemUgb24gc3RhY2s6IGZhc3QhICovCisgICAgICBtcF9saW1iX3QgdHBbTVVMX0JBU0VDQVNFX0FMTE9DXTsKKyAgICAgIG1wbl9tdWxfYmFzZWNhc2UgKHRwLCB4cCwgbiwgeXAsIG4pOworICAgICAgTVBOX0NPUFkgKHJwLCB0cCwgbik7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTExPX0RDX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBuX211bGxvX2Jhc2VjYXNlIChycCwgeHAsIHlwLCBuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgdHA7CisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG1wbl9tdWxsb19uX2l0Y2ggKG4pKTsKKyAgICAgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIE1VTExPX01VTF9OX1RIUkVTSE9MRCkpCisJeworCSAgbXBuX2RjX211bGxvX24gKHJwLCB4cCwgeXAsIG4sIHRwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRm9yIHJlYWxseSBsYXJnZSBvcGVyYW5kcywgdXNlIHBsYWluIG1wbl9tdWxfbiBidXQgdGhyb3cgYXdheSB1cHBlciBuCisJICAgICBsaW1icyBvZiByZXN1bHQuICAqLworI2lmICFUVU5FX1BST0dSQU1fQlVJTEQgJiYgKE1VTExPX01VTF9OX1RIUkVTSE9MRCA+IE1VTF9GRlRfVEhSRVNIT0xEKQorCSAgbXBuX2ZmdF9tdWwgKHRwLCB4cCwgbiwgeXAsIG4pOworI2Vsc2UKKwkgIG1wbl9tdWxfbiAodHAsIHhwLCB5cCwgbik7CisjZW5kaWYKKwkgIE1QTl9DT1BZIChycCwgdHAsIG4pOworCX0KKyAgICAgIFRNUF9GUkVFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211bG1pZC5jIGIvbXBuL2dlbmVyaWMvbXVsbWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1YzVmYgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL211bG1pZC5jCkBAIC0wLDAgKzEsMjU1IEBACisvKiBtcG5fbXVsbWlkIC0tIG1pZGRsZSBwcm9kdWN0CisKKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhhcnZleS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2RlZmluZSBDSFVOSyAoMjAwICsgTVVMTUlEX1RPT000Ml9USFJFU0hPTEQpCisKKwordm9pZAorbXBuX211bG1pZCAobXBfcHRyIHJwLAorICAgICAgICAgICAgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisgICAgICAgICAgICBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibikKK3sKKyAgbXBfc2l6ZV90IHJuLCBrOworICBtcF9wdHIgc2NyYXRjaCwgdGVtcDsKKworICBBU1NFUlQgKGFuID49IGJuKTsKKyAgQVNTRVJUIChibiA+PSAxKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBhbiAtIGJuICsgMywgYXAsIGFuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgYW4gLSBibiArIDMsIGJwLCBibikpOworCisgIGlmIChibiA8IE1VTE1JRF9UT09NNDJfVEhSRVNIT0xEKQorICAgIHsKKyAgICAgIC8qIHJlZ2lvbiBub3QgdGFsbCBlbm91Z2ggdG8gbWFrZSB0b29tNDIgd29ydGh3aGlsZSBmb3IgYW55IHBvcnRpb24gKi8KKworICAgICAgaWYgKGFuIDwgQ0hVTkspCisJeworCSAgLyogcmVnaW9uIG5vdCB0b28gd2lkZSBlaXRoZXIsIGp1c3QgY2FsbCBiYXNlY2FzZSBkaXJlY3RseSAqLworCSAgbXBuX211bG1pZF9iYXNlY2FzZSAocnAsIGFwLCBhbiwgYnAsIGJuKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIFJlZ2lvbiBxdWl0ZSB3aWRlLiBGb3IgYmV0dGVyIGxvY2FsaXR5LCB1c2UgYmFzZWNhc2Ugb24gY2h1bmtzOgorCisJIEFBQUJCQkNDLi4KKwkgLkFBQUJCQkNDLgorCSAuLkFBQUJCQkNDCisgICAgICAqLworCisgICAgICBrID0gQ0hVTksgLSBibiArIDE7ICAgIC8qIG51bWJlciBvZiBkaWFnb25hbHMgcGVyIGNodW5rICovCisKKyAgICAgIC8qIGZpcnN0IGNodW5rIChtYXJrZWQgQSBpbiB0aGUgYWJvdmUgZGlhZ3JhbSkgKi8KKyAgICAgIG1wbl9tdWxtaWRfYmFzZWNhc2UgKHJwLCBhcCwgQ0hVTkssIGJwLCBibik7CisKKyAgICAgIC8qIHJlbWFpbmluZyBjaHVua3MgKEIsIEMsIGV0YykgKi8KKyAgICAgIGFuIC09IGs7CisKKyAgICAgIHdoaWxlIChhbiA+PSBDSFVOSykKKwl7CisJICBtcF9saW1iX3QgdDAsIHQxLCBjeTsKKwkgIGFwICs9IGssIHJwICs9IGs7CisJICB0MCA9IHJwWzBdLCB0MSA9IHJwWzFdOworCSAgbXBuX211bG1pZF9iYXNlY2FzZSAocnAsIGFwLCBDSFVOSywgYnAsIGJuKTsKKwkgIEFERENfTElNQiAoY3ksIHJwWzBdLCBycFswXSwgdDApOyAgICAvKiBhZGQgYmFjayBzYXZlZCBsaW1icyAqLworCSAgTVBOX0lOQ1JfVSAocnAgKyAxLCBrICsgMSwgdDEgKyBjeSk7CisJICBhbiAtPSBrOworCX0KKworICAgICAgaWYgKGFuID49IGJuKQorCXsKKwkgIC8qIGxhc3QgcmVtYWluaW5nIGNodW5rICovCisJICBtcF9saW1iX3QgdDAsIHQxLCBjeTsKKwkgIGFwICs9IGssIHJwICs9IGs7CisJICB0MCA9IHJwWzBdLCB0MSA9IHJwWzFdOworCSAgbXBuX211bG1pZF9iYXNlY2FzZSAocnAsIGFwLCBhbiwgYnAsIGJuKTsKKwkgIEFERENfTElNQiAoY3ksIHJwWzBdLCBycFswXSwgdDApOworCSAgTVBOX0lOQ1JfVSAocnAgKyAxLCBhbiAtIGJuICsgMiwgdDEgKyBjeSk7CisJfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJlZ2lvbiBpcyB0YWxsIGVub3VnaCBmb3IgdG9vbTQyICovCisKKyAgcm4gPSBhbiAtIGJuICsgMTsKKworICBpZiAocm4gPCBNVUxNSURfVE9PTTQyX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICAvKiByZWdpb24gbm90IHdpZGUgZW5vdWdoIHRvIG1ha2UgdG9vbTQyIHdvcnRod2hpbGUgZm9yIGFueSBwb3J0aW9uICovCisKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBpZiAoYm4gPCBDSFVOSykKKwl7CisJICAvKiByZWdpb24gbm90IHRvbyB0YWxsIGVpdGhlciwganVzdCBjYWxsIGJhc2VjYXNlIGRpcmVjdGx5ICovCisJICBtcG5fbXVsbWlkX2Jhc2VjYXNlIChycCwgYXAsIGFuLCBicCwgYm4pOworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogUmVnaW9uIHF1aXRlIHRhbGwuIEZvciBiZXR0ZXIgbG9jYWxpdHksIHVzZSBiYXNlY2FzZSBvbiBjaHVua3M6CisKKwkgQUFBQUEuLi4uCisJIC5BQUFBQS4uLgorCSAuLkJCQkJCLi4KKwkgLi4uQkJCQkIuCisJIC4uLi5DQ0NDQworICAgICAgKi8KKworICAgICAgVE1QX01BUks7CisKKyAgICAgIHRlbXAgPSBUTVBfQUxMT0NfTElNQlMgKHJuICsgMik7CisKKyAgICAgIC8qIGZpcnN0IGNodW5rIChtYXJrZWQgQSBpbiB0aGUgYWJvdmUgZGlhZ3JhbSkgKi8KKyAgICAgIGJwICs9IGJuIC0gQ0hVTkssIGFuIC09IGJuIC0gQ0hVTks7CisgICAgICBtcG5fbXVsbWlkX2Jhc2VjYXNlIChycCwgYXAsIGFuLCBicCwgQ0hVTkspOworCisgICAgICAvKiByZW1haW5pbmcgY2h1bmtzIChCLCBDLCBldGMpICovCisgICAgICBibiAtPSBDSFVOSzsKKworICAgICAgd2hpbGUgKGJuID49IENIVU5LKQorCXsKKwkgIGFwICs9IENIVU5LLCBicCAtPSBDSFVOSzsKKwkgIG1wbl9tdWxtaWRfYmFzZWNhc2UgKHRlbXAsIGFwLCBhbiwgYnAsIENIVU5LKTsKKwkgIG1wbl9hZGRfbiAocnAsIHJwLCB0ZW1wLCBybiArIDIpOworCSAgYm4gLT0gQ0hVTks7CisJfQorCisgICAgICBpZiAoYm4pCisJeworCSAgLyogbGFzdCByZW1haW5pbmcgY2h1bmsgKi8KKwkgIGFwICs9IENIVU5LLCBicCAtPSBibjsKKwkgIG1wbl9tdWxtaWRfYmFzZWNhc2UgKHRlbXAsIGFwLCBybiArIGJuIC0gMSwgYnAsIGJuKTsKKwkgIG1wbl9hZGRfbiAocnAsIHJwLCB0ZW1wLCBybiArIDIpOworCX0KKworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHdlJ3JlIGRlZmluaXRlbHkgZ29pbmcgdG8gdXNlIHRvb200MiBzb21ld2hlcmUgKi8KKworICBpZiAoYm4gPiBybikKKyAgICB7CisgICAgICAvKiBzbGljZSByZWdpb24gaW50byBjaHVua3MsIHVzZSB0b29tNDIgb24gYWxsIGNodW5rcyBleGNlcHQgcG9zc2libHkKKwkgdGhlIGxhc3Q6CisKKyAgICAgICAgIEFBLi4uLgorICAgICAgICAgLkFBLi4uCisgICAgICAgICAuLkJCLi4KKyAgICAgICAgIC4uLkJCLgorICAgICAgICAgLi4uLkNDCisgICAgICAqLworCisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworCisgICAgICB0ZW1wID0gVE1QX0FMTE9DX0xJTUJTIChybiArIDIgKyBtcG5fdG9vbTQyX211bG1pZF9pdGNoIChybikpOworICAgICAgc2NyYXRjaCA9IHRlbXAgKyBybiArIDI7CisKKyAgICAgIC8qIGZpcnN0IGNodW5rIChtYXJrZWQgQSBpbiB0aGUgYWJvdmUgZGlhZ3JhbSkgKi8KKyAgICAgIGJwICs9IGJuIC0gcm47CisgICAgICBtcG5fdG9vbTQyX211bG1pZCAocnAsIGFwLCBicCwgcm4sIHNjcmF0Y2gpOworCisgICAgICAvKiByZW1haW5pbmcgY2h1bmtzIChCLCBDLCBldGMpICovCisgICAgICBibiAtPSBybjsKKworICAgICAgd2hpbGUgKGJuID49IHJuKQorICAgICAgICB7CisgICAgICAgICAgYXAgKz0gcm4sIGJwIC09IHJuOworCSAgbXBuX3Rvb200Ml9tdWxtaWQgKHRlbXAsIGFwLCBicCwgcm4sIHNjcmF0Y2gpOworICAgICAgICAgIG1wbl9hZGRfbiAocnAsIHJwLCB0ZW1wLCBybiArIDIpOworICAgICAgICAgIGJuIC09IHJuOworICAgICAgICB9CisKKyAgICAgIGlmIChibikKKyAgICAgICAgeworICAgICAgICAgIC8qIGxhc3QgcmVtYWluaW5nIGNodW5rICovCisgICAgICAgICAgYXAgKz0gcm4sIGJwIC09IGJuOworCSAgbXBuX211bG1pZCAodGVtcCwgYXAsIHJuICsgYm4gLSAxLCBicCwgYm4pOworICAgICAgICAgIG1wbl9hZGRfbiAocnAsIHJwLCB0ZW1wLCBybiArIDIpOworICAgICAgICB9CisKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHNsaWNlIHJlZ2lvbiBpbnRvIGNodW5rcywgdXNlIHRvb200MiBvbiBhbGwgY2h1bmtzIGV4Y2VwdCBwb3NzaWJseQorCSB0aGUgbGFzdDoKKworICAgICAgICAgQUFBQkJCQ0MuLgorICAgICAgICAgLkFBQUJCQkNDLgorICAgICAgICAgLi5BQUFCQkJDQworICAgICAgKi8KKworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKworICAgICAgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3Rvb200Ml9tdWxtaWRfaXRjaCAoYm4pKTsKKworICAgICAgLyogZmlyc3QgY2h1bmsgKG1hcmtlZCBBIGluIHRoZSBhYm92ZSBkaWFncmFtKSAqLworICAgICAgbXBuX3Rvb200Ml9tdWxtaWQgKHJwLCBhcCwgYnAsIGJuLCBzY3JhdGNoKTsKKworICAgICAgLyogcmVtYWluaW5nIGNodW5rcyAoQiwgQywgZXRjKSAqLworICAgICAgcm4gLT0gYm47CisKKyAgICAgIHdoaWxlIChybiA+PSBibikKKyAgICAgICAgeworCSAgbXBfbGltYl90IHQwLCB0MSwgY3k7CisgICAgICAgICAgYXAgKz0gYm4sIHJwICs9IGJuOworICAgICAgICAgIHQwID0gcnBbMF0sIHQxID0gcnBbMV07CisgICAgICAgICAgbXBuX3Rvb200Ml9tdWxtaWQgKHJwLCBhcCwgYnAsIGJuLCBzY3JhdGNoKTsKKwkgIEFERENfTElNQiAoY3ksIHJwWzBdLCBycFswXSwgdDApOyAgICAgLyogYWRkIGJhY2sgc2F2ZWQgbGltYnMgKi8KKwkgIE1QTl9JTkNSX1UgKHJwICsgMSwgYm4gKyAxLCB0MSArIGN5KTsKKwkgIHJuIC09IGJuOworICAgICAgICB9CisKKyAgICAgIFRNUF9GUkVFOworCisgICAgICBpZiAocm4pCisgICAgICAgIHsKKyAgICAgICAgICAvKiBsYXN0IHJlbWFpbmluZyBjaHVuayAqLworCSAgbXBfbGltYl90IHQwLCB0MSwgY3k7CisgICAgICAgICAgYXAgKz0gYm4sIHJwICs9IGJuOworICAgICAgICAgIHQwID0gcnBbMF0sIHQxID0gcnBbMV07CisgICAgICAgICAgbXBuX211bG1pZCAocnAsIGFwLCBybiArIGJuIC0gMSwgYnAsIGJuKTsKKwkgIEFERENfTElNQiAoY3ksIHJwWzBdLCBycFswXSwgdDApOworCSAgTVBOX0lOQ1JfVSAocnAgKyAxLCBybiArIDEsIHQxICsgY3kpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvbXVsbWlkX2Jhc2VjYXNlLmMgYi9tcG4vZ2VuZXJpYy9tdWxtaWRfYmFzZWNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQzNGVhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbXVsbWlkX2Jhc2VjYXNlLmMKQEAgLTAsMCArMSw4MiBAQAorLyogbXBuX211bG1pZF9iYXNlY2FzZSAtLSBjbGFzc2ljYWwgbWlkZGxlIHByb2R1Y3QgYWxnb3JpdGhtCisKKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhhcnZleS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogTWlkZGxlIHByb2R1Y3Qgb2Yge3VwLHVufSBhbmQge3ZwLHZufSwgd3JpdGUgcmVzdWx0IHRvIHtycCx1bi12biszfS4KKyAgIE11c3QgaGF2ZSB1biA+PSB2biA+PSAxLgorCisgICBOZWl0aGVyIGlucHV0IGJ1ZmZlciBtYXkgb3ZlcmxhcCB3aXRoIHRoZSBvdXRwdXQgYnVmZmVyLiAqLworCit2b2lkCittcG5fbXVsbWlkX2Jhc2VjYXNlIChtcF9wdHIgcnAsCisgICAgICAgICAgICAgICAgICAgICBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwKKyAgICAgICAgICAgICAgICAgICAgIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IHZuKQoreworICBtcF9saW1iX3QgbG8sIGhpOyAgLyogbGFzdCB0d28gbGltYnMgb2Ygb3V0cHV0ICovCisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKHVuID49IHZuKTsKKyAgQVNTRVJUICh2biA+PSAxKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCB1biAtIHZuICsgMywgdXAsIHVuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgdW4gLSB2biArIDMsIHZwLCB2bikpOworCisgIHVwICs9IHZuIC0gMTsKKyAgdW4gLT0gdm4gLSAxOworCisgIC8qIG11bHRpcGx5IGJ5IGZpcnN0IGxpbWIsIHN0b3JlIHJlc3VsdCAqLworICBsbyA9IG1wbl9tdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICBoaSA9IDA7CisKKyAgLyogYWNjdW11bGF0ZSByZW1haW5pbmcgcm93cyAqLworICBmb3IgKHZuLS07IHZuOyB2bi0tKQorICAgIHsKKyAgICAgIHVwLS0sIHZwKys7CisgICAgICBjeSA9IG1wbl9hZGRtdWxfMSAocnAsIHVwLCB1biwgdnBbMF0pOworICAgICAgYWRkX3NzYWFhYSAoaGksIGxvLCBoaSwgbG8sIENOU1RfTElNQigwKSwgY3kpOworICAgIH0KKworICAvKiBzdG9yZSBmaW5hbCBsaW1icyAqLworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorICBoaSA9IChoaSA8PCBHTVBfTkFJTF9CSVRTKSArIChsbyA+PiBHTVBfTlVNQl9CSVRTKTsKKyAgbG8gJj0gR01QX05VTUJfTUFTSzsKKyNlbmRpZgorCisgIHJwW3VuXSA9IGxvOworICBycFt1biArIDFdID0gaGk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdWxtaWRfbi5jIGIvbXBuL2dlbmVyaWMvbXVsbWlkX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzdlOGYxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvbXVsbWlkX24uYwpAQCAtMCwwICsxLDYxIEBACisvKiBtcG5fbXVsbWlkX24gLS0gYmFsYW5jZWQgbWlkZGxlIHByb2R1Y3QKKworICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgSGFydmV5LgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkCittcG5fbXVsbWlkX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBuKQoreworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiArIDIsIGFwLCAyKm4gLSAxKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiArIDIsIGJwLCBuKSk7CisKKyAgaWYgKG4gPCBNVUxNSURfVE9PTTQyX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICBtcG5fbXVsbWlkX2Jhc2VjYXNlIChycCwgYXAsIDIqbiAtIDEsIGJwLCBuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgc2NyYXRjaDsKKyAgICAgIFRNUF9ERUNMOworICAgICAgVE1QX01BUks7CisgICAgICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbTQyX211bG1pZF9pdGNoIChuKSk7CisgICAgICBtcG5fdG9vbTQyX211bG1pZCAocnAsIGFwLCBicCwgbiwgc2NyYXRjaCk7CisgICAgICBUTVBfRlJFRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9tdWxtb2RfYmtucDEuYyBiL21wbi9nZW5lcmljL211bG1vZF9ia25wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjEwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdWxtb2RfYmtucDEuYwpAQCAtMCwwICsxLDUwMiBAQAorLyogTXVscHRpcGxpY2F0aW9uIG1vZCBCXm4rMSwgZm9yIHNtYWxsIG9wZXJhbmRzLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWZuZGVmIE1PRF9CS05QMV9VU0UxMQorI2RlZmluZSBNT0RfQktOUDFfVVNFMTEgKChHTVBfTlVNQl9CSVRTICUgOCAhPSAwKSAmJiAoR01QX05VTUJfQklUUyAlIDIgPT0gMCkpCisjZW5kaWYKKyNpZm5kZWYgTU9EX0JLTlAxX09OTFkzCisjZGVmaW5lIE1PRF9CS05QMV9PTkxZMyAwCisjZW5kaWYKKworLyoge3JwLCAoayAtIDEpICogbn0gPSB7b3AsIGsgKiBuICsgMX0gJSAoQl57aypufSsxKSAvIChCXm4rMSkgKi8KK3N0YXRpYyB2b2lkCitfbXBuX21vZGJrbnAxZGJucDFfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgb3AsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBrKQoreworICBtcF9saW1iX3QgaGw7CisgIG1wX3NyY3B0ciBocDsKKyAgdW5zaWduZWQgaTsKKworI2lmIE1PRF9CS05QMV9PTkxZMworICBBU1NFUlQgKGsgPT0gMyk7CisgIGsgPSAzOworI2VuZGlmCisgIEFTU0VSVCAoayA+IDIpOworICBBU1NFUlQgKGsgJSAyID09IDEpOworCisgIC0tazsKKworICBycCArPSBrICogbjsKKyAgb3AgKz0gayAqIG47CisgIGhwID0gb3A7CisgIGhsID0gaHBbbl07IC8qIGluaXRpYWwgb3BbaypuXS4gKi8KKyAgQVNTRVJUIChobCA8IEdNUF9OVU1CX01BWCAtIDEpOworCisjaWYgTU9EX0JLTlAxX09OTFkzID09IDAKKyAgLyogVGhlIGZpcnN0IE1QTl9JTkNSX1UgKHJwICsgbiwgMSwgY3kpOyBpbiB0aGUgbG9vcCBzaG91bGQgYmUKKyAgICAgcnBbbl0gPSBjeTsJCQkJCQkqLworICAqcnAgPSAwOworI2VuZGlmCisKKyAgaSA9IGsgPj4gMTsKKyAgZG8KKyAgIHsKKyAgICAgbXBfbGltYl90IGN5LCBidzsKKyAgICAgcnAgLT0gbjsKKyAgICAgb3AgLT0gbjsKKyAgICAgY3kgPSBobCArIG1wbl9hZGRfbiAocnAsIG9wLCBocCwgbik7CisjaWYgTU9EX0JLTlAxX09OTFkzCisgICAgIHJwW25dID0gY3k7CisjZWxzZQorICAgICBNUE5fSU5DUl9VIChycCArIG4sIChrIC0gaSAqIDIpICogbiArIDEsIGN5KTsKKyNlbmRpZgorICAgICBycCAtPSBuOworICAgICBvcCAtPSBuOworICAgICBidyA9IGhsICsgbXBuX3N1Yl9uIChycCwgb3AsIGhwLCBuKTsKKyAgICAgTVBOX0RFQ1JfVSAocnAgKyBuLCAoayAtIGkgKiAyICsgMSkgKiBuICsgMSwgYncpOworICAgfQorICB3aGlsZSAoLS1pICE9IDApOworCisgIGZvciAoOyAoaGwgPSAqKHJwICs9IGsgKiBuKSkgIT0gMDsgKSAvKiBTaG91bGQgcnVuIG9ubHkgb25jZS4uLiAqLworICAgIHsKKyAgICAgICpycCA9IDA7CisgICAgICBpID0gayA+PiAxOworICAgICAgZG8KKwl7CisJICBycCAtPSBuOworCSAgTVBOX0lOQ1JfVSAocnAsIChrIC0gaSAqIDIgKyAxKSAqIG4gKyAxLCBobCk7CisJICBycCAtPSBuOworCSAgTVBOX0RFQ1JfVSAocnAsIChrIC0gaSAqIDIgKyAyKSAqIG4gKyAxLCBobCk7CisJfQorICAgICAgd2hpbGUgKC0taSAhPSAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfbXBuX21vZGJucDFfcG5faXAgKG1wX3B0ciByLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGgpCit7CisgIEFTU0VSVCAocltuXSA9PSBoKTsKKworICAvKiBGdWxseSBub3JtYWxpc2UgKi8KKyAgTVBOX0RFQ1JfVSAociwgbiArIDEsIGgpOworICBoIC09IHJbbl07CisgIHJbbl0gPSAwOworICBNUE5fSU5DUl9VIChyLCBuICsgMSwgaCk7Cit9CisKK3N0YXRpYyB2b2lkCitfbXBuX21vZGJucDFfbmVnX2lwIChtcF9wdHIgciwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBoKQoreworICByW25dID0gMDsKKyAgTVBOX0lOQ1JfVSAociwgbiArIDEsIC1oKTsKKyAgaWYgKFVOTElLRUxZIChyW25dICE9IDApKQorICAgIF9tcG5fbW9kYm5wMV9wbl9pcCAociwgbiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitfbXBuX21vZGJucDFfbmNfaXAgKG1wX3B0ciByLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGgpCit7CisgIGlmIChoICYgR01QX05VTUJfSElHSEJJVCkgLyogVGhpcyBtZWFucyBoIDwgMCAqLworICAgIHsKKyAgICAgIF9tcG5fbW9kYm5wMV9uZWdfaXAgKHIsIG4sIGgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJbbl0gPSBoOworICAgICAgaWYgKGgpCisJX21wbl9tb2RibnAxX3BuX2lwKHIsIG4sIGgpOworICAgIH0KK30KKworLyoge3JwLCBybiArIDF9ID0ge29wLCBvbn0gbW9kIChCXntybn0rMSkgKi8KKy8qIFVzZWQgd2hlbiBybiA8IG9uIDwgMipybi4gKi8KK3N0YXRpYyB2b2lkCitfbXBuX21vZGJucDEgKG1wX3B0ciBycCwgbXBfc2l6ZV90IHJuLCBtcF9zcmNwdHIgb3AsIG1wX3NpemVfdCBvbikKK3sKKyAgbXBfbGltYl90IGJ3OworCisjaWYgMAorICBpZiAoVU5MSUtFTFkgKG9uIDw9IHJuKSkKKyAgICB7CisgICAgICBNUE5fQ09QWSAocnAsIG9wLCBvbik7CisgICAgICBNUE5fWkVSTyAocnAgKyBvbiwgcm4gLSBvbik7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgQVNTRVJUIChvbiA+IHJuKTsKKyAgQVNTRVJUIChvbiA8PSAyICogcm4pOworCisgIGJ3ID0gbXBuX3N1YiAocnAsIG9wLCBybiwgb3AgKyBybiwgb24gLSBybik7CisgIHJwW3JuXSA9IDA7CisgIE1QTl9JTkNSX1UgKHJwLCBybiArIDEsIGJ3KTsKK30KKworLyoge3JwLCBybiArIDF9ID0ge29wLCBrICogcm4gKyAxfSAlIChCXntybn0rMSkgKi8KKy8qIFdpdGggb2RkIGsgPj0gMy4gKi8KK3N0YXRpYyB2b2lkCitfbXBuX21vZGJucDFfa24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIG9wLCBtcF9zaXplX3Qgcm4sIHVuc2lnbmVkIGspCit7CisgIG1wX2xpbWJfdCBjeTsKKworI2lmIE1PRF9CS05QMV9PTkxZMworICBBU1NFUlQgKGsgPT0gMyk7CisgIGsgPSAzOworI2VuZGlmCisgIEFTU0VSVCAoayAmIDEpOworICBrID4+PSAxOworICBBU1NFUlQgKDAgPCBrICYmIGsgPCBHTVBfTlVNQl9ISUdIQklUIC0gMyk7CisgIEFTU0VSVCAob3BbKDEgKyAyICogaykgKiBybl0gPCBHTVBfTlVNQl9ISUdIQklUIC0gMiAtIGspOworCisgIGN5ID0gLSBtcG5fc3ViX24gKHJwLCBvcCwgb3AgKyBybiwgcm4pOworICBmb3IgKDs7KSB7CisgICAgb3AgKz0gMiAqIHJuOworICAgIGN5ICs9IG1wbl9hZGRfbiAocnAsIHJwLCBvcCwgcm4pOworICAgIGlmICgtLWsgPT0gMCkKKyAgICAgIGJyZWFrOworICAgIGN5IC09IG1wbl9zdWJfbiAocnAsIHJwLCBvcCArIHJuLCBybik7CisgIH07CisKKyAgY3kgKz0gb3Bbcm5dOworICBfbXBuX21vZGJucDFfbmNfaXAgKHJwLCBybiwgY3kpOworfQorCisvKiBGb3IgdGhlIHZhcmlvdXMgbXBuX2RpdmV4YWN0X2J5TiBoZXJlLCBmYWxsIGJhY2sgdG8gdXNpbmcgZWl0aGVyCisgICBtcG5fcGkxX2JkaXZfcV8xIG9yIG1wbl9kaXZleGFjdF8xLiAgVGhlIGZvcm1lciBoYXMgbGVzcyBvdmVyaGVhZCBhbmQgaXMKKyAgIGZhc3RlciBpZiBpdCBpcyBuYXRpdmUuICBGb3Igbm93LCBzaW5jZSBtcG5fZGl2ZXhhY3RfMSBpcyBuYXRpdmUgb24KKyAgIHBsYXRmb3JtcyB3aGVyZSBtcG5fcGkxX2JkaXZfcV8xIGRvZXMgbm90IHlldCBleGlzdCwgZG8gbm90IHVzZQorICAgbXBuX3BpMV9iZGl2X3FfMSB1bmNvbmRpdGlvbmFsbHkuICBGSVhNRS4gICovCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5NQorI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEKKyNkZWZpbmUgQklOVkVSVF81IFwKKyAgKCgoKEdNUF9OVU1CX01BWCA+PiAoR01QX05VTUJfQklUUyAlIDQpKSAvIDUgKiAzIDw8IDMpICsgNSkgJiBHTVBfTlVNQl9NQVgpCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTUoZHN0LHNyYyxzaXplKSBtcG5fcGkxX2JkaXZfcV8xKGRzdCxzcmMsc2l6ZSw1LEJJTlZFUlRfNSwwKQorI2Vsc2UKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5NShkc3Qsc3JjLHNpemUpIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSw1KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnk3CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBCSU5WRVJUXzcgXAorICAoKCgoR01QX05VTUJfTUFYID4+IChHTVBfTlVNQl9CSVRTICUgMykpIC8gNyAqIDMgPDwgNCkgKyA3KSAmIEdNUF9OVU1CX01BWCkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5Nyhkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDcsQklOVkVSVF83LDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk3KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDcpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIG1wbl9kaXZleGFjdF9ieTExCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBCSU5WRVJUXzExIFwKKyAgKCgoKEdNUF9OVU1CX01BWCA+PiAoR01QX05VTUJfQklUUyAlIDEwKSkgLyAxMSA8PCA1KSArIDMpICYgR01QX05VTUJfTUFYKQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkxMShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDExLEJJTlZFUlRfMTEsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTExKGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDExKQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkxMworI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEKKyNkZWZpbmUgQklOVkVSVF8xMyBcCisgICgoKChHTVBfTlVNQl9NQVggPj4gKEdNUF9OVU1CX0JJVFMgJSAxMikpIC8gMTMgKiAzIDw8IDE0KSArIDM3ODEpICYgR01QX05VTUJfTUFYKQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkxMyhkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDEzLEJJTlZFUlRfMTMsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTEzKGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDEzKQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkxNworI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEKKyNkZWZpbmUgQklOVkVSVF8xNyBcCisgICgoKChHTVBfTlVNQl9NQVggPj4gKEdNUF9OVU1CX0JJVFMgJSA4KSkgLyAxNyAqIDE1IDw8IDcpICsgMTEzKSAmIEdNUF9OVU1CX01BWCkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MTcoZHN0LHNyYyxzaXplKSBtcG5fcGkxX2JkaXZfcV8xKGRzdCxzcmMsc2l6ZSwxNyxCSU5WRVJUXzE3LDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkxNyhkc3Qsc3JjLHNpemUpIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSwxNykKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoYW5rcyB0byBDaGluZXNlIHJlbWFpbmRlciB0aGVvcmVtLCBzdG9yZQorICAgaW4ge3JwLCBrKm4rMX0gdGhlIHZhbHVlIG1vZCAoQl4oaypuKSsxKSwgZ2l2ZW4KKyAgIHthcCwgaypuKzF9IG1vZCAoKEJeKGsqbikrMSkvKEJebisxKSkgYW5kCisgICB7YnAsIG4rMX0gbW9kIChCXm4rMSkgLgorICAge3RwLCBuKzF9IGlzIGEgc2NyYXRjaCBhcmVhLgorICAgdHAgPT0gcnAgb3IgcnAgPT0gYXAgYXJlIHBvc3NpYmxlLgorKi8KK3N0YXRpYyB2b2lkCitfbXBuX2NydCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwKKwkgIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBrLCBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBtb2Q7CisgIHVuc2lnbmVkIGk7CisKKyNpZiBNT0RfQktOUDFfT05MWTMKKyAgQVNTRVJUIChrID09IDMpOworICBrID0gMzsKKyNlbmRpZgorICBfbXBuX21vZGJucDFfa24gKHRwLCBhcCwgbiwgayk7CisgIGlmIChtcG5fc3ViX24gKHRwLCBicCwgdHAsIG4gKyAxKSkKKyAgICBfbXBuX21vZGJucDFfbmVnX2lwICh0cCwgbiwgdHBbbl0pOworCisjaWYgTU9EX0JLTlAxX1VTRTExCisgIGlmIChVTkxJS0VMWSAoayA9PSAxMSkpCisgICAgeworICAgICAgQVNTRVJUIChHTVBfTlVNQl9CSVRTICUgMiA9PSAwKTsKKyAgICAgIC8qIG1vZCA8LSAtTW9kKEJebisxLDExKV4tMSAqLworICAgICAgbW9kID0gbiAqIChHTVBfTlVNQl9CSVRTICUgNSkgJSA1OworICAgICAgaWYgKChtb2QgPiAyKSB8fCBVTkxJS0VMWSAobW9kID09IDApKQorCW1vZCArPSA1OworCisgICAgICBtb2QgKj0gbXBuX21vZF8xICh0cCwgbiArIDEsIDExKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyNpZiBHTVBfTlVNQl9CSVRTICUgOCA9PSAwCisgIC8qICgyXjYgLSAxKSB8ICgyXntHTVBfTlVNQl9CSVRTKjMvNH0gLSAxKQkqLworICAvKiAoMl42IC0gMSkgPSAzXjIgKiA3CQkJKi8KKyAgbW9kID0gbXBuX21vZF8zNGxzdWIxICh0cCwgbiArIDEpOworICBBU1NFUlQgKChHTVBfTlVNQl9NQVggPj4gKEdNUF9OVU1CX0JJVFMgPj4gMikpICUgayA9PSAwKTsKKyAgLyogKDJeMTIgLSAxKSA9IDNeMiAqIDUgKiA3ICogMTMJCSovCisgIC8qICgyXjI0IC0gMSkgPSAzXjIgKiA1ICogNyAqIDEzICogMTcgKiAyNDEJKi8KKyAgQVNTRVJUIChrID09IDMgfHwgayA9PSA1IHx8IGsgPT0gNyB8fCBrID09IDEzIHx8IGsgPT0gMTcpOworCisjaWYgR01QX05VTUJfQklUUyAlIDMgIT0gMAorICBpZiAoVU5MSUtFTFkgKGsgIT0gMykpCisgICAgeworICAgICAgQVNTRVJUICgoR01QX05VTUJfTUFYICUgayA9PSAwKSB8fCAobiAlIDMgIT0gMCkpOworICAgICAgaWYgKChHTVBfTlVNQl9CSVRTICUgMTYgPT0gMCkgJiYgTElLRUxZIChrID09IDUpKQorCW1vZCA8PD0gMTsgLyogayA+PiAxID0gMSA8PCAxICovCisgICAgICBlbHNlIGlmICgoR01QX05VTUJfQklUUyAlIDE2ICE9IDApIHx8IExJS0VMWSAoayA9PSA3KSkKKwltb2QgPDw9IChuIDw8IChHTVBfTlVNQl9CSVRTICUgMyA+PiAxKSkgJSAzOworICAgICAgZWxzZSBpZiAoKEdNUF9OVU1CX0JJVFMgJSAzMiAhPSAwKSB8fCBMSUtFTFkgKGsgPT0gMTMpKQorCW1vZCAqPSAoKG4gPDwgKEdNUF9OVU1CX0JJVFMgJSAzID4+IDEpKSAlIDMgPT0gMSkgPyAzIDogOTsKKyAgICAgIGVsc2UgLyogayA9PSAxNyAqLworCW1vZCA8PD0gMzsgLyogayA+PiAxID0gMSA8PCAzICovCisjaWYgMAorICAgICAgaWYgKChHTVBfTlVNQl9CSVRTID09IDgpIC8qICYmIChrID09IDcpICovIHx8CisJICAoR01QX05VTUJfQklUUyA9PSAxNikgJiYgKGsgPT0gMTMpKQorCW1vZCA9ICgobW9kICYgKEdNUF9OVU1CX01BWCA+PiAoR01QX05VTUJfQklUUyA+PiAyKSkpICsKKwkgICAgICAgKG1vZCA+PiAoMyAqIEdNUF9OVU1CX0JJVFMgPj4gMikpKTsKKyNlbmRpZgorICAgIH0KKyNlbHNlCisgIEFTU0VSVCAoR01QX05VTUJfTUFYICUgayA9PSAwKTsKKyAgLyogMl57R01QX05VTUJfQklUU30gLSAxCT0gMCAobW9kIGspICovCisgIC8qIDJee0dNUF9OVU1CX0JJVFN9CQk9IDEgKG1vZCBrKSAqLworICAvKiAyXntuKkdNUF9OVU1CX0JJVFN9ICsgMQk9IDIgKG1vZCBrKSAqLworICAvKiAtMl57LTF9CT0gayA+PiAxIChtb2QgaykgKi8KKyAgbW9kICo9IGsgPj4gMTsKKyNlbmRpZgorI2Vsc2UKKyAgQVNTRVJUX0FMV0FZUyAoayA9PSAwKTsgLyogTm90IGltcGxlbWVudGVkLCBzaG91bGQgbm90IGJlIHVzZWQuICovCisjZW5kaWYKKyAgICB9CisKKyAgTVBOX0lOQ1JfVSAodHAsIG4gKyAxLCBtb2QpOworICB0cFtuXSArPSBtb2Q7CisKKyAgaWYgKExJS0VMWSAoayA9PSAzKSkKKyAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2RpdmV4YWN0X2J5MyAodHAsIHRwLCBuICsgMSkpOworICBlbHNlIGlmICgoR01QX05VTUJfQklUUyAlIDE2ID09IDApICYmIExJS0VMWSAoayA9PSA1KSkKKyAgICBtcG5fZGl2ZXhhY3RfYnk1ICh0cCwgdHAsIG4gKyAxKTsKKyAgZWxzZSBpZiAoKCghIE1PRF9CS05QMV9VU0UxMSkgJiYgKEdNUF9OVU1CX0JJVFMgJSAxNiAhPSAwKSkKKwkgICB8fCBMSUtFTFkgKGsgPT0gNykpCisgICAgbXBuX2RpdmV4YWN0X2J5NyAodHAsIHRwLCBuICsgMSk7CisjaWYgTU9EX0JLTlAxX1VTRTExCisgIGVsc2UgaWYgKGsgPT0gMTEpCisgICAgbXBuX2RpdmV4YWN0X2J5MTEgKHRwLCB0cCwgbiArIDEpOworI2VuZGlmCisgIGVsc2UgaWYgKChHTVBfTlVNQl9CSVRTICUgMzIgIT0gMCkgfHwgTElLRUxZIChrID09IDEzKSkKKyAgICBtcG5fZGl2ZXhhY3RfYnkxMyAodHAsIHRwLCBuICsgMSk7CisgIGVsc2UgLyogKGsgPT0gMTcpICovCisgICAgbXBuX2RpdmV4YWN0X2J5MTcgKHRwLCB0cCwgbiArIDEpOworCisgIHJwICs9IGsgKiBuOworICBhcCArPSBrICogbjsgLyogdHAgLSAxICovCisKKyAgcnAgLT0gbjsKKyAgYXAgLT0gbjsKKyAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGRfbiAocnAsIGFwLCB0cCwgbiArIDEpKTsKKworICBpID0gayA+PiAxOworICBkbworICAgeworICAgICAgbXBfbGltYl90IGN5LCBidzsKKyAgICAgIHJwIC09IG47CisgICAgICBhcCAtPSBuOworICAgICAgYncgPSBtcG5fc3ViX24gKHJwLCBhcCwgdHAsIG4pICsgdHBbbl07CisgICAgICBNUE5fREVDUl9VIChycCArIG4sIChrIC0gaSAqIDIpICogbiArIDEsIGJ3KTsKKyAgICAgIHJwIC09IG47CisgICAgICBhcCAtPSBuOworICAgICAgY3kgPSBtcG5fYWRkX24gKHJwLCBhcCwgdHAsIG4pICsgdHBbbl07CisgICAgICBNUE5fSU5DUl9VIChycCArIG4sIChrIC0gaSAqIDIgKyAxKSAqIG4gKyAxLCBjeSk7CisgICAgfQorICB3aGlsZSAoLS1pICE9IDApOworCisgIC8qIGlmIChMSUtFTFkgKHJwW2sgKiBuXSkpICovCisgICAgX21wbl9tb2RibnAxX3BuX2lwIChycCwgayAqIG4sIHJwW2sgKiBuXSk7Cit9CisKKworc3RhdGljIHZvaWQKK19tcG5fbXVsbW9kX2JucDFfdHAgKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBybiwKKwkJICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfbGltYl90IGN5OworICB1bnNpZ25lZCBrOworCisgIEFTU0VSVCAoMCA8IHJuKTsKKyAgQVNTRVJUICgoYXBbcm5dIHwgYnBbcm5dKSA8PSAxKTsKKworICBpZiAoVU5MSUtFTFkgKGFwW3JuXSB8IGJwW3JuXSkpCisgICAgeworICAgICAgaWYgKGFwW3JuXSkKKwljeSA9IGJwW3JuXSArIG1wbl9uZWcgKHJwLCBicCwgcm4pOworICAgICAgZWxzZSAvKiBhcFtybl0gPT0gMCAqLworCWN5ID0gbXBuX25lZyAocnAsIGFwLCBybik7CisgICAgfQorICBlbHNlIGlmIChNUE5fTVVMTU9EX0JLTlAxX1VTQUJMRShybiwgaywgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCAvIDMpKQorICAgIHsKKyAgICAgIHJuIC89IGs7CisgICAgICBtcG5fbXVsbW9kX2JrbnAxIChycCwgYXAsIGJwLCBybiwgaywgdHApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9tdWxfbiAodHAsIGFwLCBicCwgcm4pOworICAgICAgY3kgPSBtcG5fc3ViX24gKHJwLCB0cCwgdHAgKyBybiwgcm4pOworICAgIH0KKyAgcnBbcm5dID0gMDsKKyAgTVBOX0lOQ1JfVSAocnAsIHJuICsgMSwgY3kpOworfQorCisvKiB7cnAsIGtuICsgMX0gPSB7YXAsIGtuICsgMX0gKiB7YnAsIGtuICsgMX0gJSAoQl5rbiArIDEpICovCisvKiB0cCBtdXN0IHBvaW50IHRvIGF0IGxlYXN0IDQqKGstMSkqbisxIGxpbWJzKi8KK3ZvaWQKK21wbl9tdWxtb2RfYmtucDEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsCisJCSAgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGssIG1wX3B0ciB0cCkKK3sKKyAgbXBfcHRyIGhwOworCisjaWYgTU9EX0JLTlAxX09OTFkzCisgIEFTU0VSVCAoayA9PSAzKTsKKyAgayA9IDM7CisjZW5kaWYKKyAgQVNTRVJUIChrID4gMik7CisgIEFTU0VSVCAoayAlIDIgPT0gMSk7CisKKyAgLyogYSAlIChCXntubn0rMSkvKEJee25uL2t9KzEpICovCisgIF9tcG5fbW9kYmtucDFkYm5wMV9uICh0cCArIChrIC0gMSkgKiBuICogMiwgYXAsIG4sIGspOworICAvKiBiICUgKEJee25ufSsxKS8oQl57bm4va30rMSkgKi8KKyAgX21wbl9tb2Ria25wMWRibnAxX24gKHRwICsgKGsgLSAxKSAqIG4gKiAzLCBicCwgbiwgayk7CisgIG1wbl9tdWxfbiAodHAsIHRwICsgKGsgLSAxKSAqIG4gKiAyLCB0cCArIChrIC0gMSkgKiBuICogMywgKGsgLSAxKSAqIG4pOworICBfbXBuX21vZGJucDEgKHRwLCBrICogbiwgdHAsIChrIC0gMSkgKiBuICogMik7CisKKyAgaHAgPSB0cCArIGsgKiBuICsgMTsKKyAgLyogYSAlIChCXntubi9rfSsxKSAqLworICBBU1NFUlQgKGFwW2sgKiBuXSA8PSAxKTsKKyAgX21wbl9tb2RibnAxX2tuIChocCwgYXAsIG4sIGspOworICAvKiBiICUgKEJee25uL2t9KzEpICovCisgIEFTU0VSVCAoYnBbayAqIG5dIDw9IDEpOworICBfbXBuX21vZGJucDFfa24gKGhwICsgbiArIDEsIGJwLCBuLCBrKTsKKyAgX21wbl9tdWxtb2RfYm5wMV90cCAoaHAgKyAobiArIDEpICogMiwgaHAsIGhwICsgbiArIDEsIG4sIGhwICsgKG4gKyAxKSAqIDIpOworCisgIF9tcG5fY3J0IChycCwgdHAsIGhwICsgKG4gKyAxKSAqIDIsIG4sIGssIGhwKTsKK30KKworCitzdGF0aWMgdm9pZAorX21wbl9zcXJtb2RfYm5wMV90cCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBybiwKKwkJICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfbGltYl90IGN5OworICB1bnNpZ25lZCBrOworCisgIEFTU0VSVCAoMCA8IHJuKTsKKworICBpZiAoVU5MSUtFTFkgKGFwW3JuXSkpCisgICAgeworICAgICAgQVNTRVJUIChhcFtybl0gPT0gMSk7CisgICAgICAqcnAgPSAxOworICAgICAgTVBOX0ZJTEwgKHJwICsgMSwgcm4sIDApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoTVBOX1NRUk1PRF9CS05QMV9VU0FCTEUocm4sIGssIE1VTF9GRlRfTU9ERl9USFJFU0hPTEQgLyAzKSkKKyAgICB7CisgICAgICBybiAvPSBrOworICAgICAgbXBuX3Nxcm1vZF9ia25wMSAocnAsIGFwLCBybiwgaywgdHApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9zcXIgKHRwLCBhcCwgcm4pOworICAgICAgY3kgPSBtcG5fc3ViX24gKHJwLCB0cCwgdHAgKyBybiwgcm4pOworICAgIH0KKyAgcnBbcm5dID0gMDsKKyAgTVBOX0lOQ1JfVSAocnAsIHJuICsgMSwgY3kpOworfQorCisvKiB7cnAsIGtuICsgMX0gPSB7YXAsIGtuICsgMX1eMiAlIChCXmtuICsgMSkgKi8KKy8qIHRwIG11c3QgcG9pbnQgdG8gYXQgbGVhc3QgMyooay0xKSpuKzEgbGltYnMqLwordm9pZAorbXBuX3Nxcm1vZF9ia25wMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsCisJCSAgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGssIG1wX3B0ciB0cCkKK3sKKyAgbXBfcHRyIGhwOworCisjaWYgTU9EX0JLTlAxX09OTFkzCisgIEFTU0VSVCAoayA9PSAzKTsKKyAgayA9IDM7CisjZW5kaWYKKyAgQVNTRVJUIChrID4gMik7CisgIEFTU0VSVCAoayAlIDIgPT0gMSk7CisKKyAgLyogYSAlIChCXntubn0rMSkvKEJee25uL2t9KzEpICovCisgIF9tcG5fbW9kYmtucDFkYm5wMV9uICh0cCArIChrIC0gMSkgKiBuICogMiwgYXAsIG4sIGspOworICBtcG5fc3FyICh0cCwgdHAgKyAoayAtIDEpICogbiAqIDIsIChrIC0gMSkgKiBuKTsKKyAgX21wbl9tb2RibnAxICh0cCwgayAqIG4sIHRwLCAoayAtIDEpICogbiAqIDIpOworCisgIGhwID0gdHAgKyBrICogbiArIDE7CisgIC8qIGEgJSAoQl57bm4va30rMSkgKi8KKyAgQVNTRVJUIChhcFtrICogbl0gPD0gMSk7CisgIF9tcG5fbW9kYm5wMV9rbiAoaHAsIGFwLCBuLCBrKTsKKyAgX21wbl9zcXJtb2RfYm5wMV90cCAoaHAgKyAobiArIDEpLCBocCwgbiwgaHAgKyAobiArIDEpKTsKKworICBfbXBuX2NydCAocnAsIHRwLCBocCArIChuICsgMSksIG4sIGssIGhwKTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL211bG1vZF9ibm0xLmMgYi9tcG4vZ2VuZXJpYy9tdWxtb2RfYm5tMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjllZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9tdWxtb2RfYm5tMS5jCkBAIC0wLDAgKzEsMzc0IEBACisvKiBtdWxtb2RfYm5tMS5jIC0tIG11bHRpcGxpY2F0aW9uIG1vZCBCXm4tMS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIsIFRvcmJqb3JuIEdyYW5sdW5kIGFuZAorICAgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyLCAyMDEzLCAyMDIwLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIElucHV0cyBhcmUge2FwLHJufSBhbmQge2JwLHJufTsgb3V0cHV0IGlzIHtycCxybn0sIGNvbXB1dGF0aW9uIGlzCisgICBtb2QgQl5ybiAtIDEsIGFuZCB2YWx1ZXMgYXJlIHNlbWktbm9ybWFsaXNlZDsgemVybyBpcyByZXByZXNlbnRlZAorICAgYXMgZWl0aGVyIDAgb3IgQl5uIC0gMS4gIE5lZWRzIGEgc2NyYXRjaCBvZiAycm4gbGltYnMgYXQgdHAuCisgICB0cD09cnAgaXMgYWxsb3dlZC4gKi8KK3ZvaWQKK21wbl9iY19tdWxtb2RfYm5tMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IHJuLAorCQkgICAgbXBfcHRyIHRwKQoreworICBtcF9saW1iX3QgY3k7CisKKyAgQVNTRVJUICgwIDwgcm4pOworCisgIG1wbl9tdWxfbiAodHAsIGFwLCBicCwgcm4pOworICBjeSA9IG1wbl9hZGRfbiAocnAsIHRwLCB0cCArIHJuLCBybik7CisgIC8qIElmIGN5ID09IDEsIHRoZW4gdGhlIHZhbHVlIG9mIHJwIGlzIGF0IG1vc3QgQl5ybiAtIDIsIHNvIHRoZXJlIGNhbgorICAgKiBiZSBubyBvdmVyZmxvdyB3aGVuIGFkZGluZyBpbiB0aGUgY2FycnkuICovCisgIE1QTl9JTkNSX1UgKHJwLCBybiwgY3kpOworfQorCisKKy8qIElucHV0cyBhcmUge2FwLHJuKzF9IGFuZCB7YnAscm4rMX07IG91dHB1dCBpcyB7cnAscm4rMX0sIGluCisgICBub3JtYWxpc2VkIHJlcHJlc2VudGF0aW9uLCBjb21wdXRhdGlvbiBpcyBtb2QgQl5ybiArIDEuIE5lZWRzCisgICBhIHNjcmF0Y2ggYXJlYSBvZiAycm4gbGltYnMgYXQgdHA7IHRwID09IHJwIGlzIGFsbG93ZWQuCisgICBPdXRwdXQgaXMgbm9ybWFsaXNlZC4gKi8KK3N0YXRpYyB2b2lkCittcG5fYmNfbXVsbW9kX2JucDEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBybiwKKwkJICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfbGltYl90IGN5OworICB1bnNpZ25lZCBrOworCisgIEFTU0VSVCAoMCA8IHJuKTsKKworICBpZiAoVU5MSUtFTFkgKGFwW3JuXSB8IGJwIFtybl0pKQorICAgIHsKKyAgICAgIGlmIChhcFtybl0pCisJY3kgPSBicCBbcm5dICsgbXBuX25lZyAocnAsIGJwLCBybik7CisgICAgICBlbHNlIC8qIGFwW3JuXSA9PSAwICovCisJY3kgPSBtcG5fbmVnIChycCwgYXAsIHJuKTsKKyAgICB9CisgIGVsc2UgaWYgKE1QTl9NVUxNT0RfQktOUDFfVVNBQkxFIChybiwgaywgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfc2l6ZV90IG5fayA9IHJuIC8gazsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBUTVBfTUFSSzsKKyAgICAgIG1wbl9tdWxtb2RfYmtucDEgKHJwLCBhcCwgYnAsIG5faywgaywKKyAgICAgICAgICAgICAgICAgICAgICAgVE1QX0FMTE9DX0xJTUJTIChtcG5fbXVsbW9kX2JrbnAxX2l0Y2ggKHJuKSkpOworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX211bF9uICh0cCwgYXAsIGJwLCBybik7CisgICAgICBjeSA9IG1wbl9zdWJfbiAocnAsIHRwLCB0cCArIHJuLCBybik7CisgICAgfQorICBycFtybl0gPSAwOworICBNUE5fSU5DUl9VIChycCwgcm4gKyAxLCBjeSk7Cit9CisKKworLyogQ29tcHV0ZXMge3JwLE1JTihybixhbitibil9IDwtIHthcCxhbn0qe2JwLGJufSBNb2QoQl5ybi0xKQorICoKKyAqIFRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgWkVSTyBpZiBhbmQgb25seSBpZiBvbmUgb2YgdGhlIG9wZXJhbmQKKyAqIGFscmVhZHkgaXMuIE90aGVyd2lzZSB0aGUgY2xhc3MgWzBdIE1vZChCXnJuLTEpIGlzIHJlcHJlc2VudGVkIGJ5CisgKiBCXnJuLTEuIFRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gaWYgbXVsbW9kX2JubTEgaXMgdXNlZCB0bworICogY29tYmluZSByZXN1bHRzIGFuZCBvYnRhaW4gYSBuYXR1cmFsIG51bWJlciB3aGVuIG9uZSBrbm93cyBpbgorICogYWR2YW5jZSB0aGF0IHRoZSBmaW5hbCB2YWx1ZSBpcyBsZXNzIHRoYW4gKEJecm4tMSkuCisgKiBNb3Jlb3ZlciBpdCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpZiBtdWxtb2RfYm5tMSBpcyB1c2VkIHRvCisgKiBjb21wdXRlIHRoZSBmdWxsIHByb2R1Y3Qgd2l0aCBhbitibiA8PSBybiwgYmVjYXVzZSB0aGlzIGNvbmRpdGlvbgorICogaW1wbGllcyAoQl5hbi0xKShCXmJuLTEpIDwgKEJecm4tMSkgLgorICoKKyAqIFJlcXVpcmVzIDAgPCBibiA8PSBhbiA8PSBybiBhbmQgYW4gKyBibiA+IHJuLzIKKyAqIFNjcmF0Y2ggbmVlZDogcm4gKyAobmVlZCBmb3IgcmVjdXJzaXZlIGNhbGwgT1Igcm4gKyA0KS4gVGhpcyBnaXZlcworICoKKyAqIFMobikgPD0gcm4gKyBNQVggKHJuICsgNCwgUyhuLzIpKSA8PSAycm4gKyA0CisgKi8KK3ZvaWQKK21wbl9tdWxtb2RfYm5tMSAobXBfcHRyIHJwLCBtcF9zaXplX3Qgcm4sIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwgbXBfcHRyIHRwKQoreworICBBU1NFUlQgKDAgPCBibik7CisgIEFTU0VSVCAoYm4gPD0gYW4pOworICBBU1NFUlQgKGFuIDw9IHJuKTsKKworICBpZiAoKHJuICYgMSkgIT0gMCB8fCBCRUxPV19USFJFU0hPTEQgKHJuLCBNVUxNT0RfQk5NMV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAoYm4gPCBybikpCisJeworCSAgaWYgKFVOTElLRUxZIChhbiArIGJuIDw9IHJuKSkKKwkgICAgeworCSAgICAgIG1wbl9tdWwgKHJwLCBhcCwgYW4sIGJwLCBibik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdCBjeTsKKwkgICAgICBtcG5fbXVsICh0cCwgYXAsIGFuLCBicCwgYm4pOworCSAgICAgIGN5ID0gbXBuX2FkZCAocnAsIHRwLCBybiwgdHAgKyBybiwgYW4gKyBibiAtIHJuKTsKKwkgICAgICBNUE5fSU5DUl9VIChycCwgcm4sIGN5KTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwltcG5fYmNfbXVsbW9kX2JubTEgKHJwLCBhcCwgYnAsIHJuLCB0cCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfc2l6ZV90IG47CisgICAgICBtcF9saW1iX3QgY3k7CisgICAgICBtcF9saW1iX3QgaGk7CisKKyAgICAgIG4gPSBybiA+PiAxOworCisgICAgICAvKiBXZSBuZWVkIGF0IGxlYXN0IGFuICsgYm4gPj0gbiwgdG8gYmUgYWJsZSB0byBmaXQgb25lIG9mIHRoZQorCSByZWN1cnNpdmUgcHJvZHVjdHMgYXQgcnAuIFJlcXVpcmluZyBzdHJpY3QgaW5lcXVhbGl0eSBtYWtlcworCSB0aGUgY29kZSBzbGlnaHRseSBzaW1wbGVyLiBJZiBkZXNpcmVkLCB3ZSBjb3VsZCBhdm9pZCB0aGlzCisJIHJlc3RyaWN0aW9uIGJ5IGluaXRpYWxseSBoYWx2aW5nIHJuIGFzIGxvbmcgYXMgcm4gaXMgZXZlbiBhbmQKKwkgYW4gKyBibiA8PSBybi8yLiAqLworCisgICAgICBBU1NFUlQgKGFuICsgYm4gPiBuKTsKKworICAgICAgLyogQ29tcHV0ZSB4bSA9IGEqYiBtb2QgKEJebiAtIDEpLCB4cCA9IGEqYiBtb2QgKEJebiArIDEpCisJIGFuZCBjcnQgdG9nZXRoZXIgYXMKKworCSB4ID0gLXhwICogQl5uICsgKEJebiArIDEpICogWyAoeHAgKyB4bSkvMiBtb2QgKEJebi0xKV0KKyAgICAgICovCisKKyNkZWZpbmUgYTAgYXAKKyNkZWZpbmUgYTEgKGFwICsgbikKKyNkZWZpbmUgYjAgYnAKKyNkZWZpbmUgYjEgKGJwICsgbikKKworI2RlZmluZSB4cCAgdHAJLyogMm4gKyAyICovCisgICAgICAvKiBhbTEgIG1heWJlIGluIHt4cCwgbn0gKi8KKyAgICAgIC8qIGJtMSAgbWF5YmUgaW4ge3hwICsgbiwgbn0gKi8KKyNkZWZpbmUgc3AxICh0cCArIDIqbiArIDIpCisgICAgICAvKiBhcDEgIG1heWJlIGluIHtzcDEsIG4gKyAxfSAqLworICAgICAgLyogYnAxICBtYXliZSBpbiB7c3AxICsgbiArIDEsIG4gKyAxfSAqLworCisgICAgICB7CisJbXBfc3JjcHRyIGFtMSwgYm0xOworCW1wX3NpemVfdCBhbm0sIGJubTsKKwltcF9wdHIgc287CisKKwlibTEgPSBiMDsKKwlibm0gPSBibjsKKwlpZiAoTElLRUxZIChhbiA+IG4pKQorCSAgeworCSAgICBhbTEgPSB4cDsKKwkgICAgY3kgPSBtcG5fYWRkICh4cCwgYTAsIG4sIGExLCBhbiAtIG4pOworCSAgICBNUE5fSU5DUl9VICh4cCwgbiwgY3kpOworCSAgICBhbm0gPSBuOworCSAgICBzbyA9IHhwICsgbjsKKwkgICAgaWYgKExJS0VMWSAoYm4gPiBuKSkKKwkgICAgICB7CisJCWJtMSA9IHNvOworCQljeSA9IG1wbl9hZGQgKHNvLCBiMCwgbiwgYjEsIGJuIC0gbik7CisJCU1QTl9JTkNSX1UgKHNvLCBuLCBjeSk7CisJCWJubSA9IG47CisJCXNvICs9IG47CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgc28gPSB4cDsKKwkgICAgYW0xID0gYTA7CisJICAgIGFubSA9IGFuOworCSAgfQorCisJbXBuX211bG1vZF9ibm0xIChycCwgbiwgYW0xLCBhbm0sIGJtMSwgYm5tLCBzbyk7CisgICAgICB9CisKKyAgICAgIHsKKwlpbnQgICAgICAgazsKKwltcF9zcmNwdHIgYXAxLCBicDE7CisJbXBfc2l6ZV90IGFucCwgYm5wOworCisJYnAxID0gYjA7CisJYm5wID0gYm47CisJaWYgKExJS0VMWSAoYW4gPiBuKSkgeworCSAgYXAxID0gc3AxOworCSAgY3kgPSBtcG5fc3ViIChzcDEsIGEwLCBuLCBhMSwgYW4gLSBuKTsKKwkgIHNwMVtuXSA9IDA7CisJICBNUE5fSU5DUl9VIChzcDEsIG4gKyAxLCBjeSk7CisJICBhbnAgPSBuICsgYXAxW25dOworCSAgaWYgKExJS0VMWSAoYm4gPiBuKSkgeworCSAgICBicDEgPSBzcDEgKyBuICsgMTsKKwkgICAgY3kgPSBtcG5fc3ViIChzcDEgKyBuICsgMSwgYjAsIG4sIGIxLCBibiAtIG4pOworCSAgICBzcDFbMipuKzFdID0gMDsKKwkgICAgTVBOX0lOQ1JfVSAoc3AxICsgbiArIDEsIG4gKyAxLCBjeSk7CisJICAgIGJucCA9IG4gKyBicDFbbl07CisJICB9CisJfSBlbHNlIHsKKwkgIGFwMSA9IGEwOworCSAgYW5wID0gYW47CisJfQorCisJaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisJICBrPTA7CisJZWxzZQorCSAgeworCSAgICBpbnQgbWFzazsKKwkgICAgayA9IG1wbl9mZnRfYmVzdF9rIChuLCAwKTsKKwkgICAgbWFzayA9ICgxPDxrKSAtIDE7CisJICAgIHdoaWxlIChuICYgbWFzaykge2stLTsgbWFzayA+Pj0xO307CisJICB9CisJaWYgKGsgPj0gRkZUX0ZJUlNUX0spCisJICB4cFtuXSA9IG1wbl9tdWxfZmZ0ICh4cCwgbiwgYXAxLCBhbnAsIGJwMSwgYm5wLCBrKTsKKwllbHNlIGlmIChVTkxJS0VMWSAoYnAxID09IGIwKSkKKwkgIHsKKwkgICAgQVNTRVJUIChhbnAgKyBibnAgPD0gMipuKzEpOworCSAgICBBU1NFUlQgKGFucCArIGJucCA+IG4pOworCSAgICBBU1NFUlQgKGFucCA+PSBibnApOworCSAgICBtcG5fbXVsICh4cCwgYXAxLCBhbnAsIGJwMSwgYm5wKTsKKwkgICAgYW5wID0gYW5wICsgYm5wIC0gbjsKKwkgICAgQVNTRVJUIChhbnAgPD0gbiB8fCB4cFsyKm5dPT0wKTsKKwkgICAgYW5wLT0gYW5wID4gbjsKKwkgICAgY3kgPSBtcG5fc3ViICh4cCwgeHAsIG4sIHhwICsgbiwgYW5wKTsKKwkgICAgeHBbbl0gPSAwOworCSAgICBNUE5fSU5DUl9VICh4cCwgbisxLCBjeSk7CisJICB9CisJZWxzZQorCSAgbXBuX2JjX211bG1vZF9ibnAxICh4cCwgYXAxLCBicDEsIG4sIHhwKTsKKyAgICAgIH0KKworICAgICAgLyogSGVyZSB0aGUgQ1JUIHJlY29tcG9zaXRpb24gYmVnaW5zLgorCisJIHhtIDwtICh4cCArIHhtKS8yID0gKHhwICsgeG0pQl5uLzIgbW9kIChCXm4tMSkKKwkgRGl2aXNpb24gYnkgMiBpcyBhIGJpdHdpc2Ugcm90YXRpb24uCisKKwkgQXNzdW1lcyB4cCBub3JtYWxpc2VkIG1vZCAoQl5uKzEpLgorCisJIFRoZSByZXNpZHVlIGNsYXNzIFswXSBpcyByZXByZXNlbnRlZCBieSBbQl5uLTFdOyBleGNlcHQgd2hlbgorCSBib3RoIGlucHV0IGFyZSBaRVJPLgorICAgICAgKi8KKworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24gfHwgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbmMKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNoMWFkZF9uYworICAgICAgY3kgPSBtcG5fcnNoMWFkZF9uYyhycCwgcnAsIHhwLCBuLCB4cFtuXSk7IC8qIEJebiA9IDEgKi8KKyAgICAgIGhpID0gY3kgPDwgKEdNUF9OVU1CX0JJVFMgLSAxKTsKKyAgICAgIGN5ID0gMDsKKyAgICAgIC8qIG5leHQgdXBkYXRlIG9mIHJwW24tMV0gd2lsbCBzZXQgY3kgPSAxIG9ubHkgaWYgcnBbbi0xXSs9aGkKKwkgb3ZlcmZsb3dzLCBpLmUuIGEgZnVydGhlciBpbmNyZW1lbnQgd2lsbCBub3Qgb3ZlcmZsb3cgYWdhaW4uICovCisjZWxzZSAvKiAhIF9uYyAqLworICAgICAgY3kgPSB4cFtuXSArIG1wbl9yc2gxYWRkX24ocnAsIHJwLCB4cCwgbik7IC8qIEJebiA9IDEgKi8KKyAgICAgIGhpID0gKGN5PDwoR01QX05VTUJfQklUUy0xKSkmR01QX05VTUJfTUFTSzsgLyogKGN5JjEpIDw8IC4uLiAqLworICAgICAgY3kgPj49IDE7CisgICAgICAvKiBjeSA9IDEgb25seSBpZiB4cFtuXSA9IDEgaS5lLiB7eHAsbn0gPSBaRVJPLCB0aGlzIGltcGxpZXMgdGhhdAorCSB0aGUgcnNoMWFkZCB3YXMgYSBzaW1wbGUgcnNoaWZ0OiB0aGUgdG9wIGJpdCBpcyAwLiBjeT0xID0+IGhpPTAuICovCisjZW5kaWYKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKyAgICAgIGFkZF9zc2FhYWEoY3ksIHJwW24tMV0sIGN5LCBycFtuLTFdLCAwLCBoaSk7CisjZWxzZQorICAgICAgY3kgKz0gKGhpICYgcnBbbi0xXSkgPj4gKEdNUF9OVU1CX0JJVFMtMSk7CisgICAgICBycFtuLTFdIF49IGhpOworI2VuZGlmCisjZWxzZSAvKiAhIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25jCisgICAgICBjeSA9IG1wbl9hZGRfbmMocnAsIHJwLCB4cCwgbiwgeHBbbl0pOworI2Vsc2UgLyogISBfbmMgKi8KKyAgICAgIGN5ID0geHBbbl0gKyBtcG5fYWRkX24ocnAsIHJwLCB4cCwgbik7IC8qIHhwW25dID09IDEgaW1wbGllcyB7eHAsbn0gPT0gWkVSTyAqLworI2VuZGlmCisgICAgICBjeSArPSAocnBbMF0mMSk7CisgICAgICBtcG5fcnNoaWZ0KHJwLCBycCwgbiwgMSk7CisgICAgICBBU1NFUlQgKGN5IDw9IDIpOworICAgICAgaGkgPSAoY3k8PChHTVBfTlVNQl9CSVRTLTEpKSZHTVBfTlVNQl9NQVNLOyAvKiAoY3kmMSkgPDwgLi4uICovCisgICAgICBjeSA+Pj0gMTsKKyAgICAgIC8qIFdlIGNhbiBoYXZlIGN5ICE9IDAgb25seSBpZiBoaSA9IDAuLi4gKi8KKyAgICAgIEFTU0VSVCAoKHJwW24tMV0gJiBHTVBfTlVNQl9ISUdIQklUKSA9PSAwKTsKKyAgICAgIHJwW24tMV0gfD0gaGk7CisgICAgICAvKiAuLi4gcnBbbi0xXSArIGN5IGNhbiBub3Qgb3ZlcmZsb3csIHRoZSBmb2xsb3dpbmcgSU5DUiBpcyBjb3JyZWN0LiAqLworI2VuZGlmCisgICAgICBBU1NFUlQgKGN5IDw9IDEpOworICAgICAgLyogTmV4dCBpbmNyZW1lbnQgY2FuIG5vdCBvdmVyZmxvdywgcmVhZCB0aGUgcHJldmlvdXMgY29tbWVudHMgYWJvdXQgY3kuICovCisgICAgICBBU1NFUlQgKChjeSA9PSAwKSB8fCAoKHJwW24tMV0gJiBHTVBfTlVNQl9ISUdIQklUKSA9PSAwKSk7CisgICAgICBNUE5fSU5DUl9VKHJwLCBuLCBjeSk7CisKKyAgICAgIC8qIENvbXB1dGUgdGhlIGhpZ2hlc3QgaGFsZjoKKwkgKFsoeHAgKyB4bSkvMiBtb2QgKEJebi0xKV0gLSB4cCApICogQl5uCisgICAgICAgKi8KKyAgICAgIGlmIChVTkxJS0VMWSAoYW4gKyBibiA8IHJuKSkKKwl7CisJICAvKiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlLCB0aGUgb25seSB3YXkgdGhlIHJlc3VsdCBjYW4gZXF1YWwKKwkgICAgIHplcm8gbW9kIEJee3JufSAtIDEgaXMgaWYgb25lIG9mIHRoZSBpbnB1dHMgaXMgemVybywgYW5kCisJICAgICB0aGVuIHRoZSBvdXRwdXQgb2YgYm90aCB0aGUgcmVjdXJzaXZlIGNhbGxzIGFuZCB0aGlzIENSVAorCSAgICAgcmVjb25zdHJ1Y3Rpb24gaXMgemVybywgbm90IEJee3JufSAtIDEuIFdoaWNoIGlzIGdvb2QsCisJICAgICBzaW5jZSB0aGUgbGF0dGVyIHJlcHJlc2VudGF0aW9uIGRvZXNuJ3QgZml0IGluIHRoZSBvdXRwdXQKKwkgICAgIGFyZWEuKi8KKwkgIGN5ID0gbXBuX3N1Yl9uIChycCArIG4sIHJwLCB4cCwgYW4gKyBibiAtIG4pOworCisJICAvKiBGSVhNRTogVGhpcyBzdWJ0cmFjdGlvbiBvZiB0aGUgaGlnaCBwYXJ0cyBpcyBub3QgcmVhbGx5CisJICAgICBuZWNlc3NhcnksIHdlIGRvIGl0IHRvIGdldCB0aGUgY2Fycnkgb3V0LCBhbmQgZm9yIHNhbml0eQorCSAgICAgY2hlY2tpbmcuICovCisJICBjeSA9IHhwW25dICsgbXBuX3N1Yl9uYyAoeHAgKyBhbiArIGJuIC0gbiwgcnAgKyBhbiArIGJuIC0gbiwKKwkJCQkgICB4cCArIGFuICsgYm4gLSBuLCBybiAtIChhbiArIGJuKSwgY3kpOworCSAgQVNTRVJUIChhbiArIGJuID09IHJuIC0gMSB8fAorCQkgIG1wbl96ZXJvX3AgKHhwICsgYW4gKyBibiAtIG4gKyAxLCBybiAtIDEgLSAoYW4gKyBibikpKTsKKwkgIGN5ID0gbXBuX3N1Yl8xIChycCwgcnAsIGFuICsgYm4sIGN5KTsKKwkgIEFTU0VSVCAoY3kgPT0gKHhwICsgYW4gKyBibiAtIG4pWzBdKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3kgPSB4cFtuXSArIG1wbl9zdWJfbiAocnAgKyBuLCBycCwgeHAsIG4pOworCSAgLyogY3kgPSAxIG9ubHkgaWYge3hwLG4rMX0gaXMgbm90IFpFUk8sIGkuZS4ge3JwLG59IGlzIG5vdCBaRVJPLgorCSAgICAgREVDUiB3aWxsIGFmZmVjdCBfYXQgbW9zdF8gdGhlIGxvd2VzdCBuIGxpbWJzLiAqLworCSAgTVBOX0RFQ1JfVSAocnAsIDIqbiwgY3kpOworCX0KKyN1bmRlZiBhMAorI3VuZGVmIGExCisjdW5kZWYgYjAKKyN1bmRlZiBiMQorI3VuZGVmIHhwCisjdW5kZWYgc3AxCisgICAgfQorfQorCittcF9zaXplX3QKK21wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3Qgbmg7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgICAgIE1VTE1PRF9CTk0xX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG47CisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIDQgKiAoTVVMTU9EX0JOTTFfVEhSRVNIT0xEIC0gMSkgKyAxKSkKKyAgICByZXR1cm4gKG4gKyAoMi0xKSkgJiAoLTIpOworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCA4ICogKE1VTE1PRF9CTk0xX1RIUkVTSE9MRCAtIDEpICsgMSkpCisgICAgcmV0dXJuIChuICsgKDQtMSkpICYgKC00KTsKKworICBuaCA9IChuICsgMSkgPj4gMTsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuaCwgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIChuICsgKDgtMSkpICYgKC04KTsKKworICByZXR1cm4gMiAqIG1wbl9mZnRfbmV4dF9zaXplIChuaCwgbXBuX2ZmdF9iZXN0X2sgKG5oLCAwKSk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9uZWcuYyBiL21wbi9nZW5lcmljL25lZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9uZWcuYwpAQCAtMCwwICsxLDMzIEBACisvKiBtcG5fbmVnIC0gbmVnYXRlIGFuIG1wbi4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXBuX25lZyAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvbnVzc2JhdW1lcl9tdWwuYyBiL21wbi9nZW5lcmljL251c3NiYXVtZXJfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwY2YyNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL251c3NiYXVtZXJfbXVsLmMKQEAgLTAsMCArMSw3MCBAQAorLyogbXBuX251c3NiYXVtZXJfbXVsIC0tIE11bHRpcGx5IHthcCxhbn0gYW5kIHticCxibn0gdXNpbmcKKyAgIE51c3NiYXVtZXIncyBuZWdhY3ljbGljIGNvbnZvbHV0aW9uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogTXVsdGlwbHkge2FwLGFufSBieSB7YnAsYm59LCBhbmQgcHV0IHRoZSByZXN1bHQgaW4ge3BwLCBhbitibn0gKi8KK3ZvaWQKK21wbl9udXNzYmF1bWVyX211bCAobXBfcHRyIHBwLAorCQkgICAgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCSAgICBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibikKK3sKKyAgbXBfc2l6ZV90IHJuOworICBtcF9wdHIgdHA7CisgIFRNUF9ERUNMOworCisgIEFTU0VSVCAoYW4gPj0gYm4pOworICBBU1NFUlQgKGJuID4gMCk7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKChhcCA9PSBicCkgJiYgKGFuID09IGJuKSkKKyAgICB7CisgICAgICBybiA9IG1wbl9zcXJtb2RfYm5tMV9uZXh0X3NpemUgKDIqYW4pOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG1wbl9zcXJtb2RfYm5tMV9pdGNoIChybiwgYW4pKTsKKyAgICAgIG1wbl9zcXJtb2RfYm5tMSAocHAsIHJuLCBhcCwgYW4sIHRwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBybiA9IG1wbl9tdWxtb2RfYm5tMV9uZXh0X3NpemUgKGFuICsgYm4pOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG1wbl9tdWxtb2RfYm5tMV9pdGNoIChybiwgYW4sIGJuKSk7CisgICAgICBtcG5fbXVsbW9kX2JubTEgKHBwLCBybiwgYXAsIGFuLCBicCwgYm4sIHRwKTsKKyAgICB9CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9wZXJmcG93LmMgYi9tcG4vZ2VuZXJpYy9wZXJmcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3BlcmZwb3cuYwpAQCAtMCwwICsxLDM0MiBAQAorLyogbXBuX3BlcmZlY3RfcG93ZXJfcCAtLSBtcG4gcGVyZmVjdCBwb3dlciBkZXRlY3Rpb24uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJ0aW4gQm9pai4KKworQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNkZWZpbmUgU01BTEwgMjAKKyNkZWZpbmUgTUVESVVNIDEwMAorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYge25wLG5ufSA9PSB7eHAseG59IF4gay4KKyAgIEFsZ29yaXRobToKKyAgICAgICBGb3IgcyA9IDEsIDIsIDQsIC4uLiwgc19tYXgsIGNvbXB1dGUgdGhlIHMgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YKKyAgICAgICB7eHAseG59XmsuIFN0b3AgaWYgdGhleSBkb24ndCBtYXRjaCB0aGUgcyBsZWFzdCBzaWduaWZpY2FudCBsaW1icyBvZgorICAgICAgIHtucCxubn0uCisKKyAgIEZJWE1FOiBMb3cgeG4gbGltYnMgY2FuIGJlIGV4cGVjdGVkIHRvIGFsd2F5cyBtYXRjaCwgaWYgY29tcHV0ZWQgYXMgYSBtb2QKKyAgIEJee3hufSByb290LiBTbyBpbnN0ZWFkIG9mIHVzaW5nIG1wbl9wb3dsbywgY29tcHV0ZSBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZQorICAgbW9zdCBzaWduaWZpY2FudCAobm9ybWFsaXplZCkgbGltYiBvZiB7eHAseG59IF4gayAoYW5kIGFuIGVycm9yIGJvdW5kKSwgYW5kCisgICBjb21wYXJlIHRvIHtucCwgbm59LiBPciB1c2UgYW4gZXZlbiBjcnVkZXIgYXBwcm94aW1hdGlvbiBiYXNlZCBvbiBmaXgtcG9pbnQKKyAgIGJhc2UgMiBsb2dhcml0aG0uICAqLworc3RhdGljIGludAorcG93X2VxdWFscyAobXBfc3JjcHRyIG5wLCBtcF9zaXplX3QgbiwKKwkgICAgbXBfc3JjcHRyIHhwLG1wX3NpemVfdCB4biwKKwkgICAgbXBfbGltYl90IGssIG1wX2JpdGNudF90IGYsCisJICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfYml0Y250X3QgeSwgejsKKyAgbXBfc2l6ZV90IGJuOworICBtcF9saW1iX3QgaCwgbDsKKworICBBU1NFUlQgKG4gPiAxIHx8IChuID09IDEgJiYgbnBbMF0gPiAxKSk7CisgIEFTU0VSVCAobnBbbiAtIDFdID4gMCk7CisgIEFTU0VSVCAoeG4gPiAwKTsKKworICBpZiAoeG4gPT0gMSAmJiB4cFswXSA9PSAxKQorICAgIHJldHVybiAwOworCisgIHogPSAxICsgKG4gPj4gMSk7CisgIGZvciAoYm4gPSAxOyBibiA8IHo7IGJuIDw8PSAxKQorICAgIHsKKyAgICAgIG1wbl9wb3dsbyAodHAsIHhwLCAmaywgMSwgYm4sIHRwICsgYm4pOworICAgICAgaWYgKG1wbl9jbXAgKHRwLCBucCwgYm4pICE9IDApCisJcmV0dXJuIDA7CisgICAgfQorCisgIC8qIEZpbmFsIGNoZWNrLiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiB7eHAseG59XmsgYmVmb3JlIGNvbXB1dGluZyB0aGUgcG93ZXIKKyAgICAgd2l0aCBmdWxsIHByZWNpc2lvbi4gIE9wdGltaXphdGlvbjogSXQgbWlnaHQgcGF5IG9mZiB0byBtYWtlIGEgbW9yZQorICAgICBhY2N1cmF0ZSBlc3RpbWF0aW9uIG9mIHRoZSBsb2dhcml0aG0gb2Yge3hwLHhufSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlCisgICAgIGluZGV4IG9mIHRoZSBNU0IuICAqLworCisgIE1QTl9TSVpFSU5CQVNFXzJFWFAoeSwgeHAsIHhuLCAxKTsKKyAgeSAtPSAxOyAgLyogbXNiX2luZGV4ICh4cCwgeG4pICovCisKKyAgdW11bF9wcG1tIChoLCBsLCBrLCB5KTsKKyAgaCAtPSBsID09IDA7ICAtLWw7CS8qIHR3by1saW1iIGRlY3JlbWVudCAqLworCisgIHogPSBmIC0gMTsgLyogbXNiX2luZGV4IChucCwgbikgKi8KKyAgaWYgKGggPT0gMCAmJiBsIDw9IHopCisgICAgeworICAgICAgbXBfbGltYl90ICp0cDI7CisgICAgICBtcF9zaXplX3QgaTsKKyAgICAgIGludCBhbnM7CisgICAgICBtcF9saW1iX3Qgc2l6ZTsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBzaXplID0gbCArIGs7CisgICAgICBBU1NFUlRfQUxXQVlTIChzaXplID49IGspOworCisgICAgICBUTVBfTUFSSzsKKyAgICAgIHkgPSAyICsgc2l6ZSAvIEdNUF9MSU1CX0JJVFM7CisgICAgICB0cDIgPSBUTVBfQUxMT0NfTElNQlMgKHkpOworCisgICAgICBpID0gbXBuX3Bvd18xICh0cCwgeHAsIHhuLCBrLCB0cDIpOworICAgICAgaWYgKGkgPT0gbiAmJiBtcG5fY21wICh0cCwgbnAsIG4pID09IDApCisJYW5zID0gMTsKKyAgICAgIGVsc2UKKwlhbnMgPSAwOworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgTiA9IHtucCxufSBpcyBhIGt0aCBwb3dlci4KKyAgIEkgPSB7aXAsbn0gPSBOXigtMSkgbW9kIEJebi4gICovCitzdGF0aWMgaW50Citpc19rdGhfcG93ZXIgKG1wX3B0ciBycCwgbXBfc3JjcHRyIG5wLAorCSAgICAgIG1wX2xpbWJfdCBrLCBtcF9zcmNwdHIgaXAsCisJICAgICAgbXBfc2l6ZV90IG4sIG1wX2JpdGNudF90IGYsCisJICAgICAgbXBfcHRyIHRwKQoreworICBtcF9iaXRjbnRfdCBiOworICBtcF9zaXplX3Qgcm4sIHhuOworCisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlQgKChrICYgMSkgIT0gMCB8fCBrID09IDIpOworICBBU1NFUlQgKChucFswXSAmIDEpICE9IDApOworCisgIGlmIChrID09IDIpCisgICAgeworICAgICAgYiA9IChmICsgMSkgPj4gMTsKKyAgICAgIHJuID0gMSArIGIgLyBHTVBfTElNQl9CSVRTOworICAgICAgaWYgKG1wbl9ic3FydGludiAocnAsIGlwLCBiLCB0cCkgIT0gMCkKKwl7CisJICBycFtybiAtIDFdICY9IChDTlNUX0xJTUIoMSkgPDwgKGIgJSBHTVBfTElNQl9CSVRTKSkgLSAxOworCSAgeG4gPSBybjsKKwkgIE1QTl9OT1JNQUxJWkUgKHJwLCB4bik7CisJICBpZiAocG93X2VxdWFscyAobnAsIG4sIHJwLCB4biwgaywgZiwgdHApICE9IDApCisJICAgIHJldHVybiAxOworCisJICAvKiBDaGVjayBpZiAoMl5iIC0gcileMiA9PSBuICovCisJICBtcG5fbmVnIChycCwgcnAsIHJuKTsKKwkgIHJwW3JuIC0gMV0gJj0gKENOU1RfTElNQigxKSA8PCAoYiAlIEdNUF9MSU1CX0JJVFMpKSAtIDE7CisJICBNUE5fTk9STUFMSVpFIChycCwgcm4pOworCSAgaWYgKHBvd19lcXVhbHMgKG5wLCBuLCBycCwgcm4sIGssIGYsIHRwKSAhPSAwKQorCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYiA9IDEgKyAoZiAtIDEpIC8gazsKKyAgICAgIHJuID0gMSArIChiIC0gMSkgLyBHTVBfTElNQl9CSVRTOworICAgICAgbXBuX2Jyb290aW52IChycCwgaXAsIHJuLCBrLCB0cCk7CisgICAgICBpZiAoKGIgJSBHTVBfTElNQl9CSVRTKSAhPSAwKQorCXJwW3JuIC0gMV0gJj0gKENOU1RfTElNQigxKSA8PCAoYiAlIEdNUF9MSU1CX0JJVFMpKSAtIDE7CisgICAgICBNUE5fTk9STUFMSVpFIChycCwgcm4pOworICAgICAgaWYgKHBvd19lcXVhbHMgKG5wLCBuLCBycCwgcm4sIGssIGYsIHRwKSAhPSAwKQorCXJldHVybiAxOworICAgIH0KKyAgTVBOX1pFUk8gKHJwLCBybik7IC8qIFVudHJhc2ggcnAgKi8KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BlcmZwb3cgKG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG4sCisJIG1wX2xpbWJfdCB1YiwgbXBfbGltYl90IGcsCisJIG1wX2JpdGNudF90IGYsIGludCBuZWcpCit7CisgIG1wX3B0ciBpcCwgdHAsIHJwOworICBtcF9saW1iX3QgazsKKyAgaW50IGFuczsKKyAgbXBfYml0Y250X3QgYjsKKyAgZ21wX3ByaW1lc2lldmVfdCBwczsKKyAgVE1QX0RFQ0w7CisKKyAgQVNTRVJUIChuID4gMCk7CisgIEFTU0VSVCAoKG5wWzBdICYgMSkgIT0gMCk7CisgIEFTU0VSVCAodWIgPiAwKTsKKworICBUTVBfTUFSSzsKKyAgZ21wX2luaXRfcHJpbWVzaWV2ZSAoJnBzKTsKKyAgYiA9IChmICsgMykgPj4gMTsKKworICBUTVBfQUxMT0NfTElNQlNfMyAoaXAsIG4sIHJwLCBuLCB0cCwgNSAqIG4pOworCisgIE1QTl9aRVJPIChycCwgbik7CisKKyAgLyogRklYTUU6IEl0IHNlZW1zIHRoZSBpbnZlcnNlIGluIG5pbnYgaXMgbmVlZGVkIG9ubHkgdG8gZ2V0IG5vbi1pbnZlcnRlZAorICAgICByb290cy4gSS5lLiwgaXNfa3RoX3Bvd2VyIGNvbXB1dGVzIG5eezEvMn0gYXMgKG5eey0xfSleey0xLzJ9IGFuZAorICAgICBzaW1pbGFybHkgZm9yIG50aCByb290cy4gSXQgc2hvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIGNvbXB1dGUgbl57MS8yfSBhcworICAgICBuICogbl57LTEvMn0sIHdpdGggYSBtdWxsbyBpbnN0ZWFkIG9mIGEgYmludmVydC4gQW5kIHdlIGNhbiBkbyBzb21ldGhpbmcKKyAgICAgc2ltaWxhciBmb3Iga3RoIHJvb3RzIGlmIHdlIHN3aXRjaCB0byBhbiBpdGVyYXRpb24gY29udmVyZ2luZyB0byBuXnsxL2sgLQorICAgICAxfSwgYW5kIHdlIGNhbiB0aGVuIGVsaW1pbmF0ZSB0aGlzIGJpbnZlcnQgY2FsbC4gKi8KKyAgbXBuX2JpbnZlcnQgKGlwLCBucCwgMSArIChiIC0gMSkgLyBHTVBfTElNQl9CSVRTLCB0cCk7CisgIGlmIChiICUgR01QX0xJTUJfQklUUykKKyAgICBpcFsoYiAtIDEpIC8gR01QX0xJTUJfQklUU10gJj0gKENOU1RfTElNQigxKSA8PCAoYiAlIEdNUF9MSU1CX0JJVFMpKSAtIDE7CisKKyAgaWYgKG5lZykKKyAgICBnbXBfbmV4dHByaW1lICgmcHMpOworCisgIGFucyA9IDA7CisgIGlmIChnID4gMCkKKyAgICB7CisgICAgICB1YiA9IE1JTiAodWIsIGcgKyAxKTsKKyAgICAgIHdoaWxlICgoayA9IGdtcF9uZXh0cHJpbWUgKCZwcykpIDwgdWIpCisJeworCSAgaWYgKChnICUgaykgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChpc19rdGhfcG93ZXIgKHJwLCBucCwgaywgaXAsIG4sIGYsIHRwKSAhPSAwKQorCQl7CisJCSAgYW5zID0gMTsKKwkJICBnb3RvIHJldDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlICgoayA9IGdtcF9uZXh0cHJpbWUgKCZwcykpIDwgdWIpCisJeworCSAgaWYgKGlzX2t0aF9wb3dlciAocnAsIG5wLCBrLCBpcCwgbiwgZiwgdHApICE9IDApCisJICAgIHsKKwkgICAgICBhbnMgPSAxOworCSAgICAgIGdvdG8gcmV0OworCSAgICB9CisJfQorICAgIH0KKyByZXQ6CisgIFRNUF9GUkVFOworICByZXR1cm4gYW5zOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbnJ0cmlhbFtdID0geyAxMDAsIDUwMCwgMTAwMCB9OworCisvKiBUYWJsZSBvZiAobG9nX3twX2l9IDIpIHZhbHVlcywgd2hlcmUgcF9pIGlzIHRoZSAobnJ0cmlhbFtpXSArIDEpJ3RoIHByaW1lCisgICBudW1iZXIuICAqLworc3RhdGljIGNvbnN0IGRvdWJsZSBsb2dzW10gPQorICB7IDAuMTA5OTQ1NzIyODE5MzYyMCwgMC4wODQ3MDE2NDAzMTE1MzIyLCAwLjA3NzIwNDgxOTUxNDQ0MTUgfTsKKworaW50CittcG5fcGVyZmVjdF9wb3dlcl9wIChtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgKm5jLCBmYWN0b3IsIGc7CisgIG1wX2xpbWJfdCBleHAsIGQ7CisgIG1wX2JpdGNudF90IHR3b3MsIGNvdW50OworICBpbnQgYW5zLCB3aGVyZSwgbmVnLCB0cmlhbDsKKyAgVE1QX0RFQ0w7CisKKyAgbmVnID0gbiA8IDA7CisgIGlmIChuZWcpCisgICAgeworICAgICAgbiA9IC1uOworICAgIH0KKworICBpZiAobiA9PSAwIHx8IChuID09IDEgJiYgbnBbMF0gPT0gMSkpIC8qIFZhbGdyaW5kIGRvZXNuJ3QgbGlrZQorCQkJCQkgICAobiA8PSAobnBbMF0gPT0gMSkpICovCisgICAgcmV0dXJuIDE7CisKKyAgVE1QX01BUks7CisKKyAgY291bnQgPSAwOworCisgIHR3b3MgPSBtcG5fc2NhbjEgKG5wLCAwKTsKKyAgaWYgKHR3b3MgIT0gMCkKKyAgICB7CisgICAgICBtcF9zaXplX3QgczsKKyAgICAgIGlmICh0d29zID09IDEpCisJeworCSAgcmV0dXJuIDA7CisJfQorICAgICAgcyA9IHR3b3MgLyBHTVBfTElNQl9CSVRTOworICAgICAgaWYgKHMgKyAxID09IG4gJiYgUE9XMl9QIChucFtzXSkpCisJeworCSAgcmV0dXJuICEgKG5lZyAmJiBQT1cyX1AgKHR3b3MpKTsKKwl9CisgICAgICBjb3VudCA9IHR3b3MgJSBHTVBfTElNQl9CSVRTOworICAgICAgbiAtPSBzOworICAgICAgbnAgKz0gczsKKyAgICAgIGlmIChjb3VudCA+IDApCisJeworCSAgbmMgPSBUTVBfQUxMT0NfTElNQlMgKG4pOworCSAgbXBuX3JzaGlmdCAobmMsIG5wLCBuLCBjb3VudCk7CisJICBuIC09IChuY1tuIC0gMV0gPT0gMCk7CisJICBucCA9IG5jOworCX0KKyAgICB9CisgIGcgPSB0d29zOworCisgIHRyaWFsID0gKG4gPiBTTUFMTCkgKyAobiA+IE1FRElVTSk7CisKKyAgd2hlcmUgPSAwOworICBmYWN0b3IgPSBtcG5fdHJpYWxkaXYgKG5wLCBuLCBucnRyaWFsW3RyaWFsXSwgJndoZXJlKTsKKworICBpZiAoZmFjdG9yICE9IDApCisgICAgeworICAgICAgaWYgKGNvdW50ID09IDApIC8qIFdlIGRpZCBub3QgYWxsb2NhdGUgbmMgeWV0LiAqLworCXsKKwkgIG5jID0gVE1QX0FMTE9DX0xJTUJTIChuKTsKKwl9CisKKyAgICAgIC8qIFJlbW92ZSBmYWN0b3JzIGZvdW5kIGJ5IHRyaWFsZGl2LiAgT3B0aW1pemF0aW9uOiBJZiByZW1vdmUKKwkgZGVmaW5lIF9pdGNoLCB3ZSBjYW4gYWxsb2NhdGUgaXRzIHNjcmF0Y2gganVzdCBvbmNlICovCisKKyAgICAgIGRvCisJeworCSAgYmludmVydF9saW1iIChkLCBmYWN0b3IpOworCisJICAvKiBBZnRlciB0aGUgZmlyc3Qgcm91bmQgd2UgYWx3YXlzIGhhdmUgbmMgPT0gbnAgKi8KKwkgIGV4cCA9IG1wbl9yZW1vdmUgKG5jLCAmbiwgbnAsIG4sICZkLCAxLCB+KG1wX2JpdGNudF90KTApOworCisJICBpZiAoZyA9PSAwKQorCSAgICBnID0gZXhwOworCSAgZWxzZQorCSAgICBnID0gbXBuX2djZF8xICgmZywgMSwgZXhwKTsKKworCSAgaWYgKGcgPT0gMSkKKwkgICAgeworCSAgICAgIGFucyA9IDA7CisJICAgICAgZ290byByZXQ7CisJICAgIH0KKworCSAgaWYgKChuID09IDEpICYgKG5jWzBdID09IDEpKQorCSAgICB7CisJICAgICAgYW5zID0gISAobmVnICYmIFBPVzJfUCAoZykpOworCSAgICAgIGdvdG8gcmV0OworCSAgICB9CisKKwkgIG5wID0gbmM7CisJICBmYWN0b3IgPSBtcG5fdHJpYWxkaXYgKG5wLCBuLCBucnRyaWFsW3RyaWFsXSwgJndoZXJlKTsKKwl9CisgICAgICB3aGlsZSAoZmFjdG9yICE9IDApOworICAgIH0KKworICBNUE5fU0laRUlOQkFTRV8yRVhQKGNvdW50LCBucCwgbiwgMSk7ICAgLyogbG9nIChucCkgKyAxICovCisgIGQgPSAobXBfbGltYl90KSAoY291bnQgKiBsb2dzW3RyaWFsXSArIDFlLTkpICsgMTsKKyAgYW5zID0gcGVyZnBvdyAobnAsIG4sIGQsIGcsIGNvdW50LCBuZWcpOworCisgcmV0OgorICBUTVBfRlJFRTsKKyAgcmV0dXJuIGFuczsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3BlcmZzcXIuYyBiL21wbi9nZW5lcmljL3BlcmZzcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE1Yzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcGVyZnNxci5jCkBAIC0wLDAgKzEsMjM4IEBACisvKiBtcG5fcGVyZmVjdF9zcXVhcmVfcCh1LHVzaXplKSAtLSBSZXR1cm4gbm9uLXplcm8gaWYgVSBpcyBhIHBlcmZlY3Qgc3F1YXJlLAorICAgemVybyBvdGhlcndpc2UuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDIsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4gLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNpbmNsdWRlICJwZXJmc3FyLmgiCisKKworLyogY2hhbmdlIHRoaXMgdG8gIiNkZWZpbmUgVFJBQ0UoeCkgeCIgZm9yIGRpYWdub3N0aWNzICovCisjZGVmaW5lIFRSQUNFKHgpCisKKworCisvKiBQRVJGU1FSX01PRF8qIGRldGVjdHMgbm9uLXNxdWFyZXMgdXNpbmcgcmVzaWR1ZSB0ZXN0cy4KKworICAgQSBtYWNybyBQRVJGU1FSX01PRF9URVNUIGlzIHNldHVwIGJ5IGdlbi1wc3FyLmMgaW4gcGVyZnNxci5oLiAgSXQgdGFrZXMKKyAgIHt1cCx1c2l6ZX0gbW9kdWxvIGEgc2VsZWN0ZWQgbW9kdWx1cyB0byBnZXQgYSByZW1haW5kZXIgci4gIEZvciAzMi1iaXQgb3IKKyAgIDY0LWJpdCBsaW1icyB0aGlzIG1vZHVsdXMgd2lsbCBiZSAyXjI0LTEgb3IgMl40OC0xIHVzaW5nIFBFUkZTUVJfTU9EXzM0LAorICAgb3IgZm9yIG90aGVyIGxpbWIgb3IgbmFpbCBzaXplcyBhIFBFUkZTUVJfUFAgaXMgY2hvc2VuIGFuZCBQRVJGU1FSX01PRF9QUAorICAgdXNlZC4gIFBFUkZTUVJfUFBfTk9STSBhbmQgUEVSRlNRUl9QUF9JTlZFUlRFRCBhcmUgcHJlLWNhbGN1bGF0ZWQgaW4gdGhpcworICAgY2FzZSB0b28uCisKKyAgIFBFUkZTUVJfTU9EX1RFU1QgdGhlbiBtYWtlcyB2YXJpb3VzIGNhbGxzIHRvIFBFUkZTUVJfTU9EXzEgb3IKKyAgIFBFUkZTUVJfTU9EXzIgd2l0aCBkaXZpc29ycyBkIHdoaWNoIGFyZSBmYWN0b3JzIG9mIHRoZSBtb2R1bHVzLCBhbmQgdGFibGUKKyAgIGRhdGEgaW5kaWNhdGluZyByZXNpZHVlcyBhbmQgbm9uLXJlc2lkdWVzIG1vZHVsbyB0aG9zZSBkaXZpc29ycy4gIFRoZQorICAgdGFibGUgZGF0YSBpcyBpbiAxIG9yIDIgbGltYnMgd29ydGggb2YgYml0cyByZXNwZWN0aXZlbHksIHBlciB0aGUgc2l6ZSBvZgorICAgZWFjaCBkLgorCisgICBBICJtb2RleGFjdCIgc3R5bGUgcmVtYWluZGVyIGlzIHRha2VuIHRvIHJlZHVjZSByIG1vZHVsbyBkLgorICAgUEVSRlNRUl9NT0RfSURYIGltcGxlbWVudHMgdGhpcywgcHJvZHVjaW5nIGFuIGluZGV4ICJpZHgiIGZvciB1c2Ugd2l0aAorICAgdGhlIHRhYmxlIGRhdGEuICBOb3RpY2UgdGhlcmUncyBqdXN0IG9uZSBtdWx0aXBsaWNhdGlvbiBieSBhIGNvbnN0YW50CisgICAiaW52IiwgZm9yIGVhY2ggZC4KKworICAgVGhlIG1vZGV4YWN0IGRvZXNuJ3QgcHJvZHVjZSBhIHRydWUgciVkIHJlbWFpbmRlciwgaW5zdGVhZCBpZHggc2F0aXNmaWVzCisgICAiLShpZHg8PFBFUkZTUVJfTU9EX0JJVFMpID09IHIgbW9kIGQiLiAgQmVjYXVzZSBkIGlzIG9kZCwgdGhpcyBmYWN0b3IKKyAgIC0yXlBFUkZTUVJfTU9EX0JJVFMgaXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbiByIGFuZCBpZHgsIGFuZCBpcworICAgYWNjb3VudGVkIGZvciBieSBoYXZpbmcgdGhlIHRhYmxlIGRhdGEgc3VpdGFibHkgcGVybXV0ZWQuCisKKyAgIFRoZSByZW1haW5kZXIgciBmaXRzIHdpdGhpbiBQRVJGU1FSX01PRF9CSVRTIHdoaWNoIGlzIGxlc3MgdGhhbiBhIGxpbWIuCisgICBJbiBmYWN0IHRoZSBHTVBfTElNQl9CSVRTIC0gUEVSRlNRUl9NT0RfQklUUyBzcGFyZSBiaXRzIGFyZSBlbm91Z2ggdG8gZml0CisgICBlYWNoIGRpdmlzb3IgZCBtZWFuaW5nIHRoZSBtb2RleGFjdCBtdWx0aXBseSBjYW4gdGFrZSBwbGFjZSBlbnRpcmVseQorICAgd2l0aGluIG9uZSBsaW1iLCBnaXZpbmcgdGhlIGNvbXBpbGVyIHRoZSBjaGFuY2UgdG8gb3B0aW1pemUgaXQsIGluIGEgd2F5CisgICB0aGF0IHNheSB1bXVsX3BwbW0gd291bGQgbm90IGdpdmUuCisKKyAgIFRoZXJlJ3Mgbm8gbmVlZCBmb3IgdGhlIGRpdmlzb3JzIGQgdG8gYmUgcHJpbWUsIGluIGZhY3QgZ2VuLXBzcXIuYyBtYWtlcworICAgYSBkZWxpYmVyYXRlIGVmZm9ydCB0byBjb21iaW5lIGZhY3RvcnMgc28gYXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YKKyAgIHNlcGFyYXRlIHRlc3RzIGRvbmUgb24gci4gIEJ1dCBzdWNoIGNvbWJpbmluZyBpcyBsaW1pdGVkIHRvIGQgPD0KKyAgIDIqR01QX0xJTUJfQklUUyBzbyB0aGF0IHRoZSB0YWJsZSBkYXRhIGZpdHMgaW4gYXQgbW9zdCAyIGxpbWJzLgorCisgICBBbHRlcm5hdGl2ZXM6CisKKyAgIEl0J2QgYmUgcG9zc2libGUgdG8gdXNlIGJpZ2dlciBkaXZpc29ycyBkLCBhbmQgbW9yZSB0aGFuIDIgbGltYnMgb2YgdGFibGUKKyAgIGRhdGEsIGJ1dCB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGl0IHdvdWxkIGJlIG9mIG11Y2ggaGVscCB0byB0aGUgcHJpbWUKKyAgIGZhY3RvcnMgaW4gdGhlIHVzdWFsIG1vZHVsaSAyXjI0LTEgb3IgMl40OC0xLgorCisgICBUaGUgbW9kdWxpIDJeMjQtMSBvciAyXjQ4LTEgYXJlIG5vdGhpbmcgcGFydGljdWxhcmx5IHNwZWNpYWwsIHRoZXkncmUKKyAgIGp1c3QgZWFzeSB0byBjYWxjdWxhdGUgKHNlZSBtcG5fbW9kXzM0bHN1YjEpIGFuZCBoYXZlIGEgbmljZSBzZXQgb2YgcHJpbWUKKyAgIGZhY3RvcnMuICAyXjMyLTEgYW5kIDJeNjQtMSB3b3VsZCBiZSBlcXVhbGx5IGVhc3kgdG8gY2FsY3VsYXRlLCBidXQgaGF2ZQorICAgZmV3ZXIgcHJpbWUgZmFjdG9ycy4KKworICAgVGhlIG5haWxzIGNhc2UgdXN1YWxseSBlbmRzIHVwIHVzaW5nIG1wbl9tb2RfMSwgd2hpY2ggaXMgYSBsb3Qgc2xvd2VyCisgICB0aGFuIG1wbl9tb2RfMzRsc3ViMS4gIFBlcmhhcHMgb3RoZXIgc3VjaCBzcGVjaWFsIG1vZHVsaSBjb3VsZCBiZSBmb3VuZAorICAgZm9yIHRoZSBuYWlscyBjYXNlLiAgVHdvLXRlcm0gdGhpbmdzIGxpa2UgMl4zMC0yXjE1LTEgbWlnaHQgYmUKKyAgIGNhbmRpZGF0ZXMuICBPciBhdCB3b3JzdCBzb21lIG9uLXRoZS1mbHkgZGUtbmFpbGluZyB3b3VsZCBhbGxvdyB0aGUgcGxhaW4KKyAgIDJeMjQtMSB0byBiZSB1c2VkLiAgQ3VycmVudGx5IG5haWxzIGFyZSB0b28gcHJlbGltaW5hcnkgdG8gYmUgd29ycmllZAorICAgYWJvdXQuCisKKyovCisKKyNkZWZpbmUgUEVSRlNRUl9NT0RfTUFTSyAgICAgICAoKENOU1RfTElNQigxKSA8PCBQRVJGU1FSX01PRF9CSVRTKSAtIDEpCisKKyNkZWZpbmUgTU9EMzRfQklUUyAgKEdNUF9OVU1CX0JJVFMgLyA0ICogMykKKyNkZWZpbmUgTU9EMzRfTUFTSyAgKChDTlNUX0xJTUIoMSkgPDwgTU9EMzRfQklUUykgLSAxKQorCisjZGVmaW5lIFBFUkZTUVJfTU9EXzM0KHIsIHVwLCB1c2l6ZSkJCQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgKHIpID0gbXBuX21vZF8zNGxzdWIxICh1cCwgdXNpemUpOwkJCQlcCisgICAgKHIpID0gKChyKSAmIE1PRDM0X01BU0spICsgKChyKSA+PiBNT0QzNF9CSVRTKTsJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogRklYTUU6IFRoZSAlPSBoZXJlIGlzbid0IGdvb2QsIGFuZCBtaWdodCBkZXN0cm95IGFueSBzYXZpbmdzIGZyb20ga2VlcGluZworICAgdGhlIFBFUkZTUVJfTU9EX0lEWCBzdHVmZiB3aXRoaW4gYSBsaW1iIChyYXRoZXIgdGhhbiBuZWVkaW5nIHVtdWxfcHBtbSkuCisgICBNYXliZSBhIG5ldyBzb3J0IG9mIG1wbl9wcmVpbnZfbW9kXzEgY291bGQgYWNjZXB0IGFuIHVubm9ybWFsaXplZCBkaXZpc29yCisgICBhbmQgYSBzaGlmdCBjb3VudCwgbGlrZSBtcG5fcHJlaW52X2RpdnJlbV8xLiAgQnV0IG1vZF8zNGxzdWIxIGlzIG91cgorICAgbm9ybWFsIGNhc2UsIHNvIGxldHMgbm90IHdvcnJ5IHRvbyBtdWNoIGFib3V0IG1vZF8xLiAgKi8KKyNkZWZpbmUgUEVSRlNRUl9NT0RfUFAociwgdXAsIHVzaXplKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChCRUxPV19USFJFU0hPTEQgKHVzaXplLCBQUkVJTlZfTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEKSkJXAorICAgICAgewkJCQkJCQkJCVwKKwkocikgPSBtcG5fcHJlaW52X21vZF8xICh1cCwgdXNpemUsIFBFUkZTUVJfUFBfTk9STSwJCVwKKwkJCQlQRVJGU1FSX1BQX0lOVkVSVEVEKTsJCQlcCisJKHIpICU9IFBFUkZTUVJfUFA7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCShyKSA9IG1wbl9tb2RfMSAodXAsIHVzaXplLCBQRVJGU1FSX1BQKTsJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBFUkZTUVJfTU9EX0lEWChpZHgsIHIsIGQsIGludikJCQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgbXBfbGltYl90ICBxOwkJCQkJCVwKKyAgICBBU1NFUlQgKChyKSA8PSBQRVJGU1FSX01PRF9NQVNLKTsJCQkJXAorICAgIEFTU0VSVCAoKCgoaW52KSAqIChkKSkgJiBQRVJGU1FSX01PRF9NQVNLKSA9PSAxKTsJCVwKKyAgICBBU1NFUlQgKE1QX0xJTUJfVF9NQVggLyAoZCkgPj0gUEVSRlNRUl9NT0RfTUFTSyk7CQlcCisJCQkJCQkJCVwKKyAgICBxID0gKChyKSAqIChpbnYpKSAmIFBFUkZTUVJfTU9EX01BU0s7CQkJXAorICAgIEFTU0VSVCAociA9PSAoKHEgKiAoZCkpICYgUEVSRlNRUl9NT0RfTUFTSykpOwkJXAorICAgIChpZHgpID0gKHEgKiAoZCkpID4+IFBFUkZTUVJfTU9EX0JJVFM7CQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBFUkZTUVJfTU9EXzEociwgZCwgaW52LCBtYXNrKQkJCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICB1bnNpZ25lZCAgIGlkeDsJCQkJCQlcCisgICAgQVNTRVJUICgoZCkgPD0gR01QX0xJTUJfQklUUyk7CQkJCVwKKyAgICBQRVJGU1FSX01PRF9JRFgoaWR4LCByLCBkLCBpbnYpOwkJCQlcCisgICAgVFJBQ0UgKHByaW50ZiAoIiAgUEVSRlNRUl9NT0RfMSBkPSV1IHI9JWx1IGlkeD0ldVxuIiwJXAorCQkgICBkLCByJWQsIGlkeCkpOwkJCQlcCisgICAgaWYgKCgoKG1hc2spID4+IGlkeCkgJiAxKSA9PSAwKQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJVFJBQ0UgKHByaW50ZiAoIiAgbm9uLXNxdWFyZVxuIikpOwkJCVwKKwlyZXR1cm4gMDsJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIFRoZSBleHByZXNzaW9uICIoaW50KSBpZHggLSBHTVBfTElNQl9CSVRTIDwgMCIgbGV0cyB0aGUgY29tcGlsZXIgdXNlIHRoZQorICAgc2lnbiBiaXQgZnJvbSAiaWR4LUdNUF9MSU1CX0JJVFMiLCB3aGljaCBtaWdodCBoZWxwIGF2b2lkIGEgYnJhbmNoLiAgKi8KKyNkZWZpbmUgUEVSRlNRUl9NT0RfMihyLCBkLCBpbnYsIG1oaSwgbWxvKQkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCAgbTsJCQkJCQlcCisgICAgdW5zaWduZWQgICBpZHg7CQkJCQkJXAorICAgIEFTU0VSVCAoKGQpIDw9IDIqR01QX0xJTUJfQklUUyk7CQkJCVwKKwkJCQkJCQkJXAorICAgIFBFUkZTUVJfTU9EX0lEWCAoaWR4LCByLCBkLCBpbnYpOwkJCQlcCisgICAgVFJBQ0UgKHByaW50ZiAoIiAgUEVSRlNRUl9NT0RfMiBkPSV1IHI9JWx1IGlkeD0ldVxuIiwJXAorCQkgICBkLCByJWQsIGlkeCkpOwkJCQlcCisgICAgbSA9ICgoaW50KSBpZHggLSBHTVBfTElNQl9CSVRTIDwgMCA/IChtbG8pIDogKG1oaSkpOwlcCisgICAgaWR4ICU9IEdNUF9MSU1CX0JJVFM7CQkJCQlcCisgICAgaWYgKCgobSA+PiBpZHgpICYgMSkgPT0gMCkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwlUUkFDRSAocHJpbnRmICgiICBub24tc3F1YXJlXG4iKSk7CQkJXAorCXJldHVybiAwOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworCitpbnQKK21wbl9wZXJmZWN0X3NxdWFyZV9wIChtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1c2l6ZSkKK3sKKyAgQVNTRVJUICh1c2l6ZSA+PSAxKTsKKworICBUUkFDRSAoZ21wX3ByaW50ZiAoIm1wbl9wZXJmZWN0X3NxdWFyZV9wICVOZFxuIiwgdXAsIHVzaXplKSk7CisKKyAgLyogVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgMjEyLzI1NiAoODIuOCUpIG9mIHRoZSBwZXJmZWN0IHNxdWFyZSBjYW5kaWRhdGVzCisgICAgIGluIE8oMSkgdGltZS4gICovCisgIHsKKyAgICB1bnNpZ25lZCAgaWR4ID0gdXBbMF0gJSAweDEwMDsKKyAgICBpZiAoKChzcV9yZXNfMHgxMDBbaWR4IC8gR01QX0xJTUJfQklUU10KKwkgID4+IChpZHggJSBHTVBfTElNQl9CSVRTKSkgJiAxKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworI2lmIDAKKyAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGV2ZW4gbXVsdGlwbGljaXR5IG9mIDIsIGFuZCB0aGVuIGNoZWNrIHRoYXQgdGhlIHJlc3QgaXMKKyAgICAgYSBwb3NzaWJsZSBwZXJmZWN0IHNxdWFyZS4gIExlYXZlIGRpc2FibGVkIHVudGlsIHdlIGNhbiBkZXRlcm1pbmUgdGhpcworICAgICByZWFsbHkgaXMgYW4gaW1wcm92ZW1lbnQuICBJZiBpdCBpcywgaXQgY291bGQgY29tcGxldGVseSByZXBsYWNlIHRoZQorICAgICBzaW1wbGUgcHJvYmUgYWJvdmUsIHNpbmNlIHRoaXMgc2hvdWxkIHRocm93IG91dCBtb3JlIG5vbi1zcXVhcmVzLCBidXQgYXQKKyAgICAgdGhlIGV4cGVuc2Ugb2Ygc29tZXdoYXQgbW9yZSBjeWNsZXMuICAqLworICB7CisgICAgbXBfbGltYl90IGxvOworICAgIGludCBjbnQ7CisgICAgbG8gPSB1cFswXTsKKyAgICB3aGlsZSAobG8gPT0gMCkKKyAgICAgIHVwKyssIGxvID0gdXBbMF0sIHVzaXplLS07CisgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgbG8pOworICAgIGlmICgoY250ICYgMSkgIT0gMCkKKyAgICAgIHJldHVybiAwOwkJCS8qIHJldHVybiBvZiBub3QgZXZlbiBtdWx0aXBsaWNpdHkgb2YgMiAqLworICAgIGxvID4+PSBjbnQ7CQkJLyogc2hpZnQgZG93biB0byBhbGlnbiBsb3dlc3Qgbm9uLXplcm8gYml0ICovCisgICAgaWYgKChsbyAmIDYpICE9IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCisKKworICAvKiBUaGUgc2Vjb25kIHRlc3QgdXNlcyBtcG5fbW9kXzM0bHN1YjEgb3IgbXBuX21vZF8xIHRvIGRldGVjdCBub24tc3F1YXJlcworICAgICBhY2NvcmRpbmcgdG8gdGhlaXIgcmVzaWR1ZXMgbW9kdWxvIHNtYWxsIHByaW1lcyAob3IgcG93ZXJzIG9mCisgICAgIHByaW1lcykuICBTZWUgcGVyZnNxci5oLiAgKi8KKyAgUEVSRlNRUl9NT0RfVEVTVCAodXAsIHVzaXplKTsKKworCisgIC8qIEZvciB0aGUgdGhpcmQgYW5kIGxhc3QgdGVzdCwgd2UgZmluYWxseSBjb21wdXRlIHRoZSBzcXVhcmUgcm9vdCwKKyAgICAgdG8gbWFrZSBzdXJlIHdlJ3ZlIHJlYWxseSBnb3QgYSBwZXJmZWN0IHNxdWFyZS4gICovCisgIHsKKyAgICBtcF9wdHIgcm9vdF9wdHI7CisgICAgaW50IHJlczsKKyAgICBUTVBfREVDTDsKKworICAgIFRNUF9NQVJLOworICAgIHJvb3RfcHRyID0gVE1QX0FMTE9DX0xJTUJTICgodXNpemUgKyAxKSAvIDIpOworCisgICAgLyogSWZmIG1wbl9zcXJ0cmVtIHJldHVybnMgemVybywgdGhlIHNxdWFyZSBpcyBwZXJmZWN0LiAgKi8KKyAgICByZXMgPSAhIG1wbl9zcXJ0cmVtIChyb290X3B0ciwgTlVMTCwgdXAsIHVzaXplKTsKKyAgICBUTVBfRlJFRTsKKworICAgIHJldHVybiByZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3BvcGhhbS5jIGIvbXBuL2dlbmVyaWMvcG9waGFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5NzRkNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3BvcGhhbS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBtcG5fcG9wY291bnQsIG1wbl9oYW1kaXN0IC0tIG1wbiBiaXQgcG9wdWxhdGlvbiBjb3VudC9oYW1taW5nIGRpc3RhbmNlLgorCitDb3B5cmlnaHQgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA1LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZiBPUEVSQVRJT05fcG9wY291bnQKKyNkZWZpbmUgRk5BTUUgbXBuX3BvcGNvdW50CisjZGVmaW5lIFBPUEhBTSh1LHYpIHUKKyNlbmRpZgorCisjaWYgT1BFUkFUSU9OX2hhbWRpc3QKKyNkZWZpbmUgRk5BTUUgbXBuX2hhbWRpc3QKKyNkZWZpbmUgUE9QSEFNKHUsdikgdSBeIHYKKyNlbmRpZgorCittcF9iaXRjbnRfdAorRk5BTUUgKG1wX3NyY3B0ciB1cCwKKyNpZiBPUEVSQVRJT05faGFtZGlzdAorICAgICAgIG1wX3NyY3B0ciB2cCwKKyNlbmRpZgorICAgICAgIG1wX3NpemVfdCBuKSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX2JpdGNudF90IHJlc3VsdCA9IDA7CisgIG1wX2xpbWJfdCBwMCwgcDEsIHAyLCBwMywgeCwgcDAxLCBwMjM7CisgIG1wX3NpemVfdCBpOworCisgIEFTU0VSVCAobiA+PSAxKTsJCS8qIEFjdHVhbGx5LCB0aGlzIGNvZGUgaGFuZGxlcyBhbnkgbiwgYnV0IHNvbWUKKwkJCQkgICBhc3NlbWJseSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90LiAgKi8KKworICBmb3IgKGkgPSBuID4+IDI7IGkgIT0gMDsgaS0tKQorICAgIHsKKyAgICAgIHAwID0gUE9QSEFNICh1cFswXSwgdnBbMF0pOworICAgICAgcDAgLT0gKHAwID4+IDEpICYgTVBfTElNQl9UX01BWC8zOwkJCQkvKiAyIDAtMiAqLworICAgICAgcDAgPSAoKHAwID4+IDIpICYgTVBfTElNQl9UX01BWC81KSArIChwMCAmIE1QX0xJTUJfVF9NQVgvNSk7CS8qIDQgMC00ICovCisKKyAgICAgIHAxID0gUE9QSEFNICh1cFsxXSwgdnBbMV0pOworICAgICAgcDEgLT0gKHAxID4+IDEpICYgTVBfTElNQl9UX01BWC8zOwkJCQkvKiAyIDAtMiAqLworICAgICAgcDEgPSAoKHAxID4+IDIpICYgTVBfTElNQl9UX01BWC81KSArIChwMSAmIE1QX0xJTUJfVF9NQVgvNSk7CS8qIDQgMC00ICovCisKKyAgICAgIHAwMSA9IHAwICsgcDE7CQkJCQkJCS8qIDggMC04ICovCisgICAgICBwMDEgPSAoKHAwMSA+PiA0KSAmIE1QX0xJTUJfVF9NQVgvMTcpICsgKHAwMSAmIE1QX0xJTUJfVF9NQVgvMTcpOwkvKiA4IDAtMTYgKi8KKworICAgICAgcDIgPSBQT1BIQU0gKHVwWzJdLCB2cFsyXSk7CisgICAgICBwMiAtPSAocDIgPj4gMSkgJiBNUF9MSU1CX1RfTUFYLzM7CQkJCS8qIDIgMC0yICovCisgICAgICBwMiA9ICgocDIgPj4gMikgJiBNUF9MSU1CX1RfTUFYLzUpICsgKHAyICYgTVBfTElNQl9UX01BWC81KTsJLyogNCAwLTQgKi8KKworICAgICAgcDMgPSBQT1BIQU0gKHVwWzNdLCB2cFszXSk7CisgICAgICBwMyAtPSAocDMgPj4gMSkgJiBNUF9MSU1CX1RfTUFYLzM7CQkJCS8qIDIgMC0yICovCisgICAgICBwMyA9ICgocDMgPj4gMikgJiBNUF9MSU1CX1RfTUFYLzUpICsgKHAzICYgTVBfTElNQl9UX01BWC81KTsJLyogNCAwLTQgKi8KKworICAgICAgcDIzID0gcDIgKyBwMzsJCQkJCQkJLyogOCAwLTggKi8KKyAgICAgIHAyMyA9ICgocDIzID4+IDQpICYgTVBfTElNQl9UX01BWC8xNykgKyAocDIzICYgTVBfTElNQl9UX01BWC8xNyk7CS8qIDggMC0xNiAqLworCisgICAgICB4ID0gcDAxICsgcDIzOwkJCQkJCQkvKiA4IDAtMzIgKi8KKyAgICAgIHggPSAoeCA+PiA4KSArIHg7CQkJCQkJCS8qIDggMC02NCAqLworICAgICAgeCA9ICh4ID4+IDE2KSArIHg7CQkJCQkJLyogOCAwLTEyOCAqLworI2lmIEdNUF9MSU1CX0JJVFMgPiAzMgorICAgICAgeCA9ICgoeCA+PiAzMikgJiAweGZmKSArICh4ICYgMHhmZik7CQkJCS8qIDggMC0yNTYgKi8KKyAgICAgIHJlc3VsdCArPSB4OworI2Vsc2UKKyAgICAgIHJlc3VsdCArPSB4ICYgMHhmZjsKKyNlbmRpZgorICAgICAgdXAgKz0gNDsKKyNpZiBPUEVSQVRJT05faGFtZGlzdAorICAgICAgdnAgKz0gNDsKKyNlbmRpZgorICAgIH0KKworICBuICY9IDM7CisgIGlmIChuICE9IDApCisgICAgeworICAgICAgeCA9IDA7CisgICAgICBkbworCXsKKwkgIHAwID0gUE9QSEFNICh1cFswXSwgdnBbMF0pOworCSAgcDAgLT0gKHAwID4+IDEpICYgTVBfTElNQl9UX01BWC8zOwkJCQkvKiAyIDAtMiAqLworCSAgcDAgPSAoKHAwID4+IDIpICYgTVBfTElNQl9UX01BWC81KSArIChwMCAmIE1QX0xJTUJfVF9NQVgvNSk7CS8qIDQgMC00ICovCisJICBwMCA9ICgocDAgPj4gNCkgKyBwMCkgJiBNUF9MSU1CX1RfTUFYLzE3OwkJCS8qIDggMC04ICovCisKKwkgIHggKz0gcDA7CisJICB1cCArPSAxOworI2lmIE9QRVJBVElPTl9oYW1kaXN0CisJICB2cCArPSAxOworI2VuZGlmCisJfQorICAgICAgd2hpbGUgKC0tbik7CisKKyAgICAgIHggPSAoeCA+PiA4KSArIHg7CisgICAgICB4ID0gKHggPj4gMTYpICsgeDsKKyNpZiBHTVBfTElNQl9CSVRTID4gMzIKKyAgICAgIHggPSAoeCA+PiAzMikgKyB4OworI2VuZGlmCisgICAgICByZXN1bHQgKz0geCAmIDB4ZmY7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9wb3dfMS5jIGIvbXBuL2dlbmVyaWMvcG93XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTExY2QyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcG93XzEuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogbXBuX3Bvd18xIC0tIENvbXB1dGUgcG93ZXJzIFIgPSBVXmV4cC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAyLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK21wX3NpemVfdAorbXBuX3Bvd18xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLCBtcF9saW1iX3QgZXhwLCBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCB4OworICBpbnQgY250LCBpOworICBtcF9zaXplX3Qgcm47CisgIGludCBwYXI7CisKKyAgQVNTRVJUIChibiA+PSAxKTsKKyAgLyogRklYTUU6IEFkZCBvcGVyYW5kIG92ZXJsYXAgY3JpdGVyaWEgKi8KKworICBpZiAoZXhwIDw9IDEpCisgICAgeworICAgICAgaWYgKGV4cCA9PSAwKQorCXsKKwkgIHJwWzBdID0gMTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fQ09QWSAocnAsIGJwLCBibik7CisJICByZXR1cm4gYm47CisJfQorICAgIH0KKworICAvKiBDb3VudCBudW1iZXIgb2YgYml0cyBpbiBleHAsIGFuZCBjb21wdXRlIHdoZXJlIHRvIHB1dCBpbml0aWFsIHNxdWFyZSBpbgorICAgICBvcmRlciB0byBtYWdpY2FsbHkgZ2V0IHJlc3VsdHMgaW4gdGhlIGVudHJ5IHJwLiAgVXNlIHNpbXBsZSBjb2RlLAorICAgICBvcHRpbWl6ZWQgZm9yIHNtYWxsIGV4cC4gIEZvciBsYXJnZSBleHAsIHRoZSBiaWdudW0gb3BlcmF0aW9ucyB3aWxsIHRha2UKKyAgICAgc28gbXVjaCB0aW1lIHRoYXQgdGhlIHNsb3duZXNzIG9mIHRoaXMgY29kZSB3aWxsIGJlIG5lZ2xpZ2libGUuICAqLworICBwYXIgPSAwOworICBjbnQgPSBHTVBfTElNQl9CSVRTOworICB4ID0gZXhwOworICBkbworICAgIHsKKyAgICAgIHBhciBePSB4OworICAgICAgY250LS07CisgICAgICB4ID4+PSAxOworICAgIH0gd2hpbGUgKHggIT0gMCk7CisgIGV4cCA8PD0gY250OworCisgIGlmIChibiA9PSAxKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBybCwgcmgsIGJsID0gYnBbMF07CisKKyAgICAgIGlmICgoY250ICYgMSkgIT0gMCkKKwlNUF9QVFJfU1dBUCAocnAsIHRwKTsKKworICAgICAgdW11bF9wcG1tIChyaCwgcmwsIGJsLCBibCA8PCBHTVBfTkFJTF9CSVRTKTsKKyAgICAgIHJwWzBdID0gcmwgPj4gR01QX05BSUxfQklUUzsKKyAgICAgIHJwWzFdID0gcmg7CisgICAgICBybiA9IDEgKyAocmggIT0gMCk7CisKKyAgICAgIGZvciAoaSA9IEdNUF9MSU1CX0JJVFMgLSBjbnQgLSAxOzspCisJeworCSAgZXhwIDw8PSAxOworCSAgaWYgKChleHAgJiBHTVBfTElNQl9ISUdIQklUKSAhPSAwKQorCSAgICB7CisJICAgICAgcnBbcm5dID0gcmggPSBtcG5fbXVsXzEgKHJwLCBycCwgcm4sIGJsKTsKKwkgICAgICBybiArPSByaCAhPSAwOworCSAgICB9CisKKwkgIGlmICgtLWkgPT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIG1wbl9zcXIgKHRwLCBycCwgcm4pOworCSAgcm4gPSAyICogcm47IHJuIC09IHRwW3JuIC0gMV0gPT0gMDsKKwkgIE1QX1BUUl9TV0FQIChycCwgdHApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKChwYXIgXiBjbnQpICYgMSkgPT0gMCkKKwlNUF9QVFJfU1dBUCAocnAsIHRwKTsKKworICAgICAgbXBuX3NxciAocnAsIGJwLCBibik7CisgICAgICBybiA9IDIgKiBibjsgcm4gLT0gcnBbcm4gLSAxXSA9PSAwOworCisgICAgICBmb3IgKGkgPSBHTVBfTElNQl9CSVRTIC0gY250IC0gMTs7KQorCXsKKwkgIGV4cCA8PD0gMTsKKwkgIGlmICgoZXhwICYgR01QX0xJTUJfSElHSEJJVCkgIT0gMCkKKwkgICAgeworCSAgICAgIHJuID0gcm4gKyBibiAtIChtcG5fbXVsICh0cCwgcnAsIHJuLCBicCwgYm4pID09IDApOworCSAgICAgIE1QX1BUUl9TV0FQIChycCwgdHApOworCSAgICB9CisKKwkgIGlmICgtLWkgPT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIG1wbl9zcXIgKHRwLCBycCwgcm4pOworCSAgcm4gPSAyICogcm47IHJuIC09IHRwW3JuIC0gMV0gPT0gMDsKKwkgIE1QX1BUUl9TV0FQIChycCwgdHApOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJuOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcG93bG8uYyBiL21wbi9nZW5lcmljL3Bvd2xvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwOTUxMgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Bvd2xvLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIG1wbl9wb3dsbyAtLSBDb21wdXRlIFIgPSBVXkUgbW9kIEJebiwgd2hlcmUgQiBpcyB0aGUgbGltYiBiYXNlLgorCitDb3B5cmlnaHQgMjAwNy0yMDA5LCAyMDEyLCAyMDE1LCAyMDE2LCAyMDE4LCAyMDIwIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKyNkZWZpbmUgZ2V0Yml0KHAsYmkpIFwKKyAgKChwWyhiaSAtIDEpIC8gR01QX0xJTUJfQklUU10gPj4gKGJpIC0gMSkgJSBHTVBfTElNQl9CSVRTKSAmIDEpCisKK3N0YXRpYyBpbmxpbmUgbXBfbGltYl90CitnZXRiaXRzIChjb25zdCBtcF9saW1iX3QgKnAsIG1wX2JpdGNudF90IGJpLCB1bnNpZ25lZCBuYml0cykKK3sKKyAgdW5zaWduZWQgbmJpdHNfaW5fcjsKKyAgbXBfbGltYl90IHI7CisgIG1wX3NpemVfdCBpOworCisgIGlmIChiaSA8PSBuYml0cykKKyAgICB7CisgICAgICByZXR1cm4gcFswXSAmICgoKG1wX2xpbWJfdCkgMSA8PCBiaSkgLSAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiaSAtPSBuYml0czsJCQkvKiBiaXQgaW5kZXggb2YgbG93IGJpdCB0byBleHRyYWN0ICovCisgICAgICBpID0gYmkgLyBHTVBfTlVNQl9CSVRTOwkJLyogd29yZCBpbmRleCBvZiBsb3cgYml0IHRvIGV4dHJhY3QgKi8KKyAgICAgIGJpICU9IEdNUF9OVU1CX0JJVFM7CQkvKiBiaXQgaW5kZXggaW4gbG93IHdvcmQgKi8KKyAgICAgIHIgPSBwW2ldID4+IGJpOwkJCS8qIGV4dHJhY3QgKGxvdykgYml0cyAqLworICAgICAgbmJpdHNfaW5fciA9IEdNUF9OVU1CX0JJVFMgLSBiaTsJLyogbnVtYmVyIG9mIGJpdHMgbm93IGluIHIgKi8KKyAgICAgIGlmIChuYml0c19pbl9yIDwgbmJpdHMpCQkvKiBkaWQgd2UgZ2V0IGVub3VnaCBiaXRzPyAqLworCXIgKz0gcFtpICsgMV0gPDwgbmJpdHNfaW5fcjsJLyogcHJlcGVuZCBiaXRzIGZyb20gaGlnaGVyIHdvcmQgKi8KKyAgICAgIHJldHVybiByICYgKCgobXBfbGltYl90KSAxIDw8IG5iaXRzKSAtIDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZAord2luX3NpemUgKG1wX2JpdGNudF90IGViKQoreworICB1bnNpZ25lZCBrOworICBzdGF0aWMgbXBfYml0Y250X3QgeFtdID0gezcsMjUsODEsMjQxLDY3MywxNzkzLDQ2MDksMTE1MjEsMjgxNjEsfihtcF9iaXRjbnRfdCkwfTsKKyAgQVNTRVJUIChlYiA+IDEpOworICBmb3IgKGsgPSAwOyBlYiA+IHhbaysrXTspCisgICAgOworICByZXR1cm4gazsKK30KKworLyogcnBbbi0xLi4wXSA9IGJwW24tMS4uMF0gXiBlcFtlbi0xLi4wXSBtb2QgQl5uLCBCIGlzIHRoZSBsaW1iIGJhc2UuCisgICBSZXF1aXJlcyB0aGF0IGVwW2VuLTFdIGlzIG5vbi16ZXJvLgorICAgVXNlcyBzY3JhdGNoIHNwYWNlIHRwWzNuLTEuLjBdLCBpLmUuLCAzbiB3b3Jkcy4gICovCisvKiBXZSBvbmx5IHVzZSBuIHdvcmRzIGluIHRoZSBzY3JhdGNoIHNwYWNlLCB3ZSBzaG91bGQgcGFzcyB0cCArIG4gdG8KKyAgIG11bGxvL3NxcmxvIGFzIGEgdGVtcG9yYXJ5IGFyZWEsIGl0IGlzIG5lZWRlZC4gKi8KK3ZvaWQKK21wbl9wb3dsbyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYnAsCisJICAgbXBfc3JjcHRyIGVwLCBtcF9zaXplX3QgZW4sCisJICAgbXBfc2l6ZV90IG4sIG1wX3B0ciB0cCkKK3sKKyAgdW5zaWduZWQgY250OworICBtcF9iaXRjbnRfdCBlYmk7CisgIHVuc2lnbmVkIHdpbmRvd3NpemUsIHRoaXNfd2luZG93c2l6ZTsKKyAgbXBfbGltYl90IGV4cGJpdHM7CisgIG1wX2xpbWJfdCAqcHA7CisgIGxvbmcgaTsKKyAgaW50IGZsaXBmbG9wOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGVuID4gMSB8fCAoZW4gPT0gMSAmJiBlcFswXSA+IDEpKTsKKworICBUTVBfTUFSSzsKKworICBNUE5fU0laRUlOQkFTRV8yRVhQKGViaSwgZXAsIGVuLCAxKTsKKworICB3aW5kb3dzaXplID0gd2luX3NpemUgKGViaSk7CisgIGlmICh3aW5kb3dzaXplID4gMSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgKnRoaXNfcHAsICpsYXN0X3BwOworICAgICAgQVNTRVJUICh3aW5kb3dzaXplIDwgZWJpKTsKKworICAgICAgcHAgPSBUTVBfQUxMT0NfTElNQlMgKChuIDw8ICh3aW5kb3dzaXplIC0gMSkpKTsKKworICAgICAgdGhpc19wcCA9IHBwOworCisgICAgICBNUE5fQ09QWSAodGhpc19wcCwgYnAsIG4pOworCisgICAgICAvKiBTdG9yZSBiXjIgaW4gdHAuICAqLworICAgICAgbXBuX3NxcmxvICh0cCwgYnAsIG4pOworCisgICAgICAvKiBQcmVjb21wdXRlIG9kZCBwb3dlcnMgb2YgYiBhbmQgcHV0IHRoZW0gaW4gdGhlIHRlbXBvcmFyeSBhcmVhIGF0IHBwLiAgKi8KKyAgICAgIGkgPSAoMSA8PCAod2luZG93c2l6ZSAtIDEpKSAtIDE7CisgICAgICBkbworCXsKKwkgIGxhc3RfcHAgPSB0aGlzX3BwOworCSAgdGhpc19wcCArPSBuOworCSAgbXBuX211bGxvX24gKHRoaXNfcHAsIGxhc3RfcHAsIHRwLCBuKTsKKwl9IHdoaWxlICgtLWkgIT0gMCk7CisKKyAgICAgIGV4cGJpdHMgPSBnZXRiaXRzIChlcCwgZWJpLCB3aW5kb3dzaXplKTsKKyAgICAgIGViaSAtPSB3aW5kb3dzaXplOworCisgICAgICAvKiBUSElOSzogU2hvdWxkIHdlIGluaXRpYWxpc2UgdGhlIGNhc2UgZXhwYml0cyAlIDQgPT0gMCB3aXRoIGEgbXVsbG8/ICovCisgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAoY250LCBleHBiaXRzKTsKKyAgICAgIGViaSArPSBjbnQ7CisgICAgICBleHBiaXRzID4+PSBjbnQ7CisKKyAgICAgIE1QTl9DT1BZIChycCwgcHAgKyBuICogKGV4cGJpdHMgPj4gMSksIG4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBwID0gdHAgKyBuOworICAgICAgTVBOX0NPUFkgKHBwLCBicCwgbik7CisgICAgICBNUE5fQ09QWSAocnAsIGJwLCBuKTsKKyAgICAgIC0tZWJpOworICAgIH0KKworICBmbGlwZmxvcCA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICB3aGlsZSAoZ2V0Yml0IChlcCwgZWJpKSA9PSAwKQorCXsKKwkgIG1wbl9zcXJsbyAodHAsIHJwLCBuKTsKKwkgIE1QX1BUUl9TV0FQIChycCwgdHApOworCSAgZmxpcGZsb3AgPSAhIGZsaXBmbG9wOworCSAgaWYgKC0tZWJpID09IDApCisJICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICAgIC8qIFRoZSBuZXh0IGJpdCBvZiB0aGUgZXhwb25lbnQgaXMgMS4gIE5vdyBleHRyYWN0IHRoZSBsYXJnZXN0IGJsb2NrIG9mCisJIGJpdHMgPD0gd2luZG93c2l6ZSwgYW5kIHN1Y2ggdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDEuICAqLworCisgICAgICBleHBiaXRzID0gZ2V0Yml0cyAoZXAsIGViaSwgd2luZG93c2l6ZSk7CisgICAgICB0aGlzX3dpbmRvd3NpemUgPSBNSU4gKHdpbmRvd3NpemUsIGViaSk7CisKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGV4cGJpdHMpOworICAgICAgdGhpc193aW5kb3dzaXplIC09IGNudDsKKyAgICAgIGViaSAtPSB0aGlzX3dpbmRvd3NpemU7CisgICAgICBleHBiaXRzID4+PSBjbnQ7CisKKyAgICAgIHdoaWxlICh0aGlzX3dpbmRvd3NpemUgPiAxKQorCXsKKwkgIG1wbl9zcXJsbyAodHAsIHJwLCBuKTsKKwkgIG1wbl9zcXJsbyAocnAsIHRwLCBuKTsKKwkgIHRoaXNfd2luZG93c2l6ZSAtPSAyOworCX0KKworICAgICAgaWYgKHRoaXNfd2luZG93c2l6ZSAhPSAwKQorCW1wbl9zcXJsbyAodHAsIHJwLCBuKTsKKyAgICAgIGVsc2UKKwl7CisJICBNUF9QVFJfU1dBUCAocnAsIHRwKTsKKwkgIGZsaXBmbG9wID0gISBmbGlwZmxvcDsKKwl9CisKKyAgICAgIG1wbl9tdWxsb19uIChycCwgdHAsIHBwICsgbiAqIChleHBiaXRzID4+IDEpLCBuKTsKKyAgICB9IHdoaWxlIChlYmkgIT0gMCk7CisKKyBkb25lOgorICBpZiAoZmxpcGZsb3ApCisgICAgTVBOX0NPUFkgKHRwLCBycCwgbik7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcG93bS5jIGIvbXBuL2dlbmVyaWMvcG93bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzBmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9wb3dtLmMKQEAgLTAsMCArMSwxMDAzIEBACisvKiBtcG5fcG93bSAtLSBDb21wdXRlIFIgPSBVXkUgbW9kIE0uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA3LTIwMTIsIDIwMTktMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKgorICBCQVNJQyBBTEdPUklUSE0sIENvbXB1dGUgVV5FIG1vZCBNLCB3aGVyZSBNIDwgQl5uIGlzIG9kZC4KKworICAxLiBXIDwtIFUKKworICAyLiBUIDwtIChCXm4gKiBVKSBtb2QgTSAgICAgICAgICAgICAgICBDb252ZXJ0IHRvIFJFREMgZm9ybQorCisgIDMuIENvbXB1dGUgdGFibGUgVV4xLCBVXjMsIFVeNS4uLiBvZiBFLWRlcGVuZGVudCBzaXplCisKKyAgNC4gV2hpbGUgdGhlcmUgYXJlIG1vcmUgYml0cyBpbiBFCisgICAgICAgVyA8LSBwb3dlciBsZWZ0LXRvLXJpZ2h0IGJhc2UtaworCisKKyAgVE9ETzoKKworICAgKiBNYWtlIGdldGJpdHMgYSBtYWNybywgdGhlcmVieSBhbGxvd2luZyBpdCB0byB1cGRhdGUgdGhlIGluZGV4IG9wZXJhbmQuCisgICAgIFRoYXQgd2lsbCBzaW1wbGlmeSB0aGUgY29kZSB1c2luZyBnZXRiaXRzLiAgKFBlcmhhcHMgbWFrZSBnZXRiaXRzJyBzaWJsaW5nCisgICAgIGdldGJpdCB0aGVuIGhhdmUgc2ltaWxhciBmb3JtLCBmb3Igc3ltbWV0cnkuKQorCisgICAqIFdyaXRlIGFuIGl0Y2ggZnVuY3Rpb24uICBPciBwZXJoYXBzIGdldCByaWQgb2YgdHAgcGFyYW1ldGVyIHNpbmNlIHRoZSBodWdlCisgICAgIHBwIGFyZWEgaXMgYWxsb2NhdGVkIGxvY2FsbHkgYW55d2F5PworCisgICAqIENob29zZSB3aW5kb3cgc2l6ZSB3aXRob3V0IGxvb3BpbmcuICAoU3VwZXJvcHRpbWl6ZSBvciB0aGluayh0bSkuKQorCisgICAqIEhhbmRsZSBzbWFsbCBiYXNlcyB3aXRoIGluaXRpYWwsIHJlZHVjdGlvbi1mcmVlIGV4cG9uZW50aWF0aW9uLgorCisgICAqIENhbGwgbmV3IGRpdmlzaW9uIGZ1bmN0aW9ucywgbm90IG1wbl90ZGl2X3FyLgorCisgICAqIENvbnNpZGVyIHNwZWNpYWwgY29kZSBmb3Igb25lLWxpbWIgTS4KKworICAgKiBIb3cgc2hvdWxkIHdlIGhhbmRsZSB0aGUgcmVkYzEvcmVkYzIvcmVkY19uIGNob2ljZT8KKyAgICAgLSByZWRjMTogIFQoYmludmVydF8xbGltYikgICsgZSAqIChuKSAgICogKFQobXVsbG8tMXgxKSArIG4qVChhZGRtdWxfMSkpCisgICAgIC0gcmVkYzI6ICBUKGJpbnZlcnRfMmxpbWJzKSArIGUgKiAobi8yKSAqIChUKG11bGxvLTJ4MikgKyBuKlQoYWRkbXVsXzIpKQorICAgICAtIHJlZGNfbjogVChiaW52ZXJ0X25saW1icykgKyBlICogKFQobXVsbG8tbnhuKSArIFQoTShuKSkpCisgICAgIFRoaXMgZGlzcmVnYXJkcyB0aGUgYWRkbXVsX04gY29uc3RhbnQgdGVybSwgYnV0IHdlIGNvdWxkIHRoaW5rIG9mCisgICAgIHRoYXQgYXMgcGFydCBvZiB0aGUgcmVzcGVjdGl2ZSBtdWxsby4KKworICAgKiBXaGVuIFUgKHRoZSBiYXNlKSBpcyBzbWFsbCwgd2Ugc2hvdWxkIHN0YXJ0IHRoZSBleHBvbmVudGlhdGlvbiB3aXRoIHBsYWluCisgICAgIG9wZXJhdGlvbnMsIHRoZW4gY29udmVydCB0aGF0IHBhcnRpYWwgcmVzdWx0IHRvIFJFREMgZm9ybS4KKworICAgKiBXaGVuIFUgaXMganVzdCBvbmUgbGltYiwgc2hvdWxkIGl0IGJlIGhhbmRsZWQgd2l0aG91dCB0aGUgay1hcnkgdHJpY2tzPworICAgICBXZSBjb3VsZCBrZWVwIGEgZmFjdG9yIG9mIEJebiBpbiBXLCBidXQgdXNlIFUnID0gQlUgYXMgYmFzZS4gIEFmdGVyCisgICAgIG11bHRpcGx5aW5nIGJ5IHRoaXMgKHBzZXVkbyB0d28tbGltYikgbnVtYmVyLCB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5IDEvQgorICAgICBtb2QgTS4KKyovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyN1bmRlZiBNUE5fUkVEQ18wCisjZGVmaW5lIE1QTl9SRURDXzAocjAsIHUxLCB1MCwgbTAsIGludm0pCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX3AxLCBfdTEsIF91MCwgX20wLCBfcjAsIF9kdW1teTsJCQkJXAorICAgIF91MCA9ICh1MCk7CQkJCQkJCQlcCisgICAgX20wID0gKG0wKTsJCQkJCQkJCVwKKyAgICB1bXVsX3BwbW0gKF9wMSwgX2R1bW15LCBfbTAsIChfdTAgKiAoaW52bSkpICYgR01QX05VTUJfTUFTSyk7CVwKKyAgICBBU1NFUlQgKCgoX3UwIC0gX2R1bW15KSAmIEdNUF9OVU1CX01BU0spID09IDApOwkJCVwKKyAgICBfdTEgPSAodTEpOwkJCQkJCQkJXAorICAgIF9yMCA9IF91MSAtIF9wMTsJCQkJCQkJXAorICAgIF9yMCA9IF91MSA8IF9wMSA/IF9yMCArIF9tMCA6IF9yMDsgLyogX3UxIDwgX3IwICovCQkJXAorICAgIChyMCkgPSBfcjAgJiBHTVBfTlVNQl9NQVNLOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI3VuZGVmIE1QTl9SRURDXzEKKyNpZiBIQVZFX05BVElWRV9tcG5fc2JwaTFfYmRpdl9yCisjZGVmaW5lIE1QTl9SRURDXzEocnAsIHVwLCBtcCwgbiwgaW52bSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgY3k7CQkJCQkJCVwKKyAgICBjeSA9IG1wbl9zYnBpMV9iZGl2X3IgKHVwLCAyICogbiwgbXAsIG4sIGludm0pOwkJCVwKKyAgICBpZiAoY3kgIT0gMCkJCQkJCQkJXAorICAgICAgbXBuX3N1Yl9uIChycCwgdXAgKyBuLCBtcCwgbik7CQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgTVBOX0NPUFkgKHJwLCB1cCArIG4sIG4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE1QTl9SRURDXzEocnAsIHVwLCBtcCwgbiwgaW52bSkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgY3k7CQkJCQkJCVwKKyAgICBjeSA9IG1wbl9yZWRjXzEgKHJwLCB1cCwgbXAsIG4sIGludm0pOwkJCQlcCisgICAgaWYgKGN5ICE9IDApCQkJCQkJCVwKKyAgICAgIG1wbl9zdWJfbiAocnAsIHJwLCBtcCwgbik7CQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI3VuZGVmIE1QTl9SRURDXzIKKyNkZWZpbmUgTVBOX1JFRENfMihycCwgdXAsIG1wLCBuLCBtaXApCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IGN5OwkJCQkJCQlcCisgICAgY3kgPSBtcG5fcmVkY18yIChycCwgdXAsIG1wLCBuLCBtaXApOwkJCQlcCisgICAgaWYgKGN5ICE9IDApCQkJCQkJCVwKKyAgICAgIG1wbl9zdWJfbiAocnAsIHJwLCBtcCwgbik7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzIgfHwgSEFWRV9OQVRJVkVfbXBuX3JlZGNfMgorI2RlZmluZSBXQU5UX1JFRENfMiAxCisjZW5kaWYKKworI2RlZmluZSBnZXRiaXQocCxiaSkgXAorICAoKHBbKGJpIC0gMSkgLyBHTVBfTElNQl9CSVRTXSA+PiAoYmkgLSAxKSAlIEdNUF9MSU1CX0JJVFMpICYgMSkKKworc3RhdGljIGlubGluZSBtcF9saW1iX3QKK2dldGJpdHMgKGNvbnN0IG1wX2xpbWJfdCAqcCwgbXBfYml0Y250X3QgYmksIGludCBuYml0cykKK3sKKyAgaW50IG5iaXRzX2luX3I7CisgIG1wX2xpbWJfdCByOworICBtcF9zaXplX3QgaTsKKworICBpZiAoYmkgPD0gbmJpdHMpCisgICAgeworICAgICAgcmV0dXJuIHBbMF0gJiAoKChtcF9saW1iX3QpIDEgPDwgYmkpIC0gMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYmkgLT0gbmJpdHM7CQkJLyogYml0IGluZGV4IG9mIGxvdyBiaXQgdG8gZXh0cmFjdCAqLworICAgICAgaSA9IGJpIC8gR01QX05VTUJfQklUUzsJCS8qIHdvcmQgaW5kZXggb2YgbG93IGJpdCB0byBleHRyYWN0ICovCisgICAgICBiaSAlPSBHTVBfTlVNQl9CSVRTOwkJLyogYml0IGluZGV4IGluIGxvdyB3b3JkICovCisgICAgICByID0gcFtpXSA+PiBiaTsJCQkvKiBleHRyYWN0IChsb3cpIGJpdHMgKi8KKyAgICAgIG5iaXRzX2luX3IgPSBHTVBfTlVNQl9CSVRTIC0gYmk7CS8qIG51bWJlciBvZiBiaXRzIG5vdyBpbiByICovCisgICAgICBpZiAobmJpdHNfaW5fciA8IG5iaXRzKQkJLyogZGlkIHdlIGdldCBlbm91Z2ggYml0cz8gKi8KKwlyICs9IHBbaSArIDFdIDw8IG5iaXRzX2luX3I7CS8qIHByZXBlbmQgYml0cyBmcm9tIGhpZ2hlciB3b3JkICovCisgICAgICByZXR1cm4gciAmICgoKG1wX2xpbWJfdCkgMSA8PCBuYml0cykgLSAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit3aW5fc2l6ZSAobXBfYml0Y250X3QgZWIpCit7CisgIGludCBrOworICBzdGF0aWMgbXBfYml0Y250X3QgeFtdID0gezcsMjUsODEsMjQxLDY3MywxNzkzLDQ2MDksMTE1MjEsMjgxNjEsfihtcF9iaXRjbnRfdCkwfTsKKyAgZm9yIChrID0gMDsgZWIgPiB4W2srK107ICkKKyAgICA7CisgIHJldHVybiBrOworfQorCisvKiBDb252ZXJ0IFUgdG8gUkVEQyBmb3JtLCBVX3IgPSBCXm4gKiBVIG1vZCBNICovCitzdGF0aWMgdm9pZAorcmVkY2lmeSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwgbXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfcHRyIHRwLCBxcDsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRNUF9BTExPQ19MSU1CU18yICh0cCwgdW4gKyBuLCBxcCwgdW4gKyAxKTsKKworICBNUE5fWkVSTyAodHAsIG4pOworICBNUE5fQ09QWSAodHAgKyBuLCB1cCwgdW4pOworICBtcG5fdGRpdl9xciAocXAsIHJwLCAwTCwgdHAsIHVuICsgbiwgbXAsIG4pOworICBUTVBfRlJFRTsKK30KKworI2lmICEgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbl9pcDIKKyN1bmRlZiBtcG5fcnNibHNoMV9uX2lwMgorI2lmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX24KKyNkZWZpbmUgbXBuX3JzYmxzaDFfbl9pcDIoYSxiLG4pCW1wbl9yc2Jsc2gxX24oYSxiLGEsbikKKyNlbHNlCisjZGVmaW5lIG1wbl9yc2Jsc2gxX25faXAyKGEsYixuKQkJCQlcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgbXBuX2xzaGlmdCAoYSwgYSwgbiwgMSk7CQkJCQlcCisgICAgICBtcG5fc3ViX24gKGEsIGEsIGIsIG4pOwkJCQkJXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIElOTkVSTE9PUDIJCQkJCQlcCisgIGRvCQkJCQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgTVBOX1NRUiAodHAsIHJwLCBuKTsJCQkJCVwKKyAgICAgIE1QTl9SRURVQ0UgKHJwLCB0cCwgbXAsIG4sIG1pcCk7CQkJCVwKKyAgICAgIGlmIChtcG5fY21wIChycCwgbXAsIG4pID49IDApCQkJCVwKKwlBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChycCwgcnAsIG1wLCBuKSk7CQlcCisgICAgICBpZiAoZ2V0Yml0IChlcCwgZWJpKSAhPSAwKQkJCQlcCisJewkJCQkJCQlcCisJICBpZiAocnBbbiAtIDFdID4+IChtYmkgLSAxKSAlIEdNUF9MSU1CX0JJVFMgPT0gMCkJXAorCSAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2xzaGlmdCAocnAsIHJwLCBuLCAxKSk7CQlcCisJICBlbHNlCQkJCQkJCVwKKwkgICAgbXBuX3JzYmxzaDFfbl9pcDIgKHJwLCBtcCwgbik7CQkJXAorCX0JCQkJCQkJXAorICAgIH0gd2hpbGUgKC0tZWJpICE9IDApCisKKy8qIHJwW24tMS4uMF0gPSAyIF4gZXBbZW4tMS4uMF0gbW9kIG1wW24tMS4uMF0KKyAgIFJlcXVpcmVzIHRoYXQgbXBbbi0xLi4wXSBpcyBvZGQgYW5kID4gMS4KKyAgIFJlcXVpcmVzIHRoYXQgZXBbZW4tMS4uMF0gaXMgPiAxLgorICAgVXNlcyBzY3JhdGNoIHNwYWNlIGF0IHRwIG9mIE1BWChtcG5fYmludmVydF9pdGNoKG4pLDJuKSBsaW1icy4gICovCitzdGF0aWMgdm9pZAorbXBuXzJwb3dtIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBlcCwgbXBfc2l6ZV90IGVuLAorCSAgbXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbiwgbXBfcHRyIHRwKQoreworICBtcF9saW1iX3QgaXBbMl0sICptaXA7CisgIG1wX2JpdGNudF90IGViaSwgbWJpLCB0Ymk7CisgIG1wX3NpemVfdCB0bjsKKyAgaW50IGNvdW50OworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGVuID4gMSB8fCAoZW4gPT0gMSAmJiBlcFswXSA+IDEpKTsKKyAgQVNTRVJUIChuID4gMCAmJiAobXBbMF0gJiAxKSAhPSAwKTsKKworICBNUE5fU0laRUlOQkFTRV8yRVhQKGViaSwgZXAsIGVuLCAxKTsKKyAgTVBOX1NJWkVJTkJBU0VfMkVYUChtYmksIG1wLCBuLCAxKTsKKworICBpZiAoTElLRUxZIChtYmkgPD0gR01QX05VTUJfTUFYKSkKKyAgICB7CisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCAobXBfbGltYl90KSBtYmkpOworICAgICAgY291bnQgPSBHTVBfTlVNQl9CSVRTIC0gKGNvdW50IC0gR01QX05BSUxfQklUUyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfYml0Y250X3QgdGMgPSBtYmk7CisKKyAgICAgIGNvdW50ID0gMDsKKyAgICAgIGRvIHsgKytjb3VudDsgfSB3aGlsZSAoKHRjID4+PSAxKSAhPSAwKTsKKyAgICB9CisKKyAgdGJpID0gZ2V0Yml0cyAoZXAsIGViaSwgY291bnQpOworICBpZiAodGJpID49IG1iaSkKKyAgICB7CisgICAgICAtLWNvdW50OworICAgICAgQVNTRVJUICgodGJpID4+IGNvdW50KSA9PSAxKTsKKyAgICAgIHRiaSA+Pj0gMTsKKyAgICAgIEFTU0VSVCAodGJpIDwgbWJpKTsKKyAgICAgIEFTU0VSVCAoZWJpID4gY291bnQpOworICAgIH0KKyAgZWxzZSBpZiAoZWJpIDw9IGNvdW50KQorICAgIHsKKyAgICAgIE1QTl9GSUxMIChycCwgbiwgMCk7CisgICAgICBycFt0YmkgLyBHTVBfTElNQl9CSVRTXSA9IENOU1RfTElNQiAoMSkgPDwgKHRiaSAlIEdNUF9MSU1CX0JJVFMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWJpIC09IGNvdW50OworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgbXBfbGltYl90IHIwLCBtMCwgaW52bTsKKyAgICAgIG0wID0gKm1wOworCisgICAgICAvKiByZWRjaWZ5IChycCwgdHAsIHRuICsgMSwgbXAsIG4pOyAqLworICAgICAgLyogVE9ETzogdGVzdCBkaXJlY3QgdXNlIG9mIHVkaXZfcXJubmQgKi8KKyAgICAgIEFTU0VSVCAodGJpIDwgR01QX0xJTUJfQklUUyk7CisgICAgICB0cFsxXSA9IENOU1RfTElNQiAoMSkgPDwgdGJpOworICAgICAgdHBbMF0gPSBDTlNUX0xJTUIgKDApOworICAgICAgcjAgPSBtcG5fbW9kXzEgKHRwLCAyLCBtMCk7CisKKyAgICAgIGJpbnZlcnRfbGltYiAoaW52bSwgbTApOworICAgICAgZG8KKwl7CisJICBtcF9saW1iX3QgdDAsIHQxLCB0MjsKKwkgIC8qIE1QTl9TUVIgKHRwLCBycCwgbik7CQkJKi8KKwkgIHVtdWxfcHBtbSAodDEsIHQwLCByMCwgcjApOworCSAgLyogTVBOX1JFRFVDRSAocnAsIHRwLCBtcCwgbiwgbWlwKTsJCSovCisJICBNUE5fUkVEQ18wKHIwLCB0MSwgdDAsIG0wLCBpbnZtKTsKKworCSAgdDIgPSByMCA8PCAxOworCSAgdDIgPSByMCA+IChtMCA+PiAxKSA/IHQyIC0gbTAgOiB0MjsKKwkgIHIwID0gZ2V0Yml0IChlcCwgZWJpKSAhPSAwID8gdDIgOiByMDsKKwl9IHdoaWxlICgtLWViaSAhPSAwKTsKKworICAgICAgLyogdHBbMV0gPSAwOyB0cFswXSA9IHIwOwkqLworICAgICAgLyogTVBOX1JFRFVDRSAocnAsIHRwLCBtcCwgbiwgbWlwKTsJKi8KKyAgICAgIE1QTl9SRURDXzAoKnJwLCAwLCByMCwgbTAsIGludm0pOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIFRNUF9NQVJLOworCisjaWYgV0FOVF9SRURDXzIKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1pcCA9IGlwOworICAgICAgYmludmVydF9saW1iIChpcFswXSwgbXBbMF0pOworICAgICAgaXBbMF0gPSAtaXBbMF07CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMl9UT19SRURDX05fVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtaXAgPSBpcDsKKyAgICAgIG1wbl9iaW52ZXJ0IChpcCwgbXAsIDIsIHRwKTsKKyAgICAgIGlwWzBdID0gLWlwWzBdOyBpcFsxXSA9IH5pcFsxXTsKKyAgICB9CisjZWxzZQorICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbWlwID0gaXA7CisgICAgICBiaW52ZXJ0X2xpbWIgKGlwWzBdLCBtcFswXSk7CisgICAgICBpcFswXSA9IC1pcFswXTsKKyAgICB9CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIG1pcCA9IFRNUF9BTExPQ19MSU1CUyAobik7CisgICAgICBtcG5fYmludmVydCAobWlwLCBtcCwgbiwgdHApOworICAgIH0KKworICB0biA9IHRiaSAvIEdNUF9MSU1CX0JJVFM7CisgIE1QTl9aRVJPICh0cCwgdG4pOworICB0cFt0bl0gPSBDTlNUX0xJTUIgKDEpIDw8ICh0YmkgJSBHTVBfTElNQl9CSVRTKTsKKworICByZWRjaWZ5IChycCwgdHAsIHRuICsgMSwgbXAsIG4pOworCisjaWYgV0FOVF9SRURDXzIKKyAgaWYgKFJFRENfMV9UT19SRURDXzJfVEhSRVNIT0xEIDwgTVVMX1RPT00yMl9USFJFU0hPTEQpCisgICAgeworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QMjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChNVUxfVE9PTTIyX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzIgKHJwLCB0cCwgbXAsIG4sIG1pcCkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApCisJICAgICAgSU5ORVJMT09QMjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApCisJICBJTk5FUkxPT1AyOworCX0KKyAgICAgIGVsc2UKKwl7CisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJbXBuX3JlZGNfbiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChNVUxfVE9PTTIyX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QMjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICBJTk5FUkxPT1AyOworCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApCisJICBJTk5FUkxPT1AyOworCX0KKyAgICAgIGVsc2UKKwl7CisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJbXBuX3JlZGNfbiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QMjsKKwl9CisgICAgfQorCisjZWxzZSAgLyogV0FOVF9SRURDXzIgKi8KKworICBpZiAoUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQgPCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKFJFRENfMV9UT19SRURDX05fVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMSAocnAsIHRwLCBtcCwgbiwgbWlwWzBdKQorCSAgICAgIElOTkVSTE9PUDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3Nxcl9iYXNlY2FzZSAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKE1VTF9UT09NMjJfVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJbXBuX3JlZGNfbiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgICAgIElOTkVSTE9PUDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3Nxcl9iYXNlY2FzZSAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCW1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQltcG5fcmVkY19uIChycCwgdHAsIG1wLCBuLCBtaXApCisJICBJTk5FUkxPT1AyOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKE1VTF9UT09NMjJfVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMSAocnAsIHRwLCBtcCwgbiwgbWlwWzBdKQorCSAgICAgIElOTkVSTE9PUDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3Nxcl9iYXNlY2FzZSAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1AyOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisJeworI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3NxciAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgIElOTkVSTE9PUDI7CisJfQorICAgICAgZWxzZQorCXsKKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQltcG5fcmVkY19uIChycCwgdHAsIG1wLCBuLCBtaXApCisJICBJTk5FUkxPT1AyOworCX0KKyAgICB9CisjZW5kaWYgIC8qIFdBTlRfUkVEQ18yICovCisKKyAgTVBOX0NPUFkgKHRwLCBycCwgbik7CisgIE1QTl9GSUxMICh0cCArIG4sIG4sIDApOworCisjaWYgV0FOVF9SRURDXzIKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorICAgIE1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIGlwWzBdKTsKKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzJfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisgICAgTVBOX1JFRENfMiAocnAsIHRwLCBtcCwgbiwgbWlwKTsKKyNlbHNlCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMV9UT19SRURDX05fVEhSRVNIT0xEKSkKKyAgICBNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBpcFswXSk7CisjZW5kaWYKKyAgZWxzZQorICAgIG1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCk7CisKKyAgaWYgKG1wbl9jbXAgKHJwLCBtcCwgbikgPj0gMCkKKyAgICBtcG5fc3ViX24gKHJwLCBycCwgbXAsIG4pOworCisgIFRNUF9GUkVFOworfQorCisvKiBycFtuLTEuLjBdID0gYnBbYm4tMS4uMF0gXiBlcFtlbi0xLi4wXSBtb2QgbXBbbi0xLi4wXQorICAgUmVxdWlyZXMgdGhhdCBtcFtuLTEuLjBdIGlzIG9kZC4KKyAgIFJlcXVpcmVzIHRoYXQgZXBbZW4tMS4uMF0gaXMgPiAxLgorICAgVXNlcyBzY3JhdGNoIHNwYWNlIGF0IHRwIG9mIE1BWChtcG5fYmludmVydF9pdGNoKG4pLDJuKSBsaW1icy4gICovCit2b2lkCittcG5fcG93bSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwKKwkgIG1wX3NyY3B0ciBlcCwgbXBfc2l6ZV90IGVuLAorCSAgbXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbiwgbXBfcHRyIHRwKQoreworICBtcF9saW1iX3QgaXBbMl0sICptaXA7CisgIGludCBjbnQ7CisgIG1wX2JpdGNudF90IGViaTsKKyAgaW50IHdpbmRvd3NpemUsIHRoaXNfd2luZG93c2l6ZTsKKyAgbXBfbGltYl90IGV4cGJpdHM7CisgIG1wX3B0ciBwcCwgdGhpc19wcDsKKyAgbG9uZyBpOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGVuID4gMSB8fCAoZW4gPT0gMSAmJiBlcFswXSA+IDEpKTsKKyAgQVNTRVJUIChuID49IDEgJiYgKChtcFswXSAmIDEpICE9IDApKTsKKworICBpZiAoYm4gPT0gMSAmJiBicFswXSA9PSAyKQorICAgIHsKKyAgICAgIG1wbl8ycG93bSAocnAsIGVwLCBlbiwgbXAsIG4sIHRwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisKKyAgTVBOX1NJWkVJTkJBU0VfMkVYUChlYmksIGVwLCBlbiwgMSk7CisKKyNpZiAwCisgIGlmIChibiA8IG4pCisgICAgeworICAgICAgLyogRG8gdGhlIGZpcnN0IGZldyBleHBvbmVudCBiaXRzIHdpdGhvdXQgbW9kIHJlZHVjdGlvbnMsCisJIHVudGlsIHRoZSByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBtb2QgYXJndW1lbnQuICAqLworICAgICAgZm9yICg7OykKKwl7CisJICBtcG5fc3FyICh0cCwgdGhpc19wcCwgdG4pOworCSAgdG4gPSB0biAqIDIgLSAxLCAgdG4gKz0gdHBbdG5dICE9IDA7CisJICBpZiAoZ2V0Yml0IChlcCwgZWJpKSAhPSAwKQorCSAgICBtcG5fbXVsICguLi4sIHRwLCB0biwgYnAsIGJuKTsKKwkgIGViaS0tOworCX0KKyAgICB9CisjZW5kaWYKKworICB3aW5kb3dzaXplID0gd2luX3NpemUgKGViaSk7CisKKyNpZiBXQU5UX1JFRENfMgorICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbWlwID0gaXA7CisgICAgICBiaW52ZXJ0X2xpbWIgKG1pcFswXSwgbXBbMF0pOworICAgICAgbWlwWzBdID0gLW1pcFswXTsKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1pcCA9IGlwOworICAgICAgbXBuX2JpbnZlcnQgKG1pcCwgbXAsIDIsIHRwKTsKKyAgICAgIG1pcFswXSA9IC1taXBbMF07IG1pcFsxXSA9IH5taXBbMV07CisgICAgfQorI2Vsc2UKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1pcCA9IGlwOworICAgICAgYmludmVydF9saW1iIChtaXBbMF0sIG1wWzBdKTsKKyAgICAgIG1pcFswXSA9IC1taXBbMF07CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICB7CisgICAgICBtaXAgPSBUTVBfQUxMT0NfTElNQlMgKG4pOworICAgICAgbXBuX2JpbnZlcnQgKG1pcCwgbXAsIG4sIHRwKTsKKyAgICB9CisKKyAgcHAgPSBUTVBfQUxMT0NfTElNQlMgKG4gPDwgKHdpbmRvd3NpemUgLSAxKSk7CisKKyAgdGhpc19wcCA9IHBwOworICByZWRjaWZ5ICh0aGlzX3BwLCBicCwgYm4sIG1wLCBuKTsKKworICAvKiBTdG9yZSBiXjIgYXQgcnAuICAqLworICBtcG5fc3FyICh0cCwgdGhpc19wcCwgbik7CisjaWYgMAorICBpZiAobiA9PSAxKSB7CisgICAgTVBOX1JFRENfMCAocnBbMF0sIHRwWzFdLCB0cFswXSwgbXBbMF0sIC1taXBbMF0pOworICB9IGVsc2UKKyNlbmRpZgorI2lmIFdBTlRfUkVEQ18yCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMV9UT19SRURDXzJfVEhSRVNIT0xEKSkKKyAgICBNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pOworICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMl9UT19SRURDX05fVEhSRVNIT0xEKSkKKyAgICBNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApOworI2Vsc2UKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQpKQorICAgIE1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSk7CisjZW5kaWYKKyAgZWxzZQorICAgIG1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCk7CisKKyAgLyogUHJlY29tcHV0ZSBvZGQgcG93ZXJzIG9mIGIgYW5kIHB1dCB0aGVtIGluIHRoZSB0ZW1wb3JhcnkgYXJlYSBhdCBwcC4gICovCisgIGZvciAoaSA9ICgxIDw8ICh3aW5kb3dzaXplIC0gMSkpIC0gMTsgaSA+IDA7IGktLSkKKyNpZiAxCisgICAgaWYgKG4gPT0gMSkgeworICAgICAgdW11bF9wcG1tKCh0cClbMV0sICoodHApLCAqKHRoaXNfcHApLCAqKHJwKSk7CisgICAgICArK3RoaXNfcHAgOworICAgICAgTVBOX1JFRENfMCAoKnRoaXNfcHAsIHRwWzFdLCB0cFswXSwgKm1wLCAtbWlwWzBdKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIG1wbl9tdWxfbiAodHAsIHRoaXNfcHAsIHJwLCBuKTsKKyAgICAgIHRoaXNfcHAgKz0gbjsKKyNpZiBXQU5UX1JFRENfMgorICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorCU1QTl9SRURDXzEgKHRoaXNfcHAsIHRwLCBtcCwgbiwgbWlwWzBdKTsKKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorCU1QTl9SRURDXzIgKHRoaXNfcHAsIHRwLCBtcCwgbiwgbWlwKTsKKyNlbHNlCisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisJTVBOX1JFRENfMSAodGhpc19wcCwgdHAsIG1wLCBuLCBtaXBbMF0pOworI2VuZGlmCisgICAgICBlbHNlCisJbXBuX3JlZGNfbiAodGhpc19wcCwgdHAsIG1wLCBuLCBtaXApOworICAgIH0KKworICBleHBiaXRzID0gZ2V0Yml0cyAoZXAsIGViaSwgd2luZG93c2l6ZSk7CisgIGViaSAtPSB3aW5kb3dzaXplOworCisgIC8qIFRISU5LOiBTaG91bGQgd2UgaW5pdGlhbGlzZSB0aGUgY2FzZSBleHBiaXRzICUgNCA9PSAwIHdpdGggYSBtdWw/ICovCisgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGV4cGJpdHMpOworICBlYmkgKz0gY250OworICBleHBiaXRzID4+PSBjbnQ7CisKKyAgTVBOX0NPUFkgKHJwLCBwcCArIG4gKiAoZXhwYml0cyA+PiAxKSwgbik7CisKKyNkZWZpbmUgSU5ORVJMT09QCQkJCQkJCVwKKyAgd2hpbGUgKGViaSAhPSAwKQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIHdoaWxlIChnZXRiaXQgKGVwLCBlYmkpID09IDApCQkJCQlcCisJewkJCQkJCQkJXAorCSAgTVBOX1NRUiAodHAsIHJwLCBuKTsJCQkJCQlcCisJICBNUE5fUkVEVUNFIChycCwgdHAsIG1wLCBuLCBtaXApOwkJCQlcCisJICBpZiAoLS1lYmkgPT0gMCkJCQkJCQlcCisJICAgIGdvdG8gZG9uZTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAgIC8qIFRoZSBuZXh0IGJpdCBvZiB0aGUgZXhwb25lbnQgaXMgMS4gIE5vdyBleHRyYWN0IHRoZSBsYXJnZXN0CVwKKwkgYmxvY2sgb2YgYml0cyA8PSB3aW5kb3dzaXplLCBhbmQgc3VjaCB0aGF0IHRoZSBsZWFzdAkJXAorCSBzaWduaWZpY2FudCBiaXQgaXMgMS4gICovCQkJCQlcCisJCQkJCQkJCQlcCisgICAgICBleHBiaXRzID0gZ2V0Yml0cyAoZXAsIGViaSwgd2luZG93c2l6ZSk7CQkJCVwKKyAgICAgIHRoaXNfd2luZG93c2l6ZSA9IE1JTiAoZWJpLCB3aW5kb3dzaXplKTsJCQkJXAorCQkJCQkJCQkJXAorICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgZXhwYml0cyk7CQkJCVwKKyAgICAgIHRoaXNfd2luZG93c2l6ZSAtPSBjbnQ7CQkJCQkJXAorICAgICAgZWJpIC09IHRoaXNfd2luZG93c2l6ZTsJCQkJCQlcCisgICAgICBleHBiaXRzID4+PSBjbnQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAgIGRvCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgTVBOX1NRUiAodHAsIHJwLCBuKTsJCQkJCQlcCisJICBNUE5fUkVEVUNFIChycCwgdHAsIG1wLCBuLCBtaXApOwkJCQlcCisJfQkJCQkJCQkJXAorICAgICAgd2hpbGUgKC0tdGhpc193aW5kb3dzaXplICE9IDApOwkJCQkJXAorCQkJCQkJCQkJXAorICAgICAgTVBOX01VTF9OICh0cCwgcnAsIHBwICsgbiAqIChleHBiaXRzID4+IDEpLCBuKTsJCQlcCisgICAgICBNUE5fUkVEVUNFIChycCwgdHAsIG1wLCBuLCBtaXApOwkJCQkJXAorICAgIH0KKworCisgIGlmIChuID09IDEpCisgICAgeworI3VuZGVmIE1QTl9NVUxfTgorI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9NVUxfTihyLGEsYixuKQkJdW11bF9wcG1tKChyKVsxXSwgKihyKSwgKihhKSwgKihiKSkKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQl1bXVsX3BwbW0oKHIpWzFdLCAqKHIpLCAqKGEpLCAqKGEpKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18wKCoocnApLCAodHApWzFdLCAodHApWzBdLCAqKG1wKSwgLSAqKG1pcCkpCisgICAgICBJTk5FUkxPT1A7CisgICAgfQorICBlbHNlCisjaWYgV0FOVF9SRURDXzIKKyAgaWYgKFJFRENfMV9UT19SRURDXzJfVEhSRVNIT0xEIDwgTVVMX1RPT00yMl9USFJFU0hPTEQpCisgICAgeworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX01VTF9OCisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX01VTF9OKHIsYSxiLG4pCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixiLG4pCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyX2Jhc2VjYXNlIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMSAocnAsIHRwLCBtcCwgbiwgbWlwWzBdKQorCSAgICAgIElOTkVSTE9PUDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChNVUxfVE9PTTIyX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX01VTF9OCisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX01VTF9OKHIsYSxiLG4pCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixiLG4pCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyX2Jhc2VjYXNlIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgICAgIElOTkVSTE9PUDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfbiAocixhLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QOworCX0KKyAgICAgIGVsc2UKKwl7CisjdW5kZWYgTVBOX01VTF9OCisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX01VTF9OKHIsYSxiLG4pCQltcG5fbXVsX24gKHIsYSxiLG4pCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3NxciAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCW1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCkKKwkgIElOTkVSTE9PUDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQorCXsKKwkgIGlmIChNVUxfVE9PTTIyX1RIUkVTSE9MRCA8IFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQKKwkgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpKQorCSAgICB7CisjdW5kZWYgTVBOX01VTF9OCisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX01VTF9OKHIsYSxiLG4pCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixiLG4pCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyX2Jhc2VjYXNlIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMSAocnAsIHRwLCBtcCwgbiwgbWlwWzBdKQorCSAgICAgIElOTkVSTE9PUDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfbiAocixhLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMSAocnAsIHRwLCBtcCwgbiwgbWlwWzBdKQorCSAgSU5ORVJMT09QOworCX0KKyAgICAgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQpKQorCXsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfbiAocixhLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QOworCX0KKyAgICAgIGVsc2UKKwl7CisjdW5kZWYgTVBOX01VTF9OCisjdW5kZWYgTVBOX1NRUgorI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX01VTF9OKHIsYSxiLG4pCQltcG5fbXVsX24gKHIsYSxiLG4pCisjZGVmaW5lIE1QTl9TUVIocixhLG4pCQkJbXBuX3NxciAocixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCW1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCkKKwkgIElOTkVSTE9PUDsKKwl9CisgICAgfQorCisjZWxzZSAgLyogV0FOVF9SRURDXzIgKi8KKworICBpZiAoUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQgPCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKFJFRENfMV9UT19SRURDX05fVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1A7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9NVUxfTgorI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9NVUxfTihyLGEsYixuKQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYixuKQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKE1VTF9UT09NMjJfVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCW1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCkKKwkgICAgICBJTk5FUkxPT1A7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9NVUxfTgorI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9NVUxfTihyLGEsYixuKQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYixuKQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQltcG5fcmVkY19uIChycCwgdHAsIG1wLCBuLCBtaXApCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfbiAocixhLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJbXBuX3JlZGNfbiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCisJeworCSAgaWYgKE1VTF9UT09NMjJfVEhSRVNIT0xEIDwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRAorCSAgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisJICAgIHsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfYmFzZWNhc2UgKHIsYSxuLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fbXVsX2Jhc2VjYXNlIChyLGEsbixhLG4pCisjZGVmaW5lIE1QTl9SRURVQ0UocnAsdHAsbXAsbixtaXApCU1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKwkgICAgICBJTk5FUkxPT1A7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworI3VuZGVmIE1QTl9NVUxfTgorI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9NVUxfTihyLGEsYixuKQkJbXBuX211bF9iYXNlY2FzZSAocixhLG4sYixuKQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXJfYmFzZWNhc2UgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICAgICAgSU5ORVJMT09QOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ19OX1RIUkVTSE9MRCkpCisJeworI3VuZGVmIE1QTl9NVUxfTgorI3VuZGVmIE1QTl9TUVIKKyN1bmRlZiBNUE5fUkVEVUNFCisjZGVmaW5lIE1QTl9NVUxfTihyLGEsYixuKQkJbXBuX211bF9uIChyLGEsYixuKQorI2RlZmluZSBNUE5fU1FSKHIsYSxuKQkJCW1wbl9zcXIgKHIsYSxuKQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pCisJICBJTk5FUkxPT1A7CisJfQorICAgICAgZWxzZQorCXsKKyN1bmRlZiBNUE5fTVVMX04KKyN1bmRlZiBNUE5fU1FSCisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fTVVMX04ocixhLGIsbikJCW1wbl9tdWxfbiAocixhLGIsbikKKyNkZWZpbmUgTVBOX1NRUihyLGEsbikJCQltcG5fc3FyIChyLGEsbikKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJbXBuX3JlZGNfbiAocnAsIHRwLCBtcCwgbiwgbWlwKQorCSAgSU5ORVJMT09QOworCX0KKyAgICB9CisjZW5kaWYgIC8qIFdBTlRfUkVEQ18yICovCisKKyBkb25lOgorCisgIE1QTl9DT1BZICh0cCwgcnAsIG4pOworICBNUE5fWkVSTyAodHAgKyBuLCBuKTsKKworI2lmIFdBTlRfUkVEQ18yCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMV9UT19SRURDXzJfVEhSRVNIT0xEKSkKKyAgICBNUE5fUkVEQ18xIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pOworICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFJFRENfMl9UT19SRURDX05fVEhSRVNIT0xEKSkKKyAgICBNUE5fUkVEQ18yIChycCwgdHAsIG1wLCBuLCBtaXApOworI2Vsc2UKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfTl9USFJFU0hPTEQpKQorICAgIE1QTl9SRURDXzEgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSk7CisjZW5kaWYKKyAgZWxzZQorICAgIG1wbl9yZWRjX24gKHJwLCB0cCwgbXAsIG4sIG1pcCk7CisKKyAgaWYgKG1wbl9jbXAgKHJwLCBtcCwgbikgPj0gMCkKKyAgICBtcG5fc3ViX24gKHJwLCBycCwgbXAsIG4pOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcHJlX2RpdnJlbV8xLmMgYi9tcG4vZ2VuZXJpYy9wcmVfZGl2cmVtXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI5ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcHJlX2RpdnJlbV8xLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIG1wbl9wcmVpbnZfZGl2cmVtXzEgLS0gbXBuIGJ5IGxpbWIgZGl2aXNpb24gd2l0aCBwcmUtaW52ZXJ0ZWQgZGl2aXNvci4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogRG9uJ3QgYmxvYXQgYSBzaGFyZWQgbGlicmFyeSB3aXRoIHVudXNlZCBjb2RlLiAqLworI2lmIFVTRV9QUkVJTlZfRElWUkVNXzEKKworLyogU2FtZSB0ZXN0IGhlcmUgZm9yIHNraXBwaW5nIG9uZSBkaXZpZGUgc3RlcCBhcyBpbiBtcG5fZGl2cmVtXzEuCisKKyAgIFRoZSBtYWluIHJlYXNvbiBmb3IgYSBzZXBhcmF0ZSBzaGlmdD09MCBjYXNlIGlzIHRoYXQgbm90IGFsbCBDUFVzIGdpdmUKKyAgIHplcm8gZm9yICJuMCA+PiBHTVBfTElNQl9CSVRTIiB3aGljaCB3b3VsZCBhcmlzZSBpbiB0aGUgZ2VuZXJhbCBjYXNlCisgICBjb2RlIHVzZWQgb24gc2hpZnQ9PTAuICBzaGlmdD09MCBpcyBhbHNvIHJlYXNvbmFibHkgY29tbW9uIGluIG1wX2Jhc2VzCisgICBiaWdfYmFzZSwgZm9yIGluc3RhbmNlIGJhc2U9PTEwIG9uIGEgNjQtYml0IGxpbWIuCisKKyAgIFVuZGVyIHNoaWZ0IT0wIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNhbGwgbXBuX2xzaGlmdCB0byBhZGp1c3QgdGhlCisgICBkaXZpZGVuZCBhbGwgaW4gb25lIGdvIChpbnRvIHRoZSBxdW90aWVudCBzcGFjZSBzYXkpLCByYXRoZXIgdGhhbgorICAgbGltYi1ieS1saW1iIGluIHRoZSBsb29wLiAgVGhpcyBtaWdodCBoZWxwIGlmIG1wbl9sc2hpZnQgaXMgYSBsb3QgZmFzdGVyCisgICB0aGFuIHdoYXQgdGhlIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBmb3IgRVhUUkFDVC4gIEJ1dCB0aGlzIGlzIGxlZnQgdG8gQ1BVCisgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgdG8gY29uc2lkZXIsIGVzcGVjaWFsbHkgc2luY2UgRVhUUkFDVCBpc24ndCBvbgorICAgdGhlIGRlcGVuZGVudCBjaGFpbi4KKworICAgSWYgc2l6ZT09MCB0aGVuIHRoZSByZXN1bHQgaXMgc2ltcGx5IHhzaXplIGxpbWJzIG9mIHplcm9zLCBidXQgbm90aGluZworICAgc3BlY2lhbCBpcyBkb25lIGZvciB0aGF0LCBzaW5jZSBpdCB3b3VsZG4ndCBiZSBhIHVzdWFsIGNhbGwsIGFuZAorICAgY2VydGFpbmx5IG5ldmVyIGFyaXNlcyBmcm9tIG1wbl9nZXRfc3RyIHdoaWNoIGlzIG91ciBtYWluIGNhbGxlci4gICovCisKK21wX2xpbWJfdAorbXBuX3ByZWludl9kaXZyZW1fMSAobXBfcHRyIHFwLCBtcF9zaXplX3QgeHNpemUsCisJCSAgICAgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRfdW5ub3JtLAorCQkgICAgIG1wX2xpbWJfdCBkaW52LCBpbnQgc2hpZnQpCit7CisgIG1wX2xpbWJfdCAgYWhpZ2gsIHFoaWdoLCByOworICBtcF9zaXplX3QgIGk7CisgIG1wX2xpbWJfdCAgbjEsIG4wOworICBtcF9saW1iX3QgIGQ7CisKKyAgQVNTRVJUICh4c2l6ZSA+PSAwKTsKKyAgQVNTRVJUIChzaXplID49IDEpOworICBBU1NFUlQgKGRfdW5ub3JtICE9IDApOworI2lmIFdBTlRfQVNTRVJUCisgIHsKKyAgICBpbnQgICAgICAgIHdhbnRfc2hpZnQ7CisgICAgbXBfbGltYl90ICB3YW50X2RpbnY7CisgICAgY291bnRfbGVhZGluZ196ZXJvcyAod2FudF9zaGlmdCwgZF91bm5vcm0pOworICAgIEFTU0VSVCAoc2hpZnQgPT0gd2FudF9zaGlmdCk7CisgICAgaW52ZXJ0X2xpbWIgKHdhbnRfZGludiwgZF91bm5vcm0gPDwgc2hpZnQpOworICAgIEFTU0VSVCAoZGludiA9PSB3YW50X2RpbnYpOworICB9CisjZW5kaWYKKyAgLyogRklYTUU6IFdoYXQncyB0aGUgY29ycmVjdCBvdmVybGFwIHJ1bGUgd2hlbiB4c2l6ZSE9MD8gKi8KKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChxcCt4c2l6ZSwgYXAsIHNpemUpKTsKKworICBhaGlnaCA9IGFwW3NpemUtMV07CisgIGQgPSBkX3Vubm9ybSA8PCBzaGlmdDsKKyAgcXAgKz0gKHNpemUgKyB4c2l6ZSAtIDEpOyAgIC8qIGRlc3QgaGlnaCBsaW1iICovCisKKyAgaWYgKHNoaWZ0ID09IDApCisgICAgeworICAgICAgLyogSGlnaCBxdW90aWVudCBsaW1iIGlzIDAgb3IgMSwgYW5kIHNraXAgYSBkaXZpZGUgc3RlcC4gKi8KKyAgICAgIHIgPSBhaGlnaDsKKyAgICAgIHFoaWdoID0gKHIgPj0gZCk7CisgICAgICByID0gKHFoaWdoID8gci1kIDogcik7CisgICAgICAqcXAtLSA9IHFoaWdoOworICAgICAgc2l6ZS0tOworCisgICAgICBmb3IgKGkgPSBzaXplLTE7IGkgPj0gMDsgaS0tKQorCXsKKwkgIG4wID0gYXBbaV07CisJICB1ZGl2X3Fybm5kX3ByZWludiAoKnFwLCByLCByLCBuMCwgZCwgZGludik7CisJICBxcC0tOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByID0gMDsKKyAgICAgIGlmIChhaGlnaCA8IGRfdW5ub3JtKQorCXsKKwkgIHIgPSBhaGlnaCA8PCBzaGlmdDsKKwkgICpxcC0tID0gMDsKKwkgIHNpemUtLTsKKwkgIGlmIChzaXplID09IDApCisJICAgIGdvdG8gZG9uZV9pbnRlZ2VyOworCX0KKworICAgICAgbjEgPSBhcFtzaXplLTFdOworICAgICAgciB8PSBuMSA+PiAoR01QX0xJTUJfQklUUyAtIHNoaWZ0KTsKKworICAgICAgZm9yIChpID0gc2l6ZS0yOyBpID49IDA7IGktLSkKKwl7CisJICBBU1NFUlQgKHIgPCBkKTsKKwkgIG4wID0gYXBbaV07CisJICB1ZGl2X3Fybm5kX3ByZWludiAoKnFwLCByLCByLAorCQkJICAgICAoKG4xIDw8IHNoaWZ0KSB8IChuMCA+PiAoR01QX0xJTUJfQklUUyAtIHNoaWZ0KSkpLAorCQkJICAgICBkLCBkaW52KTsKKwkgIHFwLS07CisJICBuMSA9IG4wOworCX0KKyAgICAgIHVkaXZfcXJubmRfcHJlaW52ICgqcXAsIHIsIHIsIG4xIDw8IHNoaWZ0LCBkLCBkaW52KTsKKyAgICAgIHFwLS07CisgICAgfQorCisgZG9uZV9pbnRlZ2VyOgorICBmb3IgKGkgPSAwOyBpIDwgeHNpemU7IGkrKykKKyAgICB7CisgICAgICB1ZGl2X3Fybm5kX3ByZWludiAoKnFwLCByLCByLCBDTlNUX0xJTUIoMCksIGQsIGRpbnYpOworICAgICAgcXAtLTsKKyAgICB9CisKKyAgcmV0dXJuIHIgPj4gc2hpZnQ7Cit9CisKKyNlbmRpZiAvKiBVU0VfUFJFSU5WX0RJVlJFTV8xICovCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9wcmVfbW9kXzEuYyBiL21wbi9nZW5lcmljL3ByZV9tb2RfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWUzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9wcmVfbW9kXzEuYwpAQCAtMCwwICsxLDYxIEBACisvKiBtcG5fcHJlaW52X21vZF8xICh1cCwgdW4sIGQsIGRpbnYpIC0tIERpdmlkZSAoVVAsLFVOKSBieSB0aGUgbm9ybWFsaXplZCBELgorICAgRElOViBzaG91bGQgYmUgMl4oMipHTVBfTElNQl9CSVRTKSAvIEQgLSAyXkdNUF9MSU1CX0JJVFMuCisgICBSZXR1cm4gdGhlIHNpbmdsZS1saW1iIHJlbWFpbmRlci4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDIwMDAtMjAwMiwgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogVGhpcyBmdW5jdGlvbiB1c2VkIHRvIGJlIGRvY3VtZW50ZWQsIGJ1dCBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gIEl0CisgICBjb250aW51ZXMgdG8gZXhpc3QgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LCBldmVuIHdoZW4gbm90IHJlcXVpcmVkCisgICBpbnRlcm5hbGx5LiAgKi8KKworbXBfbGltYl90CittcG5fcHJlaW52X21vZF8xIChtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwgbXBfbGltYl90IGQsIG1wX2xpbWJfdCBkaW52KQoreworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IG4wLCByOworCisgIEFTU0VSVCAodW4gPj0gMSk7CisgIEFTU0VSVCAoZCAmIEdNUF9MSU1CX0hJR0hCSVQpOworCisgIHIgPSB1cFt1biAtIDFdOworICBpZiAociA+PSBkKQorICAgIHIgLT0gZDsKKworICBmb3IgKGkgPSB1biAtIDI7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG4wID0gdXBbaV07CisgICAgICB1ZGl2X3JubmRfcHJlaW52IChyLCByLCBuMCwgZCwgZGludik7CisgICAgfQorICByZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3JhbmRvbS5jIGIvbXBuL2dlbmVyaWMvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1ZjllYgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3JhbmRvbS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIG1wbl9yYW5kb20gLS0gR2VuZXJhdGUgcmFuZG9tIG51bWJlcnMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBuX3JhbmRvbSAobXBfcHRyIHB0ciwgbXBfc2l6ZV90IHNpemUpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kczsKKworICAvKiBGSVhNRTogSXMgc2l6ZT09MCBzdXBwb3NlZCB0byBiZSBhbGxvd2VkPyAqLworICBBU1NFUlQgKHNpemUgPj0gMCk7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgcmFuZHMgPSBSQU5EUzsKKyAgX2dtcF9yYW5kIChwdHIsIHJhbmRzLCBzaXplICogR01QX05VTUJfQklUUyk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgaXMgbm9uLXplcm8uICAqLworICB3aGlsZSAocHRyW3NpemUtMV0gPT0gMCkKKyAgICBfZ21wX3JhbmQgKCZwdHJbc2l6ZS0xXSwgcmFuZHMsIEdNUF9OVU1CX0JJVFMpOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcmFuZG9tMi5jIGIvbXBuL2dlbmVyaWMvcmFuZG9tMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZWRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9yYW5kb20yLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIG1wbl9yYW5kb20yIC0tIEdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIHdpdGggcmVsYXRpdmVseSBsb25nIHN0cmluZ3MKKyAgIG9mIG9uZXMgYW5kIHplcm9lcy4gIFN1aXRhYmxlIGZvciBib3JkZXIgdGVzdGluZy4KKworQ29weXJpZ2h0IDE5OTItMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA0LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworc3RhdGljIHZvaWQgZ21wX3JyYW5kb21iIChtcF9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgbXBfYml0Y250X3QpOworCisvKiBBc2sgX2dtcF9yYW5kIGZvciAzMiBiaXRzIHBlciBjYWxsIHVubGVzcyB0aGF0J3MgbW9yZSB0aGFuIGEgbGltYiBjYW4gaG9sZC4KKyAgIFRodXMsIHdlIGdldCB0aGUgc2FtZSByYW5kb20gbnVtYmVyIHNlcXVlbmNlIGluIHRoZSBjb21tb24gY2FzZXMuCisgICBGSVhNRTogV2Ugc2hvdWxkIGFsd2F5cyBnZW5lcmF0ZSB0aGUgc2FtZSByYW5kb20gbnVtYmVyIHNlcXVlbmNlISAgKi8KKyNpZiBHTVBfTlVNQl9CSVRTIDwgMzIKKyNkZWZpbmUgQklUU19QRVJfUkFORENBTEwgR01QX05VTUJfQklUUworI2Vsc2UKKyNkZWZpbmUgQklUU19QRVJfUkFORENBTEwgMzIKKyNlbmRpZgorCit2b2lkCittcG5fcmFuZG9tMiAobXBfcHRyIHJwLCBtcF9zaXplX3QgbikKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlID0gUkFORFM7CisgIGludCBiaXRfcG9zOwkJCS8qIGJpdCBudW1iZXIgb2YgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdoZXJlCisJCQkJICAgbmV4dCBiaXQgZmllbGQgdG8gYmUgaW5zZXJ0ZWQgKi8KKyAgbXBfbGltYl90IHJhbiwgcmFubTsJCS8qIGJ1ZmZlciBmb3IgcmFuZG9tIGJpdHMgKi8KKworICAvKiBGSVhNRTogSXMgbj09MCBzdXBwb3NlZCB0byBiZSBhbGxvd2VkPyAqLworICBBU1NFUlQgKG4gPj0gMCk7CisKKyAgX2dtcF9yYW5kICgmcmFubSwgcnN0YXRlLCBCSVRTX1BFUl9SQU5EQ0FMTCk7CisgIHJhbiA9IHJhbm07CisKKyAgLyogU3RhcnQgb2ZmIGF0IGEgcmFuZG9tIGJpdCBwb3NpdGlvbiBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iLiAgKi8KKyAgYml0X3BvcyA9IHJhbiAlIEdNUF9OVU1CX0JJVFM7CisKKyAgZ21wX3JyYW5kb21iIChycCwgcnN0YXRlLCBuICogR01QX05VTUJfQklUUyAtIGJpdF9wb3MpOworfQorCitzdGF0aWMgdm9pZAorZ21wX3JyYW5kb21iIChtcF9wdHIgcnAsIGdtcF9yYW5kc3RhdGVfdCByc3RhdGUsIG1wX2JpdGNudF90IG5iaXRzKQoreworICBtcF9iaXRjbnRfdCBiaTsKKyAgbXBfbGltYl90IHJhbm07CQkvKiBidWZmZXIgZm9yIHJhbmRvbSBiaXRzICovCisgIHVuc2lnbmVkIGNhcF9jaHVua3NpemUsIGNodW5rc2l6ZTsKKyAgbXBfc2l6ZV90IGk7CisKKyAgLyogU2V0IGVudGlyZSByZXN1bHQgdG8gMTExLi4xICAqLworICBpID0gQklUU19UT19MSU1CUyAobmJpdHMpIC0gMTsKKyAgcnBbaV0gPSBHTVBfTlVNQl9NQVggPj4gKEdNUF9OVU1CX0JJVFMgLSAobmJpdHMgJSBHTVBfTlVNQl9CSVRTKSkgJSBHTVBfTlVNQl9CSVRTOworICBmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgcnBbaV0gPSBHTVBfTlVNQl9NQVg7CisKKyAgX2dtcF9yYW5kICgmcmFubSwgcnN0YXRlLCBCSVRTX1BFUl9SQU5EQ0FMTCk7CisgIGNhcF9jaHVua3NpemUgPSBuYml0cyAvIChyYW5tICUgNCArIDEpOworICBjYXBfY2h1bmtzaXplICs9IGNhcF9jaHVua3NpemUgPT0gMDsgLyogbWFrZSBpdCBhdCBsZWFzdCAxICovCisKKyAgYmkgPSBuYml0czsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIF9nbXBfcmFuZCAoJnJhbm0sIHJzdGF0ZSwgQklUU19QRVJfUkFORENBTEwpOworICAgICAgY2h1bmtzaXplID0gMSArIHJhbm0gJSBjYXBfY2h1bmtzaXplOworICAgICAgYmkgPSAoYmkgPCBjaHVua3NpemUpID8gMCA6IGJpIC0gY2h1bmtzaXplOworCisgICAgICBpZiAoYmkgPT0gMCkKKwlicmVhazsJCQkvKiBsb3cgY2h1bmsgaXMgLi4uMSAqLworCisgICAgICBycFtiaSAvIEdNUF9OVU1CX0JJVFNdIF49IENOU1RfTElNQiAoMSkgPDwgYmkgJSBHTVBfTlVNQl9CSVRTOworCisgICAgICBfZ21wX3JhbmQgKCZyYW5tLCByc3RhdGUsIEJJVFNfUEVSX1JBTkRDQUxMKTsKKyAgICAgIGNodW5rc2l6ZSA9IDEgKyByYW5tICUgY2FwX2NodW5rc2l6ZTsKKyAgICAgIGJpID0gKGJpIDwgY2h1bmtzaXplKSA/IDAgOiBiaSAtIGNodW5rc2l6ZTsKKworICAgICAgbXBuX2luY3JfdSAocnAgKyBiaSAvIEdNUF9OVU1CX0JJVFMsIENOU1RfTElNQiAoMSkgPDwgYmkgJSBHTVBfTlVNQl9CSVRTKTsKKworICAgICAgaWYgKGJpID09IDApCisJYnJlYWs7CQkJLyogbG93IGNodW5rIGlzIC4uLjAgKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9yZWRjXzEuYyBiL21wbi9nZW5lcmljL3JlZGNfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjEyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9yZWRjXzEuYwpAQCAtMCwwICsxLDU2IEBACisvKiBtcG5fcmVkY18xLiAgU2V0IHJwW10gPC0gdXBbXS9SXm4gbW9kIG1wW10uICBDbG9iYmVyIHVwW10uCisgICBtcFtdIGlzIG4gbGltYnM7IHVwW10gaXMgMm4gbGltYnMuCisKKyAgIFRISVMgSVMgQU4gSU5URVJOQUwgRlVOQ1RJT04gV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSElTIEZVTkNUSU9OIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLgorCitDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiwgMjAwNCwgMjAwOCwgMjAwOSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK21wX2xpbWJfdAorbXBuX3JlZGNfMSAobXBfcHRyIHJwLCBtcF9wdHIgdXAsIG1wX3NyY3B0ciBtcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBpbnZtKQoreworICBtcF9zaXplX3QgajsKKyAgbXBfbGltYl90IGN5OworCisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlRfTVBOICh1cCwgMipuKTsKKworICBmb3IgKGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkbXVsXzEgKHVwLCBtcCwgbiwgKHVwWzBdICogaW52bSkgJiBHTVBfTlVNQl9NQVNLKTsKKyAgICAgIEFTU0VSVCAodXBbMF0gPT0gMCk7CisgICAgICB1cFswXSA9IGN5OworICAgICAgdXArKzsKKyAgICB9CisKKyAgY3kgPSBtcG5fYWRkX24gKHJwLCB1cCwgdXAgLSBuLCBuKTsKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcmVkY18yLmMgYi9tcG4vZ2VuZXJpYy9yZWRjXzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE1NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcmVkY18yLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIG1wbl9yZWRjXzIuICBTZXQgcnBbXSA8LSB1cFtdL1JebiBtb2QgbXBbXS4gIENsb2JiZXIgdXBbXS4KKyAgIG1wW10gaXMgbiBsaW1iczsgdXBbXSBpcyAybiBsaW1icy4KKworICAgVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRISVMgRlVOQ1RJT04gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuCisKK0NvcHlyaWdodCAoQykgMjAwMC0yMDAyLCAyMDA0LCAyMDA4LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKK3lvdSBsb3NlCisjZW5kaWYKKworLyogRm9yIHRlc3RpbmcgcHVycG9zZXMsIGRlZmluZSBvdXIgb3duIG1wbl9hZGRtdWxfMiBpZiB0aGVyZSBpcyBub25lIGFscmVhZHkKKyAgIGF2YWlsYWJsZS4gICovCisjaWZuZGVmIEhBVkVfTkFUSVZFX21wbl9hZGRtdWxfMgorI3VuZGVmIG1wbl9hZGRtdWxfMgorc3RhdGljIG1wX2xpbWJfdAorbXBuX2FkZG11bF8yIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIG1wX3NyY3B0ciB2cCkKK3sKKyAgcnBbbl0gPSBtcG5fYWRkbXVsXzEgKHJwLCB1cCwgbiwgdnBbMF0pOworICByZXR1cm4gbXBuX2FkZG11bF8xIChycCArIDEsIHVwLCBuLCB2cFsxXSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiAhIGRlZmluZWQgKE5PX0FTTSkgXAorICAmJiBkZWZpbmVkIChfX2lhNjQpICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIHVtdWwybG93KHBoLCBwbCwgdWgsIHVsLCB2aCwgdmwpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX3BoLCBfcGw7CQkJCQkJCVwKKyAgICBfX2FzbV9fICgieG1hLmh1ICUwID0gJTMsICU1LCBmMFxuXHQiCQkJCVwKKwkgICAgICJ4bWEubCAlMSA9ICUzLCAlNSwgZjBcblx0IgkJCQlcCisJICAgICAiOztcblx0IgkJCQkJCQlcCisJICAgICAieG1hLmwgJTAgPSAlMywgJTQsICUwXG5cdCIJCQkJXAorCSAgICAgIjs7XG5cdCIJCQkJCQkJXAorCSAgICAgInhtYS5sICUwID0gJTIsICU1LCAlMCIJCQkJCVwKKwkgICAgIDogIj0mZiIgKHBoKSwgIj0mZiIgKHBsKQkJCQkJXAorCSAgICAgOiAiZiIgKHVoKSwgImYiICh1bCksICJmIiAodmgpLCAiZiIgKHZsKSk7CQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgdW11bDJsb3cKKyNkZWZpbmUgdW11bDJsb3cocGgsIHBsLCB1aCwgdWwsIHZoLCB2bCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfcGgsIF9wbDsJCQkJCQkJXAorICAgIHVtdWxfcHBtbSAoX3BoLCBfcGwsIHVsLCB2bCk7CQkJCQlcCisgICAgKHBoKSA9IF9waCArICh1bCkgKiAodmgpICsgKHVoKSAqICh2bCk7CQkJCVwKKyAgICAocGwpID0gX3BsOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKK21wX2xpbWJfdAorbXBuX3JlZGNfMiAobXBfcHRyIHJwLCBtcF9wdHIgdXAsIG1wX3NyY3B0ciBtcCwgbXBfc2l6ZV90IG4sIG1wX3NyY3B0ciBtaXApCit7CisgIG1wX2xpbWJfdCBxWzJdOworICBtcF9zaXplX3QgajsKKyAgbXBfbGltYl90IHVwbjsKKyAgbXBfbGltYl90IGN5OworCisgIEFTU0VSVCAobiA+IDApOworICBBU1NFUlRfTVBOICh1cCwgMipuKTsKKworICBpZiAoKG4gJiAxKSAhPSAwKQorICAgIHsKKyAgICAgIHVwWzBdID0gbXBuX2FkZG11bF8xICh1cCwgbXAsIG4sICh1cFswXSAqIG1pcFswXSkgJiBHTVBfTlVNQl9NQVNLKTsKKyAgICAgIHVwKys7CisgICAgfQorCisgIGZvciAoaiA9IG4gLSAyOyBqID49IDA7IGogLT0gMikKKyAgICB7CisgICAgICB1bXVsMmxvdyAocVsxXSwgcVswXSwgbWlwWzFdLCBtaXBbMF0sIHVwWzFdLCB1cFswXSk7CisgICAgICB1cG4gPSB1cFtuXTsJCS8qIG1wbl9hZGRtdWxfMiBvdmVyd3JpdGVzIHRoaXMgKi8KKyAgICAgIHVwWzFdID0gbXBuX2FkZG11bF8yICh1cCwgbXAsIG4sIHEpOworICAgICAgdXBbMF0gPSB1cFtuXTsKKyAgICAgIHVwW25dID0gdXBuOworICAgICAgdXAgKz0gMjsKKyAgICB9CisKKyAgY3kgPSBtcG5fYWRkX24gKHJwLCB1cCwgdXAgLSBuLCBuKTsKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcmVkY19uLmMgYi9tcG4vZ2VuZXJpYy9yZWRjX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk0YjdjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcmVkY19uLmMKQEAgLTAsMCArMSw4MCBAQAorLyogbXBuX3JlZGNfbi4gIFNldCBycFtdIDwtIHVwW10vUl5uIG1vZCBtcFtdLiAgQ2xvYmJlciB1cFtdLgorICAgbXBbXSBpcyBuIGxpbWJzOyB1cFtdIGlzIDJuIGxpbWJzLCB0aGUgaW52ZXJzZSBpcFtdIGlzIG4gbGltYnMuCisKKyAgIFRISVMgSVMgQU4gSU5URVJOQUwgRlVOQ1RJT04gV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSElTIEZVTkNUSU9OIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qCisgIFRPRE8KKworICAqIFdlIGFzc3VtZSBtcG5fbXVsbW9kX2JubTEgaXMgYWx3YXlzIGZhc3RlciB0aGFuIHBsYWluIG1wbl9tdWxfbiAob3IgYQorICAgIGZ1dHVyZSBtcG5fbXVsaGkpIGZvciB0aGUgcmFuZ2Ugd2Ugd2lsbCBiZSBjYWxsZWQuICBGb2xsb3cgdXAgdGhhdAorICAgIGFzc3VtcHRpb24uCisKKyAgKiBEZWNyZWFzZSBzY3JhdGNoIHVzYWdlLgorCisgICogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHJlc2lkdWUgY2Fub25pY2FsaXNhdGlvbi4KKyovCisKK3ZvaWQKK21wbl9yZWRjX24gKG1wX3B0ciBycCwgbXBfcHRyIHVwLCBtcF9zcmNwdHIgbXAsIG1wX3NpemVfdCBuLCBtcF9zcmNwdHIgaXApCit7CisgIG1wX3B0ciB4cCwgeXAsIHNjcmF0Y2g7CisgIG1wX2xpbWJfdCBjeTsKKyAgbXBfc2l6ZV90IHJuOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisKKyAgQVNTRVJUIChuID4gOCk7CisKKyAgcm4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChuKTsKKworICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChuICsgcm4gKyBtcG5fbXVsbW9kX2JubTFfaXRjaCAocm4sIG4sIG4pKTsKKworICB4cCA9IHNjcmF0Y2g7CisgIG1wbl9tdWxsb19uICh4cCwgdXAsIGlwLCBuKTsKKworICB5cCA9IHNjcmF0Y2ggKyBuOworICBtcG5fbXVsbW9kX2JubTEgKHlwLCBybiwgeHAsIG4sIG1wLCBuLCBzY3JhdGNoICsgbiArIHJuKTsKKworICBBU1NFUlRfQUxXQVlTICgyICogbiA+IHJuKTsJCQkJLyogY291bGQgaGFuZGxlIHRoaXMgKi8KKworICBjeSA9IG1wbl9zdWJfbiAoeXAgKyBybiwgeXAsIHVwLCAyKm4gLSBybik7CQkvKiB1bmRvIHdyYXAgYXJvdW5kICovCisgIE1QTl9ERUNSX1UgKHlwICsgMipuIC0gcm4sIHJuLCBjeSk7CisKKyAgY3kgPSBtcG5fc3ViX24gKHJwLCB1cCArIG4sIHlwICsgbiwgbik7CisgIGlmIChjeSAhPSAwKQorICAgIG1wbl9hZGRfbiAocnAsIHJwLCBtcCwgbik7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9yZW1vdmUuYyBiL21wbi9nZW5lcmljL3JlbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjA3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9yZW1vdmUuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogbXBuX3JlbW92ZSAtLSBkaXZpZGUgb3V0IGFsbCBtdWx0aXBsZXMgb2Ygb2RkIG1wbiBudW1iZXIgZnJvbSBhbm90aGVyIG1wbgorICAgbnVtYmVyLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDksIDIwMTItMjAxNCwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZiBHTVBfTElNQl9CSVRTID4gNTAKKyNkZWZpbmUgTE9HIDUwCisjZWxzZQorI2RlZmluZSBMT0cgR01QX0xJTUJfQklUUworI2VuZGlmCisKKworLyogSW5wdXQ6IFUgPSB7dXAsdW59LCBWID0ge3ZwLHZufSBtdXN0IGJlIG9kZCwgY2FwCisgICBPdXB1dCAgVyA9IHt3cCwqd259IGFsbG9jYXRpb24gbmVlZCBpcyBleGFjdGx5ICp3bgorCisgICBTZXQgVyA9IFUgLyBWXmssIHdoZXJlIGsgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciA8PSBjYXAgc3VjaCB0aGF0IHRoZQorICAgZGl2aXNpb24geWllbGRzIGFuIGludGVnZXIuCisKKyAgIEZJWE1FOiBXZSBjdXJyZW50bHkgYWxsb3cgYW55IG9wZXJhbmQgb3ZlcmxhcC4gIFRoaXMgaXMgcXVpdGUgbm9uIG1wbi1pc2gKKyAgIGFuZCBtaWdodCBiZSBjaGFuZ2VkLCBzaW5jZSBpdCBjb3N0IHNpZ25pZmljYW50IHRlbXBvcmFyeSBzcGFjZS4KKyAgICogSWYgd2UgcmVxdWlyZSBXIHRvIGhhdmUgc3BhY2UgZm9yIHVuICsgMSBsaW1icywgd2UgY291bGQgc2F2ZSBxcCBvciBxcDIKKyAgICAgKGJ1dCB3ZSB3aWxsIHN0aWxsIG5lZWQgdG8gY29weSB0aGluZ3MgaW50byB3cCA1MCUgb2YgdGhlIHRpbWUpLgorICAgKiBJZiB3ZSBhbGxvdyBvdXJzZWx2ZXMgdG8gY2xvYmJlciBVLCB3ZSBjb3VsZCBzYXZlIHRoZSBvdGhlciBvZiBxcCBhbmQgcXAyLAorICAgICBhbmQgdGhlIGluaXRpYWwgQ09QWSAoYnV0IGFsc28gaGVyZSB3ZSB3b3VsZCBuZWVkIHVuICsgMSBsaW1icykuCisqLworCisvKiBGSVhNRTogV2UgbmVlZCB0byB3cmFwIG1wbl9iZGl2X3FyIGR1ZSB0byB0aGUgaXRjaCBpbnRlcmZhY2UuICBUaGlzIG5lZWQKKyAgIGluZGljYXRlcyBhIGZsYXcgaW4gdGhlIGN1cnJlbnQgaXRjaCBtZWNoYW5pc206IFdoaWNoIG9wZXJhbmRzIG5vdCBncmVhdGVyCisgICB0aGFuIHVuLHVuIHdpbGwgaW5jdXIgdGhlIHdvcnN0IGl0Y2g/ICBXZSBuZWVkIGEgcGFyYWxsZWwgZm9vX21heGl0Y2ggc2V0CisgICBvZiBmdW5jdGlvbnMuICAqLworc3RhdGljIHZvaWQKK21wbl9iZGl2X3FyX3dyYXAgKG1wX3B0ciBxcCwgbXBfcHRyIHJwLAorCQkgIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCQkgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuKQoreworICBtcF9wdHIgc2NyYXRjaF9vdXQ7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworICBzY3JhdGNoX291dCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX2JkaXZfcXJfaXRjaCAobm4sIGRuKSk7CisgIG1wbl9iZGl2X3FyIChxcCwgcnAsIG5wLCBubiwgZHAsIGRuLCBzY3JhdGNoX291dCk7CisKKyAgVE1QX0ZSRUU7Cit9CisKK21wX2JpdGNudF90CittcG5fcmVtb3ZlIChtcF9wdHIgd3AsIG1wX3NpemVfdCAqd24sCisJICAgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCB2biwKKwkgICAgbXBfYml0Y250X3QgY2FwKQoreworICBtcF9zcmNwdHIgcHdwc3BbTE9HXTsKKyAgbXBfc2l6ZV90IHB3cHNuW0xPR107CisgIG1wX3NpemVfdCBucG93ZXJzOworICBtcF9wdHIgdHAsIHFwLCBucCwgcXAyOworICBtcF9zcmNwdHIgcHA7CisgIG1wX3NpemVfdCBwbiwgbm4sIHFuLCBpOworICBtcF9iaXRjbnRfdCBwd3I7CisgIFRNUF9ERUNMOworCisgIEFTU0VSVCAodW4gPiAwKTsKKyAgQVNTRVJUICh2biA+IDApOworICBBU1NFUlQgKHZwWzBdICUgMiAhPSAwKTsJLyogMi1hZGljIGRpdmlzaW9uIHdhbnRzIG9kZCBudW1iZXJzICovCisgIEFTU0VSVCAodm4gPiAxIHx8IHZwWzBdID4gMSk7CS8qIGVsc2Ugd2Ugd291bGQgbG9vcCBpbmRlZmluaXRlbHkgKi8KKworICBUTVBfTUFSSzsKKworICBUTVBfQUxMT0NfTElNQlNfMyAocXAsIHVuICsgMSwJLyogcXVvdGllbnQsIGFsdGVybmF0aW5nICovCisJCSAgICAgcXAyLCB1biArIDEsCS8qIHF1b3RpZW50LCBhbHRlcm5hdGluZyAqLworCQkgICAgIHRwLCAodW4gKyAxICsgdm4pIC8gMik7IC8qIHJlbWFpbmRlciAqLworICBwcCA9IHZwOworICBwbiA9IHZuOworCisgIE1QTl9DT1BZIChxcCwgdXAsIHVuKTsKKyAgcW4gPSB1bjsKKworICBucG93ZXJzID0gMDsKKyAgd2hpbGUgKHFuID49IHBuKQorICAgIHsKKyAgICAgIHFwW3FuXSA9IDA7CisgICAgICBtcG5fYmRpdl9xcl93cmFwIChxcDIsIHRwLCBxcCwgcW4gKyAxLCBwcCwgcG4pOworICAgICAgaWYgKCFtcG5femVyb19wICh0cCwgcG4pKQorCXsKKwkgIGlmIChtcG5fY21wICh0cCwgcHAsIHBuKSAhPSAwKQorCSAgICBicmVhazsJCS8qIGNvdWxkIG5vdCBkaXZpZGUgYnkgVl5ucG93ZXJzICovCisJfQorCisgICAgICBNUF9QVFJfU1dBUCAocXAsIHFwMik7CisgICAgICBxbiA9IHFuIC0gcG47CisgICAgICBtcG5fbmVnIChxcCwgcXAsIHFuKzEpOworCisgICAgICBxbiArPSBxcFtxbl0gIT0gMDsKKworICAgICAgcHdwc3BbbnBvd2Vyc10gPSBwcDsKKyAgICAgIHB3cHNuW25wb3dlcnNdID0gcG47CisgICAgICArK25wb3dlcnM7CisKKyAgICAgIGlmICgoKG1wX2JpdGNudF90KSAyIDw8IG5wb3dlcnMpIC0gMSA+IGNhcCkKKwlicmVhazsKKworICAgICAgbm4gPSAyICogcG4gLSAxOwkJLyogbmV4dCBwb3dlciB3aWxsIGJlIGF0IGxlYXN0IHRoaXMgbGFyZ2UgKi8KKyAgICAgIGlmIChubiA+IHFuKQorCWJyZWFrOwkJCS8qIG5leHQgcG93ZXIgd291bGQgYmUgb3ZlcmxhcmdlICovCisKKyAgICAgIGlmIChucG93ZXJzID09IDEpCQkvKiBBbGxvYyBvbmNlLCBidXQgb25seSBpZiBpdCdzIG5lZWRlZCAqLworCW5wID0gVE1QX0FMTE9DX0xJTUJTIChxbiArIExPRyk7CS8qIHBvd2VycyBvZiBWICovCisgICAgICBlbHNlCisJbnAgKz0gcG47CisKKyAgICAgIG1wbl9zcXIgKG5wLCBwcCwgcG4pOworICAgICAgcG4gPSBubiArIChucFtubl0gIT0gMCk7CisgICAgICBwcCA9IG5wOworICAgIH0KKworICBwd3IgPSAoKG1wX2JpdGNudF90KSAxIDw8IG5wb3dlcnMpIC0gMTsKKworICBmb3IgKGkgPSBucG93ZXJzOyAtLWkgPj0gMDspCisgICAgeworICAgICAgcG4gPSBwd3BzbltpXTsKKyAgICAgIGlmIChxbiA8IHBuKQorCWNvbnRpbnVlOworCisgICAgICBpZiAocHdyICsgKChtcF9iaXRjbnRfdCkgMSA8PCBpKSA+IGNhcCkKKwljb250aW51ZTsJCS8qIFZeaSB3b3VsZCBicmluZyB1cyBwYXN0IGNhcCAqLworCisgICAgICBxcFtxbl0gPSAwOworICAgICAgbXBuX2JkaXZfcXJfd3JhcCAocXAyLCB0cCwgcXAsIHFuICsgMSwgcHdwc3BbaV0sIHBuKTsKKyAgICAgIGlmICghbXBuX3plcm9fcCAodHAsIHBuKSkKKwl7CisJICBpZiAobXBuX2NtcCAodHAsIHB3cHNwW2ldLCBwbikgIT0gMCkKKwkgICAgY29udGludWU7CQkvKiBjb3VsZCBub3QgZGl2aWRlIGJ5IFZeaSAqLworCX0KKworICAgICAgTVBfUFRSX1NXQVAgKHFwLCBxcDIpOworICAgICAgcW4gPSBxbiAtIHBuOworICAgICAgbXBuX25lZyAocXAsIHFwLCBxbisxKTsKKworICAgICAgcW4gKz0gcXBbcW5dICE9IDA7CisKKyAgICAgIHB3ciArPSAobXBfYml0Y250X3QpIDEgPDwgaTsKKyAgICB9CisKKyAgTVBOX0NPUFkgKHdwLCBxcCwgcW4pOworICAqd24gPSBxbjsKKworICBUTVBfRlJFRTsKKworICByZXR1cm4gcHdyOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcm9vdHJlbS5jIGIvbXBuL2dlbmVyaWMvcm9vdHJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTA5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9yb290cmVtLmMKQEAgLTAsMCArMSw1MTUgQEAKKy8qIG1wbl9yb290cmVtKHJvb3RwLHJlbXAsYXAsYW4sbnRoKSAtLSBDb21wdXRlIHRoZSBudGggcm9vdCBvZiB7YXAsYW59LCBhbmQKKyAgIHN0b3JlIHRoZSB0cnVuY2F0ZWQgaW50ZWdlciBwYXJ0IGF0IHJvb3RwIGFuZCB0aGUgcmVtYWluZGVyIGF0IHJlbXAuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IFBhdWwgWmltbWVybWFubiAoYWxnb3JpdGhtKSBhbmQKKyAgIFBhdWwgWmltbWVybWFubiBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgKGltcGxlbWVudGF0aW9uKS4KKyAgIE1hcmNvIEJvZHJhdG8gd3JvdGUgbG9nYmFzZWRfcm9vdCB0byBzZWVkIHRoZSBsb29wLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwsIEFORCBIQVZFIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUJ1MKKyAgIE9OTFkgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQnUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDAyLCAyMDA1LCAyMDA5LTIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIEZJWE1FOgorICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBvcHRpbWFsIHdoZW4gcmVtcCA9PSBOVUxMLCBzaW5jZSB0aGUgY29tcGxleGl0eQorICAgICBpcyBNKG4pLCB3aGVyZWFzIGl0IHNob3VsZCBiZSBNKG4vaykgb24gYXZlcmFnZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgkJLyogZm9yIE5VTEwgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworc3RhdGljIG1wX3NpemVfdCBtcG5fcm9vdHJlbV9pbnRlcm5hbCAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LAorCQkJCSAgICAgICBtcF9saW1iX3QsIGludCk7CisKKyNkZWZpbmUgTVBOX1JTSElGVChycCx1cCx1bixjbnQpIFwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoKGNudCkgIT0gMCkJCQkJCQkJXAorICAgICAgbXBuX3JzaGlmdCAocnAsIHVwLCB1biwgY250KTsJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCU1QTl9DT1BZX0lOQ1IgKHJwLCB1cCwgdW4pOwkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fTFNISUZUKGN5LHJwLHVwLHVuLGNudCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmICgoY250KSAhPSAwKQkJCQkJCQlcCisgICAgICBjeSA9IG1wbl9sc2hpZnQgKHJwLCB1cCwgdW4sIGNudCk7CQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCU1QTl9DT1BZX0RFQ1IgKHJwLCB1cCwgdW4pOwkJCQkJXAorCWN5ID0gMDsJCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogUHV0IGluIHtyb290cCwgY2VpbCh1bi9rKX0gdGhlIGt0aCByb290IG9mIHt1cCwgdW59LCByb3VuZGVkIHRvd2FyZCB6ZXJvLgorICAgSWYgcmVtcCA8PiBOVUxMLCBwdXQgaW4ge3JlbXAsIHVufSB0aGUgcmVtYWluZGVyLgorICAgUmV0dXJuIHRoZSBzaXplIChpbiBsaW1icykgb2YgdGhlIHJlbWFpbmRlciBpZiByZW1wIDw+IE5VTEwsCisJICBvciBhIG5vbi16ZXJvIHZhbHVlIGlmZiB0aGUgcmVtYWluZGVyIGlzIG5vbi16ZXJvIHdoZW4gcmVtcCA9IE5VTEwuCisgICBBc3N1bWVzOgorICAgKGEpIHVwW3VuLTFdIGlzIG5vdCB6ZXJvCisgICAoYikgcm9vdHAgaGFzIGF0IGxlYXN0IHNwYWNlIGZvciBjZWlsKHVuL2spIGxpbWJzCisgICAoYykgcmVtcCBoYXMgYXQgbGVhc3Qgc3BhY2UgZm9yIHVuIGxpbWJzIChpbiBjYXNlIHJlbXAgPD4gTlVMTCkKKyAgIChkKSB0aGUgb3BlcmFuZHMgZG8gbm90IG92ZXJsYXAuCisKKyAgIFRoZSBhdXhpbGlhcnkgbWVtb3J5IHVzYWdlIGlzIDMqdW4rMiBpZiByZW1wID0gTlVMTCwKKyAgIGFuZCAyKnVuKzIgaWYgcmVtcCA8PiBOVUxMLiAgRklYTUU6IFRoaXMgaXMgYW4gaW5jb3JyZWN0IGNvbW1lbnQuCisqLworbXBfc2l6ZV90CittcG5fcm9vdHJlbSAobXBfcHRyIHJvb3RwLCBtcF9wdHIgcmVtcCwKKwkgICAgIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9saW1iX3QgaykKK3sKKyAgQVNTRVJUICh1biA+IDApOworICBBU1NFUlQgKHVwW3VuIC0gMV0gIT0gMCk7CisgIEFTU0VSVCAoayA+IDEpOworCisgIGlmIChVTkxJS0VMWSAoayA9PSAyKSkKKyAgICByZXR1cm4gbXBuX3NxcnRyZW0gKHJvb3RwLCByZW1wLCB1cCwgdW4pOworICAvKiAodW4tMSkvayA+IDIgPD0+IHVuID4gM2sgPD0+ICh1biArIDIpLzMgPiBrICovCisgIGlmIChyZW1wID09IE5VTEwgJiYgKHVuICsgMikgLyAzID4gaykKKyAgICAvKiBQYWQge3VwLHVufSB3aXRoIGsgemVybyBsaW1icy4gIFRoaXMgd2lsbCBwcm9kdWNlIGFuIGFwcHJveGltYXRlIHJvb3QKKyAgICAgICB3aXRoIG9uZSBtb3JlIGxpbWIsIGFsbG93aW5nIHVzIHRvIGNvbXB1dGUgdGhlIGV4YWN0IGludGVncmFsIHJlc3VsdC4gKi8KKyAgICB7CisgICAgICBtcF9wdHIgc3AsIHdwOworICAgICAgbXBfc2l6ZV90IHJuLCBzbiwgd247CisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworICAgICAgd24gPSB1biArIGs7CisgICAgICBzbiA9ICh1biAtIDEpIC8gayArIDI7IC8qIGNlaWwodW4vaykgKyAxICovCisgICAgICBUTVBfQUxMT0NfTElNQlNfMiAod3AsIHduLCAvKiB3aWxsIGNvbnRhaW4gdGhlIHBhZGRlZCBpbnB1dCAqLworCQkJIHNwLCBzbik7IC8qIGFwcHJveGltYXRlIHJvb3Qgb2YgcGFkZGVkIGlucHV0ICovCisgICAgICBNUE5fQ09QWSAod3AgKyBrLCB1cCwgdW4pOworICAgICAgTVBOX0ZJTEwgKHdwLCBrLCAwKTsKKyAgICAgIHJuID0gbXBuX3Jvb3RyZW1faW50ZXJuYWwgKHNwLCBOVUxMLCB3cCwgd24sIGssIDEpOworICAgICAgLyogVGhlIGFwcHJveGltYXRlIHJvb3QgUyA9IHtzcCxzbn0gaXMgZWl0aGVyIHRoZSBjb3JyZWN0IHJvb3Qgb2YKKwkge3NwLHNufSwgb3IgMSB0b28gbGFyZ2UuICBUaHVzIHVubGVzcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYiBvZgorCSBTIGlzIDAgb3IgMSwgd2UgY2FuIGRlZHVjZSB0aGUgcm9vdCBvZiB7dXAsdW59IGlzIFMgdHJ1bmNhdGVkIGJ5IG9uZQorCSBsaW1iLiAgKEluIGNhc2Ugc3BbMF09MSwgd2UgY2FuIGRlZHVjZSB0aGUgcm9vdCwgYnV0IG5vdCBkZWNpZGUKKwkgd2hldGhlciBpdCBpcyBleGFjdCBvciBub3QuKSAqLworICAgICAgTVBOX0NPUFkgKHJvb3RwLCBzcCArIDEsIHNuIC0gMSk7CisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybiBybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gbXBuX3Jvb3RyZW1faW50ZXJuYWwgKHJvb3RwLCByZW1wLCB1cCwgdW4sIGssIDApOworICAgIH0KK30KKworI2RlZmluZSBMT0dST09UX1VTRURfQklUUyA4CisjZGVmaW5lIExPR1JPT1RfTkVFRFNfVFdPX0NPUlJFQ1RJT05TIDEKKyNkZWZpbmUgTE9HUk9PVF9SRVRVUk5FRF9CSVRTIChMT0dST09UX1VTRURfQklUUyArIExPR1JPT1RfTkVFRFNfVFdPX0NPUlJFQ1RJT05TKQorLyogUHV0cyBpbiAqcm9vdHAgc29tZSBiaXRzIG9mIHRoZSBrXm50IHJvb3Qgb2YgdGhlIG51bWJlcgorICAgMl5iaXRuICogMS5vcCA7IHdoZXJlIG9wIHJlcHJlc2VudHMgdGhlICJmcmFjdGlvbmFsIiBiaXRzLgorCisgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSByb290IG1pbnVzIG9uZTsKKyAgIGkuZS4gYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgcm9vdCB3aWxsIGJlCisgICAoKnJvb3RwKSAqIDJeKHJldHZhbC1MT0dST09UX1JFVFVSTkVEX0JJVFMrMSkuCisKKyAgIEN1cnJlbnRseSwgb25seSBMT0dST09UX1VTRURfQklUUyBiaXRzIG9mIG9wIGFyZSB1c2VkICh0aGUgaW1wbGljaXQKKyAgIG9uZSBpcyBub3QgY291bnRlZCkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorbG9nYmFzZWRfcm9vdCAobXBfcHRyIHJvb3RwLCBtcF9saW1iX3Qgb3AsIG1wX2JpdGNudF90IGJpdG4sIG1wX2xpbWJfdCBrKQoreworICAvKiB2bG9nPXZlY3RvcigyNTYsaSxmbG9vcigobG9nKDI1NitpKS9sb2coMiktOCkqMjU2KS0oaT4yNTUpKSAqLworICBzdGF0aWMgY29uc3QKKyAgdW5zaWduZWQgY2hhciB2bG9nW10gPSB7MSwgICAyLCAgIDQsICAgNSwgICA3LCAgIDgsICAgOSwgIDExLCAgMTIsICAxNCwgIDE1LCAgMTYsICAxOCwgIDE5LCAgMjEsICAyMiwKKwkJCSAyMywgIDI1LCAgMjYsICAyNywgIDI5LCAgMzAsICAzMSwgIDMzLCAgMzQsICAzNSwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDIsICA0MywKKwkJCSA0NCwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYxLCAgNjIsICA2MywKKwkJCSA2NCwgIDY1LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDgwLCAgODEsICA4MiwKKwkJCSA4MywgIDg0LCAgODUsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwKKwkJCTEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywKKwkJCTExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMSwgMTMyLCAxMzMsIDEzNCwKKwkJCTEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwKKwkJCTE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYyLCAxNjMsIDE2NCwKKwkJCTE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3MywgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwKKwkJCTE4MCwgMTgxLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywKKwkJCTE5NCwgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDUsIDIwNiwKKwkJCTIwNywgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTgsIDIxOSwKKwkJCTIyMCwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIyOSwgMjMwLCAyMzEsIDIzMiwKKwkJCTIzMiwgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQyLCAyNDMsIDI0NCwKKwkJCTI0NSwgMjQ1LCAyNDYsIDI0NywgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1MywgMjU0LCAyNTUsIDI1NX07CisKKyAgLyogdmV4cD12ZWN0b3IoMjU2LGksZmxvb3IoMl4oOCtpLzI1NiktMjU2KS0oaT4yNTUpKSAqLworICBzdGF0aWMgY29uc3QKKyAgdW5zaWduZWQgY2hhciB2ZXhwW10gPSB7MCwgICAxLCAgIDIsICAgMiwgICAzLCAgIDQsICAgNCwgICA1LCAgIDYsICAgNywgICA3LCAgIDgsICAgOSwgICA5LCAgMTAsICAxMSwKKwkJCSAxMiwgIDEyLCAgMTMsICAxNCwgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMCwgIDIxLCAgMjIsICAyMywKKwkJCSAyMywgIDI0LCAgMjUsICAyNiwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMCwgIDMxLCAgMzIsICAzMywgIDMzLCAgMzQsICAzNSwKKwkJCSAzNiwgIDM3LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NSwgIDQ2LCAgNDcsICA0OCwKKwkJCSA0OSwgIDUwLCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MSwKKwkJCSA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LCAgNjcsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NSwKKwkJCSA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODYsICA4NywgIDg4LCAgODksICA5MCwKKwkJCSA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwKKwkJCTEwNywgMTA4LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOSwgMTIwLCAxMjEsIDEyMiwKKwkJCTEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwKKwkJCTEzOSwgMTQwLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTU0LCAxNTUsIDE1NiwKKwkJCTE1NywgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MSwgMTcyLCAxNzMsIDE3NCwKKwkJCTE3NSwgMTc2LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkxLCAxOTIsIDE5MywKKwkJCTE5NCwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTIsIDIxMywKKwkJCTIxNCwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjEsIDIyMiwgMjIzLCAyMjUsIDIyNiwgMjI3LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzNCwKKwkJCTIzNSwgMjM2LCAyMzgsIDIzOSwgMjQwLCAyNDIsIDI0MywgMjQ1LCAyNDYsIDI0NywgMjQ5LCAyNTAsIDI1MSwgMjUzLCAyNTQsIDI1NX07CisgIG1wX2JpdGNudF90IHJldHZhbDsKKworICBpZiAoVU5MSUtFTFkgKGJpdG4gPiAofiAobXBfYml0Y250X3QpIDApID4+IExPR1JPT1RfVVNFRF9CSVRTKSkKKyAgICB7CisgICAgICAvKiBJbiB0aGUgdW5saWtlbHkgY2FzZSwgd2UgdXNlIHR3byBkaXZpc2lvbnMgYW5kIGEgbW9kdWxvLiAqLworICAgICAgcmV0dmFsID0gYml0biAvIGs7CisgICAgICBiaXRuICU9IGs7CisgICAgICBiaXRuID0gKGJpdG4gPDwgTE9HUk9PVF9VU0VEX0JJVFMgfAorCSAgICAgIHZsb2dbb3AgPj4gKEdNUF9OVU1CX0JJVFMgLSBMT0dST09UX1VTRURfQklUUyldKSAvIGs7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYml0biA9IChiaXRuIDw8IExPR1JPT1RfVVNFRF9CSVRTIHwKKwkgICAgICB2bG9nW29wID4+IChHTVBfTlVNQl9CSVRTIC0gTE9HUk9PVF9VU0VEX0JJVFMpXSkgLyBrOworICAgICAgcmV0dmFsID0gYml0biA+PiBMT0dST09UX1VTRURfQklUUzsKKyAgICAgIGJpdG4gJj0gKENOU1RfTElNQiAoMSkgPDwgTE9HUk9PVF9VU0VEX0JJVFMpIC0gMTsKKyAgICB9CisgIEFTU0VSVChiaXRuIDwgQ05TVF9MSU1CICgxKSA8PCBMT0dST09UX1VTRURfQklUUyk7CisgICpyb290cCA9IENOU1RfTElNQigxKSA8PCAoTE9HUk9PVF9VU0VEX0JJVFMgLSAhIExPR1JPT1RfTkVFRFNfVFdPX0NPUlJFQ1RJT05TKQorICAgIHwgdmV4cFtiaXRuXSA+PiAhIExPR1JPT1RfTkVFRFNfVFdPX0NPUlJFQ1RJT05TOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBpZiBhcHByb3ggaXMgbm9uLXplcm8sIGRvZXMgbm90IGNvbXB1dGUgdGhlIGZpbmFsIHJlbWFpbmRlciAqLworc3RhdGljIG1wX3NpemVfdAorbXBuX3Jvb3RyZW1faW50ZXJuYWwgKG1wX3B0ciByb290cCwgbXBfcHRyIHJlbXAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLAorCQkgICAgICBtcF9saW1iX3QgaywgaW50IGFwcHJveCkKK3sKKyAgbXBfcHRyIHFwLCBycCwgc3AsIHdwLCBzY3JhdGNoOworICBtcF9zaXplX3QgcW4sIHJuLCBzbiwgd24sIG5sLCBibjsKKyAgbXBfbGltYl90IHNhdmUsIHNhdmUyLCBjeSwgdWg7CisgIG1wX2JpdGNudF90IHVuYjsgLyogbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgb2Yge3VwLHVufSAqLworICBtcF9iaXRjbnRfdCB4bmI7IC8qIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXN1bHQgKi8KKyAgbXBfYml0Y250X3QgYiwga2s7CisgIG1wX2JpdGNudF90IHNpemVzW0dNUF9OVU1CX0JJVFMgKyAxXTsKKyAgaW50IG5pOworICBpbnQgcGVyZl9wb3c7CisgIHVuc2lnbmVkIHVseiwgc25iLCBjLCBsb2drOworICBUTVBfREVDTDsKKworICAvKiBNUE5fU0laRUlOQkFTRV8yRVhQKHVuYiwgdXAsIHVuLCAxKTsgLS11bmI7ICovCisgIHVoID0gdXBbdW4gLSAxXTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAodWx6LCB1aCk7CisgIHVseiA9IHVseiAtIEdNUF9OQUlMX0JJVFMgKyAxOyAvKiBJZ25vcmUgdGhlIGZpcnN0IDEuICovCisgIHVuYiA9IChtcF9iaXRjbnRfdCkgdW4gKiBHTVBfTlVNQl9CSVRTIC0gdWx6OworICAvKiB1bmIgaXMgdGhlICh0cnVuY2F0ZWQpIGxvZ2FyaXRobSBvZiB0aGUgaW5wdXQgVSBpbiBiYXNlIDIqLworCisgIGlmICh1bmIgPCBrKSAvKiByb290IGlzIDEgKi8KKyAgICB7CisgICAgICByb290cFswXSA9IDE7CisgICAgICBpZiAocmVtcCA9PSBOVUxMKQorCXVuIC09ICgqdXAgPT0gQ05TVF9MSU1CICgxKSk7IC8qIE5vbi16ZXJvIGlpZiB7dXAsdW59ID4gMSAqLworICAgICAgZWxzZQorCXsKKwkgIG1wbl9zdWJfMSAocmVtcCwgdXAsIHVuLCBDTlNUX0xJTUIgKDEpKTsKKwkgIHVuIC09IChyZW1wIFt1biAtIDFdID09IDApOwkvKiBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCBvbmUgemVybyBsaW1iLAorCQkJCSAgIGlmIHdlIGRlbWFuZCB1IHRvIGJlIG5vcm1hbGl6ZWQgICovCisJfQorICAgICAgcmV0dXJuIHVuOworICAgIH0KKyAgLyogaWYgKHVuYiAtIGsgPCBrLzIgKyBrLzE2KSAvLyByb290IGlzIDIgKi8KKworICBpZiAodWx6ID09IEdNUF9OVU1CX0JJVFMpCisgICAgdWggPSB1cFt1biAtIDJdOworICBlbHNlCisgICAgdWggPSAodWggPDwgdWx6ICYgR01QX05VTUJfTUFTSykgfCB1cFt1biAtIDEgLSAodW4gIT0gMSldID4+IChHTVBfTlVNQl9CSVRTIC0gdWx6KTsKKyAgQVNTRVJUICh1biAhPSAxIHx8IHVwW3VuIC0gMSAtICh1biAhPSAxKV0gPj4gKEdNUF9OVU1CX0JJVFMgLSB1bHopID09IDEpOworCisgIHhuYiA9IGxvZ2Jhc2VkX3Jvb3QgKHJvb3RwLCB1aCwgdW5iLCBrKTsKKyAgc25iID0gTE9HUk9PVF9SRVRVUk5FRF9CSVRTIC0gMTsKKyAgLyogeG5iKzEgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSByb290IFIgKi8KKyAgLyogc25iKzEgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGFwcHJveGltYXRpb24gUyAqLworCisgIGtrID0gayAqIHhuYjsJCS8qIG51bWJlciBvZiB0cnVuY2F0ZWQgYml0cyBpbiB0aGUgaW5wdXQgKi8KKworICAvKiBGSVhNRTogU2hvdWxkIHdlIHNraXAgdGhlIG5leHQgdHdvIGxvb3BzIHdoZW4geG5iIDw9IHNuYiA/ICovCisgIGZvciAodWggPSAoayAtIDEpIC8gMiwgbG9nayA9IDM7ICh1aCA+Pj0gMSkgIT0gMDsgKytsb2drICkKKyAgICA7CisgIC8qIGxvZ2sgPSBjZWlsKGxvZyhrKS9sb2coMikpICsgMSAqLworCisgIC8qIHhuYiBpcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBiaXRzIHRvIGRldGVybWluZSBpbiB0aGUga3RoIHJvb3QgKi8KKyAgZm9yIChuaSA9IDA7IChzaXplc1tuaV0gPSB4bmIpID4gc25iOyArK25pKQorICAgIHsKKyAgICAgIC8qIGludmFyaWFudDogaGVyZSB3ZSB3YW50IHhuYisxIHRvdGFsIGJpdHMgZm9yIHRoZSBrdGggcm9vdCAqLworCisgICAgICAvKiBpZiBjIGlzIHRoZSBuZXcgdmFsdWUgb2YgeG5iLCB0aGlzIG1lYW5zIHRoYXQgd2UnbGwgZ28gZnJvbSBhCisJIHJvb3Qgb2YgYysxIGJpdHMgKHNheSBzJykgdG8gYSByb290IG9mIHhuYisxIGJpdHMuCisJIEl0IGlzIHByb3ZlZCBpbiB0aGUgYm9vayAiTW9kZXJuIENvbXB1dGVyIEFyaXRobWV0aWMiIGJ5IEJyZW50CisJIGFuZCBaaW1tZXJtYW5uLCBDaGFwdGVyIDEsIHRoYXQKKwkgaWYgcycgPj0gaypiZXRhLCB0aGVuIGF0IG1vc3Qgb25lIGNvcnJlY3Rpb24gaXMgbmVjZXNzYXJ5LgorCSBIZXJlIGJldGEgPSAyXih4bmItYyksIGFuZCBzJyA+PSAyXmMsIHRodXMgaXQgc3VmZmljZXMgdGhhdAorCSBjID49IGNlaWwoKHhuYiArIGxvZzIoaykpLzIpLiAqLworICAgICAgaWYgKHhuYiA+IGxvZ2spCisJeG5iID0gKHhuYiArIGxvZ2spIC8gMjsKKyAgICAgIGVsc2UKKwktLXhuYjsJLyogYWRkIGp1c3Qgb25lIGJpdCBhdCBhIHRpbWUgKi8KKyAgICB9CisKKyAgKnJvb3RwID4+PSBzbmIgLSB4bmI7CisgIGtrIC09IHhuYjsKKworICBBU1NFUlRfQUxXQVlTIChuaSA8IEdNUF9OVU1CX0JJVFMgKyAxKTsKKyAgLyogV2UgaGF2ZSBzaXplc1swXSA9IGIgPiBzaXplc1sxXSA+IC4uLiA+IHNpemVzW25pXSA9IDAgd2l0aAorICAgICBzaXplc1tpXSA8PSAyICogc2l6ZXNbaSsxXS4KKyAgICAgTmV3dG9uIGl0ZXJhdGlvbiB3aWxsIGZpcnN0IGNvbXB1dGUgc2l6ZXNbbmktMV0gZXh0cmEgYml0cywKKyAgICAgdGhlbiBzaXplc1tuaS0yXSwgLi4uLCB0aGVuIHNpemVzWzBdID0gYi4gKi8KKworICBUTVBfTUFSSzsKKyAgLyogcXAgYW5kIHdwIG5lZWQgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIFMnXmsgd2hlcmUgUycgaXMgYW4gYXBwcm94aW1hdGUKKyAgICAgcm9vdC4gU2luY2UgUycgY2FuIGJlIGFzIGxhcmdlIGFzIFMrMiwgdGhlIHdvcnN0IGNhc2UgaXMgd2hlbiBTPTIgYW5kCisgICAgIFMnPTQuIEJ1dCB0aGVuIHNpbmNlIHdlIGtub3cgdGhlIG51bWJlciBvZiBiaXRzIG9mIFMgaW4gYWR2YW5jZSwgUycKKyAgICAgY2FuIG9ubHkgYmUgMyBhdCBtb3N0LiBTaW1pbGFybHkgZm9yIFM9NCwgdGhlbiBTJyBjYW4gYmUgNiBhdCBtb3N0LgorICAgICBTbyB0aGUgd29yc3QgY2FzZSBpcyBTJy9TPTMvMiwgdGh1cyBTJ15rIDw9ICgzLzIpXmsgKiBTXmsuIFNpbmNlIFNeaworICAgICBmaXRzIGluIHVuIGxpbWJzLCB0aGUgbnVtYmVyIG9mIGV4dHJhIGxpbWJzIG5lZWRlZCBpcyBib3VuZGVkIGJ5CisgICAgIGNlaWwoaypsb2cyKDMvMikvR01QX05VTUJfQklUUykuICovCisgIC8qIFRISU5LOiB3aXRoIHRoZSB1c2Ugb2YgbG9nYmFzZWRfcm9vdCwgbWF5YmUgdGhlIGNvbnN0YW50IGlzCisgICAgIDI1OC8yNTYgaW5zdGVhZCBvZiAzLzIgPyBsb2cyKDI1OC8yNTYpIDwgMS84OSA8IDEvNjQgKi8KKyNkZWZpbmUgRVhUUkEgMiArIChtcF9zaXplX3QpICgwLjU4NSAqIChkb3VibGUpIGsgLyAoZG91YmxlKSBHTVBfTlVNQl9CSVRTKQorICBUTVBfQUxMT0NfTElNQlNfMyAoc2NyYXRjaCwgdW4gKyAxLCAvKiB1c2VkIGJ5IG1wbl9kaXZfcSAqLworCQkgICAgIHFwLCB1biArIEVYVFJBLCAgLyogd2lsbCBjb250YWluIHF1b3RpZW50IGFuZCByZW1haW5kZXIKKwkJCQkJIG9mIFIvKGsqU14oay0xKSksIGFuZCBTXmsgKi8KKwkJICAgICB3cCwgdW4gKyBFWFRSQSk7IC8qIHdpbGwgY29udGFpbiBTXihrLTEpLCBrKlNeKGstMSksCisJCQkJCSBhbmQgdGVtcG9yYXJ5IGZvciBtcG5fcG93XzEgKi8KKworICBpZiAocmVtcCA9PSBOVUxMKQorICAgIHJwID0gc2NyYXRjaDsJLyogd2lsbCBjb250YWluIHRoZSByZW1haW5kZXIgKi8KKyAgZWxzZQorICAgIHJwID0gcmVtcDsKKyAgc3AgPSByb290cDsKKworICBzbiA9IDE7CQkvKiBJbml0aWFsIGFwcHJveGltYXRpb24gaGFzIG9uZSBsaW1iICovCisKKyAgZm9yIChiID0geG5iOyBuaSAhPSAwOyAtLW5pKQorICAgIHsKKyAgICAgIC8qIDE6IGxvb3AgaW52YXJpYW50OgorCSB7c3AsIHNufSBpcyB0aGUgY3VycmVudCBhcHByb3hpbWF0aW9uIG9mIHRoZSByb290LCB3aGljaCBoYXMKKwkJICBleGFjdGx5IDEgKyBzaXplc1tuaV0gYml0cy4KKwkge3JwLCBybn0gaXMgdGhlIGN1cnJlbnQgcmVtYWluZGVyCisJIHt3cCwgd259ID0ge3NwLCBzbn1eKGstMSkKKwkga2sgPSBudW1iZXIgb2YgdHJ1bmNhdGVkIGJpdHMgb2YgdGhlIGlucHV0CisgICAgICAqLworCisgICAgICAvKiBTaW5jZSBlYWNoIGl0ZXJhdGlvbiB0cmVhdHMgYiBiaXRzIGZyb20gdGhlIHJvb3QgYW5kIHRodXMgaypiIGJpdHMKKwkgZnJvbSB0aGUgaW5wdXQsIGFuZCB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgYiBiaXRzIGZyb20gdGhlIGlucHV0LAorCSB3ZSBub3cgaGF2ZSB0byB0YWtlIGFub3RoZXIgKGstMSkqYiBiaXRzIGZyb20gdGhlIGlucHV0LiAqLworICAgICAga2sgLT0gKGsgLSAxKSAqIGI7IC8qIHJlbWFpbmluZyBpbnB1dCBiaXRzICovCisgICAgICAvKiB7cnAsIHJufSA9IGZsb29yKHt1cCwgdW59IC8gMl5raykgKi8KKyAgICAgIHJuID0gdW4gLSBrayAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBNUE5fUlNISUZUIChycCwgdXAgKyBrayAvIEdNUF9OVU1CX0JJVFMsIHJuLCBrayAlIEdNUF9OVU1CX0JJVFMpOworICAgICAgcm4gLT0gcnBbcm4gLSAxXSA9PSAwOworCisgICAgICAvKiA5OiBjdXJyZW50IGJ1ZmZlcnM6IHtzcCxzbn0sIHtycCxybn0gKi8KKworICAgICAgZm9yIChjID0gMDs7IGMrKykKKwl7CisJICAvKiBDb21wdXRlIFNeayBpbiB7cXAscW59LiAqLworCSAgLyogVyA8LSBTXihrLTEpIGZvciB0aGUgbmV4dCBpdGVyYXRpb24sCisJICAgICBhbmQgU15rID0gVyAqIFMuICovCisJICB3biA9IG1wbl9wb3dfMSAod3AsIHNwLCBzbiwgayAtIDEsIHFwKTsKKwkgIG1wbl9tdWwgKHFwLCB3cCwgd24sIHNwLCBzbik7CisJICBxbiA9IHduICsgc247CisJICBxbiAtPSBxcFtxbiAtIDFdID09IDA7CisKKwkgIHBlcmZfcG93ID0gMTsKKwkgIC8qIGlmIFNeayA+IGZsb29yKFUvMl5rayksIHRoZSByb290IGFwcHJveGltYXRpb24gd2FzIHRvbyBsYXJnZSAqLworCSAgaWYgKHFuID4gcm4gfHwgKHFuID09IHJuICYmIChwZXJmX3Bvdz1tcG5fY21wIChxcCwgcnAsIHJuKSkgPiAwKSkKKwkgICAgTVBOX0RFQ1JfVSAoc3AsIHNuLCAxKTsKKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvKiAxMDogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cnAscm59LCB7cXAscW59LCB7d3Asd259ICovCisKKyAgICAgIC8qIHNvbWV0aW1lcyB0d28gY29ycmVjdGlvbnMgYXJlIG5lZWRlZCB3aXRoIGxvZ2Jhc2VkX3Jvb3QqLworICAgICAgQVNTRVJUIChjIDw9IDEgKyBMT0dST09UX05FRURTX1RXT19DT1JSRUNUSU9OUyk7CisgICAgICBBU1NFUlRfQUxXQVlTIChybiA+PSBxbik7CisKKyAgICAgIGIgPSBzaXplc1tuaSAtIDFdIC0gc2l6ZXNbbmldOyAvKiBudW1iZXIgb2YgYml0cyB0byBjb21wdXRlIGluIHRoZQorCQkJCSAgICAgIG5leHQgaXRlcmF0aW9uICovCisgICAgICBibiA9IGIgLyBHTVBfTlVNQl9CSVRTOyAvKiBsb3dlc3QgbGltYiBmcm9tIGhpZ2ggcGFydCBvZiBycFtdLCBhZnRlciBzaGlmdCAqLworCisgICAgICBrayA9IGtrIC0gYjsKKyAgICAgIC8qIG5sIGlzIHRoZSBudW1iZXIgb2YgbGltYnMgaW4gVSB3aGljaCBjb250YWluIGJpdHMgW2trLGtrK2ItMV0gKi8KKyAgICAgIG5sID0gMSArIChrayArIGIgLSAxKSAvIEdNUF9OVU1CX0JJVFMgLSAoa2sgLyBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIC8qIG5sICA9IDEgKyBmbG9vcigoa2sgKyBiIC0gMSkgLyBHTVBfTlVNQl9CSVRTKQorCQkgLSBmbG9vcihrayAvIEdNUF9OVU1CX0JJVFMpCisJICAgICA8PSAxICsgKGtrICsgYiAtIDEpIC8gR01QX05VTUJfQklUUworCQkgIC0gKGtrIC0gR01QX05VTUJfQklUUyArIDEpIC8gR01QX05VTUJfQklUUworCSAgICAgPSAyICsgKGIgLSAyKSAvIEdNUF9OVU1CX0JJVFMKKwkgdGh1cyBzaW5jZSBubCBpcyBhbiBpbnRlZ2VyOgorCSBubCA8PSAyICsgZmxvb3IoYi9HTVBfTlVNQl9CSVRTKSA8PSAyICsgYm4uICovCisKKyAgICAgIC8qIDExOiBjdXJyZW50IGJ1ZmZlcnM6IHtzcCxzbn0sIHtycCxybn0sIHt3cCx3bn0gKi8KKworICAgICAgLyogUiA9IFIgLSBRID0gZmxvb3IoVS8yXmtrKSAtIFNeayAqLworICAgICAgaWYgKHBlcmZfcG93ICE9IDApCisJeworCSAgbXBuX3N1YiAocnAsIHJwLCBybiwgcXAsIHFuKTsKKwkgIE1QTl9OT1JNQUxJWkVfTk9UX1pFUk8gKHJwLCBybik7CisKKwkgIC8qIGZpcnN0IG11bHRpcGx5IHRoZSByZW1haW5kZXIgYnkgMl5iICovCisJICBNUE5fTFNISUZUIChjeSwgcnAgKyBibiwgcnAsIHJuLCBiICUgR01QX05VTUJfQklUUyk7CisJICBybiA9IHJuICsgYm47CisJICBpZiAoY3kgIT0gMCkKKwkgICAgeworCSAgICAgIHJwW3JuXSA9IGN5OworCSAgICAgIHJuKys7CisJICAgIH0KKworCSAgc2F2ZSA9IHJwW2JuXTsKKwkgIC8qIHdlIGhhdmUgdG8gc2F2ZSBycFtibl0gdXAgdG8gcnBbbmwtMV0sIGkuZS4gMSBvciAyIGxpbWJzICovCisJICBpZiAobmwgLSAxID4gYm4pCisJICAgIHNhdmUyID0gcnBbYm4gKyAxXTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcm4gPSBibjsKKwkgIHNhdmUyID0gc2F2ZSA9IDA7CisJfQorICAgICAgLyogMjogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cnAscm59LCB7d3Asd259ICovCisKKyAgICAgIC8qIE5vdyBpbnNlcnQgYml0cyBba2ssa2srYi0xXSBmcm9tIHRoZSBpbnB1dCBVICovCisgICAgICBNUE5fUlNISUZUIChycCwgdXAgKyBrayAvIEdNUF9OVU1CX0JJVFMsIG5sLCBrayAlIEdNUF9OVU1CX0JJVFMpOworICAgICAgLyogc2V0IHRvIHplcm8gaGlnaCBiaXRzIG9mIHJwW2JuXSAqLworICAgICAgcnBbYm5dICY9IChDTlNUX0xJTUIgKDEpIDw8IChiICUgR01QX05VTUJfQklUUykpIC0gMTsKKyAgICAgIC8qIHJlc3RvcmUgY29ycmVzcG9uZGluZyBiaXRzICovCisgICAgICBycFtibl0gfD0gc2F2ZTsKKyAgICAgIGlmIChubCAtIDEgPiBibikKKwlycFtibiArIDFdID0gc2F2ZTI7IC8qIHRoZSBsb3cgYiBiaXRzIGdvIGluIHJwWzAuLmJuXSBvbmx5LCBzaW5jZQorCQkJICAgICAgIHRoZXkgc3RhcnQgYnkgYml0IDAgaW4gcnBbMF0sIHNvIHRoZXkgdXNlCisJCQkgICAgICAgYXQgbW9zdCBjZWlsKGIvR01QX05VTUJfQklUUykgbGltYnMgKi8KKyAgICAgIC8qIEZJWE1FOiBTaG91bGQgd2Ugbm9ybWFsaXNlIHtycCxybn0gaGVyZSA/Ki8KKworICAgICAgLyogMzogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cnAscm59LCB7d3Asd259ICovCisKKyAgICAgIC8qIGNvbXB1dGUge3dwLCB3bn0gPSBrICoge3NwLCBzbn1eKGstMSkgKi8KKyAgICAgIGN5ID0gbXBuX211bF8xICh3cCwgd3AsIHduLCBrKTsKKyAgICAgIHdwW3duXSA9IGN5OworICAgICAgd24gKz0gY3kgIT0gMDsKKworICAgICAgLyogNjogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cXAscW59ICovCisKKyAgICAgIC8qIG11bHRpcGx5IHRoZSByb290IGFwcHJveGltYXRpb24gYnkgMl5iICovCisgICAgICBNUE5fTFNISUZUIChjeSwgc3AgKyBiIC8gR01QX05VTUJfQklUUywgc3AsIHNuLCBiICUgR01QX05VTUJfQklUUyk7CisgICAgICBzbiA9IHNuICsgYiAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBpZiAoY3kgIT0gMCkKKwl7CisJICBzcFtzbl0gPSBjeTsKKwkgIHNuKys7CisJfQorCisgICAgICBzYXZlID0gc3BbYiAvIEdNUF9OVU1CX0JJVFNdOworCisgICAgICAvKiBOdW1iZXIgb2YgbGltYnMgdXNlZCBieSBiIGJpdHMsIHdoZW4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzCisJIGFsaWduZWQgdG8gbGVhc3QgbGltYiAqLworICAgICAgYm4gPSAoYiAtIDEpIC8gR01QX05VTUJfQklUUyArIDE7CisKKyAgICAgIC8qIDQ6IGN1cnJlbnQgYnVmZmVyczoge3NwLHNufSwge3JwLHJufSwge3dwLHdufSAqLworCisgICAgICAvKiBub3cgZGl2aWRlIHtycCwgcm59IGJ5IHt3cCwgd259IHRvIGdldCB0aGUgbG93IHBhcnQgb2YgdGhlIHJvb3QgKi8KKyAgICAgIGlmIChVTkxJS0VMWSAocm4gPCB3bikpCisJeworCSAgTVBOX0ZJTEwgKHNwLCBibiwgMCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHFuID0gcm4gLSB3bjsgLyogZXhwZWN0ZWQgcXVvdGllbnQgc2l6ZSAqLworCSAgaWYgKHFuIDw9IGJuKSB7IC8qIERpdmlkZSBvbmx5IGlmIHJlc3VsdCBpcyBub3QgdG9vIGJpZy4gKi8KKwkgICAgbXBuX2Rpdl9xIChxcCwgcnAsIHJuLCB3cCwgd24sIHNjcmF0Y2gpOworCSAgICBxbiArPSBxcFtxbl0gIT0gMDsKKwkgIH0KKworICAgICAgLyogNTogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cXAscW59LgorCSBOb3RlOiB7cnAscm59IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgc2luY2Ugd2UnbGwgY29tcHV0ZSBpdCBmcm9tCisJIHNjcmF0Y2ggYXQgdGhlIGVuZCBvZiB0aGUgbG9vcC4KKyAgICAgICAqLworCisgICAgICAvKiB0aGUgcXVvdGllbnQgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiAyXmIsIHNpbmNlIHRoZSBwcmV2aW91cworCSBhcHByb3hpbWF0aW9uIHdhcyBjb3JyZWN0bHkgcm91bmRlZCB0b3dhcmQgemVybyAqLworCSAgaWYgKHFuID4gYm4gfHwgKHFuID09IGJuICYmIChiICUgR01QX05VTUJfQklUUyAhPSAwKSAmJgorCQkJICBxcFtxbiAtIDFdID49IChDTlNUX0xJTUIgKDEpIDw8IChiICUgR01QX05VTUJfQklUUykpKSkKKwkgICAgeworCSAgICAgIGZvciAocW4gPSAxOyBxbiA8IGJuOyArK3FuKQorCQlzcFtxbiAtIDFdID0gR01QX05VTUJfTUFYOworCSAgICAgIHNwW3FuIC0gMV0gPSBHTVBfTlVNQl9NQVggPj4gKEdNUF9OVU1CX0JJVFMgLSAxIC0gKChiIC0gMSkgJSBHTVBfTlVNQl9CSVRTKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworICAgICAgLyogNzogY3VycmVudCBidWZmZXJzOiB7c3Asc259LCB7cXAscW59ICovCisKKyAgICAgIC8qIENvbWJpbmUgc0IgYW5kIHEgdG8gZm9ybSBzQiArIHEuICAqLworCSAgICAgIE1QTl9DT1BZIChzcCwgcXAsIHFuKTsKKwkgICAgICBNUE5fWkVSTyAoc3AgKyBxbiwgYm4gLSBxbik7CisJICAgIH0KKwl9CisgICAgICBzcFtiIC8gR01QX05VTUJfQklUU10gfD0gc2F2ZTsKKworICAgICAgLyogODogY3VycmVudCBidWZmZXI6IHtzcCxzbn0gKi8KKworICAgIH0KKworICAvKiBvdGhlcndpc2Ugd2UgaGF2ZSBybiA+IDAsIHRodXMgdGhlIHJldHVybiB2YWx1ZSBpcyBvayAqLworICBpZiAoIWFwcHJveCB8fCBzcFswXSA8PSBDTlNUX0xJTUIgKDEpKQorICAgIHsKKyAgICAgIGZvciAoYyA9IDA7OyBjKyspCisJeworCSAgLyogQ29tcHV0ZSBTXmsgaW4ge3FwLHFufS4gKi8KKwkgIC8qIExhc3QgaXRlcmF0aW9uOiB3ZSBkb24ndCBuZWVkIFcgYW55bW9yZS4gKi8KKwkgIC8qIG1wbl9wb3dfMSByZXF1aXJlcyB0aGF0IGJvdGggcXAgYW5kIHdwIGhhdmUgZW5vdWdoCisJICAgICBzcGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0IHtzcCxzbn1eayArIDEgbGltYiAqLworCSAgcW4gPSBtcG5fcG93XzEgKHFwLCBzcCwgc24sIGssIHdwKTsKKworCSAgcGVyZl9wb3cgPSAxOworCSAgaWYgKHFuID4gdW4gfHwgKHFuID09IHVuICYmIChwZXJmX3Bvdz1tcG5fY21wIChxcCwgdXAsIHVuKSkgPiAwKSkKKwkgICAgTVBOX0RFQ1JfVSAoc3AsIHNuLCAxKTsKKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfTsKKworICAgICAgLyogc29tZXRpbWVzIHR3byBjb3JyZWN0aW9ucyBhcmUgbmVlZGVkIHdpdGggbG9nYmFzZWRfcm9vdCovCisgICAgICBBU1NFUlQgKGMgPD0gMSArIExPR1JPT1RfTkVFRFNfVFdPX0NPUlJFQ1RJT05TKTsKKworICAgICAgcm4gPSBwZXJmX3BvdyAhPSAwOworICAgICAgaWYgKHJuICE9IDAgJiYgcmVtcCAhPSBOVUxMKQorCXsKKwkgIG1wbl9zdWIgKHJlbXAsIHVwLCB1biwgcXAsIHFuKTsKKwkgIHJuID0gdW47CisJICBNUE5fTk9STUFMSVpFX05PVF9aRVJPIChyZW1wLCBybik7CisJfQorICAgIH0KKworICBUTVBfRlJFRTsKKyAgcmV0dXJuIHJuOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvcnNoaWZ0LmMgYi9tcG4vZ2VuZXJpYy9yc2hpZnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ0MjdkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvcnNoaWZ0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogbXBuX3JzaGlmdCAtLSBTaGlmdCByaWdodCBsb3cgbGV2ZWwuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBTaGlmdCBVIChwb2ludGVkIHRvIGJ5IHVwIGFuZCBOIGxpbWJzIGxvbmcpIGNudCBiaXRzIHRvIHRoZSByaWdodAorICAgYW5kIHN0b3JlIHRoZSBuIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzIG9mIHRoZSByZXN1bHQgYXQgcnAuCisgICBUaGUgYml0cyBzaGlmdGVkIG91dCB0byB0aGUgcmlnaHQgYXJlIHJldHVybmVkLgorCisgICBBcmd1bWVudCBjb25zdHJhaW50czoKKyAgIDEuIDAgPCBjbnQgPCBHTVBfTlVNQl9CSVRTLgorICAgMi4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZSB3cml0dGVuIG92ZXIgdGhlIGlucHV0LCBycCBtdXN0IGJlIDw9IHVwLgorKi8KKworbXBfbGltYl90CittcG5fcnNoaWZ0IChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBjbnQpCit7CisgIG1wX2xpbWJfdCBoaWdoX2xpbWIsIGxvd19saW1iOworICB1bnNpZ25lZCBpbnQgdG5jOworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IHJldHZhbDsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoY250ID49IDEpOworICBBU1NFUlQgKGNudCA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX0lOQ1JfUCAocnAsIHVwLCBuKSk7CisKKyAgdG5jID0gR01QX05VTUJfQklUUyAtIGNudDsKKyAgaGlnaF9saW1iID0gKnVwKys7CisgIHJldHZhbCA9IChoaWdoX2xpbWIgPDwgdG5jKSAmIEdNUF9OVU1CX01BU0s7CisgIGxvd19saW1iID0gaGlnaF9saW1iID4+IGNudDsKKworICBmb3IgKGkgPSBuIC0gMTsgaSAhPSAwOyBpLS0pCisgICAgeworICAgICAgaGlnaF9saW1iID0gKnVwKys7CisgICAgICAqcnArKyA9IGxvd19saW1iIHwgKChoaWdoX2xpbWIgPDwgdG5jKSAmIEdNUF9OVU1CX01BU0spOworICAgICAgbG93X2xpbWIgPSBoaWdoX2xpbWIgPj4gY250OworICAgIH0KKyAgKnJwID0gbG93X2xpbWI7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NicGkxX2JkaXZfcS5jIGIvbXBuL2dlbmVyaWMvc2JwaTFfYmRpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwZTU5MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NicGkxX2JkaXZfcS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIG1wbl9zYnBpMV9iZGl2X3EgLS0gc2Nob29sYm9vayBIZW5zZWwgZGl2aXNpb24gd2l0aCBwcmVjb21wdXRlZCBpbnZlcnNlLAorICAgcmV0dXJuaW5nIHF1b3RpZW50IG9ubHkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBOaWVscyBNw7ZsbGVyIGFuZCBUb3JiasO2cm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBGVU5DVElPTlMgV0lUSCBNVVRBQkxFIElOVEVSRkFDRVMuCisgICBJVCBJUyBPTkxZIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTCisgICBBTE1PU1QgR1VBUkFOVEVFRCBUSEFUIFRIRVknTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDUsIDIwMDYsIDIwMDksIDIwMTEsIDIwMTIsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBDb21wdXRlcyBRID0gLSBVIC8gRCBtb2QgQl51biwgZGVzdHJveXMgVS4KKworICAgRCBtdXN0IGJlIG9kZC4gZGludiBpcyAoLUQpXi0xIG1vZCBCLgorCisqLworCit2b2lkCittcG5fc2JwaTFfYmRpdl9xIChtcF9wdHIgcXAsCisJCSAgbXBfcHRyIHVwLCBtcF9zaXplX3QgdW4sCisJCSAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJCSAgbXBfbGltYl90IGRpbnYpCit7CisgIG1wX3NpemVfdCBpOworICBtcF9saW1iX3QgcTsKKworICBBU1NFUlQgKGRuID4gMCk7CisgIEFTU0VSVCAodW4gPj0gZG4pOworICBBU1NFUlQgKChkcFswXSAmIDEpICE9IDApOworICBBU1NFUlQgKC0oZHBbMF0gKiBkaW52KSA9PSAxKTsKKyAgQVNTRVJUICh1cCA9PSBxcCB8fCAhTVBOX09WRVJMQVBfUCAodXAsIHVuLCBxcCwgdW4gLSBkbikpOworCisgIGlmICh1biA+IGRuKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeSwgaGk7CisgICAgICBmb3IgKGkgPSB1biAtIGRuIC0gMSwgY3kgPSAwOyBpID4gMDsgaS0tKQorCXsKKwkgIHEgPSBkaW52ICogdXBbMF07CisJICBoaSA9IG1wbl9hZGRtdWxfMSAodXAsIGRwLCBkbiwgcSk7CisKKwkgIEFTU0VSVCAodXBbMF0gPT0gMCk7CisJICAqcXArKyA9IHE7CisJICBoaSArPSBjeTsKKwkgIGN5ID0gaGkgPCBjeTsKKwkgIGhpICs9IHVwW2RuXTsKKwkgIGN5ICs9IGhpIDwgdXBbZG5dOworCSAgdXBbZG5dID0gaGk7CisJICB1cCsrOworCX0KKyAgICAgIHEgPSBkaW52ICogdXBbMF07CisgICAgICBoaSA9IGN5ICsgbXBuX2FkZG11bF8xICh1cCwgZHAsIGRuLCBxKTsKKyAgICAgIEFTU0VSVCAodXBbMF0gPT0gMCk7CisgICAgICAqcXArKyA9IHE7CisgICAgICB1cFtkbl0gKz0gaGk7CisgICAgICB1cCsrOworICAgIH0KKyAgZm9yIChpID0gZG47IGkgPiAxOyBpLS0pCisgICAgeworICAgICAgbXBfbGltYl90IHEgPSBkaW52ICogdXBbMF07CisgICAgICBtcG5fYWRkbXVsXzEgKHVwLCBkcCwgaSwgcSk7CisgICAgICBBU1NFUlQgKHVwWzBdID09IDApOworICAgICAgKnFwKysgPSBxOworICAgICAgdXArKzsKKyAgICB9CisKKyAgLyogRmluYWwgbGltYiAqLworICAqcXAgPSBkaW52ICogdXBbMF07Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zYnBpMV9iZGl2X3FyLmMgYi9tcG4vZ2VuZXJpYy9zYnBpMV9iZGl2X3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NmM0NQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NicGkxX2JkaXZfcXIuYwpAQCAtMCwwICsxLDgyIEBACisvKiBtcG5fc2JwaTFfYmRpdl9xciAtLSBzY2hvb2xib29rIEhlbnNlbCBkaXZpc2lvbiB3aXRoIHByZWNvbXB1dGVkIGludmVyc2UsCisgICByZXR1cm5pbmcgcXVvdGllbnQgYW5kIHJlbWFpbmRlci4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIgYW5kIFRvcmJqw7ZybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIEZVTkNUSU9OUyBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4KKyAgIElUIElTIE9OTFkgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMKKyAgIEFMTU9TVCBHVUFSQU5URUVEIFRIQVQgVEhFWSdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwOSwgMjAxMSwgMjAxMiwgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQ29tcHV0ZXMgYSBiaW5hcnkgcXVvdGllbnQgb2Ygc2l6ZSBxbiA9IHVuIC0gZG4uCisgICBPdXRwdXQ6CisKKyAgICAgIFEgPSAtVSAqIEReey0xfSBtb2QgQl5xbiwKKworICAgICAgUiA9IChVICsgUSAqIEQpICogQl4oLXFuKQorCisgICBTdG9yZXMgdGhlIGRuIGxlYXN0IHNpZ25pZmljYW50IGxpbWJzIG9mIFIgYXQge3VwICsgdW4gLSBkbiwgZG59LAorICAgYW5kIHJldHVybnMgdGhlIGNhcnJ5IGZyb20gdGhlIGFkZGl0aW9uIE4gKyBRKkQuCisKKyAgIEQgbXVzdCBiZSBvZGQuIGRpbnYgaXMgKC1EKV4tMSBtb2QgQi4gKi8KKworbXBfbGltYl90CittcG5fc2JwaTFfYmRpdl9xciAobXBfcHRyIHFwLAorCQkgICBtcF9wdHIgdXAsIG1wX3NpemVfdCB1biwKKwkJICAgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sIG1wX2xpbWJfdCBkaW52KQoreworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IGN5OworCisgIEFTU0VSVCAoZG4gPiAwKTsKKyAgQVNTRVJUICh1biA+IGRuKTsKKyAgQVNTRVJUICgoZHBbMF0gJiAxKSAhPSAwKTsKKyAgQVNTRVJUICgtKGRwWzBdICogZGludikgPT0gMSk7CisgIEFTU0VSVCAodXAgPT0gcXAgfHwgIU1QTl9PVkVSTEFQX1AgKHVwLCB1biwgcXAsIHVuIC0gZG4pKTsKKworICBmb3IgKGkgPSB1biAtIGRuLCBjeSA9IDA7IGkgIT0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxID0gZGludiAqIHVwWzBdOworICAgICAgbXBfbGltYl90IGhpID0gbXBuX2FkZG11bF8xICh1cCwgZHAsIGRuLCBxKTsKKyAgICAgICpxcCsrID0gcTsKKworICAgICAgaGkgKz0gY3k7CisgICAgICBjeSA9IGhpIDwgY3k7CisgICAgICBoaSArPSB1cFtkbl07CisgICAgICBjeSArPSBoaSA8IHVwW2RuXTsKKyAgICAgIHVwW2RuXSA9IGhpOworICAgICAgdXArKzsKKyAgICB9CisKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2JwaTFfYmRpdl9yLmMgYi9tcG4vZ2VuZXJpYy9zYnBpMV9iZGl2X3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA5OTUxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2JwaTFfYmRpdl9yLmMKQEAgLTAsMCArMSw3OSBAQAorLyogbXBuX3NicGkxX2JkaXZfciAtLSBzY2hvb2xib29rIEhlbnNlbCBkaXZpc2lvbiB3aXRoIHByZWNvbXB1dGVkIGludmVyc2UsCisgICByZXR1cm5pbmcgcmVtYWluZGVyLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlciBhbmQgVG9yYmrDtnJuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgSU5URVJOQUwgRlVOQ1RJT05TIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLgorICAgSVQgSVMgT05MWSBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUworICAgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBUSEVZJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR01QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA2LCAyMDA5LCAyMDExLCAyMDEyLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBDb21wdXRlcyBhIGJpbmFyeSBxdW90aWVudCBvZiBzaXplIHFuID0gdW4gLSBkbi4KKyAgIE91dHB1dDoKKworICAgICAgUSA9IC1VICogRF57LTF9IG1vZCBCXnFuLAorCisgICAgICBSID0gKFUgKyBRICogRCkgKiBCXigtcW4pCisKKyAgIFN0b3JlcyB0aGUgZG4gbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgUiBhdCB7dXAgKyB1biAtIGRuLCBkbn0sCisgICBhbmQgcmV0dXJucyB0aGUgY2FycnkgZnJvbSB0aGUgYWRkaXRpb24gTiArIFEqRC4KKworICAgRCBtdXN0IGJlIG9kZC4gZGludiBpcyAoLUQpXi0xIG1vZCBCLiAqLworCittcF9saW1iX3QKK21wbl9zYnBpMV9iZGl2X3IgKG1wX3B0ciB1cCwgbXBfc2l6ZV90IHVuLAorCQkgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLCBtcF9saW1iX3QgZGludikKK3sKKyAgbXBfc2l6ZV90IGk7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKGRuID4gMCk7CisgIEFTU0VSVCAodW4gPiBkbik7CisgIEFTU0VSVCAoKGRwWzBdICYgMSkgIT0gMCk7CisgIEFTU0VSVCAoLShkcFswXSAqIGRpbnYpID09IDEpOworCisgIGZvciAoaSA9IHVuIC0gZG4sIGN5ID0gMDsgaSAhPSAwOyBpLS0pCisgICAgeworICAgICAgbXBfbGltYl90IHEgPSBkaW52ICogdXBbMF07CisgICAgICBtcF9saW1iX3QgaGkgPSBtcG5fYWRkbXVsXzEgKHVwLCBkcCwgZG4sIHEpOworCisgICAgICBoaSArPSBjeTsKKyAgICAgIGN5ID0gaGkgPCBjeTsKKyAgICAgIGhpICs9IHVwW2RuXTsKKyAgICAgIGN5ICs9IGhpIDwgdXBbZG5dOworICAgICAgdXBbZG5dID0gaGk7CisgICAgICB1cCsrOworICAgIH0KKworICByZXR1cm4gY3k7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zYnBpMV9kaXZfcS5jIGIvbXBuL2dlbmVyaWMvc2JwaTFfZGl2X3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk3NWViCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2JwaTFfZGl2X3EuYwpAQCAtMCwwICsxLDMwMiBAQAorLyogbXBuX3NicGkxX2Rpdl9xIC0tIFNjaG9vbGJvb2sgZGl2aXNpb24gdXNpbmcgdGhlIE3DtmxsZXItR3Jhbmx1bmQgMy8yCisgICBkaXZpc2lvbiBhbGdvcml0aG0uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcF9saW1iX3QKK21wbl9zYnBpMV9kaXZfcSAobXBfcHRyIHFwLAorCQkgbXBfcHRyIG5wLCBtcF9zaXplX3Qgbm4sCisJCSBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwKKwkJIG1wX2xpbWJfdCBkaW52KQoreworICBtcF9saW1iX3QgcWg7CisgIG1wX3NpemVfdCBxbiwgaTsKKyAgbXBfbGltYl90IG4xLCBuMDsKKyAgbXBfbGltYl90IGQxLCBkMDsKKyAgbXBfbGltYl90IGN5LCBjeTE7CisgIG1wX2xpbWJfdCBxOworICBtcF9saW1iX3QgZmxhZzsKKworICBtcF9zaXplX3QgZG5fb3JpZyA9IGRuOworICBtcF9zcmNwdHIgZHBfb3JpZyA9IGRwOworICBtcF9wdHIgbnBfb3JpZyA9IG5wOworCisgIEFTU0VSVCAoZG4gPiAyKTsKKyAgQVNTRVJUIChubiA+PSBkbik7CisgIEFTU0VSVCAoKGRwW2RuLTFdICYgR01QX05VTUJfSElHSEJJVCkgIT0gMCk7CisKKyAgbnAgKz0gbm47CisKKyAgcW4gPSBubiAtIGRuOworICBpZiAocW4gKyAxIDwgZG4pCisgICAgeworICAgICAgZHAgKz0gZG4gLSAocW4gKyAxKTsKKyAgICAgIGRuID0gcW4gKyAxOworICAgIH0KKworICBxaCA9IG1wbl9jbXAgKG5wIC0gZG4sIGRwLCBkbikgPj0gMDsKKyAgaWYgKHFoICE9IDApCisgICAgbXBuX3N1Yl9uIChucCAtIGRuLCBucCAtIGRuLCBkcCwgZG4pOworCisgIHFwICs9IHFuOworCisgIGRuIC09IDI7CQkJLyogb2Zmc2V0IGRuIGJ5IDIgZm9yIG1haW4gZGl2aXNpb24gbG9vcHMsCisJCQkJICAgc2F2aW5nIHR3byBpdGVyYXRpb25zIGluIG1wbl9zdWJtdWxfMS4gICovCisgIGQxID0gZHBbZG4gKyAxXTsKKyAgZDAgPSBkcFtkbiArIDBdOworCisgIG5wIC09IDI7CisKKyAgbjEgPSBucFsxXTsKKworICBmb3IgKGkgPSBxbiAtIChkbiArIDIpOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBucC0tOworICAgICAgaWYgKFVOTElLRUxZIChuMSA9PSBkMSkgJiYgbnBbMV0gPT0gZDApCisJeworCSAgcSA9IEdNUF9OVU1CX01BU0s7CisJICBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwLCBkbiArIDIsIHEpOworCSAgbjEgPSBucFsxXTsJCS8qIHVwZGF0ZSBuMSwgbGFzdCBsb29wJ3MgdmFsdWUgd2lsbCBub3cgYmUgaW52YWxpZCAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1ZGl2X3FyXzNieTIgKHEsIG4xLCBuMCwgbjEsIG5wWzFdLCBucFswXSwgZDEsIGQwLCBkaW52KTsKKworCSAgY3kgPSBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwLCBkbiwgcSk7CisKKwkgIGN5MSA9IG4wIDwgY3k7CisJICBuMCA9IChuMCAtIGN5KSAmIEdNUF9OVU1CX01BU0s7CisJICBjeSA9IG4xIDwgY3kxOworCSAgbjEgLT0gY3kxOworCSAgbnBbMF0gPSBuMDsKKworCSAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwkgICAgeworCSAgICAgIG4xICs9IGQxICsgbXBuX2FkZF9uIChucCAtIGRuLCBucCAtIGRuLCBkcCwgZG4gKyAxKTsKKwkgICAgICBxLS07CisJICAgIH0KKwl9CisKKyAgICAgICotLXFwID0gcTsKKyAgICB9CisKKyAgZmxhZyA9IH5DTlNUX0xJTUIoMCk7CisKKyAgaWYgKGRuID49IDApCisgICAgeworICAgICAgZm9yIChpID0gZG47IGkgPiAwOyBpLS0pCisJeworCSAgbnAtLTsKKwkgIGlmIChVTkxJS0VMWSAobjEgPj0gKGQxICYgZmxhZykpKQorCSAgICB7CisJICAgICAgcSA9IEdNUF9OVU1CX01BU0s7CisJICAgICAgY3kgPSBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwLCBkbiArIDIsIHEpOworCisJICAgICAgaWYgKFVOTElLRUxZIChuMSAhPSBjeSkpCisJCXsKKwkJICBpZiAobjEgPCAoY3kgJiBmbGFnKSkKKwkJICAgIHsKKwkJICAgICAgcS0tOworCQkgICAgICBtcG5fYWRkX24gKG5wIC0gZG4sIG5wIC0gZG4sIGRwLCBkbiArIDIpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGZsYWcgPSAwOworCQl9CisJICAgICAgbjEgPSBucFsxXTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdWRpdl9xcl8zYnkyIChxLCBuMSwgbjAsIG4xLCBucFsxXSwgbnBbMF0sIGQxLCBkMCwgZGludik7CisKKwkgICAgICBjeSA9IG1wbl9zdWJtdWxfMSAobnAgLSBkbiwgZHAsIGRuLCBxKTsKKworCSAgICAgIGN5MSA9IG4wIDwgY3k7CisJICAgICAgbjAgPSAobjAgLSBjeSkgJiBHTVBfTlVNQl9NQVNLOworCSAgICAgIGN5ID0gbjEgPCBjeTE7CisJICAgICAgbjEgLT0gY3kxOworCSAgICAgIG5wWzBdID0gbjA7CisKKwkgICAgICBpZiAoVU5MSUtFTFkgKGN5ICE9IDApKQorCQl7CisJCSAgbjEgKz0gZDEgKyBtcG5fYWRkX24gKG5wIC0gZG4sIG5wIC0gZG4sIGRwLCBkbiArIDEpOworCQkgIHEtLTsKKwkJfQorCSAgICB9CisKKwkgICotLXFwID0gcTsKKworCSAgLyogVHJ1bmNhdGUgb3BlcmFuZHMuICAqLworCSAgZG4tLTsKKwkgIGRwKys7CisJfQorCisgICAgICBucC0tOworICAgICAgaWYgKFVOTElLRUxZIChuMSA+PSAoZDEgJiBmbGFnKSkpCisJeworCSAgcSA9IEdNUF9OVU1CX01BU0s7CisJICBjeSA9IG1wbl9zdWJtdWxfMSAobnAsIGRwLCAyLCBxKTsKKworCSAgaWYgKFVOTElLRUxZIChuMSAhPSBjeSkpCisJICAgIHsKKwkgICAgICBpZiAobjEgPCAoY3kgJiBmbGFnKSkKKwkJeworCQkgIHEtLTsKKwkJICBhZGRfc3NhYWFhIChucFsxXSwgbnBbMF0sIG5wWzFdLCBucFswXSwgZHBbMV0sIGRwWzBdKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJZmxhZyA9IDA7CisJICAgIH0KKwkgIG4xID0gbnBbMV07CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVkaXZfcXJfM2J5MiAocSwgbjEsIG4wLCBuMSwgbnBbMV0sIG5wWzBdLCBkMSwgZDAsIGRpbnYpOworCisJICBucFswXSA9IG4wOworCSAgbnBbMV0gPSBuMTsKKwl9CisKKyAgICAgICotLXFwID0gcTsKKyAgICB9CisgIEFTU0VSVF9BTFdBWVMgKG5wWzFdID09IG4xKTsKKyAgbnAgKz0gMjsKKworCisgIGRuID0gZG5fb3JpZzsKKyAgaWYgKFVOTElLRUxZIChuMSA8IChkbiAmIGZsYWcpKSkKKyAgICB7CisgICAgICBtcF9saW1iX3QgcSwgeDsKKworICAgICAgLyogVGhlIHF1b3RpZW50IG1heSBiZSB0b28gbGFyZ2UgaWYgdGhlIHJlbWFpbmRlciBpcyBzbWFsbC4gIFJlY29tcHV0ZQorCSBmb3IgYWJvdmUgaWdub3JlZCBvcGVyYW5kIHBhcnRzLCB1bnRpbCB0aGUgcmVtYWluZGVyIHNwaWxscy4KKworCSBGSVhNRTogVGhlIHF1YWxpdHkgb2YgdGhpcyBjb2RlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBjb2RlIGFib3ZlLgorCSAxLiBXZSBkb24ndCBjb21wdXRlIHRoaW5ncyBpbiBhbiBvcHRpbWFsIG9yZGVyLCBoaWdoLXRvLWxvdywgaW4gb3JkZXIKKwkgICAgdG8gdGVybWluYXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisJIDIuIFdlIG1lc3Mgd2l0aCBwb2ludGVycyBhbmQgc2l6ZXMsIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgYW5kCisJICAgIGFkanVzdGluZyB0byBnZXQgdGhpbmdzIHJpZ2h0LiAgSXQgc3VyZWx5IGNvdWxkIGJlIHN0cmVhbWxpbmVkLgorCSAzLiBUaGUgb25seSB0ZXJtaW5hdGlvbiBjcml0ZXJpYSBhcmUgdGhhdCB3ZSBkZXRlcm1pbmUgdGhhdCB0aGUKKwkgICAgcXVvdGllbnQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQsIG9yIHRoYXQgd2UgaGF2ZSByZWNvbXB1dGVkCisJICAgIGV2ZXJ5dGhpbmcuICBXZSBzaG91bGQgc3RvcCB3aGVuIHRoZSByZW1haW5kZXIgaXMgc28gbGFyZ2UKKwkgICAgdGhhdCBubyBhZGRpdGlvbmFsIHN1YnRyYWN0aW5nIGNvdWxkIG1ha2UgaXQgc3BpbGwuCisJIDQuIElmIG5vdGhpbmcgZWxzZSwgd2Ugc2hvdWxkIG5vdCBkbyB0d28gbG9vcHMgb2Ygc3VibXVsXzEgb3ZlciB0aGUKKwkgICAgZGF0YSwgaW5zdGVhZCBoYW5kbGUgYm90aCB0aGUgdHJpYW5ndWxhcml6YXRpb24gYW5kIGNob3BwaW5nIGF0CisJICAgIG9uY2UuICAqLworCisgICAgICB4ID0gbjE7CisKKyAgICAgIGlmIChkbiA+IDIpCisJeworCSAgLyogQ29tcGVuc2F0ZSBmb3IgdHJpYW5ndWxhcml6YXRpb24uICAqLworCSAgbXBfbGltYl90IHk7CisKKwkgIGRwID0gZHBfb3JpZzsKKwkgIGlmIChxbiArIDEgPCBkbikKKwkgICAgeworCSAgICAgIGRwICs9IGRuIC0gKHFuICsgMSk7CisJICAgICAgZG4gPSBxbiArIDE7CisJICAgIH0KKworCSAgeSA9IG5wWy0yXTsKKworCSAgZm9yIChpID0gZG4gLSAzOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIHEgPSBxcFtpXTsKKwkgICAgICBjeSA9IG1wbl9zdWJtdWxfMSAobnAgLSAoZG4gLSBpKSwgZHAsIGRuIC0gaSAtIDIsIHEpOworCisJICAgICAgaWYgKHkgPCBjeSkKKwkJeworCQkgIGlmICh4ID09IDApCisJCSAgICB7CisJCSAgICAgIGN5ID0gbXBuX3N1Yl8xIChxcCwgcXAsIHFuLCAxKTsKKwkJICAgICAgQVNTRVJUX0FMV0FZUyAoY3kgPT0gMCk7CisJCSAgICAgIHJldHVybiBxaCAtIGN5OworCQkgICAgfQorCQkgIHgtLTsKKwkJfQorCSAgICAgIHkgLT0gY3k7CisJICAgIH0KKwkgIG5wWy0yXSA9IHk7CisJfQorCisgICAgICBkbiA9IGRuX29yaWc7CisgICAgICBpZiAocW4gKyAxIDwgZG4pCisJeworCSAgLyogQ29tcGVuc2F0ZSBmb3IgaWdub3JlZCBkaXZpZGVuZCBhbmQgZGl2aXNvciB0YWlscy4gICovCisKKwkgIGRwID0gZHBfb3JpZzsKKwkgIG5wID0gbnBfb3JpZzsKKworCSAgaWYgKHFoICE9IDApCisJICAgIHsKKwkgICAgICBjeSA9IG1wbl9zdWJfbiAobnAgKyBxbiwgbnAgKyBxbiwgZHAsIGRuIC0gKHFuICsgMSkpOworCSAgICAgIGlmIChjeSAhPSAwKQorCQl7CisJCSAgaWYgKHggPT0gMCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHFuICE9IDApCisJCQljeSA9IG1wbl9zdWJfMSAocXAsIHFwLCBxbiwgMSk7CisJCSAgICAgIHJldHVybiBxaCAtIGN5OworCQkgICAgfQorCQkgIHgtLTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChxbiA9PSAwKQorCSAgICByZXR1cm4gcWg7CisKKwkgIGZvciAoaSA9IGRuIC0gcW4gLSAyOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIGN5ID0gbXBuX3N1Ym11bF8xIChucCArIGksIHFwLCBxbiwgZHBbaV0pOworCSAgICAgIGN5ID0gbXBuX3N1Yl8xIChucCArIHFuICsgaSwgbnAgKyBxbiArIGksIGRuIC0gcW4gLSBpIC0gMSwgY3kpOworCSAgICAgIGlmIChjeSAhPSAwKQorCQl7CisJCSAgaWYgKHggPT0gMCkKKwkJICAgIHsKKwkJICAgICAgY3kgPSBtcG5fc3ViXzEgKHFwLCBxcCwgcW4sIDEpOworCQkgICAgICByZXR1cm4gcWg7CisJCSAgICB9CisJCSAgeC0tOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBxaDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NicGkxX2Rpdl9xci5jIGIvbXBuL2dlbmVyaWMvc2JwaTFfZGl2X3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzMGE3NwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NicGkxX2Rpdl9xci5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiBtcG5fc2JwaTFfZGl2X3FyIC0tIFNjaG9vbGJvb2sgZGl2aXNpb24gdXNpbmcgdGhlIE3DtmxsZXItR3Jhbmx1bmQgMy8yCisgICBkaXZpc2lvbiBhbGdvcml0aG0uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcF9saW1iX3QKK21wbl9zYnBpMV9kaXZfcXIgKG1wX3B0ciBxcCwKKwkJICBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwKKwkJICBtcF9saW1iX3QgZGludikKK3sKKyAgbXBfbGltYl90IHFoOworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IG4xLCBuMDsKKyAgbXBfbGltYl90IGQxLCBkMDsKKyAgbXBfbGltYl90IGN5LCBjeTE7CisgIG1wX2xpbWJfdCBxOworCisgIEFTU0VSVCAoZG4gPiAyKTsKKyAgQVNTRVJUIChubiA+PSBkbik7CisgIEFTU0VSVCAoKGRwW2RuLTFdICYgR01QX05VTUJfSElHSEJJVCkgIT0gMCk7CisKKyAgbnAgKz0gbm47CisKKyAgcWggPSBtcG5fY21wIChucCAtIGRuLCBkcCwgZG4pID49IDA7CisgIGlmIChxaCAhPSAwKQorICAgIG1wbl9zdWJfbiAobnAgLSBkbiwgbnAgLSBkbiwgZHAsIGRuKTsKKworICBxcCArPSBubiAtIGRuOworCisgIGRuIC09IDI7CQkJLyogb2Zmc2V0IGRuIGJ5IDIgZm9yIG1haW4gZGl2aXNpb24gbG9vcHMsCisJCQkJICAgc2F2aW5nIHR3byBpdGVyYXRpb25zIGluIG1wbl9zdWJtdWxfMS4gICovCisgIGQxID0gZHBbZG4gKyAxXTsKKyAgZDAgPSBkcFtkbiArIDBdOworCisgIG5wIC09IDI7CisKKyAgbjEgPSBucFsxXTsKKworICBmb3IgKGkgPSBubiAtIChkbiArIDIpOyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgIG5wLS07CisgICAgICBpZiAoVU5MSUtFTFkgKG4xID09IGQxKSAmJiBucFsxXSA9PSBkMCkKKwl7CisJICBxID0gR01QX05VTUJfTUFTSzsKKwkgIG1wbl9zdWJtdWxfMSAobnAgLSBkbiwgZHAsIGRuICsgMiwgcSk7CisJICBuMSA9IG5wWzFdOwkJLyogdXBkYXRlIG4xLCBsYXN0IGxvb3AncyB2YWx1ZSB3aWxsIG5vdyBiZSBpbnZhbGlkICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHVkaXZfcXJfM2J5MiAocSwgbjEsIG4wLCBuMSwgbnBbMV0sIG5wWzBdLCBkMSwgZDAsIGRpbnYpOworCisJICBjeSA9IG1wbl9zdWJtdWxfMSAobnAgLSBkbiwgZHAsIGRuLCBxKTsKKworCSAgY3kxID0gbjAgPCBjeTsKKwkgIG4wID0gKG4wIC0gY3kpICYgR01QX05VTUJfTUFTSzsKKwkgIGN5ID0gbjEgPCBjeTE7CisJICBuMSA9IChuMSAtIGN5MSkgJiBHTVBfTlVNQl9NQVNLOworCSAgbnBbMF0gPSBuMDsKKworCSAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwkgICAgeworCSAgICAgIG4xICs9IGQxICsgbXBuX2FkZF9uIChucCAtIGRuLCBucCAtIGRuLCBkcCwgZG4gKyAxKTsKKwkgICAgICBxLS07CisJICAgIH0KKwl9CisKKyAgICAgICotLXFwID0gcTsKKyAgICB9CisgIG5wWzFdID0gbjE7CisKKyAgcmV0dXJuIHFoOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2JwaTFfZGl2YXBwcl9xLmMgYi9tcG4vZ2VuZXJpYy9zYnBpMV9kaXZhcHByX3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdjYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2JwaTFfZGl2YXBwcl9xLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qIG1wbl9zYnBpMV9kaXZhcHByX3EgLS0gU2Nob29sYm9vayBkaXZpc2lvbiB1c2luZyB0aGUgTcO2bGxlci1HcmFubHVuZCAzLzIKKyAgIGRpdmlzaW9uIGFsZ29yaXRobSwgcmV0dXJuaW5nIGFwcHJveGltYXRlIHF1b3RpZW50LiAgVGhlIHF1b3RpZW50IHJldHVybmVkCisgICBpcyBlaXRoZXIgY29ycmVjdCwgb3Igb25lIHRvbyBsYXJnZS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR01QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK21wX2xpbWJfdAorbXBuX3NicGkxX2RpdmFwcHJfcSAobXBfcHRyIHFwLAorCQkgICAgIG1wX3B0ciBucCwgbXBfc2l6ZV90IG5uLAorCQkgICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorCQkgICAgIG1wX2xpbWJfdCBkaW52KQoreworICBtcF9saW1iX3QgcWg7CisgIG1wX3NpemVfdCBxbiwgaTsKKyAgbXBfbGltYl90IG4xLCBuMDsKKyAgbXBfbGltYl90IGQxLCBkMDsKKyAgbXBfbGltYl90IGN5LCBjeTE7CisgIG1wX2xpbWJfdCBxOworICBtcF9saW1iX3QgZmxhZzsKKworICBBU1NFUlQgKGRuID4gMik7CisgIEFTU0VSVCAobm4gPj0gZG4pOworICBBU1NFUlQgKChkcFtkbi0xXSAmIEdNUF9OVU1CX0hJR0hCSVQpICE9IDApOworCisgIG5wICs9IG5uOworCisgIHFuID0gbm4gLSBkbjsKKyAgaWYgKHFuICsgMSA8IGRuKQorICAgIHsKKyAgICAgIGRwICs9IGRuIC0gKHFuICsgMSk7CisgICAgICBkbiA9IHFuICsgMTsKKyAgICB9CisKKyAgcWggPSBtcG5fY21wIChucCAtIGRuLCBkcCwgZG4pID49IDA7CisgIGlmIChxaCAhPSAwKQorICAgIG1wbl9zdWJfbiAobnAgLSBkbiwgbnAgLSBkbiwgZHAsIGRuKTsKKworICBxcCArPSBxbjsKKworICBkbiAtPSAyOwkJCS8qIG9mZnNldCBkbiBieSAyIGZvciBtYWluIGRpdmlzaW9uIGxvb3BzLAorCQkJCSAgIHNhdmluZyB0d28gaXRlcmF0aW9ucyBpbiBtcG5fc3VibXVsXzEuICAqLworICBkMSA9IGRwW2RuICsgMV07CisgIGQwID0gZHBbZG4gKyAwXTsKKworICBucCAtPSAyOworCisgIG4xID0gbnBbMV07CisKKyAgZm9yIChpID0gcW4gLSAoZG4gKyAyKTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgbnAtLTsKKyAgICAgIGlmIChVTkxJS0VMWSAobjEgPT0gZDEpICYmIG5wWzFdID09IGQwKQorCXsKKwkgIHEgPSBHTVBfTlVNQl9NQVNLOworCSAgbXBuX3N1Ym11bF8xIChucCAtIGRuLCBkcCwgZG4gKyAyLCBxKTsKKwkgIG4xID0gbnBbMV07CQkvKiB1cGRhdGUgbjEsIGxhc3QgbG9vcCdzIHZhbHVlIHdpbGwgbm93IGJlIGludmFsaWQgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgdWRpdl9xcl8zYnkyIChxLCBuMSwgbjAsIG4xLCBucFsxXSwgbnBbMF0sIGQxLCBkMCwgZGludik7CisKKwkgIGN5ID0gbXBuX3N1Ym11bF8xIChucCAtIGRuLCBkcCwgZG4sIHEpOworCisJICBjeTEgPSBuMCA8IGN5OworCSAgbjAgPSAobjAgLSBjeSkgJiBHTVBfTlVNQl9NQVNLOworCSAgY3kgPSBuMSA8IGN5MTsKKwkgIG4xIC09IGN5MTsKKwkgIG5wWzBdID0gbjA7CisKKwkgIGlmIChVTkxJS0VMWSAoY3kgIT0gMCkpCisJICAgIHsKKwkgICAgICBuMSArPSBkMSArIG1wbl9hZGRfbiAobnAgLSBkbiwgbnAgLSBkbiwgZHAsIGRuICsgMSk7CisJICAgICAgcS0tOworCSAgICB9CisJfQorCisgICAgICAqLS1xcCA9IHE7CisgICAgfQorCisgIGZsYWcgPSB+Q05TVF9MSU1CKDApOworCisgIGlmIChkbiA+PSAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IGRuOyBpID4gMDsgaS0tKQorCXsKKwkgIG5wLS07CisJICBpZiAoVU5MSUtFTFkgKG4xID49IChkMSAmIGZsYWcpKSkKKwkgICAgeworCSAgICAgIHEgPSBHTVBfTlVNQl9NQVNLOworCSAgICAgIGN5ID0gbXBuX3N1Ym11bF8xIChucCAtIGRuLCBkcCwgZG4gKyAyLCBxKTsKKworCSAgICAgIGlmIChVTkxJS0VMWSAobjEgIT0gY3kpKQorCQl7CisJCSAgaWYgKG4xIDwgKGN5ICYgZmxhZykpCisJCSAgICB7CisJCSAgICAgIHEtLTsKKwkJICAgICAgbXBuX2FkZF9uIChucCAtIGRuLCBucCAtIGRuLCBkcCwgZG4gKyAyKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBmbGFnID0gMDsKKwkJfQorCSAgICAgIG4xID0gbnBbMV07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHVkaXZfcXJfM2J5MiAocSwgbjEsIG4wLCBuMSwgbnBbMV0sIG5wWzBdLCBkMSwgZDAsIGRpbnYpOworCisJICAgICAgY3kgPSBtcG5fc3VibXVsXzEgKG5wIC0gZG4sIGRwLCBkbiwgcSk7CisKKwkgICAgICBjeTEgPSBuMCA8IGN5OworCSAgICAgIG4wID0gKG4wIC0gY3kpICYgR01QX05VTUJfTUFTSzsKKwkgICAgICBjeSA9IG4xIDwgY3kxOworCSAgICAgIG4xIC09IGN5MTsKKwkgICAgICBucFswXSA9IG4wOworCisJICAgICAgaWYgKFVOTElLRUxZIChjeSAhPSAwKSkKKwkJeworCQkgIG4xICs9IGQxICsgbXBuX2FkZF9uIChucCAtIGRuLCBucCAtIGRuLCBkcCwgZG4gKyAxKTsKKwkJICBxLS07CisJCX0KKwkgICAgfQorCisJICAqLS1xcCA9IHE7CisKKwkgIC8qIFRydW5jYXRlIG9wZXJhbmRzLiAgKi8KKwkgIGRuLS07CisJICBkcCsrOworCX0KKworICAgICAgbnAtLTsKKyAgICAgIGlmIChVTkxJS0VMWSAobjEgPj0gKGQxICYgZmxhZykpKQorCXsKKwkgIHEgPSBHTVBfTlVNQl9NQVNLOworCSAgY3kgPSBtcG5fc3VibXVsXzEgKG5wLCBkcCwgMiwgcSk7CisKKwkgIGlmIChVTkxJS0VMWSAobjEgIT0gY3kpKQorCSAgICB7CisJICAgICAgaWYgKG4xIDwgKGN5ICYgZmxhZykpCisJCXsKKwkJICBxLS07CisJCSAgYWRkX3NzYWFhYSAobnBbMV0sIG5wWzBdLCBucFsxXSwgbnBbMF0sIGRwWzFdLCBkcFswXSk7CisJCX0KKwkgICAgICBlbHNlCisJCWZsYWcgPSAwOworCSAgICB9CisJICBuMSA9IG5wWzFdOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB1ZGl2X3FyXzNieTIgKHEsIG4xLCBuMCwgbjEsIG5wWzFdLCBucFswXSwgZDEsIGQwLCBkaW52KTsKKworCSAgbnBbMV0gPSBuMTsKKwkgIG5wWzBdID0gbjA7CisJfQorCisgICAgICAqLS1xcCA9IHE7CisgICAgfQorCisgIEFTU0VSVF9BTFdBWVMgKG5wWzFdID09IG4xKTsKKworICByZXR1cm4gcWg7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zY2FuMC5jIGIvbXBuL2dlbmVyaWMvc2NhbjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE4MzJlCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2NhbjAuYwpAQCAtMCwwICsxLDU5IEBACisvKiBtcG5fc2NhbjAgLS0gU2NhbiBmcm9tIGEgZ2l2ZW4gYml0IHBvc2l0aW9uIGZvciB0aGUgbmV4dCBjbGVhciBiaXQuCisKK0NvcHlyaWdodCAxOTk0LCAxOTk2LCAyMDAxLCAyMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKiBBcmd1bWVudCBjb25zdHJhaW50czoKKyAgIDEuIFUgbXVzdCBzb29uZXIgb3IgbGF0ZXIgaGF2ZSBhIGxpbWIgd2l0aCBhIGNsZWFyIGJpdC4KKyAqLworCittcF9iaXRjbnRfdAorbXBuX3NjYW4wIChtcF9zcmNwdHIgdXAsIG1wX2JpdGNudF90IHN0YXJ0aW5nX2JpdCkKK3sKKyAgbXBfc2l6ZV90IHN0YXJ0aW5nX3dvcmQ7CisgIG1wX2xpbWJfdCBhbGltYjsKKyAgaW50IGNudDsKKyAgbXBfc3JjcHRyIHA7CisKKyAgLyogU3RhcnQgYXQgdGhlIHdvcmQgaW1wbGllZCBieSBTVEFSVElOR19CSVQuICAqLworICBzdGFydGluZ193b3JkID0gc3RhcnRpbmdfYml0IC8gR01QX05VTUJfQklUUzsKKyAgcCA9IHVwICsgc3RhcnRpbmdfd29yZDsKKyAgYWxpbWIgPSAqcCsrIF4gR01QX05VTUJfTUFTSzsKKworICAvKiBNYXNrIG9mZiBhbnkgYml0cyBiZWZvcmUgU1RBUlRJTkdfQklUIGluIHRoZSBmaXJzdCBsaW1iLiAgKi8KKyAgYWxpbWIgJj0gLSAobXBfbGltYl90KSAxIDw8IChzdGFydGluZ19iaXQgJSBHTVBfTlVNQl9CSVRTKTsKKworICB3aGlsZSAoYWxpbWIgPT0gMCkKKyAgICBhbGltYiA9ICpwKysgXiBHTVBfTlVNQl9NQVNLOworCisgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGFsaW1iKTsKKyAgcmV0dXJuIChwIC0gdXAgLSAxKSAqIEdNUF9OVU1CX0JJVFMgKyBjbnQ7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zY2FuMS5jIGIvbXBuL2dlbmVyaWMvc2NhbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU4MDYwCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2NhbjEuYwpAQCAtMCwwICsxLDU5IEBACisvKiBtcG5fc2NhbjEgLS0gU2NhbiBmcm9tIGEgZ2l2ZW4gYml0IHBvc2l0aW9uIGZvciB0aGUgbmV4dCBzZXQgYml0LgorCitDb3B5cmlnaHQgMTk5NCwgMTk5NiwgMjAwMSwgMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogQXJndW1lbnQgY29uc3RyYWludHM6CisgICAxLiBVIG11c3Qgc29vbmVyIG9yIGxhdGVyIGhhdmUgYSBsaW1iICE9IDAuCisgKi8KKworbXBfYml0Y250X3QKK21wbl9zY2FuMSAobXBfc3JjcHRyIHVwLCBtcF9iaXRjbnRfdCBzdGFydGluZ19iaXQpCit7CisgIG1wX3NpemVfdCBzdGFydGluZ193b3JkOworICBtcF9saW1iX3QgYWxpbWI7CisgIGludCBjbnQ7CisgIG1wX3NyY3B0ciBwOworCisgIC8qIFN0YXJ0IGF0IHRoZSB3b3JkIGltcGxpZWQgYnkgU1RBUlRJTkdfQklULiAgKi8KKyAgc3RhcnRpbmdfd29yZCA9IHN0YXJ0aW5nX2JpdCAvIEdNUF9OVU1CX0JJVFM7CisgIHAgPSB1cCArIHN0YXJ0aW5nX3dvcmQ7CisgIGFsaW1iID0gKnArKzsKKworICAvKiBNYXNrIG9mZiBhbnkgYml0cyBiZWZvcmUgU1RBUlRJTkdfQklUIGluIHRoZSBmaXJzdCBsaW1iLiAgKi8KKyAgYWxpbWIgJj0gLSAobXBfbGltYl90KSAxIDw8IChzdGFydGluZ19iaXQgJSBHTVBfTlVNQl9CSVRTKTsKKworICB3aGlsZSAoYWxpbWIgPT0gMCkKKyAgICBhbGltYiA9ICpwKys7CisKKyAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgYWxpbWIpOworICByZXR1cm4gKHAgLSB1cCAtIDEpICogR01QX05VTUJfQklUUyArIGNudDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NlY19hb3JzXzEuYyBiL21wbi9nZW5lcmljL3NlY19hb3JzXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDgwZmExCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2VjX2FvcnNfMS5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIG1wbl9zZWNfYWRkXzEsIG1wbl9zZWNfc3ViXzEKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworQ29weXJpZ2h0IDIwMTMsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWYgT1BFUkFUSU9OX3NlY19hZGRfMQorI2RlZmluZSBGTkFNRSBtcG5fc2VjX2FkZF8xCisjZGVmaW5lIEZOQU1FX2l0Y2ggbXBuX3NlY19hZGRfMV9pdGNoCisjZGVmaW5lIE9QX04gbXBuX2FkZF9uCisjZW5kaWYKKyNpZiBPUEVSQVRJT05fc2VjX3N1Yl8xCisjZGVmaW5lIEZOQU1FIG1wbl9zZWNfc3ViXzEKKyNkZWZpbmUgRk5BTUVfaXRjaCBtcG5fc2VjX3N1Yl8xX2l0Y2gKKyNkZWZpbmUgT1BfTiBtcG5fc3ViX24KKyNlbmRpZgorCisvKiBJdCdzIGFubm95aW5nIHRvIHRoYXQgd2UgbmVlZCBzY3JhdGNoIHNwYWNlICovCittcF9zaXplX3QKK0ZOQU1FX2l0Y2ggKG1wX3NpemVfdCBuKQoreworICByZXR1cm4gbjsKK30KKworbXBfbGltYl90CitGTkFNRSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgYiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIHNjcmF0Y2hbMF0gPSBiOworICBNUE5fWkVSTyAoc2NyYXRjaCArIDEsIG4tMSk7CisgIHJldHVybiBPUF9OIChycCwgYXAsIHNjcmF0Y2gsIG4pOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2VjX2Rpdi5jIGIvbXBuL2dlbmVyaWMvc2VjX2Rpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDg2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zZWNfZGl2LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIG1wbl9zZWNfZGl2X3FyLCBtcG5fc2VjX2Rpdl9yIC0tIENvbXB1dGUgUSA9IGZsb29yKFUgLyBWKSwgVSA9IFUgbW9kIFYuCisgICBTaWRlLWNoYW5uZWwgc2lsZW50IHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHVzZWQgaW5zdHJ1Y3Rpb25zIGFyZQorICAgc2lkZS1jaGFubmVsIHNpbGVudC4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworQ29weXJpZ2h0IDIwMTEtMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmIE9QRVJBVElPTl9zZWNfZGl2X3FyCisjZGVmaW5lIEZOQU1FIG1wbl9zZWNfZGl2X3FyCisjZGVmaW5lIEZOQU1FX2l0Y2ggbXBuX3NlY19kaXZfcXJfaXRjaAorI2RlZmluZSBRKHEpIHEsCisjZGVmaW5lIFJFVFRZUEUgbXBfbGltYl90CisjZW5kaWYKKyNpZiBPUEVSQVRJT05fc2VjX2Rpdl9yCisjZGVmaW5lIEZOQU1FIG1wbl9zZWNfZGl2X3IKKyNkZWZpbmUgRk5BTUVfaXRjaCBtcG5fc2VjX2Rpdl9yX2l0Y2gKKyNkZWZpbmUgUShxKQorI2RlZmluZSBSRVRUWVBFIHZvaWQKKyNlbmRpZgorCittcF9zaXplX3QKK0ZOQU1FX2l0Y2ggKG1wX3NpemVfdCBubiwgbXBfc2l6ZV90IGRuKQoreworI2lmIE9QRVJBVElPTl9zZWNfZGl2X3FyCisvKiBOZWVkcyAobm4gKyBkbiArIDEpICsgbXBuX3NlY19waTFfZGl2X3FyJ3MgbmVlZHMgb2YgKDJubicgLSBkbiArIDEpIGZvciBhCisgICB0b3RhbCBvZiAzbm4gKyA0IGxpbWJzIGF0IHRwLiAgTm90ZSB0aGF0IG1wbl9zZWNfcGkxX2Rpdl9xcidzIG5uIGlzIG9uZQorICAgZ3JlYXRlciB0aGFuIG91cnMsIHRoZXJlZm9yZSArNCBhbmQgbm90IGp1c3QgKzIuICAqLworICByZXR1cm4gMyAqIG5uICsgNDsKKyNlbmRpZgorI2lmIE9QRVJBVElPTl9zZWNfZGl2X3IKKy8qIE5lZWRzIChubiArIGRuICsgMSkgKyBtcG5fc2VjX3BpMV9kaXZfcidzIG5lZWRzIG9mIChkbiArIDEpIGZvciBhIHRvdGFsIG9mCisgICBubiArIDJkbiArIDIgbGltYnMgYXQgdHAuICAqLworICByZXR1cm4gbm4gKyAyICogZG4gKyAyOworI2VuZGlmCit9CisKK1JFVFRZUEUKK0ZOQU1FIChRKG1wX3B0ciBxcCkKKyAgICAgICBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKyAgICAgICBtcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkbiwKKyAgICAgICBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBkMSwgZDA7CisgIHVuc2lnbmVkIGludCBjbnQ7CisgIG1wX2xpbWJfdCBpbnYzMjsKKworICBBU1NFUlQgKGRuID49IDEpOworICBBU1NFUlQgKG5uID49IGRuKTsKKyAgQVNTRVJUIChkcFtkbiAtIDFdICE9IDApOworCisgIGQxID0gZHBbZG4gLSAxXTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBkMSk7CisKKyAgaWYgKGNudCAhPSAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBxaCwgY3k7CisgICAgICBtcF9wdHIgbnAyLCBkcDI7CisgICAgICBkcDIgPSB0cDsJCQkJCS8qIGRuIGxpbWJzICovCisgICAgICBtcG5fbHNoaWZ0IChkcDIsIGRwLCBkbiwgY250KTsKKworICAgICAgbnAyID0gdHAgKyBkbjsJCQkJLyogKG5uICsgMSkgbGltYnMgKi8KKyAgICAgIGN5ID0gbXBuX2xzaGlmdCAobnAyLCBucCwgbm4sIGNudCk7CisgICAgICBucDJbbm4rK10gPSBjeTsKKworICAgICAgZDAgPSBkcDJbZG4gLSAxXTsKKyAgICAgIGQwICs9ICh+ZDAgIT0gMCk7CisgICAgICBpbnZlcnRfbGltYiAoaW52MzIsIGQwKTsKKworICAgICAgLyogV2UgYWRkIG5uICsgZG4gdG8gdHAgaGVyZSwgbm90IG5uICsgMSArIGRuLCBhcyBleHBlY3RlZC4gIFRoaXMgaXMKKwkgc2luY2Ugbm4gaGVyZSB3aWxsIGhhdmUgYmVlbiBpbmNyZW1lbnRlZC4gICovCisjaWYgT1BFUkFUSU9OX3NlY19kaXZfcXIKKyAgICAgIHFoID0gbXBuX3NlY19waTFfZGl2X3FyIChucDIgKyBkbiwgbnAyLCBubiwgZHAyLCBkbiwgaW52MzIsIHRwICsgbm4gKyBkbik7CisgICAgICBBU1NFUlQgKHFoID09IDApOwkJLyogRklYTUU6IHRoaXMgaW5kaWNhdGVzIGluZWZmaWNpZW5jeSEgKi8KKyAgICAgIE1QTl9DT1BZIChxcCwgbnAyICsgZG4sIG5uIC0gZG4gLSAxKTsKKyAgICAgIHFoID0gbnAyW25uIC0gMV07CisjZWxzZQorICAgICAgbXBuX3NlY19waTFfZGl2X3IgKG5wMiwgbm4sIGRwMiwgZG4sIGludjMyLCB0cCArIG5uICsgZG4pOworI2VuZGlmCisKKyAgICAgIG1wbl9yc2hpZnQgKG5wLCBucDIsIGRuLCBjbnQpOworCisjaWYgT1BFUkFUSU9OX3NlY19kaXZfcXIKKyAgICAgIHJldHVybiBxaDsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBDb25zaWRlciBjb3B5aW5nIG5wID0+IG5wMiBoZXJlLCBhZGRpbmcgYSAwLWxpbWIgYXQgdGhlIHRvcC4KKwkgVGhhdCB3b3VsZCBzaW1wbGlmeSB0aGUgdW5kZXJseWluZyBwaTEgZnVuY3Rpb24sIHNpbmNlIHRoZW4gaXQgY291bGQKKwkgYXNzdW1lIG5uID4gZG4uICAqLworICAgICAgZDAgPSBkcFtkbiAtIDFdOworICAgICAgZDAgKz0gKH5kMCAhPSAwKTsKKyAgICAgIGludmVydF9saW1iIChpbnYzMiwgZDApOworCisjaWYgT1BFUkFUSU9OX3NlY19kaXZfcXIKKyAgICAgIHJldHVybiBtcG5fc2VjX3BpMV9kaXZfcXIgKHFwLCBucCwgbm4sIGRwLCBkbiwgaW52MzIsIHRwKTsKKyNlbHNlCisgICAgICBtcG5fc2VjX3BpMV9kaXZfciAobnAsIG5uLCBkcCwgZG4sIGludjMyLCB0cCk7CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zZWNfaW52ZXJ0LmMgYi9tcG4vZ2VuZXJpYy9zZWNfaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2NjVkMQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NlY19pbnZlcnQuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogbXBuX3NlY19pbnZlcnQKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWYgMAorLyogQ3VycmVudGx5IHVudXNlZC4gU2hvdWxkIGJlIHJlc3VycmVjdGVkIG9uY2UgbXBuX2NuZF9uZWcgaXMKKyAgIGFkdmVydGlzZWQuICovCitzdGF0aWMgbXBfc2l6ZV90CittcG5fY25kX25lZ19pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIG47Cit9CisjZW5kaWYKKworLyogRklYTUU6IE91Z2h0IHRvIHJldHVybiBjYXJyeSAqLworc3RhdGljIHZvaWQKK21wbl9jbmRfbmVnIChpbnQgY25kLCBtcF9saW1iX3QgKnJwLCBjb25zdCBtcF9saW1iX3QgKmFwLCBtcF9zaXplX3QgbiwKKwkgICAgIG1wX3B0ciBzY3JhdGNoKQoreworICBtcG5fbHNoaWZ0IChzY3JhdGNoLCBhcCwgbiwgMSk7CisgIG1wbl9jbmRfc3ViX24gKGNuZCwgcnAsIGFwLCBzY3JhdGNoLCBuKTsKK30KKworc3RhdGljIGludAorbXBuX3NlY19lcV91aSAobXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGIpCit7CisgIG1wX2xpbWJfdCBkOworICBBU1NFUlQgKG4gPiAwKTsKKworICBkID0gYXBbMF0gXiBiOworCisgIHdoaWxlICgtLW4gPiAwKQorICAgIGQgfD0gYXBbbl07CisKKyAgcmV0dXJuIGQgPT0gMDsKK30KKworbXBfc2l6ZV90CittcG5fc2VjX2ludmVydF9pdGNoIChtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIDQqbjsKK30KKworLyogQ29tcHV0ZSBWIDwtLSBBXnstMX0gKG1vZCBNKSwgaW4gZGF0YS1pbmRlcGVuZGVudCB0aW1lLiBNIG11c3QgYmUKKyAgIG9kZC4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIGFuZCAwIG9uIGZhaWx1cmUgKGkuZS4sIGlmIGdjZCAoQSwgbSkgIT0KKyAgIDEpLiBJbnB1dHMgYW5kIG91dHB1dHMgb2Ygc2l6ZSBuLCBhbmQgbm8gb3ZlcmxhcCBhbGxvd2VkLiBUaGUge2FwLAorICAgbn0gYXJlYSBpcyBkZXN0cm95ZWQuIEZvciBhcmJpdHJhcnkgaW5wdXRzLCBiaXRfc2l6ZSBzaG91bGQgYmUKKyAgIDIqbipHTVBfTlVNQl9CSVRTLCBidXQgaWYgQSBvciBNIGFyZSBrbm93biB0byBiZSBzbWFsbGVyLCBlLmcuLCBpZgorICAgTSA9IDJeNTIxIC0gMSBhbmQgQSA8IE0sIGJpdF9zaXplIGNhbiBiZSBhbnkgYm91bmQgb24gdGhlIHN1bSBvZgorICAgdGhlIGJpdCBzaXplcyBvZiBBIGFuZCBNLiAqLworaW50CittcG5fc2VjX2ludmVydCAobXBfcHRyIHZwLCBtcF9wdHIgYXAsIG1wX3NyY3B0ciBtcCwKKwkJbXBfc2l6ZV90IG4sIG1wX2JpdGNudF90IGJpdF9zaXplLAorCQltcF9wdHIgc2NyYXRjaCkKK3sKKyAgQVNTRVJUIChuID4gMCk7CisgIEFTU0VSVCAoYml0X3NpemUgPiAwKTsKKyAgQVNTRVJUIChtcFswXSAmIDEpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoYXAsIG4sIHZwLCBuKSk7CisjZGVmaW5lIGJwIChzY3JhdGNoICsgbikKKyNkZWZpbmUgdXAgKHNjcmF0Y2ggKyAyKm4pCisjZGVmaW5lIG0xaHAgKHNjcmF0Y2ggKyAzKm4pCisKKyAgLyogTWFpbnRhaW4KKworICAgICAgIGEgPSB1ICogb3JpZ19hIChtb2QgbSkKKyAgICAgICBiID0gdiAqIG9yaWdfYSAobW9kIG0pCisKKyAgICAgYW5kIGIgb2RkIGF0IGFsbCB0aW1lcy4gSW5pdGlhbGx5LAorCisgICAgICAgYSA9IGFfb3JpZywgdSA9IDEKKyAgICAgICBiID0gbSwgICAgICB2ID0gMAorICAgICAqLworCisKKyAgdXBbMF0gPSAxOworICBtcG5femVybyAodXArMSwgbiAtIDEpOworICBtcG5fY29weWkgKGJwLCBtcCwgbik7CisgIG1wbl96ZXJvICh2cCwgbik7CisKKyAgQVNTRVJUX0NBUlJZIChtcG5fcnNoaWZ0IChtMWhwLCBtcCwgbiwgMSkpOworICBBU1NFUlRfTk9DQVJSWSAobXBuX3NlY19hZGRfMSAobTFocCwgbTFocCwgbiwgMSwgc2NyYXRjaCkpOworCisgIHdoaWxlIChiaXRfc2l6ZS0tID4gMCkKKyAgICB7CisgICAgICBtcF9saW1iX3Qgb2RkLCBzd2FwLCBjeTsKKworICAgICAgLyogQWx3YXlzIG1haW50YWluIGIgb2RkLiBUaGUgbG9naWMgb2YgdGhlIGl0ZXJhdGlvbiBpcyBhcworCSBmb2xsb3dzLiBGb3IgYSwgYjoKKworCSAgIG9kZCA9IGEgJiAxCisJICAgYSAtPSBvZGQgKiBiCisJICAgaWYgKHVuZGVyZmxvdyBmcm9tIGEtYikKKwkgICAgIHsKKwkgICAgICAgYiArPSBhLCBhc3NpZ25zIG9sZCBhCisJICAgICAgIGEgPSBCXm4tYQorCSAgICAgfQorCisJICAgYSAvPSAyCisKKwkgRm9yIHUsIHY6CisKKwkgICBpZiAodW5kZXJmbG93IGZyb20gYSAtIGIpCisJICAgICBzd2FwIHUsIHYKKwkgICB1IC09IG9kZCAqIHYKKwkgICBpZiAodW5kZXJmbG93IGZyb20gdSAtIHYpCisJICAgICB1ICs9IG0KKworCSAgIHUgLz0gMgorCSAgIGlmIChhIG9uZSBiaXQgd2FzIHNoaWZ0ZWQgb3V0KQorCSAgICAgdSArPSAobSsxKS8yCisKKwkgQXMgbG9uZyBhcyBhID4gMCwgdGhlIHF1YW50aXR5CisKKwkgICAoYml0c2l6ZSBvZiBhKSArIChiaXRzaXplIG9mIGIpCisKKwkgaXMgcmVkdWNlZCBieSBhdCBsZWFzdCBvbmUgYml0IHBlciBpdGVyYXRpb24sIGhlbmNlIGFmdGVyIChiaXRfc2l6ZSBvZgorCSBvcmlnX2EpICsgKGJpdF9zaXplIG9mIG0pIC0gMSBpdGVyYXRpb25zIHdlIHN1cmVseSBoYXZlIGEgPSAwLiBUaGVuIGIKKwkgPSBnY2Qob3JpZ19hLCBtKSBhbmQgaWYgYiA9IDEgdGhlbiBhbHNvIHYgPSBvcmlnX2Feey0xfSAobW9kIG0pLgorICAgICAgKi8KKworICAgICAgQVNTRVJUIChicFswXSAmIDEpOworICAgICAgb2RkID0gYXBbMF0gJiAxOworCisgICAgICBzd2FwID0gbXBuX2NuZF9zdWJfbiAob2RkLCBhcCwgYXAsIGJwLCBuKTsKKyAgICAgIG1wbl9jbmRfYWRkX24gKHN3YXAsIGJwLCBicCwgYXAsIG4pOworICAgICAgbXBuX2NuZF9uZWcgKHN3YXAsIGFwLCBhcCwgbiwgc2NyYXRjaCk7CisKKyAgICAgIG1wbl9jbmRfc3dhcCAoc3dhcCwgdXAsIHZwLCBuKTsKKyAgICAgIGN5ID0gbXBuX2NuZF9zdWJfbiAob2RkLCB1cCwgdXAsIHZwLCBuKTsKKyAgICAgIGN5IC09IG1wbl9jbmRfYWRkX24gKGN5LCB1cCwgdXAsIG1wLCBuKTsKKyAgICAgIEFTU0VSVCAoY3kgPT0gMCk7CisKKyAgICAgIGN5ID0gbXBuX3JzaGlmdCAoYXAsIGFwLCBuLCAxKTsKKyAgICAgIEFTU0VSVCAoY3kgPT0gMCk7CisgICAgICBjeSA9IG1wbl9yc2hpZnQgKHVwLCB1cCwgbiwgMSk7CisgICAgICBjeSA9IG1wbl9jbmRfYWRkX24gKGN5LCB1cCwgdXAsIG0xaHAsIG4pOworICAgICAgQVNTRVJUIChjeSA9PSAwKTsKKyAgICB9CisgIC8qIFNob3VsZCBiZSBhbGwgemVyb3MsIGJ1dCBjaGVjayBvbmx5IGV4dHJlbWUgbGltYnMgKi8KKyAgQVNTRVJUICggKGFwWzBdIHwgYXBbbi0xXSkgPT0gMCk7CisgIC8qIENoZWNrIGlmIGluZGVlZCBnY2QgPT0gMS4gKi8KKyAgcmV0dXJuIG1wbl9zZWNfZXFfdWkgKGJwLCBuLCAxKTsKKyN1bmRlZiBicAorI3VuZGVmIHVwCisjdW5kZWYgbTFocAorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2VjX211bC5jIGIvbXBuL2dlbmVyaWMvc2VjX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zZWNfbXVsLmMKQEAgLTAsMCArMSw0OCBAQAorLyogbXBuX3NlY19tdWwuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK0NvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBuX3NlY19tdWwgKG1wX3B0ciBycCwKKwkgICAgIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCSAgICAgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4sCisJICAgICBtcF9wdHIgdHApCit7CisgIG1wbl9tdWxfYmFzZWNhc2UgKHJwLCBhcCwgYW4sIGJwLCBibik7Cit9CisKK21wX3NpemVfdAorbXBuX3NlY19tdWxfaXRjaCAobXBfc2l6ZV90IGFuLCBtcF9zaXplX3QgYm4pCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2VjX3BpMV9kaXYuYyBiL21wbi9nZW5lcmljL3NlY19waTFfZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkMDFlNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NlY19waTFfZGl2LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIG1wbl9zZWNfcGkxX2Rpdl9xciwgbXBuX3NlY19waTFfZGl2X3IgLS0gQ29tcHV0ZSBRID0gZmxvb3IoVSAvIFYpLCBVID0gVQorICAgbW9kIFYuICBTaWRlLWNoYW5uZWwgc2lsZW50IHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHVzZWQgaW5zdHJ1Y3Rpb25zCisgICBhcmUgc2lkZS1jaGFubmVsIHNpbGVudC4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIFRoaXMgc2lkZS1jaGFubmVsIHNpbGVudCBkaXZpc2lvbiBhbGdvcml0aG0gcmVkdWNlcyB0aGUgcGFydGlhbCByZW1haW5kZXIgYnkKKyAgIEdNUF9OVU1CX0JJVFMvMiBiaXRzIGF0IGEgdGltZSwgY29tcGFyZWQgdG8gR01QX05VTUJfQklUUyBmb3IgdGhlIG1haW4KKyAgIGRpdmlzaW9uIGFsZ29yaXRobS4gIFdlIGFjdHVhbGx5IGRvIG5vdCBpbnNpc3Qgb24gcmVkdWNpbmcgYnkgZXhhY3RseQorICAgR01QX05VTUJfQklUUy8yLCBidXQgbWF5IGxlYXZlIGEgcGFydGlhbCByZW1haW5kZXIgdGhhdCBpcyBEKkJeaSB0byAzRCpCXmkKKyAgIHRvbyBsYXJnZSAoQiBpcyB0aGUgbGltYiBiYXNlLCBEIGlzIHRoZSBkaXZpc29yLCBhbmQgaSBpcyB0aGUgaW5kdWN0aW9uCisgICB2YXJpYWJsZSk7IHRoZSBzdWJzZXF1ZW50IHN0ZXAgd2lsbCBoYW5kbGUgdGhlIGV4dHJhIHBhcnRpYWwgcmVtYWluZGVyIGJpdHMuCisKKyAgIFdpdGggdGhhdCBwYXJ0aWFsIHJlbWFpbmRlciByZWR1Y3Rpb24sIGVhY2ggc3RlcCBnZW5lcmF0ZXMgYSBxdW90aWVudCAiaGFsZgorICAgbGltYiIuICBUaGUgb3V0ZXIgbG9vcCBnZW5lcmF0ZXMgdHdvIHF1b3RpZW50IGhhbGYgbGltYnMsIGFuIHVwcGVyIChxMWgpIGFuZAorICAgYSBsb3dlciAocTBoKSB3aGljaCBhcmUgc3RvcmVkIHNwYXJzZWx5IGluIHNlcGFyYXRlIGxpbWIgYXJyYXlzLiAgVGhlc2UKKyAgIGFycmF5cyBhcmUgYWRkZWQgYXQgdGhlIGVuZDsgdXNpbmcgc2VwYXJhdGUgYXJyYXlzIGF2b2lkcyBkYXRhLWRlcGVuZGVudAorICAgY2FycnkgcHJvcGFnYXRpb24gd2hpY2ggY291bGQgZWxzZSBwb3NlIGEgc2lkZS1jaGFubmVsIGxlYWthZ2UgcHJvYmxlbS4KKworICAgVGhlIHF1b3RpZW50IGhhbGYgbGltYnMgbWF5IGJlIGJldHdlZW4gLTMgdG8gMCBmcm9tIHRoZSBhY2N1cmF0ZSB2YWx1ZQorICAgKCJhY2N1cmF0ZSIgYmVpbmcgdGhlIG9uZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHJlZHVjdGlvbiB0byBhIHByaW5jaXBhbAorICAgcGFydGlhbCByZW1haW5kZXIpLiAgVG9vIHNtYWxsIHF1b3RpZW50IGhhbGYgbGltYnMgY29ycmVzcG9uZCB0byB0b28gbGFyZ2UKKyAgIHJlbWFpbmRlcnMsIHdoaWNoIHdlIHJlZHVjZSBsYXRlciwgYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgICBJbiBvcmRlciB0byBrZWVwIHF1b3RpZW50cyBmcm9tIGdldHRpbmcgdG9vIGJpZywgY29ycmVzcG9uZGluZyB0byBhIG5lZ2F0aXZlCisgICBwYXJ0aWFsIHJlbWFpbmRlciwgd2UgdXNlIGFuIGludmVyc2Ugd2hpY2ggaXMgc2xpZ2h0bHkgc21hbGxlciB0aGFuIHVzdWFsbHkuCisqLworCisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisvKiBOZWVkcyAoZG4gKyAxKSArIChubiAtIGRuKSArIChubiAtIGRuKSA9IDJubiAtIGRuICsgMSBsaW1icyBhdCB0cC4gKi8KKyNkZWZpbmUgRk5BTUUgbXBuX3NlY19waTFfZGl2X3FyCisjZGVmaW5lIFEocSkgcSwKKyNkZWZpbmUgUkVUVFlQRSBtcF9saW1iX3QKKyNlbmRpZgorI2lmIE9QRVJBVElPTl9zZWNfcGkxX2Rpdl9yCisvKiBOZWVkcyAoZG4gKyAxKSBsaW1icyBhdCB0cC4gICovCisjZGVmaW5lIEZOQU1FIG1wbl9zZWNfcGkxX2Rpdl9yCisjZGVmaW5lIFEocSkKKyNkZWZpbmUgUkVUVFlQRSB2b2lkCisjZW5kaWYKKworUkVUVFlQRQorRk5BTUUgKFEobXBfcHRyIHFwKQorICAgICAgIG1wX3B0ciBucCwgbXBfc2l6ZV90IG5uLAorICAgICAgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLAorICAgICAgIG1wX2xpbWJfdCBkaW52LAorICAgICAgIG1wX3B0ciB0cCkKK3sKKyAgbXBfbGltYl90IG5oLCBjeSwgcTFoLCBxMGgsIGR1bW15LCBjbmQ7CisgIG1wX3NpemVfdCBpOworICBtcF9wdHIgaHA7CisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisgIG1wX2xpbWJfdCBxaDsKKyAgbXBfcHRyIHFscCwgcWhwOworI2VuZGlmCisKKyAgQVNTRVJUIChkbiA+PSAxKTsKKyAgQVNTRVJUIChubiA+PSBkbik7CisgIEFTU0VSVCAoKGRwW2RuIC0gMV0gJiBHTVBfTlVNQl9ISUdIQklUKSAhPSAwKTsKKworICBpZiAobm4gPT0gZG4pCisgICAgeworICAgICAgY3kgPSBtcG5fc3ViX24gKG5wLCBucCwgZHAsIGRuKTsKKyAgICAgIG1wbl9jbmRfYWRkX24gKGN5LCBucCwgbnAsIGRwLCBkbik7CisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisgICAgICByZXR1cm4gMSAtIGN5OworI2Vsc2UKKyAgICAgIHJldHVybjsKKyNlbmRpZgorICAgIH0KKworICAvKiBDcmVhdGUgYSBkaXZpc29yIGNvcHkgc2hpZnRlZCBoYWxmIGEgbGltYi4gICovCisgIGhwID0gdHA7CQkJCQkvKiAoZG4gKyAxKSBsaW1icyAqLworICBocFtkbl0gPSBtcG5fbHNoaWZ0IChocCwgZHAsIGRuLCBHTVBfTlVNQl9CSVRTIC8gMik7CisKKyNpZiBPUEVSQVRJT05fc2VjX3BpMV9kaXZfcXIKKyAgcWxwID0gdHAgKyAoZG4gKyAxKTsJCQkJLyogKG5uIC0gZG4pIGxpbWJzICovCisgIHFocCA9IHRwICsgKG5uICsgMSk7CQkJCS8qIChubiAtIGRuKSBsaW1icyAqLworI2VuZGlmCisKKyAgbnAgKz0gbm4gLSBkbjsKKyAgbmggPSAwOworCisgIGZvciAoaSA9IG5uIC0gZG4gLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBucC0tOworCisgICAgICBuaCA9IChuaCA8PCBHTVBfTlVNQl9CSVRTLzIpICsgKG5wW2RuXSA+PiBHTVBfTlVNQl9CSVRTLzIpOworICAgICAgdW11bF9wcG1tIChxMWgsIGR1bW15LCBuaCwgZGludik7CisgICAgICBxMWggKz0gbmg7CisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisgICAgICBxaHBbaV0gPSBxMWg7CisjZW5kaWYKKyAgICAgIG1wbl9zdWJtdWxfMSAobnAsIGhwLCBkbiArIDEsIHExaCk7CisKKyAgICAgIG5oID0gbnBbZG5dOworICAgICAgdW11bF9wcG1tIChxMGgsIGR1bW15LCBuaCwgZGludik7CisgICAgICBxMGggKz0gbmg7CisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisgICAgICBxbHBbaV0gPSBxMGg7CisjZW5kaWYKKyAgICAgIG5oIC09IG1wbl9zdWJtdWxfMSAobnAsIGRwLCBkbiwgcTBoKTsKKyAgICB9CisKKyAgLyogMXN0IGFkanVzdG1lbnQgZGVwZW5kcyBvbiBleHRyYSBoaWdoIHJlbWFpbmRlciBsaW1iLiAgKi8KKyAgY25kID0gbmggIT0gMDsJCQkJLyogRklYTUU6IGNtcC10by1pbnQgKi8KKyNpZiBPUEVSQVRJT05fc2VjX3BpMV9kaXZfcXIKKyAgcWxwWzBdICs9IGNuZDsKKyNlbmRpZgorICBuaCAtPSBtcG5fY25kX3N1Yl9uIChjbmQsIG5wLCBucCwgZHAsIGRuKTsKKworICAvKiAybmQgYWRqdXN0bWVudCBkZXBlbmRzIG9uIHJlbWFpbmRlci9kaXZpc29yIGNvbXBhcmlzb24gYXMgd2VsbCBhcyB3aGV0aGVyCisgICAgIGV4dHJhIHJlbWFpbmRlciBsaW1iIHdhcyBudWxsaWZpZWQgYnkgcHJldmlvdXMgc3VidHJhY3QuICAqLworICBjeSA9IG1wbl9zdWJfbiAobnAsIG5wLCBkcCwgZG4pOworICBjeSA9IGN5IC0gbmg7CisjaWYgT1BFUkFUSU9OX3NlY19waTFfZGl2X3FyCisgIHFscFswXSArPSAxIC0gY3k7CisjZW5kaWYKKyAgbXBuX2NuZF9hZGRfbiAoY3ksIG5wLCBucCwgZHAsIGRuKTsKKworICAvKiAzcmQgYWRqdXN0bWVudCBkZXBlbmRzIG9uIHJlbWFpbmRlci9kaXZpc29yIGNvbXBhcmlzb24uICAqLworICBjeSA9IG1wbl9zdWJfbiAobnAsIG5wLCBkcCwgZG4pOworI2lmIE9QRVJBVElPTl9zZWNfcGkxX2Rpdl9xcgorICBxbHBbMF0gKz0gMSAtIGN5OworI2VuZGlmCisgIG1wbl9jbmRfYWRkX24gKGN5LCBucCwgbnAsIGRwLCBkbik7CisKKyNpZiBPUEVSQVRJT05fc2VjX3BpMV9kaXZfcXIKKyAgLyogQ29tYmluZSBxdW90aWVudCBoYWx2ZXMgaW50byBmaW5hbCBxdW90aWVudC4gICovCisgIHFoID0gbXBuX2xzaGlmdCAocWhwLCBxaHAsIG5uIC0gZG4sIEdNUF9OVU1CX0JJVFMvMik7CisgIHFoICs9IG1wbl9hZGRfbiAocXAsIHFocCwgcWxwLCBubiAtIGRuKTsKKworICByZXR1cm4gcWg7CisjZWxzZQorICByZXR1cm47CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NlY19wb3dtLmMgYi9tcG4vZ2VuZXJpYy9zZWNfcG93bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTExY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zZWNfcG93bS5jCkBAIC0wLDAgKzEsNDMwIEBACisvKiBtcG5fc2VjX3Bvd20gLS0gQ29tcHV0ZSBSID0gVV5FIG1vZCBNLiAgU2VjdXJlIHZhcmlhbnQsIHNpZGUtY2hhbm5lbCBzaWxlbnQKKyAgIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIG11bHRpcGx5IGluc3RydWN0aW9uIGlzIHNpZGUgY2hhbm5lbCBzaWxlbnQuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK0NvcHlyaWdodCAyMDA3LTIwMDksIDIwMTEtMjAxNCwgMjAxOC0yMDE5LCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qCisgIEJBU0lDIEFMR09SSVRITSwgQ29tcHV0ZSBVXkUgbW9kIE0sIHdoZXJlIE0gPCBCXm4gaXMgb2RkLgorCisgIDEuIFQgPC0gKEJebiAqIFUpIG1vZCBNOyBjb252ZXJ0IHRvIFJFREMgZm9ybQorCisgIDIuIENvbXB1dGUgdGFibGUgVV4wLCBVXjEsIFVeMi4uLiBvZiBmbG9vcihsb2coRSkpLWRlcGVuZGVudCBzaXplCisKKyAgMy4gV2hpbGUgdGhlcmUgYXJlIG1vcmUgYml0cyBpbiBFCisgICAgICAgVyA8LSBwb3dlciBsZWZ0LXRvLXJpZ2h0IGJhc2UtaworCisgIFRoZSBhcnRpY2xlICJEZWZlYXRpbmcgbW9kZXhwIHNpZGUtY2hhbm5lbCBhdHRhY2tzIHdpdGggZGF0YS1pbmRlcGVuZGVudAorICBleGVjdXRpb24gdHJhY2VzIiwgaHR0cHM6Ly9nbXBsaWIub3JnL350ZWdlL21vZGV4cC1zaWxlbnQucGRmLCBoYXMgZGV0YWlscy4KKworCisgIFRPRE86CisKKyAgICogTWFrZSBnZXRiaXRzIGEgbWFjcm8sIHRoZXJlYnkgYWxsb3dpbmcgaXQgdG8gdXBkYXRlIHRoZSBpbmRleCBvcGVyYW5kLgorICAgICBUaGF0IHdpbGwgc2ltcGxpZnkgdGhlIGNvZGUgdXNpbmcgZ2V0Yml0cy4gIChQZXJoYXBzIG1ha2UgZ2V0Yml0cycgc2libGluZworICAgICBnZXRiaXQgdGhlbiBoYXZlIHNpbWlsYXIgZm9ybSwgZm9yIHN5bW1ldHJ5LikKKworICAgKiBDaG9vc2Ugd2luZG93IHNpemUgd2l0aG91dCBsb29waW5nLiAgKFN1cGVyb3B0aW1pemUgb3IgdGhpbmsodG0pLikKKworICAgKiBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCBtaWdodCBhY3R1YWxseSByZXByZXNlbnQgdGhlIGN1dG9mZiBiZXR3ZWVuCisgICAgIHJlZGNfMSBhbmQgcmVkY19uLiAgT24gc3VjaCBzeXN0ZW1zLCB3ZSB3aWxsIHN3aXRjaCB0byByZWRjXzIgY2F1c2luZworICAgICBzbG93ZG93bi4KKyovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyN1bmRlZiBNUE5fUkVEQ18xX1NFQworI2lmIEhBVkVfTkFUSVZFX21wbl9zYnBpMV9iZGl2X3IKKyNkZWZpbmUgTVBOX1JFRENfMV9TRUMocnAsIHVwLCBtcCwgbiwgaW52bSkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBjeTsJCQkJCQkJXAorICAgIGN5ID0gbXBuX3NicGkxX2JkaXZfciAodXAsIDIgKiBuLCBtcCwgbiwgaW52bSk7CQkJXAorICAgIG1wbl9jbmRfc3ViX24gKGN5LCBycCwgdXAgKyBuLCBtcCwgbik7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE1QTl9SRURDXzFfU0VDKHJwLCB1cCwgbXAsIG4sIGludm0pCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgY3k7CQkJCQkJCVwKKyAgICBjeSA9IG1wbl9yZWRjXzEgKHJwLCB1cCwgbXAsIG4sIGludm0pOwkJCQlcCisgICAgbXBuX2NuZF9zdWJfbiAoY3ksIHJwLCBycCwgbXAsIG4pOwkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzIgfHwgSEFWRV9OQVRJVkVfbXBuX3JlZGNfMgorI3VuZGVmIE1QTl9SRURDXzJfU0VDCisjZGVmaW5lIE1QTl9SRURDXzJfU0VDKHJwLCB1cCwgbXAsIG4sIG1pcCkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBjeTsJCQkJCQkJXAorICAgIGN5ID0gbXBuX3JlZGNfMiAocnAsIHVwLCBtcCwgbiwgbWlwKTsJCQkJXAorICAgIG1wbl9jbmRfc3ViX24gKGN5LCBycCwgcnAsIG1wLCBuKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE1QTl9SRURDXzJfU0VDKHJwLCB1cCwgbXAsIG4sIG1pcCkgLyogZW1wdHkgKi8KKyN1bmRlZiBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRAorI2RlZmluZSBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCBNUF9TSVpFX1RfTUFYCisjZW5kaWYKKworLyogRGVmaW5lIG91ciBvd24gbXBuIHNxdWFyaW5nIGZ1bmN0aW9uLiAgV2UgZG8gdGhpcyBzaW5jZSB3ZSBjYW5ub3QgdXNlIGEKKyAgIG5hdGl2ZSBtcG5fc3FyX2Jhc2VjYXNlIG92ZXIgVFVORV9TUVJfVE9PTTJfTUFYLCBvciBhIG5vbi1uYXRpdmUgb25lIG92ZXIKKyAgIFNRUl9UT09NMl9USFJFU0hPTEQuICBUaGlzIGlzIHNvIGJlY2F1c2Ugb2YgZml4ZWQgc2l6ZSBzdGFjayBhbGxvY2F0aW9ucworICAgbWFkZSBpbnNpZGUgbXBuX3Nxcl9iYXNlY2FzZS4gICovCisKKyNpZiAhIEhBVkVfTkFUSVZFX21wbl9zcXJfYmFzZWNhc2UKKy8qIFRoZSBsaW1pdCBvZiB0aGUgZ2VuZXJpYyBjb2RlIGlzIFNRUl9UT09NMl9USFJFU0hPTEQuICAqLworI2RlZmluZSBTUVJfQkFTRUNBU0VfTElNICBTUVJfVE9PTTJfVEhSRVNIT0xECisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zcXJfYmFzZWNhc2UKKyNpZmRlZiBUVU5FX1NRUl9UT09NMl9NQVgKKy8qIFdlIHNsaWdodGx5IGFidXNlIFRVTkVfU1FSX1RPT00yX01BWCBoZXJlLiAgSWYgaXQgaXMgc2V0IGZvciBhbiBhc3NlbWJseQorICAgbXBuX3Nxcl9iYXNlY2FzZSwgaXQgY29tZXMgZnJvbSBTUVJfVE9PTTJfVEhSRVNIT0xEX01BWCBpbiB0aGUgYXNzZW1ibHkKKyAgIGZpbGUuICBBbiBhc3NlbWJseSBtcG5fc3FyX2Jhc2VjYXNlIHRoYXQgZG9lcyBub3QgZGVmaW5lIGl0IHNob3VsZCBhbGxvdworICAgYW55IHNpemUuICAqLworI2RlZmluZSBTUVJfQkFTRUNBU0VfTElNICBTUVJfVE9PTTJfVEhSRVNIT0xECisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0FOVF9GQVRfQklOQVJZCisvKiBGb3IgZmF0IGJ1aWxkcywgd2UgdXNlIFNRUl9UT09NMl9USFJFU0hPTEQgd2hpY2ggd2lsbCBleHBhbmQgdG8gYSByZWFkIGZyb20KKyAgIF9fZ21wbl9jcHV2ZWMuICBQZXJoYXBzIGFueSBwb3NzaWJsZSBzcXJfYmFzZWNhc2UuYXNtIGFsbG93IGFueSBzaXplLCBhbmQgd2UKKyAgIGxpbWl0IHRoZSB1c2UgdW5uZWNlc3NhcmlseS4gIFdlIGNhbm5vdCB0ZWxsLCBzbyBwbGF5IGl0IHNhZmUuICBGSVhNRS4gICovCisjZGVmaW5lIFNRUl9CQVNFQ0FTRV9MSU0gIFNRUl9UT09NMl9USFJFU0hPTEQKKyNlbmRpZgorCisjaWZuZGVmIFNRUl9CQVNFQ0FTRV9MSU0KKy8qIElmIFNRUl9CQVNFQ0FTRV9MSU0gaXMgbm93IG5vdCBkZWZpbmVkLCB1c2UgbXBuX3Nxcl9iYXNlY2FzZSBmb3IgYW55IG9wZXJhbmQKKyAgIHNpemUuICAqLworI2RlZmluZSBTUVJfQkFTRUNBU0VfTElNICBNUF9TSVpFX1RfTUFYCisjZW5kaWYKKworI2RlZmluZSBtcG5fbG9jYWxfc3FyKHJwLHVwLG4pCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChBQk9WRV9USFJFU0hPTEQgKG4sIFNRUl9CQVNFQ0FTRV9USFJFU0hPTEQpCQkJXAorCSYmIEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX0xJTSkpCQkJXAorICAgICAgbXBuX3Nxcl9iYXNlY2FzZSAocnAsIHVwLCBuKTsJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBtcG5fbXVsX2Jhc2VjYXNlKHJwLCB1cCwgbiwgdXAsIG4pOwkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZ2V0Yml0KHAsYmkpIFwKKyAgKChwWyhiaSAtIDEpIC8gR01QX05VTUJfQklUU10gPj4gKGJpIC0gMSkgJSBHTVBfTlVNQl9CSVRTKSAmIDEpCisKKy8qIEZJWE1FOiBNYXliZSBzb21lIHRoaW5ncyB3b3VsZCBnZXQgc2ltcGxlciBpZiBhbGwgY2FsbGVycyBlbnN1cmUKKyAgIHRoYXQgYmkgPj0gbmJpdHMuIEFzIGZhciBhcyBJIHVuZGVyc3RhbmQsIHdpdGggdGhlIGN1cnJlbnQgY29kZSBiaQorICAgPCBuYml0cyBjYW4gaGFwcGVuIG9ubHkgZm9yIHRoZSBmaW5hbCBpdGVyYXRpb24uICovCitzdGF0aWMgaW5saW5lIG1wX2xpbWJfdAorZ2V0Yml0cyAoY29uc3QgbXBfbGltYl90ICpwLCBtcF9iaXRjbnRfdCBiaSwgaW50IG5iaXRzKQoreworICBpbnQgbmJpdHNfaW5fcjsKKyAgbXBfbGltYl90IHI7CisgIG1wX3NpemVfdCBpOworCisgIGlmIChiaSA8IG5iaXRzKQorICAgIHsKKyAgICAgIHJldHVybiBwWzBdICYgKCgobXBfbGltYl90KSAxIDw8IGJpKSAtIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJpIC09IG5iaXRzOwkJCS8qIGJpdCBpbmRleCBvZiBsb3cgYml0IHRvIGV4dHJhY3QgKi8KKyAgICAgIGkgPSBiaSAvIEdNUF9OVU1CX0JJVFM7CQkvKiB3b3JkIGluZGV4IG9mIGxvdyBiaXQgdG8gZXh0cmFjdCAqLworICAgICAgYmkgJT0gR01QX05VTUJfQklUUzsJCS8qIGJpdCBpbmRleCBpbiBsb3cgd29yZCAqLworICAgICAgciA9IHBbaV0gPj4gYmk7CQkJLyogZXh0cmFjdCAobG93KSBiaXRzICovCisgICAgICBuYml0c19pbl9yID0gR01QX05VTUJfQklUUyAtIGJpOwkvKiBudW1iZXIgb2YgYml0cyBub3cgaW4gciAqLworICAgICAgaWYgKG5iaXRzX2luX3IgPCBuYml0cykJCS8qIGRpZCB3ZSBnZXQgZW5vdWdoIGJpdHM/ICovCisJciArPSBwW2kgKyAxXSA8PCBuYml0c19pbl9yOwkvKiBwcmVwZW5kIGJpdHMgZnJvbSBoaWdoZXIgd29yZCAqLworICAgICAgcmV0dXJuIHIgJiAoKChtcF9saW1iX3QgKSAxIDw8IG5iaXRzKSAtIDEpOworICAgIH0KK30KKworI2lmbmRlZiBQT1dNX1NFQ19UQUJMRQorI2lmIEdNUF9OVU1CX0JJVFMgPCA1MAorI2RlZmluZSBQT1dNX1NFQ19UQUJMRSAgMiwzMyw5Niw3ODAsMjc0MQorI2Vsc2UKKyNkZWZpbmUgUE9XTV9TRUNfVEFCTEUgIDIsMTMwLDUyNCwyNTc4CisjZW5kaWYKKyNlbmRpZgorCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECitleHRlcm4gaW50IHdpbl9zaXplIChtcF9iaXRjbnRfdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK3dpbl9zaXplIChtcF9iaXRjbnRfdCBlbmIpCit7CisgIGludCBrOworICAvKiBGaW5kIGssIHN1Y2ggdGhhdCB4W2stMV0gPCBlbmIgPD0geFtrXS4KKworICAgICBXZSByZXF1aXJlIHRoYXQgeFtrXSA+PSBrLCB0aGVuIGl0IGZvbGxvd3MgdGhhdCBlbmIgPiB4W2stMV0gPj0KKyAgICAgay0xLCB3aGljaCBpbXBsaWVzIGsgPD0gZW5iLgorICAqLworICBzdGF0aWMgY29uc3QgbXBfYml0Y250X3QgeFtdID0ge1BPV01fU0VDX1RBQkxFLH4obXBfYml0Y250X3QpMH07CisgIGZvciAoayA9IDA7IGVuYiA+IHhbaysrXTsgKQorICAgIDsKKyAgQVNTRVJUIChrIDw9IGVuYik7CisgIHJldHVybiBrOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgVSB0byBSRURDIGZvcm0sIFVfciA9IEJebiAqIFUgbW9kIE0uCisgICBVc2VzIHNjcmF0Y2ggc3BhY2UgYXQgdHAgb2Ygc2l6ZSAydW4gKyBuICsgMS4gICovCitzdGF0aWMgdm9pZAorcmVkY2lmeSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwgbXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbiwgbXBfcHRyIHRwKQoreworICBNUE5fWkVSTyAodHAsIG4pOworICBNUE5fQ09QWSAodHAgKyBuLCB1cCwgdW4pOworCisgIG1wbl9zZWNfZGl2X3IgKHRwLCB1biArIG4sIG1wLCBuLCB0cCArIHVuICsgbik7CisgIE1QTl9DT1BZIChycCwgdHAsIG4pOworfQorCitzdGF0aWMgbXBfbGltYl90CitzZWNfYmludmVydF9saW1iIChtcF9saW1iX3QgbikKK3sKKyAgbXBfbGltYl90IGludiwgdDsKKyAgQVNTRVJUICgobiAmIDEpID09IDEpOworICAvKiAzICsgMiAtPiA1ICovCisgIGludiA9IG4gKyAoKChuICsgMSkgPDwgMSkgJiAweDE4KTsKKworICB0ID0gbiAqIGludjsKKyNpZiBHTVBfTlVNQl9CSVRTIDw9IDEwCisgIC8qIDUgeCAyIC0+IDEwICovCisgIGludiA9IDIgKiBpbnYgLSBpbnYgKiB0OworI2Vsc2UgLyogR01QX05VTUJfQklUUyA+IDEwICovCisgIC8qIDUgeCAyICsgMiAtPiAxMiAqLworICBpbnYgPSAyICogaW52IC0gaW52ICogdCArICgoaW52PDwxMCkmLSh0JigxPDw1KSkpOworI2VuZGlmIC8qIEdNUF9OVU1CX0JJVFMgPD0gMTAgKi8KKworICBpZiAoR01QX05VTUJfQklUUyA+IDEyKQorICAgIHsKKyAgICAgIHQgPSBuICogaW52IC0gMTsKKyAgICAgIGlmIChHTVBfTlVNQl9CSVRTIDw9IDM2KQorCXsKKwkgIC8qIDEyIHggMyAtPiAzNiAqLworCSAgaW52ICs9IGludiAqIHQgKiAodCAtIDEpOworCX0KKyAgICAgIGVsc2UgLyogR01QX05VTUJfQklUUyA+IDM2ICovCisJeworCSAgbXBfbGltYl90IHQyID0gdCAqIHQ7CisjaWYgR01QX05VTUJfQklUUyA8PSA2MAorCSAgLyogMTIgeCA1IC0+IDYwICovCisJICBpbnYgKz0gaW52ICogKHQyICsgMSkgKiAodDIgLSB0KTsKKyNlbHNlIC8qIEdNUF9OVU1CX0JJVFMgPiA2MCAqLworCSAgLyogMTIgeCA1ICsgNCAtPiA2NCAqLworCSAgaW52ICo9ICh0MiArIDEpICogKHQyIC0gdCkgKyAxIC0gKCh0PDw0OCkmLSh0JigxPDwxMikpKTsKKworCSAgLyogNjQgLT4gMTI4IC0+IDI1NiAtPiAuLi4gKi8KKwkgIGZvciAoaW50IHRvZG8gPSAoR01QX05VTUJfQklUUyAtIDEpID4+IDY7IHRvZG8gIT0gMDsgdG9kbyA+Pj0gMSkKKwkgICAgaW52ID0gMiAqIGludiAtIGludiAqIGludiAqIG47CisjZW5kaWYgLyogR01QX05VTUJfQklUUyA8PSA2MCAqLworCX0KKyAgICB9CisKKyAgQVNTRVJUICgoaW52ICogbiAmIEdNUF9OVU1CX01BU0spID09IDEpOworICByZXR1cm4gaW52ICYgR01QX05VTUJfTUFTSzsKK30KKworLyoge3JwLCBufSA8LS0ge2JwLCBibn0gXiB7ZXAsIGVufSBtb2Qge21wLCBufSwKKyAgIHdoZXJlIGVuID0gY2VpbCAoZW5iIC8gR01QX05VTUJfQklUUykKKyAgIFJlcXVpcmVzIHRoYXQge21wLCBufSBpcyBvZGQgKGFuZCBoZW5jZSBhbHNvIG1wWzBdIG9kZCkuCisgICBVc2VzIHNjcmF0Y2ggc3BhY2UgYXQgdHAgYXMgZGVmaW5lZCBieSBtcG5fc2VjX3Bvd21faXRjaC4gICovCit2b2lkCittcG5fc2VjX3Bvd20gKG1wX3B0ciBycCwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4sCisJICAgICAgbXBfc3JjcHRyIGVwLCBtcF9iaXRjbnRfdCBlbmIsCisJICAgICAgbXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbiwgbXBfcHRyIHRwKQoreworICBtcF9saW1iX3QgaXBbMl0sICptaXA7CisgIGludCB3aW5kb3dzaXplLCB0aGlzX3dpbmRvd3NpemU7CisgIG1wX2xpbWJfdCBleHBiaXRzOworICBtcF9wdHIgcHAsIHRoaXNfcHAsIHBzOworICBsb25nIGk7CisgIGludCBjbmQ7CisKKyAgQVNTRVJUIChlbmIgPiAwKTsKKyAgQVNTRVJUIChuID4gMCk7CisgIC8qIFRoZSBjb2RlIHdvcmtzIGZvciBibiA9IDAsIGJ1dCB0aGUgZGVmaW5lZCBzY3JhdGNoIHNwYWNlIGlzIDIgbGltYnMKKyAgICAgZ3JlYXRlciB0aGFuIHdlIHN1cHBseSwgd2hlbiBjb252ZXJ0aW5nIDEgdG8gcmVkYyBmb3JtIC4gICovCisgIEFTU0VSVCAoYm4gPiAwKTsKKyAgQVNTRVJUICgobXBbMF0gJiAxKSAhPSAwKTsKKworICB3aW5kb3dzaXplID0gd2luX3NpemUgKGVuYik7CisKKyAgbWlwID0gaXA7CisgIG1pcFswXSA9IHNlY19iaW52ZXJ0X2xpbWIgKG1wWzBdKTsKKyAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB0LCBkdW1teSwgbWlwMCA9IG1pcFswXTsKKworICAgICAgdW11bF9wcG1tICh0LCBkdW1teSwgbWlwMCwgbXBbMF0pOworICAgICAgQVNTRVJUIChkdW1teSA9PSAxKTsKKyAgICAgIHQgKz0gbWlwMCAqIG1wWzFdOyAvKiB0ID0gKG1wICogbWlwMClbMV0gKi8KKworICAgICAgbWlwWzFdID0gdCAqIG1pcDAgLSAxOyAvKiB+KCAtIHQgKiBtaXAwKSAqLworICAgIH0KKyAgbWlwWzBdID0gLW1pcFswXTsKKworICBwcCA9IHRwOworICB0cCArPSAobiA8PCB3aW5kb3dzaXplKTsJLyogcHV0IHRwIGFmdGVyIHBvd2VyIHRhYmxlICovCisKKyAgLyogQ29tcHV0ZSBwcFswXSB0YWJsZSBlbnRyeSAqLworICAvKiBzY3JhdGNoOiB8ICAgbiAgIHwgMSB8ICAgbisyICAgIHwgICovCisgIC8qICAgICAgICAgIHwgcHBbMF0gfCAxIHwgcmVkY2lmeSAgfCAgKi8KKyAgdGhpc19wcCA9IHBwOworICB0aGlzX3BwW25dID0gMTsKKyAgcmVkY2lmeSAodGhpc19wcCwgdGhpc19wcCArIG4sIDEsIG1wLCBuLCB0aGlzX3BwICsgbiArIDEpOworICB0aGlzX3BwICs9IG47CisKKyAgLyogQ29tcHV0ZSBwcFsxXSB0YWJsZSBlbnRyeS4gIFRvIGF2b2lkIGV4Y2Vzc2l2ZSBzY3JhdGNoIHVzYWdlIGluIHRoZQorICAgICBkZWdlbmVyYXRlIHNpdHVhdGlvbiB3aGVyZSBCID4+IE0sIHdlIGxldCByZWRjaWZ5IHVzZSBzY3JhdGNoIHNwYWNlIHdoaWNoCisgICAgIHdpbGwgbGF0ZXIgYmUgdXNlZCBieSB0aGUgcHAgdGFibGUgKGVsZW1lbnQgMiBhbmQgdXApLiAgKi8KKyAgLyogc2NyYXRjaDogfCAgIG4gICB8ICAgbiAgIHwgIGJuICsgbiArIDEgIHwgICovCisgIC8qICAgICAgICAgIHwgcHBbMF0gfCBwcFsxXSB8ICAgcmVkY2lmeSAgICB8ICAqLworICByZWRjaWZ5ICh0aGlzX3BwLCBicCwgYm4sIG1wLCBuLCB0aGlzX3BwICsgbik7CisKKyAgLyogUHJlY29tcHV0ZSBwb3dlcnMgb2YgYiBhbmQgcHV0IHRoZW0gaW4gdGhlIHRlbXBvcmFyeSBhcmVhIGF0IHBwLiAgKi8KKyAgLyogc2NyYXRjaDogfCAgIG4gICB8ICAgbiAgIHwgLi4uICB8ICAgICAgICAgICAgICAgICAgICB8ICAgMm4gICAgICB8ICAqLworICAvKiAgICAgICAgICB8IHBwWzBdIHwgcHBbMV0gfCAuLi4gIHwgcHBbMl53aW5kb3dzaXplLTFdIHwgIHByb2R1Y3QgIHwgICovCisgIHBzID0gcHAgKyBuOwkJLyogaW5pdGlhbGx5IEJeMSAqLworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgZm9yIChpID0gKDEgPDwgd2luZG93c2l6ZSkgLSAyOyBpID4gMDsgaSAtPSAyKQorCXsKKwkgIG1wbl9sb2NhbF9zcXIgKHRwLCBwcywgbik7CisJICBwcyArPSBuOworCSAgdGhpc19wcCArPSBuOworCSAgTVBOX1JFRENfMV9TRUMgKHRoaXNfcHAsIHRwLCBtcCwgbiwgbWlwWzBdKTsKKworCSAgbXBuX211bF9iYXNlY2FzZSAodHAsIHRoaXNfcHAsIG4sIHBwICsgbiwgbik7CisJICB0aGlzX3BwICs9IG47CisJICBNUE5fUkVEQ18xX1NFQyAodGhpc19wcCwgdHAsIG1wLCBuLCBtaXBbMF0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGkgPSAoMSA8PCB3aW5kb3dzaXplKSAtIDI7IGkgPiAwOyBpIC09IDIpCisJeworCSAgbXBuX2xvY2FsX3NxciAodHAsIHBzLCBuKTsKKwkgIHBzICs9IG47CisJICB0aGlzX3BwICs9IG47CisJICBNUE5fUkVEQ18yX1NFQyAodGhpc19wcCwgdHAsIG1wLCBuLCBtaXApOworCisJICBtcG5fbXVsX2Jhc2VjYXNlICh0cCwgdGhpc19wcCwgbiwgcHAgKyBuLCBuKTsKKwkgIHRoaXNfcHAgKz0gbjsKKwkgIE1QTl9SRURDXzJfU0VDICh0aGlzX3BwLCB0cCwgbXAsIG4sIG1pcCk7CisJfQorICAgIH0KKworICBleHBiaXRzID0gZ2V0Yml0cyAoZXAsIGVuYiwgd2luZG93c2l6ZSk7CisgIEFTU0VSVF9BTFdBWVMgKGVuYiA+PSB3aW5kb3dzaXplKTsKKyAgZW5iIC09IHdpbmRvd3NpemU7CisKKyAgbXBuX3NlY190YWJzZWxlY3QgKHJwLCBwcCwgbiwgMSA8PCB3aW5kb3dzaXplLCBleHBiaXRzKTsKKworICAvKiBNYWluIGV4cG9uZW50aWF0aW9uIGxvb3AuICAqLworICAvKiBzY3JhdGNoOiB8ICAgbiAgIHwgICBuICAgfCAuLi4gIHwgICAgICAgICAgICAgICAgICAgIHwgICAgIDNuLTRuICAgICB8ICAqLworICAvKiAgICAgICAgICB8IHBwWzBdIHwgcHBbMV0gfCAuLi4gIHwgcHBbMl53aW5kb3dzaXplLTFdIHwgIGxvb3Agc2NyYXRjaCB8ICAqLworCisjZGVmaW5lIElOTkVSTE9PUAkJCQkJCQlcCisgIHdoaWxlIChlbmIgIT0gMCkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBleHBiaXRzID0gZ2V0Yml0cyAoZXAsIGVuYiwgd2luZG93c2l6ZSk7CQkJCVwKKyAgICAgIHRoaXNfd2luZG93c2l6ZSA9IHdpbmRvd3NpemU7CQkJCQlcCisgICAgICBpZiAoZW5iIDwgd2luZG93c2l6ZSkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgdGhpc193aW5kb3dzaXplIC09IHdpbmRvd3NpemUgLSBlbmI7CQkJCVwKKwkgIGVuYiA9IDA7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgICBlbHNlCQkJCQkJCQlcCisJZW5iIC09IHdpbmRvd3NpemU7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgICAgZG8JCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICBtcG5fbG9jYWxfc3FyICh0cCwgcnAsIG4pOwkJCQkJXAorCSAgTVBOX1JFRFVDRSAocnAsIHRwLCBtcCwgbiwgbWlwKTsJCQkJXAorCSAgdGhpc193aW5kb3dzaXplLS07CQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICAgIHdoaWxlICh0aGlzX3dpbmRvd3NpemUgIT0gMCk7CQkJCQlcCisJCQkJCQkJCQlcCisgICAgICBtcG5fc2VjX3RhYnNlbGVjdCAodHAgKyAyKm4sIHBwLCBuLCAxIDw8IHdpbmRvd3NpemUsIGV4cGJpdHMpOwlcCisgICAgICBtcG5fbXVsX2Jhc2VjYXNlICh0cCwgcnAsIG4sIHRwICsgMipuLCBuKTsJCQlcCisJCQkJCQkJCQlcCisgICAgICBNUE5fUkVEVUNFIChycCwgdHAsIG1wLCBuLCBtaXApOwkJCQkJXAorICAgIH0KKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBSRURDXzFfVE9fUkVEQ18yX1RIUkVTSE9MRCkpCisgICAgeworI3VuZGVmIE1QTl9SRURVQ0UKKyNkZWZpbmUgTVBOX1JFRFVDRShycCx0cCxtcCxuLG1pcCkJTVBOX1JFRENfMV9TRUMgKHJwLCB0cCwgbXAsIG4sIG1pcFswXSkKKyAgICAgIElOTkVSTE9PUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjdW5kZWYgTVBOX1JFRFVDRQorI2RlZmluZSBNUE5fUkVEVUNFKHJwLHRwLG1wLG4sbWlwKQlNUE5fUkVEQ18yX1NFQyAocnAsIHRwLCBtcCwgbiwgbWlwKQorICAgICAgSU5ORVJMT09QOworICAgIH0KKworICBNUE5fQ09QWSAodHAsIHJwLCBuKTsKKyAgTVBOX1pFUk8gKHRwICsgbiwgbik7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQpKQorICAgIE1QTl9SRURDXzFfU0VDIChycCwgdHAsIG1wLCBuLCBtaXBbMF0pOworICBlbHNlCisgICAgTVBOX1JFRENfMl9TRUMgKHJwLCB0cCwgbXAsIG4sIG1pcCk7CisKKyAgY25kID0gbXBuX3N1Yl9uICh0cCwgcnAsIG1wLCBuKTsJLyogd2UgbmVlZCBqdXN0IHJldHZhbCAqLworICBtcG5fY25kX3N1Yl9uICghY25kLCBycCwgcnAsIG1wLCBuKTsKK30KKworbXBfc2l6ZV90CittcG5fc2VjX3Bvd21faXRjaCAobXBfc2l6ZV90IGJuLCBtcF9iaXRjbnRfdCBlbmIsIG1wX3NpemVfdCBuKQoreworICBpbnQgd2luZG93c2l6ZTsKKyAgbXBfc2l6ZV90IHJlZGNpZnlfaXRjaCwgaXRjaDsKKworICAvKiBGSVhNRTogbm8gbW9yZSBfbG9jYWwvX2Jhc2VjYXNlIGRpZmZlcmVuY2UuICovCisgIC8qIFRoZSB0b3Agc2NyYXRjaCB1c2FnZSB3aWxsIGVpdGhlciBiZSB3aGVuIHJlZHVjaW5nIEIgaW4gdGhlIDJuZCByZWRjaWZ5CisgICAgIGNhbGwsIG9yIG1vcmUgdHlwaWNhbGx5IG4qMl53aW5kb3dzaXplICsgM24gb3IgNG4sIGluIHRoZSBtYWluIGxvb3AuICAoSXQKKyAgICAgaXMgM24gb3IgNG4gZGVwZW5kaW5nIG9uIGlmIHdlIHVzZSBtcG5fbG9jYWxfc3FyIG9yIGEgbmF0aXZlCisgICAgIG1wbl9zcXJfYmFzZWNhc2UuICBXZSBhc3N1bWUgNG4gYWx3YXlzIGZvciBub3cuKSAqLworCisgIHdpbmRvd3NpemUgPSB3aW5fc2l6ZSAoZW5iKTsKKworICAvKiBUaGUgMm4gdGVybSBpcyBkdWUgdG8gcHBbMF0gYW5kIHBwWzFdIGF0IHRoZSB0aW1lIG9mIHRoZSAybmQgcmVkY2lmeSBjYWxsLAorICAgICB0aGUgKGJuICsgbikgdGVybSBpcyBkdWUgdG8gcmVkY2lmeSdzIG93biB1c2FnZSwgYW5kIHRoZSByZXN0IGlzIGR1ZSB0bworICAgICBtcG5fc2VjX2Rpdl9yJ3MgdXNhZ2Ugd2hlbiBjYWxsZWQgZnJvbSByZWRjaWZ5LiAgKi8KKyAgcmVkY2lmeV9pdGNoID0gKDIgKiBuKSArIChibiArIG4pICsgKChibiArIG4pICsgMiAqIG4gKyAyKTsKKworICAvKiBUaGUgbiAqIDJed2luZG93c2l6ZSB0ZXJtIGlzIGR1ZSB0byB0aGUgcG93ZXIgdGFibGUsIHRoZSA0biB0ZXJtIGlzIGR1ZSB0bworICAgICBzY3JhdGNoIG5lZWRzIG9mIHNxdWFyaW5nL211bHRpcGxpY2F0aW9uIGluIHRoZSBleHBvbmVudGlhdGlvbiBsb29wLiAgKi8KKyAgaXRjaCA9IChuIDw8IHdpbmRvd3NpemUpICsgKDQgKiBuKTsKKworICByZXR1cm4gTUFYIChpdGNoLCByZWRjaWZ5X2l0Y2gpOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc2VjX3Nxci5jIGIvbXBuL2dlbmVyaWMvc2VjX3Nxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZmM3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zZWNfc3FyLmMKQEAgLTAsMCArMSw3NiBAQAorLyogbXBuX3NlY19zcXIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK0NvcHlyaWdodCAyMDEzLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2lmICEgSEFWRV9OQVRJVkVfbXBuX3Nxcl9iYXNlY2FzZQorLyogVGhlIGxpbWl0IG9mIHRoZSBnZW5lcmljIGNvZGUgaXMgU1FSX1RPT00yX1RIUkVTSE9MRC4gICovCisjZGVmaW5lIFNRUl9CQVNFQ0FTRV9MSU0gIFNRUl9UT09NMl9USFJFU0hPTEQKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3Nxcl9iYXNlY2FzZQorI2lmZGVmIFRVTkVfU1FSX1RPT00yX01BWAorLyogV2Ugc2xpZ2h0bHkgYWJ1c2UgVFVORV9TUVJfVE9PTTJfTUFYIGhlcmUuICBJZiBpdCBpcyBzZXQgZm9yIGFuIGFzc2VtYmx5CisgICBtcG5fc3FyX2Jhc2VjYXNlLCBpdCBjb21lcyBmcm9tIFNRUl9UT09NMl9USFJFU0hPTERfTUFYIGluIHRoZSBhc3NlbWJseQorICAgZmlsZS4gIEFuIGFzc2VtYmx5IG1wbl9zcXJfYmFzZWNhc2UgdGhhdCBkb2VzIG5vdCBkZWZpbmUgaXQgc2hvdWxkIGFsbG93CisgICBhbnkgc2l6ZS4gICovCisjZGVmaW5lIFNRUl9CQVNFQ0FTRV9MSU0gIFNRUl9UT09NMl9USFJFU0hPTEQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXQU5UX0ZBVF9CSU5BUlkKKy8qIEZvciBmYXQgYnVpbGRzLCB3ZSB1c2UgU1FSX1RPT00yX1RIUkVTSE9MRCB3aGljaCB3aWxsIGV4cGFuZCB0byBhIHJlYWQgZnJvbQorICAgX19nbXBuX2NwdXZlYy4gIFBlcmhhcHMgYW55IHBvc3NpYmxlIHNxcl9iYXNlY2FzZS5hc20gYWxsb3cgYW55IHNpemUsIGFuZCB3ZQorICAgbGltaXQgdGhlIHVzZSB1bm5lY2Vzc2FyaWx5LiAgV2UgY2Fubm90IHRlbGwsIHNvIHBsYXkgaXQgc2FmZS4gIEZJWE1FLiAgKi8KKyNkZWZpbmUgU1FSX0JBU0VDQVNFX0xJTSAgU1FSX1RPT00yX1RIUkVTSE9MRAorI2VuZGlmCisKK3ZvaWQKK21wbl9zZWNfc3FyIChtcF9wdHIgcnAsCisJICAgICBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwKKwkgICAgIG1wX3B0ciB0cCkKK3sKKyNpZm5kZWYgU1FSX0JBU0VDQVNFX0xJTQorLyogSWYgU1FSX0JBU0VDQVNFX0xJTSBpcyBub3cgbm90IGRlZmluZWQsIHVzZSBtcG5fc3FyX2Jhc2VjYXNlIGZvciBhbnkgb3BlcmFuZAorICAgc2l6ZS4gICovCisgIG1wbl9zcXJfYmFzZWNhc2UgKHJwLCBhcCwgYW4pOworI2Vsc2UKKy8qIEVsc2UgdXNlIG1wbl9tdWxfYmFzZWNhc2UuICAqLworICBtcG5fbXVsX2Jhc2VjYXNlIChycCwgYXAsIGFuLCBhcCwgYW4pOworI2VuZGlmCit9CisKK21wX3NpemVfdAorbXBuX3NlY19zcXJfaXRjaCAobXBfc2l6ZV90IGFuKQoreworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NlY190YWJzZWxlY3QuYyBiL21wbi9nZW5lcmljL3NlY190YWJzZWxlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBiZGFjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2VjX3RhYnNlbGVjdC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBtcG5fc2VjX3RhYnNlbGVjdC4KKworQ29weXJpZ2h0IDIwMDctMjAwOSwgMjAxMSwgMjAxMywgMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2lmbmRlZiBTRUNfVEFCU0VMRUNUX01FVEhPRAorI2RlZmluZSBTRUNfVEFCU0VMRUNUX01FVEhPRCAxCisjZW5kaWYKKworLyogU2VsZWN0IGVudHJ5IGB3aGljaCcgZnJvbSB0YWJsZSBgdGFiJywgd2hpY2ggaGFzIG5lbnRzIGVudHJpZXMsIGVhY2ggYG4nCisgICBsaW1icy4gIFN0b3JlIHRoZSBzZWxlY3RlZCBlbnRyeSBhdCBycC4gIFJlYWRzIGVudGlyZSB0YWJsZSB0byBhdm9pZAorICAgc2lkZS1jaGFubmVsIGluZm9ybWF0aW9uIGxlYWtzLiAgTyhuKm5lbnRzKS4gICovCisKKyNpZiBTRUNfVEFCU0VMRUNUX01FVEhPRCA9PSAxCit2b2lkCittcG5fc2VjX3RhYnNlbGVjdCAodm9sYXRpbGUgbXBfbGltYl90ICpycCwgdm9sYXRpbGUgY29uc3QgbXBfbGltYl90ICp0YWIsCisJCSAgIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgbmVudHMsIG1wX3NpemVfdCB3aGljaCkKK3sKKyAgbXBfc2l6ZV90IGssIGk7CisgIG1wX2xpbWJfdCBtYXNrOworICB2b2xhdGlsZSBjb25zdCBtcF9saW1iX3QgKnRwOworCisgIHRwID0gdGFiOworCisgIC8qIFBsYWNlIGZpcnN0IGVudHJ5IGludG8gcmVzdWx0IGFyZWEuICovCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgcnBbaV0gPSB0cFtpXTsKKworICAvKiBDb25kaXRpb25hbGx5IHJlcGxhY2UgZW50cnkgaW4gcmVzdWx0IGFyZWEgYnkgZW50cnkgMS4uLihuZW50cy0xKSB1c2luZworICAgICBtYXNraW5nIHRyaWNrZXJ5LiAqLworICBmb3IgKGsgPSAxOyBrIDwgbmVudHM7IGsrKykKKyAgICB7CisgICAgICAvKiBHZW5lcmF0ZSBhIG1hc2sgdXNpbmcgYW4gZXhwcmVzc2lvbiB3aGljaCBhbGwgY29tcGlsZXJzIHNob3VsZCBjb21waWxlCisJIGludG8gYnJhbmNoLWZyZWUgY29kZS4gIFRoZSBjb252b2x1dGVkIGV4cHJlc3Npb24gaXMgZGVzaWduZWQgdG8gYm90aAorCSBhbGxvdyBtcF9saW1iX3QgZ3JlYXRlciBhbmQgbXBfbGltYl90IHNtYWxsZXIgdGhhbiBtcF9zaXplX3QuICovCisgICAgICBtYXNrID0gLShtcF9saW1iX3QpICgoLSh1bnNpZ25lZCBsb25nKSAod2hpY2ggXiBrKSkgPj4gKEJJVFNfUEVSX1VMT05HIC0gMSkpOworICAgICAgdHAgKz0gbjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJcnBbaV0gPSAocnBbaV0gJiBtYXNrKSB8ICh0cFtpXSAmIH5tYXNrKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIFNFQ19UQUJTRUxFQ1RfTUVUSE9EID09IDIKK3ZvaWQKK21wbl9zZWNfdGFic2VsZWN0ICh2b2xhdGlsZSBtcF9saW1iX3QgKiByZXN0cmljdCBycCwKKwkJICAgdm9sYXRpbGUgY29uc3QgbXBfbGltYl90ICogcmVzdHJpY3QgdGFiLAorCQkgICBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IG5lbnRzLCBtcF9zaXplX3Qgd2hpY2gpCit7CisgIG1wX3NpemVfdCBrLCBpOworICBtcF9saW1iX3QgbWFzaywgcjAsIHIxLCByMiwgcjM7CisgIHZvbGF0aWxlIGNvbnN0IG1wX2xpbWJfdCAqIHJlc3RyaWN0IHRwOworCisgIGlmIChuICYgMSkKKyAgICB7CisgICAgICB0cCA9IHRhYjsKKyAgICAgIHIwID0gMDsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBuZW50czsgaysrKQorCXsKKwkgIG1hc2sgPSAobXBfbGltYl90KSAoKC0odW5zaWduZWQgbG9uZykgKHdoaWNoIF4gaykpID4+IChCSVRTX1BFUl9VTE9ORyAtIDEpKSAtIDE7CisJICByMCArPSB0cFswXSAmIG1hc2s7CisJICB0cCArPSBuOworCX0KKyAgICAgIHJwWzBdID0gcjA7CisgICAgICBycCArPSAxOworICAgICAgdGFiICs9IDE7CisgICAgfQorCisgIGlmIChuICYgMikKKyAgICB7CisgICAgICB0cCA9IHRhYjsKKyAgICAgIHIwID0gcjEgPSAwOworICAgICAgZm9yIChrID0gMDsgayA8IG5lbnRzOyBrKyspCisJeworCSAgbWFzayA9IChtcF9saW1iX3QpICgoLSh1bnNpZ25lZCBsb25nKSAod2hpY2ggXiBrKSkgPj4gKEJJVFNfUEVSX1VMT05HIC0gMSkpIC0gMTsKKwkgIHIwICs9IHRwWzBdICYgbWFzazsKKwkgIHIxICs9IHRwWzFdICYgbWFzazsKKwkgIHRwICs9IG47CisJfQorICAgICAgcnBbMF0gPSByMDsKKyAgICAgIHJwWzFdID0gcjE7CisgICAgICBycCArPSAyOworICAgICAgdGFiICs9IDI7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gNCkKKyAgICB7CisgICAgICB0cCA9IHRhYiArIGk7CisgICAgICByMCA9IHIxID0gcjIgPSByMyA9IDA7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgbmVudHM7IGsrKykKKwl7CisJICBtYXNrID0gKG1wX2xpbWJfdCkgKCgtKHVuc2lnbmVkIGxvbmcpICh3aGljaCBeIGspKSA+PiAoQklUU19QRVJfVUxPTkcgLSAxKSkgLSAxOworCSAgcjAgKz0gdHBbMF0gJiBtYXNrOworCSAgcjEgKz0gdHBbMV0gJiBtYXNrOworCSAgcjIgKz0gdHBbMl0gJiBtYXNrOworCSAgcjMgKz0gdHBbM10gJiBtYXNrOworCSAgdHAgKz0gbjsKKwl9CisgICAgICBycFswXSA9IHIwOworICAgICAgcnBbMV0gPSByMTsKKyAgICAgIHJwWzJdID0gcjI7CisgICAgICBycFszXSA9IHIzOworICAgICAgcnAgKz0gNDsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3NldF9zdHIuYyBiL21wbi9nZW5lcmljL3NldF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQ1ODRjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc2V0X3N0ci5jCkBAIC0wLDAgKzEsMjkwIEBACisvKiBtcG5fc2V0X3N0ciAobXBfcHRyIHJlc19wdHIsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHN0cl9sZW4sIGludCBiYXNlKSAtLQorICAgQ29udmVydCBhIFNUUl9MRU4gbG9uZyBiYXNlIEJBU0UgYnl0ZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTVFIgdG8gYSBsaW1iCisgICB2ZWN0b3IgcG9pbnRlZCB0byBieSBSRVNfUFRSLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbGltYnMgaW4gUkVTX1BUUi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSwgRVhDRVBUIG1wbl9zZXRfc3RyLCBBUkUgSU5URVJOQUwgV0lUSCBNVVRBQkxFCisgICBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWSBTQUZFIFRPIFJFQUNIIFRIRU0gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuCisgICBJTiBGQUNULCBJVCBJUyBBTE1PU1QgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEKKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDE5OTEtMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKiBUT0RPOgorCisgICAgICBQZXJoYXBzIGRvIG5vdCBjb21wdXRlIHRoZSBoaWdoZXN0IHBvd2VyPworICAgICAgSW5zdGVhZCwgbXVsdGlwbHkgdHdpY2UgYnkgdGhlIDJuZCBoaWdoZXN0IHBvd2VyOgorCisJICAgICAgIF9fX19fX18KKwkgICAgICB8X19fX19fX3wgIGhwCisJICAgICAgfF9fX19fX198ICBwb3cKKyAgICAgICBfX19fX19fX19fX19fX18KKyAgICAgIHxfX19fX19fX19fX19fX198ICBmaW5hbCByZXN1bHQKKworCisJICAgICAgIF9fX19fX18KKwkgICAgICB8X19fX19fX3wgIGhwCisJCSAgfF9fX3wgIHBvd1stMV0KKwkgICBfX19fX19fX19fXworCSAgfF9fX19fX19fX19ffCAgaW50ZXJtZWRpYXRlIHJlc3VsdAorCQkgIHxfX198ICBwb3dbLTFdCisgICAgICAgX19fX19fX19fX19fX19fCisgICAgICB8X19fX19fX19fX19fX19ffCAgZmluYWwgcmVzdWx0CisKKyAgICAgIEdlbmVyYWxpemluZyB0aGF0IGlkZWEsIHBlcmhhcHMgd2Ugc2hvdWxkIG1ha2UgcG93dGFiIGNvbnRhaW4gc3VjY2Vzc2l2ZQorICAgICAgY3ViZXMsIG5vdCBzcXVhcmVzLgorKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK21wX3NpemVfdAorbXBuX3NldF9zdHIgKG1wX3B0ciBycCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3Qgc3RyX2xlbiwgaW50IGJhc2UpCit7CisgIGlmIChQT1cyX1AgKGJhc2UpKQorICAgIHsKKyAgICAgIC8qIFRoZSBiYXNlIGlzIGEgcG93ZXIgb2YgMi4gIFJlYWQgdGhlIGlucHV0IHN0cmluZyBmcm9tIGxlYXN0IHRvIG1vc3QKKwkgc2lnbmlmaWNhbnQgY2hhcmFjdGVyL2RpZ2l0LiAgKi8KKworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqczsKKyAgICAgIGludCBuZXh0X2JpdHBvczsKKyAgICAgIG1wX2xpbWJfdCByZXNfZGlnaXQ7CisgICAgICBtcF9zaXplX3Qgc2l6ZTsKKyAgICAgIGludCBiaXRzX3Blcl9pbmRpZ2l0ID0gbXBfYmFzZXNbYmFzZV0uYmlnX2Jhc2U7CisKKyAgICAgIHNpemUgPSAwOworICAgICAgcmVzX2RpZ2l0ID0gMDsKKyAgICAgIG5leHRfYml0cG9zID0gMDsKKworICAgICAgZm9yIChzID0gc3RyICsgc3RyX2xlbiAtIDE7IHMgPj0gc3RyOyBzLS0pCisJeworCSAgaW50IGlucF9kaWdpdCA9ICpzOworCisJICByZXNfZGlnaXQgfD0gKChtcF9saW1iX3QpIGlucF9kaWdpdCA8PCBuZXh0X2JpdHBvcykgJiBHTVBfTlVNQl9NQVNLOworCSAgbmV4dF9iaXRwb3MgKz0gYml0c19wZXJfaW5kaWdpdDsKKwkgIGlmIChuZXh0X2JpdHBvcyA+PSBHTVBfTlVNQl9CSVRTKQorCSAgICB7CisJICAgICAgcnBbc2l6ZSsrXSA9IHJlc19kaWdpdDsKKwkgICAgICBuZXh0X2JpdHBvcyAtPSBHTVBfTlVNQl9CSVRTOworCSAgICAgIHJlc19kaWdpdCA9IGlucF9kaWdpdCA+PiAoYml0c19wZXJfaW5kaWdpdCAtIG5leHRfYml0cG9zKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHJlc19kaWdpdCAhPSAwKQorCXJwW3NpemUrK10gPSByZXNfZGlnaXQ7CisgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAoc3RyX2xlbiwgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG1wbl9iY19zZXRfc3RyIChycCwgc3RyLCBzdHJfbGVuLCBiYXNlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3B0ciBwb3d0YWJfbWVtLCB0cDsKKyAgICAgIHBvd2Vyc190IHBvd3RhYltHTVBfTElNQl9CSVRTXTsKKyAgICAgIGludCBjaGFyc19wZXJfbGltYjsKKyAgICAgIG1wX3NpemVfdCBzaXplOworICAgICAgbXBfc2l6ZV90IHVuOworICAgICAgVE1QX0RFQ0w7CisKKyAgICAgIFRNUF9NQVJLOworCisgICAgICBjaGFyc19wZXJfbGltYiA9IG1wX2Jhc2VzW2Jhc2VdLmNoYXJzX3Blcl9saW1iOworCisgICAgICB1biA9IHN0cl9sZW4gLyBjaGFyc19wZXJfbGltYiArIDE7IC8qIEZJWE1FOiBzY2FsYXIgaW50ZWdlciBkaXZpc2lvbiAqLworCisgICAgICAvKiBBbGxvY2F0ZSBvbmUgbGFyZ2UgYmxvY2sgZm9yIHRoZSBwb3dlcnMgb2YgYmlnX2Jhc2UuICAqLworICAgICAgcG93dGFiX21lbSA9IFRNUF9CQUxMT0NfTElNQlMgKG1wbl9zdHJfcG93dGFiX2FsbG9jICh1bikpOworCisgICAgICBzaXplX3Qgbl9wb3dzID0gbXBuX2NvbXB1dGVfcG93dGFiIChwb3d0YWIsIHBvd3RhYl9tZW0sIHVuLCBiYXNlKTsKKyAgICAgIHBvd2Vyc190ICpwdCA9IHBvd3RhYiArIG5fcG93czsKKworICAgICAgdHAgPSBUTVBfQkFMTE9DX0xJTUJTIChtcG5fZGNfc2V0X3N0cl9pdGNoICh1bikpOworICAgICAgc2l6ZSA9IG1wbl9kY19zZXRfc3RyIChycCwgc3RyLCBzdHJfbGVuLCBwdCwgdHApOworCisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybiBzaXplOworICAgIH0KK30KKworbXBfc2l6ZV90CittcG5fZGNfc2V0X3N0ciAobXBfcHRyIHJwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHIsIHNpemVfdCBzdHJfbGVuLAorCQljb25zdCBwb3dlcnNfdCAqcG93dGFiLCBtcF9wdHIgdHApCit7CisgIHNpemVfdCBsZW5fbG8sIGxlbl9oaTsKKyAgbXBfbGltYl90IGN5OworICBtcF9zaXplX3QgbG4sIGhuLCBuLCBzbjsKKworICBsZW5fbG8gPSBwb3d0YWItPmRpZ2l0c19pbl9iYXNlOworCisgIGlmIChzdHJfbGVuIDw9IGxlbl9sbykKKyAgICB7CisgICAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChzdHJfbGVuLCBTRVRfU1RSX0RDX1RIUkVTSE9MRCkpCisJcmV0dXJuIG1wbl9iY19zZXRfc3RyIChycCwgc3RyLCBzdHJfbGVuLCBwb3d0YWItPmJhc2UpOworICAgICAgZWxzZQorCXJldHVybiBtcG5fZGNfc2V0X3N0ciAocnAsIHN0ciwgc3RyX2xlbiwgcG93dGFiIC0gMSwgdHApOworICAgIH0KKworICBsZW5faGkgPSBzdHJfbGVuIC0gbGVuX2xvOworICBBU1NFUlQgKGxlbl9sbyA+PSBsZW5faGkpOworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKGxlbl9oaSwgU0VUX1NUUl9EQ19USFJFU0hPTEQpKQorICAgIGhuID0gbXBuX2JjX3NldF9zdHIgKHRwLCBzdHIsIGxlbl9oaSwgcG93dGFiLT5iYXNlKTsKKyAgZWxzZQorICAgIGhuID0gbXBuX2RjX3NldF9zdHIgKHRwLCBzdHIsIGxlbl9oaSwgcG93dGFiIC0gMSwgcnApOworCisgIHNuID0gcG93dGFiLT5zaGlmdDsKKworICBpZiAoaG4gPT0gMCkKKyAgICB7CisgICAgICAvKiBaZXJvICsxIGxpbWIgaGVyZSwgdG8gYXZvaWQgcmVhZGluZyBhbiBhbGxvY2F0ZWQgYnV0IHVuaW5pdGlhbGlzZWQKKwkgbGltYiBpbiBtcG5faW5jcl91IGJlbG93LiAgKi8KKyAgICAgIE1QTl9aRVJPIChycCwgcG93dGFiLT5uICsgc24gKyAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocG93dGFiLT5uID4gaG4pCisJbXBuX211bCAocnAgKyBzbiwgcG93dGFiLT5wLCBwb3d0YWItPm4sIHRwLCBobik7CisgICAgICBlbHNlCisJbXBuX211bCAocnAgKyBzbiwgdHAsIGhuLCBwb3d0YWItPnAsIHBvd3RhYi0+bik7CisgICAgICBNUE5fWkVSTyAocnAsIHNuKTsKKyAgICB9CisKKyAgc3RyID0gc3RyICsgc3RyX2xlbiAtIGxlbl9sbzsKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobGVuX2xvLCBTRVRfU1RSX0RDX1RIUkVTSE9MRCkpCisgICAgbG4gPSBtcG5fYmNfc2V0X3N0ciAodHAsIHN0ciwgbGVuX2xvLCBwb3d0YWItPmJhc2UpOworICBlbHNlCisgICAgbG4gPSBtcG5fZGNfc2V0X3N0ciAodHAsIHN0ciwgbGVuX2xvLCBwb3d0YWIgLSAxLCB0cCArIHBvd3RhYi0+biArIHNuICsgMSk7CisKKyAgaWYgKGxuICE9IDApCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX24gKHJwLCBycCwgdHAsIGxuKTsKKyAgICAgIG1wbl9pbmNyX3UgKHJwICsgbG4sIGN5KTsKKyAgICB9CisgIG4gPSBobiArIHBvd3RhYi0+biArIHNuOworICByZXR1cm4gbiAtIChycFtuIC0gMV0gPT0gMCk7Cit9CisKK21wX3NpemVfdAorbXBuX2JjX3NldF9zdHIgKG1wX3B0ciBycCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3Qgc3RyX2xlbiwgaW50IGJhc2UpCit7CisgIG1wX3NpemVfdCBzaXplOworICBzaXplX3QgaTsKKyAgbG9uZyBqOworICBtcF9saW1iX3QgY3lfbGltYjsKKworICBtcF9saW1iX3QgYmlnX2Jhc2U7CisgIGludCBjaGFyc19wZXJfbGltYjsKKyAgbXBfbGltYl90IHJlc19kaWdpdDsKKworICBBU1NFUlQgKGJhc2UgPj0gMik7CisgIEFTU0VSVCAoYmFzZSA8IG51bWJlcm9mIChtcF9iYXNlcykpOworICBBU1NFUlQgKHN0cl9sZW4gPj0gMSk7CisKKyAgYmlnX2Jhc2UgPSBtcF9iYXNlc1tiYXNlXS5iaWdfYmFzZTsKKyAgY2hhcnNfcGVyX2xpbWIgPSBtcF9iYXNlc1tiYXNlXS5jaGFyc19wZXJfbGltYjsKKworICBzaXplID0gMDsKKyAgZm9yIChpID0gY2hhcnNfcGVyX2xpbWI7IGkgPCBzdHJfbGVuOyBpICs9IGNoYXJzX3Blcl9saW1iKQorICAgIHsKKyAgICAgIHJlc19kaWdpdCA9ICpzdHIrKzsKKyAgICAgIGlmIChiYXNlID09IDEwKQorCXsgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLgorCSAgICAgSGVscCB0aGUgY29tcGlsZXIgdG8gYXZvaWQgbXVsdGlwbGljYXRpb24uICAqLworCSAgZm9yIChqID0gTVBfQkFTRVNfQ0hBUlNfUEVSX0xJTUJfMTAgLSAxOyBqICE9IDA7IGotLSkKKwkgICAgcmVzX2RpZ2l0ID0gcmVzX2RpZ2l0ICogMTAgKyAqc3RyKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZvciAoaiA9IGNoYXJzX3Blcl9saW1iIC0gMTsgaiAhPSAwOyBqLS0pCisJICAgIHJlc19kaWdpdCA9IHJlc19kaWdpdCAqIGJhc2UgKyAqc3RyKys7CisJfQorCisgICAgICBpZiAoc2l6ZSA9PSAwKQorCXsKKwkgIGlmIChyZXNfZGlnaXQgIT0gMCkKKwkgICAgeworCSAgICAgIHJwWzBdID0gcmVzX2RpZ2l0OworCSAgICAgIHNpemUgPSAxOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzFjCisJICBjeV9saW1iID0gbXBuX211bF8xYyAocnAsIHJwLCBzaXplLCBiaWdfYmFzZSwgcmVzX2RpZ2l0KTsKKyNlbHNlCisJICBjeV9saW1iID0gbXBuX211bF8xIChycCwgcnAsIHNpemUsIGJpZ19iYXNlKTsKKwkgIGN5X2xpbWIgKz0gbXBuX2FkZF8xIChycCwgcnAsIHNpemUsIHJlc19kaWdpdCk7CisjZW5kaWYKKwkgIGlmIChjeV9saW1iICE9IDApCisJICAgIHJwW3NpemUrK10gPSBjeV9saW1iOworCX0KKyAgICB9CisKKyAgYmlnX2Jhc2UgPSBiYXNlOworICByZXNfZGlnaXQgPSAqc3RyKys7CisgIGlmIChiYXNlID09IDEwKQorICAgIHsgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLgorCSBIZWxwIHRoZSBjb21waWxlciB0byBhdm9pZCBtdWx0aXBsaWNhdGlvbi4gICovCisgICAgICBmb3IgKGogPSBzdHJfbGVuIC0gKGkgLSBNUF9CQVNFU19DSEFSU19QRVJfTElNQl8xMCkgLSAxOyBqID4gMDsgai0tKQorCXsKKwkgIHJlc19kaWdpdCA9IHJlc19kaWdpdCAqIDEwICsgKnN0cisrOworCSAgYmlnX2Jhc2UgKj0gMTA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaiA9IHN0cl9sZW4gLSAoaSAtIGNoYXJzX3Blcl9saW1iKSAtIDE7IGogPiAwOyBqLS0pCisJeworCSAgcmVzX2RpZ2l0ID0gcmVzX2RpZ2l0ICogYmFzZSArICpzdHIrKzsKKwkgIGJpZ19iYXNlICo9IGJhc2U7CisJfQorICAgIH0KKworICBpZiAoc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChyZXNfZGlnaXQgIT0gMCkKKwl7CisJICBycFswXSA9IHJlc19kaWdpdDsKKwkgIHNpemUgPSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgSEFWRV9OQVRJVkVfbXBuX211bF8xYworICAgICAgY3lfbGltYiA9IG1wbl9tdWxfMWMgKHJwLCBycCwgc2l6ZSwgYmlnX2Jhc2UsIHJlc19kaWdpdCk7CisjZWxzZQorICAgICAgY3lfbGltYiA9IG1wbl9tdWxfMSAocnAsIHJwLCBzaXplLCBiaWdfYmFzZSk7CisgICAgICBjeV9saW1iICs9IG1wbl9hZGRfMSAocnAsIHJwLCBzaXplLCByZXNfZGlnaXQpOworI2VuZGlmCisgICAgICBpZiAoY3lfbGltYiAhPSAwKQorCXJwW3NpemUrK10gPSBjeV9saW1iOworICAgIH0KKyAgcmV0dXJuIHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zaXplaW5iYXNlLmMgYi9tcG4vZ2VuZXJpYy9zaXplaW5iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZTk0NwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NpemVpbmJhc2UuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBtcG5fc2l6ZWluYmFzZSAtLSBhcHByb3hpbWF0aW9uIHRvIGNoYXJzIHJlcXVpcmVkIGZvciBhbiBtcG4uCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAxLCAyMDAyLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBTYW1lIGFzIG1wel9zaXplaW5iYXNlLCBtZWFuaW5nIGV4YWN0IGZvciBwb3dlci1vZi0yIGJhc2VzLCBhbmQgZWl0aGVyCisgICBleGFjdCBvciAxIHRvbyBiaWcgZm9yIG90aGVyIGJhc2VzLiAgKi8KKworc2l6ZV90CittcG5fc2l6ZWluYmFzZSAobXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgeHNpemUsIGludCBiYXNlKQoreworICBzaXplX3QgIHJlc3VsdDsKKyAgTVBOX1NJWkVJTkJBU0UgKHJlc3VsdCwgeHAsIHhzaXplLCBiYXNlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Nxci5jIGIvbXBuL2dlbmVyaWMvc3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmYmZmMAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Nxci5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIG1wbl9zcXIgLS0gc3F1YXJlIG5hdHVyYWwgbnVtYmVycy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYtMjAwMywgMjAwNSwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK3ZvaWQKK21wbl9zcXIgKG1wX3B0ciBwLCBtcF9zcmNwdHIgYSwgbXBfc2l6ZV90IG4pCit7CisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHAsIDIgKiBuLCBhLCBuKSk7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX0JBU0VDQVNFX1RIUkVTSE9MRCkpCisgICAgeyAvKiBtdWxfYmFzZWNhc2UgaXMgZmFzdGVyIHRoYW4gc3FyX2Jhc2VjYXNlIG9uIHNtYWxsIHNpemVzIHNvbWV0aW1lcyAqLworICAgICAgbXBuX211bF9iYXNlY2FzZSAocCwgYSwgbiwgYSwgbik7CisgICAgfQorICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NMl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wbl9zcXJfYmFzZWNhc2UgKHAsIGEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTNfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2Ugb2YgZml4ZWQgc2l6ZSBvbiBzdGFjazogZmFzdCEgKi8KKyAgICAgIG1wX2xpbWJfdCB3c1ttcG5fdG9vbTJfc3FyX2l0Y2ggKFNRUl9UT09NM19USFJFU0hPTERfTElNSVQtMSldOworICAgICAgQVNTRVJUIChTUVJfVE9PTTNfVEhSRVNIT0xEIDw9IFNRUl9UT09NM19USFJFU0hPTERfTElNSVQpOworICAgICAgbXBuX3Rvb20yX3NxciAocCwgYSwgbiwgd3MpOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTRfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tM19zcXJfaXRjaCAobikpOworICAgICAgbXBuX3Rvb20zX3NxciAocCwgYSwgbiwgd3MpOworICAgICAgVE1QX1NGUkVFOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTZfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tNF9zcXJfaXRjaCAobikpOworICAgICAgbXBuX3Rvb200X3NxciAocCwgYSwgbiwgd3MpOworICAgICAgVE1QX1NGUkVFOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTThfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcF9wdHIgd3M7CisgICAgICBUTVBfU0RFQ0w7CisgICAgICBUTVBfU01BUks7CisgICAgICB3cyA9IFRNUF9TQUxMT0NfTElNQlMgKG1wbl90b29tNl9zcXJfaXRjaCAobikpOworICAgICAgbXBuX3Rvb202X3NxciAocCwgYSwgbiwgd3MpOworICAgICAgVE1QX1NGUkVFOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfRkZUX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfcHRyIHdzOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIHdzID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbThfc3FyX2l0Y2ggKG4pKTsKKyAgICAgIG1wbl90b29tOF9zcXIgKHAsIGEsIG4sIHdzKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBjdXJyZW50IEZGVCBjb2RlIGFsbG9jYXRlcyBpdHMgb3duIHNwYWNlLiAgVGhhdCBzaG91bGQgcHJvYmFibHkKKwkgY2hhbmdlLiAgKi8KKyAgICAgIG1wbl9mZnRfbXVsIChwLCBhLCBuLCBhLCBuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zcXJfYmFzZWNhc2UuYyBiL21wbi9nZW5lcmljL3Nxcl9iYXNlY2FzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDViYWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zcXJfYmFzZWNhc2UuYwpAQCAtMCwwICsxLDM2MSBAQAorLyogbXBuX3Nxcl9iYXNlY2FzZSAtLSBJbnRlcm5hbCByb3V0aW5lIHRvIHNxdWFyZSBhIG5hdHVyYWwgbnVtYmVyCisgICBvZiBsZW5ndGggbi4KKworICAgVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIFRISVMgRlVOQ1RJT04gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuCisKKworQ29weXJpZ2h0IDE5OTEtMTk5NCwgMTk5NiwgMTk5NywgMjAwMC0yMDA1LCAyMDA4LCAyMDEwLCAyMDExLCAyMDE3IEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3Nxcl9kaWFnb25hbAorI2RlZmluZSBNUE5fU1FSX0RJQUdPTkFMKHJwLCB1cCwgbikJCQkJCVwKKyAgbXBuX3Nxcl9kaWFnb25hbCAocnAsIHVwLCBuKQorI2Vsc2UKKyNkZWZpbmUgTVBOX1NRUl9ESUFHT05BTChycCwgdXAsIG4pCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfc2l6ZV90IF9pOwkJCQkJCQlcCisgICAgZm9yIChfaSA9IDA7IF9pIDwgKG4pOyBfaSsrKQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwltcF9saW1iX3QgdWwsIGxwbDsJCQkJCQlcCisJdWwgPSAodXApW19pXTsJCQkJCQkJXAorCXVtdWxfcHBtbSAoKHJwKVsyICogX2kgKyAxXSwgbHBsLCB1bCwgdWwgPDwgR01QX05BSUxfQklUUyk7CVwKKwkocnApWzIgKiBfaV0gPSBscGwgPj4gR01QX05BSUxfQklUUzsJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3Nxcl9kaWFnX2FkZGxzaDEKKyNkZWZpbmUgTVBOX1NRUl9ESUFHX0FERExTSDEocnAsIHRwLCB1cCwgbikJCQkJXAorICBtcG5fc3FyX2RpYWdfYWRkbHNoMSAocnAsIHRwLCB1cCwgbikKKyNlbHNlCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorI2RlZmluZSBNUE5fU1FSX0RJQUdfQURETFNIMShycCwgdHAsIHVwLCBuKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IGN5OwkJCQkJCQlcCisgICAgTVBOX1NRUl9ESUFHT05BTCAocnAsIHVwLCBuKTsJCQkJCVwKKyAgICBjeSA9IG1wbl9hZGRsc2gxX24gKHJwICsgMSwgcnAgKyAxLCB0cCwgMiAqIG4gLSAyKTsJCQlcCisgICAgcnBbMiAqIG4gLSAxXSArPSBjeTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBNUE5fU1FSX0RJQUdfQURETFNIMShycCwgdHAsIHVwLCBuKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgbXBfbGltYl90IGN5OwkJCQkJCQlcCisgICAgTVBOX1NRUl9ESUFHT05BTCAocnAsIHVwLCBuKTsJCQkJCVwKKyAgICBjeSA9IG1wbl9sc2hpZnQgKHRwLCB0cCwgMiAqIG4gLSAyLCAxKTsJCQkJXAorICAgIGN5ICs9IG1wbl9hZGRfbiAocnAgKyAxLCBycCArIDEsIHRwLCAyICogbiAtIDIpOwkJCVwKKyAgICBycFsyICogbiAtIDFdICs9IGN5OwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKworI3VuZGVmIFJFQURZX1dJVEhfbXBuX3Nxcl9iYXNlY2FzZQorCisKKyNpZiAhIGRlZmluZWQgKFJFQURZX1dJVEhfbXBuX3Nxcl9iYXNlY2FzZSkgJiYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF8ycwordm9pZAorbXBuX3Nxcl9iYXNlY2FzZSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IHRhcnJbMiAqIFNRUl9UT09NMl9USFJFU0hPTERdOworICBtcF9wdHIgdHAgPSB0YXJyOworICBtcF9saW1iX3QgY3k7CisKKyAgLyogbXVzdCBmaXQgMipuIGxpbWJzIGluIHRhcnIgKi8KKyAgQVNTRVJUIChuIDw9IFNRUl9UT09NMl9USFJFU0hPTEQpOworCisgIGlmICgobiAmIDEpICE9IDApCisgICAgeworICAgICAgaWYgKG4gPT0gMSkKKwl7CisJICBtcF9saW1iX3QgdWwsIGxwbDsKKwkgIHVsID0gdXBbMF07CisJICB1bXVsX3BwbW0gKHJwWzFdLCBscGwsIHVsLCB1bCA8PCBHTVBfTkFJTF9CSVRTKTsKKwkgIHJwWzBdID0gbHBsID4+IEdNUF9OQUlMX0JJVFM7CisJICByZXR1cm47CisJfQorCisgICAgICBNUE5fWkVSTyAodHAsIG4pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG4gLSAyOyBpICs9IDIpCisJeworCSAgY3kgPSBtcG5fYWRkbXVsXzJzICh0cCArIDIgKiBpLCB1cCArIGkgKyAxLCBuIC0gKGkgKyAxKSwgdXAgKyBpKTsKKwkgIHRwW24gKyBpXSA9IGN5OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobiA9PSAyKQorCXsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKwkgIHJwWzNdID0gbXBuX211bF8yIChycCwgdXAsIDIsIHVwKTsKKyNlbHNlCisJICBycFswXSA9IDA7CisJICBycFsxXSA9IDA7CisJICBycFszXSA9IG1wbl9hZGRtdWxfMiAocnAsIHVwLCAyLCB1cCk7CisjZW5kaWYKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIE1QTl9aRVJPICh0cCwgbik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gMikKKwl7CisJICBjeSA9IG1wbl9hZGRtdWxfMnMgKHRwICsgMiAqIGksIHVwICsgaSArIDEsIG4gLSAoaSArIDEpLCB1cCArIGkpOworCSAgdHBbbiArIGldID0gY3k7CisJfQorICAgICAgY3kgPSBtcG5fYWRkbXVsXzEgKHRwICsgMiAqIG4gLSA0LCB1cCArIG4gLSAxLCAxLCB1cFtuIC0gMl0pOworICAgICAgdHBbMiAqIG4gLSAzXSA9IGN5OworICAgIH0KKworICBNUE5fU1FSX0RJQUdfQURETFNIMSAocnAsIHRwLCB1cCwgbik7Cit9CisjZGVmaW5lIFJFQURZX1dJVEhfbXBuX3Nxcl9iYXNlY2FzZQorI2VuZGlmCisKKworI2lmICEgZGVmaW5lZCAoUkVBRFlfV0lUSF9tcG5fc3FyX2Jhc2VjYXNlKSAmJiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzIKKworLyogbXBuX3Nxcl9iYXNlY2FzZSB1c2luZyBwbGFpbiBtcG5fYWRkbXVsXzIuCisKKyAgIFRoaXMgaXMgdHJpY2t5LCBzaW5jZSB3ZSBoYXZlIHRvIGxldCBtcG5fYWRkbXVsXzIgbWFrZSBzb21lIHVuZGVzaXJhYmxlCisgICBtdWx0aXBsaWVzLCB1W2tdKnVba10sIHRoYXQgd2Ugd291bGQgbGlrZSB0byBsZXQgbXBuX3Nxcl9kaWFnb25hbCBoYW5kbGUuCisgICBUaGlzIGZvcmNlcyB1cyB0byBjb25kaXRpb25hbGx5IGFkZCBvciBzdWJ0cmFjdCB0aGUgbXBuX3Nxcl9kaWFnb25hbAorICAgcmVzdWx0cy4gIEV4YW1wbGVzIG9mIHRoZSBwcm9kdWN0IHdlIGZvcm06CisKKyAgIG4gPSA0ICAgICAgICAgICAgICBuID0gNQkJbiA9IDYKKyAgIHUxdTAgKiB1M3UydTEgICAgICB1MXUwICogdTR1M3UydTEJdTF1MCAqIHU1dTR1M3UydTEKKyAgIHUyICogdTMJICAgICAgdTN1MiAqIHU0dTMJdTN1MiAqIHU1dTR1MworCQkJCQl1NCAqIHU1CisgICBhZGQ6IHUwIHUyIHUzICAgICAgYWRkOiB1MCB1MiB1NAlhZGQ6IHUwIHUyIHU0IHU1CisgICBzdWI6IHUxCSAgICAgIHN1YjogdTEgdTMJc3ViOiB1MSB1MworKi8KKwordm9pZAorbXBuX3Nxcl9iYXNlY2FzZSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgaTsKKyAgbXBfbGltYl90IHRhcnJbMiAqIFNRUl9UT09NMl9USFJFU0hPTERdOworICBtcF9wdHIgdHAgPSB0YXJyOworICBtcF9saW1iX3QgY3k7CisKKyAgLyogbXVzdCBmaXQgMipuIGxpbWJzIGluIHRhcnIgKi8KKyAgQVNTRVJUIChuIDw9IFNRUl9UT09NMl9USFJFU0hPTEQpOworCisgIGlmICgobiAmIDEpICE9IDApCisgICAgeworICAgICAgbXBfbGltYl90IHgwLCB4MTsKKworICAgICAgaWYgKG4gPT0gMSkKKwl7CisJICBtcF9saW1iX3QgdWwsIGxwbDsKKwkgIHVsID0gdXBbMF07CisJICB1bXVsX3BwbW0gKHJwWzFdLCBscGwsIHVsLCB1bCA8PCBHTVBfTkFJTF9CSVRTKTsKKwkgIHJwWzBdID0gbHBsID4+IEdNUF9OQUlMX0JJVFM7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBUaGUgY29kZSBiZWxvdyBkb2Vzbid0IGxpa2UgdW5ub3JtYWxpemVkIG9wZXJhbmRzLiAgU2luY2Ugc3VjaAorCSBvcGVyYW5kcyBhcmUgdW51c3VhbCwgaGFuZGxlIHRoZW0gd2l0aCBhIGR1bWIgcmVjdXJzaW9uLiAgKi8KKyAgICAgIGlmICh1cFtuIC0gMV0gPT0gMCkKKwl7CisJICBycFsyICogbiAtIDJdID0gMDsKKwkgIHJwWzIgKiBuIC0gMV0gPSAwOworCSAgbXBuX3Nxcl9iYXNlY2FzZSAocnAsIHVwLCBuIC0gMSk7CisJICByZXR1cm47CisJfQorCisgICAgICBNUE5fWkVSTyAodHAsIG4pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG4gLSAyOyBpICs9IDIpCisJeworCSAgY3kgPSBtcG5fYWRkbXVsXzIgKHRwICsgMiAqIGksIHVwICsgaSArIDEsIG4gLSAoaSArIDEpLCB1cCArIGkpOworCSAgdHBbbiArIGldID0gY3k7CisJfQorCisgICAgICBNUE5fU1FSX0RJQUdPTkFMIChycCwgdXAsIG4pOworCisgICAgICBmb3IgKGkgPSAyOzsgaSArPSA0KQorCXsKKwkgIHgwID0gcnBbaSArIDBdOworCSAgcnBbaSArIDBdID0gKC14MCkgJiBHTVBfTlVNQl9NQVNLOworCSAgeDEgPSBycFtpICsgMV07CisJICBycFtpICsgMV0gPSAoLXgxIC0gKHgwICE9IDApKSAmIEdNUF9OVU1CX01BU0s7CisJICBfX0dNUE5fU1VCXzEgKGN5LCBycCArIGkgKyAyLCBycCArIGkgKyAyLCAyLCAoeDEgfCB4MCkgIT0gMCk7CisJICBpZiAoaSArIDQgPj0gMiAqIG4pCisJICAgIGJyZWFrOworCSAgbXBuX2luY3JfdSAocnAgKyBpICsgNCwgY3kpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgeDAsIHgxOworCisgICAgICBpZiAobiA9PSAyKQorCXsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKwkgIHJwWzNdID0gbXBuX211bF8yIChycCwgdXAsIDIsIHVwKTsKKyNlbHNlCisJICBycFswXSA9IDA7CisJICBycFsxXSA9IDA7CisJICBycFszXSA9IG1wbl9hZGRtdWxfMiAocnAsIHVwLCAyLCB1cCk7CisjZW5kaWYKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIFRoZSBjb2RlIGJlbG93IGRvZXNuJ3QgbGlrZSB1bm5vcm1hbGl6ZWQgb3BlcmFuZHMuICBTaW5jZSBzdWNoCisJIG9wZXJhbmRzIGFyZSB1bnVzdWFsLCBoYW5kbGUgdGhlbSB3aXRoIGEgZHVtYiByZWN1cnNpb24uICAqLworICAgICAgaWYgKHVwW24gLSAxXSA9PSAwKQorCXsKKwkgIHJwWzIgKiBuIC0gMl0gPSAwOworCSAgcnBbMiAqIG4gLSAxXSA9IDA7CisJICBtcG5fc3FyX2Jhc2VjYXNlIChycCwgdXAsIG4gLSAxKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIE1QTl9aRVJPICh0cCwgbik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gMikKKwl7CisJICBjeSA9IG1wbl9hZGRtdWxfMiAodHAgKyAyICogaSwgdXAgKyBpICsgMSwgbiAtIChpICsgMSksIHVwICsgaSk7CisJICB0cFtuICsgaV0gPSBjeTsKKwl9CisgICAgICBjeSA9IG1wbl9hZGRtdWxfMSAodHAgKyAyICogbiAtIDQsIHVwICsgbiAtIDEsIDEsIHVwW24gLSAyXSk7CisgICAgICB0cFsyICogbiAtIDNdID0gY3k7CisKKyAgICAgIE1QTl9TUVJfRElBR09OQUwgKHJwLCB1cCwgbik7CisKKyAgICAgIGZvciAoaSA9IDI7OyBpICs9IDQpCisJeworCSAgeDAgPSBycFtpICsgMF07CisJICBycFtpICsgMF0gPSAoLXgwKSAmIEdNUF9OVU1CX01BU0s7CisJICB4MSA9IHJwW2kgKyAxXTsKKwkgIHJwW2kgKyAxXSA9ICgteDEgLSAoeDAgIT0gMCkpICYgR01QX05VTUJfTUFTSzsKKwkgIGlmIChpICsgNiA+PSAyICogbikKKwkgICAgYnJlYWs7CisJICBfX0dNUE5fU1VCXzEgKGN5LCBycCArIGkgKyAyLCBycCArIGkgKyAyLCAyLCAoeDEgfCB4MCkgIT0gMCk7CisJICBtcG5faW5jcl91IChycCArIGkgKyA0LCBjeSk7CisJfQorICAgICAgbXBuX2RlY3JfdSAocnAgKyBpICsgMiwgKHgxIHwgeDApICE9IDApOworICAgIH0KKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgY3kgPSBtcG5fYWRkbHNoMV9uIChycCArIDEsIHJwICsgMSwgdHAsIDIgKiBuIC0gMik7CisjZWxzZQorICBjeSA9IG1wbl9sc2hpZnQgKHRwLCB0cCwgMiAqIG4gLSAyLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChycCArIDEsIHJwICsgMSwgdHAsIDIgKiBuIC0gMik7CisjZW5kaWYKKyAgcnBbMiAqIG4gLSAxXSArPSBjeTsKK30KKyNkZWZpbmUgUkVBRFlfV0lUSF9tcG5fc3FyX2Jhc2VjYXNlCisjZW5kaWYKKworCisjaWYgISBkZWZpbmVkIChSRUFEWV9XSVRIX21wbl9zcXJfYmFzZWNhc2UpICYmIEhBVkVfTkFUSVZFX21wbl9zcXJfZGlhZ19hZGRsc2gxCisKKy8qIG1wbl9zcXJfYmFzZWNhc2UgdXNpbmcgbXBuX2FkZG11bF8xIGFuZCBtcG5fc3FyX2RpYWdfYWRkbHNoMSwgYXZvaWRpbmcgc3RhY2sKKyAgIGFsbG9jYXRpb24uICAqLwordm9pZAorbXBuX3Nxcl9iYXNlY2FzZSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBpZiAobiA9PSAxKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB1bCwgbHBsOworICAgICAgdWwgPSB1cFswXTsKKyAgICAgIHVtdWxfcHBtbSAocnBbMV0sIGxwbCwgdWwsIHVsIDw8IEdNUF9OQUlMX0JJVFMpOworICAgICAgcnBbMF0gPSBscGwgPj4gR01QX05BSUxfQklUUzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9zaXplX3QgaTsKKyAgICAgIG1wX3B0ciB4cDsKKworICAgICAgcnAgKz0gMTsKKyAgICAgIHJwW24gLSAxXSA9IG1wbl9tdWxfMSAocnAsIHVwICsgMSwgbiAtIDEsIHVwWzBdKTsKKyAgICAgIGZvciAoaSA9IG4gLSAyOyBpICE9IDA7IGktLSkKKwl7CisJICB1cCArPSAxOworCSAgcnAgKz0gMjsKKwkgIHJwW2ldID0gbXBuX2FkZG11bF8xIChycCwgdXAgKyAxLCBpLCB1cFswXSk7CisJfQorCisgICAgICB4cCA9IHJwIC0gMiAqIG4gKyAzOworICAgICAgbXBuX3Nxcl9kaWFnX2FkZGxzaDEgKHhwLCB4cCArIDEsIHVwIC0gbiArIDIsIG4pOworICAgIH0KK30KKyNkZWZpbmUgUkVBRFlfV0lUSF9tcG5fc3FyX2Jhc2VjYXNlCisjZW5kaWYKKworCisjaWYgISBkZWZpbmVkIChSRUFEWV9XSVRIX21wbl9zcXJfYmFzZWNhc2UpCisKKy8qIERlZmF1bHQgbXBuX3Nxcl9iYXNlY2FzZSB1c2luZyBtcG5fYWRkbXVsXzEuICAqLwordm9pZAorbXBuX3Nxcl9iYXNlY2FzZSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3QgaTsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgMipuLCB1cCwgbikpOworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgbXBfbGltYl90IHVsLCBscGw7CisgICAgICB1bCA9IHVwWzBdOworICAgICAgdW11bF9wcG1tIChycFsxXSwgbHBsLCB1bCwgdWwgPDwgR01QX05BSUxfQklUUyk7CisgICAgICBycFswXSA9IGxwbCA+PiBHTVBfTkFJTF9CSVRTOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB0YXJyWzIgKiBTUVJfVE9PTTJfVEhSRVNIT0xEXTsKKyAgICAgIG1wX3B0ciB0cCA9IHRhcnI7CisgICAgICBtcF9saW1iX3QgY3k7CisKKyAgICAgIC8qIG11c3QgZml0IDIqbiBsaW1icyBpbiB0YXJyICovCisgICAgICBBU1NFUlQgKG4gPD0gU1FSX1RPT00yX1RIUkVTSE9MRCk7CisKKyAgICAgIGN5ID0gbXBuX211bF8xICh0cCwgdXAgKyAxLCBuIC0gMSwgdXBbMF0pOworICAgICAgdHBbbiAtIDFdID0gY3k7CisgICAgICBmb3IgKGkgPSAyOyBpIDwgbjsgaSsrKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKwkgIGN5ID0gbXBuX2FkZG11bF8xICh0cCArIDIgKiBpIC0gMiwgdXAgKyBpLCBuIC0gaSwgdXBbaSAtIDFdKTsKKwkgIHRwW24gKyBpIC0gMl0gPSBjeTsKKwl9CisKKyAgICAgIE1QTl9TUVJfRElBR19BRERMU0gxIChycCwgdHAsIHVwLCBuKTsKKyAgICB9Cit9CisjZGVmaW5lIFJFQURZX1dJVEhfbXBuX3Nxcl9iYXNlY2FzZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zcXJsby5jIGIvbXBuL2dlbmVyaWMvc3FybG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUzMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc3FybG8uYwpAQCAtMCwwICsxLDIzOSBAQAorLyogbXBuX3NxcmxvIC0tIHNxdWFyZXMgYW4gbi1saW1iIG51bWJlciBhbmQgcmV0dXJucyB0aGUgbG93IG4gbGltYnMKKyAgIG9mIHRoZSByZXN1bHQuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTWFyY28gQm9kcmF0by4KKworICAgVEhJUyBJUyAoRk9SIE5PVykgQU4gSU5URVJOQUwgRlVOQ1RJT04uICBJVCBJUyBPTkxZIFNBRkUgVE8gUkVBQ0ggVEhJUworICAgRlVOQ1RJT04gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QgR1VBUkFOVEVFRAorICAgVEhBVCBJVCdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMCwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQgfHwgV0FOVF9GQVRfQklOQVJZCisjZGVmaW5lIE1BWUJFX3JhbmdlX2Jhc2VjYXNlIDEKKyNkZWZpbmUgTUFZQkVfcmFuZ2VfdG9vbTIyICAgMQorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfcmFuZ2VfYmFzZWNhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNRUkxPX0RDX1RIUkVTSE9MRCA9PSAwID8gU1FSTE9fQkFTRUNBU0VfVEhSRVNIT0xEIDogU1FSTE9fRENfVEhSRVNIT0xEKSA8IFNRUl9UT09NMl9USFJFU0hPTEQqMzYvKDM2LTExKSkKKyNkZWZpbmUgTUFZQkVfcmFuZ2VfdG9vbTIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKFNRUkxPX0RDX1RIUkVTSE9MRCA9PSAwID8gU1FSTE9fQkFTRUNBU0VfVEhSRVNIT0xEIDogU1FSTE9fRENfVEhSRVNIT0xEKSA8IFNRUl9UT09NM19USFJFU0hPTEQqMzYvKDM2LTExKSApCisjZW5kaWYKKworLyogIFRISU5LOiBUaGUgREMgc3RyYXRlZ3kgdXNlcyBkaWZmZXJlbnQgY29uc3RhbnRzIGluIGRpZmZlcmVudCBUb29tJ3MKKwkgcmFuZ2VzLiBTb21ldGhpbmcgc21vb3RoZXI/CisqLworCisvKgorICBDb21wdXRlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBoYWxmIG9mIHRoZSBwcm9kdWN0IHt4eSxufSp7eXAsbn0sIG9yCisgIGZvcm1hbGx5IHtycCxufSA9IHt4eSxufSp7eXAsbn0gTW9kIChCXm4pLgorCisgIEFib3ZlIHRoZSBnaXZlbiB0aHJlc2hvbGQsIHRoZSBEaXZpZGUgYW5kIENvbnF1ZXIgc3RyYXRlZ3kgaXMgdXNlZC4KKyAgVGhlIG9wZXJhbmQgaXMgc3BsaXQgaW4gdHdvLCBhbmQgYSBmdWxsIHNxdWFyZSBwbHVzIGEgbXVsbG8KKyAgaXMgdXNlZCB0byBvYnRhaW4gdGhlIGZpbmFsIHJlc3VsdC4gVGhlIG1vcmUgbmF0dXJhbCBzdHJhdGVneSBpcyB0bworICBzcGxpdCBpbiB0d28gaGFsdmVzLCBidXQgdGhpcyBpcyBmYXIgZnJvbSBvcHRpbWFsIHdoZW4gYQorICBzdWItcXVhZHJhdGljIG11bHRpcGxpY2F0aW9uIGlzIHVzZWQuCisKKyAgTXVsZGVycyBzdWdnZXN0cyBhbiB1bmJhbGFuY2VkIHNwbGl0IGluIGZhdm91ciBvZiB0aGUgZnVsbCBwcm9kdWN0LAorICBzcGxpdCBuID0gbjEgKyBuMiwgd2hlcmUgYW4gPSBuMSA8PSBuMiA9ICgxLWEpbjsgaS5lLiAwIDwgYSA8PSAxLzIuCisKKyAgVG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgYSwgd2UgYXNzdW1lIHRoYXQgdGhlIGNvc3Qgb2YgbXVsbG8gZm9yIGEKKyAgZ2l2ZW4gc2l6ZSBNTChuKSBpcyBhIGZyYWN0aW9uIG9mIHRoZSBjb3N0IG9mIGEgZnVsbCBwcm9kdWN0IHdpdGgKKyAgc2FtZSBzaXplIE0obiksIGFuZCB0aGUgY29zdCBNKG4pPW5eZSBmb3Igc29tZSBleHBvbmVudCAxIDwgZSA8PSAyOworICB0aGVuIHdlIGNhbiB3cml0ZToKKworICBNTChuKSA9IDIqTUwoYW4pICsgTSgoMS1hKW4pID0+IGsqTShuKSA9IDIqaypNKG4pKmFeZSArIE0obikqKDEtYSleZQorCisgIEdpdmVuIGEgdmFsdWUgZm9yIGUsIHdhbnQgdG8gbWluaW1pc2UgdGhlIHZhbHVlIG9mIGssIGkuZS4gdGhlCisgIGZ1bmN0aW9uIGs9KDEtYSleZS8oMS0yKmFeZSkuCisKKyAgV2l0aCBlPTIsIHRoZSBleHBvbmVudCBmb3Igc2Nob29sYm9vayBtdWx0aXBsaWNhdGlvbiwgdGhlIG1pbmltdW0gaXMKKyAgZ2l2ZW4gYnkgdGhlIHZhbHVlcyBhPTEtYT0xLzIuCisKKyAgV2l0aCBlPWxvZygzKS9sb2coMiksIHRoZSBleHBvbmVudCBmb3IgS2FyYXRzdWJhIChha2EgdG9vbTIyKSwKKyAgTXVsZGVycyBjb21wdXRlICgxLWEpID0gMC42OTQuLi4gYW5kIHdlIGFwcHJveGltYXRlIGEgd2l0aCAxMS8zNi4KKworICBPdGhlciBwb3NzaWJsZSBhcHByb3hpbWF0aW9ucyBmb2xsb3c6CisgIGU9bG9nKDUpL2xvZygzKSBbVG9vbS0zXSAtPiBhIH49IDkvNDAKKyAgZT1sb2coNykvbG9nKDQpIFtUb29tLTRdIC0+IGEgfj0gNy8zOQorICBlPWxvZygxMSkvbG9nKDYpIFtUb29tLTZdIC0+IGEgfj0gMS84CisgIGU9bG9nKDE1KS9sb2coOCkgW1Rvb20tOF0gLT4gYSB+PSAxLzEwCisKKyAgVGhlIHZhbHVlcyBhYm92ZSB3aGVyZSBvYnRhaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgdHJpdmlhbCBjb21tYW5kcworICBpbiB0aGUgZ3AtcGFyaSBzaGVsbDoKKworZnVuKGUsYSk9KDEtYSleZS8oMS0yKmFeZSkKK211bChhLGIsYyk9e2xvY2FsKG0seCxwKTtpZihiLWM8MS8xMDAwMCwoYitjKS8yLG09MTt4PWI7Zm9yc3RlcChwPWMsYiwoYi1jKS84LGlmKGZ1bihhLHApPG0sbT1mdW4oYSxwKTt4PXApKTttdWwoYSwoYit4KS8yLChjK3gpLzIpKX0KK2NvbnRmcmFjcG5xbihjb250ZnJhYyhtdWwobG9nKDIqMi0xKS9sb2coMiksMS8yLDApLDUpKQorY29udGZyYWNwbnFuKGNvbnRmcmFjKG11bChsb2coMyoyLTEpL2xvZygzKSwxLzIsMCksNSkpCitjb250ZnJhY3BucW4oY29udGZyYWMobXVsKGxvZyg0KjItMSkvbG9nKDQpLDEvMiwwKSw1KSkKK2NvbnRmcmFjcG5xbihjb250ZnJhYyhtdWwobG9nKDYqMi0xKS9sb2coNiksMS8yLDApLDMpKQorY29udGZyYWNwbnFuKGNvbnRmcmFjKG11bChsb2coOCoyLTEpL2xvZyg4KSwxLzIsMCksMykpCisKKyAgLAorICB8XAorICB8IFwKKyAgKy0tLS0sCisgIHwgICAgfAorICB8ICAgIHwKKyAgfCAgICB8XAorICB8ICAgIHwgXAorICArLS0tLSstLWAKKyAgXiBuMiBebjFeCisKKyAgRm9yIGFuIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiwgdGhlIGFzc3VtcHRpb24gdGhhdCBNKG4pPW5eZSBpcworICBpbmNvcnJlY3QsIGFzIGEgY29uc2VxdWVuY2UgYWxzbyB0aGUgYXNzdW1wdGlvbiB0aGF0IE1MKG4pPWsqTShuKQorICB3aXRoIGEgY29uc3RhbnQgayBpcyB3cm9uZy4KKworICBCdXQgdGhlb3J5IHN1Z2dlc3QgdXMgdHdvIHRoaW5nczoKKyAgLSB0aGUgYmVzdCB0aGUgbXVsdGlwbGljYXRpb24gcHJvZHVjdCBpcyAobG93ZXIgZSksIHRoZSBtb3JlIGsKKyAgICBhcHByb2FjaGVzIDEsIGFuZCBhIGFwcHJvYWNoZXMgMC4KKworICAtIEEgdmFsdWUgZm9yIGEgc21hbGxlciB0aGFuIG9wdGltYWwgaXMgcHJvYmFibHkgbGVzcyBiYWQgdGhhbiBhCisgICAgYmlnZ2VyIG9uZTogZS5nLiBsZXQgZT1sb2coMykvbG9nKDIpLCBhPTAuMzA1OF8gdGhlIG9wdGltYWwKKyAgICB2YWx1ZSwgYW5kIGsoYSk9MC44MDhfIHRoZSBtdWwvbXVsbG8gc3BlZWQgcmF0aW8uIFdlIGdldAorICAgIGsoYSsxLzYpPTAuOTI5XyBidXQgayhhLTEvNik9MC44NjVfLgorKi8KKworc3RhdGljIG1wX3NpemVfdAorbXBuX3NxcmxvX2l0Y2ggKG1wX3NpemVfdCBuKQoreworICByZXR1cm4gMipuOworfQorCisvKgorICAgIG1wbl9kY19zcXJsbyByZXF1aXJlcyBhIHNjcmF0Y2ggc3BhY2Ugb2YgMipuIGxpbWJzIGF0IHRwLgorICAgIEl0IGFjY2VwdHMgdHAgPT0gcnAuCisqLworc3RhdGljIHZvaWQKK21wbl9kY19zcXJsbyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgeHAsIG1wX3NpemVfdCBuLCBtcF9wdHIgdHApCit7CisgIG1wX3NpemVfdCBuMiwgbjE7CisgIEFTU0VSVCAobiA+PSAyKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB4cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFMl9QKHJwLCBuLCB0cCwgMipuKSk7CisKKyAgLyogRGl2aWRlLWFuZC1jb25xdWVyICovCisKKyAgLyogV2UgbmVlZCBmcmFjdGlvbmFsIGFwcHJveGltYXRpb24gb2YgdGhlIHZhbHVlIDAgPCBhIDw9IDEvMgorICAgICBnaXZpbmcgdGhlIG1pbmltdW0gaW4gdGhlIGZ1bmN0aW9uIGs9KDEtYSleZS8oMS0yKmFeZSkuCisgICovCisgIGlmIChNQVlCRV9yYW5nZV9iYXNlY2FzZSAmJiBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NMl9USFJFU0hPTEQqMzYvKDM2LTExKSkpCisgICAgbjEgPSBuID4+IDE7CisgIGVsc2UgaWYgKE1BWUJFX3JhbmdlX3Rvb20yMiAmJiBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NM19USFJFU0hPTEQqMzYvKDM2LTExKSkpCisgICAgbjEgPSBuICogMTEgLyAoc2l6ZV90KSAzNjsJLyogbjEgfj0gbiooMS0uNjk0Li4uKSAqLworICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NNF9USFJFU0hPTEQqNDAvKDQwLTkpKSkKKyAgICBuMSA9IG4gKiA5IC8gKHNpemVfdCkgNDA7CS8qIG4xIH49IG4qKDEtLjc3NS4uLikgKi8KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTThfVEhSRVNIT0xEKjEwLzkpKQorICAgIG4xID0gbiAqIDcgLyAoc2l6ZV90KSAzOTsJLyogbjEgfj0gbiooMS0uODIxLi4uKSAqLworICAvKiBuMSA9IG4gKiA0IC8gKHNpemVfdCkgMzE7CS8vIG4xIH49IG4qKDEtLjg3MS4uLikgW1RPT002Nl0gKi8KKyAgZWxzZQorICAgIG4xID0gbiAvIChzaXplX3QpIDEwOwkJLyogbjEgfj0gbiooMS0uODk5Li4uKSBbVE9PTTg4XSAqLworCisgIG4yID0gbiAtIG4xOworCisgIC8qIFNwbGl0IGFzIHggPSB4MSAyXihuMiBHTVBfTlVNQl9CSVRTKSArIHgwICovCisKKyAgLyogeDAgXiAyICovCisgIG1wbl9zcXIgKHRwLCB4cCwgbjIpOworICBNUE5fQ09QWSAocnAsIHRwLCBuMik7CisKKyAgLyogeDEgKiB4MCAqIDJeKG4yIEdNUF9OVU1CX0JJVFMpICovCisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4xLCBNVUxMT19CQVNFQ0FTRV9USFJFU0hPTEQpKQorICAgIG1wbl9tdWxfYmFzZWNhc2UgKHRwICsgbiwgeHAgKyBuMiwgbjEsIHhwLCBuMSk7CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobjEsIE1VTExPX0RDX1RIUkVTSE9MRCkpCisgICAgbXBuX211bGxvX2Jhc2VjYXNlICh0cCArIG4sIHhwICsgbjIsIHhwLCBuMSk7CisgIGVsc2UKKyAgICBtcG5fbXVsbG9fbiAodHAgKyBuLCB4cCArIG4yLCB4cCwgbjEpOworICAvKiBtcG5fZGNfbXVsbG9fbiAodHAgKyBuLCB4cCArIG4yLCB4cCwgbjEsIHRwICsgbik7ICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorICBtcG5fYWRkbHNoMV9uIChycCArIG4yLCB0cCArIG4yLCB0cCArIG4sIG4xKTsKKyNlbHNlCisgIG1wbl9sc2hpZnQgKHJwICsgbjIsIHRwICsgbiwgbjEsIDEpOworICBtcG5fYWRkX24gKHJwICsgbjIsIHJwICsgbjIsIHRwICsgbjIsIG4xKTsKKyNlbmRpZgorfQorCisvKiBBdm9pZCB6ZXJvIGFsbG9jYXRpb25zIHdoZW4gTVVMTE9fQkFTRUNBU0VfVEhSRVNIT0xEIGlzIDAuICAqLworI2RlZmluZSBTUVJfQkFTRUNBU0VfQUxMT0MgXAorIChTUVJMT19CQVNFQ0FTRV9USFJFU0hPTERfTElNSVQgPT0gMCA/IDEgOiAyKlNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRF9MSU1JVCkKKworLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBhIHRlbXBvcmFyeSBhcmVhOyBkY19zcXJsbworICAgYWNjZXB0cyBhIHBvaW50ZXIgdHAsIGFuZCBoYW5kbGUgdGhlIGNhc2UgdHAgPT0gcnAsIGRvIHRoZSBzYW1lIGhlcmUuCisqLworCit2b2lkCittcG5fc3FybG8gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgbikKK3sKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocnAsIG4sIHhwLCBuKSk7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSTE9fQkFTRUNBU0VfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogc21hcnRlciBjcml0ZXJpYT8gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsbG9fYmFzZWNhc2UgfHwgISBIQVZFX05BVElWRV9tcG5fc3FyX2Jhc2VjYXNlCisgICAgICAvKiBtdWxsbyBjb21wdXRlcyBhcyBtYW55IHByb2R1Y3RzIGFzIHNxciwgYnV0IGRpcmVjdGx5IHdyaXRlcworCSBvbiB0aGUgcmVzdWx0IGFyZWEuICovCisgICAgICBtcG5fbXVsbG9fYmFzZWNhc2UgKHJwLCB4cCwgeHAsIG4pOworI2Vsc2UKKyAgICAgIC8qIEFsbG9jYXRlIHdvcmtzcGFjZSBvZiBmaXhlZCBzaXplIG9uIHN0YWNrOiBmYXN0ISAqLworICAgICAgbXBfbGltYl90IHRwW1NRUl9CQVNFQ0FTRV9BTExPQ107CisgICAgICBtcG5fc3FyX2Jhc2VjYXNlICh0cCwgeHAsIG4pOworICAgICAgTVBOX0NPUFkgKHJwLCB0cCwgbik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSTE9fRENfVEhSRVNIT0xEKSkKKyAgICB7CisgICAgICBtcG5fc3FybG9fYmFzZWNhc2UgKHJwLCB4cCwgbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfcHRyIHRwOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fc3FybG9faXRjaCAobikpOworICAgICAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSTE9fU1FSX1RIUkVTSE9MRCkpCisJeworCSAgbXBuX2RjX3NxcmxvIChycCwgeHAsIG4sIHRwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRm9yIHJlYWxseSBsYXJnZSBvcGVyYW5kcywgdXNlIHBsYWluIG1wbl9tdWxfbiBidXQgdGhyb3cgYXdheSB1cHBlciBuCisJICAgICBsaW1icyBvZiByZXN1bHQuICAqLworI2lmICFUVU5FX1BST0dSQU1fQlVJTEQgJiYgKFNRUkxPX1NRUl9USFJFU0hPTEQgPiBTUVJfRkZUX1RIUkVTSE9MRCkKKwkgIG1wbl9mZnRfbXVsICh0cCwgeHAsIG4sIHhwLCBuKTsKKyNlbHNlCisJICBtcG5fc3FyICh0cCwgeHAsIG4pOworI2VuZGlmCisJICBNUE5fQ09QWSAocnAsIHRwLCBuKTsKKwl9CisgICAgICBUTVBfRlJFRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zcXJsb19iYXNlY2FzZS5jIGIvbXBuL2dlbmVyaWMvc3FybG9fYmFzZWNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ4NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc3FybG9fYmFzZWNhc2UuYwpAQCAtMCwwICsxLDE5NCBAQAorLyogbXBuX3NxcmxvX2Jhc2VjYXNlIC0tIEludGVybmFsIHJvdXRpbmUgdG8gc3F1YXJlIGEgbmF0dXJhbCBudW1iZXIKKyAgIG9mIGxlbmd0aCBuLgorCisgICBUSElTIElTIEFOIElOVEVSTkFMIEZVTkNUSU9OIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhJUyBGVU5DVElPTiBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4KKworCitDb3B5cmlnaHQgMTk5MS0xOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDUsIDIwMDgsIDIwMTAsIDIwMTEsIDIwMTUsCisyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjaWZuZGVmIFNRUkxPX1NIT1JUQ1VUX01VTFRJUExJQ0FUSU9OUworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRtdWxfMQorI2RlZmluZSBTUVJMT19TSE9SVENVVF9NVUxUSVBMSUNBVElPTlMgMAorI2Vsc2UKKyNkZWZpbmUgU1FSTE9fU0hPUlRDVVRfTVVMVElQTElDQVRJT05TIDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3FyX2RpYWdvbmFsCisjZGVmaW5lIE1QTl9TUVJfRElBR09OQUwocnAsIHVwLCBuKQkJCQkJXAorICBtcG5fc3FyX2RpYWdvbmFsIChycCwgdXAsIG4pCisjZWxzZQorI2RlZmluZSBNUE5fU1FSX0RJQUdPTkFMKHJwLCB1cCwgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgX2k7CQkJCQkJCVwKKyAgICBmb3IgKF9pID0gMDsgX2kgPCAobik7IF9pKyspCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCW1wX2xpbWJfdCB1bCwgbHBsOwkJCQkJCVwKKwl1bCA9ICh1cClbX2ldOwkJCQkJCQlcCisJdW11bF9wcG1tICgocnApWzIgKiBfaSArIDFdLCBscGwsIHVsLCB1bCA8PCBHTVBfTkFJTF9CSVRTKTsJXAorCShycClbMiAqIF9pXSA9IGxwbCA+PiBHTVBfTkFJTF9CSVRTOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgTVBOX1NRUkxPX0RJQUdPTkFMKHJwLCB1cCwgbikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgbmhhbGY7CQkJCQkJCVwKKyAgICBuaGFsZiA9IChuKSA+PiAxOwkJCQkJCQlcCisgICAgTVBOX1NRUl9ESUFHT05BTCAoKHJwKSwgKHVwKSwgbmhhbGYpOwkJCQlcCisgICAgaWYgKCgobikgJiAxKSAhPSAwKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCW1wX2xpbWJfdCBvcDsJCQkJCQkJXAorCW9wID0gKHVwKVtuaGFsZl07CQkJCQkJXAorCShycClbKG4pIC0gMV0gPSAob3AgKiBvcCkgJiBHTVBfTlVNQl9NQVNLOwkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorI2RlZmluZSBNUE5fU1FSTE9fRElBR19BRERMU0gxKHJwLCB0cCwgdXAsIG4pCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBNUE5fU1FSTE9fRElBR09OQUwoKHJwKSwgKHVwKSwgKG4pKTsJCQkJXAorICAgIG1wbl9hZGRsc2gxX25faXAxICgocnApICsgMSwgKHRwKSwgKG4pIC0gMSk7CQkJXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgTVBOX1NRUkxPX0RJQUdfQURETFNIMShycCwgdHAsIHVwLCBuKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgTVBOX1NRUkxPX0RJQUdPTkFMKChycCksICh1cCksIChuKSk7CQkJCVwKKyAgICBtcG5fbHNoaWZ0ICgodHApLCAodHApLCAobikgLSAxLCAxKTsJCQkJXAorICAgIG1wbl9hZGRfbiAoKHJwKSArIDEsIChycCkgKyAxLCAodHApLCAobikgLSAxKTsJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogQXZvaWQgemVybyBhbGxvY2F0aW9ucyB3aGVuIFNRUkxPX0xPX1RIUkVTSE9MRCBpcyAwICh0aGlzIGNvZGUgbm90IHVzZWQpLiAqLworI2RlZmluZSBTUVJMT19CQVNFQ0FTRV9BTExPQwkJCQkJCVwKKyAgKFNRUkxPX0RDX1RIUkVTSE9MRF9MSU1JVCA8IDIgPyAxIDogU1FSTE9fRENfVEhSRVNIT0xEX0xJTUlUIC0gMSkKKworLyogRGVmYXVsdCBtcG5fc3FybG9fYmFzZWNhc2UgdXNpbmcgbXBuX2FkZG11bF8xLiAgKi8KKyNpZm5kZWYgU1FSTE9fU1BFQ0lBTF9DQVNFUworI2RlZmluZSBTUVJMT19TUEVDSUFMX0NBU0VTIDIKKyNlbmRpZgorCisjaWYgVFVORV9QUk9HUkFNX0JVSUxEIHx8IFdBTlRfRkFUX0JJTkFSWQorI2RlZmluZSBNQVlCRV9zcGVjaWFsX2Nhc2VzIDEKKyNlbHNlCisjZGVmaW5lIE1BWUJFX3NwZWNpYWxfY2FzZXMgXAorICAoKFNRUkxPX0JBU0VDQVNFX1RIUkVTSE9MRCA8PSBTUVJMT19TUEVDSUFMX0NBU0VTKSAmJiAoU1FSTE9fRENfVEhSRVNIT0xEICE9IDApKQorI2VuZGlmCisKK3ZvaWQKK21wbl9zcXJsb19iYXNlY2FzZSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgdWw7CisKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocnAsIG4sIHVwLCBuKSk7CisKKyAgdWwgPSB1cFswXTsKKworICBpZiAoTUFZQkVfc3BlY2lhbF9jYXNlcyAmJiBuIDw9IFNRUkxPX1NQRUNJQUxfQ0FTRVMpCisgICAgeworI2lmIFNRUkxPX1NQRUNJQUxfQ0FTRVMgPT0gMQorICAgICAgcnBbMF0gPSAodWwgKiB1bCkgJiBHTVBfTlVNQl9NQVNLOworI2Vsc2UKKyAgICAgIGlmIChuID09IDEpCisJcnBbMF0gPSAodWwgKiB1bCkgJiBHTVBfTlVNQl9NQVNLOworICAgICAgZWxzZQorCXsKKwkgIG1wX2xpbWJfdCBoaSwgbG8sIHVsMTsKKwkgIHVtdWxfcHBtbSAoaGksIGxvLCB1bCwgdWwgPDwgR01QX05BSUxfQklUUyk7CisJICBycFswXSA9IGxvID4+IEdNUF9OQUlMX0JJVFM7CisJICB1bDEgPSB1cFsxXTsKKyNpZiBTUVJMT19TUEVDSUFMX0NBU0VTID09IDIKKwkgIHJwWzFdID0gKGhpICsgdWwgKiB1bDEgKiAyKSAmIEdNUF9OVU1CX01BU0s7CisjZWxzZQorCSAgaWYgKG4gPT0gMikKKwkgICAgcnBbMV0gPSAoaGkgKyB1bCAqIHVsMSAqIDIpICYgR01QX05VTUJfTUFTSzsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdCBoaTE7CisjaWYgR01QX05BSUxfQklUUyAhPSAwCisJICAgICAgdWwgPDw9IDE7CisjZW5kaWYKKwkgICAgICB1bXVsX3BwbW0gKGhpMSwgbG8sIHVsMSA8PCBHTVBfTkFJTF9CSVRTLCB1bCk7CisJICAgICAgaGkxICs9IHVsICogdXBbMl07CisjaWYgR01QX05BSUxfQklUUyA9PSAwCisJICAgICAgaGkxID0gKGhpMSA8PCAxKSB8IChsbyA+PiAoR01QX0xJTUJfQklUUyAtIDEpKTsKKwkgICAgICBhZGRfc3NhYWFhKHJwWzJdLCBycFsxXSwgaGkxLCBsbyA8PCAxLCB1bDEgKiB1bDEsIGhpKTsKKyNlbHNlCisJICAgICAgaGkgKz0gbG8gPj4gR01QX05BSUxfQklUUzsKKwkgICAgICBycFsxXSA9IGhpICYgR01QX05VTUJfTUFTSzsKKwkgICAgICBycFsyXSA9IChoaTEgKyB1bDEgKiB1bDEgKyAoaGkgPj4gR01QX05VTUJfQklUUykpICYgR01QX05VTUJfTUFTSzsKKyNlbmRpZgorCSAgICB9CisjZW5kaWYKKwl9CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgdHBbU1FSTE9fQkFTRUNBU0VfQUxMT0NdOworICAgICAgbXBfc2l6ZV90IGk7CisKKyAgICAgIC8qIG11c3QgZml0IG4tMSBsaW1icyBpbiB0cCAqLworICAgICAgQVNTRVJUIChuIDw9IFNRUkxPX0RDX1RIUkVTSE9MRF9MSU1JVCk7CisKKyAgICAgIC0tbjsKKyNpZiBTUVJMT19TSE9SVENVVF9NVUxUSVBMSUNBVElPTlMKKyAgICAgIHsKKwltcF9saW1iX3QgY3k7CisKKwljeSA9IHVsICogdXBbbl0gKyBtcG5fbXVsXzEgKHRwLCB1cCArIDEsIG4gLSAxLCB1bCk7CisJZm9yIChpID0gMTsgMiAqIGkgKyAxIDwgbjsgKytpKQorCSAgeworCSAgICB1bCA9IHVwW2ldOworCSAgICBjeSArPSB1bCAqIHVwW24gLSBpXSArIG1wbl9hZGRtdWxfMSAodHAgKyAyICogaSwgdXAgKyBpICsgMSwgbiAtIDIgKiBpIC0gMSwgdWwpOworCSAgfQorCXRwIFtuLTFdID0gKGN5ICsgKChuICYgMSk/dXBbaV0gKiB1cFtpICsgMV06MCkpICYgR01QX05VTUJfTUFTSzsKKyAgICAgIH0KKyNlbHNlCisgICAgICBtcG5fbXVsXzEgKHRwLCB1cCArIDEsIG4sIHVsKTsKKyAgICAgIGZvciAoaSA9IDE7IDIgKiBpIDwgbjsgKytpKQorCW1wbl9hZGRtdWxfMSAodHAgKyAyICogaSwgdXAgKyBpICsgMSwgbiAtIDIgKiBpLCB1cFtpXSk7CisjZW5kaWYKKworICAgICAgTVBOX1NRUkxPX0RJQUdfQURETFNIMSAocnAsIHRwLCB1cCwgbiArIDEpOworICAgIH0KK30KKyN1bmRlZiBTUVJMT19TUEVDSUFMX0NBU0VTCisjdW5kZWYgTUFZQkVfc3BlY2lhbF9jYXNlcworI3VuZGVmIFNRUkxPX0JBU0VDQVNFX0FMTE9DCisjdW5kZWYgU1FSTE9fU0hPUlRDVVRfTVVMVElQTElDQVRJT05TCisjdW5kZWYgTVBOX1NRUl9ESUFHT05BTAorI3VuZGVmIE1QTl9TUVJMT19ESUFHT05BTAorI3VuZGVmIE1QTl9TUVJMT19ESUFHX0FERExTSDEKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Nxcm1vZF9ibm0xLmMgYi9tcG4vZ2VuZXJpYy9zcXJtb2RfYm5tMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2JlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zcXJtb2RfYm5tMS5jCkBAIC0wLDAgKzEsMzI4IEBACisvKiBzcXJtb2RfYm5tMS5jIC0tIHNxdWFyaW5nIG1vZCBCXm4tMS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIsIFRvcmJqb3JuIEdyYW5sdW5kIGFuZAorICAgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIElOVEVSTkFMIFdJVEggTVVUQUJMRSBJTlRFUkZBQ0VTLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBUSEVNIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyLCAyMDIwLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIElucHV0IGlzIHthcCxybn07IG91dHB1dCBpcyB7cnAscm59LCBjb21wdXRhdGlvbiBpcworICAgbW9kIEJecm4gLSAxLCBhbmQgdmFsdWVzIGFyZSBzZW1pLW5vcm1hbGlzZWQ7IHplcm8gaXMgcmVwcmVzZW50ZWQKKyAgIGFzIGVpdGhlciAwIG9yIEJebiAtIDEuICBOZWVkcyBhIHNjcmF0Y2ggb2YgMnJuIGxpbWJzIGF0IHRwLgorICAgdHA9PXJwIGlzIGFsbG93ZWQuICovCitzdGF0aWMgdm9pZAorbXBuX2JjX3Nxcm1vZF9ibm0xIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IHJuLCBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKDAgPCBybik7CisKKyAgbXBuX3NxciAodHAsIGFwLCBybik7CisgIGN5ID0gbXBuX2FkZF9uIChycCwgdHAsIHRwICsgcm4sIHJuKTsKKyAgLyogSWYgY3kgPT0gMSwgdGhlbiB0aGUgdmFsdWUgb2YgcnAgaXMgYXQgbW9zdCBCXnJuIC0gMiwgc28gdGhlcmUgY2FuCisgICAqIGJlIG5vIG92ZXJmbG93IHdoZW4gYWRkaW5nIGluIHRoZSBjYXJyeS4gKi8KKyAgTVBOX0lOQ1JfVSAocnAsIHJuLCBjeSk7Cit9CisKKworLyogSW5wdXQgaXMge2FwLHJuKzF9OyBvdXRwdXQgaXMge3JwLHJuKzF9LCBpbgorICAgbm9ybWFsaXNlZCByZXByZXNlbnRhdGlvbiwgY29tcHV0YXRpb24gaXMgbW9kIEJecm4gKyAxLiBOZWVkcworICAgYSBzY3JhdGNoIGFyZWEgb2YgMnJuIGxpbWJzIGF0IHRwOyB0cCA9PSBycCBpcyBhbGxvd2VkLgorICAgT3V0cHV0IGlzIG5vcm1hbGlzZWQuICovCitzdGF0aWMgdm9pZAorbXBuX2JjX3Nxcm1vZF9ibnAxIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IHJuLCBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBjeTsKKyAgdW5zaWduZWQgazsKKworICBBU1NFUlQgKDAgPCBybik7CisKKyAgaWYgKFVOTElLRUxZIChhcFtybl0pKQorICAgIHsKKyAgICAgICpycCA9IDE7CisgICAgICBNUE5fRklMTCAocnAgKyAxLCBybiwgMCk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmIChNUE5fU1FSTU9EX0JLTlAxX1VTQUJMRSAocm4sIGssIE1VTF9GRlRfTU9ERl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBuX2sgPSBybiAvIGs7CisgICAgICBUTVBfREVDTDsKKworICAgICAgVE1QX01BUks7CisgICAgICBtcG5fc3FybW9kX2JrbnAxIChycCwgYXAsIG5faywgaywKKwkJCVRNUF9BTExPQ19MSU1CUyAobXBuX3Nxcm1vZF9ia25wMV9pdGNoIChybikpKTsKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuOworICAgIH0KKyAgbXBuX3NxciAodHAsIGFwLCBybik7CisgIGN5ID0gbXBuX3N1Yl9uIChycCwgdHAsIHRwICsgcm4sIHJuKTsKKyAgcnBbcm5dID0gMDsKKyAgTVBOX0lOQ1JfVSAocnAsIHJuICsgMSwgY3kpOworfQorCisKKy8qIENvbXB1dGVzIHtycCxNSU4ocm4sMmFuKX0gPC0ge2FwLGFufV4yIE1vZChCXnJuLTEpCisgKgorICogVGhlIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBaRVJPIGlmIGFuZCBvbmx5IGlmIHRoZSBvcGVyYW5kCisgKiBhbHJlYWR5IGlzLiBPdGhlcndpc2UgdGhlIGNsYXNzIFswXSBNb2QoQl5ybi0xKSBpcyByZXByZXNlbnRlZCBieQorICogQl5ybi0xLgorICogSXQgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gaWYgc3FybW9kX2JubTEgaXMgdXNlZCB0bworICogY29tcHV0ZSB0aGUgZnVsbCBzcXVhcmUgd2l0aCBhbiA8PSAyKnJuLCBiZWNhdXNlIHRoaXMgY29uZGl0aW9uCisgKiBpbXBsaWVzIChCXmFuLTEpXjIgPCAoQl5ybi0xKSAuCisgKgorICogUmVxdWlyZXMgcm4vNCA8IGFuIDw9IHJuCisgKiBTY3JhdGNoIG5lZWQ6IHJuLzIgKyAobmVlZCBmb3IgcmVjdXJzaXZlIGNhbGwgT1Igcm4gKyAzKS4gVGhpcyBnaXZlcworICoKKyAqIFMobikgPD0gcm4vMiArIE1BWCAocm4gKyA0LCBTKG4vMikpIDw9IDMvMiBybiArIDQKKyAqLwordm9pZAorbXBuX3Nxcm1vZF9ibm0xIChtcF9wdHIgcnAsIG1wX3NpemVfdCBybiwgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sIG1wX3B0ciB0cCkKK3sKKyAgQVNTRVJUICgwIDwgYW4pOworICBBU1NFUlQgKGFuIDw9IHJuKTsKKworICBpZiAoKHJuICYgMSkgIT0gMCB8fCBCRUxPV19USFJFU0hPTEQgKHJuLCBTUVJNT0RfQk5NMV9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAoYW4gPCBybikpCisJeworCSAgaWYgKFVOTElLRUxZICgyKmFuIDw9IHJuKSkKKwkgICAgeworCSAgICAgIG1wbl9zcXIgKHJwLCBhcCwgYW4pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcF9saW1iX3QgY3k7CisJICAgICAgbXBuX3NxciAodHAsIGFwLCBhbik7CisJICAgICAgY3kgPSBtcG5fYWRkIChycCwgdHAsIHJuLCB0cCArIHJuLCAyKmFuIC0gcm4pOworCSAgICAgIE1QTl9JTkNSX1UgKHJwLCBybiwgY3kpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCW1wbl9iY19zcXJtb2RfYm5tMSAocnAsIGFwLCBybiwgdHApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBuOworICAgICAgbXBfbGltYl90IGN5OworICAgICAgbXBfbGltYl90IGhpOworCisgICAgICBuID0gcm4gPj4gMTsKKworICAgICAgQVNTRVJUICgyKmFuID4gbik7CisKKyAgICAgIC8qIENvbXB1dGUgeG0gPSBhXjIgbW9kIChCXm4gLSAxKSwgeHAgPSBhXjIgbW9kIChCXm4gKyAxKQorCSBhbmQgY3J0IHRvZ2V0aGVyIGFzCisKKwkgeCA9IC14cCAqIEJebiArIChCXm4gKyAxKSAqIFsgKHhwICsgeG0pLzIgbW9kIChCXm4tMSldCisgICAgICAqLworCisjZGVmaW5lIGEwIGFwCisjZGVmaW5lIGExIChhcCArIG4pCisKKyNkZWZpbmUgeHAgIHRwCS8qIDJuICsgMiAqLworICAgICAgLyogYW0xICBtYXliZSBpbiB7eHAsIG59ICovCisjZGVmaW5lIHNwMSAodHAgKyAyKm4gKyAyKQorICAgICAgLyogYXAxICBtYXliZSBpbiB7c3AxLCBuICsgMX0gKi8KKworICAgICAgeworCW1wX3NyY3B0ciBhbTE7CisJbXBfc2l6ZV90IGFubTsKKwltcF9wdHIgc287CisKKwlpZiAoTElLRUxZIChhbiA+IG4pKQorCSAgeworCSAgICBzbyA9IHhwICsgbjsKKwkgICAgYW0xID0geHA7CisJICAgIGN5ID0gbXBuX2FkZCAoeHAsIGEwLCBuLCBhMSwgYW4gLSBuKTsKKwkgICAgTVBOX0lOQ1JfVSAoeHAsIG4sIGN5KTsKKwkgICAgYW5tID0gbjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHNvID0geHA7CisJICAgIGFtMSA9IGEwOworCSAgICBhbm0gPSBhbjsKKwkgIH0KKworCW1wbl9zcXJtb2RfYm5tMSAocnAsIG4sIGFtMSwgYW5tLCBzbyk7CisgICAgICB9CisKKyAgICAgIHsKKwlpbnQgICAgICAgazsKKwltcF9zcmNwdHIgYXAxOworCW1wX3NpemVfdCBhbnA7CisKKwlpZiAoTElLRUxZIChhbiA+IG4pKSB7CisJICBhcDEgPSBzcDE7CisJICBjeSA9IG1wbl9zdWIgKHNwMSwgYTAsIG4sIGExLCBhbiAtIG4pOworCSAgc3AxW25dID0gMDsKKwkgIE1QTl9JTkNSX1UgKHNwMSwgbiArIDEsIGN5KTsKKwkgIGFucCA9IG4gKyBhcDFbbl07CisJfSBlbHNlIHsKKwkgIGFwMSA9IGEwOworCSAgYW5wID0gYW47CisJfQorCisJaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisJICBrPTA7CisJZWxzZQorCSAgeworCSAgICBpbnQgbWFzazsKKwkgICAgayA9IG1wbl9mZnRfYmVzdF9rIChuLCAxKTsKKwkgICAgbWFzayA9ICgxPDxrKSAtMTsKKwkgICAgd2hpbGUgKG4gJiBtYXNrKSB7ay0tOyBtYXNrID4+PTE7fTsKKwkgIH0KKwlpZiAoayA+PSBGRlRfRklSU1RfSykKKwkgIHhwW25dID0gbXBuX211bF9mZnQgKHhwLCBuLCBhcDEsIGFucCwgYXAxLCBhbnAsIGspOworCWVsc2UgaWYgKFVOTElLRUxZIChhcDEgPT0gYTApKQorCSAgeworCSAgICBBU1NFUlQgKGFucCA8PSBuKTsKKwkgICAgQVNTRVJUICgyKmFucCA+IG4pOworCSAgICBtcG5fc3FyICh4cCwgYTAsIGFuKTsKKwkgICAgYW5wID0gMiphbiAtIG47CisJICAgIGN5ID0gbXBuX3N1YiAoeHAsIHhwLCBuLCB4cCArIG4sIGFucCk7CisJICAgIHhwW25dID0gMDsKKwkgICAgTVBOX0lOQ1JfVSAoeHAsIG4rMSwgY3kpOworCSAgfQorCWVsc2UKKwkgIG1wbl9iY19zcXJtb2RfYm5wMSAoeHAsIGFwMSwgbiwgeHApOworICAgICAgfQorCisgICAgICAvKiBIZXJlIHRoZSBDUlQgcmVjb21wb3NpdGlvbiBiZWdpbnMuCisKKwkgeG0gPC0gKHhwICsgeG0pLzIgPSAoeHAgKyB4bSlCXm4vMiBtb2QgKEJebi0xKQorCSBEaXZpc2lvbiBieSAyIGlzIGEgYml0d2lzZSByb3RhdGlvbi4KKworCSBBc3N1bWVzIHhwIG5vcm1hbGlzZWQgbW9kIChCXm4rMSkuCisKKwkgVGhlIHJlc2lkdWUgY2xhc3MgWzBdIGlzIHJlcHJlc2VudGVkIGJ5IFtCXm4tMV07IGV4Y2VwdCB3aGVuCisJIGJvdGggaW5wdXQgYXJlIFpFUk8uCisgICAgICAqLworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbiB8fCBIQVZFX05BVElWRV9tcG5fcnNoMWFkZF9uYworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX25jCisgICAgICBjeSA9IG1wbl9yc2gxYWRkX25jKHJwLCBycCwgeHAsIG4sIHhwW25dKTsgLyogQl5uID0gMSAqLworICAgICAgaGkgPSBjeSA8PCAoR01QX05VTUJfQklUUyAtIDEpOworICAgICAgY3kgPSAwOworICAgICAgLyogbmV4dCB1cGRhdGUgb2YgcnBbbi0xXSB3aWxsIHNldCBjeSA9IDEgb25seSBpZiBycFtuLTFdKz1oaQorCSBvdmVyZmxvd3MsIGkuZS4gYSBmdXJ0aGVyIGluY3JlbWVudCB3aWxsIG5vdCBvdmVyZmxvdyBhZ2Fpbi4gKi8KKyNlbHNlIC8qICEgX25jICovCisgICAgICBjeSA9IHhwW25dICsgbXBuX3JzaDFhZGRfbihycCwgcnAsIHhwLCBuKTsgLyogQl5uID0gMSAqLworICAgICAgaGkgPSAoY3k8PChHTVBfTlVNQl9CSVRTLTEpKSZHTVBfTlVNQl9NQVNLOyAvKiAoY3kmMSkgPDwgLi4uICovCisgICAgICBjeSA+Pj0gMTsKKyAgICAgIC8qIGN5ID0gMSBvbmx5IGlmIHhwW25dID0gMSBpLmUuIHt4cCxufSA9IFpFUk8sIHRoaXMgaW1wbGllcyB0aGF0CisJIHRoZSByc2gxYWRkIHdhcyBhIHNpbXBsZSByc2hpZnQ6IHRoZSB0b3AgYml0IGlzIDAuIGN5PTEgPT4gaGk9MC4gKi8KKyNlbmRpZgorI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICAgICAgYWRkX3NzYWFhYShjeSwgcnBbbi0xXSwgY3ksIHJwW24tMV0sIENOU1RfTElNQigwKSwgaGkpOworI2Vsc2UKKyAgICAgIGN5ICs9IChoaSAmIHJwW24tMV0pID4+IChHTVBfTlVNQl9CSVRTLTEpOworICAgICAgcnBbbi0xXSBePSBoaTsKKyNlbmRpZgorI2Vsc2UgLyogISBIQVZFX05BVElWRV9tcG5fcnNoMWFkZF9uICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworICAgICAgY3kgPSBtcG5fYWRkX25jKHJwLCBycCwgeHAsIG4sIHhwW25dKTsKKyNlbHNlIC8qICEgX25jICovCisgICAgICBjeSA9IHhwW25dICsgbXBuX2FkZF9uKHJwLCBycCwgeHAsIG4pOyAvKiB4cFtuXSA9PSAxIGltcGxpZXMge3hwLG59ID09IFpFUk8gKi8KKyNlbmRpZgorICAgICAgY3kgKz0gKHJwWzBdJjEpOworICAgICAgbXBuX3JzaGlmdChycCwgcnAsIG4sIDEpOworICAgICAgQVNTRVJUIChjeSA8PSAyKTsKKyAgICAgIGhpID0gKGN5PDwoR01QX05VTUJfQklUUy0xKSkmR01QX05VTUJfTUFTSzsgLyogKGN5JjEpIDw8IC4uLiAqLworICAgICAgY3kgPj49IDE7CisgICAgICAvKiBXZSBjYW4gaGF2ZSBjeSAhPSAwIG9ubHkgaWYgaGkgPSAwLi4uICovCisgICAgICBBU1NFUlQgKChycFtuLTFdICYgR01QX05VTUJfSElHSEJJVCkgPT0gMCk7CisgICAgICBycFtuLTFdIHw9IGhpOworICAgICAgLyogLi4uIHJwW24tMV0gKyBjeSBjYW4gbm90IG92ZXJmbG93LCB0aGUgZm9sbG93aW5nIElOQ1IgaXMgY29ycmVjdC4gKi8KKyNlbmRpZgorICAgICAgQVNTRVJUIChjeSA8PSAxKTsKKyAgICAgIC8qIE5leHQgaW5jcmVtZW50IGNhbiBub3Qgb3ZlcmZsb3csIHJlYWQgdGhlIHByZXZpb3VzIGNvbW1lbnRzIGFib3V0IGN5LiAqLworICAgICAgQVNTRVJUICgoY3kgPT0gMCkgfHwgKChycFtuLTFdICYgR01QX05VTUJfSElHSEJJVCkgPT0gMCkpOworICAgICAgTVBOX0lOQ1JfVShycCwgbiwgY3kpOworCisgICAgICAvKiBDb21wdXRlIHRoZSBoaWdoZXN0IGhhbGY6CisJIChbKHhwICsgeG0pLzIgbW9kIChCXm4tMSldIC0geHAgKSAqIEJebgorICAgICAgICovCisgICAgICBpZiAoVU5MSUtFTFkgKDIqYW4gPCBybikpCisJeworCSAgLyogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgdGhlIG9ubHkgd2F5IHRoZSByZXN1bHQgY2FuIGVxdWFsCisJICAgICB6ZXJvIG1vZCBCXntybn0gLSAxIGlzIGlmIHRoZSBpbnB1dCBpcyB6ZXJvLCBhbmQKKwkgICAgIHRoZW4gdGhlIG91dHB1dCBvZiBib3RoIHRoZSByZWN1cnNpdmUgY2FsbHMgYW5kIHRoaXMgQ1JUCisJICAgICByZWNvbnN0cnVjdGlvbiBpcyB6ZXJvLCBub3QgQl57cm59IC0gMS4gKi8KKwkgIGN5ID0gbXBuX3N1Yl9uIChycCArIG4sIHJwLCB4cCwgMiphbiAtIG4pOworCisJICAvKiBGSVhNRTogVGhpcyBzdWJ0cmFjdGlvbiBvZiB0aGUgaGlnaCBwYXJ0cyBpcyBub3QgcmVhbGx5CisJICAgICBuZWNlc3NhcnksIHdlIGRvIGl0IHRvIGdldCB0aGUgY2Fycnkgb3V0LCBhbmQgZm9yIHNhbml0eQorCSAgICAgY2hlY2tpbmcuICovCisJICBjeSA9IHhwW25dICsgbXBuX3N1Yl9uYyAoeHAgKyAyKmFuIC0gbiwgcnAgKyAyKmFuIC0gbiwKKwkJCQkgICB4cCArIDIqYW4gLSBuLCBybiAtIDIqYW4sIGN5KTsKKwkgIEFTU0VSVCAobXBuX3plcm9fcCAoeHAgKyAyKmFuIC0gbisxLCBybiAtIDEgLSAyKmFuKSk7CisJICBjeSA9IG1wbl9zdWJfMSAocnAsIHJwLCAyKmFuLCBjeSk7CisJICBBU1NFUlQgKGN5ID09ICh4cCArIDIqYW4gLSBuKVswXSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN5ID0geHBbbl0gKyBtcG5fc3ViX24gKHJwICsgbiwgcnAsIHhwLCBuKTsKKwkgIC8qIGN5ID0gMSBvbmx5IGlmIHt4cCxuKzF9IGlzIG5vdCBaRVJPLCBpLmUuIHtycCxufSBpcyBub3QgWkVSTy4KKwkgICAgIERFQ1Igd2lsbCBhZmZlY3QgX2F0IG1vc3RfIHRoZSBsb3dlc3QgbiBsaW1icy4gKi8KKwkgIE1QTl9ERUNSX1UgKHJwLCAyKm4sIGN5KTsKKwl9CisjdW5kZWYgYTAKKyN1bmRlZiBhMQorI3VuZGVmIHhwCisjdW5kZWYgc3AxCisgICAgfQorfQorCittcF9zaXplX3QKK21wbl9zcXJtb2RfYm5tMV9uZXh0X3NpemUgKG1wX3NpemVfdCBuKQoreworICBtcF9zaXplX3Qgbmg7CisKKyAgaWYgKEJFTE9XX1RIUkVTSE9MRCAobiwgICAgIFNRUk1PRF9CTk0xX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIG47CisgIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIDQgKiAoU1FSTU9EX0JOTTFfVEhSRVNIT0xEIC0gMSkgKyAxKSkKKyAgICByZXR1cm4gKG4gKyAoMi0xKSkgJiAoLTIpOworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCA4ICogKFNRUk1PRF9CTk0xX1RIUkVTSE9MRCAtIDEpICsgMSkpCisgICAgcmV0dXJuIChuICsgKDQtMSkpICYgKC00KTsKKworICBuaCA9IChuICsgMSkgPj4gMTsKKworICBpZiAoQkVMT1dfVEhSRVNIT0xEIChuaCwgU1FSX0ZGVF9NT0RGX1RIUkVTSE9MRCkpCisgICAgcmV0dXJuIChuICsgKDgtMSkpICYgKC04KTsKKworICByZXR1cm4gMiAqIG1wbl9mZnRfbmV4dF9zaXplIChuaCwgbXBuX2ZmdF9iZXN0X2sgKG5oLCAxKSk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy9zcXJ0cmVtLmMgYi9tcG4vZ2VuZXJpYy9zcXJ0cmVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2ZGQ5YwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3NxcnRyZW0uYwpAQCAtMCwwICsxLDU1NSBAQAorLyogbXBuX3NxcnRyZW0gLS0gc3F1YXJlIHJvb3QgYW5kIHJlbWFpbmRlcgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgUGF1bCBaaW1tZXJtYW5uIChtb3N0IGNvZGUpLAorICAgVG9yYmpvcm4gR3Jhbmx1bmQgKG1wbl9zcXJ0cmVtMSkgYW5kIE1hcmNvIEJvZHJhdG8gKG1wbl9kY19zcXJ0KS4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgRVhDRVBUIG1wbl9zcXJ0cmVtIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUKKyAgIElOVEVSRkFDRVMuICBJVCBJUyBPTkxZIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4KKyAgIElOIEZBQ1QsIElUIElTIEFMTU9TVCBHVUFSQU5URUVEIFRIQVQgVEhFWSBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQQorICAgRlVUVVJFIEdNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMTk5OS0yMDAyLCAyMDA0LCAyMDA1LCAyMDA4LCAyMDEwLCAyMDEyLCAyMDE1LCAyMDE3IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKiBTZWUgIkthcmF0c3ViYSBTcXVhcmUgUm9vdCIsIHJlZmVyZW5jZSBpbiBnbXAudGV4aS4gICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjZGVmaW5lIFVTRV9ESVZBUFBSX1EgMQorI2RlZmluZSBUUkFDRSh4KQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnZzcXJ0dGFiWzM4NF0gPSAvKiBUaGUgY29tbW9uIDB4MTAwIHdhcyByZW1vdmVkICovCit7CisgIDB4ZmYsMHhmZCwweGZiLDB4ZjksMHhmNywweGY1LDB4ZjMsMHhmMiwgLyogc3FydCgxLzgwKS4uc3FydCgxLzg3KSAqLworICAweGYwLDB4ZWUsMHhlYywweGVhLDB4ZTksMHhlNywweGU1LDB4ZTQsIC8qIHNxcnQoMS84OCkuLnNxcnQoMS84ZikgKi8KKyAgMHhlMiwweGUwLDB4ZGYsMHhkZCwweGRiLDB4ZGEsMHhkOCwweGQ3LCAvKiBzcXJ0KDEvOTApLi5zcXJ0KDEvOTcpICovCisgIDB4ZDUsMHhkNCwweGQyLDB4ZDEsMHhjZiwweGNlLDB4Y2MsMHhjYiwgLyogc3FydCgxLzk4KS4uc3FydCgxLzlmKSAqLworICAweGM5LDB4YzgsMHhjNiwweGM1LDB4YzQsMHhjMiwweGMxLDB4YzAsIC8qIHNxcnQoMS9hMCkuLnNxcnQoMS9hNykgKi8KKyAgMHhiZSwweGJkLDB4YmMsMHhiYSwweGI5LDB4YjgsMHhiNywweGI1LCAvKiBzcXJ0KDEvYTgpLi5zcXJ0KDEvYWYpICovCisgIDB4YjQsMHhiMywweGIyLDB4YjAsMHhhZiwweGFlLDB4YWQsMHhhYywgLyogc3FydCgxL2IwKS4uc3FydCgxL2I3KSAqLworICAweGFhLDB4YTksMHhhOCwweGE3LDB4YTYsMHhhNSwweGE0LDB4YTMsIC8qIHNxcnQoMS9iOCkuLnNxcnQoMS9iZikgKi8KKyAgMHhhMiwweGEwLDB4OWYsMHg5ZSwweDlkLDB4OWMsMHg5YiwweDlhLCAvKiBzcXJ0KDEvYzApLi5zcXJ0KDEvYzcpICovCisgIDB4OTksMHg5OCwweDk3LDB4OTYsMHg5NSwweDk0LDB4OTMsMHg5MiwgLyogc3FydCgxL2M4KS4uc3FydCgxL2NmKSAqLworICAweDkxLDB4OTAsMHg4ZiwweDhlLDB4OGQsMHg4YywweDhjLDB4OGIsIC8qIHNxcnQoMS9kMCkuLnNxcnQoMS9kNykgKi8KKyAgMHg4YSwweDg5LDB4ODgsMHg4NywweDg2LDB4ODUsMHg4NCwweDgzLCAvKiBzcXJ0KDEvZDgpLi5zcXJ0KDEvZGYpICovCisgIDB4ODMsMHg4MiwweDgxLDB4ODAsMHg3ZiwweDdlLDB4N2UsMHg3ZCwgLyogc3FydCgxL2UwKS4uc3FydCgxL2U3KSAqLworICAweDdjLDB4N2IsMHg3YSwweDc5LDB4NzksMHg3OCwweDc3LDB4NzYsIC8qIHNxcnQoMS9lOCkuLnNxcnQoMS9lZikgKi8KKyAgMHg3NiwweDc1LDB4NzQsMHg3MywweDcyLDB4NzIsMHg3MSwweDcwLCAvKiBzcXJ0KDEvZjApLi5zcXJ0KDEvZjcpICovCisgIDB4NmYsMHg2ZiwweDZlLDB4NmQsMHg2ZCwweDZjLDB4NmIsMHg2YSwgLyogc3FydCgxL2Y4KS4uc3FydCgxL2ZmKSAqLworICAweDZhLDB4NjksMHg2OCwweDY4LDB4NjcsMHg2NiwweDY2LDB4NjUsIC8qIHNxcnQoMS8xMDApLi5zcXJ0KDEvMTA3KSAqLworICAweDY0LDB4NjQsMHg2MywweDYyLDB4NjIsMHg2MSwweDYwLDB4NjAsIC8qIHNxcnQoMS8xMDgpLi5zcXJ0KDEvMTBmKSAqLworICAweDVmLDB4NWUsMHg1ZSwweDVkLDB4NWMsMHg1YywweDViLDB4NWEsIC8qIHNxcnQoMS8xMTApLi5zcXJ0KDEvMTE3KSAqLworICAweDVhLDB4NTksMHg1OSwweDU4LDB4NTcsMHg1NywweDU2LDB4NTYsIC8qIHNxcnQoMS8xMTgpLi5zcXJ0KDEvMTFmKSAqLworICAweDU1LDB4NTQsMHg1NCwweDUzLDB4NTMsMHg1MiwweDUyLDB4NTEsIC8qIHNxcnQoMS8xMjApLi5zcXJ0KDEvMTI3KSAqLworICAweDUwLDB4NTAsMHg0ZiwweDRmLDB4NGUsMHg0ZSwweDRkLDB4NGQsIC8qIHNxcnQoMS8xMjgpLi5zcXJ0KDEvMTJmKSAqLworICAweDRjLDB4NGIsMHg0YiwweDRhLDB4NGEsMHg0OSwweDQ5LDB4NDgsIC8qIHNxcnQoMS8xMzApLi5zcXJ0KDEvMTM3KSAqLworICAweDQ4LDB4NDcsMHg0NywweDQ2LDB4NDYsMHg0NSwweDQ1LDB4NDQsIC8qIHNxcnQoMS8xMzgpLi5zcXJ0KDEvMTNmKSAqLworICAweDQ0LDB4NDMsMHg0MywweDQyLDB4NDIsMHg0MSwweDQxLDB4NDAsIC8qIHNxcnQoMS8xNDApLi5zcXJ0KDEvMTQ3KSAqLworICAweDQwLDB4M2YsMHgzZiwweDNlLDB4M2UsMHgzZCwweDNkLDB4M2MsIC8qIHNxcnQoMS8xNDgpLi5zcXJ0KDEvMTRmKSAqLworICAweDNjLDB4M2IsMHgzYiwweDNhLDB4M2EsMHgzOSwweDM5LDB4MzksIC8qIHNxcnQoMS8xNTApLi5zcXJ0KDEvMTU3KSAqLworICAweDM4LDB4MzgsMHgzNywweDM3LDB4MzYsMHgzNiwweDM1LDB4MzUsIC8qIHNxcnQoMS8xNTgpLi5zcXJ0KDEvMTVmKSAqLworICAweDM1LDB4MzQsMHgzNCwweDMzLDB4MzMsMHgzMiwweDMyLDB4MzIsIC8qIHNxcnQoMS8xNjApLi5zcXJ0KDEvMTY3KSAqLworICAweDMxLDB4MzEsMHgzMCwweDMwLDB4MmYsMHgyZiwweDJmLDB4MmUsIC8qIHNxcnQoMS8xNjgpLi5zcXJ0KDEvMTZmKSAqLworICAweDJlLDB4MmQsMHgyZCwweDJkLDB4MmMsMHgyYywweDJiLDB4MmIsIC8qIHNxcnQoMS8xNzApLi5zcXJ0KDEvMTc3KSAqLworICAweDJiLDB4MmEsMHgyYSwweDI5LDB4MjksMHgyOSwweDI4LDB4MjgsIC8qIHNxcnQoMS8xNzgpLi5zcXJ0KDEvMTdmKSAqLworICAweDI3LDB4MjcsMHgyNywweDI2LDB4MjYsMHgyNiwweDI1LDB4MjUsIC8qIHNxcnQoMS8xODApLi5zcXJ0KDEvMTg3KSAqLworICAweDI0LDB4MjQsMHgyNCwweDIzLDB4MjMsMHgyMywweDIyLDB4MjIsIC8qIHNxcnQoMS8xODgpLi5zcXJ0KDEvMThmKSAqLworICAweDIxLDB4MjEsMHgyMSwweDIwLDB4MjAsMHgyMCwweDFmLDB4MWYsIC8qIHNxcnQoMS8xOTApLi5zcXJ0KDEvMTk3KSAqLworICAweDFmLDB4MWUsMHgxZSwweDFlLDB4MWQsMHgxZCwweDFkLDB4MWMsIC8qIHNxcnQoMS8xOTgpLi5zcXJ0KDEvMTlmKSAqLworICAweDFjLDB4MWIsMHgxYiwweDFiLDB4MWEsMHgxYSwweDFhLDB4MTksIC8qIHNxcnQoMS8xYTApLi5zcXJ0KDEvMWE3KSAqLworICAweDE5LDB4MTksMHgxOCwweDE4LDB4MTgsMHgxOCwweDE3LDB4MTcsIC8qIHNxcnQoMS8xYTgpLi5zcXJ0KDEvMWFmKSAqLworICAweDE3LDB4MTYsMHgxNiwweDE2LDB4MTUsMHgxNSwweDE1LDB4MTQsIC8qIHNxcnQoMS8xYjApLi5zcXJ0KDEvMWI3KSAqLworICAweDE0LDB4MTQsMHgxMywweDEzLDB4MTMsMHgxMiwweDEyLDB4MTIsIC8qIHNxcnQoMS8xYjgpLi5zcXJ0KDEvMWJmKSAqLworICAweDEyLDB4MTEsMHgxMSwweDExLDB4MTAsMHgxMCwweDEwLDB4MGYsIC8qIHNxcnQoMS8xYzApLi5zcXJ0KDEvMWM3KSAqLworICAweDBmLDB4MGYsMHgwZiwweDBlLDB4MGUsMHgwZSwweDBkLDB4MGQsIC8qIHNxcnQoMS8xYzgpLi5zcXJ0KDEvMWNmKSAqLworICAweDBkLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYiwweDBiLDB4MGIsIC8qIHNxcnQoMS8xZDApLi5zcXJ0KDEvMWQ3KSAqLworICAweDBhLDB4MGEsMHgwYSwweDBhLDB4MDksMHgwOSwweDA5LDB4MDksIC8qIHNxcnQoMS8xZDgpLi5zcXJ0KDEvMWRmKSAqLworICAweDA4LDB4MDgsMHgwOCwweDA3LDB4MDcsMHgwNywweDA3LDB4MDYsIC8qIHNxcnQoMS8xZTApLi5zcXJ0KDEvMWU3KSAqLworICAweDA2LDB4MDYsMHgwNiwweDA1LDB4MDUsMHgwNSwweDA0LDB4MDQsIC8qIHNxcnQoMS8xZTgpLi5zcXJ0KDEvMWVmKSAqLworICAweDA0LDB4MDQsMHgwMywweDAzLDB4MDMsMHgwMywweDAyLDB4MDIsIC8qIHNxcnQoMS8xZjApLi5zcXJ0KDEvMWY3KSAqLworICAweDAyLDB4MDIsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAwLDB4MDAgIC8qIHNxcnQoMS8xZjgpLi5zcXJ0KDEvMWZmKSAqLworfTsKKworLyogQ29tcHV0ZSBzID0gZmxvb3Ioc3FydChhMCkpLCBhbmQgKnJwID0gYTAgLSBzXjIuICAqLworCisjaWYgR01QX05VTUJfQklUUyA+IDMyCisjZGVmaW5lIE1BR0lDIENOU1RfTElNQigweDEwMDAwMDAwMDAwKQkvKiAweGZmZTdkZWJiZmMgPCBNQUdJQyA8IDB4MjMyYjE4NTBmNDEwICovCisjZWxzZQorI2RlZmluZSBNQUdJQyBDTlNUX0xJTUIoMHgxMDAwMDApCQkvKiAweGZlZTZmIDwgTUFHSUMgPCAweDI5Y2JjOCAqLworI2VuZGlmCisKK3N0YXRpYyBtcF9saW1iX3QKK21wbl9zcXJ0cmVtMSAobXBfcHRyIHJwLCBtcF9saW1iX3QgYTApCit7CisjaWYgR01QX05VTUJfQklUUyA+IDMyCisgIG1wX2xpbWJfdCBhMTsKKyNlbmRpZgorICBtcF9saW1iX3QgeDAsIHQyLCB0LCB4MjsKKyAgdW5zaWduZWQgYWJpdHM7CisKKyAgQVNTRVJUX0FMV0FZUyAoR01QX05BSUxfQklUUyA9PSAwKTsKKyAgQVNTRVJUX0FMV0FZUyAoR01QX0xJTUJfQklUUyA9PSAzMiB8fCBHTVBfTElNQl9CSVRTID09IDY0KTsKKyAgQVNTRVJUIChhMCA+PSBHTVBfTlVNQl9ISUdIQklUIC8gMik7CisKKyAgLyogVXNlIE5ld3RvbiBpdGVyYXRpb25zIGZvciBhcHByb3hpbWF0aW5nIDEvc3FydChhKSBpbnN0ZWFkIG9mIHNxcnQoYSksCisgICAgIHNpbmNlIHdlIGNhbiBkbyB0aGUgZm9ybWVyIHdpdGhvdXQgZGl2aXNpb24uICBBcyBwYXJ0IG9mIHRoZSBsYXN0CisgICAgIGl0ZXJhdGlvbiBjb252ZXJ0IGZyb20gMS9zcXJ0KGEpIHRvIHNxcnQoYSkuICAqLworCisgIGFiaXRzID0gYTAgPj4gKEdNUF9MSU1CX0JJVFMgLSAxIC0gOCk7CS8qIGV4dHJhY3QgYml0cyBmb3IgdGFibGUgbG9va3VwICovCisgIHgwID0gMHgxMDAgfCBpbnZzcXJ0dGFiW2FiaXRzIC0gMHg4MF07CS8qIGluaXRpYWwgMS9zcXJ0KGEpICovCisKKyAgLyogeDAgaXMgbm93IGFuIDggYml0cyBhcHByb3hpbWF0aW9uIG9mIDEvc3FydChhMCkgKi8KKworI2lmIEdNUF9OVU1CX0JJVFMgPiAzMgorICBhMSA9IGEwID4+IChHTVBfTElNQl9CSVRTIC0gMSAtIDMyKTsKKyAgdCA9IChtcF9saW1iX3NpZ25lZF90KSAoQ05TVF9MSU1CKDB4MjAwMDAwMDAwMDAwMCkgLSAweDMwMDAwIC0gYTEgKiB4MCAqIHgwKSA+PiAxNjsKKyAgeDAgPSAoeDAgPDwgMTYpICsgKChtcF9saW1iX3NpZ25lZF90KSAoeDAgKiB0KSA+PiAoMTYrMikpOworCisgIC8qIHgwIGlzIG5vdyBhIDE2IGJpdHMgYXBwcm94aW1hdGlvbiBvZiAxL3NxcnQoYTApICovCisKKyAgdDIgPSB4MCAqIChhMCA+PiAoMzItOCkpOworICB0ID0gdDIgPj4gMjU7CisgIHQgPSAoKG1wX2xpbWJfc2lnbmVkX3QpICgoYTAgPDwgMTQpIC0gdCAqIHQgLSBNQUdJQykgPj4gKDMyLTgpKTsKKyAgeDAgPSB0MiArICgobXBfbGltYl9zaWduZWRfdCkgKHgwICogdCkgPj4gMTUpOworICB4MCA+Pj0gMzI7CisjZWxzZQorICB0MiA9IHgwICogKGEwID4+ICgxNi04KSk7CisgIHQgPSB0MiA+PiAxMzsKKyAgdCA9ICgobXBfbGltYl9zaWduZWRfdCkgKChhMCA8PCA2KSAtIHQgKiB0IC0gTUFHSUMpID4+ICgxNi04KSk7CisgIHgwID0gdDIgKyAoKG1wX2xpbWJfc2lnbmVkX3QpICh4MCAqIHQpID4+IDcpOworICB4MCA+Pj0gMTY7CisjZW5kaWYKKworICAvKiB4MCBpcyBub3cgYSBmdWxsIGxpbWIgYXBwcm94aW1hdGlvbiBvZiBzcXJ0KGEwKSAqLworCisgIHgyID0geDAgKiB4MDsKKyAgaWYgKHgyICsgMip4MCA8PSBhMCAtIDEpCisgICAgeworICAgICAgeDIgKz0gMip4MCArIDE7CisgICAgICB4MCsrOworICAgIH0KKworICAqcnAgPSBhMCAtIHgyOworICByZXR1cm4geDA7Cit9CisKKworI2RlZmluZSBQcmVjIChHTVBfTlVNQl9CSVRTID4+IDEpCisjaWYgISBkZWZpbmVkKFNRUlRSRU0yX0lOUExBQ0UpCisjZGVmaW5lIFNRUlRSRU0yX0lOUExBQ0UgMAorI2VuZGlmCisKKy8qIHNhbWUgYXMgbXBuX3NxcnRyZW0sIGJ1dCBmb3Igc2l6ZT0yIGFuZCB7bnAsIDJ9IG5vcm1hbGl6ZWQKKyAgIHJldHVybiBjYyBzdWNoIHRoYXQge25wLCAyfSA9IHNwWzBdXjIgKyBjYyoyXkdNUF9OVU1CX0JJVFMgKyBycFswXSAqLworI2lmIFNRUlRSRU0yX0lOUExBQ0UKKyNkZWZpbmUgQ0FMTF9TUVJUUkVNMl9JTlBMQUNFKHNwLHJwKSBtcG5fc3FydHJlbTIgKHNwLCBycCkKK3N0YXRpYyBtcF9saW1iX3QKK21wbl9zcXJ0cmVtMiAobXBfcHRyIHNwLCBtcF9wdHIgcnApCit7CisgIG1wX3NyY3B0ciBucCA9IHJwOworI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TUVJUUkVNMl9JTlBMQUNFKHNwLHJwKSBtcG5fc3FydHJlbTIgKHNwLCBycCwgcnApCitzdGF0aWMgbXBfbGltYl90CittcG5fc3FydHJlbTIgKG1wX3B0ciBzcCwgbXBfcHRyIHJwLCBtcF9zcmNwdHIgbnApCit7CisjZW5kaWYKKyAgbXBfbGltYl90IHEsIHUsIG5wMCwgc3AwLCBycDAsIHEyOworICBpbnQgY2M7CisKKyAgQVNTRVJUIChucFsxXSA+PSBHTVBfTlVNQl9ISUdIQklUIC8gMik7CisKKyAgbnAwID0gbnBbMF07CisgIHNwMCA9IG1wbl9zcXJ0cmVtMSAocnAsIG5wWzFdKTsKKyAgcnAwID0gcnBbMF07CisgIC8qIHJwMCA8PSAyKnNwMCA8IDJeKFByZWMgKyAxKSAqLworICBycDAgPSAocnAwIDw8IChQcmVjIC0gMSkpICsgKG5wMCA+PiAoUHJlYyArIDEpKTsKKyAgcSA9IHJwMCAvIHNwMDsKKyAgLyogcSA8PSAyXlByZWMsIGlmIHEgPSAyXlByZWMsIHJlZHVjZSB0aGUgb3ZlcmVzdGltYXRlLiAqLworICBxIC09IHEgPj4gUHJlYzsKKyAgLyogbm93IHdlIGhhdmUgcSA8IDJeUHJlYyAqLworICB1ID0gcnAwIC0gcSAqIHNwMDsKKyAgLyogbm93IHdlIGhhdmUgKHJwWzBdPDxQcmVjICsgbnAwPj5QcmVjKS8yID0gcSAqIHNwMCArIHUgKi8KKyAgc3AwID0gKHNwMCA8PCBQcmVjKSB8IHE7CisgIGNjID0gdSA+PiAoUHJlYyAtIDEpOworICBycDAgPSAoKHUgPDwgKFByZWMgKyAxKSkgJiBHTVBfTlVNQl9NQVNLKSArIChucDAgJiAoKENOU1RfTElNQiAoMSkgPDwgKFByZWMgKyAxKSkgLSAxKSk7CisgIC8qIHN1YnRyYWN0IHEgKiBxIGZyb20gcnAgKi8KKyAgcTIgPSBxICogcTsKKyAgY2MgLT0gcnAwIDwgcTI7CisgIHJwMCAtPSBxMjsKKyAgaWYgKGNjIDwgMCkKKyAgICB7CisgICAgICBycDAgKz0gc3AwOworICAgICAgY2MgKz0gcnAwIDwgc3AwOworICAgICAgLS1zcDA7CisgICAgICBycDAgKz0gc3AwOworICAgICAgY2MgKz0gcnAwIDwgc3AwOworICAgIH0KKworICBycFswXSA9IHJwMDsKKyAgc3BbMF0gPSBzcDA7CisgIHJldHVybiBjYzsKK30KKworLyogd3JpdGVzIGluIHtzcCwgbn0gdGhlIHNxdWFyZSByb290IChyb3VuZGVkIHRvd2FyZHMgemVybykgb2Yge25wLCAybn0sCisgICBhbmQgaW4ge25wLCBufSB0aGUgbG93IG4gbGltYnMgb2YgdGhlIHJlbWFpbmRlciwgcmV0dXJucyB0aGUgaGlnaAorICAgbGltYiBvZiB0aGUgcmVtYWluZGVyICh3aGljaCBpcyAwIG9yIDEpLgorICAgQXNzdW1lcyB7bnAsIDJufSBpcyBub3JtYWxpemVkLCBpLmUuIG5wWzJuLTFdID49IEIvNAorICAgd2hlcmUgQj0yXkdNUF9OVU1CX0JJVFMuCisgICBOZWVkcyBhIHNjcmF0Y2ggb2Ygbi8yKzEgbGltYnMuICovCitzdGF0aWMgbXBfbGltYl90CittcG5fZGNfc3FydHJlbSAobXBfcHRyIHNwLCBtcF9wdHIgbnAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgYXBwcm94LCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfbGltYl90IHE7CQkJLyogY2Fycnkgb3V0IG9mIHtzcCwgbn0gKi8KKyAgaW50IGMsIGI7CQkJLyogY2Fycnkgb3V0IG9mIHJlbWFpbmRlciAqLworICBtcF9zaXplX3QgbCwgaDsKKworICBBU1NFUlQgKG4gPiAxKTsKKyAgQVNTRVJUIChucFsyICogbiAtIDFdID49IEdNUF9OVU1CX0hJR0hCSVQgLyAyKTsKKworICBsID0gbiAvIDI7CisgIGggPSBuIC0gbDsKKyAgaWYgKGggPT0gMSkKKyAgICBxID0gQ0FMTF9TUVJUUkVNMl9JTlBMQUNFIChzcCArIGwsIG5wICsgMiAqIGwpOworICBlbHNlCisgICAgcSA9IG1wbl9kY19zcXJ0cmVtIChzcCArIGwsIG5wICsgMiAqIGwsIGgsIDAsIHNjcmF0Y2gpOworICBpZiAocSAhPSAwKQorICAgIEFTU0VSVF9DQVJSWSAobXBuX3N1Yl9uIChucCArIDIgKiBsLCBucCArIDIgKiBsLCBzcCArIGwsIGgpKTsKKyAgVFJBQ0UocHJpbnRmKCJ0ZGl2X3FyKCwsLCwldSwsJXUpIC0+ICV1XG4iLCAodW5zaWduZWQpIG4sICh1bnNpZ25lZCkgaCwgKHVuc2lnbmVkKSAobiAtIGggKyAxKSkpOworICBtcG5fdGRpdl9xciAoc2NyYXRjaCwgbnAgKyBsLCAwLCBucCArIGwsIG4sIHNwICsgbCwgaCk7CisgIHEgKz0gc2NyYXRjaFtsXTsKKyAgYyA9IHNjcmF0Y2hbMF0gJiAxOworICBtcG5fcnNoaWZ0IChzcCwgc2NyYXRjaCwgbCwgMSk7CisgIHNwW2wgLSAxXSB8PSAocSA8PCAoR01QX05VTUJfQklUUyAtIDEpKSAmIEdNUF9OVU1CX01BU0s7CisgIGlmIChVTkxJS0VMWSAoKHNwWzBdICYgYXBwcm94KSAhPSAwKSkgLyogKHNwWzBdICYgbWFzaykgPiAxICovCisgICAgcmV0dXJuIDE7IC8qIFJlbWFpbmRlciBpcyBub24temVybyAqLworICBxID4+PSAxOworICBpZiAoYyAhPSAwKQorICAgIGMgPSBtcG5fYWRkX24gKG5wICsgbCwgbnAgKyBsLCBzcCArIGwsIGgpOworICBUUkFDRShwcmludGYoInNxcigsLCV1KVxuIiwgKHVuc2lnbmVkKSBsKSk7CisgIG1wbl9zcXIgKG5wICsgbiwgc3AsIGwpOworICBiID0gcSArIG1wbl9zdWJfbiAobnAsIG5wLCBucCArIG4sIDIgKiBsKTsKKyAgYyAtPSAobCA9PSBoKSA/IGIgOiBtcG5fc3ViXzEgKG5wICsgMiAqIGwsIG5wICsgMiAqIGwsIDEsIChtcF9saW1iX3QpIGIpOworCisgIGlmIChjIDwgMCkKKyAgICB7CisgICAgICBxID0gbXBuX2FkZF8xIChzcCArIGwsIHNwICsgbCwgaCwgcSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbl9pcDEgfHwgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorICAgICAgYyArPSBtcG5fYWRkbHNoMV9uX2lwMSAobnAsIHNwLCBuKSArIDIgKiBxOworI2Vsc2UKKyAgICAgIGMgKz0gbXBuX2FkZG11bF8xIChucCwgc3AsIG4sIENOU1RfTElNQigyKSkgKyAyICogcTsKKyNlbmRpZgorICAgICAgYyAtPSBtcG5fc3ViXzEgKG5wLCBucCwgbiwgQ05TVF9MSU1CKDEpKTsKKyAgICAgIHEgLT0gbXBuX3N1Yl8xIChzcCwgc3AsIG4sIENOU1RfTElNQigxKSk7CisgICAgfQorCisgIHJldHVybiBjOworfQorCisjaWYgVVNFX0RJVkFQUFJfUQorc3RhdGljIHZvaWQKK21wbl9kaXZhcHByX3EgKG1wX3B0ciBxcCwgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRuLCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgZ21wX3BpMV90IGludjsKKyAgbXBfbGltYl90IHFoOworICBBU1NFUlQgKGRuID4gMik7CisgIEFTU0VSVCAobm4gPj0gZG4pOworICBBU1NFUlQgKChkcFtkbi0xXSAmIEdNUF9OVU1CX0hJR0hCSVQpICE9IDApOworCisgIE1QTl9DT1BZIChzY3JhdGNoLCBucCwgbm4pOworICBpbnZlcnRfcGkxIChpbnYsIGRwW2RuLTFdLCBkcFtkbi0yXSk7CisgIGlmIChCRUxPV19USFJFU0hPTEQgKGRuLCBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEKSkKKyAgICBxaCA9IG1wbl9zYnBpMV9kaXZhcHByX3EgKHFwLCBzY3JhdGNoLCBubiwgZHAsIGRuLCBpbnYuaW52MzIpOworICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKGRuLCBNVV9ESVZBUFBSX1FfVEhSRVNIT0xEKSkKKyAgICBxaCA9IG1wbl9kY3BpMV9kaXZhcHByX3EgKHFwLCBzY3JhdGNoLCBubiwgZHAsIGRuLCAmaW52KTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBpdGNoID0gbXBuX211X2RpdmFwcHJfcV9pdGNoIChubiwgZG4sIDApOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIC8qIFNhZGx5LCBzY3JhdGNoIGlzIHRvbyBzbWFsbC4gKi8KKyAgICAgIHFoID0gbXBuX211X2RpdmFwcHJfcSAocXAsIG5wLCBubiwgZHAsIGRuLCBUTVBfQUxMT0NfTElNQlMgKGl0Y2gpKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgcXAgW25uIC0gZG5dID0gcWg7Cit9CisjZW5kaWYKKworLyogd3JpdGVzIGluIHtzcCwgbn0gdGhlIHNxdWFyZSByb290IChyb3VuZGVkIHRvd2FyZHMgemVybykgb2Yge25wLCAybi1vZGR9LAorICAgcmV0dXJucyB6ZXJvIGlmIHRoZSBvcGVyYW5kIHdhcyBhIHBlcmZlY3Qgc3F1YXJlLCBvbmUgb3RoZXJ3aXNlLgorICAgQXNzdW1lcyB7bnAsIDJuLW9kZH0qNF5uc2ggaXMgbm9ybWFsaXplZCwgaS5lLiBCID4gbnBbMm4tMS1vZGRdKjRebnNoID49IEIvNAorICAgd2hlcmUgQj0yXkdNUF9OVU1CX0JJVFMuCisgICBUSElOSzogSW4gdGhlIG9kZCBjYXNlLCB0aHJlZSBtb3JlIChkdW1teSkgbGltYnMgYXJlIHRha2VuIGludG8gYWNjb3VudCwKKyAgIHdoZW4gbnNoIGlzIG1heGltYWwsIHR3byBsaW1icyBhcmUgZGlzY2FyZGVkIGZyb20gdGhlIHJlc3VsdCBvZiB0aGUKKyAgIGRpdmlzaW9uLiBUb28gbXVjaD8gSXMgYSBzaW5nbGUgZHVtbXkgbGltYiBlbm91Z2g/ICovCitzdGF0aWMgaW50CittcG5fZGNfc3FydCAobXBfcHRyIHNwLCBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBuc2gsIHVuc2lnbmVkIG9kZCkKK3sKKyAgbXBfbGltYl90IHE7CQkJLyogY2Fycnkgb3V0IG9mIHtzcCwgbn0gKi8KKyAgaW50IGM7CQkJLyogY2Fycnkgb3V0IG9mIHJlbWFpbmRlciAqLworICBtcF9zaXplX3QgbCwgaDsKKyAgbXBfcHRyIHFwLCB0cCwgc2NyYXRjaDsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIEFTU0VSVCAobnBbMiAqIG4gLSAxIC0gb2RkXSAhPSAwKTsKKyAgQVNTRVJUIChuID4gNCk7CisgIEFTU0VSVCAobnNoIDwgR01QX05VTUJfQklUUyAvIDIpOworCisgIGwgPSAobiAtIDEpIC8gMjsKKyAgaCA9IG4gLSBsOworICBBU1NFUlQgKG4gPj0gbCArIDIgJiYgbCArIDIgPj0gaCAmJiBoID4gbCAmJiBsID49IDEgKyBvZGQpOworICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChsICsgMiAqIG4gKyA1IC0gVVNFX0RJVkFQUFJfUSk7IC8qIG4gKyAyLVVTRV9ESVZBUFBSX1EgKi8KKyAgdHAgPSBzY3JhdGNoICsgbiArIDIgLSBVU0VfRElWQVBQUl9ROyAvKiBuICsgaCArIDEsIGJ1dCB0cCBbLTFdIGlzIHdyaXRhYmxlICovCisgIGlmIChuc2ggIT0gMCkKKyAgICB7CisgICAgICAvKiBvIGlzIHVzZWQgdG8gZXhhY3RseSBzZXQgdGhlIGxvd2VzdCBiaXRzIG9mIHRoZSBkaXZpZGVuZCwgaXMgaXQgbmVlZGVkPyAqLworICAgICAgaW50IG8gPSBsID4gKDEgKyBvZGQpOworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9sc2hpZnQgKHRwIC0gbywgbnAgKyBsIC0gMSAtIG8gLSBvZGQsIG4gKyBoICsgMSArIG8sIDIgKiBuc2gpKTsKKyAgICB9CisgIGVsc2UKKyAgICBNUE5fQ09QWSAodHAsIG5wICsgbCAtIDEgLSBvZGQsIG4gKyBoICsgMSk7CisgIHEgPSBtcG5fZGNfc3FydHJlbSAoc3AgKyBsLCB0cCArIGwgKyAxLCBoLCAwLCBzY3JhdGNoKTsKKyAgaWYgKHEgIT0gMCkKKyAgICBBU1NFUlRfQ0FSUlkgKG1wbl9zdWJfbiAodHAgKyBsICsgMSwgdHAgKyBsICsgMSwgc3AgKyBsLCBoKSk7CisgIHFwID0gdHAgKyBuICsgMTsgLyogbCArIDIgKi8KKyAgVFJBQ0UocHJpbnRmKCJkaXYoYXBwcilfcSgsLCV1LCwldSkgLT4gJXUgXG4iLCAodW5zaWduZWQpIG4rMSwgKHVuc2lnbmVkKSBoLCAodW5zaWduZWQpIChuICsgMSAtIGggKyAxKSkpOworI2lmIFVTRV9ESVZBUFBSX1EKKyAgbXBuX2RpdmFwcHJfcSAocXAsIHRwLCBuICsgMSwgc3AgKyBsLCBoLCBzY3JhdGNoKTsKKyNlbHNlCisgIG1wbl9kaXZfcSAocXAsIHRwLCBuICsgMSwgc3AgKyBsLCBoLCBzY3JhdGNoKTsKKyNlbmRpZgorICBxICs9IHFwIFtsICsgMV07CisgIGMgPSAxOworICBpZiAocSA+IDEpCisgICAgeworICAgICAgLyogRklYTUU6IGlmIHMhPTAgd2Ugd2lsbCBzaGlmdCBsYXRlciwgYSBub29wIG9uIHRoaXMgYXJlYS4gKi8KKyAgICAgIE1QTl9GSUxMIChzcCwgbCwgR01QX05VTUJfTUFYKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGSVhNRTogaWYgcyE9MCB3ZSB3aWxsIHNoaWZ0IGFnYWluIGxhdGVyLCBzaGlmdCBqdXN0IG9uY2UuICovCisgICAgICBtcG5fcnNoaWZ0IChzcCwgcXAgKyAxLCBsLCAxKTsKKyAgICAgIHNwW2wgLSAxXSB8PSBxIDw8IChHTVBfTlVNQl9CSVRTIC0gMSk7CisgICAgICBpZiAoKChxcFswXSA+PiAoMiArIFVTRV9ESVZBUFBSX1EpKSB8IC8qIDwgMyArIDQqVVNFX0RJVkFQUFJfUSAqLworCSAgIChxcFsxXSAmIChHTVBfTlVNQl9NQVNLID4+ICgoR01QX05VTUJfQklUUyA+PiBvZGQpLSBuc2ggLSAxKSkpKSA9PSAwKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKwkgIC8qIEFwcHJveGltYXRpb24gaXMgbm90IGdvb2QgZW5vdWdoLCB0aGUgZXh0cmEgbGltYigrIG5zaCBiaXRzKQorCSAgICAgaXMgc21hbGxlciB0aGFuIG5lZWRlZCB0byBhYnNvcmIgdGhlIHBvc3NpYmxlIGVycm9yLiAqLworCSAgLyoge3FwICsgMSwgbCArIDF9IGVxdWFscyAyKntzcCwgbH0gKi8KKwkgIC8qIEZJWE1FOiB1c2UgbXVsbG8gb3Igd3JhcC1hcm91bmQsIG9yIGRpcmVjdGx5IGV2YWx1YXRlCisJICAgICByZW1haW5kZXIgd2l0aCBhIHNpbmdsZSBzcXJtb2RfYm5tMS4gKi8KKwkgIFRSQUNFKHByaW50ZigibXVsKCwsJXUsLCV1KVxuIiwgKHVuc2lnbmVkKSBoLCAodW5zaWduZWQpIChsKzEpKSk7CisJICBBU1NFUlRfTk9DQVJSWSAobXBuX211bCAoc2NyYXRjaCwgc3AgKyBsLCBoLCBxcCArIDEsIGwgKyAxKSk7CisJICAvKiBDb21wdXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIHByZXZpb3VzIG1wbl9kaXYoYXBwcilfcS4gKi8KKwkgIGN5ID0gbXBuX3N1Yl9uICh0cCArIDEsIHRwICsgMSwgc2NyYXRjaCwgaCk7CisjaWYgVVNFX0RJVkFQUFJfUSB8fCBXQU5UX0FTU0VSVAorCSAgTVBOX0RFQ1JfVSAodHAgKyAxICsgaCwgbCwgY3kpOworI2lmIFVTRV9ESVZBUFBSX1EKKwkgIEFTU0VSVCAobXBuX2NtcCAodHAgKyAxICsgaCwgc2NyYXRjaCArIGgsIGwpIDw9IDApOworCSAgaWYgKG1wbl9jbXAgKHRwICsgMSArIGgsIHNjcmF0Y2ggKyBoLCBsKSA8IDApCisJICAgIHsKKwkgICAgICAvKiBNYXkgaGFwcGVuIG9ubHkgaWYgZGl2IHJlc3VsdCB3YXMgbm90IGV4YWN0LiAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxIHx8IEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKwkgICAgICBjeSA9IG1wbl9hZGRsc2gxX25faXAxICh0cCArIDEsIHNwICsgbCwgaCk7CisjZWxzZQorCSAgICAgIGN5ID0gbXBuX2FkZG11bF8xICh0cCArIDEsIHNwICsgbCwgaCwgQ05TVF9MSU1CKDIpKTsKKyNlbmRpZgorCSAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkXzEgKHRwICsgMSArIGgsIHRwICsgMSArIGgsIGwsIGN5KSk7CisJICAgICAgTVBOX0RFQ1JfVSAoc3AsIGwsIDEpOworCSAgICB9CisJICAvKiBDYW4gdGhlIHJvb3QgYmUgZXhhY3Qgd2hlbiBhIGNvcnJlY3Rpb24gd2FzIG5lZWRlZD8gV2UKKwkgICAgIGRpZCBub3QgZmluZCBhbiBleGFtcGxlLCBidXQgaXQgZGVwZW5kcyBvbiBkaXZhcHByCisJICAgICBpbnRlcm5hbHMsIGFuZCB3ZSBjYW4gbm90IGFzc3VtZSBpdCB0cnVlIGluIGdlbmVyYWwuLi4qLworCSAgLyogZWxzZSAqLworI2Vsc2UgLyogV0FOVF9BU1NFUlQgKi8KKwkgIEFTU0VSVCAobXBuX2NtcCAodHAgKyAxICsgaCwgc2NyYXRjaCArIGgsIGwpID09IDApOworI2VuZGlmCisjZW5kaWYKKwkgIGlmIChtcG5femVyb19wICh0cCArIGwgKyAxLCBoIC0gbCkpCisJICAgIHsKKwkgICAgICBUUkFDRShwcmludGYoInNxcigsLCV1KVxuIiwgKHVuc2lnbmVkKSBsKSk7CisJICAgICAgbXBuX3NxciAoc2NyYXRjaCwgc3AsIGwpOworCSAgICAgIGMgPSBtcG5fY21wICh0cCArIDEsIHNjcmF0Y2ggKyBsLCBsKTsKKwkgICAgICBpZiAoYyA9PSAwKQorCQl7CisJCSAgaWYgKG5zaCAhPSAwKQorCQkgICAgeworCQkgICAgICBtcG5fbHNoaWZ0ICh0cCwgbnAsIGwsIDIgKiBuc2gpOworCQkgICAgICBucCA9IHRwOworCQkgICAgfQorCQkgIGMgPSBtcG5fY21wIChucCwgc2NyYXRjaCArIG9kZCwgbCAtIG9kZCk7CisJCX0KKwkgICAgICBpZiAoYyA8IDApCisJCXsKKwkJICBNUE5fREVDUl9VIChzcCwgbCwgMSk7CisJCSAgYyA9IDE7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIFRNUF9GUkVFOworCisgIGlmICgob2RkIHwgbnNoKSAhPSAwKQorICAgIG1wbl9yc2hpZnQgKHNwLCBzcCwgbiwgbnNoICsgKG9kZCA/IEdNUF9OVU1CX0JJVFMgLyAyIDogMCkpOworICByZXR1cm4gYzsKK30KKworCittcF9zaXplX3QKK21wbl9zcXJ0cmVtIChtcF9wdHIgc3AsIG1wX3B0ciBycCwgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4pCit7CisgIG1wX2xpbWJfdCBjYywgaGlnaCwgcmw7CisgIGludCBjOworICBtcF9zaXplX3Qgcm4sIHRuOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKG5uID4gMCk7CisgIEFTU0VSVF9NUE4gKG5wLCBubik7CisKKyAgQVNTRVJUIChucFtubiAtIDFdICE9IDApOworICBBU1NFUlQgKHJwID09IE5VTEwgfHwgTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAobnAsIHJwLCBubikpOworICBBU1NFUlQgKHJwID09IE5VTEwgfHwgISBNUE5fT1ZFUkxBUF9QIChzcCwgKG5uICsgMSkgLyAyLCBycCwgbm4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHNwLCAobm4gKyAxKSAvIDIsIG5wLCBubikpOworCisgIGhpZ2ggPSBucFtubiAtIDFdOworICBpZiAoaGlnaCAmIChHTVBfTlVNQl9ISUdIQklUIHwgKEdNUF9OVU1CX0hJR0hCSVQgLyAyKSkpCisgICAgYyA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChjLCBoaWdoKTsKKyAgICAgIGMgLT0gR01QX05BSUxfQklUUzsKKworICAgICAgYyA9IGMgLyAyOyAvKiB3ZSBoYXZlIHRvIHNoaWZ0IGxlZnQgYnkgMmMgYml0cyB0byBub3JtYWxpemUge25wLCBubn0gKi8KKyAgICB9CisgIGlmIChubiA9PSAxKSB7CisgICAgaWYgKGMgPT0gMCkKKyAgICAgIHsKKwlzcFswXSA9IG1wbl9zcXJ0cmVtMSAoJnJsLCBoaWdoKTsKKwlpZiAocnAgIT0gTlVMTCkKKwkgIHJwWzBdID0gcmw7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWNjID0gbXBuX3NxcnRyZW0xICgmcmwsIGhpZ2ggPDwgKDIqYykpID4+IGM7CisJc3BbMF0gPSBjYzsKKwlpZiAocnAgIT0gTlVMTCkKKwkgIHJwWzBdID0gcmwgPSBoaWdoIC0gY2MqY2M7CisgICAgICB9CisgICAgcmV0dXJuIHJsICE9IDA7CisgIH0KKyAgaWYgKG5uID09IDIpIHsKKyAgICBtcF9saW1iX3QgdHAgWzJdOworICAgIGlmIChycCA9PSBOVUxMKSBycCA9IHRwOworICAgIGlmIChjID09IDApCisgICAgICB7CisjaWYgU1FSVFJFTTJfSU5QTEFDRQorCXJwWzFdID0gaGlnaDsKKwlycFswXSA9IG5wWzBdOworCWNjID0gQ0FMTF9TUVJUUkVNMl9JTlBMQUNFIChzcCwgcnApOworI2Vsc2UKKwljYyA9IG1wbl9zcXJ0cmVtMiAoc3AsIHJwLCBucCk7CisjZW5kaWYKKwlycFsxXSA9IGNjOworCXJldHVybiAoKHJwWzBdIHwgY2MpICE9IDApICsgY2M7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXJsID0gbnBbMF07CisJcnBbMV0gPSAoaGlnaCA8PCAoMipjKSkgfCAocmwgPj4gKEdNUF9OVU1CX0JJVFMgLSAyKmMpKTsKKwlycFswXSA9IHJsIDw8ICgyKmMpOworCUNBTExfU1FSVFJFTTJfSU5QTEFDRSAoc3AsIHJwKTsKKwljYyA9IHNwWzBdID4+PSBjOwkvKiBjICE9IDAsIHRoZSBoaWdoZXN0IGJpdCBvZiB0aGUgcm9vdCBjYyBpcyAwLiAqLworCXJwWzBdID0gcmwgLT0gY2MqY2M7CS8qIENvbXB1dGVkIG1vZHVsbyAyXkdNUF9MSU1CX0JJVFMsIGJlY2F1c2UgaXQncyBzbWFsbGVyLiAqLworCXJldHVybiBybCAhPSAwOworICAgICAgfQorICB9CisgIHRuID0gKG5uICsgMSkgLyAyOyAvKiAyKnRuIGlzIHRoZSBzbWFsbGVzdCBldmVuIGludGVnZXIgPj0gbm4gKi8KKworICBpZiAoKHJwID09IE5VTEwpICYmIChubiA+IDgpKQorICAgIHJldHVybiBtcG5fZGNfc3FydCAoc3AsIG5wLCB0biwgYywgbm4gJiAxKTsKKyAgVE1QX01BUks7CisgIGlmICgoKG5uICYgMSkgfCBjKSAhPSAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBzMFsxXSwgbWFzazsKKyAgICAgIG1wX3B0ciB0cCwgc2NyYXRjaDsKKyAgICAgIFRNUF9BTExPQ19MSU1CU18yICh0cCwgMiAqIHRuLCBzY3JhdGNoLCB0biAvIDIgKyAxKTsKKyAgICAgIHRwWzBdID0gMDsJICAgICAvKiBuZWVkZWQgb25seSB3aGVuIDIqdG4gPiBubiwgYnV0IHNhdmVzIGEgdGVzdCAqLworICAgICAgaWYgKGMgIT0gMCkKKwltcG5fbHNoaWZ0ICh0cCArIChubiAmIDEpLCBucCwgbm4sIDIgKiBjKTsKKyAgICAgIGVsc2UKKwlNUE5fQ09QWSAodHAgKyAobm4gJiAxKSwgbnAsIG5uKTsKKyAgICAgIGMgKz0gKG5uICYgMSkgPyBHTVBfTlVNQl9CSVRTIC8gMiA6IDA7CQkvKiBjIG5vdyByZXByZXNlbnRzIGsgKi8KKyAgICAgIG1hc2sgPSAoQ05TVF9MSU1CICgxKSA8PCBjKSAtIDE7CisgICAgICBybCA9IG1wbl9kY19zcXJ0cmVtIChzcCwgdHAsIHRuLCAocnAgPT0gTlVMTCkgPyBtYXNrIC0gMSA6IDAsIHNjcmF0Y2gpOworICAgICAgLyogV2UgaGF2ZSAyXigyaykqTiA9IFNeMiArIFIgd2hlcmUgayA9IGMgKyAoMnRuLW5uKSpHTVBfTlVNQl9CSVRTLzIsCisJIHRodXMgMl4oMmspKk4gPSAoUy1zMCleMiArIDIqUypzMCAtIHMwXjIgKyBSIHdoZXJlIHMwPVMgbW9kIDJeayAqLworICAgICAgczBbMF0gPSBzcFswXSAmIG1hc2s7CS8qIFMgbW9kIDJeayAqLworICAgICAgcmwgKz0gbXBuX2FkZG11bF8xICh0cCwgc3AsIHRuLCAyICogczBbMF0pOwkvKiBSID0gUiArIDIqczAqUyAqLworICAgICAgY2MgPSBtcG5fc3VibXVsXzEgKHRwLCBzMCwgMSwgczBbMF0pOworICAgICAgcmwgLT0gKHRuID4gMSkgPyBtcG5fc3ViXzEgKHRwICsgMSwgdHAgKyAxLCB0biAtIDEsIGNjKSA6IGNjOworICAgICAgbXBuX3JzaGlmdCAoc3AsIHNwLCB0biwgYyk7CisgICAgICB0cFt0bl0gPSBybDsKKyAgICAgIGlmIChycCA9PSBOVUxMKQorCXJwID0gdHA7CisgICAgICBjID0gYyA8PCAxOworICAgICAgaWYgKGMgPCBHTVBfTlVNQl9CSVRTKQorCXRuKys7CisgICAgICBlbHNlCisJeworCSAgdHArKzsKKwkgIGMgLT0gR01QX05VTUJfQklUUzsKKwl9CisgICAgICBpZiAoYyAhPSAwKQorCW1wbl9yc2hpZnQgKHJwLCB0cCwgdG4sIGMpOworICAgICAgZWxzZQorCU1QTl9DT1BZX0lOQ1IgKHJwLCB0cCwgdG4pOworICAgICAgcm4gPSB0bjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocnAgIT0gbnApCisJeworCSAgaWYgKHJwID09IE5VTEwpIC8qIG5uIDw9IDggKi8KKwkgICAgcnAgPSBUTVBfU0FMTE9DX0xJTUJTIChubik7CisJICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJfQorICAgICAgcm4gPSB0biArIChycFt0bl0gPSBtcG5fZGNfc3FydHJlbSAoc3AsIHJwLCB0biwgMCwgVE1QX0FMTE9DX0xJTUJTKHRuIC8gMiArIDEpKSk7CisgICAgfQorCisgIE1QTl9OT1JNQUxJWkUgKHJwLCBybik7CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBybjsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3N0cm9uZ2ZpYm8uYyBiL21wbi9nZW5lcmljL3N0cm9uZ2ZpYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThkNjEyCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc3Ryb25nZmliby5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBtcG5fZmliMm0gLS0gY2FsY3VsYXRlIEZpYm9uYWNjaSBudW1iZXJzLCBtb2R1bG8gbS4KKworQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNSwgMjAwOSwgMjAxOCwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWYgISBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uICYmICEgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbgorLyogU3RvcmVzIHx7YXAsbn0te2JwLG59fCBpbiB7cnAsbn0sCisgICByZXR1cm5zIHRoZSBzaWduIG9mIHthcCxufS17YnAsbn0uICovCitzdGF0aWMgaW50CithYnNfc3ViX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgIHgsIHk7CisgIHdoaWxlICgtLW4gPj0gMCkKKyAgICB7CisgICAgICB4ID0gYXBbbl07CisgICAgICB5ID0gYnBbbl07CisgICAgICBpZiAoeCAhPSB5KQorICAgICAgICB7CisgICAgICAgICAgKytuOworICAgICAgICAgIGlmICh4ID4geSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAocnAsIGFwLCBicCwgbikpOworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX24gKHJwLCBicCwgYXAsIG4pKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBycFtuXSA9IDA7CisgICAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBDb21wdXRlcyBhdCBtb3N0IGNvdW50IHRlcm1zIG9mIHRoZSBzZXF1ZW5jZSBuZWVkZWQgYnkgdGhlCisgICBMdWNhcy1MZWhtZXItUmllc2VsIHRlc3QsIGluZGV4aW5nIGJhY2t3YXJkOgorICAgTF9pID0gTF97aSsxfV4yIC0gMgorCisgICBUaGUgc2VxdWVuY2UgaXMgY29tcHV0ZWQgbW9kdWxvIE0gPSB7bXAsIG1ufS4KKyAgIFRoZSBzdGFydGluZyBwb2ludCBpcyBnaXZlbiBpbiBMX3tjb3VudCsxfSA9IHtscCwgbW59LgorICAgVGhlIHNjcmF0Y2ggcG9pbnRlZCBieSBzcCwgbmVlZHMgYSBzcGFjZSBvZiBhdCBsZWFzdCAzICogbW4gKyAxIGxpbWJzLgorCisgICBSZXR1cm5zIHRoZSBpbmRleCBpPjAgaWYgTF9pID0gMCAobW9kIE0pIGlzIGZvdW5kIHdpdGhpbiB0aGUKKyAgIGNvbXB1dGVkIGNvdW50IHRlcm1zIG9mIHRoZSBzZXF1ZW5jZS4gIE90aGVyd2lzZSBpdCByZXR1cm5zIHplcm8uCisKKyAgIE5vdGU6ICgrLy0yKV4yLTI9MiwgKCsvLTEpXjItMj0tMSwgMF4yLTI9LTIKKyAqLworCitzdGF0aWMgbXBfYml0Y250X3QKK21wbl9sbHJpdGVyIChtcF9wdHIgbHAsIG1wX3NyY3B0ciBtcCwgbXBfc2l6ZV90IG1uLCBtcF9iaXRjbnRfdCBjb3VudCwgbXBfcHRyIHNwKQoreworICBkbworICAgIHsKKyAgICAgIG1wbl9zcXIgKHNwLCBscCwgbW4pOworICAgICAgbXBuX3RkaXZfcXIgKHNwICsgMiAqIG1uLCBscCwgMCwgc3AsIDIgKiBtbiwgbXAsIG1uKTsKKyAgICAgIGlmIChscFswXSA8IDUpCisJeworCSAgLyogSWYgTF4yICUgTSA8IDUsIHxMXjIgJSBNIC0gMnwgPD0gMiAqLworCSAgaWYgKG1uID09IDEgfHwgbXBuX3plcm9fcCAobHAgKyAxLCBtbiAtIDEpKQorCSAgICByZXR1cm4gKGxwWzBdID09IDIpID8gY291bnQgOiAwOworCSAgZWxzZQorCSAgICBNUE5fREVDUl9VIChscCwgbW4sIDIpOworCX0KKyAgICAgIGVsc2UKKwlscFswXSAtPSAyOworICAgIH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisgIHJldHVybiAwOworfQorCisvKiBTdG9yZSB0aGUgTHVjYXMnIG51bWJlciBMW25dIGF0IGxwIChtYXliZSksIGNvbXB1dGVkIG1vZHVsbyBtLiAgbHAKKyAgIGFuZCBzY3JhdGNoIHNob3VsZCBoYXZlIHJvb20gZm9yIG1uKjIrMSBsaW1icy4KKworICAgUmV0dXJucyB0aGUgc2l6ZSBvZiBMW25dIG5vcm1hbGx5LgorCisgICBJZiBGW25dIGlzIHplcm8gbW9kdWxvIG0sIG9yIExbbl0gaXMsIHJldHVybnMgMCBhbmQgbHAgaXMKKyAgIHVuZGVmaW5lZC4KKyovCisKK3N0YXRpYyBtcF9zaXplX3QKK21wbl9sdWNtIChtcF9wdHIgbHAsIG1wX3NyY3B0ciBucCwgbXBfc2l6ZV90IG5uLCBtcF9zcmNwdHIgbXAsIG1wX3NpemVfdCBtbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIGludAkJbmVnOworICBtcF9saW1iX3QJY3k7CisKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGxwLCBNQVgoMiptbisxLDUpLCBzY3JhdGNoLCBNQVgoMiptbisxLDUpKSk7CisgIEFTU0VSVCAobm4gPiAwKTsKKworICBuZWcgPSBtcG5fZmliMm0gKGxwLCBzY3JhdGNoLCBucCwgbm4sIG1wLCBtbik7CisKKyAgLyogRltuXSA9ICsvLXtscCwgbW59LCBGW24tMV0gPSArLy17c2NyYXRjaCwgbW59ICovCisgIGlmIChtcG5femVyb19wIChscCwgbW4pKQorICAgIHJldHVybiAwOworCisgIGlmIChuZWcpIC8qIE9uZSBzaWduIGlzIG9wcG9zaXRlLCB1c2Ugc3ViIGluc3RlYWQgb2YgYWRkLiAqLworICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uIHx8IEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX24KKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uCisgICAgICBjeSA9IG1wbl9yc2Jsc2gxX24gKGxwLCBscCwgc2NyYXRjaCwgbW4pOyAvKiBMW25dID0gKy8tKDJGW24tMV0tKC1GW25dKSkgKi8KKyNlbHNlCisgICAgICBjeSA9IG1wbl9zdWJsc2gxX24gKGxwLCBscCwgc2NyYXRjaCwgbW4pOyAvKiBMW25dID0gLS8rKEZbbl0tKC0yRltuLTFdKSkgKi8KKyAgICAgIGlmIChjeSAhPSAwKQorCWN5ID0gbXBuX2FkZF9uIChscCwgbHAsIG1wLCBtbikgLSBjeTsKKyNlbmRpZgorICAgICAgaWYgKGN5ID4gMSkKKwljeSArPSBtcG5fYWRkX24gKGxwLCBscCwgbXAsIG1uKTsKKyNlbHNlCisgICAgICBjeSA9IG1wbl9sc2hpZnQgKHNjcmF0Y2gsIHNjcmF0Y2gsIG1uLCAxKTsgLyogMkZbbi0xXSAqLworICAgICAgaWYgKFVOTElLRUxZIChjeSkpCisJY3kgLT0gbXBuX3N1Yl9uIChscCwgc2NyYXRjaCwgbHAsIG1uKTsgLyogTFtuXSA9ICsvLSgyRltuLTFdLSgtRltuXSkpICovCisgICAgICBlbHNlCisJYWJzX3N1Yl9uIChscCwgbHAsIHNjcmF0Y2gsIG1uKTsKKyNlbmRpZgorICAgICAgQVNTRVJUIChjeSA8PSAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorICAgICAgY3kgPSBtcG5fYWRkbHNoMV9uIChscCwgbHAsIHNjcmF0Y2gsIG1uKTsgLyogTFtuXSA9ICsvLSgyRltuLTFdK0Zbbl0pKSAqLworI2Vsc2UKKyAgICAgIGN5ID0gbXBuX2xzaGlmdCAoc2NyYXRjaCwgc2NyYXRjaCwgbW4sIDEpOworICAgICAgY3krPSBtcG5fYWRkX24gKGxwLCBscCwgc2NyYXRjaCwgbW4pOworI2VuZGlmCisgICAgICBBU1NFUlQgKGN5IDw9IDIpOworICAgIH0KKyAgd2hpbGUgKGN5IHx8IG1wbl9jbXAgKGxwLCBtcCwgbW4pID49IDApCisgICAgY3kgLT0gbXBuX3N1Yl9uIChscCwgbHAsIG1wLCBtbik7CisgIE1QTl9OT1JNQUxJWkUgKGxwLCBtbik7CisgIHJldHVybiBtbjsKK30KKworaW50CittcG5fc3Ryb25nZmlibyAobXBfc3JjcHRyIG1wLCBtcF9zaXplX3QgbW4sIG1wX3B0ciBzY3JhdGNoKQoreworICBtcF9wdHIJbHAsIHNwOworICBtcF9zaXplX3QJZW47CisgIG1wX2JpdGNudF90CWIwOworICBUTVBfREVDTDsKKworI2lmIEdNUF9OVU1CX0JJVFMgJSA0ID09IDAKKyAgYjAgPSBtcG5fc2NhbjAgKG1wLCAwKTsKKyNlbHNlCisgIHsKKyAgICBtcHpfdCBtID0gTVBaX1JPSU5JVF9OKG1wLCBtbik7CisgICAgYjAgPSBtcHpfc2NhbjAgKG0sIDApOworICB9CisgIGlmIChVTkxJS0VMWSAoYjAgPT0gbW4gKiBHTVBfTlVNQl9CSVRTKSkKKyAgICB7CisgICAgICBlbiA9IDE7CisgICAgICBzY3JhdGNoIFswXSA9IDE7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBpbnQgY250ID0gYjAgJSBHTVBfTlVNQl9CSVRTOworICAgICAgZW4gPSBiMCAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBpZiAoTElLRUxZIChjbnQgIT0gMCkpCisJbXBuX3JzaGlmdCAoc2NyYXRjaCwgbXAgKyBlbiwgbW4gLSBlbiwgY250KTsKKyAgICAgIGVsc2UKKwlNUE5fQ09QWSAoc2NyYXRjaCwgbXAgKyBlbiwgbW4gLSBlbik7CisgICAgICBlbiA9IG1uIC0gZW47CisgICAgICBzY3JhdGNoIFswXSB8PSAxOworICAgICAgZW4gLT0gc2NyYXRjaCBbZW4gLSAxXSA9PSAwOworICAgIH0KKyAgVE1QX01BUks7CisKKyAgbHAgPSBUTVBfQUxMT0NfTElNQlMgKDQgKiBtbiArIDYpOworICBzcCA9IGxwICsgMiAqIG1uICsgMzsKKyAgZW4gPSBtcG5fbHVjbSAoc3AsIHNjcmF0Y2gsIGVuLCBtcCwgbW4sIGxwKTsKKyAgaWYgKGVuICE9IDAgJiYgTElLRUxZICgtLWIwICE9IDApKQorICAgIHsKKyAgICAgIG1wbl9zcXIgKGxwLCBzcCwgZW4pOworICAgICAgbHAgWzBdIHw9IDI7IC8qIFZeMiArIDIgKi8KKyAgICAgIGlmIChMSUtFTFkgKDIgKiBlbiA+PSBtbikpCisJbXBuX3RkaXZfcXIgKHNwLCBscCwgMCwgbHAsIDIgKiBlbiwgbXAsIG1uKTsKKyAgICAgIGVsc2UKKwlNUE5fWkVSTyAobHAgKyAyICogZW4sIG1uIC0gMiAqIGVuKTsKKyAgICAgIGlmICghIG1wbl96ZXJvX3AgKGxwLCBtbikgJiYgTElLRUxZICgtLWIwICE9IDApKQorCWIwID0gbXBuX2xscml0ZXIgKGxwLCBtcCwgbW4sIGIwLCBscCArIG1uICsgMSk7CisgICAgfQorICBUTVBfRlJFRTsKKyAgcmV0dXJuIChiMCAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3N1Yi5jIGIvbXBuL2dlbmVyaWMvc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwYWZkNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3N1Yi5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wbl9zdWIgLSBzdWJ0cmFjdCBtcG4gZnJvbSBtcG4uCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wbl9zdWIgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3N1Yl8xLmMgYi9tcG4vZ2VuZXJpYy9zdWJfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGYxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zdWJfMS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wbl9zdWJfMSAtIHN1YnRyYWN0IGxpbWIgZnJvbSBtcG4uCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wbl9zdWJfMSAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc3ViX2VycjFfbi5jIGIvbXBuL2dlbmVyaWMvc3ViX2VycjFfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2E1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zdWJfZXJyMV9uLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIG1wbl9zdWJfZXJyMV9uIC0tIHN1Yl9uIHdpdGggb25lIGVycm9yIHRlcm0KKworICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgSGFydmV5LgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qCisgIENvbXB1dGVzOgorCisgICgxKSB7cnAsbn0gOj0ge3VwLG59IC0ge3ZwLG59IChqdXN0IGxpa2UgbXBuX3N1Yl9uKSB3aXRoIGluY29taW5nIGJvcnJvdyBjeSwKKyAgcmV0dXJuIHZhbHVlIGlzIGJvcnJvdyBvdXQuCisKKyAgKDIpIExldCBjW2krMV0gPSBib3Jyb3cgZnJvbSBpLXRoIGxpbWIgc3VidHJhY3Rpb24gKGNbMF0gPSBjeSkuCisgIENvbXB1dGVzIGNbMV0qeXBbbi0xXSArIC4uLiArIGNbbl0qeXBbMF0sIHN0b3JlcyB0d28tbGltYiByZXN1bHQgYXQgZXAuCisKKyAgUmVxdWlyZXMgbiA+PSAxLgorCisgIE5vbmUgb2YgdGhlIG91dHB1dHMgbWF5IG92ZXJsYXAgZWFjaCBvdGhlciBvciBhbnkgb2YgdGhlIGlucHV0cywgZXhjZXB0CisgIHRoYXQge3JwLG59IG1heSBiZSBlcXVhbCB0byB7dXAsbn0gb3Ige3ZwLG59LgorKi8KK21wX2xpbWJfdAorbXBuX3N1Yl9lcnIxX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsCisJCW1wX3B0ciBlcCwgbXBfc3JjcHRyIHlwLAorICAgICAgICAgICAgICAgIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgY3kpCit7CisgIG1wX2xpbWJfdCBlbCwgZWgsIHVsLCB2bCwgeWwsIHpsLCBybCwgc2wsIGN5MSwgY3kyOworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdXAsIG4pKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChycCwgdnAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHJwLCBuLCB5cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDIsIHVwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgMiwgdnAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCAyLCB5cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDIsIHJwLCBuKSk7CisKKyAgeXAgKz0gbiAtIDE7CisgIGVsID0gZWggPSAwOworCisgIGRvCisgICAgeworICAgICAgeWwgPSAqeXAtLTsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrOworCisgICAgICAvKiBvcmRpbmFyeSBzdWJfbiAqLworICAgICAgU1VCQ19MSU1CIChjeTEsIHNsLCB1bCwgdmwpOworICAgICAgU1VCQ19MSU1CIChjeTIsIHJsLCBzbCwgY3kpOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworCisgICAgICAvKiB1cGRhdGUgKGVoOmVsKSAqLworICAgICAgemwgPSAoLWN5KSAmIHlsOworICAgICAgZWwgKz0gemw7CisgICAgICBlaCArPSBlbCA8IHpsOworICAgIH0KKyAgd2hpbGUgKC0tbik7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgZWggPSAoZWggPDwgR01QX05BSUxfQklUUykgKyAoZWwgPj4gR01QX05VTUJfQklUUyk7CisgIGVsICY9IEdNUF9OVU1CX01BU0s7CisjZW5kaWYKKworICBlcFswXSA9IGVsOworICBlcFsxXSA9IGVoOworCisgIHJldHVybiBjeTsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3N1Yl9lcnIyX24uYyBiL21wbi9nZW5lcmljL3N1Yl9lcnIyX24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRmOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvc3ViX2VycjJfbi5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiBtcG5fc3ViX2VycjJfbiAtLSBzdWJfbiB3aXRoIHR3byBlcnJvciB0ZXJtcworCisgICBDb250cmlidXRlZCBieSBEYXZpZCBIYXJ2ZXkuCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUJ0xMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyoKKyAgQ29tcHV0ZXM6CisKKyAgKDEpIHtycCxufSA6PSB7dXAsbn0gLSB7dnAsbn0gKGp1c3QgbGlrZSBtcG5fc3ViX24pIHdpdGggaW5jb21pbmcgYm9ycm93IGN5LAorICByZXR1cm4gdmFsdWUgaXMgYm9ycm93IG91dC4KKworICAoMikgTGV0IGNbaSsxXSA9IGJvcnJvdyBmcm9tIGktdGggbGltYiBzdWJ0cmFjdGlvbiAoY1swXSA9IGN5KS4KKyAgQ29tcHV0ZXMgY1sxXSp5cDFbbi0xXSArIC4uLiArIGNbbl0qeXAxWzBdLAorICAgICAgICAgICBjWzFdKnlwMltuLTFdICsgLi4uICsgY1tuXSp5cDJbMF0sCisgIHN0b3JlcyB0d28tbGltYiByZXN1bHRzIGF0IHtlcCwyfSBhbmQge2VwKzIsMn0gcmVzcGVjdGl2ZWx5LgorCisgIFJlcXVpcmVzIG4gPj0gMS4KKworICBOb25lIG9mIHRoZSBvdXRwdXRzIG1heSBvdmVybGFwIGVhY2ggb3RoZXIgb3IgYW55IG9mIHRoZSBpbnB1dHMsIGV4Y2VwdAorICB0aGF0IHtycCxufSBtYXkgYmUgZXF1YWwgdG8ge3VwLG59IG9yIHt2cCxufS4KKyovCittcF9saW1iX3QKK21wbl9zdWJfZXJyMl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLAorICAgICAgICAgICAgICAgIG1wX3B0ciBlcCwgbXBfc3JjcHRyIHlwMSwgbXBfc3JjcHRyIHlwMiwKKyAgICAgICAgICAgICAgICBtcF9zaXplX3QgbiwgbXBfbGltYl90IGN5KQoreworICBtcF9saW1iX3QgZWwxLCBlaDEsIGVsMiwgZWgyLCB1bCwgdmwsIHlsMSwgeWwyLCB6bDEsIHpsMiwgcmwsIHNsLCBjeTEsIGN5MjsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHZwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeXAxLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeXAyLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNCwgdXAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCA0LCB2cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDQsIHlwMSwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDQsIHlwMiwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDQsIHJwLCBuKSk7CisKKyAgeXAxICs9IG4gLSAxOworICB5cDIgKz0gbiAtIDE7CisgIGVsMSA9IGVoMSA9IDA7CisgIGVsMiA9IGVoMiA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICB5bDEgPSAqeXAxLS07CisgICAgICB5bDIgPSAqeXAyLS07CisgICAgICB1bCA9ICp1cCsrOworICAgICAgdmwgPSAqdnArKzsKKworICAgICAgLyogb3JkaW5hcnkgc3ViX24gKi8KKyAgICAgIFNVQkNfTElNQiAoY3kxLCBzbCwgdWwsIHZsKTsKKyAgICAgIFNVQkNfTElNQiAoY3kyLCBybCwgc2wsIGN5KTsKKyAgICAgIGN5ID0gY3kxIHwgY3kyOworICAgICAgKnJwKysgPSBybDsKKworICAgICAgLyogdXBkYXRlIChlaDE6ZWwxKSAqLworICAgICAgemwxID0gKC1jeSkgJiB5bDE7CisgICAgICBlbDEgKz0gemwxOworICAgICAgZWgxICs9IGVsMSA8IHpsMTsKKworICAgICAgLyogdXBkYXRlIChlaDI6ZWwyKSAqLworICAgICAgemwyID0gKC1jeSkgJiB5bDI7CisgICAgICBlbDIgKz0gemwyOworICAgICAgZWgyICs9IGVsMiA8IHpsMjsKKyAgICB9CisgIHdoaWxlICgtLW4pOworCisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGVoMSA9IChlaDEgPDwgR01QX05BSUxfQklUUykgKyAoZWwxID4+IEdNUF9OVU1CX0JJVFMpOworICBlbDEgJj0gR01QX05VTUJfTUFTSzsKKyAgZWgyID0gKGVoMiA8PCBHTVBfTkFJTF9CSVRTKSArIChlbDIgPj4gR01QX05VTUJfQklUUyk7CisgIGVsMiAmPSBHTVBfTlVNQl9NQVNLOworI2VuZGlmCisKKyAgZXBbMF0gPSBlbDE7CisgIGVwWzFdID0gZWgxOworICBlcFsyXSA9IGVsMjsKKyAgZXBbM10gPSBlaDI7CisKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc3ViX2VycjNfbi5jIGIvbXBuL2dlbmVyaWMvc3ViX2VycjNfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjNjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zdWJfZXJyM19uLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIG1wbl9zdWJfZXJyM19uIC0tIHN1Yl9uIHdpdGggdGhyZWUgZXJyb3IgdGVybXMKKworICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgSGFydmV5LgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCdMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qCisgIENvbXB1dGVzOgorCisgICgxKSB7cnAsbn0gOj0ge3VwLG59IC0ge3ZwLG59IChqdXN0IGxpa2UgbXBuX3N1Yl9uKSB3aXRoIGluY29taW5nIGJvcnJvdyBjeSwKKyAgcmV0dXJuIHZhbHVlIGlzIGJvcnJvdyBvdXQuCisKKyAgKDIpIExldCBjW2krMV0gPSBib3Jyb3cgZnJvbSBpLXRoIGxpbWIgc3VidHJhY3Rpb24gKGNbMF0gPSBjeSkuCisgIENvbXB1dGVzIGNbMV0qeXAxW24tMV0gKyAuLi4gKyBjW25dKnlwMVswXSwKKyAgICAgICAgICAgY1sxXSp5cDJbbi0xXSArIC4uLiArIGNbbl0qeXAyWzBdLAorICAgICAgICAgICBjWzFdKnlwM1tuLTFdICsgLi4uICsgY1tuXSp5cDNbMF0sCisgIHN0b3JlcyB0d28tbGltYiByZXN1bHRzIGF0IHtlcCwyfSwge2VwKzIsMn0gYW5kIHtlcCs0LDJ9IHJlc3BlY3RpdmVseS4KKworICBSZXF1aXJlcyBuID49IDEuCisKKyAgTm9uZSBvZiB0aGUgb3V0cHV0cyBtYXkgb3ZlcmxhcCBlYWNoIG90aGVyIG9yIGFueSBvZiB0aGUgaW5wdXRzLCBleGNlcHQKKyAgdGhhdCB7cnAsbn0gbWF5IGJlIGVxdWFsIHRvIHt1cCxufSBvciB7dnAsbn0uCisqLworbXBfbGltYl90CittcG5fc3ViX2VycjNfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwKKyAgICAgICAgICAgICAgICBtcF9wdHIgZXAsIG1wX3NyY3B0ciB5cDEsIG1wX3NyY3B0ciB5cDIsIG1wX3NyY3B0ciB5cDMsCisgICAgICAgICAgICAgICAgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBjeSkKK3sKKyAgbXBfbGltYl90IGVsMSwgZWgxLCBlbDIsIGVoMiwgZWwzLCBlaDMsIHVsLCB2bCwgeWwxLCB5bDIsIHlsMywgemwxLCB6bDIsIHpsMywgcmwsIHNsLCBjeTEsIGN5MjsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHZwLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeXAxLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeXAyLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChycCwgbiwgeXAzLCBuKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChlcCwgNiwgdXAsIG4pKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKGVwLCA2LCB2cCwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDYsIHlwMSwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDYsIHlwMiwgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDYsIHlwMywgbikpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoZXAsIDYsIHJwLCBuKSk7CisKKyAgeXAxICs9IG4gLSAxOworICB5cDIgKz0gbiAtIDE7CisgIHlwMyArPSBuIC0gMTsKKyAgZWwxID0gZWgxID0gMDsKKyAgZWwyID0gZWgyID0gMDsKKyAgZWwzID0gZWgzID0gMDsKKworICBkbworICAgIHsKKyAgICAgIHlsMSA9ICp5cDEtLTsKKyAgICAgIHlsMiA9ICp5cDItLTsKKyAgICAgIHlsMyA9ICp5cDMtLTsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrOworCisgICAgICAvKiBvcmRpbmFyeSBzdWJfbiAqLworICAgICAgU1VCQ19MSU1CIChjeTEsIHNsLCB1bCwgdmwpOworICAgICAgU1VCQ19MSU1CIChjeTIsIHJsLCBzbCwgY3kpOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworCisgICAgICAvKiB1cGRhdGUgKGVoMTplbDEpICovCisgICAgICB6bDEgPSAoLWN5KSAmIHlsMTsKKyAgICAgIGVsMSArPSB6bDE7CisgICAgICBlaDEgKz0gZWwxIDwgemwxOworCisgICAgICAvKiB1cGRhdGUgKGVoMjplbDIpICovCisgICAgICB6bDIgPSAoLWN5KSAmIHlsMjsKKyAgICAgIGVsMiArPSB6bDI7CisgICAgICBlaDIgKz0gZWwyIDwgemwyOworCisgICAgICAvKiB1cGRhdGUgKGVoMzplbDMpICovCisgICAgICB6bDMgPSAoLWN5KSAmIHlsMzsKKyAgICAgIGVsMyArPSB6bDM7CisgICAgICBlaDMgKz0gZWwzIDwgemwzOworICAgIH0KKyAgd2hpbGUgKC0tbik7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgZWgxID0gKGVoMSA8PCBHTVBfTkFJTF9CSVRTKSArIChlbDEgPj4gR01QX05VTUJfQklUUyk7CisgIGVsMSAmPSBHTVBfTlVNQl9NQVNLOworICBlaDIgPSAoZWgyIDw8IEdNUF9OQUlMX0JJVFMpICsgKGVsMiA+PiBHTVBfTlVNQl9CSVRTKTsKKyAgZWwyICY9IEdNUF9OVU1CX01BU0s7CisgIGVoMyA9IChlaDMgPDwgR01QX05BSUxfQklUUykgKyAoZWwzID4+IEdNUF9OVU1CX0JJVFMpOworICBlbDMgJj0gR01QX05VTUJfTUFTSzsKKyNlbmRpZgorCisgIGVwWzBdID0gZWwxOworICBlcFsxXSA9IGVoMTsKKyAgZXBbMl0gPSBlbDI7CisgIGVwWzNdID0gZWgyOworICBlcFs0XSA9IGVsMzsKKyAgZXBbNV0gPSBlaDM7CisKKyAgcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvc3ViX24uYyBiL21wbi9nZW5lcmljL3N1Yl9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5MmM5NgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3N1Yl9uLmMKQEAgLTAsMCArMSw4OSBAQAorLyogbXBuX3N1Yl9uIC0tIFN1YnRyYWN0IGVxdWFsIGxlbmd0aCBsaW1iIHZlY3RvcnMuCisKK0NvcHlyaWdodCAxOTkyLTE5OTQsIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKworbXBfbGltYl90CittcG5fc3ViX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICBtcF9saW1iX3QgdWwsIHZsLCBzbCwgcmwsIGN5LCBjeTEsIGN5MjsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfSU5DUl9QIChycCwgdXAsIG4pKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB2cCwgbikpOworCisgIGN5ID0gMDsKKyAgZG8KKyAgICB7CisgICAgICB1bCA9ICp1cCsrOworICAgICAgdmwgPSAqdnArKzsKKyAgICAgIHNsID0gdWwgLSB2bDsKKyAgICAgIGN5MSA9IHNsID4gdWw7CisgICAgICBybCA9IHNsIC0gY3k7CisgICAgICBjeTIgPSBybCA+IHNsOworICAgICAgY3kgPSBjeTEgfCBjeTI7CisgICAgICAqcnArKyA9IHJsOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gY3k7Cit9CisKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAxCisKK21wX2xpbWJfdAorbXBuX3N1Yl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfbGltYl90IHVsLCB2bCwgcmwsIGN5OworCisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUIChNUE5fU0FNRV9PUl9JTkNSX1AgKHJwLCB1cCwgbikpOworICBBU1NFUlQgKE1QTl9TQU1FX09SX0lOQ1JfUCAocnAsIHZwLCBuKSk7CisKKyAgY3kgPSAwOworICBkbworICAgIHsKKyAgICAgIHVsID0gKnVwKys7CisgICAgICB2bCA9ICp2cCsrOworICAgICAgcmwgPSB1bCAtIHZsIC0gY3k7CisgICAgICBjeSA9IHJsID4+IChHTVBfTElNQl9CSVRTIC0gMSk7CisgICAgICAqcnArKyA9IHJsICYgR01QX05VTUJfTUFTSzsKKyAgICB9CisgIHdoaWxlICgtLW4gIT0gMCk7CisKKyAgcmV0dXJuIGN5OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3N1Ym11bF8xLmMgYi9tcG4vZ2VuZXJpYy9zdWJtdWxfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDQyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy9zdWJtdWxfMS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiBtcG5fc3VibXVsXzEgLS0gbXVsdGlwbHkgdGhlIE4gbG9uZyBsaW1iIHZlY3RvciBwb2ludGVkIHRvIGJ5IFVQIGJ5IFZMLAorICAgc3VidHJhY3QgdGhlIE4gbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgdGhlIHByb2R1Y3QgZnJvbSB0aGUgbGltYgorICAgdmVjdG9yIHBvaW50ZWQgdG8gYnkgUlAuICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiB0aGUKKyAgIHByb2R1Y3QsIGFkanVzdGVkIGZvciBjYXJyeS1vdXQgZnJvbSB0aGUgc3VidHJhY3Rpb24uCisKK0NvcHlyaWdodCAxOTkyLTE5OTQsIDE5OTYsIDIwMDAsIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorCittcF9saW1iX3QKK21wbl9zdWJtdWxfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdjApCit7CisgIG1wX2xpbWJfdCB1MCwgY3JlYywgYywgcDEsIHAwLCByMDsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisKKyAgY3JlYyA9IDA7CisgIGRvCisgICAgeworICAgICAgdTAgPSAqdXArKzsKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCB1MCwgdjApOworCisgICAgICByMCA9ICpycDsKKworICAgICAgcDAgPSByMCAtIHAwOworICAgICAgYyA9IHIwIDwgcDA7CisKKyAgICAgIHAxID0gcDEgKyBjOworCisgICAgICByMCA9IHAwIC0gY3JlYzsJCS8qIGN5Y2xlIDAsIDMsIC4uLiAqLworICAgICAgYyA9IHAwIDwgcjA7CQkvKiBjeWNsZSAxLCA0LCAuLi4gKi8KKworICAgICAgY3JlYyA9IHAxICsgYzsJCS8qIGN5Y2xlIDIsIDUsIC4uLiAqLworCisgICAgICAqcnArKyA9IHIwOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gY3JlYzsKK30KKworI2VuZGlmCisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDEKKworbXBfbGltYl90CittcG5fc3VibXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHYwKQoreworICBtcF9saW1iX3Qgc2hpZnRlZF92MCwgdTAsIHIwLCBwMCwgcDEsIHByZXZfcDEsIGNsLCB4bCwgYzEsIGMyLCBjMzsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVF9NUE4gKHJwLCBuKTsKKyAgQVNTRVJUX01QTiAodXAsIG4pOworICBBU1NFUlRfTElNQiAodjApOworCisgIHNoaWZ0ZWRfdjAgPSB2MCA8PCBHTVBfTkFJTF9CSVRTOworICBjbCA9IDA7CisgIHByZXZfcDEgPSAwOworICBkbworICAgIHsKKyAgICAgIHUwID0gKnVwKys7CisgICAgICByMCA9ICpycDsKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCB1MCwgc2hpZnRlZF92MCk7CisgICAgICBwMCA+Pj0gR01QX05BSUxfQklUUzsKKyAgICAgIFNVQkNfTElNQiAoYzEsIHhsLCByMCwgcHJldl9wMSk7CisgICAgICBTVUJDX0xJTUIgKGMyLCB4bCwgeGwsIHAwKTsKKyAgICAgIFNVQkNfTElNQiAoYzMsIHhsLCB4bCwgY2wpOworICAgICAgY2wgPSBjMSArIGMyICsgYzM7CisgICAgICAqcnArKyA9IHhsOworICAgICAgcHJldl9wMSA9IHAxOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gcHJldl9wMSArIGNsOworfQorCisjZW5kaWYKKworI2lmIEdNUF9OQUlMX0JJVFMgPj0gMgorCittcF9saW1iX3QKK21wbl9zdWJtdWxfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgdjApCit7CisgIG1wX2xpbWJfdCBzaGlmdGVkX3YwLCB1MCwgcjAsIHAwLCBwMSwgcHJldl9wMSwgeHcsIGNsLCB4bDsKKworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAocnAsIHVwLCBuKSk7CisgIEFTU0VSVF9NUE4gKHJwLCBuKTsKKyAgQVNTRVJUX01QTiAodXAsIG4pOworICBBU1NFUlRfTElNQiAodjApOworCisgIHNoaWZ0ZWRfdjAgPSB2MCA8PCBHTVBfTkFJTF9CSVRTOworICBjbCA9IDA7CisgIHByZXZfcDEgPSAwOworICBkbworICAgIHsKKyAgICAgIHUwID0gKnVwKys7CisgICAgICByMCA9ICpycDsKKyAgICAgIHVtdWxfcHBtbSAocDEsIHAwLCB1MCwgc2hpZnRlZF92MCk7CisgICAgICBwMCA+Pj0gR01QX05BSUxfQklUUzsKKyAgICAgIHh3ID0gcjAgLSAocHJldl9wMSArIHAwKSArIGNsOworICAgICAgY2wgPSAobXBfbGltYl9zaWduZWRfdCkgeHcgPj4gR01QX05VTUJfQklUUzsgLyogRklYTUU6IG5vbi1wb3J0YWJsZSAqLworICAgICAgeGwgPSB4dyAmIEdNUF9OVU1CX01BU0s7CisgICAgICAqcnArKyA9IHhsOworICAgICAgcHJldl9wMSA9IHAxOworICAgIH0KKyAgd2hpbGUgKC0tbiAhPSAwKTsKKworICByZXR1cm4gcHJldl9wMSAtIGNsOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3RkaXZfcXIuYyBiL21wbi9nZW5lcmljL3RkaXZfcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZmMzNjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdGRpdl9xci5jCkBAIC0wLDAgKzEsMzg2IEBACisvKiBtcG5fdGRpdl9xciAtLSBEaXZpZGUgdGhlIG51bWVyYXRvciAobnAsbm4pIGJ5IHRoZSBkZW5vbWluYXRvciAoZHAsZG4pIGFuZAorICAgd3JpdGUgdGhlIG5uLWRuKzEgcXVvdGllbnQgbGltYnMgYXQgcXAgYW5kIHRoZSBkbiByZW1haW5kZXIgbGltYnMgYXQgcnAuICBJZgorICAgcXhuIGlzIG5vbi16ZXJvLCBnZW5lcmF0ZSB0aGF0IG1hbnkgZnJhY3Rpb24gbGltYnMgYW5kIGFwcGVuZCB0aGVtIGFmdGVyIHRoZQorICAgb3RoZXIgcXVvdGllbnQgbGltYnMsIGFuZCB1cGRhdGUgdGhlIHJlbWFpbmRlciBhY2NvcmRpbmdseS4gIFRoZSBpbnB1dAorICAgb3BlcmFuZHMgYXJlIHVuYWZmZWN0ZWQuCisKKyAgIFByZWNvbmRpdGlvbnM6CisgICAxLiBUaGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHRoZSBkaXZpc29yIG11c3QgYmUgbm9uLXplcm8uCisgICAyLiBubiA+PSBkbiwgZXZlbiBpZiBxeG4gaXMgbm9uLXplcm8uICAoPz8/IHJlbGF4IHRoaXMgPz8/KQorCisgICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgaXMgTyhxbipxbitNKGRuLHFuKSksIHdoZXJlIE0obSxuKSBpcyB0aGUgdGltZQorICAgY29tcGxleGl0eSBvZiBtdWx0aXBsaWNhdGlvbi4KKworQ29weXJpZ2h0IDE5OTcsIDIwMDAtMjAwMiwgMjAwNSwgMjAwOSwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCit2b2lkCittcG5fdGRpdl9xciAobXBfcHRyIHFwLCBtcF9wdHIgcnAsIG1wX3NpemVfdCBxeG4sCisJICAgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4pCit7CisgIEFTU0VSVF9BTFdBWVMgKHF4biA9PSAwKTsKKworICBBU1NFUlQgKG5uID49IDApOworICBBU1NFUlQgKGRuID49IDApOworICBBU1NFUlQgKGRuID09IDAgfHwgZHBbZG4gLSAxXSAhPSAwKTsKKyAgQVNTRVJUICghIE1QTl9PVkVSTEFQX1AgKHFwLCBubiAtIGRuICsgMSArIHF4biwgbnAsIG5uKSk7CisgIEFTU0VSVCAoISBNUE5fT1ZFUkxBUF9QIChxcCwgbm4gLSBkbiArIDEgKyBxeG4sIGRwLCBkbikpOworCisgIHN3aXRjaCAoZG4pCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIERJVklERV9CWV9aRVJPOworCisgICAgY2FzZSAxOgorICAgICAgeworCXJwWzBdID0gbXBuX2RpdnJlbV8xIChxcCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCBkcFswXSk7CisJcmV0dXJuOworICAgICAgfQorCisgICAgY2FzZSAyOgorICAgICAgeworCW1wX3B0ciBuMnA7CisJbXBfbGltYl90IHFobCwgY3k7CisJVE1QX0RFQ0w7CisJVE1QX01BUks7CisJaWYgKChkcFsxXSAmIEdNUF9OVU1CX0hJR0hCSVQpID09IDApCisJICB7CisJICAgIGludCBjbnQ7CisJICAgIG1wX2xpbWJfdCBkMnBbMl07CisJICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgZHBbMV0pOworCSAgICBjbnQgLT0gR01QX05BSUxfQklUUzsKKwkgICAgZDJwWzFdID0gKGRwWzFdIDw8IGNudCkgfCAoZHBbMF0gPj4gKEdNUF9OVU1CX0JJVFMgLSBjbnQpKTsKKwkgICAgZDJwWzBdID0gKGRwWzBdIDw8IGNudCkgJiBHTVBfTlVNQl9NQVNLOworCSAgICBuMnAgPSBUTVBfQUxMT0NfTElNQlMgKG5uICsgMSk7CisJICAgIGN5ID0gbXBuX2xzaGlmdCAobjJwLCBucCwgbm4sIGNudCk7CisJICAgIG4ycFtubl0gPSBjeTsKKwkgICAgcWhsID0gbXBuX2RpdnJlbV8yIChxcCwgMEwsIG4ycCwgbm4gKyAoY3kgIT0gMCksIGQycCk7CisJICAgIGlmIChjeSA9PSAwKQorCSAgICAgIHFwW25uIC0gMl0gPSBxaGw7CS8qIGFsd2F5cyBzdG9yZSBubi0yKzEgcXVvdGllbnQgbGltYnMgKi8KKwkgICAgcnBbMF0gPSAobjJwWzBdID4+IGNudCkKKwkgICAgICB8ICgobjJwWzFdIDw8IChHTVBfTlVNQl9CSVRTIC0gY250KSkgJiBHTVBfTlVNQl9NQVNLKTsKKwkgICAgcnBbMV0gPSAobjJwWzFdID4+IGNudCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBuMnAgPSBUTVBfQUxMT0NfTElNQlMgKG5uKTsKKwkgICAgTVBOX0NPUFkgKG4ycCwgbnAsIG5uKTsKKwkgICAgcWhsID0gbXBuX2RpdnJlbV8yIChxcCwgMEwsIG4ycCwgbm4sIGRwKTsKKwkgICAgcXBbbm4gLSAyXSA9IHFobDsJLyogYWx3YXlzIHN0b3JlIG5uLTIrMSBxdW90aWVudCBsaW1icyAqLworCSAgICBycFswXSA9IG4ycFswXTsKKwkgICAgcnBbMV0gPSBuMnBbMV07CisJICB9CisJVE1QX0ZSRUU7CisJcmV0dXJuOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlpbnQgYWRqdXN0OworCWdtcF9waTFfdCBkaW52OworCVRNUF9ERUNMOworCVRNUF9NQVJLOworCWFkanVzdCA9IG5wW25uIC0gMV0gPj0gZHBbZG4gLSAxXTsJLyogY29uc2VydmF0aXZlIHRlc3RzIGZvciBxdW90aWVudCBzaXplICovCisJaWYgKG5uICsgYWRqdXN0ID49IDIgKiBkbikKKwkgIHsKKwkgICAgbXBfcHRyIG4ycCwgZDJwOworCSAgICBtcF9saW1iX3QgY3k7CisJICAgIGludCBjbnQ7CisKKwkgICAgcXBbbm4gLSBkbl0gPSAwOwkJCSAgLyogemVybyBoaWdoIHF1b3RpZW50IGxpbWIgKi8KKwkgICAgaWYgKChkcFtkbiAtIDFdICYgR01QX05VTUJfSElHSEJJVCkgPT0gMCkgLyogbm9ybWFsaXplIGRpdmlzb3IgKi8KKwkgICAgICB7CisJCWNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgZHBbZG4gLSAxXSk7CisJCWNudCAtPSBHTVBfTkFJTF9CSVRTOworCQlkMnAgPSBUTVBfQUxMT0NfTElNQlMgKGRuKTsKKwkJbXBuX2xzaGlmdCAoZDJwLCBkcCwgZG4sIGNudCk7CisJCW4ycCA9IFRNUF9BTExPQ19MSU1CUyAobm4gKyAxKTsKKwkJY3kgPSBtcG5fbHNoaWZ0IChuMnAsIG5wLCBubiwgY250KTsKKwkJbjJwW25uXSA9IGN5OworCQlubiArPSBhZGp1c3Q7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljbnQgPSAwOworCQlkMnAgPSAobXBfcHRyKSBkcDsKKwkJbjJwID0gVE1QX0FMTE9DX0xJTUJTIChubiArIDEpOworCQlNUE5fQ09QWSAobjJwLCBucCwgbm4pOworCQluMnBbbm5dID0gMDsKKwkJbm4gKz0gYWRqdXN0OworCSAgICAgIH0KKworCSAgICBpbnZlcnRfcGkxIChkaW52LCBkMnBbZG4gLSAxXSwgZDJwW2RuIC0gMl0pOworCSAgICBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgRENfRElWX1FSX1RIUkVTSE9MRCkpCisJICAgICAgbXBuX3NicGkxX2Rpdl9xciAocXAsIG4ycCwgbm4sIGQycCwgZG4sIGRpbnYuaW52MzIpOworCSAgICBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKGRuLCBNVVBJX0RJVl9RUl9USFJFU0hPTEQpIHx8ICAgLyogZmFzdCBjb25kaXRpb24gKi8KKwkJICAgICBCRUxPV19USFJFU0hPTEQgKG5uLCAyICogTVVfRElWX1FSX1RIUkVTSE9MRCkgfHwgLyogZmFzdCBjb25kaXRpb24gKi8KKwkJICAgICAoZG91YmxlKSAoMiAqIChNVV9ESVZfUVJfVEhSRVNIT0xEIC0gTVVQSV9ESVZfUVJfVEhSRVNIT0xEKSkgKiBkbiAvKiBzbG93Li4uICovCisJCSAgICAgKyAoZG91YmxlKSBNVVBJX0RJVl9RUl9USFJFU0hPTEQgKiBubiA+IChkb3VibGUpIGRuICogbm4pICAgIC8qIC4uLmNvbmRpdGlvbiAqLworCSAgICAgIG1wbl9kY3BpMV9kaXZfcXIgKHFwLCBuMnAsIG5uLCBkMnAsIGRuLCAmZGludik7CisJICAgIGVsc2UKKwkgICAgICB7CisJCW1wX3NpemVfdCBpdGNoID0gbXBuX211X2Rpdl9xcl9pdGNoIChubiwgZG4sIDApOworCQltcF9wdHIgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAoaXRjaCk7CisJCW1wbl9tdV9kaXZfcXIgKHFwLCBycCwgbjJwLCBubiwgZDJwLCBkbiwgc2NyYXRjaCk7CisJCW4ycCA9IHJwOworCSAgICAgIH0KKworCSAgICBpZiAoY250ICE9IDApCisJICAgICAgbXBuX3JzaGlmdCAocnAsIG4ycCwgZG4sIGNudCk7CisJICAgIGVsc2UKKwkgICAgICBNUE5fQ09QWSAocnAsIG4ycCwgZG4pOworCSAgICBUTVBfRlJFRTsKKwkgICAgcmV0dXJuOworCSAgfQorCisJLyogV2hlbiB3ZSBjb21lIGhlcmUsIHRoZSBudW1lcmF0b3IvcGFydGlhbCByZW1haW5kZXIgaXMgbGVzcworCSAgIHRoYW4gdHdpY2UgdGhlIHNpemUgb2YgdGhlIGRlbm9taW5hdG9yLiAgKi8KKworCSAgeworCSAgICAvKiBQcm9ibGVtOgorCisJICAgICAgIERpdmlkZSBhIG51bWVyYXRvciBOIHdpdGggbm4gbGltYnMgYnkgYSBkZW5vbWluYXRvciBEIHdpdGggZG4KKwkgICAgICAgbGltYnMgZm9ybWluZyBhIHF1b3RpZW50IG9mIHFuPW5uLWRuKzEgbGltYnMuICBXaGVuIHFuIGlzIHNtYWxsCisJICAgICAgIGNvbXBhcmVkIHRvIGRuLCBjb252ZW50aW9uYWwgZGl2aXNpb24gYWxnb3JpdGhtcyBwZXJmb3JtIHBvb3JseS4KKwkgICAgICAgV2Ugd2FudCBhbiBhbGdvcml0aG0gdGhhdCBoYXMgYW4gZXhwZWN0ZWQgcnVubmluZyB0aW1lIHRoYXQgaXMKKwkgICAgICAgZGVwZW5kZW50IG9ubHkgb24gcW4uCisKKwkgICAgICAgQWxnb3JpdGhtICh2ZXJ5IGluZm9ybWFsbHkgc3RhdGVkKToKKworCSAgICAgICAxKSBEaXZpZGUgdGhlIDIgeCBxbiBtb3N0IHNpZ25pZmljYW50IGxpbWJzIGZyb20gdGhlIG51bWVyYXRvcgorCQkgIGJ5IHRoZSBxbiBtb3N0IHNpZ25pZmljYW50IGxpbWJzIGZyb20gdGhlIGRlbm9taW5hdG9yLiAgQ2FsbAorCQkgIHRoZSByZXN1bHQgcWVzdC4gIFRoaXMgaXMgZWl0aGVyIHRoZSBjb3JyZWN0IHF1b3RpZW50LCBidXQKKwkJICBtaWdodCBiZSAxIG9yIDIgdG9vIGxhcmdlLiAgQ29tcHV0ZSB0aGUgcmVtYWluZGVyIGZyb20gdGhlCisJCSAgZGl2aXNpb24uICAoVGhpcyBzdGVwIGlzIGltcGxlbWVudGVkIGJ5IGFuIG1wbl9kaXZyZW0gY2FsbC4pCisKKwkgICAgICAgMikgSXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBmcm9tIHRoZSByZW1haW5kZXIgPCBwLCB3aGVyZSBwCisJCSAgaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBmcm9tIHRoZSBxdW90aWVudAorCQkgIGFuZCB0aGUgbmV4dChkKT8gIChOZXh0KGQpIGRlbm90ZXMgdGhlIG5leHQgaWdub3JlZCBsaW1iIGZyb20KKwkJICB0aGUgZGVub21pbmF0b3IuKSAgSWYgaXQgaXMsIGRlY3JlbWVudCBxZXN0LCBhbmQgYWRqdXN0IHRoZQorCQkgIHJlbWFpbmRlciBhY2NvcmRpbmdseS4KKworCSAgICAgICAzKSBJcyB0aGUgcmVtYWluZGVyID49IHFlc3Q/ICBJZiBpdCBpcywgcWVzdCBpcyB0aGUgZGVzaXJlZAorCQkgIHF1b3RpZW50LiAgVGhlIGFsZ29yaXRobSB0ZXJtaW5hdGVzLgorCisJICAgICAgIDQpIFN1YnRyYWN0IHFlc3QgeCBuZXh0KGQpIGZyb20gdGhlIHJlbWFpbmRlci4gIElmIHRoZXJlIGlzCisJCSAgYm9ycm93IG91dCwgZGVjcmVtZW50IHFlc3QsIGFuZCBhZGp1c3QgdGhlIHJlbWFpbmRlcgorCQkgIGFjY29yZGluZ2x5LgorCisJICAgICAgIDUpIFNraXAgb25lIHdvcmQgZnJvbSB0aGUgZGVub21pbmF0b3IgKGkuZS4sIGxldCBuZXh0KGQpIGRlbm90ZQorCQkgIHRoZSBuZXh0IGxlc3Mgc2lnbmlmaWNhbnQgbGltYi4gICovCisKKwkgICAgbXBfc2l6ZV90IHFuOworCSAgICBtcF9wdHIgbjJwLCBkMnA7CisJICAgIG1wX3B0ciB0cDsKKwkgICAgbXBfbGltYl90IGN5OworCSAgICBtcF9zaXplX3QgaW4sIHJuOworCSAgICBtcF9saW1iX3QgcXVvdGllbnRfdG9vX2xhcmdlOworCSAgICB1bnNpZ25lZCBpbnQgY250OworCisJICAgIHFuID0gbm4gLSBkbjsKKwkgICAgcXBbcW5dID0gMDsJCQkJLyogemVybyBoaWdoIHF1b3RpZW50IGxpbWIgKi8KKwkgICAgcW4gKz0gYWRqdXN0OwkJCS8qIHFuIGNhbm5vdCBiZWNvbWUgYmlnZ2VyICovCisKKwkgICAgaWYgKHFuID09IDApCisJICAgICAgeworCQlNUE5fQ09QWSAocnAsIG5wLCBkbik7CisJCVRNUF9GUkVFOworCQlyZXR1cm47CisJICAgICAgfQorCisJICAgIGluID0gZG4gLSBxbjsJCS8qIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGlnbm9yZWQgIyBvZiBsaW1icyBpbiBvcHMgKi8KKwkgICAgLyogTm9ybWFsaXplIGRlbm9taW5hdG9yIGJ5IHNoaWZ0aW5nIGl0IHRvIHRoZSBsZWZ0IHN1Y2ggdGhhdCBpdHMKKwkgICAgICAgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgc2V0LiAgVGhlbiBzaGlmdCB0aGUgbnVtZXJhdG9yIHRoZSBzYW1lCisJICAgICAgIGFtb3VudCwgdG8gbWF0aGVtYXRpY2FsbHkgcHJlc2VydmUgcXVvdGllbnQuICAqLworCSAgICBpZiAoKGRwW2RuIC0gMV0gJiBHTVBfTlVNQl9ISUdIQklUKSA9PSAwKQorCSAgICAgIHsKKwkJY291bnRfbGVhZGluZ196ZXJvcyAoY250LCBkcFtkbiAtIDFdKTsKKwkJY250IC09IEdNUF9OQUlMX0JJVFM7CisKKwkJZDJwID0gVE1QX0FMTE9DX0xJTUJTIChxbik7CisJCW1wbl9sc2hpZnQgKGQycCwgZHAgKyBpbiwgcW4sIGNudCk7CisJCWQycFswXSB8PSBkcFtpbiAtIDFdID4+IChHTVBfTlVNQl9CSVRTIC0gY250KTsKKworCQluMnAgPSBUTVBfQUxMT0NfTElNQlMgKDIgKiBxbiArIDEpOworCQljeSA9IG1wbl9sc2hpZnQgKG4ycCwgbnAgKyBubiAtIDIgKiBxbiwgMiAqIHFuLCBjbnQpOworCQlpZiAoYWRqdXN0KQorCQkgIHsKKwkJICAgIG4ycFsyICogcW5dID0gY3k7CisJCSAgICBuMnArKzsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBuMnBbMF0gfD0gbnBbbm4gLSAyICogcW4gLSAxXSA+PiAoR01QX05VTUJfQklUUyAtIGNudCk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY250ID0gMDsKKwkJZDJwID0gKG1wX3B0cikgZHAgKyBpbjsKKworCQluMnAgPSBUTVBfQUxMT0NfTElNQlMgKDIgKiBxbiArIDEpOworCQlNUE5fQ09QWSAobjJwLCBucCArIG5uIC0gMiAqIHFuLCAyICogcW4pOworCQlpZiAoYWRqdXN0KQorCQkgIHsKKwkJICAgIG4ycFsyICogcW5dID0gMDsKKwkJICAgIG4ycCsrOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgLyogR2V0IGFuIGFwcHJveGltYXRlIHF1b3RpZW50IHVzaW5nIHRoZSBleHRyYWN0ZWQgb3BlcmFuZHMuICAqLworCSAgICBpZiAocW4gPT0gMSkKKwkgICAgICB7CisJCW1wX2xpbWJfdCBxMCwgcjA7CisJCXVkaXZfcXJubmQgKHEwLCByMCwgbjJwWzFdLCBuMnBbMF0gPDwgR01QX05BSUxfQklUUywgZDJwWzBdIDw8IEdNUF9OQUlMX0JJVFMpOworCQluMnBbMF0gPSByMCA+PiBHTVBfTkFJTF9CSVRTOworCQlxcFswXSA9IHEwOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAocW4gPT0gMikKKwkgICAgICBtcG5fZGl2cmVtXzIgKHFwLCAwTCwgbjJwLCA0TCwgZDJwKTsgLyogRklYTUU6IG9ic29sZXRlIGZ1bmN0aW9uICovCisJICAgIGVsc2UKKwkgICAgICB7CisJCWludmVydF9waTEgKGRpbnYsIGQycFtxbiAtIDFdLCBkMnBbcW4gLSAyXSk7CisJCWlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBEQ19ESVZfUVJfVEhSRVNIT0xEKSkKKwkJICBtcG5fc2JwaTFfZGl2X3FyIChxcCwgbjJwLCAyICogcW4sIGQycCwgcW4sIGRpbnYuaW52MzIpOworCQllbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKHFuLCBNVV9ESVZfUVJfVEhSRVNIT0xEKSkKKwkJICBtcG5fZGNwaTFfZGl2X3FyIChxcCwgbjJwLCAyICogcW4sIGQycCwgcW4sICZkaW52KTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIG1wX3NpemVfdCBpdGNoID0gbXBuX211X2Rpdl9xcl9pdGNoICgyICogcW4sIHFuLCAwKTsKKwkJICAgIG1wX3B0ciBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTIChpdGNoKTsKKwkJICAgIG1wX3B0ciByMnAgPSBycDsKKwkJICAgIGlmIChucCA9PSByMnApCS8qIElmIE4gYW5kIFIgc2hhcmUgc3BhY2UsIHB1dCAuLi4gKi8KKwkJICAgICAgcjJwICs9IG5uIC0gcW47CS8qIGludGVybWVkaWF0ZSByZW1haW5kZXIgYXQgTidzIHVwcGVyIGVuZC4gKi8KKwkJICAgIG1wbl9tdV9kaXZfcXIgKHFwLCByMnAsIG4ycCwgMiAqIHFuLCBkMnAsIHFuLCBzY3JhdGNoKTsKKwkJICAgIE1QTl9DT1BZIChuMnAsIHIycCwgcW4pOworCQkgIH0KKwkgICAgICB9CisKKwkgICAgcm4gPSBxbjsKKwkgICAgLyogTXVsdGlwbHkgdGhlIGZpcnN0IGlnbm9yZWQgZGl2aXNvciBsaW1iIGJ5IHRoZSBtb3N0IHNpZ25pZmljYW50CisJICAgICAgIHF1b3RpZW50IGxpbWIuICBJZiB0aGF0IHByb2R1Y3QgaXMgPiB0aGUgcGFydGlhbCByZW1haW5kZXIncworCSAgICAgICBtb3N0IHNpZ25pZmljYW50IGxpbWIsIHdlIGtub3cgdGhlIHF1b3RpZW50IGlzIHRvbyBsYXJnZS4gIFRoaXMKKwkgICAgICAgdGVzdCBxdWlja2x5IGNhdGNoZXMgbW9zdCBjYXNlcyB3aGVyZSB0aGUgcXVvdGllbnQgaXMgdG9vIGxhcmdlOworCSAgICAgICBpdCBjYXRjaGVzIGFsbCBjYXNlcyB3aGVyZSB0aGUgcXVvdGllbnQgaXMgMiB0b28gbGFyZ2UuICAqLworCSAgICB7CisJICAgICAgbXBfbGltYl90IGRsLCB4OworCSAgICAgIG1wX2xpbWJfdCBoLCBkdW1teTsKKworCSAgICAgIGlmIChpbiAtIDIgPCAwKQorCQlkbCA9IDA7CisJICAgICAgZWxzZQorCQlkbCA9IGRwW2luIC0gMl07CisKKyNpZiBHTVBfTkFJTF9CSVRTID09IDAKKwkgICAgICB4ID0gKGRwW2luIC0gMV0gPDwgY250KSB8ICgoZGwgPj4gMSkgPj4gKCh+Y250KSAlIEdNUF9MSU1CX0JJVFMpKTsKKyNlbHNlCisJICAgICAgeCA9IChkcFtpbiAtIDFdIDw8IGNudCkgJiBHTVBfTlVNQl9NQVNLOworCSAgICAgIGlmIChjbnQgIT0gMCkKKwkJeCB8PSBkbCA+PiAoR01QX05VTUJfQklUUyAtIGNudCk7CisjZW5kaWYKKwkgICAgICB1bXVsX3BwbW0gKGgsIGR1bW15LCB4LCBxcFtxbiAtIDFdIDw8IEdNUF9OQUlMX0JJVFMpOworCisJICAgICAgaWYgKG4ycFtxbiAtIDFdIDwgaCkKKwkJeworCQkgIG1wX2xpbWJfdCBjeTsKKworCQkgIG1wbl9kZWNyX3UgKHFwLCAobXBfbGltYl90KSAxKTsKKwkJICBjeSA9IG1wbl9hZGRfbiAobjJwLCBuMnAsIGQycCwgcW4pOworCQkgIGlmIChjeSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIHBhcnRpYWwgcmVtYWluZGVyIGlzIHNhZmVseSBsYXJnZS4gICovCisJCSAgICAgIG4ycFtxbl0gPSBjeTsKKwkJICAgICAgKytybjsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgcXVvdGllbnRfdG9vX2xhcmdlID0gMDsKKwkgICAgaWYgKGNudCAhPSAwKQorCSAgICAgIHsKKwkJbXBfbGltYl90IGN5MSwgY3kyOworCisJCS8qIEFwcGVuZCBwYXJ0aWFsbHkgdXNlZCBudW1lcmF0b3IgbGltYiB0byBwYXJ0aWFsIHJlbWFpbmRlci4gICovCisJCWN5MSA9IG1wbl9sc2hpZnQgKG4ycCwgbjJwLCBybiwgR01QX05VTUJfQklUUyAtIGNudCk7CisJCW4ycFswXSB8PSBucFtpbiAtIDFdICYgKEdNUF9OVU1CX01BU0sgPj4gY250KTsKKworCQkvKiBVcGRhdGUgcGFydGlhbCByZW1haW5kZXIgd2l0aCBwYXJ0aWFsbHkgdXNlZCBkaXZpc29yIGxpbWIuICAqLworCQljeTIgPSBtcG5fc3VibXVsXzEgKG4ycCwgcXAsIHFuLCBkcFtpbiAtIDFdICYgKEdNUF9OVU1CX01BU0sgPj4gY250KSk7CisJCWlmIChxbiAhPSBybikKKwkJICB7CisJCSAgICBBU1NFUlRfQUxXQVlTIChuMnBbcW5dID49IGN5Mik7CisJCSAgICBuMnBbcW5dIC09IGN5MjsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBuMnBbcW5dID0gY3kxIC0gY3kyOyAvKiAmIEdNUF9OVU1CX01BU0s7ICovCisKKwkJICAgIHF1b3RpZW50X3Rvb19sYXJnZSA9IChjeTEgPCBjeTIpOworCQkgICAgKytybjsKKwkJICB9CisJCS0taW47CisJICAgICAgfQorCSAgICAvKiBUcnVlOiBwYXJ0aWFsIHJlbWFpbmRlciBub3cgaXMgbmV1dHJhbCwgaS5lLiwgaXQgaXMgbm90IHNoaWZ0ZWQgdXAuICAqLworCisJICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChkbik7CisKKwkgICAgaWYgKGluIDwgcW4pCisJICAgICAgeworCQlpZiAoaW4gPT0gMCkKKwkJICB7CisJCSAgICBNUE5fQ09QWSAocnAsIG4ycCwgcm4pOworCQkgICAgQVNTRVJUX0FMV0FZUyAocm4gPT0gZG4pOworCQkgICAgZ290byBmb287CisJCSAgfQorCQltcG5fbXVsICh0cCwgcXAsIHFuLCBkcCwgaW4pOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIG1wbl9tdWwgKHRwLCBkcCwgaW4sIHFwLCBxbik7CisKKwkgICAgY3kgPSBtcG5fc3ViIChuMnAsIG4ycCwgcm4sIHRwICsgaW4sIHFuKTsKKwkgICAgTVBOX0NPUFkgKHJwICsgaW4sIG4ycCwgZG4gLSBpbik7CisJICAgIHF1b3RpZW50X3Rvb19sYXJnZSB8PSBjeTsKKwkgICAgY3kgPSBtcG5fc3ViX24gKHJwLCBucCwgdHAsIGluKTsKKwkgICAgY3kgPSBtcG5fc3ViXzEgKHJwICsgaW4sIHJwICsgaW4sIHJuLCBjeSk7CisJICAgIHF1b3RpZW50X3Rvb19sYXJnZSB8PSBjeTsKKwkgIGZvbzoKKwkgICAgaWYgKHF1b3RpZW50X3Rvb19sYXJnZSkKKwkgICAgICB7CisJCW1wbl9kZWNyX3UgKHFwLCAobXBfbGltYl90KSAxKTsKKwkJbXBuX2FkZF9uIChycCwgcnAsIGRwLCBkbik7CisJICAgICAgfQorCSAgfQorCVRNUF9GUkVFOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tMjJfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tMjJfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NjAxNAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb20yMl9tdWwuYwpAQCAtMCwwICsxLDIyMiBAQAorLyogbXBuX3Rvb20yMl9tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiA+PSBibi4gIE9yIG1vcmUKKyAgIGFjY3VyYXRlbHksIGJuIDw9IGFuIDwgMmJuLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYtMjAxMCwgMjAxMiwgMjAxNCwgMjAxOCwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRXZhbHVhdGUgaW46IC0xLCAwLCAraW5mCisKKyAgPC1zLS0+PC0tbi0tPgorICAgX19fXyBfX19fX18KKyAgfF9hMV98X19fYTBffAorICAgfGIxX3xfX19iMF98CisgICA8LXQtPjwtLW4tLT4KKworICB2MCAgPSAgYTAgICAgICogYjAgICAgICAgIyAgIEEoMCkqQigwKQorICB2bTEgPSAoYTAtIGExKSooYjAtIGIxKSAgIyAgQSgtMSkqQigtMSkKKyAgdmluZj0gICAgICBhMSAqICAgICBiMSAgICMgQShpbmYpKkIoaW5mKQorKi8KKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRCB8fCBXQU5UX0ZBVF9CSU5BUlkKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb20yMiAgIDEKKyNlbHNlCisjZGVmaW5lIE1BWUJFX211bF90b29tMjIJCQkJCQlcCisgIChNVUxfVE9PTTMzX1RIUkVTSE9MRCA+PSAyICogTVVMX1RPT00yMl9USFJFU0hPTEQpCisjZW5kaWYKKworI2RlZmluZSBUT09NMjJfTVVMX05fUkVDKHAsIGEsIGIsIG4sIHdzKQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKCEgTUFZQkVfbXVsX3Rvb20yMgkJCQkJCVwKKwl8fCBCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NMjJfVEhSRVNIT0xEKSkJCQlcCisgICAgICBtcG5fbXVsX2Jhc2VjYXNlIChwLCBhLCBuLCBiLCBuKTsJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBtcG5fdG9vbTIyX211bCAocCwgYSwgbiwgYiwgbiwgd3MpOwkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIE5vcm1hbGx5LCB0aGlzIGNhbGxzIG11bF9iYXNlY2FzZSBvciB0b29tMjJfbXVsLiAgQnV0IHdoZW4gd2hlbiB0aGUgZnJhY3Rpb24KKyAgIE1VTF9UT09NMzNfVEhSRVNIT0xEIC8gTVVMX1RPT00yMl9USFJFU0hPTEQgaXMgbGFyZ2UsIGFuIGluaXRpYWxseSBzbWFsbAorICAgcmVsYXRpdmUgdW5iYWxhbmNlIHdpbGwgYmVjb21lIGEgbGFyZ2VyIGFuZCBsYXJnZXIgcmVsYXRpdmUgdW5iYWxhbmNlIHdpdGgKKyAgIGVhY2ggcmVjdXJzaW9uICh0aGUgZGlmZmVyZW5jZSBzLXQgd2lsbCBiZSBpbnZhcmlhbnQgb3ZlciByZWN1cnNpdmUgY2FsbHMpLgorICAgVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNhbGwgdG9vbTMyX211bC4gIEZJWE1FOiBTdXBwcmVzcyBkZXBlbmRpbmcgb24KKyAgIE1VTF9UT09NMzNfVEhSRVNIT0xEIC8gTVVMX1RPT00yMl9USFJFU0hPTEQgYW5kIG9uIE1VTF9UT09NMjJfVEhSRVNIT0xELiAgKi8KKyNkZWZpbmUgVE9PTTIyX01VTF9SRUMocCwgYSwgYW4sIGIsIGJuLCB3cykJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmICghIE1BWUJFX211bF90b29tMjIJCQkJCQlcCisJfHwgQkVMT1dfVEhSRVNIT0xEIChibiwgTVVMX1RPT00yMl9USFJFU0hPTEQpKQkJCVwKKyAgICAgIG1wbl9tdWxfYmFzZWNhc2UgKHAsIGEsIGFuLCBiLCBibik7CQkJCVwKKyAgICBlbHNlIGlmICg0ICogYW4gPCA1ICogYm4pCQkJCQkJXAorICAgICAgbXBuX3Rvb20yMl9tdWwgKHAsIGEsIGFuLCBiLCBibiwgd3MpOwkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgbXBuX3Rvb20zMl9tdWwgKHAsIGEsIGFuLCBiLCBibiwgd3MpOwkJCQlcCisgIH0gd2hpbGUgKDApCisKK3ZvaWQKK21wbl90b29tMjJfbXVsIChtcF9wdHIgcHAsCisJCW1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQltcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwKKwkJbXBfcHRyIHNjcmF0Y2gpCit7CisgIGNvbnN0IGludCBfX2dtcG5fY3B1dmVjX2luaXRpYWxpemVkID0gMTsKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIGludCB2bTFfbmVnOworICBtcF9saW1iX3QgY3ksIGN5MjsKKyAgbXBfcHRyIGFzbTE7CisgIG1wX3B0ciBic20xOworCisjZGVmaW5lIGEwICBhcAorI2RlZmluZSBhMSAgKGFwICsgbikKKyNkZWZpbmUgYjAgIGJwCisjZGVmaW5lIGIxICAoYnAgKyBuKQorCisgIHMgPSBhbiA+PiAxOworICBuID0gYW4gLSBzOworICB0ID0gYm4gLSBuOworCisgIEFTU0VSVCAoYW4gPj0gYm4pOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuICYmIChuIC0gcykgPT0gKGFuICYgMSkpOworICBBU1NFUlQgKDAgPCB0ICYmIHQgPD0gcyk7CisKKyAgYXNtMSA9IHBwOworICBic20xID0gcHAgKyBuOworCisgIHZtMV9uZWcgPSAwOworCisgIC8qIENvbXB1dGUgYXNtMS4gICovCisgIGlmICgoYW4gJiAxKSA9PSAwKSAvKiBzID09IG4gKi8KKyAgICB7CisgICAgICBpZiAobXBuX2NtcCAoYTAsIGExLCBuKSA8IDApCisJeworCSAgbXBuX3N1Yl9uIChhc20xLCBhMSwgYTAsIG4pOworCSAgdm0xX25lZyA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wbl9zdWJfbiAoYXNtMSwgYTAsIGExLCBuKTsKKwl9CisgICAgfQorICBlbHNlIC8qIG4gLSBzID09IDEgKi8KKyAgICB7CisgICAgICBpZiAoYTBbc10gPT0gMCAmJiBtcG5fY21wIChhMCwgYTEsIHMpIDwgMCkKKwl7CisJICBtcG5fc3ViX24gKGFzbTEsIGExLCBhMCwgcyk7CisJICBhc20xW3NdID0gMDsKKwkgIHZtMV9uZWcgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhc20xW3NdID0gYTBbc10gLSBtcG5fc3ViX24gKGFzbTEsIGEwLCBhMSwgcyk7CisJfQorICAgIH0KKworICAvKiBDb21wdXRlIGJzbTEuICAqLworICBpZiAodCA9PSBuKQorICAgIHsKKyAgICAgIGlmIChtcG5fY21wIChiMCwgYjEsIG4pIDwgMCkKKwl7CisJICBtcG5fc3ViX24gKGJzbTEsIGIxLCBiMCwgbik7CisJICB2bTFfbmVnIF49IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjAsIGIxLCBuKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG1wbl96ZXJvX3AgKGIwICsgdCwgbiAtIHQpICYmIG1wbl9jbXAgKGIwLCBiMSwgdCkgPCAwKQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGIwLCB0KTsKKwkgIE1QTl9aRVJPIChic20xICsgdCwgbiAtIHQpOworCSAgdm0xX25lZyBePSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcG5fc3ViIChic20xLCBiMCwgbiwgYjEsIHQpOworCX0KKyAgICB9CisKKyNkZWZpbmUgdjAJcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdmluZgkocHAgKyAyICogbikJCQkvKiBzK3QgKi8KKyNkZWZpbmUgdm0xCXNjcmF0Y2gJCQkJLyogMm4gKi8KKyNkZWZpbmUgc2NyYXRjaF9vdXQJc2NyYXRjaCArIDIgKiBuCisKKyAgLyogdm0xLCAybiBsaW1icyAqLworICBUT09NMjJfTVVMX05fUkVDICh2bTEsIGFzbTEsIGJzbTEsIG4sIHNjcmF0Y2hfb3V0KTsKKworICBpZiAocyA+IHQpICBUT09NMjJfTVVMX1JFQyAodmluZiwgYTEsIHMsIGIxLCB0LCBzY3JhdGNoX291dCk7CisgIGVsc2UgICAgICAgIFRPT00yMl9NVUxfTl9SRUMgKHZpbmYsIGExLCBiMSwgcywgc2NyYXRjaF9vdXQpOworCisgIC8qIHYwLCAybiBsaW1icyAqLworICBUT09NMjJfTVVMX05fUkVDICh2MCwgYXAsIGJwLCBuLCBzY3JhdGNoX291dCk7CisKKyAgLyogSCh2MCkgKyBMKHZpbmYpICovCisgIGN5ID0gbXBuX2FkZF9uIChwcCArIDIgKiBuLCB2MCArIG4sIHZpbmYsIG4pOworCisgIC8qIEwodjApICsgKEgodjApICsgTCh2aW5mKSkgKi8KKyAgY3kyID0gY3kgKyBtcG5fYWRkX24gKHBwICsgbiwgcHAgKyAyICogbiwgdjAsIG4pOworCisgIC8qIChIKHYwKSArIEwodmluZikpICsgSCh2aW5mKSAqLworICBjeSArPSBtcG5fYWRkIChwcCArIDIgKiBuLCBwcCArIDIgKiBuLCBuLCB2aW5mICsgbiwgcyArIHQgLSBuKTsKKworICBpZiAodm0xX25lZykKKyAgICBjeSArPSBtcG5fYWRkX24gKHBwICsgbiwgcHAgKyBuLCB2bTEsIDIgKiBuKTsKKyAgZWxzZSB7CisgICAgY3kgLT0gbXBuX3N1Yl9uIChwcCArIG4sIHBwICsgbiwgdm0xLCAyICogbik7CisgICAgaWYgKFVOTElLRUxZIChjeSArIDEgPT0gMCkpIHsgLyogY3kgaXMgbmVnYXRpdmUgKi8KKyAgICAgIC8qIFRoZSB0b3RhbCBjb250cmlidXRpb24gb2YgdjArdmluZi12bTEgY2FuIG5vdCBiZSBuZWdhdGl2ZS4gKi8KKyNpZiBXQU5UX0FTU0VSVAorICAgICAgLyogVGhlIGJvcnJvdyBpbiBjeSBzdG9wcyB0aGUgcHJvcGFnYXRpb24gb2YgdGhlIGNhcnJ5IGN5MiwgKi8KKyAgICAgIEFTU0VSVCAoY3kyID09IDEpOworICAgICAgY3kgKz0gbXBuX2FkZF8xIChwcCArIDIgKiBuLCBwcCArIDIgKiBuLCBuLCBjeTIpOworICAgICAgQVNTRVJUIChjeSA9PSAwKTsKKyNlbHNlCisgICAgICAvKiB3ZSBzaW1wbHkgZmlsbCB0aGUgYXJlYSB3aXRoIHplcm9zLiAqLworICAgICAgTVBOX0ZJTEwgKHBwICsgMiAqIG4sIG4sIDApOworICAgICAgLyogQVNTRVJUIChzICsgdCA9PSBuIHx8IG1wbl96ZXJvX3AgKHBwICsgMyAqIG4sIHMgKyB0IC0gbikpOyAqLworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgQVNTRVJUIChjeSAgPD0gMik7CisgIEFTU0VSVCAoY3kyIDw9IDIpOworCisgIE1QTl9JTkNSX1UgKHBwICsgMiAqIG4sIHMgKyB0LCBjeTIpOworICAvKiBpZiBzK3Q9PW4sIGN5IGlzIHplcm8sIGJ1dCB3ZSBzaG91bGQgbm90IGFjY2VzcyBwcFszKm5dIGF0IGFsbC4gKi8KKyAgTVBOX0lOQ1JfVSAocHAgKyAzICogbiwgcyArIHQgLSBuLCBjeSk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tMl9zcXIuYyBiL21wbi9nZW5lcmljL3Rvb20yX3Nxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2E4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tMl9zcXIuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogbXBuX3Rvb20yX3NxciAtLSBTcXVhcmUge2FwLGFufS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA2LTIwMTAsIDIwMTIsIDIwMTQsIDIwMTgsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIEV2YWx1YXRlIGluOiAtMSwgMCwgK2luZgorCisgIDwtcy0tPjwtLW4tLT4KKyAgIF9fX18gX19fX19fCisgIHxfYTFffF9fX2EwX3wKKworICB2MCAgPSAgYTAgICAgIF4yICAjICAgQSgwKV4yCisgIHZtMSA9IChhMC0gYTEpXjIgICMgIEEoLTEpXjIKKyAgdmluZj0gICAgICBhMSBeMiAgIyBBKGluZileMgorKi8KKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRCB8fCBXQU5UX0ZBVF9CSU5BUlkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20yICAgMQorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20yCQkJCQkJCVwKKyAgKFNRUl9UT09NM19USFJFU0hPTEQgPj0gMiAqIFNRUl9UT09NMl9USFJFU0hPTEQpCisjZW5kaWYKKworI2RlZmluZSBUT09NMl9TUVJfUkVDKHAsIGEsIG4sIHdzKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmICghIE1BWUJFX3Nxcl90b29tMgkJCQkJCVwKKwl8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NMl9USFJFU0hPTEQpKQkJCVwKKyAgICAgIG1wbl9zcXJfYmFzZWNhc2UgKHAsIGEsIG4pOwkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIG1wbl90b29tMl9zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKwordm9pZAorbXBuX3Rvb20yX3NxciAobXBfcHRyIHBwLAorCSAgICAgICBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwKKwkgICAgICAgbXBfcHRyIHNjcmF0Y2gpCit7CisgIGNvbnN0IGludCBfX2dtcG5fY3B1dmVjX2luaXRpYWxpemVkID0gMTsKKyAgbXBfc2l6ZV90IG4sIHM7CisgIG1wX2xpbWJfdCBjeSwgY3kyOworICBtcF9wdHIgYXNtMTsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisKKyAgcyA9IGFuID4+IDE7CisgIG4gPSBhbiAtIHM7CisKKyAgQVNTRVJUICgwIDwgcyAmJiBzIDw9IG4gJiYgKG4gLSBzKSA9PSAoYW4gJiAxKSk7CisKKyAgYXNtMSA9IHBwOworCisgIC8qIENvbXB1dGUgYXNtMS4gICovCisgIGlmICgoYW4gJiAxKSA9PSAwKSAvKiBzID09IG4gKi8KKyAgICB7CisgICAgICBpZiAobXBuX2NtcCAoYTAsIGExLCBuKSA8IDApCisJeworCSAgbXBuX3N1Yl9uIChhc20xLCBhMSwgYTAsIG4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcG5fc3ViX24gKGFzbTEsIGEwLCBhMSwgbik7CisJfQorICAgIH0KKyAgZWxzZSAvKiBuIC0gcyA9PSAxICovCisgICAgeworICAgICAgaWYgKGEwW3NdID09IDAgJiYgbXBuX2NtcCAoYTAsIGExLCBzKSA8IDApCisJeworCSAgbXBuX3N1Yl9uIChhc20xLCBhMSwgYTAsIHMpOworCSAgYXNtMVtzXSA9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFzbTFbc10gPSBhMFtzXSAtIG1wbl9zdWJfbiAoYXNtMSwgYTAsIGExLCBzKTsKKwl9CisgICAgfQorCisjZGVmaW5lIHYwCXBwCQkJCS8qIDJuICovCisjZGVmaW5lIHZpbmYJKHBwICsgMiAqIG4pCQkJLyogcytzICovCisjZGVmaW5lIHZtMQlzY3JhdGNoCQkJCS8qIDJuICovCisjZGVmaW5lIHNjcmF0Y2hfb3V0CXNjcmF0Y2ggKyAyICogbgorCisgIC8qIHZtMSwgMm4gbGltYnMgKi8KKyAgVE9PTTJfU1FSX1JFQyAodm0xLCBhc20xLCBuLCBzY3JhdGNoX291dCk7CisKKyAgLyogdmluZiwgcytzIGxpbWJzICovCisgIFRPT00yX1NRUl9SRUMgKHZpbmYsIGExLCBzLCBzY3JhdGNoX291dCk7CisKKyAgLyogdjAsIDJuIGxpbWJzICovCisgIFRPT00yX1NRUl9SRUMgKHYwLCBhcCwgbiwgc2NyYXRjaF9vdXQpOworCisgIC8qIEgodjApICsgTCh2aW5mKSAqLworICBjeSA9IG1wbl9hZGRfbiAocHAgKyAyICogbiwgdjAgKyBuLCB2aW5mLCBuKTsKKworICAvKiBMKHYwKSArIEgodjApICovCisgIGN5MiA9IGN5ICsgbXBuX2FkZF9uIChwcCArIG4sIHBwICsgMiAqIG4sIHYwLCBuKTsKKworICAvKiBMKHZpbmYpICsgSCh2aW5mKSAqLworICBjeSArPSBtcG5fYWRkIChwcCArIDIgKiBuLCBwcCArIDIgKiBuLCBuLCB2aW5mICsgbiwgcyArIHMgLSBuKTsKKworICBjeSAtPSBtcG5fc3ViX24gKHBwICsgbiwgcHAgKyBuLCB2bTEsIDIgKiBuKTsKKworICBBU1NFUlQgKGN5ICsgMSA8PSAzKTsKKyAgQVNTRVJUIChjeTIgPD0gMik7CisKKyAgaWYgKExJS0VMWSAoY3kgPD0gMikpIHsKKyAgICBNUE5fSU5DUl9VIChwcCArIDIgKiBuLCBzICsgcywgY3kyKTsKKyAgICBNUE5fSU5DUl9VIChwcCArIDMgKiBuLCBzICsgcyAtIG4sIGN5KTsKKyAgfSBlbHNlIHsgLyogY3kgaXMgbmVnYXRpdmUgKi8KKyAgICAvKiBUaGUgdG90YWwgY29udHJpYnV0aW9uIG9mIHYwK3ZpbmYtdm0xIGNhbiBub3QgYmUgbmVnYXRpdmUuICovCisjaWYgV0FOVF9BU1NFUlQKKyAgICAvKiBUaGUgYm9ycm93IGluIGN5IHN0b3BzIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGUgY2FycnkgY3kyLCAqLworICAgIEFTU0VSVCAoY3kyID09IDEpOworICAgIGN5ICs9IG1wbl9hZGRfMSAocHAgKyAyICogbiwgcHAgKyAyICogbiwgbiwgY3kyKTsKKyAgICBBU1NFUlQgKGN5ID09IDApOworI2Vsc2UKKyAgICAvKiB3ZSBzaW1wbHkgZmlsbCB0aGUgYXJlYSB3aXRoIHplcm9zLiAqLworICAgIE1QTl9GSUxMIChwcCArIDIgKiBuLCBuLCAwKTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tMzJfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tMzJfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzOWQxNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb20zMl9tdWwuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogbXBuX3Rvb20zMl9tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiBpcyBub21pbmFsbHkgMS41CisgICB0aW1lcyBhcyBsYXJnZSBhcyBibi4gIE9yIG1vcmUgYWNjdXJhdGVseSwgYm4gPCBhbiA8IDNibi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorICAgSW1wcm92ZW1lbnRzIGJ5IE1hcmNvIEJvZHJhdG8gYW5kIE5pZWxzIE3DtmxsZXIuCisKKyAgIFRoZSBpZGVhIG9mIGFwcGx5aW5nIFRvb20gdG8gdW5iYWxhbmNlZCBtdWx0aXBsaWNhdGlvbiBpcyBkdWUgdG8gTWFyY28KKyAgIEJvZHJhdG8gYW5kIEFsYmVydG8gWmFub25pLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA2LTIwMTAsIDIwMjAsIDIwMjEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKy8qIEV2YWx1YXRlIGluOiAtMSwgMCwgKzEsICtpbmYKKworICA8LXMtPjwtLW4tLT48LS1uLS0+CisgICBfX18gX19fX19fIF9fX19fXworICB8YTJffF9fX2ExX3xfX19hMF98CisJfF9iMV98X19fYjBffAorCTwtdC0tPjwtLW4tLT4KKworICB2MCAgPSAgYTAgICAgICAgICAqIGIwICAgICAgIyAgIEEoMCkqQigwKQorICB2MSAgPSAoYTArIGExKyBhMikqKGIwKyBiMSkgIyAgIEEoMSkqQigxKSAgICAgIGFoICA8PSAyICBiaCA8PSAxCisgIHZtMSA9IChhMC0gYTErIGEyKSooYjAtIGIxKSAjICBBKC0xKSpCKC0xKSAgICB8YWh8IDw9IDEgIGJoID0gMAorICB2aW5mPSAgICAgICAgICBhMiAqICAgICBiMSAgIyBBKGluZikqQihpbmYpCisqLworCisjZGVmaW5lIFRPT00zMl9NVUxfTl9SRUMocCwgYSwgYiwgbiwgd3MpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcG5fbXVsX24gKHAsIGEsIGIsIG4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKwordm9pZAorbXBuX3Rvb20zMl9tdWwgKG1wX3B0ciBwcCwKKwkJbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCW1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLAorCQltcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIGludCB2bTFfbmVnOworICBtcF9saW1iX3QgY3k7CisgIG1wX2xpbWJfc2lnbmVkX3QgaGk7CisgIG1wX2xpbWJfdCBhcDFfaGksIGJwMV9oaTsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisjZGVmaW5lIGEyICAoYXAgKyAyICogbikKKyNkZWZpbmUgYjAgIGJwCisjZGVmaW5lIGIxICAoYnAgKyBuKQorCisgIC8qIFJlcXVpcmVkLCB0byBlbnN1cmUgdGhhdCBzICsgdCA+PSBuLiAqLworICBBU1NFUlQgKGJuICsgMiA8PSBhbiAmJiBhbiArIDYgPD0gMypibik7CisKKyAgbiA9IDIgKiBhbiA+PSAzICogYm4gPyAoYW4gKyAyKSAvIChzaXplX3QpIDMgOiAoYm4gKyAxKSA+PiAxOworCisgIHMgPSBhbiAtIDIgKiBuOworICB0ID0gYm4gLSBuOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworICBBU1NFUlQgKHMgKyB0ID49IG4pOworCisgIC8qIFByb2R1Y3QgYXJlYSBvZiBzaXplIGFuICsgYm4gPSAzKm4gKyBzICsgdCA+PSA0Km4gKyAyLiAqLworI2RlZmluZSBhcDEgKHBwKQkJLyogbiwgbW9zdCBzaWduaWZpY2FudCBsaW1iIGluIGFwMV9oaSAqLworI2RlZmluZSBicDEgKHBwICsgbikJCS8qIG4sIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIGJwMV9oaSAqLworI2RlZmluZSBhbTEgKHBwICsgMipuKQkJLyogbiwgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gaGkgKi8KKyNkZWZpbmUgYm0xIChwcCArIDMqbikJCS8qIG4gKi8KKyNkZWZpbmUgdjEgKHNjcmF0Y2gpCQkvKiAybiArIDEgKi8KKyNkZWZpbmUgdm0xIChwcCkJCS8qIDJuICsgMSAqLworI2RlZmluZSBzY3JhdGNoX291dCAoc2NyYXRjaCArIDIqbiArIDEpIC8qIEN1cnJlbnRseSB1bnVzZWQuICovCisKKyAgLyogU2NyYXRjaCBuZWVkOiAyKm4gKyAxICsgc2NyYXRjaCBmb3IgdGhlIHJlY3Vyc2l2ZSBtdWx0aXBsaWNhdGlvbnMuICovCisKKyAgLyogRklYTUU6IEtlZXAgdjFbMipuXSBhbmQgdm0xWzIqbl0gaW4gc2NhbGFyIHZhcmlhYmxlcz8gKi8KKworICAvKiBDb21wdXRlIGFwMSA9IGEwICsgYTEgKyBhMiwgYW0xID0gYTAgLSBhMSArIGEyICovCisgIGFwMV9oaSA9IG1wbl9hZGQgKGFwMSwgYTAsIG4sIGEyLCBzKTsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKGFwMV9oaSA9PSAwICYmIG1wbl9jbXAgKGFwMSwgYTEsIG4pIDwgMCkKKyAgICB7CisgICAgICBhcDFfaGkgPSBtcG5fYWRkX25fc3ViX24gKGFwMSwgYW0xLCBhMSwgYXAxLCBuKSA+PiAxOworICAgICAgaGkgPSAwOworICAgICAgdm0xX25lZyA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX25fc3ViX24gKGFwMSwgYW0xLCBhcDEsIGExLCBuKTsKKyAgICAgIGhpID0gYXAxX2hpIC0gKGN5ICYgMSk7CisgICAgICBhcDFfaGkgKz0gKGN5ID4+IDEpOworICAgICAgdm0xX25lZyA9IDA7CisgICAgfQorI2Vsc2UKKyAgaWYgKGFwMV9oaSA9PSAwICYmIG1wbl9jbXAgKGFwMSwgYTEsIG4pIDwgMCkKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChhbTEsIGExLCBhcDEsIG4pKTsKKyAgICAgIGhpID0gMDsKKyAgICAgIHZtMV9uZWcgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhpID0gYXAxX2hpIC0gbXBuX3N1Yl9uIChhbTEsIGFwMSwgYTEsIG4pOworICAgICAgdm0xX25lZyA9IDA7CisgICAgfQorICBhcDFfaGkgKz0gbXBuX2FkZF9uIChhcDEsIGFwMSwgYTEsIG4pOworI2VuZGlmCisKKyAgLyogQ29tcHV0ZSBicDEgPSBiMCArIGIxIGFuZCBibTEgPSBiMCAtIGIxLiAqLworICBpZiAodCA9PSBuKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgICAgIGlmIChtcG5fY21wIChiMCwgYjEsIG4pIDwgMCkKKwl7CisJICBjeSA9IG1wbl9hZGRfbl9zdWJfbiAoYnAxLCBibTEsIGIxLCBiMCwgbik7CisJICB2bTFfbmVnIF49IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChicDEsIGJtMSwgYjAsIGIxLCBuKTsKKwl9CisgICAgICBicDFfaGkgPSBjeSA+PiAxOworI2Vsc2UKKyAgICAgIGJwMV9oaSA9IG1wbl9hZGRfbiAoYnAxLCBiMCwgYjEsIG4pOworCisgICAgICBpZiAobXBuX2NtcCAoYjAsIGIxLCBuKSA8IDApCisJeworCSAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAoYm0xLCBiMSwgYjAsIG4pKTsKKwkgIHZtMV9uZWcgXj0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAoYm0xLCBiMCwgYjEsIG4pKTsKKwl9CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGSVhNRTogU2hvdWxkIHN0aWxsIHVzZSBtcG5fYWRkX25fc3ViX24gZm9yIHRoZSBtYWluIHBhcnQuICovCisgICAgICBicDFfaGkgPSBtcG5fYWRkIChicDEsIGIwLCBuLCBiMSwgdCk7CisKKyAgICAgIGlmIChtcG5femVyb19wIChiMCArIHQsIG4gLSB0KSAmJiBtcG5fY21wIChiMCwgYjEsIHQpIDwgMCkKKwl7CisJICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChibTEsIGIxLCBiMCwgdCkpOworCSAgTVBOX1pFUk8gKGJtMSArIHQsIG4gLSB0KTsKKwkgIHZtMV9uZWcgXj0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWIgKGJtMSwgYjAsIG4sIGIxLCB0KSk7CisJfQorICAgIH0KKworICBUT09NMzJfTVVMX05fUkVDICh2MSwgYXAxLCBicDEsIG4sIHNjcmF0Y2hfb3V0KTsKKyAgaWYgKGFwMV9oaSA9PSAxKQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uICh2MSArIG4sIHYxICsgbiwgYnAxLCBuKTsKKyAgICB9CisgIGVsc2UgaWYgKGFwMV9oaSA+IDEpIC8qIGFwMV9oaSA9PSAyICovCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxCisgICAgICBjeSA9IG1wbl9hZGRsc2gxX25faXAxICh2MSArIG4sIGJwMSwgbik7CisjZWxzZQorICAgICAgY3kgPSBtcG5fYWRkbXVsXzEgKHYxICsgbiwgYnAxLCBuLCBDTlNUX0xJTUIoMikpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgY3kgPSAwOworICBpZiAoYnAxX2hpICE9IDApCisgICAgY3kgKz0gYXAxX2hpICsgbXBuX2FkZF9uICh2MSArIG4sIHYxICsgbiwgYXAxLCBuKTsKKyAgdjFbMiAqIG5dID0gY3k7CisKKyAgVE9PTTMyX01VTF9OX1JFQyAodm0xLCBhbTEsIGJtMSwgbiwgc2NyYXRjaF9vdXQpOworICBpZiAoaGkpCisgICAgaGkgPSBtcG5fYWRkX24gKHZtMStuLCB2bTErbiwgYm0xLCBuKTsKKworICB2bTFbMipuXSA9IGhpOworCisgIC8qIHYxIDwtLSAodjEgKyB2bTEpIC8gMiA9IHgwICsgeDIgKi8KKyAgaWYgKHZtMV9uZWcpCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxc3ViX24KKyAgICAgIG1wbl9yc2gxc3ViX24gKHYxLCB2MSwgdm0xLCAyKm4rMSk7CisjZWxzZQorICAgICAgbXBuX3N1Yl9uICh2MSwgdjEsIHZtMSwgMipuKzEpOworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9yc2hpZnQgKHYxLCB2MSwgMipuKzEsIDEpKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNoMWFkZF9uCisgICAgICBtcG5fcnNoMWFkZF9uICh2MSwgdjEsIHZtMSwgMipuKzEpOworI2Vsc2UKKyAgICAgIG1wbl9hZGRfbiAodjEsIHYxLCB2bTEsIDIqbisxKTsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fcnNoaWZ0ICh2MSwgdjEsIDIqbisxLCAxKSk7CisjZW5kaWYKKyAgICB9CisKKyAgLyogV2UgZ2V0IHgxICsgeDMgPSAoeDAgKyB4MikgLSAoeDAgLSB4MSArIHgyIC0geDMpLCBhbmQgaGVuY2UKKworICAgICB5ID0geDEgKyB4MyArICh4MCArIHgyKSAqIEIKKyAgICAgICA9ICh4MCArIHgyKSAqIEIgKyAoeDAgKyB4MikgLSB2bTEuCisKKyAgICAgeSBpcyAzKm4gKyAxIGxpbWJzLCB5ID0geTAgKyB5MSBCICsgeTIgQl4yLiBXZSBzdG9yZSB0aGVtIGFzCisgICAgIGZvbGxvd3M6IHkwIGF0IHNjcmF0Y2gsIHkxIGF0IHBwICsgMipuLCBhbmQgeTIgYXQgc2NyYXRjaCArIG4KKyAgICAgKGFscmVhZHkgaW4gcGxhY2UsIGV4Y2VwdCBmb3IgY2FycnkgcHJvcGFnYXRpb24pLgorCisgICAgIFdlIHRodXMgYWRkCisKKyAgIEJeMyAgQl4yICAgQiAgICAxCisgICAgfCAgICB8ICAgIHwgICAgfAorICAgKy0tLS0tKy0tLS0rCisgKyB8ICB4MCArIHgyIHwKKyAgICstLS0tKy0tLS0tKy0tLS0rCisgKyAgICAgIHwgIHgwICsgeDIgfAorCSstLS0tLS0tLS0tKworIC0gICAgICB8ICB2bTEgICAgIHwKKyAtLSstLS0tKystLS0tKy0tLS0rLQorICAgfCB5MiAgfCB5MSB8IHkwIHwKKyAgICstLS0tLSstLS0tKy0tLS0rCisKKyAgU2luY2Ugd2Ugc3RvcmUgeTAgYXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGxvdyBoYWxmIG9mIHgwICsgeDIsIHdlCisgIG5lZWQgdG8gZG8gdGhlIG1pZGRsZSBzdW0gZmlyc3QuICovCisKKyAgaGkgPSB2bTFbMipuXTsKKyAgY3kgPSBtcG5fYWRkX24gKHBwICsgMipuLCB2MSwgdjEgKyBuLCBuKTsKKyAgTVBOX0lOQ1JfVSAodjEgKyBuLCBuICsgMSwgY3kgKyB2MVsyKm5dKTsKKworICAvKiBGSVhNRTogQ2FuIHdlIGdldCByaWQgb2YgdGhpcyBzZWNvbmQgdm0xX25lZyBjb25kaXRpb25hbCBieQorICAgICBzd2FwcGluZyB0aGUgbG9jYXRpb24gb2YgKzEgYW5kIC0xIHZhbHVlcz8gKi8KKyAgaWYgKHZtMV9uZWcpCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX24gKHYxLCB2MSwgdm0xLCBuKTsKKyAgICAgIGhpICs9IG1wbl9hZGRfbmMgKHBwICsgMipuLCBwcCArIDIqbiwgdm0xICsgbiwgbiwgY3kpOworICAgICAgTVBOX0lOQ1JfVSAodjEgKyBuLCBuKzEsIGhpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjeSA9IG1wbl9zdWJfbiAodjEsIHYxLCB2bTEsIG4pOworICAgICAgaGkgKz0gbXBuX3N1Yl9uYyAocHAgKyAyKm4sIHBwICsgMipuLCB2bTEgKyBuLCBuLCBjeSk7CisgICAgICBNUE5fREVDUl9VICh2MSArIG4sIG4rMSwgaGkpOworICAgIH0KKworICBUT09NMzJfTVVMX05fUkVDIChwcCwgYTAsIGIwLCBuLCBzY3JhdGNoX291dCk7CisgIC8qIHZpbmYsIHMrdCBsaW1icy4gIFVzZSBtcG5fbXVsIGZvciBub3csIHRvIGhhbmRsZSB1bmJhbGFuY2VkIG9wZXJhbmRzICovCisgIGlmIChzID4gdCkgIG1wbl9tdWwgKHBwKzMqbiwgYTIsIHMsIGIxLCB0KTsKKyAgZWxzZSAgICAgICAgbXBuX211bCAocHArMypuLCBiMSwgdCwgYTIsIHMpOworCisgIC8qIFJlbWFpbmluZyBpbnRlcnBvbGF0aW9uLgorCisgICAgIHkgKiBCICsgeDAgKyB4MyBCXjMgLSB4MCBCXjIgLSB4MyBCCisgICAgID0gKHgxICsgeDMpIEIgKyAoeDAgKyB4MikgQl4yICsgeDAgKyB4MyBCXjMgLSB4MCBCXjIgLSB4MyBCCisgICAgID0geTAgQiArIHkxIEJeMiArIHkzIEJeMyArIEx4MCArIEggeDAgQgorICAgICAgICsgTCB4MyBCXjMgKyBIIHgzIEJeNCAtIEx4MCBCXjIgLSBIIHgwIEJeMyAtIEwgeDMgQiAtIEggeDMgQl4yCisgICAgID0gTCB4MCArICh5MCArIEggeDAgLSBMIHgzKSBCICsgKHkxIC0gTCB4MCAtIEggeDMpIEJeMgorICAgICAgICsgKHkyIC0gKEggeDAgLSBMIHgzKSkgQl4zICsgSCB4MyBCXjQKKworCSAgQl40ICAgICAgIEJeMyAgICAgICBCXjIgICAgICAgIEIgICAgICAgICAxCisgfCAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICB8CisgICArLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rCisgICB8ICBIeDMgIHwgICAgICAgICAgICAgICAgICAgfCBIeDAtTHgzIHwgICAgTHgwICB8CisgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rCisJICB8ICAgIHkyICAgIHwgIHkxICAgICB8ICAgeTAgICAgfAorCSAgKystLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSsKKwkgIC18IEh4MC1MeDMgfCAtIEx4MCAgIHwKKwkgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsKKwkJICAgICAgfCAtIEh4MyAgfAorCQkgICAgICArLS0tLS0tLS0rCisKKyAgICBXZSBtdXN0IHRha2UgaW50byBhY2NvdW50IHRoZSBjYXJyeSBmcm9tIEh4MCAtIEx4My4KKyAgKi8KKworICBjeSA9IG1wbl9zdWJfbiAocHAgKyBuLCBwcCArIG4sIHBwKzMqbiwgbik7CisgIGhpID0gc2NyYXRjaFsyKm5dICsgY3k7CisKKyAgY3kgPSBtcG5fc3ViX25jIChwcCArIDIqbiwgcHAgKyAyKm4sIHBwLCBuLCBjeSk7CisgIGhpIC09IG1wbl9zdWJfbmMgKHBwICsgMypuLCBzY3JhdGNoICsgbiwgcHAgKyBuLCBuLCBjeSk7CisKKyAgaGkgKz0gbXBuX2FkZCAocHAgKyBuLCBwcCArIG4sIDMqbiwgc2NyYXRjaCwgbik7CisKKyAgLyogRklYTUU6IElzIHN1cHBvcnQgZm9yIHMgKyB0ID09IG4gbmVlZGVkPyAqLworICBpZiAoTElLRUxZIChzICsgdCA+IG4pKQorICAgIHsKKyAgICAgIGhpIC09IG1wbl9zdWIgKHBwICsgMipuLCBwcCArIDIqbiwgMipuLCBwcCArIDQqbiwgcyt0LW4pOworCisgICAgICBBU1NFUlQgKGhpID49IDApOyAvKiBjb250cmlidXRpb24gb2YgdGhlIG1pZGRsZSB0ZXJtcyA+PSAwICovCisgICAgICBNUE5fSU5DUl9VIChwcCArIDQqbiwgcyt0LW4sIGhpKTsKKyAgICB9CisgIGVsc2UKKyAgICBBU1NFUlQgKGhpID09IDApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbTMzX211bC5jIGIvbXBuL2dlbmVyaWMvdG9vbTMzX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjA1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tMzNfbXVsLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIG1wbl90b29tMzNfbXVsIC0tIE11bHRpcGx5IHthcCxhbn0gYW5kIHtwLGJufSB3aGVyZSBhbiBhbmQgYm4gYXJlIGNsb3NlIGluCisgICBzaXplLiAgT3IgbW9yZSBhY2N1cmF0ZWx5LCBibiA8PSBhbiA8ICgzLzIpYm4uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKyAgIEFkZGl0aW9uYWwgaW1wcm92ZW1lbnRzIGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDYtMjAwOCwgMjAxMCwgMjAxMiwgMjAxNSwgMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRXZhbHVhdGUgaW46IC0xLCAwLCArMSwgKzIsICtpbmYKKworICA8LXMtLT48LS1uLS0+PC0tbi0tPgorICAgX19fXyBfX19fX18gX19fX19fCisgIHxfYTJffF9fX2ExX3xfX19hMF98CisgICB8YjJffF9fX2IxX3xfX19iMF98CisgICA8LXQtPjwtLW4tLT48LS1uLS0+CisKKyAgdjAgID0gIGEwICAgICAgICAgKiBiMCAgICAgICAgICAjICAgQSgwKSpCKDApCisgIHYxICA9IChhMCsgYTErIGEyKSooYjArIGIxKyBiMikgIyAgIEEoMSkqQigxKSAgICAgIGFoICA8PSAyICBiaCA8PSAyCisgIHZtMSA9IChhMC0gYTErIGEyKSooYjAtIGIxKyBiMikgIyAgQSgtMSkqQigtMSkgICAgfGFofCA8PSAxICBiaCA8PSAxCisgIHYyICA9IChhMCsyYTErNGEyKSooYjArMmIxKzRiMikgIyAgIEEoMikqQigyKSAgICAgIGFoICA8PSA2ICBiaCA8PSA2CisgIHZpbmY9ICAgICAgICAgIGEyICogICAgICAgICBiMiAgIyBBKGluZikqQihpbmYpCisqLworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxEIHx8IFdBTlRfRkFUX0JJTkFSWQorI2RlZmluZSBNQVlCRV9tdWxfYmFzZWNhc2UgMQorI2RlZmluZSBNQVlCRV9tdWxfdG9vbTMzICAgMQorI2Vsc2UKKyNkZWZpbmUgTUFZQkVfbXVsX2Jhc2VjYXNlCQkJCQkJXAorICAoTVVMX1RPT00zM19USFJFU0hPTEQgPCAzICogTVVMX1RPT00yMl9USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX211bF90b29tMzMJCQkJCQlcCisgIChNVUxfVE9PTTQ0X1RIUkVTSE9MRCA+PSAzICogTVVMX1RPT00zM19USFJFU0hPTEQpCisjZW5kaWYKKworLyogRklYTUU6IFRPT00zM19NVUxfTl9SRUMgaXMgbm90IHF1aXRlIHJpZ2h0IGZvciBhIGJhbGFuY2VkCisgICBtdWx0aXBsaWNhdGlvbiBhdCB0aGUgaW5maW5pdHkgcG9pbnQuIFdlIG1heSBoYXZlCisgICBNQVlCRV9tdWxfYmFzZWNhc2UgPT0gMCwgYW5kIHN0aWxsIGdldCBzIGp1c3QgYmVsb3cKKyAgIE1VTF9UT09NMjJfVEhSRVNIT0xELiBJZiBNVUxfVE9PTTMzX1RIUkVTSE9MRCA9PSA3LCB3ZSBjYW4gZXZlbiBnZXQKKyAgIHMgPT0gMSBhbmQgbXBuX3Rvb20yMl9tdWwgd2lsbCBjcmFzaC4KKyovCisKKyNkZWZpbmUgVE9PTTMzX01VTF9OX1JFQyhwLCBhLCBiLCBuLCB3cykJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCQkJXAorICAgICAgbXBuX211bF9iYXNlY2FzZSAocCwgYSwgbiwgYiwgbik7CQkJCQlcCisgICAgZWxzZSBpZiAoISBNQVlCRV9tdWxfdG9vbTMzCQkJCQkJXAorCSAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTMzX1RIUkVTSE9MRCkpCQlcCisgICAgICBtcG5fdG9vbTIyX211bCAocCwgYSwgbiwgYiwgbiwgd3MpOwkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgbXBuX3Rvb20zM19tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICB9IHdoaWxlICgwKQorCit2b2lkCittcG5fdG9vbTMzX211bCAobXBfcHRyIHBwLAorCQltcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwKKwkJbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4sCisJCW1wX3B0ciBzY3JhdGNoKQoreworICBjb25zdCBpbnQgX19nbXBuX2NwdXZlY19pbml0aWFsaXplZCA9IDE7CisgIG1wX3NpemVfdCBuLCBzLCB0OworICBpbnQgdm0xX25lZzsKKyAgbXBfbGltYl90IGN5LCB2aW5mMDsKKyAgbXBfcHRyIGdwOworICBtcF9wdHIgYXMxLCBhc20xLCBhczI7CisgIG1wX3B0ciBiczEsIGJzbTEsIGJzMjsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisjZGVmaW5lIGEyICAoYXAgKyAyKm4pCisjZGVmaW5lIGIwICBicAorI2RlZmluZSBiMSAgKGJwICsgbikKKyNkZWZpbmUgYjIgIChicCArIDIqbikKKworICBuID0gKGFuICsgMikgLyAoc2l6ZV90KSAzOworCisgIHMgPSBhbiAtIDIgKiBuOworICB0ID0gYm4gLSAyICogbjsKKworICBBU1NFUlQgKGFuID49IGJuKTsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisgIEFTU0VSVCAoMCA8IHQgJiYgdCA8PSBuKTsKKworICBhczEgID0gc2NyYXRjaCArIDQgKiBuICsgNDsKKyAgYXNtMSA9IHNjcmF0Y2ggKyAyICogbiArIDI7CisgIGFzMiA9IHBwICsgbiArIDE7CisKKyAgYnMxID0gcHA7CisgIGJzbTEgPSBzY3JhdGNoICsgMyAqIG4gKyAzOyAvKiB3ZSBuZWVkIDRuKzQgPD0gNG4rcyt0ICovCisgIGJzMiA9IHBwICsgMiAqIG4gKyAyOworCisgIGdwID0gc2NyYXRjaDsKKworICB2bTFfbmVnID0gMDsKKworICAvKiBDb21wdXRlIGFzMSBhbmQgYXNtMS4gICovCisgIGN5ID0gbXBuX2FkZCAoZ3AsIGEwLCBuLCBhMiwgcyk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgIGlmIChjeSA9PSAwICYmIG1wbl9jbXAgKGdwLCBhMSwgbikgPCAwKQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChhczEsIGFzbTEsIGExLCBncCwgbik7CisgICAgICBhczFbbl0gPSBjeSA+PiAxOworICAgICAgYXNtMVtuXSA9IDA7CisgICAgICB2bTFfbmVnID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kyOworICAgICAgY3kyID0gbXBuX2FkZF9uX3N1Yl9uIChhczEsIGFzbTEsIGdwLCBhMSwgbik7CisgICAgICBhczFbbl0gPSBjeSArIChjeTIgPj4gMSk7CisgICAgICBhc20xW25dID0gY3kgLSAoY3kyICYgMSk7CisgICAgfQorI2Vsc2UKKyAgYXMxW25dID0gY3kgKyBtcG5fYWRkX24gKGFzMSwgZ3AsIGExLCBuKTsKKyAgaWYgKGN5ID09IDAgJiYgbXBuX2NtcCAoZ3AsIGExLCBuKSA8IDApCisgICAgeworICAgICAgbXBuX3N1Yl9uIChhc20xLCBhMSwgZ3AsIG4pOworICAgICAgYXNtMVtuXSA9IDA7CisgICAgICB2bTFfbmVnID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjeSAtPSBtcG5fc3ViX24gKGFzbTEsIGdwLCBhMSwgbik7CisgICAgICBhc20xW25dID0gY3k7CisgICAgfQorI2VuZGlmCisKKyAgLyogQ29tcHV0ZSBhczIuICAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX24KKyAgY3kgPSBtcG5fYWRkX24gKGFzMiwgYTIsIGFzMSwgcyk7CisgIGlmIChzICE9IG4pCisgICAgY3kgPSBtcG5fYWRkXzEgKGFzMiArIHMsIGFzMSArIHMsIG4gLSBzLCBjeSk7CisgIGN5ICs9IGFzMVtuXTsKKyAgY3kgPSAyICogY3kgKyBtcG5fcnNibHNoMV9uIChhczIsIGEwLCBhczIsIG4pOworI2Vsc2UKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIGN5ICA9IG1wbl9hZGRsc2gxX24gKGFzMiwgYTEsIGEyLCBzKTsKKyAgaWYgKHMgIT0gbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYXMyICsgcywgYTEgKyBzLCBuIC0gcywgY3kpOworICBjeSA9IDIgKiBjeSArIG1wbl9hZGRsc2gxX24gKGFzMiwgYTAsIGFzMiwgbik7CisjZWxzZQorICBjeSA9IG1wbl9hZGRfbiAoYXMyLCBhMiwgYXMxLCBzKTsKKyAgaWYgKHMgIT0gbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYXMyICsgcywgYXMxICsgcywgbiAtIHMsIGN5KTsKKyAgY3kgKz0gYXMxW25dOworICBjeSA9IDIgKiBjeSArIG1wbl9sc2hpZnQgKGFzMiwgYXMyLCBuLCAxKTsKKyAgY3kgLT0gbXBuX3N1Yl9uIChhczIsIGFzMiwgYTAsIG4pOworI2VuZGlmCisjZW5kaWYKKyAgYXMyW25dID0gY3k7CisKKyAgLyogQ29tcHV0ZSBiczEgYW5kIGJzbTEuICAqLworICBjeSA9IG1wbl9hZGQgKGdwLCBiMCwgbiwgYjIsIHQpOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBpZiAoY3kgPT0gMCAmJiBtcG5fY21wIChncCwgYjEsIG4pIDwgMCkKKyAgICB7CisgICAgICBjeSA9IG1wbl9hZGRfbl9zdWJfbiAoYnMxLCBic20xLCBiMSwgZ3AsIG4pOworICAgICAgYnMxW25dID0gY3kgPj4gMTsKKyAgICAgIGJzbTFbbl0gPSAwOworICAgICAgdm0xX25lZyBePSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeTI7CisgICAgICBjeTIgPSBtcG5fYWRkX25fc3ViX24gKGJzMSwgYnNtMSwgZ3AsIGIxLCBuKTsKKyAgICAgIGJzMVtuXSA9IGN5ICsgKGN5MiA+PiAxKTsKKyAgICAgIGJzbTFbbl0gPSBjeSAtIChjeTIgJiAxKTsKKyAgICB9CisjZWxzZQorICBiczFbbl0gPSBjeSArIG1wbl9hZGRfbiAoYnMxLCBncCwgYjEsIG4pOworICBpZiAoY3kgPT0gMCAmJiBtcG5fY21wIChncCwgYjEsIG4pIDwgMCkKKyAgICB7CisgICAgICBtcG5fc3ViX24gKGJzbTEsIGIxLCBncCwgbik7CisgICAgICBic20xW25dID0gMDsKKyAgICAgIHZtMV9uZWcgXj0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjeSAtPSBtcG5fc3ViX24gKGJzbTEsIGdwLCBiMSwgbik7CisgICAgICBic20xW25dID0gY3k7CisgICAgfQorI2VuZGlmCisKKyAgLyogQ29tcHV0ZSBiczIuICAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX24KKyAgY3kgPSBtcG5fYWRkX24gKGJzMiwgYjIsIGJzMSwgdCk7CisgIGlmICh0ICE9IG4pCisgICAgY3kgPSBtcG5fYWRkXzEgKGJzMiArIHQsIGJzMSArIHQsIG4gLSB0LCBjeSk7CisgIGN5ICs9IGJzMVtuXTsKKyAgY3kgPSAyICogY3kgKyBtcG5fcnNibHNoMV9uIChiczIsIGIwLCBiczIsIG4pOworI2Vsc2UKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIGN5ICA9IG1wbl9hZGRsc2gxX24gKGJzMiwgYjEsIGIyLCB0KTsKKyAgaWYgKHQgIT0gbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYnMyICsgdCwgYjEgKyB0LCBuIC0gdCwgY3kpOworICBjeSA9IDIgKiBjeSArIG1wbl9hZGRsc2gxX24gKGJzMiwgYjAsIGJzMiwgbik7CisjZWxzZQorICBjeSAgPSBtcG5fYWRkX24gKGJzMiwgYnMxLCBiMiwgdCk7CisgIGlmICh0ICE9IG4pCisgICAgY3kgPSBtcG5fYWRkXzEgKGJzMiArIHQsIGJzMSArIHQsIG4gLSB0LCBjeSk7CisgIGN5ICs9IGJzMVtuXTsKKyAgY3kgPSAyICogY3kgKyBtcG5fbHNoaWZ0IChiczIsIGJzMiwgbiwgMSk7CisgIGN5IC09IG1wbl9zdWJfbiAoYnMyLCBiczIsIGIwLCBuKTsKKyNlbmRpZgorI2VuZGlmCisgIGJzMltuXSA9IGN5OworCisgIEFTU0VSVCAoYXMxW25dIDw9IDIpOworICBBU1NFUlQgKGJzMVtuXSA8PSAyKTsKKyAgQVNTRVJUIChhc20xW25dIDw9IDEpOworICBBU1NFUlQgKGJzbTFbbl0gPD0gMSk7CisgIEFTU0VSVCAoYXMyW25dIDw9IDYpOworICBBU1NFUlQgKGJzMltuXSA8PSA2KTsKKworI2RlZmluZSB2MCAgICBwcAkJCQkvKiAybiAqLworI2RlZmluZSB2MSAgICAocHAgKyAyICogbikJCQkvKiAybisxICovCisjZGVmaW5lIHZpbmYgIChwcCArIDQgKiBuKQkJCS8qIHMrdCAqLworI2RlZmluZSB2bTEgICBzY3JhdGNoCQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdjIgICAgKHNjcmF0Y2ggKyAyICogbiArIDEpCQkvKiAybisyICovCisjZGVmaW5lIHNjcmF0Y2hfb3V0ICAoc2NyYXRjaCArIDUgKiBuICsgNSkKKworICAvKiB2bTEsIDJuKzEgbGltYnMgKi8KKyNpZmRlZiBTTUFMTEVSX1JFQ1VSU0lPTgorICBUT09NMzNfTVVMX05fUkVDICh2bTEsIGFzbTEsIGJzbTEsIG4sIHNjcmF0Y2hfb3V0KTsKKyAgY3kgPSAwOworICBpZiAoYXNtMVtuXSAhPSAwKQorICAgIGN5ID0gYnNtMVtuXSArIG1wbl9hZGRfbiAodm0xICsgbiwgdm0xICsgbiwgYnNtMSwgbik7CisgIGlmIChic20xW25dICE9IDApCisgICAgY3kgKz0gbXBuX2FkZF9uICh2bTEgKyBuLCB2bTEgKyBuLCBhc20xLCBuKTsKKyAgdm0xWzIgKiBuXSA9IGN5OworI2Vsc2UKKyAgdm0xWzIgKiBuXSA9IDA7CisgIFRPT00zM19NVUxfTl9SRUMgKHZtMSwgYXNtMSwgYnNtMSwgbiArIChic20xW25dIHwgYXNtMVtuXSksIHNjcmF0Y2hfb3V0KTsKKyNlbmRpZgorCisgIFRPT00zM19NVUxfTl9SRUMgKHYyLCBhczIsIGJzMiwgbiArIDEsIHNjcmF0Y2hfb3V0KTsJLyogdjIsIDJuKzEgbGltYnMgKi8KKworICAvKiB2aW5mLCBzK3QgbGltYnMgKi8KKyAgaWYgKHMgPiB0KSAgbXBuX211bCAodmluZiwgYTIsIHMsIGIyLCB0KTsKKyAgZWxzZSAgICAgICAgVE9PTTMzX01VTF9OX1JFQyAodmluZiwgYTIsIGIyLCBzLCBzY3JhdGNoX291dCk7CisKKyAgdmluZjAgPSB2aW5mWzBdOwkJCQkvKiB2MSBvdmVybGFwcyB3aXRoIHRoaXMgKi8KKworI2lmZGVmIFNNQUxMRVJfUkVDVVJTSU9OCisgIC8qIHYxLCAybisxIGxpbWJzICovCisgIFRPT00zM19NVUxfTl9SRUMgKHYxLCBhczEsIGJzMSwgbiwgc2NyYXRjaF9vdXQpOworICBpZiAoYXMxW25dID09IDEpCisgICAgeworICAgICAgY3kgPSBiczFbbl0gKyBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBiczEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYXMxW25dICE9IDApCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxCisgICAgICBjeSA9IDIgKiBiczFbbl0gKyBtcG5fYWRkbHNoMV9uX2lwMSAodjEgKyBuLCBiczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ID0gMiAqIGJzMVtuXSArIG1wbl9hZGRtdWxfMSAodjEgKyBuLCBiczEsIG4sIENOU1RfTElNQigyKSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICBjeSA9IDA7CisgIGlmIChiczFbbl0gPT0gMSkKKyAgICB7CisgICAgICBjeSArPSBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBhczEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYnMxW25dICE9IDApCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxCisgICAgICBjeSArPSBtcG5fYWRkbHNoMV9uX2lwMSAodjEgKyBuLCBhczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ICs9IG1wbl9hZGRtdWxfMSAodjEgKyBuLCBhczEsIG4sIENOU1RfTElNQigyKSk7CisjZW5kaWYKKyAgICB9CisgIHYxWzIgKiBuXSA9IGN5OworI2Vsc2UKKyAgY3kgPSB2aW5mWzFdOworICBUT09NMzNfTVVMX05fUkVDICh2MSwgYXMxLCBiczEsIG4gKyAxLCBzY3JhdGNoX291dCk7CisgIHZpbmZbMV0gPSBjeTsKKyNlbmRpZgorCisgIFRPT00zM19NVUxfTl9SRUMgKHYwLCBhcCwgYnAsIG4sIHNjcmF0Y2hfb3V0KTsJLyogdjAsIDJuIGxpbWJzICovCisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfNXB0cyAocHAsIHYyLCB2bTEsIG4sIHMgKyB0LCB2bTFfbmVnLCB2aW5mMCk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tM19zcXIuYyBiL21wbi9nZW5lcmljL3Rvb20zX3Nxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2EyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tM19zcXIuYwpAQCAtMCwwICsxLDIyMSBAQAorLyogbXBuX3Rvb20zX3NxciAtLSBTcXVhcmUge2FwLGFufS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorICAgQWRkaXRpb25hbCBpbXByb3ZlbWVudHMgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDEwLCAyMDEyLCAyMDE1LCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogLTEsIDAsICsxLCArMiwgK2luZgorCisgIDwtcy0tPjwtLW4tLT48LS1uLS0+CisgICBfX19fIF9fX19fXyBfX19fX18KKyAgfF9hMl98X19fYTFffF9fX2EwX3wKKworICB2MCAgPSAgYTAgICAgICAgICBeMiAjICAgQSgwKV4yCisgIHYxICA9IChhMCsgYTErIGEyKV4yICMgICBBKDEpXjIgICAgYWggIDw9IDIKKyAgdm0xID0gKGEwLSBhMSsgYTIpXjIgIyAgQSgtMSleMiAgIHxhaHwgPD0gMQorICB2MiAgPSAoYTArMmExKzRhMileMiAjICAgQSgyKV4yICAgIGFoICA8PSA2CisgIHZpbmY9ICAgICAgICAgIGEyIF4yICMgQShpbmYpXjIKKyovCisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQgfHwgV0FOVF9GQVRfQklOQVJZCisjZGVmaW5lIE1BWUJFX3Nxcl9iYXNlY2FzZSAxCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tMyAgIDEKKyNlbHNlCisjZGVmaW5lIE1BWUJFX3Nxcl9iYXNlY2FzZQkJCQkJCVwKKyAgKFNRUl9UT09NM19USFJFU0hPTEQgPCAzICogU1FSX1RPT00yX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20zCQkJCQkJCVwKKyAgKFNRUl9UT09NNF9USFJFU0hPTEQgPj0gMyAqIFNRUl9UT09NM19USFJFU0hPTEQpCisjZW5kaWYKKworI2RlZmluZSBUT09NM19TUVJfUkVDKHAsIGEsIG4sIHdzKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9zcXJfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTJfVEhSRVNIT0xEKSkJCQlcCisgICAgICBtcG5fc3FyX2Jhc2VjYXNlIChwLCBhLCBuKTsJCQkJCVwKKyAgICBlbHNlIGlmICghIE1BWUJFX3Nxcl90b29tMwkJCQkJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT00zX1RIUkVTSE9MRCkpCQlcCisgICAgICBtcG5fdG9vbTJfc3FyIChwLCBhLCBuLCB3cyk7CQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgbXBuX3Rvb20zX3NxciAocCwgYSwgbiwgd3MpOwkJCQkJXAorICB9IHdoaWxlICgwKQorCit2b2lkCittcG5fdG9vbTNfc3FyIChtcF9wdHIgcHAsCisJICAgICAgIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCSAgICAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgY29uc3QgaW50IF9fZ21wbl9jcHV2ZWNfaW5pdGlhbGl6ZWQgPSAxOworICBtcF9zaXplX3QgbiwgczsKKyAgbXBfbGltYl90IGN5LCB2aW5mMDsKKyAgbXBfcHRyIGdwOworICBtcF9wdHIgYXMxLCBhc20xLCBhczI7CisKKyNkZWZpbmUgYTAgIGFwCisjZGVmaW5lIGExICAoYXAgKyBuKQorI2RlZmluZSBhMiAgKGFwICsgMipuKQorCisgIG4gPSAoYW4gKyAyKSAvIChzaXplX3QpIDM7CisKKyAgcyA9IGFuIC0gMiAqIG47CisKKyAgQVNTRVJUICgwIDwgcyAmJiBzIDw9IG4pOworCisgIGFzMSA9IHNjcmF0Y2ggKyA0ICogbiArIDQ7CisgIGFzbTEgPSBzY3JhdGNoICsgMiAqIG4gKyAyOworICBhczIgPSBwcCArIG4gKyAxOworCisgIGdwID0gc2NyYXRjaDsKKworICAvKiBDb21wdXRlIGFzMSBhbmQgYXNtMS4gICovCisgIGN5ID0gbXBuX2FkZCAoZ3AsIGEwLCBuLCBhMiwgcyk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgIGlmIChjeSA9PSAwICYmIG1wbl9jbXAgKGdwLCBhMSwgbikgPCAwKQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChhczEsIGFzbTEsIGExLCBncCwgbik7CisgICAgICBhczFbbl0gPSBjeSA+PiAxOworICAgICAgYXNtMVtuXSA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90IGN5MjsKKyAgICAgIGN5MiA9IG1wbl9hZGRfbl9zdWJfbiAoYXMxLCBhc20xLCBncCwgYTEsIG4pOworICAgICAgYXMxW25dID0gY3kgKyAoY3kyID4+IDEpOworICAgICAgYXNtMVtuXSA9IGN5IC0gKGN5MiAmIDEpOworICAgIH0KKyNlbHNlCisgIGFzMVtuXSA9IGN5ICsgbXBuX2FkZF9uIChhczEsIGdwLCBhMSwgbik7CisgIGlmIChjeSA9PSAwICYmIG1wbl9jbXAgKGdwLCBhMSwgbikgPCAwKQorICAgIHsKKyAgICAgIG1wbl9zdWJfbiAoYXNtMSwgYTEsIGdwLCBuKTsKKyAgICAgIGFzbTFbbl0gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN5IC09IG1wbl9zdWJfbiAoYXNtMSwgZ3AsIGExLCBuKTsKKyAgICAgIGFzbTFbbl0gPSBjeTsKKyAgICB9CisjZW5kaWYKKworICAvKiBDb21wdXRlIGFzMi4gICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbgorICBjeSA9IG1wbl9hZGRfbiAoYXMyLCBhMiwgYXMxLCBzKTsKKyAgaWYgKHMgIT0gbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYXMyICsgcywgYXMxICsgcywgbiAtIHMsIGN5KTsKKyAgY3kgKz0gYXMxW25dOworICBjeSA9IDIgKiBjeSArIG1wbl9yc2Jsc2gxX24gKGFzMiwgYTAsIGFzMiwgbik7CisjZWxzZQorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgY3kgID0gbXBuX2FkZGxzaDFfbiAoYXMyLCBhMSwgYTIsIHMpOworICBpZiAocyAhPSBuKQorICAgIGN5ID0gbXBuX2FkZF8xIChhczIgKyBzLCBhMSArIHMsIG4gLSBzLCBjeSk7CisgIGN5ID0gMiAqIGN5ICsgbXBuX2FkZGxzaDFfbiAoYXMyLCBhMCwgYXMyLCBuKTsKKyNlbHNlCisgIGN5ID0gbXBuX2FkZF9uIChhczIsIGEyLCBhczEsIHMpOworICBpZiAocyAhPSBuKQorICAgIGN5ID0gbXBuX2FkZF8xIChhczIgKyBzLCBhczEgKyBzLCBuIC0gcywgY3kpOworICBjeSArPSBhczFbbl07CisgIGN5ID0gMiAqIGN5ICsgbXBuX2xzaGlmdCAoYXMyLCBhczIsIG4sIDEpOworICBjeSAtPSBtcG5fc3ViX24gKGFzMiwgYXMyLCBhMCwgbik7CisjZW5kaWYKKyNlbmRpZgorICBhczJbbl0gPSBjeTsKKworICBBU1NFUlQgKGFzMVtuXSA8PSAyKTsKKyAgQVNTRVJUIChhc20xW25dIDw9IDEpOworCisjZGVmaW5lIHYwICAgIHBwCQkJCS8qIDJuICovCisjZGVmaW5lIHYxICAgIChwcCArIDIgKiBuKQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdmluZiAgKHBwICsgNCAqIG4pCQkJLyogcytzICovCisjZGVmaW5lIHZtMSAgIHNjcmF0Y2gJCQkJLyogMm4rMSAqLworI2RlZmluZSB2MiAgICAoc2NyYXRjaCArIDIgKiBuICsgMSkJCS8qIDJuKzIgKi8KKyNkZWZpbmUgc2NyYXRjaF9vdXQgIChzY3JhdGNoICsgNSAqIG4gKyA1KQorCisgIC8qIHZtMSwgMm4rMSBsaW1icyAqLworI2lmZGVmIFNNQUxMRVJfUkVDVVJTSU9OCisgIFRPT00zX1NRUl9SRUMgKHZtMSwgYXNtMSwgbiwgc2NyYXRjaF9vdXQpOworICBjeSA9IGFzbTFbbl07CisgIGlmIChjeSAhPSAwKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorICAgICAgY3kgKz0gbXBuX2FkZGxzaDFfbl9pcDEgKHZtMSArIG4sIGFzbTEsIG4pOworI2Vsc2UKKyAgICAgIGN5ICs9IG1wbl9hZGRtdWxfMSAodm0xICsgbiwgYXNtMSwgbiwgQ05TVF9MSU1CKDIpKTsKKyNlbmRpZgorICAgIH0KKyAgdm0xWzIgKiBuXSA9IGN5OworI2Vsc2UKKyAgdm0xWzIgKiBuXSA9IDA7CisgIFRPT00zX1NRUl9SRUMgKHZtMSwgYXNtMSwgbiArIGFzbTFbbl0sIHNjcmF0Y2hfb3V0KTsKKyNlbmRpZgorCisgIFRPT00zX1NRUl9SRUMgKHYyLCBhczIsIG4gKyAxLCBzY3JhdGNoX291dCk7CS8qIHYyLCAybisxIGxpbWJzICovCisKKyAgVE9PTTNfU1FSX1JFQyAodmluZiwgYTIsIHMsIHNjcmF0Y2hfb3V0KTsJLyogdmluZiwgcytzIGxpbWJzICovCisKKyAgdmluZjAgPSB2aW5mWzBdOwkJCQkvKiB2MSBvdmVybGFwcyB3aXRoIHRoaXMgKi8KKworI2lmZGVmIFNNQUxMRVJfUkVDVVJTSU9OCisgIC8qIHYxLCAybisxIGxpbWJzICovCisgIFRPT00zX1NRUl9SRUMgKHYxLCBhczEsIG4sIHNjcmF0Y2hfb3V0KTsKKyAgY3kgPSBhczFbbl07CisgIGlmIChjeSA9PSAxKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorICAgICAgY3kgKz0gbXBuX2FkZGxzaDFfbl9pcDEgKHYxICsgbiwgYXMxLCBuKTsKKyNlbHNlCisgICAgICBjeSArPSBtcG5fYWRkbXVsXzEgKHYxICsgbiwgYXMxLCBuLCBDTlNUX0xJTUIoMikpOworI2VuZGlmCisgICAgfQorICBlbHNlIGlmIChjeSAhPSAwKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uX2lwMQorICAgICAgY3kgPSA0ICsgbXBuX2FkZGxzaDJfbl9pcDEgKHYxICsgbiwgYXMxLCBuKTsKKyNlbHNlCisgICAgICBjeSA9IDQgKyBtcG5fYWRkbXVsXzEgKHYxICsgbiwgYXMxLCBuLCBDTlNUX0xJTUIoNCkpOworI2VuZGlmCisgICAgfQorICB2MVsyICogbl0gPSBjeTsKKyNlbHNlCisgIGN5ID0gdmluZlsxXTsKKyAgVE9PTTNfU1FSX1JFQyAodjEsIGFzMSwgbiArIDEsIHNjcmF0Y2hfb3V0KTsKKyAgdmluZlsxXSA9IGN5OworI2VuZGlmCisKKyAgVE9PTTNfU1FSX1JFQyAodjAsIGFwLCBuLCBzY3JhdGNoX291dCk7CS8qIHYwLCAybiBsaW1icyAqLworCisgIG1wbl90b29tX2ludGVycG9sYXRlXzVwdHMgKHBwLCB2Miwgdm0xLCBuLCBzICsgcywgMCwgdmluZjApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbTQyX211bC5jIGIvbXBuL2dlbmVyaWMvdG9vbTQyX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tNDJfbXVsLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIG1wbl90b29tNDJfbXVsIC0tIE11bHRpcGx5IHthcCxhbn0gYW5kIHticCxibn0gd2hlcmUgYW4gaXMgbm9taW5hbGx5IHR3aWNlCisgICBhcyBsYXJnZSBhcyBibi4gIE9yIG1vcmUgYWNjdXJhdGVseSwgKDMvMilibiA8IGFuIDwgNGJuLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisgICBBZGRpdGlvbmFsIGltcHJvdmVtZW50cyBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUaGUgaWRlYSBvZiBhcHBseWluZyB0b29tIHRvIHVuYmFsYW5jZWQgbXVsdGlwbGljYXRpb24gaXMgZHVlIHRvIE1hcmNvCisgICBCb2RyYXRvIGFuZCBBbGJlcnRvIFphbm9uaS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDA4LCAyMDEyLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogLTEsIDAsICsxLCArMiwgK2luZgorCisgIDwtcy0+PC0tbi0tPjwtLW4tLT48LS1uLS0+CisgICBfX18gX19fX19fIF9fX19fXyBfX19fX18KKyAgfGEzX3xfX19hMl98X19fYTFffF9fX2EwX3wKKwkgICAgICAgfF9iMV98X19fYjBffAorCSAgICAgICA8LXQtLT48LS1uLS0+CisKKyAgdjAgID0gIGEwICAgICAgICAgICAgICogYjAgICAgICAjICAgQSgwKSpCKDApCisgIHYxICA9IChhMCsgYTErIGEyKyBhMykqKGIwKyBiMSkgIyAgIEEoMSkqQigxKSAgICAgIGFoICA8PSAzICBiaCA8PSAxCisgIHZtMSA9IChhMC0gYTErIGEyLSBhMykqKGIwLSBiMSkgIyAgQSgtMSkqQigtMSkgICAgfGFofCA8PSAxICBiaCAgPSAwCisgIHYyICA9IChhMCsyYTErNGEyKzhhMykqKGIwKzJiMSkgIyAgIEEoMikqQigyKSAgICAgIGFoICA8PSAxNCBiaCA8PSAyCisgIHZpbmY9ICAgICAgICAgICAgICBhMyAqICAgICBiMSAgIyBBKGluZikqQihpbmYpCisqLworCisjZGVmaW5lIFRPT000Ml9NVUxfTl9SRUMocCwgYSwgYiwgbiwgd3MpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcG5fbXVsX24gKHAsIGEsIGIsIG4pOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKwordm9pZAorbXBuX3Rvb200Ml9tdWwgKG1wX3B0ciBwcCwKKwkJbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCW1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLAorCQltcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIGludCB2bTFfbmVnOworICBtcF9saW1iX3QgY3ksIHZpbmYwOworICBtcF9wdHIgYTBfYTI7CisgIG1wX3B0ciBhczEsIGFzbTEsIGFzMjsKKyAgbXBfcHRyIGJzMSwgYnNtMSwgYnMyOworICBtcF9wdHIgdG1wOworICBUTVBfREVDTDsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisjZGVmaW5lIGEyICAoYXAgKyAyKm4pCisjZGVmaW5lIGEzICAoYXAgKyAzKm4pCisjZGVmaW5lIGIwICBicAorI2RlZmluZSBiMSAgKGJwICsgbikKKworICBuID0gYW4gPj0gMiAqIGJuID8gKGFuICsgMykgPj4gMiA6IChibiArIDEpID4+IDE7CisKKyAgcyA9IGFuIC0gMyAqIG47CisgIHQgPSBibiAtIG47CisKKyAgQVNTRVJUICgwIDwgcyAmJiBzIDw9IG4pOworICBBU1NFUlQgKDAgPCB0ICYmIHQgPD0gbik7CisKKyAgVE1QX01BUks7CisKKyAgdG1wID0gVE1QX0FMTE9DX0xJTUJTICg2ICogbiArIDUpOworICBhczEgID0gdG1wOyB0bXAgKz0gbiArIDE7CisgIGFzbTEgPSB0bXA7IHRtcCArPSBuICsgMTsKKyAgYXMyICA9IHRtcDsgdG1wICs9IG4gKyAxOworICBiczEgID0gdG1wOyB0bXAgKz0gbiArIDE7CisgIGJzbTEgPSB0bXA7IHRtcCArPSBuOworICBiczIgID0gdG1wOyB0bXAgKz0gbiArIDE7CisKKyAgYTBfYTIgPSBwcDsKKworICAvKiBDb21wdXRlIGFzMSBhbmQgYXNtMS4gICovCisgIHZtMV9uZWcgPSBtcG5fdG9vbV9ldmFsX2RncjNfcG0xIChhczEsIGFzbTEsIGFwLCBuLCBzLCBhMF9hMikgJiAxOworCisgIC8qIENvbXB1dGUgYXMyLiAgKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIGN5ICA9IG1wbl9hZGRsc2gxX24gKGFzMiwgYTIsIGEzLCBzKTsKKyAgaWYgKHMgIT0gbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYXMyICsgcywgYTIgKyBzLCBuIC0gcywgY3kpOworICBjeSA9IDIgKiBjeSArIG1wbl9hZGRsc2gxX24gKGFzMiwgYTEsIGFzMiwgbik7CisgIGN5ID0gMiAqIGN5ICsgbXBuX2FkZGxzaDFfbiAoYXMyLCBhMCwgYXMyLCBuKTsKKyNlbHNlCisgIGN5ICA9IG1wbl9sc2hpZnQgKGFzMiwgYTMsIHMsIDEpOworICBjeSArPSBtcG5fYWRkX24gKGFzMiwgYTIsIGFzMiwgcyk7CisgIGlmIChzICE9IG4pCisgICAgY3kgPSBtcG5fYWRkXzEgKGFzMiArIHMsIGEyICsgcywgbiAtIHMsIGN5KTsKKyAgY3kgPSAyICogY3kgKyBtcG5fbHNoaWZ0IChhczIsIGFzMiwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYXMyLCBhMSwgYXMyLCBuKTsKKyAgY3kgPSAyICogY3kgKyBtcG5fbHNoaWZ0IChhczIsIGFzMiwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYXMyLCBhMCwgYXMyLCBuKTsKKyNlbmRpZgorICBhczJbbl0gPSBjeTsKKworICAvKiBDb21wdXRlIGJzMSBhbmQgYnNtMS4gICovCisgIGlmICh0ID09IG4pCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICAgICAgaWYgKG1wbl9jbXAgKGIwLCBiMSwgbikgPCAwKQorCXsKKwkgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChiczEsIGJzbTEsIGIxLCBiMCwgbik7CisJICB2bTFfbmVnIF49IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChiczEsIGJzbTEsIGIwLCBiMSwgbik7CisJfQorICAgICAgYnMxW25dID0gY3kgPj4gMTsKKyNlbHNlCisgICAgICBiczFbbl0gPSBtcG5fYWRkX24gKGJzMSwgYjAsIGIxLCBuKTsKKworICAgICAgaWYgKG1wbl9jbXAgKGIwLCBiMSwgbikgPCAwKQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGIwLCBuKTsKKwkgIHZtMV9uZWcgXj0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBuX3N1Yl9uIChic20xLCBiMCwgYjEsIG4pOworCX0KKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJzMVtuXSA9IG1wbl9hZGQgKGJzMSwgYjAsIG4sIGIxLCB0KTsKKworICAgICAgaWYgKG1wbl96ZXJvX3AgKGIwICsgdCwgbiAtIHQpICYmIG1wbl9jbXAgKGIwLCBiMSwgdCkgPCAwKQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGIwLCB0KTsKKwkgIE1QTl9aRVJPIChic20xICsgdCwgbiAtIHQpOworCSAgdm0xX25lZyBePSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcG5fc3ViIChic20xLCBiMCwgbiwgYjEsIHQpOworCX0KKyAgICB9CisKKyAgLyogQ29tcHV0ZSBiczIsIHJlY3ljbGluZyBiczEuIGJzMj1iczErYjEgICovCisgIG1wbl9hZGQgKGJzMiwgYnMxLCBuICsgMSwgYjEsIHQpOworCisgIEFTU0VSVCAoYXMxW25dIDw9IDMpOworICBBU1NFUlQgKGJzMVtuXSA8PSAxKTsKKyAgQVNTRVJUIChhc20xW25dIDw9IDEpOworLypBU1NFUlQgKGJzbTFbbl0gPT0gMCk7Ki8KKyAgQVNTRVJUIChhczJbbl0gPD0gMTQpOworICBBU1NFUlQgKGJzMltuXSA8PSAyKTsKKworI2RlZmluZSB2MCAgICBwcAkJCQkvKiAybiAqLworI2RlZmluZSB2MSAgICAocHAgKyAyICogbikJCQkvKiAybisxICovCisjZGVmaW5lIHZpbmYgIChwcCArIDQgKiBuKQkJCS8qIHMrdCAqLworI2RlZmluZSB2bTEgICBzY3JhdGNoCQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdjIgICAgKHNjcmF0Y2ggKyAyICogbiArIDEpCQkvKiAybisyICovCisjZGVmaW5lIHNjcmF0Y2hfb3V0CXNjcmF0Y2ggKyA0ICogbiArIDQJLyogQ3VycmVudGx5IHVudXNlZC4gKi8KKworICAvKiB2bTEsIDJuKzEgbGltYnMgKi8KKyAgVE9PTTQyX01VTF9OX1JFQyAodm0xLCBhc20xLCBic20xLCBuLCBzY3JhdGNoX291dCk7CisgIGN5ID0gMDsKKyAgaWYgKGFzbTFbbl0gIT0gMCkKKyAgICBjeSA9IG1wbl9hZGRfbiAodm0xICsgbiwgdm0xICsgbiwgYnNtMSwgbik7CisgIHZtMVsyICogbl0gPSBjeTsKKworICBUT09NNDJfTVVMX05fUkVDICh2MiwgYXMyLCBiczIsIG4gKyAxLCBzY3JhdGNoX291dCk7CS8qIHYyLCAybisxIGxpbWJzICovCisKKyAgLyogdmluZiwgcyt0IGxpbWJzICovCisgIGlmIChzID4gdCkgIG1wbl9tdWwgKHZpbmYsIGEzLCBzLCBiMSwgdCk7CisgIGVsc2UgICAgICAgIG1wbl9tdWwgKHZpbmYsIGIxLCB0LCBhMywgcyk7CisKKyAgdmluZjAgPSB2aW5mWzBdOwkJCQkvKiB2MSBvdmVybGFwcyB3aXRoIHRoaXMgKi8KKworICAvKiB2MSwgMm4rMSBsaW1icyAqLworICBUT09NNDJfTVVMX05fUkVDICh2MSwgYXMxLCBiczEsIG4sIHNjcmF0Y2hfb3V0KTsKKyAgaWYgKGFzMVtuXSA9PSAxKQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uICh2MSArIG4sIHYxICsgbiwgYnMxLCBuKTsKKyAgICB9CisgIGVsc2UgaWYgKGFzMVtuXSA9PSAyKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorICAgICAgY3kgPSBtcG5fYWRkbHNoMV9uX2lwMSAodjEgKyBuLCBiczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ID0gbXBuX2FkZG11bF8xICh2MSArIG4sIGJzMSwgbiwgQ05TVF9MSU1CKDIpKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoYXMxW25dID09IDMpCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkbXVsXzEgKHYxICsgbiwgYnMxLCBuLCBDTlNUX0xJTUIoMykpOworICAgIH0KKyAgZWxzZQorICAgIGN5ID0gMDsKKyAgaWYgKGJzMVtuXSAhPSAwKQorICAgIGN5ICs9IGFzMVtuXSArIG1wbl9hZGRfbiAodjEgKyBuLCB2MSArIG4sIGFzMSwgbik7CisgIHYxWzIgKiBuXSA9IGN5OworCisgIFRPT000Ml9NVUxfTl9SRUMgKHYwLCBhcCwgYnAsIG4sIHNjcmF0Y2hfb3V0KTsJLyogdjAsIDJuIGxpbWJzICovCisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfNXB0cyAocHAsIHYyLCB2bTEsIG4sIHMgKyB0LCB2bTFfbmVnLCB2aW5mMCk7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNDJfbXVsbWlkLmMgYi9tcG4vZ2VuZXJpYy90b29tNDJfbXVsbWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MWIxMAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb200Ml9tdWxtaWQuYwpAQCAtMCwwICsxLDIzNyBAQAorLyogbXBuX3Rvb200Ml9tdWxtaWQgLS0gdG9vbTQyIG1pZGRsZSBwcm9kdWN0CisKKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhhcnZleS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQnTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworCisvKgorICBNaWRkbGUgcHJvZHVjdCBvZiB7YXAsMm4tMX0gYW5kIHticCxufSwgb3V0cHV0IHdyaXR0ZW4gdG8ge3JwLG4rMn0uCisKKyAgTmVpdGhlciBhcCBub3IgYnAgbWF5IG92ZXJsYXAgcnAuCisKKyAgTXVzdCBoYXZlIG4gPj0gNC4KKworICBBbW91bnQgb2Ygc2NyYXRjaCBzcGFjZSByZXF1aXJlZCBpcyBnaXZlbiBieSBtcG5fdG9vbTQyX211bG1pZF9pdGNoKCkuCisKKyAgRklYTUU6IHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgbiBpcyBzbWFsbCBjb21wYXJlZCB0byBHTVBfTlVNQl9NQVguIFRoZSBleGFjdAorICByZXF1aXJlbWVudHMgc2hvdWxkIGJlIGNsYXJpZmllZC4KKyovCit2b2lkCittcG5fdG9vbTQyX211bG1pZCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX2xpbWJfdCBjeSwgZVsxMl0sIHpoLCB6bDsKKyAgbXBfc2l6ZV90IG07CisgIGludCBuZWc7CisKKyAgQVNTRVJUIChuID49IDQpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocnAsIG4gKyAyLCBhcCwgMipuIC0gMSkpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAocnAsIG4gKyAyLCBicCwgbikpOworCisgIGFwICs9IG4gJiAxOyAgIC8qIGhhbmRsZSBvZGQgcm93IGFuZCBkaWFnb25hbCBsYXRlciAqLworICBtID0gbiAvIDI7CisKKyAgLyogKGUwaDplMGwpIGV0YyBhcmUgY29ycmVjdGlvbiB0ZXJtcywgaW4gMidzIGNvbXBsZW1lbnQgKi8KKyNkZWZpbmUgZTBsIChlWzBdKQorI2RlZmluZSBlMGggKGVbMV0pCisjZGVmaW5lIGUxbCAoZVsyXSkKKyNkZWZpbmUgZTFoIChlWzNdKQorI2RlZmluZSBlMmwgKGVbNF0pCisjZGVmaW5lIGUyaCAoZVs1XSkKKyNkZWZpbmUgZTNsIChlWzZdKQorI2RlZmluZSBlM2ggKGVbN10pCisjZGVmaW5lIGU0bCAoZVs4XSkKKyNkZWZpbmUgZTRoIChlWzldKQorI2RlZmluZSBlNWwgKGVbMTBdKQorI2RlZmluZSBlNWggKGVbMTFdKQorCisjZGVmaW5lIHMgKHNjcmF0Y2ggKyAyKQorI2RlZmluZSB0IChycCArIG0gKyAyKQorI2RlZmluZSBwMCBycAorI2RlZmluZSBwMSBzY3JhdGNoCisjZGVmaW5lIHAyIChycCArIG0pCisjZGVmaW5lIG5leHRfc2NyYXRjaCAoc2NyYXRjaCArIDMqbSArIDEpCisKKyAgLyoKKyAgICAgICAgICAgIHJwICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2gKKyAgfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwgICAgfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwKKyAgMCAgICAgICAgIG0gICAgICAgICAybSsyICAgMCAgICAgICAgIG0gICAgICAgICAybSAgICAgICAgM20rMQorICAgICAgICAgICAgPC0tLS1wMi0tLS0+ICAgICAgIDwtLS0tLS0tLS0tLS0tcy0tLS0tLS0tLS0tLS0+CisgIDwtLS0tcDAtLS0tPjwtLS10LS0tLT4gICAgIDwtLS0tcDEtLS0tPgorICAqLworCisgIC8qIGNvbXB1dGUge3MsM20tMX0gPSB7YSwzbS0xfSArIHthK20sM20tMX0gYW5kIGVycm9yIHRlcm1zIGUwLCBlMSwgZTIsIGUzICovCisgIGN5ID0gbXBuX2FkZF9lcnIxX24gKHMsIGFwLCBhcCArIG0sICZlMGwsIGJwICsgbSwgbSAtIDEsIDApOworICBjeSA9IG1wbl9hZGRfZXJyMl9uIChzICsgbSAtIDEsIGFwICsgbSAtIDEsIGFwICsgMiptIC0gMSwgJmUxbCwKKwkJICAgICAgIGJwICsgbSwgYnAsIG0sIGN5KTsKKyAgbXBuX2FkZF9lcnIxX24gKHMgKyAyKm0gLSAxLCBhcCArIDIqbSAtIDEsIGFwICsgMyptIC0gMSwgJmUzbCwgYnAsIG0sIGN5KTsKKworICAvKiBjb21wdXRlIHQgPSAoLTEpXm5lZyAqICh7YixtfSAtIHtiK20sbX0pIGFuZCBlcnJvciB0ZXJtcyBlNCwgZTUgKi8KKyAgaWYgKG1wbl9jbXAgKGJwICsgbSwgYnAsIG0pIDwgMCkKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9lcnIyX24gKHQsIGJwLCBicCArIG0sICZlNGwsCisJCQkJICAgICAgYXAgKyBtIC0gMSwgYXAgKyAyKm0gLSAxLCBtLCAwKSk7CisgICAgICBuZWcgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX2VycjJfbiAodCwgYnAgKyBtLCBicCwgJmU0bCwKKwkJCQkgICAgICBhcCArIG0gLSAxLCBhcCArIDIqbSAtIDEsIG0sIDApKTsKKyAgICAgIG5lZyA9IDA7CisgICAgfQorCisgIC8qIHJlY3Vyc2l2ZSBtaWRkbGUgcHJvZHVjdHMuIFRoZSBwaWN0dXJlIGlzOgorCisgICAgICBiWzJtLTFdICAgQSAgIEEgICBBICAgQiAgIEIgICBCICAgLSAgIC0gICAtICAgLSAgIC0KKyAgICAgIC4uLiAgICAgICAtICAgQSAgIEEgICBBICAgQiAgIEIgICBCICAgLSAgIC0gICAtICAgLQorICAgICAgYlttXSAgICAgIC0gICAtICAgQSAgIEEgICBBICAgQiAgIEIgICBCICAgLSAgIC0gICAtCisgICAgICBiW20tMV0gICAgLSAgIC0gICAtICAgQyAgIEMgICBDICAgRCAgIEQgICBEICAgLSAgIC0KKyAgICAgIC4uLiAgICAgICAtICAgLSAgIC0gICAtICAgQyAgIEMgICBDICAgRCAgIEQgICBEICAgLQorICAgICAgYlswXSAgICAgIC0gICAtICAgLSAgIC0gICAtICAgQyAgIEMgICBDICAgRCAgIEQgICBECisgICAgICAgICAgICAgICBhWzBdICAgLi4uICBhW21dICAuLi4gIGFbMm1dICAgIC4uLiAgICBhWzRtLTJdCisgICovCisKKyAgaWYgKG0gPCBNVUxNSURfVE9PTTQyX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICAvKiBBICsgQiAqLworICAgICAgbXBuX211bG1pZF9iYXNlY2FzZSAocDAsIHMsIDIqbSAtIDEsIGJwICsgbSwgbSk7CisgICAgICAvKiBhY2N1bXVsYXRlIGhpZ2ggbGltYnMgb2YgcDAgaW50byBlMSAqLworICAgICAgQUREQ19MSU1CIChjeSwgZTFsLCBlMWwsIHAwW21dKTsKKyAgICAgIGUxaCArPSBwMFttICsgMV0gKyBjeTsKKyAgICAgIC8qICgtMSlebmVnICogKEIgLSBDKSAgIChvdmVyd3JpdGVzIGZpcnN0IG0gbGltYnMgb2YgcykgKi8KKyAgICAgIG1wbl9tdWxtaWRfYmFzZWNhc2UgKHAxLCBhcCArIG0sIDIqbSAtIDEsIHQsIG0pOworICAgICAgLyogQyArIEQgICAob3ZlcndyaXRlcyB0KSAqLworICAgICAgbXBuX211bG1pZF9iYXNlY2FzZSAocDIsIHMgKyBtLCAyKm0gLSAxLCBicCwgbSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogYXMgYWJvdmUsIGJ1dCB1c2UgdG9vbTQyIGluc3RlYWQgKi8KKyAgICAgIG1wbl90b29tNDJfbXVsbWlkIChwMCwgcywgYnAgKyBtLCBtLCBuZXh0X3NjcmF0Y2gpOworICAgICAgQUREQ19MSU1CIChjeSwgZTFsLCBlMWwsIHAwW21dKTsKKyAgICAgIGUxaCArPSBwMFttICsgMV0gKyBjeTsKKyAgICAgIG1wbl90b29tNDJfbXVsbWlkIChwMSwgYXAgKyBtLCB0LCBtLCBuZXh0X3NjcmF0Y2gpOworICAgICAgbXBuX3Rvb200Ml9tdWxtaWQgKHAyLCBzICsgbSwgYnAsIG0sIG5leHRfc2NyYXRjaCk7CisgICAgfQorCisgIC8qIGFwcGx5IGVycm9yIHRlcm1zICovCisKKyAgLyogLWUwIGF0IHJwWzBdICovCisgIFNVQkNfTElNQiAoY3ksIHJwWzBdLCBycFswXSwgZTBsKTsKKyAgU1VCQ19MSU1CIChjeSwgcnBbMV0sIHJwWzFdLCBlMGggKyBjeSk7CisgIGlmIChVTkxJS0VMWSAoY3kpKQorICAgIHsKKyAgICAgIGN5ID0gKG0gPiAyKSA/IG1wbl9zdWJfMSAocnAgKyAyLCBycCArIDIsIG0gLSAyLCAxKSA6IDE7CisgICAgICBTVUJDX0xJTUIgKGN5LCBlMWwsIGUxbCwgY3kpOworICAgICAgZTFoIC09IGN5OworICAgIH0KKworICAvKiB6ID0gZTEgLSBlMiArIGhpZ2gocDApICovCisgIFNVQkNfTElNQiAoY3ksIHpsLCBlMWwsIGUybCk7CisgIHpoID0gZTFoIC0gZTJoIC0gY3k7CisKKyAgLyogeiBhdCBycFttXSAqLworICBBRERDX0xJTUIgKGN5LCBycFttXSwgcnBbbV0sIHpsKTsKKyAgemggPSAoemggKyBjeSkgJiBHTVBfTlVNQl9NQVNLOworICBBRERDX0xJTUIgKGN5LCBycFttICsgMV0sIHJwW20gKyAxXSwgemgpOworICBjeSAtPSAoemggPj4gKEdNUF9OVU1CX0JJVFMgLSAxKSk7CisgIGlmIChVTkxJS0VMWSAoY3kpKQorICAgIHsKKyAgICAgIGlmIChjeSA9PSAxKQorCW1wbl9hZGRfMSAocnAgKyBtICsgMiwgcnAgKyBtICsgMiwgbSwgMSk7CisgICAgICBlbHNlIC8qIGN5ID09IC0xICovCisJbXBuX3N1Yl8xIChycCArIG0gKyAyLCBycCArIG0gKyAyLCBtLCAxKTsKKyAgICB9CisKKyAgLyogZTMgYXQgcnBbMiptXSAqLworICBBRERDX0xJTUIgKGN5LCBycFsyKm1dLCBycFsyKm1dLCBlM2wpOworICBycFsyKm0gKyAxXSA9IChycFsyKm0gKyAxXSArIGUzaCArIGN5KSAmIEdNUF9OVU1CX01BU0s7CisKKyAgLyogZTQgYXQgcDFbMF0gKi8KKyAgQUREQ19MSU1CIChjeSwgcDFbMF0sIHAxWzBdLCBlNGwpOworICBBRERDX0xJTUIgKGN5LCBwMVsxXSwgcDFbMV0sIGU0aCArIGN5KTsKKyAgaWYgKFVOTElLRUxZIChjeSkpCisgICAgbXBuX2FkZF8xIChwMSArIDIsIHAxICsgMiwgbSwgMSk7CisKKyAgLyogLWU1IGF0IHAxW21dICovCisgIFNVQkNfTElNQiAoY3ksIHAxW21dLCBwMVttXSwgZTVsKTsKKyAgcDFbbSArIDFdID0gKHAxW20gKyAxXSAtIGU1aCAtIGN5KSAmIEdNUF9OVU1CX01BU0s7CisKKyAgLyogYWRqdXN0bWVudCBpZiBwMSBlbmRzIHVwIG5lZ2F0aXZlICovCisgIGN5ID0gKHAxW20gKyAxXSA+PiAoR01QX05VTUJfQklUUyAtIDEpKTsKKworICAvKiBhZGQgKC0xKV5uZWcgKiAocDEgLSBCXm0gKiBwMSkgdG8gb3V0cHV0ICovCisgIGlmIChuZWcpCisgICAgeworICAgICAgbXBuX3N1Yl8xIChycCArIG0gKyAyLCBycCArIG0gKyAyLCBtLCBjeSk7CisgICAgICBtcG5fYWRkIChycCwgcnAsIDIqbSArIDIsIHAxLCBtICsgMik7ICAgICAgICAgICAgIC8qIEEgKyBDICovCisgICAgICBtcG5fc3ViX24gKHJwICsgbSwgcnAgKyBtLCBwMSwgbSArIDIpOyAgICAgICAgICAgIC8qIEIgKyBEICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBuX2FkZF8xIChycCArIG0gKyAyLCBycCArIG0gKyAyLCBtLCBjeSk7CisgICAgICBtcG5fc3ViIChycCwgcnAsIDIqbSArIDIsIHAxLCBtICsgMik7ICAgICAgICAgICAgIC8qIEEgKyBDICovCisgICAgICBtcG5fYWRkX24gKHJwICsgbSwgcnAgKyBtLCBwMSwgbSArIDIpOyAgICAgICAgICAgIC8qIEIgKyBEICovCisgICAgfQorCisgIC8qIG9kZCByb3cgYW5kIGRpYWdvbmFsICovCisgIGlmIChuICYgMSkKKyAgICB7CisgICAgICAvKgorICAgICAgICBQcm9kdWN0cyBtYXJrZWQgRSBhcmUgYWxyZWFkeSBkb25lLiBXZSBuZWVkIHRvIGRvIHByb2R1Y3RzIG1hcmtlZCBPLgorCisgICAgICAgIE9PT09PLS0tLQorICAgICAgICAtRUVFRU8tLS0KKyAgICAgICAgLS1FRUVFTy0tCisgICAgICAgIC0tLUVFRUVPLQorICAgICAgICAtLS0tRUVFRU8KKyAgICAgICAqLworCisgICAgICAvKiBmaXJzdCByb3cgb2YgTydzICovCisgICAgICBjeSA9IG1wbl9hZGRtdWxfMSAocnAsIGFwIC0gMSwgbiwgYnBbbiAtIDFdKTsKKyAgICAgIEFERENfTElNQiAocnBbbiArIDFdLCBycFtuXSwgcnBbbl0sIGN5KTsKKworICAgICAgLyogTydzIG9uIGRpYWdvbmFsICovCisgICAgICAvKiBGSVhNRTogc2hvdWxkIHByb2JhYmx5IGRlZmluZSBhbiBpbnRlcmZhY2UgIm1wbl9tdWxtaWRfZGlhZ18xIgorICAgICAgICAgdGhhdCBjYW4gaGFuZGxlIHRoZSBzdW0gYmVsb3cuIEN1cnJlbnRseSB3ZSdyZSByZWx5aW5nIG9uCisgICAgICAgICBtdWxtaWRfYmFzZWNhc2UgYmVpbmcgcHJldHR5IGZhc3QgZm9yIGEgZGlhZ29uYWwgc3VtIGxpa2UgdGhpcywKKwkgd2hpY2ggaXMgdHJ1ZSBhdCBsZWFzdCBmb3IgdGhlIEs4IGFzbSB2ZXJzaW9uLCBidXQgc3VyZWx5IGZhbHNlCisJIGZvciB0aGUgZ2VuZXJpYyB2ZXJzaW9uLiAqLworICAgICAgbXBuX211bG1pZF9iYXNlY2FzZSAoZSwgYXAgKyBuIC0gMSwgbiAtIDEsIGJwLCBuIC0gMSk7CisgICAgICBtcG5fYWRkX24gKHJwICsgbiAtIDEsIHJwICsgbiAtIDEsIGUsIDMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb200M19tdWwuYyBiL21wbi9nZW5lcmljL3Rvb200M19tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFjZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbTQzX211bC5jCkBAIC0wLDAgKzEsMjM4IEBACisvKiBtcG5fdG9vbTQzX211bCAtLSBNdWx0aXBseSB7YXAsYW59IGFuZCB7YnAsYm59IHdoZXJlIGFuIGlzIG5vbWluYWxseSA0LzMKKyAgIHRpbWVzIGFzIGxhcmdlIGFzIGJuLiAgT3IgbW9yZSBhY2N1cmF0ZWx5LCBibiA8IGFuIDwgMiBibi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRoZSBpZGVhIG9mIGFwcGx5aW5nIHRvb20gdG8gdW5iYWxhbmNlZCBtdWx0aXBsaWNhdGlvbiBpcyBkdWUgdG8gTWFyY28KKyAgIEJvZHJhdG8gYW5kIEFsYmVydG8gWmFub25pLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogLTIsIC0xLCAwLCArMSwgKzIsICtpbmYKKworICA8LXMtPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorICAgX19fIF9fX19fXyBfX19fX18gX19fX19fCisgIHxhM198X19fYTJffF9fX2ExX3xfX19hMF98CisJfF9iMl98X19fYjFffF9fX2IwX3wKKwk8LXQtLT48LS1uLS0+PC0tbi0tPgorCisgIHYwICA9ICBhMCAgICAgICAgICAgICAqIGIwICAgICAgICAgICMgICBBKDApKkIoMCkKKyAgdjEgID0gKGEwKyBhMSsgYTIrIGEzKSooYjArIGIxKyBiMikgIyAgIEEoMSkqQigxKSAgICAgIGFoICA8PSAzICBiaCA8PSAyCisgIHZtMSA9IChhMC0gYTErIGEyLSBhMykqKGIwLSBiMSsgYjIpICMgIEEoLTEpKkIoLTEpICAgIHxhaHwgPD0gMSB8Ymh8PD0gMQorICB2MiAgPSAoYTArMmExKzRhMis4YTMpKihiMCsyYjErNGIyKSAjICAgQSgyKSpCKDIpICAgICAgYWggIDw9IDE0IGJoIDw9IDYKKyAgdm0yID0gKGEwLTJhMSs0YTItOGEzKSooYjAtMmIxKzRiMikgIyAgQSgtMikqQigtMikgICAgfGFofCA8PSA5IHxiaHw8PSA0CisgIHZpbmY9ICAgICAgICAgICAgICBhMyAqICAgICAgICAgYjIgICMgQShpbmYpKkIoaW5mKQorKi8KKwordm9pZAorbXBuX3Rvb200M19tdWwgKG1wX3B0ciBwcCwKKwkJbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCW1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIGVudW0gdG9vbTZfZmxhZ3MgZmxhZ3M7CisgIG1wX2xpbWJfdCBjeTsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisjZGVmaW5lIGEyICAoYXAgKyAyICogbikKKyNkZWZpbmUgYTMgIChhcCArIDMgKiBuKQorI2RlZmluZSBiMCAgYnAKKyNkZWZpbmUgYjEgIChicCArIG4pCisjZGVmaW5lIGIyICAoYnAgKyAyICogbikKKworICBuID0gMSArICgzICogYW4gPj0gNCAqIGJuID8gKGFuIC0gMSkgPj4gMiA6IChibiAtIDEpIC8gKHNpemVfdCkgMyk7CisKKyAgcyA9IGFuIC0gMyAqIG47CisgIHQgPSBibiAtIDIgKiBuOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworCisgIC8qIFRoaXMgaXMgdHJ1ZSB3aGVuZXZlciBhbiA+PSAyNSBvciBibiA+PSAxOSwgSSB0aGluay4gSXQKKyAgICAgZ3VhcmFudGVlcyB0aGF0IHdlIGNhbiBmaXQgNSB2YWx1ZXMgb2Ygc2l6ZSBuKzEgaW4gdGhlIHByb2R1Y3QKKyAgICAgYXJlYS4gKi8KKyAgQVNTRVJUIChzK3QgPj0gNSk7CisKKyNkZWZpbmUgdjAgICAgcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdm0xICAgKHNjcmF0Y2gpCQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdjEgICAgKHBwICsgMipuKQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdm0yICAgKHNjcmF0Y2ggKyAyICogbiArIDEpCQkvKiAybisxICovCisjZGVmaW5lIHYyICAgIChzY3JhdGNoICsgNCAqIG4gKyAyKQkJLyogMm4rMSAqLworI2RlZmluZSB2aW5mICAocHAgKyA1ICogbikJCQkvKiBzK3QgKi8KKyNkZWZpbmUgYnMxICAgIHBwCQkJCS8qIG4rMSAqLworI2RlZmluZSBic20xICAoc2NyYXRjaCArIDIgKiBuICsgMikJCS8qIG4rMSAqLworI2RlZmluZSBhc20xICAoc2NyYXRjaCArIDMgKiBuICsgMykJCS8qIG4rMSAqLworI2RlZmluZSBhc20yICAoc2NyYXRjaCArIDQgKiBuICsgNCkJCS8qIG4rMSAqLworI2RlZmluZSBic20yICAocHAgKyBuICsgMSkJCQkvKiBuKzEgKi8KKyNkZWZpbmUgYnMyICAgKHBwICsgMiAqIG4gKyAyKQkJCS8qIG4rMSAqLworI2RlZmluZSBhczIgICAocHAgKyAzICogbiArIDMpCQkJLyogbisxICovCisjZGVmaW5lIGFzMSAgIChwcCArIDQgKiBuICsgNCkJCQkvKiBuKzEgKi8KKworICAvKiBUb3RhbCBzY2NyYXRjaCBuZWVkIGlzIDYgKiBuICsgMyArIDE7IHdlIGFsbG9jYXRlIG9uZSBleHRyYQorICAgICBsaW1iLCBiZWNhdXNlIHByb2R1Y3RzIHdpbGwgb3ZlcndyaXRlIDJuKzIgbGltYnMuICovCisKKyNkZWZpbmUgYTBhMiAgc2NyYXRjaAorI2RlZmluZSBiMGIyICBzY3JhdGNoCisjZGVmaW5lIGExYTMgIGFzbTEKKyNkZWZpbmUgYjFkICAgYnNtMQorCisgIC8qIENvbXB1dGUgYXMyIGFuZCBhc20yLiAgKi8KKyAgZmxhZ3MgPSAoZW51bSB0b29tNl9mbGFncykgKHRvb202X3ZtMl9uZWcgJiBtcG5fdG9vbV9ldmFsX2RncjNfcG0yIChhczIsIGFzbTIsIGFwLCBuLCBzLCBhMWEzKSk7CisKKyAgLyogQ29tcHV0ZSBiczIgYW5kIGJzbTIuICAqLworICBiMWRbbl0gPSBtcG5fbHNoaWZ0IChiMWQsIGIxLCBuLCAxKTsJCQkvKiAgICAgICAyYjEgICAgICAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX24KKyAgY3kgPSBtcG5fYWRkbHNoMl9uIChiMGIyLCBiMCwgYjIsIHQpOwkJCS8qICA0YjIgICAgICArIGIwICovCisjZWxzZQorICBjeSAgPSBtcG5fbHNoaWZ0IChiMGIyLCBiMiwgdCwgMik7CQkJLyogIDRiMiAgICAgICAgICAgKi8KKyAgY3kgKz0gbXBuX2FkZF9uIChiMGIyLCBiMGIyLCBiMCwgdCk7CQkJLyogIDRiMiAgICAgICsgYjAgKi8KKyNlbmRpZgorICBpZiAodCAhPSBuKQorICAgIGN5ID0gbXBuX2FkZF8xIChiMGIyICsgdCwgYjAgKyB0LCBuIC0gdCwgY3kpOworICBiMGIyW25dID0gY3k7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKG1wbl9jbXAgKGIwYjIsIGIxZCwgbisxKSA8IDApCisgICAgeworICAgICAgbXBuX2FkZF9uX3N1Yl9uIChiczIsIGJzbTIsIGIxZCwgYjBiMiwgbisxKTsKKyAgICAgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeIHRvb202X3ZtMl9uZWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9hZGRfbl9zdWJfbiAoYnMyLCBic20yLCBiMGIyLCBiMWQsIG4rMSk7CisgICAgfQorI2Vsc2UKKyAgbXBuX2FkZF9uIChiczIsIGIwYjIsIGIxZCwgbisxKTsKKyAgaWYgKG1wbl9jbXAgKGIwYjIsIGIxZCwgbisxKSA8IDApCisgICAgeworICAgICAgbXBuX3N1Yl9uIChic20yLCBiMWQsIGIwYjIsIG4rMSk7CisgICAgICBmbGFncyA9IChlbnVtIHRvb202X2ZsYWdzKSAoZmxhZ3MgXiB0b29tNl92bTJfbmVnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcG5fc3ViX24gKGJzbTIsIGIwYjIsIGIxZCwgbisxKTsKKyAgICB9CisjZW5kaWYKKworICAvKiBDb21wdXRlIGFzMSBhbmQgYXNtMS4gICovCisgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeICh0b29tNl92bTFfbmVnICYgbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAoYXMxLCBhc20xLCBhcCwgbiwgcywgYTBhMikpKTsKKworICAvKiBDb21wdXRlIGJzMSBhbmQgYnNtMS4gICovCisgIGJzbTFbbl0gPSBtcG5fYWRkIChic20xLCBiMCwgbiwgYjIsIHQpOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBpZiAoYnNtMVtuXSA9PSAwICYmIG1wbl9jbXAgKGJzbTEsIGIxLCBuKSA8IDApCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX25fc3ViX24gKGJzMSwgYnNtMSwgYjEsIGJzbTEsIG4pOworICAgICAgYnMxW25dID0gY3kgPj4gMTsKKyAgICAgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeIHRvb202X3ZtMV9uZWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChiczEsIGJzbTEsIGJzbTEsIGIxLCBuKTsKKyAgICAgIGJzMVtuXSA9IGJzbTFbbl0gKyAoY3kgPj4gMSk7CisgICAgICBic20xW25dLT0gY3kgJiAxOworICAgIH0KKyNlbHNlCisgIGJzMVtuXSA9IGJzbTFbbl0gKyBtcG5fYWRkX24gKGJzMSwgYnNtMSwgYjEsIG4pOworICBpZiAoYnNtMVtuXSA9PSAwICYmIG1wbl9jbXAgKGJzbTEsIGIxLCBuKSA8IDApCisgICAgeworICAgICAgbXBuX3N1Yl9uIChic20xLCBiMSwgYnNtMSwgbik7CisgICAgICBmbGFncyA9IChlbnVtIHRvb202X2ZsYWdzKSAoZmxhZ3MgXiB0b29tNl92bTFfbmVnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBic20xW25dIC09IG1wbl9zdWJfbiAoYnNtMSwgYnNtMSwgYjEsIG4pOworICAgIH0KKyNlbmRpZgorCisgIEFTU0VSVCAoYXMxW25dIDw9IDMpOworICBBU1NFUlQgKGJzMVtuXSA8PSAyKTsKKyAgQVNTRVJUIChhc20xW25dIDw9IDEpOworICBBU1NFUlQgKGJzbTFbbl0gPD0gMSk7CisgIEFTU0VSVCAoYXMyW25dIDw9MTQpOworICBBU1NFUlQgKGJzMltuXSA8PSA2KTsKKyAgQVNTRVJUIChhc20yW25dIDw9IDkpOworICBBU1NFUlQgKGJzbTJbbl0gPD0gNCk7CisKKyAgLyogdm0xLCAybisxIGxpbWJzICovCisgIHZtMVsyKm5dID0gMDsKKyAgbXBuX211bF9uICh2bTEsIGFzbTEsIGJzbTEsIG4gKyAoYXNtMVtuXSB8IGJzbTFbbl0pKTsgIC8qIFc0ICovCisKKyAgLyogdm0yLCAybisxIGxpbWJzICovCisgIG1wbl9tdWxfbiAodm0yLCBhc20yLCBic20yLCBuKzEpOyAgLyogVzIgKi8KKworICAvKiB2MiwgMm4rMSBsaW1icyAqLworICBtcG5fbXVsX24gKHYyLCBhczIsIGJzMiwgbisxKTsgIC8qIFcxICovCisKKyAgLyogdjEsIDJuKzEgbGltYnMgKi8KKyAgbXBuX211bF9uICh2MSwgYXMxLCBiczEsIG4rMSk7ICAvKiBXMyAqLworCisgIC8qIHZpbmYsIHMrdCBsaW1icyAqLyAgIC8qIFcwICovCisgIGlmIChzID4gdCkgIG1wbl9tdWwgKHZpbmYsIGEzLCBzLCBiMiwgdCk7CisgIGVsc2UgICAgICAgIG1wbl9tdWwgKHZpbmYsIGIyLCB0LCBhMywgcyk7CisKKyAgLyogdjAsIDJuIGxpbWJzICovCisgIG1wbl9tdWxfbiAodjAsIGFwLCBicCwgbik7ICAvKiBXNSAqLworCisgIG1wbl90b29tX2ludGVycG9sYXRlXzZwdHMgKHBwLCBuLCBmbGFncywgdm0xLCB2bTIsIHYyLCB0ICsgcyk7CisKKyN1bmRlZiB2MAorI3VuZGVmIHZtMQorI3VuZGVmIHYxCisjdW5kZWYgdm0yCisjdW5kZWYgdjIKKyN1bmRlZiB2aW5mCisjdW5kZWYgYnMxCisjdW5kZWYgYnMyCisjdW5kZWYgYnNtMQorI3VuZGVmIGJzbTIKKyN1bmRlZiBhc20xCisjdW5kZWYgYXNtMgorLyogI3VuZGVmIGFzMSAqLworLyogI3VuZGVmIGFzMiAqLworI3VuZGVmIGEwYTIKKyN1bmRlZiBiMGIyCisjdW5kZWYgYTFhMworI3VuZGVmIGIxZAorI3VuZGVmIGEwCisjdW5kZWYgYTEKKyN1bmRlZiBhMgorI3VuZGVmIGEzCisjdW5kZWYgYjAKKyN1bmRlZiBiMQorI3VuZGVmIGIyCit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNDRfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNDRfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2MTg5OQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb200NF9tdWwuYwpAQCAtMCwwICsxLDIzOSBAQAorLyogbXBuX3Rvb200NF9tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiBhbmQgYm4gYXJlIGNsb3NlIGluCisgICBzaXplLiAgT3IgbW9yZSBhY2N1cmF0ZWx5LCBibiA8PSBhbiA8ICg0LzMpYm4uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDA4LCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogMCwgKzEsIC0xLCArMiwgLTIsIDEvMiwgK2luZgorCisgIDwtcy0tPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorICAgX19fXyBfX19fX18gX19fX19fIF9fX19fXworICB8X2EzX3xfX19hMl98X19fYTFffF9fX2EwX3wKKyAgIHxiM198X19fYjJffF9fX2IxX3xfX19iMF98CisgICA8LXQtPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorCisgIHYwICA9ICAgYTAgICAgICAgICAgICAgKiAgYjAgICAgICAgICAgICAgICMgICAgQSgwKSpCKDApCisgIHYxICA9ICggYTArIGExKyBhMisgYTMpKiggYjArIGIxKyBiMisgYjMpICMgICAgQSgxKSpCKDEpICAgICAgYWggIDw9IDMgICBiaCAgPD0gMworICB2bTEgPSAoIGEwLSBhMSsgYTItIGEzKSooIGIwLSBiMSsgYjItIGIzKSAjICAgQSgtMSkqQigtMSkgICAgfGFofCA8PSAxICB8Ymh8IDw9IDEKKyAgdjIgID0gKCBhMCsyYTErNGEyKzhhMykqKCBiMCsyYjErNGIyKzhiMykgIyAgICBBKDIpKkIoMikgICAgICBhaCAgPD0gMTQgIGJoICA8PSAxNAorICB2bTIgPSAoIGEwLTJhMSs0YTItOGEzKSooIGIwLTJiMSs0YjItOGIzKSAjICAgQSgtMikqQigtMikgICAgfGFofCA8PSA5ICB8Ymh8IDw9IDkKKyAgdmggID0gKDhhMCs0YTErMmEyKyBhMykqKDhiMCs0YjErMmIyKyBiMykgIyAgQSgxLzIpKkIoMS8yKSAgICBhaCAgPD0gMTQgIGJoICA8PSAxNAorICB2aW5mPSAgICAgICAgICAgICAgIGEzICogICAgICAgICAgYjIgICAgICAjICBBKGluZikqQihpbmYpCisqLworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisjZGVmaW5lIE1BWUJFX211bF9iYXNlY2FzZSAxCisjZGVmaW5lIE1BWUJFX211bF90b29tMjIgICAxCisjZGVmaW5lIE1BWUJFX211bF90b29tNDQgICAxCisjZWxzZQorI2RlZmluZSBNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisgIChNVUxfVE9PTTQ0X1RIUkVTSE9MRCA8IDQgKiBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb20yMgkJCQkJCVwKKyAgKE1VTF9UT09NNDRfVEhSRVNIT0xEIDwgNCAqIE1VTF9UT09NMzNfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9tdWxfdG9vbTQ0CQkJCQkJXAorICAoTVVMX1RPT002SF9USFJFU0hPTEQgPj0gNCAqIE1VTF9UT09NNDRfVEhSRVNIT0xEKQorI2VuZGlmCisKKyNkZWZpbmUgVE9PTTQ0X01VTF9OX1JFQyhwLCBhLCBiLCBuLCB3cykJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpCQkJXAorICAgICAgbXBuX211bF9iYXNlY2FzZSAocCwgYSwgbiwgYiwgbik7CQkJCQlcCisgICAgZWxzZSBpZiAoTUFZQkVfbXVsX3Rvb20yMgkJCQkJCVwKKwkgICAgICYmIEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT00zM19USFJFU0hPTEQpKQkJXAorICAgICAgbXBuX3Rvb20yMl9tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICAgIGVsc2UgaWYgKCEgTUFZQkVfbXVsX3Rvb200NAkJCQkJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT000NF9USFJFU0hPTEQpKQkJXAorICAgICAgbXBuX3Rvb20zM19tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIG1wbl90b29tNDRfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogVXNlIG9mIHNjcmF0Y2ggc3BhY2UuIEluIHRoZSBwcm9kdWN0IGFyZWEsIHdlIHN0b3JlCisKKyAgICAgIF9fX19fX19fX19fX19fX19fX18KKyAgICAgfHZpbmZ8X19fX3xfdjFffF92MF98CisgICAgICBzK3QgIDJuLTEgMm4rMSAgMm4KKworICAgVGhlIG90aGVyIHJlY3Vyc2l2ZSBwcm9kdWN0cywgdm0xLCB2Miwgdm0yLCB2aCBhcmUgc3RvcmVkIGluIHRoZQorICAgc2NyYXRjaCBhcmVhLiBXaGVuIGNvbXB1dGluZyB0aGVtLCB3ZSB1c2UgdGhlIHByb2R1Y3QgYXJlYSBmb3IKKyAgIGludGVybWVkaWF0ZSB2YWx1ZXMuCisKKyAgIE5leHQsIHdlIGNvbXB1dGUgdjEuIFdlIGNhbiBzdG9yZSB0aGUgaW50ZXJtZWRpYXRlIGZhY3RvcnMgYXQgdjAKKyAgIGFuZCBhdCB2aCArIDJuICsgMi4KKworICAgRmluYWxseSwgZm9yIHYwIGFuZCB2aW5mLCBmYWN0b3JzIGFyZSBwYXJ0cyBvZiB0aGUgaW5wdXQgb3BlcmFuZHMsCisgICBhbmQgd2UgbmVlZCBzY3JhdGNoIHNwYWNlIG9ubHkgZm9yIHRoZSByZWN1cnNpdmUgbXVsdGlwbGljYXRpb24uCisKKyAgIEluIGFsbCwgaWYgUyhhbikgaXMgdGhlIHNjcmF0Y2ggbmVlZCwgdGhlIG5lZWRlZCBzcGFjZSBpcyBib3VuZGVkIGJ5CisKKyAgICAgUyhhbikgPD0gNCAoMipjZWlsKGFuLzQpICsgMSkgKyAxICsgUyhjZWlsKGFuLzQpICsgMSkKKworICAgd2hpY2ggc2hvdWxkIGdpdmUgUyhuKSA9IDggbi8zICsgYyBsb2cobikgZm9yIHNvbWUgY29uc3RhbnQgYy4KKyovCisKK3ZvaWQKK21wbl90b29tNDRfbXVsIChtcF9wdHIgcHAsCisJCW1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQltcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwKKwkJbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBuLCBzLCB0OworICBtcF9saW1iX3QgY3k7CisgIGVudW0gdG9vbTdfZmxhZ3MgZmxhZ3M7CisKKyNkZWZpbmUgYTAgIGFwCisjZGVmaW5lIGExICAoYXAgKyBuKQorI2RlZmluZSBhMiAgKGFwICsgMipuKQorI2RlZmluZSBhMyAgKGFwICsgMypuKQorI2RlZmluZSBiMCAgYnAKKyNkZWZpbmUgYjEgIChicCArIG4pCisjZGVmaW5lIGIyICAoYnAgKyAyKm4pCisjZGVmaW5lIGIzICAoYnAgKyAzKm4pCisKKyAgQVNTRVJUIChhbiA+PSBibik7CisKKyAgbiA9IChhbiArIDMpID4+IDI7CisKKyAgcyA9IGFuIC0gMyAqIG47CisgIHQgPSBibiAtIDMgKiBuOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworICBBU1NFUlQgKHMgPj0gdCk7CisKKyAgLyogTk9URTogVGhlIG11bHRpcGxpY2F0aW9ucyB0byB2Miwgdm0yLCB2aCBhbmQgdm0xIG92ZXJ3cml0ZXMgdGhlCisgICAqIGZvbGxvd2luZyBsaW1iLCBzbyB0aGVzZSBtdXN0IGJlIGNvbXB1dGVkIGluIG9yZGVyLCBhbmQgd2UgbmVlZCBhCisgICAqIG9uZSBsaW1iIGdhcCB0byB0cC4gKi8KKyNkZWZpbmUgdjAgICAgcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdjEgICAgKHBwICsgMiAqIG4pCQkJLyogMm4rMSAqLworI2RlZmluZSB2aW5mICAocHAgKyA2ICogbikJCQkvKiBzK3QgKi8KKyNkZWZpbmUgdjIgICAgc2NyYXRjaAkJCQkvKiAybisxICovCisjZGVmaW5lIHZtMiAgIChzY3JhdGNoICsgMiAqIG4gKyAxKQkJLyogMm4rMSAqLworI2RlZmluZSB2aCAgICAoc2NyYXRjaCArIDQgKiBuICsgMikJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdm0xICAgKHNjcmF0Y2ggKyA2ICogbiArIDMpCQkvKiAybisxICovCisjZGVmaW5lIHRwIChzY3JhdGNoICsgOCpuICsgNSkKKworICAvKiBhcHggYW5kIGJweCBtdXN0IG5vdCBvdmVybGFwIHdpdGggdjEgKi8KKyNkZWZpbmUgYXB4ICAgcHAJCQkJLyogbisxICovCisjZGVmaW5lIGFteCAgIChwcCArIG4gKyAxKQkJCS8qIG4rMSAqLworI2RlZmluZSBibXggICAocHAgKyAyKm4gKyAyKQkJCS8qIG4rMSAqLworI2RlZmluZSBicHggICAocHAgKyA0Km4gKyAyKQkJCS8qIG4rMSAqLworCisgIC8qIFRvdGFsIHNjcmF0Y2ggbmVlZDogOCpuICsgNSArIHNjcmF0Y2ggZm9yIHJlY3Vyc2l2ZSBjYWxscy4gVGhpcworICAgICBnaXZlcyByb3VnaGx5IDMyIG4vMyArIGxvZyB0ZXJtLiAqLworCisgIC8qIENvbXB1dGUgYXB4ID0gYTAgKyAyIGExICsgNCBhMiArIDggYTMgYW5kIGFteCA9IGEwIC0gMiBhMSArIDQgYTIgLSA4IGEzLiAgKi8KKyAgZmxhZ3MgPSAoZW51bSB0b29tN19mbGFncykgKHRvb203X3cxX25lZyAmIG1wbl90b29tX2V2YWxfZGdyM19wbTIgKGFweCwgYW14LCBhcCwgbiwgcywgdHApKTsKKworICAvKiBDb21wdXRlIGJweCA9IGIwICsgMiBiMSArIDQgYjIgKyA4IGIzIGFuZCBibXggPSBiMCAtIDIgYjEgKyA0IGIyIC0gOCBiMy4gICovCisgIGZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChmbGFncyBeICh0b29tN193MV9uZWcgJiBtcG5fdG9vbV9ldmFsX2RncjNfcG0yIChicHgsIGJteCwgYnAsIG4sIHQsIHRwKSkpOworCisgIFRPT000NF9NVUxfTl9SRUMgKHYyLCBhcHgsIGJweCwgbiArIDEsIHRwKTsJLyogdjIsICAybisxIGxpbWJzICovCisgIFRPT000NF9NVUxfTl9SRUMgKHZtMiwgYW14LCBibXgsIG4gKyAxLCB0cCk7CS8qIHZtMiwgIDJuKzEgbGltYnMgKi8KKworICAvKiBDb21wdXRlIGFweCA9IDggYTAgKyA0IGExICsgMiBhMiArIGEzID0gKCgoMiphMCArIGExKSAqIDIgKyBhMikgKiAyICsgYTMgKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIGN5ID0gbXBuX2FkZGxzaDFfbiAoYXB4LCBhMSwgYTAsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fYWRkbHNoMV9uIChhcHgsIGEyLCBhcHgsIG4pOworICBpZiAocyA8IG4pCisgICAgeworICAgICAgbXBfbGltYl90IGN5MjsKKyAgICAgIGN5MiA9IG1wbl9hZGRsc2gxX24gKGFweCwgYTMsIGFweCwgcyk7CisgICAgICBhcHhbbl0gPSAyKmN5ICsgbXBuX2xzaGlmdCAoYXB4ICsgcywgYXB4ICsgcywgbiAtIHMsIDEpOworICAgICAgTVBOX0lOQ1JfVSAoYXB4ICsgcywgbisxLXMsIGN5Mik7CisgICAgfQorICBlbHNlCisgICAgYXB4W25dID0gMipjeSArIG1wbl9hZGRsc2gxX24gKGFweCwgYTMsIGFweCwgbik7CisjZWxzZQorICBjeSA9IG1wbl9sc2hpZnQgKGFweCwgYTAsIG4sIDEpOworICBjeSArPSBtcG5fYWRkX24gKGFweCwgYXB4LCBhMSwgbik7CisgIGN5ID0gMipjeSArIG1wbl9sc2hpZnQgKGFweCwgYXB4LCBuLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChhcHgsIGFweCwgYTIsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhcHgsIGFweCwgbiwgMSk7CisgIGFweFtuXSA9IGN5ICsgbXBuX2FkZCAoYXB4LCBhcHgsIG4sIGEzLCBzKTsKKyNlbmRpZgorCisgIC8qIENvbXB1dGUgYnB4ID0gOCBiMCArIDQgYjEgKyAyIGIyICsgYjMgPSAoKCgyKmIwICsgYjEpICogMiArIGIyKSAqIDIgKyBiMyAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgY3kgPSBtcG5fYWRkbHNoMV9uIChicHgsIGIxLCBiMCwgbik7CisgIGN5ID0gMipjeSArIG1wbl9hZGRsc2gxX24gKGJweCwgYjIsIGJweCwgbik7CisgIGlmICh0IDwgbikKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kyOworICAgICAgY3kyID0gbXBuX2FkZGxzaDFfbiAoYnB4LCBiMywgYnB4LCB0KTsKKyAgICAgIGJweFtuXSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChicHggKyB0LCBicHggKyB0LCBuIC0gdCwgMSk7CisgICAgICBNUE5fSU5DUl9VIChicHggKyB0LCBuKzEtdCwgY3kyKTsKKyAgICB9CisgIGVsc2UKKyAgICBicHhbbl0gPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYnB4LCBiMywgYnB4LCBuKTsKKyNlbHNlCisgIGN5ID0gbXBuX2xzaGlmdCAoYnB4LCBiMCwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYnB4LCBicHgsIGIxLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2xzaGlmdCAoYnB4LCBicHgsIG4sIDEpOworICBjeSArPSBtcG5fYWRkX24gKGJweCwgYnB4LCBiMiwgbik7CisgIGN5ID0gMipjeSArIG1wbl9sc2hpZnQgKGJweCwgYnB4LCBuLCAxKTsKKyAgYnB4W25dID0gY3kgKyBtcG5fYWRkIChicHgsIGJweCwgbiwgYjMsIHQpOworI2VuZGlmCisKKyAgQVNTRVJUIChhcHhbbl0gPCAxNSk7CisgIEFTU0VSVCAoYnB4W25dIDwgMTUpOworCisgIFRPT000NF9NVUxfTl9SRUMgKHZoLCBhcHgsIGJweCwgbiArIDEsIHRwKTsJLyogdmgsICAybisxIGxpbWJzICovCisKKyAgLyogQ29tcHV0ZSBhcHggPSBhMCArIGExICsgYTIgKyBhMyBhbmQgYW14ID0gYTAgLSBhMSArIGEyIC0gYTMuICAqLworICBmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAoZmxhZ3MgfCAodG9vbTdfdzNfbmVnICYgbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAoYXB4LCBhbXgsIGFwLCBuLCBzLCB0cCkpKTsKKworICAvKiBDb21wdXRlIGJweCA9IGIwICsgYjEgKyBiMiArIGIzIGFuZCBibXggPSBiMCAtIGIxICsgYjIgLSBiMy4gICovCisgIGZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChmbGFncyBeICh0b29tN193M19uZWcgJiBtcG5fdG9vbV9ldmFsX2RncjNfcG0xIChicHgsIGJteCwgYnAsIG4sIHQsIHRwKSkpOworCisgIEFTU0VSVCAoYW14W25dIDw9IDEpOworICBBU1NFUlQgKGJteFtuXSA8PSAxKTsKKworICB2bTEgWzIgKiBuXSA9IDA7CisgIFRPT000NF9NVUxfTl9SRUMgKHZtMSwgYW14LCBibXgsIG4gKyAoYm14W25dIHwgYW14W25dKSwgdHApOwkvKiB2bTEsICAybisxIGxpbWJzICovCisgIC8qIENsb2JiZXJzIGFteCwgYm14LiAqLworICBUT09NNDRfTVVMX05fUkVDICh2MSwgYXB4LCBicHgsIG4gKyAxLCB0cCk7CS8qIHYxLCAgMm4rMSBsaW1icyAqLworCisgIFRPT000NF9NVUxfTl9SRUMgKHYwLCBhMCwgYjAsIG4sIHRwKTsKKyAgaWYgKHMgPiB0KQorICAgIG1wbl9tdWwgKHZpbmYsIGEzLCBzLCBiMywgdCk7CisgIGVsc2UKKyAgICBUT09NNDRfTVVMX05fUkVDICh2aW5mLCBhMywgYjMsIHMsIHRwKTsJLyogdmluZiwgcyt0IGxpbWJzICovCisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfN3B0cyAocHAsIG4sIGZsYWdzLCB2bTIsIHZtMSwgdjIsIHZoLCBzICsgdCwgdHApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbTRfc3FyLmMgYi9tcG4vZ2VuZXJpYy90b29tNF9zcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU5ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbTRfc3FyLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIG1wbl90b29tNF9zcXIgLS0gU3F1YXJlIHthcCxhbn0uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDEwLCAyMDEzLCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogLTIsIC0xLCAwLCArMS8yLCArMSwgKzIsICtpbmYKKworICA8LXMtLT48LS1uLS0+PC0tbi0tPjwtLW4tLT4KKyAgIF9fX18gX19fX19fIF9fX19fXyBfX19fX18KKyAgfF9hM198X19fYTJffF9fX2ExX3xfX19hMF98CisKKyAgdjAgID0gICBhMCAgICAgICAgICAgICBeMiAjICAgIEEoMCleMgorICB2MSAgPSAoIGEwKyBhMSsgYTIrIGEzKV4yICMgICAgQSgxKV4yICAgYWggIDw9IDMKKyAgdm0xID0gKCBhMC0gYTErIGEyLSBhMyleMiAjICAgQSgtMSleMiAgfGFofCA8PSAxCisgIHYyICA9ICggYTArMmExKzRhMis4YTMpXjIgIyAgICBBKDIpXjIgICBhaCAgPD0gMTQKKyAgdm0yID0gKCBhMC0yYTErNGEyLThhMyleMiAjICAgQSgtMileMiAgLTk8PWFoPD00CisgIHZoICA9ICg4YTArNGExKzJhMisgYTMpXjIgIyAgQSgxLzIpXjIgICBhaCAgPD0gMTQKKyAgdmluZj0gICAgICAgICAgICAgICBhMyBeMiAjICBBKGluZileMgorKi8KKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRAorI2RlZmluZSBNQVlCRV9zcXJfYmFzZWNhc2UgMQorI2RlZmluZSBNQVlCRV9zcXJfdG9vbTIgICAxCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tNCAgIDEKKyNlbHNlCisjZGVmaW5lIE1BWUJFX3Nxcl9iYXNlY2FzZQkJCQkJCVwKKyAgKFNRUl9UT09NNF9USFJFU0hPTEQgPCA0ICogU1FSX1RPT00yX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20yCQkJCQkJCVwKKyAgKFNRUl9UT09NNF9USFJFU0hPTEQgPCA0ICogU1FSX1RPT00zX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb200CQkJCQkJCVwKKyAgKFNRUl9UT09NNl9USFJFU0hPTEQgPj0gNCAqIFNRUl9UT09NNF9USFJFU0hPTEQpCisjZW5kaWYKKworI2RlZmluZSBUT09NNF9TUVJfUkVDKHAsIGEsIG4sIHdzKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9zcXJfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTJfVEhSRVNIT0xEKSkJCQlcCisgICAgICBtcG5fc3FyX2Jhc2VjYXNlIChwLCBhLCBuKTsJCQkJCVwKKyAgICBlbHNlIGlmIChNQVlCRV9zcXJfdG9vbTIJCQkJCQlcCisJICAgICAmJiBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NM19USFJFU0hPTEQpKQkJXAorICAgICAgbXBuX3Rvb20yX3NxciAocCwgYSwgbiwgd3MpOwkJCQkJXAorICAgIGVsc2UgaWYgKCEgTUFZQkVfc3FyX3Rvb200CQkJCQkJXAorCSAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTRfVEhSRVNIT0xEKSkJCVwKKyAgICAgIG1wbl90b29tM19zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBtcG5fdG9vbTRfc3FyIChwLCBhLCBuLCB3cyk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKK3ZvaWQKK21wbl90b29tNF9zcXIgKG1wX3B0ciBwcCwKKwkgICAgICAgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJICAgICAgIG1wX3B0ciBzY3JhdGNoKQoreworICBtcF9zaXplX3QgbiwgczsKKyAgbXBfbGltYl90IGN5OworCisjZGVmaW5lIGEwICBhcAorI2RlZmluZSBhMSAgKGFwICsgbikKKyNkZWZpbmUgYTIgIChhcCArIDIqbikKKyNkZWZpbmUgYTMgIChhcCArIDMqbikKKworICBuID0gKGFuICsgMykgPj4gMjsKKworICBzID0gYW4gLSAzICogbjsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisKKyAgLyogTk9URTogVGhlIG11bHRpcGxpY2F0aW9ucyB0byB2Miwgdm0yLCB2aCBhbmQgdm0xIG92ZXJ3cml0ZXMgdGhlCisgICAqIGZvbGxvd2luZyBsaW1iLCBzbyB0aGVzZSBtdXN0IGJlIGNvbXB1dGVkIGluIG9yZGVyLCBhbmQgd2UgbmVlZCBhCisgICAqIG9uZSBsaW1iIGdhcCB0byB0cC4gKi8KKyNkZWZpbmUgdjAgICAgcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdjEgICAgKHBwICsgMiAqIG4pCQkJLyogMm4rMSAqLworI2RlZmluZSB2aW5mICAocHAgKyA2ICogbikJCQkvKiBzK3QgKi8KKyNkZWZpbmUgdjIgICAgc2NyYXRjaAkJCQkvKiAybisxICovCisjZGVmaW5lIHZtMiAgIChzY3JhdGNoICsgMiAqIG4gKyAxKQkJLyogMm4rMSAqLworI2RlZmluZSB2aCAgICAoc2NyYXRjaCArIDQgKiBuICsgMikJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdm0xICAgKHNjcmF0Y2ggKyA2ICogbiArIDMpCQkvKiAybisxICovCisjZGVmaW5lIHRwIChzY3JhdGNoICsgOCpuICsgNSkKKworICAvKiBObyBvdmVybGFwIHdpdGggdjEgKi8KKyNkZWZpbmUgYXB4ICAgcHAJCQkJLyogbisxICovCisjZGVmaW5lIGFteCAgIChwcCArIDQqbiArIDIpCQkJLyogbisxICovCisKKyAgLyogVG90YWwgc2NyYXRjaCBuZWVkOiA4Km4gKyA1ICsgc2NyYXRjaCBmb3IgcmVjdXJzaXZlIGNhbGxzLiBUaGlzCisgICAgIGdpdmVzIHJvdWdobHkgMzIgbi8zICsgbG9nIHRlcm0uICovCisKKyAgLyogQ29tcHV0ZSBhcHggPSBhMCArIDIgYTEgKyA0IGEyICsgOCBhMyBhbmQgYW14ID0gYTAgLSAyIGExICsgNCBhMiAtIDggYTMuICAqLworICBtcG5fdG9vbV9ldmFsX2RncjNfcG0yIChhcHgsIGFteCwgYXAsIG4sIHMsIHRwKTsKKworICBUT09NNF9TUVJfUkVDICh2MiwgYXB4LCBuICsgMSwgdHApOwkvKiB2MiwgIDJuKzEgbGltYnMgKi8KKyAgVE9PTTRfU1FSX1JFQyAodm0yLCBhbXgsIG4gKyAxLCB0cCk7CS8qIHZtMiwgIDJuKzEgbGltYnMgKi8KKworICAvKiBDb21wdXRlIGFweCA9IDggYTAgKyA0IGExICsgMiBhMiArIGEzID0gKCgoMiphMCArIGExKSAqIDIgKyBhMikgKiAyICsgYTMgKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIGN5ID0gbXBuX2FkZGxzaDFfbiAoYXB4LCBhMSwgYTAsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fYWRkbHNoMV9uIChhcHgsIGEyLCBhcHgsIG4pOworICBpZiAocyA8IG4pCisgICAgeworICAgICAgbXBfbGltYl90IGN5MjsKKyAgICAgIGN5MiA9IG1wbl9hZGRsc2gxX24gKGFweCwgYTMsIGFweCwgcyk7CisgICAgICBhcHhbbl0gPSAyKmN5ICsgbXBuX2xzaGlmdCAoYXB4ICsgcywgYXB4ICsgcywgbiAtIHMsIDEpOworICAgICAgTVBOX0lOQ1JfVSAoYXB4ICsgcywgbisxLXMsIGN5Mik7CisgICAgfQorICBlbHNlCisgICAgYXB4W25dID0gMipjeSArIG1wbl9hZGRsc2gxX24gKGFweCwgYTMsIGFweCwgbik7CisjZWxzZQorICBjeSA9IG1wbl9sc2hpZnQgKGFweCwgYTAsIG4sIDEpOworICBjeSArPSBtcG5fYWRkX24gKGFweCwgYXB4LCBhMSwgbik7CisgIGN5ID0gMipjeSArIG1wbl9sc2hpZnQgKGFweCwgYXB4LCBuLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChhcHgsIGFweCwgYTIsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhcHgsIGFweCwgbiwgMSk7CisgIGFweFtuXSA9IGN5ICsgbXBuX2FkZCAoYXB4LCBhcHgsIG4sIGEzLCBzKTsKKyNlbmRpZgorCisgIEFTU0VSVCAoYXB4W25dIDwgMTUpOworCisgIFRPT000X1NRUl9SRUMgKHZoLCBhcHgsIG4gKyAxLCB0cCk7CS8qIHZoLCAgMm4rMSBsaW1icyAqLworCisgIC8qIENvbXB1dGUgYXB4ID0gYTAgKyBhMSArIGEyICsgYTMgYW5kIGFteCA9IGEwIC0gYTEgKyBhMiAtIGEzLiAgKi8KKyAgbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAoYXB4LCBhbXgsIGFwLCBuLCBzLCB0cCk7CisKKyAgVE9PTTRfU1FSX1JFQyAodjEsIGFweCwgbiArIDEsIHRwKTsJLyogdjEsICAybisxIGxpbWJzICovCisgIHZtMSBbMiAqIG5dID0gMDsKKyAgVE9PTTRfU1FSX1JFQyAodm0xLCBhbXgsIG4gKyBhbXhbbl0sIHRwKTsJLyogdm0xLCAgMm4rMSBsaW1icyAqLworCisgIFRPT000X1NRUl9SRUMgKHYwLCBhMCwgbiwgdHApOworICBUT09NNF9TUVJfUkVDICh2aW5mLCBhMywgcywgdHApOwkvKiB2aW5mLCAycyBsaW1icyAqLworCisgIG1wbl90b29tX2ludGVycG9sYXRlXzdwdHMgKHBwLCBuLCAoZW51bSB0b29tN19mbGFncykgMCwgdm0yLCB2bTEsIHYyLCB2aCwgMipzLCB0cCk7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNTJfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNTJfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0MDU5YgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb201Ml9tdWwuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogbXBuX3Rvb201Ml9tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiBpcyBub21pbmFsbHkgNC8zCisgICB0aW1lcyBhcyBsYXJnZSBhcyBibi4gIE9yIG1vcmUgYWNjdXJhdGVseSwgYm4gPCBhbiA8IDIgYm4uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUaGUgaWRlYSBvZiBhcHBseWluZyB0b29tIHRvIHVuYmFsYW5jZWQgbXVsdGlwbGljYXRpb24gaXMgZHVlIHRvIE1hcmNvCisgICBCb2RyYXRvIGFuZCBBbGJlcnRvIFphbm9uaS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRXZhbHVhdGUgaW46IC0yLCAtMSwgMCwgKzEsICsyLCAraW5mCisKKyAgPC1zLT48LS1uLS0+PC0tbi0tPjwtLW4tLT48LS1uLS0+CisgICBfX18gX19fX19fIF9fX19fXyBfX19fX18gX19fX19fCisgIHxhNF98X19fYTNffF9fX2EyX3xfX19hMV98X19fYTBffAorCQkJfGIxfF9fX2IwX3wKKwkJCTx0LT48LS1uLS0+CisKKyAgdjAgID0gIGEwICAgICAgICAgICAgICAgICAgKiBiMCAgICAgICMgICBBKDApKkIoMCkKKyAgdjEgID0gKGEwKyBhMSsgYTIrIGEzKyAgYTQpKihiMCsgYjEpICMgICBBKDEpKkIoMSkgICAgICBhaCAgPD0gNCAgIGJoIDw9IDEKKyAgdm0xID0gKGEwLSBhMSsgYTItIGEzKyAgYTQpKihiMC0gYjEpICMgIEEoLTEpKkIoLTEpICAgIHxhaHwgPD0gMiAgIGJoICA9IDAKKyAgdjIgID0gKGEwKzJhMSs0YTIrOGEzKzE2YTQpKihiMCsyYjEpICMgICBBKDIpKkIoMikgICAgICBhaCAgPD0gMzAgIGJoIDw9IDIKKyAgdm0yID0gKGEwLTJhMSs0YTItOGEzKzE2YTQpKihiMC0yYjEpICMgIEEoLTIpKkIoLTIpICAgIHxhaHwgPD0gMjAgfGJofDw9IDEKKyAgdmluZj0gICAgICAgICAgICAgICAgICAgYTQgKiAgICAgYjEgICMgQShpbmYpKkIoaW5mKQorCisgIFNvbWUgc2xpZ2h0IG9wdGltaXphdGlvbiBpbiBldmFsdWF0aW9uIGFyZSB0YWtlbiBmcm9tIHRoZSBwYXBlcjoKKyAgIlRvd2FyZHMgT3B0aW1hbCBUb29tLUNvb2sgTXVsdGlwbGljYXRpb24gZm9yIFVuaXZhcmlhdGUgYW5kCisgIE11bHRpdmFyaWF0ZSBQb2x5bm9taWFscyBpbiBDaGFyYWN0ZXJpc3RpYyAyIGFuZCAwLiIKKyovCisKK3ZvaWQKK21wbl90b29tNTJfbXVsIChtcF9wdHIgcHAsCisJCW1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQltcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBuLCBzLCB0OworICBlbnVtIHRvb202X2ZsYWdzIGZsYWdzOworCisjZGVmaW5lIGEwICBhcAorI2RlZmluZSBhMSAgKGFwICsgbikKKyNkZWZpbmUgYTIgIChhcCArIDIgKiBuKQorI2RlZmluZSBhMyAgKGFwICsgMyAqIG4pCisjZGVmaW5lIGE0ICAoYXAgKyA0ICogbikKKyNkZWZpbmUgYjAgIGJwCisjZGVmaW5lIGIxICAoYnAgKyBuKQorCisgIG4gPSAxICsgKDIgKiBhbiA+PSA1ICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDUgOiAoYm4gLSAxKSA+PiAxKTsKKworICBzID0gYW4gLSA0ICogbjsKKyAgdCA9IGJuIC0gbjsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisgIEFTU0VSVCAoMCA8IHQgJiYgdCA8PSBuKTsKKworICAvKiBFbnN1cmVzIHRoYXQgNSB2YWx1ZXMgb2YgbisxIGxpbWJzIGVhY2ggZml0cyBpbiB0aGUgcHJvZHVjdCBhcmVhLgorICAgICBCb3JkZXJsaW5lIGNhc2VzIGFyZSBhbiA9IDMyLCBibiA9IDgsIG4gPSA3LCBhbmQgYW4gPSAzNiwgYm4gPSA5LAorICAgICBuID0gOC4gKi8KKyAgQVNTRVJUIChzK3QgPj0gNSk7CisKKyNkZWZpbmUgdjAgICAgcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdm0xICAgKHNjcmF0Y2gpCQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdjEgICAgKHBwICsgMiAqIG4pCQkJLyogMm4rMSAqLworI2RlZmluZSB2bTIgICAoc2NyYXRjaCArIDIgKiBuICsgMSkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdjIgICAgKHNjcmF0Y2ggKyA0ICogbiArIDIpCQkvKiAybisxICovCisjZGVmaW5lIHZpbmYgIChwcCArIDUgKiBuKQkJCS8qIHMrdCAqLworI2RlZmluZSBiczEgICAgcHAJCQkJLyogbisxICovCisjZGVmaW5lIGJzbTEgIChzY3JhdGNoICsgMiAqIG4gKyAyKQkJLyogbiAgICovCisjZGVmaW5lIGFzbTEgIChzY3JhdGNoICsgMyAqIG4gKyAzKQkJLyogbisxICovCisjZGVmaW5lIGFzbTIgIChzY3JhdGNoICsgNCAqIG4gKyA0KQkJLyogbisxICovCisjZGVmaW5lIGJzbTIgIChwcCArIG4gKyAxKQkJCS8qIG4rMSAqLworI2RlZmluZSBiczIgICAocHAgKyAyICogbiArIDIpCQkJLyogbisxICovCisjZGVmaW5lIGFzMiAgIChwcCArIDMgKiBuICsgMykJCQkvKiBuKzEgKi8KKyNkZWZpbmUgYXMxICAgKHBwICsgNCAqIG4gKyA0KQkJCS8qIG4rMSAqLworCisgIC8qIFNjcmF0Y2ggbmVlZCBpcyA2ICogbiArIDMgKyAxLiBXZSBuZWVkIG9uZSBleHRyYSBsaW1iLCBiZWNhdXNlCisgICAgIHByb2R1Y3RzIHdpbGwgb3ZlcndyaXRlIDJuKzIgbGltYnMuICovCisKKyNkZWZpbmUgYTBhMiAgc2NyYXRjaAorI2RlZmluZSBhMWEzICBhc20xCisKKyAgLyogQ29tcHV0ZSBhczIgYW5kIGFzbTIuICAqLworICBmbGFncyA9IChlbnVtIHRvb202X2ZsYWdzKSAodG9vbTZfdm0yX25lZyAmIG1wbl90b29tX2V2YWxfcG0yIChhczIsIGFzbTIsIDQsIGFwLCBuLCBzLCBhMWEzKSk7CisKKyAgLyogQ29tcHV0ZSBiczEgYW5kIGJzbTEuICAqLworICBpZiAodCA9PSBuKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgICAgIG1wX2xpbWJfdCBjeTsKKworICAgICAgaWYgKG1wbl9jbXAgKGIwLCBiMSwgbikgPCAwKQorCXsKKwkgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChiczEsIGJzbTEsIGIxLCBiMCwgbik7CisJICBmbGFncyA9IChlbnVtIHRvb202X2ZsYWdzKSAoZmxhZ3MgXiB0b29tNl92bTFfbmVnKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3kgPSBtcG5fYWRkX25fc3ViX24gKGJzMSwgYnNtMSwgYjAsIGIxLCBuKTsKKwl9CisgICAgICBiczFbbl0gPSBjeSA+PiAxOworI2Vsc2UKKyAgICAgIGJzMVtuXSA9IG1wbl9hZGRfbiAoYnMxLCBiMCwgYjEsIG4pOworICAgICAgaWYgKG1wbl9jbXAgKGIwLCBiMSwgbikgPCAwKQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGIwLCBuKTsKKwkgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeIHRvb202X3ZtMV9uZWcpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcG5fc3ViX24gKGJzbTEsIGIwLCBiMSwgbik7CisJfQorI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnMxW25dID0gbXBuX2FkZCAoYnMxLCBiMCwgbiwgYjEsIHQpOworICAgICAgaWYgKG1wbl96ZXJvX3AgKGIwICsgdCwgbiAtIHQpICYmIG1wbl9jbXAgKGIwLCBiMSwgdCkgPCAwKQorCXsKKwkgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGIwLCB0KTsKKwkgIE1QTl9aRVJPIChic20xICsgdCwgbiAtIHQpOworCSAgZmxhZ3MgPSAoZW51bSB0b29tNl9mbGFncykgKGZsYWdzIF4gdG9vbTZfdm0xX25lZyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wbl9zdWIgKGJzbTEsIGIwLCBuLCBiMSwgdCk7CisJfQorICAgIH0KKworICAvKiBDb21wdXRlIGJzMiBhbmQgYnNtMiwgcmVjeWNsaW5nIGJzMSBhbmQgYnNtMS4gYnMyPWJzMStiMTsgYnNtMj1ic20xLWIxICAqLworICBtcG5fYWRkIChiczIsIGJzMSwgbisxLCBiMSwgdCk7CisgIGlmIChmbGFncyAmIHRvb202X3ZtMV9uZWcpCisgICAgeworICAgICAgYnNtMltuXSA9IG1wbl9hZGQgKGJzbTIsIGJzbTEsIG4sIGIxLCB0KTsKKyAgICAgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeIHRvb202X3ZtMl9uZWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJzbTJbbl0gPSAwOworICAgICAgaWYgKHQgPT0gbikKKwl7CisJICBpZiAobXBuX2NtcCAoYnNtMSwgYjEsIG4pIDwgMCkKKwkgICAgeworCSAgICAgIG1wbl9zdWJfbiAoYnNtMiwgYjEsIGJzbTEsIG4pOworCSAgICAgIGZsYWdzID0gKGVudW0gdG9vbTZfZmxhZ3MpIChmbGFncyBeIHRvb202X3ZtMl9uZWcpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcG5fc3ViX24gKGJzbTIsIGJzbTEsIGIxLCBuKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobXBuX3plcm9fcCAoYnNtMSArIHQsIG4gLSB0KSAmJiBtcG5fY21wIChic20xLCBiMSwgdCkgPCAwKQorCSAgICB7CisJICAgICAgbXBuX3N1Yl9uIChic20yLCBiMSwgYnNtMSwgdCk7CisJICAgICAgTVBOX1pFUk8gKGJzbTIgKyB0LCBuIC0gdCk7CisJICAgICAgZmxhZ3MgPSAoZW51bSB0b29tNl9mbGFncykgKGZsYWdzIF4gdG9vbTZfdm0yX25lZyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wbl9zdWIgKGJzbTIsIGJzbTEsIG4sIGIxLCB0KTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogQ29tcHV0ZSBhczEgYW5kIGFzbTEuICAqLworICBmbGFncyA9IChlbnVtIHRvb202X2ZsYWdzKSAoZmxhZ3MgXiAodG9vbTZfdm0xX25lZyAmIG1wbl90b29tX2V2YWxfcG0xIChhczEsIGFzbTEsIDQsIGFwLCBuLCBzLCBhMGEyKSkpOworCisgIEFTU0VSVCAoYXMxW25dIDw9IDQpOworICBBU1NFUlQgKGJzMVtuXSA8PSAxKTsKKyAgQVNTRVJUIChhc20xW25dIDw9IDIpOworLyogICBBU1NFUlQgKGJzbTFbbl0gPD0gMSk7ICovCisgIEFTU0VSVCAoYXMyW25dIDw9MzApOworICBBU1NFUlQgKGJzMltuXSA8PSAyKTsKKyAgQVNTRVJUIChhc20yW25dIDw9IDIwKTsKKyAgQVNTRVJUIChic20yW25dIDw9IDEpOworCisgIC8qIHZtMSwgMm4rMSBsaW1icyAqLworICBtcG5fbXVsICh2bTEsIGFzbTEsIG4rMSwgYnNtMSwgbik7ICAvKiBXNCAqLworCisgIC8qIHZtMiwgMm4rMSBsaW1icyAqLworICBtcG5fbXVsX24gKHZtMiwgYXNtMiwgYnNtMiwgbisxKTsgIC8qIFcyICovCisKKyAgLyogdjIsIDJuKzEgbGltYnMgKi8KKyAgbXBuX211bF9uICh2MiwgYXMyLCBiczIsIG4rMSk7ICAvKiBXMSAqLworCisgIC8qIHYxLCAybisxIGxpbWJzICovCisgIG1wbl9tdWxfbiAodjEsIGFzMSwgYnMxLCBuKzEpOyAgLyogVzMgKi8KKworICAvKiB2aW5mLCBzK3QgbGltYnMgKi8gICAvKiBXMCAqLworICBpZiAocyA+IHQpICBtcG5fbXVsICh2aW5mLCBhNCwgcywgYjEsIHQpOworICBlbHNlICAgICAgICBtcG5fbXVsICh2aW5mLCBiMSwgdCwgYTQsIHMpOworCisgIC8qIHYwLCAybiBsaW1icyAqLworICBtcG5fbXVsX24gKHYwLCBhcCwgYnAsIG4pOyAgLyogVzUgKi8KKworICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV82cHRzIChwcCwgbiwgZmxhZ3MsIHZtMSwgdm0yLCB2MiwgdCArIHMpOworCisjdW5kZWYgdjAKKyN1bmRlZiB2bTEKKyN1bmRlZiB2MQorI3VuZGVmIHZtMgorI3VuZGVmIHYyCisjdW5kZWYgdmluZgorI3VuZGVmIGJzMQorI3VuZGVmIGJzMgorI3VuZGVmIGJzbTEKKyN1bmRlZiBic20yCisjdW5kZWYgYXNtMQorI3VuZGVmIGFzbTIKKyN1bmRlZiBhczEKKyN1bmRlZiBhczIKKyN1bmRlZiBhMGEyCisjdW5kZWYgYjBiMgorI3VuZGVmIGExYTMKKyN1bmRlZiBhMAorI3VuZGVmIGExCisjdW5kZWYgYTIKKyN1bmRlZiBhMworI3VuZGVmIGIwCisjdW5kZWYgYjEKKyN1bmRlZiBiMgorCit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNTNfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNTNfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNDI5NwotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb201M19tdWwuYwpAQCAtMCwwICsxLDMzMSBAQAorLyogbXBuX3Rvb201M19tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiBpcyBub21pbmFsbHkgNS8zCisgICB0aW1lcyBhcyBsYXJnZSBhcyBibi4gIE9yIG1vcmUgYWNjdXJhdGVseSwgKDQvMylibiA8IGFuIDwgKDUvMilibi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kIGFuZCBNYXJjbyBCb2RyYXRvLgorCisgICBUaGUgaWRlYSBvZiBhcHBseWluZyB0b29tIHRvIHVuYmFsYW5jZWQgbXVsdGlwbGljYXRpb24gaXMgZHVlIHRvIE1hcmNvCisgICBCb2RyYXRvIGFuZCBBbGJlcnRvIFphbm9uaS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDA4LCAyMDEyLCAyMDE0LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjogMCwgKzEsIC0xLCArMiwgLTIsIDEvMiwgK2luZgorCisgIDwtcy0+PC0tbi0tPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorICAgX19fIF9fX19fXyBfX19fX18gX19fX19fIF9fX19fXworICB8YTRffF9fX2EzX3xfX19hMl98X19fYTFffF9fX2EwX3wKKwkgICAgICAgfF9fYjJ8X19fYjFffF9fX2IwX3wKKwkgICAgICAgPC10LS0+PC0tbi0tPjwtLW4tLT4KKworICB2MCAgPSAgICBhMCAgICAgICAgICAgICAgICAgICogIGIwICAgICAgICAgICMgICAgQSgwKSpCKDApCisgIHYxICA9ICggIGEwKyBhMSsgYTIrIGEzKyAgYTQpKiggYjArIGIxKyBiMikgIyAgICBBKDEpKkIoMSkgICAgICBhaCAgPD0gNCAgIGJoIDw9IDIKKyAgdm0xID0gKCAgYTAtIGExKyBhMi0gYTMrICBhNCkqKCBiMC0gYjErIGIyKSAjICAgQSgtMSkqQigtMSkgICAgfGFofCA8PSAyICAgYmggPD0gMQorICB2MiAgPSAoICBhMCsyYTErNGEyKzhhMysxNmE0KSooIGIwKzJiMSs0YjIpICMgICAgQSgyKSpCKDIpICAgICAgYWggIDw9IDMwICBiaCA8PSA2CisgIHZtMiA9ICggIGEwLTJhMSs0YTItOGEzKzE2YTQpKiggYjAtMmIxKzRiMikgIyAgICBBKDIpKkIoMikgICAgIC05PD1haDw9MjAgLTE8PWJoPD00CisgIHZoICA9ICgxNmEwKzhhMSs0YTIrMmEzKyAgYTQpKig0YjArMmIxKyBiMikgIyAgQSgxLzIpKkIoMS8yKSAgICBhaCAgPD0gMzAgIGJoIDw9IDYKKyAgdmluZj0gICAgICAgICAgICAgICAgICAgICBhNCAqICAgICAgICAgIGIyICAjICBBKGluZikqQihpbmYpCisqLworCit2b2lkCittcG5fdG9vbTUzX211bCAobXBfcHRyIHBwLAorCQltcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwKKwkJbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4sCisJCW1wX3B0ciBzY3JhdGNoKQoreworICBtcF9zaXplX3QgbiwgcywgdDsKKyAgbXBfbGltYl90IGN5OworICBtcF9wdHIgZ3A7CisgIG1wX3B0ciBhczEsIGFzbTEsIGFzMiwgYXNtMiwgYXNoOworICBtcF9wdHIgYnMxLCBic20xLCBiczIsIGJzbTIsIGJzaDsKKyAgbXBfcHRyIHRtcDsKKyAgZW51bSB0b29tN19mbGFncyBmbGFnczsKKyAgVE1QX0RFQ0w7CisKKyNkZWZpbmUgYTAgIGFwCisjZGVmaW5lIGExICAoYXAgKyBuKQorI2RlZmluZSBhMiAgKGFwICsgMipuKQorI2RlZmluZSBhMyAgKGFwICsgMypuKQorI2RlZmluZSBhNCAgKGFwICsgNCpuKQorI2RlZmluZSBiMCAgYnAKKyNkZWZpbmUgYjEgIChicCArIG4pCisjZGVmaW5lIGIyICAoYnAgKyAyKm4pCisKKyAgbiA9IDEgKyAoMyAqIGFuID49IDUgKiBibiA/IChhbiAtIDEpIC8gKHNpemVfdCkgNSA6IChibiAtIDEpIC8gKHNpemVfdCkgMyk7CisKKyAgcyA9IGFuIC0gNCAqIG47CisgIHQgPSBibiAtIDIgKiBuOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworCisgIFRNUF9NQVJLOworCisgIHRtcCA9IFRNUF9BTExPQ19MSU1CUyAoMTAgKiAobiArIDEpKTsKKyAgYXMxICA9IHRtcDsgdG1wICs9IG4gKyAxOworICBhc20xID0gdG1wOyB0bXAgKz0gbiArIDE7CisgIGFzMiAgPSB0bXA7IHRtcCArPSBuICsgMTsKKyAgYXNtMiA9IHRtcDsgdG1wICs9IG4gKyAxOworICBhc2ggID0gdG1wOyB0bXAgKz0gbiArIDE7CisgIGJzMSAgPSB0bXA7IHRtcCArPSBuICsgMTsKKyAgYnNtMSA9IHRtcDsgdG1wICs9IG4gKyAxOworICBiczIgID0gdG1wOyB0bXAgKz0gbiArIDE7CisgIGJzbTIgPSB0bXA7IHRtcCArPSBuICsgMTsKKyAgYnNoICA9IHRtcDsgdG1wICs9IG4gKyAxOworCisgIGdwID0gcHA7CisKKyAgLyogQ29tcHV0ZSBhczEgYW5kIGFzbTEuICAqLworICBmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAodG9vbTdfdzNfbmVnICYgbXBuX3Rvb21fZXZhbF9wbTEgKGFzMSwgYXNtMSwgNCwgYXAsIG4sIHMsIGdwKSk7CisKKyAgLyogQ29tcHV0ZSBhczIgYW5kIGFzbTIuICovCisgIGZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChmbGFncyB8ICh0b29tN193MV9uZWcgJiBtcG5fdG9vbV9ldmFsX3BtMiAoYXMyLCBhc20yLCA0LCBhcCwgbiwgcywgZ3ApKSk7CisKKyAgLyogQ29tcHV0ZSBhc2ggPSAxNiBhMCArIDggYTEgKyA0IGEyICsgMiBhMyArIGE0CisgICAgID0gMiooMiooMiooMiphMCArIGExKSArIGEyKSArIGEzKSArIGE0ICAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgY3kgPSBtcG5fYWRkbHNoMV9uIChhc2gsIGExLCBhMCwgbik7CisgIGN5ID0gMipjeSArIG1wbl9hZGRsc2gxX24gKGFzaCwgYTIsIGFzaCwgbik7CisgIGN5ID0gMipjeSArIG1wbl9hZGRsc2gxX24gKGFzaCwgYTMsIGFzaCwgbik7CisgIGlmIChzIDwgbikKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kyOworICAgICAgY3kyID0gbXBuX2FkZGxzaDFfbiAoYXNoLCBhNCwgYXNoLCBzKTsKKyAgICAgIGFzaFtuXSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhc2ggKyBzLCBhc2ggKyBzLCBuIC0gcywgMSk7CisgICAgICBNUE5fSU5DUl9VIChhc2ggKyBzLCBuKzEtcywgY3kyKTsKKyAgICB9CisgIGVsc2UKKyAgICBhc2hbbl0gPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYXNoLCBhNCwgYXNoLCBuKTsKKyNlbHNlCisgIGN5ID0gbXBuX2xzaGlmdCAoYXNoLCBhMCwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYXNoLCBhc2gsIGExLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2xzaGlmdCAoYXNoLCBhc2gsIG4sIDEpOworICBjeSArPSBtcG5fYWRkX24gKGFzaCwgYXNoLCBhMiwgbik7CisgIGN5ID0gMipjeSArIG1wbl9sc2hpZnQgKGFzaCwgYXNoLCBuLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChhc2gsIGFzaCwgYTMsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhc2gsIGFzaCwgbiwgMSk7CisgIGFzaFtuXSA9IGN5ICsgbXBuX2FkZCAoYXNoLCBhc2gsIG4sIGE0LCBzKTsKKyNlbmRpZgorCisgIC8qIENvbXB1dGUgYnMxIGFuZCBic20xLiAgKi8KKyAgYnMxW25dID0gbXBuX2FkZCAoYnMxLCBiMCwgbiwgYjIsIHQpOwkJLyogYjAgKyBiMiAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBpZiAoYnMxW25dID09IDAgJiYgbXBuX2NtcCAoYnMxLCBiMSwgbikgPCAwKQorICAgIHsKKyAgICAgIGJzMVtuXSA9IG1wbl9hZGRfbl9zdWJfbiAoYnMxLCBic20xLCBiMSwgYnMxLCBuKSA+PiAxOworICAgICAgYnNtMVtuXSA9IDA7CisgICAgICBmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAoZmxhZ3MgXiB0b29tN193M19uZWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZF9uX3N1Yl9uIChiczEsIGJzbTEsIGJzMSwgYjEsIG4pOworICAgICAgYnNtMVtuXSA9IGJzMVtuXSAtIChjeSAmIDEpOworICAgICAgYnMxW25dICs9IChjeSA+PiAxKTsKKyAgICB9CisjZWxzZQorICBpZiAoYnMxW25dID09IDAgJiYgbXBuX2NtcCAoYnMxLCBiMSwgbikgPCAwKQorICAgIHsKKyAgICAgIG1wbl9zdWJfbiAoYnNtMSwgYjEsIGJzMSwgbik7CisgICAgICBic20xW25dID0gMDsKKyAgICAgIGZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChmbGFncyBeIHRvb203X3czX25lZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnNtMVtuXSA9IGJzMVtuXSAtIG1wbl9zdWJfbiAoYnNtMSwgYnMxLCBiMSwgbik7CisgICAgfQorICBiczFbbl0gKz0gbXBuX2FkZF9uIChiczEsIGJzMSwgYjEsIG4pOyAgLyogYjArYjErYjIgKi8KKyNlbmRpZgorCisgIC8qIENvbXB1dGUgYnMyIGFuZCBic20yLiAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbiB8fCBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbgorICBjeSA9IG1wbl9hZGRsc2gyX24gKGJzMiwgYjAsIGIyLCB0KTsKKyNlbHNlIC8qIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbiAqLworICBjeSA9IG1wbl9hZGRsc2hfbiAoYnMyLCBiMCwgYjIsIHQsIDIpOworI2VuZGlmCisgIGlmICh0IDwgbikKKyAgICBjeSA9IG1wbl9hZGRfMSAoYnMyICsgdCwgYjAgKyB0LCBuIC0gdCwgY3kpOworICBiczJbbl0gPSBjeTsKKyNlbHNlCisgIGN5ID0gbXBuX2xzaGlmdCAoZ3AsIGIyLCB0LCAyKTsKKyAgYnMyW25dID0gbXBuX2FkZCAoYnMyLCBiMCwgbiwgZ3AsIHQpOworICBNUE5fSU5DUl9VIChiczIgKyB0LCBuKzEtdCwgY3kpOworI2VuZGlmCisKKyAgZ3Bbbl0gPSBtcG5fbHNoaWZ0IChncCwgYjEsIG4sIDEpOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgIGlmIChtcG5fY21wIChiczIsIGdwLCBuKzEpIDwgMCkKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF9uX3N1Yl9uIChiczIsIGJzbTIsIGdwLCBiczIsIG4rMSkpOworICAgICAgZmxhZ3MgPSAoZW51bSB0b29tN19mbGFncykgKGZsYWdzIF4gdG9vbTdfdzFfbmVnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF9uX3N1Yl9uIChiczIsIGJzbTIsIGJzMiwgZ3AsIG4rMSkpOworICAgIH0KKyNlbHNlCisgIGlmIChtcG5fY21wIChiczIsIGdwLCBuKzEpIDwgMCkKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChic20yLCBncCwgYnMyLCBuKzEpKTsKKyAgICAgIGZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChmbGFncyBeIHRvb203X3cxX25lZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAoYnNtMiwgYnMyLCBncCwgbisxKSk7CisgICAgfQorICBtcG5fYWRkX24gKGJzMiwgYnMyLCBncCwgbisxKTsKKyNlbmRpZgorCisgIC8qIENvbXB1dGUgYnNoID0gNCBiMCArIDIgYjEgKyBiMiA9IDIqKDIqYjAgKyBiMSkrYjIuICAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgY3kgPSBtcG5fYWRkbHNoMV9uIChic2gsIGIxLCBiMCwgbik7CisgIGlmICh0IDwgbikKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kyOworICAgICAgY3kyID0gbXBuX2FkZGxzaDFfbiAoYnNoLCBiMiwgYnNoLCB0KTsKKyAgICAgIGJzaFtuXSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChic2ggKyB0LCBic2ggKyB0LCBuIC0gdCwgMSk7CisgICAgICBNUE5fSU5DUl9VIChic2ggKyB0LCBuKzEtdCwgY3kyKTsKKyAgICB9CisgIGVsc2UKKyAgICBic2hbbl0gPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYnNoLCBiMiwgYnNoLCBuKTsKKyNlbHNlCisgIGN5ID0gbXBuX2xzaGlmdCAoYnNoLCBiMCwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYnNoLCBic2gsIGIxLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2xzaGlmdCAoYnNoLCBic2gsIG4sIDEpOworICBic2hbbl0gPSBjeSArIG1wbl9hZGQgKGJzaCwgYnNoLCBuLCBiMiwgdCk7CisjZW5kaWYKKworICBBU1NFUlQgKGFzMVtuXSA8PSA0KTsKKyAgQVNTRVJUIChiczFbbl0gPD0gMik7CisgIEFTU0VSVCAoYXNtMVtuXSA8PSAyKTsKKyAgQVNTRVJUIChic20xW25dIDw9IDEpOworICBBU1NFUlQgKGFzMltuXSA8PSAzMCk7CisgIEFTU0VSVCAoYnMyW25dIDw9IDYpOworICBBU1NFUlQgKGFzbTJbbl0gPD0gMjApOworICBBU1NFUlQgKGJzbTJbbl0gPD0gNCk7CisgIEFTU0VSVCAoYXNoW25dIDw9IDMwKTsKKyAgQVNTRVJUIChic2hbbl0gPD0gNik7CisKKyNkZWZpbmUgdjAgICAgcHAJCQkJLyogMm4gKi8KKyNkZWZpbmUgdjEgICAgKHBwICsgMiAqIG4pCQkJLyogMm4rMSAqLworI2RlZmluZSB2aW5mICAocHAgKyA2ICogbikJCQkvKiBzK3QgKi8KKyNkZWZpbmUgdjIgICAgc2NyYXRjaAkJCQkvKiAybisxICovCisjZGVmaW5lIHZtMiAgIChzY3JhdGNoICsgMiAqIG4gKyAxKQkJLyogMm4rMSAqLworI2RlZmluZSB2aCAgICAoc2NyYXRjaCArIDQgKiBuICsgMikJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdm0xICAgKHNjcmF0Y2ggKyA2ICogbiArIDMpCQkvKiAybisxICovCisjZGVmaW5lIHNjcmF0Y2hfb3V0IChzY3JhdGNoICsgOCAqIG4gKyA0KQkJLyogMm4rMSAqLworICAvKiBUb3RhbCBzY3JhdGNoIG5lZWQ6IDEwKm4rNSAqLworCisgIC8qIE11c3QgYmUgaW4gYWxsb2NhdGlvbiBvcmRlciwgYXMgdGhleSBvdmVyd3JpdGUgb25lIGxpbWIgYmV5b25kCisgICAqIDJuKzEuICovCisgIG1wbl9tdWxfbiAodjIsIGFzMiwgYnMyLCBuICsgMSk7CQkvKiB2MiwgMm4rMSBsaW1icyAqLworICBtcG5fbXVsX24gKHZtMiwgYXNtMiwgYnNtMiwgbiArIDEpOwkJLyogdm0yLCAybisxIGxpbWJzICovCisgIG1wbl9tdWxfbiAodmgsIGFzaCwgYnNoLCBuICsgMSk7CQkvKiB2aCwgMm4rMSBsaW1icyAqLworCisgIC8qIHZtMSwgMm4rMSBsaW1icyAqLworI2lmZGVmIFNNQUxMRVJfUkVDVVJTSU9OCisgIG1wbl9tdWxfbiAodm0xLCBhc20xLCBic20xLCBuKTsKKyAgaWYgKGFzbTFbbl0gPT0gMSkKKyAgICB7CisgICAgICBjeSA9IGJzbTFbbl0gKyBtcG5fYWRkX24gKHZtMSArIG4sIHZtMSArIG4sIGJzbTEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYXNtMVtuXSA9PSAyKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorICAgICAgY3kgPSAyICogYnNtMVtuXSArIG1wbl9hZGRsc2gxX25faXAxICh2bTEgKyBuLCBic20xLCBuKTsKKyNlbHNlCisgICAgICBjeSA9IDIgKiBic20xW25dICsgbXBuX2FkZG11bF8xICh2bTEgKyBuLCBic20xLCBuLCBDTlNUX0xJTUIoMikpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgY3kgPSAwOworICBpZiAoYnNtMVtuXSAhPSAwKQorICAgIGN5ICs9IG1wbl9hZGRfbiAodm0xICsgbiwgdm0xICsgbiwgYXNtMSwgbik7CisgIHZtMVsyICogbl0gPSBjeTsKKyNlbHNlIC8qIFNNQUxMRVJfUkVDVVJTSU9OICovCisgIHZtMVsyICogbl0gPSAwOworICBtcG5fbXVsX24gKHZtMSwgYXNtMSwgYnNtMSwgbiArICgoYXNtMVtuXSB8IGJzbTFbbl0pICE9IDApKTsKKyNlbmRpZiAvKiBTTUFMTEVSX1JFQ1VSU0lPTiAqLworCisgIC8qIHYxLCAybisxIGxpbWJzICovCisjaWZkZWYgU01BTExFUl9SRUNVUlNJT04KKyAgbXBuX211bF9uICh2MSwgYXMxLCBiczEsIG4pOworICBpZiAoYXMxW25dID09IDEpCisgICAgeworICAgICAgY3kgPSBiczFbbl0gKyBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBiczEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYXMxW25dID09IDIpCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxCisgICAgICBjeSA9IDIgKiBiczFbbl0gKyBtcG5fYWRkbHNoMV9uX2lwMSAodjEgKyBuLCBiczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ID0gMiAqIGJzMVtuXSArIG1wbl9hZGRtdWxfMSAodjEgKyBuLCBiczEsIG4sIENOU1RfTElNQigyKSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKGFzMVtuXSAhPSAwKQorICAgIHsKKyAgICAgIGN5ID0gYXMxW25dICogYnMxW25dICsgbXBuX2FkZG11bF8xICh2MSArIG4sIGJzMSwgbiwgYXMxW25dKTsKKyAgICB9CisgIGVsc2UKKyAgICBjeSA9IDA7CisgIGlmIChiczFbbl0gPT0gMSkKKyAgICB7CisgICAgICBjeSArPSBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBhczEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYnMxW25dID09IDIpCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX25faXAxCisgICAgICBjeSArPSBtcG5fYWRkbHNoMV9uX2lwMSAodjEgKyBuLCBhczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ICs9IG1wbl9hZGRtdWxfMSAodjEgKyBuLCBhczEsIG4sIENOU1RfTElNQigyKSk7CisjZW5kaWYKKyAgICB9CisgIHYxWzIgKiBuXSA9IGN5OworI2Vsc2UgLyogU01BTExFUl9SRUNVUlNJT04gKi8KKyAgdjFbMiAqIG5dID0gMDsKKyAgbXBuX211bF9uICh2MSwgYXMxLCBiczEsIG4gKyAoKGFzMVtuXSB8IGJzMVtuXSkgIT0gMCkpOworI2VuZGlmIC8qIFNNQUxMRVJfUkVDVVJTSU9OICovCisKKyAgbXBuX211bF9uICh2MCwgYTAsIGIwLCBuKTsJCQkvKiB2MCwgMm4gbGltYnMgKi8KKworICAvKiB2aW5mLCBzK3QgbGltYnMgKi8KKyAgaWYgKHMgPiB0KSAgbXBuX211bCAodmluZiwgYTQsIHMsIGIyLCB0KTsKKyAgZWxzZSAgICAgICAgbXBuX211bCAodmluZiwgYjIsIHQsIGE0LCBzKTsKKworICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV83cHRzIChwcCwgbiwgZmxhZ3MsIHZtMiwgdm0xLCB2MiwgdmgsIHMgKyB0LAorCQkJICAgICBzY3JhdGNoX291dCk7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNTRfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNTRfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzYjAyZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb201NF9tdWwuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFsZ29yaXRobSBmb3IgVG9vbS1Db29rIDQuNS13YXkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBUb29tLTQuNSwgdGhlIHNwbGl0dGluZyA1eDQgdW5iYWxhbmNlZCB2ZXJzaW9uLgorICAgRXZhbHVhdGUgaW46IGluZmluaXR5LCArNCwgLTQsICsyLCAtMiwgKzEsIC0xLCAwLgorCisgIDwtLXMtPjwtLW4tLT48LS1uLS0+PC0tbi0tPjwtLW4tLT4KKyAgIF9fX18gX19fX19fIF9fX19fXyBfX19fX18gX19fX19fCisgIHxfYTRffF9fYTNfX3xfX2EyX198X19hMV9ffF9fYTBfX3wKKwkgIHxiM198X19iMl9ffF9fYjFfX3xfX2IwX198CisJICA8LXQtPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorCisqLworI2RlZmluZSBUT09NXzU0X01VTF9OX1JFQyhwLCBhLCBiLCBuLCB3cykJCVwKKyAgZG8gewltcG5fbXVsX24gKHAsIGEsIGIsIG4pOwkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVE9PTV81NF9NVUxfUkVDKHAsIGEsIG5hLCBiLCBuYiwgd3MpCQlcCisgIGRvIHsJbXBuX211bCAocCwgYSwgbmEsIGIsIG5iKTsJCQlcCisgIH0gd2hpbGUgKDApCisKK3ZvaWQKK21wbl90b29tNTRfbXVsIChtcF9wdHIgcHAsCisJCW1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQltcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBuLCBzLCB0OworICBpbnQgc2lnbjsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVjb21wb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBhNCAgKGFwICsgNCAqIG4pCisjZGVmaW5lIGIzICAoYnAgKyAzICogbikKKworICBBU1NFUlQgKGFuID49IGJuKTsKKyAgbiA9IDEgKyAoNCAqIGFuID49IDUgKiBibiA/IChhbiAtIDEpIC8gKHNpemVfdCkgNSA6IChibiAtIDEpIC8gKHNpemVfdCkgNCk7CisKKyAgcyA9IGFuIC0gNCAqIG47CisgIHQgPSBibiAtIDMgKiBuOworCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworICAvKiBSZXF1aXJlZCBieSBtcG5fdG9vbV9pbnRlcnBvbGF0ZV84cHRzLiAqLworICBBU1NFUlQgKCBzICsgdCA+PSBuICk7CisgIEFTU0VSVCAoIHMgKyB0ID4gNCk7CisgIEFTU0VSVCAoIG4gPiAyKTsKKworI2RlZmluZSAgIHI4ICAgIHBwCQkJCS8qIDJuICAgKi8KKyNkZWZpbmUgICByNyAgICBzY3JhdGNoCQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByNSAgICAocHAgKyAzKm4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHYwICAgIChwcCArIDMqbikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB2MSAgICAocHAgKyA0Km4rMSkJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB2MiAgICAocHAgKyA1Km4rMikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB2MyAgICAocHAgKyA2Km4rMykJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICByMyAgICAoc2NyYXRjaCArIDMgKiBuICsgMSkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByMSAgICAocHAgKyA3Km4pCQkJLyogcyt0IDw9IDIqbiAqLworI2RlZmluZSAgIHdzICAgIChzY3JhdGNoICsgNiAqIG4gKyAyKQkJLyogPz8/ICovCisKKyAgLyogQWxsb2MgYWxzbyAzbisxIGxpbWJzIGZvciB3cy4uLiBtcG5fdG9vbV9pbnRlcnBvbGF0ZV84cHRzIG1heQorICAgICBuZWVkIGFsbCBvZiB0aGVtLCB3aGVuIERPX21wbl9zdWJsc2hfbiB1c2VhIGEgc2NyYXRjaCAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKiogZXZhbHVhdGlvbiBhbmQgcmVjdXJzaXZlIGNhbGxzICoqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogJFxwbTQkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjIsIHYwLCA0LCBhcCwgbiwgcywgMiwgcHApCisgICAgICAgXiBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjMsIHYxLCAzLCBicCwgbiwgdCwgMiwgcHApOworICBUT09NXzU0X01VTF9OX1JFQyhwcCwgdjAsIHYxLCBuICsgMSwgd3MpOyAvKiBBKC00KSpCKC00KSAqLworICBUT09NXzU0X01VTF9OX1JFQyhyMywgdjIsIHYzLCBuICsgMSwgd3MpOyAvKiBBKCs0KSpCKCs0KSAqLworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHIzLCAyKm4rMSwgcHAsIHNpZ24sIG4sIDIsIDQpOworCisgIC8qICRccG0xJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTEgKHYyLCB2MCwgNCwgYXAsIG4sIHMsICAgIHBwKQorICAgICAgIF4gbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAodjMsIHYxLCBicCwgbiwgdCwgICAgcHApOworICBUT09NXzU0X01VTF9OX1JFQyhwcCwgdjAsIHYxLCBuICsgMSwgd3MpOyAvKiBBKC0xKSpCKC0xKSAqLworICBUT09NXzU0X01VTF9OX1JFQyhyNywgdjIsIHYzLCBuICsgMSwgd3MpOyAvKiBBKDEpKkIoMSkgKi8KKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyNywgMipuKzEsIHBwLCBzaWduLCBuLCAwLCAwKTsKKworICAvKiAkXHBtMiQgKi8KKyAgc2lnbiA9IG1wbl90b29tX2V2YWxfcG0yICh2MiwgdjAsIDQsIGFwLCBuLCBzLCBwcCkKKyAgICAgICBeIG1wbl90b29tX2V2YWxfZGdyM19wbTIgKHYzLCB2MSwgYnAsIG4sIHQsIHBwKTsKKyAgVE9PTV81NF9NVUxfTl9SRUMocHAsIHYwLCB2MSwgbiArIDEsIHdzKTsgLyogQSgtMikqQigtMikgKi8KKyAgVE9PTV81NF9NVUxfTl9SRUMocjUsIHYyLCB2MywgbiArIDEsIHdzKTsgLyogQSgrMikqQigrMikgKi8KKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyNSwgMipuKzEsIHBwLCBzaWduLCBuLCAxLCAyKTsKKworICAvKiBBKDApKkIoMCkgKi8KKyAgVE9PTV81NF9NVUxfTl9SRUMocHAsIGFwLCBicCwgbiwgd3MpOworCisgIC8qIEluZmluaXR5ICovCisgIGlmIChzID4gdCkgeworICAgIFRPT01fNTRfTVVMX1JFQyhyMSwgYTQsIHMsIGIzLCB0LCB3cyk7CisgIH0gZWxzZSB7CisgICAgVE9PTV81NF9NVUxfUkVDKHIxLCBiMywgdCwgYTQsIHMsIHdzKTsKKyAgfTsKKworICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV84cHRzIChwcCwgbiwgcjMsIHI3LCBzICsgdCwgd3MpOworCisjdW5kZWYgYTQKKyN1bmRlZiBiMworI3VuZGVmIHIxCisjdW5kZWYgcjMKKyN1bmRlZiByNQorI3VuZGVmIHYwCisjdW5kZWYgdjEKKyN1bmRlZiB2MgorI3VuZGVmIHYzCisjdW5kZWYgcjcKKyN1bmRlZiByOAorI3VuZGVmIHdzCit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNjJfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNjJfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3MWNjMAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb202Ml9tdWwuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogbXBuX3Rvb202Ml9tdWwgLS0gTXVsdGlwbHkge2FwLGFufSBhbmQge2JwLGJufSB3aGVyZSBhbiBpcyBub21pbmFsbHkgMyB0aW1lcworICAgYXMgbGFyZ2UgYXMgYm4uICBPciBtb3JlIGFjY3VyYXRlbHksICg1LzIpYm4gPCBhbiA8IDZibi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kIGFuZCBNYXJjbyBCb2RyYXRvLgorCisgICBUaGUgaWRlYSBvZiBhcHBseWluZyB0b29tIHRvIHVuYmFsYW5jZWQgbXVsdGlwbGljYXRpb24gaXMgZHVlIHRvIE1hcmNvCisgICBCb2RyYXRvIGFuZCBBbGJlcnRvIFphbm9uaS4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNi0yMDA4LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBFdmFsdWF0ZSBpbjoKKyAgIDAsICsxLCAtMSwgKzIsIC0yLCAxLzIsICtpbmYKKworICA8LXMtPjwtLW4tLT48LS1uLS0+PC0tbi0tPjwtLW4tLT48LS1uLS0+CisgICBfX18gX19fX19fIF9fX19fXyBfX19fX18gX19fX19fIF9fX19fXworICB8YTVffF9fX2E0X3xfX19hM198X19fYTJffF9fX2ExX3xfX19hMF98CisJCQkgICAgIHxfYjFffF9fX2IwX3wKKwkJCSAgICAgPC10LS0+PC0tbi0tPgorCisgIHYwICA9ICAgIGEwICAgICAgICAgICAgICAgICAgICAgICAqICAgYjAgICAgICAjICAgIEEoMCkqQigwKQorICB2MSAgPSAoICBhMCsgIGExKyBhMisgYTMrICBhNCsgIGE1KSooIGIwKyBiMSkgIyAgICBBKDEpKkIoMSkgICAgICBhaCAgPD0gNSAgIGJoIDw9IDEKKyAgdm0xID0gKCAgYTAtICBhMSsgYTItIGEzKyAgYTQtICBhNSkqKCBiMC0gYjEpICMgICBBKC0xKSpCKC0xKSAgICB8YWh8IDw9IDIgICBiaCAgPSAwCisgIHYyICA9ICggIGEwKyAyYTErNGEyKzhhMysxNmE0KzMyYTUpKiggYjArMmIxKSAjICAgIEEoMikqQigyKSAgICAgIGFoICA8PSA2MiAgYmggPD0gMgorICB2bTIgPSAoICBhMC0gMmExKzRhMi04YTMrMTZhNC0zMmE1KSooIGIwLTJiMSkgIyAgIEEoLTIpKkIoLTIpICAgIC00MTw9YWg8PTIwIC0xPD1iaDw9MAorICB2aCAgPSAoMzJhMCsxNmExKzhhMis0YTMrIDJhNCsgIGE1KSooMmIwKyBiMSkgIyAgQSgxLzIpKkIoMS8yKSAgICBhaCAgPD0gNjIgIGJoIDw9IDIKKyAgdmluZj0gICAgICAgICAgICAgICAgICAgICAgICAgICBhNSAqICAgICAgYjEgICMgIEEoaW5mKSpCKGluZikKKyovCisKK3ZvaWQKK21wbl90b29tNjJfbXVsIChtcF9wdHIgcHAsCisJCW1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQltcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBibiwKKwkJbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBuLCBzLCB0OworICBtcF9saW1iX3QgY3k7CisgIG1wX3B0ciBhczEsIGFzbTEsIGFzMiwgYXNtMiwgYXNoOworICBtcF9wdHIgYnMxLCBic20xLCBiczIsIGJzbTIsIGJzaDsKKyAgbXBfcHRyIGdwOworICBlbnVtIHRvb203X2ZsYWdzIGFmbGFncywgYmZsYWdzOworICBUTVBfREVDTDsKKworI2RlZmluZSBhMCAgYXAKKyNkZWZpbmUgYTEgIChhcCArIG4pCisjZGVmaW5lIGEyICAoYXAgKyAyKm4pCisjZGVmaW5lIGEzICAoYXAgKyAzKm4pCisjZGVmaW5lIGE0ICAoYXAgKyA0Km4pCisjZGVmaW5lIGE1ICAoYXAgKyA1Km4pCisjZGVmaW5lIGIwICBicAorI2RlZmluZSBiMSAgKGJwICsgbikKKworICBuID0gMSArIChhbiA+PSAzICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDYgOiAoYm4gLSAxKSA+PiAxKTsKKworICBzID0gYW4gLSA1ICogbjsKKyAgdCA9IGJuIC0gbjsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisgIEFTU0VSVCAoMCA8IHQgJiYgdCA8PSBuKTsKKworICBUTVBfTUFSSzsKKworICBhczEgPSBUTVBfU0FMTE9DX0xJTUJTIChuICsgMSk7CisgIGFzbTEgPSBUTVBfU0FMTE9DX0xJTUJTIChuICsgMSk7CisgIGFzMiA9IFRNUF9TQUxMT0NfTElNQlMgKG4gKyAxKTsKKyAgYXNtMiA9IFRNUF9TQUxMT0NfTElNQlMgKG4gKyAxKTsKKyAgYXNoID0gVE1QX1NBTExPQ19MSU1CUyAobiArIDEpOworCisgIGJzMSA9IFRNUF9TQUxMT0NfTElNQlMgKG4gKyAxKTsKKyAgYnNtMSA9IFRNUF9TQUxMT0NfTElNQlMgKG4pOworICBiczIgPSBUTVBfU0FMTE9DX0xJTUJTIChuICsgMSk7CisgIGJzbTIgPSBUTVBfU0FMTE9DX0xJTUJTIChuICsgMSk7CisgIGJzaCA9IFRNUF9TQUxMT0NfTElNQlMgKG4gKyAxKTsKKworICBncCA9IHBwOworCisgIC8qIENvbXB1dGUgYXMxIGFuZCBhc20xLiAgKi8KKyAgYWZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpICh0b29tN193M19uZWcgJiBtcG5fdG9vbV9ldmFsX3BtMSAoYXMxLCBhc20xLCA1LCBhcCwgbiwgcywgZ3ApKTsKKworICAvKiBDb21wdXRlIGFzMiBhbmQgYXNtMi4gKi8KKyAgYWZsYWdzID0gKGVudW0gdG9vbTdfZmxhZ3MpIChhZmxhZ3MgfCAodG9vbTdfdzFfbmVnICYgbXBuX3Rvb21fZXZhbF9wbTIgKGFzMiwgYXNtMiwgNSwgYXAsIG4sIHMsIGdwKSkpOworCisgIC8qIENvbXB1dGUgYXNoID0gMzIgYTAgKyAxNiBhMSArIDggYTIgKyA0IGEzICsgMiBhNCArIGE1CisgICAgID0gMiooMiooMiooMiooMiphMCArIGExKSArIGEyKSArIGEzKSArIGE0KSArIGE1ICAqLworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorICBjeSA9IG1wbl9hZGRsc2gxX24gKGFzaCwgYTEsIGEwLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYXNoLCBhMiwgYXNoLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYXNoLCBhMywgYXNoLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2FkZGxzaDFfbiAoYXNoLCBhNCwgYXNoLCBuKTsKKyAgaWYgKHMgPCBuKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeTI7CisgICAgICBjeTIgPSBtcG5fYWRkbHNoMV9uIChhc2gsIGE1LCBhc2gsIHMpOworICAgICAgYXNoW25dID0gMipjeSArIG1wbl9sc2hpZnQgKGFzaCArIHMsIGFzaCArIHMsIG4gLSBzLCAxKTsKKyAgICAgIE1QTl9JTkNSX1UgKGFzaCArIHMsIG4rMS1zLCBjeTIpOworICAgIH0KKyAgZWxzZQorICAgIGFzaFtuXSA9IDIqY3kgKyBtcG5fYWRkbHNoMV9uIChhc2gsIGE1LCBhc2gsIG4pOworI2Vsc2UKKyAgY3kgPSBtcG5fbHNoaWZ0IChhc2gsIGEwLCBuLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChhc2gsIGFzaCwgYTEsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhc2gsIGFzaCwgbiwgMSk7CisgIGN5ICs9IG1wbl9hZGRfbiAoYXNoLCBhc2gsIGEyLCBuKTsKKyAgY3kgPSAyKmN5ICsgbXBuX2xzaGlmdCAoYXNoLCBhc2gsIG4sIDEpOworICBjeSArPSBtcG5fYWRkX24gKGFzaCwgYXNoLCBhMywgbik7CisgIGN5ID0gMipjeSArIG1wbl9sc2hpZnQgKGFzaCwgYXNoLCBuLCAxKTsKKyAgY3kgKz0gbXBuX2FkZF9uIChhc2gsIGFzaCwgYTQsIG4pOworICBjeSA9IDIqY3kgKyBtcG5fbHNoaWZ0IChhc2gsIGFzaCwgbiwgMSk7CisgIGFzaFtuXSA9IGN5ICsgbXBuX2FkZCAoYXNoLCBhc2gsIG4sIGE1LCBzKTsKKyNlbmRpZgorCisgIC8qIENvbXB1dGUgYnMxIGFuZCBic20xLiAgKi8KKyAgaWYgKHQgPT0gbikKKyAgICB7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgICAgICBpZiAobXBuX2NtcCAoYjAsIGIxLCBuKSA8IDApCisJeworCSAgY3kgPSBtcG5fYWRkX25fc3ViX24gKGJzMSwgYnNtMSwgYjEsIGIwLCBuKTsKKwkgIGJmbGFncyA9IHRvb203X3czX25lZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3kgPSBtcG5fYWRkX25fc3ViX24gKGJzMSwgYnNtMSwgYjAsIGIxLCBuKTsKKwkgIGJmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAwOworCX0KKyAgICAgIGJzMVtuXSA9IGN5ID4+IDE7CisjZWxzZQorICAgICAgYnMxW25dID0gbXBuX2FkZF9uIChiczEsIGIwLCBiMSwgbik7CisgICAgICBpZiAobXBuX2NtcCAoYjAsIGIxLCBuKSA8IDApCisJeworCSAgbXBuX3N1Yl9uIChic20xLCBiMSwgYjAsIG4pOworCSAgYmZsYWdzID0gdG9vbTdfdzNfbmVnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcG5fc3ViX24gKGJzbTEsIGIwLCBiMSwgbik7CisJICBiZmxhZ3MgPSAoZW51bSB0b29tN19mbGFncykgMDsKKwl9CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiczFbbl0gPSBtcG5fYWRkIChiczEsIGIwLCBuLCBiMSwgdCk7CisgICAgICBpZiAobXBuX3plcm9fcCAoYjAgKyB0LCBuIC0gdCkgJiYgbXBuX2NtcCAoYjAsIGIxLCB0KSA8IDApCisJeworCSAgbXBuX3N1Yl9uIChic20xLCBiMSwgYjAsIHQpOworCSAgTVBOX1pFUk8gKGJzbTEgKyB0LCBuIC0gdCk7CisJICBiZmxhZ3MgPSB0b29tN193M19uZWc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wbl9zdWIgKGJzbTEsIGIwLCBuLCBiMSwgdCk7CisJICBiZmxhZ3MgPSAoZW51bSB0b29tN19mbGFncykgMDsKKwl9CisgICAgfQorCisgIC8qIENvbXB1dGUgYnMyIGFuZCBic20yLiBSZWN5Y2xpbmcgYnMxIGFuZCBic20xOyBiczI9YnMxK2IxLCBic20yID0KKyAgICAgYnNtMSAtIGIxICovCisgIG1wbl9hZGQgKGJzMiwgYnMxLCBuICsgMSwgYjEsIHQpOworICBpZiAoYmZsYWdzICYgdG9vbTdfdzNfbmVnKQorICAgIHsKKyAgICAgIGJzbTJbbl0gPSBtcG5fYWRkIChic20yLCBic20xLCBuLCBiMSwgdCk7CisgICAgICBiZmxhZ3MgPSAoZW51bSB0b29tN19mbGFncykgKGJmbGFncyB8IHRvb203X3cxX25lZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRklYTUU6IFNpbXBsaWZ5IHRoaXMgbG9naWM/ICovCisgICAgICBpZiAodCA8IG4pCisJeworCSAgaWYgKG1wbl96ZXJvX3AgKGJzbTEgKyB0LCBuIC0gdCkgJiYgbXBuX2NtcCAoYnNtMSwgYjEsIHQpIDwgMCkKKwkgICAgeworCSAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX24gKGJzbTIsIGIxLCBic20xLCB0KSk7CisJICAgICAgTVBOX1pFUk8gKGJzbTIgKyB0LCBuICsgMSAtIHQpOworCSAgICAgIGJmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAoYmZsYWdzIHwgdG9vbTdfdzFfbmVnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWIgKGJzbTIsIGJzbTEsIG4sIGIxLCB0KSk7CisJICAgICAgYnNtMltuXSA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKG1wbl9jbXAgKGJzbTEsIGIxLCBuKSA8IDApCisJICAgIHsKKwkgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uIChic20yLCBiMSwgYnNtMSwgbikpOworCSAgICAgIGJmbGFncyA9IChlbnVtIHRvb203X2ZsYWdzKSAoYmZsYWdzIHwgdG9vbTdfdzFfbmVnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAoYnNtMiwgYnNtMSwgYjEsIG4pKTsKKwkgICAgfQorCSAgYnNtMltuXSA9IDA7CisJfQorICAgIH0KKworICAvKiBDb21wdXRlIGJzaCwgcmVjeWNsaW5nIGJzMS4gYnNoPWJzMStiMDsgICovCisgIGJzaFtuXSA9IGJzMVtuXSArIG1wbl9hZGRfbiAoYnNoLCBiczEsIGIwLCBuKTsKKworICBBU1NFUlQgKGFzMVtuXSA8PSA1KTsKKyAgQVNTRVJUIChiczFbbl0gPD0gMSk7CisgIEFTU0VSVCAoYXNtMVtuXSA8PSAyKTsKKyAgQVNTRVJUIChhczJbbl0gPD0gNjIpOworICBBU1NFUlQgKGJzMltuXSA8PSAyKTsKKyAgQVNTRVJUIChhc20yW25dIDw9IDQxKTsKKyAgQVNTRVJUIChic20yW25dIDw9IDEpOworICBBU1NFUlQgKGFzaFtuXSA8PSA2Mik7CisgIEFTU0VSVCAoYnNoW25dIDw9IDIpOworCisjZGVmaW5lIHYwICAgIHBwCQkJCS8qIDJuICovCisjZGVmaW5lIHYxICAgIChwcCArIDIgKiBuKQkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdmluZiAgKHBwICsgNiAqIG4pCQkJLyogcyt0ICovCisjZGVmaW5lIHYyICAgIHNjcmF0Y2gJCQkJLyogMm4rMSAqLworI2RlZmluZSB2bTIgICAoc2NyYXRjaCArIDIgKiBuICsgMSkJCS8qIDJuKzEgKi8KKyNkZWZpbmUgdmggICAgKHNjcmF0Y2ggKyA0ICogbiArIDIpCQkvKiAybisxICovCisjZGVmaW5lIHZtMSAgIChzY3JhdGNoICsgNiAqIG4gKyAzKQkJLyogMm4rMSAqLworI2RlZmluZSBzY3JhdGNoX291dCAoc2NyYXRjaCArIDggKiBuICsgNCkJCS8qIDJuKzEgKi8KKyAgLyogVG90YWwgc2NyYXRjaCBuZWVkOiAxMCpuKzUgKi8KKworICAvKiBNdXN0IGJlIGluIGFsbG9jYXRpb24gb3JkZXIsIGFzIHRoZXkgb3ZlcndyaXRlIG9uZSBsaW1iIGJleW9uZAorICAgKiAybisxLiAqLworICBtcG5fbXVsX24gKHYyLCBhczIsIGJzMiwgbiArIDEpOwkJLyogdjIsIDJuKzEgbGltYnMgKi8KKyAgbXBuX211bF9uICh2bTIsIGFzbTIsIGJzbTIsIG4gKyAxKTsJCS8qIHZtMiwgMm4rMSBsaW1icyAqLworICBtcG5fbXVsX24gKHZoLCBhc2gsIGJzaCwgbiArIDEpOwkJLyogdmgsIDJuKzEgbGltYnMgKi8KKworICAvKiB2bTEsIDJuKzEgbGltYnMgKi8KKyAgbXBuX211bF9uICh2bTEsIGFzbTEsIGJzbTEsIG4pOworICBjeSA9IDA7CisgIGlmIChhc20xW25dID09IDEpCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX24gKHZtMSArIG4sIHZtMSArIG4sIGJzbTEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYXNtMVtuXSA9PSAyKQorICAgIHsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgICAgICBjeSA9IG1wbl9hZGRsc2gxX24gKHZtMSArIG4sIHZtMSArIG4sIGJzbTEsIG4pOworI2Vsc2UKKyAgICAgIGN5ID0gbXBuX2FkZG11bF8xICh2bTEgKyBuLCBic20xLCBuLCBDTlNUX0xJTUIoMikpOworI2VuZGlmCisgICAgfQorICB2bTFbMiAqIG5dID0gY3k7CisKKyAgLyogdjEsIDJuKzEgbGltYnMgKi8KKyAgbXBuX211bF9uICh2MSwgYXMxLCBiczEsIG4pOworICBpZiAoYXMxW25dID09IDEpCisgICAgeworICAgICAgY3kgPSBiczFbbl0gKyBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBiczEsIG4pOworICAgIH0KKyAgZWxzZSBpZiAoYXMxW25dID09IDIpCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24KKyAgICAgIGN5ID0gMiAqIGJzMVtuXSArIG1wbl9hZGRsc2gxX24gKHYxICsgbiwgdjEgKyBuLCBiczEsIG4pOworI2Vsc2UKKyAgICAgIGN5ID0gMiAqIGJzMVtuXSArIG1wbl9hZGRtdWxfMSAodjEgKyBuLCBiczEsIG4sIENOU1RfTElNQigyKSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKGFzMVtuXSAhPSAwKQorICAgIHsKKyAgICAgIGN5ID0gYXMxW25dICogYnMxW25dICsgbXBuX2FkZG11bF8xICh2MSArIG4sIGJzMSwgbiwgYXMxW25dKTsKKyAgICB9CisgIGVsc2UKKyAgICBjeSA9IDA7CisgIGlmIChiczFbbl0gIT0gMCkKKyAgICBjeSArPSBtcG5fYWRkX24gKHYxICsgbiwgdjEgKyBuLCBhczEsIG4pOworICB2MVsyICogbl0gPSBjeTsKKworICBtcG5fbXVsX24gKHYwLCBhMCwgYjAsIG4pOwkJCS8qIHYwLCAybiBsaW1icyAqLworCisgIC8qIHZpbmYsIHMrdCBsaW1icyAqLworICBpZiAocyA+IHQpICBtcG5fbXVsICh2aW5mLCBhNSwgcywgYjEsIHQpOworICBlbHNlICAgICAgICBtcG5fbXVsICh2aW5mLCBiMSwgdCwgYTUsIHMpOworCisgIG1wbl90b29tX2ludGVycG9sYXRlXzdwdHMgKHBwLCBuLCAoZW51bSB0b29tN19mbGFncykgKGFmbGFncyBeIGJmbGFncyksCisJCQkgICAgIHZtMiwgdm0xLCB2MiwgdmgsIHMgKyB0LCBzY3JhdGNoX291dCk7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tNjNfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tNjNfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxOTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb202M19tdWwuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFsZ29yaXRobSBmb3IgVG9vbS1Db29rIDQuNS13YXkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBTdG9yZXMgfHthcCxufS17YnAsbn18IGluIHtycCxufSwgcmV0dXJucyB0aGUgc2lnbi4gKi8KK3N0YXRpYyBpbnQKK2Fic19zdWJfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCAgeCwgeTsKKyAgd2hpbGUgKC0tbiA+PSAwKQorICAgIHsKKyAgICAgIHggPSBhcFtuXTsKKyAgICAgIHkgPSBicFtuXTsKKyAgICAgIGlmICh4ICE9IHkpCisJeworCSAgbisrOworCSAgaWYgKHggPiB5KQorCSAgICB7CisJICAgICAgbXBuX3N1Yl9uIChycCwgYXAsIGJwLCBuKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbXBuX3N1Yl9uIChycCwgYnAsIGFwLCBuKTsKKwkgICAgICByZXR1cm4gfjA7CisJICAgIH0KKwl9CisgICAgICBycFtuXSA9IDA7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWJzX3N1Yl9hZGRfbiAobXBfcHRyIHJtLCBtcF9wdHIgcnAsIG1wX3NyY3B0ciBycywgbXBfc2l6ZV90IG4pIHsKKyAgaW50IHJlc3VsdDsKKyAgcmVzdWx0ID0gYWJzX3N1Yl9uIChybSwgcnAsIHJzLCBuKTsKKyAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF9uIChycCwgcnAsIHJzLCBuKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogVG9vbS00LjUsIHRoZSBzcGxpdHRpbmcgNngzIHVuYmFsYW5jZWQgdmVyc2lvbi4KKyAgIEV2YWx1YXRlIGluOiBpbmZpbml0eSwgKzQsIC00LCArMiwgLTIsICsxLCAtMSwgMC4KKworICA8LS1zLT48LS1uLS0+PC0tbi0tPjwtLW4tLT48LS1uLS0+PC0tbi0tPgorICAgX19fXyBfX19fX18gX19fX19fIF9fX19fXyBfX19fX18gX19fX19fCisgIHxfYTVffF9fYTRfX3xfX2EzX198X19hMl9ffF9fYTFfX3xfX2EwX198CisJCQl8YjJffF9fYjFfX3xfX2IwX198CisJCQk8LXQtPjwtLW4tLT48LS1uLS0+CisKKyovCisjZGVmaW5lIFRPT01fNjNfTVVMX05fUkVDKHAsIGEsIGIsIG4sIHdzKQkJXAorICBkbyB7CW1wbl9tdWxfbiAocCwgYSwgYiwgbik7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUT09NXzYzX01VTF9SRUMocCwgYSwgbmEsIGIsIG5iLCB3cykJCVwKKyAgZG8gewltcG5fbXVsIChwLCBhLCBuYSwgYiwgbmIpOwkJCVwKKyAgfSB3aGlsZSAoMCkKKwordm9pZAorbXBuX3Rvb202M19tdWwgKG1wX3B0ciBwcCwKKwkJbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCW1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIG1wX2xpbWJfdCBjeTsKKyAgaW50IHNpZ247CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlY29tcG9zaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgYTUgIChhcCArIDUgKiBuKQorI2RlZmluZSBiMCAgKGJwICsgMCAqIG4pCisjZGVmaW5lIGIxICAoYnAgKyAxICogbikKKyNkZWZpbmUgYjIgIChicCArIDIgKiBuKQorCisgIEFTU0VSVCAoYW4gPj0gYm4pOworICBuID0gMSArIChhbiA+PSAyICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIDYgOiAoYm4gLSAxKSAvIChzaXplX3QpIDMpOworCisgIHMgPSBhbiAtIDUgKiBuOworICB0ID0gYm4gLSAyICogbjsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisgIEFTU0VSVCAoMCA8IHQgJiYgdCA8PSBuKTsKKyAgLyogV0FSTklORyEgaXQgYXNzdW1lcyBzK3Q+PW4gKi8KKyAgQVNTRVJUICggcyArIHQgPj0gbiApOworICBBU1NFUlQgKCBzICsgdCA+IDQpOworICAvKiBXQVJOSU5HISBpdCBhc3N1bWVzIG4+MSAqLworICBBU1NFUlQgKCBuID4gMik7CisKKyNkZWZpbmUgICByOCAgICBwcAkJCQkvKiAybiAgICovCisjZGVmaW5lICAgcjcgICAgc2NyYXRjaAkJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjUgICAgKHBwICsgMypuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICB2MCAgICAocHAgKyAzKm4pCQkJLyogbisxICovCisjZGVmaW5lICAgdjEgICAgKHBwICsgNCpuKzEpCQkJLyogbisxICovCisjZGVmaW5lICAgdjIgICAgKHBwICsgNSpuKzIpCQkJLyogbisxICovCisjZGVmaW5lICAgdjMgICAgKHBwICsgNipuKzMpCQkJLyogbisxICovCisjZGVmaW5lICAgcjMgICAgKHNjcmF0Y2ggKyAzICogbiArIDEpCQkvKiAzbisxICovCisjZGVmaW5lICAgcjEgICAgKHBwICsgNypuKQkJCS8qIHMrdCA8PSAyKm4gKi8KKyNkZWZpbmUgICB3cyAgICAoc2NyYXRjaCArIDYgKiBuICsgMikJCS8qID8/PyAqLworCisgIC8qIEFsbG9jIGFsc28gM24rMSBsaW1icyBmb3Igd3MuLi4gbXBuX3Rvb21faW50ZXJwb2xhdGVfOHB0cyBtYXkKKyAgICAgbmVlZCBhbGwgb2YgdGhlbSwgd2hlbiBET19tcG5fc3VibHNoX24gdXNlYSBhIHNjcmF0Y2ggICovCisvKiAgIGlmIChzY3JhdGNoID09IE5VTEwpIHNjcmF0Y2ggPSBUTVBfU0FMTE9DX0xJTUJTICg5ICogbiArIDMpOyAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqIGV2YWx1YXRpb24gYW5kIHJlY3Vyc2l2ZSBjYWxscyAqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICRccG00JCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTJleHAgKHYyLCB2MCwgNSwgYXAsIG4sIHMsIDIsIHBwKTsKKyAgcHBbbl0gPSBtcG5fbHNoaWZ0IChwcCwgYjEsIG4sIDIpOyAvKiA0YjEgKi8KKyAgLyogRklYTUU6IHVzZSBhZGRsc2ggKi8KKyAgdjNbdF0gPSBtcG5fbHNoaWZ0ICh2MywgYjIsIHQsIDQpOy8qIDE2YjIgKi8KKyAgaWYgKCBuID09IHQgKQorICAgIHYzW25dKz0gbXBuX2FkZF9uICh2MywgdjMsIGIwLCBuKTsgLyogMTZiMitiMCAqLworICBlbHNlCisgICAgdjNbbl0gPSBtcG5fYWRkICh2MywgYjAsIG4sIHYzLCB0KzEpOyAvKiAxNmIyK2IwICovCisgIHNpZ24gXj0gYWJzX3N1Yl9hZGRfbiAodjEsIHYzLCBwcCwgbiArIDEpOworICBUT09NXzYzX01VTF9OX1JFQyhwcCwgdjAsIHYxLCBuICsgMSwgd3MpOyAvKiBBKC00KSpCKC00KSAqLworICBUT09NXzYzX01VTF9OX1JFQyhyMywgdjIsIHYzLCBuICsgMSwgd3MpOyAvKiBBKCs0KSpCKCs0KSAqLworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHIzLCAyKm4rMSwgcHAsIHNpZ24sIG4sIDIsIDQpOworCisgIC8qICRccG0xJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTEgKHYyLCB2MCwgNSwgYXAsIG4sIHMsICAgIHBwKTsKKyAgLyogQ29tcHV0ZSBiczEgYW5kIGJzbTEuIENvZGUgdGFrZW4gZnJvbSB0b29tMzMgKi8KKyAgY3kgPSBtcG5fYWRkICh3cywgYjAsIG4sIGIyLCB0KTsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKGN5ID09IDAgJiYgbXBuX2NtcCAod3MsIGIxLCBuKSA8IDApCisgICAgeworICAgICAgY3kgPSBtcG5fYWRkX25fc3ViX24gKHYzLCB2MSwgYjEsIHdzLCBuKTsKKyAgICAgIHYzW25dID0gY3kgPj4gMTsKKyAgICAgIHYxW25dID0gMDsKKyAgICAgIHNpZ24gPSB+c2lnbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3kyOworICAgICAgY3kyID0gbXBuX2FkZF9uX3N1Yl9uICh2MywgdjEsIHdzLCBiMSwgbik7CisgICAgICB2M1tuXSA9IGN5ICsgKGN5MiA+PiAxKTsKKyAgICAgIHYxW25dID0gY3kgLSAoY3kyICYgMSk7CisgICAgfQorI2Vsc2UKKyAgdjNbbl0gPSBjeSArIG1wbl9hZGRfbiAodjMsIHdzLCBiMSwgbik7CisgIGlmIChjeSA9PSAwICYmIG1wbl9jbXAgKHdzLCBiMSwgbikgPCAwKQorICAgIHsKKyAgICAgIG1wbl9zdWJfbiAodjEsIGIxLCB3cywgbik7CisgICAgICB2MVtuXSA9IDA7CisgICAgICBzaWduID0gfnNpZ247CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY3kgLT0gbXBuX3N1Yl9uICh2MSwgd3MsIGIxLCBuKTsKKyAgICAgIHYxW25dID0gY3k7CisgICAgfQorI2VuZGlmCisgIFRPT01fNjNfTVVMX05fUkVDKHBwLCB2MCwgdjEsIG4gKyAxLCB3cyk7IC8qIEEoLTEpKkIoLTEpICovCisgIFRPT01fNjNfTVVMX05fUkVDKHI3LCB2MiwgdjMsIG4gKyAxLCB3cyk7IC8qIEEoMSkqQigxKSAqLworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHI3LCAyKm4rMSwgcHAsIHNpZ24sIG4sIDAsIDApOworCisgIC8qICRccG0yJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTIgKHYyLCB2MCwgNSwgYXAsIG4sIHMsIHBwKTsKKyAgcHBbbl0gPSBtcG5fbHNoaWZ0IChwcCwgYjEsIG4sIDEpOyAvKiAyYjEgKi8KKyAgLyogRklYTUU6IHVzZSBhZGRsc2ggb3IgYWRkbHNoMiAqLworICB2M1t0XSA9IG1wbl9sc2hpZnQgKHYzLCBiMiwgdCwgMik7LyogNGIyICovCisgIGlmICggbiA9PSB0ICkKKyAgICB2M1tuXSs9IG1wbl9hZGRfbiAodjMsIHYzLCBiMCwgbik7IC8qIDRiMitiMCAqLworICBlbHNlCisgICAgdjNbbl0gPSBtcG5fYWRkICh2MywgYjAsIG4sIHYzLCB0KzEpOyAvKiA0YjIrYjAgKi8KKyAgc2lnbiBePSBhYnNfc3ViX2FkZF9uICh2MSwgdjMsIHBwLCBuICsgMSk7CisgIFRPT01fNjNfTVVMX05fUkVDKHBwLCB2MCwgdjEsIG4gKyAxLCB3cyk7IC8qIEEoLTIpKkIoLTIpICovCisgIFRPT01fNjNfTVVMX05fUkVDKHI1LCB2MiwgdjMsIG4gKyAxLCB3cyk7IC8qIEEoKzIpKkIoKzIpICovCisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjUsIDIqbisxLCBwcCwgc2lnbiwgbiwgMSwgMik7CisKKyAgLyogQSgwKSpCKDApICovCisgIFRPT01fNjNfTVVMX05fUkVDKHBwLCBhcCwgYnAsIG4sIHdzKTsKKworICAvKiBJbmZpbml0eSAqLworICBpZiAocyA+IHQpIHsKKyAgICBUT09NXzYzX01VTF9SRUMocjEsIGE1LCBzLCBiMiwgdCwgd3MpOworICB9IGVsc2UgeworICAgIFRPT01fNjNfTVVMX1JFQyhyMSwgYjIsIHQsIGE1LCBzLCB3cyk7CisgIH07CisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfOHB0cyAocHAsIG4sIHIzLCByNywgcyArIHQsIHdzKTsKKworI3VuZGVmIGE1CisjdW5kZWYgYjAKKyN1bmRlZiBiMQorI3VuZGVmIGIyCisjdW5kZWYgcjEKKyN1bmRlZiByMworI3VuZGVmIHI1CisjdW5kZWYgdjAKKyN1bmRlZiB2MQorI3VuZGVmIHYyCisjdW5kZWYgdjMKKyN1bmRlZiByNworI3VuZGVmIHI4CisjdW5kZWYgd3MKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb202X3Nxci5jIGIvbXBuL2dlbmVyaWMvdG9vbTZfc3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2ZWVmOQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb202X3Nxci5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3F1YXJpbmcgYWxnb3JpdGhtIHdpdGggVG9vbS1Db29rIDYuNS13YXkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBHTVBfTlVNQl9CSVRTIDwgMjEKKyNlcnJvciBOb3QgaW1wbGVtZW50ZWQuCisjZW5kaWYKKworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisjZGVmaW5lIE1BWUJFX3Nxcl9iYXNlY2FzZSAxCisjZGVmaW5lIE1BWUJFX3Nxcl9hYm92ZV9iYXNlY2FzZSAgIDEKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20yICAgMQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTIgICAxCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tMyAgIDEKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX3Rvb20zICAgMQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTQgICAxCisjZWxzZQorI2lmZGVmICBTUVJfVE9PTThfVEhSRVNIT0xECisjZGVmaW5lIFNRUl9UT09NNl9NQVggKChTUVJfVE9PTThfVEhSRVNIT0xEKzYqMi0xKzUpLzYpCisjZWxzZQorI2RlZmluZSBTUVJfVE9PTTZfTUFYCQkJCQlcCisgICgoU1FSX0ZGVF9USFJFU0hPTEQgPD0gTVBfU0laRV9UX01BWCAtICg2KjItMSs1KSkgPwlcCisgICAoKFNRUl9GRlRfVEhSRVNIT0xEKzYqMi0xKzUpLzYpCQkJXAorICAgOiBNUF9TSVpFX1RfTUFYICkKKyNlbmRpZgorI2RlZmluZSBNQVlCRV9zcXJfYmFzZWNhc2UJCQkJCVwKKyAgKFNRUl9UT09NNl9USFJFU0hPTEQgPCA2ICogU1FSX1RPT00yX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX2Jhc2VjYXNlCQkJCVwKKyAgKFNRUl9UT09NNl9NQVggPj0gIFNRUl9UT09NMl9USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tMgkJCQkJCVwKKyAgKFNRUl9UT09NNl9USFJFU0hPTEQgPCA2ICogU1FSX1RPT00zX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX3Rvb20yCQkJCQlcCisgIChTUVJfVE9PTTZfTUFYID49IFNRUl9UT09NM19USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tMwkJCQkJCVwKKyAgKFNRUl9UT09NNl9USFJFU0hPTEQgPCA2ICogU1FSX1RPT000X1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX3Rvb20zCQkJCQlcCisgIChTUVJfVE9PTTZfTUFYID49IFNRUl9UT09NNF9USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX3Nxcl9hYm92ZV90b29tNAkJCQkJXAorICAoU1FSX1RPT002X01BWCA+PSBTUVJfVE9PTTZfVEhSRVNIT0xEKQorI2VuZGlmCisKKyNkZWZpbmUgVE9PTTZfU1FSX1JFQyhwLCBhLCBuLCB3cykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoTUFZQkVfc3FyX2Jhc2VjYXNlICYmICggIU1BWUJFX3Nxcl9hYm92ZV9iYXNlY2FzZQkJXAorCXx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT00yX1RIUkVTSE9MRCkpKQkJCVwKKyAgICAgIG1wbl9zcXJfYmFzZWNhc2UgKHAsIGEsIG4pOwkJCQkJXAorICAgIGVsc2UgaWYgKE1BWUJFX3Nxcl90b29tMiAmJiAoICFNQVlCRV9zcXJfYWJvdmVfdG9vbTIJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT00zX1RIUkVTSE9MRCkpKQkJXAorICAgICAgbXBuX3Rvb20yX3NxciAocCwgYSwgbiwgd3MpOwkJCQkJXAorICAgIGVsc2UgaWYgKE1BWUJFX3Nxcl90b29tMyAmJiAoICFNQVlCRV9zcXJfYWJvdmVfdG9vbTMJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT000X1RIUkVTSE9MRCkpKQkJXAorICAgICAgbXBuX3Rvb20zX3NxciAocCwgYSwgbiwgd3MpOwkJCQkJXAorICAgIGVsc2UgaWYgKCEgTUFZQkVfc3FyX2Fib3ZlX3Rvb200CQkJCQlcCisJICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIFNRUl9UT09NNl9USFJFU0hPTEQpKQkJXAorICAgICAgbXBuX3Rvb200X3NxciAocCwgYSwgbiwgd3MpOwkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIG1wbl90b29tNl9zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKwordm9pZAorbXBuX3Rvb202X3NxciAgKG1wX3B0ciBwcCwgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sIG1wX3B0ciBzY3JhdGNoKQoreworICBtcF9zaXplX3QgbiwgczsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVjb21wb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEFTU0VSVCggYW4gPj0gMTggKTsKKworICBuID0gMSArIChhbiAtIDEpIC8gKHNpemVfdCkgNjsKKworICBzID0gYW4gLSA1ICogbjsKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisKKyNkZWZpbmUgICByNCAgICAocHAgKyAzICogbikJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjIgICAgKHBwICsgNyAqIG4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIwICAgIChwcCArMTEgKiBuKQkJCS8qIHMrdCA8PSAyKm4gKi8KKyNkZWZpbmUgICByNSAgICAoc2NyYXRjaCkJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjMgICAgKHNjcmF0Y2ggKyAzICogbiArIDEpCQkvKiAzbisxICovCisjZGVmaW5lICAgcjEgICAgKHNjcmF0Y2ggKyA2ICogbiArIDIpCQkvKiAzbisxICovCisjZGVmaW5lICAgdjAgICAgKHBwICsgNyAqIG4pCQkJLyogbisxICovCisjZGVmaW5lICAgdjIgICAgKHBwICsgOSAqIG4rMikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB3c2UgICAoc2NyYXRjaCArIDkgKiBuICsgMykJCS8qIDNuKzEgKi8KKworICAvKiBBbGxvYyBhbHNvIDNuKzEgbGltYnMgZm9yIHdzLi4uIHRvb21faW50ZXJwb2xhdGVfMTJwdHMgbWF5CisgICAgIG5lZWQgYWxsIG9mIHRoZW0sIHdoZW4gRE9fbXBuX3N1YmxzaF9uIHVzZWEgYSBzY3JhdGNoICAqLworLyogICBpZiAoc2NyYXRjaD09IE5VTEwpICovCisvKiAgICAgc2NyYXRjaCA9IFRNUF9TQUxMT0NfTElNQlMgKDEyICogbiArIDYpOyAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqIGV2YWx1YXRpb24gYW5kIHJlY3Vyc2l2ZSBjYWxscyAqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICRccG0xLzIkICovCisgIG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjIsIHYwLCA1LCBhcCwgbiwgcywgMSwgcHApOworICBUT09NNl9TUVJfUkVDKHBwLCB2MCwgbiArIDEsIHdzZSk7IC8qIEEoLTEvMikqQigtMS8yKSoyXi4gKi8KKyAgVE9PTTZfU1FSX1JFQyhyNSwgdjIsIG4gKyAxLCB3c2UpOyAvKiBBKCsxLzIpKkIoKzEvMikqMl4uICovCisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjUsIDIgKiBuICsgMSwgcHAsIDAsIG4sIDEsIDApOworCisgIC8qICRccG0xJCAqLworICBtcG5fdG9vbV9ldmFsX3BtMSAodjIsIHYwLCA1LCBhcCwgbiwgcywgICAgcHApOworICBUT09NNl9TUVJfUkVDKHBwLCB2MCwgbiArIDEsIHdzZSk7IC8qIEEoLTEpKkIoLTEpICovCisgIFRPT002X1NRUl9SRUMocjMsIHYyLCBuICsgMSwgd3NlKTsgLyogQSgxKSpCKDEpICovCisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjMsIDIgKiBuICsgMSwgcHAsIDAsIG4sIDAsIDApOworCisgIC8qICRccG00JCAqLworICBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjIsIHYwLCA1LCBhcCwgbiwgcywgMiwgcHApOworICBUT09NNl9TUVJfUkVDKHBwLCB2MCwgbiArIDEsIHdzZSk7IC8qIEEoLTQpKkIoLTQpICovCisgIFRPT002X1NRUl9SRUMocjEsIHYyLCBuICsgMSwgd3NlKTsgLyogQSgrNCkqQigrNCkgKi8KKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMSwgMiAqIG4gKyAxLCBwcCwgMCwgbiwgMiwgNCk7CisKKyAgLyogJFxwbTEvNCQgKi8KKyAgbXBuX3Rvb21fZXZhbF9wbTJyZXhwICh2MiwgdjAsIDUsIGFwLCBuLCBzLCAyLCBwcCk7CisgIFRPT002X1NRUl9SRUMocHAsIHYwLCBuICsgMSwgd3NlKTsgLyogQSgtMS80KSpCKC0xLzQpKjReLiAqLworICBUT09NNl9TUVJfUkVDKHI0LCB2MiwgbiArIDEsIHdzZSk7IC8qIEEoKzEvNCkqQigrMS80KSo0Xi4gKi8KKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyNCwgMiAqIG4gKyAxLCBwcCwgMCwgbiwgMiwgMCk7CisKKyAgLyogJFxwbTIkICovCisgIG1wbl90b29tX2V2YWxfcG0yICh2MiwgdjAsIDUsIGFwLCBuLCBzLCBwcCk7CisgIFRPT002X1NRUl9SRUMocHAsIHYwLCBuICsgMSwgd3NlKTsgLyogQSgtMikqQigtMikgKi8KKyAgVE9PTTZfU1FSX1JFQyhyMiwgdjIsIG4gKyAxLCB3c2UpOyAvKiBBKCsyKSpCKCsyKSAqLworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHIyLCAyICogbiArIDEsIHBwLCAwLCBuLCAxLCAyKTsKKworI3VuZGVmIHYwCisjdW5kZWYgdjIKKworICAvKiBBKDApKkIoMCkgKi8KKyAgVE9PTTZfU1FSX1JFQyhwcCwgYXAsIG4sIHdzZSk7CisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfMTJwdHMgKHBwLCByMSwgcjMsIHI1LCBuLCAyICogcywgMCwgd3NlKTsKKworI3VuZGVmIHIwCisjdW5kZWYgcjEKKyN1bmRlZiByMgorI3VuZGVmIHIzCisjdW5kZWYgcjQKKyN1bmRlZiByNQorCit9CisjdW5kZWYgVE9PTTZfU1FSX1JFQworI3VuZGVmIE1BWUJFX3Nxcl9iYXNlY2FzZQorI3VuZGVmIE1BWUJFX3Nxcl9hYm92ZV9iYXNlY2FzZQorI3VuZGVmIE1BWUJFX3Nxcl90b29tMgorI3VuZGVmIE1BWUJFX3Nxcl9hYm92ZV90b29tMgorI3VuZGVmIE1BWUJFX3Nxcl90b29tMworI3VuZGVmIE1BWUJFX3Nxcl9hYm92ZV90b29tMworI3VuZGVmIE1BWUJFX3Nxcl9hYm92ZV90b29tNApkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbTZoX211bC5jIGIvbXBuL2dlbmVyaWMvdG9vbTZoX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2YyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tNmhfbXVsLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBhbGdvcml0aG0gZm9yIFRvb20tQ29vayA2LjUtd2F5LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWYgR01QX05VTUJfQklUUyA8IDIxCisjZXJyb3IgTm90IGltcGxlbWVudGVkLgorI2VuZGlmCisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQKKyNkZWZpbmUgTUFZQkVfbXVsX2Jhc2VjYXNlIDEKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb20yMiAgIDEKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb20zMyAgIDEKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb202aCAgIDEKKyNlbHNlCisjZGVmaW5lIE1BWUJFX211bF9iYXNlY2FzZQkJCQkJCVwKKyAgKE1VTF9UT09NNkhfVEhSRVNIT0xEIDwgNiAqIE1VTF9UT09NMjJfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9tdWxfdG9vbTIyCQkJCQkJXAorICAoTVVMX1RPT002SF9USFJFU0hPTEQgPCA2ICogTVVMX1RPT00zM19USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX211bF90b29tMzMJCQkJCQlcCisgIChNVUxfVE9PTTZIX1RIUkVTSE9MRCA8IDYgKiBNVUxfVE9PTTQ0X1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb202aAkJCQkJCVwKKyAgKE1VTF9GRlRfVEhSRVNIT0xEID49IDYgKiBNVUxfVE9PTTZIX1RIUkVTSE9MRCkKKyNlbmRpZgorCisjZGVmaW5lIFRPT002SF9NVUxfTl9SRUMocCwgYSwgYiwgZiwgcDIsIGEyLCBiMiwgbiwgd3MpCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpIHsJCQlcCisgICAgICBtcG5fbXVsX2Jhc2VjYXNlIChwLCBhLCBuLCBiLCBuKTsJCQkJCVwKKyAgICAgIGlmIChmKQkJCQkJCQkJXAorCW1wbl9tdWxfYmFzZWNhc2UgKHAyLCBhMiwgbiwgYjIsIG4pOwkJCQlcCisgICAgfSBlbHNlIGlmIChNQVlCRV9tdWxfdG9vbTIyCQkJCQkJXAorCSAgICAgICAmJiBCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NMzNfVEhSRVNIT0xEKSkgewkJXAorICAgICAgbXBuX3Rvb20yMl9tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICAgICAgaWYgKGYpCQkJCQkJCQlcCisJbXBuX3Rvb20yMl9tdWwgKHAyLCBhMiwgbiwgYjIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSBpZiAoTUFZQkVfbXVsX3Rvb20zMwkJCQkJCVwKKwkgICAgICAgJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTQ0X1RIUkVTSE9MRCkpIHsJCVwKKyAgICAgIG1wbl90b29tMzNfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CQkJCVwKKyAgICAgIGlmIChmKQkJCQkJCQkJXAorCW1wbl90b29tMzNfbXVsIChwMiwgYTIsIG4sIGIyLCBuLCB3cyk7CQkJCVwKKyAgICB9IGVsc2UgaWYgKCEgTUFZQkVfbXVsX3Rvb202aAkJCQkJXAorCSAgICAgICB8fCBCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NNkhfVEhSRVNIT0xEKSkgewkJXAorICAgICAgbXBuX3Rvb200NF9tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICAgICAgaWYgKGYpCQkJCQkJCQlcCisJbXBuX3Rvb200NF9tdWwgKHAyLCBhMiwgbiwgYjIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSB7CQkJCQkJCQlcCisgICAgICBtcG5fdG9vbTZoX211bCAocCwgYSwgbiwgYiwgbiwgd3MpOwkJCQlcCisgICAgICBpZiAoZikJCQkJCQkJCVwKKwltcG5fdG9vbTZoX211bCAocDIsIGEyLCBuLCBiMiwgbiwgd3MpOwkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUT09NNkhfTVVMX1JFQyhwLCBhLCBuYSwgYiwgbmIsIHdzKQkJXAorICBkbyB7IG1wbl9tdWwgKHAsIGEsIG5hLCBiLCBuYik7CQkJXAorICB9IHdoaWxlICgwKQorCisvKiBUb29tLTYuNSAsIGNvbXB1dGUgdGhlIHByb2R1Y3Qge3BwLGFuK2JufSA8LSB7YXAsYW59ICoge2JwLGJufQorICAgV2l0aDogYW4gPj0gYm4gPj0gNDYsIGFuKjYgPCAgYm4gKiAxNy4KKyAgIEl0IF9tYXlfIHdvcmsgd2l0aCBibjw9NDYgYW5kIGJuKjE3IDwgYW4qNiA8IGJuKjE4CisKKyAgIEV2YWx1YXRlIGluOiBpbmZpbml0eSwgKzQsIC00LCArMiwgLTIsICsxLCAtMSwgKzEvMiwgLTEvMiwgKzEvNCwgLTEvNCwgMC4KKyovCisvKiBFc3RpbWF0ZSBvbiBuZWVkZWQgc2NyYXRjaDoKKyAgIFMobikgPD0gKG4rNSlcNioxMCs0K01BWChTKChuKzUpXDYpLDErMioobis1KVw2KSwKKyAgIHNpbmNlIG4+NDI7IFMobikgPD0gY2VpbChsb2cobikvbG9nKDYpKSooMTArNCkrbioxMlw2IDwgbioyICsgbGcyKG4pKjYKKyAqLworCit2b2lkCittcG5fdG9vbTZoX211bCAgIChtcF9wdHIgcHAsCisJCSAgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4sCisJCSAgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4sIG1wX3B0ciBzY3JhdGNoKQoreworICBtcF9zaXplX3QgbiwgcywgdDsKKyAgaW50IHAsIHEsIGhhbGY7CisgIGludCBzaWduOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWNvbXBvc2l0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgQVNTRVJUIChhbiA+PSBibik7CisgIC8qIENhbiBub3QgaGFuZGxlIHRvbyBtdWNoIHVuYmFsYW5jZW1lbnQgKi8KKyAgQVNTRVJUIChibiA+PSA0Mik7CisgIC8qIENhbiBub3QgaGFuZGxlIHRvbyBtdWNoIHVuYmFsYW5jZW1lbnQgKi8KKyAgQVNTRVJUICgoYW4qMyA8ICBibiAqIDgpIHx8IChibiA+PSA0NiAmJiBhbiAqIDYgPCAgYm4gKiAxNykpOworCisgIC8qIExpbWl0IG51bS9kZW4gaXMgYSByYXRpb25hbCBudW1iZXIgYmV0d2VlbgorICAgICAoMTIvMTEpXihsb2coNCkvbG9nKDIqNC0xKSkgYW5kICgxMi8xMSleKGxvZyg2KS9sb2coMio2LTEpKSAgICAgICAgICAgICAqLworI2RlZmluZSBMSU1JVF9udW1lcmF0b3IgKDE4KQorI2RlZmluZSBMSU1JVF9kZW5vbWluYXQgKDE3KQorCisgIGlmIChMSUtFTFkgKGFuICogTElNSVRfZGVub21pbmF0IDwgTElNSVRfbnVtZXJhdG9yICogYm4pKSAvKiBpcyA2Ki4uLiA8IDYqLi4uICovCisgICAgeworICAgICAgbiA9IDEgKyAoYW4gLSAxKSAvIChzaXplX3QpIDY7CisgICAgICBwID0gcSA9IDU7CisgICAgICBoYWxmID0gMDsKKworICAgICAgcyA9IGFuIC0gNSAqIG47CisgICAgICB0ID0gYm4gLSA1ICogbjsKKyAgICB9CisgIGVsc2UgeworICAgIGlmIChhbiAqIDUgKiBMSU1JVF9udW1lcmF0b3IgPCBMSU1JVF9kZW5vbWluYXQgKiA3ICogYm4pCisgICAgICB7IHAgPSA3OyBxID0gNjsgfQorICAgIGVsc2UgaWYgKGFuICogNSAqIExJTUlUX2Rlbm9taW5hdCA8IExJTUlUX251bWVyYXRvciAqIDcgKiBibikKKyAgICAgIHsgcCA9IDc7IHEgPSA1OyB9CisgICAgZWxzZSBpZiAoYW4gKiBMSU1JVF9udW1lcmF0b3IgPCBMSU1JVF9kZW5vbWluYXQgKiAyICogYm4pICAvKiBpcyA0Ki4uLiA8IDgqLi4uICovCisgICAgICB7IHAgPSA4OyBxID0gNTsgfQorICAgIGVsc2UgaWYgKGFuICogTElNSVRfZGVub21pbmF0IDwgTElNSVRfbnVtZXJhdG9yICogMiAqIGJuKSAgLyogaXMgNCouLi4gPCA4Ki4uLiAqLworICAgICAgeyBwID0gODsgcSA9IDQ7IH0KKyAgICBlbHNlCisgICAgICB7IHAgPSA5OyBxID0gNDsgfQorCisgICAgaGFsZiA9IChwIF4gcSkgJiAxOworICAgIG4gPSAxICsgKHEgKiBhbiA+PSBwICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIHAgOiAoYm4gLSAxKSAvIChzaXplX3QpIHEpOworICAgIHAtLTsgcS0tOworCisgICAgcyA9IGFuIC0gcCAqIG47CisgICAgdCA9IGJuIC0gcSAqIG47CisKKyAgICAvKiBXaXRoIExJTUlUID0gMTYvMTUsIHRoZSBmb2xsb3dpbmcgcmVjb3ZlciBpcyBuZWVkZWQgb25seSBpZiBibjw9NzMqLworICAgIGlmIChoYWxmKSB7IC8qIFJlY292ZXIgZnJvbSBiYWRseSBjaG9zZW4gc3BsaXR0aW5nICovCisgICAgICBpZiAoVU5MSUtFTFkgKHM8MSkpIHtwLS07IHMrPW47IGhhbGY9MDt9CisgICAgICBlbHNlIGlmIChVTkxJS0VMWSAodDwxKSkge3EtLTsgdCs9bjsgaGFsZj0wO30KKyAgICB9CisgIH0KKyN1bmRlZiBMSU1JVF9udW1lcmF0b3IKKyN1bmRlZiBMSU1JVF9kZW5vbWluYXQKKworICBBU1NFUlQgKDAgPCBzICYmIHMgPD0gbik7CisgIEFTU0VSVCAoMCA8IHQgJiYgdCA8PSBuKTsKKyAgQVNTRVJUIChoYWxmIHx8IHMgKyB0ID4gMyk7CisgIEFTU0VSVCAobiA+IDIpOworCisjZGVmaW5lICAgcjQgICAgKHBwICsgMyAqIG4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIyICAgIChwcCArIDcgKiBuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByMCAgICAocHAgKzExICogbikJCQkvKiBzK3QgPD0gMipuICovCisjZGVmaW5lICAgcjUgICAgKHNjcmF0Y2gpCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIzICAgIChzY3JhdGNoICsgMyAqIG4gKyAxKQkJLyogM24rMSAqLworI2RlZmluZSAgIHIxICAgIChzY3JhdGNoICsgNiAqIG4gKyAyKQkJLyogM24rMSAqLworI2RlZmluZSAgIHYwICAgIChwcCArIDcgKiBuKQkJCS8qIG4rMSAqLworI2RlZmluZSAgIHYxICAgIChwcCArIDggKiBuKzEpCQkJLyogbisxICovCisjZGVmaW5lICAgdjIgICAgKHBwICsgOSAqIG4rMikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB2MyAgICAoc2NyYXRjaCArIDkgKiBuICsgMykJCS8qIG4rMSAqLworI2RlZmluZSAgIHdzaSAgIChzY3JhdGNoICsgOSAqIG4gKyAzKQkJLyogM24rMSAqLworI2RlZmluZSAgIHdzZSAgIChzY3JhdGNoICsxMCAqIG4gKyA0KQkJLyogMm4rMSAqLworCisgIC8qIEFsbG9jIGFsc28gM24rMSBsaW1icyBmb3Igd3NpLi4uIHRvb21faW50ZXJwb2xhdGVfMTJwdHMgbWF5CisgICAgIG5lZWQgYWxsIG9mIHRoZW0gICovCisvKiAgIGlmIChzY3JhdGNoID09IE5VTEwpICovCisvKiAgICAgc2NyYXRjaCA9IFRNUF9TQUxMT0NfTElNQlMobXBuX3Rvb202X3Nxcl9pdGNoKG4gKiA2KSk7ICovCisgIEFTU0VSVCAoMTIgKiBuICsgNiA8PSBtcG5fdG9vbTZoX211bF9pdGNoKGFuLGJuKSk7CisgIEFTU0VSVCAoMTIgKiBuICsgNiA8PSBtcG5fdG9vbTZfc3FyX2l0Y2gobiAqIDYpKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKiBldmFsdWF0aW9uIGFuZCByZWN1cnNpdmUgY2FsbHMgKioqKioqKioqKioqKioqKioqKioqLworICAvKiAkXHBtMS8yJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTJyZXhwICh2MiwgdjAsIHAsIGFwLCBuLCBzLCAxLCBwcCkgXgorCSBtcG5fdG9vbV9ldmFsX3BtMnJleHAgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIDEsIHBwKTsKKyAgLyogQSgtMS8yKSpCKC0xLzIpKjJeLiAqLyAvKiBBKCsxLzIpKkIoKzEvMikqMl4uICovCisgIFRPT002SF9NVUxfTl9SRUMocHAsIHYwLCB2MSwgMiwgcjUsIHYyLCB2MywgbiArIDEsIHdzZSk7CisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjUsIDIgKiBuICsgMSwgcHAsIHNpZ24sIG4sIDEraGFsZiAsIGhhbGYpOworCisgIC8qICRccG0xJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTEgKHYyLCB2MCwgcCwgYXAsIG4sIHMsICAgIHBwKTsKKyAgaWYgKFVOTElLRUxZIChxID09IDMpKQorICAgIHNpZ24gXj0gbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAodjMsIHYxLCBicCwgbiwgdCwgICAgcHApOworICBlbHNlCisgICAgc2lnbiBePSBtcG5fdG9vbV9ldmFsX3BtMSAodjMsIHYxLCBxLCBicCwgbiwgdCwgICAgcHApOworICAvKiBBKC0xKSpCKC0xKSAqLyAvKiBBKDEpKkIoMSkgKi8KKyAgVE9PTTZIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByMywgdjIsIHYzLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMywgMiAqIG4gKyAxLCBwcCwgc2lnbiwgbiwgMCwgMCk7CisKKyAgLyogJFxwbTQkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjIsIHYwLCBwLCBhcCwgbiwgcywgMiwgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTJleHAgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIDIsIHBwKTsKKyAgLyogQSgtNCkqQigtNCkgKi8KKyAgVE9PTTZIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByMSwgdjIsIHYzLCBuICsgMSwgd3NlKTsgLyogQSgrNCkqQigrNCkgKi8KKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMSwgMiAqIG4gKyAxLCBwcCwgc2lnbiwgbiwgMiwgNCk7CisKKyAgLyogJFxwbTEvNCQgKi8KKyAgc2lnbiA9IG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjIsIHYwLCBwLCBhcCwgbiwgcywgMiwgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTJyZXhwICh2MywgdjEsIHEsIGJwLCBuLCB0LCAyLCBwcCk7CisgIC8qIEEoLTEvNCkqQigtMS80KSo0Xi4gKi8gLyogQSgrMS80KSpCKCsxLzQpKjReLiAqLworICBUT09NNkhfTVVMX05fUkVDKHBwLCB2MCwgdjEsIDIsIHI0LCB2MiwgdjMsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHI0LCAyICogbiArIDEsIHBwLCBzaWduLCBuLCAyKigxK2hhbGYpLCAyKihoYWxmKSk7CisKKyAgLyogJFxwbTIkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMiAodjIsIHYwLCBwLCBhcCwgbiwgcywgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTIgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIHBwKTsKKyAgLyogQSgtMikqQigtMikgKi8gLyogQSgrMikqQigrMikgKi8KKyAgVE9PTTZIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByMiwgdjIsIHYzLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMiwgMiAqIG4gKyAxLCBwcCwgc2lnbiwgbiwgMSwgMik7CisKKyN1bmRlZiB2MAorI3VuZGVmIHYxCisjdW5kZWYgdjIKKyN1bmRlZiB2MworI3VuZGVmIHdzZQorCisgIC8qIEEoMCkqQigwKSAqLworICBUT09NNkhfTVVMX05fUkVDKHBwLCBhcCwgYnAsIDAsIHBwLCBhcCwgYnAsIG4sIHdzaSk7CisKKyAgLyogSW5maW5pdHkgKi8KKyAgaWYgKFVOTElLRUxZIChoYWxmICE9IDApKSB7CisgICAgaWYgKHMgPiB0KSB7CisgICAgICBUT09NNkhfTVVMX1JFQyhyMCwgYXAgKyBwICogbiwgcywgYnAgKyBxICogbiwgdCwgd3NpKTsKKyAgICB9IGVsc2UgeworICAgICAgVE9PTTZIX01VTF9SRUMocjAsIGJwICsgcSAqIG4sIHQsIGFwICsgcCAqIG4sIHMsIHdzaSk7CisgICAgfTsKKyAgfTsKKworICBtcG5fdG9vbV9pbnRlcnBvbGF0ZV8xMnB0cyAocHAsIHIxLCByMywgcjUsIG4sIHMrdCwgaGFsZiwgd3NpKTsKKworI3VuZGVmIHIwCisjdW5kZWYgcjEKKyN1bmRlZiByMgorI3VuZGVmIHIzCisjdW5kZWYgcjQKKyN1bmRlZiByNQorI3VuZGVmIHdzaQorfQorCisjdW5kZWYgVE9PTTZIX01VTF9OX1JFQworI3VuZGVmIFRPT002SF9NVUxfUkVDCisjdW5kZWYgTUFZQkVfbXVsX2Jhc2VjYXNlCisjdW5kZWYgTUFZQkVfbXVsX3Rvb20yMgorI3VuZGVmIE1BWUJFX211bF90b29tMzMKKyN1bmRlZiBNQVlCRV9tdWxfdG9vbTZoCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tOF9zcXIuYyBiL21wbi9nZW5lcmljL3Rvb204X3Nxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTVjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tOF9zcXIuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNxdWFyaW5nIGFsZ29yaXRobSB3aXRoIFRvb20tQ29vayA4LjUtd2F5LgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2lmIEdNUF9OVU1CX0JJVFMgPCAyOQorI2Vycm9yIE5vdCBpbXBsZW1lbnRlZC4KKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyA8IDQzCisjZGVmaW5lIEJJVF9DT1JSRUNUSU9OIDEKKyNkZWZpbmUgQ09SUkVDVElPTl9CSVRTIEdNUF9OVU1CX0JJVFMKKyNlbHNlCisjZGVmaW5lIEJJVF9DT1JSRUNUSU9OIDAKKyNkZWZpbmUgQ09SUkVDVElPTl9CSVRTIDAKKyNlbmRpZgorCisjaWZuZGVmIFNRUl9UT09NOF9USFJFU0hPTEQKKyNkZWZpbmUgU1FSX1RPT004X1RIUkVTSE9MRCBNVUxfVE9PTThIX1RIUkVTSE9MRAorI2VuZGlmCisKKyNpZm5kZWYgU1FSX1RPT002X1RIUkVTSE9MRAorI2RlZmluZSBTUVJfVE9PTTZfVEhSRVNIT0xEIE1VTF9UT09NNkhfVEhSRVNIT0xECisjZW5kaWYKKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRAorI2RlZmluZSBNQVlCRV9zcXJfYmFzZWNhc2UgMQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfYmFzZWNhc2UgICAxCisjZGVmaW5lIE1BWUJFX3Nxcl90b29tMiAgIDEKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX3Rvb20yICAgMQorI2RlZmluZSBNQVlCRV9zcXJfdG9vbTMgICAxCisjZGVmaW5lIE1BWUJFX3Nxcl9hYm92ZV90b29tMyAgIDEKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb200ICAgMQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTQgICAxCisjZGVmaW5lIE1BWUJFX3Nxcl9hYm92ZV90b29tNiAgIDEKKyNlbHNlCisjZGVmaW5lIFNRUl9UT09NOF9NQVgJCQkJCVwKKyAgKChTUVJfRkZUX1RIUkVTSE9MRCA8PSBNUF9TSVpFX1RfTUFYIC0gKDgqMi0xKzcpKSA/CVwKKyAgICgoU1FSX0ZGVF9USFJFU0hPTEQrOCoyLTErNykvOCkJCQlcCisgICA6IE1QX1NJWkVfVF9NQVggKQorI2RlZmluZSBNQVlCRV9zcXJfYmFzZWNhc2UJCQkJCVwKKyAgKFNRUl9UT09NOF9USFJFU0hPTEQgPCA4ICogU1FSX1RPT00yX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX2Jhc2VjYXNlCQkJCVwKKyAgKFNRUl9UT09NOF9NQVggPj0gU1FSX1RPT00yX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20yCQkJCQkJXAorICAoU1FSX1RPT004X1RIUkVTSE9MRCA8IDggKiBTUVJfVE9PTTNfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTIJCQkJCVwKKyAgKFNRUl9UT09NOF9NQVggPj0gU1FSX1RPT00zX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb20zCQkJCQkJXAorICAoU1FSX1RPT004X1RIUkVTSE9MRCA8IDggKiBTUVJfVE9PTTRfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTMJCQkJCVwKKyAgKFNRUl9UT09NOF9NQVggPj0gU1FSX1RPT000X1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX3Rvb200CQkJCQkJXAorICAoU1FSX1RPT004X1RIUkVTSE9MRCA8IDggKiBTUVJfVE9PTTZfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9zcXJfYWJvdmVfdG9vbTQJCQkJCVwKKyAgKFNRUl9UT09NOF9NQVggPj0gU1FSX1RPT002X1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfc3FyX2Fib3ZlX3Rvb202CQkJCQlcCisgIChTUVJfVE9PTThfTUFYID49IFNRUl9UT09NOF9USFJFU0hPTEQpCisjZW5kaWYKKworI2RlZmluZSBUT09NOF9TUVJfUkVDKHAsIGEsIGYsIHAyLCBhMiwgbiwgd3MpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoTUFZQkVfc3FyX2Jhc2VjYXNlICYmICggIU1BWUJFX3Nxcl9hYm92ZV9iYXNlY2FzZQkJXAorCXx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT00yX1RIUkVTSE9MRCkpKSB7CQkJXAorICAgICAgbXBuX3Nxcl9iYXNlY2FzZSAocCwgYSwgbik7CQkJCQlcCisgICAgICBpZiAoZikgbXBuX3Nxcl9iYXNlY2FzZSAocDIsIGEyLCBuKTsJCQkJXAorICAgIH0gZWxzZSBpZiAoTUFZQkVfc3FyX3Rvb20yICYmICggIU1BWUJFX3Nxcl9hYm92ZV90b29tMgkJXAorCSAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTNfVEhSRVNIT0xEKSkpIHsJCVwKKyAgICAgIG1wbl90b29tMl9zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbTJfc3FyIChwMiwgYTIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSBpZiAoTUFZQkVfc3FyX3Rvb20zICYmICggIU1BWUJFX3Nxcl9hYm92ZV90b29tMwkJXAorCSAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTRfVEhSRVNIT0xEKSkpIHsJCVwKKyAgICAgIG1wbl90b29tM19zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbTNfc3FyIChwMiwgYTIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSBpZiAoTUFZQkVfc3FyX3Rvb200ICYmICggIU1BWUJFX3Nxcl9hYm92ZV90b29tNAkJXAorCSAgICAgfHwgQkVMT1dfVEhSRVNIT0xEIChuLCBTUVJfVE9PTTZfVEhSRVNIT0xEKSkpIHsJCVwKKyAgICAgIG1wbl90b29tNF9zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbTRfc3FyIChwMiwgYTIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSBpZiAoISBNQVlCRV9zcXJfYWJvdmVfdG9vbTYJCQkJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgU1FSX1RPT004X1RIUkVTSE9MRCkpIHsJCVwKKyAgICAgIG1wbl90b29tNl9zcXIgKHAsIGEsIG4sIHdzKTsJCQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbTZfc3FyIChwMiwgYTIsIG4sIHdzKTsJCQkJXAorICAgIH0gZWxzZSB7CQkJCQkJCQlcCisgICAgICBtcG5fdG9vbThfc3FyIChwLCBhLCBuLCB3cyk7CQkJCQlcCisgICAgICBpZiAoZikgbXBuX3Rvb204X3NxciAocDIsIGEyLCBuLCB3cyk7CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCit2b2lkCittcG5fdG9vbThfc3FyICAobXBfcHRyIHBwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3NpemVfdCBuLCBzOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWNvbXBvc2l0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgQVNTRVJUICggYW4gPj0gNDAgKTsKKworICBuID0gMSArICgoYW4gLSAxKT4+Myk7CisKKyAgcyA9IGFuIC0gNyAqIG47CisKKyAgQVNTRVJUICgwIDwgcyAmJiBzIDw9IG4pOworICBBU1NFUlQgKCBzICsgcyA+IDMgKTsKKworI2RlZmluZSAgIHI2ICAgIChwcCArIDMgKiBuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByNCAgICAocHAgKyA3ICogbikJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjIgICAgKHBwICsxMSAqIG4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIwICAgIChwcCArMTUgKiBuKQkJCS8qIHMrdCA8PSAyKm4gKi8KKyNkZWZpbmUgICByNyAgICAoc2NyYXRjaCkJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjUgICAgKHNjcmF0Y2ggKyAzICogbiArIDEpCQkvKiAzbisxICovCisjZGVmaW5lICAgcjMgICAgKHNjcmF0Y2ggKyA2ICogbiArIDIpCQkvKiAzbisxICovCisjZGVmaW5lICAgcjEgICAgKHNjcmF0Y2ggKyA5ICogbiArIDMpCQkvKiAzbisxICovCisjZGVmaW5lICAgdjAgICAgKHBwICsxMSAqIG4pCQkJLyogbisxICovCisjZGVmaW5lICAgdjIgICAgKHBwICsxMyAqIG4rMikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB3c2UgICAoc2NyYXRjaCArMTIgKiBuICsgNCkJCS8qIDNuKzEgKi8KKworICAvKiBBbGxvYyBhbHNvIDNuKzEgbGltYnMgZm9yIHdzLi4uIHRvb21faW50ZXJwb2xhdGVfMTZwdHMgbWF5CisgICAgIG5lZWQgYWxsIG9mIHRoZW0sIHdoZW4gRE9fbXBuX3N1YmxzaF9uIHVzZWEgYSBzY3JhdGNoICAqLworLyogICBpZiAoc2NyYXRjaCA9PSBOVUxMKSAqLworLyogICAgIHNjcmF0Y2ggPSBUTVBfU0FMTE9DX0xJTUJTICgzMCAqIG4gKyA2KTsgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKiBldmFsdWF0aW9uIGFuZCByZWN1cnNpdmUgY2FsbHMgKioqKioqKioqKioqKioqKioqKioqLworICAvKiAkXHBtMS84JCAqLworICBtcG5fdG9vbV9ldmFsX3BtMnJleHAgKHYyLCB2MCwgNywgYXAsIG4sIHMsIDMsIHBwKTsKKyAgLyogQSgtMS84KSpCKC0xLzgpKjheLiAqLyAvKiBBKCsxLzgpKkIoKzEvOCkqOF4uICovCisgIFRPT004X1NRUl9SRUMocHAsIHYwLCAyLCByNywgdjIsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHI3LCAyICogbiArIDEgKyBCSVRfQ09SUkVDVElPTiwgcHAsIDAsIG4sIDMsIDApOworCisgIC8qICRccG0xLzQkICovCisgIG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjIsIHYwLCA3LCBhcCwgbiwgcywgMiwgcHApOworICAvKiBBKC0xLzQpKkIoLTEvNCkqNF4uICovIC8qIEEoKzEvNCkqQigrMS80KSo0Xi4gKi8KKyAgVE9PTThfU1FSX1JFQyhwcCwgdjAsIDIsIHI1LCB2MiwgbiArIDEsIHdzZSk7CisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjUsIDIgKiBuICsgMSwgcHAsIDAsIG4sIDIsIDApOworCisgIC8qICRccG0yJCAqLworICBtcG5fdG9vbV9ldmFsX3BtMiAodjIsIHYwLCA3LCBhcCwgbiwgcywgcHApOworICAvKiBBKC0yKSpCKC0yKSAqLyAvKiBBKCsyKSpCKCsyKSAqLworICBUT09NOF9TUVJfUkVDKHBwLCB2MCwgMiwgcjMsIHYyLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMywgMiAqIG4gKyAxLCBwcCwgMCwgbiwgMSwgMik7CisKKyAgLyogJFxwbTgkICovCisgIG1wbl90b29tX2V2YWxfcG0yZXhwICh2MiwgdjAsIDcsIGFwLCBuLCBzLCAzLCBwcCk7CisgIC8qIEEoLTgpKkIoLTgpICovIC8qIEEoKzgpKkIoKzgpICovCisgIFRPT004X1NRUl9SRUMocHAsIHYwLCAyLCByMSwgdjIsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHIxLCAyICogbiArIDEgKyBCSVRfQ09SUkVDVElPTiwgcHAsIDAsIG4sIDMsIDYpOworCisgIC8qICRccG0xLzIkICovCisgIG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjIsIHYwLCA3LCBhcCwgbiwgcywgMSwgcHApOworICAvKiBBKC0xLzIpKkIoLTEvMikqMl4uICovIC8qIEEoKzEvMikqQigrMS8yKSoyXi4gKi8KKyAgVE9PTThfU1FSX1JFQyhwcCwgdjAsIDIsIHI2LCB2MiwgbiArIDEsIHdzZSk7CisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjYsIDIgKiBuICsgMSwgcHAsIDAsIG4sIDEsIDApOworCisgIC8qICRccG0xJCAqLworICBtcG5fdG9vbV9ldmFsX3BtMSAodjIsIHYwLCA3LCBhcCwgbiwgcywgICAgcHApOworICAvKiBBKC0xKSpCKC0xKSAqLyAvKiBBKDEpKkIoMSkgKi8KKyAgVE9PTThfU1FSX1JFQyhwcCwgdjAsIDIsIHI0LCB2MiwgbiArIDEsIHdzZSk7CisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjQsIDIgKiBuICsgMSwgcHAsIDAsIG4sIDAsIDApOworCisgIC8qICRccG00JCAqLworICBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjIsIHYwLCA3LCBhcCwgbiwgcywgMiwgcHApOworICAvKiBBKC00KSpCKC00KSAqLyAvKiBBKCs0KSpCKCs0KSAqLworICBUT09NOF9TUVJfUkVDKHBwLCB2MCwgMiwgcjIsIHYyLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMiwgMiAqIG4gKyAxLCBwcCwgMCwgbiwgMiwgNCk7CisKKyN1bmRlZiB2MAorI3VuZGVmIHYyCisKKyAgLyogQSgwKSpCKDApICovCisgIFRPT004X1NRUl9SRUMocHAsIGFwLCAwLCBwcCwgYXAsIG4sIHdzZSk7CisKKyAgbXBuX3Rvb21faW50ZXJwb2xhdGVfMTZwdHMgKHBwLCByMSwgcjMsIHI1LCByNywgbiwgMiAqIHMsIDAsIHdzZSk7CisKKyN1bmRlZiByMAorI3VuZGVmIHIxCisjdW5kZWYgcjIKKyN1bmRlZiByMworI3VuZGVmIHI0CisjdW5kZWYgcjUKKyN1bmRlZiByNgorI3VuZGVmIHdzZQorCit9CisKKyN1bmRlZiBUT09NOF9TUVJfUkVDCisjdW5kZWYgTUFZQkVfc3FyX2Jhc2VjYXNlCisjdW5kZWYgTUFZQkVfc3FyX2Fib3ZlX2Jhc2VjYXNlCisjdW5kZWYgTUFZQkVfc3FyX3Rvb20yCisjdW5kZWYgTUFZQkVfc3FyX2Fib3ZlX3Rvb20yCisjdW5kZWYgTUFZQkVfc3FyX3Rvb20zCisjdW5kZWYgTUFZQkVfc3FyX2Fib3ZlX3Rvb20zCisjdW5kZWYgTUFZQkVfc3FyX2Fib3ZlX3Rvb200CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tOGhfbXVsLmMgYi9tcG4vZ2VuZXJpYy90b29tOGhfbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhMjU5YQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb204aF9tdWwuYwpAQCAtMCwwICsxLDMwNSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobSBmb3IgVG9vbS1Db29rIDguNS13YXkuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBHTVBfTlVNQl9CSVRTIDwgMjkKKyNlcnJvciBOb3QgaW1wbGVtZW50ZWQuCisjZW5kaWYKKworI2lmIEdNUF9OVU1CX0JJVFMgPCA0MworI2RlZmluZSBCSVRfQ09SUkVDVElPTiAxCisjZGVmaW5lIENPUlJFQ1RJT05fQklUUyBHTVBfTlVNQl9CSVRTCisjZWxzZQorI2RlZmluZSBCSVRfQ09SUkVDVElPTiAwCisjZGVmaW5lIENPUlJFQ1RJT05fQklUUyAwCisjZW5kaWYKKworCisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisjZGVmaW5lIE1BWUJFX211bF9iYXNlY2FzZSAxCisjZGVmaW5lIE1BWUJFX211bF90b29tMjIgICAxCisjZGVmaW5lIE1BWUJFX211bF90b29tMzMgICAxCisjZGVmaW5lIE1BWUJFX211bF90b29tNDQgICAxCisjZGVmaW5lIE1BWUJFX211bF90b29tOGggICAxCisjZWxzZQorI2RlZmluZSBNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisgIChNVUxfVE9PTThIX1RIUkVTSE9MRCA8IDggKiBNVUxfVE9PTTIyX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb20yMgkJCQkJCVwKKyAgKE1VTF9UT09NOEhfVEhSRVNIT0xEIDwgOCAqIE1VTF9UT09NMzNfVEhSRVNIT0xEKQorI2RlZmluZSBNQVlCRV9tdWxfdG9vbTMzCQkJCQkJXAorICAoTVVMX1RPT004SF9USFJFU0hPTEQgPCA4ICogTVVMX1RPT000NF9USFJFU0hPTEQpCisjZGVmaW5lIE1BWUJFX211bF90b29tNDQJCQkJCQlcCisgIChNVUxfVE9PTThIX1RIUkVTSE9MRCA8IDggKiBNVUxfVE9PTTZIX1RIUkVTSE9MRCkKKyNkZWZpbmUgTUFZQkVfbXVsX3Rvb204aAkJCQkJCVwKKyAgKE1VTF9GRlRfVEhSRVNIT0xEID49IDggKiBNVUxfVE9PTThIX1RIUkVTSE9MRCkKKyNlbmRpZgorCisjZGVmaW5lIFRPT004SF9NVUxfTl9SRUMocCwgYSwgYiwgZiwgcDIsIGEyLCBiMiwgbiwgd3MpCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChNQVlCRV9tdWxfYmFzZWNhc2UJCQkJCQlcCisJJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTIyX1RIUkVTSE9MRCkpIHsJCQlcCisgICAgICBtcG5fbXVsX2Jhc2VjYXNlIChwLCBhLCBuLCBiLCBuKTsJCQkJCVwKKyAgICAgIGlmIChmKSBtcG5fbXVsX2Jhc2VjYXNlIChwMiwgYTIsIG4sIGIyLCBuKTsJCQlcCisgICAgfSBlbHNlIGlmIChNQVlCRV9tdWxfdG9vbTIyCQkJCQkJXAorCSAgICAgJiYgQkVMT1dfVEhSRVNIT0xEIChuLCBNVUxfVE9PTTMzX1RIUkVTSE9MRCkpIHsJCVwKKyAgICAgIG1wbl90b29tMjJfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbTIyX211bCAocDIsIGEyLCBuLCBiMiwgbiwgd3MpOwkJCVwKKyAgICB9IGVsc2UgaWYgKE1BWUJFX211bF90b29tMzMJCQkJCQlcCisJICAgICAmJiBCRUxPV19USFJFU0hPTEQgKG4sIE1VTF9UT09NNDRfVEhSRVNIT0xEKSkgewkJXAorICAgICAgbXBuX3Rvb20zM19tdWwgKHAsIGEsIG4sIGIsIG4sIHdzKTsJCQkJXAorICAgICAgaWYgKGYpIG1wbl90b29tMzNfbXVsIChwMiwgYTIsIG4sIGIyLCBuLCB3cyk7CQkJXAorICAgIH0gZWxzZSBpZiAoTUFZQkVfbXVsX3Rvb200NAkJCQkJCVwKKwkgICAgICYmIEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT002SF9USFJFU0hPTEQpKSB7CQlcCisgICAgICBtcG5fdG9vbTQ0X211bCAocCwgYSwgbiwgYiwgbiwgd3MpOwkJCQlcCisgICAgICBpZiAoZikgbXBuX3Rvb200NF9tdWwgKHAyLCBhMiwgbiwgYjIsIG4sIHdzKTsJCQlcCisgICAgfSBlbHNlIGlmICghIE1BWUJFX211bF90b29tOGgJCQkJCVwKKwkgICAgIHx8IEJFTE9XX1RIUkVTSE9MRCAobiwgTVVMX1RPT004SF9USFJFU0hPTEQpKSB7CQlcCisgICAgICBtcG5fdG9vbTZoX211bCAocCwgYSwgbiwgYiwgbiwgd3MpOwkJCQlcCisgICAgICBpZiAoZikgbXBuX3Rvb202aF9tdWwgKHAyLCBhMiwgbiwgYjIsIG4sIHdzKTsJCQlcCisgICAgfSBlbHNlIHsJCQkJCQkJCVwKKyAgICAgIG1wbl90b29tOGhfbXVsIChwLCBhLCBuLCBiLCBuLCB3cyk7CQkJCVwKKyAgICAgIGlmIChmKSBtcG5fdG9vbThoX211bCAocDIsIGEyLCBuLCBiMiwgbiwgd3MpOwkJCVwKKyAgICB9CQkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRPT004SF9NVUxfUkVDKHAsIGEsIG5hLCBiLCBuYiwgd3MpCQlcCisgIGRvIHsgbXBuX211bCAocCwgYSwgbmEsIGIsIG5iKTsgfSB3aGlsZSAoMCkKKworLyogVG9vbS04LjUgLCBjb21wdXRlIHRoZSBwcm9kdWN0IHtwcCxhbitibn0gPC0ge2FwLGFufSAqIHticCxibn0KKyAgIFdpdGg6IGFuID49IGJuID49IDg2LCBhbio1IDwgIGJuICogMTEuCisgICBJdCBfbWF5XyB3b3JrIHdpdGggYm48PT8/IGFuZCBibio/PyA8IGFuKj8gPCBibio/PworCisgICBFdmFsdWF0ZSBpbjogaW5maW5pdHksICs4LC04LCs0LC00LCsyLC0yLCsxLC0xLCsxLzIsLTEvMiwrMS80LC0xLzQsKzEvOCwtMS84LDAuCisqLworLyogRXN0aW1hdGUgb24gbmVlZGVkIHNjcmF0Y2g6CisgICBTKG4pIDw9IChuKzcpXDgqMTMrNStNQVgoUygobis3KVw4KSwxKzIqKG4rNylcOCksCisgICBzaW5jZSBuPjgwOyBTKG4pIDw9IGNlaWwobG9nKG4vMTApL2xvZyg4KSkqKDEzKzUpK24qMTVcOCA8IG4qMTVcOCArIGxnMihuKSo2CisgKi8KKwordm9pZAorbXBuX3Rvb204aF9tdWwgICAobXBfcHRyIHBwLAorCQkgIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLAorCQkgIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJuLCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfc2l6ZV90IG4sIHMsIHQ7CisgIGludCBwLCBxLCBoYWxmOworICBpbnQgc2lnbjsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVjb21wb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEFTU0VSVCAoYW4gPj0gYm4pOworICAvKiBDYW4gbm90IGhhbmRsZSB0b28gc21hbGwgb3BlcmFuZHMgKi8KKyAgQVNTRVJUIChibiA+PSA4Nik7CisgIC8qIENhbiBub3QgaGFuZGxlIHRvbyBtdWNoIHVuYmFsYW5jZW1lbnQgKi8KKyAgQVNTRVJUIChhbiA8PSBibio0KTsKKyAgQVNTRVJUIChHTVBfTlVNQl9CSVRTID4gMTEqMyB8fCBhbio0IDw9IGJuKjExKTsKKyAgQVNTRVJUIChHTVBfTlVNQl9CSVRTID4gMTAqMyB8fCBhbioxIDw9IGJuKiAyKTsKKyAgQVNTRVJUIChHTVBfTlVNQl9CSVRTID4gIDkqMyB8fCBhbioyIDw9IGJuKiAzKTsKKworICAvKiBMaW1pdCBudW0vZGVuIGlzIGEgcmF0aW9uYWwgbnVtYmVyIGJldHdlZW4KKyAgICAgKDE2LzE1KV4obG9nKDYpL2xvZygyKjYtMSkpIGFuZCAoMTYvMTUpXihsb2coOCkvbG9nKDIqOC0xKSkgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTElNSVRfbnVtZXJhdG9yICgyMSkKKyNkZWZpbmUgTElNSVRfZGVub21pbmF0ICgyMCkKKworICBpZiAoTElLRUxZIChhbiA9PSBibikgfHwgYW4gKiAoTElNSVRfZGVub21pbmF0Pj4xKSA8IExJTUlUX251bWVyYXRvciAqIChibj4+MSkgKSAvKiBpcyA4Ki4uLiA8IDgqLi4uICovCisgICAgeworICAgICAgaGFsZiA9IDA7CisgICAgICBuID0gMSArICgoYW4gLSAxKT4+Myk7CisgICAgICBwID0gcSA9IDc7CisgICAgICBzID0gYW4gLSA3ICogbjsKKyAgICAgIHQgPSBibiAtIDcgKiBuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhbiAqIDEzIDwgMTYgKiBibikgLyogKGFuKjcqTElNSVRfbnVtZXJhdG9yPExJTUlUX2Rlbm9taW5hdCo5KmJuKSAqLworCXsgcCA9IDk7IHEgPSA4OyB9CisgICAgICBlbHNlIGlmIChHTVBfTlVNQl9CSVRTIDw9IDkqMyB8fAorCSAgICAgICBhbiAqKExJTUlUX2Rlbm9taW5hdD4+MSkgPCAoTElNSVRfbnVtZXJhdG9yLzcqOSkgKiAoYm4+PjEpKQorCXsgcCA9IDk7IHEgPSA3OyB9CisgICAgICBlbHNlIGlmIChhbiAqIDEwIDwgMzMgKiAoYm4+PjEpKSAvKiAoYW4qMypMSU1JVF9udW1lcmF0b3I8TElNSVRfZGVub21pbmF0KjUqYm4pICovCisJeyBwID0xMDsgcSA9IDc7IH0KKyAgICAgIGVsc2UgaWYgKEdNUF9OVU1CX0JJVFMgPD0gMTAqMyB8fAorCSAgICAgICBhbiAqIChMSU1JVF9kZW5vbWluYXQvNSkgPCAoTElNSVRfbnVtZXJhdG9yLzMpICogYm4pCisJeyBwID0xMDsgcSA9IDY7IH0KKyAgICAgIGVsc2UgaWYgKGFuICogNiA8IDEzICogYm4pIC8qKGFuICogNSAqIExJTUlUX251bWVyYXRvciA8IExJTUlUX2Rlbm9taW5hdCAqMTEgKiBibikqLworCXsgcCA9MTE7IHEgPSA2OyB9CisgICAgICBlbHNlIGlmIChHTVBfTlVNQl9CSVRTIDw9IDExKjMgfHwKKwkgICAgICAgYW4gKiA0IDwgOSAqIGJuKQorCXsgcCA9MTE7IHEgPSA1OyB9CisgICAgICBlbHNlIGlmIChhbiAqKExJTUlUX251bWVyYXRvci8zKSA8IExJTUlUX2Rlbm9taW5hdCAqIGJuKSAgLyogaXMgNCouLi4gPDEyKi4uLiAqLworCXsgcCA9MTI7IHEgPSA1OyB9CisgICAgICBlbHNlIGlmIChHTVBfTlVNQl9CSVRTIDw9IDEyKjMgfHwKKwkgICAgICAgYW4gKiA5IDwgMjggKiBibiApICAvKiBpcyA0Ki4uLiA8MTIqLi4uICovCisJeyBwID0xMjsgcSA9IDQ7IH0KKyAgICAgIGVsc2UKKwl7IHAgPTEzOyBxID0gNDsgfQorCisgICAgICBoYWxmID0gKHArcSkmMTsKKyAgICAgIG4gPSAxICsgKHEgKiBhbiA+PSBwICogYm4gPyAoYW4gLSAxKSAvIChzaXplX3QpIHAgOiAoYm4gLSAxKSAvIChzaXplX3QpIHEpOworICAgICAgcC0tOyBxLS07CisKKyAgICAgIHMgPSBhbiAtIHAgKiBuOworICAgICAgdCA9IGJuIC0gcSAqIG47CisKKyAgICAgIGlmKGhhbGYpIHsgLyogUmVjb3ZlciBmcm9tIGJhZGx5IGNob3NlbiBzcGxpdHRpbmcgKi8KKwlpZiAoVU5MSUtFTFkgKHM8MSkpIHtwLS07IHMrPW47IGhhbGY9MDt9CisJZWxzZSBpZiAoVU5MSUtFTFkgKHQ8MSkpIHtxLS07IHQrPW47IGhhbGY9MDt9CisgICAgICB9CisgICAgfQorI3VuZGVmIExJTUlUX251bWVyYXRvcgorI3VuZGVmIExJTUlUX2Rlbm9taW5hdAorCisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8PSBuKTsKKyAgQVNTRVJUICgwIDwgdCAmJiB0IDw9IG4pOworICBBU1NFUlQgKGhhbGYgfHwgcyArIHQgPiAzKTsKKyAgQVNTRVJUIChuID4gMik7CisKKyNkZWZpbmUgICByNiAgICAocHAgKyAzICogbikJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjQgICAgKHBwICsgNyAqIG4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIyICAgIChwcCArMTEgKiBuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByMCAgICAocHAgKzE1ICogbikJCQkvKiBzK3QgPD0gMipuICovCisjZGVmaW5lICAgcjcgICAgKHNjcmF0Y2gpCQkJLyogM24rMSAqLworI2RlZmluZSAgIHI1ICAgIChzY3JhdGNoICsgMyAqIG4gKyAxKQkJLyogM24rMSAqLworI2RlZmluZSAgIHIzICAgIChzY3JhdGNoICsgNiAqIG4gKyAyKQkJLyogM24rMSAqLworI2RlZmluZSAgIHIxICAgIChzY3JhdGNoICsgOSAqIG4gKyAzKQkJLyogM24rMSAqLworI2RlZmluZSAgIHYwICAgIChwcCArMTEgKiBuKQkJCS8qIG4rMSAqLworI2RlZmluZSAgIHYxICAgIChwcCArMTIgKiBuKzEpCQkJLyogbisxICovCisjZGVmaW5lICAgdjIgICAgKHBwICsxMyAqIG4rMikJCQkvKiBuKzEgKi8KKyNkZWZpbmUgICB2MyAgICAoc2NyYXRjaCArMTIgKiBuICsgNCkJCS8qIG4rMSAqLworI2RlZmluZSAgIHdzaSAgIChzY3JhdGNoICsxMiAqIG4gKyA0KQkJLyogM24rMSAqLworI2RlZmluZSAgIHdzZSAgIChzY3JhdGNoICsxMyAqIG4gKyA1KQkJLyogMm4rMSAqLworCisgIC8qIEFsbG9jIGFsc28gM24rMSBsaW1icyBmb3Igd3NpLi4uIHRvb21faW50ZXJwb2xhdGVfMTZwdHMgbWF5CisgICAgIG5lZWQgYWxsIG9mIHRoZW0gICovCisvKiAgIGlmIChzY3JhdGNoID09IE5VTEwpICovCisvKiAgICAgc2NyYXRjaCA9IFRNUF9TQUxMT0NfTElNQlMobXBuX3Rvb204X3Nxcl9pdGNoKG4gKiA4KSk7ICovCisgIEFTU0VSVCAoMTUgKiBuICsgNiA8PSBtcG5fdG9vbThoX211bF9pdGNoIChhbiwgYm4pKTsKKyAgQVNTRVJUICgxNSAqIG4gKyA2IDw9IG1wbl90b29tOF9zcXJfaXRjaCAobiAqIDgpKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKiBldmFsdWF0aW9uIGFuZCByZWN1cnNpdmUgY2FsbHMgKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qICRccG0xLzgkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMnJleHAgKHYyLCB2MCwgcCwgYXAsIG4sIHMsIDMsIHBwKSBeCisJIG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjMsIHYxLCBxLCBicCwgbiwgdCwgMywgcHApOworICAvKiBBKC0xLzgpKkIoLTEvOCkqOF4uICovIC8qIEEoKzEvOCkqQigrMS84KSo4Xi4gKi8KKyAgVE9PTThIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByNywgdjIsIHYzLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyNywgMiAqIG4gKyAxICsgQklUX0NPUlJFQ1RJT04sIHBwLCBzaWduLCBuLCAzKigxK2hhbGYpLCAzKihoYWxmKSk7CisKKyAgLyogJFxwbTEvNCQgKi8KKyAgc2lnbiA9IG1wbl90b29tX2V2YWxfcG0ycmV4cCAodjIsIHYwLCBwLCBhcCwgbiwgcywgMiwgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTJyZXhwICh2MywgdjEsIHEsIGJwLCBuLCB0LCAyLCBwcCk7CisgIC8qIEEoLTEvNCkqQigtMS80KSo0Xi4gKi8gLyogQSgrMS80KSpCKCsxLzQpKjReLiAqLworICBUT09NOEhfTVVMX05fUkVDKHBwLCB2MCwgdjEsIDIsIHI1LCB2MiwgdjMsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHI1LCAyICogbiArIDEsIHBwLCBzaWduLCBuLCAyKigxK2hhbGYpLCAyKihoYWxmKSk7CisKKyAgLyogJFxwbTIkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMiAodjIsIHYwLCBwLCBhcCwgbiwgcywgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTIgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIHBwKTsKKyAgLyogQSgtMikqQigtMikgKi8gLyogQSgrMikqQigrMikgKi8KKyAgVE9PTThIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByMywgdjIsIHYzLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMywgMiAqIG4gKyAxLCBwcCwgc2lnbiwgbiwgMSwgMik7CisKKyAgLyogJFxwbTgkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjIsIHYwLCBwLCBhcCwgbiwgcywgMywgcHApIF4KKwkgbXBuX3Rvb21fZXZhbF9wbTJleHAgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIDMsIHBwKTsKKyAgLyogQSgtOCkqQigtOCkgKi8gLyogQSgrOCkqQigrOCkgKi8KKyAgVE9PTThIX01VTF9OX1JFQyhwcCwgdjAsIHYxLCAyLCByMSwgdjIsIHYzLCBuICsgMSwgd3NlKTsKKyAgbXBuX3Rvb21fY291cGxlX2hhbmRsaW5nIChyMSwgMiAqIG4gKyAxICsgQklUX0NPUlJFQ1RJT04sIHBwLCBzaWduLCBuLCAzLCA2KTsKKworICAvKiAkXHBtMS8yJCAqLworICBzaWduID0gbXBuX3Rvb21fZXZhbF9wbTJyZXhwICh2MiwgdjAsIHAsIGFwLCBuLCBzLCAxLCBwcCkgXgorCSBtcG5fdG9vbV9ldmFsX3BtMnJleHAgKHYzLCB2MSwgcSwgYnAsIG4sIHQsIDEsIHBwKTsKKyAgLyogQSgtMS8yKSpCKC0xLzIpKjJeLiAqLyAvKiBBKCsxLzIpKkIoKzEvMikqMl4uICovCisgIFRPT004SF9NVUxfTl9SRUMocHAsIHYwLCB2MSwgMiwgcjYsIHYyLCB2MywgbiArIDEsIHdzZSk7CisgIG1wbl90b29tX2NvdXBsZV9oYW5kbGluZyAocjYsIDIgKiBuICsgMSwgcHAsIHNpZ24sIG4sIDEraGFsZiwgaGFsZik7CisKKyAgLyogJFxwbTEkICovCisgIHNpZ24gPSBtcG5fdG9vbV9ldmFsX3BtMSAodjIsIHYwLCBwLCBhcCwgbiwgcywgICAgcHApOworICBpZiAoR01QX05VTUJfQklUUyA+IDEyKjMgJiYgVU5MSUtFTFkgKHEgPT0gMykpCisgICAgc2lnbiBePSBtcG5fdG9vbV9ldmFsX2RncjNfcG0xICh2MywgdjEsIGJwLCBuLCB0LCAgICBwcCk7CisgIGVsc2UKKyAgICBzaWduIF49IG1wbl90b29tX2V2YWxfcG0xICh2MywgdjEsIHEsIGJwLCBuLCB0LCAgICBwcCk7CisgIC8qIEEoLTEpKkIoLTEpICovIC8qIEEoMSkqQigxKSAqLworICBUT09NOEhfTVVMX05fUkVDKHBwLCB2MCwgdjEsIDIsIHI0LCB2MiwgdjMsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHI0LCAyICogbiArIDEsIHBwLCBzaWduLCBuLCAwLCAwKTsKKworICAvKiAkXHBtNCQgKi8KKyAgc2lnbiA9IG1wbl90b29tX2V2YWxfcG0yZXhwICh2MiwgdjAsIHAsIGFwLCBuLCBzLCAyLCBwcCkgXgorCSBtcG5fdG9vbV9ldmFsX3BtMmV4cCAodjMsIHYxLCBxLCBicCwgbiwgdCwgMiwgcHApOworICAvKiBBKC00KSpCKC00KSAqLyAvKiBBKCs0KSpCKCs0KSAqLworICBUT09NOEhfTVVMX05fUkVDKHBwLCB2MCwgdjEsIDIsIHIyLCB2MiwgdjMsIG4gKyAxLCB3c2UpOworICBtcG5fdG9vbV9jb3VwbGVfaGFuZGxpbmcgKHIyLCAyICogbiArIDEsIHBwLCBzaWduLCBuLCAyLCA0KTsKKworI3VuZGVmIHYwCisjdW5kZWYgdjEKKyN1bmRlZiB2MgorI3VuZGVmIHYzCisjdW5kZWYgd3NlCisKKyAgLyogQSgwKSpCKDApICovCisgIFRPT004SF9NVUxfTl9SRUMocHAsIGFwLCBicCwgMCwgcHAsIGFwLCBicCwgbiwgd3NpKTsKKworICAvKiBJbmZpbml0eSAqLworICBpZiAoVU5MSUtFTFkgKGhhbGYgIT0gMCkpIHsKKyAgICBpZiAocyA+IHQpIHsKKyAgICAgIFRPT004SF9NVUxfUkVDKHIwLCBhcCArIHAgKiBuLCBzLCBicCArIHEgKiBuLCB0LCB3c2kpOworICAgIH0gZWxzZSB7CisgICAgICBUT09NOEhfTVVMX1JFQyhyMCwgYnAgKyBxICogbiwgdCwgYXAgKyBwICogbiwgcywgd3NpKTsKKyAgICB9OworICB9OworCisgIG1wbl90b29tX2ludGVycG9sYXRlXzE2cHRzIChwcCwgcjEsIHIzLCByNSwgcjcsIG4sIHMrdCwgaGFsZiwgd3NpKTsKKworI3VuZGVmIHIwCisjdW5kZWYgcjEKKyN1bmRlZiByMgorI3VuZGVmIHIzCisjdW5kZWYgcjQKKyN1bmRlZiByNQorI3VuZGVmIHI2CisjdW5kZWYgd3NpCit9CisKKyN1bmRlZiBUT09NOEhfTVVMX05fUkVDCisjdW5kZWYgVE9PTThIX01VTF9SRUMKKyN1bmRlZiBNQVlCRV9tdWxfYmFzZWNhc2UKKyN1bmRlZiBNQVlCRV9tdWxfdG9vbTIyCisjdW5kZWYgTUFZQkVfbXVsX3Rvb20zMworI3VuZGVmIE1BWUJFX211bF90b29tNDQKKyN1bmRlZiBNQVlCRV9tdWxfdG9vbThoCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2NvdXBsZV9oYW5kbGluZy5jIGIvbXBuL2dlbmVyaWMvdG9vbV9jb3VwbGVfaGFuZGxpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI1M2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbV9jb3VwbGVfaGFuZGxpbmcuYwpAQCAtMCwwICsxLDgwIEBACisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGhpZ2ggZGVncmVlIFRvb20tQ29vayBhbGdvcml0aG1zLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogR2V0cyB7cHAsbn0gYW5kIChzaWduPy0xOjEpKntucCxufS4gQ29tcHV0ZXMgYXQgb25jZToKKyAgICAge3BwLG59IDwtICh7cHAsbn0re25wLG59KS8yXntwcysxfQorICAgICB7cG4sbn0gPC0gKHtwcCxufS17bnAsbn0pLzJee25zKzF9CisgICBGaW5hbGx5IHJlY29tcG9zZSB0aGVtIG9idGFpbmluZzoKKyAgICAge3BwLG4rb2ZmfSA8LSB7cHAsbn0re25wLG59KjJee29mZipHTVBfTlVNQl9CSVRTfQorKi8KK3ZvaWQKK21wbl90b29tX2NvdXBsZV9oYW5kbGluZyAobXBfcHRyIHBwLCBtcF9zaXplX3QgbiwgbXBfcHRyIG5wLAorCQkJICBpbnQgbnNpZ24sIG1wX3NpemVfdCBvZmYsIGludCBwcywgaW50IG5zKQoreworICBpZiAobnNpZ24pIHsKKyNpZmRlZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisgICAgbXBuX3JzaDFzdWJfbiAobnAsIHBwLCBucCwgbik7CisjZWxzZQorICAgIG1wbl9zdWJfbiAobnAsIHBwLCBucCwgbik7CisgICAgbXBuX3JzaGlmdCAobnAsIG5wLCBuLCAxKTsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgICBtcG5fcnNoMWFkZF9uIChucCwgcHAsIG5wLCBuKTsKKyNlbHNlCisgICAgbXBuX2FkZF9uIChucCwgcHAsIG5wLCBuKTsKKyAgICBtcG5fcnNoaWZ0IChucCwgbnAsIG4sIDEpOworI2VuZGlmCisgIH0KKworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxc3ViX24KKyAgaWYgKHBzID09IDEpCisgICAgbXBuX3JzaDFzdWJfbiAocHAsIHBwLCBucCwgbik7CisgIGVsc2UKKyNlbmRpZgorICB7CisgICAgbXBuX3N1Yl9uIChwcCwgcHAsIG5wLCBuKTsKKyAgICBpZiAocHMgPiAwKQorICAgICAgbXBuX3JzaGlmdCAocHAsIHBwLCBuLCBwcyk7CisgIH0KKyAgaWYgKG5zID4gMCkKKyAgICBtcG5fcnNoaWZ0IChucCwgbnAsIG4sIG5zKTsKKyAgcHBbbl0gPSBtcG5fYWRkX24gKHBwK29mZiwgcHArb2ZmLCBucCwgbi1vZmYpOworICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF8xKHBwK24sIG5wK24tb2ZmLCBvZmYsIHBwW25dKSApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbV9ldmFsX2RncjNfcG0xLmMgYi9tcG4vZ2VuZXJpYy90b29tX2V2YWxfZGdyM19wbTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbV9ldmFsX2RncjNfcG0xLmMKQEAgLTAsMCArMSw3MiBAQAorLyogbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAtLSBFdmFsdWF0ZSBhIGRlZ3JlZSAzIHBvbHlub21pYWwgaW4gKzEgYW5kIC0xCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBOaWVscyBNw7ZsbGVyCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXBuX3Rvb21fZXZhbF9kZ3IzX3BtMSAobXBfcHRyIHhwMSwgbXBfcHRyIHhtMSwKKwkJCW1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IG4sIG1wX3NpemVfdCB4M24sIG1wX3B0ciB0cCkKK3sKKyAgaW50IG5lZzsKKworICBBU1NFUlQgKHgzbiA+IDApOworICBBU1NFUlQgKHgzbiA8PSBuKTsKKworICB4cDFbbl0gPSBtcG5fYWRkX24gKHhwMSwgeHAsIHhwICsgMipuLCBuKTsKKyAgdHBbbl0gPSBtcG5fYWRkICh0cCwgeHAgKyBuLCBuLCB4cCArIDMqbiwgeDNuKTsKKworICBuZWcgPSAobXBuX2NtcCAoeHAxLCB0cCwgbiArIDEpIDwgMCkgPyB+MCA6IDA7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKG5lZykKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMSwgeG0xLCB0cCwgeHAxLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMSwgeG0xLCB4cDEsIHRwLCBuICsgMSk7CisjZWxzZQorICBpZiAobmVnKQorICAgIG1wbl9zdWJfbiAoeG0xLCB0cCwgeHAxLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fc3ViX24gKHhtMSwgeHAxLCB0cCwgbiArIDEpOworCisgIG1wbl9hZGRfbiAoeHAxLCB4cDEsIHRwLCBuICsgMSk7CisjZW5kaWYKKworICBBU1NFUlQgKHhwMVtuXSA8PSAzKTsKKyAgQVNTRVJUICh4bTFbbl0gPD0gMSk7CisKKyAgcmV0dXJuIG5lZzsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb21fZXZhbF9kZ3IzX3BtMi5jIGIvbXBuL2dlbmVyaWMvdG9vbV9ldmFsX2RncjNfcG0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNmI4OQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb21fZXZhbF9kZ3IzX3BtMi5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIG1wbl90b29tX2V2YWxfZGdyM19wbTIgLS0gRXZhbHVhdGUgYSBkZWdyZWUgMyBwb2x5bm9taWFsIGluICsyIGFuZCAtMgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlcgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBOZWVkcyBuKzEgbGltYnMgb2YgdGVtcG9yYXJ5IHN0b3JhZ2UuICovCitpbnQKK21wbl90b29tX2V2YWxfZGdyM19wbTIgKG1wX3B0ciB4cDIsIG1wX3B0ciB4bTIsCisJCQltcF9zcmNwdHIgeHAsIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgeDNuLCBtcF9wdHIgdHApCit7CisgIG1wX2xpbWJfdCBjeTsKKyAgaW50IG5lZzsKKworICBBU1NFUlQgKHgzbiA+IDApOworICBBU1NFUlQgKHgzbiA8PSBuKTsKKworICAvKiAoeDAgKyA0ICogeDIpICsvLSAoMiB4MSArIDggeF8zKSAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbiB8fCBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbgorICB4cDJbbl0gPSBtcG5fYWRkbHNoMl9uICh4cDIsIHhwLCB4cCArIDIqbiwgbik7CisKKyAgY3kgPSBtcG5fYWRkbHNoMl9uICh0cCwgeHAgKyBuLCB4cCArIDMqbiwgeDNuKTsKKyNlbHNlIC8qIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbiAqLworICB4cDJbbl0gPSBtcG5fYWRkbHNoX24gKHhwMiwgeHAsIHhwICsgMipuLCBuLCAyKTsKKworICBjeSA9IG1wbl9hZGRsc2hfbiAodHAsIHhwICsgbiwgeHAgKyAzKm4sIHgzbiwgMik7CisjZW5kaWYKKyAgaWYgKHgzbiA8IG4pCisgICAgY3kgPSBtcG5fYWRkXzEgKHRwICsgeDNuLCB4cCArIG4gKyB4M24sIG4gLSB4M24sIGN5KTsKKyAgdHBbbl0gPSBjeTsKKyNlbHNlCisgIGN5ID0gbXBuX2xzaGlmdCAodHAsIHhwICsgMipuLCBuLCAyKTsKKyAgeHAyW25dID0gY3kgKyBtcG5fYWRkX24gKHhwMiwgdHAsIHhwLCBuKTsKKworICB0cFt4M25dID0gbXBuX2xzaGlmdCAodHAsIHhwICsgMypuLCB4M24sIDIpOworICBpZiAoeDNuIDwgbikKKyAgICB0cFtuXSA9IG1wbl9hZGQgKHRwLCB4cCArIG4sIG4sIHRwLCB4M24gKyAxKTsKKyAgZWxzZQorICAgIHRwW25dICs9IG1wbl9hZGRfbiAodHAsIHhwICsgbiwgdHAsIG4pOworI2VuZGlmCisgIG1wbl9sc2hpZnQgKHRwLCB0cCwgbisxLCAxKTsKKworICBuZWcgPSAobXBuX2NtcCAoeHAyLCB0cCwgbiArIDEpIDwgMCkgPyB+MCA6IDA7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKG5lZykKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMiwgeG0yLCB0cCwgeHAyLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMiwgeG0yLCB4cDIsIHRwLCBuICsgMSk7CisjZWxzZQorICBpZiAobmVnKQorICAgIG1wbl9zdWJfbiAoeG0yLCB0cCwgeHAyLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fc3ViX24gKHhtMiwgeHAyLCB0cCwgbiArIDEpOworCisgIG1wbl9hZGRfbiAoeHAyLCB4cDIsIHRwLCBuICsgMSk7CisjZW5kaWYKKworICBBU1NFUlQgKHhwMltuXSA8IDE1KTsKKyAgQVNTRVJUICh4bTJbbl0gPCAxMCk7CisKKyAgcmV0dXJuIG5lZzsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTEuYyBiL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNmYTkzCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbV9ldmFsX3BtMS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIG1wbl90b29tX2V2YWxfcG0xIC0tIEV2YWx1YXRlIGEgcG9seW5vbWlhbCBpbiArMSBhbmQgLTEKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRXZhbHVhdGVzIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgayA+IDMsIGluIHRoZSBwb2ludHMgKzEgYW5kIC0xLiAqLworaW50CittcG5fdG9vbV9ldmFsX3BtMSAobXBfcHRyIHhwMSwgbXBfcHRyIHhtMSwgdW5zaWduZWQgaywKKwkJICAgbXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IGhuLCBtcF9wdHIgdHApCit7CisgIHVuc2lnbmVkIGk7CisgIGludCBuZWc7CisKKyAgQVNTRVJUIChrID49IDQpOworCisgIEFTU0VSVCAoaG4gPiAwKTsKKyAgQVNTRVJUIChobiA8PSBuKTsKKworICAvKiBUaGUgZGVncmVlIGsgaXMgYWxzbyB0aGUgbnVtYmVyIG9mIGZ1bGwtc2l6ZSBjb2VmZmljaWVudHMsIHNvCisgICAqIHRoYXQgbGFzdCBjb2VmZmljaWVudCwgb2Ygc2l6ZSBobiwgc3RhcnRzIGF0IHhwICsgaypuLiAqLworCisgIHhwMVtuXSA9IG1wbl9hZGRfbiAoeHAxLCB4cCwgeHAgKyAyKm4sIG4pOworICBmb3IgKGkgPSA0OyBpIDwgazsgaSArPSAyKQorICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkICh4cDEsIHhwMSwgbisxLCB4cCtpKm4sIG4pKTsKKworICB0cFtuXSA9IG1wbl9hZGRfbiAodHAsIHhwICsgbiwgeHAgKyAzKm4sIG4pOworICBmb3IgKGkgPSA1OyBpIDwgazsgaSArPSAyKQorICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkICh0cCwgdHAsIG4rMSwgeHAraSpuLCBuKSk7CisKKyAgaWYgKGsgJiAxKQorICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkICh0cCwgdHAsIG4rMSwgeHAraypuLCBobikpOworICBlbHNlCisgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9hZGQgKHhwMSwgeHAxLCBuKzEsIHhwK2sqbiwgaG4pKTsKKworICBuZWcgPSAobXBuX2NtcCAoeHAxLCB0cCwgbiArIDEpIDwgMCkgPyB+MCA6IDA7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKG5lZykKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMSwgeG0xLCB0cCwgeHAxLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMSwgeG0xLCB4cDEsIHRwLCBuICsgMSk7CisjZWxzZQorICBpZiAobmVnKQorICAgIG1wbl9zdWJfbiAoeG0xLCB0cCwgeHAxLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fc3ViX24gKHhtMSwgeHAxLCB0cCwgbiArIDEpOworCisgIG1wbl9hZGRfbiAoeHAxLCB4cDEsIHRwLCBuICsgMSk7CisjZW5kaWYKKworICBBU1NFUlQgKHhwMVtuXSA8PSBrKTsKKyAgQVNTRVJUICh4bTFbbl0gPD0gay8yICsgMSk7CisKKyAgcmV0dXJuIG5lZzsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTIuYyBiL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTY4MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbV9ldmFsX3BtMi5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiBtcG5fdG9vbV9ldmFsX3BtMiAtLSBFdmFsdWF0ZSBhIHBvbHlub21pYWwgaW4gKzIgYW5kIC0yCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBOaWVscyBNw7ZsbGVyIGFuZCBNYXJjbyBCb2RyYXRvCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKiBET19hZGRsc2gyKGQsYSxiLG4sY3kpIGNvbXB1dGVzIGN5LHtkLG59IDwtIHthLG59ICsgNCooY3kse2Isbn0pLCBpdAorICAgY2FuIGJlIHVzZWQgYXMgRE9fYWRkbHNoMihkLGEsZCxuLGRbbl0pLCBmb3IgYWNjdW11bGF0aW9uIG9uIHtkLG4rMX0uICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbgorI2RlZmluZSBET19hZGRsc2gyKGQsIGEsIGIsIG4sIGN5KQlcCitkbyB7CQkJCQlcCisgIChjeSkgPDw9IDI7CQkJCVwKKyAgKGN5KSArPSBtcG5fYWRkbHNoMl9uKGQsIGEsIGIsIG4pOwlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX24KKyNkZWZpbmUgRE9fYWRkbHNoMihkLCBhLCBiLCBuLCBjeSkJXAorZG8gewkJCQkJXAorICAoY3kpIDw8PSAyOwkJCQlcCisgIChjeSkgKz0gbXBuX2FkZGxzaF9uKGQsIGEsIGIsIG4sIDIpOwlcCit9IHdoaWxlICgwKQorI2Vsc2UKKy8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGEgZ2VuZXJhbCBzdWJzdGl0dXRlIGZvciBhZGRsc2gyLgorICAgSXQgaXMgY29ycmVjdCBpZiBkID09IGIsIGJ1dCBpdCBpcyBub3QgaWYgZCA9PSBhLiAgKi8KKyNkZWZpbmUgRE9fYWRkbHNoMihkLCBhLCBiLCBuLCBjeSkJXAorZG8gewkJCQkJXAorICAoY3kpIDw8PSAyOwkJCQlcCisgIChjeSkgKz0gbXBuX2xzaGlmdChkLCBiLCBuLCAyKTsJXAorICAoY3kpICs9IG1wbl9hZGRfbihkLCBkLCBhLCBuKTsJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKy8qIEV2YWx1YXRlcyBhIHBvbHlub21pYWwgb2YgZGVncmVlIDIgPCBrIDwgR01QX05VTUJfQklUUywgaW4gdGhlCisgICBwb2ludHMgKzIgYW5kIC0yLiAqLworaW50CittcG5fdG9vbV9ldmFsX3BtMiAobXBfcHRyIHhwMiwgbXBfcHRyIHhtMiwgdW5zaWduZWQgaywKKwkJICAgbXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IGhuLCBtcF9wdHIgdHApCit7CisgIGludCBpOworICBpbnQgbmVnOworICBtcF9saW1iX3QgY3k7CisKKyAgQVNTRVJUIChrID49IDMpOworICBBU1NFUlQgKGsgPCBHTVBfTlVNQl9CSVRTKTsKKworICBBU1NFUlQgKGhuID4gMCk7CisgIEFTU0VSVCAoaG4gPD0gbik7CisKKyAgLyogVGhlIGRlZ3JlZSBrIGlzIGFsc28gdGhlIG51bWJlciBvZiBmdWxsLXNpemUgY29lZmZpY2llbnRzLCBzbworICAgKiB0aGF0IGxhc3QgY29lZmZpY2llbnQsIG9mIHNpemUgaG4sIHN0YXJ0cyBhdCB4cCArIGsqbi4gKi8KKworICBjeSA9IDA7CisgIERPX2FkZGxzaDIgKHhwMiwgeHAgKyAoay0yKSAqIG4sIHhwICsgayAqIG4sIGhuLCBjeSk7CisgIGlmIChobiAhPSBuKQorICAgIGN5ID0gbXBuX2FkZF8xICh4cDIgKyBobiwgeHAgKyAoay0yKSAqIG4gKyBobiwgbiAtIGhuLCBjeSk7CisgIGZvciAoaSA9IGsgLSA0OyBpID49IDA7IGkgLT0gMikKKyAgICBET19hZGRsc2gyICh4cDIsIHhwICsgaSAqIG4sIHhwMiwgbiwgY3kpOworICB4cDJbbl0gPSBjeTsKKworICBrLS07CisKKyAgY3kgPSAwOworICBET19hZGRsc2gyICh0cCwgeHAgKyAoay0yKSAqIG4sIHhwICsgayAqIG4sIG4sIGN5KTsKKyAgZm9yIChpID0gayAtIDQ7IGkgPj0gMDsgaSAtPSAyKQorICAgIERPX2FkZGxzaDIgKHRwLCB4cCArIGkgKiBuLCB0cCwgbiwgY3kpOworICB0cFtuXSA9IGN5OworCisgIGlmIChrICYgMSkKKyAgICBBU1NFUlRfTk9DQVJSWShtcG5fbHNoaWZ0ICh0cCAsIHRwICwgbiArIDEsIDEpKTsKKyAgZWxzZQorICAgIEFTU0VSVF9OT0NBUlJZKG1wbl9sc2hpZnQgKHhwMiwgeHAyLCBuICsgMSwgMSkpOworCisgIG5lZyA9IChtcG5fY21wICh4cDIsIHRwLCBuICsgMSkgPCAwKSA/IH4wIDogMDsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBpZiAobmVnKQorICAgIG1wbl9hZGRfbl9zdWJfbiAoeHAyLCB4bTIsIHRwLCB4cDIsIG4gKyAxKTsKKyAgZWxzZQorICAgIG1wbl9hZGRfbl9zdWJfbiAoeHAyLCB4bTIsIHhwMiwgdHAsIG4gKyAxKTsKKyNlbHNlIC8qICFIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24gKi8KKyAgaWYgKG5lZykKKyAgICBtcG5fc3ViX24gKHhtMiwgdHAsIHhwMiwgbiArIDEpOworICBlbHNlCisgICAgbXBuX3N1Yl9uICh4bTIsIHhwMiwgdHAsIG4gKyAxKTsKKworICBtcG5fYWRkX24gKHhwMiwgeHAyLCB0cCwgbiArIDEpOworI2VuZGlmIC8qICFIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24gKi8KKworICBBU1NFUlQgKHhwMltuXSA8ICgxPDwoaysyKSktMSk7CisgIEFTU0VSVCAoeG0yW25dIDwgKCgxPDwoayszKSktMSAtICgxXmsmMSkpLzMpOworCisgIG5lZyBePSAoKGsgJiAxKSAtIDEpOworCisgIHJldHVybiBuZWc7Cit9CisKKyN1bmRlZiBET19hZGRsc2gyCmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2V2YWxfcG0yZXhwLmMgYi9tcG4vZ2VuZXJpYy90b29tX2V2YWxfcG0yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNDY1MQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTJleHAuYwpAQCAtMCwwICsxLDEyNyBAQAorLyogbXBuX3Rvb21fZXZhbF9wbTJleHAgLS0gRXZhbHVhdGUgYSBwb2x5bm9taWFsIGluICsyXmsgYW5kIC0yXmsKKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogRXZhbHVhdGVzIGEgcG9seW5vbWlhbCBvZiBkZWdyZWUgayA+IDIsIGluIHRoZSBwb2ludHMgKzJec2hpZnQgYW5kIC0yXnNoaWZ0LiAqLworaW50CittcG5fdG9vbV9ldmFsX3BtMmV4cCAobXBfcHRyIHhwMiwgbXBfcHRyIHhtMiwgdW5zaWduZWQgaywKKwkJICAgICAgbXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgbiwgbXBfc2l6ZV90IGhuLCB1bnNpZ25lZCBzaGlmdCwKKwkJICAgICAgbXBfcHRyIHRwKQoreworICB1bnNpZ25lZCBpOworICBpbnQgbmVnOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbgorICBtcF9saW1iX3QgY3k7CisjZW5kaWYKKworICBBU1NFUlQgKGsgPj0gMyk7CisgIEFTU0VSVCAoc2hpZnQqayA8IEdNUF9OVU1CX0JJVFMpOworCisgIEFTU0VSVCAoaG4gPiAwKTsKKyAgQVNTRVJUIChobiA8PSBuKTsKKworICAvKiBUaGUgZGVncmVlIGsgaXMgYWxzbyB0aGUgbnVtYmVyIG9mIGZ1bGwtc2l6ZSBjb2VmZmljaWVudHMsIHNvCisgICAqIHRoYXQgbGFzdCBjb2VmZmljaWVudCwgb2Ygc2l6ZSBobiwgc3RhcnRzIGF0IHhwICsgaypuLiAqLworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uCisgIHhwMltuXSA9IG1wbl9hZGRsc2hfbiAoeHAyLCB4cCwgeHAgKyAyKm4sIG4sIDIqc2hpZnQpOworICBmb3IgKGkgPSA0OyBpIDwgazsgaSArPSAyKQorICAgIHhwMltuXSArPSBtcG5fYWRkbHNoX24gKHhwMiwgeHAyLCB4cCArIGkqbiwgbiwgaSpzaGlmdCk7CisKKyAgdHBbbl0gPSBtcG5fbHNoaWZ0ICh0cCwgeHArbiwgbiwgc2hpZnQpOworICBmb3IgKGkgPSAzOyBpIDwgazsgaSs9IDIpCisgICAgdHBbbl0gKz0gbXBuX2FkZGxzaF9uICh0cCwgdHAsIHhwK2kqbiwgbiwgaSpzaGlmdCk7CisKKyAgaWYgKGsgJiAxKQorICAgIHsKKyAgICAgIGN5ID0gbXBuX2FkZGxzaF9uICh0cCwgdHAsIHhwK2sqbiwgaG4sIGsqc2hpZnQpOworICAgICAgTVBOX0lOQ1JfVSAodHAgKyBobiwgbisxIC0gaG4sIGN5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjeSA9IG1wbl9hZGRsc2hfbiAoeHAyLCB4cDIsIHhwK2sqbiwgaG4sIGsqc2hpZnQpOworICAgICAgTVBOX0lOQ1JfVSAoeHAyICsgaG4sIG4rMSAtIGhuLCBjeSk7CisgICAgfQorCisjZWxzZSAvKiAhSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uICovCisgIHhwMltuXSA9IG1wbl9sc2hpZnQgKHRwLCB4cCsyKm4sIG4sIDIqc2hpZnQpOworICB4cDJbbl0gKz0gbXBuX2FkZF9uICh4cDIsIHhwLCB0cCwgbik7CisgIGZvciAoaSA9IDQ7IGkgPCBrOyBpICs9IDIpCisgICAgeworICAgICAgeHAyW25dICs9IG1wbl9sc2hpZnQgKHRwLCB4cCArIGkqbiwgbiwgaSpzaGlmdCk7CisgICAgICB4cDJbbl0gKz0gbXBuX2FkZF9uICh4cDIsIHhwMiwgdHAsIG4pOworICAgIH0KKworICB0cFtuXSA9IG1wbl9sc2hpZnQgKHRwLCB4cCtuLCBuLCBzaGlmdCk7CisgIGZvciAoaSA9IDM7IGkgPCBrOyBpKz0gMikKKyAgICB7CisgICAgICB0cFtuXSArPSBtcG5fbHNoaWZ0ICh4bTIsIHhwICsgaSpuLCBuLCBpKnNoaWZ0KTsKKyAgICAgIHRwW25dICs9IG1wbl9hZGRfbiAodHAsIHRwLCB4bTIsIG4pOworICAgIH0KKworICB4bTJbaG5dID0gbXBuX2xzaGlmdCAoeG0yLCB4cCArIGsqbiwgaG4sIGsqc2hpZnQpOworICBpZiAoayAmIDEpCisgICAgbXBuX2FkZCAodHAsIHRwLCBuKzEsIHhtMiwgaG4rMSk7CisgIGVsc2UKKyAgICBtcG5fYWRkICh4cDIsIHhwMiwgbisxLCB4bTIsIGhuKzEpOworI2VuZGlmIC8qICFIQVZFX05BVElWRV9tcG5fYWRkbHNoX24gKi8KKworICBuZWcgPSAobXBuX2NtcCAoeHAyLCB0cCwgbiArIDEpIDwgMCkgPyB+MCA6IDA7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgaWYgKG5lZykKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMiwgeG0yLCB0cCwgeHAyLCBuICsgMSk7CisgIGVsc2UKKyAgICBtcG5fYWRkX25fc3ViX24gKHhwMiwgeG0yLCB4cDIsIHRwLCBuICsgMSk7CisjZWxzZSAvKiAhSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uICovCisgIGlmIChuZWcpCisgICAgbXBuX3N1Yl9uICh4bTIsIHRwLCB4cDIsIG4gKyAxKTsKKyAgZWxzZQorICAgIG1wbl9zdWJfbiAoeG0yLCB4cDIsIHRwLCBuICsgMSk7CisKKyAgbXBuX2FkZF9uICh4cDIsIHhwMiwgdHAsIG4gKyAxKTsKKyNlbmRpZiAvKiAhSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uICovCisKKyAgLyogRklYTUU6IHRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhcmUgdXNlbGVzcyBpZiAoaysxKSpzaGlmdCA+PSBHTVBfTElNQl9CSVRTICovCisgIEFTU0VSVCAoKGsrMSkqc2hpZnQgPj0gR01QX0xJTUJfQklUUyB8fAorCSAgeHAyW25dIDwgKChDTlNUX0xJTUIoMSk8PCgoaysxKSpzaGlmdCkpLTEpLygoQ05TVF9MSU1CKDEpPDxzaGlmdCktMSkpOworICBBU1NFUlQgKChrKzIpKnNoaWZ0ID49IEdNUF9MSU1CX0JJVFMgfHwKKwkgIHhtMltuXSA8ICgoQ05TVF9MSU1CKDEpPDwoKGsrMikqc2hpZnQpKS0oKGsmMSk/KENOU1RfTElNQigxKTw8c2hpZnQpOjEpKS8oKENOU1RfTElNQigxKTw8KDIqc2hpZnQpKS0xKSk7CisKKyAgcmV0dXJuIG5lZzsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb21fZXZhbF9wbTJyZXhwLmMgYi9tcG4vZ2VuZXJpYy90b29tX2V2YWxfcG0ycmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDYyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tX2V2YWxfcG0ycmV4cC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBtcG5fdG9vbV9ldmFsX3BtMnJleHAgLS0gRXZhbHVhdGUgYSBwb2x5bm9taWFsIGluICsyXi1rIGFuZCAtMl4taworCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0bworCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uCisjZGVmaW5lIERPX21wbl9hZGRsc2hfbihkc3Qsc3JjLG4scyx3cykgbXBuX2FkZGxzaF9uKGRzdCxkc3Qsc3JjLG4scykKKyNlbHNlCitzdGF0aWMgbXBfbGltYl90CitET19tcG5fYWRkbHNoX24obXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9wdHIgd3MpCit7CisjaWYgVVNFX01VTF8xICYmIDAKKyAgcmV0dXJuIG1wbl9hZGRtdWxfMShkc3Qsc3JjLG4sQ05TVF9MSU1CKDEpIDw8KHMpKTsKKyNlbHNlCisgIG1wX2xpbWJfdCBfX2N5OworICBfX2N5ID0gbXBuX2xzaGlmdCh3cyxzcmMsbixzKTsKKyAgcmV0dXJuICAgIF9fY3kgKyBtcG5fYWRkX24oZHN0LGRzdCx3cyxuKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIEV2YWx1YXRlcyBhIHBvbHlub21pYWwgb2YgZGVncmVlIGsgPj0gMy4gKi8KK2ludAorbXBuX3Rvb21fZXZhbF9wbTJyZXhwIChtcF9wdHIgcnAsIG1wX3B0ciBybSwKKwkJICAgICAgdW5zaWduZWQgaW50IHEsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX3NpemVfdCB0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgcywgbXBfcHRyIHdzKQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgaW50IG5lZzsKKyAgLyoge2FwLHEqbit0fSAtPiB7cnAsbisxfSB7cm0sbisxfSAsIHdpdGgge3dzLCBuKzF9Ki8KKyAgQVNTRVJUIChuID49IHQpOworICBBU1NFUlQgKHMgIT0gMCk7IC8qIG9yIF9ldmFsX3BtMSBzaG91bGQgYmUgdXNlZCAqLworICBBU1NFUlQgKHEgPiAxKTsKKyAgQVNTRVJUIChzKnEgPCBHTVBfTlVNQl9CSVRTKTsKKyAgcnBbbl0gPSBtcG5fbHNoaWZ0KHJwLCBhcCwgbiwgcypxKTsKKyAgd3Nbbl0gPSBtcG5fbHNoaWZ0KHdzLCBhcCtuLCBuLCBzKihxLTEpKTsKKyAgaWYoIChxICYgMSkgIT0gMCkgeworICAgIEFTU0VSVF9OT0NBUlJZKG1wbl9hZGQod3Msd3MsbisxLGFwK24qcSx0KSk7CisgICAgcnBbbl0gKz0gRE9fbXBuX2FkZGxzaF9uKHJwLCBhcCtuKihxLTEpLCBuLCBzLCBybSk7CisgIH0gZWxzZSB7CisgICAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZChycCxycCxuKzEsYXArbipxLHQpKTsKKyAgfQorICBmb3IoaT0yOyBpPHEtMTsgaSsrKQorICB7CisgICAgcnBbbl0gKz0gRE9fbXBuX2FkZGxzaF9uKHJwLCBhcCtuKmksIG4sIHMqKHEtaSksIHJtKTsKKyAgICBpKys7CisgICAgd3Nbbl0gKz0gRE9fbXBuX2FkZGxzaF9uKHdzLCBhcCtuKmksIG4sIHMqKHEtaSksIHJtKTsKKyAgfTsKKworICBuZWcgPSAobXBuX2NtcCAocnAsIHdzLCBuICsgMSkgPCAwKSA/IH4wIDogMDsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBpZiAobmVnKQorICAgIG1wbl9hZGRfbl9zdWJfbiAocnAsIHJtLCB3cywgcnAsIG4gKyAxKTsKKyAgZWxzZQorICAgIG1wbl9hZGRfbl9zdWJfbiAocnAsIHJtLCBycCwgd3MsIG4gKyAxKTsKKyNlbHNlIC8qICFIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24gKi8KKyAgaWYgKG5lZykKKyAgICBtcG5fc3ViX24gKHJtLCB3cywgcnAsIG4gKyAxKTsKKyAgZWxzZQorICAgIG1wbl9zdWJfbiAocm0sIHJwLCB3cywgbiArIDEpOworCisgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkX24gKHJwLCBycCwgd3MsIG4gKyAxKSk7CisjZW5kaWYgLyogIUhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbiAqLworCisgIHJldHVybiBuZWc7Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzEycHRzLmMgYi9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzEycHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3MzQ2NgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfMTJwdHMuYwpAQCAtMCwwICsxLDM3NCBAQAorLyogSW50ZXJwb2xhdGlvbiBmb3IgdGhlIGFsZ29yaXRobSBUb29tLUNvb2sgNi41LXdheS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTUsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2lmIEdNUF9OVU1CX0JJVFMgPCAyMQorI2Vycm9yIE5vdCBpbXBsZW1lbnRlZDogQm90aCBzdWJsc2hfbigsLCwyMCkgc2hvdWxkIGJlIGNvcnJlY3RlZC4KKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyA8IDE2CisjZXJyb3IgTm90IGltcGxlbWVudGVkOiBkaXZleGFjdF9ieTQyNTI1IG5lZWRzIHNwbGl0dGluZy4KKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyA8IDEyCisjZXJyb3IgTm90IGltcGxlbWVudGVkOiBIYXJkIHRvIGFkYXB0Li4uCisjZW5kaWYKKworCisvKiBGSVhNRTogdHVuZXVwIHNob3VsZCBkZWNpZGUgdGhlIGJlc3QgdmFyaWFudCAqLworI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl9BT1JTX0FPUlNMU0gKKyNkZWZpbmUgQU9SU01VTF9GQVNURVJfQU9SU19BT1JTTFNIIDEKKyNlbmRpZgorI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl9BT1JTXzJBT1JTTFNICisjZGVmaW5lIEFPUlNNVUxfRkFTVEVSX0FPUlNfMkFPUlNMU0ggMQorI2VuZGlmCisjaWZuZGVmIEFPUlNNVUxfRkFTVEVSXzJBT1JTTFNICisjZGVmaW5lIEFPUlNNVUxfRkFTVEVSXzJBT1JTTFNIIDEKKyNlbmRpZgorI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl8zQU9SU0xTSAorI2RlZmluZSBBT1JTTVVMX0ZBU1RFUl8zQU9SU0xTSCAxCisjZW5kaWYKKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uCisjZGVmaW5lIERPX21wbl9zdWJsc2hfbihkc3Qsc3JjLG4scyx3cykgbXBuX3N1YmxzaF9uKGRzdCxkc3Qsc3JjLG4scykKKyNlbHNlCitzdGF0aWMgbXBfbGltYl90CitET19tcG5fc3VibHNoX24obXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9wdHIgd3MpCit7CisjaWYgVVNFX01VTF8xICYmIDAKKyAgcmV0dXJuIG1wbl9zdWJtdWxfMShkc3Qsc3JjLG4sQ05TVF9MSU1CKDEpIDw8KHMpKTsKKyNlbHNlCisgIG1wX2xpbWJfdCBfX2N5OworICBfX2N5ID0gbXBuX2xzaGlmdCh3cyxzcmMsbixzKTsKKyAgcmV0dXJuICAgIF9fY3kgKyBtcG5fc3ViX24oZHN0LGRzdCx3cyxuKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX24KKyNkZWZpbmUgRE9fbXBuX2FkZGxzaF9uKGRzdCxzcmMsbixzLHdzKSBtcG5fYWRkbHNoX24oZHN0LGRzdCxzcmMsbixzKQorI2Vsc2UKKyNpZiAhZGVmaW5lZCAoQU9SU01VTF9GQVNURVJfMkFPUlNMU0gpICYmICFkZWZpbmVkIChBT1JTTVVMX0ZBU1RFUl9BT1JTXzJBT1JTTFNIKQorc3RhdGljIG1wX2xpbWJfdAorRE9fbXBuX2FkZGxzaF9uKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgcywgbXBfcHRyIHdzKQoreworI2lmIFVTRV9NVUxfMSAmJiAwCisgIHJldHVybiBtcG5fYWRkbXVsXzEoZHN0LHNyYyxuLENOU1RfTElNQigxKSA8PChzKSk7CisjZWxzZQorICBtcF9saW1iX3QgX19jeTsKKyAgX19jeSA9IG1wbl9sc2hpZnQod3Msc3JjLG4scyk7CisgIHJldHVybiAgICBfX2N5ICsgbXBuX2FkZF9uKGRzdCxkc3Qsd3Msbik7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VicnNoCisjZGVmaW5lIERPX21wbl9zdWJyc2goZHN0LG5kLHNyYyxucyxzLHdzKSBtcG5fc3VicnNoKGRzdCxuZCxzcmMsbnMscykKKyNlbHNlCisvKiBGSVhNRTogVGhpcyBpcyBub3QgYSBjb3JyZWN0IGRlZmluaXRpb24sIGl0IGFzc3VtZXMgbm8gY2FycnkgKi8KKyNkZWZpbmUgRE9fbXBuX3N1YnJzaChkc3QsbmQsc3JjLG5zLHMsd3MpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIG1wX2xpbWJfdCBfX2N5OwkJCQkJCQlcCisgIE1QTl9ERUNSX1UgKGRzdCwgbmQsIHNyY1swXSA+PiBzKTsJCQkJCVwKKyAgX19jeSA9IERPX21wbl9zdWJsc2hfbiAoZHN0LCBzcmMgKyAxLCBucyAtIDEsIEdNUF9OVU1CX0JJVFMgLSBzLCB3cyk7CVwKKyAgTVBOX0RFQ1JfVSAoZHN0ICsgbnMgLSAxLCBuZCAtIG5zICsgMSwgX19jeSk7CQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCisjZGVmaW5lIEJJTlZFUlRfOSBcCisgICgoKChHTVBfTlVNQl9NQVggLyA5KSA8PCAoNiAtIEdNUF9OVU1CX0JJVFMgJSA2KSkgKiA4ICYgR01QX05VTUJfTUFYKSB8IDB4MzkpCisKKyNkZWZpbmUgQklOVkVSVF8yNTUgXAorICAoR01QX05VTUJfTUFYIC0gKChHTVBfTlVNQl9NQVggLyAyNTUpIDw8ICg4IC0gR01QX05VTUJfQklUUyAlIDgpKSkKKworICAvKiBGSVhNRTogZmluZCBzb21lIG1vcmUgZ2VuZXJhbCBleHByZXNzaW9ucyBmb3IgMjgzNV4tMSwgNDI1MjVeLTEgKi8KKyNpZiBHTVBfTElNQl9CSVRTID09IDMyCisjZGVmaW5lIEJJTlZFUlRfMjgzNSAgKEdNUF9OVU1CX01BU0sgJgkJQ05TVF9MSU1CKDB4NTNFMzc3MUIpKQorI2RlZmluZSBCSU5WRVJUXzQyNTI1IChHTVBfTlVNQl9NQVNLICYJCUNOU1RfTElNQigweDlGMzE0QzM1KSkKKyNlbHNlCisjaWYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBCSU5WRVJUXzI4MzUgIChHTVBfTlVNQl9NQVNLICYJQ05TVF9MSU1CKDB4OTM4Q0M3MDU1M0UzNzcxQikpCisjZGVmaW5lIEJJTlZFUlRfNDI1MjUgKEdNUF9OVU1CX01BU0sgJglDTlNUX0xJTUIoMHhFN0I0MEQ0NDlGMzE0QzM1KSkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5MjU1CisjaWYgR01QX05VTUJfQklUUyAlIDggPT0gMAorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkyNTUoZHN0LHNyYyxzaXplKSBcCisgICgyNTUgJiAxICogbXBuX2JkaXZfZGJtMSAoZHN0LCBzcmMsIHNpemUsIF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgR01QX05VTUJfTUFTSyAvIDI1NSkpKQorI2Vsc2UKKyNpZiBIQVZFX05BVElWRV9tcG5fcGkxX2JkaXZfcV8xCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigyNTUpLEJJTlZFUlRfMjU1LDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkyNTUoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDI1NSkpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5OXg0CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk5eDQoZHN0LHNyYyxzaXplKSBtcG5fcGkxX2JkaXZfcV8xKGRzdCxzcmMsc2l6ZSxDTlNUX0xJTUIoOSksQklOVkVSVF85LDIpCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk5eDQoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDkpPDwyKQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnk0MjUyNQorI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEgJiYgZGVmaW5lZChCSU5WRVJUXzQyNTI1KQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk0MjUyNShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQig0MjUyNSksQklOVkVSVF80MjUyNSwwKQorI2Vsc2UKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5NDI1MjUoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDQyNTI1KSkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5MjgzNXg0CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMSAmJiBkZWZpbmVkKEJJTlZFUlRfMjgzNSkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjgzNXg0KGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDI4MzUpLEJJTlZFUlRfMjgzNSwyKQorI2Vsc2UKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjgzNXg0KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigyODM1KTw8MikKKyNlbmRpZgorI2VuZGlmCisKKy8qIEludGVycG9sYXRpb24gZm9yIFRvb20tNi41IChvciBUb29tLTYpLCB1c2luZyB0aGUgZXZhbHVhdGlvbgorICAgcG9pbnRzOiBpbmZpbml0eSg2LjUgb25seSksICstNCwgKy0yLCArLTEsICstMS80LCArLTEvMiwgMC4gTW9yZSBwcmVjaXNlbHksCisgICB3ZSB3YW50IHRvIGNvbXB1dGUgZigyXihHTVBfTlVNQl9CSVRTICogbikpIGZvciBhIHBvbHlub21pYWwgZiBvZgorICAgZGVncmVlIDExIChvciAxMCksIGdpdmVuIHRoZSAxMiAocnNwLiAxMSkgdmFsdWVzOgorCisgICAgIHIwID0gbGltaXQgYXQgaW5maW5pdHkgb2YgZih4KSAvIHheMTEsCisgICAgIHIxID0gZig0KSxmKC00KSwKKyAgICAgcjIgPSBmKDIpLGYoLTIpLAorICAgICByMyA9IGYoMSksZigtMSksCisgICAgIHI0ID0gZigxLzQpLGYoLTEvNCksCisgICAgIHI1ID0gZigxLzIpLGYoLTEvMiksCisgICAgIHI2ID0gZigwKS4KKworICAgQWxsIGNvdXBsZXMgb2YgdGhlIGZvcm0gZihuKSxmKC1uKSBtdXN0IGJlIGFscmVhZHkgbWl4ZWQgd2l0aAorICAgdG9vbV9jb3VwbGVfaGFuZGxpbmcoZihuKSwuLi4sZigtbiksLi4uKQorCisgICBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB7cHAsIHNwdCArIDcqbiAob3IgNipuKX0uCisgICBBdCBlbnRyeSwgcjYgaXMgc3RvcmVkIGF0IHtwcCwgMm59LAorICAgcjQgaXMgc3RvcmVkIGF0IHtwcCArIDNuLCAzbiArIDF9LgorICAgcjIgaXMgc3RvcmVkIGF0IHtwcCArIDduLCAzbiArIDF9LgorICAgcjAgaXMgc3RvcmVkIGF0IHtwcCArMTFuLCBzcHR9LgorCisgICBUaGUgb3RoZXIgdmFsdWVzIGFyZSAzbisxIGxpbWJzIGVhY2ggKHdpdGggbW9zdCBzaWduaWZpY2FudCBsaW1icyBzbWFsbCkuCisKKyAgIE5lZ2F0aXZlIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBzdG9yZWQgdHdvLWNvbXBsZW1lbnRlZC4KKyAgIElucHV0cyBhcmUgZGVzdHJveWVkLgorKi8KKwordm9pZAorbXBuX3Rvb21faW50ZXJwb2xhdGVfMTJwdHMgKG1wX3B0ciBwcCwgbXBfcHRyIHIxLCBtcF9wdHIgcjMsIG1wX3B0ciByNSwKKwkJCW1wX3NpemVfdCBuLCBtcF9zaXplX3Qgc3B0LCBpbnQgaGFsZiwgbXBfcHRyIHdzaSkKK3sKKyAgbXBfbGltYl90IGN5OworICBtcF9zaXplX3QgbjM7CisgIG1wX3NpemVfdCBuM3AxOworICBuMyA9IDMgKiBuOworICBuM3AxID0gbjMgKyAxOworCisjZGVmaW5lICAgcjQgICAgKHBwICsgbjMpCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIyICAgIChwcCArIDcgKiBuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByMCAgICAocHAgKzExICogbikJCQkvKiBzK3QgPD0gMipuICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW50ZXJwb2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYgKGhhbGYgIT0gMCkgeworICAgIGN5ID0gbXBuX3N1Yl9uIChyMywgcjMsIHIwLCBzcHQpOworICAgIE1QTl9ERUNSX1UgKHIzICsgc3B0LCBuM3AxIC0gc3B0LCBjeSk7CisKKyAgICBjeSA9IERPX21wbl9zdWJsc2hfbiAocjIsIHIwLCBzcHQsIDEwLCB3c2kpOworICAgIE1QTl9ERUNSX1UgKHIyICsgc3B0LCBuM3AxIC0gc3B0LCBjeSk7CisgICAgRE9fbXBuX3N1YnJzaChyNSwgbjNwMSwgcjAsIHNwdCwgMiwgd3NpKTsKKworICAgIGN5ID0gRE9fbXBuX3N1YmxzaF9uIChyMSwgcjAsIHNwdCwgMjAsIHdzaSk7CisgICAgTVBOX0RFQ1JfVSAocjEgKyBzcHQsIG4zcDEgLSBzcHQsIGN5KTsKKyAgICBET19tcG5fc3VicnNoKHI0LCBuM3AxLCByMCwgc3B0LCA0LCB3c2kpOworICB9OworCisgIHI0W24zXSAtPSBET19tcG5fc3VibHNoX24gKHI0ICsgbiwgcHAsIDIgKiBuLCAyMCwgd3NpKTsKKyAgRE9fbXBuX3N1YnJzaChyMSArIG4sIDIgKiBuICsgMSwgcHAsIDIgKiBuLCA0LCB3c2kpOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgIG1wbl9hZGRfbl9zdWJfbiAocjEsIHI0LCByNCwgcjEsIG4zcDEpOworI2Vsc2UKKyAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF9uICh3c2ksIHIxLCByNCwgbjNwMSkpOworICBtcG5fc3ViX24gKHI0LCByNCwgcjEsIG4zcDEpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgTVBfUFRSX1NXQVAocjEsIHdzaSk7CisjZW5kaWYKKworICByNVtuM10gLT0gRE9fbXBuX3N1YmxzaF9uIChyNSArIG4sIHBwLCAyICogbiwgMTAsIHdzaSk7CisgIERPX21wbl9zdWJyc2gocjIgKyBuLCAyICogbiArIDEsIHBwLCAyICogbiwgMiwgd3NpKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBtcG5fYWRkX25fc3ViX24gKHIyLCByNSwgcjUsIHIyLCBuM3AxKTsKKyNlbHNlCisgIG1wbl9zdWJfbiAod3NpLCByNSwgcjIsIG4zcDEpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF9uIChyMiwgcjIsIHI1LCBuM3AxKSk7CisgIE1QX1BUUl9TV0FQKHI1LCB3c2kpOworI2VuZGlmCisKKyAgcjNbbjNdIC09IG1wbl9zdWJfbiAocjMrbiwgcjMrbiwgcHAsIDIgKiBuKTsKKworI2lmIEFPUlNNVUxfRkFTVEVSX0FPUlNfQU9SU0xTSAorICBtcG5fc3VibXVsXzEgKHI0LCByNSwgbjNwMSwgMjU3KTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZWxzZQorICBtcG5fc3ViX24gKHI0LCByNCwgcjUsIG4zcDEpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgRE9fbXBuX3N1YmxzaF9uIChyNCwgcjUsIG4zcDEsIDgsIHdzaSk7IC8qIGNhbiBiZSBuZWdhdGl2ZSAqLworI2VuZGlmCisgIC8qIEEgZGl2aXNpb24gYnkgMjgzNXg0IGZvbGxvd3MuIFdhcm5pbmc6IHRoZSBvcGVyYW5kIGNhbiBiZSBuZWdhdGl2ZSEgKi8KKyAgbXBuX2RpdmV4YWN0X2J5MjgzNXg0KHI0LCByNCwgbjNwMSk7CisgIGlmICgocjRbbjNdICYgKEdNUF9OVU1CX01BWCA8PCAoR01QX05VTUJfQklUUy0zKSkpICE9IDApCisgICAgcjRbbjNdIHw9IChHTVBfTlVNQl9NQVggPDwgKEdNUF9OVU1CX0JJVFMtMikpOworCisjaWYgQU9SU01VTF9GQVNURVJfMkFPUlNMU0gKKyAgbXBuX2FkZG11bF8xIChyNSwgcjQsIG4zcDEsIDYwKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZWxzZQorICBET19tcG5fc3VibHNoX24gKHI1LCByNCwgbjNwMSwgMiwgd3NpKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisgIERPX21wbl9hZGRsc2hfbiAocjUsIHI0LCBuM3AxLCA2LCB3c2kpOyAvKiBjYW4gZ2l2ZSBhIGNhcnJ5ICovCisjZW5kaWYKKyAgbXBuX2RpdmV4YWN0X2J5MjU1KHI1LCByNSwgbjNwMSk7CisKKyAgQVNTRVJUX05PQ0FSUlkoRE9fbXBuX3N1YmxzaF9uIChyMiwgcjMsIG4zcDEsIDUsIHdzaSkpOworCisjaWYgQU9SU01VTF9GQVNURVJfM0FPUlNMU0gKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3N1Ym11bF8xIChyMSwgcjIsIG4zcDEsIDEwMCkpOworI2Vsc2UKKyAgQVNTRVJUX05PQ0FSUlkoRE9fbXBuX3N1YmxzaF9uIChyMSwgcjIsIG4zcDEsIDYsIHdzaSkpOworICBBU1NFUlRfTk9DQVJSWShET19tcG5fc3VibHNoX24gKHIxLCByMiwgbjNwMSwgNSwgd3NpKSk7CisgIEFTU0VSVF9OT0NBUlJZKERPX21wbl9zdWJsc2hfbiAocjEsIHIyLCBuM3AxLCAyLCB3c2kpKTsKKyNlbmRpZgorICBBU1NFUlRfTk9DQVJSWShET19tcG5fc3VibHNoX24gKHIxLCByMywgbjNwMSwgOSwgd3NpKSk7CisgIG1wbl9kaXZleGFjdF9ieTQyNTI1KHIxLCByMSwgbjNwMSk7CisKKyNpZiBBT1JTTVVMX0ZBU1RFUl9BT1JTXzJBT1JTTFNICisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJtdWxfMSAocjIsIHIxLCBuM3AxLCAyMjUpKTsKKyNlbHNlCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJfbiAocjIsIHIyLCByMSwgbjNwMSkpOworICBBU1NFUlRfTk9DQVJSWShET19tcG5fYWRkbHNoX24gKHIyLCByMSwgbjNwMSwgNSwgd3NpKSk7CisgIEFTU0VSVF9OT0NBUlJZKERPX21wbl9zdWJsc2hfbiAocjIsIHIxLCBuM3AxLCA4LCB3c2kpKTsKKyNlbmRpZgorICBtcG5fZGl2ZXhhY3RfYnk5eDQocjIsIHIyLCBuM3AxKTsKKworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHIzLCByMywgcjIsIG4zcDEpKTsKKworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxc3ViX24KKyAgbXBuX3JzaDFzdWJfbiAocjQsIHIyLCByNCwgbjNwMSk7CisgIHI0IFtuM3AxIC0gMV0gJj0gR01QX05VTUJfTUFTSyA+PiAxOworI2Vsc2UKKyAgbXBuX3N1Yl9uIChyNCwgcjIsIHI0LCBuM3AxKTsKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3JzaGlmdChyNCwgcjQsIG4zcDEsIDEpKTsKKyNlbmRpZgorICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHIyLCByMiwgcjQsIG4zcDEpKTsKKworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgbXBuX3JzaDFhZGRfbiAocjUsIHI1LCByMSwgbjNwMSk7CisgIHI1IFtuM3AxIC0gMV0gJj0gR01QX05VTUJfTUFTSyA+PiAxOworI2Vsc2UKKyAgbXBuX2FkZF9uIChyNSwgcjUsIHIxLCBuM3AxKTsKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3JzaGlmdChyNSwgcjUsIG4zcDEsIDEpKTsKKyNlbmRpZgorCisgIC8qIGxhc3QgaW50ZXJwb2xhdGlvbiBzdGVwcy4uLiAqLworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHIzLCByMywgcjEsIG4zcDEpKTsKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3N1Yl9uIChyMSwgcjEsIHI1LCBuM3AxKSk7CisgIC8qIC4uLiBjb3VsZCBiZSBtaXhlZCB3aXRoIHJlY29tcG9zaXRpb24KKwl8fEgtcjV8TS1yNXxMLXI1fCAgIHx8SC1yMXxNLXIxfEwtcjF8CisgICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHJlY29tcG9zaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoKKyAgICBwcFtdIHByaW9yIHRvIG9wZXJhdGlvbnM6CisgICAgfE0gcjB8TCByMHxfX198fEggcjJ8TSByMnxMIHIyfF9fX3x8SCByNHxNIHI0fEwgcjR8X19fX3xIX3I2fEwgcjZ8cHAKKworICAgIHN1bW1hdGlvbiBzY2hlbWUgZm9yIHJlbWFpbmluZyBvcGVyYXRpb25zOgorICAgIHxfXzEyfG5fMTF8bl8xMHxuX185fG5fXzh8bl9fN3xuX182fG5fXzV8bl9fNHxuX18zfG5fXzJ8bl9fX3xuX19ffHBwCisgICAgfE0gcjB8TCByMHxfX198fEggcjJ8TSByMnxMIHIyfF9fX3x8SCByNHxNIHI0fEwgcjR8X19fX3xIX3I2fEwgcjZ8cHAKKwl8fEggcjF8TSByMXxMIHIxfCAgIHx8SCByM3xNIHIzfEwgcjN8ICAgfHxIX3I1fE1fcjV8TF9yNXwKKyAgKi8KKworICBjeSA9IG1wbl9hZGRfbiAocHAgKyBuLCBwcCArIG4sIHI1LCBuKTsKKyAgY3kgPSBtcG5fYWRkXzEgKHBwICsgMiAqIG4sIHI1ICsgbiwgbiwgY3kpOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbmMKKyAgY3kgPSByNVtuM10gKyBtcG5fYWRkX25jKHBwICsgbjMsIHBwICsgbjMsIHI1ICsgMiAqIG4sIG4sIGN5KTsKKyNlbHNlCisgIE1QTl9JTkNSX1UgKHI1ICsgMiAqIG4sIG4gKyAxLCBjeSk7CisgIGN5ID0gcjVbbjNdICsgbXBuX2FkZF9uIChwcCArIG4zLCBwcCArIG4zLCByNSArIDIgKiBuLCBuKTsKKyNlbmRpZgorICBNUE5fSU5DUl9VIChwcCArIG4zICsgbiwgMiAqIG4gKyAxLCBjeSk7CisKKyAgcHBbMiAqIG4zXSs9IG1wbl9hZGRfbiAocHAgKyA1ICogbiwgcHAgKyA1ICogbiwgcjMsIG4pOworICBjeSA9IG1wbl9hZGRfMSAocHAgKyAyICogbjMsIHIzICsgbiwgbiwgcHBbMiAqIG4zXSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworICBjeSA9IHIzW24zXSArIG1wbl9hZGRfbmMocHAgKyA3ICogbiwgcHAgKyA3ICogbiwgcjMgKyAyICogbiwgbiwgY3kpOworI2Vsc2UKKyAgTVBOX0lOQ1JfVSAocjMgKyAyICogbiwgbiArIDEsIGN5KTsKKyAgY3kgPSByM1tuM10gKyBtcG5fYWRkX24gKHBwICsgNyAqIG4sIHBwICsgNyAqIG4sIHIzICsgMiAqIG4sIG4pOworI2VuZGlmCisgIE1QTl9JTkNSX1UgKHBwICsgOCAqIG4sIDIgKiBuICsgMSwgY3kpOworCisgIHBwWzEwKm5dKz1tcG5fYWRkX24gKHBwICsgOSAqIG4sIHBwICsgOSAqIG4sIHIxLCBuKTsKKyAgaWYgKGhhbGYpIHsKKyAgICBjeSA9IG1wbl9hZGRfMSAocHAgKyAxMCAqIG4sIHIxICsgbiwgbiwgcHBbMTAgKiBuXSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworICAgIGlmIChMSUtFTFkgKHNwdCA+IG4pKSB7CisgICAgICBjeSA9IHIxW24zXSArIG1wbl9hZGRfbmMocHAgKyAxMSAqIG4sIHBwICsgMTEgKiBuLCByMSArIDIgKiBuLCBuLCBjeSk7CisgICAgICBNUE5fSU5DUl9VIChwcCArIDQgKiBuMywgc3B0IC0gbiwgY3kpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfTk9DQVJSWShtcG5fYWRkX25jKHBwICsgMTEgKiBuLCBwcCArIDExICogbiwgcjEgKyAyICogbiwgc3B0LCBjeSkpOworICAgIH0KKyNlbHNlCisgICAgTVBOX0lOQ1JfVSAocjEgKyAyICogbiwgbiArIDEsIGN5KTsKKyAgICBpZiAoTElLRUxZIChzcHQgPiBuKSkgeworICAgICAgY3kgPSByMVtuM10gKyBtcG5fYWRkX24gKHBwICsgMTEgKiBuLCBwcCArIDExICogbiwgcjEgKyAyICogbiwgbik7CisgICAgICBNUE5fSU5DUl9VIChwcCArIDQgKiBuMywgc3B0IC0gbiwgY3kpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfTk9DQVJSWShtcG5fYWRkX24gKHBwICsgMTEgKiBuLCBwcCArIDExICogbiwgcjEgKyAyICogbiwgc3B0KSk7CisgICAgfQorI2VuZGlmCisgIH0gZWxzZSB7CisgICAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF8xIChwcCArIDEwICogbiwgcjEgKyBuLCBzcHQsIHBwWzEwICogbl0pKTsKKyAgfQorCisjdW5kZWYgICByMAorI3VuZGVmICAgcjIKKyN1bmRlZiAgIHI0Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzE2cHRzLmMgYi9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzE2cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NTdiZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfMTZwdHMuYwpAQCAtMCwwICsxLDU0NSBAQAorLyogSW50ZXJwb2xhdGlvbiBmb3IgdGhlIGFsZ29yaXRobSBUb29tLUNvb2sgOC41LXdheS4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKKyAgIFRIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgT05MWQorICAgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTUsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2lmIEdNUF9OVU1CX0JJVFMgPCAyOQorI2Vycm9yIE5vdCBpbXBsZW1lbnRlZDogQm90aCBzdWJsc2hfbigsLCwyOCkgc2hvdWxkIGJlIGNvcnJlY3RlZDsgcjIgYW5kIHI1IG5lZWQgb25lIG1vcmUgTElNQi4KKyNlbmRpZgorCisjaWYgR01QX05VTUJfQklUUyA8IDI4CisjZXJyb3IgTm90IGltcGxlbWVudGVkOiBkaXZleGFjdF9ieTE4ODUxMzMyNSBhbmQgX2J5MTgyNzEyOTE1IHdpbGwgbm90IHdvcmsuCisjZW5kaWYKKworCisvKiBGSVhNRTogdHVuZXVwIHNob3VsZCBkZWNpZGUgdGhlIGJlc3QgdmFyaWFudCAqLworI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl9BT1JTX0FPUlNMU0gKKyNkZWZpbmUgQU9SU01VTF9GQVNURVJfQU9SU19BT1JTTFNIIDEKKyNlbmRpZgorI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl9BT1JTXzJBT1JTTFNICisjZGVmaW5lIEFPUlNNVUxfRkFTVEVSX0FPUlNfMkFPUlNMU0ggMQorI2VuZGlmCisjaWZuZGVmIEFPUlNNVUxfRkFTVEVSXzJBT1JTTFNICisjZGVmaW5lIEFPUlNNVUxfRkFTVEVSXzJBT1JTTFNIIDEKKyNlbmRpZgorI2lmbmRlZiBBT1JTTVVMX0ZBU1RFUl8zQU9SU0xTSAorI2RlZmluZSBBT1JTTVVMX0ZBU1RFUl8zQU9SU0xTSCAxCisjZW5kaWYKKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uCisjZGVmaW5lIERPX21wbl9zdWJsc2hfbihkc3Qsc3JjLG4scyx3cykgbXBuX3N1YmxzaF9uKGRzdCxkc3Qsc3JjLG4scykKKyNlbHNlCitzdGF0aWMgbXBfbGltYl90CitET19tcG5fc3VibHNoX24obXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9wdHIgd3MpCit7CisjaWYgVVNFX01VTF8xICYmIDAKKyAgcmV0dXJuIG1wbl9zdWJtdWxfMShkc3Qsc3JjLG4sQ05TVF9MSU1CKDEpIDw8KHMpKTsKKyNlbHNlCisgIG1wX2xpbWJfdCBfX2N5OworICBfX2N5ID0gbXBuX2xzaGlmdCh3cyxzcmMsbixzKTsKKyAgcmV0dXJuICAgIF9fY3kgKyBtcG5fc3ViX24oZHN0LGRzdCx3cyxuKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX24KKyNkZWZpbmUgRE9fbXBuX2FkZGxzaF9uKGRzdCxzcmMsbixzLHdzKSBtcG5fYWRkbHNoX24oZHN0LGRzdCxzcmMsbixzKQorI2Vsc2UKKyNpZiAhZGVmaW5lZCAoQU9SU01VTF9GQVNURVJfMkFPUlNMU0gpICYmICFkZWZpbmVkIChBT1JTTVVMX0ZBU1RFUl9BT1JTXzJBT1JTTFNIKQorc3RhdGljIG1wX2xpbWJfdAorRE9fbXBuX2FkZGxzaF9uKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgcywgbXBfcHRyIHdzKQoreworI2lmIFVTRV9NVUxfMSAmJiAwCisgIHJldHVybiBtcG5fYWRkbXVsXzEoZHN0LHNyYyxuLENOU1RfTElNQigxKSA8PChzKSk7CisjZWxzZQorICBtcF9saW1iX3QgX19jeTsKKyAgX19jeSA9IG1wbl9sc2hpZnQod3Msc3JjLG4scyk7CisgIHJldHVybiAgICBfX2N5ICsgbXBuX2FkZF9uKGRzdCxkc3Qsd3Msbik7CisjZW5kaWYKK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VicnNoCisjZGVmaW5lIERPX21wbl9zdWJyc2goZHN0LG5kLHNyYyxucyxzLHdzKSBtcG5fc3VicnNoKGRzdCxuZCxzcmMsbnMscykKKyNlbHNlCisvKiBGSVhNRTogVGhpcyBpcyBub3QgYSBjb3JyZWN0IGRlZmluaXRpb24sIGl0IGFzc3VtZXMgbm8gY2FycnkgKi8KKyNkZWZpbmUgRE9fbXBuX3N1YnJzaChkc3QsbmQsc3JjLG5zLHMsd3MpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIG1wX2xpbWJfdCBfX2N5OwkJCQkJCQlcCisgIE1QTl9ERUNSX1UgKGRzdCwgbmQsIHNyY1swXSA+PiBzKTsJCQkJCVwKKyAgX19jeSA9IERPX21wbl9zdWJsc2hfbiAoZHN0LCBzcmMgKyAxLCBucyAtIDEsIEdNUF9OVU1CX0JJVFMgLSBzLCB3cyk7CVwKKyAgTVBOX0RFQ1JfVSAoZHN0ICsgbnMgLSAxLCBuZCAtIG5zICsgMSwgX19jeSk7CQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCisjaWYgR01QX05VTUJfQklUUyA8IDQzCisjZGVmaW5lIEJJVF9DT1JSRUNUSU9OIDEKKyNkZWZpbmUgQ09SUkVDVElPTl9CSVRTIEdNUF9OVU1CX0JJVFMKKyNlbHNlCisjZGVmaW5lIEJJVF9DT1JSRUNUSU9OIDAKKyNkZWZpbmUgQ09SUkVDVElPTl9CSVRTIDAKKyNlbmRpZgorCisjZGVmaW5lIEJJTlZFUlRfOSBcCisgICgoKChHTVBfTlVNQl9NQVggLyA5KSA8PCAoNiAtIEdNUF9OVU1CX0JJVFMgJSA2KSkgKiA4ICYgR01QX05VTUJfTUFYKSB8IDB4MzkpCisKKyNkZWZpbmUgQklOVkVSVF8yNTUgXAorICAoR01QX05VTUJfTUFYIC0gKChHTVBfTlVNQl9NQVggLyAyNTUpIDw8ICg4IC0gR01QX05VTUJfQklUUyAlIDgpKSkKKworICAvKiBGSVhNRTogZmluZCBzb21lIG1vcmUgZ2VuZXJhbCBleHByZXNzaW9ucyBmb3IgaW52ZXJzZXMgKi8KKyNpZiBHTVBfTElNQl9CSVRTID09IDMyCisjZGVmaW5lIEJJTlZFUlRfMjgzNSAgKEdNUF9OVU1CX01BU0sgJgkJQ05TVF9MSU1CKDB4NTNFMzc3MUIpKQorI2RlZmluZSBCSU5WRVJUXzQyNTI1IChHTVBfTlVNQl9NQVNLICYJCUNOU1RfTElNQigweDlGMzE0QzM1KSkKKyNkZWZpbmUgQklOVkVSVF8xODI3MTI5MTUgKEdNUF9OVU1CX01BU0sgJglDTlNUX0xJTUIoMHg1NTA2NTlEQikpCisjZGVmaW5lIEJJTlZFUlRfMTg4NTEzMzI1IChHTVBfTlVNQl9NQVNLICYJQ05TVF9MSU1CKDB4RkJDMzMzQTUpKQorI2RlZmluZSBCSU5WRVJUXzI1NXgxODI3MTI5MTVMIChHTVBfTlVNQl9NQVNLICYJQ05TVF9MSU1CKDB4NkZDNENCMjUpKQorI2RlZmluZSBCSU5WRVJUXzI1NXgxODg1MTMzMjVMIChHTVBfTlVNQl9NQVNLICYJQ05TVF9MSU1CKDB4Njg2NDI3NUIpKQorI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2RlZmluZSBCSU5WRVJUXzI1NXgxODI3MTI5MTVIIENOU1RfTElNQigweDFCNjQ5QTA3KQorI2RlZmluZSBCSU5WRVJUXzI1NXgxODg1MTMzMjVIIENOU1RfTElNQigweDA2REI5OTNBKQorI2Vsc2UgLyogR01QX05BSUxfQklUUyAhPSAwICovCisjZGVmaW5lIEJJTlZFUlRfMjU1eDE4MjcxMjkxNUggXAorICAoR01QX05VTUJfTUFTSyAmIENOU1RfTElNQigoMHgxQjY0OUEwNzw8R01QX05BSUxfQklUUykgfCAoMHg2RkM0Q0IyNT4+R01QX05VTUJfQklUUykpKQorI2RlZmluZSBCSU5WRVJUXzI1NXgxODg1MTMzMjVIIFwKKyAgKEdNUF9OVU1CX01BU0sgJiBDTlNUX0xJTUIoKDB4MDZEQjk5M0E8PEdNUF9OQUlMX0JJVFMpIHwgKDB4Njg2NDI3NUI+PkdNUF9OVU1CX0JJVFMpKSkKKyNlbmRpZgorI2Vsc2UKKyNpZiBHTVBfTElNQl9CSVRTID09IDY0CisjZGVmaW5lIEJJTlZFUlRfMjgzNSAgKEdNUF9OVU1CX01BU0sgJglDTlNUX0xJTUIoMHg5MzhDQzcwNTUzRTM3NzFCKSkKKyNkZWZpbmUgQklOVkVSVF80MjUyNSAoR01QX05VTUJfTUFTSyAmCUNOU1RfTElNQigweEU3QjQwRDQ0OUYzMTRDMzUpKQorI2RlZmluZSBCSU5WRVJUXzI1NXgxODI3MTI5MTUgIChHTVBfTlVNQl9NQVNLICYJQ05TVF9MSU1CKDB4MUI2NDlBMDc2RkM0Q0IyNSkpCisjZGVmaW5lIEJJTlZFUlRfMjU1eDE4ODUxMzMyNSAgKEdNUF9OVU1CX01BU0sgJglDTlNUX0xJTUIoMHgwNkRCOTkzQTY4NjQyNzVCKSkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5MjU1CisjaWYgR01QX05VTUJfQklUUyAlIDggPT0gMAorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkyNTUoZHN0LHNyYyxzaXplKSBcCisgICgyNTUgJiAxICogbXBuX2JkaXZfZGJtMSAoZHN0LCBzcmMsIHNpemUsIF9fR01QX0NBU1QgKG1wX2xpbWJfdCwgR01QX05VTUJfTUFTSyAvIDI1NSkpKQorI2Vsc2UKKyNpZiBIQVZFX05BVElWRV9tcG5fcGkxX2JkaXZfcV8xCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigyNTUpLEJJTlZFUlRfMjU1LDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkyNTUoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDI1NSkpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5MjU1eDQKKyNpZiBIQVZFX05BVElWRV9tcG5fcGkxX2JkaXZfcV8xCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXg0KGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDI1NSksQklOVkVSVF8yNTUsMikKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXg0KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigyNTUpPDwyKQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnk5eDE2CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk5eDE2KGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDkpLEJJTlZFUlRfOSw0KQorI2Vsc2UKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5OXgxNihkc3Qsc3JjLHNpemUpIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSxDTlNUX0xJTUIoOSk8PDQpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIG1wbl9kaXZleGFjdF9ieTQyNTI1eDE2CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMSAmJiBkZWZpbmVkKEJJTlZFUlRfNDI1MjUpCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTQyNTI1eDE2KGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDQyNTI1KSxCSU5WRVJUXzQyNTI1LDQpCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk0MjUyNXgxNihkc3Qsc3JjLHNpemUpIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSxDTlNUX0xJTUIoNDI1MjUpPDw0KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkyODM1eDY0CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMSAmJiBkZWZpbmVkKEJJTlZFUlRfMjgzNSkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjgzNXg2NChkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigyODM1KSxCSU5WRVJUXzI4MzUsNikKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI4MzV4NjQoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDI4MzUpPDw2KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiAgbXBuX2RpdmV4YWN0X2J5MjU1eDE4MjcxMjkxNQorI2lmIEdNUF9OVU1CX0JJVFMgPCAzNgorI2lmIEhBVkVfTkFUSVZFX21wbl9iZGl2X3FfMl9waTIgJiYgZGVmaW5lZChCSU5WRVJUXzI1NXgxODI3MTI5MTVIKQorLyogRklYTUU6IHVzZSBtcG5fYmRpdl9xXzJfcGkyICovCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fcGkxX2JkaXZfcV8xICYmIGRlZmluZWQoQklOVkVSVF8xODI3MTI5MTUpCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXgxODI3MTI5MTUoZHN0LHNyYyxzaXplKQkJCQlcCisgIGRvIHsJCQkJCQkJCQkJXAorICAgIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigxODI3MTI5MTUpLEJJTlZFUlRfMTgyNzEyOTE1LDApOwlcCisgICAgbXBuX2RpdmV4YWN0X2J5MjU1KGRzdCxkc3Qsc2l6ZSk7CQkJCQkJXAorICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkyNTV4MTgyNzEyOTE1KGRzdCxzcmMsc2l6ZSkJXAorICBkbyB7CQkJCQkJCVwKKyAgICBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsQ05TVF9MSU1CKDE4MjcxMjkxNSkpOwlcCisgICAgbXBuX2RpdmV4YWN0X2J5MjU1KGRzdCxkc3Qsc2l6ZSk7CQkJXAorICB9IHdoaWxlKDApCisjZW5kaWYKKyNlbHNlIC8qIEdNUF9OVU1CX0JJVFMgPiAzNSAqLworI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEgJiYgZGVmaW5lZChCSU5WRVJUXzI1NXgxODI3MTI5MTUpCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXgxODI3MTI5MTUoZHN0LHNyYyxzaXplKSBcCisgIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDI1NSpDTlNUX0xJTUIoMTgyNzEyOTE1KSxCSU5WRVJUXzI1NXgxODI3MTI5MTUsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXgxODI3MTI5MTUoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsMjU1KkNOU1RfTElNQigxODI3MTI5MTUpKQorI2VuZGlmCisjZW5kaWYgLyogR01QX05VTUJfQklUUyA+PzwgMzYgKi8KKyNlbmRpZgorCisjaWZuZGVmICBtcG5fZGl2ZXhhY3RfYnkyNTV4MTg4NTEzMzI1CisjaWYgR01QX05VTUJfQklUUyA8IDM2CisjaWYgSEFWRV9OQVRJVkVfbXBuX2JkaXZfcV8xX3BpMiAmJiBkZWZpbmVkKEJJTlZFUlRfMjU1eDE4ODUxMzMyNUgpCisvKiBGSVhNRTogdXNlIG1wbl9iZGl2X3FfMV9waTIgKi8KKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEgJiYgZGVmaW5lZChCSU5WRVJUXzE4ODUxMzMyNSkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjU1eDE4ODUxMzMyNShkc3Qsc3JjLHNpemUpCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLENOU1RfTElNQigxODg1MTMzMjUpLEJJTlZFUlRfMTg4NTEzMzI1LDApOwlcCisgICAgbXBuX2RpdmV4YWN0X2J5MjU1KGRzdCxkc3Qsc2l6ZSk7CQkJCQlcCisgIH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTI1NXgxODg1MTMzMjUoZHN0LHNyYyxzaXplKQlcCisgIGRvIHsJCQkJCQkJXAorICAgIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSxDTlNUX0xJTUIoMTg4NTEzMzI1KSk7CVwKKyAgICBtcG5fZGl2ZXhhY3RfYnkyNTUoZHN0LGRzdCxzaXplKTsJCQlcCisgIH0gd2hpbGUoMCkKKyNlbmRpZgorI2Vsc2UgLyogR01QX05VTUJfQklUUyA+IDM1ICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMSAmJiBkZWZpbmVkKEJJTlZFUlRfMjU1eDE4ODUxMzMyNSkKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjU1eDE4ODUxMzMyNShkc3Qsc3JjLHNpemUpIFwKKyAgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsMjU1KkNOU1RfTElNQigxODg1MTMzMjUpLEJJTlZFUlRfMjU1eDE4ODUxMzMyNSwwKQorI2Vsc2UKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5MjU1eDE4ODUxMzMyNShkc3Qsc3JjLHNpemUpIG1wbl9kaXZleGFjdF8xKGRzdCxzcmMsc2l6ZSwyNTUqQ05TVF9MSU1CKDE4ODUxMzMyNSkpCisjZW5kaWYKKyNlbmRpZiAvKiBHTVBfTlVNQl9CSVRTID4/PCAzNiAqLworI2VuZGlmCisKKy8qIEludGVycG9sYXRpb24gZm9yIFRvb20tOC41IChvciBUb29tLTgpLCB1c2luZyB0aGUgZXZhbHVhdGlvbgorICAgcG9pbnRzOiBpbmZpbml0eSg4LjUgb25seSksICstOCwgKy00LCArLTIsICstMSwgKy0xLzQsICstMS8yLAorICAgKy0xLzgsIDAuIE1vcmUgcHJlY2lzZWx5LCB3ZSB3YW50IHRvIGNvbXB1dGUKKyAgIGYoMl4oR01QX05VTUJfQklUUyAqIG4pKSBmb3IgYSBwb2x5bm9taWFsIGYgb2YgZGVncmVlIDE1IChvcgorICAgMTQpLCBnaXZlbiB0aGUgMTYgKHJzcC4gMTUpIHZhbHVlczoKKworICAgICByMCA9IGxpbWl0IGF0IGluZmluaXR5IG9mIGYoeCkgLyB4XjE1LAorICAgICByMSA9IGYoOCksZigtOCksCisgICAgIHIyID0gZig0KSxmKC00KSwKKyAgICAgcjMgPSBmKDIpLGYoLTIpLAorICAgICByNCA9IGYoMSksZigtMSksCisgICAgIHI1ID0gZigxLzQpLGYoLTEvNCksCisgICAgIHI2ID0gZigxLzIpLGYoLTEvMiksCisgICAgIHI3ID0gZigxLzgpLGYoLTEvOCksCisgICAgIHI4ID0gZigwKS4KKworICAgQWxsIGNvdXBsZXMgb2YgdGhlIGZvcm0gZihuKSxmKC1uKSBtdXN0IGJlIGFscmVhZHkgbWl4ZWQgd2l0aAorICAgdG9vbV9jb3VwbGVfaGFuZGxpbmcoZihuKSwuLi4sZigtbiksLi4uKQorCisgICBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB7cHAsIHNwdCArIDcqbiAob3IgOCpuKX0uCisgICBBdCBlbnRyeSwgcjggaXMgc3RvcmVkIGF0IHtwcCwgMm59LAorICAgcjYgaXMgc3RvcmVkIGF0IHtwcCArIDNuLCAzbiArIDF9LgorICAgcjQgaXMgc3RvcmVkIGF0IHtwcCArIDduLCAzbiArIDF9LgorICAgcjIgaXMgc3RvcmVkIGF0IHtwcCArMTFuLCAzbiArIDF9LgorICAgcjAgaXMgc3RvcmVkIGF0IHtwcCArMTVuLCBzcHR9LgorCisgICBUaGUgb3RoZXIgdmFsdWVzIGFyZSAzbisxIGxpbWJzIGVhY2ggKHdpdGggbW9zdCBzaWduaWZpY2FudCBsaW1icyBzbWFsbCkuCisKKyAgIE5lZ2F0aXZlIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBzdG9yZWQgdHdvLWNvbXBsZW1lbnRlZC4KKyAgIElucHV0cyBhcmUgZGVzdHJveWVkLgorKi8KKwordm9pZAorbXBuX3Rvb21faW50ZXJwb2xhdGVfMTZwdHMgKG1wX3B0ciBwcCwgbXBfcHRyIHIxLCBtcF9wdHIgcjMsIG1wX3B0ciByNSwgbXBfcHRyIHI3LAorCQkJbXBfc2l6ZV90IG4sIG1wX3NpemVfdCBzcHQsIGludCBoYWxmLCBtcF9wdHIgd3NpKQoreworICBtcF9saW1iX3QgY3k7CisgIG1wX3NpemVfdCBuMzsKKyAgbXBfc2l6ZV90IG4zcDE7CisgIG4zID0gMyAqIG47CisgIG4zcDEgPSBuMyArIDE7CisKKyNkZWZpbmUgICByNiAgICAocHAgKyBuMykJCQkvKiAzbisxICovCisjZGVmaW5lICAgcjQgICAgKHBwICsgNyAqIG4pCQkJLyogM24rMSAqLworI2RlZmluZSAgIHIyICAgIChwcCArMTEgKiBuKQkJCS8qIDNuKzEgKi8KKyNkZWZpbmUgICByMCAgICAocHAgKzE1ICogbikJCQkvKiBzK3QgPD0gMipuICovCisKKyAgQVNTRVJUKCBzcHQgPD0gMiAqIG4gKTsKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW50ZXJwb2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgaWYoIGhhbGYgIT0gMCkgeworICAgIGN5ID0gbXBuX3N1Yl9uIChyNCwgcjQsIHIwLCBzcHQpOworICAgIE1QTl9ERUNSX1UgKHI0ICsgc3B0LCBuM3AxIC0gc3B0LCBjeSk7CisKKyAgICBjeSA9IERPX21wbl9zdWJsc2hfbiAocjMsIHIwLCBzcHQsIDE0LCB3c2kpOworICAgIE1QTl9ERUNSX1UgKHIzICsgc3B0LCBuM3AxIC0gc3B0LCBjeSk7CisgICAgRE9fbXBuX3N1YnJzaChyNiwgbjNwMSwgcjAsIHNwdCwgMiwgd3NpKTsKKworICAgIGN5ID0gRE9fbXBuX3N1YmxzaF9uIChyMiwgcjAsIHNwdCwgMjgsIHdzaSk7CisgICAgTVBOX0RFQ1JfVSAocjIgKyBzcHQsIG4zcDEgLSBzcHQsIGN5KTsKKyAgICBET19tcG5fc3VicnNoKHI1LCBuM3AxLCByMCwgc3B0LCA0LCB3c2kpOworCisgICAgY3kgPSBET19tcG5fc3VibHNoX24gKHIxICsgQklUX0NPUlJFQ1RJT04sIHIwLCBzcHQsIDQyIC0gQ09SUkVDVElPTl9CSVRTLCB3c2kpOworI2lmIEJJVF9DT1JSRUNUSU9OCisgICAgY3kgPSBtcG5fc3ViXzEgKHIxICsgc3B0ICsgQklUX0NPUlJFQ1RJT04sIHIxICsgc3B0ICsgQklUX0NPUlJFQ1RJT04sCisJCSAgICBuM3AxIC0gc3B0IC0gQklUX0NPUlJFQ1RJT04sIGN5KTsKKyAgICBBU1NFUlQgKEJJVF9DT1JSRUNUSU9OID4gMCB8fCBjeSA9PSAwKTsKKyAgICAvKiBGSVhNRTogYXNzdW1lcyByN1tuM3AxXSBpcyB3cml0YWJsZSAoaXQgaXMgaWYgcjUgZm9sbG93cykuICovCisgICAgY3kgPSByN1tuM3AxXTsKKyAgICByN1tuM3AxXSA9IDB4ODA7CisjZWxzZQorICAgIE1QTl9ERUNSX1UgKHIxICsgc3B0ICsgQklUX0NPUlJFQ1RJT04sIG4zcDEgLSBzcHQgLSBCSVRfQ09SUkVDVElPTiwgY3kpOworI2VuZGlmCisgICAgRE9fbXBuX3N1YnJzaChyNywgbjNwMSArIEJJVF9DT1JSRUNUSU9OLCByMCwgc3B0LCA2LCB3c2kpOworI2lmIEJJVF9DT1JSRUNUSU9OCisgICAgLyogRklYTUU6IGFzc3VtZXMgcjdbbjNwMV0gaXMgd3JpdGFibGUuICovCisgICAgQVNTRVJUICggQklUX0NPUlJFQ1RJT04gPiAwIHx8IHI3W24zcDFdID09IDB4ODAgKTsKKyAgICByN1tuM3AxXSA9IGN5OworI2VuZGlmCisgIH07CisKKyAgcjVbbjNdIC09IERPX21wbl9zdWJsc2hfbiAocjUgKyBuLCBwcCwgMiAqIG4sIDI4LCB3c2kpOworICBET19tcG5fc3VicnNoKHIyICsgbiwgMiAqIG4gKyAxLCBwcCwgMiAqIG4sIDQsIHdzaSk7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgbXBuX2FkZF9uX3N1Yl9uIChyMiwgcjUsIHI1LCByMiwgbjNwMSk7CisjZWxzZQorICBtcG5fc3ViX24gKHdzaSwgcjUsIHIyLCBuM3AxKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9hZGRfbiAocjIsIHIyLCByNSwgbjNwMSkpOworICBNUF9QVFJfU1dBUChyNSwgd3NpKTsKKyNlbmRpZgorCisgIHI2W24zXSAtPSBET19tcG5fc3VibHNoX24gKHI2ICsgbiwgcHAsIDIgKiBuLCAxNCwgd3NpKTsKKyAgRE9fbXBuX3N1YnJzaChyMyArIG4sIDIgKiBuICsgMSwgcHAsIDIgKiBuLCAyLCB3c2kpOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uX3N1Yl9uCisgIG1wbl9hZGRfbl9zdWJfbiAocjMsIHI2LCByNiwgcjMsIG4zcDEpOworI2Vsc2UKKyAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF9uICh3c2ksIHIzLCByNiwgbjNwMSkpOworICBtcG5fc3ViX24gKHI2LCByNiwgcjMsIG4zcDEpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgTVBfUFRSX1NXQVAocjMsIHdzaSk7CisjZW5kaWYKKworICBjeSA9IERPX21wbl9zdWJsc2hfbiAocjcgKyBuICsgQklUX0NPUlJFQ1RJT04sIHBwLCAyICogbiwgNDIgLSBDT1JSRUNUSU9OX0JJVFMsIHdzaSk7CisjaWYgQklUX0NPUlJFQ1RJT04KKyAgTVBOX0RFQ1JfVSAocjEgKyBuLCAyICogbiArIDEsIHBwWzBdID4+IDYpOworICBjeSA9IERPX21wbl9zdWJsc2hfbiAocjEgKyBuLCBwcCArIDEsIDIgKiBuIC0gMSwgR01QX05VTUJfQklUUyAtIDYsIHdzaSk7CisgIGN5ID0gbXBuX3N1Yl8xKHIxICsgMyAqIG4gLSAxLCByMSArIDMgKiBuIC0gMSwgMiwgY3kpOworICBBU1NFUlQgKCBCSVRfQ09SUkVDVElPTiA+IDAgfHwgY3kgIT0gMCApOworI2Vsc2UKKyAgcjdbbjNdIC09IGN5OworICBET19tcG5fc3VicnNoKHIxICsgbiwgMiAqIG4gKyAxLCBwcCwgMiAqIG4sIDYsIHdzaSk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICBtcG5fYWRkX25fc3ViX24gKHIxLCByNywgcjcsIHIxLCBuM3AxKTsKKyNlbHNlCisgIG1wbl9zdWJfbiAod3NpLCByNywgcjEsIG4zcDEpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgbXBuX2FkZF9uIChyMSwgcjEsIHI3LCBuM3AxKTsgIC8qIGlmIEJJVF9DT1JSRUNUSU9OICE9IDAsIGNhbiBnaXZlIGEgY2FycnkuICovCisgIE1QX1BUUl9TV0FQKHI3LCB3c2kpOworI2VuZGlmCisKKyAgcjRbbjNdIC09IG1wbl9zdWJfbiAocjQrbiwgcjQrbiwgcHAsIDIgKiBuKTsKKworI2lmIEFPUlNNVUxfRkFTVEVSXzJBT1JTTFNICisgIG1wbl9zdWJtdWxfMSAocjUsIHI2LCBuM3AxLCAxMDI4KTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZWxzZQorICBET19tcG5fc3VibHNoX24gKHI1LCByNiwgbjNwMSwgMiwgd3NpKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisgIERPX21wbl9zdWJsc2hfbiAocjUsIHI2LCBuM3AxLDEwLCB3c2kpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyNlbmRpZgorCisgIG1wbl9zdWJtdWxfMSAocjcsIHI1LCBuM3AxLCAxMzAwKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjaWYgQU9SU01VTF9GQVNURVJfM0FPUlNMU0gKKyAgbXBuX3N1Ym11bF8xIChyNywgcjYsIG4zcDEsIDEwNTI2ODgpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyNlbHNlCisgIERPX21wbl9zdWJsc2hfbiAocjcsIHI2LCBuM3AxLCA0LCB3c2kpOyAvKiBjYW4gYmUgbmVnYXRpdmUgKi8KKyAgRE9fbXBuX3N1YmxzaF9uIChyNywgcjYsIG4zcDEsMTIsIHdzaSk7IC8qIGNhbiBiZSBuZWdhdGl2ZSAqLworICBET19tcG5fc3VibHNoX24gKHI3LCByNiwgbjNwMSwyMCwgd3NpKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZW5kaWYKKyAgbXBuX2RpdmV4YWN0X2J5MjU1eDE4ODUxMzMyNShyNywgcjcsIG4zcDEpOworCisgIG1wbl9zdWJtdWxfMSAocjUsIHI3LCBuM3AxLCAxMjU2NzU1NSk7IC8qIGNhbiBiZSBuZWdhdGl2ZSAqLworICAvKiBBIGRpdmlzaW9uIGJ5IDI4MzV4NjQgZm9sbG93cy4gV2FybmluZzogdGhlIG9wZXJhbmQgY2FuIGJlIG5lZ2F0aXZlISAqLworICBtcG5fZGl2ZXhhY3RfYnkyODM1eDY0KHI1LCByNSwgbjNwMSk7CisgIGlmICgocjVbbjNdICYgKEdNUF9OVU1CX01BWCA8PCAoR01QX05VTUJfQklUUy03KSkpICE9IDApCisgICAgcjVbbjNdIHw9IChHTVBfTlVNQl9NQVggPDwgKEdNUF9OVU1CX0JJVFMtNikpOworCisjaWYgQU9SU01VTF9GQVNURVJfQU9SU19BT1JTTFNICisgIG1wbl9zdWJtdWxfMSAocjYsIHI3LCBuM3AxLCA0MDk1KTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZWxzZQorICBtcG5fYWRkX24gKHI2LCByNiwgcjcsIG4zcDEpOyAvKiBjYW4gZ2l2ZSBhIGNhcnJ5ICovCisgIERPX21wbl9zdWJsc2hfbiAocjYsIHI3LCBuM3AxLCAxMiwgd3NpKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZW5kaWYKKyNpZiBBT1JTTVVMX0ZBU1RFUl8yQU9SU0xTSAorICBtcG5fYWRkbXVsXzEgKHI2LCByNSwgbjNwMSwgMjQwKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZWxzZQorICBET19tcG5fYWRkbHNoX24gKHI2LCByNSwgbjNwMSwgOCwgd3NpKTsgLyogY2FuIGdpdmUgYSBjYXJyeSAqLworICBET19tcG5fc3VibHNoX24gKHI2LCByNSwgbjNwMSwgNCwgd3NpKTsgLyogY2FuIGJlIG5lZ2F0aXZlICovCisjZW5kaWYKKyAgLyogQSBkaXZpc2lvbiBieSAyNTV4NCBmb2xsb3dzLiBXYXJuaW5nOiB0aGUgb3BlcmFuZCBjYW4gYmUgbmVnYXRpdmUhICovCisgIG1wbl9kaXZleGFjdF9ieTI1NXg0KHI2LCByNiwgbjNwMSk7CisgIGlmICgocjZbbjNdICYgKEdNUF9OVU1CX01BWCA8PCAoR01QX05VTUJfQklUUy0zKSkpICE9IDApCisgICAgcjZbbjNdIHw9IChHTVBfTlVNQl9NQVggPDwgKEdNUF9OVU1CX0JJVFMtMikpOworCisgIEFTU0VSVF9OT0NBUlJZKERPX21wbl9zdWJsc2hfbiAocjMsIHI0LCBuM3AxLCA3LCB3c2kpKTsKKworICBBU1NFUlRfTk9DQVJSWShET19tcG5fc3VibHNoX24gKHIyLCByNCwgbjNwMSwgMTMsIHdzaSkpOworICBBU1NFUlRfTk9DQVJSWShtcG5fc3VibXVsXzEgKHIyLCByMywgbjNwMSwgNDAwKSk7CisKKyAgLyogSWYgR01QX05VTUJfQklUUyA8IDQyIG5leHQgb3BlcmF0aW9ucyBvbiByMSBjYW4gZ2l2ZSBhIGNhcnJ5ISovCisgIERPX21wbl9zdWJsc2hfbiAocjEsIHI0LCBuM3AxLCAxOSwgd3NpKTsKKyAgbXBuX3N1Ym11bF8xIChyMSwgcjIsIG4zcDEsIDE0MjgpOworICBtcG5fc3VibXVsXzEgKHIxLCByMywgbjNwMSwgMTEyODk2KTsKKyAgbXBuX2RpdmV4YWN0X2J5MjU1eDE4MjcxMjkxNShyMSwgcjEsIG4zcDEpOworCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJtdWxfMSAocjIsIHIxLCBuM3AxLCAxNTE4MTQyNSkpOworICBtcG5fZGl2ZXhhY3RfYnk0MjUyNXgxNihyMiwgcjIsIG4zcDEpOworCisjaWYgQU9SU01VTF9GQVNURVJfQU9SU18yQU9SU0xTSAorICBBU1NFUlRfTk9DQVJSWShtcG5fc3VibXVsXzEgKHIzLCByMSwgbjNwMSwgMzk2OSkpOworI2Vsc2UKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3N1Yl9uIChyMywgcjMsIHIxLCBuM3AxKSk7CisgIEFTU0VSVF9OT0NBUlJZKERPX21wbl9hZGRsc2hfbiAocjMsIHIxLCBuM3AxLCA3LCB3c2kpKTsKKyAgQVNTRVJUX05PQ0FSUlkoRE9fbXBuX3N1YmxzaF9uIChyMywgcjEsIG4zcDEsIDEyLCB3c2kpKTsKKyNlbmRpZgorICBBU1NFUlRfTk9DQVJSWShtcG5fc3VibXVsXzEgKHIzLCByMiwgbjNwMSwgOTAwKSk7CisgIG1wbl9kaXZleGFjdF9ieTl4MTYocjMsIHIzLCBuM3AxKTsKKworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHI0LCByNCwgcjEsIG4zcDEpKTsKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3N1Yl9uIChyNCwgcjQsIHIzLCBuM3AxKSk7CisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJfbiAocjQsIHI0LCByMiwgbjNwMSkpOworCisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbgorICBtcG5fcnNoMWFkZF9uIChyNiwgcjIsIHI2LCBuM3AxKTsKKyAgcjYgW24zcDEgLSAxXSAmPSBHTVBfTlVNQl9NQVNLID4+IDE7CisjZWxzZQorICBtcG5fYWRkX24gKHI2LCByMiwgcjYsIG4zcDEpOworICBBU1NFUlRfTk9DQVJSWShtcG5fcnNoaWZ0KHI2LCByNiwgbjNwMSwgMSkpOworI2VuZGlmCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJfbiAocjIsIHIyLCByNiwgbjNwMSkpOworCisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbgorICBtcG5fcnNoMXN1Yl9uIChyNSwgcjMsIHI1LCBuM3AxKTsKKyAgcjUgW24zcDEgLSAxXSAmPSBHTVBfTlVNQl9NQVNLID4+IDE7CisjZWxzZQorICBtcG5fc3ViX24gKHI1LCByMywgcjUsIG4zcDEpOworICBBU1NFUlRfTk9DQVJSWShtcG5fcnNoaWZ0KHI1LCByNSwgbjNwMSwgMSkpOworI2VuZGlmCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJfbiAocjMsIHIzLCByNSwgbjNwMSkpOworCisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbgorICBtcG5fcnNoMWFkZF9uIChyNywgcjEsIHI3LCBuM3AxKTsKKyAgcjcgW24zcDEgLSAxXSAmPSBHTVBfTlVNQl9NQVNLID4+IDE7CisjZWxzZQorICBtcG5fYWRkX24gKHI3LCByMSwgcjcsIG4zcDEpOworICBBU1NFUlRfTk9DQVJSWShtcG5fcnNoaWZ0KHI3LCByNywgbjNwMSwgMSkpOworI2VuZGlmCisgIEFTU0VSVF9OT0NBUlJZKG1wbl9zdWJfbiAocjEsIHIxLCByNywgbjNwMSkpOworCisgIC8qIGxhc3QgaW50ZXJwb2xhdGlvbiBzdGVwcy4uLiAqLworICAvKiAuLi4gY291bGQgYmUgbWl4ZWQgd2l0aCByZWNvbXBvc2l0aW9uCisJfHxILXI3fE0tcjd8TC1yN3wgICB8fEgtcjV8TS1yNXxMLXI1fAorICAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiByZWNvbXBvc2l0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qCisgICAgcHBbXSBwcmlvciB0byBvcGVyYXRpb25zOgorICAgIHxNIHIwfEwgcjB8X19ffHxIIHIyfE0gcjJ8TCByMnxfX198fEggcjR8TSByNHxMIHI0fF9fX3x8SCByNnxNIHI2fEwgcjZ8X19fX3xIX3I4fEwgcjh8cHAKKworICAgIHN1bW1hdGlvbiBzY2hlbWUgZm9yIHJlbWFpbmluZyBvcGVyYXRpb25zOgorICAgIHxfXzE2fG5fMTV8bl8xNHxuXzEzfG5fMTJ8bl8xMXxuXzEwfG5fXzl8bl9fOHxuX183fG5fXzZ8bl9fNXxuX180fG5fXzN8bl9fMnxuX19ffG5fX198cHAKKyAgICB8TSByMHxMIHIwfF9fX3x8SCByMnxNIHIyfEwgcjJ8X19ffHxIIHI0fE0gcjR8TCByNHxfX198fEggcjZ8TSByNnxMIHI2fF9fX198SF9yOHxMIHI4fHBwCisJfHxIIHIxfE0gcjF8TCByMXwgICB8fEggcjN8TSByM3xMIHIzfCAgIHx8SF9yNXxNX3I1fExfcjV8ICAgfHxIIHI3fE0gcjd8TCByN3wKKyAgKi8KKworICBjeSA9IG1wbl9hZGRfbiAocHAgKyBuLCBwcCArIG4sIHI3LCBuKTsKKyAgY3kgPSBtcG5fYWRkXzEgKHBwICsgMiAqIG4sIHI3ICsgbiwgbiwgY3kpOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbmMKKyAgY3kgPSByN1tuM10gKyBtcG5fYWRkX25jKHBwICsgbjMsIHBwICsgbjMsIHI3ICsgMiAqIG4sIG4sIGN5KTsKKyNlbHNlCisgIE1QTl9JTkNSX1UgKHI3ICsgMiAqIG4sIG4gKyAxLCBjeSk7CisgIGN5ID0gcjdbbjNdICsgbXBuX2FkZF9uIChwcCArIG4zLCBwcCArIG4zLCByNyArIDIgKiBuLCBuKTsKKyNlbmRpZgorICBNUE5fSU5DUl9VIChwcCArIDQgKiBuLCAyICogbiArIDEsIGN5KTsKKworICBwcFsyICogbjNdKz0gbXBuX2FkZF9uIChwcCArIDUgKiBuLCBwcCArIDUgKiBuLCByNSwgbik7CisgIGN5ID0gbXBuX2FkZF8xIChwcCArIDIgKiBuMywgcjUgKyBuLCBuLCBwcFsyICogbjNdKTsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25jCisgIGN5ID0gcjVbbjNdICsgbXBuX2FkZF9uYyhwcCArIDcgKiBuLCBwcCArIDcgKiBuLCByNSArIDIgKiBuLCBuLCBjeSk7CisjZWxzZQorICBNUE5fSU5DUl9VIChyNSArIDIgKiBuLCBuICsgMSwgY3kpOworICBjeSA9IHI1W24zXSArIG1wbl9hZGRfbiAocHAgKyA3ICogbiwgcHAgKyA3ICogbiwgcjUgKyAyICogbiwgbik7CisjZW5kaWYKKyAgTVBOX0lOQ1JfVSAocHAgKyA4ICogbiwgMiAqIG4gKyAxLCBjeSk7CisKKyAgcHBbMTAgKiBuXSs9IG1wbl9hZGRfbiAocHAgKyA5ICogbiwgcHAgKyA5ICogbiwgcjMsIG4pOworICBjeSA9IG1wbl9hZGRfMSAocHAgKyAxMCAqIG4sIHIzICsgbiwgbiwgcHBbMTAgKiBuXSk7CisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworICBjeSA9IHIzW24zXSArIG1wbl9hZGRfbmMocHAgKzExICogbiwgcHAgKzExICogbiwgcjMgKyAyICogbiwgbiwgY3kpOworI2Vsc2UKKyAgTVBOX0lOQ1JfVSAocjMgKyAyICogbiwgbiArIDEsIGN5KTsKKyAgY3kgPSByM1tuM10gKyBtcG5fYWRkX24gKHBwICsxMSAqIG4sIHBwICsxMSAqIG4sIHIzICsgMiAqIG4sIG4pOworI2VuZGlmCisgIE1QTl9JTkNSX1UgKHBwICsxMiAqIG4sIDIgKiBuICsgMSwgY3kpOworCisgIHBwWzE0ICogbl0rPW1wbl9hZGRfbiAocHAgKzEzICogbiwgcHAgKzEzICogbiwgcjEsIG4pOworICBpZiAoIGhhbGYgKSB7CisgICAgY3kgPSBtcG5fYWRkXzEgKHBwICsgMTQgKiBuLCByMSArIG4sIG4sIHBwWzE0ICogbl0pOworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbmMKKyAgICBpZihMSUtFTFkoc3B0ID4gbikpIHsKKyAgICAgIGN5ID0gcjFbbjNdICsgbXBuX2FkZF9uYyhwcCArIDE1ICogbiwgcHAgKyAxNSAqIG4sIHIxICsgMiAqIG4sIG4sIGN5KTsKKyAgICAgIE1QTl9JTkNSX1UgKHBwICsgMTYgKiBuLCBzcHQgLSBuLCBjeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9OT0NBUlJZKG1wbl9hZGRfbmMocHAgKyAxNSAqIG4sIHBwICsgMTUgKiBuLCByMSArIDIgKiBuLCBzcHQsIGN5KSk7CisgICAgfQorI2Vsc2UKKyAgICBNUE5fSU5DUl9VIChyMSArIDIgKiBuLCBuICsgMSwgY3kpOworICAgIGlmKExJS0VMWShzcHQgPiBuKSkgeworICAgICAgY3kgPSByMVtuM10gKyBtcG5fYWRkX24gKHBwICsgMTUgKiBuLCBwcCArIDE1ICogbiwgcjEgKyAyICogbiwgbik7CisgICAgICBNUE5fSU5DUl9VIChwcCArIDE2ICogbiwgc3B0IC0gbiwgY3kpOworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlRfTk9DQVJSWShtcG5fYWRkX24gKHBwICsgMTUgKiBuLCBwcCArIDE1ICogbiwgcjEgKyAyICogbiwgc3B0KSk7CisgICAgfQorI2VuZGlmCisgIH0gZWxzZSB7CisgICAgQVNTRVJUX05PQ0FSUlkobXBuX2FkZF8xIChwcCArIDE0ICogbiwgcjEgKyBuLCBzcHQsIHBwWzE0ICogbl0pKTsKKyAgfQorCisjdW5kZWYgICByMAorI3VuZGVmICAgcjIKKyN1bmRlZiAgIHI0CisjdW5kZWYgICByNgorfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdG9vbV9pbnRlcnBvbGF0ZV81cHRzLmMgYi9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZhYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL2dlbmVyaWMvdG9vbV9pbnRlcnBvbGF0ZV81cHRzLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qIG1wbl90b29tX2ludGVycG9sYXRlXzVwdHMgLS0gSW50ZXJwb2xhdGUgZm9yIHRvb20zLCAzMywgNDIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBSb2JlcnQgSGFybGV5LgorICAgSW1wcm92ZW1lbnRzIGJ5IFBhdWwgWmltbWVybWFubiBhbmQgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwMC0yMDAzLCAyMDA1LTIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcG5fdG9vbV9pbnRlcnBvbGF0ZV81cHRzIChtcF9wdHIgYywgbXBfcHRyIHYyLCBtcF9wdHIgdm0xLAorCQkJICAgbXBfc2l6ZV90IGssIG1wX3NpemVfdCB0d29yLCBpbnQgc2EsCisJCQkgICBtcF9saW1iX3QgdmluZjApCit7CisgIG1wX2xpbWJfdCBjeSwgc2F2ZWQ7CisgIG1wX3NpemVfdCB0d29rOworICBtcF9zaXplX3Qga2sxOworICBtcF9wdHIgYzEsIHYxLCBjMywgdmluZjsKKworICB0d29rID0gayArIGs7CisgIGtrMSA9IHR3b2sgKyAxOworCisgIGMxID0gYyAgKyBrOworICB2MSA9IGMxICsgazsKKyAgYzMgPSB2MSArIGs7CisgIHZpbmYgPSBjMyArIGs7CisKKyNkZWZpbmUgdjAgKGMpCisgIC8qICgxKSB2MiA8LSB2Mi12bTEgPCB2Mit8dm0xfCwgICAgICAgKDE2IDggNCAyIDEpIC0gKDEgLTEgMSAtMSAgMSkgPQorICAgICB0aHVzIDAgPD0gdjIgPCA1MCpCXigyaykgPCAyXjYqQl4oMmspICAgICAgICAgICAgICgxNSA5IDMgIDMgIDApCisgICovCisgIGlmIChzYSkKKyAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF9uICh2MiwgdjIsIHZtMSwga2sxKSk7CisgIGVsc2UKKyAgICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uICh2MiwgdjIsIHZtMSwga2sxKSk7CisKKyAgLyoge2MsMmt9IHtjKzJrLDJrKzF9IHtjKzRrKzEsMnItMX0ge3QsMmsrMX0ge3QrMmsrMSwyaysxfSB7dCs0aysyLDJyfQorICAgICAgIHYwICAgICAgIHYxICAgICAgIGhpKHZpbmYpICAgICAgIHx2bTF8ICAgICB2Mi12bTEgICAgICBFTVBUWSAqLworCisgIEFTU0VSVF9OT0NBUlJZIChtcG5fZGl2ZXhhY3RfYnkzICh2MiwgdjIsIGtrMSkpOyAgICAvKiB2MiA8LSB2MiAvIDMgKi8KKwkJCQkJCSAgICAgIC8qICg1IDMgMSAxIDApKi8KKworICAvKiB7Yywya30ge2MrMmssMmsrMX0ge2MrNGsrMSwyci0xfSB7dCwyaysxfSB7dCsyaysxLDJrKzF9IHt0KzRrKzIsMnJ9CisgICAgICAgdjAgICAgICAgdjEgICAgICBoaSh2aW5mKSAgICAgICB8dm0xfCAgICAgKHYyLXZtMSkvMyAgICBFTVBUWSAqLworCisgIC8qICgyKSB2bTEgPC0gdG0xIDo9ICh2MSAtIHZtMSkgLyAyICBbKDEgMSAxIDEgMSkgLSAoMSAtMSAxIC0xIDEpXSAvIDIgPQorICAgICB0bTEgPj0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgIDEgMCAgMSAwKQorICAgICBObyBjYXJyeSBjb21lcyBvdXQgZnJvbSB7djEsIGtrMX0gKy8tIHt2bTEsIGtrMX0sCisgICAgIGFuZCB0aGUgZGl2aXNpb24gYnkgdHdvIGlzIGV4YWN0LgorICAgICBJZiAoc2EhPTApIHRoZSBzaWduIG9mIHZtMSBpcyBuZWdhdGl2ZSAqLworICBpZiAoc2EpCisgICAgeworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgICAgIG1wbl9yc2gxYWRkX24gKHZtMSwgdjEsIHZtMSwga2sxKTsKKyNlbHNlCisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF9uICh2bTEsIHYxLCB2bTEsIGtrMSkpOworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9yc2hpZnQgKHZtMSwgdm0xLCBrazEsIDEpKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisgICAgICBtcG5fcnNoMXN1Yl9uICh2bTEsIHYxLCB2bTEsIGtrMSk7CisjZWxzZQorICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWJfbiAodm0xLCB2MSwgdm0xLCBrazEpKTsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fcnNoaWZ0ICh2bTEsIHZtMSwga2sxLCAxKSk7CisjZW5kaWYKKyAgICB9CisKKyAgLyoge2MsMmt9IHtjKzJrLDJrKzF9IHtjKzRrKzEsMnItMX0ge3QsMmsrMX0ge3QrMmsrMSwyaysxfSB7dCs0aysyLDJyfQorICAgICAgIHYwICAgICAgIHYxICAgICAgICBoaSh2aW5mKSAgICAgICB0bTEgICAgICh2Mi12bTEpLzMgICAgRU1QVFkgKi8KKworICAvKiAoMykgdjEgPC0gdDEgOj0gdjEgLSB2MCAgICAoMSAxIDEgMSAxKSAtICgwIDAgMCAwIDEpID0gKDEgMSAxIDEgMCkKKyAgICAgdDEgPj0gMAorICAqLworICB2aW5mWzBdIC09IG1wbl9zdWJfbiAodjEsIHYxLCBjLCB0d29rKTsKKworICAvKiB7Yywya30ge2MrMmssMmsrMX0ge2MrNGsrMSwyci0xfSB7dCwyaysxfSB7dCsyaysxLDJrKzF9IHt0KzRrKzIsMnJ9CisgICAgICAgdjAgICAgIHYxLXYwICAgICAgICBoaSh2aW5mKSAgICAgICB0bTEgICAgICh2Mi12bTEpLzMgICAgRU1QVFkgKi8KKworICAvKiAoNCkgdjIgPC0gdDIgOj0gKCh2Mi12bTEpLzMtdDEpLzIgPSAodjItdm0xLTMqdDEpLzYKKyAgICAgdDIgPj0gMCAgICAgICAgICAgICAgICAgIFsoNSAzIDEgMSAwKSAtICgxIDEgMSAxIDApXS8yID0gKDIgMSAwIDAgMCkKKyAgKi8KKyNpZmRlZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisgIG1wbl9yc2gxc3ViX24gKHYyLCB2MiwgdjEsIGtrMSk7CisjZWxzZQorICBBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uICh2MiwgdjIsIHYxLCBrazEpKTsKKyAgQVNTRVJUX05PQ0FSUlkgKG1wbl9yc2hpZnQgKHYyLCB2Miwga2sxLCAxKSk7CisjZW5kaWYKKworICAvKiB7Yywya30ge2MrMmssMmsrMX0ge2MrNGsrMSwyci0xfSB7dCwyaysxfSB7dCsyaysxLDJrKzF9IHt0KzRrKzIsMnJ9CisgICAgICAgdjAgICAgIHYxLXYwICAgICAgICBoaSh2aW5mKSAgICAgdG0xICAgICh2Mi12bTEtM3QxKS82ICAgIEVNUFRZICovCisKKyAgLyogKDUpIHYxIDwtIHQxLXRtMSAgICAgICAgICAgKDEgMSAxIDEgMCkgLSAoMCAxIDAgMSAwKSA9ICgxIDAgMSAwIDApCisgICAgIHJlc3VsdCBpcyB2MSA+PSAwCisgICovCisgIEFTU0VSVF9OT0NBUlJZIChtcG5fc3ViX24gKHYxLCB2MSwgdm0xLCBrazEpKTsKKworICAvKiBXZSBkbyBub3QgbmVlZCB0byByZWFkIHRoZSB2YWx1ZSBpbiB2bTEsIHNvIHdlIGFkZCBpdCBpbiB7YytrLCAuLi59ICovCisgIGN5ID0gbXBuX2FkZF9uIChjMSwgYzEsIHZtMSwga2sxKTsKKyAgTVBOX0lOQ1JfVSAoYzMgKyAxLCB0d29yICsgayAtIDEsIGN5KTsgLyogMm4tKDNrKzEpID0gMnIray0xICovCisgIC8qIE1lbW9yeSBhbGxvY2F0ZWQgZm9yIHZtMSBpcyBub3cgZnJlZSwgaXQgY2FuIGJlIHJlY3ljbGVkIC4uLiovCisKKyAgLyogKDYpIHYyIDwtIHYyIC0gMip2aW5mLCAgICAgKDIgMSAwIDAgMCkgLSAyKigxIDAgMCAwIDApID0gKDAgMSAwIDAgMCkKKyAgICAgcmVzdWx0IGlzIHYyID49IDAgKi8KKyAgc2F2ZWQgPSB2aW5mWzBdOyAgICAgICAvKiBSZW1lbWJlciB2MSdzIGhpZ2hlc3QgYnl0ZSAod2lsbCBiZSBvdmVyd3JpdHRlbikuICovCisgIHZpbmZbMF0gPSB2aW5mMDsgICAgICAgLyogU2V0IHRoZSByaWdodCB2YWx1ZSBmb3IgdmluZjAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2gxX25faXAxCisgIGN5ID0gbXBuX3N1YmxzaDFfbl9pcDEgKHYyLCB2aW5mLCB0d29yKTsKKyNlbHNlCisgIC8qIE92ZXJ3cml0ZSB1bnVzZWQgdm0xICovCisgIGN5ID0gbXBuX2xzaGlmdCAodm0xLCB2aW5mLCB0d29yLCAxKTsKKyAgY3kgKz0gbXBuX3N1Yl9uICh2MiwgdjIsIHZtMSwgdHdvcik7CisjZW5kaWYKKyAgTVBOX0RFQ1JfVSAodjIgKyB0d29yLCBrazEgLSB0d29yLCBjeSk7CisKKyAgLyogQ3VycmVudCBtYXRyaXggaXMKKyAgICAgWzEgMCAwIDAgMDsgdmluZgorICAgICAgMCAxIDAgMCAwOyB2MgorICAgICAgMSAwIDEgMCAwOyB2MQorICAgICAgMCAxIDAgMSAwOyB2bTEKKyAgICAgIDAgMCAwIDAgMV0gdjAKKyAgICAgU29tZSB2YWx1ZXMgYWxyZWFkeSBhcmUgaW4tcGxhY2UgKHdlIGFkZGVkIHZtMSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbikKKyAgICAgfCB2aW5mfCAgdjEgfCAgdjAgfAorCSAgICAgIHwgdm0xIHwKKyAgICAgT25lIHN0aWxsIGlzIGluIGEgc2VwYXJhdGVkIGFyZWEKKwl8ICt2MiB8CisgICAgIFdlIGhhdmUgdG8gY29tcHV0ZSB2MS09dmluZjsgdm0xIC09IHYyLAorCSAgIHwtdmluZnwKKwkgICAgICB8IC12MiB8CisgICAgIENhcmVmdWxseSByZW9yZGVyaW5nIG9wZXJhdGlvbnMgd2UgY2FuIGF2b2lkIHRvIGNvbXB1dGUgdHdpY2UgdGhlIHN1bQorICAgICBvZiB0aGUgaGlnaCBoYWxmIG9mIHYyIHBsdXMgdGhlIGxvdyBoYWxmIG9mIHZpbmYuCisgICovCisKKyAgLyogQWRkIHRoZSBoaWdoIGhhbGYgb2YgdDIgaW4ge3ZpbmZ9ICovCisgIGlmICggTElLRUxZKHR3b3IgPiBrICsgMSkgKSB7IC8qIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3cgICovCisgICAgY3kgPSBtcG5fYWRkX24gKHZpbmYsIHZpbmYsIHYyICsgaywgayArIDEpOworICAgIE1QTl9JTkNSX1UgKGMzICsga2sxLCB0d29yIC0gayAtIDEsIGN5KTsgLyogMm4tKDVrKzEpID0gMnItay0xICovCisgIH0gZWxzZSB7IC8qIHRyaWdnZXJlZCBvbmx5IGJ5IHZlcnkgdW5iYWxhbmNlZCBjYXNlcyBsaWtlCisJICAgICAgKGsraysoay0yKSl4KGsraysxKSAsIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRvb20zMiAqLworICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkX24gKHZpbmYsIHZpbmYsIHYyICsgaywgdHdvcikpOworICB9CisgIC8qICg3KSB2MSA8LSB2MSAtIHZpbmYsICAgICAgICgxIDAgMSAwIDApIC0gKDEgMCAwIDAgMCkgPSAoMCAwIDEgMCAwKQorICAgICByZXN1bHQgaXMgPj0gMCAqLworICAvKiBTaWRlIGVmZmVjdDogd2UgYWxzbyBzdWJ0cmFjdGVkIChoaWdoIGhhbGYpIHZtMSAtPSB2MiAqLworICBjeSA9IG1wbl9zdWJfbiAodjEsIHYxLCB2aW5mLCB0d29yKTsgICAgICAgICAgLyogdmluZiBpcyBhdCBtb3N0IHR3b3IgbG9uZy4gICovCisgIHZpbmYwID0gdmluZlswXTsgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGFnYWluIHRoZSByaWdodCB2YWx1ZSBmb3IgdmluZjAgKi8KKyAgdmluZlswXSA9IHNhdmVkOworICBNUE5fREVDUl9VICh2MSArIHR3b3IsIGtrMSAtIHR3b3IsIGN5KTsgICAgICAgLyogVHJlYXQgdGhlIGxhc3QgYnl0ZXMuICAgICAgICovCisKKyAgLyogKDgpIHZtMSA8LSB2bTEtdjIgICAgICAgICAgKDAgMSAwIDEgMCkgLSAoMCAxIDAgMCAwKSA9ICgwIDAgMCAxIDApCisgICAgIE9wZXJhdGUgb25seSBvbiB0aGUgbG93IGhhbGYuCisgICovCisgIGN5ID0gbXBuX3N1Yl9uIChjMSwgYzEsIHYyLCBrKTsKKyAgTVBOX0RFQ1JfVSAodjEsIGtrMSwgY3kpOworCisgIC8qKioqKioqKioqKioqKioqKioqKiogQmVnaW5uaW5nIHRoZSBmaW5hbCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIE1vc3Qgb2YgdGhlIHJlY29tcG9zaXRpb24gd2FzIGRvbmUgKi8KKworICAvKiBhZGQgdDIgaW4ge2MrM2ssIC4uLn0sIGJ1dCBvbmx5IHRoZSBsb3cgaGFsZiAqLworICBjeSA9IG1wbl9hZGRfbiAoYzMsIGMzLCB2Miwgayk7CisgIHZpbmZbMF0gKz0gY3k7CisgIEFTU0VSVCh2aW5mWzBdID49IGN5KTsgLyogTm8gY2FycnkgKi8KKyAgTVBOX0lOQ1JfVSAodmluZiwgdHdvciwgdmluZjApOyAvKiBBZGQgdmluZjAsIHByb3BhZ2F0ZSBjYXJyeS4gKi8KKworI3VuZGVmIHYwCit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzZwdHMuYyBiL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfNnB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjM2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzZwdHMuYwpAQCAtMCwwICsxLDI0MSBAQAorLyogbXBuX3Rvb21faW50ZXJwb2xhdGVfNnB0cyAtLSBJbnRlcnBvbGF0ZSBmb3IgdG9vbTQzLCA1MgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNkZWZpbmUgQklOVkVSVF8zIE1PRExJTUJfSU5WRVJTRV8zCisKKy8qIEZvciBvZGQgZGl2aXNvcnMsIG1wbl9kaXZleGFjdF8xIHdvcmtzIGZpbmUgd2l0aCB0d28ncyBjb21wbGVtZW50LiAqLworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkzCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkzKGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsMyxCSU5WRVJUXzMsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsMykKKyNlbmRpZgorI2VuZGlmCisKKy8qIEludGVycG9sYXRpb24gZm9yIFRvb20tMy41LCB1c2luZyB0aGUgZXZhbHVhdGlvbiBwb2ludHM6IGluZmluaXR5LAorICAgMSwgLTEsIDIsIC0yLiBNb3JlIHByZWNpc2VseSwgd2Ugd2FudCB0byBjb21wdXRlCisgICBmKDJeKEdNUF9OVU1CX0JJVFMgKiBuKSkgZm9yIGEgcG9seW5vbWlhbCBmIG9mIGRlZ3JlZSA1LCBnaXZlbiB0aGUKKyAgIHNpeCB2YWx1ZXMKKworICAgICB3NSA9IGYoMCksCisgICAgIHc0ID0gZigtMSksCisgICAgIHczID0gZigxKQorICAgICB3MiA9IGYoLTIpLAorICAgICB3MSA9IGYoMiksCisgICAgIHcwID0gbGltaXQgYXQgaW5maW5pdHkgb2YgZih4KSAvIHheNSwKKworICAgVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4ge3BwLCA1Km4gKyB3MG59LiBBdCBlbnRyeSwgdzUgaXMgc3RvcmVkIGF0CisgICB7cHAsIDJufSwgdzMgaXMgc3RvcmVkIGF0IHtwcCArIDJuLCAybisxfSwgYW5kIHcwIGlzIHN0b3JlZCBhdAorICAge3BwICsgNW4sIHcwbn0uIFRoZSBvdGhlciB2YWx1ZXMgYXJlIDJuICsgMSBsaW1icyBlYWNoICh3aXRoIG1vc3QKKyAgIHNpZ25pZmljYW50IGxpbWJzIHNtYWxsKS4gZigtMSkgYW5kIGYoLTIpIG1heSBiZSBuZWdhdGl2ZSwgc2lnbnMKKyAgIGRldGVybWluZWQgYnkgdGhlIGZsYWcgYml0cy4gQWxsIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBwb3NpdGl2ZS4KKyAgIElucHV0cyBhcmUgZGVzdHJveWVkLgorCisgICBJbnRlcnBvbGF0aW9uIHNlcXVlbmNlIHdhcyB0YWtlbiBmcm9tIHRoZSBwYXBlcjogIkludGVnZXIgYW5kCisgICBQb2x5bm9taWFsIE11bHRpcGxpY2F0aW9uOiBUb3dhcmRzIE9wdGltYWwgVG9vbS1Db29rIE1hdHJpY2VzIi4KKyAgIFNvbWUgc2xpZ2h0IHZhcmlhdGlvbnMgd2VyZSBpbnRyb2R1Y2VkOiBhZGFwdGF0aW9uIHRvICJnbXAKKyAgIGluc3RydWN0aW9uIHNldCIsIGFuZCBhIGZpbmFsIHNhdmluZyBvZiBhbiBvcGVyYXRpb24gYnkgaW50ZXJsYWNpbmcKKyAgIGludGVycG9sYXRpb24gYW5kIHJlY29tcG9zaXRpb24gcGhhc2VzLgorKi8KKwordm9pZAorbXBuX3Rvb21faW50ZXJwb2xhdGVfNnB0cyAobXBfcHRyIHBwLCBtcF9zaXplX3QgbiwgZW51bSB0b29tNl9mbGFncyBmbGFncywKKwkJCSAgIG1wX3B0ciB3NCwgbXBfcHRyIHcyLCBtcF9wdHIgdzEsCisJCQkgICBtcF9zaXplX3QgdzBuKQoreworICBtcF9saW1iX3QgY3k7CisgIC8qIGN5NiBjYW4gYmUgc3RvcmVkIGluIHcxWzIqbl0sIGN5NCBpbiB3NFswXSwgZW1iYW5rbWVudCBpbiB3MlswXSAqLworICBtcF9saW1iX3QgY3k0LCBjeTYsIGVtYmFua21lbnQ7CisKKyAgQVNTRVJUKCBuID4gMCApOworICBBU1NFUlQoIDIqbiA+PSB3MG4gJiYgdzBuID4gMCApOworCisjZGVmaW5lIHc1ICBwcAkJCQkJLyogMm4gICAqLworI2RlZmluZSB3MyAgKHBwICsgMiAqIG4pCQkJLyogMm4rMSAqLworI2RlZmluZSB3MCAgKHBwICsgNSAqIG4pCQkJLyogdzBuICAqLworCisgIC8qIEludGVycG9sYXRlIHdpdGggc2VxdWVuY2U6CisgICAgIFcyID0oVzEgLSBXMik+PjIKKyAgICAgVzEgPShXMSAtIFc1KT4+MQorICAgICBXMSA9KFcxIC0gVzIpPj4xCisgICAgIFc0ID0oVzMgLSBXNCk+PjEKKyAgICAgVzIgPShXMiAtIFc0KS8zCisgICAgIFczID0gVzMgLSBXNCAtIFc1CisgICAgIFcxID0oVzEgLSBXMykvMworICAgICAvLyBMYXN0IHN0ZXBzIGFyZSBtaXhlZCB3aXRoIHJlY29tcG9zaXRpb24uLi4KKyAgICAgVzIgPSBXMiAtIFcwPDwyCisgICAgIFc0ID0gVzQgLSBXMgorICAgICBXMyA9IFczIC0gVzEKKyAgICAgVzIgPSBXMiAtIFcwCisgICovCisKKyAgLyogVzIgPShXMSAtIFcyKT4+MiAqLworICBpZiAoZmxhZ3MgJiB0b29tNl92bTJfbmVnKQorICAgIG1wbl9hZGRfbiAodzIsIHcxLCB3MiwgMiAqIG4gKyAxKTsKKyAgZWxzZQorICAgIG1wbl9zdWJfbiAodzIsIHcxLCB3MiwgMiAqIG4gKyAxKTsKKyAgbXBuX3JzaGlmdCAodzIsIHcyLCAyICogbiArIDEsIDIpOworCisgIC8qIFcxID0oVzEgLSBXNSk+PjEgKi8KKyAgdzFbMipuXSAtPSBtcG5fc3ViX24gKHcxLCB3MSwgdzUsIDIqbik7CisgIG1wbl9yc2hpZnQgKHcxLCB3MSwgMiAqIG4gKyAxLCAxKTsKKworICAvKiBXMSA9KFcxIC0gVzIpPj4xICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbgorICBtcG5fcnNoMXN1Yl9uICh3MSwgdzEsIHcyLCAyICogbiArIDEpOworI2Vsc2UKKyAgbXBuX3N1Yl9uICh3MSwgdzEsIHcyLCAyICogbiArIDEpOworICBtcG5fcnNoaWZ0ICh3MSwgdzEsIDIgKiBuICsgMSwgMSk7CisjZW5kaWYKKworICAvKiBXNCA9KFczIC0gVzQpPj4xICovCisgIGlmIChmbGFncyAmIHRvb202X3ZtMV9uZWcpCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgICAgIG1wbl9yc2gxYWRkX24gKHc0LCB3MywgdzQsIDIgKiBuICsgMSk7CisjZWxzZQorICAgICAgbXBuX2FkZF9uICh3NCwgdzMsIHc0LCAyICogbiArIDEpOworICAgICAgbXBuX3JzaGlmdCAodzQsIHc0LCAyICogbiArIDEsIDEpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxc3ViX24KKyAgICAgIG1wbl9yc2gxc3ViX24gKHc0LCB3MywgdzQsIDIgKiBuICsgMSk7CisjZWxzZQorICAgICAgbXBuX3N1Yl9uICh3NCwgdzMsIHc0LCAyICogbiArIDEpOworICAgICAgbXBuX3JzaGlmdCAodzQsIHc0LCAyICogbiArIDEsIDEpOworI2VuZGlmCisgICAgfQorCisgIC8qIFcyID0oVzIgLSBXNCkvMyAqLworICBtcG5fc3ViX24gKHcyLCB3MiwgdzQsIDIgKiBuICsgMSk7CisgIG1wbl9kaXZleGFjdF9ieTMgKHcyLCB3MiwgMiAqIG4gKyAxKTsKKworICAvKiBXMyA9IFczIC0gVzQgLSBXNSAqLworICBtcG5fc3ViX24gKHczLCB3MywgdzQsIDIgKiBuICsgMSk7CisgIHczWzIgKiBuXSAtPSBtcG5fc3ViX24gKHczLCB3MywgdzUsIDIgKiBuKTsKKworICAvKiBXMSA9KFcxIC0gVzMpLzMgKi8KKyAgbXBuX3N1Yl9uICh3MSwgdzEsIHczLCAyICogbiArIDEpOworICBtcG5fZGl2ZXhhY3RfYnkzICh3MSwgdzEsIDIgKiBuICsgMSk7CisKKyAgLyoKKyAgICBbMSAwIDAgMCAwIDA7CisgICAgIDAgMSAwIDAgMCAwOworICAgICAxIDAgMSAwIDAgMDsKKyAgICAgMCAxIDAgMSAwIDA7CisgICAgIDEgMCAxIDAgMSAwOworICAgICAwIDAgMCAwIDAgMV0KKworICAgIHBwW10gcHJpb3IgdG8gb3BlcmF0aW9uczoKKyAgICAgfF9IIHcwX198X0wgdzBfX3xfX19fX198fF9IIHczX198X0wgdzNfX3xfSCB3NV9ffF9MIHc1X198CisKKyAgICBzdW1tYXRpb24gc2NoZW1lIGZvciByZW1haW5pbmcgb3BlcmF0aW9uczoKKyAgICAgfF9fX19fX19fX19fX19fNXxuX19fX180fG5fX19fXzN8bl9fX19fMnxuX19fX19ffG5fX19fX198cHAKKyAgICAgfF9IIHcwX198X0wgdzBfX3xfX19fX198fF9IIHczX198X0wgdzNfX3xfSCB3NV9ffF9MIHc1X198CisJCQkJICAgIHx8IEggdzQgIHwgTCB3NCAgfAorCQkgICAgfHwgSCB3MiAgfCBMIHcyICB8CisJICAgIHx8IEggdzEgIHwgTCB3MSAgfAorCQkJICAgIHx8LUggdzEgIHwtTCB3MSAgfAorCQkgICAgIHwtSCB3MCAgfC1MIHcwIHx8LUggdzIgIHwtTCB3MiAgfAorICAqLworICBjeSA9IG1wbl9hZGRfbiAocHAgKyBuLCBwcCArIG4sIHc0LCAyICogbiArIDEpOworICBNUE5fSU5DUl9VIChwcCArIDMgKiBuICsgMSwgbiwgY3kpOworCisgIC8qIFcyIC09IFcwPDwyICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uIHx8IEhBVkVfTkFUSVZFX21wbl9zdWJsc2gyX25faXAxCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbl9pcDEKKyAgY3kgPSBtcG5fc3VibHNoMl9uX2lwMSAodzIsIHcwLCB3MG4pOworI2Vsc2UKKyAgY3kgPSBtcG5fc3VibHNoX24gKHcyLCB3MiwgdzAsIHcwbiwgMik7CisjZW5kaWYKKyNlbHNlCisgIC8qIHtXNCwyKm4rMX0gaXMgbm93IGZyZWUgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbi4gKi8KKyAgY3kgPSBtcG5fbHNoaWZ0KHc0LCB3MCwgdzBuLCAyKTsKKyAgY3krPSBtcG5fc3ViX24odzIsIHcyLCB3NCwgdzBuKTsKKyNlbmRpZgorICBNUE5fREVDUl9VICh3MiArIHcwbiwgMiAqIG4gKyAxIC0gdzBuLCBjeSk7CisKKyAgLyogVzRMID0gVzRMIC0gVzJMICovCisgIGN5ID0gbXBuX3N1Yl9uIChwcCArIG4sIHBwICsgbiwgdzIsIG4pOworICBNUE5fREVDUl9VICh3MywgMiAqIG4gKyAxLCBjeSk7CisKKyAgLyogVzNIID0gVzNIICsgVzJMICovCisgIGN5NCA9IHczWzIgKiBuXSArIG1wbl9hZGRfbiAocHAgKyAzICogbiwgcHAgKyAzICogbiwgdzIsIG4pOworICAvKiBXMUwgKyBXMkggKi8KKyAgY3kgPSB3MlsyICogbl0gKyBtcG5fYWRkX24gKHBwICsgNCAqIG4sIHcxLCB3MiArIG4sIG4pOworICBNUE5fSU5DUl9VICh3MSArIG4sIG4gKyAxLCBjeSk7CisKKyAgLyogVzAgPSBXMCArIFcxSCAqLworICBpZiAoTElLRUxZICh3MG4gPiBuKSkKKyAgICBjeTYgPSB3MVsyICogbl0gKyBtcG5fYWRkX24gKHcwLCB3MCwgdzEgKyBuLCBuKTsKKyAgZWxzZQorICAgIGN5NiA9IG1wbl9hZGRfbiAodzAsIHcwLCB3MSArIG4sIHcwbik7CisKKyAgLyoKKyAgICBzdW1tYXRpb24gc2NoZW1lIGZvciB0aGUgbmV4dCBvcGVyYXRpb246CisgICAgIHwuLi5fX19fNXxuX19fX180fG5fX19fXzN8bl9fX19fMnxuX19fX19ffG5fX19fX198cHAKKyAgICAgfC4uLncwX19ffF93MV93Ml98X0ggdzNfX3xfTCB3M19ffF9IIHc1X198X0wgdzVfX3wKKwkJICAgICAuLi4tdzBfX198LXcxX3cyIHwKKyAgKi8KKyAgLyogaWYoTElLRUxZKHcwbj5uKSkgdGhlIHR3byBvcGVyYW5kcyBiZWxvdyBETyBvdmVybGFwISAqLworICBjeSA9IG1wbl9zdWJfbiAocHAgKyAyICogbiwgcHAgKyAyICogbiwgcHAgKyA0ICogbiwgbiArIHcwbik7CisKKyAgLyogZW1iYW5rbWVudCBpcyBhICJkaXJ0eSB0cmljayIgdG8gYXZvaWQgY2FycnkvYm9ycm93IHByb3BhZ2F0aW9uCisgICAgIGJleW9uZCBhbGxvY2F0ZWQgbWVtb3J5ICovCisgIGVtYmFua21lbnQgPSB3MFt3MG4gLSAxXSAtIDE7CisgIHcwW3cwbiAtIDFdID0gMTsKKyAgaWYgKExJS0VMWSAodzBuID4gbikpIHsKKyAgICBpZiAoY3k0ID4gY3k2KQorICAgICAgTVBOX0lOQ1JfVSAocHAgKyA0ICogbiwgdzBuICsgbiwgY3k0IC0gY3k2KTsKKyAgICBlbHNlCisgICAgICBNUE5fREVDUl9VIChwcCArIDQgKiBuLCB3MG4gKyBuLCBjeTYgLSBjeTQpOworICAgIE1QTl9ERUNSX1UgKHBwICsgMyAqIG4gKyB3MG4sIDIgKiBuLCBjeSk7CisgICAgTVBOX0lOQ1JfVSAodzAgKyBuLCB3MG4gLSBuLCBjeTYpOworICB9IGVsc2UgeworICAgIE1QTl9JTkNSX1UgKHBwICsgNCAqIG4sIHcwbiArIG4sIGN5NCk7CisgICAgTVBOX0RFQ1JfVSAocHAgKyAzICogbiArIHcwbiwgMiAqIG4sIGN5ICsgY3k2KTsKKyAgfQorICB3MFt3MG4gLSAxXSArPSBlbWJhbmttZW50OworCisjdW5kZWYgdzUKKyN1bmRlZiB3MworI3VuZGVmIHcwCisKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfN3B0cy5jIGIvbXBuL2dlbmVyaWMvdG9vbV9pbnRlcnBvbGF0ZV83cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3YzQ1YgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfN3B0cy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBtcG5fdG9vbV9pbnRlcnBvbGF0ZV83cHRzIC0tIEludGVycG9sYXRlIGZvciB0b29tNDQsIDUzLCA2Mi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIuCisgICBJbXByb3ZlbWVudHMgYnkgTWFyY28gQm9kcmF0by4KKworICAgVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZCisgICBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLiAgSU4gRkFDVCwgSVQgSVMgQUxNT1NUCisgICBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOSwgMjAxNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNkZWZpbmUgQklOVkVSVF8zIE1PRExJTUJfSU5WRVJTRV8zCisKKyNkZWZpbmUgQklOVkVSVF85IFwKKyAgKCgoKEdNUF9OVU1CX01BWCAvIDkpIDw8ICg2IC0gR01QX05VTUJfQklUUyAlIDYpKSAqIDggJiBHTVBfTlVNQl9NQVgpIHwgMHgzOSkKKworI2RlZmluZSBCSU5WRVJUXzE1IFwKKyAgKCgoKEdNUF9OVU1CX01BWCA+PiAoR01QX05VTUJfQklUUyAlIDQpKSAvIDE1KSAqIDE0ICogMTYgJiBHTVBfTlVNQl9NQVgpICsgMTUpCisKKy8qIEZvciB0aGUgdmFyaW91cyBtcG5fZGl2ZXhhY3RfYnlOIGhlcmUsIGZhbGwgYmFjayB0byB1c2luZyBlaXRoZXIKKyAgIG1wbl9waTFfYmRpdl9xXzEgb3IgbXBuX2RpdmV4YWN0XzEuICBUaGUgZm9ybWVyIGhhcyBsZXNzIG92ZXJoZWFkIGFuZCBpcworICAgbWFueSBmYXN0ZXIgaWYgaXQgaXMgbmF0aXZlLiAgRm9yIG5vdywgc2luY2UgbXBuX2RpdmV4YWN0XzEgaXMgbmF0aXZlIG9uCisgICBzZXZlcmFsIHBsYXRmb3JtcyB3aGVyZSBtcG5fcGkxX2JkaXZfcV8xIGRvZXMgbm90IHlldCBleGlzdCwgZG8gbm90IHVzZQorICAgbXBuX3BpMV9iZGl2X3FfMSB1bmNvbmRpdGlvbmFsbHkuICBGSVhNRS4gICovCisKKy8qIEZvciBvZGQgZGl2aXNvcnMsIG1wbl9kaXZleGFjdF8xIHdvcmtzIGZpbmUgd2l0aCB0d28ncyBjb21wbGVtZW50LiAqLworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkzCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkzKGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsMyxCSU5WRVJUXzMsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsMykKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5OQorI2lmIEhBVkVfTkFUSVZFX21wbl9waTFfYmRpdl9xXzEKKyNkZWZpbmUgbXBuX2RpdmV4YWN0X2J5OShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDksQklOVkVSVF85LDApCisjZWxzZQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk5KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDkpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIG1wbl9kaXZleGFjdF9ieTE1CisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkxNShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDE1LEJJTlZFUlRfMTUsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTE1KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDE1KQorI2VuZGlmCisjZW5kaWYKKworLyogSW50ZXJwb2xhdGlvbiBmb3IgdG9vbTQsIHVzaW5nIHRoZSBldmFsdWF0aW9uIHBvaW50cyAwLCBpbmZpbml0eSwKKyAgIDEsIC0xLCAyLCAtMiwgMS8yLiBNb3JlIHByZWNpc2VseSwgd2Ugd2FudCB0byBjb21wdXRlCisgICBmKDJeKEdNUF9OVU1CX0JJVFMgKiBuKSkgZm9yIGEgcG9seW5vbWlhbCBmIG9mIGRlZ3JlZSA2LCBnaXZlbiB0aGUKKyAgIHNldmVuIHZhbHVlcworCisgICAgIHcwID0gZigwKSwKKyAgICAgdzEgPSBmKC0yKSwKKyAgICAgdzIgPSBmKDEpLAorICAgICB3MyA9IGYoLTEpLAorICAgICB3NCA9IGYoMikKKyAgICAgdzUgPSA2NCAqIGYoMS8yKQorICAgICB3NiA9IGxpbWl0IGF0IGluZmluaXR5IG9mIGYoeCkgLyB4XjYsCisKKyAgIFRoZSByZXN1bHQgaXMgNipuICsgdzZuIGxpbWJzLiBBdCBlbnRyeSwgdzAgaXMgc3RvcmVkIGF0IHtycCwgMm4gfSwKKyAgIHcyIGlzIHN0b3JlZCBhdCB7IHJwICsgMm4sIDJuKzEgfSwgYW5kIHc2IGlzIHN0b3JlZCBhdCB7IHJwICsgNm4sCisgICB3Nm4gfS4gVGhlIG90aGVyIHZhbHVlcyBhcmUgMm4gKyAxIGxpbWJzIGVhY2ggKHdpdGggbW9zdAorICAgc2lnbmlmaWNhbnQgbGltYnMgc21hbGwpLiBmKC0xKSBhbmQgZigtMS8yKSBtYXkgYmUgbmVnYXRpdmUsIHNpZ25zCisgICBkZXRlcm1pbmVkIGJ5IHRoZSBmbGFnIGJpdHMuIElucHV0cyBhcmUgZGVzdHJveWVkLgorCisgICBOZWVkcyAoMipuICsgMSkgbGltYnMgb2YgdGVtcG9yYXJ5IHN0b3JhZ2UuCisqLworCit2b2lkCittcG5fdG9vbV9pbnRlcnBvbGF0ZV83cHRzIChtcF9wdHIgcnAsIG1wX3NpemVfdCBuLCBlbnVtIHRvb203X2ZsYWdzIGZsYWdzLAorCQkJICAgbXBfcHRyIHcxLCBtcF9wdHIgdzMsIG1wX3B0ciB3NCwgbXBfcHRyIHc1LAorCQkJICAgbXBfc2l6ZV90IHc2biwgbXBfcHRyIHRwKQoreworICBtcF9zaXplX3QgbTsKKyAgbXBfbGltYl90IGN5OworCisgIG0gPSAyKm4gKyAxOworI2RlZmluZSB3MCBycAorI2RlZmluZSB3MiAocnAgKyAyKm4pCisjZGVmaW5lIHc2IChycCArIDYqbikKKworICBBU1NFUlQgKHc2biA+IDApOworICBBU1NFUlQgKHc2biA8PSAyKm4pOworCisgIC8qIFVzaW5nIGZvcm11bGFzIHNpbWlsYXIgdG8gTWFyY28gQm9kcmF0bydzCisKKyAgICAgVzUgPSBXNSArIFc0CisgICAgIFcxID0oVzQgLSBXMSkvMgorICAgICBXNCA9IFc0IC0gVzAKKyAgICAgVzQgPShXNCAtIFcxKS80IC0gVzYqMTYKKyAgICAgVzMgPShXMiAtIFczKS8yCisgICAgIFcyID0gVzIgLSBXMworCisgICAgIFc1ID0gVzUgLSBXMio2NSAgICAgIE1heSBiZSBuZWdhdGl2ZS4KKyAgICAgVzIgPSBXMiAtIFc2IC0gVzAKKyAgICAgVzUgPShXNSArIFcyKjQ1KS8yICAgTm93ID49IDAgYWdhaW4uCisgICAgIFc0ID0oVzQgLSBXMikvMworICAgICBXMiA9IFcyIC0gVzQKKworICAgICBXMSA9IFc1IC0gVzEgICAgICAgICBNYXkgYmUgbmVnYXRpdmUuCisgICAgIFc1ID0oVzUgLSBXMyo4KS85CisgICAgIFczID0gVzMgLSBXNQorICAgICBXMSA9KFcxLzE1ICsgVzUpLzIgICBOb3cgPj0gMCBhZ2Fpbi4KKyAgICAgVzUgPSBXNSAtIFcxCisKKyAgICAgd2hlcmUgVzAgPSBmKDApLCBXMSA9IGYoLTIpLCBXMiA9IGYoMSksIFczID0gZigtMSksCisJICAgVzQgPSBmKDIpLCBXNSA9IGYoMS8yKSwgVzYgPSBmKG9vKSwKKworICAgICBOb3RlIHRoYXQgbW9zdCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhcmUgcG9zaXRpdmU7IHRoZSBvbmVzIHRoYXQKKyAgICAgbWF5IGJlIG5lZ2F0aXZlIGFyZSByZXByZXNlbnRlZCBpbiB0d28ncyBjb21wbGVtZW50LiBXZSBtdXN0CisgICAgIG5ldmVyIHNoaWZ0IHJpZ2h0IGEgdmFsdWUgdGhhdCBtYXkgYmUgbmVnYXRpdmUsIHNpbmNlIHRoYXQgd291bGQKKyAgICAgaW52YWxpZGF0ZSB0aGUgc2lnbiBiaXQuIE9uIHRoZSBvdGhlciBoYW5kLCBkaXZleGFjdCBieSBvZGQKKyAgICAgbnVtYmVycyB3b3JrIGZpbmUgd2l0aCB0d28ncyBjb21wbGVtZW50LgorICAqLworCisgIG1wbl9hZGRfbiAodzUsIHc1LCB3NCwgbSk7CisgIGlmIChmbGFncyAmIHRvb203X3cxX25lZykKKyAgICB7CisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbgorICAgICAgbXBuX3JzaDFhZGRfbiAodzEsIHcxLCB3NCwgbSk7CisjZWxzZQorICAgICAgbXBuX2FkZF9uICh3MSwgdzEsIHc0LCBtKTsgIEFTU0VSVCAoISh3MVswXSAmIDEpKTsKKyAgICAgIG1wbl9yc2hpZnQgKHcxLCB3MSwgbSwgMSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbgorICAgICAgbXBuX3JzaDFzdWJfbiAodzEsIHc0LCB3MSwgbSk7CisjZWxzZQorICAgICAgbXBuX3N1Yl9uICh3MSwgdzQsIHcxLCBtKTsgIEFTU0VSVCAoISh3MVswXSAmIDEpKTsKKyAgICAgIG1wbl9yc2hpZnQgKHcxLCB3MSwgbSwgMSk7CisjZW5kaWYKKyAgICB9CisgIG1wbl9zdWIgKHc0LCB3NCwgbSwgdzAsIDIqbik7CisgIG1wbl9zdWJfbiAodzQsIHc0LCB3MSwgbSk7ICBBU1NFUlQgKCEodzRbMF0gJiAzKSk7CisgIG1wbl9yc2hpZnQgKHc0LCB3NCwgbSwgMik7IC8qIHc0Pj0wICovCisKKyAgdHBbdzZuXSA9IG1wbl9sc2hpZnQgKHRwLCB3NiwgdzZuLCA0KTsKKyAgbXBuX3N1YiAodzQsIHc0LCBtLCB0cCwgdzZuKzEpOworCisgIGlmIChmbGFncyAmIHRvb203X3czX25lZykKKyAgICB7CisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbgorICAgICAgbXBuX3JzaDFhZGRfbiAodzMsIHczLCB3MiwgbSk7CisjZWxzZQorICAgICAgbXBuX2FkZF9uICh3MywgdzMsIHcyLCBtKTsgIEFTU0VSVCAoISh3M1swXSAmIDEpKTsKKyAgICAgIG1wbl9yc2hpZnQgKHczLCB3MywgbSwgMSk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFzdWJfbgorICAgICAgbXBuX3JzaDFzdWJfbiAodzMsIHcyLCB3MywgbSk7CisjZWxzZQorICAgICAgbXBuX3N1Yl9uICh3MywgdzIsIHczLCBtKTsgIEFTU0VSVCAoISh3M1swXSAmIDEpKTsKKyAgICAgIG1wbl9yc2hpZnQgKHczLCB3MywgbSwgMSk7CisjZW5kaWYKKyAgICB9CisKKyAgbXBuX3N1Yl9uICh3MiwgdzIsIHczLCBtKTsKKworICBtcG5fc3VibXVsXzEgKHc1LCB3MiwgbSwgNjUpOworICBtcG5fc3ViICh3MiwgdzIsIG0sIHc2LCB3Nm4pOworICBtcG5fc3ViICh3MiwgdzIsIG0sIHcwLCAyKm4pOworCisgIG1wbl9hZGRtdWxfMSAodzUsIHcyLCBtLCA0NSk7ICBBU1NFUlQgKCEodzVbMF0gJiAxKSk7CisgIG1wbl9yc2hpZnQgKHc1LCB3NSwgbSwgMSk7CisgIG1wbl9zdWJfbiAodzQsIHc0LCB3MiwgbSk7CisKKyAgbXBuX2RpdmV4YWN0X2J5MyAodzQsIHc0LCBtKTsKKyAgbXBuX3N1Yl9uICh3MiwgdzIsIHc0LCBtKTsKKworICBtcG5fc3ViX24gKHcxLCB3NSwgdzEsIG0pOworICBtcG5fbHNoaWZ0ICh0cCwgdzMsIG0sIDMpOworICBtcG5fc3ViX24gKHc1LCB3NSwgdHAsIG0pOworICBtcG5fZGl2ZXhhY3RfYnk5ICh3NSwgdzUsIG0pOworICBtcG5fc3ViX24gKHczLCB3MywgdzUsIG0pOworCisgIG1wbl9kaXZleGFjdF9ieTE1ICh3MSwgdzEsIG0pOworI2lmZGVmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgbXBuX3JzaDFhZGRfbiAodzEsIHcxLCB3NSwgbSk7CisgIHcxW20gLSAxXSAmPSBHTVBfTlVNQl9NQVNLID4+IDE7CisjZWxzZQorICBtcG5fYWRkX24gKHcxLCB3MSwgdzUsIG0pOyAgQVNTRVJUICghKHcxWzBdICYgMSkpOworICBtcG5fcnNoaWZ0ICh3MSwgdzEsIG0sIDEpOyAvKiB3MT49MCBub3cgKi8KKyNlbmRpZgorCisgIG1wbl9zdWJfbiAodzUsIHc1LCB3MSwgbSk7CisKKyAgLyogVGhlc2UgYm91bmRzIGFyZSB2YWxpZCBmb3IgdGhlIDR4NCBwb2x5bm9taWFsIHByb2R1Y3Qgb2YgdG9vbTQ0LAorICAgKiBhbmQgdGhleSBhcmUgY29uc2VydmF0aXZlIGZvciB0b29tNTMgYW5kIHRvb202Mi4gKi8KKyAgQVNTRVJUICh3MVsyKm5dIDwgMik7CisgIEFTU0VSVCAodzJbMipuXSA8IDMpOworICBBU1NFUlQgKHczWzIqbl0gPCA0KTsKKyAgQVNTRVJUICh3NFsyKm5dIDwgMyk7CisgIEFTU0VSVCAodzVbMipuXSA8IDIpOworCisgIC8qIEFkZGl0aW9uIGNoYWluLiBOb3RlIGNhcnJpZXMgYW5kIHRoZSAybid0aCBsaW1icyB0aGF0IG5lZWQgdG8gYmUKKyAgICogYWRkZWQgaW4uCisgICAqCisgICAqIFNwZWNpYWwgY2FyZSBpcyBuZWVkZWQgZm9yIHcyWzJuXSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2FycnksCisgICAqIHNpbmNlIHRoZSAic2ltcGxlIiB3YXkgb2YgYWRkaW5nIGl0IGFsbCB0b2dldGhlciB3b3VsZCBvdmVyd3JpdGUKKyAgICogdGhlIGxpbWIgYXQgd3BbMipuXSBhbmQgcnBbNCpuXSAoc2FtZSBsb2NhdGlvbikgd2l0aCB0aGUgc3VtIG9mCisgICAqIHRoZSBoaWdoIGhhbGYgb2YgdzMgYW5kIHRoZSBsb3cgaGFsZiBvZiB3NC4KKyAgICoKKyAgICogICAgICAgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKyAgICogICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwKKyAgICogICAgICAgICAgICAgICAgICB8fHczICgybisxKXwKKyAgICogICAgICAgICAgICAgfHx3NCAoMm4rMSl8CisgICAqICAgICAgICB8fHc1ICgybisxKXwgICAgICAgIHx8dzEgKDJuKzEpfAorICAgKiAgKyB8IHc2ICh3Nm4pfCAgICAgICAgfHx3MiAoMm4rMSl8IHcwICgybikgfCAgKHNoYXJlIHN0b3JhZ2Ugd2l0aCByKQorICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogIHIgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwKKyAgICogICAgICAgIGM3ICAgYzYgICBjNSAgIGM0ICAgYzMgICAgICAgICAgICAgICAgIENhcnJpZXMgdG8gcHJvcGFnYXRlCisgICAqLworCisgIGN5ID0gbXBuX2FkZF9uIChycCArIG4sIHJwICsgbiwgdzEsIG0pOworICBNUE5fSU5DUl9VICh3MiArIG4gKyAxLCBuICwgY3kpOworICBjeSA9IG1wbl9hZGRfbiAocnAgKyAzKm4sIHJwICsgMypuLCB3Mywgbik7CisgIE1QTl9JTkNSX1UgKHczICsgbiwgbiArIDEsIHcyWzIqbl0gKyBjeSk7CisgIGN5ID0gbXBuX2FkZF9uIChycCArIDQqbiwgdzMgKyBuLCB3NCwgbik7CisgIE1QTl9JTkNSX1UgKHc0ICsgbiwgbiArIDEsIHczWzIqbl0gKyBjeSk7CisgIGN5ID0gbXBuX2FkZF9uIChycCArIDUqbiwgdzQgKyBuLCB3NSwgbik7CisgIE1QTl9JTkNSX1UgKHc1ICsgbiwgbiArIDEsIHc0WzIqbl0gKyBjeSk7CisgIGlmICh3Nm4gPiBuICsgMSkKKyAgICB7CisgICAgICBjeSA9IG1wbl9hZGRfbiAocnAgKyA2Km4sIHJwICsgNipuLCB3NSArIG4sIG4gKyAxKTsKKyAgICAgIE1QTl9JTkNSX1UgKHJwICsgNypuICsgMSwgdzZuIC0gbiAtIDEsIGN5KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBBU1NFUlRfTk9DQVJSWSAobXBuX2FkZF9uIChycCArIDYqbiwgcnAgKyA2Km4sIHc1ICsgbiwgdzZuKSk7CisjaWYgV0FOVF9BU1NFUlQKKyAgICAgIHsKKwltcF9zaXplX3QgaTsKKwlmb3IgKGkgPSB3Nm47IGkgPD0gbjsgaSsrKQorCSAgQVNTRVJUICh3NVtuICsgaV0gPT0gMCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzhwdHMuYyBiL21wbi9nZW5lcmljL3Rvb21faW50ZXJwb2xhdGVfOHB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjVmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy90b29tX2ludGVycG9sYXRlXzhwdHMuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogbXBuX3Rvb21faW50ZXJwb2xhdGVfOHB0cyAtLSBJbnRlcnBvbGF0ZSBmb3IgdG9vbTU0LCA2MywgNzIuCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2RlZmluZSBCSU5WRVJUXzMgTU9ETElNQl9JTlZFUlNFXzMKKworI2RlZmluZSBCSU5WRVJUXzE1IFwKKyAgKCgoKEdNUF9OVU1CX01BWCA+PiAoR01QX05VTUJfQklUUyAlIDQpKSAvIDE1KSAqIDE0ICogMTYgJiBHTVBfTlVNQl9NQVgpICsgMTUpCisKKyNkZWZpbmUgQklOVkVSVF80NSAoKEJJTlZFUlRfMTUgKiBCSU5WRVJUXzMpICYgR01QX05VTUJfTUFTSykKKworI2lmbmRlZiBtcG5fZGl2ZXhhY3RfYnkzCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkzKGRzdCxzcmMsc2l6ZSkgbXBuX3BpMV9iZGl2X3FfMShkc3Qsc3JjLHNpemUsMyxCSU5WRVJUXzMsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBtcG5fZGl2ZXhhY3RfMShkc3Qsc3JjLHNpemUsMykKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbXBuX2RpdmV4YWN0X2J5NDUKKyNpZiBHTVBfTlVNQl9CSVRTICUgMTIgPT0gMAorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk0NShkc3Qsc3JjLHNpemUpIFwKKyAgKDYzICYgMTkgKiBtcG5fYmRpdl9kYm0xIChkc3QsIHNyYywgc2l6ZSwgX19HTVBfQ0FTVCAobXBfbGltYl90LCBHTVBfTlVNQl9NQVNLIC8gNDUpKSkKKyNlbHNlCisjaWYgSEFWRV9OQVRJVkVfbXBuX3BpMV9iZGl2X3FfMQorI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnk0NShkc3Qsc3JjLHNpemUpIG1wbl9waTFfYmRpdl9xXzEoZHN0LHNyYyxzaXplLDQ1LEJJTlZFUlRfNDUsMCkKKyNlbHNlCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTQ1KGRzdCxzcmMsc2l6ZSkgbXBuX2RpdmV4YWN0XzEoZHN0LHNyYyxzaXplLDQ1KQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbl9pcDEKKyNkZWZpbmUgRE9fbXBuX3N1YmxzaDJfbihkc3Qsc3JjLG4sd3MpIG1wbl9zdWJsc2gyX25faXAxKGRzdCxzcmMsbikKKyNlbHNlCisjZGVmaW5lIERPX21wbl9zdWJsc2gyX24oZHN0LHNyYyxuLHdzKSBET19tcG5fc3VibHNoX24oZHN0LHNyYyxuLDIsd3MpCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2hfbgorI2RlZmluZSBET19tcG5fc3VibHNoX24oZHN0LHNyYyxuLHMsd3MpIG1wbl9zdWJsc2hfbiAoZHN0LGRzdCxzcmMsbixzKQorI2Vsc2UKK3N0YXRpYyBtcF9saW1iX3QKK0RPX21wbl9zdWJsc2hfbiAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9wdHIgd3MpCit7CisjaWYgVVNFX01VTF8xICYmIDAKKyAgcmV0dXJuIG1wbl9zdWJtdWxfMShkc3Qsc3JjLG4sQ05TVF9MSU1CKDEpIDw8KHMpKTsKKyNlbHNlCisgIG1wX2xpbWJfdCBfX2N5OworICBfX2N5ID0gbXBuX2xzaGlmdCAod3Msc3JjLG4scyk7CisgIHJldHVybiBfX2N5ICsgbXBuX3N1Yl9uIChkc3QsZHN0LHdzLG4pOworI2VuZGlmCit9CisjZW5kaWYKKworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YnJzaAorI2RlZmluZSBET19tcG5fc3VicnNoKGRzdCxuZCxzcmMsbnMscyx3cykgbXBuX3N1YnJzaCAoZHN0LG5kLHNyYyxucyxzKQorI2Vsc2UKKy8qIFRoaXMgaXMgbm90IGEgY29ycmVjdCBkZWZpbml0aW9uLCBpdCBhc3N1bWVzIG5vIGNhcnJ5ICovCisjZGVmaW5lIERPX21wbl9zdWJyc2goZHN0LG5kLHNyYyxucyxzLHdzKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBtcF9saW1iX3QgX19jeTsJCQkJCQkJXAorICBNUE5fREVDUl9VIChkc3QsIG5kLCBzcmNbMF0gPj4gcyk7CQkJCQlcCisgIF9fY3kgPSBET19tcG5fc3VibHNoX24gKGRzdCwgc3JjICsgMSwgbnMgLSAxLCBHTVBfTlVNQl9CSVRTIC0gcywgd3MpOwlcCisgIE1QTl9ERUNSX1UgKGRzdCArIG5zIC0gMSwgbmQgLSBucyArIDEsIF9fY3kpOwkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIEludGVycG9sYXRpb24gZm9yIFRvb20tNC41IChvciBUb29tLTQpLCB1c2luZyB0aGUgZXZhbHVhdGlvbgorICAgcG9pbnRzOiBpbmZpbml0eSg0LjUgb25seSksIDQsIC00LCAyLCAtMiwgMSwgLTEsIDAuIE1vcmUgcHJlY2lzZWx5LAorICAgd2Ugd2FudCB0byBjb21wdXRlIGYoMl4oR01QX05VTUJfQklUUyAqIG4pKSBmb3IgYSBwb2x5bm9taWFsIGYgb2YKKyAgIGRlZ3JlZSA3IChvciA2KSwgZ2l2ZW4gdGhlIDggKHJzcC4gNykgdmFsdWVzOgorCisgICAgIHIxID0gbGltaXQgYXQgaW5maW5pdHkgb2YgZih4KSAvIHheNywKKyAgICAgcjIgPSBmKDQpLAorICAgICByMyA9IGYoLTQpLAorICAgICByNCA9IGYoMiksCisgICAgIHI1ID0gZigtMiksCisgICAgIHI2ID0gZigxKSwKKyAgICAgcjcgPSBmKC0xKSwKKyAgICAgcjggPSBmKDApLgorCisgICBBbGwgY291cGxlcyBvZiB0aGUgZm9ybSBmKG4pLGYoLW4pIG11c3QgYmUgYWxyZWFkeSBtaXhlZCB3aXRoCisgICB0b29tX2NvdXBsZV9oYW5kbGluZyhmKG4pLC4uLixmKC1uKSwuLi4pCisKKyAgIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHtwcCwgc3B0ICsgNypuIChvciA2Km4pfS4KKyAgIEF0IGVudHJ5LCByOCBpcyBzdG9yZWQgYXQge3BwLCAybn0sCisgICByNSBpcyBzdG9yZWQgYXQge3BwICsgM24sIDNuICsgMX0uCisKKyAgIFRoZSBvdGhlciB2YWx1ZXMgYXJlIDJuKy4uLiBsaW1icyBlYWNoICh3aXRoIG1vc3Qgc2lnbmlmaWNhbnQgbGltYnMgc21hbGwpLgorCisgICBBbGwgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYXJlIHBvc2l0aXZlLgorICAgSW5wdXRzIGFyZSBkZXN0cm95ZWQuCisqLworCit2b2lkCittcG5fdG9vbV9pbnRlcnBvbGF0ZV84cHRzIChtcF9wdHIgcHAsIG1wX3NpemVfdCBuLAorCQkJICAgbXBfcHRyIHIzLCBtcF9wdHIgcjcsCisJCQkgICBtcF9zaXplX3Qgc3B0LCBtcF9wdHIgd3MpCit7CisgIG1wX2xpbWJfc2lnbmVkX3QgY3k7CisgIG1wX3B0ciByNSwgcjE7CisgIHI1ID0gKHBwICsgMyAqIG4pOwkJCS8qIDNuKzEgKi8KKyAgcjEgPSAocHAgKyA3ICogbik7CQkJLyogc3B0ICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogaW50ZXJwb2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBET19tcG5fc3VicnNoKHIzK24sIDIgKiBuICsgMSwgcHAsIDIgKiBuLCA0LCB3cyk7CisgIGN5ID0gRE9fbXBuX3N1YmxzaF9uIChyMywgcjEsIHNwdCwgMTIsIHdzKTsKKyAgTVBOX0RFQ1JfVSAocjMgKyBzcHQsIDMgKiBuICsgMSAtIHNwdCwgY3kpOworCisgIERPX21wbl9zdWJyc2gocjUrbiwgMiAqIG4gKyAxLCBwcCwgMiAqIG4sIDIsIHdzKTsKKyAgY3kgPSBET19tcG5fc3VibHNoX24gKHI1LCByMSwgc3B0LCA2LCB3cyk7CisgIE1QTl9ERUNSX1UgKHI1ICsgc3B0LCAzICogbiArIDEgLSBzcHQsIGN5KTsKKworICByN1szKm5dIC09IG1wbl9zdWJfbiAocjcrbiwgcjcrbiwgcHAsIDIgKiBuKTsKKyAgY3kgPSBtcG5fc3ViX24gKHI3LCByNywgcjEsIHNwdCk7CisgIE1QTl9ERUNSX1UgKHI3ICsgc3B0LCAzICogbiArIDEgLSBzcHQsIGN5KTsKKworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHIzLCByMywgcjUsIDMgKiBuICsgMSkpOworICBBU1NFUlRfTk9DQVJSWShtcG5fcnNoaWZ0KHIzLCByMywgMyAqIG4gKyAxLCAyKSk7CisKKyAgQVNTRVJUX05PQ0FSUlkobXBuX3N1Yl9uIChyNSwgcjUsIHI3LCAzICogbiArIDEpKTsKKworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24gKHIzLCByMywgcjUsIDMgKiBuICsgMSkpOworCisgIG1wbl9kaXZleGFjdF9ieTQ1IChyMywgcjMsIDMgKiBuICsgMSk7CisKKyAgQVNTRVJUX05PQ0FSUlkobXBuX2RpdmV4YWN0X2J5MyAocjUsIHI1LCAzICogbiArIDEpKTsKKworICBBU1NFUlRfTk9DQVJSWShET19tcG5fc3VibHNoMl9uIChyNSwgcjMsIDMgKiBuICsgMSwgd3MpKTsKKworICAvKiBsYXN0IGludGVycG9sYXRpb24gc3RlcHMuLi4gKi8KKyAgLyogLi4uIGFyZSBtaXhlZCB3aXRoIHJlY29tcG9zaXRpb24gKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcmVjb21wb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKgorICAgIHBwW10gcHJpb3IgdG8gb3BlcmF0aW9uczoKKyAgICAgfF9IIHIxfF9MIHIxfF9fX198fF9IIHI1fF9NX3I1fF9MIHI1fF9fX19ffF9IIHI4fF9MIHI4fHBwCisKKyAgICBzdW1tYXRpb24gc2NoZW1lIGZvciByZW1haW5pbmcgb3BlcmF0aW9uczoKKyAgICAgfF9fX184fG5fX183fG5fX182fG5fX181fG5fX180fG5fX18zfG5fX18yfG5fX19ffG5fX19ffHBwCisgICAgIHxfSCByMXxfTCByMXxfX19ffHxfSCpyNXxfTSByNXxfTCByNXxfX19fX3xfSF9yOHxfTCByOHxwcAorCSAgfHxfSCByM3xfTSByM3xfTCpyM3wKKwkJCQkgIHx8X0hfcjd8X01fcjd8X0xfcjd8CisJCSAgICAgIHx8LUggcjN8LU0gcjN8LUwqcjN8CisJCQkJICB8fC1IKnI1fC1NX3I1fC1MX3I1fAorICAqLworCisgIGN5ID0gbXBuX2FkZF9uIChwcCArIG4sIHBwICsgbiwgcjcsIG4pOyAvKiBIcjgrTHI3LUxyNSAqLworICBjeS09IG1wbl9zdWJfbiAocHAgKyBuLCBwcCArIG4sIHI1LCBuKTsKKyAgaWYgKGN5ID4gMCkgeworICAgIE1QTl9JTkNSX1UgKHI3ICsgbiwgMipuICsgMSwgMSk7CisgICAgY3kgPSAwOworICB9CisKKyAgY3kgPSBtcG5fc3ViX25jIChwcCArIDIqbiwgcjcgKyBuLCByNSArIG4sIG4sIC1jeSk7IC8qIE1yNy1NcjUgKi8KKyAgTVBOX0RFQ1JfVSAocjcgKyAyKm4sIG4gKyAxLCBjeSk7CisKKyAgY3kgPSBtcG5fYWRkX24gKHBwICsgMypuLCByNSwgcjcrIDIqbiwgbisxKTsgLyogSHI3K0xyNSAqLworICByNVszKm5dKz0gbXBuX2FkZF9uIChyNSArIDIqbiwgcjUgKyAyKm4sIHIzLCBuKTsgLyogSHI1K0xyMyAqLworICBjeS09IG1wbl9zdWJfbiAocHAgKyAzKm4sIHBwICsgMypuLCByNSArIDIqbiwgbisxKTsgLyogSHI3LUhyNStMcjUtTHIzICovCisgIGlmIChVTkxJS0VMWSgwID4gY3kpKQorICAgIE1QTl9ERUNSX1UgKHI1ICsgbiArIDEsIDIqbiwgMSk7CisgIGVsc2UKKyAgICBNUE5fSU5DUl9VIChyNSArIG4gKyAxLCAyKm4sIGN5KTsKKworICBBU1NFUlRfTk9DQVJSWShtcG5fc3ViX24ocHAgKyA0Km4sIHI1ICsgbiwgcjMgKyBuLCAyKm4gKzEpKTsgLyogTXI1LU1yMyxIcjUtSHIzICovCisKKyAgY3kgPSBtcG5fYWRkXzEgKHBwICsgNipuLCByMyArIG4sIG4sIHBwWzYqbl0pOworICBNUE5fSU5DUl9VIChyMyArIDIqbiwgbiArIDEsIGN5KTsKKyAgY3kgPSBtcG5fYWRkX24gKHBwICsgNypuLCBwcCArIDcqbiwgcjMgKyAyKm4sIG4pOworICBpZiAoTElLRUxZKHNwdCAhPSBuKSkKKyAgICBNUE5fSU5DUl9VIChwcCArIDgqbiwgc3B0IC0gbiwgY3kgKyByM1szKm5dKTsKKyAgZWxzZQorICAgIEFTU0VSVCAocjNbMypuXSArIGN5ID09IDApOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdHJpYWxkaXYuYyBiL21wbi9nZW5lcmljL3RyaWFsZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlMDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3RyaWFsZGl2LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIG1wbl90cmlhbGRpdiAtLSBmaW5kIHNtYWxsIGZhY3RvcnMgb2YgYW4gbXBuIG51bWJlciB1c2luZyB0cmlhbCBkaXZpc2lvbi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kLgorCisgICBUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUyBBTE1PU1QKKyAgIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUiBESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyLCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKgorICAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgZmlyc3QgKHNtYWxsZXN0KSBmYWN0b3IgcmVwcmVzZW50ZWQgaW4KKyAgIHRyaWFsZGl2dGFiLmguICBJdCBkb2VzIG5vdCBzdG9wIHRoZSBmYWN0b3JpbmcgZWZmb3J0IGp1c3QgYmVjYXVzZSBpdCBoYXMKKyAgIHJlYWNoZWQgc29tZSBzZW5zaWJsZSBsaW1pdCwgc3VjaCBhcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGlucHV0IG51bWJlci4KKworICAgVGhlIGNhbGxlciBjYW4gbGltaXQgdGhlIGZhY3RvcmluZyBlZmZvcnQgYnkgcGFzc2luZyBOUFJJTUVTLiAgVGhlIGZ1bmN0aW9uCisgICB3aWxsIHRoZW4gZGl2aWRlIHVudGlsIHRoYXQgbGltaXQsIG9yIHBlcmhhcHMgYSBmZXcgcHJpbWVzIG1vcmUuICBBIHBvc2l0aW9uCisgICB3aGljaCBvbmx5IG1wbl90cmlhbGRpdiBjYW4gbWFrZSBzZW5zZSBvZiBpcyByZXR1cm5lZCBpbiB0aGUgV0hFUkUKKyAgIHBhcmFtZXRlci4gIEl0IGNhbiBiZSB1c2VkIGZvciByZXN0YXJ0aW5nIHRoZSBmYWN0b3JpbmcgZWZmb3J0OyB0aGUgZmlyc3QKKyAgIGNhbGwgc2hvdWxkIHBhc3MgMCBoZXJlLgorCisgICBJbnB1dDogICAgICAgIDEuIEEgbm9uLW5lZ2F0aXZlIG51bWJlciBUID0ge3RwLHRufQorICAgICAgICAgICAgICAgICAyLiBOUFJJTUVTIGFzIGRlc2NyaWJlZCBhYm92ZSwKKyAgICAgICAgICAgICAgICAgMy4gKldIRVJFIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgIE91dHB1dDogICAgICAgMS4gKldIRVJFIHVwZGF0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgICAgICAgICAgICAgICAyLiBSZXR1cm4gdmFsdWUgaXMgbm9uLXplcm8gaWYgd2UgZm91bmQgYSBmYWN0b3IsIGVsc2UgemVybworICAgICAgICAgICAgICAgICAgICBUbyBnZXQgdGhlIGFjdHVhbCBwcmltZSBmYWN0b3IsIGNvbXB1dGUgdGhlIG1vZCBCIGludmVyc2UKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitzdHJ1Y3QgZ21wX3ByaW1lc19kdGFiIHsKKyAgbXBfbGltYl90IGJpbnY7CisgIG1wX2xpbWJfdCBsaW07Cit9OworCitzdHJ1Y3QgZ21wX3ByaW1lc19wdGFiIHsKKyAgbXBfbGltYl90IHBwcDsJLyogcHJpbWVzLCBtdWx0aXBsaWVkIHRvZ2V0aGVyICovCisgIG1wX2xpbWJfdCBjcHNbN107CS8qIHBwcCB2YWx1ZXMgcHJlLWNvbXB1dGVkIGZvciBtcG5fbW9kXzFzXzRwICovCisgIGdtcF91aW50X2xlYXN0MzJfdCBpZHg6MjQ7CS8qIGluZGV4IG9mICBmaXJzdCBwcmltZXMgaW4gZHRhYiAqLworICBnbXBfdWludF9sZWFzdDMyX3QgbnAgOjg7CS8qIG51bWJlciBvZiBwcmltZXMgcmVsYXRlZCB0byB0aGlzIGVudHJ5ICovCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ21wX3ByaW1lc19kdGFiIGdtcF9wcmltZXNfZHRhYltdID0KK3sKKyNkZWZpbmUgV0FOVF9kdGFiCisjZGVmaW5lIFAocCxpbnYsbGltKSB7aW52LGxpbX0KKyNpbmNsdWRlICJ0cmlhbGRpdnRhYi5oIgorI3VuZGVmIFdBTlRfZHRhYgorI3VuZGVmIFAKKyAgezAsMH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ21wX3ByaW1lc19wdGFiIGdtcF9wcmltZXNfcHRhYltdID0KK3sKKyNkZWZpbmUgV0FOVF9wdGFiCisjaW5jbHVkZSAidHJpYWxkaXZ0YWIuaCIKKyN1bmRlZiBXQU5UX3B0YWIKK307CisKKyNkZWZpbmUgUFRBQl9MSU5FUyAoc2l6ZW9mIChnbXBfcHJpbWVzX3B0YWIpIC8gc2l6ZW9mIChnbXBfcHJpbWVzX3B0YWJbMF0pKQorCisvKiBGSVhNRTogV2UgY291bGQgb3B0aW1pemUgb3V0IG9uZSBvZiB0aGUgb3V0ZXIgbG9vcCBjb25kaXRpb25zIGlmIHdlCisgICBoYWQgYSBmaW5hbCBwdGFiIGVudHJ5IHdpdGggYSBodWdlIG5wIGZpZWxkLiAgKi8KK21wX2xpbWJfdAorbXBuX3RyaWFsZGl2IChtcF9zcmNwdHIgdHAsIG1wX3NpemVfdCB0biwgbXBfc2l6ZV90IG5wcmltZXMsIGludCAqd2hlcmUpCit7CisgIG1wX2xpbWJfdCBwcHA7CisgIGNvbnN0IG1wX2xpbWJfdCAqY3BzOworICBjb25zdCBzdHJ1Y3QgZ21wX3ByaW1lc19kdGFiICpkcDsKKyAgbG9uZyBpLCBqLCBpZHgsIG5wOworICBtcF9saW1iX3QgciwgcTsKKworICBBU1NFUlQgKHRuID49IDEpOworCisgIGZvciAoaSA9ICp3aGVyZTsgaSA8IFBUQUJfTElORVM7IGkrKykKKyAgICB7CisgICAgICBwcHAgPSBnbXBfcHJpbWVzX3B0YWJbaV0ucHBwOworICAgICAgY3BzID0gZ21wX3ByaW1lc19wdGFiW2ldLmNwczsKKworICAgICAgciA9IG1wbl9tb2RfMXNfNHAgKHRwLCB0biwgcHBwIDw8IGNwc1sxXSwgY3BzKTsKKworICAgICAgaWR4ID0gZ21wX3ByaW1lc19wdGFiW2ldLmlkeDsKKyAgICAgIG5wID0gZ21wX3ByaW1lc19wdGFiW2ldLm5wOworCisgICAgICAvKiBDaGVjayBkaXZpc2liaWxpdHkgYnkgaW5kaXZpZHVhbCBwcmltZXMuICAqLworICAgICAgZHAgPSAmZ21wX3ByaW1lc19kdGFiW2lkeF0gKyBucDsKKyAgICAgIGZvciAoaiA9IC1ucDsgaiA8IDA7IGorKykKKwl7CisJICBxID0gciAqIGRwW2pdLmJpbnY7CisJICBpZiAocSA8PSBkcFtqXS5saW0pCisJICAgIHsKKwkgICAgICAqd2hlcmUgPSBpOworCSAgICAgIHJldHVybiBkcFtqXS5iaW52OworCSAgICB9CisJfQorCisgICAgICBucHJpbWVzIC09IG5wOworICAgICAgaWYgKG5wcmltZXMgPD0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvdWRpdl93X3NkaXYuYyBiL21wbi9nZW5lcmljL3VkaXZfd19zZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwNzEzNQotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3VkaXZfd19zZGl2LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIG1wbl91ZGl2X3dfc2RpdiAtLSBpbXBsZW1lbnQgdWRpdl9xcm5uZCBvbiBtYWNoaW5lcyB3aXRoIG9ubHkgc2lnbmVkCisgICBkaXZpc2lvbi4KKworICAgQ29udHJpYnV0ZWQgYnkgUGV0ZXIgTC4gTW9udGdvbWVyeS4KKworICAgVEhJUyBJUyBBTiBJTlRFUk5BTCBGVU5DVElPTiBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuICBJVCBJUyBPTkxZIFNBRkUKKyAgIFRPIFJFQUNIIFRISVMgRlVOQ1RJT04gVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuICBJTiBGQUNULCBJVCBJUworICAgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBUSElTIEZVTkNUSU9OIFdJTEwgQ0hBTkdFIE9SIERJU0FQUEVBUiBJTiBBIEZVVFVSRQorICAgR05VIE1QIFJFTEVBU0UuCisKKworQ29weXJpZ2h0IDE5OTIsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK21wX2xpbWJfdAorbXBuX3VkaXZfd19zZGl2IChtcF9saW1iX3QgKnJwLCBtcF9saW1iX3QgYTEsIG1wX2xpbWJfdCBhMCwgbXBfbGltYl90IGQpCit7CisgIG1wX2xpbWJfdCBxLCByOworICBtcF9saW1iX3QgYzAsIGMxLCBiMTsKKworICBBU1NFUlQgKGQgIT0gMCk7CisgIEFTU0VSVCAoYTEgPCBkKTsKKworICBpZiAoKG1wX2xpbWJfc2lnbmVkX3QpIGQgPj0gMCkKKyAgICB7CisgICAgICBpZiAoYTEgPCBkIC0gYTEgLSAoYTAgPj4gKEdNUF9MSU1CX0JJVFMgLSAxKSkpCisJeworCSAgLyogZGl2aWRlbmQsIGRpdmlzb3IsIGFuZCBxdW90aWVudCBhcmUgbm9ubmVnYXRpdmUgKi8KKwkgIHNkaXZfcXJubmQgKHEsIHIsIGExLCBhMCwgZCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIENvbXB1dGUgYzEqMl4zMiArIGMwID0gYTEqMl4zMiArIGEwIC0gMl4zMSpkICovCisJICBzdWJfZGRtbXNzIChjMSwgYzAsIGExLCBhMCwgZCA+PiAxLCBkIDw8IChHTVBfTElNQl9CSVRTIC0gMSkpOworCSAgLyogRGl2aWRlIChjMSoyXjMyICsgYzApIGJ5IGQgKi8KKwkgIHNkaXZfcXJubmQgKHEsIHIsIGMxLCBjMCwgZCk7CisJICAvKiBBZGQgMl4zMSB0byBxdW90aWVudCAqLworCSAgcSArPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC0gMSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGIxID0gZCA+PiAxOwkJCS8qIGQvMiwgYmV0d2VlbiAyXjMwIGFuZCAyXjMxIC0gMSAqLworICAgICAgYzEgPSBhMSA+PiAxOwkJCS8qIEEvMiAqLworICAgICAgYzAgPSAoYTEgPDwgKEdNUF9MSU1CX0JJVFMgLSAxKSkgKyAoYTAgPj4gMSk7CisKKyAgICAgIGlmIChhMSA8IGIxKQkJCS8qIEEgPCAyXjMyKmIxLCBzbyBBLzIgPCAyXjMxKmIxICovCisJeworCSAgc2Rpdl9xcm5uZCAocSwgciwgYzEsIGMwLCBiMSk7IC8qIChBLzIpIC8gKGQvMikgKi8KKworCSAgciA9IDIqciArIChhMCAmIDEpOwkJLyogUmVtYWluZGVyIGZyb20gQS8oMipiMSkgKi8KKwkgIGlmICgoZCAmIDEpICE9IDApCisJICAgIHsKKwkgICAgICBpZiAociA+PSBxKQorCQlyID0gciAtIHE7CisJICAgICAgZWxzZSBpZiAocSAtIHIgPD0gZCkKKwkJeworCQkgIHIgPSByIC0gcSArIGQ7CisJCSAgcS0tOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgciA9IHIgLSBxICsgMipkOworCQkgIHEgLT0gMjsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoYzEgPCBiMSkJCQkvKiBTbyAyXjMxIDw9IChBLzIpL2IxIDwgMl4zMiAqLworCXsKKwkgIGMxID0gKGIxIC0gMSkgLSBjMTsKKwkgIGMwID0gfmMwOwkJCS8qIGxvZ2ljYWwgTk9UICovCisKKwkgIHNkaXZfcXJubmQgKHEsIHIsIGMxLCBjMCwgYjEpOyAvKiAoQS8yKSAvIChkLzIpICovCisKKwkgIHEgPSB+cTsJCQkvKiAoQS8yKS9iMSAqLworCSAgciA9IChiMSAtIDEpIC0gcjsKKworCSAgciA9IDIqciArIChhMCAmIDEpOwkJLyogQS8oMipiMSkgKi8KKworCSAgaWYgKChkICYgMSkgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChyID49IHEpCisJCXIgPSByIC0gcTsKKwkgICAgICBlbHNlIGlmIChxIC0gciA8PSBkKQorCQl7CisJCSAgciA9IHIgLSBxICsgZDsKKwkJICBxLS07CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICByID0gciAtIHEgKyAyKmQ7CisJCSAgcSAtPSAyOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCQkJCS8qIEltcGxpZXMgYzEgPSBiMSAqLworCXsJCQkJLyogSGVuY2UgYTEgPSBkIC0gMSA9IDIqYjEgLSAxICovCisJICBpZiAoYTAgPj0gLWQpCisJICAgIHsKKwkgICAgICBxID0gLUNOU1RfTElNQigxKTsKKwkgICAgICByID0gYTAgKyBkOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBxID0gLUNOU1RfTElNQigyKTsKKwkgICAgICByID0gYTAgKyAyKmQ7CisJICAgIH0KKwl9CisgICAgfQorCisgICpycCA9IHI7CisgIHJldHVybiBxOworfQpkaWZmIC0tZ2l0IGEvbXBuL2dlbmVyaWMvemVyby5jIGIvbXBuL2dlbmVyaWMvemVyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDU0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4vZ2VuZXJpYy96ZXJvLmMKQEAgLTAsMCArMSw0MSBAQAorLyogbXBuX3plcm8KKworQ29weXJpZ2h0IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcG5femVybyAobXBfcHRyIHJwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisKKyAgcnAgKz0gbjsKKyAgZm9yIChpID0gLW47IGkgIT0gMDsgaSsrKQorICAgIHJwW2ldID0gMDsKK30KZGlmZiAtLWdpdCBhL21wbi9nZW5lcmljL3plcm9fcC5jIGIvbXBuL2dlbmVyaWMvemVyb19wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyZjliOAotLS0gL2Rldi9udWxsCisrKyBiL21wbi9nZW5lcmljL3plcm9fcC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wbl96ZXJvX3AgKHgseHNpemUpIC0tIFJldHVybiAxIGlmIFggaXMgemVybywgMCBpZiBpdCBpcyBub24temVyby4KKworQ29weXJpZ2h0IDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXBuX3plcm9fcCAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9hb3JzX24uYXNtIGIvbXBuL3g4Ni9hb3JzX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTdiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2L2FvcnNfbi5hc20KQEAgLTAsMCArMSwyMDIgQEAKK2RubCAgeDg2IG1wbl9hZGRfbi9tcG5fc3ViX24gLS0gbXBuIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4KKworZG5sICBDb3B5cmlnaHQgMTk5MiwgMTk5NC0xOTk2LCAxOTk5LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDICAgICBjeWNsZXMvbGltYgorQyBQNQkzLjM3NQorQyBQNgkzLjEyNQorQyBLNgkzLjUKK0MgSzcJMi4yNQorQyBQNAk4Ljc1CisKKworaWZkZWYoYE9QRVJBVElPTl9hZGRfbicsYAorCWRlZmluZShNNF9pbnN0LCAgICAgICAgYWRjbCkKKwlkZWZpbmUoTTRfZnVuY3Rpb25fbiwgIG1wbl9hZGRfbikKKwlkZWZpbmUoTTRfZnVuY3Rpb25fbmMsIG1wbl9hZGRfbmMpCisKKycsYGlmZGVmKGBPUEVSQVRJT05fc3ViX24nLGAKKwlkZWZpbmUoTTRfaW5zdCwgICAgICAgIHNiYmwpCisJZGVmaW5lKE00X2Z1bmN0aW9uX24sICBtcG5fc3ViX24pCisJZGVmaW5lKE00X2Z1bmN0aW9uX25jLCBtcG5fc3ViX25jKQorCisnLGBtNF9lcnJvcihgTmVlZCBPUEVSQVRJT05fYWRkX24gb3IgT1BFUkFUSU9OX3N1Yl9uCisnKScpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkX24gbXBuX2FkZF9uYyBtcG5fc3ViX24gbXBuX3N1Yl9uYykKKworCitDIG1wX2xpbWJfdCBNNF9mdW5jdGlvbl9uIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjMSwgbXBfc3JjcHRyIHNyYzIsCitDICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9zaXplX3Qgc2l6ZSk7CitDIG1wX2xpbWJfdCBNNF9mdW5jdGlvbl9uYyAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYzEsIG1wX3NyY3B0ciBzcmMyLAorQwkgICAgICAgICAgICAgICAgICAgIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgY2FycnkpOworCitkZWZmcmFtZShQQVJBTV9DQVJSWSwyMCkKK2RlZmZyYW1lKFBBUkFNX1NJWkUsIDE2KQorZGVmZnJhbWUoUEFSQU1fU1JDMiwgMTIpCitkZWZmcmFtZShQQVJBTV9TUkMxLCA4KQorZGVmZnJhbWUoUEFSQU1fRFNULCAgNCkKKworCVRFWFQKKwlBTElHTig4KQorCitQUk9MT0dVRShNNF9mdW5jdGlvbl9uYykKK2RlZmxpdChgRlJBTUUnLDApCisKKwlwdXNobAklZWRpCQlGUkFNRV9wdXNobCgpCisJcHVzaGwJJWVzaQkJRlJBTUVfcHVzaGwoKQorCisJbW92bAlQQVJBTV9EU1QsJWVkaQorCW1vdmwJUEFSQU1fU1JDMSwlZXNpCisJbW92bAlQQVJBTV9TUkMyLCVlZHgKKwltb3ZsCVBBUkFNX1NJWkUsJWVjeAorCisJbW92bAklZWN4LCVlYXgKKwlzaHJsCSQzLCVlY3gJCQlDIGNvbXB1dGUgY291bnQgZm9yIHVucm9sbGVkIGxvb3AKKwluZWdsCSVlYXgKKwlhbmRsCSQ3LCVlYXgJCQlDIGdldCBpbmRleCB3aGVyZSB0byBzdGFydCBsb29wCisJanoJTChvb3BnbykJCUMgbmVjZXNzYXJ5IHNwZWNpYWwgY2FzZSBmb3IgMAorCWluY2wJJWVjeAkJCUMgYWRqdXN0IGxvb3AgY291bnQKKwlzaGxsCSQyLCVlYXgJCQlDIGFkanVzdG1lbnQgZm9yIHBvaW50ZXJzLi4uCisJc3VibAklZWF4LCVlZGkJCUMgLi4uIHNpbmNlIHRoZXkgYXJlIG9mZnNldCAuLi4KKwlzdWJsCSVlYXgsJWVzaQkJQyAuLi4gYnkgYSBjb25zdGFudCB3aGVuIHdlIC4uLgorCXN1YmwJJWVheCwlZWR4CQlDIC4uLiBlbnRlciB0aGUgbG9vcAorCXNocmwJJDIsJWVheAkJCUMgcmVzdG9yZSBwcmV2aW91cyB2YWx1ZQorCitpZmRlZihgUElDJyxgCisJQyBDYWxjdWxhdGUgc3RhcnQgYWRkcmVzcyBpbiBsb29wIGZvciBQSUMuICBEdWUgdG8gbGltaXRhdGlvbnMgaW4KKwlDIG9sZCBnYXMsIExGKE00X2Z1bmN0aW9uX24sb29wKS1MKDBhKS0zIGNhbm5vdCBiZSBwdXQgaW50byB0aGUgbGVhbAorCWNhbGwJTCgwYSkKK0woMGEpOglsZWFsCSglZWF4LCVlYXgsOCksJWVheAorCWFkZGwJKCVlc3ApLCVlYXgKKwlhZGRsCSRMKG9vcCktTCgwYSktMywlZWF4CisJYWRkbAkkNCwlZXNwCisnLGAKKwlDIENhbGN1bGF0ZSBzdGFydCBhZGRyZXNzIGluIGxvb3AgZm9yIG5vbi1QSUMuCisJbGVhbAlMKG9vcCktMyglZWF4LCVlYXgsOCksJWVheAorJykKKworCUMgVGhlc2UgbGluZXMgaW5pdGlhbGl6ZSBjYXJyeSBmcm9tIHRoZSA1dGggcGFyYW1ldGVyLiAgU2hvdWxkIGJlCisJQyBwb3NzaWJsZSB0byBzaW1wbGlmeS4KKwlwdXNobAklZWJwCQlGUkFNRV9wdXNobCgpCisJbW92bAlQQVJBTV9DQVJSWSwlZWJwCisJc2hybAklZWJwCQkJQyBzaGlmdCBiaXQgMCBpbnRvIGNhcnJ5CisJcG9wbAklZWJwCQlGUkFNRV9wb3BsKCkKKworCWptcAkqJWVheAkJCUMganVtcCBpbnRvIGxvb3AKKworRVBJTE9HVUUoKQorCisKKwlBTElHTigxNikKK1BST0xPR1VFKE00X2Z1bmN0aW9uX24pCitkZWZsaXQoYEZSQU1FJywwKQorCisJcHVzaGwJJWVkaQkJRlJBTUVfcHVzaGwoKQorCXB1c2hsCSVlc2kJCUZSQU1FX3B1c2hsKCkKKworCW1vdmwJUEFSQU1fRFNULCVlZGkKKwltb3ZsCVBBUkFNX1NSQzEsJWVzaQorCW1vdmwJUEFSQU1fU1JDMiwlZWR4CisJbW92bAlQQVJBTV9TSVpFLCVlY3gKKworCW1vdmwJJWVjeCwlZWF4CisJc2hybAkkMywlZWN4CQkJQyBjb21wdXRlIGNvdW50IGZvciB1bnJvbGxlZCBsb29wCisJbmVnbAklZWF4CisJYW5kbAkkNywlZWF4CQkJQyBnZXQgaW5kZXggd2hlcmUgdG8gc3RhcnQgbG9vcAorCWp6CUwob29wKQkJCUMgbmVjZXNzYXJ5IHNwZWNpYWwgY2FzZSBmb3IgMAorCWluY2wJJWVjeAkJCUMgYWRqdXN0IGxvb3AgY291bnQKKwlzaGxsCSQyLCVlYXgJCQlDIGFkanVzdG1lbnQgZm9yIHBvaW50ZXJzLi4uCisJc3VibAklZWF4LCVlZGkJCUMgLi4uIHNpbmNlIHRoZXkgYXJlIG9mZnNldCAuLi4KKwlzdWJsCSVlYXgsJWVzaQkJQyAuLi4gYnkgYSBjb25zdGFudCB3aGVuIHdlIC4uLgorCXN1YmwJJWVheCwlZWR4CQlDIC4uLiBlbnRlciB0aGUgbG9vcAorCXNocmwJJDIsJWVheAkJCUMgcmVzdG9yZSBwcmV2aW91cyB2YWx1ZQorCitpZmRlZihgUElDJyxgCisJQyBDYWxjdWxhdGUgc3RhcnQgYWRkcmVzcyBpbiBsb29wIGZvciBQSUMuICBEdWUgdG8gbGltaXRhdGlvbnMgaW4KKwlDIHNvbWUgYXNzZW1ibGVycywgTChvb3ApLUwoMGIpLTMgY2Fubm90IGJlIHB1dCBpbnRvIHRoZSBsZWFsCisJY2FsbAlMKDBiKQorTCgwYik6CWxlYWwJKCVlYXgsJWVheCw4KSwlZWF4CisJYWRkbAkoJWVzcCksJWVheAorCWFkZGwJJEwob29wKS1MKDBiKS0zLCVlYXgKKwlhZGRsCSQ0LCVlc3AKKycsYAorCUMgQ2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3MgaW4gbG9vcCBmb3Igbm9uLVBJQy4KKwlsZWFsCUwob29wKS0zKCVlYXgsJWVheCw4KSwlZWF4CisnKQorCWptcAkqJWVheAkJCUMganVtcCBpbnRvIGxvb3AKKworTChvb3Bnbyk6CisJcHVzaGwJJWVicAkJRlJBTUVfcHVzaGwoKQorCW1vdmwJUEFSQU1fQ0FSUlksJWVicAorCXNocmwJJWVicAkJCUMgc2hpZnQgYml0IDAgaW50byBjYXJyeQorCXBvcGwJJWVicAkJRlJBTUVfcG9wbCgpCisKKwlBTElHTigxNikKK0wob29wKToJbW92bAkoJWVzaSksJWVheAorCU00X2luc3QJKCVlZHgpLCVlYXgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAk0KCVlc2kpLCVlYXgKKwlNNF9pbnN0CTQoJWVkeCksJWVheAorCW1vdmwJJWVheCw0KCVlZGkpCisJbW92bAk4KCVlc2kpLCVlYXgKKwlNNF9pbnN0CTgoJWVkeCksJWVheAorCW1vdmwJJWVheCw4KCVlZGkpCisJbW92bAkxMiglZXNpKSwlZWF4CisJTTRfaW5zdAkxMiglZWR4KSwlZWF4CisJbW92bAklZWF4LDEyKCVlZGkpCisJbW92bAkxNiglZXNpKSwlZWF4CisJTTRfaW5zdAkxNiglZWR4KSwlZWF4CisJbW92bAklZWF4LDE2KCVlZGkpCisJbW92bAkyMCglZXNpKSwlZWF4CisJTTRfaW5zdAkyMCglZWR4KSwlZWF4CisJbW92bAklZWF4LDIwKCVlZGkpCisJbW92bAkyNCglZXNpKSwlZWF4CisJTTRfaW5zdAkyNCglZWR4KSwlZWF4CisJbW92bAklZWF4LDI0KCVlZGkpCisJbW92bAkyOCglZXNpKSwlZWF4CisJTTRfaW5zdAkyOCglZWR4KSwlZWF4CisJbW92bAklZWF4LDI4KCVlZGkpCisJbGVhbAkzMiglZWRpKSwlZWRpCisJbGVhbAkzMiglZXNpKSwlZXNpCisJbGVhbAkzMiglZWR4KSwlZWR4CisJZGVjbAklZWN4CisJam56CUwob29wKQorCisJc2JibAklZWF4LCVlYXgKKwluZWdsCSVlYXgKKworCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L2FvcnNtdWxfMS5hc20gYi9tcG4veDg2L2FvcnNtdWxfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3Yjc3NAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvYW9yc211bF8xLmFzbQpAQCAtMCwwICsxLDIxNCBAQAorZG5sICB4ODYgX19nbXBuX2FkZG11bF8xIChmb3IgMzg2IGFuZCA0ODYpIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3Igd2l0aCBhCitkbmwgIGxpbWIgYW5kIGFkZCB0aGUgcmVzdWx0IHRvIGEgc2Vjb25kIGxpbWIgdmVjdG9yLgorCitkbmwgIENvcHlyaWdodCAxOTkyLCAxOTk0LCAxOTk3LCAxOTk5LTIwMDIsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkJCSAgICBjeWNsZXMvbGltYgorQyBQNQkJCQkKK0MgUDYgbW9kZWwgMC04LDEwLTEyCQkKK0MgUDYgbW9kZWwgOSAgKEJhbmlhcykJCQorQyBQNiBtb2RlbCAxMyAoRG90aGFuKQkJCitDIFA0IG1vZGVsIDAgIChXaWxsYW1ldHRlKQkKK0MgUDQgbW9kZWwgMSAgKD8pCQkKK0MgUDQgbW9kZWwgMiAgKE5vcnRod29vZCkJCitDIFA0IG1vZGVsIDMgIChQcmVzY290dCkKK0MgUDQgbW9kZWwgNCAgKE5vY29uYSkKK0MgSW50ZWwgQXRvbQorQyBBTUQgSzYJCQkKK0MgQU1EIEs3CQkJCitDIEFNRCBLOAkJCSAzLjg3NQorQyBBTUQgSzEwCisKKworaWZkZWYoYE9QRVJBVElPTl9hZGRtdWxfMScsYAorICAgICAgZGVmaW5lKEFERFNVQiwgICAgICAgIGFkZGwpCisgICAgICBkZWZpbmUoTTRfZnVuY3Rpb25fMSwgIG1wbl9hZGRtdWxfMSkKKyAgICAgIGRlZmluZShNNF9mdW5jdGlvbl8xYywgbXBuX2FkZG11bF8xYykKKworJyxgaWZkZWYoYE9QRVJBVElPTl9zdWJtdWxfMScsYAorICAgICAgZGVmaW5lKEFERFNVQiwgICAgICAgIHN1YmwpCisgICAgICBkZWZpbmUoTTRfZnVuY3Rpb25fMSwgIG1wbl9zdWJtdWxfMSkKKworJyxgbTRfZXJyb3IoYE5lZWQgT1BFUkFUSU9OX2FkZG11bF8xIG9yIE9QRVJBVElPTl9zdWJtdWxfMQorJyknKScpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FkZG11bF8xIG1wbl9zdWJtdWxfMSBtcG5fYWRkbXVsXzFjKQorCisKK0MgbXBfbGltYl90IE00X2Z1bmN0aW9uXzEgKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplLAorQyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBfbGltYl90IG11bHQpOworCitkZWZpbmUoUEFSQU1fQ0FSUlksICAgICAgYEZSQU1FKzIwKCVlc3ApJykKK2RlZmluZShQQVJBTV9NVUxUSVBMSUVSLCBgRlJBTUUrMTYoJWVzcCknKQorZGVmaW5lKFBBUkFNX1NJWkUsICAgICAgIGBGUkFNRSsxMiglZXNwKScpCitkZWZpbmUoUEFSQU1fU1JDLCAgICAgICAgYEZSQU1FKzgoJWVzcCknKQorZGVmaW5lKFBBUkFNX0RTVCwgICAgICAgIGBGUkFNRSs0KCVlc3ApJykKKworCVRFWFQKKwlBTElHTigzMikKK1BST0xPR1VFKE00X2Z1bmN0aW9uXzEpCitkZWZsaXQoYEZSQU1FJywwKQorCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVicAorZGVmbGl0KGBGUkFNRScsMTYpCisKKwltb3ZsCVBBUkFNX1NSQywgJWVzaQorCW1vdmwJUEFSQU1fU0laRSwgJWVjeAorCW1vdmwJUEFSQU1fRFNULCAlZWRpCisKKwltb3ZsCSglZXNpKSwgJWVheAorCW11bGwJUEFSQU1fTVVMVElQTElFUgorCisJdGVzdGIJJDEsICVjbAorCWpueglMKGJ4MSkKKworTChieDApOgltb3ZsCSVlYXgsICVlYngKKwltb3ZsCSVlZHgsICVlYnAKKwlzaHJsCSQyLCAlZWN4CisJam5jCUwobG8wKQorCitMKGIxMCk6CWxlYWwJLTgoJWVzaSksICVlc2kKKwlsZWFsCS04KCVlZGkpLCAlZWRpCisJaW5jbAklZWN4CisJam1wCUwobG8yKQorCitMKGJ4MSk6CW1vdmwJJWVheCwgJWVicAorCW1vdmwJJWVkeCwgJWVieAorCXNocmwJJDIsICVlY3gKKwlqYwlMKGIxMSkKKworTChiMDEpOglsZWFsCTQoJWVkaSksICVlZGkKKwlqeglMKGVuZCkKKwlsZWFsCTQoJWVzaSksICVlc2kKKwlqbXAJTCh0b3ApCisKK0woYjExKToJbGVhbAktNCglZXNpKSwgJWVzaQorCWxlYWwJLTQoJWVkaSksICVlZGkKKwlpbmNsCSVlY3gKKwlqbXAJTChsbzMpCisKKwlBTElHTigxNikKK0wodG9wKToJbW92bAkoJWVzaSksICVlYXgKKwltdWxsCVBBUkFNX01VTFRJUExJRVIKKwlBRERTVUIJJWVicCwgLTQoJWVkaSkKKwlhZGNsCSVlYXgsICVlYngKKwltb3ZsCSQwLCAlZWJwCisJYWRjbAklZWR4LCAlZWJwCitMKGxvMCk6CW1vdmwJNCglZXNpKSwgJWVheAorCW11bGwJUEFSQU1fTVVMVElQTElFUgorCUFERFNVQgklZWJ4LCAoJWVkaSkKKwlhZGNsCSVlYXgsICVlYnAKKwltb3ZsCSQwLCAlZWJ4CisJYWRjbAklZWR4LCAlZWJ4CitMKGxvMyk6CW1vdmwJOCglZXNpKSwgJWVheAorCW11bGwJUEFSQU1fTVVMVElQTElFUgorCUFERFNVQgklZWJwLCA0KCVlZGkpCisJYWRjbAklZWF4LCAlZWJ4CisJbW92bAkkMCwgJWVicAorCWFkY2wJJWVkeCwgJWVicAorTChsbzIpOgltb3ZsCTEyKCVlc2kpLCAlZWF4CisJbXVsbAlQQVJBTV9NVUxUSVBMSUVSCisJQUREU1VCCSVlYngsIDgoJWVkaSkKKwlhZGNsCSVlYXgsICVlYnAKKwltb3ZsCSQwLCAlZWJ4CisJYWRjbAklZWR4LCAlZWJ4CisKKwlsZWFsCTE2KCVlc2kpLCAlZXNpCisJbGVhbAkxNiglZWRpKSwgJWVkaQorCWRlY2wJJWVjeAorCWpueglMKHRvcCkKKworTChlbmQpOgl4b3IJJWVheCwgJWVheAorCUFERFNVQgklZWJwLCAtNCglZWRpKQorCWFkY2wJJWVieCwgJWVheAorCXBvcGwJJWVicAorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitFUElMT0dVRSgpCitpZmRlZihgT1BFUkFUSU9OX2FkZG11bF8xJyxgCisJQUxJR04oMzIpCitQUk9MT0dVRShNNF9mdW5jdGlvbl8xYykKK2RlZmxpdChgRlJBTUUnLDApCisKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlYngKKwlwdXNobAklZWJwCitkZWZsaXQoYEZSQU1FJywxNikKKworCW1vdmwJUEFSQU1fU1JDLCAlZXNpCisJbW92bAlQQVJBTV9TSVpFLCAlZWN4CisJbW92bAlQQVJBTV9EU1QsICVlZGkKKworCW1vdmwJKCVlc2kpLCAlZWF4CisJbXVsbAlQQVJBTV9NVUxUSVBMSUVSCisKKwl0ZXN0YgkkMSwgJWNsCisJam56CUwoY3gxKQorCisJbW92bAlQQVJBTV9DQVJSWSwgJWVieAorCXhvcmwJJWVicCwgJWVicAorCitMKGN4MCk6CWFkZGwJJWVheCwgJWVieAorCWFkY2wJJWVkeCwgJWVicAorCXNocmwJJDIsICVlY3gKKwlqbmMJTChsbzApCisKK0woYzEwKToJbGVhbAktOCglZXNpKSwgJWVzaQorCWxlYWwJLTgoJWVkaSksICVlZGkKKwlpbmNsCSVlY3gKKwlqbXAJTChsbzIpCisKK0woY3gxKToJbW92bAlQQVJBTV9DQVJSWSwgJWVicAorCXhvcmwJJWVieCwgJWVieAorCisJYWRkbAklZWF4LCAlZWJwCisJYWRjbAklZWR4LCAlZWJ4CisJc2hybAkkMiwgJWVjeAorCWpjCUwoYzExKQorCitMKGMwMSk6CWxlYWwJNCglZWRpKSwgJWVkaQorCWp6CUwoZW5kKQorCWxlYWwJNCglZXNpKSwgJWVzaQorCWptcAlMKHRvcCkKKworTChjMTEpOglsZWFsCS00KCVlc2kpLCAlZXNpCisJbGVhbAktNCglZWRpKSwgJWVkaQorCWluY2wJJWVjeAorCWptcAlMKGxvMykKK0VQSUxPR1VFKCkKKycpCmRpZmYgLS1naXQgYS9tcG4veDg2L2JkaXZfZGJtMWMuYXNtIGIvbXBuL3g4Ni9iZGl2X2RibTFjLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTFhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Ni9iZGl2X2RibTFjLmFzbQpAQCAtMCwwICsxLDEyOSBAQAorZG5sICB4ODYgbXBuX2JkaXZfZGJtMS4KKworZG5sICBDb3B5cmlnaHQgMjAwOCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCQkJICAgIGN5Y2xlcy9saW1iCitDIFA1CitDIFA2IG1vZGVsIDAtOCwxMC0xMikKK0MgUDYgbW9kZWwgOSAgKEJhbmlhcykKK0MgUDYgbW9kZWwgMTMgKERvdGhhbikJCSA1LjEKK0MgUDQgbW9kZWwgMCAgKFdpbGxhbWV0dGUpCitDIFA0IG1vZGVsIDEgICg/KQorQyBQNCBtb2RlbCAyICAoTm9ydGh3b29kKQkxMy42NworQyBQNCBtb2RlbCAzICAoUHJlc2NvdHQpCitDIFA0IG1vZGVsIDQgIChOb2NvbmEpCitDIEludGVsIEF0b20KK0MgQU1EIEs2CitDIEFNRCBLNwkJCSAzLjUKK0MgQU1EIEs4CitDIEFNRCBLMTAKKworCitDIFRPRE8KK0MgICogT3B0aW1pemUgZm9yIG1vcmUgeDg2IHByb2Nlc3NvcnMKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fYmRpdl9kYm0xYykKKwltb3YJMTYoJWVzcCksICVlY3gJCUMgZAorCXB1c2gJJWVzaQorCW1vdgkxMiglZXNwKSwgJWVzaQkJQyBhcAorCXB1c2gJJWVkaQorCW1vdgkxMiglZXNwKSwgJWVkaQkJQyBxcAorCXB1c2gJJWVicAorCW1vdgkyNCglZXNwKSwgJWVicAkJQyBuCisJcHVzaAklZWJ4CisKKwltb3YJKCVlc2kpLCAlZWF4CisJbXVsCSVlY3gKKwltb3YJMzYoJWVzcCksICVlYngKKwlzdWIJJWVheCwgJWVieAorCW1vdgklZWJ4LCAoJWVkaSkKKwlzYmIJJWVkeCwgJWVieAorCisJbW92CSVlYnAsICVlYXgKKwlhbmQJJDMsICVlYXgKKwlqeglMKGIwKQorCWNtcAkkMiwgJWVheAorCWpjCUwoYjEpCisJanoJTChiMikKKworTChiMyk6CWxlYQktOCglZXNpKSwgJWVzaQorCWxlYQk4KCVlZGkpLCAlZWRpCisJYWRkCSQtMywgJWVicAorCWptcAlMKDMpCisKK0woYjApOgltb3YJNCglZXNpKSwgJWVheAorCWxlYQktNCglZXNpKSwgJWVzaQorCWxlYQkxMiglZWRpKSwgJWVkaQorCWFkZAkkLTQsICVlYnAKKwlqbXAJTCgwKQorCitMKGIyKToJbW92CTQoJWVzaSksICVlYXgKKwlsZWEJNCglZXNpKSwgJWVzaQorCWxlYQk0KCVlZGkpLCAlZWRpCisJYWRkCSQtMiwgJWVicAorCWptcAlMKDIpCisKKwlBTElHTig4KQorTCh0b3ApOgltb3YJNCglZXNpKSwgJWVheAorCW11bAklZWN4CisJbGVhCTE2KCVlZGkpLCAlZWRpCisJc3ViCSVlYXgsICVlYngKKwltb3YJOCglZXNpKSwgJWVheAorCW1vdgklZWJ4LCAtMTIoJWVkaSkKKwlzYmIJJWVkeCwgJWVieAorTCgwKToJbXVsCSVlY3gKKwlzdWIJJWVheCwgJWVieAorCW1vdgklZWJ4LCAtOCglZWRpKQorCXNiYgklZWR4LCAlZWJ4CitMKDMpOgltb3YJMTIoJWVzaSksICVlYXgKKwltdWwJJWVjeAorCXN1YgklZWF4LCAlZWJ4CisJbW92CSVlYngsIC00KCVlZGkpCisJbW92CTE2KCVlc2kpLCAlZWF4CisJbGVhCTE2KCVlc2kpLCAlZXNpCisJc2JiCSVlZHgsICVlYngKK0woMik6CW11bAklZWN4CisJc3ViCSVlYXgsICVlYngKKwltb3YJJWVieCwgMCglZWRpKQorCXNiYgklZWR4LCAlZWJ4CitMKGIxKToJYWRkCSQtNCwgJWVicAorCWpucwlMKHRvcCkKKworCW1vdgklZWJ4LCAlZWF4CisJcG9wCSVlYngKKwlwb3AJJWVicAorCXBvcAklZWRpCisJcG9wCSVlc2kKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODYvYmRpdl9xXzEuYXNtIGIvbXBuL3g4Ni9iZGl2X3FfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyYTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvYmRpdl9xXzEuYXNtCkBAIC0wLDAgKzEsMjA4IEBACitkbmwgIHg4NiBtcG5fYmRpdl9xXzEgLS0gbXBuIGJ5IGxpbWIgZXhhY3QgZGl2aXNpb24uCisKK2RubCAgUmVhcnJhbmdlZCBmcm9tIG1wbi94ODYvZGl2ZV8xLmFzbSBieSBNYXJjbyBCb2RyYXRvLgorCitkbmwgIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA3LCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyAgICAgY3ljbGVzL2xpbWIKK0MgUDU0ICAgIDMwLjAKK0MgUDU1ICAgIDI5LjAKK0MgUDYgICAgIDEzLjAgb2RkIGRpdmlzb3IsIDEyLjAgZXZlbiAoc3RyYW5nZWx5KQorQyBLNiAgICAgMTQuMAorQyBLNyAgICAgMTIuMAorQyBQNCAgICAgNDIuMAorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9iZGl2X3FfMSBtcG5fcGkxX2JkaXZfcV8xKQorCitkZWZmcmFtZShQQVJBTV9TSElGVCwgIDI0KQorZGVmZnJhbWUoUEFSQU1fSU5WRVJTRSwyMCkKK2RlZmZyYW1lKFBBUkFNX0RJVklTT1IsMTYpCitkZWZmcmFtZShQQVJBTV9TSVpFLCAgIDEyKQorZGVmZnJhbWUoUEFSQU1fU1JDLCAgICA4KQorZGVmZnJhbWUoUEFSQU1fRFNULCAgICA0KQorCitkbmwgIHJlLXVzZSBwYXJhbWV0ZXIgc3BhY2UKK2RlZmluZShWQVJfSU5WRVJTRSxgUEFSQU1fU1JDJykKKworCVRFWFQKKworQyBtcF9saW1iX3QKK0MgbXBuX3BpMV9iZGl2X3FfMSAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBkaXZpc29yLAorQwkJICAgIG1wX2xpbWJfdCBpbnZlcnNlLCBpbnQgc2hpZnQpCisKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9waTFfYmRpdl9xXzEpCitkZWZsaXQoYEZSQU1FJywwKQorCisJbW92bAlQQVJBTV9TSElGVCwgJWVjeAorCXB1c2hsCSVlYnAJRlJBTUVfcHVzaGwoKQorCisJbW92bAlQQVJBTV9JTlZFUlNFLCAlZWF4CisJbW92bAlQQVJBTV9TSVpFLCAlZWJwCisJcHVzaGwJJWVieAlGUkFNRV9wdXNobCgpCitMKGNvbW1vbik6CisJcHVzaGwJJWVkaQlGUkFNRV9wdXNobCgpCisJcHVzaGwJJWVzaQlGUkFNRV9wdXNobCgpCisKKwltb3ZsCVBBUkFNX1NSQywgJWVzaQorCW1vdmwJUEFSQU1fRFNULCAlZWRpCisKKwlsZWFsCSglZXNpLCVlYnAsNCksICVlc2kJQyBzcmMgZW5kCisJbGVhbAkoJWVkaSwlZWJwLDQpLCAlZWRpCUMgZHN0IGVuZAorCW5lZ2wJJWVicAkJCUMgLXNpemUKKworCW1vdmwJJWVheCwgVkFSX0lOVkVSU0UKKwltb3ZsCSglZXNpLCVlYnAsNCksICVlYXgJQyBzcmNbMF0KKworCXhvcmwJJWVieCwgJWVieAorCXhvcmwJJWVkeCwgJWVkeAorCisJaW5jbAklZWJwCisJanoJTChvbmUpCisKKwltb3ZsCSglZXNpLCVlYnAsNCksICVlZHgJQyBzcmNbMV0KKworCXNocmRsKAklY2wsICVlZHgsICVlYXgpCisKKwltb3ZsCVZBUl9JTlZFUlNFLCAlZWR4CisJam1wCUwoZW50cnkpCisKKworCUFMSUdOKDgpCisJbm9wCUMgazYgY29kZSBhbGlnbm1lbnQKKwlub3AKK0wodG9wKToKKwlDIGVheAlxCisJQyBlYngJY2FycnkgYml0LCAwIG9yIC0xCisJQyBlY3gJc2hpZnQKKwlDIGVkeAljYXJyeSBsaW1iCisJQyBlc2kJc3JjIGVuZAorCUMgZWRpCWRzdCBlbmQKKwlDIGVicAljb3VudGVyLCBsaW1icywgbmVnYXRpdmUKKworCW1vdmwJLTQoJWVzaSwlZWJwLDQpLCAlZWF4CisJc3VibAklZWJ4LCAlZWR4CQlDIGFjY3VtdWxhdGUgY2FycnkgYml0CisKKwltb3ZsCSglZXNpLCVlYnAsNCksICVlYngKKworCXNocmRsKAklY2wsICVlYngsICVlYXgpCisKKwlzdWJsCSVlZHgsICVlYXgJCUMgYXBwbHkgY2FycnkgbGltYgorCW1vdmwJVkFSX0lOVkVSU0UsICVlZHgKKworCXNiYmwJJWVieCwgJWVieAorCitMKGVudHJ5KToKKwlpbXVsbAklZWR4LCAlZWF4CisKKwltb3ZsCSVlYXgsIC00KCVlZGksJWVicCw0KQorCW1vdmwJUEFSQU1fRElWSVNPUiwgJWVkeAorCisJbXVsbAklZWR4CisKKwlpbmNsCSVlYnAKKwlqbnoJTCh0b3ApCisKKworCW1vdmwJLTQoJWVzaSksICVlYXgJCUMgc3JjIGhpZ2ggbGltYgorTChvbmUpOgorCXNocmwJJWNsLCAlZWF4CisJcG9wbAklZXNpCUZSQU1FX3BvcGwoKQorCisJYWRkbAklZWJ4LCAlZWF4CQlDIGFwcGx5IGNhcnJ5IGJpdAorCisJc3VibAklZWR4LCAlZWF4CQlDIGFwcGx5IGNhcnJ5IGxpbWIKKworCWltdWxsCVZBUl9JTlZFUlNFLCAlZWF4CisKKwltb3ZsCSVlYXgsIC00KCVlZGkpCisKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKworCXJldAorCitFUElMT0dVRSgpCisKK0MgbXBfbGltYl90IG1wbl9iZGl2X3FfMSAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsCitDICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBfbGltYl90IGRpdmlzb3IpOworQworCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fYmRpdl9xXzEpCitkZWZsaXQoYEZSQU1FJywwKQorCisJbW92bAlQQVJBTV9ESVZJU09SLCAlZWF4CisJcHVzaGwJJWVicAlGUkFNRV9wdXNobCgpCisKKwltb3ZsCSQtMSwgJWVjeAkJQyBzaGlmdCBjb3VudAorCW1vdmwJUEFSQU1fU0laRSwgJWVicAorCisJcHVzaGwJJWVieAlGUkFNRV9wdXNobCgpCisKK0woc3RyaXBfdHdvcyk6CisJaW5jbAklZWN4CisKKwlzaHJsCSVlYXgKKwlqbmMJTChzdHJpcF90d29zKQorCisJbGVhbAkxKCVlYXgsJWVheCksICVlYngJQyBkIHdpdGhvdXQgdHdvcworCWFuZGwJJDEyNywgJWVheAkJQyBkLzIsIDcgYml0cworCitpZmRlZihgUElDJyxgCisJTEVBKAliaW52ZXJ0X2xpbWJfdGFibGUsICVlZHgpCisJbW92emJsCSglZWF4LCVlZHgpLCAlZWF4CQlDIGludiA4IGJpdHMKKycsYAorCW1vdnpibAliaW52ZXJ0X2xpbWJfdGFibGUoJWVheCksICVlYXgJQyBpbnYgOCBiaXRzCisnKQorCisJbGVhbAkoJWVheCwlZWF4KSwgJWVkeAlDIDIqaW52CisJbW92bAklZWJ4LCBQQVJBTV9ESVZJU09SCUMgZCB3aXRob3V0IHR3b3MKKwlpbXVsbAklZWF4LCAlZWF4CQlDIGludippbnYKKwlpbXVsbAklZWJ4LCAlZWF4CQlDIGludippbnYqZAorCXN1YmwJJWVheCwgJWVkeAkJQyBpbnYgPSAyKmludiAtIGludippbnYqZAorCisJbGVhbAkoJWVkeCwlZWR4KSwgJWVheAlDIDIqaW52CisJaW11bGwJJWVkeCwgJWVkeAkJQyBpbnYqaW52CisJaW11bGwJJWVieCwgJWVkeAkJQyBpbnYqaW52KmQKKwlzdWJsCSVlZHgsICVlYXgJCUMgaW52ID0gMippbnYgLSBpbnYqaW52KmQKKworCUFTU0VSVChlLGAJQyBleHBlY3QgZCppbnYgPT0gMSBtb2QgMl5HTVBfTElNQl9CSVRTCisJcHVzaGwJJWVheAlGUkFNRV9wdXNobCgpCisJaW11bGwJUEFSQU1fRElWSVNPUiwgJWVheAorCWNtcGwJJDEsICVlYXgKKwlwb3BsCSVlYXgJRlJBTUVfcG9wbCgpJykKKworCWptcAlMKGNvbW1vbikKK0VQSUxPR1VFKCkKK0FTTV9FTkQoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9jbmRfYW9yc19uLmFzbSBiL21wbi94ODYvY25kX2FvcnNfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3Nzg2YQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvY25kX2FvcnNfbi5hc20KQEAgLTAsMCArMSwxMjQgQEAKK2RubCAgWDg2IG1wbl9jbmRfYWRkX24sIG1wbl9jbmRfc3ViX24KKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCQkJICAgIGN5Y2xlcy9saW1iCitDIFA1CQkJCSA/CitDIFA2IG1vZGVsIDAtOCwxMC0xMgkJID8KK0MgUDYgbW9kZWwgOSAgIChCYW5pYXMpCQkgPworQyBQNiBtb2RlbCAxMyAgKERvdGhhbikJCSA1LjQKK0MgUDQgbW9kZWwgMC0xIChXaWxsYW1ldHRlKQkgPworQyBQNCBtb2RlbCAyICAgKE5vcnRod29vZCkJMTQuNQorQyBQNCBtb2RlbCAzLTQgKFByZXNjb3R0KQkyMQorQyBJbnRlbCBhdG9tCQkJMTEKK0MgQU1EIEs2CQkJID8KK0MgQU1EIEs3CQkJIDMuNAorQyBBTUQgSzgJCQkgPworCisKK2RlZmluZShgcnAnLCAgYCVlZGknKQorZGVmaW5lKGB1cCcsICBgJWVzaScpCitkZWZpbmUoYHZwJywgIGAlZWJwJykKK2RlZmluZShgbicsICAgYCVlY3gnKQorZGVmaW5lKGBjbmQnLCBgMjAoJWVzcCknKQorZGVmaW5lKGBjeScsICBgJWVkeCcpCisKK2lmZGVmKGBPUEVSQVRJT05fY25kX2FkZF9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIGFkZCkKKwlkZWZpbmUoQURDU0JCLAkgICAgICBhZGMpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9jbmRfYWRkX24pJykKK2lmZGVmKGBPUEVSQVRJT05fY25kX3N1Yl9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIHN1YikKKwlkZWZpbmUoQURDU0JCLAkgICAgICBzYmIpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9jbmRfc3ViX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fY25kX2FkZF9uIG1wbl9jbmRfc3ViX24pCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwlhZGQJJC0xNiwgJWVzcAorCW1vdgklZWJwLCAoJWVzcCkKKwltb3YJJWVieCwgNCglZXNwKQorCW1vdgklZXNpLCA4KCVlc3ApCisJbW92CSVlZGksIDEyKCVlc3ApCisKKwlDIG1ha2UgY25kIGludG8gYSBmdWxsIG1hc2sKKwltb3YJY25kLCAlZWF4CisJbmVnCSVlYXgKKwlzYmIJJWVheCwgJWVheAorCW1vdgklZWF4LCBjbmQKKworCUMgbG9hZCBwYXJhbWV0ZXJzIGludG8gcmVnaXN0ZXJzCisJbW92CTI0KCVlc3ApLCBycAorCW1vdgkyOCglZXNwKSwgdXAKKwltb3YJMzIoJWVzcCksIHZwCisJbW92CTM2KCVlc3ApLCBuCisKKwltb3YJKHZwKSwgJWVheAorCW1vdgkodXApLCAlZWJ4CisKKwlDIHB1dCBvcGVyYW5kIHBvaW50ZXJzIGp1c3QgYmV5b25kIHRoZWlyIGxhc3QgbGltYgorCWxlYQkodnAsbiw0KSwgdnAKKwlsZWEJKHVwLG4sNCksIHVwCisJbGVhCS00KHJwLG4sNCksIHJwCisJbmVnCW4KKworCWFuZAljbmQsICVlYXgKKwlBRERTVUIJJWVheCwgJWVieAorCXNiYgljeSwgY3kKKwlpbmMJbgorCWplCUwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CW1vdgkodnAsbiw0KSwgJWVheAorCWFuZAljbmQsICVlYXgKKwltb3YJJWVieCwgKHJwLG4sNCkKKwltb3YJKHVwLG4sNCksICVlYngKKwlhZGQJY3ksIGN5CisJQURDU0JCCSVlYXgsICVlYngKKwlzYmIJY3ksIGN5CisJaW5jCW4KKwlqbmUJTCh0b3ApCisKK0woZW5kKToJbW92CSVlYngsIChycCkKKwl4b3IJJWVheCwgJWVheAorCXN1YgljeSwgJWVheAorCisJbW92CSglZXNwKSwgJWVicAorCW1vdgk0KCVlc3ApLCAlZWJ4CisJbW92CTgoJWVzcCksICVlc2kKKwltb3YJMTIoJWVzcCksICVlZGkKKwlhZGQJJDE2LCAlZXNwCisJcmV0CitFUElMT0dVRSgpCitBU01fRU5EKCkKZGlmZiAtLWdpdCBhL21wbi94ODYvY29weWQuYXNtIGIvbXBuL3g4Ni9jb3B5ZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmM2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvY29weWQuYXNtCkBAIC0wLDAgKzEsOTEgQEAKK2RubCAgeDg2IG1wbl9jb3B5ZCAtLSBjb3B5IGxpbWIgdmVjdG9yLCBkZWNyZW1lbnRpbmcuCisKK2RubCAgQ29weXJpZ2h0IDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgICAgIGN5Y2xlcy9saW1iICBzdGFydHVwIChhcHByb3gpCitDIFA1CSAgMS4wCSAgICAgIDQwCitDIFA2CSAgMi40CSAgICAgIDcwCitDIEs2CSAgMS4wCSAgICAgIDU1CitDIEs3CSAgMS4zCSAgICAgIDc1CitDIFA0CSAgMi42CSAgICAgMTc1CitDCitDIChTdGFydHVwIHRpbWUgaW5jbHVkZXMgc29tZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkcy4pCisKKworQyB2b2lkIG1wbl9jb3B5ZCAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUpOworQworQyBDb3B5IHNyYyxzaXplIHRvIGRzdCxzaXplLCB3b3JraW5nIGZyb20gaGlnaCB0byBsb3cgYWRkcmVzc2VzLgorQworQyBUaGUgY29kZSBoZXJlIGlzIHZlcnkgZ2VuZXJpYyBhbmQgY2FuIGJlIGV4cGVjdGVkIHRvIGJlIHJlYXNvbmFibGUgb24gYWxsCitDIHRoZSB4ODYgZmFtaWx5LgorCitkZWZmcmFtZShQQVJBTV9TSVpFLDEyKQorZGVmZnJhbWUoUEFSQU1fU1JDLCA4KQorZGVmZnJhbWUoUEFSQU1fRFNULCA0KQorZGVmbGl0KGBGUkFNRScsMCkKKworCVRFWFQKKwlBTElHTigzMikKKworUFJPTE9HVUUobXBuX2NvcHlkKQorCUMgZWF4CXNhdmVkIGVzaQorCUMgZWJ4CisJQyBlY3gJY291bnRlcgorCUMgZWR4CXNhdmVkIGVkaQorCUMgZXNpCXNyYworCUMgZWRpCWRzdAorCUMgZWJwCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlY3gKKwltb3ZsCSVlc2ksICVlYXgKKworCW1vdmwJUEFSQU1fU1JDLCAlZXNpCisJbW92bAklZWRpLCAlZWR4CisKKwltb3ZsCVBBUkFNX0RTVCwgJWVkaQorCWxlYWwJLTQoJWVzaSwlZWN4LDQpLCAlZXNpCisKKwlsZWFsCS00KCVlZGksJWVjeCw0KSwgJWVkaQorCisJc3RkCisKKwlyZXAKKwltb3ZzbAorCisJY2xkCisKKwltb3ZsCSVlYXgsICVlc2kKKwltb3ZsCSVlZHgsICVlZGkKKworCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L2NvcHlpLmFzbSBiL21wbi94ODYvY29weWkuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMGQ1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2L2NvcHlpLmFzbQpAQCAtMCwwICsxLDk5IEBACitkbmwgIHg4NiBtcG5fY29weWkgLS0gY29weSBsaW1iIHZlY3RvciwgaW5jcmVtZW50aW5nLgorCitkbmwgIENvcHlyaWdodCAxOTk5LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDICAgICBjeWNsZXMvbGltYiAgc3RhcnR1cCAoYXBwcm94KQorQyBQNQkgIDEuMAkgICAgICAzNQorQyBQNgkgIDAuNzUJICAgICAgNDUKK0MgSzYJICAxLjAJICAgICAgMzAKK0MgSzcJICAxLjMJICAgICAgNjUKK0MgUDQJICAxLjAJICAgICAxMjAKK0MKK0MgKFN0YXJ0dXAgdGltZSBpbmNsdWRlcyBzb21lIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWRzLikKKworCitDIHZvaWQgbXBuX2NvcHlpIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSk7CitDCitDIENvcHkgc3JjLHNpemUgdG8gZHN0LHNpemUsIHdvcmtpbmcgZnJvbSBsb3cgdG8gaGlnaCBhZGRyZXNzZXMuCitDCitDIFRoZSBjb2RlIGhlcmUgaXMgdmVyeSBnZW5lcmljIGFuZCBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgcmVhc29uYWJsZSBvbiBhbGwKK0MgdGhlIHg4NiBmYW1pbHkuCitDCitDIFA2IC0gIEFuIE1NWCBiYXNlZCBjb3B5IHdhcyB0cmllZCwgYnV0IHdhcyBmb3VuZCB0byBiZSBzbG93ZXIgdGhhbiBhIHJlcAorQyAgICAgICBtb3ZzIGluIGFsbCBjYXNlcy4gIFRoZSBmYXN0ZXN0IE1NWCBmb3VuZCB3YXMgMC44IGN5Y2xlcy9saW1iICh3aGVuCitDICAgICAgIGZ1bGx5IGFsaWduZWQpLiAgQSByZXAgbW92cyBzZWVtcyB0byBoYXZlIGEgc3RhcnR1cCB0aW1lIG9mIGFib3V0IDE1CitDICAgICAgIGN5Y2xlcywgYnV0IGRvaW5nIHNvbWV0aGluZyBzcGVjaWFsIGZvciBzbWFsbCBzaXplcyBjb3VsZCBsZWFkIHRvIGEKK0MgICAgICAgYnJhbmNoIG1pc3ByZWRpY3Rpb24gdGhhdCB3b3VsZCBkZXN0cm95IGFueSBzYXZpbmcuICBGb3Igbm93IGEgcGxhaW4KK0MgICAgICAgcmVwIG1vdnMgc2VlbXMgb2suCitDCitDIEs2MiAtIFdlIHVzZWQgdG8gaGF2ZSBhIGJpZyBjaHVuayBvZiBjb2RlIGRvaW5nIGFuIE1NWCBjb3B5IGF0IDAuNTYgYy9sIGlmCitDICAgICAgIGFsaWduZWQgb3IgYSAxLjAgcmVwIG1vdnMgaWYgbm90LiAgQnV0IHRoYXQgc2VlbWVkIGV4Y2Vzc2l2ZSBzaW5jZQorQyAgICAgICBpdCBvbmx5IGdvdCBhbiBhZHZhbnRhZ2UgaGFsZiB0aGUgdGltZSwgYW5kIGV2ZW4gdGhlbiBvbmx5IHNob3dlZCBpdAorQyAgICAgICBhYm92ZSA1MCBsaW1icyBvciBzby4KKworZGVmZnJhbWUoUEFSQU1fU0laRSwxMikKK2RlZmZyYW1lKFBBUkFNX1NSQywgOCkKK2RlZmZyYW1lKFBBUkFNX0RTVCwgNCkKK2RlZmxpdChgRlJBTUUnLDApCisKKwlURVhUCisJQUxJR04oMzIpCisKKwlDIGVheAlzYXZlZCBlc2kKKwlDIGVieAorCUMgZWN4CWNvdW50ZXIKKwlDIGVkeAlzYXZlZCBlZGkKKwlDIGVzaQlzcmMKKwlDIGVkaQlkc3QKKwlDIGVicAorCitQUk9MT0dVRShtcG5fY29weWkpCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlY3gKKwltb3ZsCSVlc2ksICVlYXgKKworCW1vdmwJUEFSQU1fU1JDLCAlZXNpCisJbW92bAklZWRpLCAlZWR4CisKKwltb3ZsCVBBUkFNX0RTVCwgJWVkaQorCisJY2xkCUMgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgc2VlIG1wbi94ODYvUkVBRE1FCisKKwlyZXAKKwltb3ZzbAorCisJbW92bAklZWF4LCAlZXNpCisJbW92bAklZWR4LCAlZWRpCisKKwlyZXQKKworRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9kaXZlXzEuYXNtIGIvbXBuL3g4Ni9kaXZlXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDg0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2L2RpdmVfMS5hc20KQEAgLTAsMCArMSwxOTAgQEAKK2RubCAgeDg2IG1wbl9kaXZleGFjdF8xIC0tIG1wbiBieSBsaW1iIGV4YWN0IGRpdmlzaW9uLgorCitkbmwgIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyAgICAgY3ljbGVzL2xpbWIKK0MgUDU0ICAgIDMwLjAKK0MgUDU1ICAgIDI5LjAKK0MgUDYgICAgIDEzLjAgb2RkIGRpdmlzb3IsIDEyLjAgZXZlbiAoc3RyYW5nZWx5KQorQyBLNiAgICAgMTQuMAorQyBLNyAgICAgMTIuMAorQyBQNCAgICAgNDIuMAorCisKK0MgbXBfbGltYl90IG1wbl9kaXZleGFjdF8xIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSwKK0MgICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9saW1iX3QgZGl2aXNvcik7CitDCisKK2RlZmZyYW1lKFBBUkFNX0RJVklTT1IsMTYpCitkZWZmcmFtZShQQVJBTV9TSVpFLCAgIDEyKQorZGVmZnJhbWUoUEFSQU1fU1JDLCAgICA4KQorZGVmZnJhbWUoUEFSQU1fRFNULCAgICA0KQorCitkbmwgIHJlLXVzZSBwYXJhbWV0ZXIgc3BhY2UKK2RlZmluZShWQVJfSU5WRVJTRSxgUEFSQU1fU1JDJykKKworCVRFWFQKKworCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX2RpdmV4YWN0XzEpCitkZWZsaXQoYEZSQU1FJywwKQorCisJbW92bAlQQVJBTV9ESVZJU09SLCAlZWF4CisJcHVzaGwJJWVicAlGUkFNRV9wdXNobCgpCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlYnAKKwlwdXNobAklZWRpCUZSQU1FX3B1c2hsKCkKKworCXB1c2hsCSVlYngJRlJBTUVfcHVzaGwoKQorCW1vdmwJJC0xLCAlZWN4CQlDIHNoaWZ0IGNvdW50CisKKwlwdXNobAklZXNpCUZSQU1FX3B1c2hsKCkKKworTChzdHJpcF90d29zKToKKwlpbmNsCSVlY3gKKworCXNocmwJJWVheAorCWpuYwlMKHN0cmlwX3R3b3MpCisKKwlsZWFsCTEoJWVheCwlZWF4KSwgJWVieAlDIGQgd2l0aG91dCB0d29zCisJYW5kbAkkMTI3LCAlZWF4CQlDIGQvMiwgNyBiaXRzCisKK2lmZGVmKGBQSUMnLGAKKwlMRUEoCWJpbnZlcnRfbGltYl90YWJsZSwgJWVkeCkKKwltb3Z6YmwJKCVlYXgsJWVkeCksICVlYXgJCUMgaW52IDggYml0cworJyxgCisJbW92emJsCWJpbnZlcnRfbGltYl90YWJsZSglZWF4KSwgJWVheAlDIGludiA4IGJpdHMKKycpCisKKwlsZWFsCSglZWF4LCVlYXgpLCAlZWR4CUMgMippbnYKKwltb3ZsCSVlYngsIFBBUkFNX0RJVklTT1IJQyBkIHdpdGhvdXQgdHdvcworCisJaW11bGwJJWVheCwgJWVheAkJQyBpbnYqaW52CisKKwltb3ZsCVBBUkFNX1NSQywgJWVzaQorCW1vdmwJUEFSQU1fRFNULCAlZWRpCisKKwlpbXVsbAklZWJ4LCAlZWF4CQlDIGludippbnYqZAorCisJc3VibAklZWF4LCAlZWR4CQlDIGludiA9IDIqaW52IC0gaW52KmludipkCisJbGVhbAkoJWVkeCwlZWR4KSwgJWVheAlDIDIqaW52CisKKwlpbXVsbAklZWR4LCAlZWR4CQlDIGludippbnYKKworCWxlYWwJKCVlc2ksJWVicCw0KSwgJWVzaQlDIHNyYyBlbmQKKwlsZWFsCSglZWRpLCVlYnAsNCksICVlZGkJQyBkc3QgZW5kCisJbmVnbAklZWJwCQkJQyAtc2l6ZQorCisJaW11bGwJJWVieCwgJWVkeAkJQyBpbnYqaW52KmQKKworCXN1YmwJJWVkeCwgJWVheAkJQyBpbnYgPSAyKmludiAtIGludippbnYqZAorCisJQVNTRVJUKGUsYAlDIGV4cGVjdCBkKmludiA9PSAxIG1vZCAyXkdNUF9MSU1CX0JJVFMKKwlwdXNobAklZWF4CUZSQU1FX3B1c2hsKCkKKwlpbXVsbAlQQVJBTV9ESVZJU09SLCAlZWF4CisJY21wbAkkMSwgJWVheAorCXBvcGwJJWVheAlGUkFNRV9wb3BsKCknKQorCisJbW92bAklZWF4LCBWQVJfSU5WRVJTRQorCW1vdmwJKCVlc2ksJWVicCw0KSwgJWVheAlDIHNyY1swXQorCisJeG9ybAklZWJ4LCAlZWJ4CisJeG9ybAklZWR4LCAlZWR4CisKKwlpbmNsCSVlYnAKKwlqeglMKG9uZSkKKworCW1vdmwJKCVlc2ksJWVicCw0KSwgJWVkeAlDIHNyY1sxXQorCisJc2hyZGwoCSVjbCwgJWVkeCwgJWVheCkKKworCW1vdmwJVkFSX0lOVkVSU0UsICVlZHgKKwlqbXAJTChlbnRyeSkKKworCisJQUxJR04oOCkKKwlub3AJQyBrNiBjb2RlIGFsaWdubWVudAorCW5vcAorTCh0b3ApOgorCUMgZWF4CXEKKwlDIGVieAljYXJyeSBiaXQsIDAgb3IgLTEKKwlDIGVjeAlzaGlmdAorCUMgZWR4CWNhcnJ5IGxpbWIKKwlDIGVzaQlzcmMgZW5kCisJQyBlZGkJZHN0IGVuZAorCUMgZWJwCWNvdW50ZXIsIGxpbWJzLCBuZWdhdGl2ZQorCisJbW92bAktNCglZXNpLCVlYnAsNCksICVlYXgKKwlzdWJsCSVlYngsICVlZHgJCUMgYWNjdW11bGF0ZSBjYXJyeSBiaXQKKworCW1vdmwJKCVlc2ksJWVicCw0KSwgJWVieAorCisJc2hyZGwoCSVjbCwgJWVieCwgJWVheCkKKworCXN1YmwJJWVkeCwgJWVheAkJQyBhcHBseSBjYXJyeSBsaW1iCisJbW92bAlWQVJfSU5WRVJTRSwgJWVkeAorCisJc2JibAklZWJ4LCAlZWJ4CisKK0woZW50cnkpOgorCWltdWxsCSVlZHgsICVlYXgKKworCW1vdmwJJWVheCwgLTQoJWVkaSwlZWJwLDQpCisJbW92bAlQQVJBTV9ESVZJU09SLCAlZWR4CisKKwltdWxsCSVlZHgKKworCWluY2wJJWVicAorCWpueglMKHRvcCkKKworCisJbW92bAktNCglZXNpKSwgJWVheAkJQyBzcmMgaGlnaCBsaW1iCitMKG9uZSk6CisJc2hybAklY2wsICVlYXgKKwlwb3BsCSVlc2kJRlJBTUVfcG9wbCgpCisKKwlhZGRsCSVlYngsICVlYXgJCUMgYXBwbHkgY2FycnkgYml0CisJcG9wbAklZWJ4CUZSQU1FX3BvcGwoKQorCisJc3VibAklZWR4LCAlZWF4CQlDIGFwcGx5IGNhcnJ5IGxpbWIKKworCWltdWxsCVZBUl9JTlZFUlNFLCAlZWF4CisKKwltb3ZsCSVlYXgsIC00KCVlZGkpCisKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYnAKKworCXJldAorCitFUElMT0dVRSgpCitBU01fRU5EKCkKZGlmZiAtLWdpdCBhL21wbi94ODYvZGl2cmVtXzEuYXNtIGIvbXBuL3g4Ni9kaXZyZW1fMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2MThmMQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvZGl2cmVtXzEuYXNtCkBAIC0wLDAgKzEsMjMzIEBACitkbmwgIHg4NiBtcG5fZGl2cmVtXzEgLS0gbXBuIGJ5IGxpbWIgZGl2aXNpb24gZXh0ZW5kaW5nIHRvIGZyYWN0aW9uYWwgcXVvdGllbnQuCisKK2RubCAgQ29weXJpZ2h0IDE5OTktMjAwMywgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgICAgICAgY3ljbGVzL2xpbWIKK0MgNDg2ICAgYXBwcm94IDQzIG1heWJlCitDIFA1ICAgICAgICA0NAorQyBQNiAgICAgICAgMzkKK0MgUDZNTVggICAgIDM5CitDIEs2ICAgICAgICAyMgorQyBLNyAgICAgICAgNDIKK0MgUDQgICAgICAgIDU4CisKKworQyBtcF9saW1iX3QgbXBuX2RpdnJlbV8xIChtcF9wdHIgZHN0LCBtcF9zaXplX3QgeHNpemUsCitDICAgICAgICAgICAgICAgICAgICAgICAgIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgZGl2aXNvcik7CitDIG1wX2xpbWJfdCBtcG5fZGl2cmVtXzFjIChtcF9wdHIgZHN0LCBtcF9zaXplX3QgeHNpemUsCitDICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRpdmlzb3IsCitDICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9saW1iX3QgY2FycnkpOworQworQyBEaXZpZGUgc3JjLHNpemUgYnkgZGl2aXNvciBhbmQgc3RvcmUgdGhlIHF1b3RpZW50IGluIGRzdCt4c2l6ZSxzaXplLgorQyBFeHRlbmQgdGhlIGRpdmlzaW9uIHRvIGZyYWN0aW9uYWwgcXVvdGllbnQgbGltYnMgaW4gZHN0LHhzaXplLiAgUmV0dXJuIHRoZQorQyByZW1haW5kZXIuICBFaXRoZXIgb3IgYm90aCB4c2l6ZSBhbmQgc2l6ZSBjYW4gYmUgMC4KK0MKK0MgbXBuX2RpdnJlbV8xYyB0YWtlcyBhIGNhcnJ5IHBhcmFtZXRlciB3aGljaCBpcyBhbiBpbml0aWFsIGhpZ2ggbGltYiwKK0MgZWZmZWN0aXZlbHkgb25lIGV4dHJhIGxpbWIgYXQgdGhlIHRvcCBvZiBzcmMsc2l6ZS4gIE11c3QgaGF2ZQorQyBjYXJyeTxkaXZpc29yLgorQworQworQyBFc3NlbnRpYWxseSB0aGUgY29kZSBpcyB0aGUgc2FtZSBhcyB0aGUgZGl2aXNpb24gYmFzZWQgcGFydCBvZgorQyBtcG4vZ2VuZXJpYy9kaXZyZW1fMS5jLCBidXQgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB3ZSBnZXQgdGhlIGRlc2lyZWQgZGl2bAorQyBpbnN0cnVjdGlvbiBldmVuIHdoZW4gZ2NjIGlzIG5vdCBiZWluZyB1c2VkICh3aGVuIGxvbmdsb25nLmggb25seSBoYXMgdGhlCitDIHJhdGhlciBzbG93IGdlbmVyaWMgQyB1ZGl2X3Fybm5kKCkuCitDCitDIEEgdGVzdCBpcyBkb25lIHRvIHNlZSBpZiB0aGUgaGlnaCBsaW1iIGlzIGxlc3MgdGhhbiB0aGUgZGl2aXNvciwgYW5kIGlmIHNvCitDIG9uZSBsZXNzIGRpdiBpcyBkb25lLiAgQSBkaXYgaXMgYmV0d2VlbiAyMCBhbmQgNDAgY3ljbGVzIG9uIHRoZSB2YXJpb3VzCitDIHg4NnMsIHNvIGFzc3VtaW5nIGhpZ2g8ZGl2aXNvciBhYm91dCBoYWxmIHRoZSB0aW1lLCB0aGVuIHRoaXMgdGVzdCBzYXZlcworQyBoYWxmIHRoYXQgYW1vdW50LiAgVGhlIGJyYW5jaCBtaXNwcmVkaWN0aW9uIHBlbmFsdHkgb24gZWFjaCBjaGlwIGlzIGxlc3MKK0MgdGhhbiBoYWxmIGEgZGl2LgorQworQworQyBOb3RlcyBmb3IgUDU6CitDCitDIEl0IG1pZ2h0IGJlIHRob3VnaHQgdGhhdCBtb3ZpbmcgdGhlIGxvYWQgZG93biB0byBwYWlyIHdpdGggdGhlIHN0b3JlIHdvdWxkCitDIHNhdmUgMSBjeWNsZSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiBpbiBwcmFjdGljZSwgYW5kIGluIGFueSBjYXNlCitDIHdvdWxkIGJlIGEgbWVyZSAyLjIlIHNhdmluZywgc28gaXQncyBoYXJkbHkgd29ydGggYm90aGVyaW5nIGFib3V0LgorQworQyBBIG11bC1ieS1pbnZlcnNlIG1pZ2h0IGJlIGEgcG9zc2liaWxpdHkgZm9yIFA1LCBhcyBkb25lIGluCitDIG1wbi94ODYvcGVudGl1bS9tb2RfMS5hc20uICBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBpbnN0cnVjdGlvbnMgcmVxdWlyZWQKK0MgaXMgYSBoaW5kZXJhbmNlLCBidXQgdGhlcmUgY291bGQgYmUgYSAxMC0xNSUgc3BlZWR1cCBhdmFpbGFibGUuCitDCitDCitDIE5vdGVzIGZvciBLNjoKK0MKK0MgSzYgaGFzIGl0cyBvd24gdmVyc2lvbiBvZiB0aGlzIGNvZGUsIHVzaW5nIGxvb3AgYW5kIHBheWluZyBhdHRlbnRpb24gdG8KK0MgY2FjaGUgbGluZSBib3VuZGFyeSBjcm9zc2luZ3MuICBUaGUgdGFyZ2V0IDIwIGMvbCBjYW4gYmUgaGFkIHdpdGggdGhlCitDIGRlY2wram56IG9mIHRoZSBwcmVzZW50IGNvZGUgYnkgcGFpcmluZyB1cCB0aGUgbG9hZCBhbmQgc3RvcmUgaW4gdGhlCitDIGxvb3BzLiAgQnV0IGl0J3MgY29uc2lkZXJlZCBlYXNpZXIgbm90IHRvIGludHJvZHVjZSBjb21wbGV4aXR5IGp1c3QgZm9yCitDIHRoYXQsIGJ1dCBpbnN0ZWFkIGxldCBrNiBoYXZlIGl0cyBvd24gY29kZS4KK0MKKworZGVmZnJhbWUoUEFSQU1fQ0FSUlksICAyNCkKK2RlZmZyYW1lKFBBUkFNX0RJVklTT1IsMjApCitkZWZmcmFtZShQQVJBTV9TSVpFLCAgIDE2KQorZGVmZnJhbWUoUEFSQU1fU1JDLCAgICAxMikKK2RlZmZyYW1lKFBBUkFNX1hTSVpFLCAgOCkKK2RlZmZyYW1lKFBBUkFNX0RTVCwgICAgNCkKKworCVRFWFQKKwlBTElHTigxNikKKworUFJPTE9HVUUobXBuX2RpdnJlbV8xYykKK2RlZmxpdChgRlJBTUUnLDApCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlY3gKKwlwdXNobAklZWRpCQlGUkFNRV9wdXNobCgpCisKKwltb3ZsCVBBUkFNX1NSQywgJWVkaQorCXB1c2hsCSVlc2kJCUZSQU1FX3B1c2hsKCkKKworCW1vdmwJUEFSQU1fRElWSVNPUiwgJWVzaQorCXB1c2hsCSVlYngJCUZSQU1FX3B1c2hsKCkKKworCW1vdmwJUEFSQU1fRFNULCAlZWJ4CisJcHVzaGwJJWVicAkJRlJBTUVfcHVzaGwoKQorCisJbW92bAlQQVJBTV9YU0laRSwgJWVicAorCW9ybAklZWN4LCAlZWN4CisKKwltb3ZsCVBBUkFNX0NBUlJZLCAlZWR4CisJanoJTChmcmFjdGlvbikKKworCWxlYWwJLTQoJWVieCwlZWJwLDQpLCAlZWJ4CUMgZHN0IG9uZSBsaW1iIGJlbG93IGludGVnZXIgcGFydAorCWptcAlMKGludGVnZXJfdG9wKQorCitFUElMT0dVRSgpCisKKworUFJPTE9HVUUobXBuX2RpdnJlbV8xKQorZGVmbGl0KGBGUkFNRScsMCkKKworCW1vdmwJUEFSQU1fU0laRSwgJWVjeAorCXB1c2hsCSVlZGkJCUZSQU1FX3B1c2hsKCkKKworCW1vdmwJUEFSQU1fU1JDLCAlZWRpCisJcHVzaGwJJWVzaQkJRlJBTUVfcHVzaGwoKQorCisJbW92bAlQQVJBTV9ESVZJU09SLCAlZXNpCisJb3JsCSVlY3gsJWVjeAorCisJanoJTChzaXplX3plcm8pCisJcHVzaGwJJWVieAkJRlJBTUVfcHVzaGwoKQorCisJbW92bAktNCglZWRpLCVlY3gsNCksICVlYXgJQyBzcmMgaGlnaCBsaW1iCisJeG9ybAklZWR4LCAlZWR4CisKKwltb3ZsCVBBUkFNX0RTVCwgJWVieAorCXB1c2hsCSVlYnAJCUZSQU1FX3B1c2hsKCkKKworCW1vdmwJUEFSQU1fWFNJWkUsICVlYnAKKwljbXBsCSVlc2ksICVlYXgKKworCWxlYWwJLTQoJWVieCwlZWJwLDQpLCAlZWJ4CUMgZHN0IG9uZSBsaW1iIGJlbG93IGludGVnZXIgcGFydAorCWphZQlMKGludGVnZXJfZW50cnkpCisKKworCUMgaGlnaDxkaXZpc29yLCBzbyBoaWdoIG9mIGRzdCBpcyB6ZXJvLCBhbmQgYXZvaWQgb25lIGRpdgorCisJbW92bAklZWR4LCAoJWVieCwlZWN4LDQpCisJZGVjbAklZWN4CisKKwltb3ZsCSVlYXgsICVlZHgKKwlqeglMKGZyYWN0aW9uKQorCisKK0woaW50ZWdlcl90b3ApOgorCUMgZWF4CXNjcmF0Y2ggKHF1b3RpZW50KQorCUMgZWJ4CWRzdCs0KnhzaXplLTQKKwlDIGVjeAljb3VudGVyCisJQyBlZHgJc2NyYXRjaCAocmVtYWluZGVyKQorCUMgZXNpCWRpdmlzb3IKKwlDIGVkaQlzcmMKKwlDIGVicAl4c2l6ZQorCisJbW92bAktNCglZWRpLCVlY3gsNCksICVlYXgKK0woaW50ZWdlcl9lbnRyeSk6CisKKwlkaXZsCSVlc2kKKworCW1vdmwJJWVheCwgKCVlYngsJWVjeCw0KQorCWRlY2wJJWVjeAorCWpueglMKGludGVnZXJfdG9wKQorCisKK0woZnJhY3Rpb24pOgorCW9ybAklZWJwLCAlZWN4CisJanoJTChkb25lKQorCisJbW92bAlQQVJBTV9EU1QsICVlYngKKworCitMKGZyYWN0aW9uX3RvcCk6CisJQyBlYXgJc2NyYXRjaCAocXVvdGllbnQpCisJQyBlYngJZHN0CisJQyBlY3gJY291bnRlcgorCUMgZWR4CXNjcmF0Y2ggKHJlbWFpbmRlcikKKwlDIGVzaQlkaXZpc29yCisJQyBlZGkKKwlDIGVicAorCisJeG9ybAklZWF4LCAlZWF4CisKKwlkaXZsCSVlc2kKKworCW1vdmwJJWVheCwgLTQoJWVieCwlZWN4LDQpCisJZGVjbAklZWN4CisJam56CUwoZnJhY3Rpb25fdG9wKQorCisKK0woZG9uZSk6CisJcG9wbAklZWJwCisJbW92bAklZWR4LCAlZWF4CisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKKworTChzaXplX3plcm8pOgorZGVmbGl0KGBGUkFNRScsOCkKKwltb3ZsCVBBUkFNX1hTSVpFLCAlZWN4CisJeG9ybAklZWF4LCAlZWF4CisKKwltb3ZsCVBBUkFNX0RTVCwgJWVkaQorCisJY2xkCUMgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgc2VlIG1wbi94ODYvUkVBRE1FCisKKwlyZXAKKwlzdG9zbAorCisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L2RpdnJlbV8yLmFzbSBiL21wbi94ODYvZGl2cmVtXzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTcyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2L2RpdnJlbV8yLmFzbQpAQCAtMCwwICsxLDE5OSBAQAorZG5sICB4ODYgbXBuX2RpdnJlbV8yIC0tIERpdmlkZSBhbiBtcG4gbnVtYmVyIGJ5IGEgbm9ybWFsaXplZCAyLWxpbWIgbnVtYmVyLgorCitkbmwgIENvcHlyaWdodCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkJbm9ybQlmcmFjCitDIDQ4NgorQyBQNQorQyBQNi0xMwkJMjkuMgorQyBQNi0xNQkJKjI2CitDIEs2CitDIEs3CQkyMgorQyBLOAkJKjE5CitDIFA0LWYxCitDIFA0LWYyCQkqNjUKK0MgUDQtZjMKK0MgUDQtZjQJCSo3MgorCitDIEEgc3RhciBtZWFucyBudW1iZXJzIG5vdCB1cGRhdGVkIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGNvZGUuCisKKworQyBUT0RPCitDICAqIFBlcmhhcHMga2VlcCBlY3ggb3IgZXNpIGluIHN0YWNrIHNsb3QsIGZyZWVpbmcgdXAgYSByZWcgZm9yIHEwLgorQyAgKiBUaGUgbG9vcCBoYXMgbm90IGJlZW4gY2FyZWZ1bGx5IHR1bmVkLiAgV2Ugc2hvdWxkIGF0IHRoZSB2ZXJ5IGxlYXN0IGRvCitDICAgIHNvbWUgbG9jYWwgaW5zbiBzd2FwcGluZy4KK0MgICogVGhlIGNvZGUgb3V0c2lkZSB0aGUgbWFpbiBsb29wIGlzIHdoYXQgZ2NjIGdlbmVyYXRlZC4gIENsZWFuIHVwIQorQyAgKiBDbGVhbiB1cCBzdGFjayBzbG90IHVzYWdlLgorCitDIElOUFVUIFBBUkFNRVRFUlMKK0MgcXAKK0MgZm4KK0MgdXBfcGFyYW0KK0MgdW5fcGFyYW0KK0MgZHAKKworCitDIGVheCBlYnggZWN4IGVkeCBlc2kgZWRpIGVicAorQyAgICAgICAgIGNudCAgICAgICAgIHFwCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX2RpdnJlbV8yKQorCXB1c2gJJWVicAorCXB1c2gJJWVkaQorCXB1c2gJJWVzaQorCXB1c2gJJWVieAorCXN1YgkkMzYsICVlc3AKKwltb3YJNjgoJWVzcCksICVlY3gJCUMgdW4KKwltb3YJNzIoJWVzcCksICVlc2kJCUMgZHAKKwltb3ZsCSQwLCAzMiglZXNwKQorCWxlYQkwKCwlZWN4LDQpLCAlZWRpCisJYWRkCTY0KCVlc3ApLCAlZWRpCQlDIHVwCisJbW92CSglZXNpKSwgJWVieAorCW1vdgk0KCVlc2kpLCAlZWF4CisJbW92CSVlYngsIDIwKCVlc3ApCisJc3ViCSQxMiwgJWVkaQorCW1vdgklZWF4LCAyNCglZXNwKQorCW1vdgklZWRpLCAxMiglZXNwKQorCW1vdgk4KCVlZGkpLCAlZWJ4CisJbW92CTQoJWVkaSksICVlYnAKKwljbXAJJWVheCwgJWVieAorCWpiCUwoOCkKKwlzZXRhCSVkbAorCWNtcAkyMCglZXNwKSwgJWVicAorCXNldGFlCSVhbAorCW9yYgklZGwsICVhbAkJQyAib3JiIiBmb3JtIHRvIHBsYWNhdGUgU3VuIHRvb2xzCisJam5lCUwoMzUpCitMKDgpOgorCW1vdgk2MCglZXNwKSwgJWVzaQkJQyBmbgorCWxlYQktMyglZXNpLCVlY3gpLCAlZWRpCisJdGVzdAklZWRpLCAlZWRpCisJanMJTCg5KQorCW1vdgkyNCglZXNwKSwgJWVkeAorCW1vdgkkLTEsICVlc2kKKwltb3YJJWVzaSwgJWVheAorCW1vdgklZXNpLCAlZWN4CisJbm90CSVlZHgKKwlkaXZsCTI0KCVlc3ApCisJbW92CSVlYXgsICVlc2kKKwlpbXVsCTI0KCVlc3ApLCAlZWF4CisJbW92CSVlYXgsICglZXNwKQorCW1vdgklZXNpLCAlZWF4CisJbXVsbAkyMCglZXNwKQorCW1vdgkoJWVzcCksICVlYXgKKwlhZGQJMjAoJWVzcCksICVlYXgKKwlhZGMJJDAsICVlY3gKKwlhZGQJJWVheCwgJWVkeAorCWFkYwkkMCwgJWVjeAorCW1vdgklZWN4LCAlZWF4CisJanMJTCgzMikKK0woMzYpOglkZWMJJWVzaQorCXN1YgkyNCglZXNwKSwgJWVkeAorCXNiYgkkMCwgJWVheAorCWpucwlMKDM2KQorTCgzMik6CisJbW92CSVlc2ksIDE2KCVlc3ApCQlDIGRpCisJbW92CSVlZGksICVlY3gJCUMgdW4KKwltb3YJMTIoJWVzcCksICVlc2kJCUMgdXAKKwltb3YJMjQoJWVzcCksICVlYXgKKwluZWcJJWVheAorCW1vdgklZWF4LCA0KCVlc3ApCQlDIC1kMQorCUFMSUdOKDE2KQorCW5vcAorCitDIGVheCBlYnggZWN4IGVkeCBlc2kgZWRpIGVicCAgMCAgICA0ICAgOCAgIDEyICAxNiAgMjAgIDI0ICAyOCAgMzIgICA1NiAgNjAKK0MgICAgIG4yICB1biAgICAgIHVwICAgICAgbjEgICBxMCAgLWQxICAgICAgICAgIGRpICBkMCAgZDEgICAgICBtc2wgIHFwICBmbgorCitMKGxvb3ApOgorCW1vdgkxNiglZXNwKSwgJWVheAkJQyBkaQorCW11bAklZWJ4CisJYWRkCSVlYnAsICVlYXgKKwltb3YJJWVheCwgKCVlc3ApCQlDIHEwCisJYWRjCSVlYngsICVlZHgKKwltb3YJJWVkeCwgJWVkaQkJQyBxCisJaW11bAk0KCVlc3ApLCAlZWR4CisJbW92CTIwKCVlc3ApLCAlZWF4CisJbGVhCSglZWR4LCAlZWJwKSwgJWVieAlDIG4xIC09IC4uLgorCW11bAklZWRpCisJeG9yCSVlYnAsICVlYnAKKwljbXAJNjAoJWVzcCksICVlY3gKKwlqbAlMKDE5KQorCW1vdgkoJWVzaSksICVlYnAKKwlzdWIJJDQsICVlc2kKK0woMTkpOglzdWIJMjAoJWVzcCksICVlYnAKKwlzYmIJMjQoJWVzcCksICVlYngKKwlzdWIJJWVheCwgJWVicAorCXNiYgklZWR4LCAlZWJ4CisJbW92CTIwKCVlc3ApLCAlZWF4CQlDIGQxCisJaW5jCSVlZGkKKwl4b3IJJWVkeCwgJWVkeAorCWNtcAkoJWVzcCksICVlYngKKwlhZGMJJC0xLCAlZWR4CQlDIG1hc2sKKwlhZGQJJWVkeCwgJWVkaQkJQyBxLS0KKwlhbmQJJWVkeCwgJWVheAkJQyBkMCBvciAwCisJYW5kCTI0KCVlc3ApLCAlZWR4CQlDIGQxIG9yIDAKKwlhZGQJJWVheCwgJWVicAorCWFkYwklZWR4LCAlZWJ4CisJY21wCTI0KCVlc3ApLCAlZWJ4CisJamFlCUwoZml4KQorTChiY2spOgltb3YJNTYoJWVzcCksICVlZHgKKwltb3YJJWVkaSwgKCVlZHgsICVlY3gsIDQpCisJZGVjCSVlY3gKKwlqbnMJTChsb29wKQorCitMKDkpOgltb3YJNjQoJWVzcCksICVlc2kJCUMgdXAKKwltb3YJJWVicCwgKCVlc2kpCisJbW92CSVlYngsIDQoJWVzaSkKKwltb3YJMzIoJWVzcCksICVlYXgKKwlhZGQJJDM2LCAlZXNwCisJcG9wCSVlYngKKwlwb3AJJWVzaQorCXBvcAklZWRpCisJcG9wCSVlYnAKKwlyZXQKKworTChmaXgpOglzZXRhCSVkbAorCWNtcAkyMCglZXNwKSwgJWVicAorCXNldGFlCSVhbAorCW9yYgklZGwsICVhbAkJQyAib3JiIiBmb3JtIHRvIHBsYWNhdGUgU3VuIHRvb2xzCisJamUJTChiY2spCisJaW5jCSVlZGkKKwlzdWIJMjAoJWVzcCksICVlYnAKKwlzYmIJMjQoJWVzcCksICVlYngKKwlqbXAJTChiY2spCisKK0woMzUpOglzdWIJMjAoJWVzcCksICVlYnAKKwlzYmIJMjQoJWVzcCksICVlYngKKwltb3ZsCSQxLCAzMiglZXNwKQorCWptcAlMKDgpCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L2djZF8xMS5hc20gYi9tcG4veDg2L2djZF8xMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5OTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvZ2NkXzExLmFzbQpAQCAtMCwwICsxLDEyNiBAQAorZG5sICB4ODYgbXBuX2djZF8xMSBvcHRpbWlzZWQgZm9yIHByb2Nlc3NvcnMgd2l0aCBzbG93IEJTRi4KKworZG5sICBCYXNlZCBvbiBDIHZlcnNpb24uCisKK2RubCAgQ29weXJpZ2h0IDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworZG5sICBSdWRpbWVudGFyeSBjb2RlIGZvciB4ODYtMzIsIGkuZS4gZm9yIENQVXMgd2l0aG91dCBjbW92LiAgQWxzbywgdGhlIGJzZgorZG5sICBpbnN0cnVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIHNvIHNsb3cgaXQgaXMgdXNlbGVzcy4gIEluc3RlYWQgYSB0ZWJsZSBpcworZG5sICB1c2VkLgorZG5sCitkbmwgIFRoZSBsb29wIGJlbmVmaXRzIGZyb20gT29PLCBpbi1vcmRlciBDUFVzIG1pZ2h0IHdhbnQgYSBkaWZmZXJlbnQgbG9vcC4KK2RubCAgVGhlIGVieCBhbmQgZWN4IHJlZ2lzdGVycyBjb3VsZCBiZSBjb21iaW5lZCBpZiB0aGUgYXNzaWdtZW50IG9mIGVjeCB3ZXJlCitkbmwgIHBvc3Rwb25lZCB1bnRpbCBlYnggZGllZCwgYnV0IHRoYXQgd291bGQgYXQgbGVhc3QgaHVydCBpbi1vcmRlciBDUFVzLgorCitDCSAgICAgY3ljbGVzL2JpdCAoYXBwcm94KQorQyBBTUQgSzcJID8KK0MgQU1EIEs4LEs5CSA/CitDIEFNRCBLMTAJID8KK0MgQU1EIGJkMQkgPworQyBBTUQgYmQyCSA/CitDIEFNRCBiZDMJID8KK0MgQU1EIGJkNAkgPworQyBBTUQgYnQxCSA/CitDIEFNRCBidDIJID8KK0MgQU1EIHpuMQkgPworQyBBTUQgem4yCSA/CitDIEludGVsIFA0LTIJID8KK0MgSW50ZWwgUDQtMy80CSA/CitDIEludGVsIFA2LzEzCSA/CitDIEludGVsIENOUgkgPworQyBJbnRlbCBOSE0JID8KK0MgSW50ZWwgU0JSCSA/CitDIEludGVsIElCUgkgPworQyBJbnRlbCBIV0wJID8KK0MgSW50ZWwgQldMCSA/CitDIEludGVsIFNLTAkgPworQyBJbnRlbCBhdG9tCSA/CitDIEludGVsIFNMTQkgPworQyBJbnRlbCBHTE0JID8KK0MgSW50ZWwgR0xNKwkgPworQyBWSUEgbmFubwkgPworQyBOdW1iZXJzIG1lYXN1cmVkIHdpdGg6IHNwZWVkIC1DRCAtczgtMzIgLXQyNCBtcG5fZ2NkXzEKKworZGVmbGl0KE1BWFNISUZULCA2KQorZGVmbGl0KE1BU0ssIGV2YWwoKG00X2xzaGlmdCgxLE1BWFNISUZUKSktMSkpCisKK0RFRl9PQkpFQ1QoY3R6X3RhYmxlLDY0KQorCS5ieXRlCU1BWFNISUZUCitmb3Jsb29wKGksMSxNQVNLLAorYAkuYnl0ZQltNF9jb3VudF90cmFpbGluZ196ZXJvcyhpKQorJykKK0VORF9PQkpFQ1QoY3R6X3RhYmxlKQorCitkZWZpbmUoYHUwJywgICAgYCVlYXgnKQorZGVmaW5lKGB2MCcsICAgIGAlZWR4JykKKworCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9nY2RfMTEpCisJcHVzaAklZWRpCisJcHVzaAklZXNpCisJcHVzaAklZWJ4CisKKwltb3YJMTYoJWVzcCksIHUwCisJbW92CTIwKCVlc3ApLCB2MAorCUxFQUwoCWN0el90YWJsZSwgJWVzaSkKKwlzdWIJdjAsIHUwCQkJQyB1ID0gdSAtIHYJCTAKKwlqeglMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglzYmIJJWVieCwgJWVieAkJQyBtYXNrCQkJMQorCW1vdgl1MCwgJWVkaQkJQwkJCTEKKwltb3YJdTAsICVlY3gJCUMJCQkxCisJYW5kCSVlYngsICVlZGkJCUMJCQkyCisJeG9yCSVlYngsIHUwCQlDCQkJMgorCWFkZAklZWRpLCB2MAkJQyB2ID0gbWluKHUudikJCTMKKwlzdWIJJWVieCwgdTAJCUMgdSA9IHx1IC0gdnwJCTMKK0wobWlkKToJYW5kCSRNQVNLLCAlZWN4CQlDCQkJMgorCW1vdnpibAkoJWVzaSwlZWN4KSwgJWVjeAlDCQkJMworCWp6CUwoc2hpZnRfYWxvdCkKKwlzaHIJJWNsLCB1MAkJCUMJCQk0CisJc3ViCXYwLCB1MAkJCUMgdSA9IHUgLSB2CQkwLDUKKwlqbnoJTCh0b3ApCisKK0woZW5kKToJbW92CXYwLCAlZWF4CisJcG9wCSVlYngKKwlwb3AJJWVzaQorCXBvcAklZWRpCisJcmV0CisKK0woc2hpZnRfYWxvdCk6CisJc2hyCSRNQVhTSElGVCwgdTAKKwltb3YJdTAsICVlY3gKKwlqbXAJTChtaWQpCitFUElMT0dVRSgpCitBU01fRU5EKCkKZGlmZiAtLWdpdCBhL21wbi94ODYvZ21wLW1wYXJhbS5oIGIvbXBuL3g4Ni9nbXAtbXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiMTk4NAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvZ21wLW1wYXJhbS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIEdlbmVyaWMgeDg2IGdtcC1tcGFyYW0uaCAtLSBDb21waWxlci9tYWNoaW5lIHBhcmFtZXRlciBoZWFkZXIgZmlsZS4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBHTVBfTElNQl9CSVRTIDMyCisjZGVmaW5lIEdNUF9MSU1CX0JZVEVTIDQKKworCisvKiBHZW5lcmljIHg4NiBtcG5fZGl2ZXhhY3RfMSBpcyBmYXN0ZXIgdGhhbiBnZW5lcmljIHg4NiBtcG5fZGl2cmVtXzEgb24gYWxsCisgICBvZiBwNSwgcDYsIGs2IGFuZCBrNywgc28gdXNlIGl0IGFsd2F5cy4gIEl0J3MgcHJvYmFibHkgc2xvd2VyIG9uIDM4NiBhbmQKKyAgIDQ4NiwgYnV0IHRoYXQncyB0b28gYmFkLiAgKi8KKyNkZWZpbmUgRElWRVhBQ1RfMV9USFJFU0hPTEQgIDAKZGlmZiAtLWdpdCBhL21wbi94ODYvbHNoaWZ0LmFzbSBiL21wbi94ODYvbHNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGZjOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Ni9sc2hpZnQuYXNtCkBAIC0wLDAgKzEsMTA2IEBACitkbmwgIHg4NiBtcG5fbHNoaWZ0IC0tIG1wbiBsZWZ0IHNoaWZ0LgorCitkbmwgIENvcHlyaWdodCAxOTkyLCAxOTk0LCAxOTk2LCAxOTk5LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDICAgICBjeWNsZXMvbGltYgorQyBQNTQJIDcuNQorQyBQNTUJIDcuMAorQyBQNgkgMi41CitDIEs2CSA0LjUKK0MgSzcJIDUuMAorQyBQNAkxNC41CisKKworQyBtcF9saW1iX3QgbXBuX2xzaGlmdCAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsCitDICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaGlmdCk7CisKK2RlZmZyYW1lKFBBUkFNX1NISUZULDE2KQorZGVmZnJhbWUoUEFSQU1fU0laRSwgMTIpCitkZWZmcmFtZShQQVJBTV9TUkMsICA4KQorZGVmZnJhbWUoUEFSQU1fRFNULCAgNCkKKworCVRFWFQKKwlBTElHTig4KQorUFJPTE9HVUUobXBuX2xzaGlmdCkKKworCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisJcHVzaGwJJWVieAorZGVmbGl0KGBGUkFNRScsMTIpCisKKwltb3ZsCVBBUkFNX0RTVCwlZWRpCisJbW92bAlQQVJBTV9TUkMsJWVzaQorCW1vdmwJUEFSQU1fU0laRSwlZWR4CisJbW92bAlQQVJBTV9TSElGVCwlZWN4CisKKwlzdWJsCSQ0LCVlc2kJCQlDIGFkanVzdCBzcmMKKworCW1vdmwJKCVlc2ksJWVkeCw0KSwlZWJ4CUMgcmVhZCBtb3N0IHNpZ25pZmljYW50IGxpbWIKKwl4b3JsCSVlYXgsJWVheAorCXNobGRsKAklY2wsICVlYngsICVlYXgpCUMgY29tcHV0ZSBjYXJyeSBsaW1iCisJZGVjbAklZWR4CisJanoJTChlbmQpCisJcHVzaGwJJWVheAkJCUMgcHVzaCBjYXJyeSBsaW1iIG9udG8gc3RhY2sKKwl0ZXN0YgkkMSwlZGwKKwlqbnoJTCgxKQkJCUMgZW50ZXIgbG9vcCBpbiB0aGUgbWlkZGxlCisJbW92bAklZWJ4LCVlYXgKKworCUFMSUdOKDgpCitMKG9vcCk6CW1vdmwJKCVlc2ksJWVkeCw0KSwlZWJ4CUMgbG9hZCBuZXh0IGxvd2VyIGxpbWIKKwlzaGxkbCgJJWNsLCAlZWJ4LCAlZWF4KQlDIGNvbXB1dGUgcmVzdWx0IGxpbWIKKwltb3ZsCSVlYXgsKCVlZGksJWVkeCw0KQlDIHN0b3JlIGl0CisJZGVjbAklZWR4CitMKDEpOgltb3ZsCSglZXNpLCVlZHgsNCksJWVheAorCXNobGRsKAklY2wsICVlYXgsICVlYngpCisJbW92bAklZWJ4LCglZWRpLCVlZHgsNCkKKwlkZWNsCSVlZHgKKwlqbnoJTChvb3ApCisKKwlzaGxsCSVjbCwlZWF4CQlDIGNvbXB1dGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYgorCW1vdmwJJWVheCwoJWVkaSkJCUMgc3RvcmUgaXQKKworCXBvcGwJJWVheAkJCUMgcG9wIGNhcnJ5IGxpbWIKKworCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitMKGVuZCk6CXNobGwJJWNsLCVlYngJCUMgY29tcHV0ZSBsZWFzdCBzaWduaWZpY2FudCBsaW1iCisJbW92bAklZWJ4LCglZWRpKQkJQyBzdG9yZSBpdAorCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcmV0CisKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODYvbW9kXzM0bHN1YjEuYXNtIGIvbXBuL3g4Ni9tb2RfMzRsc3ViMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2YzY1MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvbW9kXzM0bHN1YjEuYXNtCkBAIC0wLDAgKzEsMTgzIEBACitkbmwgIEdlbmVyaWMgeDg2IG1wbl9tb2RfMzRsc3ViMSAtLSBtcG4gcmVtYWluZGVyIG1vZHVsbyAyXjI0LTEuCisKK2RubCAgQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgICAgICBjeWNsZXMvbGltYgorQyBQNQkgIDMuMAorQyBQNgkgIDMuNjYKK0MgSzYJICAzLjAKK0MgSzcJICAxLjMKK0MgUDQJICA5CisKKworQyBtcF9saW1iX3QgbXBuX21vZF8zNGxzdWIxIChtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSkKK0MKKworZGVmZnJhbWUoUEFSQU1fU0laRSwgOCkKK2RlZmZyYW1lKFBBUkFNX1NSQywgIDQpCisKK2RubCAgcmUtdXNlIHBhcmFtZXRlciBzcGFjZQorZGVmaW5lKFNBVkVfRUJYLCBgUEFSQU1fU1JDJykKKworCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9tb2RfMzRsc3ViMSkKK2RlZmxpdChgRlJBTUUnLDApCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlY3gKKwltb3ZsCVBBUkFNX1NSQywgJWVkeAorCisJc3VibAkkMiwgJWVjeAorCWphCUwodGhyZWVfb3JfbW9yZSkKKworCW1vdmwJKCVlZHgpLCAlZWF4CisJamIJTChvbmUpCisKKwltb3ZsCTQoJWVkeCksICVlY3gKKwltb3ZsCSVlYXgsICVlZHgKKwlzaHJsCSQyNCwgJWVheAkJQyBzcmNbMF0gbG93CisKKwlhbmRsCSQweEZGRkZGRiwgJWVkeAkJQyBzcmNbMF0gaGlnaAorCWFkZGwJJWVkeCwgJWVheAorCW1vdmwJJWVjeCwgJWVkeAorCisJYW5kbAkkMHhGRkZGLCAlZWN4CisJc2hybAkkMTYsICVlZHgJCUMgc3JjWzFdIGhpZ2gKKwlhZGRsCSVlZHgsICVlYXgKKworCXNobGwJJDgsICVlY3gJCUMgc3JjWzFdIGxvdworCWFkZGwJJWVjeCwgJWVheAorCitMKG9uZSk6CisJcmV0CisKKworTCh0aHJlZV9vcl9tb3JlKToKKwlDIGVheAorCUMgZWJ4CisJQyBlY3gJc2l6ZS0yCisJQyBlZHgJc3JjCisJQyBlc2kKKwlDIGVkaQorCUMgZWJwCisKKwltb3ZsCSVlYngsIFNBVkVfRUJYCQlDIGFuZCBhcnJhbmdlIDE2LWJ5dGUgbG9vcCBhbGlnbm1lbnQKKwl4b3JsCSVlYngsICVlYngKKworCXB1c2hsCSVlc2kJRlJBTUVfcHVzaGwoKQorCXhvcmwJJWVzaSwgJWVzaQorCisJcHVzaGwJJWVkaQlGUkFNRV9wdXNobCgpCisJeG9ybAklZWF4LCAlZWF4CQlDIGFuZCBjbGVhciBjYXJyeSBmbGFnCisKKworCUMgb2Zmc2V0IDB4NDAgaGVyZQorTCh0b3ApOgorCUMgZWF4CWFjYyAwbW9kMworCUMgZWJ4CWFjYyAxbW9kMworCUMgZWN4CWNvdW50ZXIsIGxpbWJzCisJQyBlZHgJc3JjCisJQyBlc2kJYWNjIDJtb2QzCisJQyBlZGkKKwlDIGVicAorCisJbGVhbAkxMiglZWR4KSwgJWVkeAorCWxlYWwJLTIoJWVjeCksICVlY3gKKworCWFkY2wJLTEyKCVlZHgpLCAlZWF4CisJYWRjbAktOCglZWR4KSwgJWVieAorCWFkY2wJLTQoJWVkeCksICVlc2kKKworCWRlY2wJJWVjeAorCWpnCUwodG9wKQorCisKKwlDIGVjeCBpcyAtMiwgLTEgb3IgMCByZXByZXNlbnRpbmcgMCwgMSBvciAyIG1vcmUgbGltYnMsIHJlc3BlY3RpdmVseQorCisJbW92bAkkMHhGRkZGRkZGRiwgJWVkaQorCWluY2wJJWVjeAorCWpzCUwoY29tYmluZSkKKworCWFkY2wJKCVlZHgpLCAlZWF4CisJbW92bAkkMHhGRkZGRkYwMCwgJWVkaQorCWRlY2wJJWVjeAorCWpzCUwoY29tYmluZSkKKworCWFkY2wJNCglZWR4KSwgJWVieAorCW1vdmwJJDB4RkZGRjAwMDAsICVlZGkKKworCitMKGNvbWJpbmUpOgorCUMgZWF4CWFjYyAwbW9kMworCUMgZWJ4CWFjYyAxbW9kMworCUMgZWN4CisJQyBlZHgKKwlDIGVzaQlhY2MgMm1vZDMKKwlDIGVkaQltYXNrCisJQyBlYnAKKworCXNiYmwJJWVjeCwgJWVjeAkJQyBjYXJyeQorCW1vdmwJJWVheCwgJWVkeAkJQyAwbW9kMworCisJc2hybAkkMjQsICVlYXgJCUMgMG1vZDMgaGlnaAorCWFuZGwJJWVkaSwgJWVjeAkJQyBjYXJyeSBtYXNrZWQKKworCXN1YmwJJWVjeCwgJWVheAkJQyBhcHBseSBjYXJyeQorCW1vdmwJJWVieCwgJWVkaQkJQyAxbW9kMworCisJc2hybAkkMTYsICVlYngJCUMgMW1vZDMgaGlnaAorCWFuZGwJJDB4MDBGRkZGRkYsICVlZHgJQyAwbW9kMyBsb3cKKworCWFkZGwJJWVkeCwgJWVheAkJQyBhcHBseSAwbW9kMyBsb3cKKwlhbmRsCSQweEZGRkYsICVlZGkKKworCXNobGwJJDgsICVlZGkJCUMgMW1vZDMgbG93CisJYWRkbAklZWJ4LCAlZWF4CQlDIGFwcGx5IDFtb2QzIGhpZ2gKKworCWFkZGwJJWVkaSwgJWVheAkJQyBhcHBseSAxbW9kMyBsb3cKKwltb3ZsCSVlc2ksICVlZHgJCUMgMm1vZDMKKworCXNocmwJJDgsICVlc2kJCUMgMm1vZDMgaGlnaAorCWFuZGwJJDB4RkYsICVlZHgJCUMgMm1vZDMgbG93CisKKwlzaGxsCSQxNiwgJWVkeAkJQyAybW9kMyBsb3cKKwlhZGRsCSVlc2ksICVlYXgJCUMgYXBwbHkgMm1vZDMgaGlnaAorCisJYWRkbAklZWR4LCAlZWF4CQlDIGFwcGx5IDJtb2QzIGxvdworCXBvcGwJJWVkaQlGUkFNRV9wb3BsKCkKKworCW1vdmwJU0FWRV9FQlgsICVlYngKKwlwb3BsCSVlc2kJRlJBTUVfcG9wbCgpCisKKwlyZXQKKworRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9tdWxfMS5hc20gYi9tcG4veDg2L211bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzYwY2NiCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Ni9tdWxfMS5hc20KQEAgLTAsMCArMSwxNDAgQEAKK2RubCAgeDg2IG1wbl9tdWxfMSAoZm9yIDM4NiwgNDg2LCBhbmQgUGVudGl1bSBQcm8pIC0tIE11bHRpcGx5IGEgbGltYiB2ZWN0b3IKK2RubCAgd2l0aCBhIGxpbWIgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSBzZWNvbmQgbGltYiB2ZWN0b3IuCisKK2RubCAgQ29weXJpZ2h0IDE5OTIsIDE5OTQsIDE5OTctMjAwMiwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJCQkgICAgY3ljbGVzL2xpbWIKK0MgUDUJCQkJMTIuNQorQyBQNiBtb2RlbCAwLTgsMTAtMTIJCSA1LjUKK0MgUDYgbW9kZWwgOSAgKEJhbmlhcykKK0MgUDYgbW9kZWwgMTMgKERvdGhhbikJCSA1LjI1CitDIFA0IG1vZGVsIDAgIChXaWxsYW1ldHRlKQkxOS4wCitDIFA0IG1vZGVsIDEgICg/KQkJMTkuMAorQyBQNCBtb2RlbCAyICAoTm9ydGh3b29kKQkxOS4wCitDIFA0IG1vZGVsIDMgIChQcmVzY290dCkKK0MgUDQgbW9kZWwgNCAgKE5vY29uYSkKK0MgQU1EIEs2CQkJMTAuNQorQyBBTUQgSzcJCQkgNC41CitDIEFNRCBLOAorCisKK0MgbXBfbGltYl90IG1wbl9tdWxfMSAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsCitDICAgICAgICAgICAgICAgICAgICAgIG1wX2xpbWJfdCBtdWx0aXBsaWVyKTsKKworZGVmZnJhbWUoUEFSQU1fTVVMVElQTElFUiwxNikKK2RlZmZyYW1lKFBBUkFNX1NJWkUsICAgICAgMTIpCitkZWZmcmFtZShQQVJBTV9TUkMsICAgICAgIDgpCitkZWZmcmFtZShQQVJBTV9EU1QsICAgICAgIDQpCisKKwlURVhUCisJQUxJR04oOCkKK1BST0xPR1VFKG1wbl9tdWxfMSkKK2RlZmxpdChgRlJBTUUnLDApCisKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlYngKKwlwdXNobAklZWJwCitkZWZsaXQoYEZSQU1FJywxNikKKworCW1vdmwJUEFSQU1fRFNULCVlZGkKKwltb3ZsCVBBUkFNX1NSQywlZXNpCisJbW92bAlQQVJBTV9TSVpFLCVlY3gKKworCXhvcmwJJWVieCwlZWJ4CisJYW5kbAkkMywlZWN4CisJanoJTChlbmQwKQorCitMKG9vcDApOgorCW1vdmwJKCVlc2kpLCVlYXgKKwltdWxsCVBBUkFNX01VTFRJUExJRVIKKwlsZWFsCTQoJWVzaSksJWVzaQorCWFkZGwJJWVieCwlZWF4CisJbW92bAkkMCwlZWJ4CisJYWRjbAklZWJ4LCVlZHgKKwltb3ZsCSVlYXgsKCVlZGkpCisJbW92bAklZWR4LCVlYngJQyBwcm9wYWdhdGUgY2FycnkgaW50byBjeWxpbWIKKworCWxlYWwJNCglZWRpKSwlZWRpCisJZGVjbAklZWN4CisJam56CUwob29wMCkKKworTChlbmQwKToKKwltb3ZsCVBBUkFNX1NJWkUsJWVjeAorCXNocmwJJDIsJWVjeAorCWp6CUwoZW5kKQorCisKKwlBTElHTig4KQorTChvb3ApOgltb3ZsCSglZXNpKSwlZWF4CisJbXVsbAlQQVJBTV9NVUxUSVBMSUVSCisJYWRkbAklZWF4LCVlYngKKwltb3ZsCSQwLCVlYnAKKwlhZGNsCSVlZHgsJWVicAorCisJbW92bAk0KCVlc2kpLCVlYXgKKwltdWxsCVBBUkFNX01VTFRJUExJRVIKKwltb3ZsCSVlYngsKCVlZGkpCisJYWRkbAklZWF4LCVlYnAJQyBuZXcgbG8gKyBjeWxpbWIKKwltb3ZsCSQwLCVlYngKKwlhZGNsCSVlZHgsJWVieAorCisJbW92bAk4KCVlc2kpLCVlYXgKKwltdWxsCVBBUkFNX01VTFRJUExJRVIKKwltb3ZsCSVlYnAsNCglZWRpKQorCWFkZGwJJWVheCwlZWJ4CUMgbmV3IGxvICsgY3lsaW1iCisJbW92bAkkMCwlZWJwCisJYWRjbAklZWR4LCVlYnAKKworCW1vdmwJMTIoJWVzaSksJWVheAorCW11bGwJUEFSQU1fTVVMVElQTElFUgorCW1vdmwJJWVieCw4KCVlZGkpCisJYWRkbAklZWF4LCVlYnAJQyBuZXcgbG8gKyBjeWxpbWIKKwltb3ZsCSQwLCVlYngKKwlhZGNsCSVlZHgsJWVieAorCisJbW92bAklZWJwLDEyKCVlZGkpCisKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKwlkZWNsCSVlY3gKKwlqbnoJTChvb3ApCisKK0woZW5kKToJbW92bAklZWJ4LCVlYXgKKworCXBvcGwJJWVicAorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L211bF9iYXNlY2FzZS5hc20gYi9tcG4veDg2L211bF9iYXNlY2FzZS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhMjk4MAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvbXVsX2Jhc2VjYXNlLmFzbQpAQCAtMCwwICsxLDIyMyBAQAorZG5sICB4ODYgbXBuX211bF9iYXNlY2FzZSAtLSBNdWx0aXBseSB0d28gbGltYiB2ZWN0b3JzIGFuZCBzdG9yZSB0aGUgcmVzdWx0CitkbmwgIGluIGEgdGhpcmQgbGltYiB2ZWN0b3IuCisKK2RubCAgQ29weXJpZ2h0IDE5OTYtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgICAgIGN5Y2xlcy9jcm9zc3Byb2R1Y3QKK0MgUDUJICAxNQorQyBQNgkgICA3LjUKK0MgSzYJICAxMi41CitDIEs3CSAgIDUuNQorQyBQNAkgIDI0CisKKworQyB2b2lkIG1wbl9tdWxfYmFzZWNhc2UgKG1wX3B0ciB3cCwKK0MgICAgICAgICAgICAgICAgICAgICAgICBtcF9zcmNwdHIgeHAsIG1wX3NpemVfdCB4c2l6ZSwKK0MgICAgICAgICAgICAgICAgICAgICAgICBtcF9zcmNwdHIgeXAsIG1wX3NpemVfdCB5c2l6ZSk7CitDCitDIFRoaXMgd2FzIHdyaXR0ZW4gaW4gYSBoYXN0ZSBzaW5jZSB0aGUgUGVudGl1bSBvcHRpbWl6ZWQgY29kZSB0aGF0IHdhcyB1c2VkCitDIGZvciBhbGwgeDg2IG1hY2hpbmVzIHdhcyBzbG93IGZvciB0aGUgUGVudGl1bSBJSS4gIFRoaXMgY29kZSB3b3VsZCBiZW5lZml0CitDIGZyb20gc29tZSBjbGVhbnVwLgorQworQyBUbyBzaGF2ZSBvZmYgc29tZSBwZXJjZW50YWdlIG9mIHRoZSBydW4tdGltZSwgb25lIHNob3VsZCBtYWtlIDQgdmFyaWFudHMKK0Mgb2YgdGhlIExvdXRlciBsb29wLCBmb3IgdGhlIGZvdXIgZGlmZmVyZW50IG91dGNvbWVzIG9mIHVuIG1vZCA0LiAgVGhhdAorQyB3b3VsZCBhdm9pZCBMb29wMCBhbHRvZ2V0aGVyLiAgQ29kZSBleHBhbnNpb24gd291bGQgYmUgPiA0LWZvbGQgZm9yIHRoYXQKK0MgcGFydCBvZiB0aGUgZnVuY3Rpb24sIGJ1dCBzaW5jZSBpdCBpcyBub3QgdmVyeSBsYXJnZSwgdGhhdCB3b3VsZCBiZQorQyBhY2NlcHRhYmxlLgorQworQyBUaGUgbXVsIGxvb3AgKGF0IEwob29wTSkpIG1pZ2h0IG5lZWQgc29tZSB0d2Vha2luZy4gIEl0J3MgY3VycmVudCBzcGVlZCBpcworQyB1bmtub3duLgorCitkZWZmcmFtZShQQVJBTV9ZU0laRSwyMCkKK2RlZmZyYW1lKFBBUkFNX1lQLCAgIDE2KQorZGVmZnJhbWUoUEFSQU1fWFNJWkUsMTIpCitkZWZmcmFtZShQQVJBTV9YUCwgICA4KQorZGVmZnJhbWUoUEFSQU1fV1AsICAgNCkKKworZGVmZnJhbWUoVkFSX01VTFRJUExJRVIsIC00KQorZGVmZnJhbWUoVkFSX0NPVU5URVIsICAgIC04KQorZGVmbGl0KFZBUl9TVEFDS19TUEFDRSwgIDgpCisKKwlURVhUCisJQUxJR04oOCkKKworUFJPTE9HVUUobXBuX211bF9iYXNlY2FzZSkKK2RlZmxpdChgRlJBTUUnLDApCisKKwlzdWJsCSRWQVJfU1RBQ0tfU1BBQ0UsJWVzcAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJwCisJcHVzaGwJJWVkaQorZGVmbGl0KGBGUkFNRScsZXZhbChWQVJfU1RBQ0tfU1BBQ0UrMTIpKQorCisJbW92bAlQQVJBTV9YUCwlZXNpCisJbW92bAlQQVJBTV9XUCwlZWRpCisJbW92bAlQQVJBTV9ZUCwlZWJwCisKKwltb3ZsCSglZXNpKSwlZWF4CQlDIGxvYWQgeHBbMF0KKwltdWxsCSglZWJwKQkJCUMgbXVsdGlwbHkgYnkgeXBbMF0KKwltb3ZsCSVlYXgsKCVlZGkpCQlDIHN0b3JlIHRvIHdwWzBdCisJbW92bAlQQVJBTV9YU0laRSwlZWN4CUMgeHNpemUKKwlkZWNsCSVlY3gJCQlDIElmIHhzaXplID0gMSwgeXNpemUgPSAxIHRvbworCWp6CUwoZG9uZSkKKworCXB1c2hsCSVlYngKK0ZSQU1FX3B1c2hsKCkKKwltb3ZsCSVlZHgsJWVieAorCisJbGVhbAk0KCVlc2kpLCVlc2kKKwlsZWFsCTQoJWVkaSksJWVkaQorCitMKG9vcE0pOgorCW1vdmwJKCVlc2kpLCVlYXgJCUMgbG9hZCBuZXh0IGxpbWIgYXQgeHBbal0KKwlsZWFsCTQoJWVzaSksJWVzaQorCW11bGwJKCVlYnApCisJYWRkbAklZWJ4LCVlYXgKKwltb3ZsCSVlZHgsJWVieAorCWFkY2wJJDAsJWVieAorCW1vdmwJJWVheCwoJWVkaSkKKwlsZWFsCTQoJWVkaSksJWVkaQorCWRlY2wJJWVjeAorCWpueglMKG9vcE0pCisKKwltb3ZsCSVlYngsKCVlZGkpCQlDIG1vc3Qgc2lnbmlmaWNhbnQgbGltYiBvZiBwcm9kdWN0CisJYWRkbAkkNCwlZWRpCQkJQyBpbmNyZW1lbnQgd3AKKwltb3ZsCVBBUkFNX1hTSVpFLCVlYXgKKwlzaGxsCSQyLCVlYXgKKwlzdWJsCSVlYXgsJWVkaQorCXN1YmwJJWVheCwlZXNpCisKKwltb3ZsCVBBUkFNX1lTSVpFLCVlYXgJQyB5c2l6ZQorCWRlY2wJJWVheAorCWp6CUwoc2tpcCkKKwltb3ZsCSVlYXgsVkFSX0NPVU5URVIJQyBzZXQgaW5kZXggaSB0byB5c2l6ZQorCitMKG91dGVyKToKKwltb3ZsCVBBUkFNX1lQLCVlYnAJCUMgeXAKKwlhZGRsCSQ0LCVlYnAJCQlDIG1ha2UgZWJwIHBvaW50IHRvIG5leHQgdiBsaW1iCisJbW92bAklZWJwLFBBUkFNX1lQCisJbW92bAkoJWVicCksJWVheAkJQyBjb3B5IHkgbGltYiAuLi4KKwltb3ZsCSVlYXgsVkFSX01VTFRJUExJRVIJQyAuLi4gdG8gc3RhY2sgc2xvdAorCW1vdmwJUEFSQU1fWFNJWkUsJWVjeAorCisJeG9ybAklZWJ4LCVlYngKKwlhbmRsCSQzLCVlY3gKKwlqeglMKGVuZDApCisKK0wob29wMCk6CisJbW92bAkoJWVzaSksJWVheAorCW11bGwJVkFSX01VTFRJUExJRVIKKwlsZWFsCTQoJWVzaSksJWVzaQorCWFkZGwJJWVieCwlZWF4CisJbW92bAkkMCwlZWJ4CisJYWRjbAklZWJ4LCVlZHgKKwlhZGRsCSVlYXgsKCVlZGkpCisJYWRjbAklZWR4LCVlYngJCUMgcHJvcGFnYXRlIGNhcnJ5IGludG8gY3lsaW1iCisKKwlsZWFsCTQoJWVkaSksJWVkaQorCWRlY2wJJWVjeAorCWpueglMKG9vcDApCisKK0woZW5kMCk6CisJbW92bAlQQVJBTV9YU0laRSwlZWN4CisJc2hybAkkMiwlZWN4CisJanoJTChlbmRYKQorCisJQUxJR04oOCkKK0wob29wWCk6CisJbW92bAkoJWVzaSksJWVheAorCW11bGwJVkFSX01VTFRJUExJRVIKKwlhZGRsCSVlYXgsJWVieAorCW1vdmwJJDAsJWVicAorCWFkY2wJJWVkeCwlZWJwCisKKwltb3ZsCTQoJWVzaSksJWVheAorCW11bGwJVkFSX01VTFRJUExJRVIKKwlhZGRsCSVlYngsKCVlZGkpCisJYWRjbAklZWF4LCVlYnAJQyBuZXcgbG8gKyBjeWxpbWIKKwltb3ZsCSQwLCVlYngKKwlhZGNsCSVlZHgsJWVieAorCisJbW92bAk4KCVlc2kpLCVlYXgKKwltdWxsCVZBUl9NVUxUSVBMSUVSCisJYWRkbAklZWJwLDQoJWVkaSkKKwlhZGNsCSVlYXgsJWVieAlDIG5ldyBsbyArIGN5bGltYgorCW1vdmwJJDAsJWVicAorCWFkY2wJJWVkeCwlZWJwCisKKwltb3ZsCTEyKCVlc2kpLCVlYXgKKwltdWxsCVZBUl9NVUxUSVBMSUVSCisJYWRkbAklZWJ4LDgoJWVkaSkKKwlhZGNsCSVlYXgsJWVicAlDIG5ldyBsbyArIGN5bGltYgorCW1vdmwJJDAsJWVieAorCWFkY2wJJWVkeCwlZWJ4CisKKwlhZGRsCSVlYnAsMTIoJWVkaSkKKwlhZGNsCSQwLCVlYngJCUMgcHJvcGFnYXRlIGNhcnJ5IGludG8gY3lsaW1iCisKKwlsZWFsCTE2KCVlc2kpLCVlc2kKKwlsZWFsCTE2KCVlZGkpLCVlZGkKKwlkZWNsCSVlY3gKKwlqbnoJTChvb3BYKQorCitMKGVuZFgpOgorCW1vdmwJJWVieCwoJWVkaSkKKwlhZGRsCSQ0LCVlZGkKKworCUMgd2UgaW5jcmVtZW50ZWQgd3AgYW5kIHhwIGluIHRoZSBsb29wIGFib3ZlOyBjb21wZW5zYXRlCisJbW92bAlQQVJBTV9YU0laRSwlZWF4CisJc2hsbAkkMiwlZWF4CisJc3VibAklZWF4LCVlZGkKKwlzdWJsCSVlYXgsJWVzaQorCisJbW92bAlWQVJfQ09VTlRFUiwlZWF4CisJZGVjbAklZWF4CisJbW92bAklZWF4LFZBUl9DT1VOVEVSCisJam56CUwob3V0ZXIpCisKK0woc2tpcCk6CisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZWJwCisJcG9wbAklZXNpCisJYWRkbAkkOCwlZXNwCisJcmV0CisKK0woZG9uZSk6CisJbW92bAklZWR4LDQoJWVkaSkJICAgQyBzdG9yZSB0byB3cFsxXQorCXBvcGwJJWVkaQorCXBvcGwJJWVicAorCXBvcGwJJWVzaQorCWFkZGwJJDgsJWVzcAorCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L3JzaGlmdC5hc20gYi9tcG4veDg2L3JzaGlmdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1YjdjZQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvcnNoaWZ0LmFzbQpAQCAtMCwwICsxLDEwOCBAQAorZG5sICB4ODYgbXBuX3JzaGlmdCAtLSBtcG4gcmlnaHQgc2hpZnQuCisKK2RubCAgQ29weXJpZ2h0IDE5OTIsIDE5OTQsIDE5OTYsIDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgICAgIGN5Y2xlcy9saW1iCitDIFA1NAkgNy41CitDIFA1NQkgNy4wCitDIFA2CSAyLjUKK0MgSzYJIDQuNQorQyBLNwkgNS4wCitDIFA0CTE2LjUKKworCitDIG1wX2xpbWJfdCBtcG5fcnNoaWZ0IChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSwKK0MgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNoaWZ0KTsKKworZGVmZnJhbWUoUEFSQU1fU0hJRlQsMTYpCitkZWZmcmFtZShQQVJBTV9TSVpFLCAxMikKK2RlZmZyYW1lKFBBUkFNX1NSQywgIDgpCitkZWZmcmFtZShQQVJBTV9EU1QsICA0KQorCisJVEVYVAorCUFMSUdOKDgpCitQUk9MT0dVRShtcG5fcnNoaWZ0KQorCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKwlwdXNobAklZWJ4CitkZWZsaXQoYEZSQU1FJywxMikKKworCW1vdmwJUEFSQU1fRFNULCVlZGkKKwltb3ZsCVBBUkFNX1NSQywlZXNpCisJbW92bAlQQVJBTV9TSVpFLCVlZHgKKwltb3ZsCVBBUkFNX1NISUZULCVlY3gKKworCWxlYWwJLTQoJWVkaSwlZWR4LDQpLCVlZGkKKwlsZWFsCSglZXNpLCVlZHgsNCksJWVzaQorCW5lZ2wJJWVkeAorCisJbW92bAkoJWVzaSwlZWR4LDQpLCVlYngJQyByZWFkIGxlYXN0IHNpZ25pZmljYW50IGxpbWIKKwl4b3JsCSVlYXgsJWVheAorCXNocmRsKAklY2wsICVlYngsICVlYXgpCUMgY29tcHV0ZSBjYXJyeSBsaW1iCisJaW5jbAklZWR4CisJanoJTChlbmQpCisJcHVzaGwJJWVheAkJCUMgcHVzaCBjYXJyeSBsaW1iIG9udG8gc3RhY2sKKwl0ZXN0YgkkMSwlZGwKKwlqbnoJTCgxKQkJCUMgZW50ZXIgbG9vcCBpbiB0aGUgbWlkZGxlCisJbW92bAklZWJ4LCVlYXgKKworCUFMSUdOKDgpCitMKG9vcCk6CW1vdmwJKCVlc2ksJWVkeCw0KSwlZWJ4CUMgbG9hZCBuZXh0IGhpZ2hlciBsaW1iCisJc2hyZGwoCSVjbCwgJWVieCwgJWVheCkJQyBjb21wdXRlIHJlc3VsdCBsaW1iCisJbW92bAklZWF4LCglZWRpLCVlZHgsNCkJQyBzdG9yZSBpdAorCWluY2wJJWVkeAorTCgxKToJbW92bAkoJWVzaSwlZWR4LDQpLCVlYXgKKwlzaHJkbCgJJWNsLCAlZWF4LCAlZWJ4KQorCW1vdmwJJWVieCwoJWVkaSwlZWR4LDQpCisJaW5jbAklZWR4CisJam56CUwob29wKQorCisJc2hybAklY2wsJWVheAkJQyBjb21wdXRlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYgorCW1vdmwJJWVheCwoJWVkaSkJCUMgc3RvcmUgaXQKKworCXBvcGwJJWVheAkJCUMgcG9wIGNhcnJ5IGxpbWIKKworCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXJldAorCitMKGVuZCk6CXNocmwJJWNsLCVlYngJCUMgY29tcHV0ZSBtb3N0IHNpZ25pZmljYW50IGxpbWIKKwltb3ZsCSVlYngsKCVlZGkpCQlDIHN0b3JlIGl0CisKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlyZXQKKworRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9zZWNfdGFic2VsZWN0LmFzbSBiL21wbi94ODYvc2VjX3RhYnNlbGVjdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxZmYxNgotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvc2VjX3RhYnNlbGVjdC5hc20KQEAgLTAsMCArMSwxMDYgQEAKK2RubCAgeDg2IG1wbl9zZWNfdGFic2VsZWN0LgorCitkbmwgIENvcHlyaWdodCAyMDExLCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkJCSAgICBjeWNsZXMvbGltYgorQyBQNQkJCQkgPworQyBQNiBtb2RlbCAwLTgsMTAtMTIJCSA/CitDIFA2IG1vZGVsIDkgIChCYW5pYXMpCQkgPworQyBQNiBtb2RlbCAxMyAoRG90aGFuKQkJID8KK0MgUDQgbW9kZWwgMCAgKFdpbGxhbWV0dGUpCSA/CitDIFA0IG1vZGVsIDEgICg/KQkJID8KK0MgUDQgbW9kZWwgMiAgKE5vcnRod29vZCkJIDQuNQorQyBQNCBtb2RlbCAzICAoUHJlc2NvdHQpCSA/CitDIFA0IG1vZGVsIDQgIChOb2NvbmEpCQkgPworQyBJbnRlbCBBdG9tCQkJID8KK0MgQU1EIEs2CQkJID8KK0MgQU1EIEs3CQkJIDMuNAorQyBBTUQgSzgJCQkgPworQyBBTUQgSzEwCQkJID8KKworQyBOT1RFUworQyAgKiBUaGlzIGhhcyBub3QgYmVlbiB0dW5lZCBmb3IgYW55IHNwZWNpZmljIHByb2Nlc3Nvci4gIEl0cyBzcGVlZCBzaG91bGQgbm90CitDICAgIGJlIHRvbyBiYWQsIHRob3VnaC4KK0MgICogVXNpbmcgU1NFMiBjb3VsZCByZXN1bHQgaW4gbWFueS1mb2xkIHNwZWVkdXAuCisKK0MgbXBuX3NlY190YWJzZWxlY3QgKG1wX2xpbWJfdCAqcnAsIG1wX2xpbWJfdCAqdHAsIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgbmVudHMsIG1wX3NpemVfdCB3aGljaCkKK2RlZmluZShgcnAnLCAgICAgYCVlZGknKQorZGVmaW5lKGB0cCcsICAgICBgJWVzaScpCitkZWZpbmUoYG4nLCAgICAgIGAlZWJ4JykKK2RlZmluZShgbmVudHMnLCAgYDMyKCVlc3ApJykKK2RlZmluZShgd2hpY2gnLCAgYDM2KCVlc3ApJykKKworZGVmaW5lKGBpJywgICAgICBgJWVicCcpCitkZWZpbmUoYG1hc2snLCAgIGAlZWN4JykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fc2VjX3RhYnNlbGVjdCkKKwlwdXNoCSVlZGkKKwlwdXNoCSVlc2kKKwlwdXNoCSVlYngKKwlwdXNoCSVlYnAKKwltb3YJMjAoJWVzcCksIHJwCisJbW92CTI0KCVlc3ApLCB0cAorCW1vdgkyOCglZXNwKSwgbgorCisJbGVhCShycCxuLDQpLCBycAorCWxlYQkodHAsbiw0KSwgdHAKK0wob3V0ZXIpOgorCXN1YmwJJDEsIHdoaWNoCisJc2JiCW1hc2ssIG1hc2sKKworCW1vdgluLCBpCisJbmVnCWkKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJKHRwLGksNCksICVlYXgKKwltb3YJKHJwLGksNCksICVlZHgKKwl4b3IJJWVkeCwgJWVheAorCWFuZAltYXNrLCAlZWF4CisJeG9yCSVlZHgsICVlYXgKKwltb3YJJWVheCwgKHJwLGksNCkKKwlpbmMJaQorCWpzCUwodG9wKQorCitMKGVuZCk6CWxlYQkodHAsbiw0KSwgdHAKKwlkZWNsCW5lbnRzCisJam5lCUwob3V0ZXIpCisKK0wob3V0ZXJfZW5kKToKKwlwb3AJJWVicAorCXBvcAklZWJ4CisJcG9wCSVlc2kKKwlwb3AJJWVkaQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni9zcXJfYmFzZWNhc2UuYXNtIGIvbXBuL3g4Ni9zcXJfYmFzZWNhc2UuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjdmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2L3Nxcl9iYXNlY2FzZS5hc20KQEAgLTAsMCArMSwzNTkgQEAKK2RubCAgeDg2IGdlbmVyaWMgbXBuX3Nxcl9iYXNlY2FzZSAtLSBzcXVhcmUgYW4gbXBuIG51bWJlci4KKworZG5sICBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyAgICAgY3ljbGVzL2Nyb3NzcHJvZHVjdCAgY3ljbGVzL3RyaWFuZ2xlcHJvZHVjdAorQyBQNQorQyBQNgorQyBLNgorQyBLNworQyBQNAorCisKK0Mgdm9pZCBtcG5fc3FyX2Jhc2VjYXNlIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSk7CitDCitDIFRoZSBhbGdvcml0aG0gaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIG1wbi9nZW5lcmljL3Nxcl9iYXNlY2FzZS5jLCBidXQgYQorQyBsb3Qgb2YgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZHMgYXJlIGF2b2lkZWQsIGVzcGVjaWFsbHkgd2hlbiB0aGUgc2l6ZSBpcworQyBzbWFsbC4KK0MKK0MgVGhlIG11bDEgbG9vcCBpcyBub3QgdW5yb2xsZWQgbGlrZSBtdWxfMS5hc20sIGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCB0aGUKK0MgY29kZSBzaXplIHRvIGRvIHNvIGhlcmUuCitDCitDIEVuaGFuY2VtZW50czoKK0MKK0MgVGhlIGFkZG11bCBsb29wIGhlcmUgaXMgYWxzbyBub3QgdW5yb2xsZWQgbGlrZSBhb3JzbXVsXzEuYXNtIGFuZAorQyBtdWxfYmFzZWNhc2UuYXNtIGFyZS4gIFBlcmhhcHMgaXQgc2hvdWxkIGJlIGRvbmUuICBJdCdkIGFkZCB0byB0aGUKK0MgY29tcGxleGl0eSwgYnV0IGlmIGl0J3Mgd29ydGggZG9pbmcgaW4gdGhlIG90aGVyIHBsYWNlcyB0aGVuIGl0IHNob3VsZCBiZQorQyB3b3J0aHdoaWxlIGhlcmUuCitDCitDIEEgZnVsbHktdW5yb2xsZWQgc3R5bGUgbGlrZSBvdGhlciBzcXJfYmFzZWNhc2UuYXNtIHZlcnNpb25zIChrNiwgazcsIHA2KQorQyBtaWdodCBiZSB3b3J0aCBjb25zaWRlcmluZy4gIFRoYXQnZCBhZGQgcXVpdGUgYSBiaXQgdG8gdGhlIGNvZGUgc2l6ZSwgYnV0CitDIG9ubHkgYXMgbXVjaCBhcyBpcyB1c2VkIHdvdWxkIGJlIGRyYWdnZWQgaW50byBMMSBjYWNoZS4KKworZGVmZnJhbWUoUEFSQU1fU0laRSwxMikKK2RlZmZyYW1lKFBBUkFNX1NSQywgOCkKK2RlZmZyYW1lKFBBUkFNX0RTVCwgNCkKKworCVRFWFQKKwlBTElHTig4KQorUFJPTE9HVUUobXBuX3Nxcl9iYXNlY2FzZSkKK2RlZmxpdChgRlJBTUUnLDApCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlZHgKKworCW1vdmwJUEFSQU1fU1JDLCAlZWF4CisKKwljbXBsCSQyLCAlZWR4CisJbW92bAlQQVJBTV9EU1QsICVlY3gKKworCWplCUwodHdvX2xpbWJzKQorCWphCUwodGhyZWVfb3JfbW9yZSkKKworCitDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDIG9uZSBsaW1iIG9ubHkKKwlDIGVheAlzcmMKKwlDIGVieAorCUMgZWN4CWRzdAorCUMgZWR4CisKKwltb3ZsCSglZWF4KSwgJWVheAorCW11bGwJJWVheAorCW1vdmwJJWVheCwgKCVlY3gpCisJbW92bAklZWR4LCA0KCVlY3gpCisJcmV0CisKKworQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUFMSUdOKDgpCitMKHR3b19saW1icyk6CisJQyBlYXgJc3JjCisJQyBlYngKKwlDIGVjeAlkc3QKKwlDIGVkeAorCisJcHVzaGwJJWVieAorCXB1c2hsCSVlYnAKKworCW1vdmwJJWVheCwgJWVieAorCW1vdmwJKCVlYXgpLCAlZWF4CisKKwltdWxsCSVlYXgJCUMgc3JjWzBdXjIKKworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisKKwltb3ZsCSVlZHgsICVlc2kJQyBkc3RbMV0KKwltb3ZsCSVlYXgsICglZWN4KQlDIGRzdFswXQorCisJbW92bAk0KCVlYngpLCAlZWF4CisJbXVsbAklZWF4CQlDIHNyY1sxXV4yCisKKwltb3ZsCSVlYXgsICVlZGkJQyBkc3RbMl0KKwltb3ZsCSVlZHgsICVlYnAJQyBkc3RbM10KKworCW1vdmwJKCVlYngpLCAlZWF4CisJbXVsbAk0KCVlYngpCQlDIHNyY1swXSpzcmNbMV0KKworCWFkZGwJJWVheCwgJWVzaQorCisJYWRjbAklZWR4LCAlZWRpCisKKwlhZGNsCSQwLCAlZWJwCisJYWRkbAklZXNpLCAlZWF4CisKKwlhZGNsCSVlZGksICVlZHgKKwltb3ZsCSVlYXgsIDQoJWVjeCkKKworCWFkY2wJJDAsICVlYnAKKworCW1vdmwJJWVkeCwgOCglZWN4KQorCW1vdmwJJWVicCwgMTIoJWVjeCkKKworCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCisJcG9wbAklZWJwCisJcG9wbAklZWJ4CisKKwlyZXQKKworCitDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQUxJR04oOCkKK0wodGhyZWVfb3JfbW9yZSk6CitkZWZsaXQoYEZSQU1FJywwKQorCUMgZWF4CXNyYworCUMgZWJ4CisJQyBlY3gJZHN0CisJQyBlZHgJc2l6ZQorCisJcHVzaGwJJWVieAlGUkFNRV9wdXNobCgpCisJcHVzaGwJJWVkaQlGUkFNRV9wdXNobCgpCisKKwlwdXNobAklZXNpCUZSQU1FX3B1c2hsKCkKKwlwdXNobAklZWJwCUZSQU1FX3B1c2hsKCkKKworCWxlYWwJKCVlY3gsJWVkeCw0KSwgJWVkaQlDICZkc3Rbc2l6ZV0sIGVuZCBvZiB0aGlzIG11bDEKKwlsZWFsCSglZWF4LCVlZHgsNCksICVlc2kJQyAmc3JjW3NpemVdCisKK0MgRmlyc3QgbXVsdGlwbHkgc3JjWzBdKnNyY1sxLi5zaXplLTFdIGFuZCBzdG9yZSBhdCBkc3RbMS4uc2l6ZV0uCisKKwltb3ZsCSglZWF4KSwgJWVicAkJQyBzcmNbMF0sIG11bHRpcGxpZXIKKwltb3ZsCSVlZHgsICVlY3gKKworCW5lZ2wJJWVjeAkJCUMgLXNpemUKKwl4b3JsCSVlYngsICVlYngJCUMgY2xlYXIgY2FycnkgbGltYgorCisJaW5jbAklZWN4CQkJQyAtKHNpemUtMSkKKworTChtdWwxKToKKwlDIGVheAlzY3JhdGNoCisJQyBlYngJY2FycnkKKwlDIGVjeAljb3VudGVyLCBsaW1icywgbmVnYXRpdmUKKwlDIGVkeAlzY3JhdGNoCisJQyBlc2kJJnNyY1tzaXplXQorCUMgZWRpCSZkc3Rbc2l6ZV0KKwlDIGVicAltdWx0aXBsaWVyCisKKwltb3ZsCSglZXNpLCVlY3gsNCksICVlYXgKKwltdWxsCSVlYnAKKwlhZGRsCSVlYXgsICVlYngKKwlhZGNsCSQwLCAlZWR4CisJbW92bAklZWJ4LCAoJWVkaSwlZWN4LDQpCisJbW92bAklZWR4LCAlZWJ4CisJaW5jbAklZWN4CisJam56CUwobXVsMSkKKworCW1vdmwJJWVieCwgKCVlZGkpCisKKworCUMgQWRkIHByb2R1Y3RzIHNyY1tuXSpzcmNbbisxLi5zaXplLTFdIGF0IGRzdFsyKm4tMS4uLl0sIGZvcgorCUMgbj0xLi5zaXplLTIuCisJQworCUMgVGhlIGxhc3QgcHJvZHVjdHMgc3JjW3NpemUtMl0qc3JjW3NpemUtMV0sIHdoaWNoIGlzIHRoZSBlbmQgY29ybmVyCisJQyBvZiB0aGUgcHJvZHVjdCB0cmlhbmdsZSwgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGF0IHRoZSBlbmQgdG8gc2F2ZQorCUMgbG9vcGluZyBvdmVyaGVhZC4gIElmIHNpemUgaXMgMyB0aGVuIGl0J3Mgb25seSB0aGlzIHRoYXQgbmVlZHMgdG8KKwlDIGJlIGRvbmUuCisJQworCUMgSW4gdGhlIG91dGVyIGxvb3AgJWVzaSBpcyBhIGNvbnN0YW50LCBhbmQgJWVkaSBqdXN0IGFkdmFuY2VzIGJ5IDEKKwlDIGxpbWIgZWFjaCB0aW1lLiAgVGhlIHNpemUgb2YgdGhlIG9wZXJhdGlvbiBkZWNyZWFzZXMgYnkgMSBsaW1iCisJQyBlYWNoIHRpbWUuCisKKwlDIGVheAorCUMgZWJ4CWNhcnJ5IChuZWVkaW5nIGNhcnJ5IGZsYWcgYWRkZWQpCisJQyBlY3gKKwlDIGVkeAorCUMgZXNpCSZzcmNbc2l6ZV0KKwlDIGVkaQkmZHN0W3NpemVdCisJQyBlYnAKKworCW1vdmwJUEFSQU1fU0laRSwgJWVjeAorCXN1YmwJJDMsICVlY3gKKwlqeglMKGNvcm5lcikKKworCW5lZ2wJJWVjeAorCitkbmwgIHJlLXVzZSBwYXJhbWV0ZXIgc3BhY2UKK2RlZmluZShWQVJfT1VURVIsYFBBUkFNX0RTVCcpCisKK0wob3V0ZXIpOgorCUMgZWF4CisJQyBlYngKKwlDIGVjeAorCUMgZWR4CW91dGVyIGxvb3AgY291bnRlciwgLShzaXplLTMpIHRvIC0xCisJQyBlc2kJJnNyY1tzaXplXQorCUMgZWRpCWRzdCwgcG9pbnRpbmcgYXQgc3RvcmVkIGNhcnJ5IGxpbWIgb2YgcHJldmlvdXMgbG9vcAorCUMgZWJwCisKKwltb3ZsCSVlY3gsIFZBUl9PVVRFUgorCWFkZGwJJDQsICVlZGkJCUMgYWR2YW5jZSBkc3QgZW5kCisKKwltb3ZsCS04KCVlc2ksJWVjeCw0KSwgJWVicAlDIG5leHQgbXVsdGlwbGllcgorCXN1YmwJJDEsICVlY3gKKworCXhvcmwJJWVieCwgJWVieAkJQyBpbml0aWFsIGNhcnJ5IGxpbWIKKworTChpbm5lcik6CisJQyBlYXgJc2NyYXRjaAorCUMgZWJ4CWNhcnJ5IChuZWVkaW5nIGNhcnJ5IGZsYWcgYWRkZWQpCisJQyBlY3gJY291bnRlciwgLW4tMSB0byAtMQorCUMgZWR4CXNjcmF0Y2gKKwlDIGVzaQkmc3JjW3NpemVdCisJQyBlZGkJZHN0IGVuZCBvZiB0aGlzIGFkZG11bAorCUMgZWJwCW11bHRpcGxpZXIKKworCW1vdmwJKCVlc2ksJWVjeCw0KSwgJWVheAorCW11bGwJJWVicAorCWFkZGwJJWVieCwgJWVheAorCWFkY2wJJDAsICVlZHgKKwlhZGRsCSVlYXgsICglZWRpLCVlY3gsNCkKKwlhZGNsCSQwLCAlZWR4CisJbW92bAklZWR4LCAlZWJ4CisJYWRkbAkkMSwgJWVjeAorCWpsCUwoaW5uZXIpCisKKworCW1vdmwJJWVieCwgKCVlZGkpCisJbW92bAlWQVJfT1VURVIsICVlY3gKKwlpbmNsCSVlY3gKKwlqbnoJTChvdXRlcikKKworCitMKGNvcm5lcik6CisJQyBlc2kJJnNyY1tzaXplXQorCUMgZWRpCSZkc3RbMipzaXplLTNdCisKKwltb3ZsCS00KCVlc2kpLCAlZWF4CisJbXVsbAktOCglZXNpKQkJQyBzcmNbc2l6ZS0xXSpzcmNbc2l6ZS0yXQorCWFkZGwJJWVheCwgMCglZWRpKQorCWFkY2wJJDAsICVlZHgKKwltb3ZsCSVlZHgsIDQoJWVkaSkJCUMgZHN0IGhpZ2ggbGltYgorCisKK0MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0MgTGVmdCBzaGlmdCBvZiBkc3RbMS4uMipzaXplLTJdLCBoaWdoIGJpdCBzaGlmdGVkIG91dCBiZWNvbWVzIGRzdFsyKnNpemUtMV0uCisKKwltb3ZsCVBBUkFNX1NJWkUsICVlYXgKKwluZWdsCSVlYXgKKwlhZGRsCSQxLCAlZWF4CQlDIC0oc2l6ZS0xKSBhbmQgY2xlYXIgY2FycnkKKworTChsc2hpZnQpOgorCUMgZWF4CWNvdW50ZXIsIG5lZ2F0aXZlCisJQyBlYngJbmV4dCBsaW1iCisJQyBlY3gKKwlDIGVkeAorCUMgZXNpCisJQyBlZGkJJmRzdFsyKnNpemUtNF0KKwlDIGVicAorCisJcmNsbAk4KCVlZGksJWVheCw4KQorCXJjbGwJMTIoJWVkaSwlZWF4LDgpCisJaW5jbAklZWF4CisJam56CUwobHNoaWZ0KQorCisKKwlhZGNsCSVlYXgsICVlYXgJCUMgaGlnaCBiaXQgb3V0CisJbW92bAklZWF4LCA4KCVlZGkpCQlDIGRzdCBtb3N0IHNpZ25pZmljYW50IGxpbWIKKworCitDIE5vdyBhZGQgaW4gdGhlIHNxdWFyZXMgb24gdGhlIGRpYWdvbmFsLCBuYW1lbHkgc3JjWzBdXjIsIHNyY1sxXV4yLCAuLi4sCitDIHNyY1tzaXplLTFdXjIuICBkc3RbMF0gaGFzbid0IHlldCBiZWVuIHNldCBhdCBhbGwgeWV0LCBhbmQganVzdCBnZXRzIHRoZQorQyBsb3cgbGltYiBvZiBzcmNbMF1eMi4KKworCW1vdmwJUEFSQU1fU1JDLCAlZXNpCisJbW92bAkoJWVzaSksICVlYXgJCUMgc3JjWzBdCisJbXVsbAklZWF4CQkJQyBzcmNbMF1eMgorCisJbW92bAlQQVJBTV9TSVpFLCAlZWN4CisJbGVhbAkoJWVzaSwlZWN4LDQpLCAlZXNpCUMgc3JjIGVuZAorCisJbmVnbAklZWN4CQkJQyAtc2l6ZQorCW1vdmwJJWVkeCwgJWVieAkJQyBpbml0aWFsIGNhcnJ5CisKKwltb3ZsCSVlYXgsIDEyKCVlZGksJWVjeCw4KQlDIGRzdFswXQorCWluY2wJJWVjeAkJCUMgLShzaXplLTEpCisKK0woZGlhZyk6CisJQyBlYXgJc2NyYXRjaCAobG93IHByb2R1Y3QpCisJQyBlYngJY2FycnkgbGltYgorCUMgZWN4CWNvdW50ZXIsIC0oc2l6ZS0xKSB0byAtMQorCUMgZWR4CXNjcmF0Y2ggKGhpZ2ggcHJvZHVjdCkKKwlDIGVzaQkmc3JjW3NpemVdCisJQyBlZGkJJmRzdFsyKnNpemUtM10KKwlDIGVicAlzY3JhdGNoIChmZXRjaGVkIGRzdCBsaW1icykKKworCW1vdmwJKCVlc2ksJWVjeCw0KSwgJWVheAorCW11bGwJJWVheAorCisJYWRkbAklZWJ4LCA4KCVlZGksJWVjeCw4KQorCW1vdmwJJWVkeCwgJWVieAorCisJYWRjbAklZWF4LCAxMiglZWRpLCVlY3gsOCkKKwlhZGNsCSQwLCAlZWJ4CisKKwlpbmNsCSVlY3gKKwlqbnoJTChkaWFnKQorCisKKwlhZGRsCSVlYngsIDgoJWVkaSkJCUMgZHN0IG1vc3Qgc2lnbmlmaWNhbnQgbGltYgorCisJcG9wbAklZWJwCisJcG9wbAklZXNpCisKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYngKKworCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2L3VkaXYuYXNtIGIvbXBuL3g4Ni91ZGl2LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE2OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Ni91ZGl2LmFzbQpAQCAtMCwwICsxLDUyIEBACitkbmwgIHg4NiBtcG5fdWRpdl9xcm5uZCAtLSAyIGJ5IDEgbGltYiBkaXZpc2lvbgorCitkbmwgIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyBtcF9saW1iX3QgbXBuX3VkaXZfcXJubmQgKG1wX2xpbWJfdCAqcmVtcHRyLCBtcF9saW1iX3QgaGlnaCwgbXBfbGltYl90IGxvdywKK0MgICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9saW1iX3QgZGl2aXNvcik7CisKK2RlZmZyYW1lKFBBUkFNX0RJVklTT1IsIDE2KQorZGVmZnJhbWUoUEFSQU1fTE9XLCAgICAgMTIpCitkZWZmcmFtZShQQVJBTV9ISUdILCAgICA4KQorZGVmZnJhbWUoUEFSQU1fUkVNUFRSLCAgNCkKKworCVRFWFQKKwlBTElHTig4KQorUFJPTE9HVUUobXBuX3VkaXZfcXJubmQpCitkZWZsaXQoYEZSQU1FJywwKQorCW1vdmwJUEFSQU1fTE9XLCAlZWF4CisJbW92bAlQQVJBTV9ISUdILCAlZWR4CisJZGl2bAlQQVJBTV9ESVZJU09SCisJbW92bAlQQVJBTV9SRU1QVFIsICVlY3gKKwltb3ZsCSVlZHgsICglZWN4KQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni91bXVsLmFzbSBiL21wbi94ODYvdW11bC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3MDNhYwotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYvdW11bC5hc20KQEAgLTAsMCArMSw1MSBAQAorZG5sICBtcG5fdW11bF9wcG1tIC0tIDF4MS0+MiBsaW1iIG11bHRpcGxpY2F0aW9uCisKK2RubCAgQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDIG1wX2xpbWJfdCBtcG5fdW11bF9wcG1tIChtcF9saW1iX3QgKmxvd3B0ciwgbXBfbGltYl90IG0xLCBtcF9saW1iX3QgbTIpOworQworCitkZWZmcmFtZShQQVJBTV9NMiwgICAgMTIpCitkZWZmcmFtZShQQVJBTV9NMSwgICAgIDgpCitkZWZmcmFtZShQQVJBTV9MT1dQVFIsIDQpCisKKwlURVhUCisJQUxJR04oOCkKK1BST0xPR1VFKG1wbl91bXVsX3BwbW0pCitkZWZsaXQoYEZSQU1FJywwKQorCW1vdmwJUEFSQU1fTE9XUFRSLCAlZWN4CisJbW92bAlQQVJBTV9NMSwgJWVheAorCW11bGwJUEFSQU1fTTIKKwltb3ZsCSVlYXgsICglZWN4KQorCW1vdmwJJWVkeCwgJWVheAorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Ni94ODYtZGVmcy5tNCBiL21wbi94ODYveDg2LWRlZnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzMDliMgotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODYveDg2LWRlZnMubTQKQEAgLTAsMCArMSwxMDI0IEBACitkaXZlcnQoLTEpCisKK2RubCAgbTQgbWFjcm9zIGZvciB4ODYgYXNzZW1ibGVyLgorCitkbmwgIENvcHlyaWdodCAxOTk5LTIwMDMsIDIwMDcsIDIwMTAsIDIwMTIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitkbmwgIE5vdGVzOgorZG5sCitkbmwgIG00IGlzbid0IHBlcmZlY3QgZm9yIHByb2Nlc3NpbmcgQlNEIHN0eWxlIHg4NiBhc3NlbWJsZXIgY29kZSwgdGhlIG1haW4KK2RubCAgcHJvYmxlbXMgYXJlLAorZG5sCitkbmwgIDEuIERvaW5nIGRlZmluZShmb28sMTIzKSBhbmQgdGhlbiB1c2luZyBmb28gaW4gYW4gYWRkcmVzc2luZyBtb2RlIGxpa2UKK2RubCAgICAgZm9vKCVlYngpIGV4cGFuZHMgYXMgYSBtYWNybyByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiAgVGhpcyBpcyB3b3JrZWQKK2RubCAgICAgYXJvdW5kIGJ5IHVzaW5nIGRlZmxpdCgpIGZyb20gYXNtLWRlZnMubTQsIGluc3RlYWQgb2YgZGVmaW5lKCkuCitkbmwKK2RubCAgMi4gSW1tZWRpYXRlcyBpbiBtYWNybyBkZWZpbml0aW9ucyBuZWVkIGEgc3BhY2Ugb3IgYCcgdG8gc3RvcCB0aGUgJAorZG5sICAgICBsb29raW5nIGxpa2UgYSBtYWNybyBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSwKK2RubAorZG5sCSAgICAgICAgZGVmaW5lKGZvbywgYG1vdiAkIDEyMywgJWVheCcpCitkbmwKK2RubCAgICAgVGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBpbiBtYWNybyBkZWZpbml0aW9ucywgbm90IGluIG9yZGluYXJ5IHRleHQsCitkbmwgICAgIGFuZCBub3QgaW4gbWFjcm8gcGFyYW1ldGVycyBsaWtlIHRleHQgcGFzc2VkIHRvIGZvcmxvb3AoKSBvciBpZmRlZigpLgorCisKK2RlZmxpdChHTVBfTElNQl9CWVRFUywgNCkKKworCitkbmwgIExpYnRvb2wgZ2l2ZXMgLURQSUMgLURETExfRVhQT1JUIHRvIGluZGljYXRlIGEgY3lnd2luIG9yIG1pbmd3IERMTC4gIFdlCitkbmwgIHVuZGVmaW5lIFBJQyBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50IGluIHRoaXMKK2RubCAgY2FzZSBhbmQgZGVmaW5pdGVseSBkb24ndCB3YW50IHRoZSBFTEYgc3R5bGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGV0Yy4KKworaWZkZWYoYERMTF9FWFBPUlQnLGB1bmRlZmluZShgUElDJyknKQorCisKK2RubCAgVXNhZ2U6IENQVVZFQ19GVU5DU19MSVNUCitkbmwKK2RubCAgQSBsaXN0IG9mIHRoZSBmdW5jdGlvbnMgZnJvbSBnbXAtaW1wbC5oIHg4NiBzdHJ1Y3QgY3B1dmVjX3QsIGluIHRoZQorZG5sICBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGF0IHN0cnVjdHVyZS4KKworZGVmaW5lKENQVVZFQ19GVU5DU19MSVNULAorYGBhZGRfbicsCitgYWRkbHNoMV9uJywKK2BhZGRsc2gyX24nLAorYGFkZG11bF8xJywKK2BhZGRtdWxfMicsCitgYmRpdl9kYm0xYycsCitgY25kX2FkZF9uJywKK2BjbmRfc3ViX24nLAorYGNvbScsCitgY29weWQnLAorYGNvcHlpJywKK2BkaXZleGFjdF8xJywKK2BkaXZyZW1fMScsCitgZ2NkXzExJywKK2Bsc2hpZnQnLAorYGxzaGlmdGMnLAorYG1vZF8xJywKK2Btb2RfMV8xcCcsCitgbW9kXzFfMXBfY3BzJywKK2Btb2RfMXNfMnAnLAorYG1vZF8xc18ycF9jcHMnLAorYG1vZF8xc180cCcsCitgbW9kXzFzXzRwX2NwcycsCitgbW9kXzM0bHN1YjEnLAorYG1vZGV4YWN0XzFjX29kZCcsCitgbXVsXzEnLAorYG11bF9iYXNlY2FzZScsCitgbXVsbG9fYmFzZWNhc2UnLAorYHByZWludl9kaXZyZW1fMScsCitgcHJlaW52X21vZF8xJywKK2ByZWRjXzEnLAorYHJlZGNfMicsCitgcnNoaWZ0JywKK2BzcXJfYmFzZWNhc2UnLAorYHN1Yl9uJywKK2BzdWJsc2gxX24nLAorYHN1Ym11bF8xJycpCisKKworZG5sICBDYWxsZWQ6IFBST0xPR1VFX2NwdShHU1lNX1BSRUZJWGAnZm9vKQorZG5sCitkbmwgIEluIHRoZSB4ODYgY29kZSB3ZSB1c2UgZXhwbGljaXQgVEVYVCBhbmQgQUxJR04oKSBjYWxscyBpbiB0aGUgY29kZSwKK2RubCAgc2luY2UgZGlmZmVyZW50IGFsaWdubWVudHMgYXJlIHdhbnRlZCBpbiB2YXJpb3VzIGNpcmN1bXN0YW5jZXMuICBTbyBmb3IKK2RubCAgaW5zdGFuY2UsCitkbmwKK2RubCAgICAgICAgICAgICAgICAgIFRFWFQKK2RubCAgICAgICAgICAgICAgICAgIEFMSUdOKDE2KQorZG5sICAgICAgICAgIFBST0xPR1VFKG1wbl9hZGRfbikKK2RubCAgICAgICAgICAuLi4KK2RubCAgICAgICAgICBFUElMT0dVRSgpCisKK2RlZmluZShgUFJPTE9HVUVfY3B1JywKK200X2Fzc2VydF9udW1hcmdzKDEpCittNF9hc3NlcnRfZGVmaW5lZChgV0FOVF9QUk9GSUxJTkcnKQorCWBHTE9CTAkkMQorCVRZUEUoJDEsYGZ1bmN0aW9uJykKKwlDT0ZGX1RZUEUoJDEpCiskMToKK2lmZWxzZShXQU5UX1BST0ZJTElORyxgcHJvZicsICAgICAgYAljYWxsX21jb3VudCcpCitpZmVsc2UoV0FOVF9QUk9GSUxJTkcsYGdwcm9mJywgICAgIGAJY2FsbF9tY291bnQnKQoraWZlbHNlKFdBTlRfUFJPRklMSU5HLGBpbnN0cnVtZW50JyxgCWNhbGxfaW5zdHJ1bWVudChlbnRlciknKQorJykKKworCitkbmwgIFVzYWdlOiBDT0ZGX1RZUEUoR1NZTV9QUkVGSVhgJ2ZvbykKK2RubAorZG5sICBFbWl0IENPRkYgc3R5bGUgIi5kZWYgLi4uIC5lbmRlZiIgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYSBmdW5jdGlvbiwgd2hlbgorZG5sICBzdXBwb3J0ZWQuICBUaGUgYXJndW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IEdTWU1fUFJFRklYLgorZG5sCitkbmwgIFNlZSBhdXRvY29uZiBtYWNybyBHTVBfQVNNX0NPRkZfVFlQRSBmb3IgSEFWRV9DT0ZGX1RZUEUuCisKK2RlZmluZShDT0ZGX1RZUEUsCittNF9hc3NlcnRfbnVtYXJncygxKQorbTRfYXNzZXJ0X2RlZmluZWQoYEhBVkVfQ09GRl9UWVBFJykKK2BpZmVsc2UoSEFWRV9DT0ZGX1RZUEUseWVzLAorCWAuZGVmCSQxCisJLnNjbAkyCisJLnR5cGUJMzIKKwkuZW5kZWYnKScpCisKKworZG5sICBVc2FnZTogY2FsbF9tY291bnQKK2RubAorZG5sICBGb3IgYGdwcm9mJyBzdHlsZSBwcm9maWxpbmcsICVlYnAgaXMgc2V0dXAgYXMgYSBmcmFtZSBwb2ludGVyLiAgTm9uZSBvZgorZG5sICB0aGUgYXNzZW1ibGVyIHJvdXRpbmVzIHVzZSAlZWJwIHRoaXMgd2F5LCBzbyBpdCdzIGRvbmUgb25seSBmb3IgdGhlCitkbmwgIGJlbmVmaXQgb2YgbWNvdW50LiAgZ2xpYmMgc3lzZGVwcy9pMzg2L2kzODYtbWNvdW50LlMgc2hvd3MgaG93IG1jb3VudAorZG5sICBnZXRzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGZyb20gKCVlc3ApIGFuZCB0aGUgcGFyZW50IGZyb20gNCglZWJwKS4KK2RubAorZG5sICBGb3IgYHByb2YnIHN0eWxlIHByb2ZpbGluZyBnY2MgZ2VuZXJhdGVzIG1jb3VudCBjYWxscyB3aXRob3V0IHNldHRpbmcKK2RubCAgdXAgJWVicCwgYW5kIHRoZSBzYW1lIGlzIGRvbmUgaGVyZS4KKworZGVmaW5lKGBjYWxsX21jb3VudCcsCittNF9hc3NlcnRfbnVtYXJncygtMSkKK200X2Fzc2VydF9kZWZpbmVkKGBXQU5UX1BST0ZJTElORycpCittNF9hc3NlcnRfZGVmaW5lZChgTUNPVU5UX1BJQ19SRUcnKQorbTRfYXNzZXJ0X2RlZmluZWQoYE1DT1VOVF9OT05QSUNfUkVHJykKK200X2Fzc2VydF9kZWZpbmVkKGBNQ09VTlRfUElDX0NBTEwnKQorbTRfYXNzZXJ0X2RlZmluZWQoYE1DT1VOVF9OT05QSUNfQ0FMTCcpCitgaWZlbHNlKGlmZGVmKGBQSUMnLGBNQ09VTlRfUElDX1JFRycsYE1DT1VOVF9OT05QSUNfUkVHJyksLCwKK2AJREFUQQorCUFMSUdOKDQpCitMKG1jb3VudF9kYXRhX2AnbWNvdW50X2NvdW50ZXIpOgorCVczMgkwCisJVEVYVAorJylkbmwKK2lmZWxzZShXQU5UX1BST0ZJTElORyxgZ3Byb2YnLAorYAlwdXNobAklZWJwCisJbW92bAklZXNwLCAlZWJwCisnKWRubAoraWZkZWYoYFBJQycsCitgCXB1c2hsCSVlYngKKwljYWxsX21vdmxfZWlwX3RvX2VieAorTChtY291bnRfaGVyZV9gJ21jb3VudF9jb3VudGVyKToKKwlhZGRsCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tTChtY291bnRfaGVyZV9gJ21jb3VudF9jb3VudGVyKV0sICVlYngKK2lmZWxzZShNQ09VTlRfUElDX1JFRywsLAorYAlsZWFsCUwobWNvdW50X2RhdGFfYCdtY291bnRfY291bnRlcilAR09UT0ZGKCVlYngpLCBNQ09VTlRfUElDX1JFRycpCitNQ09VTlRfUElDX0NBTEwKKwlwb3BsCSVlYngKKycsYGRubCBub24tUElDCitpZmVsc2UoTUNPVU5UX05PTlBJQ19SRUcsLCwKK2AJbW92bAlgJCdMKG1jb3VudF9kYXRhX2AnbWNvdW50X2NvdW50ZXIpLCBNQ09VTlRfTk9OUElDX1JFRworJylkbmwKK01DT1VOVF9OT05QSUNfQ0FMTAorJylkbmwKK2lmZWxzZShXQU5UX1BST0ZJTElORyxgZ3Byb2YnLAorYAlwb3BsCSVlYnAKKycpCitkZWZpbmUoYG1jb3VudF9jb3VudGVyJyxpbmNyKG1jb3VudF9jb3VudGVyKSkKKycpCisKK2RlZmluZShtY291bnRfY291bnRlciwxKQorCisKK2RubCAgVXNhZ2U6IGNhbGxfaW5zdHJ1bWVudChlbnRlcnxleGl0KQorZG5sCitkbmwgIENhbGwgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyIG9yIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0LgorZG5sCitkbmwgIEZvciBQSUMsIG1vc3Qgcm91dGluZXMgZG9uJ3QgcmVxdWlyZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gdGhlbXNlbHZlcworZG5sICBzbyAlZWJ4IGlzIGp1c3Qgc2V0dXAgZm9yIHRoZXNlIGNhbGxzLiAgSXQncyBhIGJpdCB3YXN0ZWZ1bCB0byByZXBlYXQKK2RubCAgdGhlIHNldHVwIGZvciB0aGUgZXhpdCBjYWxsIGhhdmluZyBkb25lIGl0IGVhcmxpZXIgZm9yIHRoZSBlbnRlciwgYnV0CitkbmwgIHRoZXJlJ3Mgbm93aGVyZSB2ZXJ5IGNvbnZlbmllbnQgdG8gaG9sZCAlZWJ4IHRocm91Z2ggdGhlIGxlbmd0aCBvZiBhCitkbmwgIHJvdXRpbmUsIGluIGdlbmVyYWwuCitkbmwKK2RubCAgRm9yIFBJQywgYmVjYXVzZSBpbnN0cnVtZW50X2N1cnJlbnRfZnVuY3Rpb24gd2lsbCBiZSB3aXRoaW4gdGhlIGN1cnJlbnQKK2RubCAgb2JqZWN0IGZpbGUgd2UgY2FuIGdldCBpdCBqdXN0IGFzIGFuIG9mZnNldCBmcm9tICVlaXAsIHRoZXJlJ3Mgbm8gbmVlZAorZG5sICB0byB1c2UgdGhlIEdPVC4KK2RubAorZG5sICBObyBhdHRlbXB0IGlzIG1hZGUgdG8gbWFpbnRhaW4gdGhlIHN0YWNrIGFsaWdubWVudCBnY2MgZ2VuZXJhdGVzIHdpdGgKK2RubCAgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnkuICBUaGlzIHdvdWxkbid0IGJlIGhhcmQsIGJ1dCBpdCBzZWVtcyBoaWdobHkKK2RubCAgdW5saWtlbHkgdGhlIGluc3RydW1lbnRpbmcgZnVuY3Rpb25zIHdvdWxkIGJlIGRvaW5nIGFueXRoaW5nIHRoYXQnZAorZG5sICBiZW5lZml0IGZyb20gYWxpZ25tZW50LCBpbiBwYXJ0aWN1bGFyIHRoZXkncmUgdW5saWtlbHkgdG8gYmUgdXNpbmcKK2RubCAgZG91YmxlcyBvciBsb25nIGRvdWJsZXMgb24gdGhlIHN0YWNrLgorZG5sCitkbmwgIFRoZSBGUkFNRSBzY2hlbWUgaXMgdXNlZCB0byBjb252ZW5pZW50bHkgYWNjb3VudCBmb3IgdGhlIHJlZ2lzdGVyIHNhdmVzCitkbmwgIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHJldHVybiBhZGRyZXNzLiAgQW55IHByZXZpb3VzIHZhbHVlIGlzIHNhdmVkIGFuZAorZG5sICByZXN0b3JlZCwgc2luY2UgcGxlbnR5IG9mIGNvZGUga2VlcHMgYSB2YWx1ZSBhY3Jvc3MgYSAicmV0IiBpbiB0aGUKK2RubCAgbWlkZGxlIG9mIGEgcm91dGluZS4KKworZGVmaW5lKGNhbGxfaW5zdHJ1bWVudCwKK200X2Fzc2VydF9udW1hcmdzKDEpCitgCXB1c2hkZWYoYEZSQU1FJywwKQoraWZlbHNlKCQxLGV4aXQsCitgCXB1c2hsCSVlYXgJRlJBTUVfcHVzaGwoKQlDIHJldHVybiB2YWx1ZQorJykKK2lmZGVmKGBQSUMnLAorYAlwdXNobAklZWJ4CUZSQU1FX3B1c2hsKCkKKwljYWxsX21vdmxfZWlwX3RvX2VieAorTChpbnN0cnVtZW50X2hlcmVfYCdpbnN0cnVtZW50X2NvdW50KToKKwltb3ZsCSVlYngsICVlY3gKKwlhZGRsCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tTChpbnN0cnVtZW50X2hlcmVfYCdpbnN0cnVtZW50X2NvdW50KV0sICVlYngKKwlDIHVzZSBhZGRsIHJhdGhlciB0aGFuIGxlYWwgdG8gYXZvaWQgb2xkIGdhcyBidWdzLCBzZWUgbXBuL3g4Ni9SRUFETUUKKwlhZGRsCSRpbnN0cnVtZW50X2N1cnJlbnRfZnVuY3Rpb24tTChpbnN0cnVtZW50X2hlcmVfYCdpbnN0cnVtZW50X2NvdW50KSwgJWVjeAorCXB1c2hsCW00X2VtcHR5X2lmX3plcm8oRlJBTUUpKCVlc3ApCUZSQU1FX3B1c2hsKCkJQyByZXR1cm4gYWRkcgorCXB1c2hsCSVlY3gJCQkJRlJBTUVfcHVzaGwoKQlDIHRoaXMgZnVuY3Rpb24KKwljYWxsCUdTWU1fUFJFRklYYCdfX2N5Z19wcm9maWxlX2Z1bmNfJDFAUExUCisJYWRkbAkkYCc4LCAlZXNwCisJcG9wbAklZWJ4CisnLAorYAlDIG5vbi1QSUMKKwlwdXNobAltNF9lbXB0eV9pZl96ZXJvKEZSQU1FKSglZXNwKQlGUkFNRV9wdXNobCgpCUMgcmV0dXJuIGFkZHIKKwlwdXNobAkkaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uCUZSQU1FX3B1c2hsKCkJQyB0aGlzIGZ1bmN0aW9uCisJY2FsbAlHU1lNX1BSRUZJWGAnX19jeWdfcHJvZmlsZV9mdW5jXyQxCisJYWRkbAkkYCc4LCAlZXNwCisnKQoraWZlbHNlKCQxLGV4aXQsCitgCXBvcGwJJWVheAkJCUMgcmV0dXJuIHZhbHVlCisnKQorCXBvcGRlZihgRlJBTUUnKQorZGVmaW5lKGBpbnN0cnVtZW50X2NvdW50JyxpbmNyKGluc3RydW1lbnRfY291bnQpKQorJykKK2RlZmluZShpbnN0cnVtZW50X2NvdW50LDEpCisKKworZG5sICBVc2FnZTogaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uCitkbmwKK2RubCAgUmV0dXJuIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG5hbWUgZm9yIGluc3RydW1lbnRpbmcgcHVycG9zZXMuICBUaGlzIGlzCitkbmwgIFBST0xPR1VFX2N1cnJlbnRfZnVuY3Rpb24sIGJ1dCBpdCBzdGlja3MgYXQgdGhlIGZpcnN0IHN1Y2ggbmFtZSBzZWVuLgorZG5sCitkbmwgIFN0aWNraW5nIHRvIHRoZSBmaXJzdCBuYW1lIHNlZW4gZW5zdXJlcyB0aGF0IG11bHRpcGxlLWVudHJ5cG9pbnQKK2RubCAgZnVuY3Rpb25zIGxpa2UgbXBuX2FkZF9uYyBhbmQgbXBuX2FkZF9uIHdpbGwgbWFrZSBlbnRlciBhbmQgZXhpdCBjYWxscworZG5sICBnaXZpbmcgdGhlIHNhbWUgZnVuY3Rpb24gYWRkcmVzcy4KKworZGVmaW5lKGluc3RydW1lbnRfY3VycmVudF9mdW5jdGlvbiwKK200X2Fzc2VydF9udW1hcmdzKC0xKQorYGlmZGVmKGBpbnN0cnVtZW50X2N1cnJlbnRfZnVuY3Rpb25fc2VlbicsCitgaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uX3NlZW4nLAorYGRlZmluZShgaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uX3NlZW4nLFBST0xPR1VFX2N1cnJlbnRfZnVuY3Rpb24pZG5sCitQUk9MT0dVRV9jdXJyZW50X2Z1bmN0aW9uJyknKQorCisKK2RubCAgVXNhZ2U6IGNhbGxfbW92bF9laXBfdG9fZWJ4CitkbmwKK2RubCAgR2VuZXJhdGUgYSBjYWxsIHRvIEwobW92bF9laXBfdG9fZWJ4KSwgYW5kIHJlY29yZCB0aGUgbmVlZCBmb3IgdGhhdAorZG5sICByb3V0aW5lLgorCitkZWZpbmUoY2FsbF9tb3ZsX2VpcF90b19lYngsCittNF9hc3NlcnRfbnVtYXJncygtMSkKK2BjYWxsCUwobW92bF9laXBfdG9fZWJ4KQorZGVmaW5lKGBtb3ZsX2VpcF90b19lYnhfbmVlZGVkJywxKScpCisKK2RubCAgVXNhZ2U6IGdlbmVyYXRlX21vdmxfZWlwX3RvX2VieAorZG5sCitkbmwgIEVtaXQgYSBMKG1vdmxfZWlwX3RvX2VieCkgcm91dGluZSwgaWYgbmVlZGVkIGFuZCBub3QgYWxyZWFkeSBnZW5lcmF0ZWQuCisKK2RlZmluZShnZW5lcmF0ZV9tb3ZsX2VpcF90b19lYngsCittNF9hc3NlcnRfbnVtYXJncygtMSkKK2BpZmVsc2UobW92bF9laXBfdG9fZWJ4X25lZWRlZCwxLAorYGlmZWxzZShtb3ZsX2VpcF90b19lYnhfZG9uZSwxLCwKK2BMKG1vdmxfZWlwX3RvX2VieCk6CisJbW92bAkoJWVzcCksICVlYngKKwlyZXRfaW50ZXJuYWwKK2RlZmluZShgbW92bF9laXBfdG9fZWJ4X2RvbmUnLDEpCisnKScpJykKKworCitkbmwgIFVzYWdlOiByZXQKK2RubAorZG5sICBHZW5lcmF0ZSBhICJyZXQiLCBidXQgaWYgZG9pbmcgaW5zdHJ1bWVudGVkIHByb2ZpbGluZyB0aGVuIGNhbGwKK2RubCAgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQgZmlyc3QuCisKK2RlZmluZShyZXQsCittNF9hc3NlcnRfbnVtYXJncygtMSkKK200X2Fzc2VydF9kZWZpbmVkKGBXQU5UX1BST0ZJTElORycpCitgaWZlbHNlKFdBTlRfUFJPRklMSU5HLGluc3RydW1lbnQsCitgcmV0X2luc3RydW1lbnQnLAorYHJldF9pbnRlcm5hbCcpCitnZW5lcmF0ZV9tb3ZsX2VpcF90b19lYngKKycpCisKKworZG5sICBVc2FnZTogcmV0X2ludGVybmFsCitkbmwKK2RubCAgQSBwbGFpbiAicmV0Iiwgd2l0aG91dCBhbnkgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQgY2FsbC4gIFRoaXMgY2FuIGJlCitkbmwgIHVzZWQgZm9yIGEgcmV0dXJuIHdoaWNoIGlzIGludGVybmFsIHRvIHNvbWUgZnVuY3Rpb24sIHN1Y2ggYXMgd2hlbgorZG5sICBnZXR0aW5nICVlaXAgZm9yIFBJQy4KKworZGVmaW5lKHJldF9pbnRlcm5hbCwKK200X2Fzc2VydF9udW1hcmdzKC0xKQorYGByZXQnJykKKworCitkbmwgIFVzYWdlOiByZXRfaW5zdHJ1bWVudAorZG5sCitkbmwgIEdlbmVyYXRlIGNhbGwgdG8gX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQgYW5kIHRoZW4gYSByZXQuICBJZiBhIHJldCBoYXMKK2RubCAgYWxyZWFkeSBiZWVuIHNlZW4gZnJvbSB0aGlzIGZ1bmN0aW9uIHRoZW4ganVtcCB0byB0aGF0IGNodW5rIG9mIGNvZGUsCitkbmwgIHJhdGhlciB0aGFuIGVtaXR0aW5nIGl0IGFnYWluLgorCitkZWZpbmUocmV0X2luc3RydW1lbnQsCittNF9hc3NlcnRfbnVtYXJncygtMSkKK2BpZmVsc2UobTRfdW5xdW90ZShyZXRfaW5zdHJ1bWVudF9zZWVuX2AnaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uKSwxLAorYGptcAlMKGluc3RydW1lbnRfZXhpdF9gJ2luc3RydW1lbnRfY3VycmVudF9mdW5jdGlvbiknLAorYGRlZmluZShyZXRfaW5zdHJ1bWVudF9zZWVuX2AnaW5zdHJ1bWVudF9jdXJyZW50X2Z1bmN0aW9uLDEpCitMKGluc3RydW1lbnRfZXhpdF9gJ2luc3RydW1lbnRfY3VycmVudF9mdW5jdGlvbik6CitjYWxsX2luc3RydW1lbnQoZXhpdCkKKwlyZXRfaW50ZXJuYWwnKScpCisKKworZG5sICBVc2FnZTogX0dMT0JBTF9PRkZTRVRfVEFCTEVfCitkbmwKK2RubCAgRXhwYW5kIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBwbHVzIGFueSBuZWNlc3NhcnkgdW5kZXJzY29yZSBwcmVmaXguCitkbmwgIFRoaXMgbGV0cyB1cyB3cml0ZSBwbGFpbiBfR0xPQkFMX09GRlNFVF9UQUJMRV8gaW4gU1ZSNCBzdHlsZSwgYnV0IHN0aWxsCitkbmwgIHdvcmsgd2l0aCBzeXN0ZW1zIHJlcXVpcmluZyBhbiBleHRyYSB1bmRlcnNjb3JlIHN1Y2ggYXMgT3BlbkJTRC4KK2RubAorZG5sICBkZWZsaXQgaXMgdXNlZCBzbyAibGVhbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8oJWVheCksICVlYngiIHdpbGwgY29tZQorZG5sICBvdXQgcmlnaHQsIHRob3VnaCB0aGF0IGZvcm0gZG9lc24ndCB3b3JrIHByb3Blcmx5IGluIGdhcyAoc2VlCitkbmwgIG1wbi94ODYvUkVBRE1FKS4KKworZGVmbGl0KF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywKK200X2Fzc2VydF9kZWZpbmVkKGBHT1RfR1NZTV9QUkVGSVgnKQorYEdPVF9HU1lNX1BSRUZJWGBfR0xPQkFMX09GRlNFVF9UQUJMRV8nJykKKworCitkbmwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkbmwgIFZhcmlvdXMgeDg2IG1hY3Jvcy4KK2RubAorCisKK2RubCAgVXNhZ2U6IEFMSUdOX09GRlNFVChieXRlcyxvZmZzZXQpCitkbmwKK2RubCAgQWxpZ24gdG8gYG9mZnNldCcgYXdheSBmcm9tIGEgbXVsdGlwbGUgb2YgYGJ5dGVzJy4KK2RubAorZG5sICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgZm9yIGV4YW1wbGUgYWxpZ24gdG8gc29tZXRoaW5nIHZlcnkgc3RyaWN0CitkbmwgIGFuZCBzZWUgd2hhdCBlZmZlY3Qgb2Zmc2V0cyBmcm9tIGl0IGhhdmUsICJBTElHTl9PRkZTRVQoMjU2LDMyKSIuCitkbmwKK2RubCAgR2VuZXJhbGx5IHlvdSB3b3VsZG4ndCBleGVjdXRlIGFjcm9zcyB0aGUgcGFkZGluZywgYnV0IGl0J3MgZG9uZSB3aXRoCitkbmwgIG5vcCdzIHNvIGl0J2xsIHdvcmsuCisKK2RlZmluZShBTElHTl9PRkZTRVQsCittNF9hc3NlcnRfbnVtYXJncygyKQorYEFMSUdOKCQxKQorZm9ybG9vcChgaScsMSwkMixgCW5vcAorJyknKQorCisKK2RubCAgVXNhZ2U6IGRlZmZyYW1lKG5hbWUsb2Zmc2V0KQorZG5sCitkbmwgIE1ha2UgYSBkZWZpbml0aW9uIGxpa2UgdGhlIGZvbGxvd2luZyB3aXRoIHdoaWNoIHRvIGFjY2VzcyBhIHBhcmFtZXRlcgorZG5sICBvciB2YXJpYWJsZSBvbiB0aGUgc3RhY2suCitkbmwKK2RubCAgICAgICAgIGRlZmluZShuYW1lLGBGUkFNRStvZmZzZXQoJWVzcCknKQorZG5sCitkbmwgIEFjdHVhbGx5IG00X2VtcHR5X2lmX3plcm8oRlJBTUUrb2Zmc2V0KSBpcyB1c2VkLCB3aGljaCB3aWxsIHNhdmUgb25lCitkbmwgIGJ5dGUgaWYgRlJBTUUrb2Zmc2V0IGlzIHplcm8sIGJ5IHB1dHRpbmcgKCVlc3ApIHJhdGhlciB0aGFuIDAoJWVzcCkuCitkbmwgIFVzZSBkZWZpbmUoYGRlZmZyYW1lX2VtcHR5X2lmX3plcm9fZGlzYWJsZWQnLDEpIGlmIGZvciBzb21lIHJlYXNvbiB0aGUKK2RubCAgemVybyBvZmZzZXQgaXMgd2FudGVkLgorZG5sCitkbmwgIFRoZSBuZXcgbWFjcm8gYWxzbyBnZXRzIGEgY2hlY2sgdGhhdCB3aGVuIGl0J3MgdXNlZCBGUkFNRSBpcyBhY3R1YWxseQorZG5sICBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgZmluYWwgJWVzcCBvZmZzZXQgaXNuJ3QgbmVnYXRpdmUsIHdoaWNoIHdvdWxkCitkbmwgIG1lYW4gYW4gYXR0ZW1wdCB0byBhY2Nlc3Mgc29tZXRoaW5nIGJlbG93IHRoZSBjdXJyZW50ICVlc3AuCitkbmwKK2RubCAgZGVmbGl0KCkgaXMgdXNlZCByYXRoZXIgdGhhbiBhIHBsYWluIGRlZmluZSgpLCBzbyB0aGUgbmV3IG1hY3JvIHdvbid0CitkbmwgIGRlbGV0ZSBhbnkgZm9sbG93aW5nIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4gIG5hbWUoJWVkaSkgd2lsbCBjb21lCitkbmwgIG91dCBzYXkgYXMgMTYoJWVzcCkoJWVkaSkuICBUaGlzIGlzbid0IHZhbGlkIGFzc2VtYmxlciBhbmQgc2hvdWxkCitkbmwgIHByb3Zva2UgYW4gZXJyb3IsIHdoaWNoIGlzIGJldHRlciB0aGFuIHNpbGVudGx5IGdpdmluZyBqdXN0IDE2KCVlc3ApLgorZG5sCitkbmwgIFNlZSBSRUFETUUgZm9yIG1vcmUgb24gdGhlIHN1Z2dlc3RlZCB3YXkgdG8gYWNjZXNzIHRoZSBzdGFjayBmcmFtZS4KKworZGVmaW5lKGRlZmZyYW1lLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BkZWZsaXQoYCQxJywKK200X2Fzc2VydF9kZWZpbmVkKGBGUkFNRScpCitgZGVmZnJhbWVfY2hlY2tfbm90YmVsb3coYCQxJywkMixGUkFNRSlkbmwKK2RlZmZyYW1lX2VtcHR5X2lmX3plcm8oRlJBTUUrKCQyKSkoJWVzcCknKScpCisKK2RubCAgQ2FsbGVkOiBkZWZmcmFtZV9lbXB0eV9pZl96ZXJvKGV4cHJlc3Npb24pCitkZWZpbmUoZGVmZnJhbWVfZW1wdHlfaWZfemVybywKK200X2Fzc2VydF9udW1hcmdzKDEpCitgaWZlbHNlKGRlZmZyYW1lX2VtcHR5X2lmX3plcm9fZGlzYWJsZWQsMSwKK2BldmFsKCQxKScsCitgbTRfZW1wdHlfaWZfemVybygkMSknKScpCisKK2RubCAgQ2FsbGVkOiBkZWZmcmFtZV9jaGVja19ub3RiZWxvdyhgbmFtZScsb2Zmc2V0LEZSQU1FKQorZGVmaW5lKGRlZmZyYW1lX2NoZWNrX25vdGJlbG93LAorbTRfYXNzZXJ0X251bWFyZ3MoMykKK2BpZmVsc2UoZXZhbCgoJDMpKygkMik8MCksMSwKK2BtNF9lcnJvcihgJDEgYXQgZnJhbWUgb2Zmc2V0ICQyIHVzZWQgd2hlbiBGUkFNRSBpcyBvbmx5ICQzIGJ5dGVzCisnKScpJykKKworCitkbmwgIFVzYWdlOiBGUkFNRV9wdXNobCgpCitkbmwgICAgICAgICBGUkFNRV9wb3BsKCkKK2RubCAgICAgICAgIEZSQU1FX2FkZGxfZXNwKG4pCitkbmwgICAgICAgICBGUkFNRV9zdWJsX2VzcChuKQorZG5sCitkbmwgIEFkanVzdCBGUkFNRSBhcHByb3ByaWF0ZWx5IGZvciBhIHB1c2hsIG9yIHBvcGwsIG9yIGZvciBhbiBhZGRsIG9yIHN1YmwKK2RubCAgJWVzcCBvZiBuIGJ5dGVzLgorZG5sCitkbmwgIFVzaW5nIHRoZXNlIG1hY3JvcyBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLiAgU29tZXRpbWVzIGl0IG1ha2VzIG1vcmUKK2RubCAgc2Vuc2UgdG8gcHV0IGV4cGxpY2l0IGRlZmxpdChgRlJBTUUnLE4pIGZvcm1zLCBlc3BlY2lhbGx5IHdoZW4gdGhlcmUncworZG5sICBqdW1wcyBhbmQgZGlmZmVyZW50IHNlcXVlbmNlcyBvZiBGUkFNRSB2YWx1ZXMgbmVlZCB0byBiZSB1c2VkIGluCitkbmwgIGRpZmZlcmVudCBwbGFjZXMuCisKK2RlZmluZShGUkFNRV9wdXNobCwKK200X2Fzc2VydF9udW1hcmdzKDApCittNF9hc3NlcnRfZGVmaW5lZChgRlJBTUUnKQorYGRlZmxpdChgRlJBTUUnLGV2YWwoRlJBTUUrNCkpJykKKworZGVmaW5lKEZSQU1FX3BvcGwsCittNF9hc3NlcnRfbnVtYXJncygwKQorbTRfYXNzZXJ0X2RlZmluZWQoYEZSQU1FJykKK2BkZWZsaXQoYEZSQU1FJyxldmFsKEZSQU1FLTQpKScpCisKK2RlZmluZShGUkFNRV9hZGRsX2VzcCwKK200X2Fzc2VydF9udW1hcmdzKDEpCittNF9hc3NlcnRfZGVmaW5lZChgRlJBTUUnKQorYGRlZmxpdChgRlJBTUUnLGV2YWwoRlJBTUUtKCQxKSkpJykKKworZGVmaW5lKEZSQU1FX3N1YmxfZXNwLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK200X2Fzc2VydF9kZWZpbmVkKGBGUkFNRScpCitgZGVmbGl0KGBGUkFNRScsZXZhbChGUkFNRSsoJDEpKSknKQorCisKK2RubCAgVXNhZ2U6IGRlZmZyYW1lX3B1c2hsKG5hbWUpCitkbmwKK2RubCAgRG8gYSBjb21iaW5hdGlvbiBGUkFNRV9wdXNobCgpIGFuZCBhIGRlZmZyYW1lKCkgdG8gbmFtZSB0aGUgc3RhY2sKK2RubCAgbG9jYXRpb24ganVzdCBwdXNoZWQuICBUaGlzIHNob3VsZCBjb21lIGFmdGVyIGEgcHVzaGwgaW5zdHJ1Y3Rpb24uCitkbmwgIFB1dHRpbmcgaXQgb24gdGhlIHNhbWUgbGluZSB3b3JrcyBhbmQgYXZvaWRzIGxlbmd0aGVuaW5nIHRoZSBjb2RlLiAgRm9yCitkbmwgIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIHB1c2hsICAgJWVheCAgICAgZGVmZnJhbWVfcHVzaGwoVkFSX0NPVU5URVIpCitkbmwKK2RubCAgTm90aWNlIHRoZSBkZWZmcmFtZSgpIGlzIGRvbmUgd2l0aCBhbiB1bnF1b3RlZCAtRlJBTUUgdGh1cyBnaXZpbmcgaXRzCitkbmwgIGN1cnJlbnQgdmFsdWUgd2l0aG91dCB0cmFja2luZyBmdXR1cmUgY2hhbmdlcy4KKworZGVmaW5lKGRlZmZyYW1lX3B1c2hsLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BGUkFNRV9wdXNobCgpZGVmZnJhbWUoYCQxJywtRlJBTUUpJykKKworCitkbmwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkbmwgIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBtYWNyb3MuCitkbmwKKworCitkbmwgIFVzYWdlOiBlbW1zX29yX2ZlbW1zCitkbmwgICAgICAgICBmZW1tc19hdmFpbGFibGVfcAorZG5sCitkbmwgIGZlbW1zX2F2YWlsYWJsZV9wIGV4cGFuZHMgdG8gMSBvciAwIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBBTUQgM0ROb3cKK2RubCAgZmVtbXMgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlLiAgZW1tc19vcl9mZW1tcyBleHBhbmRzIHRvIGZlbW1zIGlmCitkbmwgIGF2YWlsYWJsZSwgb3IgZW1tcyBpZiBub3QuCitkbmwKK2RubCAgZW1tc19vcl9mZW1tcyBpcyBtZWFudCBmb3IgdXNlIGluIHRoZSBLNiBkaXJlY3Rvcnkgd2hlcmUgcGxhaW4gSzYKK2RubCAgKHdpdGhvdXQgZmVtbXMpIGFuZCBLNi0yIGFuZCBLNi0zICh3aXRoIGEgc2xpZ2h0bHkgZmFzdGVyIGZlbW1zKSBhcmUKK2RubCAgc3VwcG9ydGVkIHRvZ2V0aGVyLgorZG5sCitkbmwgIE9uIEs3IGZlbW1zIGlzIG5vIGxvbmdlciBmYXN0ZXIgYW5kIGlzIGp1c3QgYW4gYWxpYXMgZm9yIGVtbXMsIHNvIHBsYWluCitkbmwgIGVtbXMgbWF5IGFzIHdlbGwgYmUgdXNlZC4KKworZGVmaW5lKGZlbW1zX2F2YWlsYWJsZV9wLAorbTRfYXNzZXJ0X251bWFyZ3MoLTEpCitgbTRfaWZkZWZfYW55b2ZfcCgKKwlgSEFWRV9IT1NUX0NQVV9rNjInLAorCWBIQVZFX0hPU1RfQ1BVX2s2MycsCisJYEhBVkVfSE9TVF9DUFVfYXRobG9uJyknKQorCitkZWZpbmUoZW1tc19vcl9mZW1tcywKK200X2Fzc2VydF9udW1hcmdzKC0xKQorYGlmZWxzZShmZW1tc19hdmFpbGFibGVfcCwxLGBmZW1tcycsYGVtbXMnKScpCisKKworZG5sICBVc2FnZTogZmVtbXMKK2RubAorZG5sICBHYXMgMi45LjEgd2hpY2ggY29tZXMgd2l0aCBGcmVlQlNEIDMuNCBkb2Vzbid0IHN1cHBvcnQgZmVtbXMsIHNvIHRoZQorZG5sICBmb2xsb3dpbmcgaXMgYSByZXBsYWNlbWVudCB1c2luZyAuYnl0ZS4KKworZGVmaW5lKGZlbW1zLAorbTRfYXNzZXJ0X251bWFyZ3MoLTEpCitgLmJ5dGUJMTUsMTQJQyBBTUQgM0ROb3cgZmVtbXMnKQorCisKK2RubCAgVXNhZ2U6IGphZGNsMChvcCkKK2RubAorZG5sICBHZW5lcmF0ZSBhIGpuYy9pbmNsIGFzIGEgc3Vic3RpdHV0ZSBmb3IgYWRjbCAkMCxvcC4gIE5vdGUgdGhpcyBpc24ndCBhbgorZG5sICBleGFjdCByZXBsYWNlbWVudCwgc2luY2UgaXQgZG9lc24ndCBzZXQgdGhlIGZsYWdzIGxpa2UgYWRjbCBkb2VzLgorZG5sCitkbmwgIFRoaXMgZmluZHMgYSB1c2UgaW4gSzYgbXBuX2FkZG11bF8xLCBtcG5fc3VibXVsXzEsIG1wbl9tdWxfYmFzZWNhc2UgYW5kCitkbmwgIG1wbl9zcXJfYmFzZWNhc2UgYmVjYXVzZSBvbiBLNiBhbiBhZGNsIGlzIHNsb3csIHRoZSBicmFuY2gKK2RubCAgbWlzcHJlZGljdGlvbiBwZW5hbHR5IGlzIHNtYWxsLCBhbmQgdGhlIG11bHRpcGx5IGFsZ29yaXRobSB1c2VkIGxlYWRzCitkbmwgIHRvIGEgY2FycnkgYml0IG9uIGF2ZXJhZ2Ugb25seSAxLzQgb2YgdGhlIHRpbWUuCitkbmwKK2RubCAgamFkY2wwX2Rpc2FibGVkIGNhbiBiZSBzZXQgdG8gMSB0byBpbnN0ZWFkIGdlbmVyYXRlIGFuIG9yZGluYXJ5IGFkY2wKK2RubCAgZm9yIGNvbXBhcmlzb24uICBGb3IgZXhhbXBsZSwKK2RubAorZG5sCQlkZWZpbmUoYGphZGNsMF9kaXNhYmxlZCcsMSkKK2RubAorZG5sICBXaGVuIHVzaW5nIGEgcmVnaXN0ZXIgb3BlcmFuZCwgZWcuICJqYWRjbDAoJWVkeCkiLCB0aGUgam5jL2luY2wgY29kZSBpcworZG5sICB0aGUgc2FtZSBzaXplIGFzIGFuIGFkY2wuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgZXhhY3Qgc2FtZQorZG5sICBjb21wdXRlZCBqdW1wIGNvZGUgd2hlbiB0ZXN0aW5nIHRoZSByZWxhdGl2ZSBzcGVlZCBvZiB0aGUgdHdvLgorCitkZWZpbmUoamFkY2wwLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BpZmVsc2UoamFkY2wwX2Rpc2FibGVkLDEsCisJYGFkY2wJJGAnMCwgJDEnLAorCWBqbmMJTChqYWRjbDBfYCdqYWRjbDBfY291bnRlcikKKwlpbmNsCSQxCitMKGphZGNsMF9gJ2phZGNsMF9jb3VudGVyKToKK2RlZmluZShgamFkY2wwX2NvdW50ZXInLGluY3IoamFkY2wwX2NvdW50ZXIpKScpJykKKworZGVmaW5lKGphZGNsMF9jb3VudGVyLDEpCisKKworZG5sICBVc2FnZTogeDg2X2xvb2t1cCh0YXJnZXQsIGtleSx2YWx1ZSwga2V5LHZhbHVlLCAuLi4pCitkbmwgICAgICAgICB4ODZfbG9va3VwX3AodGFyZ2V0LCBrZXksdmFsdWUsIGtleSx2YWx1ZSwgLi4uKQorZG5sCitkbmwgIExvb2sgZm9yIGB0YXJnZXQnIGFtb25nIHRoZSBga2V5JyBwYXJhbWV0ZXJzLgorZG5sCitkbmwgIHg4Nl9sb29rdXAgZXhwYW5kcyB0byB0aGUgY29ycmVzcG9uZGluZyBgdmFsdWUnLCBvciBnZW5lcmF0ZXMgYW4gZXJyb3IKK2RubCAgaWYgYHRhcmdldCcgaXNuJ3QgZm91bmQuCitkbmwKK2RubCAgeDg2X2xvb2t1cF9wIGV4cGFuZHMgdG8gMSBpZiBgdGFyZ2V0JyBpcyBmb3VuZCwgb3IgMCBpZiBub3QuCisKK2RlZmluZSh4ODZfbG9va3VwLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMSw5OTkpCitgaWZlbHNlKGV2YWwoJCM8MyksMSwKK2BtNF9lcnJvcihgdW5yZWNvZ25pc2VkIHBhcnQgb2YgeDg2IGluc3RydWN0aW9uOiAkMQorJyknLAorYGlmZWxzZShgJDEnLGAkMicsIGAkMycsCitgeDg2X2xvb2t1cChgJDEnLHNoaWZ0KHNoaWZ0KHNoaWZ0KCRAKSkpKScpJyknKQorCitkZWZpbmUoeDg2X2xvb2t1cF9wLAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMSw5OTkpCitgaWZlbHNlKGV2YWwoJCM8MyksMSwgYDAnLAorYGlmZWxzZShgJDEnLGAkMicsICAgIGAxJywKK2B4ODZfbG9va3VwX3AoYCQxJyxzaGlmdChzaGlmdChzaGlmdCgkQCkpKSknKScpJykKKworCitkbmwgIFVzYWdlOiB4ODZfb3Bjb2RlX3JlZzMyKHJlZykKK2RubCAgICAgICAgIHg4Nl9vcGNvZGVfcmVnMzJfcChyZWcpCitkbmwKK2RubCAgeDg2X29wY29kZV9yZWczMiBleHBhbmRzIHRvIHRoZSBzdGFuZGFyZCAzIGJpdCBlbmNvZGluZyBmb3IgdGhlIGdpdmVuCitkbmwgIDMyLWJpdCByZWdpc3RlciwgZWcuIGAlZWJwJyB0dXJucyBpbnRvIDUuCitkbmwKK2RubCAgeDg2X29wY29kZV9yZWczMl9wIGV4cGFuZHMgdG8gMSBpZiByZWcgaXMgYSB2YWxpZCAzMi1iaXQgcmVnaXN0ZXIsIG9yIDAKK2RubCAgaWYgbm90LgorCitkZWZpbmUoeDg2X29wY29kZV9yZWczMiwKK200X2Fzc2VydF9udW1hcmdzKDEpCitgeDg2X2xvb2t1cChgJDEnLHg4Nl9vcGNvZGVfcmVnMzJfbGlzdCknKQorCitkZWZpbmUoeDg2X29wY29kZV9yZWczMl9wLAorbTRfYXNzZXJ0X29uZWFyZygpCitgeDg2X2xvb2t1cF9wKGAkMScseDg2X29wY29kZV9yZWczMl9saXN0KScpCisKK2RlZmluZSh4ODZfb3Bjb2RlX3JlZzMyX2xpc3QsCitgYCVlYXgnLDAsCitgJWVjeCcsMSwKK2AlZWR4JywyLAorYCVlYngnLDMsCitgJWVzcCcsNCwKK2AlZWJwJyw1LAorYCVlc2knLDYsCitgJWVkaScsNycpCisKKworZG5sICBVc2FnZTogeDg2X29wY29kZV90dHRuKGNvbmQpCitkbmwKK2RubCAgRXhwYW5kIHRvIHRoZSA0LWJpdCAidHR0biIgZmllbGQgdmFsdWUgZm9yIHRoZSBnaXZlbiB4ODYgYnJhbmNoCitkbmwgIGNvbmRpdGlvbiAobGlrZSBgYycsIGBhZScsIGV0YykuCisKK2RlZmluZSh4ODZfb3Bjb2RlX3R0dG4sCittNF9hc3NlcnRfbnVtYXJncygxKQorYHg4Nl9sb29rdXAoYCQxJyx4ODZfb3Bjb2RlX3R0bl9saXN0KScpCisKK2RlZmluZSh4ODZfb3Bjb2RlX3R0dG5fbGlzdCwKK2BgbycsICAwLAorYG5vJywgIDEsCitgYicsICAgMiwgYGMnLCAgMiwgYG5hZScsMiwKK2BuYicsICAzLCBgbmMnLCAzLCBgYWUnLCAzLAorYGUnLCAgIDQsIGB6JywgIDQsCitgbmUnLCAgNSwgYG56JywgNSwKK2BiZScsICA2LCBgbmEnLCA2LAorYG5iZScsIDcsIGBhJywgIDcsCitgcycsICAgOCwKK2BucycsICA5LAorYHAnLCAgMTAsIGBwZScsIDEwLCBgbnBvJywxMCwKK2BucCcsIDExLCBgbnBlJywxMSwgYHBvJywgMTEsCitgbCcsICAxMiwgYG5nZScsMTIsCitgbmwnLCAxMywgYGdlJywgMTMsCitgbGUnLCAxNCwgYG5nJywgMTQsCitgbmxlJywxNSwgYGcnLCAgMTUnKQorCisKK2RubCAgVXNhZ2U6IGNtb3ZDQyglc3JjcmVnLCVkc3RyZWcpCitkbmwKK2RubCAgRW1pdCBhIGNtb3YgaW5zdHJ1Y3Rpb24sIHVzaW5nIGEgLmJ5dGUgc2VxdWVuY2UsIHNpbmNlIHZhcmlvdXMgcGFzdAorZG5sICB2ZXJzaW9ucyBvZiBnYXMgZG9uJ3Qga25vdyBjbW92LiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIGNtb3Z6KCAgJWVheCwgJWVieCkKK2RubAorZG5sICBUaGUgc291cmNlIG9wZXJhbmQgY2FuIG9ubHkgYmUgYSBwbGFpbiByZWdpc3Rlci4gIChtNCBjb2RlIGltcGxlbWVudGluZworZG5sICBmdWxsIG1lbW9yeSBhZGRyZXNzaW5nIG1vZGVzIGV4aXN0cywgYmVsaWV2ZSBpdCBvciBub3QsIGJ1dCBpc24ndAorZG5sICBjdXJyZW50bHkgbmVlZGVkIGFuZCBpc24ndCBpbmNsdWRlZC4pCitkbmwKK2RubCAgQWxsIHRoZSBzdGFuZGFyZCBjb25kaXRpb25zIGFyZSBkZWZpbmVkLiAgQXR0ZW1wdGluZyB0byB1c2Ugb25lIHdpdGhvdXQKK2RubCAgdGhlIG1hY3JvIHBhcmVudGhlc2VzLCBzdWNoIGFzIGp1c3QgImNtb3ZiZSAlZWF4LCAlZWJ4Iiwgd2lsbCBwcm92b2tlCitkbmwgIGFuIGVycm9yLiAgVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IHdyaXRpbmcgc29tZXRoaW5nIG9sZCBnYXMgd291bGRuJ3QKK2RubCAgdW5kZXJzdGFuZC4KKworZG5sICBDYWxsZWQ6IGRlZmluZV9jbW92X21hbnkoY29uZCx0dHRuLGNvbmQsdHR0biwuLi4pCitkZWZpbmUoZGVmaW5lX2Ntb3ZfbWFueSwKK2BpZmVsc2UobTRfbGVuZ3RoKGAkMScpLDAsLAorYGRlZmluZV9jbW92KGAkMScsYCQyJylkZWZpbmVfY21vdl9tYW55KHNoaWZ0KHNoaWZ0KCRAKSkpJyknKQorCitkbmwgIENhbGxlZDogZGVmaW5lX2Ntb3YoY29uZCx0dHRuKQorZG5sICBFbWl0IGJhc2ljYWxseSBkZWZpbmUoY21vdjxjb25kPixgY21vdl9pbnRlcm5hbCg8Y29uZD4sPHR0bj4sYCQxJyxgJDInKScpCitkZWZpbmUoZGVmaW5lX2Ntb3YsCittNF9hc3NlcnRfbnVtYXJncygyKQorYGRlZmluZShgY21vdiQxJywKK200X2luc3RydWN0aW9uX3dyYXBwZXIoKQorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BjbW92X2ludGVybmFsJyhtNF9kb3VibGVxdW90ZSgkYCcwKSxgYCQyJycsZG5sCittNF9kb3VibGVxdW90ZSgkYCcxKSxtNF9kb3VibGVxdW90ZSgkYCcyKSkpJykKKworZGVmaW5lX2Ntb3ZfbWFueSh4ODZfb3Bjb2RlX3R0dG5fbGlzdCkKKworZG5sICBDYWxsZWQ6IGNtb3ZfaW50ZXJuYWwobmFtZSx0dHRuLHNyYyxkc3QpCitkZWZpbmUoY21vdl9pbnRlcm5hbCwKK200X2Fzc2VydF9udW1hcmdzKDQpCitgLmJ5dGUJZG5sCisxNSwgZG5sCitldmFsKDY0KyQyKSwgZG5sCitldmFsKDE5Mis4Kng4Nl9vcGNvZGVfcmVnMzIoYCQ0JykreDg2X29wY29kZV9yZWczMihgJDMnKSkgZG5sCisJQyBgJDEgJDMsICQ0JycpCisKKworZG5sICBVc2FnZTogeDg2X29wY29kZV9yZWdtbXgocmVnKQorZG5sCitkbmwgIFZhbGlkYXRlIHRoZSBnaXZlbiBtbXggcmVnaXN0ZXIsIGFuZCByZXR1cm4gaXRzIG51bWJlciwgMCB0byA3LgorCitkZWZpbmUoeDg2X29wY29kZV9yZWdtbXgsCittNF9hc3NlcnRfbnVtYXJncygxKQorYHg4Nl9sb29rdXAoYCQxJyx4ODZfb3Bjb2RlX3JlZ21teF9saXN0KScpCisKK2RlZmluZSh4ODZfb3Bjb2RlX3JlZ21teF9saXN0LAorYGAlbW0wJywwLAorYCVtbTEnLDEsCitgJW1tMicsMiwKK2AlbW0zJywzLAorYCVtbTQnLDQsCitgJW1tNScsNSwKK2AlbW02Jyw2LAorYCVtbTcnLDcnKQorCisKK2RubCAgVXNhZ2U6IHBzYWRidyglc3JjcmVnLCVkc3RyZWcpCitkbmwKK2RubCAgT2xkaXNoIHZlcnNpb25zIG9mIGdhcyBkb24ndCBrbm93IHBzYWRidywgaW4gcGFydGljdWxhciBnYXMgMi45LjEgb24KK2RubCAgRnJlZUJTRCAzLjMgYW5kIDMuNCBkb2Vzbid0LCBzbyBpbnN0ZWFkIGVtaXQgLmJ5dGUgc2VxdWVuY2VzLiAgRm9yCitkbmwgIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIHBzYWRidyggJW1tMSwgJW1tMikKK2RubAorZG5sICBPbmx5IHJlZ2lzdGVyLT5yZWdpc3RlciBmb3JtcyBhcmUgc3VwcG9ydGVkIGhlcmUsIHdoaWNoIHN1ZmZpY2VzIGZvcgorZG5sICB0aGUgY3VycmVudCBjb2RlLgorCitkZWZpbmUocHNhZGJ3LAorbTRfaW5zdHJ1Y3Rpb25fd3JhcHBlcigpCittNF9hc3NlcnRfbnVtYXJncygyKQorYC5ieXRlIDB4MGYsMHhmNixkbmwKK2V2YWwoMTkyK3g4Nl9vcGNvZGVfcmVnbW14KGAkMicpKjgreDg2X29wY29kZV9yZWdtbXgoYCQxJykpIGRubAorCUMgYHBzYWRidyAkMSwgJDInJykKKworCitkbmwgIFVzYWdlOiBaZGlzcChpbnN0LG9wLG9wLG9wKQorZG5sCitkbmwgIEdlbmVyYXRlIGV4cGxpY2l0IC5ieXRlIHNlcXVlbmNlcyBpZiBuZWNlc3NhcnkgdG8gZm9yY2UgYSBieXRlLXNpemVkCitkbmwgIHplcm8gZGlzcGxhY2VtZW50IG9uIGFuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIFpkaXNwKCAgbW92bCwgICAwLCglZXNpKSwgJWVheCkKK2RubAorZG5sICBleHBhbmRzIHRvCitkbmwKK2RubCAgICAgICAgICAgICAgICAgLmJ5dGUgICAxMzksNzAsMCAgQyBtb3ZsIDAoJWVzaSksICVlYXgKK2RubAorZG5sICBJZiB0aGUgZGlzcGxhY2VtZW50IGdpdmVuIGlzbid0IDAsIHRoZW4gbm9ybWFsIGFzc2VtYmxlciBjb2RlIGlzCitkbmwgIGdlbmVyYXRlZC4gIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBaZGlzcCggIG1vdmwsICAgNCwoJWVzaSksICVlYXgpCitkbmwKK2RubCAgZXhwYW5kcyB0bworZG5sCitkbmwgICAgICAgICAgICAgICAgIG1vdmwgICAgNCglZXNpKSwgJWVheAorZG5sCitkbmwgIFRoaXMgbWVhbnMgYSBzaW5nbGUgWmRpc3AoKSBmb3JtIGNhbiBiZSB1c2VkIHdpdGggYW4gZXhwcmVzc2lvbiBmb3IgdGhlCitkbmwgIGRpc3BsYWNlbWVudCwgYW5kIC5ieXRlIHdpbGwgYmUgdXNlZCBvbmx5IGlmIG5lY2Vzc2FyeS4gIFRoZQorZG5sICBkaXNwbGFjZW1lbnQgYXJndW1lbnQgaXMgZXZhbCgpZWQuCitkbmwKK2RubCAgQmVjYXVzZSB0aGVyZSBhcmVuJ3QgbWFueSBwbGFjZXMgYSAwKHJlZykgZm9ybSBpcyB3YW50ZWQsIFpkaXNwIGlzCitkbmwgIGltcGxlbWVudGVkIHdpdGggYSB0YWJsZSBvZiBpbnN0cnVjdGlvbnMgYW5kIGVuY29kaW5ncy4gIEEgbmV3IGVudHJ5IGlzCitkbmwgIG5lZWRlZCBmb3IgYW55IGRpZmZlcmVudCBvcGVyYXRpb24gb3IgcmVnaXN0ZXJzLiAgVGhlIHRhYmxlIGlzIHNwbGl0CitkbmwgIGludG8gc2VwYXJhdGUgbWFjcm9zIHRvIGF2b2lkIG92ZXJmbG93aW5nIEJTRCBtNCBtYWNybyBleHBhbnNpb24gc3BhY2UuCisKK2RlZmluZShaZGlzcCwKK200X2Fzc2VydF9udW1hcmdzKDQpCitgZGVmaW5lKGBaZGlzcF9mb3VuZCcsMClkbmwKK1pkaXNwXzEoJEApZG5sCitaZGlzcF8yKCRAKWRubAorWmRpc3BfMygkQClkbmwKK1pkaXNwXzQoJEApZG5sCitpZmVsc2UoWmRpc3BfZm91bmQsMCwKK2BtNF9lcnJvcihgdW5yZWNvZ25pc2VkIGluc3RydWN0aW9uIGluIFpkaXNwOiAkMSAkMiAkMyAkNAorJyknKScpCisKK2RlZmluZShaZGlzcF8xLGBkbmwKK1pkaXNwX21hdGNoKCBhZGNsLCAwLCglZWR4KSwgJWVheCwgICAgICAgIGAweDEzLDB4NDIsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIGFkY2wsIDAsKCVlZHgpLCAlZWJ4LCAgICAgICAgYDB4MTMsMHg1YSwweDAwJywgICAgICAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggYWRjbCwgMCwoJWVkeCksICVlc2ksICAgICAgICBgMHgxMywweDcyLDB4MDAnLCAgICAgICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBhZGRsLCAlZWJ4LCAwLCglZWRpKSwgICAgICAgIGAweDAxLDB4NWYsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIGFkZGwsICVlY3gsIDAsKCVlZGkpLCAgICAgICAgYDB4MDEsMHg0ZiwweDAwJywgICAgICAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggYWRkbCwgJWVzaSwgMCwoJWVkaSksICAgICAgICBgMHgwMSwweDc3LDB4MDAnLCAgICAgICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBzYmJsLCAwLCglZWR4KSwgJWVheCwgICAgICAgIGAweDFiLDB4NDIsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIHNiYmwsIDAsKCVlZHgpLCAlZXNpLCAgICAgICAgYDB4MWIsMHg3MiwweDAwJywgICAgICAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggc3VibCwgJWVjeCwgMCwoJWVkaSksICAgICAgICBgMHgyOSwweDRmLDB4MDAnLCAgICAgICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3Z6YmwsIDAsKCVlYXgsJWVicCksICVlYXgsIGAweDBmLDB4YjYsMHg0NCwweDI4LDB4MDAnLCAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdnpibCwgMCwoJWVjeCwlZWRpKSwgJWVkaSwgYDB4MGYsMHhiNiwweDdjLDB4MzksMHgwMCcsICRAKWAnZG5sCitaZGlzcF9tYXRjaCggYWRjLCAwLCglZWJ4LCVlY3gsNCksICVlYXgsICBgMHgxMywweDQ0LDB4OGIsMHgwMCcsICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBzYmIsIDAsKCVlYngsJWVjeCw0KSwgJWVheCwgIGAweDFiLDB4NDQsMHg4YiwweDAwJywgICAgICAkQClgJ2RubAorJykKK2RlZmluZShaZGlzcF8yLGBkbmwKK1pkaXNwX21hdGNoKCBtb3ZsLCAlZWF4LCAwLCglZWRpKSwgICAgICAgIGAweDg5LDB4NDcsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdmwsICVlYngsIDAsKCVlZGkpLCAgICAgICAgYDB4ODksMHg1ZiwweDAwJywgICAgICAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92bCwgJWVzaSwgMCwoJWVkaSksICAgICAgICBgMHg4OSwweDc3LDB4MDAnLCAgICAgICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZsLCAwLCglZWJ4KSwgJWVheCwgICAgICAgIGAweDhiLDB4NDMsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdmwsIDAsKCVlYngpLCAlZXNpLCAgICAgICAgYDB4OGIsMHg3MywweDAwJywgICAgICAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92bCwgMCwoJWVkeCksICVlYXgsICAgICAgICBgMHg4YiwweDQyLDB4MDAnLCAgICAgICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZsLCAwLCglZXNpKSwgJWVheCwgICAgICAgIGAweDhiLDB4NDYsMHgwMCcsICAgICAgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdmwsIDAsKCVlc2ksJWVjeCw0KSwgJWVheCwgYDB4OGIsMHg0NCwweDhlLDB4MDAnLCAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92LCAwLCglZXNpLCVlY3gsNCksICVlYXgsICBgMHg4YiwweDQ0LDB4OGUsMHgwMCcsICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3YsICVlYXgsIDAsKCVlZGksJWVjeCw0KSwgIGAweDg5LDB4NDQsMHg4ZiwweDAwJywgICAgICAkQClgJ2RubAorJykKK2RlZmluZShaZGlzcF8zLGBkbmwKK1pkaXNwX21hdGNoKCBtb3ZxLCAwLCglZWF4LCVlY3gsOCksICVtbTAsIGAweDBmLDB4NmYsMHg0NCwweGM4LDB4MDAnLCAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdnEsIDAsKCVlYngsJWVheCw0KSwgJW1tMCwgYDB4MGYsMHg2ZiwweDQ0LDB4ODMsMHgwMCcsICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92cSwgMCwoJWVieCwlZWF4LDQpLCAlbW0yLCBgMHgwZiwweDZmLDB4NTQsMHg4MywweDAwJywgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZxLCAwLCglZWJ4LCVlY3gsNCksICVtbTAsIGAweDBmLDB4NmYsMHg0NCwweDhiLDB4MDAnLCAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdnEsIDAsKCVlZHgpLCAlbW0wLCAgICAgICAgYDB4MGYsMHg2ZiwweDQyLDB4MDAnLCAgICAgICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92cSwgMCwoJWVzaSksICVtbTAsICAgICAgICBgMHgwZiwweDZmLDB4NDYsMHgwMCcsICAgICAgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZxLCAlbW0wLCAwLCglZWRpKSwgICAgICAgIGAweDBmLDB4N2YsMHg0NywweDAwJywgICAgICAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdnEsICVtbTIsIDAsKCVlY3gsJWVheCw0KSwgYDB4MGYsMHg3ZiwweDU0LDB4ODEsMHgwMCcsICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92cSwgJW1tMiwgMCwoJWVkeCwlZWF4LDQpLCBgMHgwZiwweDdmLDB4NTQsMHg4MiwweDAwJywgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZxLCAlbW0wLCAwLCglZWR4LCVlY3gsOCksIGAweDBmLDB4N2YsMHg0NCwweGNhLDB4MDAnLCAkQClgJ2RubAorJykKK2RlZmluZShaZGlzcF80LGBkbmwKK1pkaXNwX21hdGNoKCBtb3ZkLCAwLCglZWF4LCVlY3gsNCksICVtbTAsIGAweDBmLDB4NmUsMHg0NCwweDg4LDB4MDAnLCAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdmQsIDAsKCVlYXgsJWVjeCw4KSwgJW1tMSwgYDB4MGYsMHg2ZSwweDRjLDB4YzgsMHgwMCcsICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92ZCwgMCwoJWVkeCwlZWN4LDgpLCAlbW0wLCBgMHgwZiwweDZlLDB4NDQsMHhjYSwweDAwJywgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZkLCAlbW0wLCAwLCglZWF4LCVlY3gsNCksIGAweDBmLDB4N2UsMHg0NCwweDg4LDB4MDAnLCAkQClgJ2RubAorWmRpc3BfbWF0Y2goIG1vdmQsICVtbTAsIDAsKCVlY3gsJWVheCw0KSwgYDB4MGYsMHg3ZSwweDQ0LDB4ODEsMHgwMCcsICRAKWAnZG5sCitaZGlzcF9tYXRjaCggbW92ZCwgJW1tMiwgMCwoJWVjeCwlZWF4LDQpLCBgMHgwZiwweDdlLDB4NTQsMHg4MSwweDAwJywgJEApYCdkbmwKK1pkaXNwX21hdGNoKCBtb3ZkLCAlbW0wLCAwLCglZWR4LCVlY3gsNCksIGAweDBmLDB4N2UsMHg0NCwweDhhLDB4MDAnLCAkQClgJ2RubAorJykKKworZGVmaW5lKFpkaXNwX21hdGNoLAorbTRfYXNzZXJ0X251bWFyZ3MoOSkKK2BpZmVsc2UoZXZhbChtNF9zdHJpbmdlcXVhbF9wKGAkMScsYCQ2JykKKwkmJiBtNF9zdHJpbmdlcXVhbF9wKGAkMicsMCkKKwkmJiBtNF9zdHJpbmdlcXVhbF9wKGAkMycsYCQ4JykKKwkmJiBtNF9zdHJpbmdlcXVhbF9wKGAkNCcsYCQ5JykpLDEsCitgZGVmaW5lKGBaZGlzcF9mb3VuZCcsMSlkbmwKK2lmZWxzZShldmFsKGAkNycpLDAsCitgCS5ieXRlCSQ1ICBDIGAkMSAwJDMsICQ0JycsCitgCSQ2CSQ3JDgsICQ5JyknLAorCitgaWZlbHNlKGV2YWwobTRfc3RyaW5nZXF1YWxfcChgJDEnLGAkNicpCisJJiYgbTRfc3RyaW5nZXF1YWxfcChgJDInLGAkNycpCisJJiYgbTRfc3RyaW5nZXF1YWxfcChgJDMnLDApCisJJiYgbTRfc3RyaW5nZXF1YWxfcChgJDQnLGAkOScpKSwxLAorYGRlZmluZShgWmRpc3BfZm91bmQnLDEpZG5sCitpZmVsc2UoZXZhbChgJDgnKSwwLAorYAkuYnl0ZQkkNSAgQyBgJDEgJDIsIDAkNCcnLAorYAkkNgkkNywgJDgkOScpJyknKScpCisKKworZG5sICBVc2FnZTogc2hsZGwoY291bnQsc3JjLGRzdCkKK2RubCAgICAgICAgIHNocmRsKGNvdW50LHNyYyxkc3QpCitkbmwgICAgICAgICBzaGxkdyhjb3VudCxzcmMsZHN0KQorZG5sICAgICAgICAgc2hyZHcoY291bnQsc3JjLGRzdCkKK2RubAorZG5sICBHZW5lcmF0ZSBhIGRvdWJsZS1zaGlmdCBpbnN0cnVjdGlvbiwgcG9zc2libHkgb21pdHRpbmcgYSAlY2wgY291bnQKK2RubCAgcGFyYW1ldGVyIGlmIHRoYXQncyB3aGF0IHRoZSBhc3NlbWJsZXIgcmVxdWlyZXMsIGFzIGluZGljYXRlZCBieQorZG5sICBXQU5UX1NITERMX0NMIGluIGNvbmZpZy5tNC4gIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBzaGxkbCggICVjbCwgJWVheCwgJWVieCkKK2RubAorZG5sICB0dXJucyBpbnRvIGVpdGhlcgorZG5sCitkbmwgICAgICAgICBzaGxkbCAgICVjbCwgJWVheCwgJWVieAorZG5sICBvcgorZG5sICAgICAgICAgc2hsZGwgICAlZWF4LCAlZWJ4CitkbmwKK2RubCAgSW1tZWRpYXRlIGNvdW50cyBhcmUgYWx3YXlzIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC4gIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBzaHJkbCggICQyLCAlZXNpLCAlZWRpKQorZG5sICBiZWNvbWVzCitkbmwgICAgICAgICBzaHJkbCAgICQyLCAlZXNpLCAlZWRpCitkbmwKK2RubAorZG5sICBJZiB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgbWFjcm8gZm9ybSAic2hsZGwoIC4uLikiIGFuZCBpbnN0ZWFkIHdyaXRlCitkbmwgIGp1c3QgYSBwbGFpbiAic2hsZGwgLi4uIiwgYW4gZXJyb3IgcmVzdWx0cy4gIFRoaXMgZW5zdXJlcyB0aGUgbmVjZXNzYXJ5CitkbmwgIHZhcmlhbnQgdHJlYXRtZW50IG9mICVjbCBpc24ndCBhY2NpZGVudGFsbHkgYnlwYXNzZWQuCisKK2RlZmluZShkZWZpbmVfc2hkX2luc3RydWN0aW9uLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BkZWZpbmUoJDEsCittNF9pbnN0cnVjdGlvbl93cmFwcGVyKCkKK200X2Fzc2VydF9udW1hcmdzKDMpCitgc2hkX2luc3RydWN0aW9uJyhtNF9kb3VibGVxdW90ZSgkYCcwKSxtNF9kb3VibGVxdW90ZSgkYCcxKSxkbmwKK200X2RvdWJsZXF1b3RlKCRgJzIpLG00X2RvdWJsZXF1b3RlKCRgJzMpKSknKQorCitkbmwgIEVmZmVjdGl2ZWx5OiBkZWZpbmUoc2hsZGwsYHNoZF9pbnN0cnVjdGlvbihgJDAnLGAkMScsYCQyJyxgJDMnKScpIGV0YworZGVmaW5lX3NoZF9pbnN0cnVjdGlvbihzaGxkbCkKK2RlZmluZV9zaGRfaW5zdHJ1Y3Rpb24oc2hyZGwpCitkZWZpbmVfc2hkX2luc3RydWN0aW9uKHNobGR3KQorZGVmaW5lX3NoZF9pbnN0cnVjdGlvbihzaHJkdykKKworZG5sICBDYWxsZWQ6IHNoZF9pbnN0cnVjdGlvbihvcCxjb3VudCxzcmMsZHN0KQorZGVmaW5lKHNoZF9pbnN0cnVjdGlvbiwKK200X2Fzc2VydF9udW1hcmdzKDQpCittNF9hc3NlcnRfZGVmaW5lZChgV0FOVF9TSExETF9DTCcpCitgaWZlbHNlKGV2YWwobTRfc3RyaW5nZXF1YWxfcChgJDInLGAlY2wnKSAmJiAhV0FOVF9TSExETF9DTCksMSwKK2BgJDEnCWAkMycsIGAkNCcnLAorYGAkMScJYCQyJywgYCQzJywgYCQ0JycpJykKKworCitkbmwgIFVzYWdlOiBBU1NFUlQoW2NvbmRdWyxpbnN0cnVjdGlvbnNdKQorZG5sCitkbmwgIElmIFdBTlRfQVNTRVJUIGlzIDEsIG91dHB1dCB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zIGFuZCBleHBlY3QgdGhlIGdpdmVuCitkbmwgIGZsYWdzIGNvbmRpdGlvbiB0byB0aGVuIGJlIHNhdGlzZmllZC4gIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBBU1NFUlQobmUsIGBjbXBsICVlYXgsICVlYngnKQorZG5sCitkbmwgIFRoZSBpbnN0cnVjdGlvbnMgY2FuIGJlIG9taXR0ZWQgdG8ganVzdCBhc3NlcnQgYSBmbGFncyBjb25kaXRpb24gd2l0aAorZG5sICBubyBleHRyYSBjYWxjdWxhdGlvbi4gIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBBU1NFUlQobmMpCitkbmwKK2RubCAgV2hlbiBgaW5zdHJ1Y3Rpb25zJyBpcyBub3QgZW1wdHksIGEgcHVzaGYvcG9wZiBpcyBhZGRlZCB0byBwcmVzZXJ2ZSB0aGUKK2RubCAgZmxhZ3MsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMgbXVzdCBwcmVzZXJ2ZSBhbnkgcmVnaXN0ZXJzIHRoYXQKK2RubCAgbWF0dGVyLiAgRlJBTUUgaXMgYWRqdXN0ZWQgZm9yIHRoZSBwdXNoIGFuZCBwb3AsIHNvIHRoZSBpbnN0cnVjdGlvbnMKK2RubCAgZ2l2ZW4gY2FuIHVzZSBkZWZmcmFtZSgpIHN0YWNrIHZhcmlhYmxlcy4KK2RubAorZG5sICBUaGUgY29uZGl0aW9uIGNhbiBiZSBvbWl0dGVkIHRvIGp1c3Qgb3V0cHV0IHRoZSBnaXZlbiBpbnN0cnVjdGlvbnMgd2hlbgorZG5sICBhc3NlcnRpb24gY2hlY2tpbmcgaXMgd2FudGVkLiAgSW4gdGhpcyBjYXNlIHRoZSBwdXNoZi9wb3BmIGlzIG9taXR0ZWQuCitkbmwgIEZvciBleGFtcGxlLAorZG5sCitkbmwgICAgICAgICBBU1NFUlQoLCBgbW92bCAlZWF4LCBWQVJfS0VFUFZBTCcpCisKK2RlZmluZShBU1NFUlQsCittNF9hc3NlcnRfbnVtYXJnc19yYW5nZSgxLDIpCittNF9hc3NlcnRfZGVmaW5lZChgV0FOVF9BU1NFUlQnKQorYGlmZWxzZShXQU5UX0FTU0VSVCwxLAorYGlmZWxzZShgJDEnLCwKKwlgJDInLAorCWBDIEFTU0VSVAoraWZlbHNlKGAkMicsLCxgCXB1c2hmCWlmZGVmKGBGUkFNRScsYEZSQU1FX3B1c2hsKCknKScpCisJJDIKKwlqYCQxJwlMKEFTU0VSVF9va2AnQVNTRVJUX2NvdW50ZXIpCisJdWQyCUMgYXNzZXJ0aW9uIGZhaWxlZAorTChBU1NFUlRfb2tgJ0FTU0VSVF9jb3VudGVyKToKK2lmZWxzZShgJDInLCwsYAlwb3BmCWlmZGVmKGBGUkFNRScsYEZSQU1FX3BvcGwoKScpJykKK2RlZmluZShgQVNTRVJUX2NvdW50ZXInLGluY3IoQVNTRVJUX2NvdW50ZXIpKScpJyknKQorCitkZWZpbmUoQVNTRVJUX2NvdW50ZXIsMSkKKworCitkbmwgIFVzYWdlOiBtb3ZsX3RleHRfYWRkcmVzcyhsYWJlbCxyZWdpc3RlcikKK2RubAorZG5sICBHZXQgdGhlIGFkZHJlc3Mgb2YgYSB0ZXh0IHNlZ21lbnQgbGFiZWwsIHVzaW5nIGVpdGhlciBhIHBsYWluIG1vdmwgb3IgYQorZG5sICBwb3NpdGlvbi1pbmRlcGVuZGVudCBjYWxjdWxhdGlvbiwgYXMgbmVjZXNzYXJ5LiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIG1vdmxfY29kZV9hZGRyZXNzKEwoZm9vKSwlZWF4KQorZG5sCitkbmwgIFRoaXMgbWFjcm8gaXMgb25seSBtZWFudCBmb3IgdXNlIGluIEFTU0VSVCgpcyBvciB3aGVuIHRlc3RpbmcsIHNpbmNlCitkbmwgIHRoZSBQSUMgc2VxdWVuY2UgaXQgZ2VuZXJhdGVzIHdpbGwgd2FudCB0byBiZSBkb25lIHdpdGggYSByZXQgYmFsYW5jaW5nCitkbmwgIHRoZSBjYWxsIG9uIENQVXMgd2l0aCByZXR1cm4gYWRkcmVzcyBicmFuY2ggcHJlZGljdGlvbi4KK2RubAorZG5sICBUaGUgYWRkbCBnZW5lcmF0ZWQgaGVyZSBoYXMgYSBiYWNrd2FyZCByZWZlcmVuY2UgdG8gdGhlIGxhYmVsLCBhbmQgc28KK2RubCAgd29uJ3Qgc3VmZmVyIGZyb20gdGhlIHR3byBmb3J3YXJkcyByZWZlcmVuY2VzIGJ1ZyBpbiBvbGQgZ2FzIChkZXNjcmliZWQKK2RubCAgaW4gbXBuL3g4Ni9SRUFETUUpLgorCitkZWZpbmUobW92bF90ZXh0X2FkZHJlc3MsCittNF9hc3NlcnRfbnVtYXJncygyKQorYGlmZGVmKGBQSUMnLAorCWBjYWxsCUwobW92bF90ZXh0X2FkZHJlc3NfYCdtb3ZsX3RleHRfYWRkcmVzc19jb3VudGVyKQorTChtb3ZsX3RleHRfYWRkcmVzc19gJ21vdmxfdGV4dF9hZGRyZXNzX2NvdW50ZXIpOgorCXBvcGwJJDIJQyAlZWlwCisJYWRkbAlgJCckMS1MKG1vdmxfdGV4dF9hZGRyZXNzX2AnbW92bF90ZXh0X2FkZHJlc3NfY291bnRlciksICQyCitkZWZpbmUoYG1vdmxfdGV4dF9hZGRyZXNzX2NvdW50ZXInLGluY3IobW92bF90ZXh0X2FkZHJlc3NfY291bnRlcikpJywKKwlgbW92bAlgJCckMSwgJDInKScpCisKK2RlZmluZShtb3ZsX3RleHRfYWRkcmVzc19jb3VudGVyLDEpCisKKworZG5sICBVc2FnZTogbm90bF9vcl94b3JsX0dNUF9OVU1CX01BU0socmVnKQorZG5sCitkbmwgIEV4cGFuZCB0byBlaXRoZXIgIm5vdGwgYHJlZyciIG9yICJ4b3JsICRHTVBfTlVNQl9CSVRTLGByZWcnIiBhcworZG5sICBhcHByb3ByaWF0ZSBmb3IgbmFpbHMgaW4gdXNlIG9yIG5vdC4KKworZGVmaW5lKG5vdGxfb3JfeG9ybF9HTVBfTlVNQl9NQVNLLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BpZmVsc2UoR01QX05BSUxfQklUUywwLAorYG5vdGwJYCQxJycsCitgeG9ybAkkR01QX05VTUJfTUFTSywgYCQxJycpJykKKworCitkbmwgIFVzYWdlIExFQShzeW1ib2wscmVnKQorZG5sICBVc2FnZSBMRUFMKHN5bWJvbF9sb2NhbF90b19maWxlLHJlZykKKworZGVmaW5lKGBMRUEnLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BpZmRlZihgUElDJyxgZG5sCitpZmVsc2UoaW5kZXgoZGVmbihgbG9hZF9laXAnKSwgYCQyJyksLTEsCitgbTRhcHBlbmQoYGxvYWRfZWlwJywKK2AJVEVYVAorCUFMSUdOKDE2KQorTChtb3ZsX2VpcF9gJ3N1YnN0cigkMiwxKSk6CisJbW92bAkoJWVzcCksICQyCisJcmV0X2ludGVybmFsCisnKScpZG5sCisJY2FsbAlMKG1vdmxfZWlwX2Anc3Vic3RyKCQyLDEpKQorCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgJDIKKwltb3ZsCSQxQEdPVCgkMiksICQyCisnLGAKKwltb3ZsCWAkJyQxLCAkMgorJyknKQorCitkZWZpbmUoYExFQUwnLAorbTRfYXNzZXJ0X251bWFyZ3MoMikKK2BpZmRlZihgUElDJyxgZG5sCitpZmVsc2UoaW5kZXgoZGVmbihgbG9hZF9laXAnKSwgYCQyJyksLTEsCitgbTRhcHBlbmQoYGxvYWRfZWlwJywKK2AJVEVYVAorCUFMSUdOKDE2KQorTChtb3ZsX2VpcF9gJ3N1YnN0cigkMiwxKSk6CisJbW92bAkoJWVzcCksICQyCisJcmV0X2ludGVybmFsCisnKScpZG5sCisJY2FsbAlMKG1vdmxfZWlwX2Anc3Vic3RyKCQyLDEpKQorCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgJDIKKwlsZWFsCSQxQEdPVE9GRigkMiksICQyCisnLGAKKwltb3ZsCWAkJyQxLCAkMgorJyknKQorCitkbmwgQVNNX0VORAorCitkZWZpbmUoYEFTTV9FTkQnLGBsb2FkX2VpcCcpCisKK2RlZmluZShgbG9hZF9laXAnLCBgJykJCWRubCB1cGRhdGVkIGluIExFQS9MRUFMCisKKworZGVmaW5lKGBERUZfT0JKRUNUJywKK200X2Fzc2VydF9udW1hcmdzX3JhbmdlKDEsMikKKwlgUk9EQVRBCisJQUxJR04oaWZlbHNlKCQjLDEsMiwkMikpCiskMToKKycpCisKK2RlZmluZShgRU5EX09CSkVDVCcsCittNF9hc3NlcnRfbnVtYXJncygxKQorYAlTSVpFKGAkMScsLi1gJDEnKScpCisKK2RubCAgVXNhZ2U6IENBTEwoZnVuY25hbWUpCitkbmwKKworZGVmaW5lKGBDQUxMJywKK200X2Fzc2VydF9udW1hcmdzKDEpCitgaWZkZWYoYFBJQycsCisgIGBjYWxsCUdTWU1fUFJFRklYYCckMUBQTFQnLAorICBgY2FsbAlHU1lNX1BSRUZJWGAnJDEnKScpCisKK2lmZGVmKGBQSUMnLAorYGRlZmluZShgUElDX1dJVEhfRUJYJyknLAorYHVuZGVmaW5lKGBQSUNfV0lUSF9FQlgnKScpCisKK2RpdmVydGAnZG5sCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2FvcnJsc2gxX24uYXNtIGIvbXBuL3g4Nl82NC9hb3JybHNoMV9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMxN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9hb3JybHNoMV9uLmFzbQpAQCAtMCwwICsxLDE3MCBAQAorZG5sICBBTUQ2NCBtcG5fYWRkbHNoMV9uIC0tIHJwW10gPSB1cFtdICsgKHZwW10gPDwgMSkKK2RubCAgQU1ENjQgbXBuX3JzYmxzaDFfbiAtLSBycFtdID0gKHZwW10gPDwgMSkgLSB1cFtdCisKK2RubCAgQ29weXJpZ2h0IDIwMDMsIDIwMDUtMjAwOSwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIKK0MgQU1EIEsxMAkgMgorQyBBTUQgYmQxCSA/CitDIEFNRCBib2JjYXQJID8KK0MgSW50ZWwgUDQJIDEzCitDIEludGVsIGNvcmUyCSAzLjQ1CitDIEludGVsIE5ITQkgPworQyBJbnRlbCBTQlIJID8KK0MgSW50ZWwgYXRvbQkgPworQyBWSUEgbmFubwkgPworCisKK0MgU29tZXRpbWVzIHNwZWVkIGRlZ2VuZXJhdGVzLCBzdXBwb3NlZGx5IHJlbGF0ZWQgdG8gdGhhdCBzb21lIG9wZXJhbmQKK0MgYWxpZ25tZW50cyBjYXVzZSBjYWNoZSBjb25mbGljdHMuCisKK0MgVGhlIHNwZWVkIGlzIGxpbWl0ZWQgYnkgZGVjb2RpbmcvaXNzdWUgYmFuZHdpZHRoLiAgVGhlcmUgYXJlIDIyIGluc3RydWN0aW9ucworQyBpbiB0aGUgbG9vcCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gY2VpbCgyMi8zKS80ID0gMS44MyBjL2wuCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsYCVyZGknKQorZGVmaW5lKGB1cCcsYCVyc2knKQorZGVmaW5lKGB2cCcsYCVyZHgnKQorZGVmaW5lKGBuJywgYCVyY3gnKQorCitpZmRlZihgT1BFUkFUSU9OX2FkZGxzaDFfbicsIGAKKyAgZGVmaW5lKEFERFNVQiwJYWRkKQorICBkZWZpbmUoQURDU0JCLAlhZGMpCisgIGRlZmluZShmdW5jLAkJbXBuX2FkZGxzaDFfbiknKQoraWZkZWYoYE9QRVJBVElPTl9yc2Jsc2gxX24nLCBgCisgIGRlZmluZShBRERTVUIsCXN1YikKKyAgZGVmaW5lKEFEQ1NCQiwJc2JiKQorICBkZWZpbmUoZnVuYywJCW1wbl9yc2Jsc2gxX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkbHNoMV9uIG1wbl9yc2Jsc2gxX24pCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwlGVU5DX0VOVFJZKDQpCisJcHVzaAklcmJwCisKKwltb3YJKHZwKSwgJXI4CisJbW92CVIzMihuKSwgUjMyKCVyYXgpCisJbGVhCShycCxuLDgpLCBycAorCWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJKHZwLG4sOCksIHZwCisJbmVnCW4KKwl4b3IJUjMyKCVyYnApLCBSMzIoJXJicCkKKwlhbmQJJDMsIFIzMiglcmF4KQorCWplCUwoYjAwKQorCWNtcAkkMiwgUjMyKCVyYXgpCisJamMJTChiMDEpCisJamUJTChiMTApCisKK0woYjExKToJYWRkCSVyOCwgJXI4CisJbW92CTgodnAsbiw4KSwgJXI5CisJYWRjCSVyOSwgJXI5CisJbW92CTE2KHZwLG4sOCksICVyMTAKKwlhZGMJJXIxMCwgJXIxMAorCXNiYglSMzIoJXJheCksIFIzMiglcmF4KQlDIHNhdmUgc2N5CisJQUREU1VCCSh1cCxuLDgpLCAlcjgKKwlBRENTQkIJOCh1cCxuLDgpLCAlcjkKKwltb3YJJXI4LCAocnAsbiw4KQorCW1vdgklcjksIDgocnAsbiw4KQorCUFEQ1NCQgkxNih1cCxuLDgpLCAlcjEwCisJbW92CSVyMTAsIDE2KHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWFkZAkkMywgbgorCWptcAlMKGVudCkKKworTChiMTApOglhZGQJJXI4LCAlcjgKKwltb3YJOCh2cCxuLDgpLCAlcjkKKwlhZGMJJXI5LCAlcjkKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIHNjeQorCUFERFNVQgkodXAsbiw4KSwgJXI4CisJQURDU0JCCTgodXAsbiw4KSwgJXI5CisJbW92CSVyOCwgKHJwLG4sOCkKKwltb3YJJXI5LCA4KHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWFkZAkkMiwgbgorCWptcAlMKGVudCkKKworTChiMDEpOglhZGQJJXI4LCAlcjgKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIHNjeQorCUFERFNVQgkodXAsbiw4KSwgJXI4CisJbW92CSVyOCwgKHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWluYwluCitMKGVudCk6CWpucwlMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglhZGQJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyByZXN0b3JlIHNjeQorCisJbW92CSh2cCxuLDgpLCAlcjgKK0woYjAwKToJYWRjCSVyOCwgJXI4CisJbW92CTgodnAsbiw4KSwgJXI5CisJYWRjCSVyOSwgJXI5CisJbW92CTE2KHZwLG4sOCksICVyMTAKKwlhZGMJJXIxMCwgJXIxMAorCW1vdgkyNCh2cCxuLDgpLCAlcjExCisJYWRjCSVyMTEsICVyMTEKKworCXNiYglSMzIoJXJheCksIFIzMiglcmF4KQlDIHNhdmUgc2N5CisJYWRkCVIzMiglcmJwKSwgUjMyKCVyYnApCUMgcmVzdG9yZSBhY3kKKworCUFEQ1NCQgkodXAsbiw4KSwgJXI4CisJbm9wCQkJCUMgSGFtbWVyIHNwZWVkdXAhCisJQURDU0JCCTgodXAsbiw4KSwgJXI5CisJbW92CSVyOCwgKHJwLG4sOCkKKwltb3YJJXI5LCA4KHJwLG4sOCkKKwlBRENTQkIJMTYodXAsbiw4KSwgJXIxMAorCUFEQ1NCQgkyNCh1cCxuLDgpLCAlcjExCisJbW92CSVyMTAsIDE2KHJwLG4sOCkKKwltb3YJJXIxMSwgMjQocnAsbiw4KQorCisJc2JiCVIzMiglcmJwKSwgUjMyKCVyYnApCUMgc2F2ZSBhY3kKKwlhZGQJJDQsIG4KKwlqcwlMKHRvcCkKKworTChlbmQpOgoraWZkZWYoYE9QRVJBVElPTl9hZGRsc2gxX24nLGAKKwlhZGQJUjMyKCVyYnApLCBSMzIoJXJheCkKKwluZWcJUjMyKCVyYXgpJykKK2lmZGVmKGBPUEVSQVRJT05fcnNibHNoMV9uJyxgCisJc3ViCVIzMiglcmF4KSwgUjMyKCVyYnApCisJbW92c2xxCVIzMiglcmJwKSwgJXJheCcpCisKKwlwb3AJJXJicAorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2FvcnJsc2gyX24uYXNtIGIvbXBuL3g4Nl82NC9hb3JybHNoMl9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzE3ODMwCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9hb3JybHNoMl9uLmFzbQpAQCAtMCwwICsxLDUzIEBACitkbmwgIEFNRDY0IG1wbl9hZGRsc2gyX24gLS0gcnBbXSA9IHVwW10gKyAodnBbXSA8PCAyKQorZG5sICBBTUQ2NCBtcG5fcnNibHNoMl9uIC0tIHJwW10gPSAodnBbXSA8PCAyKSAtIHVwW10KKworZG5sICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMDktMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitkZWZpbmUoTFNILCAyKQorZGVmaW5lKFJTSCwgNjIpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkbHNoMl9uJyxgCisgIGRlZmluZShBRERTVUIsCWFkZCkKKyAgZGVmaW5lKEFEQ1NCQiwJYWRjKQorICBkZWZpbmUoZnVuYywJCW1wbl9hZGRsc2gyX24pJykKK2lmZGVmKGBPUEVSQVRJT05fcnNibHNoMl9uJyxgCisgIGRlZmluZShBRERTVUIsCXN1YikKKyAgZGVmaW5lKEFEQ1NCQiwJc2JiKQorICBkZWZpbmUoZnVuYywJCW1wbl9yc2Jsc2gyX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkbHNoMl9uIG1wbl9yc2Jsc2gyX24pCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK2luY2x1ZGVfbXBuKGB4ODZfNjQvYW9ycmxzaENfbi5hc20nKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9hb3JybHNoQ19uLmFzbSBiL21wbi94ODZfNjQvYW9ycmxzaENfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwMDE1NAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvYW9ycmxzaENfbi5hc20KQEAgLTAsMCArMSwxNzIgQEAKK2RubCAgQU1ENjQgbXBuX2FkZGxzaENfbiAtLSBycFtdID0gdXBbXSArICh2cFtdIDw8IEMpCitkbmwgIEFNRDY0IG1wbl9yc2Jsc2hDX24gLS0gcnBbXSA9ICh2cFtdIDw8IEMpIC0gdXBbXQorCitkbmwgIENvcHlyaWdodCAyMDA5LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAyLjEKK0MgQU1EIEsxMAkgMi4wCitDIEFNRCBiZDEJfjIuNworQyBBTUQgYmQyCX4yLjcKK0MgQU1EIGJkMwkgPworQyBBTUQgYmQ0CSA/CitDIEFNRCB6ZW4JIDIuMAorQyBBTUQgYnQxCSAzLjMKK0MgQU1EIGJ0MgkgMy4wCitDIEludGVsIFA0CSA/CitDIEludGVsIFBOUgkgMy4wCitDIEludGVsIE5ITQkgMi43NQorQyBJbnRlbCBTQlIJIDIuNTUKK0MgSW50ZWwgSUJSCSAyLjQ5CitDIEludGVsIEhXTAkgMi4yNQorQyBJbnRlbCBCV0wJIDEuODkKK0MgSW50ZWwgU0tMCSAxLjkwCitDIEludGVsIGF0b20JIDguNAorQyBJbnRlbCBTTE0JIDQuMAorQyBWSUEgbmFubwkgPworCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcnAnLAlgJXJkaScpCitkZWZpbmUoYHVwJywJYCVyc2knKQorZGVmaW5lKGB2cCcsCWAlcmR4JykKK2RlZmluZShgbicsCWAlcmN4JykKKworZGVmaW5lKE0sIGV2YWwobTRfbHNoaWZ0KDEsTFNIKSkpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwlGVU5DX0VOVFJZKDQpCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisKKwltb3YJKHZwKSwgJXI4CisJbGVhCSgsJXI4LE0pLCAlcjEyCisJc2hyCSRSU0gsICVyOAorCisJbW92CVIzMihuKSwgUjMyKCVyYXgpCisJbGVhCShycCxuLDgpLCBycAorCWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJKHZwLG4sOCksIHZwCisJbmVnCW4KKwlhbmQJJDMsIFI4KCVyYXgpCisJamUJTChiMDApCisJY21wCSQyLCBSOCglcmF4KQorCWpjCUwoYjAxKQorCWplCUwoYjEwKQorCitMKGIxMSk6CW1vdgk4KHZwLG4sOCksICVyMTAKKwlsZWEJKCVyOCwlcjEwLE0pLCAlcjE0CisJc2hyCSRSU0gsICVyMTAKKwltb3YJMTYodnAsbiw4KSwgJXIxMQorCWxlYQkoJXIxMCwlcjExLE0pLCAlcjE1CisJc2hyCSRSU0gsICVyMTEKKwlBRERTVUIJKHVwLG4sOCksICVyMTIKKwlBRENTQkIJOCh1cCxuLDgpLCAlcjE0CisJQURDU0JCCTE2KHVwLG4sOCksICVyMTUKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJCSAgQyBzYXZlIGNhcnJ5IGZvciBuZXh0CisJbW92CSVyMTIsIChycCxuLDgpCisJbW92CSVyMTQsIDgocnAsbiw4KQorCW1vdgklcjE1LCAxNihycCxuLDgpCisJYWRkCSQzLCBuCisJanMJTCh0b3ApCisJam1wCUwoZW5kKQorCitMKGIwMSk6CW1vdgklcjgsICVyMTEKKwlBRERTVUIJKHVwLG4sOCksICVyMTIKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJCSAgQyBzYXZlIGNhcnJ5IGZvciBuZXh0CisJbW92CSVyMTIsIChycCxuLDgpCisJYWRkCSQxLCBuCisJanMJTCh0b3ApCisJam1wCUwoZW5kKQorCitMKGIxMCk6CW1vdgk4KHZwLG4sOCksICVyMTEKKwlsZWEJKCVyOCwlcjExLE0pLCAlcjE1CisJc2hyCSRSU0gsICVyMTEKKwlBRERTVUIJKHVwLG4sOCksICVyMTIKKwlBRENTQkIJOCh1cCxuLDgpLCAlcjE1CisJc2JiCVIzMiglcmF4KSwgUjMyKCVyYXgpCQkgIEMgc2F2ZSBjYXJyeSBmb3IgbmV4dAorCW1vdgklcjEyLCAocnAsbiw4KQorCW1vdgklcjE1LCA4KHJwLG4sOCkKKwlhZGQJJDIsIG4KKwlqcwlMKHRvcCkKKwlqbXAJTChlbmQpCisKK0woYjAwKToJbW92CTgodnAsbiw4KSwgJXI5CisJbW92CTE2KHZwLG4sOCksICVyMTAKKwlqbXAJTChlMDApCisKKwlBTElHTigxNikKK0wodG9wKToJbW92CTE2KHZwLG4sOCksICVyMTAKKwltb3YJKHZwLG4sOCksICVyOAorCW1vdgk4KHZwLG4sOCksICVyOQorCWxlYQkoJXIxMSwlcjgsTSksICVyMTIKKwlzaHIJJFJTSCwgJXI4CitMKGUwMCk6CWxlYQkoJXI4LCVyOSxNKSwgJXIxMworCXNocgkkUlNILCAlcjkKKwltb3YJMjQodnAsbiw4KSwgJXIxMQorCWxlYQkoJXI5LCVyMTAsTSksICVyMTQKKwlzaHIJJFJTSCwgJXIxMAorCWxlYQkoJXIxMCwlcjExLE0pLCAlcjE1CisJc2hyCSRSU0gsICVyMTEKKwlhZGQJUjMyKCVyYXgpLCBSMzIoJXJheCkJCSAgQyByZXN0b3JlIGNhcnJ5CisJQURDU0JCCSh1cCxuLDgpLCAlcjEyCisJQURDU0JCCTgodXAsbiw4KSwgJXIxMworCUFEQ1NCQgkxNih1cCxuLDgpLCAlcjE0CisJQURDU0JCCTI0KHVwLG4sOCksICVyMTUKKwltb3YJJXIxMiwgKHJwLG4sOCkKKwltb3YJJXIxMywgOChycCxuLDgpCisJbW92CSVyMTQsIDE2KHJwLG4sOCkKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJCSAgQyBzYXZlIGNhcnJ5IGZvciBuZXh0CisJbW92CSVyMTUsIDI0KHJwLG4sOCkKKwlhZGQJJDQsIG4KKwlqcwlMKHRvcCkKK0woZW5kKToKKworaWZlbHNlKEFERFNVQixhZGQsYAorCXN1YglSMzIoJXIxMSksIFIzMiglcmF4KQorCW5lZwlSMzIoJXJheCkKKycsYAorCWFkZAlSMzIoJXIxMSksIFIzMiglcmF4KQorCW1vdnNscQlSMzIoJXJheCksICVyYXgKKycpCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9hb3JybHNoX24uYXNtIGIvbXBuL3g4Nl82NC9hb3JybHNoX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTRkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2FvcnJsc2hfbi5hc20KQEAgLTAsMCArMSwxNzYgQEAKK2RubCAgQU1ENjQgbXBuX2FkZGxzaF9uIGFuZCBtcG5fcnNibHNoX24uICBSID0gVjJeayArLSBVLgorCitkbmwgIENvcHlyaWdodCAyMDA2LCAyMDEwLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAzLjEJPCAzLjg1IGZvciBsc2hpZnQgKyBhZGRfbgorQyBBTUQgSzEwCSAzLjEJPCAzLjg1IGZvciBsc2hpZnQgKyBhZGRfbgorQyBJbnRlbCBQNAkxNC42CT4gNy4zMyBmb3IgbHNoaWZ0ICsgYWRkX24KK0MgSW50ZWwgY29yZTIJIDMuODcJPiAzLjI3IGZvciBsc2hpZnQgKyBhZGRfbgorQyBJbnRlbCBOSE0JIDQJPiAzLjc1IGZvciBsc2hpZnQgKyBhZGRfbgorQyBJbnRlbCBTQlIJKDUuOCkJPiAzLjQ2IGZvciBsc2hpZnQgKyBhZGRfbgorQyBJbnRlbCBhdG9tCSg3Ljc1KQk8IDguNzUgZm9yIGxzaGlmdCArIGFkZF9uCitDIFZJQSBuYW5vCSA0LjcJPCA2LjI1IGZvciBsc2hpZnQgKyBhZGRfbgorCitDIFRoaXMgd2FzIHdyaXR0ZW4gcXVpY2tseSBhbmQgbm90IG9wdGltaXplZCBhdCBhbGwuICBTdXJlbHkgb25lIGNvdWxkIGdldAorQyBjbG9zZXIgdG8gMyBjL2wgb3IgcGVyaGFwcyBldmVuIHVuZGVyIDMgYy9sLiAgSWRlYXM6CitDICAgMSkgVXNlIGluZGV4aW5nIHRvIHNhdmUgdGhlIDMgTEVBCitDICAgMikgV3JpdGUgcmVhc29uYWJsZSBmZWVkLWluIGNvZGUKK0MgICAzKSBCZSBtb3JlIGNsZXZlciBhYm91dCByZWdpc3RlciB1c2FnZQorQyAgIDQpIFVucm9sbCBtb3JlLCBoYW5kbGluZyBDTCBuZWdhdGlvbiwgY2Fycnkgc2F2ZS9yZXN0b3JlIGNvc3QgbXVjaCBub3cKK0MgICA1KSBSZXNjaGVkdWxlCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsCWAlcmRpJykKK2RlZmluZShgdXAnLAlgJXJzaScpCitkZWZpbmUoYHZwJywJYCVyZHgnKQorZGVmaW5lKGBuJywJYCVyY3gnKQorZGVmaW5lKGBjbnQnLAlgJXI4JykKKworaWZkZWYoYE9QRVJBVElPTl9hZGRsc2hfbicsYAorICBkZWZpbmUoQURDU0JCLCAgICAgICBgYWRjJykKKyAgZGVmaW5lKGZ1bmMsIG1wbl9hZGRsc2hfbikKKycpCitpZmRlZihgT1BFUkFUSU9OX3JzYmxzaF9uJyxgCisgIGRlZmluZShBRENTQkIsICAgICAgIGBzYmInKQorICBkZWZpbmUoZnVuYywgbXBuX3JzYmxzaF9uKQorJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkbHNoX24gbXBuX3JzYmxzaF9uKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKGZ1bmMpCisJRlVOQ19FTlRSWSg0KQorSUZET1MoYAltb3YJNTYoJXJzcCksICVyOGQJJykKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKworCW1vdgluLCAlcmF4CisJeG9yCVIzMiglcmJ4KSwgUjMyKCVyYngpCUMgY2xlYXIgY2Fycnkgc2F2ZSByZWdpc3RlcgorCW1vdglSMzIoJXI4KSwgUjMyKCVyY3gpCUMgc2hpZnQgY291bnQKKwl4b3IJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBsaW1iIGNhcnJ5CisKKwltb3YJUjMyKCVyYXgpLCBSMzIoJXIxMSkKKwlhbmQJJDMsIFIzMiglcjExKQorCWplCUwoNCkKKwlzdWIJJDEsIFIzMiglcjExKQorCitMKDAxMik6CW1vdgkodnApLCAlcjgKKwltb3YJJXI4LCAlcjEyCisJc2hsCVI4KCVyY3gpLCAlcjgKKwlvcgklcmJwLCAlcjgKKwluZWcJUjgoJXJjeCkKKwltb3YJJXIxMiwgJXJicAorCXNocglSOCglcmN4KSwgJXJicAorCW5lZwlSOCglcmN4KQorCWFkZAlSMzIoJXJieCksIFIzMiglcmJ4KQorCUFEQ1NCQgkodXApLCAlcjgKKwltb3YJJXI4LCAocnApCisJc2JiCVIzMiglcmJ4KSwgUjMyKCVyYngpCisJbGVhCTgodXApLCB1cAorCWxlYQk4KHZwKSwgdnAKKwlsZWEJOChycCksIHJwCisJc3ViCSQxLCBSMzIoJXIxMSkKKwlqbmMJTCgwMTIpCisKK0woNCk6CXN1YgkkNCwgJXJheAorCWpjCUwoZW5kKQorCisJQUxJR04oMTYpCitMKHRvcCk6CW1vdgkodnApLCAlcjgKKwltb3YJJXI4LCAlcjEyCisJbW92CTgodnApLCAlcjkKKwltb3YJJXI5LCAlcjEzCisJbW92CTE2KHZwKSwgJXIxMAorCW1vdgklcjEwLCAlcjE0CisJbW92CTI0KHZwKSwgJXIxMQorCisJc2hsCVI4KCVyY3gpLCAlcjgKKwlzaGwJUjgoJXJjeCksICVyOQorCXNobAlSOCglcmN4KSwgJXIxMAorCW9yCSVyYnAsICVyOAorCW1vdgklcjExLCAlcmJwCisJc2hsCVI4KCVyY3gpLCAlcjExCisKKwluZWcJUjgoJXJjeCkKKworCXNocglSOCglcmN4KSwgJXIxMgorCXNocglSOCglcmN4KSwgJXIxMworCXNocglSOCglcmN4KSwgJXIxNAorCXNocglSOCglcmN4KSwgJXJicAkJQyB1c2VkIG5leHQgaXRlcmF0aW9uCisKKwlvcgklcjEyLCAlcjkKKwlvcgklcjEzLCAlcjEwCisJb3IJJXIxNCwgJXIxMQorCisJbmVnCVI4KCVyY3gpCisKKwlhZGQJUjMyKCVyYngpLCBSMzIoJXJieCkJQyByZXN0b3JlIGNhcnJ5IGZsYWcKKworCUFEQ1NCQgkodXApLCAlcjgKKwlBRENTQkIJOCh1cCksICVyOQorCUFEQ1NCQgkxNih1cCksICVyMTAKKwlBRENTQkIJMjQodXApLCAlcjExCisKKwltb3YJJXI4LCAocnApCisJbW92CSVyOSwgOChycCkKKwltb3YJJXIxMCwgMTYocnApCisJbW92CSVyMTEsIDI0KHJwKQorCisJc2JiCVIzMiglcmJ4KSwgUjMyKCVyYngpCUMgc2F2ZSBjYXJyeSBmbGFnCisKKwlsZWEJMzIodXApLCB1cAorCWxlYQkzMih2cCksIHZwCisJbGVhCTMyKHJwKSwgcnAKKworCXN1YgkkNCwgJXJheAorCWpuYwlMKHRvcCkKKworTChlbmQpOglhZGQJUjMyKCVyYngpLCBSMzIoJXJieCkKKwlBRENTQkIJJDAsICVyYnAKKwltb3YJJXJicCwgJXJheAorCXBvcAklcmJ4CisJcG9wCSVyYnAKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9hb3JzX2VycjFfbi5hc20gYi9tcG4veDg2XzY0L2FvcnNfZXJyMV9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmMxZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9hb3JzX2VycjFfbi5hc20KQEAgLTAsMCArMSwyMjUgQEAKK2RubCAgQU1ENjQgbXBuX2FkZF9lcnIxX24sIG1wbl9zdWJfZXJyMV9uCisKK2RubCAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgSGFydmV5LgorCitkbmwgIENvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIuNzUgKGRlZ2VuZXJhdGVzIHRvIDMgYy9sIGZvciBzb21lIGFsaWdubWVudHMpCitDIEFNRCBLMTAJID8KK0MgSW50ZWwgUDQJID8KK0MgSW50ZWwgY29yZTIJID8KK0MgSW50ZWwgY29yZWkJID8KK0MgSW50ZWwgYXRvbQkgPworQyBWSUEgbmFubwkgPworCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsCWAlcmRpJykKK2RlZmluZShgdXAnLAlgJXJzaScpCitkZWZpbmUoYHZwJywJYCVyZHgnKQorZGVmaW5lKGBlcCcsCWAlcmN4JykKK2RlZmluZShgeXAnLAlgJXI4JykKK2RlZmluZShgbicsCWAlcjknKQorZGVmaW5lKGBjeV9wYXJhbScsCWA4KCVyc3ApJykKKworZGVmaW5lKGBlbCcsCWAlcmJ4JykKK2RlZmluZShgZWgnLAlgJXJicCcpCitkZWZpbmUoYHQwJywJYCVyMTAnKQorZGVmaW5lKGB0MScsCWAlcjExJykKK2RlZmluZShgdDInLAlgJXIxMicpCitkZWZpbmUoYHQzJywJYCVyMTMnKQorZGVmaW5lKGB3MCcsCWAlcjE0JykKK2RlZmluZShgdzEnLAlgJXIxNScpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkX2VycjFfbicsIGAKKwlkZWZpbmUoQURDU0JCLAkgICAgICBhZGMpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9hZGRfZXJyMV9uKScpCitpZmRlZihgT1BFUkFUSU9OX3N1Yl9lcnIxX24nLCBgCisJZGVmaW5lKEFEQ1NCQiwJICAgICAgc2JiKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fc3ViX2VycjFfbiknKQorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9hZGRfZXJyMV9uIG1wbl9zdWJfZXJyMV9uKQorCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwltb3YJY3lfcGFyYW0sICVyYXgKKworCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJbGVhCSh1cCxuLDgpLCB1cAorCWxlYQkodnAsbiw4KSwgdnAKKwlsZWEJKHJwLG4sOCksIHJwCisKKwltb3YJUjMyKG4pLCBSMzIoJXIxMCkKKwlhbmQJJDMsIFIzMiglcjEwKQorCWp6CUwoMG1vZDQpCisJY21wCSQyLCBSMzIoJXIxMCkKKwlqYwlMKDFtb2Q0KQorCWp6CUwoMm1vZDQpCitMKDNtb2Q0KToKKwl4b3IJUjMyKGVsKSwgUjMyKGVsKQorCXhvcglSMzIoZWgpLCBSMzIoZWgpCisJeG9yCVIzMih0MCksIFIzMih0MCkKKwl4b3IJUjMyKHQxKSwgUjMyKHQxKQorCWxlYQktMjQoeXAsbiw4KSwgeXAKKwluZWcJbgorCisJc2hyCSQxLCAlYWwJCSAgIEMgcmVzdG9yZSBjYXJyeQorCW1vdgkodXAsbiw4KSwgdzAKKwltb3YJOCh1cCxuLDgpLCB3MQorCUFEQ1NCQgkodnAsbiw4KSwgdzAKKwltb3YJdzAsIChycCxuLDgpCisJY21vdmMJMTYoeXApLCBlbAorCUFEQ1NCQgk4KHZwLG4sOCksIHcxCisJbW92CXcxLCA4KHJwLG4sOCkKKwljbW92Ywk4KHlwKSwgdDAKKwltb3YJMTYodXAsbiw4KSwgdzAKKwlBRENTQkIJMTYodnAsbiw4KSwgdzAKKwltb3YJdzAsIDE2KHJwLG4sOCkKKwljbW92YwkoeXApLCB0MQorCXNldGMJJWFsCQkgICBDIHNhdmUgY2FycnkKKwlhZGQJdDAsIGVsCisJYWRjCSQwLCBlaAorCWFkZAl0MSwgZWwKKwlhZGMJJDAsIGVoCisKKwlhZGQJJDMsIG4KKwlqbnoJTChsb29wKQorCWptcAlMKGVuZCkKKworCUFMSUdOKDE2KQorTCgwbW9kNCk6CisJeG9yCVIzMihlbCksIFIzMihlbCkKKwl4b3IJUjMyKGVoKSwgUjMyKGVoKQorCWxlYQkoeXAsbiw4KSwgeXAKKwluZWcJbgorCWptcAlMKGxvb3ApCisKKwlBTElHTigxNikKK0woMW1vZDQpOgorCXhvcglSMzIoZWwpLCBSMzIoZWwpCisJeG9yCVIzMihlaCksIFIzMihlaCkKKwlsZWEJLTgoeXAsbiw4KSwgeXAKKwluZWcJbgorCisJc2hyCSQxLCAlYWwJCSAgIEMgcmVzdG9yZSBjYXJyeQorCW1vdgkodXAsbiw4KSwgdzAKKwlBRENTQkIJKHZwLG4sOCksIHcwCisJbW92CXcwLCAocnAsbiw4KQorCWNtb3ZjCSh5cCksIGVsCisJc2V0YwklYWwJCSAgIEMgc2F2ZSBjYXJyeQorCisJYWRkCSQxLCBuCisJam56CUwobG9vcCkKKwlqbXAJTChlbmQpCisKKwlBTElHTigxNikKK0woMm1vZDQpOgorCXhvcglSMzIoZWwpLCBSMzIoZWwpCisJeG9yCVIzMihlaCksIFIzMihlaCkKKwl4b3IJUjMyKHQwKSwgUjMyKHQwKQorCWxlYQktMTYoeXAsbiw4KSwgeXAKKwluZWcJbgorCisJc2hyCSQxLCAlYWwJCSAgIEMgcmVzdG9yZSBjYXJyeQorCW1vdgkodXAsbiw4KSwgdzAKKwltb3YJOCh1cCxuLDgpLCB3MQorCUFEQ1NCQgkodnAsbiw4KSwgdzAKKwltb3YJdzAsIChycCxuLDgpCisJY21vdmMJOCh5cCksIGVsCisJQURDU0JCCTgodnAsbiw4KSwgdzEKKwltb3YJdzEsIDgocnAsbiw4KQorCWNtb3ZjCSh5cCksIHQwCisJc2V0YwklYWwJCSAgIEMgc2F2ZSBjYXJyeQorCWFkZAl0MCwgZWwKKwlhZGMJJDAsIGVoCisKKwlhZGQJJDIsIG4KKwlqbnoJTChsb29wKQorCWptcAlMKGVuZCkKKworCUFMSUdOKDMyKQorTChsb29wKToKKwlzaHIJJDEsICVhbAkJICAgQyByZXN0b3JlIGNhcnJ5CisJbW92CS04KHlwKSwgdDAKKwltb3YJJDAsIFIzMih0MykKKwltb3YJKHVwLG4sOCksIHcwCisJbW92CTgodXAsbiw4KSwgdzEKKwlBRENTQkIJKHZwLG4sOCksIHcwCisJY21vdm5jCXQzLCB0MAorCUFEQ1NCQgk4KHZwLG4sOCksIHcxCisJbW92CS0xNih5cCksIHQxCisJbW92CXcwLCAocnAsbiw4KQorCW1vdgkxNih1cCxuLDgpLCB3MAorCW1vdgl3MSwgOChycCxuLDgpCisJY21vdm5jCXQzLCB0MQorCW1vdgktMjQoeXApLCB0MgorCUFEQ1NCQgkxNih2cCxuLDgpLCB3MAorCWNtb3ZuYwl0MywgdDIKKwltb3YJMjQodXAsbiw4KSwgdzEKKwlBRENTQkIJMjQodnAsbiw4KSwgdzEKKwljbW92YwktMzIoeXApLCB0MworCXNldGMJJWFsCQkgICBDIHNhdmUgY2FycnkKKwlhZGQJdDAsIGVsCisJYWRjCSQwLCBlaAorCWFkZAl0MSwgZWwKKwlhZGMJJDAsIGVoCisJYWRkCXQyLCBlbAorCWFkYwkkMCwgZWgKKwltb3YJdzAsIDE2KHJwLG4sOCkKKwlhZGQJdDMsIGVsCisJbGVhCS0zMih5cCksIHlwCisJYWRjCSQwLCBlaAorCW1vdgl3MSwgMjQocnAsbiw4KQorCWFkZAkkNCwgbgorCWpueglMKGxvb3ApCisKK0woZW5kKToKKwltb3YJZWwsIChlcCkKKwltb3YJZWgsIDgoZXApCisKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvYW9yc19lcnIyX24uYXNtIGIvbXBuL3g4Nl82NC9hb3JzX2VycjJfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMjExNwotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvYW9yc19lcnIyX24uYXNtCkBAIC0wLDAgKzEsMTcyIEBACitkbmwgIEFNRDY0IG1wbl9hZGRfZXJyMl9uLCBtcG5fc3ViX2VycjJfbgorCitkbmwgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEhhcnZleS4KKworZG5sICBDb3B5cmlnaHQgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSA0LjUKK0MgQU1EIEsxMAkgPworQyBJbnRlbCBQNAkgPworQyBJbnRlbCBjb3JlMgkgNi45CitDIEludGVsIGNvcmVpCSA/CitDIEludGVsIGF0b20JID8KK0MgVklBIG5hbm8JID8KKworCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcnAnLAlgJXJkaScpCitkZWZpbmUoYHVwJywJYCVyc2knKQorZGVmaW5lKGB2cCcsCWAlcmR4JykKK2RlZmluZShgZXAnLAlgJXJjeCcpCitkZWZpbmUoYHlwMScsCWAlcjgnKQorZGVmaW5lKGB5cDInLCAgIGAlcjknKQorZGVmaW5lKGBuX3BhcmFtJywgICAgIGA4KCVyc3ApJykKK2RlZmluZShgY3lfcGFyYW0nLCAgICBgMTYoJXJzcCknKQorCitkZWZpbmUoYGN5MScsICAgYCVyMTQnKQorZGVmaW5lKGBjeTInLCAgIGAlcmF4JykKKworZGVmaW5lKGBuJywgICAgIGAlcjEwJykKKworZGVmaW5lKGB3JywgICAgIGAlcmJ4JykKK2RlZmluZShgZTFsJywJYCVyYnAnKQorZGVmaW5lKGBlMWgnLAlgJXIxMScpCitkZWZpbmUoYGUybCcsCWAlcjEyJykKK2RlZmluZShgZTJoJywJYCVyMTMnKQorCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkX2VycjJfbicsIGAKKwlkZWZpbmUoQURDU0JCLAkgICAgICBhZGMpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9hZGRfZXJyMl9uKScpCitpZmRlZihgT1BFUkFUSU9OX3N1Yl9lcnIyX24nLCBgCisJZGVmaW5lKEFEQ1NCQiwJICAgICAgc2JiKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fc3ViX2VycjJfbiknKQorCitNVUxGVU5DX1BST0xPR1VFKG1wbl9hZGRfZXJyMl9uIG1wbl9zdWJfZXJyMl9uKQorCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwltb3YJY3lfcGFyYW0sIGN5MgorCW1vdgluX3BhcmFtLCBuCisKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKworCXhvcglSMzIoZTFsKSwgUjMyKGUxbCkKKwl4b3IJUjMyKGUxaCksIFIzMihlMWgpCisJeG9yCVIzMihlMmwpLCBSMzIoZTJsKQorCXhvcglSMzIoZTJoKSwgUjMyKGUyaCkKKworCXN1Ygl5cDEsIHlwMgorCisJbGVhCShycCxuLDgpLCBycAorCWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJKHZwLG4sOCksIHZwCisKKwl0ZXN0CSQxLCBuCisJam56CUwob2RkKQorCisJbGVhCS04KHlwMSxuLDgpLCB5cDEKKwluZWcJbgorCWptcAlMKHRvcCkKKworCUFMSUdOKDE2KQorTChvZGQpOgorCWxlYQktMTYoeXAxLG4sOCksIHlwMQorCW5lZwluCisJc2hyCSQxLCBjeTIKKwltb3YJKHVwLG4sOCksIHcKKwlBRENTQkIJKHZwLG4sOCksIHcKKwljbW92Ywk4KHlwMSksIGUxbAorCWNtb3ZjCTgoeXAxLHlwMiksIGUybAorCW1vdgl3LCAocnAsbiw4KQorCXNiYgljeTIsIGN5MgorCWluYwluCisJanoJTChlbmQpCisKKwlBTElHTigxNikKK0wodG9wKToKKwltb3YJKHVwLG4sOCksIHcKKwlzaHIJJDEsIGN5MgkJQyByZXN0b3JlIGNhcnJ5CisJQURDU0JCCSh2cCxuLDgpLCB3CisJbW92CXcsIChycCxuLDgpCisJc2JiCWN5MSwgY3kxCUMgZ2VuZXJhdGUgbWFzaywgcHJlc2VydmUgQ0YKKworCW1vdgk4KHVwLG4sOCksIHcKKwlBRENTQkIJOCh2cCxuLDgpLCB3CisJbW92CXcsIDgocnAsbiw4KQorCXNiYgljeTIsIGN5MglDIGdlbmVyYXRlIG1hc2ssIHByZXNlcnZlIENGCisKKwltb3YJKHlwMSksIHcJQyAoZTFoOmUxbCkgKz0gY3kxICogeXAxIGxpbWIKKwlhbmQJY3kxLCB3CisJYWRkCXcsIGUxbAorCWFkYwkkMCwgZTFoCisKKwlhbmQJKHlwMSx5cDIpLCBjeTEJQyAoZTJoOmUybCkgKz0gY3kxICogeXAyIGxpbWIKKwlhZGQJY3kxLCBlMmwKKwlhZGMJJDAsIGUyaAorCisJbW92CS04KHlwMSksIHcJQyAoZTFoOmUxbCkgKz0gY3kyICogbmV4dCB5cDEgbGltYgorCWFuZAljeTIsIHcKKwlhZGQJdywgZTFsCisJYWRjCSQwLCBlMWgKKworCW1vdgktOCh5cDEseXAyKSwgdwlDIChlMmg6ZTJsKSArPSBjeTIgKiBuZXh0IHlwMiBsaW1iCisJYW5kCWN5MiwgdworCWFkZAl3LCBlMmwKKwlhZGMJJDAsIGUyaAorCisJYWRkCSQyLCBuCisJbGVhCS0xNih5cDEpLCB5cDEKKwlqbnoJTCh0b3ApCitMKGVuZCk6CisKKwltb3YJZTFsLCAoZXApCisJbW92CWUxaCwgOChlcCkKKwltb3YJZTJsLCAxNihlcCkKKwltb3YJZTJoLCAyNChlcCkKKworCWFuZAkkMSwgJWVheAlDIHJldHVybiBjYXJyeQorCisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9hb3JzX2VycjNfbi5hc20gYi9tcG4veDg2XzY0L2FvcnNfZXJyM19uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9hb3JzX2VycjNfbi5hc20KQEAgLTAsMCArMSwxNTYgQEAKK2RubCAgQU1ENjQgbXBuX2FkZF9lcnIzX24sIG1wbl9zdWJfZXJyM19uCisKK2RubCAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgSGFydmV5LgorCitkbmwgIENvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDcuMAorQyBBTUQgSzEwCSA/CitDIEludGVsIFA0CSA/CitDIEludGVsIGNvcmUyCSA/CitDIEludGVsIGNvcmVpCSA/CitDIEludGVsIGF0b20JID8KK0MgVklBIG5hbm8JID8KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywJYCVyZGknKQorZGVmaW5lKGB1cCcsCWAlcnNpJykKK2RlZmluZShgdnAnLAlgJXJkeCcpCitkZWZpbmUoYGVwJywJYCVyY3gnKQorZGVmaW5lKGB5cDEnLAlgJXI4JykKK2RlZmluZShgeXAyJywgICBgJXI5JykKK2RlZmluZShgeXAzX3BhcmFtJywgICBgOCglcnNwKScpCitkZWZpbmUoYG5fcGFyYW0nLCAgICAgYDE2KCVyc3ApJykKK2RlZmluZShgY3lfcGFyYW0nLCAgICBgMjQoJXJzcCknKQorCitkZWZpbmUoYG4nLCAgICAgYCVyMTAnKQorZGVmaW5lKGB5cDMnLCAgIGAlcmN4JykKK2RlZmluZShgdCcsICAgICBgJXJieCcpCisKK2RlZmluZShgZTFsJywJYCVyYnAnKQorZGVmaW5lKGBlMWgnLAlgJXIxMScpCitkZWZpbmUoYGUybCcsCWAlcjEyJykKK2RlZmluZShgZTJoJywJYCVyMTMnKQorZGVmaW5lKGBlM2wnLCAgIGAlcjE0JykKK2RlZmluZShgZTNoJywgICBgJXIxNScpCisKKworCitpZmRlZihgT1BFUkFUSU9OX2FkZF9lcnIzX24nLCBgCisJZGVmaW5lKEFEQ1NCQiwJICAgICAgYWRjKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fYWRkX2VycjNfbiknKQoraWZkZWYoYE9QRVJBVElPTl9zdWJfZXJyM19uJywgYAorCWRlZmluZShBRENTQkIsCSAgICAgIHNiYikKKwlkZWZpbmUoZnVuYywJICAgICAgbXBuX3N1Yl9lcnIzX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkX2VycjNfbiBtcG5fc3ViX2VycjNfbikKKworCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKGZ1bmMpCisJbW92CWN5X3BhcmFtLCAlcmF4CisJbW92CW5fcGFyYW0sIG4KKworCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJcHVzaAllcAorCW1vdgk2NCglcnNwKSwgeXAzICAgICAgIEMgbG9hZCBmcm9tIHlwM19wYXJhbQorCisJeG9yCVIzMihlMWwpLCBSMzIoZTFsKQorCXhvcglSMzIoZTFoKSwgUjMyKGUxaCkKKwl4b3IJUjMyKGUybCksIFIzMihlMmwpCisJeG9yCVIzMihlMmgpLCBSMzIoZTJoKQorCXhvcglSMzIoZTNsKSwgUjMyKGUzbCkKKwl4b3IJUjMyKGUzaCksIFIzMihlM2gpCisKKwlzdWIJeXAxLCB5cDIKKwlzdWIJeXAxLCB5cDMKKworCWxlYQktOCh5cDEsbiw4KSwgeXAxCisJbGVhCShycCxuLDgpLCBycAorCWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJKHZwLG4sOCksIHZwCisJbmVnCW4KKworCUFMSUdOKDE2KQorTCh0b3ApOgorCXNocgkkMSwgJXJheAkJQyByZXN0b3JlIGNhcnJ5CisJbW92CSh1cCxuLDgpLCAlcmF4CisJQURDU0JCCSh2cCxuLDgpLCAlcmF4CisJbW92CSVyYXgsIChycCxuLDgpCisJc2JiCSVyYXgsICVyYXgJCUMgc2F2ZSBjYXJyeSBhbmQgZ2VuZXJhdGUgbWFzaworCisJbW92CSh5cDEpLCB0CisJYW5kCSVyYXgsIHQKKwlhZGQJdCwgZTFsCisJYWRjCSQwLCBlMWgKKworCW1vdgkoeXAxLHlwMiksIHQKKwlhbmQJJXJheCwgdAorCWFkZAl0LCBlMmwKKwlhZGMJJDAsIGUyaAorCisJbW92CSh5cDEseXAzKSwgdAorCWFuZAklcmF4LCB0CisJYWRkCXQsIGUzbAorCWFkYwkkMCwgZTNoCisKKwlsZWEJLTgoeXAxKSwgeXAxCisJaW5jCW4KKwlqbnogICAgIEwodG9wKQorCitMKGVuZCk6CisJYW5kCSQxLCAlZWF4CisJcG9wCWVwCisKKwltb3YJZTFsLCAoZXApCisJbW92CWUxaCwgOChlcCkKKwltb3YJZTJsLCAxNihlcCkKKwltb3YJZTJoLCAyNChlcCkKKwltb3YJZTNsLCAzMihlcCkKKwltb3YJZTNoLCA0MChlcCkKKworCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9hb3JzX24uYXNtIGIvbXBuL3g4Nl82NC9hb3JzX24uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2MyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2FvcnNfbi5hc20KQEAgLTAsMCArMSwxNzggQEAKK2RubCAgQU1ENjQgbXBuX2FkZF9uLCBtcG5fc3ViX24KKworZG5sICBDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA3LCAyMDA4LCAyMDEwLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIEFNRCBLOCxLOQkgMS41CitDIEFNRCBLMTAJIDEuNQorQyBBTUQgYmQxCSAxLjgKK0MgQU1EIGJkMgkgMS43NAorQyBBTUQgYmQzCSA/CitDIEFNRCBiZDQJIDEuNzgKK0MgQU1EIHplbgkgMS41CitDIEFNRCBidDEJIDIuNTQKK0MgQU1EIGJ0MgkgMi4xNQorQyBJbnRlbCBQNAkxMS41CitDIEludGVsIGNvcmUyCSA0LjkKK0MgSW50ZWwgTkhNCSA1LjUzCitDIEludGVsIFNCUgkgMS41OQorQyBJbnRlbCBJQlIJIDEuNTUKK0MgSW50ZWwgSFdMCSAxLjQ0CitDIEludGVsIEJXTAkgMS4xNAorQyBJbnRlbCBTS0wJIDEuMjEKK0MgSW50ZWwgYXRvbQkgNAorQyBJbnRlbCBTTE0JIDMKK0MgVklBIG5hbm8JIDMuMjUKKworQyBUaGUgbG9vcCBvZiB0aGlzIGNvZGUgaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgY29kZSBnZW5lcmF0aW9uIGFuZAorQyBvcHRpbWl6YXRpb24gdG9vbCBzdWl0ZSB3cml0dGVuIGJ5IERhdmlkIEhhcnZleSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQuCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsCWAlcmRpJykJQyByY3gKK2RlZmluZShgdXAnLAlgJXJzaScpCUMgcmR4CitkZWZpbmUoYHZwJywJYCVyZHgnKQlDIHI4CitkZWZpbmUoYG4nLAlgJXJjeCcpCUMgcjkKK2RlZmluZShgY3knLAlgJXI4JykJQyByc3ArNDAgICAgKG1wbl9hZGRfbmMgYW5kIG1wbl9zdWJfbmMpCisKK2lmZGVmKGBPUEVSQVRJT05fYWRkX24nLCBgCisJZGVmaW5lKEFEQ1NCQiwJICAgICAgYWRjKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fYWRkX24pCisJZGVmaW5lKGZ1bmNfbmMsCSAgICAgIG1wbl9hZGRfbmMpJykKK2lmZGVmKGBPUEVSQVRJT05fc3ViX24nLCBgCisJZGVmaW5lKEFEQ1NCQiwJICAgICAgc2JiKQorCWRlZmluZShmdW5jLAkgICAgICBtcG5fc3ViX24pCisJZGVmaW5lKGZ1bmNfbmMsCSAgICAgIG1wbl9zdWJfbmMpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fYWRkX24gbXBuX2FkZF9uYyBtcG5fc3ViX24gbXBuX3N1Yl9uYykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShmdW5jX25jKQorCUZVTkNfRU5UUlkoNCkKK0lGRE9TKGAJbW92CTU2KCVyc3ApLCAlcjgJJykKKwltb3YJUjMyKG4pLCBSMzIoJXJheCkKKwlzaHIJJDIsIG4KKwlhbmQJJDMsIFIzMiglcmF4KQorCWJ0CSQwLCAlcjgJCQlDIGN5IGZsYWcgPC0gY2FycnkgcGFyYW1ldGVyCisJanJjeHoJTChsdDQpCisKKwltb3YJKHVwKSwgJXI4CisJbW92CTgodXApLCAlcjkKKwlkZWMJbgorCWptcAlMKG1pZCkKKworRVBJTE9HVUUoKQorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwlGVU5DX0VOVFJZKDQpCisJbW92CVIzMihuKSwgUjMyKCVyYXgpCisJc2hyCSQyLCBuCisJYW5kCSQzLCBSMzIoJXJheCkKKwlqcmN4eglMKGx0NCkKKworCW1vdgkodXApLCAlcjgKKwltb3YJOCh1cCksICVyOQorCWRlYwluCisJam1wCUwobWlkKQorCitMKGx0NCk6CWRlYwlSMzIoJXJheCkKKwltb3YJKHVwKSwgJXI4CisJam56CUwoMikKKwlBRENTQkIJKHZwKSwgJXI4CisJbW92CSVyOCwgKHJwKQorCWFkYwlSMzIoJXJheCksIFIzMiglcmF4KQorCUZVTkNfRVhJVCgpCisJcmV0CisKK0woMik6CWRlYwlSMzIoJXJheCkKKwltb3YJOCh1cCksICVyOQorCWpueglMKDMpCisJQURDU0JCCSh2cCksICVyOAorCUFEQ1NCQgk4KHZwKSwgJXI5CisJbW92CSVyOCwgKHJwKQorCW1vdgklcjksIDgocnApCisJYWRjCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJRlVOQ19FWElUKCkKKwlyZXQKKworTCgzKToJbW92CTE2KHVwKSwgJXIxMAorCUFEQ1NCQgkodnApLCAlcjgKKwlBRENTQkIJOCh2cCksICVyOQorCUFEQ1NCQgkxNih2cCksICVyMTAKKwltb3YJJXI4LCAocnApCisJbW92CSVyOSwgOChycCkKKwltb3YJJXIxMCwgMTYocnApCisJc2V0YwlSOCglcmF4KQorCUZVTkNfRVhJVCgpCisJcmV0CisKKwlBTElHTigxNikKK0wodG9wKToJQURDU0JCCSh2cCksICVyOAorCUFEQ1NCQgk4KHZwKSwgJXI5CisJQURDU0JCCTE2KHZwKSwgJXIxMAorCUFEQ1NCQgkyNCh2cCksICVyMTEKKwltb3YJJXI4LCAocnApCisJbGVhCTMyKHVwKSwgdXAKKwltb3YJJXI5LCA4KHJwKQorCW1vdgklcjEwLCAxNihycCkKKwlkZWMJbgorCW1vdgklcjExLCAyNChycCkKKwlsZWEJMzIodnApLCB2cAorCW1vdgkodXApLCAlcjgKKwltb3YJOCh1cCksICVyOQorCWxlYQkzMihycCksIHJwCitMKG1pZCk6CW1vdgkxNih1cCksICVyMTAKKwltb3YJMjQodXApLCAlcjExCisJam56CUwodG9wKQorCitMKGVuZCk6CWxlYQkzMih1cCksIHVwCisJQURDU0JCCSh2cCksICVyOAorCUFEQ1NCQgk4KHZwKSwgJXI5CisJQURDU0JCCTE2KHZwKSwgJXIxMAorCUFEQ1NCQgkyNCh2cCksICVyMTEKKwlsZWEJMzIodnApLCB2cAorCW1vdgklcjgsIChycCkKKwltb3YJJXI5LCA4KHJwKQorCW1vdgklcjEwLCAxNihycCkKKwltb3YJJXIxMSwgMjQocnApCisJbGVhCTMyKHJwKSwgcnAKKworCWluYwlSMzIoJXJheCkKKwlkZWMJUjMyKCVyYXgpCisJam56CUwobHQ0KQorCWFkYwlSMzIoJXJheCksIFIzMiglcmF4KQorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2FvcnNtdWxfMS5hc20gYi9tcG4veDg2XzY0L2FvcnNtdWxfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5NzA1YQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvYW9yc211bF8xLmFzbQpAQCAtMCwwICsxLDE5MCBAQAorZG5sICBBTUQ2NCBtcG5fYWRkbXVsXzEgYW5kIG1wbl9zdWJtdWxfMS4KKworZG5sICBDb3B5cmlnaHQgMjAwMy0yMDA1LCAyMDA3LCAyMDA4LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIuNTIKK0MgQU1EIEsxMAkgMi41MQorQyBBTUQgYmQxCSA0LjQzCitDIEFNRCBiZDIJIDUuMDMJIDUuNjMKK0MgQU1EIGJkMwkgPworQyBBTUQgYmQ0CSA/CitDIEFNRCB6ZW4JID8KK0MgQU1EIGJvYmNhdAkgNi4yMAorQyBBTUQgamFndWFyCSA1LjU3CSA2LjU2CitDIEludGVsIFA0CTE0LjkJMTcuMQorQyBJbnRlbCBjb3JlMgkgNS4xNQorQyBJbnRlbCBOSE0JIDQuOTMKK0MgSW50ZWwgU0JSCSAzLjk1CitDIEludGVsIElCUgkgMy43NQorQyBJbnRlbCBIV0wJIDMuNjIKK0MgSW50ZWwgQldMCSAyLjUzCitDIEludGVsIFNLTAkgMi41MworQyBJbnRlbCBhdG9tCTIxLjMKK0MgSW50ZWwgU0xNCSA5LjAKK0MgVklBIG5hbm8JIDUuMAorCitDIFRoZSBsb29wIG9mIHRoaXMgY29kZSBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb2RlIGdlbmVyYXRpb24gYW5kCitDIG9wdGltaXphdGlvbiB0b29sIHN1aXRlIHdyaXR0ZW4gYnkgRGF2aWQgSGFydmV5IGFuZCBUb3Jiam9ybiBHcmFubHVuZC4KKworQyBUT0RPCitDICAqIFRoZSBsb29wIGlzIGdyZWF0LCBidXQgdGhlIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBjb2RlIHdhcyBxdWlja2x5IHdyaXR0ZW4uCitDICAgIFR1bmUgaXQhCisKK2RlZmluZShgcnAnLCAgICAgIGAlcmRpJykgICBDIHJjeAorZGVmaW5lKGB1cCcsICAgICAgYCVyc2knKSAgIEMgcmR4CitkZWZpbmUoYG5fcGFyYW0nLCBgJXJkeCcpICAgQyByOAorZGVmaW5lKGB2bCcsICAgICAgYCVyY3gnKSAgIEMgcjkKKworZGVmaW5lKGBuJywgICAgICAgYCVyMTEnKQorCitpZmRlZihgT1BFUkFUSU9OX2FkZG11bF8xJyxgCisgICAgICBkZWZpbmUoYEFERFNVQicsICAgICAgICBgYWRkJykKKyAgICAgIGRlZmluZShgZnVuYycsICBgbXBuX2FkZG11bF8xJykKKycpCitpZmRlZihgT1BFUkFUSU9OX3N1Ym11bF8xJyxgCisgICAgICBkZWZpbmUoYEFERFNVQicsICAgICAgICBgc3ViJykKKyAgICAgIGRlZmluZShgZnVuYycsICBgbXBuX3N1Ym11bF8xJykKKycpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FkZG11bF8xIG1wbl9zdWJtdWxfMSkKKworSUZET1MoYAlkZWZpbmUoYHVwJywgYGAlcnNpJycpCScpIGRubAorSUZET1MoYAlkZWZpbmUoYHJwJywgYGAlcmN4JycpCScpIGRubAorSUZET1MoYAlkZWZpbmUoYHZsJywgYGAlcjknJykJJykgZG5sCitJRkRPUyhgCWRlZmluZShgcjknLCBgYHJkaScnKQknKSBkbmwKK0lGRE9TKGAJZGVmaW5lKGBuJywgIGBgJXI4JycpCScpIGRubAorSUZET1MoYAlkZWZpbmUoYHI4JywgYGByMTEnJykJJykgZG5sCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKworSUZET1MoYGBwdXNoCSVyc2kJCScnKQorSUZET1MoYGBwdXNoCSVyZGkJCScnKQorSUZET1MoYGBtb3YJJXJkeCwgJXJzaQknJykKKworCW1vdgkodXApLCAlcmF4CQlDIHJlYWQgZmlyc3QgdSBsaW1iIGVhcmx5CisJcHVzaAklcmJ4CitJRlNURChgCW1vdgluX3BhcmFtLCAlcmJ4ICAgJykJQyBtb3ZlIGF3YXkgbiBmcm9tIHJkeCwgbXVsIHVzZXMgaXQKK0lGRE9TKGAJbW92CW4sICVyYnggICAgICAgICAnKQorCW11bAl2bAorSUZTVEQoYAltb3YJJXJieCwgbiAgICAgICAgICcpCisKKwlhbmQJJDMsIFIzMiglcmJ4KQorCWp6CUwoYjApCisJY21wCSQyLCBSMzIoJXJieCkKKwlqeglMKGIyKQorCWpnCUwoYjMpCisKK0woYjEpOglkZWMJbgorCWpuZQlMKGd0MSkKKwlBRERTVUIJJXJheCwgKHJwKQorCWptcAlMKHJldCkKK0woZ3QxKToJbGVhCTgodXAsbiw4KSwgdXAKKwlsZWEJLTgocnAsbiw4KSwgcnAKKwluZWcJbgorCXhvcgklcjEwLCAlcjEwCisJeG9yCVIzMiglcmJ4KSwgUjMyKCVyYngpCisJbW92CSVyYXgsICVyOQorCW1vdgkodXAsbiw4KSwgJXJheAorCW1vdgklcmR4LCAlcjgKKwlqbXAJTChMMSkKKworTChiMCk6CWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJLTE2KHJwLG4sOCksIHJwCisJbmVnCW4KKwl4b3IJJXIxMCwgJXIxMAorCW1vdgklcmF4LCAlcjgKKwltb3YJJXJkeCwgJXJieAorCWptcAkgTChMMCkKKworTChiMyk6CWxlYQktOCh1cCxuLDgpLCB1cAorCWxlYQktMjQocnAsbiw4KSwgcnAKKwluZWcJbgorCW1vdgklcmF4LCAlcmJ4CisJbW92CSVyZHgsICVyMTAKKwlqbXAJTChMMykKKworTChiMik6CWxlYQktMTYodXAsbiw4KSwgdXAKKwlsZWEJLTMyKHJwLG4sOCksIHJwCisJbmVnCW4KKwl4b3IJJXI4LCAlcjgKKwl4b3IJUjMyKCVyYngpLCBSMzIoJXJieCkKKwltb3YJJXJheCwgJXIxMAorCW1vdgkyNCh1cCxuLDgpLCAlcmF4CisJbW92CSVyZHgsICVyOQorCWptcAlMKEwyKQorCisJQUxJR04oMTYpCitMKHRvcCk6CUFERFNVQgklcjEwLCAocnAsbiw4KQorCWFkYwklcmF4LCAlcjkKKwltb3YJKHVwLG4sOCksICVyYXgKKwlhZGMJJXJkeCwgJXI4CisJbW92CSQwLCBSMzIoJXIxMCkKK0woTDEpOgltdWwJdmwKKwlBRERTVUIJJXI5LCA4KHJwLG4sOCkKKwlhZGMJJXJheCwgJXI4CisJYWRjCSVyZHgsICVyYngKK0woTDApOgltb3YJOCh1cCxuLDgpLCAlcmF4CisJbXVsCXZsCisJQUREU1VCCSVyOCwgMTYocnAsbiw4KQorCWFkYwklcmF4LCAlcmJ4CisJYWRjCSVyZHgsICVyMTAKK0woTDMpOgltb3YJMTYodXAsbiw4KSwgJXJheAorCW11bAl2bAorCUFERFNVQgklcmJ4LCAyNChycCxuLDgpCisJbW92CSQwLCBSMzIoJXI4KQkJQyB6ZXJvCisJbW92CSVyOCwgJXJieAkJQyB6ZXJvCisJYWRjCSVyYXgsICVyMTAKKwltb3YJMjQodXAsbiw4KSwgJXJheAorCW1vdgklcjgsICVyOQkJQyB6ZXJvCisJYWRjCSVyZHgsICVyOQorTChMMik6CW11bAl2bAorCWFkZAkkNCwgbgorCWpzCSBMKHRvcCkKKworCUFERFNVQgklcjEwLCAocnAsbiw4KQorCWFkYwklcmF4LCAlcjkKKwlhZGMJJXI4LCAlcmR4CisJQUREU1VCCSVyOSwgOChycCxuLDgpCitMKHJldCk6CWFkYwkkMCwgJXJkeAorCW1vdgklcmR4LCAlcmF4CisKKwlwb3AJJXJieAorSUZET1MoYGBwb3AJJXJkaQkJJycpCitJRkRPUyhgYHBvcAklcnNpCQknJykKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvYmRpdl9kYm0xYy5hc20gYi9tcG4veDg2XzY0L2JkaXZfZGJtMWMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZmE5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2JkaXZfZGJtMWMuYXNtCkBAIC0wLDAgKzEsMTA2IEBACitkbmwgIHg4Nl82NCBtcG5fYmRpdl9kYm0xLgorCitkbmwgIENvcHlyaWdodCAyMDA4LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIuMjUKK0MgQU1EIEsxMAkgMi4yNQorQyBJbnRlbCBQNAkxMi41CitDIEludGVsIGNvcmUyCSA0CitDIEludGVsIE5ITQkgMy43NQorQyBJbnRlbCBTQlIJIDMuNgorQyBJbnRlbCBhdG9tCTIwCitDIFZJQSBuYW5vCSA0CisKK0MgVE9ETworQyAgKiBPcHRpbWlzZSBmZWVkLWluIGNvZGUuCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBxcCcsCSAgYCVyZGknKQorZGVmaW5lKGB1cCcsCSAgYCVyc2knKQorZGVmaW5lKGBuX3BhcmFtJywgYCVyZHgnKQorZGVmaW5lKGBiZCcsCSAgYCVyY3gnKQorZGVmaW5lKGBjeScsCSAgYCVyOCcpCisKK2RlZmluZShgbicsICAgICAgIGAlcjknKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9iZGl2X2RibTFjKQorCUZVTkNfRU5UUlkoNCkKK0lGRE9TKGAJbW92CTU2KCVyc3ApLCAlcjgJJykKKwltb3YJKHVwKSwgJXJheAorCW1vdgluX3BhcmFtLCBuCisJbW92CVIzMihuX3BhcmFtKSwgUjMyKCVyMTEpCisJbXVsCWJkCisJbGVhCSh1cCxuLDgpLCB1cAorCWxlYQkocXAsbiw4KSwgcXAKKwluZWcJbgorCWFuZAkkMywgUjMyKCVyMTEpCisJanoJTChsbzApCisJbGVhCS00KG4sJXIxMSksIG4KKwljbXAJJDIsIFIzMiglcjExKQorCWpjCUwobG8xKQorCWp6CUwobG8yKQorCWptcAlMKGxvMykKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJKHVwLG4sOCksICVyYXgKKwltdWwJYmQKK0wobG8wKToJc3ViCSVyYXgsICVyOAorCW1vdgklcjgsIChxcCxuLDgpCisJc2JiCSVyZHgsICVyOAorCW1vdgk4KHVwLG4sOCksICVyYXgKKwltdWwJYmQKK0wobG8zKToJc3ViCSVyYXgsICVyOAorCW1vdgklcjgsIDgocXAsbiw4KQorCXNiYgklcmR4LCAlcjgKKwltb3YJMTYodXAsbiw4KSwgJXJheAorCW11bAliZAorTChsbzIpOglzdWIJJXJheCwgJXI4CisJbW92CSVyOCwgMTYocXAsbiw4KQorCXNiYgklcmR4LCAlcjgKKwltb3YJMjQodXAsbiw4KSwgJXJheAorCW11bAliZAorTChsbzEpOglzdWIJJXJheCwgJXI4CisJbW92CSVyOCwgMjQocXAsbiw4KQorCXNiYgklcmR4LCAlcjgKKwlhZGQJJDQsIG4KKwlqbnoJTCh0b3ApCisKKwltb3YJJXI4LCAlcmF4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvYmRpdl9xXzEuYXNtIGIvbXBuL3g4Nl82NC9iZGl2X3FfMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMzZlOQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvYmRpdl9xXzEuYXNtCkBAIC0wLDAgKzEsMTk1IEBACitkbmwgIEFNRDY0IG1wbl9iZGl2X3FfMSwgbXBuX3BpMV9iZGl2X3FfMSAtLSBIZW5zZWwgZGl2aXNpb24gYnkgMS1saW1iIGRpdmlzb3IuCisKK2RubCAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQtMjAwNiwgMjAxMC0yMDEyLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK2RubCAgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgIGN5Y2xlcy9saW1iICAgIGN5Y2xlcy9saW1iCitDCSAgICAgICBub3JtCSAgICAgICB1bm9ybQorQyBBTUQgSzgsSzkJMTEJCTExCitDIEFNRCBLMTAJMTEJCTExCitDIEFNRCBidWxsCTEzLjUJCTE0CitDIEFNRCBwaWxlCTE0CQkxNQorQyBBTUQgc3RlYW0KK0MgQU1EIGV4Y2F2YXRvcgorQyBBTUQgYm9iY2F0CTE0CQkxNAorQyBBTUQgamFndWFyCTE0LjUJCTE1CitDIEludGVsIFA0CTMzCQkzMworQyBJbnRlbCBjb3JlMgkxMy41CQkxMy4yNQorQyBJbnRlbCBOSE0JMTQJCTE0CitDIEludGVsIFNCUgk4CQk4LjI1CitDIEludGVsIElCUgk3Ljc1CQk3Ljg1CitDIEludGVsIEhXTAk4CQk4CitDIEludGVsIEJXTAk4CQk4CitDIEludGVsIFNLTAk4CQk4CitDIEludGVsIGF0b20JMzQJCTM2CitDIEludGVsIFNMTQkxMy43CQkxMy41CitDIFZJQSBuYW5vCTE5LjI1CQkxOS4yNQluZWVkcyByZS1tZWFzdXJpbmcKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywJCWAlcmRpJykKK2RlZmluZShgdXAnLAkJYCVyc2knKQorZGVmaW5lKGBuJywJCWAlcmR4JykKK2RlZmluZShgZCcsCQlgJXJjeCcpCitkZWZpbmUoYGRpJywJCWAlcjgnKQkJQwlqdXN0IG1wbl9waTFfYmRpdl9xXzEKK2RlZmluZShgbmNudCcsCQlgJXI5JykJCUMJanVzdCBtcG5fcGkxX2JkaXZfcV8xCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX2JkaXZfcV8xKQorCUZVTkNfRU5UUlkoNCkKKwlwdXNoCSVyYngKKworCW1vdgklcmN4LCAlcmF4CisJeG9yCVIzMiglcmN4KSwgUjMyKCVyY3gpCUMgbmNudCBjb3VudAorCW1vdgklcmR4LCAlcjEwCisKKwlidAkkMCwgUjMyKCVyYXgpCisJam5jCUwoZXZuKQkJCUMgc2tpcCBic2YgdW5sZXNzIGRpdmlzb3IgaXMgZXZlbgorCitMKG9kZCk6CW1vdgklcmF4LCAlcmJ4CisJc2hyCVIzMiglcmF4KQorCWFuZAkkMTI3LCBSMzIoJXJheCkJCUMgZC8yLCA3IGJpdHMKKworCUxFQSgJYmludmVydF9saW1iX3RhYmxlLCAlcmR4KQorCisJbW92emJsCSglcmR4LCVyYXgpLCBSMzIoJXJheCkJQyBpbnYgOCBiaXRzCisKKwltb3YJJXJieCwgJXIxMQkJQyBkIHdpdGhvdXQgdHdvcworCisJbGVhCSglcmF4LCVyYXgpLCBSMzIoJXJkeCkJQyAyKmludgorCWltdWwJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBpbnYqaW52CisJaW11bAlSMzIoJXJieCksIFIzMiglcmF4KQlDIGludippbnYqZAorCXN1YglSMzIoJXJheCksIFIzMiglcmR4KQlDIGludiA9IDIqaW52IC0gaW52KmludipkLCAxNiBiaXRzCisKKwlsZWEJKCVyZHgsJXJkeCksIFIzMiglcmF4KQlDIDIqaW52CisJaW11bAlSMzIoJXJkeCksIFIzMiglcmR4KQlDIGludippbnYKKwlpbXVsCVIzMiglcmJ4KSwgUjMyKCVyZHgpCUMgaW52KmludipkCisJc3ViCVIzMiglcmR4KSwgUjMyKCVyYXgpCUMgaW52ID0gMippbnYgLSBpbnYqaW52KmQsIDMyIGJpdHMKKworCWxlYQkoJXJheCwlcmF4KSwgJXI4CUMgMippbnYKKwlpbXVsCSVyYXgsICVyYXgJCUMgaW52KmludgorCWltdWwJJXJieCwgJXJheAkJQyBpbnYqaW52KmQKKwlzdWIJJXJheCwgJXI4CQlDIGludiA9IDIqaW52IC0gaW52KmludipkLCA2NCBiaXRzCisKKwlqbXAJTChwaTEpCisKK0woZXZuKToJYnNmCSVyYXgsICVyY3gKKwlzaHIJUjgoJXJjeCksICVyYXgKKwlqbXAJTChvZGQpCitFUElMT0dVRSgpCisKK1BST0xPR1VFKG1wbl9waTFfYmRpdl9xXzEpCisJRlVOQ19FTlRSWSg0KQorSUZET1MoYAltb3YJNTYoJXJzcCksICVyOAknKQorSUZET1MoYAltb3YJNjQoJXJzcCksICVyOQknKQorCXB1c2gJJXJieAorCisJbW92CSVyY3gsICVyMTEJCUMgZAorCW1vdgklcmR4LCAlcjEwCQlDIG4KKwltb3YJJXI5LCAlcmN4CQlDIG5jbnQKKworTChwaTEpOgltb3YJKHVwKSwgJXJheAkJQyB1cFswXQorCisJZGVjCSVyMTAKKwlqeglMKG9uZSkKKworCWxlYQk4KHVwLCVyMTAsOCksIHVwCUMgdXAgZW5kCisJbGVhCShycCwlcjEwLDgpLCBycAkJQyBycCBlbmQKKwluZWcJJXIxMAkJCUMgLW4KKworCXRlc3QJUjMyKCVyY3gpLCBSMzIoJXJjeCkKKwlqbnoJTCh1bm9ybSkJCUMgYnJhbmNoIGlmIGNvdW50ICE9IDAKKwl4b3IJUjMyKCVyYngpLCBSMzIoJXJieCkKKwlqbXAJTChuZW50KQorCisJQUxJR04oOCkKK0wobnRvcCk6bXVsCSVyMTEJCQlDIGNhcnJ5IGxpbWIgaW4gcmR4CTAgMTAKKwltb3YJLTgodXAsJXIxMCw4KSwgJXJheAlDCisJc3ViCSVyYngsICVyYXgJCUMgYXBwbHkgY2FycnkgYml0CisJc2V0YwlSOCglcmJ4KQkJQworCXN1YgklcmR4LCAlcmF4CQlDIGFwcGx5IGNhcnJ5IGxpbWIJNQorCWFkYwkkMCwgUjMyKCVyYngpCQlDCQkJNgorTChuZW50KTppbXVsCSVyOCwgJXJheAkJQwkJCTYKKwltb3YJJXJheCwgKHJwLCVyMTAsOCkJQworCWluYwklcjEwCQkJQworCWpueglMKG50b3ApCisKKwltb3YJLTgodXApLCAlcjkJCUMgdXAgaGlnaCBsaW1iCisJam1wCUwoY29tKQorCitMKHVub3JtKToKKwltb3YJKHVwLCVyMTAsOCksICVyOQlDIHVwWzFdCisJc2hyCVI4KCVyY3gpLCAlcmF4CQlDCisJbmVnCVIzMiglcmN4KQorCXNobAlSOCglcmN4KSwgJXI5CQlDCisJbmVnCVIzMiglcmN4KQorCW9yCSVyOSwgJXJheAorCXhvcglSMzIoJXJieCksIFIzMiglcmJ4KQorCWptcAlMKHVlbnQpCisKKwlBTElHTig4KQorTCh1dG9wKTptdWwJJXIxMQkJCUMgY2FycnkgbGltYiBpbiByZHgJMCAxMAorCW1vdgkodXAsJXIxMCw4KSwgJXJheAlDCisJc2hsCVI4KCVyY3gpLCAlcmF4CQlDCisJbmVnCVIzMiglcmN4KQorCW9yCSVyOSwgJXJheAorCXN1YgklcmJ4LCAlcmF4CQlDIGFwcGx5IGNhcnJ5IGJpdAorCXNldGMJUjgoJXJieCkJCUMKKwlzdWIJJXJkeCwgJXJheAkJQyBhcHBseSBjYXJyeSBsaW1iCTUKKwlhZGMJJDAsIFIzMiglcmJ4KQkJQwkJCTYKK0wodWVudCk6aW11bAklcjgsICVyYXgJCUMJCQk2CisJbW92CSh1cCwlcjEwLDgpLCAlcjkJQworCXNocglSOCglcmN4KSwgJXI5CQlDCisJbmVnCVIzMiglcmN4KQorCW1vdgklcmF4LCAocnAsJXIxMCw4KQlDCisJaW5jCSVyMTAJCQlDCisJam56CUwodXRvcCkKKworTChjb20pOgltdWwJJXIxMQkJCUMgY2FycnkgbGltYiBpbiByZHgKKwlzdWIJJXJieCwgJXI5CQlDIGFwcGx5IGNhcnJ5IGJpdAorCXN1YgklcmR4LCAlcjkJCUMgYXBwbHkgY2FycnkgbGltYgorCWltdWwJJXI4LCAlcjkKKwltb3YJJXI5LCAocnApCisJcG9wCSVyYngKKwlGVU5DX0VYSVQoKQorCXJldAorCitMKG9uZSk6CXNocglSOCglcmN4KSwgJXJheAorCWltdWwJJXI4LCAlcmF4CisJbW92CSVyYXgsIChycCkKKwlwb3AJJXJieAorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2NuZF9hb3JzX24uYXNtIGIvbXBuL3g4Nl82NC9jbmRfYW9yc19uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIyZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9jbmRfYW9yc19uLmFzbQpAQCAtMCwwICsxLDE4MyBAQAorZG5sICBBTUQ2NCBtcG5fY25kX2FkZF9uLCBtcG5fY25kX3N1Yl9uCisKK2RubCAgQ29weXJpZ2h0IDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAyCitDIEFNRCBLMTAJIDIKK0MgQU1EIGJkMQkgMi4zMgorQyBBTUQgYm9iY2F0CSAzCitDIEludGVsIFA0CTEzCitDIEludGVsIGNvcmUyCSAyLjkKK0MgSW50ZWwgTkhNCSAyLjgKK0MgSW50ZWwgU0JSCSAyLjQKK0MgSW50ZWwgYXRvbQkgNS4zMworQyBWSUEgbmFubwkgMworCitDIE5PVEVTCitDICAqIEl0IG1pZ2h0IHNlZW0gbmF0dXJhbCB0byB1c2UgdGhlIGNtb3YgaW5zbiBoZXJlLCBidXQgc2luY2UgdGhpcyBmdW5jdGlvbgorQyAgICBpcyBzdXBwb3NlZCB0byBoYXZlIHRoZSBleGFjdCBzYW1lIGV4ZWN1dGlvbiBwYXR0ZXJuIGZvciBjbmQgdHJ1ZSBhbmQKK0MgICAgZmFsc2UsIGFuZCBzaW5jZSBjbW92J3MgZG9jdW1lbnRhdGlvbiBpcyBub3QgY2xlYXIgYWJvdXQgd2hldGhlciBpdAorQyAgICBhY3R1YWxseSByZWFkcyBib3RoIHNvdXJjZSBvcGVyYW5kcyBhbmQgd3JpdGVzIHRoZSByZWdpc3RlciBmb3IgYSBmYWxzZQorQyAgICBjb25kaXRpb24sIHdlIGNhbm5vdCB1c2UgaXQuCitDICAqIFR3byBjYXNlcyBjb3VsZCBiZSBvcHRpbWlzZWQ6ICgxKSBjbmRfYWRkX24gY291bGQgdXNlIEFEQ1NCQi1mcm9tLW1lbW9yeQorQyAgICB0byBzYXZlIG9uZSBpbnNuL2xpbWIsIGFuZCAoMikgd2hlbiB1cD1ycCBjbmRfYWRkX24gYW5kIGNuZF9zdWJfbiBjb3VsZCB1c2UKK0MgICAgQURDU0JCLXRvLW1lbW9yeSwgYWdhaW4gc2F2aW5nIDEgaW5zbi9saW1iLgorQyAgKiBUaGlzIHJ1bnMgb3B0aW1hbGx5IGF0IGRlY29kZXIgYmFuZHdpZHRoIG9uIEsxMC4gIEl0IGhhcyBub3QgYmVlbiB0dW5lZAorQyAgICBmb3IgYW55IG90aGVyIHByb2Nlc3Nvci4KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYGNuZCcsCWAlcmRpJykJZG5sIHJjeAorZGVmaW5lKGBycCcsCWAlcnNpJykJZG5sIHJkeAorZGVmaW5lKGB1cCcsCWAlcmR4JykJZG5sIHI4CitkZWZpbmUoYHZwJywJYCVyY3gnKQlkbmwgcjkKK2RlZmluZShgbicsCWAlcjgnKQlkbmwgcnNwKzQwCisKK2lmZGVmKGBPUEVSQVRJT05fY25kX2FkZF9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIGFkZCkKKwlkZWZpbmUoQURDU0JCLAkgICAgICBhZGMpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9jbmRfYWRkX24pJykKK2lmZGVmKGBPUEVSQVRJT05fY25kX3N1Yl9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIHN1YikKKwlkZWZpbmUoQURDU0JCLAkgICAgICBzYmIpCisJZGVmaW5lKGZ1bmMsCSAgICAgIG1wbl9jbmRfc3ViX24pJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fY25kX2FkZF9uIG1wbl9jbmRfc3ViX24pCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuYykKKwlGVU5DX0VOVFJZKDQpCitJRkRPUyhgCW1vdgk1NiglcnNwKSwgUjMyKCVyOCknKQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCisJbmVnCWNuZAorCXNiYgljbmQsIGNuZAkJQyBtYWtlIGNuZCBtYXNrCisKKwlsZWEJKHZwLG4sOCksIHZwCisJbGVhCSh1cCxuLDgpLCB1cAorCWxlYQkocnAsbiw4KSwgcnAKKworCW1vdglSMzIobiksIFIzMiglcmF4KQorCW5lZwluCisJYW5kCSQzLCBSMzIoJXJheCkKKwlqeglMKHRvcCkJCQlDIGNhcnJ5LXNhdmUgcmVnIHJheCA9IDAgaW4gdGhpcyBhcmMKKwljbXAJJDIsIFIzMiglcmF4KQorCWpjCUwoYjEpCisJanoJTChiMikKKworTChiMyk6CW1vdgkodnAsbiw4KSwgJXIxMgorCW1vdgk4KHZwLG4sOCksICVyMTMKKwltb3YJMTYodnAsbiw4KSwgJXIxNAorCWFuZAljbmQsICVyMTIKKwltb3YJKHVwLG4sOCksICVyMTAKKwlhbmQJY25kLCAlcjEzCisJbW92CTgodXAsbiw4KSwgJXJieAorCWFuZAljbmQsICVyMTQKKwltb3YJMTYodXAsbiw4KSwgJXJicAorCUFERFNVQgklcjEyLCAlcjEwCisJbW92CSVyMTAsIChycCxuLDgpCisJQURDU0JCCSVyMTMsICVyYngKKwltb3YJJXJieCwgOChycCxuLDgpCisJQURDU0JCCSVyMTQsICVyYnAKKwltb3YJJXJicCwgMTYocnAsbiw4KQorCXNiYglSMzIoJXJheCksIFIzMiglcmF4KQlDIHNhdmUgY2FycnkKKwlhZGQJJDMsIG4KKwlqcwlMKHRvcCkKKwlqbXAJTChlbmQpCisKK0woYjIpOgltb3YJKHZwLG4sOCksICVyMTIKKwltb3YJOCh2cCxuLDgpLCAlcjEzCisJbW92CSh1cCxuLDgpLCAlcjEwCisJYW5kCWNuZCwgJXIxMgorCW1vdgk4KHVwLG4sOCksICVyYngKKwlhbmQJY25kLCAlcjEzCisJQUREU1VCCSVyMTIsICVyMTAKKwltb3YJJXIxMCwgKHJwLG4sOCkKKwlBRENTQkIJJXIxMywgJXJieAorCW1vdgklcmJ4LCA4KHJwLG4sOCkKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIGNhcnJ5CisJYWRkCSQyLCBuCisJanMJTCh0b3ApCisJam1wCUwoZW5kKQorCitMKGIxKToJbW92CSh2cCxuLDgpLCAlcjEyCisJbW92CSh1cCxuLDgpLCAlcjEwCisJYW5kCWNuZCwgJXIxMgorCUFERFNVQgklcjEyLCAlcjEwCisJbW92CSVyMTAsIChycCxuLDgpCisJc2JiCVIzMiglcmF4KSwgUjMyKCVyYXgpCUMgc2F2ZSBjYXJyeQorCWFkZAkkMSwgbgorCWpucwlMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJKHZwLG4sOCksICVyMTIKKwltb3YJOCh2cCxuLDgpLCAlcjEzCisJbW92CTE2KHZwLG4sOCksICVyMTQKKwltb3YJMjQodnAsbiw4KSwgJXIxMQorCWFuZAljbmQsICVyMTIKKwltb3YJKHVwLG4sOCksICVyMTAKKwlhbmQJY25kLCAlcjEzCisJbW92CTgodXAsbiw4KSwgJXJieAorCWFuZAljbmQsICVyMTQKKwltb3YJMTYodXAsbiw4KSwgJXJicAorCWFuZAljbmQsICVyMTEKKwltb3YJMjQodXAsbiw4KSwgJXI5CisJYWRkCVIzMiglcmF4KSwgUjMyKCVyYXgpCUMgcmVzdG9yZSBjYXJyeQorCUFEQ1NCQgklcjEyLCAlcjEwCisJbW92CSVyMTAsIChycCxuLDgpCisJQURDU0JCCSVyMTMsICVyYngKKwltb3YJJXJieCwgOChycCxuLDgpCisJQURDU0JCCSVyMTQsICVyYnAKKwltb3YJJXJicCwgMTYocnAsbiw4KQorCUFEQ1NCQgklcjExLCAlcjkKKwltb3YJJXI5LCAyNChycCxuLDgpCisJc2JiCVIzMiglcmF4KSwgUjMyKCVyYXgpCUMgc2F2ZSBjYXJyeQorCWFkZAkkNCwgbgorCWpzCUwodG9wKQorCitMKGVuZCk6CW5lZwlSMzIoJXJheCkKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvY29tLmFzbSBiL21wbi94ODZfNjQvY29tLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJjNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9jb20uYXNtCkBAIC0wLDAgKzEsOTUgQEAKK2RubCAgQU1ENjQgbXBuX2NvbS4KKworZG5sICBDb3B5cmlnaHQgMjAwNC0yMDA2LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAxLjI1CitDIEFNRCBLMTAJIDEuMjUKK0MgSW50ZWwgUDQJIDIuNzgKK0MgSW50ZWwgY29yZTIJIDEuMQorQyBJbnRlbCBjb3JlaQkgMS41CitDIEludGVsIGF0b20JID8KK0MgVklBIG5hbm8JIDIKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJyxgJXJkaScpCitkZWZpbmUoYHVwJyxgJXJzaScpCitkZWZpbmUoYG4nLGAlcmR4JykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShtcG5fY29tKQorCUZVTkNfRU5UUlkoMykKKwltb3ZxCSh1cCksICVyOAorCW1vdmwJUjMyKCVyZHgpLCBSMzIoJXJheCkKKwlsZWFxCSh1cCxuLDgpLCB1cAorCWxlYXEJKHJwLG4sOCksIHJwCisJbmVncQluCisJYW5kbAkkMywgUjMyKCVyYXgpCisJamUJTChiMDApCisJY21wbAkkMiwgUjMyKCVyYXgpCisJamMJTChiMDEpCisJamUJTChiMTApCisKK0woYjExKToJbm90cQklcjgKKwltb3ZxCSVyOCwgKHJwLG4sOCkKKwlkZWNxCW4KKwlqbXAJTChlMTEpCitMKGIxMCk6CWFkZHEJJC0yLCBuCisJam1wCUwoZTEwKQorCS5ieXRlCTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCitMKGIwMSk6CW5vdHEJJXI4CisJbW92cQklcjgsIChycCxuLDgpCisJaW5jcQluCisJanoJTChyZXQpCisKK0wob29wKToJbW92cQkodXAsbiw4KSwgJXI4CitMKGIwMCk6CW1vdnEJOCh1cCxuLDgpLCAlcjkKKwlub3RxCSVyOAorCW5vdHEJJXI5CisJbW92cQklcjgsIChycCxuLDgpCisJbW92cQklcjksIDgocnAsbiw4KQorTChlMTEpOgltb3ZxCTE2KHVwLG4sOCksICVyOAorTChlMTApOgltb3ZxCTI0KHVwLG4sOCksICVyOQorCW5vdHEJJXI4CisJbm90cQklcjkKKwltb3ZxCSVyOCwgMTYocnAsbiw4KQorCW1vdnEJJXI5LCAyNChycCxuLDgpCisJYWRkcQkkNCwgbgorCWpuYwlMKG9vcCkKK0wocmV0KToJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvY29weWQuYXNtIGIvbXBuL3g4Nl82NC9jb3B5ZC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmOWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvY29weWQuYXNtCkBAIC0wLDAgKzEsOTMgQEAKK2RubCAgQU1ENjQgbXBuX2NvcHlkIC0tIGNvcHkgbGltYiB2ZWN0b3IsIGRlY3JlbWVudGluZy4KKworZG5sICBDb3B5cmlnaHQgMjAwMywgMjAwNSwgMjAwNywgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAxCitDIEFNRCBLMTAJIDEKK0MgQU1EIGJkMQkgMS4zNgorQyBBTUQgYm9iY2F0CSAxLjcxCitDIEludGVsIFA0CSAyLTMKK0MgSW50ZWwgY29yZTIJIDEKK0MgSW50ZWwgTkhNCSAxCitDIEludGVsIFNCUgkgMQorQyBJbnRlbCBhdG9tCSAyCitDIFZJQSBuYW5vCSAyCisKKworSUZTVEQoYGRlZmluZShgcnAnLGAlcmRpJyknKQorSUZTVEQoYGRlZmluZShgdXAnLGAlcnNpJyknKQorSUZTVEQoYGRlZmluZShgbicsIGAlcmR4JyknKQorCitJRkRPUyhgZGVmaW5lKGBycCcsYCVyY3gnKScpCitJRkRPUyhgZGVmaW5lKGB1cCcsYCVyZHgnKScpCitJRkRPUyhgZGVmaW5lKGBuJywgYCVyOCcpJykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oNjQpCitQUk9MT0dVRShtcG5fY29weWQpCisJbGVhCS04KHVwLG4sOCksIHVwCisJbGVhCShycCxuLDgpLCBycAorCXN1YgkkNCwgbgorCWpjCUwoZW5kKQorCW5vcAorCitMKHRvcCk6CW1vdgkodXApLCAlcmF4CisJbW92CS04KHVwKSwgJXI5CisJbGVhCS0zMihycCksIHJwCisJbW92CS0xNih1cCksICVyMTAKKwltb3YJLTI0KHVwKSwgJXIxMQorCWxlYQktMzIodXApLCB1cAorCW1vdgklcmF4LCAyNChycCkKKwltb3YJJXI5LCAxNihycCkKKwlzdWIJJDQsIG4KKwltb3YJJXIxMCwgOChycCkKKwltb3YJJXIxMSwgKHJwKQorCWpuYwlMKHRvcCkKKworTChlbmQpOglzaHIJUjMyKG4pCisJam5jCTFmCisJbW92CSh1cCksICVyYXgKKwltb3YJJXJheCwgLTgocnApCisJbGVhCS04KHJwKSwgcnAKKwlsZWEJLTgodXApLCB1cAorMToJc2hyCVIzMihuKQorCWpuYwkxZgorCW1vdgkodXApLCAlcmF4CisJbW92CS04KHVwKSwgJXI5CisJbW92CSVyYXgsIC04KHJwKQorCW1vdgklcjksIC0xNihycCkKKzE6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9jb3B5aS5hc20gYi9tcG4veDg2XzY0L2NvcHlpLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU4YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9jb3B5aS5hc20KQEAgLTAsMCArMSw5MiBAQAorZG5sICBBTUQ2NCBtcG5fY29weWkgLS0gY29weSBsaW1iIHZlY3RvciwgaW5jcmVtZW50aW5nLgorCitkbmwgIENvcHlyaWdodCAyMDAzLCAyMDA1LCAyMDA3LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDEKK0MgQU1EIEsxMAkgMQorQyBBTUQgYmQxCSAxLjM2CitDIEFNRCBib2JjYXQJIDEuNzEKK0MgSW50ZWwgUDQJIDItMworQyBJbnRlbCBjb3JlMgkgMQorQyBJbnRlbCBOSE0JIDEKK0MgSW50ZWwgU0JSCSAxCitDIEludGVsIGF0b20JIDIKK0MgVklBIG5hbm8JIDIKKworCitJRlNURChgZGVmaW5lKGBycCcsYCVyZGknKScpCitJRlNURChgZGVmaW5lKGB1cCcsYCVyc2knKScpCitJRlNURChgZGVmaW5lKGBuJywgYCVyZHgnKScpCisKK0lGRE9TKGBkZWZpbmUoYHJwJyxgJXJjeCcpJykKK0lGRE9TKGBkZWZpbmUoYHVwJyxgJXJkeCcpJykKK0lGRE9TKGBkZWZpbmUoYG4nLCBgJXI4JyknKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTig2NCkKKwkuYnl0ZQkwLDAsMCwwLDAsMAorUFJPTE9HVUUobXBuX2NvcHlpKQorCWxlYQktOChycCksIHJwCisJc3ViCSQ0LCBuCisJamMJTChlbmQpCisKK0wodG9wKToJbW92CSh1cCksICVyYXgKKwltb3YJOCh1cCksICVyOQorCWxlYQkzMihycCksIHJwCisJbW92CTE2KHVwKSwgJXIxMAorCW1vdgkyNCh1cCksICVyMTEKKwlsZWEJMzIodXApLCB1cAorCW1vdgklcmF4LCAtMjQocnApCisJbW92CSVyOSwgLTE2KHJwKQorCXN1YgkkNCwgbgorCW1vdgklcjEwLCAtOChycCkKKwltb3YJJXIxMSwgKHJwKQorCWpuYwlMKHRvcCkKKworTChlbmQpOglzaHIJUjMyKG4pCisJam5jCTFmCisJbW92CSh1cCksICVyYXgKKwltb3YJJXJheCwgOChycCkKKwlsZWEJOChycCksIHJwCisJbGVhCTgodXApLCB1cAorMToJc2hyCVIzMihuKQorCWpuYwkxZgorCW1vdgkodXApLCAlcmF4CisJbW92CTgodXApLCAlcjkKKwltb3YJJXJheCwgOChycCkKKwltb3YJJXI5LCAxNihycCkKKzE6CXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9kYXJ3aW4ubTQgYi9tcG4veDg2XzY0L2Rhcndpbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzcxNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9kYXJ3aW4ubTQKQEAgLTAsMCArMSw4MiBAQAorZGl2ZXJ0KC0xKQorZG5sICBDb3B5cmlnaHQgMjAwOCwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubAorZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitkZWZpbmUoYERBUldJTicpCisKK2RlZmluZShgTEVBJyxgZG5sCitpZmRlZihgUElDJywKKwlgbGVhCSQxKCVyaXApLCAkMicKKywKKwlgbW92YWJzCWAkJyQxLCAkMicpCisnKQorCitkbmwgIFVzYWdlOiBDQUxMKGZ1bmNuYW1lKQorZG5sCitkbmwgIFNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbiBpbiB4ODZfNjQtZGVmcy5tNC4KKworZGVmaW5lKGBDQUxMJyxgY2FsbAlHU1lNX1BSRUZJWGAnJDEnKQorZGVmaW5lKGBUQ0FMTCcsYGptcAlHU1lNX1BSRUZJWGAnJDEnKQorCisKK2RubCAgVXNhZ2U6IEpVTVBUQUJTRUNUCitkbmwKK2RubCAgQ0FVVElPTjogRG8gbm90IHB1dCBhbnl0aGluZyBzZW5zaWJsZSBoZXJlLCBsaWtlIFJPREFUQS4gIFRoYXQgd29ya3Mgd2l0aAorZG5sICBzb21lIERhcndpbiB0b29sIGNoYWlucywgYnV0IHNpbGVudGx5IGJyZWFrcyB3aXRoIG90aGVyLiAgKE5vdGUgdGhhdAorZG5sICBwdXR0aW5nIGp1bXAgdGFibGVzIGluIHRoZSB0ZXh0IHNlZ21lbnQgaXMgYSByZWFsbHkgcG9vciBpZGVhIGZvciBtYW55IFBDCitkbmwgIHByb2Nlc3NvcnMsIHNpbmNlIHRoZXkgY2Fubm90IGNhY2hlIHRoZSBzYW1lIHRoaW5nIGluIGJvdGggTDFEIGFuZCBMMkkuKQorCitkZWZpbmUoYEpVTVBUQUJTRUNUJywgYC50ZXh0JykKKworCitkbmwgIFVzYWdlOiBKTVBFTlQodGFyZ2xhYmVsLHRhYmxhYmVsKQorCitkZWZpbmUoYEpNUEVOVCcsYGRubAoraWZkZWYoYFBJQycsCisJYC5zZXQJJDFfdG1wLCAkMS0kMgorCS5sb25nCSQxX3RtcCcKKywKKwlgLnF1YWQJJDEnCispJykKKworZG5sICBUYXJnZXQgQUJJIG1hY3Jvcy4gIEZvciBEYXJ3aW4gd2Ugb3ZlcnJpZGUgSUZFTEYgKGFuZCBsZWF2ZSBkZWZhdWx0IGZvcgorZG5sICBJRkRPUyBhbmQgSUZTVEQpLgorCitkZWZpbmUoYElGRUxGJywgICBgJykKKworCitkbmwgIFVzYWdlOiBQUk9URUNUKHN5bWJvbCkKK2RubAorZG5sICBVc2VkIGZvciBwcml2YXRlIEdNUCBzeW1ib2xzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIG92ZXJyaWRkZW4gYnkgdXNlcnMuCitkbmwgIFRoaXMgY2FuIHNhdmUgcmVsb2MgZW50cmllcyBhbmQgaW1wcm92ZSBzaGxpYiBzaGFyaW5nIGFzIHdlbGwgYXMKK2RubCAgYXBwbGljYXRpb24gc3RhcnR1cCB0aW1lcworCitkZWZpbmUoYFBST1RFQ1QnLCAgYC5wcml2YXRlX2V4dGVybiAkMScpCisKKworZGl2ZXJ0YCdkbmwKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvZGl2X3FyXzFuX3BpMS5hc20gYi9tcG4veDg2XzY0L2Rpdl9xcl8xbl9waTEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzRmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2Rpdl9xcl8xbl9waTEuYXNtCkBAIC0wLDAgKzEsMjQ3IEBACitkbmwgIHg4Ni02NCBtcG5fZGl2X3FyXzFuX3BpMQorZG5sICAtLSBEaXZpZGUgYW4gbXBuIG51bWJlciBieSBhIG5vcm1hbGl6ZWQgc2luZ2xlLWxpbWIgbnVtYmVyLAorZG5sICAgICB1c2luZyBhIHNpbmdsZS1saW1iIGludmVyc2UuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE5pZWxzIE3DtmxsZXIKKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJCWMvbAorQyBBTUQgSzgsSzkJMTMKK0MgQU1EIEsxMAkxMworQyBBTUQgYnVsbAkxNi41CitDIEFNRCBwaWxlCTE1CitDIEFNRCBzdGVhbQkgPworQyBBTUQgYm9iY2F0CTE2CitDIEFNRCBqYWd1YXIJID8KK0MgSW50ZWwgUDQJNDcJcG9vcgorQyBJbnRlbCBjb3JlCTE5LjI1CitDIEludGVsIE5ITQkxOAorQyBJbnRlbCBTQlIJMTUJcG9vcgorQyBJbnRlbCBJQlIJMTMKK0MgSW50ZWwgSFdMCTExLjcKK0MgSW50ZWwgQldMCSA/CitDIEludGVsIGF0b20JNTIJdmVyeSBwb29yCitDIFZJQSBuYW5vCTE5CisKKworQyBJTlBVVCBQYXJhbWV0ZXJzCitkZWZpbmUoYFFQJywgYCVyZGknKQorZGVmaW5lKGBVUCcsIGAlcnNpJykKK2RlZmluZShgVU5fSU5QVVQnLCBgJXJkeCcpCitkZWZpbmUoYFUxJywgYCVyY3gnKQlDIEFsc28gaW4gJXJheAorZGVmaW5lKGBEJywgYCVyOCcpCitkZWZpbmUoYERJTlYnLCBgJXI5JykKKworQyBJbnZhcmlhbnRzCitkZWZpbmUoYEIyJywgYCVyYnAnKQorZGVmaW5lKGBCMm1kJywgYCVyYngnKQorCitDIFZhcmlhYmxlcworZGVmaW5lKGBVTicsIGAlcjgnKQlDIE92ZXJsYXBzIEQgaW5wdXQKK2RlZmluZShgVCcsIGAlcjEwJykKK2RlZmluZShgVTAnLCBgJXIxMScpCitkZWZpbmUoYFUyJywgYCVyMTInKQorZGVmaW5lKGBRMCcsIGAlcjEzJykKK2RlZmluZShgUTEnLCBgJXIxNCcpCitkZWZpbmUoYFEyJywgYCVyMTUnKQorCitBQklfU1VQUE9SVChTVEQ2NCkKKworCUFTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX2Rpdl9xcl8xbl9waTEpCisJRlVOQ19FTlRSWSg0KQorSUZET1MoYAltb3YJNTYoJXJzcCksICVyOAknKQorSUZET1MoYAltb3YJNjQoJXJzcCksICVyOQknKQorCWRlYwlVTl9JTlBVVAorCWpueglMKGZpcnN0KQorCisJQyBKdXN0IGEgc2luZ2xlIDIvMSBkaXZpc2lvbi4KKwlDIFQsIFUwIGFyZSBhbGxvY2F0ZWQgaW4gc2NyYXRjaCByZWdpc3RlcnMKKwlsZWEJMShVMSksIFQKKwltb3YJVTEsICVyYXgKKwltdWwJRElOVgorCW1vdgkoVVApLCBVMAorCWFkZAlVMCwgJXJheAorCWFkYwlULCAlcmR4CisJbW92CSVyZHgsIFQKKwlpbXVsCUQsICVyZHgKKwlzdWIJJXJkeCwgVTAKKwljbXAJVTAsICVyYXgKKwlsZWEJKFUwLCBEKSwgJXJheAorCWNtb3ZuYwlVMCwgJXJheAorCXNiYgkkMCwgVAorCWNtcAlELCAlcmF4CisJamMJTChzaW5nbGVfZGl2X2RvbmUpCisJc3ViCUQsICVyYXgKKwlhZGQJJDEsIFQKK0woc2luZ2xlX2Rpdl9kb25lKToKKwltb3YJVCwgKFFQKQorCUZVTkNfRVhJVCgpCisJcmV0CitMKGZpcnN0KToKKwlDIEZJWE1FOiBDb3VsZCBkZWxheSBzb21lIG9mIHRoZXNlIHVudGlsIHdlIGVudGVyIHRoZSBsb29wLgorCXB1c2gJJXIxNQorCXB1c2gJJXIxNAorCXB1c2gJJXIxMworCXB1c2gJJXIxMgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCisJbW92CUQsIEIyCisJaW11bAlESU5WLCBCMgorCW5lZwlCMgorCW1vdglCMiwgQjJtZAorCXN1YglELCBCMm1kCisKKwlDIEQgbm90IG5lZWRlZCB1bnRpbCBmaW5hbCByZWR1Y3Rpb24KKwlwdXNoCUQKKwltb3YJVU5fSU5QVVQsIFVOCUMgQ2xvYmJlcnMgRAorCisJbW92CURJTlYsICVyYXgKKwltdWwJVTEKKwltb3YJJXJheCwgUTAKKwlhZGQJVTEsICVyZHgKKwltb3YJJXJkeCwgVAorCisJbW92CUIyLCAlcmF4CisJbXVsCVUxCisJbW92CS04KFVQLCBVTiwgOCksIFUwCisJbW92CShVUCwgVU4sIDgpLCBVMQorCW1vdglULCAoUVAsIFVOLCA4KQorCWFkZAklcmF4LCBVMAorCWFkYwklcmR4LCBVMQorCXNiYglVMiwgVTIKKwlkZWMJVU4KKwltb3YJVTEsICVyYXgKKwlqeglMKGZpbmFsKQorCisJQUxJR04oMTYpCisKKwlDIExvb3AgaXMgMjggaW5zdHJ1Y3Rpb25zLCAzMCBkZWNvZGVyIHNsb3RzLCBzaG91bGQgcnVuIGluIDEwIGN5Y2xlcy4KKwlDIEF0IGVudHJ5LCAlcmF4IGhvbGRzIGFuIGV4dHJhIGNvcHkgb2YgVTEKK0wobG9vcCk6CisJQyB7UTIsIFExLCBRMH0gPC0tIERJTlYgKiBVMSArIEIgKFEwICsgVTIgRElOVikgKyBCXjIgVTIKKwlDIFJlbWFpbnMgdG8gYWRkIGluIEIgKFUxICsgYykKKwltb3YJRElOViwgUTEKKwltb3YJVTIsIFEyCisJYW5kCVUyLCBRMQorCW5lZwlRMgorCW11bAlESU5WCisJYWRkCSVyZHgsIFExCisJYWRjCSQwLCBRMgorCWFkZAlRMCwgUTEKKwltb3YJJXJheCwgUTAKKwltb3YJQjIsICVyYXgKKwlsZWEJKEIybWQsIFUwKSwgVAorCWFkYwkkMCwgUTIKKworCUMge1UyLCBVMSwgVTB9IDwtLSAoVTAgKyBVMiBCMiAtYyBVKSBCICsgVTEgQjIgKyB1CisJbXVsCVUxCisJYW5kCUIyLCBVMgorCWFkZAlVMiwgVTAKKwljbW92bmMJVTAsIFQKKworCUMge1FQK1VOLCAuLi59IDwtLSB7UVArVU4sIC4uLn0gKyB7UTIsIFExfSArIFUxICsgYworCWFkYwlVMSwgUTEKKwltb3YJLTgoVVAsIFVOLCA4KSwgVTAKKwlhZGMJUTIsIDgoUVAsIFVOLCA4KQorCWpjCUwocV9pbmNyKQorTChxX2luY3JfZG9uZSk6CisJYWRkCSVyYXgsIFUwCisJbW92CVQsICVyYXgKKwlhZGMJJXJkeCwgJXJheAorCW1vdglRMSwgKFFQLCBVTiwgOCkKKwlzYmIJVTIsIFUyCisJZGVjCVVOCisJbW92CSVyYXgsIFUxCisJam56CUwobG9vcCkKKworTChmaW5hbCk6CisJcG9wCUQKKworCW1vdglVMiwgUTEKKwlhbmQJRCwgVTIKKwlzdWIJVTIsICVyYXgKKwluZWcJUTEKKworCW1vdgklcmF4LCBVMQorCXN1YglELCAlcmF4CisJY21vdmMJVTEsICVyYXgKKwlzYmIJJC0xLCBRMQorCisJbGVhCTEoJXJheCksIFQKKwltdWwJRElOVgorCWFkZAlVMCwgJXJheAorCWFkYwlULCAlcmR4CisJbW92CSVyZHgsIFQKKwlpbXVsCUQsICVyZHgKKwlzdWIJJXJkeCwgVTAKKwljbXAJVTAsICVyYXgKKwlsZWEJKFUwLCBEKSwgJXJheAorCWNtb3ZuYwlVMCwgJXJheAorCXNiYgkkMCwgVAorCWNtcAlELCAlcmF4CisJamMJTChkaXZfZG9uZSkKKwlzdWIJRCwgJXJheAorCWFkZAkkMSwgVAorTChkaXZfZG9uZSk6CisJYWRkCVQsIFEwCisJbW92CVEwLCAoUVApCisJYWRjCVExLCA4KFFQKQorCWpuYwlMKGRvbmUpCitMKGZpbmFsX3FfaW5jcik6CisJYWRkcQkkMSwgMTYoUVApCisJbGVhCTgoUVApLCBRUAorCWpjCUwoZmluYWxfcV9pbmNyKQorCitMKGRvbmUpOgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXIxMgorCXBvcAklcjEzCisJcG9wCSVyMTQKKwlwb3AJJXIxNQorCUZVTkNfRVhJVCgpCisJcmV0CisKK0wocV9pbmNyKToKKwlDIFUxIGlzIG5vdCBsaXZlLCBzbyB1c2UgaXQgZm9yIGluZGV4aW5nCisJbGVhCTE2KFFQLCBVTiwgOCksIFUxCitMKHFfaW5jcl9sb29wKToKKwlhZGRxCSQxLCAoVTEpCisJam5jCUwocV9pbmNyX2RvbmUpCisJbGVhCTgoVTEpLCBVMQorCWptcAlMKHFfaW5jcl9sb29wKQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9kaXZfcXJfMm5fcGkxLmFzbSBiL21wbi94ODZfNjQvZGl2X3FyXzJuX3BpMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZjViMQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvZGl2X3FyXzJuX3BpMS5hc20KQEAgLTAsMCArMSwxNTggQEAKK2RubCAgeDg2LTY0IG1wbl9kaXZfcXJfMm5fcGkxCitkbmwgIC0tIERpdmlkZSBhbiBtcG4gbnVtYmVyIGJ5IGEgbm9ybWFsaXplZCAyLWxpbWIgbnVtYmVyLAorZG5sICAgICB1c2luZyBhIHNpbmdsZS1saW1iIGludmVyc2UuCisKK2RubCAgQ29weXJpZ2h0IDIwMDcsIDIwMDgsIDIwMTAtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJCWMvbAorQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHFwJywJCWAlcmRpJykKK2RlZmluZShgcnAnLAkJYCVyc2knKQorZGVmaW5lKGB1cF9wYXJhbScsCWAlcmR4JykKK2RlZmluZShgdW4nLAkJYCVyY3gnKQorZGVmaW5lKGBkMScsCQlgJXI4JykKK2RlZmluZShgZDAnLAkJYCVyOScpCitkZWZpbmUoYGRpX3BhcmFtJywJYDgoJXJzcCknKQorCitkZWZpbmUoYGRpJywJCWAlcjEwJykKK2RlZmluZShgdXAnLAkJYCVyMTEnKQorZGVmaW5lKGB1MicsCQlgJXJieCcpCitkZWZpbmUoYHUxJywJCWAlcjEyJykKK2RlZmluZShgdDEnLAkJYCVyMTMnKQorZGVmaW5lKGB0MCcsCQlgJXIxNCcpCitkZWZpbmUoYG1kMScsCQlgJXIxNScpCisKK0MgVE9ETworQyAqIFN0b3JlIHFoIGluIHRoZSBzYW1lIHN0YWNrIHNsb3QgYXMgZGlfcGFyYW0sIGluc3RlYWQgb2YgcHVzaGluZworQyAgIGl0LiAod2UgY291bGQgcHV0IGl0IGluIHJlZ2lzdGVyICVyYnAsIGJ1dCB0aGVuIHdlIHdvdWxkIG5lZWQgdG8KK0MgICBzYXZlIGFuZCByZXN0b3JlIHRoYXQgaW5zdGVhZCwgd2hpY2ggZG9lc24ndCBzZWVtIGxpa2UgYSB3aW4pLgorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9kaXZfcXJfMm5fcGkxKQorCUZVTkNfRU5UUlkoNCkKK0lGRE9TKGAJbW92CTU2KCVyc3ApLCAlcjgJJykKK0lGRE9TKGAJbW92CTY0KCVyc3ApLCAlcjkJJykKK0lGRE9TKGBkZWZpbmUoYGRpX3BhcmFtJywgYDcyKCVyc3ApJyknKQorCW1vdglkaV9wYXJhbSwgZGkKKwltb3YJdXBfcGFyYW0sIHVwCisJcHVzaAklcjE1CisJcHVzaAklcjE0CisJcHVzaAklcjEzCisJcHVzaAklcjEyCisJcHVzaAklcmJ4CisKKwltb3YJLTE2KHVwLCB1biwgOCksIHUxCisJbW92CS04KHVwLCB1biwgOCksIHUyCisKKwltb3YJdTEsIHQwCisJbW92CXUyLCB0MQorCXN1YglkMCwgdDAKKwlzYmIJZDEsIHQxCisJY21vdm5jICB0MCwgdTEKKwljbW92bmMJdDEsIHUyCisJQyBwdXNoIHFoIHdoaWNoIGlzICFjYXJyeQorCXNiYgklcmF4LCAlcmF4CisJaW5jCSVyYXgKKwlwdXNoCSVyYXgKKwlsZWEJLTIodW4pLCB1bgorCW1vdglkMSwgbWQxCisJbmVnCW1kMQorCisJam1wCUwobmV4dCkKKworCUFMSUdOKDE2KQorTChsb29wKToKKwlDIHVkaXZfcXJfM2J5MiAocSx1Mix1MSx1Mix1MSxuMCwgZDEsZDAsZGkpCisJQyBCYXNlZCBvbiB0aGUgb3B0aW1pemVkIGRpdnJlbV8yLmFzbSBjb2RlLgorCisJbW92CWRpLCAlcmF4CisJbXVsCXUyCisJbW92CXUxLCB0MAorCWFkZAklcmF4LCB0MAlDIHEwIGluIHQwCisJYWRjCXUyLCAlcmR4CisJbW92CSVyZHgsIHQxCUMgcSBpbiB0MQorCWltdWwJbWQxLCAlcmR4CisJbW92CWQwLCAlcmF4CisJbGVhCSglcmR4LCB1MSksIHUyCisJbXVsCXQxCisJbW92CSh1cCwgdW4sIDgpLCB1MQorCXN1YglkMCwgdTEKKwlzYmIJZDEsIHUyCisJc3ViCSVyYXgsIHUxCisJc2JiCSVyZHgsIHUyCisJeG9yCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJeG9yCVIzMiglcmR4KSwgUjMyKCVyZHgpCisJY21wCXQwLCB1MgorCWNtb3ZuYwlkMCwgJXJheAorCWNtb3ZuYwlkMSwgJXJkeAorCWFkYwkkMCwgdDEKKwlub3AKKwlhZGQJJXJheCwgdTEKKwlhZGMJJXJkeCwgdTIKKwljbXAJZDEsIHUyCisJamFlCUwoZml4KQorTChiY2spOgorCW1vdgl0MSwgKHFwLCB1biwgOCkKK0wobmV4dCk6CisJc3ViCSQxLCB1bgorCWpuYwlMKGxvb3ApCitMKGVuZCk6CisJbW92CXUyLCA4KHJwKQorCW1vdgl1MSwgKHJwKQorCisJQyBxaCBvbiBzdGFjaworCXBvcAklcmF4CisKKwlwb3AJJXJieAorCXBvcAklcjEyCisJcG9wCSVyMTMKKwlwb3AJJXIxNAorCXBvcAklcjE1CisJRlVOQ19FWElUKCkKKwlyZXQKKworTChmaXgpOglDIFVubGlrZWx5IHVwZGF0ZS4gdTIgPj0gZDEKKwlzZXRhCSVkbAorCWNtcAlkMCwgdTEKKwlzZXRhZQklYWwKKwlvcmIJJWRsLCAlYWwJCUMgIm9yYiIgZm9ybSB0byBwbGFjYXRlIFN1biB0b29scworCWplCUwoYmNrKQorCWluYwl0MQorCXN1YglkMCwgdTEKKwlzYmIJZDEsIHUyCisJam1wCUwoYmNrKQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9kaXZfcXJfMnVfcGkxLmFzbSBiL21wbi94ODZfNjQvZGl2X3FyXzJ1X3BpMS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2MWZkNAotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvZGl2X3FyXzJ1X3BpMS5hc20KQEAgLTAsMCArMSwyMDAgQEAKK2RubCAgeDg2LTY0IG1wbl9kaXZfcXJfMnVfcGkxCitkbmwgIC0tIERpdmlkZSBhbiBtcG4gbnVtYmVyIGJ5IGFuIHVubm9ybWFsaXplZCAyLWxpbWIgbnVtYmVyLAorZG5sICAgICB1c2luZyBhIHNpbmdsZS1saW1iIGludmVyc2UgYW5kIHNoaWZ0aW5nIHRoZSBkaXZpZGVuZCBvbiB0aGUgZmx5LgorCitkbmwgIENvcHlyaWdodCAyMDA3LCAyMDA4LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkJYy9sCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcXAnLAkJYCVyZGknKQorZGVmaW5lKGBycCcsCQlgJXJzaScpCitkZWZpbmUoYHVwX3BhcmFtJywJYCVyZHgnKQorZGVmaW5lKGB1bl9wYXJhbScsCWAlcmN4JykgZG5sICVyY3ggbmVlZGVkIGZvciBzaGlmdCBjb3VudAorZGVmaW5lKGBkMScsCQlgJXI4JykKK2RlZmluZShgZDAnLAkJYCVyOScpCitkZWZpbmUoYHNoaWZ0X3BhcmFtJywJYEZSQU1FKzgoJXJzcCknKQorZGVmaW5lKGBkaV9wYXJhbScsCWBGUkFNRSsxNiglcnNwKScpCisKK2RlZmluZShgZGknLAkJYCVyMTAnKQorZGVmaW5lKGB1cCcsCQlgJXIxMScpCitkZWZpbmUoYHVuJywJCWAlcmJwJykKK2RlZmluZShgdTInLAkJYCVyYngnKQorZGVmaW5lKGB1MScsCQlgJXIxMicpCitkZWZpbmUoYHUwJywJCWAlcnNpJykgZG5sIFNhbWUgYXMgcnAsIHdoaWNoIGlzIHNhdmVkIGFuZCByZXN0b3JlZC4KK2RlZmluZShgdDEnLAkJYCVyMTMnKQorZGVmaW5lKGB0MCcsCQlgJXIxNCcpCitkZWZpbmUoYG1kMScsCQlgJXIxNScpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorZGVmbGl0KGBGUkFNRScsIDApCitQUk9MT0dVRShtcG5fZGl2X3FyXzJ1X3BpMSkKKwltb3YJZGlfcGFyYW0sIGRpCisJbW92CXVwX3BhcmFtLCB1cAorCXB1c2gJJXIxNQorCXB1c2gJJXIxNAorCXB1c2gJJXIxMworCXB1c2gJJXIxMgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJcnAKK2RlZmxpdChgRlJBTUUnLCA1NikKKwlsZWEJLTIodW5fcGFyYW0pLCB1bgorCW1vdglkMSwgbWQxCisJbmVnCW1kMQorCisJQyBpbnQgcGFyYW1ldGVyLCAzMiBiaXRzIG9ubHkKKwltb3ZsCXNoaWZ0X3BhcmFtLCBSMzIoJXJjeCkKKworCUMgRklYTUU6IERpZmZlcmVudCBjb2RlIGZvciBTSExEX1NMT1cKKworCXhvcglSMzIodTIpLCBSMzIodTIpCisJbW92CTgodXAsIHVuLCA4KSwgdTEKKwlzaGxkCSVjbCwgdTEsIHUyCisJQyBSZW1haW5zIHRvIHJlYWQgKHVwLCB1biwgOCkgYW5kIHNoaWZ0IHUxLCB1MAorCUMgdWRpdl9xcl8zYnkyIChxaCx1Mix1MSx1Mix1MSxuMCwgZDEsZDAsZGkpCisJbW92CWRpLCAlcmF4CisJbXVsCXUyCisJbW92CSh1cCwgdW4sIDgpLCB1MAorCXNobGQJJWNsLCB1MCwgdTEKKwltb3YJdTEsIHQwCisJYWRkCSVyYXgsIHQwCUMgcTAgaW4gdDAKKwlhZGMJdTIsICVyZHgKKwltb3YJJXJkeCwgdDEJQyBxIGluIHQxCisJaW11bAltZDEsICVyZHgKKwltb3YJZDAsICVyYXgKKwlsZWEJKCVyZHgsIHUxKSwgdTIKKwltdWwJdDEKKwltb3YJdTAsIHUxCisJc2hsCSVjbCwgdTEKKwlzdWIJZDAsIHUxCisJc2JiCWQxLCB1MgorCXN1YgklcmF4LCB1MQorCXNiYgklcmR4LCB1MgorCXhvcglSMzIoJXJheCksIFIzMiglcmF4KQorCXhvcglSMzIoJXJkeCksIFIzMiglcmR4KQorCWNtcAl0MCwgdTIKKwljbW92bmMJZDAsICVyYXgKKwljbW92bmMJZDEsICVyZHgKKwlhZGMJJDAsIHQxCisJbm9wCisJYWRkCSVyYXgsIHUxCisJYWRjCSVyZHgsIHUyCisJY21wCWQxLCB1MgorCWphZQlMKGZpeF9xaCkKK0woYmNrX3FoKToKKwlwdXNoCXQxCUMgcHVzaCBxaCBvbiBzdGFjaworCisJam1wCUwobmV4dCkKKworCUFMSUdOKDE2KQorTChsb29wKToKKwlDIHVkaXZfcXJfM2J5MiAocSx1Mix1MSx1Mix1MSxuMCwgZDEsZDAsZGkpCisJQyBCYXNlZCBvbiB0aGUgb3B0aW1pemVkIGRpdnJlbV8yLmFzbSBjb2RlLgorCisJbW92CWRpLCAlcmF4CisJbXVsCXUyCisJbW92CSh1cCwgdW4sIDgpLCB1MAorCXhvcglSMzIodDEpLCBSMzIodDEpCisJc2hsZAklY2wsIHUwLCB0MQorCW9yCXQxLCB1MQorCW1vdgl1MSwgdDAKKwlhZGQJJXJheCwgdDAJQyBxMCBpbiB0MAorCWFkYwl1MiwgJXJkeAorCW1vdgklcmR4LCB0MQlDIHEgaW4gdDEKKwlpbXVsCW1kMSwgJXJkeAorCW1vdglkMCwgJXJheAorCWxlYQkoJXJkeCwgdTEpLCB1MgorCW11bAl0MQorCW1vdgl1MCwgdTEKKwlzaGwJJWNsLCB1MQorCXN1YglkMCwgdTEKKwlzYmIJZDEsIHUyCisJc3ViCSVyYXgsIHUxCisJc2JiCSVyZHgsIHUyCisJeG9yCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJeG9yCVIzMiglcmR4KSwgUjMyKCVyZHgpCisJY21wCXQwLCB1MgorCWNtb3ZuYwlkMCwgJXJheAorCWNtb3ZuYwlkMSwgJXJkeAorCWFkYwkkMCwgdDEKKwlub3AKKwlhZGQJJXJheCwgdTEKKwlhZGMJJXJkeCwgdTIKKwljbXAJZDEsIHUyCisJamFlCUwoZml4KQorTChiY2spOgorCW1vdgl0MSwgKHFwLCB1biwgOCkKK0wobmV4dCk6CisJc3ViCSQxLCB1bgorCWpuYwlMKGxvb3ApCitMKGVuZCk6CisJQyBxaCBvbiBzdGFjaworCXBvcAklcmF4CisJcG9wCXJwCisJc2hyZAklY2wsIHUyLCB1MQorCXNocgklY2wsIHUyCisJbW92CXUyLCA4KHJwKQorCW1vdgl1MSwgKHJwKQorCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcjEyCisJcG9wCSVyMTMKKwlwb3AJJXIxNAorCXBvcAklcjE1CisJcmV0CisKK0woZml4KToJQyBVbmxpa2VseSB1cGRhdGUuIHUyID49IGQxCisJc2V0YQklZGwKKwljbXAJZDAsIHUxCisJc2V0YWUJJWFsCisJb3JiCSVkbCwgJWFsCQlDICJvcmIiIGZvcm0gdG8gcGxhY2F0ZSBTdW4gdG9vbHMKKwlqZQlMKGJjaykKKwlpbmMJdDEKKwlzdWIJZDAsIHUxCisJc2JiCWQxLCB1MgorCWptcAlMKGJjaykKKworQyBEdXBsaWNhdGVkLCBqdXN0IGp1bXBpbmcgYmFjayB0byBhIGRpZmZlcmVudCBhZGRyZXNzLgorTChmaXhfcWgpOglDIFVubGlrZWx5IHVwZGF0ZS4gdTIgPj0gZDEKKwlzZXRhCSVkbAorCWNtcAlkMCwgdTEKKwlzZXRhZQklYWwKKwlvcmIJJWRsLCAlYWwJCUMgIm9yYiIgZm9ybSB0byBwbGFjYXRlIFN1biB0b29scworCWplCUwoYmNrX3FoKQorCWluYwl0MQorCXN1YglkMCwgdTEKKwlzYmIJZDEsIHUyCisJam1wCUwoYmNrX3FoKQorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9kaXZlXzEuYXNtIGIvbXBuL3g4Nl82NC9kaXZlXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTMwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2RpdmVfMS5hc20KQEAgLTAsMCArMSwxNTggQEAKK2RubCAgQU1ENjQgbXBuX2RpdmV4YWN0XzEgLS0gbXBuIGJ5IGxpbWIgZXhhY3QgZGl2aXNpb24uCisKK2RubCAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQtMjAwNiwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJMTAKK0MgQU1EIEsxMAkxMAorQyBJbnRlbCBQNAkzMworQyBJbnRlbCBjb3JlMgkxMy4yNQorQyBJbnRlbCBjb3JlaQkxNAorQyBJbnRlbCBhdG9tCTQyCitDIFZJQSBuYW5vCTQzCisKK0MgQSBxdWljayBhZG9wdGlvbiBvZiB0aGUgMzItYml0IEs3IGNvZGUuCisKKworQyBJTlBVVCBQQVJBTUVURVJTCitDIHJwCQlyZGkKK0MgdXAJCXJzaQorQyBuCQlyZHgKK0MgZGl2aXNvcglyY3gKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fZGl2ZXhhY3RfMSkKKwlGVU5DX0VOVFJZKDQpCisJcHVzaAklcmJ4CisKKwltb3YJJXJjeCwgJXJheAorCXhvcglSMzIoJXJjeCksIFIzMiglcmN4KQlDIHNoaWZ0IGNvdW50CisJbW92CSVyZHgsICVyOAorCisJYnQJJDAsIFIzMiglcmF4KQorCWpuYwlMKGV2bikJCQlDIHNraXAgYnNmcSB1bmxlc3MgZGl2aXNvciBpcyBldmVuCisKK0wob2RkKToJbW92CSVyYXgsICVyYngKKwlzaHIJUjMyKCVyYXgpCisJYW5kCSQxMjcsIFIzMiglcmF4KQkJQyBkLzIsIDcgYml0cworCisJTEVBKAliaW52ZXJ0X2xpbWJfdGFibGUsICVyZHgpCisKKwltb3Z6YmwJKCVyZHgsJXJheCksIFIzMiglcmF4KQlDIGludiA4IGJpdHMKKworCW1vdgklcmJ4LCAlcjExCQlDIGQgd2l0aG91dCB0d29zCisKKwlsZWEJKCVyYXgsJXJheCksIFIzMiglcmR4KQlDIDIqaW52CisJaW11bAlSMzIoJXJheCksIFIzMiglcmF4KQlDIGludippbnYKKwlpbXVsCVIzMiglcmJ4KSwgUjMyKCVyYXgpCUMgaW52KmludipkCisJc3ViCVIzMiglcmF4KSwgUjMyKCVyZHgpCUMgaW52ID0gMippbnYgLSBpbnYqaW52KmQsIDE2IGJpdHMKKworCWxlYQkoJXJkeCwlcmR4KSwgUjMyKCVyYXgpCUMgMippbnYKKwlpbXVsCVIzMiglcmR4KSwgUjMyKCVyZHgpCUMgaW52KmludgorCWltdWwJUjMyKCVyYngpLCBSMzIoJXJkeCkJQyBpbnYqaW52KmQKKwlzdWIJUjMyKCVyZHgpLCBSMzIoJXJheCkJQyBpbnYgPSAyKmludiAtIGludippbnYqZCwgMzIgYml0cworCisJbGVhCSglcmF4LCVyYXgpLCAlcjEwCUMgMippbnYKKwlpbXVsCSVyYXgsICVyYXgJCUMgaW52KmludgorCWltdWwJJXJieCwgJXJheAkJQyBpbnYqaW52KmQKKwlzdWIJJXJheCwgJXIxMAkJQyBpbnYgPSAyKmludiAtIGludippbnYqZCwgNjQgYml0cworCisJbGVhCSglcnNpLCVyOCw4KSwgJXJzaQlDIHVwIGVuZAorCWxlYQktOCglcmRpLCVyOCw4KSwgJXJkaQlDIHJwIGVuZAorCW5lZwklcjgJCQlDIC1uCisKKwltb3YJKCVyc2ksJXI4LDgpLCAlcmF4CUMgdXBbMF0KKworCWluYwklcjgKKwlqeglMKG9uZSkKKworCW1vdgkoJXJzaSwlcjgsOCksICVyZHgJQyB1cFsxXQorCisJc2hyZAlSOCglcmN4KSwgJXJkeCwgJXJheAorCisJeG9yCVIzMiglcmJ4KSwgUjMyKCVyYngpCisJam1wCUwoZW50KQorCitMKGV2bik6CWJzZgklcmF4LCAlcmN4CisJc2hyCVI4KCVyY3gpLCAlcmF4CisJam1wCUwob2RkKQorCisJQUxJR04oOCkKK0wodG9wKToKKwlDIHJheAlxCisJQyByYngJY2FycnkgYml0LCAwIG9yIDEKKwlDIHJjeAlzaGlmdAorCUMgcmR4CisJQyByc2kJdXAgZW5kCisJQyByZGkJcnAgZW5kCisJQyByOAljb3VudGVyLCBsaW1icywgbmVnYXRpdmUKKwlDIHIxMAlkXigtMSkgbW9kIDJeNjQKKwlDIHIxMQlkLCBzaGlmdGVkIGRvd24KKworCW11bAklcjExCQkJQyBjYXJyeSBsaW1iIGluIHJkeAkwIDEwCisJbW92CS04KCVyc2ksJXI4LDgpLCAlcmF4CUMKKwltb3YJKCVyc2ksJXI4LDgpLCAlcjkJQworCXNocmQJUjgoJXJjeCksICVyOSwgJXJheAlDCisJbm9wCQkJCUMKKwlzdWIJJXJieCwgJXJheAkJQyBhcHBseSBjYXJyeSBiaXQKKwlzZXRjCSVibAkJCUMKKwlzdWIJJXJkeCwgJXJheAkJQyBhcHBseSBjYXJyeSBsaW1iCTUKKwlhZGMJJDAsICVyYngJCUMJCQk2CitMKGVudCk6CWltdWwJJXIxMCwgJXJheAkJQwkJCTYKKwltb3YJJXJheCwgKCVyZGksJXI4LDgpCUMKKwlpbmMJJXI4CQkJQworCWpueglMKHRvcCkKKworCW11bAklcjExCQkJQyBjYXJyeSBsaW1iIGluIHJkeAorCW1vdgktOCglcnNpKSwgJXJheAkJQyB1cCBoaWdoIGxpbWIKKwlzaHIJUjgoJXJjeCksICVyYXgKKwlzdWIJJXJieCwgJXJheAkJQyBhcHBseSBjYXJyeSBiaXQKKwlzdWIJJXJkeCwgJXJheAkJQyBhcHBseSBjYXJyeSBsaW1iCisJaW11bAklcjEwLCAlcmF4CisJbW92CSVyYXgsICglcmRpKQorCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKKworTChvbmUpOglzaHIJUjgoJXJjeCksICVyYXgKKwlpbXVsCSVyMTAsICVyYXgKKwltb3YJJXJheCwgKCVyZGkpCisJcG9wCSVyYngKKwlGVU5DX0VYSVQoKQorCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2RpdnJlbV8xLmFzbSBiL21wbi94ODZfNjQvZGl2cmVtXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2UzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2RpdnJlbV8xLmFzbQpAQCAtMCwwICsxLDMxNCBAQAorZG5sICB4ODYtNjQgbXBuX2RpdnJlbV8xIC0tIG1wbiBieSBsaW1iIGRpdmlzaW9uLgorCitkbmwgIENvcHlyaWdodCAyMDA0LCAyMDA1LCAyMDA3LTIwMTIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCQlub3JtCXVub3JtCWZyYWMKK0MgQU1EIEs4LEs5CTEzCTEzCTEyCitDIEFNRCBLMTAJMTMJMTMJMTIKK0MgSW50ZWwgUDQJNDMJNDQJNDMKK0MgSW50ZWwgY29yZTIJMjQuNQkyNC41CTE5LjUKK0MgSW50ZWwgY29yZWkJMjAuNQkxOS41CTE4CitDIEludGVsIGF0b20JNDMJNDYJMzYKK0MgVklBIG5hbm8JMjUuNQkyNS41CTI0CisKK0MgbXBfbGltYl90CitDIG1wbl9kaXZyZW1fMSAobXBfcHRyIHFwLCBtcF9zaXplX3QgZm4sCitDICAgICAgICAgICAgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sIG1wX2xpbWJfdCBkKQorCitDIG1wX2xpbWJfdAorQyBtcG5fcHJlaW52X2RpdnJlbV8xIChtcF9wdHIgcXAsIG1wX3NpemVfdCBmbiwKK0MgICAgICAgICAgICAgICAgICAgICAgbXBfc3JjcHRyIG5wLCBtcF9zaXplX3Qgbm4sIG1wX2xpbWJfdCBkLAorQyAgICAgICAgICAgICAgICAgICAgICBtcF9saW1iX3QgZGludiwgaW50IGNudCkKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHFwJywJCWAlcmRpJykKK2RlZmluZShgZm5fcGFyYW0nLAlgJXJzaScpCitkZWZpbmUoYHVwX3BhcmFtJywJYCVyZHgnKQorZGVmaW5lKGB1bl9wYXJhbScsCWAlcmN4JykKK2RlZmluZShgZCcsCQlgJXI4JykKK2RlZmluZShgZGludicsCQlgJXI5JykJCUMgb25seSBmb3IgbXBuX3ByZWludl9kaXZyZW1fMQorQyAgICAgICBzaGlmdCBwYXNzZWQgb24gc3RhY2sJCUMgb25seSBmb3IgbXBuX3ByZWludl9kaXZyZW1fMQorCitkZWZpbmUoYGNudCcsCQlgJXJjeCcpCitkZWZpbmUoYHVwJywJCWAlcnNpJykKK2RlZmluZShgZm4nLAkJYCVyMTInKQorZGVmaW5lKGB1bicsCQlgJXJieCcpCisKKworQyByYXggcmJ4IHJjeCByZHggcnNpIHJkaSByYnAgcjggIHI5ICByMTAgcjExIHIxMiByMTMgcjE0IHIxNQorQyAgICAgICAgIGNudCAgICAgICAgIHFwICAgICAgZCAgZGludgorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitJRlNURChgZGVmaW5lKGBDTlRPRkYnLAkJYDQwKCQxKScpJykKK0lGRE9TKGBkZWZpbmUoYENOVE9GRicsCQlgMTA0KCQxKScpJykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fcHJlaW52X2RpdnJlbV8xKQorCUZVTkNfRU5UUlkoNCkKK0lGRE9TKGAJbW92CTU2KCVyc3ApLCAlcjgJJykKK0lGRE9TKGAJbW92CTY0KCVyc3ApLCAlcjkJJykKKwl4b3IJUjMyKCVyYXgpLCBSMzIoJXJheCkKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTIKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKworCW1vdglmbl9wYXJhbSwgZm4KKwltb3YJdW5fcGFyYW0sIHVuCisJYWRkCWZuX3BhcmFtLCB1bl9wYXJhbQorCW1vdgl1cF9wYXJhbSwgdXAKKworCWxlYQktOChxcCx1bl9wYXJhbSw4KSwgcXAKKworCXRlc3QJZCwgZAorCWpzCUwobmVudCkKKworCW1vdglDTlRPRkYoJXJzcCksIFI4KGNudCkKKwlzaGwJUjgoY250KSwgZAorCWptcAlMKHVlbnQpCitFUElMT0dVRSgpCisKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9kaXZyZW1fMSkKKwlGVU5DX0VOVFJZKDQpCitJRkRPUyhgCW1vdgk1NiglcnNwKSwgJXI4CScpCisJeG9yCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJcHVzaAklcjEzCisJcHVzaAklcjEyCisJcHVzaAklcmJwCisJcHVzaAklcmJ4CisKKwltb3YJZm5fcGFyYW0sIGZuCisJbW92CXVuX3BhcmFtLCB1bgorCWFkZAlmbl9wYXJhbSwgdW5fcGFyYW0KKwltb3YJdXBfcGFyYW0sIHVwCisJamUJTChyZXQpCisKKwlsZWEJLTgocXAsdW5fcGFyYW0sOCksIHFwCisJeG9yCVIzMiglcmJwKSwgUjMyKCVyYnApCisKKwl0ZXN0CWQsIGQKKwlqbnMJTCh1bm5vcm1hbGl6ZWQpCisKK0wobm9ybWFsaXplZCk6CisJdGVzdAl1biwgdW4KKwlqZQlMKDgpCQkJQyB1biA9PSAwCisJbW92CS04KHVwLHVuLDgpLCAlcmJwCisJZGVjCXVuCisJbW92CSVyYnAsICVyYXgKKwlzdWIJZCwgJXJicAorCWNtb3ZjCSVyYXgsICVyYnAKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkKKwlpbmMJUjMyKCVyYXgpCisJbW92CSVyYXgsIChxcCkKKwlsZWEJLTgocXApLCBxcAorTCg4KToKK0lGU1REKGAJcHVzaAklcmRpCQknKQorSUZTVEQoYAlwdXNoCSVyc2kJCScpCisJcHVzaAklcjgKK0lGU1REKGAJbW92CWQsICVyZGkJCScpCitJRkRPUyhgCXN1YgkkMzIsICVyc3AJJykKK0lGRE9TKGAJbW92CWQsICVyY3gJCScpCisJQVNTRVJUKG56LCBgdGVzdCAkMTUsICVyc3AnKQorCUNBTEwoCW1wbl9pbnZlcnRfbGltYikKK0lGRE9TKGAJYWRkCSQzMiwgJXJzcAknKQorCXBvcAklcjgKK0lGU1REKGAJcG9wCSVyc2kJCScpCitJRlNURChgCXBvcAklcmRpCQknKQorCisJbW92CSVyYXgsIGRpbnYKKwltb3YJJXJicCwgJXJheAorCWptcAlMKG5lbnQpCisKKwlBTElHTigxNikKK0wobnRvcCk6bW92CSh1cCx1biw4KSwgJXIxMAkJQwkgICAgSzgtSzEwICBQNi1DTlIgUDYtTkhNICBQNAorCW11bAlkaW52CQkJQwkgICAgICAwLDEzICAgMCwyMCAgIDAsMTggICAwLDQ1CisJYWRkCSVyMTAsICVyYXgJCUMJICAgICAgNCAgICAgIDggICAgICAzICAgICAxMgorCWFkYwklcmJwLCAlcmR4CQlDCSAgICAgIDUgICAgICA5ICAgICAxMCAgICAgMTMKKwltb3YJJXJheCwgJXJicAkJQwkgICAgICA1ICAgICAgOSAgICAgIDQgICAgIDEzCisJbW92CSVyZHgsICVyMTMJCUMJICAgICAgNiAgICAgMTEgICAgIDEyICAgICAyMworCWltdWwJZCwgJXJkeAkJCUMJICAgICAgNiAgICAgMTEgICAgIDExICAgICAyMworCXN1YgklcmR4LCAlcjEwCQlDCSAgICAgMTAgICAgIDE2ICAgICAxNCAgICAgMzMKKwltb3YJZCwgJXJheAkJCUMKKwlhZGQJJXIxMCwgJXJheAkJQwkgICAgIDExICAgICAxNyAgICAgMTUgICAgIDM0CisJY21wCSVyYnAsICVyMTAJCUMJICAgICAxMSAgICAgMTcgICAgIDE1ICAgICAzNAorCWNtb3ZjCSVyMTAsICVyYXgJCUMJICAgICAxMiAgICAgMTggICAgIDE2ICAgICAzNQorCWFkYwkkLTEsICVyMTMJCUMKKwljbXAJZCwgJXJheAkJCUMKKwlqYWUJTChuZngpCQkJQworTChub2spOgltb3YJJXIxMywgKHFwKQkJQworCXN1YgkkOCwgcXAJCQlDCitMKG5lbnQpOmxlYQkxKCVyYXgpLCAlcmJwCQlDCisJZGVjCXVuCQkJQworCWpucwlMKG50b3ApCQkJQworCisJeG9yCVIzMiglcmN4KSwgUjMyKCVyY3gpCisJam1wCUwoZnJhYykKKworTChuZngpOglzdWIJZCwgJXJheAorCWluYwklcjEzCisJam1wCUwobm9rKQorCitMKHVubm9ybWFsaXplZCk6CisJdGVzdAl1biwgdW4KKwlqZQlMKDQ0KQorCW1vdgktOCh1cCx1biw4KSwgJXJheAorCWNtcAlkLCAlcmF4CisJamFlCUwoNDQpCisJbW92CSVyYnAsIChxcCkKKwltb3YJJXJheCwgJXJicAorCWxlYQktOChxcCksIHFwCisJamUJTChyZXQpCisJZGVjCXVuCitMKDQ0KToKKwlic3IJZCwgJXJjeAorCW5vdAlSMzIoJXJjeCkKKwlzaGwJUjgoJXJjeCksIGQKKwlzaGwJUjgoJXJjeCksICVyYnAKKworCXB1c2gJJXJjeAorSUZTVEQoYAlwdXNoCSVyZGkJCScpCitJRlNURChgCXB1c2gJJXJzaQkJJykKKwlwdXNoCSVyOAorSUZTVEQoYAlzdWIJJDgsICVyc3AJJykKK0lGU1REKGAJbW92CWQsICVyZGkJCScpCitJRkRPUyhgCXN1YgkkNDAsICVyc3AJJykKK0lGRE9TKGAJbW92CWQsICVyY3gJCScpCisJQVNTRVJUKG56LCBgdGVzdCAkMTUsICVyc3AnKQorCUNBTEwoCW1wbl9pbnZlcnRfbGltYikKK0lGU1REKGAJYWRkCSQ4LCAlcnNwCScpCitJRkRPUyhgCWFkZAkkNDAsICVyc3AJJykKKwlwb3AJJXI4CitJRlNURChgCXBvcAklcnNpCQknKQorSUZTVEQoYAlwb3AJJXJkaQkJJykKKwlwb3AJJXJjeAorCisJbW92CSVyYXgsIGRpbnYKKwltb3YJJXJicCwgJXJheAorCXRlc3QJdW4sIHVuCisJamUJTChmcmFjKQorCitMKHVlbnQpOmRlYwl1bgorCW1vdgkodXAsdW4sOCksICVyYnAKKwluZWcJUjMyKCVyY3gpCisJc2hyCVI4KCVyY3gpLCAlcmJwCisJbmVnCVIzMiglcmN4KQorCW9yCSVyYnAsICVyYXgKKwlqbXAJTChlbnQpCisKKwlBTElHTigxNikKK0wodXRvcCk6bW92CSh1cCx1biw4KSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXJicAorCW5lZwlSMzIoJXJjeCkKKwlzaHIJUjgoJXJjeCksICVyMTAKKwluZWcJUjMyKCVyY3gpCisJb3IJJXIxMCwgJXJicAorCW11bAlkaW52CisJYWRkCSVyYnAsICVyYXgKKwlhZGMJJXIxMSwgJXJkeAorCW1vdgklcmF4LCAlcjExCisJbW92CSVyZHgsICVyMTMKKwlpbXVsCWQsICVyZHgKKwlzdWIJJXJkeCwgJXJicAorCW1vdglkLCAlcmF4CisJYWRkCSVyYnAsICVyYXgKKwljbXAJJXIxMSwgJXJicAorCWNtb3ZjCSVyYnAsICVyYXgKKwlhZGMJJC0xLCAlcjEzCisJY21wCWQsICVyYXgKKwlqYWUJTCh1ZngpCitMKHVvayk6CW1vdgklcjEzLCAocXApCisJc3ViCSQ4LCBxcAorTChlbnQpOgltb3YJKHVwLHVuLDgpLCAlcmJwCisJZGVjCXVuCisJbGVhCTEoJXJheCksICVyMTEKKwlqbnMJTCh1dG9wKQorCitMKHVlbmQpOnNobAlSOCglcmN4KSwgJXJicAorCW11bAlkaW52CisJYWRkCSVyYnAsICVyYXgKKwlhZGMJJXIxMSwgJXJkeAorCW1vdgklcmF4LCAlcjExCisJbW92CSVyZHgsICVyMTMKKwlpbXVsCWQsICVyZHgKKwlzdWIJJXJkeCwgJXJicAorCW1vdglkLCAlcmF4CisJYWRkCSVyYnAsICVyYXgKKwljbXAJJXIxMSwgJXJicAorCWNtb3ZjCSVyYnAsICVyYXgKKwlhZGMJJC0xLCAlcjEzCisJY21wCWQsICVyYXgKKwlqYWUJTChlZngpCitMKGVvayk6CW1vdgklcjEzLCAocXApCisJc3ViCSQ4LCBxcAorCWptcAlMKGZyYWMpCisKK0wodWZ4KToJc3ViCWQsICVyYXgKKwlpbmMJJXIxMworCWptcAlMKHVvaykKK0woZWZ4KToJc3ViCWQsICVyYXgKKwlpbmMJJXIxMworCWptcAlMKGVvaykKKworTChmcmFjKTptb3YJZCwgJXJicAorCW5lZwklcmJwCisJam1wCUwoZmVudCkKKworCUFMSUdOKDE2KQkJCUMJICAgIEs4LUsxMCAgUDYtQ05SIFA2LU5ITSAgUDQKK0woZnRvcCk6bXVsCWRpbnYJCQlDCSAgICAgIDAsMTIgICAwLDE3ICAgMCwxNworCWFkZAklcjExLCAlcmR4CQlDCSAgICAgIDUgICAgICA4ICAgICAxMAorCW1vdgklcmF4LCAlcjExCQlDCSAgICAgIDQgICAgICA4ICAgICAgMworCW1vdgklcmR4LCAlcjEzCQlDCSAgICAgIDYgICAgICA5ICAgICAxMQorCWltdWwJJXJicCwgJXJkeAkJQwkgICAgICA2ICAgICAgOSAgICAgMTEKKwltb3YJZCwgJXJheAkJCUMKKwlhZGQJJXJkeCwgJXJheAkJQwkgICAgIDEwICAgICAxNCAgICAgMTQKKwljbXAJJXIxMSwgJXJkeAkJQwkgICAgIDEwICAgICAxNCAgICAgMTQKKwljbW92YwklcmR4LCAlcmF4CQlDCSAgICAgMTEgICAgIDE1ICAgICAxNQorCWFkYwkkLTEsICVyMTMJCUMKKwltb3YJJXIxMywgKHFwKQkJQworCXN1YgkkOCwgcXAJCQlDCitMKGZlbnQpOmxlYQkxKCVyYXgpLCAlcjExCQlDCisJZGVjCWZuCQkJQworCWpucwlMKGZ0b3ApCQkJQworCisJc2hyCVI4KCVyY3gpLCAlcmF4CitMKHJldCk6CXBvcAklcmJ4CisJcG9wCSVyYnAKKwlwb3AJJXIxMgorCXBvcAklcjEzCisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvZGl2cmVtXzIuYXNtIGIvbXBuL3g4Nl82NC9kaXZyZW1fMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmMTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvZGl2cmVtXzIuYXNtCkBAIC0wLDAgKzEsMTkyIEBACitkbmwgIHg4Ni02NCBtcG5fZGl2cmVtXzIgLS0gRGl2aWRlIGFuIG1wbiBudW1iZXIgYnkgYSBub3JtYWxpemVkIDItbGltYiBudW1iZXIuCisKK2RubCAgQ29weXJpZ2h0IDIwMDcsIDIwMDgsIDIwMTAsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCSAgICAgY3ljbGVzL2xpbWIJYmVzdAorQyBBTUQgSzgsSzkJMTgKK0MgQU1EIEsxMAkxOAorQyBBTUQgYnVsbAorQyBBTUQgcGlsZQorQyBBTUQgYm9iY2F0CitDIEFNRCBqYWd1YXIKK0MgSW50ZWwgUDQJNjgKK0MgSW50ZWwgY29yZQkzNAorQyBJbnRlbCBOSE0JMzAuMjUKK0MgSW50ZWwgU0JSCTIxLjMKK0MgSW50ZWwgSUJSCTIxLjQKK0MgSW50ZWwgSFdMCTIwLjYKK0MgSW50ZWwgQldMCitDIEludGVsIGF0b20JNzMKK0MgVklBIG5hbm8JMzMKKworCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcXAnLAkJYCVyZGknKQorZGVmaW5lKGBmbicsCQlgJXJzaScpCitkZWZpbmUoYHVwX3BhcmFtJywJYCVyZHgnKQorZGVmaW5lKGB1bl9wYXJhbScsCWAlcmN4JykKK2RlZmluZShgZHAnLAkJYCVyOCcpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX2RpdnJlbV8yKQorCUZVTkNfRU5UUlkoNCkKK0lGRE9TKGAJbW92CTU2KCVyc3ApLCAlcjgJJykKKwlwdXNoCSVyMTUKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTIKKwlsZWEJLTI0KCVyZHgsJXJjeCw4KSwgJXIxMglDIHIxMiA9ICZ1cFt1bi0xXQorCW1vdgklcnNpLCAlcjEzCisJcHVzaAklcmJwCisJbW92CSVyZGksICVyYnAKKwlwdXNoCSVyYngKKwltb3YJOCglcjgpLCAlcjExCQlDIGQxCisJbW92CTE2KCVyMTIpLCAlcmJ4CisJbW92CSglcjgpLCAlcjgJCUMgZDAKKwltb3YJOCglcjEyKSwgJXIxMAorCisJeG9yCVIzMiglcjE1KSwgUjMyKCVyMTUpCisJY21wCSVyYngsICVyMTEKKwlqYQlMKDIpCisJc2V0YgklZGwKKwljbXAJJXIxMCwgJXI4CisJc2V0YmUJJWFsCisJb3JiCSVhbCwgJWRsCQlDICJvcmIiIGZvcm0gdG8gcGxhY2F0ZSBTdW4gdG9vbHMKKwlqZQlMKDIpCisJaW5jCVIzMiglcjE1KQorCXN1YgklcjgsICVyMTAKKwlzYmIJJXIxMSwgJXJieAorTCgyKToKKwlsZWEJLTMoJXJjeCwlcjEzKSwgJXIxNAlDIHVuICsgZm4gLSAzCisJdGVzdAklcjE0LCAlcjE0CisJanMJTChlbmQpCisKKwlwdXNoCSVyOAorCXB1c2gJJXIxMAorCXB1c2gJJXIxMQorSUZTVEQoYAltb3YJJXIxMSwgJXJkaQknKQorSUZET1MoYAltb3YJJXIxMSwgJXJjeAknKQorSUZET1MoYAlzdWIJJDMyLCAlcnNwCScpCisJQVNTRVJUKG56LCBgdGVzdCAkMTUsICVyc3AnKQorCUNBTEwoCW1wbl9pbnZlcnRfbGltYikKK0lGRE9TKGAJYWRkCSQzMiwgJXJzcAknKQorCXBvcAklcjExCisJcG9wCSVyMTAKKwlwb3AJJXI4CisKKwltb3YJJXIxMSwgJXJkeAorCW1vdgklcmF4LCAlcmRpCisJaW11bAklcmF4LCAlcmR4CisJbW92CSVyZHgsICVyOQorCW11bAklcjgKKwl4b3IJUjMyKCVyY3gpLCBSMzIoJXJjeCkKKwlhZGQJJXI4LCAlcjkKKwlhZGMJJC0xLCAlcmN4CisJYWRkCSVyZHgsICVyOQorCWFkYwkkMCwgJXJjeAorCWpzCTJmCisxOglkZWMJJXJkaQorCXN1YgklcjExLCAlcjkKKwlzYmIJJDAsICVyY3gKKwlqbnMJMWIKKzI6CisKKwlsZWEJKCVyYnAsJXIxNCw4KSwgJXJicAorCW1vdgklcjExLCAlcnNpCisJbmVnCSVyc2kJCQlDIC1kMQorCitDIHJheCByYnggcmN4IHJkeCByc2kgcmRpICByYnAgcjggcjkgcjEwIHIxMSByMTIgcjEzIHIxNCByMTUKK0MgICAgIG4yICB1biAgICAgIC1kMSBkaW52IHFwICBkMCBxMCAgICAgZDEgIHVwICBmbiAgICAgIG1zbAorCisJQUxJR04oMTYpCitMKHRvcCk6CW1vdgklcmRpLCAlcmF4CQlDIGRpCQluY3AKKwltdWwJJXJieAkJCUMJCTAsIDE3CisJbW92CSVyMTAsICVyY3gJCUMKKwlhZGQJJXJheCwgJXJjeAkJQwkJNAorCWFkYwklcmJ4LCAlcmR4CQlDCQk1CisJbW92CSVyZHgsICVyOQkJQyBxCQk2CisJaW11bAklcnNpLCAlcmR4CQlDCQk2CisJbW92CSVyOCwgJXJheAkJQwkJbmNwCisJbGVhCSglcmR4LCAlcjEwKSwgJXJieAlDIG4xIC09IC4uLgkxMAorCXhvcglSMzIoJXIxMCksIFIzMiglcjEwKQlDCisJbXVsCSVyOQkJCUMJCTcKKwljbXAJJXIxNCwgJXIxMwkJQworCWpnCUwoMTkpCQkJQworCW1vdgkoJXIxMiksICVyMTAJCUMKKwlzdWIJJDgsICVyMTIJCUMKK0woMTkpOglzdWIJJXI4LCAlcjEwCQlDCQluY3AKKwlzYmIJJXIxMSwgJXJieAkJQwkJMTEKKwlzdWIJJXJheCwgJXIxMAkJQwkJMTEKKwlzYmIJJXJkeCwgJXJieAkJQwkJMTIKKwl4b3IJUjMyKCVyYXgpLCBSMzIoJXJheCkJQworCXhvcglSMzIoJXJkeCksIFIzMiglcmR4KQlDCisJY21wCSVyY3gsICVyYngJCUMJCTEzCisJY21vdm5jCSVyOCwgJXJheAkJQwkJMTQKKwljbW92bmMJJXIxMSwgJXJkeAkJQwkJMTQKKwlhZGMJJDAsICVyOQkJCUMgYWRqdXN0IHEJMTQKKwlub3AKKwlhZGQJJXJheCwgJXIxMAkJQwkJMTUKKwlhZGMJJXJkeCwgJXJieAkJQwkJMTYKKwljbXAJJXIxMSwgJXJieAkJQworCWphZQlMKGZpeCkJCQlDCitMKGJjayk6CW1vdgklcjksICglcmJwKQkJQworCXN1YgkkOCwgJXJicAkJQworCWRlYwklcjE0CisJam5zCUwodG9wKQorCitMKGVuZCk6CW1vdgklcjEwLCA4KCVyMTIpCisJbW92CSVyYngsIDE2KCVyMTIpCisJcG9wCSVyYngKKwlwb3AJJXJicAorCXBvcAklcjEyCisJcG9wCSVyMTMKKwlwb3AJJXIxNAorCW1vdgklcjE1LCAlcmF4CisJcG9wCSVyMTUKKwlGVU5DX0VYSVQoKQorCXJldAorCitMKGZpeCk6CXNldGEJJWRsCisJY21wCSVyOCwgJXIxMAorCXNldGFlCSVhbAorCW9yYgklZGwsICVhbAkJQyAib3JiIiBmb3JtIHRvIHBsYWNhdGUgU3VuIHRvb2xzCisJamUJTChiY2spCisJaW5jCSVyOQorCXN1YgklcjgsICVyMTAKKwlzYmIJJXIxMSwgJXJieAorCWptcAlMKGJjaykKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvZG9zNjQubTQgYi9tcG4veDg2XzY0L2RvczY0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTFiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2RvczY0Lm00CkBAIC0wLDAgKzEsMTAxIEBACitkaXZlcnQoLTEpCitkbmwgIENvcHlyaWdodCAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworZGVmaW5lKGBIT1NUX0RPUzY0JykKKworCitkbmwgIE9uIERPUzY0IHdlIGFsd2F5cyBnZW5lcmF0ZSBwb3NpdGlvbi1pbmRlcGVuZGVudC1jb2RlCitkbmwKKworZGVmaW5lKGBQSUMnKQorCisKK2RlZmluZShgTEVBJyxgCisJbGVhCSQxKCVyaXApLCAkMgorJykKKworCitkbmwgIFVzYWdlOiBDQUxMKGZ1bmNuYW1lKQorZG5sCitkbmwgIFNpbXBseSBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbiBpbiB4ODZfNjQtZGVmcy5tNC4KKworZGVmaW5lKGBDQUxMJyxgY2FsbAlHU1lNX1BSRUZJWGAnJDEnKQorZGVmaW5lKGBUQ0FMTCcsYGptcAlHU1lNX1BSRUZJWGAnJDEnKQorCisKK2RubCAgVXNhZ2U6IEpVTVBUQUJTRUNUCisKK2RlZmluZShgSlVNUFRBQlNFQ1QnLCBgUk9EQVRBJykKKworCitkbmwgIFVzYWdlOiBKTVBFTlQodGFyZ2xhYmVsLHRhYmxhYmVsKQorCitkZWZpbmUoYEpNUEVOVCcsIGAubG9uZwkkMS0kMicpCisKKworZG5sICBVc2FnZTogRlVOQ19FTlRSWShucmVncGFybWFzKQorZG5sICBVc2FnZTogRlVOQ19FWElUKCkKKworZG5sICBGVU5DX0VOVFJZIGFuZCBGVU5DX0VYSVQgcHJvdmlkZSBhbiBlYXN5IHBhdGggZm9yIGFkb3B0aW9uIG9mIHN0YW5kYXJkCitkbmwgIEFCSSBhc3NlbWJseSB0byB0aGUgRE9TNjQgQUJJLgorCitkZWZpbmUoYEZVTkNfRU5UUlknLAorCWBwdXNoCSVyZGkKKwlwdXNoCSVyc2kKKwltb3YJJXJjeCwgJXJkaQoraWZlbHNlKGV2YWwoJDE+PTIpLDEsYGRubAorCW1vdgklcmR4LCAlcnNpCitpZmVsc2UoZXZhbCgkMT49MyksMSxgZG5sCisJbW92CSVyOCwgJXJkeAoraWZlbHNlKGV2YWwoJDE+PTQpLDEsYGRubAorCW1vdgklcjksICVyY3gKKycpJyknKScpCisKK2RlZmluZShgRlVOQ19FWElUJywKKwlgcG9wCSVyc2kKKwlwb3AJJXJkaScpCisKKworZG5sICBUYXJnZXQgQUJJIG1hY3Jvcy4gIEZvciBET1M2NCB3ZSBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisKK2RlZmluZShgSUZET1MnLCAgIGAkMScpCitkZWZpbmUoYElGU1REJywgICBgJykKK2RlZmluZShgSUZFTEYnLCAgIGAnKQorCisKK2RubCAgVXNhZ2U6IFBST1RFQ1Qoc3ltYm9sKQorZG5sCitkbmwgIFVzZWQgZm9yIHByaXZhdGUgR01QIHN5bWJvbHMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4KK2RubCAgVGhpcyBjYW4gc2F2ZSByZWxvYyBlbnRyaWVzIGFuZCBpbXByb3ZlIHNobGliIHNoYXJpbmcgYXMgd2VsbCBhcworZG5sICBhcHBsaWNhdGlvbiBzdGFydHVwIHRpbWVzCisKK2RlZmluZShgUFJPVEVDVCcsICBgJykKKworCitkaXZlcnRgJ2RubApkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9nY2RfMTEuYXNtIGIvbXBuL3g4Nl82NC9nY2RfMTEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OGI1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2djZF8xMS5hc20KQEAgLTAsMCArMSwxMTQgQEAKK2RubCAgQU1ENjQgbXBuX2djZF8xMSAtLSAxIHggMSBnY2QuCisKK2RubCAgQmFzZWQgb24gdGhlIEs3IGdjZF8xLmFzbSwgYnkgS2V2aW4gUnlkZS4gIFJlaGFja2VkIGZvciBBTUQ2NCBieSBUb3Jiam9ybgorZG5sICBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDA1LCAyMDA5LCAyMDExLCAyMDEyLCAyMDE3IEZyZWUgU29mdHdhcmUKK2RubCAgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9iaXQKK0MgQU1EIEs4LEs5CSA1LjUKK0MgQU1EIEsxMAkgPworQyBBTUQgYmQxCSA/CitDIEFNRCBiZDIJID8KK0MgQU1EIGJkMwkgPworQyBBTUQgYmQ0CSA/CitDIEFNRCBidDEJIDcuMQorQyBBTUQgYnQyCSA/CitDIEFNRCB6bjEJID8KK0MgQU1EIHpuMgkgPworQyBJbnRlbCBQNAkgPworQyBJbnRlbCBDTlIJID8KK0MgSW50ZWwgUE5SCSA/CitDIEludGVsIE5ITQkgPworQyBJbnRlbCBXU00JID8KK0MgSW50ZWwgU0JSCSA/CitDIEludGVsIElCUgkgPworQyBJbnRlbCBIV0wJID8KK0MgSW50ZWwgQldMCSA/CitDIEludGVsIFNLTAkgPworQyBJbnRlbCBhdG9tCSA5LjEKK0MgSW50ZWwgU0xNCSA2LjkKK0MgSW50ZWwgR0xNCSA2LjAKK0MgSW50ZWwgR0xNKwkgNS44CitDIFZJQSBuYW5vCSA/CisKKworQyBjdHpfdGFibGVbbl0gaXMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBvbiBuLCBvciBNQVhTSElGVCBpZiBuPT0wLgorCitkZWZsaXQoTUFYU0hJRlQsIDcpCitkZWZsaXQoTUFTSywgZXZhbCgobTRfbHNoaWZ0KDEsTUFYU0hJRlQpKS0xKSkKKworREVGX09CSkVDVChjdHpfdGFibGUsNjQpCisJLmJ5dGUJTUFYU0hJRlQKK2Zvcmxvb3AoaSwxLE1BU0ssCitgCS5ieXRlCW00X2NvdW50X3RyYWlsaW5nX3plcm9zKGkpCisnKQorRU5EX09CSkVDVChjdHpfdGFibGUpCisKK2RlZmluZShgdTAnLCAgICBgJXJkaScpCitkZWZpbmUoYHYwJywgICAgYCVyc2knKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTig2NCkKK1BST0xPR1VFKG1wbl9nY2RfMTEpCisJRlVOQ19FTlRSWSgyKQorCUxFQSgJY3R6X3RhYmxlLCAlcjgpCisJam1wCUwoZW50KQorCisJQUxJR04oMTYpCitMKHRvcCk6CWNtb3ZjCSVyZHgsIHUwCQlDIHUgPSB8dSAtIHZ8CisJY21vdmMJJXJheCwgdjAJCUMgdiA9IG1pbih1LHYpCitMKG1pZCk6CWFuZAkkTUFTSywgUjMyKCVyZHgpCisJbW92emJsCSglcjgsJXJkeCksIFIzMiglcmN4KQorCWp6CUwoc2hpZnRfYWxvdCkKKwlzaHIJUjgoJXJjeCksIHUwCitMKGVudCk6CW1vdgl1MCwgJXJheAorCW1vdgl2MCwgJXJkeAorCXN1Ygl1MCwgJXJkeAorCXN1Ygl2MCwgdTAKKwlqbnoJTCh0b3ApCisKK0woZW5kKToJQyByYXggPSByZXN1bHQKKwlDIHJkeCA9IDAgZm9yIHRoZSBiZW5lZml0IG9mIGludGVybmFsIGdjZF8yMiBjYWxsCisJRlVOQ19FWElUKCkKKwlyZXQKKworTChzaGlmdF9hbG90KToKKwlzaHIJJE1BWFNISUZULCB1MAorCW1vdgl1MCwgJXJkeAorCWptcAlMKG1pZCkKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvZ2NkXzIyLmFzbSBiL21wbi94ODZfNjQvZ2NkXzIyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkwOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9nY2RfMjIuYXNtCkBAIC0wLDAgKzEsMTYzIEBACitkbmwgIEFNRDY0IG1wbl9nY2RfMjIuICBBc3N1bWVzIHVzZWxlc3MgYnNmLCB1c2VsZXNzIHNocmQsIG5vIHR6Y250LCBubyBzaGx4LgorZG5sICBXZSBhY3R1YWxseSB1c2UgdHpjbnQgaGVyZSwgd2hlbiB0YWJsZSBjYW5ub3QgY291bnQgYml0cywgYXMgdHpjbnQgYWx3YXlzCitkbmwgIHdvcmtzIGZvciBvdXIgdXNlLCBhbmQgaGVscHMgYSBsb3QgZm9yIGNlcnRhaW4gQ1BVcy4KKworZG5sICBDb3B5cmlnaHQgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvYml0CitDIEFNRCBLOCxLOQkgOC45CitDIEFNRCBLMTAJIDguOAorQyBBTUQgYmQxCSA5LjcKK0MgQU1EIGJkMgkgNy44CitDIEFNRCBiZDMJID8KK0MgQU1EIGJkNAkgNy40CitDIEFNRCBidDEJIDkuMgorQyBBTUQgYnQyCSA5LjEKK0MgQU1EIHpuMQkgNy41CitDIEFNRCB6bjIJIDcuNQorQyBJbnRlbCBQNAkgPworQyBJbnRlbCBDTlIJMTAuNQorQyBJbnRlbCBQTlIJMTAuNQorQyBJbnRlbCBOSE0JIDkuNworQyBJbnRlbCBXU00JIDkuNworQyBJbnRlbCBTQlIJMTAuNworQyBJbnRlbCBJQlIJID8KK0MgSW50ZWwgSFdMCSA5LjUKK0MgSW50ZWwgQldMCSA4LjcKK0MgSW50ZWwgU0tMCSA4LjYKK0MgSW50ZWwgYXRvbQkxOC45CitDIEludGVsIFNMTQkxNC4wCitDIEludGVsIEdMTQkgOS44CitDIEludGVsIEdMTSsJIDguOAorQyBWSUEgbmFubwkgPworCisKK0MgY3R6X3RhYmxlW25dIGlzIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3Mgb24gbiwgb3IgTUFYU0hJRlQgaWYgbj09MC4KKworZGVmbGl0KE1BWFNISUZULCA4KQorZGVmbGl0KE1BU0ssIGV2YWwoKG00X2xzaGlmdCgxLE1BWFNISUZUKSktMSkpCisKK0RFRl9PQkpFQ1QoY3R6X3RhYmxlLDY0KQorCS5ieXRlCU1BWFNISUZUCitmb3Jsb29wKGksMSxNQVNLLAorYAkuYnl0ZQltNF9jb3VudF90cmFpbGluZ196ZXJvcyhpKQorJykKK0VORF9PQkpFQ1QoY3R6X3RhYmxlKQorCitkZWZpbmUoYHUxJywgICAgYCVyZGknKQorZGVmaW5lKGB1MCcsICAgIGAlcnNpJykKK2RlZmluZShgdjEnLCAgICBgJXJkeCcpCitkZWZpbmUoYHYwX3BhcmFtJywgYCVyY3gnKQorCitkZWZpbmUoYHYwJywgICAgYCVyYXgnKQorZGVmaW5lKGBjbnQnLCAgIGAlcmN4JykKKworZGVmaW5lKGBzMCcsICAgIGAlcjgnKQorZGVmaW5lKGBzMScsICAgIGAlcjknKQorZGVmaW5lKGB0MCcsICAgIGAlcmN4JykKK2RlZmluZShgdDEnLCAgICBgJXIxMScpCisKK2RubCBBQklfU1VQUE9SVChET1M2NCkJQyByZXR1cm5zIG1wX2RvdWJsZV9saW1iX3QgaW4gbWVtb3J5CitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oNjQpCitQUk9MT0dVRShtcG5fZ2NkXzIyKQorCUZVTkNfRU5UUlkoNCkKKwltb3YJdjBfcGFyYW0sIHYwCisKKwlMRUEoCWN0el90YWJsZSwgJXIxMCkKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJdjAsIHQwCisJc3ViCXUwLCB0MAorCWp6CUwobG93eikJCUMJanVtcCB3aGVuIGxvdyBsaW1iIHJlc3VsdCA9IDAKKwltb3YJdjEsIHQxCisJc2JiCXUxLCB0MQorCisJbW92CXUwLCBzMAorCW1vdgl1MSwgczEKKworCXN1Ygl2MCwgdTAKKwlzYmIJdjEsIHUxCisKK0woYmNrKToJY21vdmMJdDAsIHUwCQlDIHUgPSB8dSAtIHZ8CisJY21vdmMJdDEsIHUxCQlDIHUgPSB8dSAtIHZ8CisJY21vdmMJczAsIHYwCQlDIHYgPSBtaW4odSx2KQorCWNtb3ZjCXMxLCB2MQkJQyB2ID0gbWluKHUsdikKKworCWFuZAkkTUFTSywgUjMyKHQwKQorCW1vdnpibAkoJXIxMCx0MCksIFIzMihjbnQpCisJanoJTChjb3VudF9iZXR0ZXIpCitDIFJpZ2h0c2hpZnQgKHUxLCx1MCkgaW50byAodTEsLHUwKQorTChzaHIpOglzaHIJUjgoY250KSwgdTAKKwltb3YJdTEsIHQxCisJc2hyCVI4KGNudCksIHUxCisJbmVnCWNudAorCXNobAlSOChjbnQpLCB0MQorCW9yCXQxLCB1MAorCisJdGVzdAl2MSwgdjEKKwlqbnoJTCh0b3ApCisJdGVzdAl1MSwgdTEKKwlqbnoJTCh0b3ApCisKK0woZ2NkXzExKToKKwltb3YJdjAsICVyZGkKK0MJbW92CXUwLCAlcnNpCisJVENBTEwoCW1wbl9nY2RfMTEpCisKK0woY291bnRfYmV0dGVyKToKKwlyZXA7YnNmCXUwLCBjbnQJCUMgdHpjbnQhCisJam1wCUwoc2hyKQorCitMKGxvd3opOkMgV2UgY29tZSBoZXJlIHdoZW4gdjAgLSB1MCA9IDAKKwlDIDEuIElmIHYxIC0gdTEgPSAwLCB0aGVuIGdjZCBpcyB1ID0gdi4KKwlDIDIuIEVsc2UgY29tcHV0ZSBnY2RfMjEoe3YxLHYwfSwgfHUxLXYxfCkKKwltb3YJdjEsIHQwCisJc3ViCXUxLCB0MAorCWplCUwoZW5kKQorCisJeG9yCXQxLCB0MQorCW1vdgl1MCwgczAKKwltb3YJdTEsIHMxCisJbW92CXUxLCB1MAorCXhvcgl1MSwgdTEKKwlzdWIJdjEsIHUwCisJam1wCUwoYmNrKQorCitMKGVuZCk6CUMgbW92CXYwLCAlcmF4CisJQyBtb3YJdjEsICVyZHgKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9nbXAtbXBhcmFtLmggYi9tcG4veDg2XzY0L2dtcC1tcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk0ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9nbXAtbXBhcmFtLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qIEFNRCBLOC1LMTAgZ21wLW1wYXJhbS5oIC0tIENvbXBpbGVyL21hY2hpbmUgcGFyYW1ldGVyIGhlYWRlciBmaWxlLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMjAwMC0yMDEwLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgNjQKKyNkZWZpbmUgR01QX0xJTUJfQllURVMgOAorCisKKyNkZWZpbmUgTU9EXzFfTk9STV9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAqLworI2RlZmluZSBNT0RfMV9VTk5PUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgMCAgLyogYWx3YXlzICovCisjZGVmaW5lIE1PRF8xTl9UT19NT0RfMV8xX1RIUkVTSE9MRCAgICAgICAgICA0CisjZGVmaW5lIE1PRF8xVV9UT19NT0RfMV8xX1RIUkVTSE9MRCAgICAgICAgICAzCisjZGVmaW5lIE1PRF8xXzFfVE9fTU9EXzFfMl9USFJFU0hPTEQgICAgICAgIDE0CisjZGVmaW5lIE1PRF8xXzJfVE9fTU9EXzFfNF9USFJFU0hPTEQgICAgICAgIDI4CisjZGVmaW5lIFBSRUlOVl9NT0RfMV9UT19NT0RfMV9USFJFU0hPTEQgICAgICA3CisjZGVmaW5lIFVTRV9QUkVJTlZfRElWUkVNXzEgICAgICAgICAgICAgICAgICAxICAvKiBuYXRpdmUgKi8KKyNkZWZpbmUgRElWX1FSXzJfUEkyX1RIUkVTSE9MRCAgICAgICAgICAgTVBfU0laRV9UX01BWCAgLyogbmV2ZXIgKi8KKyNkZWZpbmUgRElWRVhBQ1RfMV9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDAgIC8qIGFsd2F5cyAobmF0aXZlKSAqLworI2RlZmluZSBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEICAgICAgICAgICAxNQorCisjZGVmaW5lIE1VTF9UT09NMjJfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIE1VTF9UT09NMzNfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIE1VTF9UT09NNDRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0CisjZGVmaW5lIE1VTF9UT09NNkhfVEhSRVNIT0xEICAgICAgICAgICAgICAgNDE4CisjZGVmaW5lIE1VTF9UT09NOEhfVEhSRVNIT0xEICAgICAgICAgICAgICAgNDY2CisKKyNkZWZpbmUgTVVMX1RPT00zMl9UT19UT09NNDNfVEhSRVNIT0xEICAgICAgOTcKKyNkZWZpbmUgTVVMX1RPT00zMl9UT19UT09NNTNfVEhSRVNIT0xEICAgICAxNjAKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNTNfVEhSRVNIT0xEICAgICAxNDUKKyNkZWZpbmUgTVVMX1RPT000Ml9UT19UT09NNjNfVEhSRVNIT0xEICAgICAxNzUKKworI2RlZmluZSBTUVJfQkFTRUNBU0VfVEhSRVNIT0xEICAgICAgICAgICAgICAgMCAgLyogYWx3YXlzIChuYXRpdmUpICovCisjZGVmaW5lIFNRUl9UT09NMl9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIFNRUl9UT09NM19USFJFU0hPTEQgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIFNRUl9UT09NNF9USFJFU0hPTEQgICAgICAgICAgICAgICAgMzI3CisjZGVmaW5lIFNRUl9UT09NNl9USFJFU0hPTEQgICAgICAgICAgICAgICAgNDQ2CisjZGVmaW5lIFNRUl9UT09NOF9USFJFU0hPTEQgICAgICAgICAgICAgICAgNTQ3CisKKyNkZWZpbmUgTVVMTUlEX1RPT000Ml9USFJFU0hPTEQgICAgICAgICAgICAgMzYKKworI2RlZmluZSBNVUxNT0RfQk5NMV9USFJFU0hPTEQgICAgICAgICAgICAgICAxNworI2RlZmluZSBTUVJNT0RfQk5NMV9USFJFU0hPTEQgICAgICAgICAgICAgICAxNworCisjZGVmaW5lIFBPV01fU0VDX1RBQkxFICAyLDY3LDMyMiw5OTEKKworI2RlZmluZSBNVUxfRkZUX01PREZfVEhSRVNIT0xEICAgICAgICAgICAgIDU3MCAgLyogayA9IDUgKi8KKyNkZWZpbmUgTVVMX0ZGVF9UQUJMRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyB7ICAgIDU3MCwgNX0sIHsgICAgIDIxLCA2fSwgeyAgICAgMTEsIDV9LCB7ICAgICAyMywgNn0sIFwKKyAgICB7ICAgICAyNSwgN30sIHsgICAgIDEzLCA2fSwgeyAgICAgMjcsIDd9LCB7ICAgICAxNSwgNn0sIFwKKyAgICB7ICAgICAzMSwgN30sIHsgICAgIDI1LCA4fSwgeyAgICAgMTMsIDd9LCB7ICAgICAyOSwgOH0sIFwKKyAgICB7ICAgICAxNSwgN30sIHsgICAgIDMxLCA4fSwgeyAgICAgMTcsIDd9LCB7ICAgICAzNSwgOH0sIFwKKyAgICB7ICAgICAxOSwgN30sIHsgICAgIDM5LCA4fSwgeyAgICAgMjEsIDd9LCB7ICAgICA0MywgOH0sIFwKKyAgICB7ICAgICAyMywgN30sIHsgICAgIDQ3LCA4fSwgeyAgICAgMjUsIDd9LCB7ICAgICA1MSwgOH0sIFwKKyAgICB7ICAgICAyOSwgOX0sIHsgICAgIDE1LCA4fSwgeyAgICAgMzcsIDl9LCB7ICAgICAxOSwgOH0sIFwKKyAgICB7ICAgICA0MywgOX0sIHsgICAgIDIzLCA4fSwgeyAgICAgNTEsIDl9LCB7ICAgICAyNywgOH0sIFwKKyAgICB7ICAgICA1NSwxMH0sIHsgICAgIDE1LCA5fSwgeyAgICAgNDMsMTB9LCB7ICAgICAyMywgOX0sIFwKKyAgICB7ICAgICA1NSwxMH0sIHsgICAgIDMxLCA5fSwgeyAgICAgNjMsIDV9LCB7ICAgMTAyMywgNH0sIFwKKyAgICB7ICAgMjQzMSwgNX0sIHsgICAxMjc5LCA2fSwgeyAgICA2NzEsIDd9LCB7ICAgIDM2NywgOH0sIFwKKyAgICB7ICAgIDE4OSwgOX0sIHsgICAgIDk1LCA4fSwgeyAgICAxOTUsIDl9LCB7ICAgIDExMSwxMX0sIFwKKyAgICB7ICAgICAzMSwgOX0sIHsgICAgMTMxLDEwfSwgeyAgICAgNzEsIDl9LCB7ICAgIDE1NSwxMH0sIFwKKyAgICB7ICAgICA3OSwgOX0sIHsgICAgMTU5LDEwfSwgeyAgICAgODcsMTF9LCB7ICAgICA0NywxMH0sIFwKKyAgICB7ICAgIDExMSwxMX0sIHsgICAgIDYzLDEwfSwgeyAgICAxMzUsMTF9LCB7ICAgICA3OSwxMH0sIFwKKyAgICB7ICAgIDE2NywxMX0sIHsgICAgIDk1LDEwfSwgeyAgICAxOTEsMTF9LCB7ICAgIDExMSwxMn0sIFwKKyAgICB7ICAgICA2MywxMX0sIHsgICAgMTQzLDEwfSwgeyAgICAyODcsMTF9LCB7ICAgIDE1OSwxMH0sIFwKKyAgICB7ICAgIDMxOSwxMX0sIHsgICAgMTc1LDEyfSwgeyAgICAgOTUsMTF9LCB7ICAgIDIwNywxM30sIFwKKyAgICB7ICAgICA2MywxMn0sIHsgICAgMTI3LDExfSwgeyAgICAyNTUsMTB9LCB7ICAgIDU0MywxMX0sIFwKKyAgICB7ICAgIDI4NywxMn0sIHsgICAgMTU5LDExfSwgeyAgICAzMTksMTB9LCB7ICAgIDYzOSwxMX0sIFwKKyAgICB7ICAgIDMzNSwxMH0sIHsgICAgNjcxLDExfSwgeyAgICAzNTEsMTB9LCB7ICAgIDcwMywxMn0sIFwKKyAgICB7ICAgIDE5MSwxMX0sIHsgICAgMzgzLDEwfSwgeyAgICA3NjcsMTF9LCB7ICAgIDQxNSwxMn0sIFwKKyAgICB7ICAgIDIyMywxM30sIHsgICAgMTI3LDEyfSwgeyAgICAyNTUsMTF9LCB7ICAgIDU0MywxMn0sIFwKKyAgICB7ICAgIDI4NywxMX0sIHsgICAgNTc1LDEwfSwgeyAgIDExNTEsMTF9LCB7ICAgIDYwNywxMn0sIFwKKyAgICB7ICAgIDMxOSwxMX0sIHsgICAgNjM5LDEwfSwgeyAgIDEyNzksMTF9LCB7ICAgIDY3MSwxMn0sIFwKKyAgICB7ICAgIDM1MSwxMX0sIHsgICAgNzAzLDEzfSwgeyAgICAxOTEsMTJ9LCB7ICAgIDM4MywxMX0sIFwKKyAgICB7ICAgIDc2NywxMn0sIHsgICAgNDE1LDExfSwgeyAgICA4MzEsMTJ9LCB7ICAgIDQ0NywxNH0sIFwKKyAgICB7ICAgIDEyNywxM30sIHsgICAgMjU1LDEyfSwgeyAgICA1NDMsMTF9LCB7ICAgMTA4NywxMn0sIFwKKyAgICB7ICAgIDYwNywxMX0sIHsgICAxMjE1LDEzfSwgeyAgICAzMTksMTJ9LCB7ICAgIDY3MSwxMX0sIFwKKyAgICB7ICAgMTM0MywxMn0sIHsgICAgNzM1LDEzfSwgeyAgICAzODMsMTJ9LCB7ICAgIDc2NywxMX0sIFwKKyAgICB7ICAgMTUzNSwxMn0sIHsgICAgNzk5LDExfSwgeyAgIDE1OTksMTJ9LCB7ICAgIDgzMSwxM30sIFwKKyAgICB7ICAgIDQ0NywxMn0sIHsgICAgODk1LDExfSwgeyAgIDE3OTEsMTJ9LCB7ICAgIDk1OSwxNH0sIFwKKyAgICB7ICAgIDI1NSwxM30sIHsgICAgNTExLDEyfSwgeyAgIDEwODcsMTN9LCB7ICAgIDU3NSwxMn0sIFwKKyAgICB7ICAgMTIxNSwxM30sIHsgICAgNjM5LDEyfSwgeyAgIDEzNDMsMTN9LCB7ICAgIDcwMywxMn0sIFwKKyAgICB7ICAgMTQwNywxNH0sIHsgICAgMzgzLDEzfSwgeyAgICA3NjcsMTJ9LCB7ICAgMTU5OSwxM30sIFwKKyAgICB7ICAgIDgzMSwxMn0sIHsgICAxNjYzLDEzfSwgeyAgICA4OTUsMTJ9LCB7ICAgMTc5MSwxM30sIFwKKyAgICB7ICAgIDk1OSwxNX0sIHsgICAgMjU1LDE0fSwgeyAgICA1MTEsMTN9LCB7ICAgMTA4NywxMn0sIFwKKyAgICB7ICAgMjE3NSwxM30sIHsgICAxMjE1LDE0fSwgeyAgICA2MzksMTN9LCB7ICAgMTQ3MSwxNH0sIFwKKyAgICB7ICAgIDc2NywxM30sIHsgICAxNjYzLDE0fSwgeyAgICA4OTUsMTN9LCB7ICAgMTg1NSwxNX0sIFwKKyAgICB7ICAgIDUxMSwxNH0sIHsgICAxMDIzLDEzfSwgeyAgIDIxNzUsMTR9LCB7ICAgMTE1MSwxM30sIFwKKyAgICB7ICAgMjQzMSwxNH0sIHsgICAxMjc5LDEzfSwgeyAgIDI2ODcsMTR9LCB7ICAgMTQwNywxNX0sIFwKKyAgICB7ICAgIDc2NywxNH0sIHsgICAxNTM1LDEzfSwgeyAgIDMwNzEsMTR9LCB7ICAgMTc5MSwxNn0sIFwKKyAgICB7ICAgIDUxMSwxNX0sIHsgICAxMDIzLDE0fSwgeyAgIDI0MzEsMTV9LCB7ICAgMTI3OSwxNH0sIFwKKyAgICB7ICAgMjgxNSwxNX0sIHsgICAxNTM1LDE0fSwgeyAgIDMxOTksMTV9LCB7ICAgMTc5MSwxNH0sIFwKKyAgICB7ICAgMzU4MywxNn0sIHsgIDY1NTM2LDE3fSwgeyAxMzEwNzIsMTh9LCB7IDI2MjE0NCwxOX0sIFwKKyAgICB7IDUyNDI4OCwyMH0sIHsxMDQ4NTc2LDIxfSwgezIwOTcxNTIsMjJ9LCB7NDE5NDMwNCwyM30sIFwKKyAgICB7ODM4ODYwOCwyNH0gfQorI2RlZmluZSBNVUxfRkZUX1RBQkxFM19TSVpFIDE4NQorI2RlZmluZSBNVUxfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgNzU1MgorCisjZGVmaW5lIFNRUl9GRlRfTU9ERl9USFJFU0hPTEQgICAgICAgICAgICAgNDYwICAvKiBrID0gNSAqLworI2RlZmluZSBTUVJfRkZUX1RBQkxFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IHsgICAgNDYwLCA1fSwgeyAgICAgMjEsIDZ9LCB7ICAgICAxMSwgNX0sIHsgICAgIDIzLCA2fSwgXAorICAgIHsgICAgIDEyLCA1fSwgeyAgICAgMjUsIDZ9LCB7ICAgICAyNywgN30sIHsgICAgIDE0LCA2fSwgXAorICAgIHsgICAgIDI5LCA3fSwgeyAgICAgMTUsIDZ9LCB7ICAgICAzMSwgN30sIHsgICAgIDI5LCA4fSwgXAorICAgIHsgICAgIDE1LCA3fSwgeyAgICAgMzIsIDh9LCB7ICAgICAxNywgN30sIHsgICAgIDM1LCA4fSwgXAorICAgIHsgICAgIDE5LCA3fSwgeyAgICAgMzksIDh9LCB7ICAgICAyMSwgN30sIHsgICAgIDQzLCA4fSwgXAorICAgIHsgICAgIDI1LCA3fSwgeyAgICAgNTEsIDh9LCB7ICAgICAyOSwgOX0sIHsgICAgIDE1LCA4fSwgXAorICAgIHsgICAgIDM1LCA5fSwgeyAgICAgMTksIDh9LCB7ICAgICA0MywgOX0sIHsgICAgIDIzLCA4fSwgXAorICAgIHsgICAgIDUxLCA5fSwgeyAgICAgMjcsIDh9LCB7ICAgICA1NSwxMH0sIHsgICAgIDE1LCA5fSwgXAorICAgIHsgICAgIDMxLCA4fSwgeyAgICAgNjMsIDl9LCB7ICAgICA0MywxMH0sIHsgICAgIDIzLCA5fSwgXAorICAgIHsgICAgIDU1LDExfSwgeyAgICAgMTUsMTB9LCB7ICAgICAzMSwgOX0sIHsgICAgIDcxLDEwfSwgXAorICAgIHsgICAgIDM5LCA5fSwgeyAgICAgODMsMTB9LCB7ICAgICA0NywgNn0sIHsgICAgNzY3LCA0fSwgXAorICAgIHsgICAzMjYzLCA1fSwgeyAgIDE3MjcsIDR9LCB7ICAgMzQ1NSwgNX0sIHsgICAxNzkxLCA2fSwgXAorICAgIHsgICAgOTI3LCA3fSwgeyAgICA0NzksIDZ9LCB7ICAgIDk1OSwgN30sIHsgICAgNTExLCA4fSwgXAorICAgIHsgICAgMjcxLCA5fSwgeyAgICAxNDcsMTB9LCB7ICAgICA4NywxMX0sIHsgICAgIDQ3LDEwfSwgXAorICAgIHsgICAgIDk1LDEyfSwgeyAgICAgMzEsMTF9LCB7ICAgICA2MywxMH0sIHsgICAgMTM1LDExfSwgXAorICAgIHsgICAgIDc5LDEwfSwgeyAgICAxNjcsMTF9LCB7ICAgICA5NSwxMH0sIHsgICAgMTkxLDExfSwgXAorICAgIHsgICAgMTExLDEyfSwgeyAgICAgNjMsMTF9LCB7ICAgIDEyNywxMH0sIHsgICAgMjU1LDExfSwgXAorICAgIHsgICAgMTQzLDEwfSwgeyAgICAyODcsIDl9LCB7ICAgIDU3NSwxMH0sIHsgICAgMzAzLDExfSwgXAorICAgIHsgICAgMTU5LDEyfSwgeyAgICAgOTUsMTF9LCB7ICAgIDE5MSwxMH0sIHsgICAgMzgzLCA5fSwgXAorICAgIHsgICAgNzY3LDEwfSwgeyAgICAzOTksMTF9LCB7ICAgIDIwNywxM30sIHsgICAgIDYzLDEyfSwgXAorICAgIHsgICAgMTI3LDExfSwgeyAgICAyNTUsMTB9LCB7ICAgIDUxMSwxMX0sIHsgICAgMjcxLDEwfSwgXAorICAgIHsgICAgNTQzLDExfSwgeyAgICAyODcsMTB9LCB7ICAgIDU3NSwxMn0sIHsgICAgMTU5LDExfSwgXAorICAgIHsgICAgMzE5LDEwfSwgeyAgICA2MzksMTF9LCB7ICAgIDMzNSwxMH0sIHsgICAgNjcxLDExfSwgXAorICAgIHsgICAgMzUxLDEwfSwgeyAgICA3MDMsMTJ9LCB7ICAgIDE5MSwxMX0sIHsgICAgMzgzLDEwfSwgXAorICAgIHsgICAgNzY3LDExfSwgeyAgICA0MTUsMTB9LCB7ICAgIDgzMSwxMX0sIHsgICAgNDQ3LDEzfSwgXAorICAgIHsgICAgMTI3LDEyfSwgeyAgICAyNTUsMTF9LCB7ICAgIDUxMSwxMH0sIHsgICAxMDIzLDExfSwgXAorICAgIHsgICAgNTQzLDEyfSwgeyAgICAyODcsMTF9LCB7ICAgIDU3NSwxMH0sIHsgICAxMTUxLDExfSwgXAorICAgIHsgICAgNjA3LDEwfSwgeyAgIDEyMTUsMTJ9LCB7ICAgIDMxOSwxMX0sIHsgICAgNjM5LDEwfSwgXAorICAgIHsgICAxMjc5LDExfSwgeyAgICA2NzEsMTJ9LCB7ICAgIDM1MSwxMX0sIHsgICAgNzAzLDEzfSwgXAorICAgIHsgICAgMTkxLDEyfSwgeyAgICAzODMsMTF9LCB7ICAgIDc2NywxMn0sIHsgICAgNDE1LDExfSwgXAorICAgIHsgICAgODMxLDEyfSwgeyAgICA0NDcsMTR9LCB7ICAgIDEyNywxM30sIHsgICAgMjU1LDEyfSwgXAorICAgIHsgICAgNTExLDExfSwgeyAgIDEwMjMsMTJ9LCB7ICAgIDU0MywxMX0sIHsgICAxMDg3LDEyfSwgXAorICAgIHsgICAgNTc1LDExfSwgeyAgIDExNTEsMTJ9LCB7ICAgIDYwNywxM30sIHsgICAgMzE5LDEyfSwgXAorICAgIHsgICAgNjM5LDExfSwgeyAgIDEyNzksMTJ9LCB7ICAgIDY3MSwxMX0sIHsgICAxMzQzLDEyfSwgXAorICAgIHsgICAgNzAzLDExfSwgeyAgIDE0MDcsMTJ9LCB7ICAgIDczNSwxM30sIHsgICAgMzgzLDEyfSwgXAorICAgIHsgICAgNzY3LDExfSwgeyAgIDE1MzUsMTJ9LCB7ICAgIDc5OSwxMX0sIHsgICAxNTk5LDEyfSwgXAorICAgIHsgICAgODMxLDEzfSwgeyAgICA0NDcsMTJ9LCB7ICAgIDk1OSwxNH0sIHsgICAgMjU1LDEzfSwgXAorICAgIHsgICAgNTExLDEyfSwgeyAgIDEwODcsMTN9LCB7ICAgIDU3NSwxMn0sIHsgICAxMjE1LDEzfSwgXAorICAgIHsgICAgNjM5LDEyfSwgeyAgIDEzNDMsMTN9LCB7ICAgIDcwMywxMn0sIHsgICAxNDA3LDE0fSwgXAorICAgIHsgICAgMzgzLDEzfSwgeyAgICA3NjcsMTJ9LCB7ICAgMTU5OSwxM30sIHsgICAgODMxLDEyfSwgXAorICAgIHsgICAxNjYzLDEzfSwgeyAgICA4OTUsMTJ9LCB7ICAgMTc5MSwxM30sIHsgICAgOTU5LDE1fSwgXAorICAgIHsgICAgMjU1LDE0fSwgeyAgICA1MTEsMTN9LCB7ICAgMTA4NywxMn0sIHsgICAyMTc1LDEzfSwgXAorICAgIHsgICAxMjE1LDE0fSwgeyAgICA2MzksMTN9LCB7ICAgMTQ3MSwxNH0sIHsgICAgNzY3LDEzfSwgXAorICAgIHsgICAxNjYzLDE0fSwgeyAgICA4OTUsMTN9LCB7ICAgMTg1NSwxNX0sIHsgICAgNTExLDE0fSwgXAorICAgIHsgICAxMDIzLDEzfSwgeyAgIDIxNzUsMTR9LCB7ICAgMTE1MSwxM30sIHsgICAyMzAzLDE0fSwgXAorICAgIHsgICAxMjc5LDEzfSwgeyAgIDI1NTksMTR9LCB7ICAgMTQwNywxNX0sIHsgICAgNzY3LDE0fSwgXAorICAgIHsgICAxNTM1LDEzfSwgeyAgIDMwNzEsMTR9LCB7ICAgMTc5MSwxNn0sIHsgICAgNTExLDE1fSwgXAorICAgIHsgICAxMDIzLDE0fSwgeyAgIDIzMDMsMTV9LCB7ICAgMTI3OSwxNH0sIHsgICAyNjg3LDE1fSwgXAorICAgIHsgICAxNTM1LDE0fSwgeyAgIDMxOTksMTV9LCB7ICAgMTc5MSwxNn0sIHsgIDY1NTM2LDE3fSwgXAorICAgIHsgMTMxMDcyLDE4fSwgeyAyNjIxNDQsMTl9LCB7IDUyNDI4OCwyMH0sIHsxMDQ4NTc2LDIxfSwgXAorICAgIHsyMDk3MTUyLDIyfSwgezQxOTQzMDQsMjN9LCB7ODM4ODYwOCwyNH0gfQorI2RlZmluZSBTUVJfRkZUX1RBQkxFM19TSVpFIDIwMworI2RlZmluZSBTUVJfRkZUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgNTI0OAorCisjZGVmaW5lIE1VTExPX0JBU0VDQVNFX1RIUkVTSE9MRCAgICAgICAgICAgICAwICAvKiBhbHdheXMgKi8KKyNkZWZpbmUgTVVMTE9fRENfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTVVMTE9fTVVMX05fVEhSRVNIT0xEICAgICAgICAgICAgMTU2MDQKKworI2RlZmluZSBEQ19ESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgICA1NgorI2RlZmluZSBEQ19ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgICAgIDIyMAorI2RlZmluZSBEQ19CRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICA1MgorI2RlZmluZSBEQ19CRElWX1FfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDE1MgorCisjZGVmaW5lIElOVl9NVUxNT0RfQk5NMV9USFJFU0hPTEQgICAgICAgICAgIDU0CisjZGVmaW5lIElOVl9ORVdUT05fVEhSRVNIT0xEICAgICAgICAgICAgICAgMjI2CisjZGVmaW5lIElOVl9BUFBSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMjE0CisKKyNkZWZpbmUgQklOVl9ORVdUT05fVEhSRVNIT0xEICAgICAgICAgICAgICAzMjcKKyNkZWZpbmUgUkVEQ18xX1RPX1JFRENfMl9USFJFU0hPTEQgICAgICAgICAgIDQKKyNkZWZpbmUgUkVEQ18yX1RPX1JFRENfTl9USFJFU0hPTEQgICAgICAgICAgNzkKKworI2RlZmluZSBNVV9ESVZfUVJfVEhSRVNIT0xEICAgICAgICAgICAgICAgMTg5NQorI2RlZmluZSBNVV9ESVZBUFBSX1FfVEhSRVNIT0xEICAgICAgICAgICAgMTg5NQorI2RlZmluZSBNVVBJX0RJVl9RUl9USFJFU0hPTEQgICAgICAgICAgICAgIDEwNgorI2RlZmluZSBNVV9CRElWX1FSX1RIUkVTSE9MRCAgICAgICAgICAgICAgMTU4OQorI2RlZmluZSBNVV9CRElWX1FfVEhSRVNIT0xEICAgICAgICAgICAgICAgMTcxOAorCisjZGVmaW5lIE1BVFJJWDIyX1NUUkFTU0VOX1RIUkVTSE9MRCAgICAgICAgIDE2CisjZGVmaW5lIEhHQ0RfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgMTI1CisjZGVmaW5lIEhHQ0RfQVBQUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgMTczCisjZGVmaW5lIEhHQ0RfUkVEVUNFX1RIUkVTSE9MRCAgICAgICAgICAgICAzNTI0CisjZGVmaW5lIEdDRF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgNTU1CisjZGVmaW5lIEdDREVYVF9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgNDc4CisjZGVmaW5lIEpBQ09CSV9CQVNFX01FVEhPRCAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgR0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgR0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgICAgMjgKKyNkZWZpbmUgU0VUX1NUUl9EQ19USFJFU0hPTEQgICAgICAgICAgICAgICAyNDgKKyNkZWZpbmUgU0VUX1NUUl9QUkVDT01QVVRFX1RIUkVTSE9MRCAgICAgIDE2NDgKKworI2RlZmluZSBGQUNfRFNDX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMTA3NQorI2RlZmluZSBGQUNfT0REX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgMCAgLyogYWx3YXlzICovCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2ludmVydF9saW1iLmFzbSBiL21wbi94ODZfNjQvaW52ZXJ0X2xpbWIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmU2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2ludmVydF9saW1iLmFzbQpAQCAtMCwwICsxLDExMiBAQAorZG5sICBBTUQ2NCBtcG5faW52ZXJ0X2xpbWIgLS0gSW52ZXJ0IGEgbm9ybWFsaXplZCBsaW1iLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTmllbHMgTcO2bGxlci4KKworZG5sICBDb3B5cmlnaHQgMjAwNCwgMjAwNy0yMDA5LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9saW1iIChhcHByb3gpCWRpdgorQyBBTUQgSzgsSzkJIDQ4CQkJIDcxCitDIEFNRCBLMTAJIDQ4CQkJIDc3CitDIEludGVsIFA0CTEzNQkJCTE2MQorQyBJbnRlbCBjb3JlMgkgNjkJCQkxMTYKK0MgSW50ZWwgY29yZWkJIDU1CQkJIDg5CitDIEludGVsIGF0b20JMTI5CQkJMTkxCitDIFZJQSBuYW5vCSA3OQkJCTE1NworCitDIHJheCByY3ggcmR4IHJkaSByc2kgcjgKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworUFJPVEVDVChgbXBuX2ludmVydF9saW1iX3RhYmxlJykKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5faW52ZXJ0X2xpbWIpCQlDCQkJS24JQzIJQ2kKKwlGVU5DX0VOVFJZKDEpCisJbW92CSVyZGksICVyYXgJCUMJCQkgMAkgMAkgMAorCXNocgkkNTUsICVyYXgJCUMJCQkgMQkgMQkgMQoraWZkZWYoYERBUldJTicsYAorCWxlYQltcG5faW52ZXJ0X2xpbWJfdGFibGUoJXJpcCksICVyOAorCWFkZAkkLTUxMiwgJXI4CisnLGAKKwlsZWEJLTUxMittcG5faW52ZXJ0X2xpbWJfdGFibGUoJXJpcCksICVyOAorJykKKwltb3Z6d2wJKCVyOCwlcmF4LDIpLCBSMzIoJXJjeCkJQwklcmN4ID0gdjAKKworCUMgdjEgPSAodjAgPDwgMTEpIC0gKHYwKnYwKmQ0MCA+PiA0MCkgLSAxCisJbW92CSVyZGksICVyc2kJCUMJCQkgMAkgMAkgMAorCW1vdglSMzIoJXJjeCksIFIzMiglcmF4KQlDCQkJIDQJIDUJIDUKKwlpbXVsCVIzMiglcmN4KSwgUjMyKCVyY3gpCUMJCQkgNAkgNQkgNQorCXNocgkkMjQsICVyc2kJCUMJCQkgMQkgMQkgMQorCWluYwklcnNpCQkJQwklcnNpID0gZDQwCisJaW11bAklcnNpLCAlcmN4CQlDCQkJIDgJMTAJIDgKKwlzaHIJJDQwLCAlcmN4CQlDCQkJMTIJMTUJMTEKKwlzYWwJJDExLCBSMzIoJXJheCkJCUMJCQkgNQkgNgkgNgorCWRlYwlSMzIoJXJheCkKKwlzdWIJUjMyKCVyY3gpLCBSMzIoJXJheCkJQwklcmF4ID0gdjEKKworCUMgdjIgPSAodjEgPDwgMTMpICsgKHYxICogKDJeNjAgLSB2MSpkNDApID4+IDQ3KQorCW1vdgkkMHgxMDAwMDAwMDAwMDAwMDAwLCAlcmN4CisJaW11bAklcmF4LCAlcnNpCQlDCQkJMTQJMTcJMTMKKwlzdWIJJXJzaSwgJXJjeAorCWltdWwJJXJheCwgJXJjeAorCXNhbAkkMTMsICVyYXgKKwlzaHIJJDQ3LCAlcmN4CisJYWRkCSVyYXgsICVyY3gJCUMJJXJjeCA9IHYyCisKKwlDIHYzID0gKHYyIDw8IDMxKSArICh2MiAqICgyXjk2IC0gdjIgKiBkNjMgKyAoKHYyID4+IDEpICYgbWFzaykpID4+IDY1KQorCW1vdgklcmRpLCAlcnNpCQlDCQkJIDAJIDAJIDAKKwlzaHIJJXJzaQkJCUMgZC8yCisJc2JiCSVyYXgsICVyYXgJCUMgLWQwID0gLShkIG1vZCAyKQorCXN1YgklcmF4LCAlcnNpCQlDIGQ2MyA9IGNlaWwoZC8yKQorCWltdWwJJXJjeCwgJXJzaQkJQyB2MiAqIGQ2MworCWFuZAklcmN4LCAlcmF4CQlDIHYyICogZDAKKwlzaHIJJXJheAkJCUMgKHYyPj4xKSAqIGQwCisJc3ViCSVyc2ksICVyYXgJCUMgKHYyPj4xKSAqIGQwIC0gdjIgKiBkNjMKKwltdWwJJXJjeAorCXNhbAkkMzEsICVyY3gKKwlzaHIJJXJkeAorCWFkZAklcmR4LCAlcmN4CQlDCSVyY3ggPSB2MworCisJbW92CSVyZGksICVyYXgKKwltdWwJJXJjeAorCWFkZAklcmRpLCAlcmF4CisJbW92CSVyY3gsICVyYXgKKwlhZGMJJXJkaSwgJXJkeAorCXN1YgklcmR4LCAlcmF4CisKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQorQVNNX0VORCgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L2ludmVydF9saW1iX3RhYmxlLmFzbSBiL21wbi94ODZfNjQvaW52ZXJ0X2xpbWJfdGFibGUuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjM3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2ludmVydF9saW1iX3RhYmxlLmFzbQpAQCAtMCwwICsxLDUwIEBACitkbmwgIFRhYmxlIHVzZWQgZm9yIG1wbl9pbnZlcnRfbGltYgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZCBhbmQgTmllbHMgTcO2bGxlci4KKworZG5sICBDb3B5cmlnaHQgMjAwNCwgMjAwNy0yMDA5LCAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworUFJPVEVDVChgbXBuX2ludmVydF9saW1iX3RhYmxlJykKKworQVNNX1NUQVJUKCkKK0MgVGFibGUgZW50cnkgWCBjb250YWlucyBmbG9vciAoMHg3ZmQwMCAvICgweDEwMCArIFgpKQorCisJUk9EQVRBCisJQUxJR04oMikKKwlHTE9CTCBtcG5faW52ZXJ0X2xpbWJfdGFibGUKK21wbl9pbnZlcnRfbGltYl90YWJsZToKK2Zvcmxvb3AoaSwyNTYsNTEyLTEsZG5sCitgCS52YWx1ZQlldmFsKDB4N2ZkMDAvaSkKKycpZG5sCitBU01fRU5EKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvbG9nb3BzX24uYXNtIGIvbXBuL3g4Nl82NC9sb2dvcHNfbi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyOWE5NgotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvbG9nb3BzX24uYXNtCkBAIC0wLDAgKzEsMjYwIEBACitkbmwgIEFNRDY0IGxvZ29wcy4KKworZG5sICBDb3B5cmlnaHQgMjAwNC0yMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkJYy9sCWMvbAljL2wJZ29vZAorQwkgICAgICAgdmFyLTEgICB2YXItMiAgIHZhci0zICBmb3IgY3B1PworQyBBTUQgSzgsSzkJIDEuNQkgMS41CSAxLjUJIHkKK0MgQU1EIEsxMAkgMS41CSAxLjUJIDEuNQkgeQorQyBBTUQgYmQxCitDIEFNRCBiZDIKK0MgQU1EIGJkMworQyBBTUQgYmQ0CitDIEFNRCBidDEJIDIuNjcJfjIuNzkJfjIuNjcKK0MgQU1EIGJ0MgkgMi4wCSAyLjI4CSAyLjI4CSB5CitDIEFNRCB6ZW4JIDEuNQkgMS41CSAxLjUJID0KK0MgSW50ZWwgUDQJIDIuOAkgMy4zNQkgMy42CitDIEludGVsIFBOUgkgMi4wCSAyLjAJIDIuMAkgPQorQyBJbnRlbCBOSE0JIDIuMAkgMi4wCSAyLjAJID0KK0MgSW50ZWwgU0JSCSAxLjUJIDEuNzUJIDEuNzUJIG4KK0MgSW50ZWwgSUJSCSAxLjQ4CSAxLjcxCSAxLjcyCSBuCitDIEludGVsIEhXTAkgMS41CSAxLjUJIDEuNQkgbgorQyBJbnRlbCBCV0wJIDEuNQkgMS41CSAxLjUJIG4KK0MgSW50ZWwgU0tMCSAxLjUJIDEuNQkgMS41CSBuCitDIEludGVsIGF0b20JIDMuODIJIDMuODIJIDMuODIJIG4KK0MgSW50ZWwgU0xNCSAzLjAJIDMuMAkgMy4wCSA9CitDIFZJQSBuYW5vCSAzLjI1CisKK2lmZGVmKGBPUEVSQVRJT05fYW5kX24nLGAKKyAgZGVmaW5lKGBmdW5jJyxgbXBuX2FuZF9uJykKKyAgZGVmaW5lKGBWQVJJQU5UXzEnKQorICBkZWZpbmUoYExPR09QJyxgYW5kJyknKQoraWZkZWYoYE9QRVJBVElPTl9hbmRuX24nLGAKKyAgZGVmaW5lKGBmdW5jJyxgbXBuX2FuZG5fbicpCisgIGRlZmluZShgVkFSSUFOVF8yJykKKyAgZGVmaW5lKGBMT0dPUCcsYGFuZCcpJykKK2lmZGVmKGBPUEVSQVRJT05fbmFuZF9uJyxgCisgIGRlZmluZShgZnVuYycsYG1wbl9uYW5kX24nKQorICBkZWZpbmUoYFZBUklBTlRfMycpCisgIGRlZmluZShgTE9HT1AnLGBhbmQnKScpCitpZmRlZihgT1BFUkFUSU9OX2lvcl9uJyxgCisgIGRlZmluZShgZnVuYycsYG1wbl9pb3JfbicpCisgIGRlZmluZShgVkFSSUFOVF8xJykKKyAgZGVmaW5lKGBMT0dPUCcsYG9yJyknKQoraWZkZWYoYE9QRVJBVElPTl9pb3JuX24nLGAKKyAgZGVmaW5lKGBmdW5jJyxgbXBuX2lvcm5fbicpCisgIGRlZmluZShgVkFSSUFOVF8yJykKKyAgZGVmaW5lKGBMT0dPUCcsYG9yJyknKQoraWZkZWYoYE9QRVJBVElPTl9uaW9yX24nLGAKKyAgZGVmaW5lKGBmdW5jJyxgbXBuX25pb3JfbicpCisgIGRlZmluZShgVkFSSUFOVF8zJykKKyAgZGVmaW5lKGBMT0dPUCcsYG9yJyknKQoraWZkZWYoYE9QRVJBVElPTl94b3JfbicsYAorICBkZWZpbmUoYGZ1bmMnLGBtcG5feG9yX24nKQorICBkZWZpbmUoYFZBUklBTlRfMScpCisgIGRlZmluZShgTE9HT1AnLGB4b3InKScpCitpZmRlZihgT1BFUkFUSU9OX3hub3JfbicsYAorICBkZWZpbmUoYGZ1bmMnLGBtcG5feG5vcl9uJykKKyAgZGVmaW5lKGBWQVJJQU5UXzInKQorICBkZWZpbmUoYExPR09QJyxgeG9yJyknKQorCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX2FuZF9uIG1wbl9hbmRuX24gbXBuX25hbmRfbiBtcG5faW9yX24gbXBuX2lvcm5fbiBtcG5fbmlvcl9uIG1wbl94b3JfbiBtcG5feG5vcl9uKQorCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcnAnLGAlcmRpJykKK2RlZmluZShgdXAnLGAlcnNpJykKK2RlZmluZShgdnAnLGAlcmR4JykKK2RlZmluZShgbicsYCVyY3gnKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCitpZmRlZihgVkFSSUFOVF8xJyxgCisJVEVYVAorCUFMSUdOKDMyKQorUFJPTE9HVUUoZnVuYykKKwlGVU5DX0VOVFJZKDQpCisJbW92CSh2cCksICVyOAorCW1vdglSMzIoJXJjeCksIFIzMiglcmF4KQorCWxlYQkodnAsbiw4KSwgdnAKKwlsZWEJKHVwLG4sOCksIHVwCisJbGVhCShycCxuLDgpLCBycAorCW5lZwluCisJYW5kCSQzLCBSMzIoJXJheCkKKwlqZQlMKGIwMCkKKwljbXAJJDIsIFIzMiglcmF4KQorCWpjCUwoYjAxKQorCWplCUwoYjEwKQorCitMKGIxMSk6CUxPR09QCSh1cCxuLDgpLCAlcjgKKwltb3YJJXI4LCAocnAsbiw4KQorCWRlYwluCisJam1wCUwoZTExKQorTChiMTApOglhZGQJJC0yLCBuCisJam1wCUwoZTEwKQorTChiMDEpOglMT0dPUAkodXAsbiw4KSwgJXI4CisJbW92CSVyOCwgKHJwLG4sOCkKKwlpbmMJbgorCWp6CUwocmV0KQorCitMKHRvcCk6CW1vdgkodnAsbiw4KSwgJXI4CitMKGIwMCk6CW1vdgk4KHZwLG4sOCksICVyOQorCUxPR09QCSh1cCxuLDgpLCAlcjgKKwlMT0dPUAk4KHVwLG4sOCksICVyOQorCW5vcAkJCQlDIEs4L0s5L0sxMCBjb25jZXNzaW9uCisJbW92CSVyOCwgKHJwLG4sOCkKKwltb3YJJXI5LCA4KHJwLG4sOCkKK0woZTExKToJbW92CTE2KHZwLG4sOCksICVyOAorTChlMTApOgltb3YJMjQodnAsbiw4KSwgJXI5CisJTE9HT1AJMTYodXAsbiw4KSwgJXI4CisJTE9HT1AJMjQodXAsbiw4KSwgJXI5CisJbW92CSVyOCwgMTYocnAsbiw4KQorCW1vdgklcjksIDI0KHJwLG4sOCkKKwlhZGQJJDQsIG4KKwlqbmMJTCh0b3ApCisKK0wocmV0KToJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKKycpCisKK2lmZGVmKGBWQVJJQU5UXzInLGAKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShmdW5jKQorCUZVTkNfRU5UUlkoNCkKKwltb3YJKHZwKSwgJXI4CisJbm90CSVyOAorCW1vdglSMzIoJXJjeCksIFIzMiglcmF4KQorCWxlYQkodnAsbiw4KSwgdnAKKwlsZWEJKHVwLG4sOCksIHVwCisJbGVhCShycCxuLDgpLCBycAorCW5lZwluCisJYW5kCSQzLCBSMzIoJXJheCkKKwlqZQlMKGIwMCkKKwljbXAJJDIsIFIzMiglcmF4KQorCWpjCUwoYjAxKQorCWplCUwoYjEwKQorCitMKGIxMSk6CUxPR09QCSh1cCxuLDgpLCAlcjgKKwltb3YJJXI4LCAocnAsbiw4KQorCWRlYwluCisJam1wCUwoZTExKQorTChiMTApOglhZGQJJC0yLCBuCisJam1wCUwoZTEwKQorCS5ieXRlCTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKK0woYjAxKToJTE9HT1AJKHVwLG4sOCksICVyOAorCW1vdgklcjgsIChycCxuLDgpCisJaW5jCW4KKwlqeglMKHJldCkKKworTCh0b3ApOgltb3YJKHZwLG4sOCksICVyOAorCW5vdAklcjgKK0woYjAwKToJbW92CTgodnAsbiw4KSwgJXI5CisJbm90CSVyOQorCUxPR09QCSh1cCxuLDgpLCAlcjgKKwlMT0dPUAk4KHVwLG4sOCksICVyOQorCW1vdgklcjgsIChycCxuLDgpCisJbW92CSVyOSwgOChycCxuLDgpCitMKGUxMSk6CW1vdgkxNih2cCxuLDgpLCAlcjgKKwlub3QJJXI4CitMKGUxMCk6CW1vdgkyNCh2cCxuLDgpLCAlcjkKKwlub3QJJXI5CisJTE9HT1AJMTYodXAsbiw4KSwgJXI4CisJTE9HT1AJMjQodXAsbiw4KSwgJXI5CisJbW92CSVyOCwgMTYocnAsbiw4KQorCW1vdgklcjksIDI0KHJwLG4sOCkKKwlhZGQJJDQsIG4KKwlqbmMJTCh0b3ApCisKK0wocmV0KToJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKKycpCisKK2lmZGVmKGBWQVJJQU5UXzMnLGAKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShmdW5jKQorCUZVTkNfRU5UUlkoNCkKKwltb3YJKHZwKSwgJXI4CisJbW92CVIzMiglcmN4KSwgUjMyKCVyYXgpCisJbGVhCSh2cCxuLDgpLCB2cAorCWxlYQkodXAsbiw4KSwgdXAKKwlsZWEJKHJwLG4sOCksIHJwCisJbmVnCW4KKwlhbmQJJDMsIFIzMiglcmF4KQorCWplCUwoYjAwKQorCWNtcAkkMiwgUjMyKCVyYXgpCisJamMJTChiMDEpCisJamUJTChiMTApCisKK0woYjExKToJTE9HT1AJKHVwLG4sOCksICVyOAorCW5vdAklcjgKKwltb3YJJXI4LCAocnAsbiw4KQorCWRlYwluCisJam1wCUwoZTExKQorTChiMTApOglhZGQJJC0yLCBuCisJam1wCUwoZTEwKQorCS5ieXRlCTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKK0woYjAxKToJTE9HT1AJKHVwLG4sOCksICVyOAorCW5vdAklcjgKKwltb3YJJXI4LCAocnAsbiw4KQorCWluYwluCisJanoJTChyZXQpCisKK0wodG9wKToJbW92CSh2cCxuLDgpLCAlcjgKK0woYjAwKToJbW92CTgodnAsbiw4KSwgJXI5CisJTE9HT1AJKHVwLG4sOCksICVyOAorCW5vdAklcjgKKwlMT0dPUAk4KHVwLG4sOCksICVyOQorCW5vdAklcjkKKwltb3YJJXI4LCAocnAsbiw4KQorCW1vdgklcjksIDgocnAsbiw4KQorTChlMTEpOgltb3YJMTYodnAsbiw4KSwgJXI4CitMKGUxMCk6CW1vdgkyNCh2cCxuLDgpLCAlcjkKKwlMT0dPUAkxNih1cCxuLDgpLCAlcjgKKwlub3QJJXI4CisJTE9HT1AJMjQodXAsbiw4KSwgJXI5CisJbm90CSVyOQorCW1vdgklcjgsIDE2KHJwLG4sOCkKKwltb3YJJXI5LCAyNChycCxuLDgpCisJYWRkCSQ0LCBuCisJam5jCUwodG9wKQorCitMKHJldCk6CUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCisnKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9sc2hpZnQuYXNtIGIvbXBuL3g4Nl82NC9sc2hpZnQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWUxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2xzaGlmdC5hc20KQEAgLTAsMCArMSwxNzIgQEAKK2RubCAgQU1ENjQgbXBuX2xzaGlmdCAtLSBtcG4gbGVmdCBzaGlmdC4KKworZG5sICBDb3B5cmlnaHQgMjAwMywgMjAwNSwgMjAwNywgMjAwOSwgMjAxMSwgMjAxMiwgMjAxOCBGcmVlIFNvZnR3YXJlCitkbmwgIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvbGltYiAgIGN5Y2xlcy9saW1iIGNudD0xCitDIEFNRCBLOCxLOQkgMi4zNzUJCSAxLjM3NQorQyBBTUQgSzEwCSAyLjM3NQkJIDEuMzc1CitDIEludGVsIFA0CSA4CQkxMC41CitDIEludGVsIGNvcmUyCSAyLjExCQkgNC4yOAorQyBJbnRlbCBjb3JlaQkgPwkJID8KK0MgSW50ZWwgYXRvbQkgNS43NQkJIDMuNQorQyBWSUEgbmFubwkgMy41CQkgMi4yNQorCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsCWAlcmRpJykKK2RlZmluZShgdXAnLAlgJXJzaScpCitkZWZpbmUoYG4nLAlgJXJkeCcpCitkZWZpbmUoYGNudCcsCWAlcmN4JykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShtcG5fbHNoaWZ0KQorCUZVTkNfRU5UUlkoNCkKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJLTgodXAsbiw4KSwgJXJheAorCXNocglSOCglcmN4KSwgJXJheAkJQyBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCWxlYQkxKG4pLCBSMzIoJXI4KQorCWFuZAkkMywgUjMyKCVyOCkKKwlqZQlMKHJseCkJCQlDIGp1bXAgZm9yIG4gPSAzLCA3LCAxMSwgLi4uCisKKwlkZWMJUjMyKCVyOCkKKwlqbmUJTCgxKQorQwluID0gNCwgOCwgMTIsIC4uLgorCW1vdgktOCh1cCxuLDgpLCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CS0xNih1cCxuLDgpLCAlcjgKKwlzaHIJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCW1vdgklcjEwLCAtOChycCxuLDgpCisJZGVjCW4KKwlqbXAJTChybGwpCisKK0woMSk6CWRlYwlSMzIoJXI4KQorCWplCUwoMXgpCQkJQyBqdW1wIGZvciBuID0gMSwgNSwgOSwgMTMsIC4uLgorQwluID0gMiwgNiwgMTAsIDE2LCAuLi4KKwltb3YJLTgodXAsbiw4KSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXIxMAorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IHJzaCBjb3VudCBpbiBjbAorCW1vdgktMTYodXAsbiw4KSwgJXI4CisJc2hyCVI4KCVyY3gpLCAlcjgKKwlvcgklcjgsICVyMTAKKwltb3YJJXIxMCwgLTgocnAsbiw4KQorCWRlYwluCisJbmVnCVIzMiglcmN4KQkJQyBwdXQgbHNoIGNvdW50IGluIGNsCitMKDF4KToKKwljbXAJJDEsIG4KKwlqZQlMKGFzdCkKKwltb3YJLTgodXAsbiw4KSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXIxMAorCW1vdgktMTYodXAsbiw4KSwgJXIxMQorCXNobAlSOCglcmN4KSwgJXIxMQorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IHJzaCBjb3VudCBpbiBjbAorCW1vdgktMTYodXAsbiw4KSwgJXI4CisJbW92CS0yNCh1cCxuLDgpLCAlcjkKKwlzaHIJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCXNocglSOCglcmN4KSwgJXI5CisJb3IJJXI5LCAlcjExCisJbW92CSVyMTAsIC04KHJwLG4sOCkKKwltb3YJJXIxMSwgLTE2KHJwLG4sOCkKKwlzdWIJJDIsIG4KKworTChybGwpOgluZWcJUjMyKCVyY3gpCQlDIHB1dCBsc2ggY291bnQgaW4gY2wKK0wocmx4KToJbW92CS04KHVwLG4sOCksICVyMTAKKwlzaGwJUjgoJXJjeCksICVyMTAKKwltb3YJLTE2KHVwLG4sOCksICVyMTEKKwlzaGwJUjgoJXJjeCksICVyMTEKKworCXN1YgkkNCwgbgkJCUMJCQkJICAgICAgNAorCWpiCUwoZW5kKQkJCUMJCQkJICAgICAgMgorCUFMSUdOKDE2KQorTCh0b3ApOgorCUMgZmluaXNoIHN0dWZmIGZyb20gbHNoIGJsb2NrCisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CTE2KHVwLG4sOCksICVyOAorCW1vdgk4KHVwLG4sOCksICVyOQorCXNocglSOCglcmN4KSwgJXI4CisJb3IJJXI4LCAlcjEwCisJc2hyCVI4KCVyY3gpLCAlcjkKKwlvcgklcjksICVyMTEKKwltb3YJJXIxMCwgMjQocnAsbiw4KQorCW1vdgklcjExLCAxNihycCxuLDgpCisJQyBzdGFydCB0d28gbmV3IHJzaAorCW1vdgkwKHVwLG4sOCksICVyOAorCW1vdgktOCh1cCxuLDgpLCAlcjkKKwlzaHIJUjgoJXJjeCksICVyOAorCXNocglSOCglcmN4KSwgJXI5CisKKwlDIGZpbmlzaCBzdHVmZiBmcm9tIHJzaCBibG9jaworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCW1vdgk4KHVwLG4sOCksICVyMTAKKwltb3YJMCh1cCxuLDgpLCAlcjExCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJb3IJJXIxMCwgJXI4CisJc2hsCVI4KCVyY3gpLCAlcjExCisJb3IJJXIxMSwgJXI5CisJbW92CSVyOCwgOChycCxuLDgpCisJbW92CSVyOSwgMChycCxuLDgpCisJQyBzdGFydCB0d28gbmV3IGxzaAorCW1vdgktOCh1cCxuLDgpLCAlcjEwCisJbW92CS0xNih1cCxuLDgpLCAlcjExCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjExCisKKwlzdWIJJDQsIG4KKwlqYWUJTCh0b3ApCQkJQwkJCQkgICAgICAyCitMKGVuZCk6CisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CTgodXApLCAlcjgKKwlzaHIJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCW1vdgkodXApLCAlcjkKKwlzaHIJUjgoJXJjeCksICVyOQorCW9yCSVyOSwgJXIxMQorCW1vdgklcjEwLCAxNihycCkKKwltb3YJJXIxMSwgOChycCkKKworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorTChhc3QpOgltb3YJKHVwKSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXIxMAorCW1vdgklcjEwLCAocnApCisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvbHNoaWZ0Yy5hc20gYi9tcG4veDg2XzY0L2xzaGlmdGMuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2M3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L2xzaGlmdGMuYXNtCkBAIC0wLDAgKzEsMTgyIEBACitkbmwgIEFNRDY0IG1wbl9sc2hpZnRjIC0tIG1wbiBsZWZ0IHNoaWZ0IHdpdGggY29tcGxlbWVudC4KKworZG5sICBDb3B5cmlnaHQgMjAwMywgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIuNzUKK0MgQU1EIEsxMAkgMi43NQorQyBJbnRlbCBQNAkgPworQyBJbnRlbCBjb3JlMgkgPworQyBJbnRlbCBjb3JlaQkgPworQyBJbnRlbCBhdG9tCSA/CitDIFZJQSBuYW5vCSAzLjc1CisKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywJYCVyZGknKQorZGVmaW5lKGB1cCcsCWAlcnNpJykKK2RlZmluZShgbicsCWAlcmR4JykKK2RlZmluZShgY250JywJYCVyY3gnKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigzMikKK1BST0xPR1VFKG1wbl9sc2hpZnRjKQorCUZVTkNfRU5UUlkoNCkKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJLTgodXAsbiw4KSwgJXJheAorCXNocglSOCglcmN4KSwgJXJheAkJQyBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCWxlYQkxKG4pLCBSMzIoJXI4KQorCWFuZAkkMywgUjMyKCVyOCkKKwlqZQlMKHJseCkJCQlDIGp1bXAgZm9yIG4gPSAzLCA3LCAxMSwgLi4uCisKKwlkZWMJUjMyKCVyOCkKKwlqbmUJTCgxKQorQwluID0gNCwgOCwgMTIsIC4uLgorCW1vdgktOCh1cCxuLDgpLCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CS0xNih1cCxuLDgpLCAlcjgKKwlzaHIJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCW5vdAklcjEwCisJbW92CSVyMTAsIC04KHJwLG4sOCkKKwlkZWMJbgorCWptcAlMKHJsbCkKKworTCgxKToJZGVjCVIzMiglcjgpCisJamUJTCgxeCkJCQlDIGp1bXAgZm9yIG4gPSAxLCA1LCA5LCAxMywgLi4uCitDCW4gPSAyLCA2LCAxMCwgMTYsIC4uLgorCW1vdgktOCh1cCxuLDgpLCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CS0xNih1cCxuLDgpLCAlcjgKKwlzaHIJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCW5vdAklcjEwCisJbW92CSVyMTAsIC04KHJwLG4sOCkKKwlkZWMJbgorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorTCgxeCk6CisJY21wCSQxLCBuCisJamUJTChhc3QpCisJbW92CS04KHVwLG4sOCksICVyMTAKKwlzaGwJUjgoJXJjeCksICVyMTAKKwltb3YJLTE2KHVwLG4sOCksICVyMTEKKwlzaGwJUjgoJXJjeCksICVyMTEKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJLTE2KHVwLG4sOCksICVyOAorCW1vdgktMjQodXAsbiw4KSwgJXI5CisJc2hyCVI4KCVyY3gpLCAlcjgKKwlvcgklcjgsICVyMTAKKwlzaHIJUjgoJXJjeCksICVyOQorCW9yCSVyOSwgJXIxMQorCW5vdAklcjEwCisJbm90CSVyMTEKKwltb3YJJXIxMCwgLTgocnAsbiw4KQorCW1vdgklcjExLCAtMTYocnAsbiw4KQorCXN1YgkkMiwgbgorCitMKHJsbCk6CW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorTChybHgpOgltb3YJLTgodXAsbiw4KSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXIxMAorCW1vdgktMTYodXAsbiw4KSwgJXIxMQorCXNobAlSOCglcmN4KSwgJXIxMQorCisJc3ViCSQ0LCBuCQkJQwkJCQkgICAgICA0CisJamIJTChlbmQpCQkJQwkJCQkgICAgICAyCisJQUxJR04oMTYpCitMKHRvcCk6CisJQyBmaW5pc2ggc3R1ZmYgZnJvbSBsc2ggYmxvY2sKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJMTYodXAsbiw4KSwgJXI4CisJbW92CTgodXAsbiw4KSwgJXI5CisJc2hyCVI4KCVyY3gpLCAlcjgKKwlvcgklcjgsICVyMTAKKwlzaHIJUjgoJXJjeCksICVyOQorCW9yCSVyOSwgJXIxMQorCW5vdAklcjEwCisJbm90CSVyMTEKKwltb3YJJXIxMCwgMjQocnAsbiw4KQorCW1vdgklcjExLCAxNihycCxuLDgpCisJQyBzdGFydCB0d28gbmV3IHJzaAorCW1vdgkwKHVwLG4sOCksICVyOAorCW1vdgktOCh1cCxuLDgpLCAlcjkKKwlzaHIJUjgoJXJjeCksICVyOAorCXNocglSOCglcmN4KSwgJXI5CisKKwlDIGZpbmlzaCBzdHVmZiBmcm9tIHJzaCBibG9jaworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCW1vdgk4KHVwLG4sOCksICVyMTAKKwltb3YJMCh1cCxuLDgpLCAlcjExCisJc2hsCVI4KCVyY3gpLCAlcjEwCisJb3IJJXIxMCwgJXI4CisJc2hsCVI4KCVyY3gpLCAlcjExCisJb3IJJXIxMSwgJXI5CisJbm90CSVyOAorCW5vdAklcjkKKwltb3YJJXI4LCA4KHJwLG4sOCkKKwltb3YJJXI5LCAwKHJwLG4sOCkKKwlDIHN0YXJ0IHR3byBuZXcgbHNoCisJbW92CS04KHVwLG4sOCksICVyMTAKKwltb3YJLTE2KHVwLG4sOCksICVyMTEKKwlzaGwJUjgoJXJjeCksICVyMTAKKwlzaGwJUjgoJXJjeCksICVyMTEKKworCXN1YgkkNCwgbgorCWphZQlMKHRvcCkJCQlDCQkJCSAgICAgIDIKK0woZW5kKToKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJOCh1cCksICVyOAorCXNocglSOCglcmN4KSwgJXI4CisJb3IJJXI4LCAlcjEwCisJbW92CSh1cCksICVyOQorCXNocglSOCglcmN4KSwgJXI5CisJb3IJJXI5LCAlcjExCisJbm90CSVyMTAKKwlub3QJJXIxMQorCW1vdgklcjEwLCAxNihycCkKKwltb3YJJXIxMSwgOChycCkKKworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorTChhc3QpOgltb3YJKHVwKSwgJXIxMAorCXNobAlSOCglcmN4KSwgJXIxMAorCW5vdAklcjEwCisJbW92CSVyMTAsIChycCkKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9sc2hzdWJfbi5hc20gYi9tcG4veDg2XzY0L2xzaHN1Yl9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJiYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9sc2hzdWJfbi5hc20KQEAgLTAsMCArMSwxNzIgQEAKK2RubCAgQU1ENjQgbXBuX2xzaHN1Yl9uLiAgUiA9IDJeayhVIC0gVikuCisKK2RubCAgQ29weXJpZ2h0IDIwMDYsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAzLjE1CShtcG5fc3ViX24gKyBtcG5fbHNoaWZ0IGNvc3RzIGFib3V0IDQgYy9sKQorQyBBTUQgSzEwCSAzLjE1CShtcG5fc3ViX24gKyBtcG5fbHNoaWZ0IGNvc3RzIGFib3V0IDQgYy9sKQorQyBJbnRlbCBQNAkxNi41CitDIEludGVsIGNvcmUyCSA0LjM1CitDIEludGVsIGNvcmVpCSA/CitDIEludGVsIGF0b20JID8KK0MgVklBIG5hbm8JID8KKworQyBUaGlzIHdhcyB3cml0dGVuIHF1aWNrbHkgYW5kIG5vdCBvcHRpbWl6ZWQgYXQgYWxsLCBidXQgaXQgcnVucyB2ZXJ5IHdlbGwgb24KK0MgSzguICBCdXQgcGVyaGFwcyBvbmUgY291bGQgZ2V0IHVuZGVyIDMgYy9sLiAgSWRlYXM6CitDICAgMSkgVXNlIGluZGV4aW5nIHRvIHNhdmUgdGhlIDMgTEVBCitDICAgMikgV3JpdGUgcmVhc29uYWJsZSBmZWVkLWluIGNvZGUKK0MgICAzKSBCZSBtb3JlIGNsZXZlciBhYm91dCByZWdpc3RlciB1c2FnZQorQyAgIDQpIFVucm9sbCBtb3JlLCBoYW5kbGluZyBDTCBuZWdhdGlvbiwgY2Fycnkgc2F2ZS9yZXN0b3JlIGNvc3QgbXVjaCBub3cKK0MgICA1KSBSZXNjaGVkdWxlCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsCWAlcmRpJykKK2RlZmluZShgdXAnLAlgJXJzaScpCitkZWZpbmUoYHZwJywJYCVyZHgnKQorZGVmaW5lKGBuJywJYCVyY3gnKQorZGVmaW5lKGBjbnQnLAlgJXI4JykKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fbHNoc3ViX24pCisJRlVOQ19FTlRSWSg0KQorSUZET1MoYAltb3YJNTYoJXJzcCksICVyOGQJJykKKworCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2gJJXJieAorCisJbW92CW4sICVyYXgKKwl4b3IJUjMyKCVyYngpLCBSMzIoJXJieCkJQyBjbGVhciBjYXJyeSBzYXZlIHJlZ2lzdGVyCisJbW92CVIzMiglcjgpLCBSMzIoJXJjeCkJQyBzaGlmdCBjb3VudAorCXhvcglSMzIoJXIxNSksIFIzMiglcjE1KQlDIGxpbWIgY2FycnkKKworCW1vdglSMzIoJXJheCksIFIzMiglcjExKQorCWFuZAkkMywgUjMyKCVyMTEpCisJamUJTCg0KQorCXN1YgkkMSwgUjMyKCVyMTEpCisKK0wob29wZXR0ZSk6CisJYWRkCVIzMiglcmJ4KSwgUjMyKCVyYngpCUMgcmVzdG9yZSBjYXJyeSBmbGFnCisJbW92CTAodXApLCAlcjgKKwlsZWEJOCh1cCksIHVwCisJc2JiCTAodnApLCAlcjgKKwltb3YJJXI4LCAlcjEyCisJc2JiCVIzMiglcmJ4KSwgUjMyKCVyYngpCUMgc2F2ZSBjYXJyeSBmbGFnCisJc2hsCVI4KCVyY3gpLCAlcjgKKwlvcgklcjE1LCAlcjgKKwltb3YJJXIxMiwgJXIxNQorCWxlYQk4KHZwKSwgdnAKKwluZWcJUjgoJXJjeCkKKwlzaHIJUjgoJXJjeCksICVyMTUKKwluZWcJUjgoJXJjeCkKKwltb3YJJXI4LCAwKHJwKQorCWxlYQk4KHJwKSwgcnAKKwlzdWIJJDEsIFIzMiglcjExKQorCWpuYwlMKG9vcGV0dGUpCisKK0woNCk6CisJc3ViCSQ0LCAlcmF4CisJamMJTChlbmQpCisKKwlBTElHTigxNikKK0wob29wKToKKwlhZGQJUjMyKCVyYngpLCBSMzIoJXJieCkJQyByZXN0b3JlIGNhcnJ5IGZsYWcKKworCW1vdgkwKHVwKSwgJXI4CisJbW92CTgodXApLCAlcjkKKwltb3YJMTYodXApLCAlcjEwCisJbW92CTI0KHVwKSwgJXIxMQorCisJbGVhCTMyKHVwKSwgdXAKKworCXNiYgkwKHZwKSwgJXI4CisJbW92CSVyOCwgJXIxMgorCXNiYgk4KHZwKSwgJXI5CisJbW92CSVyOSwgJXIxMworCXNiYgkxNih2cCksICVyMTAKKwltb3YJJXIxMCwgJXIxNAorCXNiYgkyNCh2cCksICVyMTEKKworCXNiYglSMzIoJXJieCksIFIzMiglcmJ4KQlDIHNhdmUgY2FycnkgZmxhZworCisJc2hsCVI4KCVyY3gpLCAlcjgKKwlzaGwJUjgoJXJjeCksICVyOQorCXNobAlSOCglcmN4KSwgJXIxMAorCW9yCSVyMTUsICVyOAorCW1vdgklcjExLCAlcjE1CisJc2hsCVI4KCVyY3gpLCAlcjExCisKKwlsZWEJMzIodnApLCB2cAorCisJbmVnCVI4KCVyY3gpCisKKwlzaHIJUjgoJXJjeCksICVyMTIKKwlzaHIJUjgoJXJjeCksICVyMTMKKwlzaHIJUjgoJXJjeCksICVyMTQKKwlzaHIJUjgoJXJjeCksICVyMTUJCUMgdXNlZCBuZXh0IGxvb3AKKworCW9yCSVyMTIsICVyOQorCW9yCSVyMTMsICVyMTAKKwlvcgklcjE0LCAlcjExCisKKwluZWcJUjgoJXJjeCkKKworCW1vdgklcjgsIDAocnApCisJbW92CSVyOSwgOChycCkKKwltb3YJJXIxMCwgMTYocnApCisJbW92CSVyMTEsIDI0KHJwKQorCisJbGVhCTMyKHJwKSwgcnAKKworCXN1YgkkNCwgJXJheAorCWpuYwlMKG9vcCkKK0woZW5kKToKKwluZWcJUjMyKCVyYngpCisJc2hsCVI4KCVyY3gpLCAlcmJ4CisJYWRjCSVyMTUsICVyYngKKwltb3YJJXJieCwgJXJheAorCXBvcAklcmJ4CisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKworCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L21pc3NpbmctY2FsbC5tNCBiL21wbi94ODZfNjQvbWlzc2luZy1jYWxsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjRmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L21pc3NpbmctY2FsbC5tNApAQCAtMCwwICsxLDUzIEBACitkbmwgIEFNRDY0IE1VTFgvQURYIHNpbXVsYXRpb24gc3VwcG9ydCwgZnVuY3Rpb24gY2FsbCB2ZXJzaW9uLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitkZWZpbmUoYGFkb3gnLGAKKwlwdXNoCSQxCisJcHVzaAkkMgorCWNhbGwJX19nbXBfYWRveAorCXBvcAkkMgorJykKKworZGVmaW5lKGBhZGN4JyxgCisJcHVzaAkkMQorCXB1c2gJJDIKKwljYWxsCV9fZ21wX2FkY3gKKwlwb3AJJDIKKycpCisKK2RlZmluZShgbXVseCcsYAorCXB1c2gJJDEKKwljYWxsCV9fZ21wX211bHgKKwlwb3AJJDIKKwlwb3AJJDMKKycpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L21pc3NpbmctaW5saW5lLm00IGIvbXBuL3g4Nl82NC9taXNzaW5nLWlubGluZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDFkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9taXNzaW5nLWlubGluZS5tNApAQCAtMCwwICsxLDEwMCBAQAorZG5sICBBTUQ2NCBNVUxYL0FEWCBzaW11bGF0aW9uIHN1cHBvcnQsIGlubGluZSB2ZXJzaW9uLgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitkZWZpbmUoYGFkb3gnLGAKKwlwdXNoCSQyCisJcHVzaAklcmN4CisJcHVzaAklcmJ4CisJcHVzaAklcmF4CisJbW92CSQxLCAlcmN4CisJcHVzaGZxCisJcHVzaGZxCitDIGNvcHkgMCglcnNwKToxMSB0byAwKCVyc3ApOjAKKwltb3YJKCVyc3ApLCAlcmJ4CisJc2hyCSVyYngKKwlidAkkYCcxMCwgJXJieAorCWFkYwklcmJ4LCAlcmJ4CisJbW92CSVyYngsICglcnNwKQorQyBwdXQgbWFuaXB1bGF0ZWQgZmxhZ3MgaW50byBlZmxhZ3MsIGV4ZWN1dGUgYSBwbGFpbiBhZGMKKwlwb3BmcQorCWFkYwklcmN4LCAzMiglcnNwKQorQyBjb3B5IENGIHRvIDAoJXJzcCk6MTEKKwltb3YJKCVyc3ApLCAlcmJ4CisJc2JiCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJYW5kCSRgJzB4ODAwLCBSMzIoJXJheCkKKwlhbmQJJGAnMHhmZmZmZmZmZmZmZmZmN2ZmLCAlcmJ4CisJb3IJJXJheCwgJXJieAorCW1vdgklcmJ4LCAoJXJzcCkKK0MgcHV0IG1hbmlwdWxhdGVkIGZsYWdzIGludG8gZWZsYWdzCisJcG9wZnEKKwlwb3AJJXJheAorCXBvcAklcmJ4CisJcG9wCSVyY3gKKwlwb3AJJDIKKycpCisKK2RlZmluZShgYWRjeCcsYAorCXB1c2gJJDIKKwlwdXNoCSVyY3gKKwlwdXNoCSVyYngKKwlwdXNoCSVyYXgKKwltb3YJJDEsICVyY3gKKwlwdXNoZnEKKwlhZGMJJXJjeCwgMzIoJXJzcCkKKwltb3YJKCVyc3ApLCAlcmJ4CisJc2JiCVIzMiglcmF4KSwgUjMyKCVyYXgpCisJYW5kCSRgJzB4ZmZmZmZmZmZmZmZmZmZmZSwgJXJieAorCXN1YgklcmF4LCAlcmJ4CisJbW92CSVyYngsICglcnNwKQorCXBvcGZxCisJcG9wCSVyYXgKKwlwb3AJJXJieAorCXBvcAklcmN4CisJcG9wCSQyCisnKQorCitkZWZpbmUoYG11bHgnLGAKKwlsZWEJLTE2KCVyc3ApLCAlcnNwCisJcHVzaAklcmF4CisJcHVzaAklcmR4CisJcHVzaGZxCQkJQyBwcmVzZXJ2ZSBhbGwgZmxhZ3MKKwltb3YJJDEsICVyYXgKKwltdWwJJXJkeAorCW1vdgklcmF4LCAyNCglcnNwKQorCW1vdgklcmR4LCAzMiglcnNwKQorCXBvcGZxCQkJQyByZXN0b3JlIGVmbGFncworCXBvcAklcmR4CisJcG9wCSVyYXgKKwlwb3AJJDIKKwlwb3AJJDMKKycpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L21pc3NpbmcuYXNtIGIvbXBuL3g4Nl82NC9taXNzaW5nLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMyYjhhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9taXNzaW5nLmFzbQpAQCAtMCwwICsxLDEzMCBAQAorCisJZG5sICBBTUQ2NCBNVUxYL0FEWCBzaW11bGF0aW9uIHN1cHBvcnQuCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0FTTV9TVEFSVCgpCisKK0MgRmFrZSB0aGUgTVVMWCBpbnN0cnVjdGlvbgorQworQyBBY2NlcHQgdGhlIHNpbmdsZSBleHBsaWNpdCBwYXJhbWV0ZXIgb24gdGhlIHN0YWNrLCByZXR1cm4gdGhlIHR3byByZXN1bHQKK0Mgd29yZHMgb24gdGhlIHN0YWNrLiAgVGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG1vdmUgdGhlCitDIHJldHVybiBhZGRyZXNzIHVwLgorQworUFJPTE9HVUUoX19nbXBfbXVseCkKKwlsZWEJLTgoJXJzcCksICVyc3AKKwlwdXNoCSVyYXgKKwlwdXNoCSVyZHgKKwlwdXNoZnEJCQkJQyBwcmVzZXJ2ZSBhbGwgZmxhZ3MKKwltb3YJMzIoJXJzcCksICVyYXgJCUMgbW92ZSByZXRhZGRyLi4uCisJbW92CSVyYXgsIDI0KCVyc3ApCQlDIC4uLnVwIHRoZSBzdGFjaworCW1vdgk0MCglcnNwKSwgJXJheAkJQyBpbnB1dCBwYXJhbWV0ZXIKKwltdWwJJXJkeAorCW1vdgklcmF4LCAzMiglcnNwKQorCW1vdgklcmR4LCA0MCglcnNwKQorCXBvcGZxCQkJCUMgcmVzdG9yZSBlZmxhZ3MKKwlwb3AJJXJkeAorCXBvcAklcmF4CisJcmV0CitFUElMT0dVRSgpCitQUk9URUNUKF9fZ21wX211bHgpCisKKworQyBGYWtlIHRoZSBBRE9YIGluc3RydWN0aW9uCitDCitDIEFjY2VwdCB0aGUgdHdvIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrLCByZXR1cm4gdGhlIHJlc3VsdCB3b3JkIG9uIHRoZSBzdGFjay4KK0MgVGhpcyBjYWxsaW5nIGNvbnZlbnRpb24gbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG1vdmUgdGhlIHJldHVybiBhZGRyZXNzIGRvd24uCitDCitQUk9MT0dVRShfX2dtcF9hZG94KQorCXB1c2gJJXJjeAorCXB1c2gJJXJieAorCXB1c2gJJXJheAorCW1vdgkzMiglcnNwKSwgJXJjeAkJQyBzcmMyCisJbW92CTI0KCVyc3ApLCAlcmF4CQlDIG1vdmUgcmV0YWRkci4uLgorCW1vdgklcmF4LCAzMiglcnNwKQkJQyAuLi5kb3duIHRoZSBzdGFjaworCXB1c2hmcQorQyBjb3B5IDAoJXJzcCk6MTEgdG8gMCglcnNwKTowCisJbW92CSglcnNwKSwgJXJieAorCXNocgklcmJ4CisJYnQJJDEwLCAlcmJ4CisJYWRjCSVyYngsICVyYngKKwlwdXNoCSVyYngKK0MgcHV0IG1hbmlwdWxhdGVkIGZsYWdzIGludG8gZWZsYWdzLCBleGVjdXRlIGEgcGxhaW4gYWRjCisJcG9wZnEKKwlhZGMJJXJjeCwgNDgoJXJzcCkKK0MgY29weSBDRiB0byAwKCVyc3ApOjExCisJcG9wCSVyYngKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkKKwlhbmQJJDB4ODAwLCBSMzIoJXJheCkKKwlhbmQJJDB4ZmZmZmZmZmZmZmZmZjdmZiwgJXJieAorCW9yCSVyYXgsICVyYngKKwlwdXNoCSVyYngKK0MgcHV0IG1hbmlwdWxhdGVkIGZsYWdzIGludG8gZWZsYWdzCisJcG9wZnEKKwlwb3AJJXJheAorCXBvcAklcmJ4CisJcG9wCSVyY3gKKwlsZWEJOCglcnNwKSwgJXJzcAorCXJldAorRVBJTE9HVUUoKQorUFJPVEVDVChfX2dtcF9hZG94KQorCisKK0MgRmFrZSB0aGUgQURDWCBpbnN0cnVjdGlvbgorQworQyBBY2NlcHQgdGhlIHR3byBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjaywgcmV0dXJuIHRoZSByZXN1bHQgd29yZCBvbiB0aGUgc3RhY2suCitDIFRoaXMgY2FsbGluZyBjb252ZW50aW9uIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBtb3ZlIHRoZSByZXR1cm4gYWRkcmVzcyBkb3duLgorQworUFJPTE9HVUUoX19nbXBfYWRjeCkKKwlwdXNoCSVyY3gKKwlwdXNoCSVyYngKKwlwdXNoCSVyYXgKKwltb3YJMzIoJXJzcCksICVyY3gJCUMgc3JjMgorCW1vdgkyNCglcnNwKSwgJXJheAkJQyBtb3ZlIHJldGFkZHIuLi4KKwltb3YJJXJheCwgMzIoJXJzcCkJCUMgLi4uZG93biB0aGUgc3RhY2sKKwlwdXNoZnEKKwlhZGMJJXJjeCwgNDgoJXJzcCkKKwlwb3AJJXJieAorCXNiYglSMzIoJXJheCksIFIzMiglcmF4KQorCWFuZAkkYCcweGZmZmZmZmZmZmZmZmZmZmUsICVyYngKKwlzdWIJJXJheCwgJXJieAorCXB1c2gJJXJieAorCXBvcGZxCisJcG9wCSVyYXgKKwlwb3AJJXJieAorCXBvcAklcmN4CisJbGVhCTgoJXJzcCksICVyc3AKKwlyZXQKK0VQSUxPR1VFKCkKK1BST1RFQ1QoX19nbXBfYWRjeCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvbW9kXzFfMS5hc20gYi9tcG4veDg2XzY0L21vZF8xXzEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTY2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L21vZF8xXzEuYXNtCkBAIC0wLDAgKzEsMjM4IEBACitkbmwgIEFNRDY0IG1wbl9tb2RfMV8xcAorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQgYW5kIE5pZWxzIE3DtmxsZXIuCisKK2RubCAgQ29weXJpZ2h0IDIwMDktMjAxMiwgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSA2CitDIEFNRCBLMTAJIDYKK0MgSW50ZWwgUDQJMjYKK0MgSW50ZWwgY29yZTIJMTIuNQorQyBJbnRlbCBOSE0JMTEuMworQyBJbnRlbCBTQlIJIDguNAkoc2xvd2Rvd24sIG9sZCBjb2RlIHRvb2sgOC4wKQorQyBJbnRlbCBhdG9tCTI2CitDIFZJQSBuYW5vCTEzCisKK2RlZmluZShgQjJtYicsICAgYCVyMTAnKQorZGVmaW5lKGBCMm1vZGInLCBgJXIxMScpCitkZWZpbmUoYGFwJywgICAgIGAlcmRpJykKK2RlZmluZShgbicsICAgICAgYCVyc2knKQorZGVmaW5lKGBwcmUnLCAgICBgJXI4JykKK2RlZmluZShgYicsICAgICAgYCVyYngnKQorCitkZWZpbmUoYHIwJywgICAgIGAlcmJwJykgQyByMSBrZXB0IGluICVyYXgKK2RlZmluZShgcjInLAkgYCVyY3gnKSAgQyBrZXB0IG5lZ2F0ZWQuIEFsc28gdXNlZCBhcyBzaGlmdCBjb3VudAorZGVmaW5lKGB0MCcsICAgICBgJXI5JykKKworQyBtcF9saW1iX3QKK0MgbXBuX21vZF8xXzFwIChtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgYiwgbXBfbGltYl90IGJtb2RiWzRdKQorQyAgICAgICAgICAgICAgICAgICAgICAgJXJkaSAgICAgICAgICVyc2kgICAgICAgICAlcmR4ICAgICAgICAgICAgICAgICVyY3gKK0MgVGhlIHByZSBhcnJheSBjb250YWlucyBiaSwgY250LCBCMW1vZGIsIEIybW9kYgorQyBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIG5lZWRzIEIxbW9kYiBvbmx5IHdoZW4gY250ID4gMAorCitDIFRoZSBpdGVyYXRpb24gaXMgYWxtb3N0IGFzIGZvbGxvd3MsCitDCitDICAgcl8yIEJeMyArIHJfMSBCXjIgKyByXzAgQiArIHUgPSByXzEgQjJtb2RiICsgKHJfMCArIHJfMiBCMm1vZCkgQiArIHUKK0MKK0Mgd2hlcmUgcjIgaXMgYSBzaW5nbGUgYml0IHJlcHJlc2VudGVkIGFzIGEgbWFzay4gQnV0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorQyByZXN1bHQgZml0cyBpbiB0d28gbGltYnMgYW5kIGEgYml0LCBjYXJyeSBmcm9tIHRoZSBhZGRpdGlvbgorQworQyAgIHJfMCArIHJfMiBCMm1vZAorQworQyBpcyBoYW5kbGVkIHNwZWNpYWxseS4gT24gY2FycnksIHdlIHN1YnRyYWN0IGIgdG8gY2FuY2VsIHRoZSBjYXJyeSwKK0MgYW5kIHdlIHVzZSBpbnN0ZWFkIHRoZSB2YWx1ZQorQworQyAgIHJfMCArIEIybWIgKG1vZCBCKQorQworQyBUaGlzIGFkZGl0aW9uIGNhbiBiZSBpc3N1ZWQgZWFybHkgc2luY2UgaXQgZG9lc24ndCBkZXBlbmQgb24gcjIsIGFuZCBpdCBpcworQyB0aGUgc291cmNlIG9mIHRoZSBjbW92IGluIHRoZSBsb29wLgorQworQyBXZSBoYXZlIHRoZSBpbnZhcmlhbnQgdGhhdCByXzIgQl4yICsgcl8xIEIgKyByXzAgPCBCXjIgKyBCIGIKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fbW9kXzFfMXApCisJRlVOQ19FTlRSWSg0KQorCXB1c2gJJXJicAorCXB1c2gJJXJieAorCW1vdgklcmR4LCBiCisJbW92CSVyY3gsIHByZQorCisJbW92CS04KGFwLCBuLCA4KSwgJXJheAorCWNtcAkkMywgbgorCWpuYwlMKGZpcnN0KQorCW1vdgktMTYoYXAsIG4sIDgpLCByMAorCWptcAlMKHJlZHVjZV90d28pCisKK0woZmlyc3QpOgorCUMgRmlyc3QgaXRlcmF0aW9uLCBubyByMgorCW1vdgkyNChwcmUpLCBCMm1vZGIKKwltdWwJQjJtb2RiCisJbW92CS0yNChhcCwgbiwgOCksIHIwCisJYWRkCSVyYXgsIHIwCisJbW92CS0xNihhcCwgbiwgOCksICVyYXgKKwlhZGMJJXJkeCwgJXJheAorCXNiYglyMiwgcjIKKwlzdWIJJDQsIG4KKwlqYwlMKHJlZHVjZV90aHJlZSkKKworCW1vdglCMm1vZGIsIEIybWIKKwlzdWIJYiwgQjJtYgorCisJQUxJR04oMTYpCitMKHRvcCk6CWFuZAlCMm1vZGIsIHIyCisJbGVhCShCMm1iLCByMCksIHQwCisJbXVsCUIybW9kYgorCWFkZAlyMCwgcjIKKwltb3YJKGFwLCBuLCA4KSwgcjAKKwljbW92Ywl0MCwgcjIKKwlhZGQJJXJheCwgcjAKKwltb3YJcjIsICVyYXgKKwlhZGMJJXJkeCwgJXJheAorCXNiYglyMiwgcjIKKwlzdWIJJDEsIG4KKwlqbmMJTCh0b3ApCisKK0wocmVkdWNlX3RocmVlKToKKwlDIEVsaW1pbmF0ZSByMgorCWFuZAliLCByMgorCXN1YglyMiwgJXJheAorCitMKHJlZHVjZV90d28pOgorCW1vdgk4KHByZSksIFIzMiglcmN4KQorCXRlc3QJUjMyKCVyY3gpLCBSMzIoJXJjeCkKKwlqeglMKG5vcm1hbGl6ZWQpCisKKwlDIFVubm9ybWFsaXplZCwgdXNlIEIxbW9kYiB0byByZWR1Y2UgdG8gc2l6ZSA8IEIgKGIrMSkKKwltdWxxCTE2KHByZSkKKwl4b3IJdDAsIHQwCisJYWRkCSVyYXgsIHIwCisJYWRjCSVyZHgsIHQwCisJbW92CXQwLCAlcmF4CisKKwlDIExlZnQtc2hpZnQgdG8gbm9ybWFsaXplCitpZmRlZihgU0hMRF9TTE9XJyxgCisJc2hsCVI4KCVyY3gpLCAlcmF4CisJbW92CXIwLCB0MAorCW5lZwlSMzIoJXJjeCkKKwlzaHIJUjgoJXJjeCksIHQwCisJb3IJdDAsICVyYXgKKwluZWcJUjMyKCVyY3gpCisnLGAKKwlzaGxkCVI4KCVyY3gpLCByMCwgJXJheAorJykKKwlzaGwJUjgoJXJjeCksIHIwCisJam1wCUwodWRpdikKKworTChub3JtYWxpemVkKToKKwltb3YJJXJheCwgdDAKKwlzdWIJYiwgdDAKKwljbW92bmMJdDAsICVyYXgKKworTCh1ZGl2KToKKwlsZWEJMSglcmF4KSwgdDAKKwltdWxxCShwcmUpCisJYWRkCXIwLCAlcmF4CisJYWRjCXQwLCAlcmR4CisJaW11bAliLCAlcmR4CisJc3ViCSVyZHgsIHIwCisJY21wCXIwLCAlcmF4CisJbGVhCShiLCByMCksICVyYXgKKwljbW92bmMJcjAsICVyYXgKKwljbXAJYiwgJXJheAorCWpuYwlMKGZpeCkKK0wob2spOglzaHIJUjgoJXJjeCksICVyYXgKKworCXBvcAklcmJ4CisJcG9wCSVyYnAKKwlGVU5DX0VYSVQoKQorCXJldAorTChmaXgpOglzdWIJYiwgJXJheAorCWptcAlMKG9rKQorRVBJTE9HVUUoKQorCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fbW9kXzFfMXBfY3BzKQorCUZVTkNfRU5UUlkoMikKKwlwdXNoCSVyYnAKKwlic3IJJXJzaSwgJXJjeAorCXB1c2gJJXJieAorCW1vdgklcmRpLCAlcmJ4CisJcHVzaAklcjEyCisJeG9yCSQ2MywgUjMyKCVyY3gpCisJbW92CSVyc2ksICVyMTIKKwltb3YJUjMyKCVyY3gpLCBSMzIoJXJicCkKKwlzYWwJUjgoJXJjeCksICVyMTIKK0lGU1REKGAJbW92CSVyMTIsICVyZGkJJykJQyBwYXNzIHBhcmFtZXRlcgorSUZET1MoYAltb3YJJXIxMiwgJXJjeAknKQlDIHBhc3MgcGFyYW1ldGVyCitJRkRPUyhgCXN1YgkkMzIsICVyc3AJJykKKwlBU1NFUlQobnosIGB0ZXN0ICQxNSwgJXJzcCcpCisJQ0FMTCgJbXBuX2ludmVydF9saW1iKQorSUZET1MoYAlhZGQJJDMyLCAlcnNwCScpCisJbmVnCSVyMTIKKwltb3YJJXIxMiwgJXI4CisJbW92CSVyYXgsICglcmJ4KQkJQyBzdG9yZSBiaQorCW1vdgklcmJwLCA4KCVyYngpCQlDIHN0b3JlIGNudAorCWltdWwJJXJheCwgJXIxMgorCW1vdgklcjEyLCAyNCglcmJ4KQkJQyBzdG9yZSBCMm1vZGIKKwltb3YJUjMyKCVyYnApLCBSMzIoJXJjeCkKKwl0ZXN0CVIzMiglcmN4KSwgUjMyKCVyY3gpCisJanoJTCh6KQorCisJbW92CSQxLCBSMzIoJXJkeCkKK2lmZGVmKGBTSExEX1NMT1cnLGAKKwlDIERlc3Ryb3lzICVyYXgsIHVubGlrZSBzaGxkLiBPdGhlcndpc2UsIHdlIGNvdWxkIGRvIEIxbW9kYgorCUMgYmVmb3JlIEIybW9kYiwgYW5kIGdldCByaWQgb2YgdGhlIG1vdmUgJXIxMiwgJXI4IGFib3ZlLgorCisJc2hsCVI4KCVyY3gpLCAlcmR4CisJbmVnCVIzMiglcmN4KQorCXNocglSOCglcmN4KSwgJXJheAorCW9yCSVyYXgsICVyZHgKKwluZWcJUjMyKCVyY3gpCisnLGAKKwlzaGxkCVI4KCVyY3gpLCAlcmF4LCAlcmR4CisnKQorCWltdWwJJXJkeCwgJXI4CisJc2hyCVI4KCVyY3gpLCAlcjgKKwltb3YJJXI4LCAxNiglcmJ4KQkJQyBzdG9yZSBCMW1vZGIKK0woeik6CisJcG9wCSVyMTIKKwlwb3AJJXJieAorCXBvcAklcmJwCisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKK0FTTV9FTkQoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9tb2RfMV8yLmFzbSBiL21wbi94ODZfNjQvbW9kXzFfMi5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3OWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvbW9kXzFfMi5hc20KQEAgLTAsMCArMSwyNDEgQEAKK2RubCAgQU1ENjQgbXBuX21vZF8xc18ycAorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAwOS0yMDEyLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDQKK0MgQU1EIEsxMAkgNAorQyBJbnRlbCBQNAkxOQorQyBJbnRlbCBjb3JlMgkgOAorQyBJbnRlbCBOSE0JIDYuNQorQyBJbnRlbCBTQlIJIDQuNQorQyBJbnRlbCBhdG9tCTI4CitDIFZJQSBuYW5vCSA4CisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX21vZF8xc18ycCkKKwlGVU5DX0VOVFJZKDQpCisJcHVzaAklcjE0CisJdGVzdAkkMSwgUjgoJXJzaSkKKwltb3YJJXJkeCwgJXIxNAorCXB1c2gJJXIxMworCW1vdgklcmN4LCAlcjEzCisJcHVzaAklcjEyCisJcHVzaAklcmJwCisJcHVzaAklcmJ4CisJbW92CTE2KCVyY3gpLCAlcjEwCisJbW92CTI0KCVyY3gpLCAlcmJ4CisJbW92CTMyKCVyY3gpLCAlcmJwCisJamUJTChiMCkKKwlkZWMJJXJzaQorCWplCUwob25lKQorCW1vdgktOCglcmRpLCVyc2ksOCksICVyYXgKKwltdWwJJXIxMAorCW1vdgklcmF4LCAlcjkKKwltb3YJJXJkeCwgJXI4CisJbW92CSglcmRpLCVyc2ksOCksICVyYXgKKwlhZGQJLTE2KCVyZGksJXJzaSw4KSwgJXI5CisJYWRjCSQwLCAlcjgKKwltdWwJJXJieAorCWFkZAklcmF4LCAlcjkKKwlhZGMJJXJkeCwgJXI4CisJam1wCUwoMTEpCisKK0woYjApOgltb3YJLTgoJXJkaSwlcnNpLDgpLCAlcjgKKwltb3YJLTE2KCVyZGksJXJzaSw4KSwgJXI5CisKK0woMTEpOglzdWIJJDQsICVyc2kKKwlqYglMKGVkMikKKwlsZWEJNDAoJXJkaSwlcnNpLDgpLCAlcmRpCisJbW92CS00MCglcmRpKSwgJXIxMQorCW1vdgktMzIoJXJkaSksICVyYXgKKwlqbXAJTChtMCkKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJLTI0KCVyZGkpLCAlcjkKKwlhZGQJJXJheCwgJXIxMQorCW1vdgktMTYoJXJkaSksICVyYXgKKwlhZGMJJXJkeCwgJXIxMgorCW11bAklcjEwCisJYWRkCSVyYXgsICVyOQorCW1vdgklcjExLCAlcmF4CisJbW92CSVyZHgsICVyOAorCWFkYwkkMCwgJXI4CisJbXVsCSVyYngKKwlhZGQJJXJheCwgJXI5CisJbW92CSVyMTIsICVyYXgKKwlhZGMJJXJkeCwgJXI4CisJbXVsCSVyYnAKKwlzdWIJJDIsICVyc2kKKwlqYglMKGVkMSkKKwltb3YJLTQwKCVyZGkpLCAlcjExCisJYWRkCSVyYXgsICVyOQorCW1vdgktMzIoJXJkaSksICVyYXgKKwlhZGMJJXJkeCwgJXI4CitMKG0wKToJbXVsCSVyMTAKKwlhZGQJJXJheCwgJXIxMQorCW1vdgklcjksICVyYXgKKwltb3YJJXJkeCwgJXIxMgorCWFkYwkkMCwgJXIxMgorCW11bAklcmJ4CisJYWRkCSVyYXgsICVyMTEKKwlsZWEJLTMyKCVyZGkpLCAlcmRpCQlDIGFwIC09IDQKKwltb3YJJXI4LCAlcmF4CisJYWRjCSVyZHgsICVyMTIKKwltdWwJJXJicAorCXN1YgkkMiwgJXJzaQorCWphZQlMKHRvcCkKKworTChlZDApOgltb3YJJXIxMSwgJXI5CisJbW92CSVyMTIsICVyOAorTChlZDEpOglhZGQJJXJheCwgJXI5CisJYWRjCSVyZHgsICVyOAorTChlZDIpOgltb3YJOCglcjEzKSwgUjMyKCVyZGkpCQlDIGNudAorCW1vdgklcjgsICVyYXgKKwltb3YJJXI5LCAlcjgKKwltdWwJJXIxMAorCWFkZAklcmF4LCAlcjgKKwlhZGMJJDAsICVyZHgKK0woMSk6CXhvcglSMzIoJXJjeCksIFIzMiglcmN4KQorCW1vdgklcjgsICVyOQorCXN1YglSMzIoJXJkaSksIFIzMiglcmN4KQorCXNocglSOCglcmN4KSwgJXI5CisJbW92CVIzMiglcmRpKSwgUjMyKCVyY3gpCisJc2FsCVI4KCVyY3gpLCAlcmR4CisJb3IJJXJkeCwgJXI5CisJc2FsCVI4KCVyY3gpLCAlcjgKKwltb3YJJXI5LCAlcmF4CisJbXVscQkoJXIxMykKKwltb3YJJXJheCwgJXJzaQorCWluYwklcjkKKwlhZGQJJXI4LCAlcnNpCisJYWRjCSVyOSwgJXJkeAorCWltdWwJJXIxNCwgJXJkeAorCXN1YgklcmR4LCAlcjgKKwlsZWEJKCVyOCwlcjE0KSwgJXJheAorCWNtcAklcjgsICVyc2kKKwljbW92YwklcmF4LCAlcjgKKwltb3YJJXI4LCAlcmF4CisJc3ViCSVyMTQsICVyYXgKKwljbW92YwklcjgsICVyYXgKKwltb3YJUjMyKCVyZGkpLCBSMzIoJXJjeCkKKwlzaHIJUjgoJXJjeCksICVyYXgKKwlwb3AJJXJieAorCXBvcAklcmJwCisJcG9wCSVyMTIKKwlwb3AJJXIxMworCXBvcAklcjE0CisJRlVOQ19FWElUKCkKKwlyZXQKK0wob25lKToKKwltb3YJKCVyZGkpLCAlcjgKKwltb3YJOCglcmN4KSwgUjMyKCVyZGkpCisJeG9yCSVyZHgsICVyZHgKKwlqbXAJTCgxKQorRVBJTE9HVUUoKQorCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fbW9kXzFzXzJwX2NwcykKKwlGVU5DX0VOVFJZKDIpCisJcHVzaAklcmJwCisJYnNyCSVyc2ksICVyY3gKKwlwdXNoCSVyYngKKwltb3YJJXJkaSwgJXJieAorCXB1c2gJJXIxMgorCXhvcgkkNjMsIFIzMiglcmN4KQorCW1vdgklcnNpLCAlcjEyCisJbW92CVIzMiglcmN4KSwgUjMyKCVyYnApCUMgcHJlc2VydmUgY250IG92ZXIgY2FsbAorCXNhbAlSOCglcmN4KSwgJXIxMgkJQyBiIDw8IGNudAorSUZTVEQoYAltb3YJJXIxMiwgJXJkaQknKQlDIHBhc3MgcGFyYW1ldGVyCitJRkRPUyhgCW1vdgklcjEyLCAlcmN4CScpCUMgcGFzcyBwYXJhbWV0ZXIKK0lGRE9TKGAJc3ViCSQzMiwgJXJzcAknKQorCUFTU0VSVChueiwgYHRlc3QgJDE1LCAlcnNwJykKKwlDQUxMKAltcG5faW52ZXJ0X2xpbWIpCitJRkRPUyhgCWFkZAkkMzIsICVyc3AJJykKKwltb3YJJXIxMiwgJXI4CisJbW92CSVyYXgsICVyMTEKKwltb3YJJXJheCwgKCVyYngpCQlDIHN0b3JlIGJpCisJbW92CSVyYnAsIDgoJXJieCkJCUMgc3RvcmUgY250CisJbmVnCSVyOAorCW1vdglSMzIoJXJicCksIFIzMiglcmN4KQorCW1vdgkkMSwgUjMyKCVyc2kpCitpZmRlZihgU0hMRF9TTE9XJyxgCisJc2hsCVI4KCVyY3gpLCAlcnNpCisJbmVnCVIzMiglcmN4KQorCW1vdgklcmF4LCAlcmJwCisJc2hyCVI4KCVyY3gpLCAlcmF4CisJb3IJJXJheCwgJXJzaQorCW1vdgklcmJwLCAlcmF4CisJbmVnCVIzMiglcmN4KQorJyxgCisJc2hsZAlSOCglcmN4KSwgJXJheCwgJXJzaQlDIEZJWE1FOiBTbG93IG9uIEF0b20gYW5kIE5hbm8KKycpCisJaW11bAklcjgsICVyc2kKKwltdWwJJXJzaQorCisJYWRkCSVyc2ksICVyZHgKKwlzaHIJUjgoJXJjeCksICVyc2kKKwltb3YJJXJzaSwgMTYoJXJieCkJCUMgc3RvcmUgQjFtb2RiCisKKwlub3QJJXJkeAorCWltdWwJJXIxMiwgJXJkeAorCWxlYQkoJXJkeCwlcjEyKSwgJXJzaQorCWNtcAklcmR4LCAlcmF4CisJY21vdm5jCSVyZHgsICVyc2kKKwltb3YJJXIxMSwgJXJheAorCW11bAklcnNpCisKKwlhZGQJJXJzaSwgJXJkeAorCXNocglSOCglcmN4KSwgJXJzaQorCW1vdgklcnNpLCAyNCglcmJ4KQkJQyBzdG9yZSBCMm1vZGIKKworCW5vdAklcmR4CisJaW11bAklcjEyLCAlcmR4CisJYWRkCSVyZHgsICVyMTIKKwljbXAJJXJkeCwgJXJheAorCWNtb3ZuYwklcmR4LCAlcjEyCisKKwlzaHIJUjgoJXJjeCksICVyMTIKKwltb3YJJXIxMiwgMzIoJXJieCkJCUMgc3RvcmUgQjNtb2RiCisKKwlwb3AJJXIxMgorCXBvcAklcmJ4CisJcG9wCSVyYnAKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9tb2RfMV80LmFzbSBiL21wbi94ODZfNjQvbW9kXzFfNC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4ZDgwYQotLS0gL2Rldi9udWxsCisrKyBiL21wbi94ODZfNjQvbW9kXzFfNC5hc20KQEAgLTAsMCArMSwyNzIgQEAKK2RubCAgQU1ENjQgbXBuX21vZF8xc180cAorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAwOS0yMDEyLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDMKK0MgQU1EIEsxMAkgMworQyBJbnRlbCBQNAkxNS41CitDIEludGVsIGNvcmUyCSA1CitDIEludGVsIGNvcmVpCSA0CitDIEludGVsIGF0b20JMjMKK0MgVklBIG5hbm8JIDQuNzUKKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMTYpCitQUk9MT0dVRShtcG5fbW9kXzFzXzRwKQorCUZVTkNfRU5UUlkoNCkKKwlwdXNoCSVyMTUKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTIKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKworCW1vdgklcmR4LCAlcjE1CisJbW92CSVyY3gsICVyMTQKKwltb3YJMTYoJXJjeCksICVyMTEJCUMgQjFtb2RiCisJbW92CTI0KCVyY3gpLCAlcmJ4CQlDIEIybW9kYgorCW1vdgkzMiglcmN4KSwgJXJicAkJQyBCM21vZGIKKwltb3YJNDAoJXJjeCksICVyMTMJCUMgQjRtb2RiCisJbW92CTQ4KCVyY3gpLCAlcjEyCQlDIEI1bW9kYgorCXhvcglSMzIoJXI4KSwgUjMyKCVyOCkKKwltb3YJUjMyKCVyc2kpLCBSMzIoJXJkeCkKKwlhbmQJJDMsIFIzMiglcmR4KQorCWplCUwoYjApCisJY21wCSQyLCBSMzIoJXJkeCkKKwlqYwlMKGIxKQorCWplCUwoYjIpCisKK0woYjMpOglsZWEJLTI0KCVyZGksJXJzaSw4KSwgJXJkaQorCW1vdgk4KCVyZGkpLCAlcmF4CisJbXVsCSVyMTEKKwltb3YJKCVyZGkpLCAlcjkKKwlhZGQJJXJheCwgJXI5CisJYWRjCSVyZHgsICVyOAorCW1vdgkxNiglcmRpKSwgJXJheAorCW11bAklcmJ4CisJam1wCUwobTApCisKKwlBTElHTig4KQorTChiMCk6CWxlYQktMzIoJXJkaSwlcnNpLDgpLCAlcmRpCisJbW92CTgoJXJkaSksICVyYXgKKwltdWwJJXIxMQorCW1vdgkoJXJkaSksICVyOQorCWFkZAklcmF4LCAlcjkKKwlhZGMJJXJkeCwgJXI4CisJbW92CTE2KCVyZGkpLCAlcmF4CisJbXVsCSVyYngKKwlhZGQJJXJheCwgJXI5CisJYWRjCSVyZHgsICVyOAorCW1vdgkyNCglcmRpKSwgJXJheAorCW11bAklcmJwCisJam1wCUwobTApCisKKwlBTElHTig4KQorTChiMSk6CWxlYQktOCglcmRpLCVyc2ksOCksICVyZGkKKwltb3YJKCVyZGkpLCAlcjkKKwlqbXAJTChtMSkKKworCUFMSUdOKDgpCitMKGIyKToJbGVhCS0xNiglcmRpLCVyc2ksOCksICVyZGkKKwltb3YJOCglcmRpKSwgJXI4CisJbW92CSglcmRpKSwgJXI5CisJam1wCUwobTEpCisKKwlBTElHTigxNikKK0wodG9wKToJbW92CS0yNCglcmRpKSwgJXJheAorCW1vdgktMzIoJXJkaSksICVyMTAKKwltdWwJJXIxMQkJCUMgdXBbMV0gKiBCMW1vZGIKKwlhZGQJJXJheCwgJXIxMAorCW1vdgktMTYoJXJkaSksICVyYXgKKwltb3YJJDAsIFIzMiglcmN4KQorCWFkYwklcmR4LCAlcmN4CisJbXVsCSVyYngJCQlDIHVwWzJdICogQjJtb2RiCisJYWRkCSVyYXgsICVyMTAKKwltb3YJLTgoJXJkaSksICVyYXgKKwlhZGMJJXJkeCwgJXJjeAorCXN1YgkkMzIsICVyZGkKKwltdWwJJXJicAkJCUMgdXBbM10gKiBCM21vZGIKKwlhZGQJJXJheCwgJXIxMAorCW1vdgklcjEzLCAlcmF4CisJYWRjCSVyZHgsICVyY3gKKwltdWwJJXI5CQkJQyBybCAqIEI0bW9kYgorCWFkZAklcmF4LCAlcjEwCisJbW92CSVyMTIsICVyYXgKKwlhZGMJJXJkeCwgJXJjeAorCW11bAklcjgJCQlDIHJoICogQjVtb2RiCisJbW92CSVyMTAsICVyOQorCW1vdgklcmN4LCAlcjgKK0wobTApOglhZGQJJXJheCwgJXI5CisJYWRjCSVyZHgsICVyOAorTChtMSk6CXN1YgkkNCwgJXJzaQorCWphCUwodG9wKQorCitMKGVuZCk6CW1vdgk4KCVyMTQpLCBSMzIoJXJzaSkKKwltb3YJJXI4LCAlcmF4CisJbXVsCSVyMTEKKwltb3YJJXJheCwgJXI4CisJYWRkCSVyOSwgJXI4CisJYWRjCSQwLCAlcmR4CisJeG9yCVIzMiglcmN4KSwgUjMyKCVyY3gpCisJc3ViCVIzMiglcnNpKSwgUjMyKCVyY3gpCisJbW92CSVyOCwgJXJkaQorCXNocglSOCglcmN4KSwgJXJkaQorCW1vdglSMzIoJXJzaSksIFIzMiglcmN4KQorCXNhbAlSOCglcmN4KSwgJXJkeAorCW9yCSVyZHgsICVyZGkKKwltb3YJJXJkaSwgJXJheAorCW11bHEJKCVyMTQpCisJbW92CSVyMTUsICVyYngKKwltb3YJJXJheCwgJXI5CisJc2FsCVI4KCVyY3gpLCAlcjgKKwlpbmMJJXJkaQorCWFkZAklcjgsICVyOQorCWFkYwklcmRpLCAlcmR4CisJaW11bAklcmJ4LCAlcmR4CisJc3ViCSVyZHgsICVyOAorCWxlYQkoJXI4LCVyYngpLCAlcmF4CisJY21wCSVyOCwgJXI5CisJY21vdmMJJXJheCwgJXI4CisJbW92CSVyOCwgJXJheAorCXN1YgklcmJ4LCAlcmF4CisJY21vdmMJJXI4LCAlcmF4CisJc2hyCVI4KCVyY3gpLCAlcmF4CisJcG9wCSVyYngKKwlwb3AJJXJicAorCXBvcAklcjEyCisJcG9wCSVyMTMKKwlwb3AJJXIxNAorCXBvcAklcjE1CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKKworCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX21vZF8xc180cF9jcHMpCisJRlVOQ19FTlRSWSgyKQorCXB1c2gJJXJicAorCWJzcgklcnNpLCAlcmN4CisJcHVzaAklcmJ4CisJbW92CSVyZGksICVyYngKKwlwdXNoCSVyMTIKKwl4b3IJJDYzLCBSMzIoJXJjeCkKKwltb3YJJXJzaSwgJXIxMgorCW1vdglSMzIoJXJjeCksIFIzMiglcmJwKQlDIHByZXNlcnZlIGNudCBvdmVyIGNhbGwKKwlzYWwJUjgoJXJjeCksICVyMTIJCUMgYiA8PCBjbnQKK0lGU1REKGAJbW92CSVyMTIsICVyZGkJJykJQyBwYXNzIHBhcmFtZXRlcgorSUZET1MoYAltb3YJJXIxMiwgJXJjeAknKQlDIHBhc3MgcGFyYW1ldGVyCitJRkRPUyhgCXN1YgkkMzIsICVyc3AJJykKKwlBU1NFUlQobnosIGB0ZXN0ICQxNSwgJXJzcCcpCisJQ0FMTCgJbXBuX2ludmVydF9saW1iKQorSUZET1MoYAlhZGQJJDMyLCAlcnNwCScpCisJbW92CSVyMTIsICVyOAorCW1vdgklcmF4LCAlcjExCisJbW92CSVyYXgsICglcmJ4KQkJQyBzdG9yZSBiaQorCW1vdgklcmJwLCA4KCVyYngpCQlDIHN0b3JlIGNudAorCW5lZwklcjgKKwltb3YJUjMyKCVyYnApLCBSMzIoJXJjeCkKKwltb3YJJDEsIFIzMiglcnNpKQoraWZkZWYoYFNITERfU0xPVycsYAorCXNobAlSOCglcmN4KSwgJXJzaQorCW5lZwlSMzIoJXJjeCkKKwltb3YJJXJheCwgJXJicAorCXNocglSOCglcmN4KSwgJXJheAorCW9yCSVyYXgsICVyc2kKKwltb3YJJXJicCwgJXJheAorCW5lZwlSMzIoJXJjeCkKKycsYAorCXNobGQJUjgoJXJjeCksICVyYXgsICVyc2kJQyBGSVhNRTogU2xvdyBvbiBBdG9tIGFuZCBOYW5vCisnKQorCWltdWwJJXI4LCAlcnNpCisJbXVsCSVyc2kKKworCWFkZAklcnNpLCAlcmR4CisJc2hyCVI4KCVyY3gpLCAlcnNpCisJbW92CSVyc2ksIDE2KCVyYngpCQlDIHN0b3JlIEIxbW9kYgorCisJbm90CSVyZHgKKwlpbXVsCSVyMTIsICVyZHgKKwlsZWEJKCVyZHgsJXIxMiksICVyc2kKKwljbXAJJXJkeCwgJXJheAorCWNtb3ZuYwklcmR4LCAlcnNpCisJbW92CSVyMTEsICVyYXgKKwltdWwJJXJzaQorCisJYWRkCSVyc2ksICVyZHgKKwlzaHIJUjgoJXJjeCksICVyc2kKKwltb3YJJXJzaSwgMjQoJXJieCkJCUMgc3RvcmUgQjJtb2RiCisKKwlub3QJJXJkeAorCWltdWwJJXIxMiwgJXJkeAorCWxlYQkoJXJkeCwlcjEyKSwgJXJzaQorCWNtcAklcmR4LCAlcmF4CisJY21vdm5jCSVyZHgsICVyc2kKKwltb3YJJXIxMSwgJXJheAorCW11bAklcnNpCisKKwlhZGQJJXJzaSwgJXJkeAorCXNocglSOCglcmN4KSwgJXJzaQorCW1vdgklcnNpLCAzMiglcmJ4KQkJQyBzdG9yZSBCM21vZGIKKworCW5vdAklcmR4CisJaW11bAklcjEyLCAlcmR4CisJbGVhCSglcmR4LCVyMTIpLCAlcnNpCisJY21wCSVyZHgsICVyYXgKKwljbW92bmMJJXJkeCwgJXJzaQorCW1vdgklcjExLCAlcmF4CisJbXVsCSVyc2kKKworCWFkZAklcnNpLCAlcmR4CisJc2hyCVI4KCVyY3gpLCAlcnNpCisJbW92CSVyc2ksIDQwKCVyYngpCQlDIHN0b3JlIEI0bW9kYgorCisJbm90CSVyZHgKKwlpbXVsCSVyMTIsICVyZHgKKwlhZGQJJXJkeCwgJXIxMgorCWNtcAklcmR4LCAlcmF4CisJY21vdm5jCSVyZHgsICVyMTIKKworCXNocglSOCglcmN4KSwgJXIxMgorCW1vdgklcjEyLCA0OCglcmJ4KQkJQyBzdG9yZSBCNW1vZGIKKworCXBvcAklcjEyCisJcG9wCSVyYngKKwlwb3AJJXJicAorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L21vZF8zNGxzdWIxLmFzbSBiL21wbi94ODZfNjQvbW9kXzM0bHN1YjEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDc3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L21vZF8zNGxzdWIxLmFzbQpAQCAtMCwwICsxLDIxNSBAQAorZG5sICBBTUQ2NCBtcG5fbW9kXzM0bHN1YjEgLS0gcmVtYWluZGVyIG1vZHVsbyAyXjQ4LTEuCisKK2RubCAgQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAwNCwgMjAwNSwgMjAwNywgMjAwOS0yMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK2RubCAgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAwLjY3CSAgIDAuNTgzIGlzIHBvc3NpYmxlIHdpdGggemVyby1yZWcgaW5zdGVhZCBvZiAkMCwgNC13YXkKK0MgQU1EIEsxMAkgMC42NwkgICB0aGlzIHNlZW1zIGhhcmQgdG8gYmVhdAorQyBBTUQgYmQxCSAxCitDIEFNRCBiZDIJIDEKK0MgQU1EIGJkMwkgPworQyBBTUQgYmQ0CSA/CitDIEFNRCB6ZW4JIDAuNjIKK0MgQU1EIGJvYmNhdAkgMS4wNworQyBBTUQgamFndWFyCSAxCitDIEludGVsIFA0CSA3LjM1CSAgIHRlcnJpYmxlLCB1c2Ugb2xkIGNvZGUKK0MgSW50ZWwgY29yZTIJIDEuMjUJICAgMStlcHNpbG9uIHdpdGggaHVnZSB1bnJvbGxpbmcKK0MgSW50ZWwgTkhNCSAxLjE1CSAgIHRoaXMgc2VlbXMgaGFyZCB0byBiZWF0CitDIEludGVsIFNCUgkgMC45MworQyBJbnRlbCBJQlIJIDAuOTMKK0MgSW50ZWwgSFdMCSAwLjgyCitDIEludGVsIEJXTAkgMC42NAorQyBJbnRlbCBTS1kJIDAuNjAKK0MgSW50ZWwgYXRvbQkgMi41CitDIEludGVsIFNMTSAgICAgIDEuNTkKK0MgVklBIG5hbm8JIDEuMjUJICAgdGhpcyBzZWVtcyBoYXJkIHRvIGJlYXQKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYGFwJywJJXJkaSkKK2RlZmluZShgbicsCSVyc2kpCisKK0MgbXBfbGltYl90IG1wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbikKKworQyBUT0RPCitDICAqIFJldmlldyBmZWVkLWluIGFuZCB3aW5kLWRvd24gY29kZS4KKworQUJJX1NVUFBPUlQoRE9TNjQpCitBQklfU1VQUE9SVChTVEQ2NCkKKworQVNNX1NUQVJUKCkKKwlURVhUCisJQUxJR04oMzIpCitQUk9MT0dVRShtcG5fbW9kXzM0bHN1YjEpCisJRlVOQ19FTlRSWSgyKQorCisJbW92CSQweDAwMDBGRkZGRkZGRkZGRkYsICVyMTEKKworCW1vdgkoYXApLCAlcmF4CisKKwljbXAJJDIsICVyc2kKKwlqYQlMKGd0MikKKworCWpiCUwob25lKQorCisJbW92CTgoYXApLCAlcnNpCisJbW92CSVyYXgsICVyZHgKKwlzaHIJJDQ4LCAlcmF4CQlDIHNyY1swXSBsb3cKKworCWFuZAklcjExLCAlcmR4CQlDIHNyY1swXSBoaWdoCisJYWRkCSVyZHgsICVyYXgKKwltb3YJUjMyKCVyc2kpLCBSMzIoJXJkeCkKKworCXNocgkkMzIsICVyc2kJCUMgc3JjWzFdIGhpZ2gKKwlhZGQJJXJzaSwgJXJheAorCisJc2hsCSQxNiwgJXJkeAkJQyBzcmNbMV0gbG93CisJYWRkCSVyZHgsICVyYXgKK0wob25lKToJRlVOQ19FWElUKCkKKwlyZXQKKworCitDIERvbid0IGNoYW5nZSB0aGlzLCB0aGUgd2luZC1kb3duIGNvZGUgaXMgbm90IGFibGUgdG8gaGFuZGxlIGdyZWF0ZXIgdmFsdWVzCitkZWZpbmUoVU5ST0xMLDMpCisKK0woZ3QyKToJbW92CTgoYXApLCAlcmN4CisJbW92CTE2KGFwKSwgJXJkeAorCXhvcgklcjksICVyOQorCWFkZAkkMjQsIGFwCisJc3ViCSRldmFsKFVOUk9MTCozKzMpLCAlcnNpCisJamMJTChlbmQpCisJQUxJR04oMTYpCitMKHRvcCk6CisJYWRkCShhcCksICVyYXgKKwlhZGMJOChhcCksICVyY3gKKwlhZGMJMTYoYXApLCAlcmR4CisJYWRjCSQwLCAlcjkKK2Zvcmxvb3AoaSwxLFVOUk9MTC0xLGBkbmwKKwlhZGQJZXZhbChpKjI0KShhcCksICVyYXgKKwlhZGMJZXZhbChpKjI0KzgpKGFwKSwgJXJjeAorCWFkYwlldmFsKGkqMjQrMTYpKGFwKSwgJXJkeAorCWFkYwkkMCwgJXI5CisnKWRubAorCWFkZAkkZXZhbChVTlJPTEwqMjQpLCBhcAorCXN1YgkkZXZhbChVTlJPTEwqMyksICVyc2kKKwlqbmMJTCh0b3ApCisKK0woZW5kKToKKwlsZWEJTCh0YWIpKCVyaXApLCAlcjgKK2lmZGVmKGBQSUMnLAorYAltb3ZzbHEJMzYoJXI4LCVyc2ksNCksICVyMTAKKwlhZGQJJXIxMCwgJXI4CisJam1wCSolcjgKKycsYAorCWptcAkqNzIoJXI4LCVyc2ksOCkKKycpCisJSlVNUFRBQlNFQ1QKKwlBTElHTig4KQorTCh0YWIpOglKTVBFTlQoCUwoMCksIEwodGFiKSkKKwlKTVBFTlQoCUwoMSksIEwodGFiKSkKKwlKTVBFTlQoCUwoMiksIEwodGFiKSkKKwlKTVBFTlQoCUwoMyksIEwodGFiKSkKKwlKTVBFTlQoCUwoNCksIEwodGFiKSkKKwlKTVBFTlQoCUwoNSksIEwodGFiKSkKKwlKTVBFTlQoCUwoNiksIEwodGFiKSkKKwlKTVBFTlQoCUwoNyksIEwodGFiKSkKKwlKTVBFTlQoCUwoOCksIEwodGFiKSkKKwlURVhUCisKK0woNik6CWFkZAkoYXApLCAlcmF4CisJYWRjCTgoYXApLCAlcmN4CisJYWRjCTE2KGFwKSwgJXJkeAorCWFkYwkkMCwgJXI5CisJYWRkCSQyNCwgYXAKK0woMyk6CWFkZAkoYXApLCAlcmF4CisJYWRjCTgoYXApLCAlcmN4CisJYWRjCTE2KGFwKSwgJXJkeAorCWptcAlMKGNqMSkKKworTCg3KToJYWRkCShhcCksICVyYXgKKwlhZGMJOChhcCksICVyY3gKKwlhZGMJMTYoYXApLCAlcmR4CisJYWRjCSQwLCAlcjkKKwlhZGQJJDI0LCBhcAorTCg0KToJYWRkCShhcCksICVyYXgKKwlhZGMJOChhcCksICVyY3gKKwlhZGMJMTYoYXApLCAlcmR4CisJYWRjCSQwLCAlcjkKKwlhZGQJJDI0LCBhcAorTCgxKToJYWRkCShhcCksICVyYXgKKwlhZGMJJDAsICVyY3gKKwlqbXAJTChjajIpCisKK0woOCk6CWFkZAkoYXApLCAlcmF4CisJYWRjCTgoYXApLCAlcmN4CisJYWRjCTE2KGFwKSwgJXJkeAorCWFkYwkkMCwgJXI5CisJYWRkCSQyNCwgYXAKK0woNSk6CWFkZAkoYXApLCAlcmF4CisJYWRjCTgoYXApLCAlcmN4CisJYWRjCTE2KGFwKSwgJXJkeAorCWFkYwkkMCwgJXI5CisJYWRkCSQyNCwgYXAKK0woMik6CWFkZAkoYXApLCAlcmF4CisJYWRjCTgoYXApLCAlcmN4CisKK0woY2oyKToJYWRjCSQwLCAlcmR4CitMKGNqMSk6CWFkYwkkMCwgJXI5CitMKDApOglhZGQJJXI5LCAlcmF4CisJYWRjCSQwLCAlcmN4CisJYWRjCSQwLCAlcmR4CisJYWRjCSQwLCAlcmF4CisKKwltb3YJJXJheCwgJXJkaQkJQyAwbW9kMworCXNocgkkNDgsICVyYXgJCUMgMG1vZDMgaGlnaAorCisJYW5kCSVyMTEsICVyZGkJCUMgMG1vZDMgbG93CisJbW92CVIzMiglcmN4KSwgUjMyKCVyMTApCUMgMW1vZDMKKworCXNocgkkMzIsICVyY3gJCUMgMW1vZDMgaGlnaAorCisJYWRkCSVyZGksICVyYXgJCUMgYXBwbHkgMG1vZDMgbG93CisJbW92endsCSVkeCwgUjMyKCVyZGkpCQlDIDJtb2QzCisJc2hsCSQxNiwgJXIxMAkJQyAxbW9kMyBsb3cKKworCWFkZAklcmN4LCAlcmF4CQlDIGFwcGx5IDFtb2QzIGhpZ2gKKwlzaHIJJDE2LCAlcmR4CQlDIDJtb2QzIGhpZ2gKKworCWFkZAklcjEwLCAlcmF4CQlDIGFwcGx5IDFtb2QzIGxvdworCXNobAkkMzIsICVyZGkJCUMgMm1vZDMgbG93CisKKwlhZGQJJXJkeCwgJXJheAkJQyBhcHBseSAybW9kMyBoaWdoCisJYWRkCSVyZGksICVyYXgJCUMgYXBwbHkgMm1vZDMgbG93CisKKwlGVU5DX0VYSVQoKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9tb2RlMW8uYXNtIGIvbXBuL3g4Nl82NC9tb2RlMW8uYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzc1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L21vZGUxby5hc20KQEAgLTAsMCArMSwxNzEgQEAKK2RubCAgQU1ENjQgbXBuX21vZGV4YWN0XzFfb2RkIC0tIEhlbnNlbCBub3JtIHJlbWFpbmRlci4KKworZG5sICBDb3B5cmlnaHQgMjAwMC0yMDA2LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIEFNRCBLOCxLOQkxMAorQyBBTUQgSzEwCTEwCitDIEludGVsIFA0CTMzCitDIEludGVsIGNvcmUyCTEzCitDIEludGVsIGNvcmVpCTE0LjUKK0MgSW50ZWwgYXRvbQkzNQorQyBWSUEgbmFubwkgPworCisKK0MgVGhlIGRlcGVuZGVudCBjaGFpbiBpbiB0aGUgbWFpbiBsb29wIGlzCitDCitDICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlcworQwlzdWIJJXJkeCwgJXJheAkxCitDCWltdWwJJXI5LCAlcmF4CTQKK0MJbXVsCSVyOAkJNQorQwkJCSAgICAgIC0tLS0KK0MgICAgICAgdG90YWwJCSAgICAgICAxMAorQworQyBUaGUgbW92IGxvYWQgZnJvbSBzcmMgc2VlbXMgdG8gbmVlZCB0byBiZSBzY2hlZHVsZWQgYmFjayBiZWZvcmUgdGhlIGp6IHRvCitDIGFjaGlldmUgdGhpcyBzcGVlZCwgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbiBhcHBhcmVudGx5IGNhbid0IGNvbXBsZXRlbHkgaGlkZQorQyB0aGUgbGF0ZW5jeSBvdGhlcndpc2UuCitDCitDIFRoZSBsPXNyY1tpXS1jYml0IHN0ZXAgaXMgcm90YXRlZCBiYWNrIHRvbywgc2luY2UgdGhhdCBhbGxvd3MgdXMgdG8gYXZvaWQgaXQKK0MgZm9yIHRoZSBmaXJzdCBpdGVyYXRpb24gKHdoZXJlIHRoZXJlJ3Mgbm8gY2JpdCkuCitDCitDIFRoZSBjb2RlIGFsaWdubWVudCB1c2VkICgzMi1ieXRlKSBmb3IgdGhlIGxvb3AgYWxzbyBzZWVtcyBuZWNlc3NhcnkuICBXaXRob3V0CitDIHRoYXQgdGhlIG5vbi1QSUMgY2FzZSBoYXMgYWRjIGNyb3NzaW5nIHRoZSAweDYwIG9mZnNldCwgYXBwYXJlbnRseSBtYWtpbmcgaXQKK0MgcnVuIGF0IDExIGN5Y2xlcyBpbnN0ZWFkIG9mIDEwLgorCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDMyKQorUFJPTE9HVUUobXBuX21vZGV4YWN0XzFfb2RkKQorCUZVTkNfRU5UUlkoMykKKwltb3YJJDAsIFIzMiglcmN4KQorSUZET1MoYAlqbXAJTChlbnQpCQknKQorCitQUk9MT0dVRShtcG5fbW9kZXhhY3RfMWNfb2RkKQorCUZVTkNfRU5UUlkoNCkKK0woZW50KToKKwlDIHJkaQlzcmMKKwlDIHJzaQlzaXplCisJQyByZHgJZGl2aXNvcgorCUMgcmN4CWNhcnJ5CisKKwltb3YJJXJkeCwgJXI4CQlDIGQKKwlzaHIJUjMyKCVyZHgpCQlDIGQvMgorCisJTEVBKAliaW52ZXJ0X2xpbWJfdGFibGUsICVyOSkKKworCWFuZAkkMTI3LCBSMzIoJXJkeCkKKwltb3YJJXJjeCwgJXIxMAkJQyBpbml0aWFsIGNhcnJ5CisKKwltb3Z6YmwJKCVyOSwlcmR4KSwgUjMyKCVyZHgpCUMgaW52IDggYml0cworCisJbW92CSglcmRpKSwgJXJheAkJQyBzcmNbMF0KKwlsZWEJKCVyZGksJXJzaSw4KSwgJXIxMQlDIHNyYyBlbmQKKwltb3YJJXI4LCAlcmRpCQlDIGQsIG1hZGUgYXZhaWxhYmxlIHRvIGltdWxsCisKKwlsZWEJKCVyZHgsJXJkeCksIFIzMiglcmN4KQlDIDIqaW52CisJaW11bAlSMzIoJXJkeCksIFIzMiglcmR4KQlDIGludippbnYKKworCW5lZwklcnNpCQkJQyAtc2l6ZQorCisJaW11bAlSMzIoJXJkaSksIFIzMiglcmR4KQlDIGludippbnYqZAorCisJc3ViCVIzMiglcmR4KSwgUjMyKCVyY3gpCUMgaW52ID0gMippbnYgLSBpbnYqaW52KmQsIDE2IGJpdHMKKworCWxlYQkoJXJjeCwlcmN4KSwgUjMyKCVyZHgpCUMgMippbnYKKwlpbXVsCVIzMiglcmN4KSwgUjMyKCVyY3gpCUMgaW52KmludgorCisJaW11bAlSMzIoJXJkaSksIFIzMiglcmN4KQlDIGludippbnYqZAorCisJc3ViCVIzMiglcmN4KSwgUjMyKCVyZHgpCUMgaW52ID0gMippbnYgLSBpbnYqaW52KmQsIDMyIGJpdHMKKwl4b3IJUjMyKCVyY3gpLCBSMzIoJXJjeCkJQyBpbml0aWFsIGNiaXQKKworCWxlYQkoJXJkeCwlcmR4KSwgJXI5CUMgMippbnYKKwlpbXVsCSVyZHgsICVyZHgJCUMgaW52KmludgorCisJaW11bAklcjgsICVyZHgJCUMgaW52KmludipkCisKKwlzdWIJJXJkeCwgJXI5CQlDIGludiA9IDIqaW52IC0gaW52KmludipkLCA2NCBiaXRzCisJbW92CSVyMTAsICVyZHgJCUMgaW5pdGlhbCBjbGltYgorCisJQVNTRVJUKGUsYAlDIGQqaW52ID09IDEgbW9kIDJeNjQKKwltb3YJJXI4LCAlcjEwCisJaW11bAklcjksICVyMTAKKwljbXAJJDEsICVyMTAnKQorCisJaW5jCSVyc2kKKwlqeglMKG9uZSkKKworCisJQUxJR04oMTYpCitMKHRvcCk6CisJQyByYXgJbCA9IHNyY1tpXS1jYml0CisJQyByY3gJbmV3IGNiaXQsIDAgb3IgMQorCUMgcmR4CWNsaW1iLCBoaWdoIG9mIGxhc3QgcHJvZHVjdAorCUMgcnNpCWNvdW50ZXIsIGxpbWJzLCBuZWdhdGl2ZQorCUMgcmRpCisJQyByOAlkaXZpc29yCisJQyByOQlpbnZlcnNlCisJQyByMTEJc3JjIGVuZCBwdHIKKworCXN1YgklcmR4LCAlcmF4CQlDIGwgPSBzcmNbaV0tY2JpdCAtIGNsaW1iCisKKwlhZGMJJDAsICVyY3gJCUMgbW9yZSBjYml0CisJaW11bAklcjksICVyYXgJCUMgcSA9IGwgKiBpbnZlcnNlCisKKwltdWwJJXI4CQkJQyBjbGltYiA9IGhpZ2ggKHEgKiBkKQorCisJbW92CSglcjExLCVyc2ksOCksICVyYXgJQyBzcmNbaSsxXQorCXN1YgklcmN4LCAlcmF4CQlDIG5leHQgbCA9IHNyY1tpKzFdIC0gY2JpdAorCXNldGMJUjgoJXJjeCkJCUMgbmV3IGNiaXQKKworCWluYwklcnNpCisJam56CUwodG9wKQorCisKK0wob25lKToKKwlzdWIJJXJkeCwgJXJheAkJQyBsID0gc3JjW2ldLWNiaXQgLSBjbGltYgorCisJYWRjCSQwLCAlcmN4CQlDIG1vcmUgY2JpdAorCWltdWwJJXI5LCAlcmF4CQlDIHEgPSBsICogaW52ZXJzZQorCisJbXVsCSVyOAkJCUMgY2xpbWIgPSBoaWdoIChxICogZCkKKworCWxlYQkoJXJjeCwlcmR4KSwgJXJheAlDIGNsaW1iK2NiaXQKKwlGVU5DX0VYSVQoKQorCXJldAorCitFUElMT0dVRShtcG5fbW9kZXhhY3RfMWNfb2RkKQorRVBJTE9HVUUobXBuX21vZGV4YWN0XzFfb2RkKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9tdWxfMS5hc20gYi9tcG4veDg2XzY0L211bF8xLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY2NTMxCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9tdWxfMS5hc20KQEAgLTAsMCArMSwxOTIgQEAKK2RubCAgQU1ENjQgbXBuX211bF8xLgorCitkbmwgIENvcHlyaWdodCAyMDAzLTIwMDUsIDIwMDcsIDIwMDgsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIEFNRCBLOCxLOSAgICAgIDIuNTQKK0MgQU1EIEsxMCAgICAgICAgMi41NAorQyBBTUQgYnVsbCAgICAgICA0Ljk4CitDIEFNRCBwaWxlICAgICAgIDQuODAKK0MgQU1EIHN0ZWFtCitDIEFNRCBleGNhdmF0b3IKK0MgQU1EIGJvYmNhdCAgICAgNS4zNworQyBBTUQgamFndWFyICAgICA2LjE2CitDIEludGVsIFA0ICAgICAgMTIuNgorQyBJbnRlbCBjb3JlMiAgICA0LjA1CitDIEludGVsIE5ITSAgICAgIDQuMAorQyBJbnRlbCBTQlIgICAgICAyLjkxCitDIEludGVsIElCUiAgICAgIDIuNzMKK0MgSW50ZWwgSFdMICAgICAgMi40NAorQyBJbnRlbCBCV0wgICAgICAyLjM5CitDIEludGVsIFNLTCAgICAgIDIuNDQKK0MgSW50ZWwgYXRvbSAgICAxOS44CitDIEludGVsIFNMTSAgICAgIDkuMAorQyBWSUEgbmFubyAgICAgICA0LjI1CisKK0MgVGhlIGxvb3Agb2YgdGhpcyBjb2RlIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBhIGNvZGUgZ2VuZXJhdGlvbiBhbmQKK0Mgb3B0aW1pemF0aW9uIHRvb2wgc3VpdGUgd3JpdHRlbiBieSBEYXZpZCBIYXJ2ZXkgYW5kIFRvcmJqb3JuIEdyYW5sdW5kLgorCitDIFRPRE8KK0MgICogVGhlIGxvb3AgaXMgZ3JlYXQsIGJ1dCB0aGUgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIGNvZGUgd2FzIHF1aWNrbHkgd3JpdHRlbi4KK0MgICAgVHVuZSBpdCEKKworZGVmaW5lKGBycCcsICAgICAgYCVyZGknKSAgIEMgcmN4CitkZWZpbmUoYHVwJywgICAgICBgJXJzaScpICAgQyByZHgKK2RlZmluZShgbl9wYXJhbScsIGAlcmR4JykgICBDIHI4CitkZWZpbmUoYHZsJywgICAgICBgJXJjeCcpICAgQyByOQorCitkZWZpbmUoYG4nLCAgICAgICBgJXIxMScpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0lGRE9TKGAJZGVmaW5lKGB1cCcsIGBgJXJzaScnKQknKSBkbmwKK0lGRE9TKGAJZGVmaW5lKGBycCcsIGBgJXJjeCcnKQknKSBkbmwKK0lGRE9TKGAJZGVmaW5lKGB2bCcsIGBgJXI5JycpCScpIGRubAorSUZET1MoYAlkZWZpbmUoYHI5JywgYGByZGknJykJJykgZG5sCitJRkRPUyhgCWRlZmluZShgbicsICBgYCVyOCcnKQknKSBkbmwKK0lGRE9TKGAJZGVmaW5lKGByOCcsIGBgcjExJycpCScpIGRubAorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9tdWxfMWMpCitJRkRPUyhgYHB1c2gJJXJzaQkJJycpCitJRkRPUyhgYHB1c2gJJXJkaQkJJycpCitJRkRPUyhgYG1vdgklcmR4LCAlcnNpCScnKQorCXB1c2gJJXJieAorSUZTVEQoYAltb3YJJXI4LCAlcjEwJykKK0lGRE9TKGAJbW92CTY0KCVyc3ApLCAlcjEwJykJQyA0MCArIDMqOCAgKDMgcHVzaCBpbnNucykKKwlqbXAJTChjb21tb24pCitFUElMT0dVRSgpCisKK1BST0xPR1VFKG1wbl9tdWxfMSkKK0lGRE9TKGBgcHVzaAklcnNpCQknJykKK0lGRE9TKGBgcHVzaAklcmRpCQknJykKK0lGRE9TKGBgbW92CSVyZHgsICVyc2kJJycpCisKKwlwdXNoCSVyYngKKwl4b3IJJXIxMCwgJXIxMAorTChjb21tb24pOgorCW1vdgkodXApLCAlcmF4CQlDIHJlYWQgZmlyc3QgdSBsaW1iIGVhcmx5CitJRlNURChgCW1vdgluX3BhcmFtLCAlcmJ4ICAgJykJQyBtb3ZlIGF3YXkgbiBmcm9tIHJkeCwgbXVsIHVzZXMgaXQKK0lGRE9TKGAJbW92CW4sICVyYnggICAgICAgICAnKQorCW11bAl2bAorSUZTVEQoYAltb3YJJXJieCwgbiAgICAgICAgICcpCisKKwlhZGQJJXIxMCwgJXJheAorCWFkYwkkMCwgJXJkeAorCisJYW5kCSQzLCBSMzIoJXJieCkKKwlqeglMKGIwKQorCWNtcAkkMiwgUjMyKCVyYngpCisJanoJTChiMikKKwlqZwlMKGIzKQorCitMKGIxKToJZGVjCW4KKwlqbmUJTChndDEpCisJbW92CSVyYXgsIChycCkKKwlqbXAJTChyZXQpCitMKGd0MSk6CWxlYQk4KHVwLG4sOCksIHVwCisJbGVhCS04KHJwLG4sOCksIHJwCisJbmVnCW4KKwl4b3IJJXIxMCwgJXIxMAorCXhvcglSMzIoJXJieCksIFIzMiglcmJ4KQorCW1vdgklcmF4LCAlcjkKKwltb3YJKHVwLG4sOCksICVyYXgKKwltb3YJJXJkeCwgJXI4CisJam1wCUwoTDEpCisKK0woYjApOglsZWEJKHVwLG4sOCksIHVwCisJbGVhCS0xNihycCxuLDgpLCBycAorCW5lZwluCisJeG9yCSVyMTAsICVyMTAKKwltb3YJJXJheCwgJXI4CisJbW92CSVyZHgsICVyYngKKwlqbXAJIEwoTDApCisKK0woYjMpOglsZWEJLTgodXAsbiw4KSwgdXAKKwlsZWEJLTI0KHJwLG4sOCksIHJwCisJbmVnCW4KKwltb3YJJXJheCwgJXJieAorCW1vdgklcmR4LCAlcjEwCisJam1wCUwoTDMpCisKK0woYjIpOglsZWEJLTE2KHVwLG4sOCksIHVwCisJbGVhCS0zMihycCxuLDgpLCBycAorCW5lZwluCisJeG9yCSVyOCwgJXI4CisJeG9yCVIzMiglcmJ4KSwgUjMyKCVyYngpCisJbW92CSVyYXgsICVyMTAKKwltb3YJMjQodXAsbiw4KSwgJXJheAorCW1vdgklcmR4LCAlcjkKKwlqbXAJTChMMikKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJJXIxMCwgKHJwLG4sOCkKKwlhZGQJJXJheCwgJXI5CisJbW92CSh1cCxuLDgpLCAlcmF4CisJYWRjCSVyZHgsICVyOAorCW1vdgkkMCwgUjMyKCVyMTApCitMKEwxKToJbXVsCXZsCisJbW92CSVyOSwgOChycCxuLDgpCisJYWRkCSVyYXgsICVyOAorCWFkYwklcmR4LCAlcmJ4CitMKEwwKToJbW92CTgodXAsbiw4KSwgJXJheAorCW11bAl2bAorCW1vdgklcjgsIDE2KHJwLG4sOCkKKwlhZGQJJXJheCwgJXJieAorCWFkYwklcmR4LCAlcjEwCitMKEwzKToJbW92CTE2KHVwLG4sOCksICVyYXgKKwltdWwJdmwKKwltb3YJJXJieCwgMjQocnAsbiw4KQorCW1vdgkkMCwgUjMyKCVyOCkJCUMgemVybworCW1vdgklcjgsICVyYngJCUMgemVybworCWFkZAklcmF4LCAlcjEwCisJbW92CTI0KHVwLG4sOCksICVyYXgKKwltb3YJJXI4LCAlcjkJCUMgemVybworCWFkYwklcmR4LCAlcjkKK0woTDIpOgltdWwJdmwKKwlhZGQJJDQsIG4KKwlqcwkgTCh0b3ApCisKKwltb3YJJXIxMCwgKHJwLG4sOCkKKwlhZGQJJXJheCwgJXI5CisJYWRjCSVyOCwgJXJkeAorCW1vdgklcjksIDgocnAsbiw4KQorCWFkZAklcjgsICVyZHgKK0wocmV0KToJbW92CSVyZHgsICVyYXgKKworCXBvcAklcmJ4CitJRkRPUyhgYHBvcAklcmRpCQknJykKK0lGRE9TKGBgcG9wCSVyc2kJCScnKQorCXJldAorRVBJTE9HVUUoKQpkaWZmIC0tZ2l0IGEvbXBuL3g4Nl82NC9tdWxfMi5hc20gYi9tcG4veDg2XzY0L211bF8yLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTliYzJjCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9tdWxfMi5hc20KQEAgLTAsMCArMSwyMDQgQEAKK2RubCAgQU1ENjQgbXBuX211bF8yIC0tIE11bHRpcGx5IGFuIG4tbGltYiB2ZWN0b3Igd2l0aCBhIDItbGltYiB2ZWN0b3IgYW5kCitkbmwgIHN0b3JlIHRoZSByZXN1bHQgaW4gYSB0aGlyZCBsaW1iIHZlY3Rvci4KKworZG5sICBDb3B5cmlnaHQgMjAwOCwgMjAxMSwgMjAxMiwgMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5ICAgICAgNC41MworQyBBTUQgSzEwICAgICAgICA0LjUzCitDIEFNRCBidWxsICAgICAgIDkuNzYgICAxMC4zNworQyBBTUQgcGlsZSAgICAgICA5LjIyCitDIEFNRCBzdGVhbQorQyBBTUQgZXhjYXZhdG9yCitDIEFNRCBib2JjYXQgICAgMTEuMworQyBBTUQgamFndWFyICAgIDExLjkKK0MgSW50ZWwgUDQgICAgICAyNS4wCitDIEludGVsIGNvcmUyICAgIDguMDUKK0MgSW50ZWwgTkhNICAgICAgNy43MgorQyBJbnRlbCBTQlIgICAgICA2LjMzCitDIEludGVsIElCUiAgICAgIDYuMTUKK0MgSW50ZWwgSFdMICAgICAgNi4wMAorQyBJbnRlbCBCV0wgICAgICA0LjQ0CitDIEludGVsIFNLTCAgICAgIDQuNTQKK0MgSW50ZWwgYXRvbSAgICAzOS4wCitDIEludGVsIFNMTSAgICAgMjQuMAorQyBWSUEgbmFubworCitDIFRoaXMgY29kZSBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb2RlIGdlbmVyYXRpb24gYW5kIG9wdGltaXphdGlvbiB0b29sCitDIHN1aXRlIHdyaXR0ZW4gYnkgRGF2aWQgSGFydmV5IGFuZCBUb3Jiam9ybiBHcmFubHVuZC4KKworQyBUT0RPCitDICAqIFdvcmsgb24gZmVlZC1pbiBhbmQgd2luZC1kb3duIGNvZGUuCitDICAqIENvbnZlcnQgIm1vdiAkMCIgdG8gInhvciIuCitDICAqIEFkanVzdCBpbml0aWFsIGxlYSB0byBzYXZlIHNvbWUgYnl0ZXMuCitDICAqIFBlcmhhcHMgYWRqdXN0IG4gZnJvbSBuX3BhcmFtJjMgdmFsdWU/CitDICAqIFJlcGxhY2Ugd2l0aCAyLjI1IGMvbCBzZXF1ZW5jZS4KKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywJIGAlcmRpJykKK2RlZmluZShgdXAnLAkgYCVyc2knKQorZGVmaW5lKGBuX3BhcmFtJyxgJXJkeCcpCitkZWZpbmUoYHZwJywJIGAlcmN4JykKKworZGVmaW5lKGB2MCcsIGAlcjgnKQorZGVmaW5lKGB2MScsIGAlcjknKQorZGVmaW5lKGB3MCcsIGAlcmJ4JykKK2RlZmluZShgdzEnLCBgJXJjeCcpCitkZWZpbmUoYHcyJywgYCVyYnAnKQorZGVmaW5lKGB3MycsIGAlcjEwJykKK2RlZmluZShgbicsICBgJXIxMScpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX211bF8yKQorCUZVTkNfRU5UUlkoNCkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKworCW1vdgkodnApLCB2MAorCW1vdgk4KHZwKSwgdjEKKworCW1vdgkodXApLCAlcmF4CisKKwltb3YJbl9wYXJhbSwgbgorCW5lZwluCisJbGVhCS04KHVwLG5fcGFyYW0sOCksIHVwCisJbGVhCS04KHJwLG5fcGFyYW0sOCksIHJwCisKKwlhbmQJJDMsIFIzMihuX3BhcmFtKQorCWp6CUwobTJwMCkKKwljbXAJJDIsIFIzMihuX3BhcmFtKQorCWpjCUwobTJwMSkKKwlqeglMKG0ycDIpCitMKG0ycDMpOgorCW11bAl2MAorCXhvcglSMzIodzMpLCBSMzIodzMpCisJbW92CSVyYXgsIHcxCisJbW92CSVyZHgsIHcyCisJbW92CTgodXAsbiw4KSwgJXJheAorCWFkZAkkLTEsIG4KKwltdWwJdjEKKwlhZGQJJXJheCwgdzIKKwlqbXAJTChtMjMpCitMKG0ycDApOgorCW11bAl2MAorCXhvcglSMzIodzIpLCBSMzIodzIpCisJbW92CSVyYXgsIHcwCisJbW92CSVyZHgsIHcxCisJam1wCUwobTIwKQorTChtMnAxKToKKwltdWwJdjAKKwl4b3IJUjMyKHczKSwgUjMyKHczKQorCXhvcglSMzIodzApLCBSMzIodzApCisJeG9yCVIzMih3MSksIFIzMih3MSkKKwlhZGQJJDEsIG4KKwlqbXAJTChtMnRvcCkKK0wobTJwMik6CisJbXVsCXYwCisJeG9yCVIzMih3MCksIFIzMih3MCkKKwl4b3IJUjMyKHcxKSwgUjMyKHcxKQorCW1vdgklcmF4LCB3MgorCW1vdgklcmR4LCB3MworCW1vdgk4KHVwLG4sOCksICVyYXgKKwlhZGQJJC0yLCBuCisJam1wCUwobTIyKQorCisKKwlBTElHTigzMikKK0wobTJ0b3ApOgorCWFkZAklcmF4LCB3MworCWFkYwklcmR4LCB3MAorCW1vdgkwKHVwLG4sOCksICVyYXgKKwlhZGMJJDAsIFIzMih3MSkKKwltb3YJJDAsIFIzMih3MikKKwltdWwJdjEKKwlhZGQJJXJheCwgdzAKKwltb3YJdzMsIDAocnAsbiw4KQorCWFkYwklcmR4LCB3MQorCW1vdgk4KHVwLG4sOCksICVyYXgKKwltdWwJdjAKKwlhZGQJJXJheCwgdzAKKwlhZGMJJXJkeCwgdzEKKwlhZGMJJDAsIFIzMih3MikKK0wobTIwKToJbW92CTgodXAsbiw4KSwgJXJheAorCW11bAl2MQorCWFkZAklcmF4LCB3MQorCWFkYwklcmR4LCB3MgorCW1vdgkxNih1cCxuLDgpLCAlcmF4CisJbW92CSQwLCBSMzIodzMpCisJbXVsCXYwCisJYWRkCSVyYXgsIHcxCisJbW92CTE2KHVwLG4sOCksICVyYXgKKwlhZGMJJXJkeCwgdzIKKwlhZGMJJDAsIFIzMih3MykKKwltdWwJdjEKKwlhZGQJJXJheCwgdzIKKwltb3YJdzAsIDgocnAsbiw4KQorTChtMjMpOglhZGMJJXJkeCwgdzMKKwltb3YJMjQodXAsbiw4KSwgJXJheAorCW11bAl2MAorCW1vdgkkMCwgUjMyKHcwKQorCWFkZAklcmF4LCB3MgorCWFkYwklcmR4LCB3MworCW1vdgl3MSwgMTYocnAsbiw4KQorCW1vdgkyNCh1cCxuLDgpLCAlcmF4CisJbW92CSQwLCBSMzIodzEpCisJYWRjCSQwLCBSMzIodzApCitMKG0yMik6CW11bAl2MQorCWFkZAklcmF4LCB3MworCW1vdgl3MiwgMjQocnAsbiw4KQorCWFkYwklcmR4LCB3MAorCW1vdgkzMih1cCxuLDgpLCAlcmF4CisJbXVsCXYwCisJYWRkCSQ0LCBuCisJanMJTChtMnRvcCkKKworCisJYWRkCSVyYXgsIHczCisJYWRjCSVyZHgsIHcwCisJYWRjCSQwLCBSMzIodzEpCisJbW92CSh1cCksICVyYXgKKwltdWwJdjEKKwltb3YJdzMsIChycCkKKwlhZGQJJXJheCwgdzAKKwlhZGMJJXJkeCwgdzEKKwltb3YJdzAsIDgocnApCisJbW92CXcxLCAlcmF4CisKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvcG9waGFtLmFzbSBiL21wbi94ODZfNjQvcG9waGFtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VhZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9wb3BoYW0uYXNtCkBAIC0wLDAgKzEsMTYzIEBACitkbmwgIEFNRDY0IG1wbl9wb3Bjb3VudCwgbXBuX2hhbWRpc3QgLS0gcG9wdWxhdGlvbiBjb3VudCBhbmQgaGFtbWluZyBkaXN0YW5jZS4KKworZG5sICBDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwNywgMjAxMC0yMDEyLCAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCQkgICAgIHBvcGNvdW50CSAgICAgIGhhbWRpc3QKK0MJCSAgICBjeWNsZXMvbGltYgkgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CQkgNgkJIDcKK0MgQU1EIEsxMAkJIDYJCSA3CitDIEludGVsIFA0CQkxMgkJMTQuMworQyBJbnRlbCBjb3JlMgkJIDcJCSA4CitDIEludGVsIGNvcmVpCQkgPwkJIDcuMworQyBJbnRlbCBhdG9tCQkxNi41CQkxNy41CitDIFZJQSBuYW5vCQkgOC43NQkJMTAuNAorCitDIFRPRE8KK0MgICogVHVuZS4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byByZWFjaCA1IGMvbCBmb3IgcG9wY291bnQgYW5kIDYgYy9sIGZvcgorQyAgICBoYW1kaXN0IGZvciBLOC9LOS4KKworCitpZmRlZihgT1BFUkFUSU9OX3BvcGNvdW50JyxgCisgIGRlZmluZShgZnVuYycsYG1wbl9wb3Bjb3VudCcpCisgIGRlZmluZShgdXAnLAkJYCVyZGknKQorICBkZWZpbmUoYG4nLAkJYCVyc2knKQorICBkZWZpbmUoYGg1NTU1NTU1NScsCWAlcjEwJykKKyAgZGVmaW5lKGBoMzMzMzMzMzMnLAlgJXIxMScpCisgIGRlZmluZShgaDBmMGYwZjBmJywJYCVyY3gnKQorICBkZWZpbmUoYGgwMTAxMDEwMScsCWAlcmR4JykKKyAgZGVmaW5lKGBQT1AnLAkJYCQxJykKKyAgZGVmaW5lKGBIQU0nLAkJYGRubCcpCisnKQoraWZkZWYoYE9QRVJBVElPTl9oYW1kaXN0JyxgCisgIGRlZmluZShgZnVuYycsYG1wbl9oYW1kaXN0JykKKyAgZGVmaW5lKGB1cCcsCQlgJXJkaScpCisgIGRlZmluZShgdnAnLAkJYCVyc2knKQorICBkZWZpbmUoYG4nLAkJYCVyZHgnKQorICBkZWZpbmUoYGg1NTU1NTU1NScsCWAlcjEwJykKKyAgZGVmaW5lKGBoMzMzMzMzMzMnLAlgJXIxMScpCisgIGRlZmluZShgaDBmMGYwZjBmJywJYCVyY3gnKQorICBkZWZpbmUoYGgwMTAxMDEwMScsCWAlcjEyJykKKyAgZGVmaW5lKGBQT1AnLAkJYGRubCcpCisgIGRlZmluZShgSEFNJywJCWAkMScpCisnKQorCisKK01VTEZVTkNfUFJPTE9HVUUobXBuX3BvcGNvdW50IG1wbl9oYW1kaXN0KQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigzMikKK1BST0xPR1VFKGZ1bmMpCisgUE9QKGAJRlVOQ19FTlRSWSgyKQkJJykKKyBIQU0oYAlGVU5DX0VOVFJZKDMpCQknKQorCXB1c2gJJXJieAorCW1vdgkkMHg1NTU1NTU1NTU1NTU1NTU1LCBoNTU1NTU1NTUKKwlwdXNoCSVyYnAKKwltb3YJJDB4MzMzMzMzMzMzMzMzMzMzMywgaDMzMzMzMzMzCisgSEFNKGAJcHVzaAklcjEyCQknKQorCWxlYQkodXAsbiw4KSwgdXAKKwltb3YJJDB4MGYwZjBmMGYwZjBmMGYwZiwgaDBmMGYwZjBmCisgSEFNKGAJbGVhCSh2cCxuLDgpLCB2cAknKQorCW5lZwluCisJbW92CSQweDAxMDEwMTAxMDEwMTAxMDEsIGgwMTAxMDEwMQorCXhvcglSMzIoJXJheCksIFIzMiglcmF4KQorCXRlc3QJJDEsIFI4KG4pCisJanoJTCh0b3ApCisKKwltb3YJKHVwLG4sOCksICVyOAorIEhBTShgCXhvcgkodnAsbiw4KSwgJXI4CScpCisKKwltb3YJJXI4LCAlcjkKKwlzaHIJJXI4CisJYW5kCWg1NTU1NTU1NSwgJXI4CisJc3ViCSVyOCwgJXI5CisKKwltb3YJJXI5LCAlcjgKKwlzaHIJJDIsICVyOQorCWFuZAloMzMzMzMzMzMsICVyOAorCWFuZAloMzMzMzMzMzMsICVyOQorCWFkZAklcjgsICVyOQkJQyAxNiA0LWJpdCBmaWVsZHMgKDAuLjQpCisKKwlkZWMJbgorCWptcAlMKG1pZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOgltb3YJKHVwLG4sOCksICVyOAorCW1vdgk4KHVwLG4sOCksICVyYngKKyBIQU0oYAl4b3IJKHZwLG4sOCksICVyOAknKQorIEhBTShgCXhvcgk4KHZwLG4sOCksICVyYngJJykKKworCW1vdgklcjgsICVyOQorCW1vdgklcmJ4LCAlcmJwCisJc2hyCSVyOAorCXNocgklcmJ4CisJYW5kCWg1NTU1NTU1NSwgJXI4CisJYW5kCWg1NTU1NTU1NSwgJXJieAorCXN1YgklcjgsICVyOQorCXN1YgklcmJ4LCAlcmJwCisKKwltb3YJJXI5LCAlcjgKKwltb3YJJXJicCwgJXJieAorCXNocgkkMiwgJXI5CisJc2hyCSQyLCAlcmJwCisJYW5kCWgzMzMzMzMzMywgJXI4CisJYW5kCWgzMzMzMzMzMywgJXI5CisJYW5kCWgzMzMzMzMzMywgJXJieAorCWFuZAloMzMzMzMzMzMsICVyYnAKKwlhZGQJJXI4LCAlcjkJCUMgMTYgNC1iaXQgZmllbGRzICgwLi40KQorCWFkZAklcmJ4LCAlcmJwCQlDIDE2IDQtYml0IGZpZWxkcyAoMC4uNCkKKworCWFkZAklcmJwLCAlcjkJCUMgMTYgNC1iaXQgZmllbGRzICgwLi44KQorTChtaWQpOgltb3YJJXI5LCAlcjgKKwlzaHIJJDQsICVyOQorCWFuZAloMGYwZjBmMGYsICVyOAorCWFuZAloMGYwZjBmMGYsICVyOQorCWFkZAklcjgsICVyOQkJQyA4IDgtYml0IGZpZWxkcyAoMC4uMTYpCisKKwlpbXVsCWgwMTAxMDEwMSwgJXI5CQlDIHN1bSB0aGUgOCBmaWVsZHMgaW4gaGlnaCA4IGJpdHMKKwlzaHIJJDU2LCAlcjkKKworCWFkZAklcjksICVyYXgJCUMgYWRkIHRvIHRvdGFsCisJYWRkCSQyLCBuCisJam5jCUwodG9wKQorCitMKGVuZCk6CisgSEFNKGAJcG9wCSVyMTIJCScpCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L3JzaDFhb3JzX24uYXNtIGIvbXBuL3g4Nl82NC9yc2gxYW9yc19uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTdkMDRkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9yc2gxYW9yc19uLmFzbQpAQCAtMCwwICsxLDE4OSBAQAorZG5sICBBTUQ2NCBtcG5fcnNoMWFkZF9uIC0tIHJwW10gPSAodXBbXSArIHZwW10pID4+IDEKK2RubCAgQU1ENjQgbXBuX3JzaDFzdWJfbiAtLSBycFtdID0gKHVwW10gLSB2cFtdKSA+PiAxCisKK2RubCAgQ29weXJpZ2h0IDIwMDMsIDIwMDUsIDIwMDksIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIEFNRCBLOCxLOQkgMi4xNAkobXBuX2FkZF9uICsgbXBuX3JzaGlmdCBuZWVkIDQuMTI1KQorQyBBTUQgSzEwCSAyLjE0CShtcG5fYWRkX24gKyBtcG5fcnNoaWZ0IG5lZWQgNC4xMjUpCitDIEludGVsIFA0CTEyLjc1CitDIEludGVsIGNvcmUyCSAzLjc1CitDIEludGVsIE5NSAkgNC40CitDIEludGVsIFNCUgkgPworQyBJbnRlbCBhdG9tCSA/CitDIFZJQSBuYW5vCSAzLjI1CisKK0MgVE9ETworQyAgKiBSZXdyaXRlIHRvIHVzZSBpbmRleGVkIGFkZHJlc3NpbmcsIGxpa2UgYWRkbHNoMS5hc20gYW5kIHN1YmxzaDEuYXNtLgorCitDIElOUFVUIFBBUkFNRVRFUlMKK2RlZmluZShgcnAnLCBgJXJkaScpCitkZWZpbmUoYHVwJywgYCVyc2knKQorZGVmaW5lKGB2cCcsIGAlcmR4JykKK2RlZmluZShgbicsYCAgJXJjeCcpCisKK2lmZGVmKGBPUEVSQVRJT05fcnNoMWFkZF9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIGFkZCkKKwlkZWZpbmUoQURDU0JCLAkgICAgICBhZGMpCisJZGVmaW5lKGZ1bmNfbiwJICAgICAgbXBuX3JzaDFhZGRfbikKKwlkZWZpbmUoZnVuY19uYywJICAgICAgbXBuX3JzaDFhZGRfbmMpJykKK2lmZGVmKGBPUEVSQVRJT05fcnNoMXN1Yl9uJywgYAorCWRlZmluZShBRERTVUIsCSAgICAgIHN1YikKKwlkZWZpbmUoQURDU0JCLAkgICAgICBzYmIpCisJZGVmaW5lKGZ1bmNfbiwJICAgICAgbXBuX3JzaDFzdWJfbikKKwlkZWZpbmUoZnVuY19uYywJICAgICAgbXBuX3JzaDFzdWJfbmMpJykKKworTVVMRlVOQ19QUk9MT0dVRShtcG5fcnNoMWFkZF9uIG1wbl9yc2gxYWRkX25jIG1wbl9yc2gxc3ViX24gbXBuX3JzaDFzdWJfbmMpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuY19uYykKKwlGVU5DX0VOVFJZKDQpCitJRkRPUyhgCW1vdgk1NiglcnNwKSwgJXI4CScpCisJcHVzaAklcmJ4CisKKwl4b3IJUjMyKCVyYXgpLCBSMzIoJXJheCkKKwluZWcJJXI4CQkJQyBzZXQgQyBmbGFnIGZyb20gcGFyYW1ldGVyCisJbW92CSh1cCksICVyYngKKwlBRENTQkIJKHZwKSwgJXJieAorCWptcAlMKGVudCkKK0VQSUxPR1VFKCkKKworCUFMSUdOKDE2KQorUFJPTE9HVUUoZnVuY19uKQorCUZVTkNfRU5UUlkoNCkKKwlwdXNoCSVyYngKKworCXhvcglSMzIoJXJheCksIFIzMiglcmF4KQorCW1vdgkodXApLCAlcmJ4CisJQUREU1VCCSh2cCksICVyYngKK0woZW50KToKKwlyY3IJJXJieAkJCUMgcm90YXRlLCBzYXZlIGFjeQorCWFkYwlSMzIoJXJheCksIFIzMiglcmF4KQlDIHJldHVybiB2YWx1ZQorCisJbW92CVIzMihuKSwgUjMyKCVyMTEpCisJYW5kCSQzLCBSMzIoJXIxMSkKKworCWNtcAkkMSwgUjMyKCVyMTEpCisJamUJTChkbykJCQlDIGp1bXAgaWYgbiA9IDEgNSA5IC4uLgorCitMKG4xKToJY21wCSQyLCBSMzIoJXIxMSkKKwlqbmUJTChuMikJCQlDIGp1bXAgdW5sZXNzIG4gPSAyIDYgMTAgLi4uCisJYWRkCSVyYngsICVyYngJCUMgcm90YXRlIGNhcnJ5IGxpbWIsIHJlc3RvcmUgYWN5CisJbW92CTgodXApLCAlcjEwCisJQURDU0JCCTgodnApLCAlcjEwCisJbGVhCTgodXApLCB1cAorCWxlYQk4KHZwKSwgdnAKKwlsZWEJOChycCksIHJwCisJcmNyCSVyMTAKKwlyY3IJJXJieAorCW1vdgklcmJ4LCAtOChycCkKKwlqbXAJTChjajEpCisKK0wobjIpOgljbXAJJDMsIFIzMiglcjExKQorCWpuZQlMKG4zKQkJCUMganVtcCB1bmxlc3MgbiA9IDMgNyAxMSAuLi4KKwlhZGQJJXJieCwgJXJieAkJQyByb3RhdGUgY2FycnkgbGltYiwgcmVzdG9yZSBhY3kKKwltb3YJOCh1cCksICVyOQorCW1vdgkxNih1cCksICVyMTAKKwlBRENTQkIJOCh2cCksICVyOQorCUFEQ1NCQgkxNih2cCksICVyMTAKKwlsZWEJMTYodXApLCB1cAorCWxlYQkxNih2cCksIHZwCisJbGVhCTE2KHJwKSwgcnAKKwlyY3IJJXIxMAorCXJjcgklcjkKKwlyY3IJJXJieAorCW1vdgklcmJ4LCAtMTYocnApCisJam1wCUwoY2oyKQorCitMKG4zKToJZGVjCW4JCQlDIGNvbWUgaGVyZSBmb3IgbiA9IDQgOCAxMiAuLi4KKwlhZGQJJXJieCwgJXJieAkJQyByb3RhdGUgY2FycnkgbGltYiwgcmVzdG9yZSBhY3kKKwltb3YJOCh1cCksICVyOAorCW1vdgkxNih1cCksICVyOQorCUFEQ1NCQgk4KHZwKSwgJXI4CisJQURDU0JCCTE2KHZwKSwgJXI5CisJbW92CTI0KHVwKSwgJXIxMAorCUFEQ1NCQgkyNCh2cCksICVyMTAKKwlsZWEJMjQodXApLCB1cAorCWxlYQkyNCh2cCksIHZwCisJbGVhCTI0KHJwKSwgcnAKKwlyY3IJJXIxMAorCXJjcgklcjkKKwlyY3IJJXI4CisJcmNyCSVyYngKKwltb3YJJXJieCwgLTI0KHJwKQorCW1vdgklcjgsIC0xNihycCkKK0woY2oyKToJbW92CSVyOSwgLTgocnApCitMKGNqMSk6CW1vdgklcjEwLCAlcmJ4CisKK0woZG8pOgorCXNocgkkMiwgbgkJCUMJCQkJNAorCWplCUwoZW5kKQkJCUMJCQkJMgorCUFMSUdOKDE2KQorTCh0b3ApOglhZGQJJXJieCwgJXJieAkJQyByb3RhdGUgY2FycnkgbGltYiwgcmVzdG9yZSBhY3kKKworCW1vdgk4KHVwKSwgJXI4CisJbW92CTE2KHVwKSwgJXI5CisJQURDU0JCCTgodnApLCAlcjgKKwlBRENTQkIJMTYodnApLCAlcjkKKwltb3YJMjQodXApLCAlcjEwCisJbW92CTMyKHVwKSwgJXIxMQorCUFEQ1NCQgkyNCh2cCksICVyMTAKKwlBRENTQkIJMzIodnApLCAlcjExCisKKwlsZWEJMzIodXApLCB1cAorCWxlYQkzMih2cCksIHZwCisKKwlyY3IJJXIxMQkJCUMgcm90YXRlLCBzYXZlIGFjeQorCXJjcgklcjEwCisJcmNyCSVyOQorCXJjcgklcjgKKworCXJjcgklcmJ4CisJbW92CSVyYngsIChycCkKKwltb3YJJXI4LCA4KHJwKQorCW1vdgklcjksIDE2KHJwKQorCW1vdgklcjEwLCAyNChycCkKKwltb3YJJXIxMSwgJXJieAorCisJbGVhCTMyKHJwKSwgcnAKKwlkZWMJbgorCWpuZQlMKHRvcCkKKworTChlbmQpOgltb3YJJXJieCwgKHJwKQorCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvcnNoaWZ0LmFzbSBiL21wbi94ODZfNjQvcnNoaWZ0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjA0ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9yc2hpZnQuYXNtCkBAIC0wLDAgKzEsMTc2IEBACitkbmwgIEFNRDY0IG1wbl9yc2hpZnQgLS0gbXBuIHJpZ2h0IHNoaWZ0LgorCitkbmwgIENvcHlyaWdodCAyMDAzLCAyMDA1LCAyMDA5LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQwkgICAgIGN5Y2xlcy9saW1iCitDIEFNRCBLOCxLOQkgMi4zNzUKK0MgQU1EIEsxMAkgMi4zNzUKK0MgSW50ZWwgUDQJIDgKK0MgSW50ZWwgY29yZTIJIDIuMTEKK0MgSW50ZWwgY29yZWkJID8KK0MgSW50ZWwgYXRvbQkgNS43NQorQyBWSUEgbmFubwkgMy41CisKKworQyBJTlBVVCBQQVJBTUVURVJTCitkZWZpbmUoYHJwJywJYCVyZGknKQorZGVmaW5lKGB1cCcsCWAlcnNpJykKK2RlZmluZShgbicsCWAlcmR4JykKK2RlZmluZShgY250JywJYCVyY3gnKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigzMikKK1BST0xPR1VFKG1wbl9yc2hpZnQpCisJRlVOQ19FTlRSWSg0KQorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IHJzaCBjb3VudCBpbiBjbAorCW1vdgkodXApLCAlcmF4CisJc2hsCVI4KCVyY3gpLCAlcmF4CQlDIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCisJbGVhCTEobiksIFIzMiglcjgpCisKKwlsZWEJLTgodXAsbiw4KSwgdXAKKwlsZWEJLTgocnAsbiw4KSwgcnAKKwluZWcJbgorCisJYW5kCSQzLCBSMzIoJXI4KQorCWplCUwocmx4KQkJCUMganVtcCBmb3IgbiA9IDMsIDcsIDExLCAuLi4KKworCWRlYwlSMzIoJXI4KQorCWpuZQlMKDEpCitDCW4gPSA0LCA4LCAxMiwgLi4uCisJbW92CTgodXAsbiw4KSwgJXIxMAorCXNocglSOCglcmN4KSwgJXIxMAorCW5lZwlSMzIoJXJjeCkJCUMgcHV0IHJzaCBjb3VudCBpbiBjbAorCW1vdgkxNih1cCxuLDgpLCAlcjgKKwlzaGwJUjgoJXJjeCksICVyOAorCW9yCSVyOCwgJXIxMAorCW1vdgklcjEwLCA4KHJwLG4sOCkKKwlpbmMJbgorCWptcAlMKHJsbCkKKworTCgxKToJZGVjCVIzMiglcjgpCisJamUJTCgxeCkJCQlDIGp1bXAgZm9yIG4gPSAxLCA1LCA5LCAxMywgLi4uCitDCW4gPSAyLCA2LCAxMCwgMTYsIC4uLgorCW1vdgk4KHVwLG4sOCksICVyMTAKKwlzaHIJUjgoJXJjeCksICVyMTAKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJMTYodXAsbiw4KSwgJXI4CisJc2hsCVI4KCVyY3gpLCAlcjgKKwlvcgklcjgsICVyMTAKKwltb3YJJXIxMCwgOChycCxuLDgpCisJaW5jCW4KKwluZWcJUjMyKCVyY3gpCQlDIHB1dCBsc2ggY291bnQgaW4gY2wKK0woMXgpOgorCWNtcAkkLTEsIG4KKwlqZQlMKGFzdCkKKwltb3YJOCh1cCxuLDgpLCAlcjEwCisJc2hyCVI4KCVyY3gpLCAlcjEwCisJbW92CTE2KHVwLG4sOCksICVyMTEKKwlzaHIJUjgoJXJjeCksICVyMTEKKwluZWcJUjMyKCVyY3gpCQlDIHB1dCByc2ggY291bnQgaW4gY2wKKwltb3YJMTYodXAsbiw4KSwgJXI4CisJbW92CTI0KHVwLG4sOCksICVyOQorCXNobAlSOCglcmN4KSwgJXI4CisJb3IJJXI4LCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjkKKwlvcgklcjksICVyMTEKKwltb3YJJXIxMCwgOChycCxuLDgpCisJbW92CSVyMTEsIDE2KHJwLG4sOCkKKwlhZGQJJDIsIG4KKworTChybGwpOgluZWcJUjMyKCVyY3gpCQlDIHB1dCBsc2ggY291bnQgaW4gY2wKK0wocmx4KToJbW92CTgodXAsbiw4KSwgJXIxMAorCXNocglSOCglcmN4KSwgJXIxMAorCW1vdgkxNih1cCxuLDgpLCAlcjExCisJc2hyCVI4KCVyY3gpLCAlcjExCisKKwlhZGQJJDQsIG4JCQlDCQkJCSAgICAgIDQKKwlqYglMKGVuZCkJCQlDCQkJCSAgICAgIDIKKwlBTElHTigxNikKK0wodG9wKToKKwlDIGZpbmlzaCBzdHVmZiBmcm9tIGxzaCBibG9jaworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IHJzaCBjb3VudCBpbiBjbAorCW1vdgktMTYodXAsbiw4KSwgJXI4CisJbW92CS04KHVwLG4sOCksICVyOQorCXNobAlSOCglcmN4KSwgJXI4CisJb3IJJXI4LCAlcjEwCisJc2hsCVI4KCVyY3gpLCAlcjkKKwlvcgklcjksICVyMTEKKwltb3YJJXIxMCwgLTI0KHJwLG4sOCkKKwltb3YJJXIxMSwgLTE2KHJwLG4sOCkKKwlDIHN0YXJ0IHR3byBuZXcgcnNoCisJbW92CSh1cCxuLDgpLCAlcjgKKwltb3YJOCh1cCxuLDgpLCAlcjkKKwlzaGwJUjgoJXJjeCksICVyOAorCXNobAlSOCglcmN4KSwgJXI5CisKKwlDIGZpbmlzaCBzdHVmZiBmcm9tIHJzaCBibG9jaworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorCW1vdgktOCh1cCxuLDgpLCAlcjEwCisJbW92CTAodXAsbiw4KSwgJXIxMQorCXNocglSOCglcmN4KSwgJXIxMAorCW9yCSVyMTAsICVyOAorCXNocglSOCglcmN4KSwgJXIxMQorCW9yCSVyMTEsICVyOQorCW1vdgklcjgsIC04KHJwLG4sOCkKKwltb3YJJXI5LCAwKHJwLG4sOCkKKwlDIHN0YXJ0IHR3byBuZXcgbHNoCisJbW92CTgodXAsbiw4KSwgJXIxMAorCW1vdgkxNih1cCxuLDgpLCAlcjExCisJc2hyCVI4KCVyY3gpLCAlcjEwCisJc2hyCVI4KCVyY3gpLCAlcjExCisKKwlhZGQJJDQsIG4KKwlqYWUJTCh0b3ApCQkJQwkJCQkgICAgICAyCitMKGVuZCk6CisJbmVnCVIzMiglcmN4KQkJQyBwdXQgcnNoIGNvdW50IGluIGNsCisJbW92CS04KHVwKSwgJXI4CisJc2hsCVI4KCVyY3gpLCAlcjgKKwlvcgklcjgsICVyMTAKKwltb3YJKHVwKSwgJXI5CisJc2hsCVI4KCVyY3gpLCAlcjkKKwlvcgklcjksICVyMTEKKwltb3YJJXIxMCwgLTE2KHJwKQorCW1vdgklcjExLCAtOChycCkKKworCW5lZwlSMzIoJXJjeCkJCUMgcHV0IGxzaCBjb3VudCBpbiBjbAorTChhc3QpOgltb3YJKHVwKSwgJXIxMAorCXNocglSOCglcmN4KSwgJXIxMAorCW1vdgklcjEwLCAocnApCisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvc2VjX3RhYnNlbGVjdC5hc20gYi9tcG4veDg2XzY0L3NlY190YWJzZWxlY3QuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L3NlY190YWJzZWxlY3QuYXNtCkBAIC0wLDAgKzEsMTc2IEBACitkbmwgIEFNRDY0IG1wbl9zZWNfdGFic2VsZWN0LgorCitkbmwgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3JiasO2cm4gR3Jhbmx1bmQuCisKK2RubCAgQ29weXJpZ2h0IDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MJICAgICBjeWNsZXMvbGltYiAgICAgICAgICBnb29kIGZvciBjcHUKK0MgQU1EIEs4LEs5CSAxLjUJCQlZCitDIEFNRCBLMTAJIDEuNAorQyBBTUQgYmQxCSAyLjY0CitDIEFNRCBib2JjYXQJIDIuMTUJCQlZCitDIEludGVsIFA0CSA0CitDIEludGVsIGNvcmUyCSAxLjM4CitDIEludGVsIE5ITQkgMS43NQorQyBJbnRlbCBTQlIJIDEuMjUKK0MgSW50ZWwgYXRvbQkgMi41CQkJWQorQyBWSUEgbmFubwkgMS43NQkJCVkKKworQyBOT1RFUworQyAgKiBUaGlzIGhhcyBub3QgYmVlbiB0dW5lZCBmb3IgYW55IHNwZWNpZmljIHByb2Nlc3Nvci4gIEl0cyBzcGVlZCBzaG91bGQgbm90CitDICAgIGJlIHRvbyBiYWQsIHRob3VnaC4KK0MgICogVXNpbmcgU1NFMi9BVlgyIGNvdWxkIHJlc3VsdCBpbiBtYW55LWZvbGQgc3BlZWR1cC4KK0MgICogV09SS1MgRk9SIG4gbW9kIDQgPSAwIE9OTFkhCisKK0MgbXBuX3NlY190YWJzZWxlY3QgKG1wX2xpbWJfdCAqcnAsIG1wX2xpbWJfdCAqdHAsIG1wX3NpemVfdCBuLCBtcF9zaXplX3QgbmVudHMsIG1wX3NpemVfdCB3aGljaCkKK2RlZmluZShgcnAnLCAgICAgYCVyZGknKQorZGVmaW5lKGB0cCcsICAgICBgJXJzaScpCitkZWZpbmUoYG4nLCAgICAgIGAlcmR4JykKK2RlZmluZShgbmVudHMnLCAgYCVyY3gnKQorZGVmaW5lKGB3aGljaCcsICBgJXI4JykKKworZGVmaW5lKGBpJywgICAgICBgJXJicCcpCitkZWZpbmUoYGonLCAgICAgIGAlcjknKQorCitDIHJheCAgcmJ4ICByY3ggIHJkeCAgcmRpICByc2kgIHJicCAgIHI4ICAgcjkgIHIxMCAgcjExICByMTIgIHIxMyAgcjE0ICByMTUKK0MgICAgICAgICAgbmVudHMgIG4gICBycCAgIHRhYiAgIGkgICB3aGljaCBqICAgICogICAgKiAgICAqICAgICogICAgKiAgICAqCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDE2KQorUFJPTE9HVUUobXBuX3NlY190YWJzZWxlY3QpCisJRlVOQ19FTlRSWSg0KQorSUZET1MoYAltb3YJNTYoJXJzcCksICVyOGQJJykKKworCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCisJbW92CW4sIGoKKwlhZGQJJC00LCBqCisJanMJTChvdXRlcl9lbmQpCisKK0wob3V0ZXJfdG9wKToKKwltb3YJbmVudHMsIGkKKwlwdXNoCXRwCisJeG9yCVIzMiglcjEyKSwgUjMyKCVyMTIpCisJeG9yCVIzMiglcjEzKSwgUjMyKCVyMTMpCisJeG9yCVIzMiglcjE0KSwgUjMyKCVyMTQpCisJeG9yCVIzMiglcjE1KSwgUjMyKCVyMTUpCisJbW92CXdoaWNoLCAlcmJ4CisKKwlBTElHTigxNikKK0wodG9wKToJc3ViCSQxLCAlcmJ4CisJc2JiCSVyYXgsICVyYXgKKwltb3YJMCh0cCksICVyMTAKKwltb3YJOCh0cCksICVyMTEKKwlhbmQJJXJheCwgJXIxMAorCWFuZAklcmF4LCAlcjExCisJb3IJJXIxMCwgJXIxMgorCW9yCSVyMTEsICVyMTMKKwltb3YJMTYodHApLCAlcjEwCisJbW92CTI0KHRwKSwgJXIxMQorCWFuZAklcmF4LCAlcjEwCisJYW5kCSVyYXgsICVyMTEKKwlvcgklcjEwLCAlcjE0CisJb3IJJXIxMSwgJXIxNQorCWxlYQkodHAsbiw4KSwgdHAKKwlhZGQJJC0xLCBpCisJam5lCUwodG9wKQorCisJbW92CSVyMTIsIDAocnApCisJbW92CSVyMTMsIDgocnApCisJbW92CSVyMTQsIDE2KHJwKQorCW1vdgklcjE1LCAyNChycCkKKwlwb3AJdHAKKwlsZWEJMzIodHApLCB0cAorCWxlYQkzMihycCksIHJwCisJYWRkCSQtNCwgagorCWpucwlMKG91dGVyX3RvcCkKK0wob3V0ZXJfZW5kKToKKworCXRlc3QJJDIsIFI4KG4pCisJanoJTChiMHgpCitMKGIxeCk6CW1vdgluZW50cywgaQorCXB1c2gJdHAKKwl4b3IJUjMyKCVyMTIpLCBSMzIoJXIxMikKKwl4b3IJUjMyKCVyMTMpLCBSMzIoJXIxMykKKwltb3YJd2hpY2gsICVyYngKKwlBTElHTigxNikKK0wodHAyKToJc3ViCSQxLCAlcmJ4CisJc2JiCSVyYXgsICVyYXgKKwltb3YJMCh0cCksICVyMTAKKwltb3YJOCh0cCksICVyMTEKKwlhbmQJJXJheCwgJXIxMAorCWFuZAklcmF4LCAlcjExCisJb3IJJXIxMCwgJXIxMgorCW9yCSVyMTEsICVyMTMKKwlsZWEJKHRwLG4sOCksIHRwCisJYWRkCSQtMSwgaQorCWpuZQlMKHRwMikKKwltb3YJJXIxMiwgMChycCkKKwltb3YJJXIxMywgOChycCkKKwlwb3AJdHAKKwlsZWEJMTYodHApLCB0cAorCWxlYQkxNihycCksIHJwCisKK0woYjB4KToJdGVzdAkkMSwgUjgobikKKwlqeglMKGIwMCkKK0woYjAxKToJbW92CW5lbnRzLCBpCisJeG9yCVIzMiglcjEyKSwgUjMyKCVyMTIpCisJbW92CXdoaWNoLCAlcmJ4CisJQUxJR04oMTYpCitMKHRwMSk6CXN1YgkkMSwgJXJieAorCXNiYgklcmF4LCAlcmF4CisJbW92CTAodHApLCAlcjEwCisJYW5kCSVyYXgsICVyMTAKKwlvcgklcjEwLCAlcjEyCisJbGVhCSh0cCxuLDgpLCB0cAorCWFkZAkkLTEsIGkKKwlqbmUJTCh0cDEpCisJbW92CSVyMTIsIDAocnApCisKK0woYjAwKToJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvc3FyX2RpYWdfYWRkbHNoMS5hc20gYi9tcG4veDg2XzY0L3Nxcl9kaWFnX2FkZGxzaDEuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tcG4veDg2XzY0L3Nxcl9kaWFnX2FkZGxzaDEuYXNtCkBAIC0wLDAgKzEsMTE2IEBACitkbmwgIEFNRDY0IG1wbl9zcXJfZGlhZ19hZGRsc2gxCisKK2RubCAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqw7ZybiBHcmFubHVuZC4KKworZG5sICBDb3B5cmlnaHQgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorZG5sICBpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorZG5sCitkbmwgICAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorZG5sICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK2RubCAgICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorZG5sICAgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2RubCAgICAgIGxhdGVyIHZlcnNpb24uCitkbmwKK2RubCAgb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KK2RubAorZG5sICBUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitkbmwgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitkbmwgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sICBmb3IgbW9yZSBkZXRhaWxzLgorZG5sCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK2RubCAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorZG5sICBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKK0MJICAgICBjeWNsZXMvbGltYgorQyBBTUQgSzgsSzkJIDIuNQorQyBBTUQgSzEwCSAyLjUKK0MgQU1EIGJ1bGwJIDMuNgorQyBBTUQgcGlsZQkgMy42CitDIEFNRCBzdGVhbQkgPworQyBBTUQgYm9iY2F0CSA0CitDIEFNRCBqYWd1YXIJID8KK0MgSW50ZWwgUDQJIDExLjUKK0MgSW50ZWwgY29yZQkgNAorQyBJbnRlbCBOSE0JIDMuNgorQyBJbnRlbCBTQlIJIDMuMTUKK0MgSW50ZWwgSUJSCSAzLjAKK0MgSW50ZWwgSFdMCSAyLjYKK0MgSW50ZWwgQldMCSA/CitDIEludGVsIGF0b20JMTQKK0MgVklBIG5hbm8JIDMuNQorCitDIFdoZW4gcGxheWluZyB3aXRoIHBvaW50ZXJzLCBzZXQgdGhpcyB0byAkMiB0byBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlCitDIGluZGV4aW5nIGluIHdpbmQtZG93biBjb2RlLgorZGVmaW5lKGBJJyxgJDEnKQorCitkZWZpbmUoYHJwJywgICAgIGAlcmRpJykKK2RlZmluZShgdHAnLCAgICAgYCVyc2knKQorZGVmaW5lKGB1cF9hcmcnLCBgJXJkeCcpCitkZWZpbmUoYG4nLCAgICAgIGAlcmN4JykKKworZGVmaW5lKGB1cCcsICAgICBgJXIxMScpCisKK0FCSV9TVVBQT1JUKERPUzY0KQorQUJJX1NVUFBPUlQoU1RENjQpCisKK0FTTV9TVEFSVCgpCisJVEVYVAorCUFMSUdOKDMyKQorUFJPTE9HVUUobXBuX3Nxcl9kaWFnX2FkZGxzaDEpCisJRlVOQ19FTlRSWSg0KQorCXB1c2gJJXJieAorCisJZGVjCW4KKwlzaGwJbgorCisJbW92CSh1cF9hcmcpLCAlcmF4CisKKwlsZWEJKHJwLG4sOCksIHJwCisJbGVhCSh0cCxuLDgpLCB0cAorCWxlYQkodXBfYXJnLG4sNCksIHVwCisJbmVnCW4KKworCW11bAklcmF4CisJbW92CSVyYXgsIChycCxuLDgpCisKKwl4b3IJUjMyKCVyYngpLCBSMzIoJXJieCkKKwlqbXAJTChtaWQpCisKKwlBTElHTigxNikKK0wodG9wKToJYWRkCSVyMTAsICVyOAorCWFkYwklcmF4LCAlcjkKKwltb3YJJXI4LCAtOChycCxuLDgpCisJbW92CSVyOSwgKHJwLG4sOCkKK0wobWlkKToJbW92CTgodXAsbiw0KSwgJXJheAorCW1vdgkodHAsbiw4KSwgJXI4CisJbW92CTgodHAsbiw4KSwgJXI5CisJYWRjCSVyOCwgJXI4CisJYWRjCSVyOSwgJXI5CisJbGVhCSglcmR4LCVyYngpLCAlcjEwCisJc2V0YwlSOCglcmJ4KQorCW11bAklcmF4CisJYWRkCSQyLCBuCisJanMJTCh0b3ApCisKK0woZW5kKToJYWRkCSVyMTAsICVyOAorCWFkYwklcmF4LCAlcjkKKwltb3YJJXI4LCBJKC04KHJwKSwtOChycCxuLDgpKQorCW1vdgklcjksIEkoKHJwKSwocnAsbiw4KSkKKwlhZGMJJXJieCwgJXJkeAorCW1vdgklcmR4LCBJKDgocnApLDgocnAsbiw4KSkKKworCXBvcAklcmJ4CisJRlVOQ19FWElUKCkKKwlyZXQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL21wbi94ODZfNjQvc3VibHNoMV9uLmFzbSBiL21wbi94ODZfNjQvc3VibHNoMV9uLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmZkMTZkCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC9zdWJsc2gxX24uYXNtCkBAIC0wLDAgKzEsMTYwIEBACitkbmwgIEFNRDY0IG1wbl9zdWJsc2gxX24gLS0gcnBbXSA9IHVwW10gLSAodnBbXSA8PCAxKQorCitkbmwgIENvcHlyaWdodCAyMDAzLCAyMDA1LTIwMDcsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CitkbmwKK2RubCAgICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitkbmwgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorZG5sICAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgICAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorZG5sICAgICAgbGF0ZXIgdmVyc2lvbi4KK2RubAorZG5sICBvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorZG5sCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK2RubCAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK2RubCAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitkbmwgIGZvciBtb3JlIGRldGFpbHMuCitkbmwKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorZG5sICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitkbmwgIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworaW5jbHVkZShgY29uZmlnLm00JykKKworCitDCSAgICAgY3ljbGVzL2xpbWIKK0MgQU1EIEs4LEs5CSAyLjIKK0MgQU1EIEsxMAkgMi4yCitDIEludGVsIFA0CTEyLjc1CitDIEludGVsIGNvcmUyCSAzLjQ1CitDIEludGVsIGNvcmVpCSA/CitDIEludGVsIGF0b20JID8KK0MgVklBIG5hbm8JIDMuMjUKKworQyBTb21ldGltZXMgc3BlZWQgZGVnZW5lcmF0ZXMsIHN1cHBvc2VkbHkgcmVsYXRlZCB0byB0aGF0IHNvbWUgb3BlcmFuZAorQyBhbGlnbm1lbnRzIGNhdXNlIGNhY2hlIGNvbmZsaWN0cy4KKworQyBUaGUgc3BlZWQgaXMgbGltaXRlZCBieSBkZWNvZGluZy9pc3N1ZSBiYW5kd2lkdGguICBUaGVyZSBhcmUgMjYgaW5zdHJ1Y3Rpb25zCitDIGluIHRoZSBsb29wLCB3aGljaCBjb3JyZXNwb25kcyB0byAyNi8zLzQgPSAyLjE2NyBjL2wuCisKK0MgSU5QVVQgUEFSQU1FVEVSUworZGVmaW5lKGBycCcsYCVyZGknKQorZGVmaW5lKGB1cCcsYCVyc2knKQorZGVmaW5lKGB2cCcsYCVyZHgnKQorZGVmaW5lKGBuJywgYCVyY3gnKQorCitBQklfU1VQUE9SVChET1M2NCkKK0FCSV9TVVBQT1JUKFNURDY0KQorCitBU01fU1RBUlQoKQorCVRFWFQKKwlBTElHTigxNikKK1BST0xPR1VFKG1wbl9zdWJsc2gxX24pCisJRlVOQ19FTlRSWSg0KQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCisJbW92CSh2cCksICVyOAorCW1vdglSMzIobiksIFIzMiglcmF4KQorCWxlYQkocnAsbiw4KSwgcnAKKwlsZWEJKHVwLG4sOCksIHVwCisJbGVhCSh2cCxuLDgpLCB2cAorCW5lZwluCisJeG9yCVIzMiglcmJwKSwgUjMyKCVyYnApCisJYW5kCSQzLCBSMzIoJXJheCkKKwlqZQlMKGIwMCkKKwljbXAJJDIsIFIzMiglcmF4KQorCWpjCUwoYjAxKQorCWplCUwoYjEwKQorCitMKGIxMSk6CWFkZAklcjgsICVyOAorCW1vdgk4KHZwLG4sOCksICVyOQorCWFkYwklcjksICVyOQorCW1vdgkxNih2cCxuLDgpLCAlcjEwCisJYWRjCSVyMTAsICVyMTAKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIHNjeQorCW1vdgkodXAsbiw4KSwgJXJicAorCW1vdgk4KHVwLG4sOCksICVyYngKKwlzdWIJJXI4LCAlcmJwCisJc2JiCSVyOSwgJXJieAorCW1vdgklcmJwLCAocnAsbiw4KQorCW1vdgklcmJ4LCA4KHJwLG4sOCkKKwltb3YJMTYodXAsbiw4KSwgJXJicAorCXNiYgklcjEwLCAlcmJwCisJbW92CSVyYnAsIDE2KHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWFkZAkkMywgbgorCWptcAlMKGVudCkKKworTChiMTApOglhZGQJJXI4LCAlcjgKKwltb3YJOCh2cCxuLDgpLCAlcjkKKwlhZGMJJXI5LCAlcjkKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIHNjeQorCW1vdgkodXAsbiw4KSwgJXJicAorCW1vdgk4KHVwLG4sOCksICVyYngKKwlzdWIJJXI4LCAlcmJwCisJc2JiCSVyOSwgJXJieAorCW1vdgklcmJwLCAocnAsbiw4KQorCW1vdgklcmJ4LCA4KHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWFkZAkkMiwgbgorCWptcAlMKGVudCkKKworTChiMDEpOglhZGQJJXI4LCAlcjgKKwlzYmIJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyBzYXZlIHNjeQorCW1vdgkodXAsbiw4KSwgJXJicAorCXN1YgklcjgsICVyYnAKKwltb3YJJXJicCwgKHJwLG4sOCkKKwlzYmIJUjMyKCVyYnApLCBSMzIoJXJicCkJQyBzYXZlIGFjeQorCWluYwluCitMKGVudCk6CWpucwlMKGVuZCkKKworCUFMSUdOKDE2KQorTCh0b3ApOglhZGQJUjMyKCVyYXgpLCBSMzIoJXJheCkJQyByZXN0b3JlIHNjeQorCisJbW92CSh2cCxuLDgpLCAlcjgKK0woYjAwKToJYWRjCSVyOCwgJXI4CisJbW92CTgodnAsbiw4KSwgJXI5CisJYWRjCSVyOSwgJXI5CisJbW92CTE2KHZwLG4sOCksICVyMTAKKwlhZGMJJXIxMCwgJXIxMAorCW1vdgkyNCh2cCxuLDgpLCAlcjExCisJYWRjCSVyMTEsICVyMTEKKworCXNiYglSMzIoJXJheCksIFIzMiglcmF4KQlDIHNhdmUgc2N5CisJYWRkCVIzMiglcmJwKSwgUjMyKCVyYnApCUMgcmVzdG9yZSBhY3kKKworCW1vdgkodXAsbiw4KSwgJXJicAorCW1vdgk4KHVwLG4sOCksICVyYngKKwlzYmIJJXI4LCAlcmJwCisJc2JiCSVyOSwgJXJieAorCW1vdgklcmJwLCAocnAsbiw4KQorCW1vdgklcmJ4LCA4KHJwLG4sOCkKKwltb3YJMTYodXAsbiw4KSwgJXJicAorCW1vdgkyNCh1cCxuLDgpLCAlcmJ4CisJc2JiCSVyMTAsICVyYnAKKwlzYmIJJXIxMSwgJXJieAorCW1vdgklcmJwLCAxNihycCxuLDgpCisJbW92CSVyYngsIDI0KHJwLG4sOCkKKworCXNiYglSMzIoJXJicCksIFIzMiglcmJwKQlDIHNhdmUgYWN5CisJYWRkCSQ0LCBuCisJanMJTCh0b3ApCisKK0woZW5kKToJYWRkCVIzMiglcmJwKSwgUjMyKCVyYXgpCisJbmVnCVIzMiglcmF4KQorCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCUZVTkNfRVhJVCgpCisJcmV0CitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS9tcG4veDg2XzY0L3g4Nl82NC1kZWZzLm00IGIvbXBuL3g4Nl82NC94ODZfNjQtZGVmcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA4ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvbXBuL3g4Nl82NC94ODZfNjQtZGVmcy5tNApAQCAtMCwwICsxLDQ5MyBAQAorZGl2ZXJ0KC0xKQorCitkbmwgIG00IG1hY3JvcyBmb3IgYW1kNjQgYXNzZW1ibGVyLgorCitkbmwgIENvcHlyaWdodCAxOTk5LTIwMDUsIDIwMDgsIDIwMDksIDIwMTEtMjAxMywgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitkbmwgIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2RubCAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKK2RubAorZG5sICAgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK2RubCAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitkbmwgICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK2RubCAgICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitkbmwgICAgICBsYXRlciB2ZXJzaW9uLgorZG5sCitkbmwgIG9yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCitkbmwKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorZG5sICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorZG5sICBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2RubCAgZm9yIG1vcmUgZGV0YWlscy4KK2RubAorZG5sICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitkbmwgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK2RubCAgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2RubCAgVXNhZ2U6IENQVVZFQ19GVU5DU19MSVNUCitkbmwKK2RubCAgQSBsaXN0IG9mIHRoZSBmdW5jdGlvbnMgZnJvbSBnbXAtaW1wbC5oIHg4NiBzdHJ1Y3QgY3B1dmVjX3QsIGluIHRoZQorZG5sICBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGF0IHN0cnVjdHVyZS4KKworZGVmaW5lKENQVVZFQ19GVU5DU19MSVNULAorYGBhZGRfbicsCitgYWRkbHNoMV9uJywKK2BhZGRsc2gyX24nLAorYGFkZG11bF8xJywKK2BhZGRtdWxfMicsCitgYmRpdl9kYm0xYycsCitgY25kX2FkZF9uJywKK2BjbmRfc3ViX24nLAorYGNvbScsCitgY29weWQnLAorYGNvcHlpJywKK2BkaXZleGFjdF8xJywKK2BkaXZyZW1fMScsCitgZ2NkXzExJywKK2Bsc2hpZnQnLAorYGxzaGlmdGMnLAorYG1vZF8xJywKK2Btb2RfMV8xcCcsCitgbW9kXzFfMXBfY3BzJywKK2Btb2RfMXNfMnAnLAorYG1vZF8xc18ycF9jcHMnLAorYG1vZF8xc180cCcsCitgbW9kXzFzXzRwX2NwcycsCitgbW9kXzM0bHN1YjEnLAorYG1vZGV4YWN0XzFjX29kZCcsCitgbXVsXzEnLAorYG11bF9iYXNlY2FzZScsCitgbXVsbG9fYmFzZWNhc2UnLAorYHByZWludl9kaXZyZW1fMScsCitgcHJlaW52X21vZF8xJywKK2ByZWRjXzEnLAorYHJlZGNfMicsCitgcnNoaWZ0JywKK2BzcXJfYmFzZWNhc2UnLAorYHN1Yl9uJywKK2BzdWJsc2gxX24nLAorYHN1Ym11bF8xJycpCisKKworZG5sICBDYWxsZWQ6IFBST0xPR1VFX2NwdShHU1lNX1BSRUZJWGAnZm9vKQorZG5sCitkbmwgIEluIHRoZSBhbWQ2NCBjb2RlIHdlIHVzZSBleHBsaWNpdCBURVhUIGFuZCBBTElHTigpIGNhbGxzIGluIHRoZSBjb2RlLAorZG5sICBzaW5jZSBkaWZmZXJlbnQgYWxpZ25tZW50cyBhcmUgd2FudGVkIGluIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcy4gIFNvIGZvcgorZG5sICBpbnN0YW5jZSwKK2RubAorZG5sICAgICAgICAgICAgICAgICAgVEVYVAorZG5sICAgICAgICAgICAgICAgICAgQUxJR04oMTYpCitkbmwgICAgICAgICAgUFJPTE9HVUUobXBuX2FkZF9uKQorZG5sICAgICAgICAgICAgICAgICAgLi4uCitkbmwgICAgICAgICAgRVBJTE9HVUUoKQorCitkZWZpbmUoYFBST0xPR1VFX2NwdScsCittNF9hc3NlcnRfbnVtYXJncygxKQorYAlHTE9CTAkkMQorCVRZUEUoJDEsYGZ1bmN0aW9uJykKKwlDT0ZGX1RZUEUoJDEpCiskMToKKycpCisKKworZG5sICBVc2FnZTogQ09GRl9UWVBFKEdTWU1fUFJFRklYYCdmb28pCitkbmwKK2RubCAgRW1pdCBDT0ZGIHN0eWxlICIuZGVmIC4uLiAuZW5kZWYiIHR5cGUgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24sIHdoZW4KK2RubCAgc3VwcG9ydGVkLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBpbmNsdWRlIGFueSBHU1lNX1BSRUZJWC4KK2RubAorZG5sICBTZWUgYXV0b2NvbmYgbWFjcm8gR01QX0FTTV9DT0ZGX1RZUEUgZm9yIEhBVkVfQ09GRl9UWVBFLgorCitkZWZpbmUoQ09GRl9UWVBFLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK200X2Fzc2VydF9kZWZpbmVkKGBIQVZFX0NPRkZfVFlQRScpCitgaWZlbHNlKEhBVkVfQ09GRl9UWVBFLHllcywKKwlgLmRlZgkkMQorCS5zY2wJMgorCS50eXBlCTMyCisJLmVuZGVmJyknKQorCisKK2RubCAgVXNhZ2U6IEFTU0VSVChbY29uZF1bLGluc3RydWN0aW9uc10pCitkbmwKK2RubCAgSWYgV0FOVF9BU1NFUlQgaXMgMSwgb3V0cHV0IHRoZSBnaXZlbiBpbnN0cnVjdGlvbnMgYW5kIGV4cGVjdCB0aGUgZ2l2ZW4KK2RubCAgZmxhZ3MgY29uZGl0aW9uIHRvIHRoZW4gYmUgc2F0aXNmaWVkLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIEFTU0VSVChuZSwgYGNtcHEgJXJheCwgJXJieCcpCitkbmwKK2RubCAgVGhlIGluc3RydWN0aW9ucyBjYW4gYmUgb21pdHRlZCB0byBqdXN0IGFzc2VydCBhIGZsYWdzIGNvbmRpdGlvbiB3aXRoCitkbmwgIG5vIGV4dHJhIGNhbGN1bGF0aW9uLiAgRm9yIGV4YW1wbGUsCitkbmwKK2RubCAgICAgICAgIEFTU0VSVChuYykKK2RubAorZG5sICBXaGVuIGBpbnN0cnVjdGlvbnMnIGlzIG5vdCBlbXB0eSwgYSBwdXNoZnEvcG9wZnEgaXMgYWRkZWQgZm9yCitkbmwgIGNvbnZlbmllbmNlIHRvIHByZXNlcnZlIHRoZSBmbGFncywgYnV0IHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcyBtdXN0CitkbmwgIHByZXNlcnZlIGFueSByZWdpc3RlcnMgdGhhdCBtYXR0ZXIuCitkbmwKK2RubCAgVGhlIGNvbmRpdGlvbiBjYW4gYmUgb21pdHRlZCB0byBqdXN0IG91dHB1dCB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zIHdoZW4KK2RubCAgYXNzZXJ0aW9uIGNoZWNraW5nIGlzIHdhbnRlZC4gIEluIHRoaXMgY2FzZSB0aGUgcHVzaGYvcG9wZiBpcyBvbWl0dGVkLgorZG5sICBGb3IgZXhhbXBsZSwKK2RubAorZG5sICAgICAgICAgQVNTRVJUKCwgYG1vdnEgJXJheCwgVkFSX0tFRVBWQUwnKQorCitkZWZpbmUoQVNTRVJULAorbTRfYXNzZXJ0X251bWFyZ3NfcmFuZ2UoMSwyKQorbTRfYXNzZXJ0X2RlZmluZWQoYFdBTlRfQVNTRVJUJykKK2BpZmVsc2UoV0FOVF9BU1NFUlQsMSwKK2BpZmVsc2UoYCQxJywsCitgCSQyJywKK2BpZmVsc2UoYCQyJywsLAorYAlwdXNoZnEnKQorCSQyCisJYGokMScJTChBU1NFUlRfb2tgJ0FTU0VSVF9jb3VudGVyKQorCXVkMglDIGFzc2VydGlvbiBmYWlsZWQKK0woQVNTRVJUX29rYCdBU1NFUlRfY291bnRlcik6CitpZmVsc2UoYCQyJywsLGAJcG9wZnEnKQorZGVmaW5lKGBBU1NFUlRfY291bnRlcicsaW5jcihBU1NFUlRfY291bnRlcikpJyknKScpCisKK2RlZmluZShBU1NFUlRfY291bnRlciwxKQorCitkbmwgTEVBIC0gbG9hZCBlZmZlY3RpdmUgYWRkcmVzcworZG5sCitkbmwgRklYTUU6IFdlIHNob3VsZCBuZXZlciBjcmVhdGUgYSBHT1QgZW50cnkgYW5kIHRoZXJlZm9yZSB1c2UgdGhlIHNpbXBsZXIgMm5kCitkbmwgdmFyaWFudCBhbHdheXMuIFdlIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGhhcHBlbnMgZm9yIG5vdC15ZXQtaGlkZGVuCitkbmwgc3ltYm9scyBmaXJzdC4KK2RubAorZGVmaW5lKGBMRUEnLGBkbmwKK2lmZGVmKGBQSUMnLAorCWBtb3YJJDFAR09UUENSRUwoJXJpcCksICQyJworLAorCWBsZWEJJDEoJXJpcCksICQyJykKKycpCisKKworZGVmaW5lKGBERUZfT0JKRUNUJywKK200X2Fzc2VydF9udW1hcmdzX3JhbmdlKDIsMykKK2AJaWZlbHNlKCQjLDMsYCQzJyxgUk9EQVRBJykKKwlBTElHTigkMikKKyQxOgorJykKKworZGVmaW5lKGBFTkRfT0JKRUNUJywKK200X2Fzc2VydF9udW1hcmdzKDEpCitgCVNJWkUoYCQxJywuLWAkMScpJykKKworCitkZWZpbmUoYFIzMicsCisJYGlmZWxzZSgkMSxgJXJheCcsYCVlYXgnLAorCQkkMSxgJXJieCcsYCVlYngnLAorCQkkMSxgJXJjeCcsYCVlY3gnLAorCQkkMSxgJXJkeCcsYCVlZHgnLAorCQkkMSxgJXJzaScsYCVlc2knLAorCQkkMSxgJXJkaScsYCVlZGknLAorCQkkMSxgJXJicCcsYCVlYnAnLAorCQkkMSxgJXI4JyxgJXI4ZCcsCisJCSQxLGAlcjknLGAlcjlkJywKKwkJJDEsYCVyMTAnLGAlcjEwZCcsCisJCSQxLGAlcjExJyxgJXIxMWQnLAorCQkkMSxgJXIxMicsYCVyMTJkJywKKwkJJDEsYCVyMTMnLGAlcjEzZCcsCisJCSQxLGAlcjE0JyxgJXIxNGQnLAorCQkkMSxgJXIxNScsYCVyMTVkJyknKQorZGVmaW5lKGBSOCcsCisJYGlmZWxzZSgkMSxgJXJheCcsYCVhbCcsCisJCSQxLGAlcmJ4JyxgJWJsJywKKwkJJDEsYCVyY3gnLGAlY2wnLAorCQkkMSxgJXJkeCcsYCVkbCcsCisJCSQxLGAlcnNpJyxgJXNpbCcsCisJCSQxLGAlcmRpJyxgJWRpbCcsCisJCSQxLGAlcmJwJyxgJWJwbCcsCisJCSQxLGAlcjgnLGAlcjhiJywKKwkJJDEsYCVyOScsYCVyOWInLAorCQkkMSxgJXIxMCcsYCVyMTBiJywKKwkJJDEsYCVyMTEnLGAlcjExYicsCisJCSQxLGAlcjEyJyxgJXIxMmInLAorCQkkMSxgJXIxMycsYCVyMTNiJywKKwkJJDEsYCVyMTQnLGAlcjE0YicsCisJCSQxLGAlcjE1JyxgJXIxNWInKScpCisKKworZG5sICBVc2FnZTogQ0FMTChmdW5jbmFtZSkKK2RubAorCitkZWZpbmUoYENBTEwnLGBkbmwKK2lmZGVmKGBQSUMnLAorCWBjYWxsCUdTWU1fUFJFRklYYCckMUBQTFQnCissCisJYGNhbGwJR1NZTV9QUkVGSVhgJyQxJworKScpCisKK2RlZmluZShgVENBTEwnLGBkbmwKK2lmZGVmKGBQSUMnLAorCWBqbXAJR1NZTV9QUkVGSVhgJyQxQFBMVCcKKywKKwlgam1wCUdTWU1fUFJFRklYYCckMScKKyknKQorCisKK2RlZmluZShgSlVNUFRBQlNFQ1QnLCBgLnNlY3Rpb24JLmRhdGEucmVsLnJvLmxvY2FsLCJhIixAcHJvZ2JpdHMnKQorCisKK2RubCAgVXNhZ2U6IEpNUEVOVCh0YXJnbGFiZWwsdGFibGFiZWwpCisKK2RlZmluZShgSk1QRU5UJyxgZG5sCitpZmRlZihgUElDJywKKwlgLmxvbmcJJDEtJDInZG5sCissCisJYC5xdWFkCSQxJ2RubAorKScpCisKKworZG5sICBUaGVzZSBtYWNyb3MgYXJlIGRlZmluZWQganVzdCBmb3IgRE9TNjQsIHdoZXJlIHRoZXkgcHJvdmlkZSBjYWxsaW5nCitkbmwgIHNlcXVlbmNlIGdsdWUgY29kZS4KKworZGVmaW5lKGBGVU5DX0VOVFJZJyxgJykKK2RlZmluZShgRlVOQ19FWElUJyxgJykKKworCitkbmwgIFRhcmdldCBBQkkgbWFjcm9zLgorCitkZWZpbmUoYElGRE9TJywgICBgJykKK2RlZmluZShgSUZTVEQnLCAgIGAkMScpCitkZWZpbmUoYElGRUxGJywgICBgJDEnKQorCisKK2RubCAgVXNhZ2U6IFBST1RFQ1Qoc3ltYm9sKQorZG5sCitkbmwgIFVzZWQgZm9yIHByaXZhdGUgR01QIHN5bWJvbHMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4KK2RubCAgVGhpcyBjYW4gc2F2ZSByZWxvYyBlbnRyaWVzIGFuZCBpbXByb3ZlIHNobGliIHNoYXJpbmcgYXMgd2VsbCBhcworZG5sICBhcHBsaWNhdGlvbiBzdGFydHVwIHRpbWVzCisKK2RlZmluZShgUFJPVEVDVCcsICBgLmhpZGRlbiAkMScpCisKKworZG5sICBVc2FnZTogeDg2X2xvb2t1cCh0YXJnZXQsIGtleSx2YWx1ZSwga2V5LHZhbHVlLCAuLi4pCitkbmwKK2RubCAgTG9vayBmb3IgYHRhcmdldCcgYW1vbmcgdGhlIGBrZXknIHBhcmFtZXRlcnMuCitkbmwKK2RubCAgeDg2X2xvb2t1cCBleHBhbmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGB2YWx1ZScsIG9yIGdlbmVyYXRlcyBhbiBlcnJvcgorZG5sICBpZiBgdGFyZ2V0JyBpc24ndCBmb3VuZC4KKworZGVmaW5lKHg4Nl9sb29rdXAsCittNF9hc3NlcnRfbnVtYXJnc19yYW5nZSgxLDk5OSkKK2BpZmVsc2UoZXZhbCgkIzwzKSwxLAorYG00X2Vycm9yKGB1bnJlY29nbmlzZWQgcGFydCBvZiB4ODYgaW5zdHJ1Y3Rpb246ICQxCisnKScsCitgaWZlbHNlKGAkMScsYCQyJywgYCQzJywKK2B4ODZfbG9va3VwKGAkMScsc2hpZnQoc2hpZnQoc2hpZnQoJEApKSkpJyknKScpCisKKworZG5sICBVc2FnZTogeDg2X29wY29kZV9yZWd4bW0ocmVnKQorZG5sCitkbmwgIFZhbGlkYXRlIHRoZSBnaXZlbiB4bW0gcmVnaXN0ZXIsIGFuZCByZXR1cm4gaXRzIG51bWJlciwgMCB0byA3LgorCitkZWZpbmUoeDg2X29wY29kZV9yZWd4bW0sCittNF9hc3NlcnRfbnVtYXJncygxKQorYHg4Nl9sb29rdXAoYCQxJyx4ODZfb3Bjb2RlX3JlZ3htbV9saXN0KScpCisKK2RlZmluZSh4ODZfb3Bjb2RlX3JlZ3htbV9saXN0LAorYGAleG1tMCcsMCwKK2AleG1tMScsMSwKK2AleG1tMicsMiwKK2AleG1tMycsMywKK2AleG1tNCcsNCwKK2AleG1tNScsNSwKK2AleG1tNicsNiwKK2AleG1tNycsNywKK2AleG1tOCcsOCwKK2AleG1tOScsOSwKK2AleG1tMTAnLDEwLAorYCV4bW0xMScsMTEsCitgJXhtbTEyJywxMiwKK2AleG1tMTMnLDEzLAorYCV4bW0xNCcsMTQsCitgJXhtbTE1JywxNScpCisKK2RubCAgVXNhZ2U6IHBhbGlnbnIoJGltbSwlc3JjcmVnLCVkc3RyZWcpCitkbmwKK2RubCAgRW1pdCBhIHBhbGlnbnIgaW5zdHJ1Y3Rpb24sIHVzaW5nIGEgLmJ5dGUgc2VxdWVuY2UsIHNpbmNlIG9ic29sZXRlIGJ1dAorZG5sICBzdGlsbCBkaXN0cmlidXRlZCB2ZXJzaW9ucyBvZiBnYXMgZG9uJ3Qga25vdyBTU1NFMyBpbnN0cnVjdGlvbnMuCisKK2RlZmluZShgcGFsaWducicsCittNF9hc3NlcnRfbnVtYXJncygzKQorYC5ieXRlCTB4NjYsZG5sCitpZmVsc2UoZXZhbCh4ODZfb3Bjb2RlX3JlZ3htbSgkMykgPj0gOCB8fCB4ODZfb3Bjb2RlX3JlZ3htbSgkMikgPj0gOCksMSwKKyAgICAgICBgZXZhbCgweDQwK3g4Nl9vcGNvZGVfcmVneG1tKCQzKS84KjQreDg2X29wY29kZV9yZWd4bW0oJDIpLzgpLCcpZG5sCisweDBmLDB4M2EsMHgwZixkbmwKK2V2YWwoMHhjMCt4ODZfb3Bjb2RlX3JlZ3htbSgkMyklOCo4K3g4Nl9vcGNvZGVfcmVneG1tKCQyKSU4KSxkbmwKK3N1YnN0cigkMSwxKScpCisKKworZG5sICBVc2FnZQorZG5sCitkbmwgICAgcmVnbnVtKG9wKSAgIHJhdyBvcGVyYW5kIGluZGV4IChzbyBzbGlnaHRseSBtaXNuYW1lZCkKK2RubCAgICByZWdudW1oKG9wKSAgaGlnaCBiaXQgb2YgcmVnaXN0ZXIgb3BlcmFuZCBuaW1iZXIKK2RubCAgICBpeChvcCkgICAgICAgMCBmb3IgcmVnIG9wZXJhbmQsIDEgZm9yIHBsYWluIHBvaW50ZXIgb3BlcmFuZC4KK2RubAorCitkZWZpbmUoYHJlZ251bScsYHg4Nl9sb29rdXAoYCQxJyxvcGxpc3QpJykKK2RlZmluZShgcmVnbnVtaCcsYGV2YWwocmVnbnVtKCQxKS84ICYgMSknKQorZGVmaW5lKGBpeCcsYGV2YWwocmVnbnVtKCQxKS8xNiknKQorZGVmaW5lKGBvcGxpc3QnLAorYGAlcmF4JywgICAwLCBgJXJjeCcsICAgMSwgYCVyZHgnLCAgIDIsICBgJXJieCcsICAgMywKKyBgJXJzcCcsICAgNCwgYCVyYnAnLCAgIDUsIGAlcnNpJywgICA2LCAgYCVyZGknLCAgIDcsCisgYCVyOCcsICAgIDgsIGAlcjknLCAgICA5LCBgJXIxMCcsICAxMCwgIGAlcjExJywgIDExLAorIGAlcjEyJywgIDEyLCBgJXIxMycsICAxMywgYCVyMTQnLCAgMTQsICBgJXIxNScsICAxNSwKKyBgKCVyYXgpJywxNiwgYCglcmN4KScsMTcsIGAoJXJkeCknLDE4LCAgYCglcmJ4KScsMTksCisgYCglcnNwKScsMjAsIGAoJXJicCknLDIxLCBgKCVyc2kpJywyMiwgIGAoJXJkaSknLDIzLAorIGAoJXI4KScsIDI0LCBgKCVyOSknLCAyNSwgYCglcjEwKScsMjYsICBgKCVyMTEpJywyNywKKyBgKCVyMTIpJywyOCwgYCglcjEzKScsMjksIGAoJXIxNCknLDMwLCAgYCglcjE1KScsMzEnKQorCitkbmwgIFVzYWdlIChieSBtdWx4LCBzaGx4LCBzaHJ4KQorZG5sCitkbmwgICAgIHJlZzEscmVnMixyZWczLG9wYzEsb3BjMgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAgKHJlZzEpLHJlZzIscmVnMyxvcGMxLG9wYzIKK2RubAorZG5sICB3aGVyZSByZWcxIGlzIGFueSByZWdpc3RlciBidXQgcnNwLHJicCxyMTIscjEzLCBvcgorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAgb2ZmLChyZWcxKSxyZWcyLHJlZzMsb3BjMSxvcGMyCitkbmwKK2RubCAgd2hlcmUgcmVnMSBpcyBhbnkgcmVnaXN0ZXIgYnV0IHJzcCxyMTIuCitkbmwKK2RubCAgVGhlIGV4Y2VwdGlvbnMgYXJlIGR1ZSB0byBzcGVjaWFsIGNvZGluZyBuZWVkZWQgZm9yIHNvbWUgcmVnaXN0ZXJzOyByc3AKK2RubCAgYW5kIHIxMiBuZWVkIGFuIGV4dHJhIGJ5dGUgMHgyNCBhdCB0aGUgZW5kIHdoaWxlIHJicCBhbmQgcjEzIGxhY2sgdGhlCitkbmwgIG9mZnNldC1sZXNzIGZvcm0uCitkbmwKK2RubCAgT3RoZXIgYWRkcmVzc2luZyBmb3JtcyBhcmUgbm90IGhhbmRsZWQuICBJbnZhbGlkIGZvcm1zIGFyZSBub3QgcHJvcGVybHkKK2RubCAgZGV0ZWN0ZWQuICBPZmZzZXRzIHRoYXQgZG9uJ3QgZml0IG9uZSBieXRlIGFyZSBub3QgaGFuZGxlZCBjb3JyZWN0bHkuCisKK2RlZmluZShgYzRfaGVscGVyJyxgZG5sCisuYnl0ZQkweGM0YCdkbmwKK2lmZWxzZShgJCMnLDUsYGRubAorLGV2YWwoMHhlMl4zMipyZWdudW1oKCQxKV4xMjgqcmVnbnVtaCgkMykpYCdkbmwKKyxldmFsKDB4JDQtOCpyZWdudW0oJDIpKWAnZG5sCissMHgkNWAnZG5sCissZXZhbCgweGMwKyg3ICYgcmVnbnVtKCQxKSkrOCooNyAmIHJlZ251bSgkMykpLTB4YzAqaXgoJDEpKWAnZG5sCisnLGAkIycsNixgZG5sCissZXZhbCgweGUyXjMyKnJlZ251bWgoJDIpXjEyOCpyZWdudW1oKCQ0KSlgJ2RubAorLGV2YWwoMHgkNS04KnJlZ251bSgkMykpYCdkbmwKKywweCQ2YCdkbmwKKyxldmFsKDB4NDArKDcgJiByZWdudW0oJDIpKSs4Kig3ICYgcmVnbnVtKCQ0KSkpYCdkbmwKKyxldmFsKCgkMSArIDI1NikgJSAyNTYpYCdkbmwKKycpJykKKworCitkbmwgIFVzYWdlCitkbmwKK2RubCAgICAgbXVseChyZWcxLHJlZzIscmVnMykKK2RubAorZG5sICBvcgorZG5sCitkbmwgICAgIG11bHgoKHJlZzEpLHJlZzIscmVnMykKK2RubAorZG5sICB3aGVyZSByZWcxIGlzIGFueSByZWdpc3RlciBidXQgcnNwLHJicCxyMTIscjEzLCBvcgorZG5sCitkbmwgICAgIG11bHgob2ZmLChyZWcxKSxyZWcyLHJlZzMpCitkbmwKK2RubCAgd2hlcmUgcmVnMSBpcyBhbnkgcmVnaXN0ZXIgYnV0IHJzcCxyMTIuCisKK2RlZmluZShgbXVseCcsYGRubAoraWZlbHNlKGAkIycsMyxgZG5sCitjNF9oZWxwZXIoJDEsJDIsJDMsZmIsZjYpJyxgZG5sICAgICAgICAgZm9ybWF0IDEsMgorYzRfaGVscGVyKCQxLCQyLCQzLCQ0LGZiLGY2KSdkbmwJZm9ybWF0IDMKKyknKQorCisKK2RubCAgVXNhZ2UKK2RubAorZG5sICAgICBzaGx4KHJlZzEscmVnMixyZWczKQorZG5sICAgICBzaHJ4KHJlZzEscmVnMixyZWczKQorZG5sCitkbmwgIG9yCitkbmwKK2RubCAgICAgc2hseChyZWcxLChyZWcyKSxyZWczKQorZG5sICAgICBzaHJ4KHJlZzEsKHJlZzIpLHJlZzMpCitkbmwKK2RubCAgd2hlcmUgcmVnMiBpcyBhbnkgcmVnaXN0ZXIgYnV0IHJzcCxyYnAscjEyLHIxMywgb3IKK2RubAorZG5sICAgICBzaGx4KHJlZzEsb2ZmLChyZWcyKSxyZWczKQorZG5sICAgICBzaHJ4KHJlZzEsb2ZmLChyZWcyKSxyZWczKQorZG5sCitkbmwgIHdoZXJlIHJlZzIgaXMgYW55IHJlZ2lzdGVyIGJ1dCByc3AscjEyLgorCitkZWZpbmUoYHNobHgnLGBkbmwKK2lmZWxzZShgJCMnLDMsYGRubAorYzRfaGVscGVyKCQyLCQxLCQzLGY5LGY3KScsYGRubCAgICAgICAgIGZvcm1hdCAxLDIKK2M0X2hlbHBlcigkMSwkMywkMiwkNCxmOSxmNyknZG5sICAgICAgICBmb3JtYXQgMworKScpCisKK2RlZmluZShgc2hyeCcsYGRubAoraWZlbHNlKGAkIycsMyxgZG5sCitjNF9oZWxwZXIoJDIsJDEsJDMsZmIsZjcpJyxgZG5sICAgICAgICAgZm9ybWF0IDEsMgorYzRfaGVscGVyKCQxLCQzLCQyLCQ0LGZiLGY3KSdkbmwgICAgICAgIGZvcm1hdCAzCispJykKKworZGVmaW5lKGBzYXJ4JyxgZG5sCitpZmVsc2UoYCQjJywzLGBkbmwKK2M0X2hlbHBlcigkMiwkMSwkMyxmYSxmNyknLGBkbmwgICAgICAgICBmb3JtYXQgMSwyCitjNF9oZWxwZXIoJDEsJDMsJDIsJDQsZmEsZjcpJ2RubCAgICAgICAgZm9ybWF0IDMKKyknKQorCisKK2RubCAgVXNhZ2UKK2RubAorZG5sICAgICBhZGN4KHJlZzEscmVnMikKK2RubCAgICAgYWRveChyZWcxLHJlZzIpCitkbmwKK2RubCAgb3IKK2RubAorZG5sICAgICBhZGN4KChyZWcxKSxyZWcyKQorZG5sICAgICBhZG94KChyZWcxKSxyZWcyKQorZG5sCitkbmwgIHdoZXJlIHJlZzEgaXMgYW55IHJlZ2lzdGVyIGJ1dCByc3AscmJwLHIxMixyMTMsIG9yCitkbmwKK2RubCAgICAgYWRjeChvZmYsKHJlZzEpLHJlZzIpCitkbmwgICAgIGFkb3gob2ZmLChyZWcxKSxyZWcyKQorZG5sCitkbmwgIHdoZXJlIHJlZzEgaXMgYW55IHJlZ2lzdGVyIGJ1dCByc3AscjEyLgorZG5sCitkbmwgIFRoZSBleGNlcHRpb25zIGFyZSBkdWUgdG8gc3BlY2lhbCBjb2RpbmcgbmVlZGVkIGZvciBzb21lIHJlZ2lzdGVyczsgcnNwCitkbmwgIGFuZCByMTIgbmVlZCBhbiBleHRyYSBieXRlIDB4MjQgYXQgdGhlIGVuZCB3aGlsZSByYnAgYW5kIHIxMyBsYWNrIHRoZQorZG5sICBvZmZzZXQtbGVzcyBmb3JtLgorZG5sCitkbmwgIE90aGVyIGFkZHJlc3NpbmcgZm9ybXMgYXJlIG5vdCBoYW5kbGVkLiAgSW52YWxpZCBmb3JtcyBhcmUgbm90IHByb3Blcmx5CitkbmwgIGRldGVjdGVkLiAgT2Zmc2V0cyB0aGF0IGRvbid0IGZpdCBvbmUgYnl0ZSBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5LgorCitkZWZpbmUoYGFkeF9oZWxwZXInLGBkbmwKKyxldmFsKDB4NDgrcmVnbnVtaCgkMSkrNCpyZWdudW1oKCQyKSlgJ2RubAorLDB4MGZgJ2RubAorLDB4MzhgJ2RubAorLDB4ZjZgJ2RubAorJykKKworZGVmaW5lKGBhZHgnLGBkbmwKK2lmZWxzZShgJCMnLDIsYGRubAorYWR4X2hlbHBlcigkMSwkMilkbmwKKyxldmFsKDB4YzArKDcgJiByZWdudW0oJDEpKSs4Kig3ICYgcmVnbnVtKCQyKSktMHhjMCppeCgkMSkpYCdkbmwKKycsYCQjJywzLGBkbmwKK2FkeF9oZWxwZXIoJDIsJDMpZG5sCissZXZhbCgweDQwKyg3ICYgcmVnbnVtKCQyKSkrOCooNyAmIHJlZ251bSgkMykpKWAnZG5sCissZXZhbCgoJDEgKyAyNTYpICUgMjU2KWAnZG5sCisnKScpCisKK2RlZmluZShgYWRjeCcsYGRubAorLmJ5dGUJMHg2NmAnZG5sCithZHgoJEApJykKKworZGVmaW5lKGBhZG94JyxgZG5sCisuYnl0ZQkweGYzYCdkbmwKK2FkeCgkQCknKQorCitkaXZlcnRgJ2RubApkaWZmIC0tZ2l0IGEvbXBxL2Ficy5jIGIvbXBxL2Ficy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGJmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvYWJzLmMKQEAgLTAsMCArMSw1NSBAQAorLyogbXBxX2FicyAtLSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIHJhdGlvbmFsLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHFfYWJzIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKwordm9pZAorbXBxX2FicyAobXBxX3B0ciBkc3QsIG1wcV9zcmNwdHIgc3JjKQoreworICBtcF9zaXplX3QgIG51bV9hYnNfc2l6ZSA9IEFCU0laKE5VTShzcmMpKTsKKworICBpZiAoZHN0ICE9IHNyYykKKyAgICB7CisgICAgICBtcF9zaXplX3QgIGRlbl9zaXplID0gU0laKERFTihzcmMpKTsKKyAgICAgIG1wX3B0ciBkcDsKKworICAgICAgZHAgPSBNUFpfTkVXQUxMT0MgKE5VTShkc3QpLCBudW1fYWJzX3NpemUpOworICAgICAgTVBOX0NPUFkgKGRwLCBQVFIoTlVNKHNyYykpLCBudW1fYWJzX3NpemUpOworCisgICAgICBkcCA9IE1QWl9ORVdBTExPQyAoREVOKGRzdCksIGRlbl9zaXplKTsKKyAgICAgIFNJWihERU4oZHN0KSkgPSBkZW5fc2l6ZTsKKyAgICAgIE1QTl9DT1BZIChkcCwgUFRSKERFTihzcmMpKSwgZGVuX3NpemUpOworICAgIH0KKworICBTSVooTlVNKGRzdCkpID0gbnVtX2Fic19zaXplOworfQpkaWZmIC0tZ2l0IGEvbXBxL2FvcnMuYyBiL21wcS9hb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2YWY5NAotLS0gL2Rldi9udWxsCisrKyBiL21wcS9hb3JzLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIG1wcV9hZGQsIG1wcV9zdWIgLS0gYWRkIG9yIHN1YnRyYWN0IHJhdGlvbmFsIG51bWJlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTk0LTE5OTcsIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitzdGF0aWMgdm9pZCBfX2dtcHFfYW9ycyAoUkVHUEFSTV8zXzEgKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIsIHZvaWQgKCopIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkpIFJFR1BBUk1fQVRUUiAoMSk7CisjZGVmaW5lIG1wcV9hb3JzKHcseCx5LGZ1bikgIF9fZ21wcV9hb3JzIChSRUdQQVJNXzNfMSAodywgeCwgeSwgZnVuKSkKKworUkVHUEFSTV9BVFRSICgxKSBzdGF0aWMgdm9pZAorbXBxX2FvcnMgKG1wcV9wdHIgcm9wLCBtcHFfc3JjcHRyIG9wMSwgbXBxX3NyY3B0ciBvcDIsCisgICAgICAgICAgdm9pZCAoKmZ1bikgKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKQoreworICBtcHpfdCBnY2Q7CisgIG1wel90IHRtcDEsIHRtcDI7CisgIG1wX3NpemVfdCBvcDFfbnVtX3NpemUgPSBBQlNJWihOVU0ob3AxKSk7CisgIG1wX3NpemVfdCBvcDFfZGVuX3NpemUgPSAgIFNJWihERU4ob3AxKSk7CisgIG1wX3NpemVfdCBvcDJfbnVtX3NpemUgPSBBQlNJWihOVU0ob3AyKSk7CisgIG1wX3NpemVfdCBvcDJfZGVuX3NpemUgPSAgIFNJWihERU4ob3AyKSk7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworICBNUFpfVE1QX0lOSVQgKGdjZCwgTUlOIChvcDFfZGVuX3NpemUsIG9wMl9kZW5fc2l6ZSkpOworICBNUFpfVE1QX0lOSVQgKHRtcDEsIG9wMV9udW1fc2l6ZSArIG9wMl9kZW5fc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAodG1wMiwgb3AyX251bV9zaXplICsgb3AxX2Rlbl9zaXplKTsKKworICAvKiBST1AgbWlnaHQgYmUgaWRlbnRpY2FsIHRvIGVpdGhlciBvcGVyYW5kLCBzbyBkb24ndCBzdG9yZSB0aGUKKyAgICAgcmVzdWx0IHRoZXJlIHVudGlsIHdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBpbnB1dCBvcGVyYW5kcy4gIFdlCisgICAgIGRhcmUgdG8gb3ZlcndyaXRlIHRoZSBudW1lcmF0b3Igb2YgUk9QIHdoZW4gd2UgYXJlIGZpbmlzaGVkCisgICAgIHdpdGggdGhlIG51bWVyYXRvcnMgb2YgT1AxIGFuZCBPUDIuICAqLworCisgIG1wel9nY2QgKGdjZCwgREVOKG9wMSksIERFTihvcDIpKTsKKyAgaWYgKCEgTVBaX0VRVUFMXzFfUCAoZ2NkKSkKKyAgICB7CisgICAgICBtcHpfdCB0OworCisgICAgICBNUFpfVE1QX0lOSVQgKHQsIE1BWCAob3AxX251bV9zaXplICsgb3AyX2Rlbl9zaXplLAorCSAgICAgb3AyX251bV9zaXplICsgb3AxX2Rlbl9zaXplKSArIDIgLSBTSVooZ2NkKSk7CisKKyAgICAgIG1wel9kaXZleGFjdF9nY2QgKHQsIERFTihvcDIpLCBnY2QpOworICAgICAgbXB6X2RpdmV4YWN0X2djZCAodG1wMiwgREVOKG9wMSksIGdjZCk7CisKKyAgICAgIG1wel9tdWwgKHRtcDEsIE5VTShvcDEpLCB0KTsKKyAgICAgIG1wel9tdWwgKHQsIE5VTShvcDIpLCB0bXAyKTsKKworICAgICAgKCpmdW4pICh0LCB0bXAxLCB0KTsKKworICAgICAgbXB6X2djZCAoZ2NkLCB0LCBnY2QpOworICAgICAgaWYgKE1QWl9FUVVBTF8xX1AgKGdjZCkpCisgICAgICAgIHsKKyAgICAgICAgICBtcHpfc2V0IChOVU0ocm9wKSwgdCk7CisgICAgICAgICAgbXB6X211bCAoREVOKHJvcCksIERFTihvcDIpLCB0bXAyKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbXB6X2RpdmV4YWN0X2djZCAoTlVNKHJvcCksIHQsIGdjZCk7CisgICAgICAgICAgbXB6X2RpdmV4YWN0X2djZCAodG1wMSwgREVOKG9wMiksIGdjZCk7CisgICAgICAgICAgbXB6X211bCAoREVOKHJvcCksIHRtcDEsIHRtcDIpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIGNvbW1vbiBkaXZpc29yIGlzIDEuICBUaGlzIGlzIHRoZSBjYXNlIChmb3IgcmFuZG9tIGlucHV0KSB3aXRoCisJIHByb2JhYmlsaXR5IDYvKHBpKioyKSwgd2hpY2ggaXMgYWJvdXQgNjAuOCUuICAqLworICAgICAgbXB6X211bCAodG1wMSwgTlVNKG9wMSksIERFTihvcDIpKTsKKyAgICAgIG1wel9tdWwgKHRtcDIsIE5VTShvcDIpLCBERU4ob3AxKSk7CisgICAgICAoKmZ1bikgKE5VTShyb3ApLCB0bXAxLCB0bXAyKTsKKyAgICAgIG1wel9tdWwgKERFTihyb3ApLCBERU4ob3AxKSwgREVOKG9wMikpOworICAgIH0KKyAgVE1QX0ZSRUU7Cit9CisKKwordm9pZAorbXBxX2FkZCAobXBxX3B0ciByb3AsIG1wcV9zcmNwdHIgb3AxLCBtcHFfc3JjcHRyIG9wMikKK3sKKyAgbXBxX2FvcnMgKHJvcCwgb3AxLCBvcDIsIG1wel9hZGQpOworfQorCit2b2lkCittcHFfc3ViIChtcHFfcHRyIHJvcCwgbXBxX3NyY3B0ciBvcDEsIG1wcV9zcmNwdHIgb3AyKQoreworICBtcHFfYW9ycyAocm9wLCBvcDEsIG9wMiwgbXB6X3N1Yik7Cit9CmRpZmYgLS1naXQgYS9tcHEvY2Fub25pY2FsaXplLmMgYi9tcHEvY2Fub25pY2FsaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjMjMzMQotLS0gL2Rldi9udWxsCisrKyBiL21wcS9jYW5vbmljYWxpemUuYwpAQCAtMCwwICsxLDYxIEBACisvKiBtcHFfY2Fub25pY2FsaXplKG9wKSAtLSBSZW1vdmUgY29tbW9uIGZhY3RvcnMgb2YgdGhlIGRlbm9taW5hdG9yIGFuZAorICAgbnVtZXJhdG9yIGluIE9QLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5NC0xOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX2Nhbm9uaWNhbGl6ZSAobXBxX3B0ciBvcCkKK3sKKyAgbXB6X3QgZ2NkOworICBUTVBfREVDTDsKKworICBpZiAoU0laKERFTihvcCkpIDwgMCkKKyAgICB7CisgICAgICBTSVooTlVNKG9wKSkgPSAtU0laKE5VTShvcCkpOworICAgICAgU0laKERFTihvcCkpID0gLVNJWihERU4ob3ApKTsKKyAgICB9CisgIGVsc2UgaWYgKFVOTElLRUxZIChTSVooREVOKG9wKSkgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgVE1QX01BUks7CisKKyAgLyogPz8/IER1bm5vIGlmIHRoZSAxKyBpcyBuZWVkZWQuICAqLworICBNUFpfVE1QX0lOSVQgKGdjZCwgMSArIE1BWCAoQUJTSVooTlVNKG9wKSksCisJCQkgICAgICBTSVooREVOKG9wKSkpKTsKKworICBtcHpfZ2NkIChnY2QsIE5VTShvcCksIERFTihvcCkpOworICBpZiAoISBNUFpfRVFVQUxfMV9QIChnY2QpKQorICAgIHsKKyAgICAgIG1wel9kaXZleGFjdF9nY2QgKE5VTShvcCksIE5VTShvcCksIGdjZCk7CisgICAgICBtcHpfZGl2ZXhhY3RfZ2NkIChERU4ob3ApLCBERU4ob3ApLCBnY2QpOworICAgIH0KKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHEvY2xlYXIuYyBiL21wcS9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmViNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvY2xlYXIuYwpAQCAtMCwwICsxLDQxIEBACisvKiBtcHFfY2xlYXIgLS0gZnJlZSB0aGUgc3BhY2Ugb2NjdXBpZWQgYnkgYW4gbXBxX3QuCisKK0NvcHlyaWdodCAxOTkxLCAxOTk0LCAxOTk1LCAyMDAwLCAyMDAxLCAyMDE1LCAyMDE4IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wcV9jbGVhciAobXBxX3B0ciB4KQoreworICBpZiAoQUxMT0MgKE5VTSh4KSkpCisgICAgX19HTVBfRlJFRV9GVU5DX0xJTUJTIChQVFIoTlVNKHgpKSwgQUxMT0MoTlVNKHgpKSk7CisgIGlmIChBTExPQyAoREVOKHgpKSkKKyAgICBfX0dNUF9GUkVFX0ZVTkNfTElNQlMgKFBUUihERU4oeCkpLCBBTExPQyhERU4oeCkpKTsKK30KZGlmZiAtLWdpdCBhL21wcS9jbGVhcnMuYyBiL21wcS9jbGVhcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGM2YWQzCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL2NsZWFycy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG1wcV9jbGVhcnMoKSAtLSBDbGVhciBtdWx0aXBsZSBtcHFfdCB2YXJpYWJsZXMuCisKK0NvcHlyaWdodCAyMDA5LCAyMDE0LCAyMDE1LCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX2NsZWFycyAobXBxX3B0ciB4LCAuLi4pCit7CisgIHZhX2xpc3QgIGFwOworCisgIHZhX3N0YXJ0IChhcCwgeCk7CisKKyAgZG8KKyAgICB7CisgICAgICBpZiAoQUxMT0MgKE5VTSh4KSkpCisJX19HTVBfRlJFRV9GVU5DX0xJTUJTIChQVFIoTlVNKHgpKSwgQUxMT0MoTlVNKHgpKSk7CisgICAgICBpZiAoQUxMT0MgKERFTih4KSkpCisJX19HTVBfRlJFRV9GVU5DX0xJTUJTIChQVFIoREVOKHgpKSwgQUxMT0MoREVOKHgpKSk7CisgICAgICB4ID0gdmFfYXJnIChhcCwgbXBxX3B0cik7CisgICAgfQorICB3aGlsZSAoeCAhPSBOVUxMKTsKKworICB2YV9lbmQgKGFwKTsKK30KZGlmZiAtLWdpdCBhL21wcS9jbXAuYyBiL21wcS9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL2NtcC5jCkBAIC0wLDAgKzEsMTY5IEBACisvKiBtcHFfY21wKHUsdikgLS0gQ29tcGFyZSBVLCBWLiAgUmV0dXJuIHBvc2l0aXZlLCB6ZXJvLCBvciBuZWdhdGl2ZQorICAgYmFzZWQgb24gaWYgVSA+IFYsIFUgPT0gViwgb3IgVSA8IFYuCisKK0NvcHlyaWdodCAxOTkxLCAxOTk0LCAxOTk2LCAyMDAxLCAyMDAyLCAyMDA1LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCitzdGF0aWMgaW50CittcHFfY21wX251bWRlbiAobXBxX3NyY3B0ciBvcDEsIG1wel9zcmNwdHIgbnVtX29wMiwgbXB6X3NyY3B0ciBkZW5fb3AyKQoreworICBtcF9zaXplX3QgbnVtMV9zaXplID0gU0laKE5VTShvcDEpKTsKKyAgbXBfc2l6ZV90IGRlbjFfc2l6ZSA9IFNJWihERU4ob3AxKSk7CisgIG1wX3NpemVfdCBudW0yX3NpemUgPSBTSVoobnVtX29wMik7CisgIG1wX3NpemVfdCBkZW4yX3NpemUgPSBTSVooZGVuX29wMik7CisgIGludCBvcDJfaXNfaW50OworICBtcF9saW1iX3QgZDFoLCBkMmg7CisgIG1wX3NpemVfdCB0bXAxX3NpemUsIHRtcDJfc2l6ZTsKKyAgbXBfcHRyIHRtcDFfcHRyLCB0bXAyX3B0cjsKKyAgbXBfc2l6ZV90IG51bTFfc2lnbjsKKyAgaW50IGNjOworICBUTVBfREVDTDsKKworICAvKiBuZWVkIGNhbm9uaWNhbCBzaWducyB0byBnZXQgcmlnaHQgcmVzdWx0ICovCisgIEFTU0VSVCAoZGVuMV9zaXplID4gMCk7CisgIEFTU0VSVCAoZGVuMl9zaXplID4gMCk7CisKKyAgaWYgKG51bTFfc2l6ZSA9PSAwKQorICAgIHJldHVybiAtbnVtMl9zaXplOworICBpZiAobnVtMl9zaXplID09IDApCisgICAgcmV0dXJuIG51bTFfc2l6ZTsKKyAgaWYgKChudW0xX3NpemUgXiBudW0yX3NpemUpIDwgMCkgLyogSS5lLiBhcmUgdGhlIHNpZ25zIGRpZmZlcmVudD8gKi8KKyAgICByZXR1cm4gbnVtMV9zaXplOworCisgIG51bTFfc2lnbiA9IG51bTFfc2l6ZTsKKyAgbnVtMV9zaXplID0gQUJTIChudW0xX3NpemUpOworCisgIC8qIFRISU5LOiBEb2VzIHN0b3JpbmcgZDFoIGFuZCBkMmggbWFrZSBzZW5zZT8gKi8KKyAgZDFoID0gUFRSKERFTihvcDEpKVtkZW4xX3NpemUgLSAxXTsKKyAgZDJoID0gUFRSKGRlbl9vcDIpW2RlbjJfc2l6ZSAtIDFdOworICBvcDJfaXNfaW50ID0gKGRlbjJfc2l6ZSB8IGQyaCkgPT0gMTsKKyAgaWYgKCh1bnNpZ25lZCkgb3AyX2lzX2ludCA9PSAoZGVuMV9zaXplIHwgZDFoKSkgLyogQm90aCBvcHMgYXJlIGludGVnZXJzICovCisgICAgLyogcmV0dXJuIG1wel9jbXAgKE5VTSAob3AxKSwgbnVtX29wMik7ICovCisgICAgeworICAgICAgaW50IGNtcDsKKworICAgICAgLyogQ2Fubm90IHVzZSBudW0xX3NpZ24gLSBudW0yX3NpemUsIG1heSBvdmVyZmxvdyBhbiAiaW50IiAqLworICAgICAgaWYgKG51bTFfc2lnbiAhPSBudW0yX3NpemUpCisJcmV0dXJuIChudW0xX3NpZ24gPiBudW0yX3NpemUpID8gMSA6IC0xOworCisgICAgICBjbXAgPSBtcG5fY21wIChQVFIoTlVNKG9wMSkpLCBQVFIobnVtX29wMiksIG51bTFfc2l6ZSk7CisgICAgICByZXR1cm4gKG51bTFfc2lnbiA+IDAgPyBjbXAgOiAtY21wKTsKKyAgICB9CisKKyAgbnVtMl9zaXplID0gQUJTIChudW0yX3NpemUpOworCisgIHRtcDFfc2l6ZSA9IG51bTFfc2l6ZSArIGRlbjJfc2l6ZTsKKyAgdG1wMl9zaXplID0gbnVtMl9zaXplICsgZGVuMV9zaXplOworCisgIC8qIDEuIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdGVsbCB3aGljaCBvcGVyYW5kIGlzIGxhcmdlciBieSBqdXN0IGxvb2tpbmcgYXQKKyAgICAgdGhlIG51bWJlciBvZiBsaW1icy4gICovCisKKyAgLyogTlVNMSB4IERFTjIgaXMgZWl0aGVyIFRNUDFfU0laRSBsaW1icyBvciBUTVAxX1NJWkUtMSBsaW1icy4KKyAgICAgU2FtZSBmb3IgTlVNMSB4IERFTjEgd2l0aCByZXNwZWN0IHRvIFRNUDJfU0laRS4gICovCisgIGlmICh0bXAxX3NpemUgPiB0bXAyX3NpemUgKyAxKQorICAgIC8qIE5VTTEgeCBERU4yIGlzIHN1cmVseSBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gTlVNMiB4IERFTjEuICAqLworICAgIHJldHVybiBudW0xX3NpZ247CisgIGlmICh0bXAyX3NpemUgKyBvcDJfaXNfaW50ID4gdG1wMV9zaXplICsgMSkKKyAgICAvKiBOVU0xIHggREVOMiBpcyBzdXJlbHkgc21hbGxlciBpbiBtYWduaXR1ZGUgdGhhbiBOVU0yIHggREVOMS4gICovCisgICAgcmV0dXJuIC1udW0xX3NpZ247CisKKyAgLyogMi4gU2FtZSwgYnV0IGNvbXBhcmUgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzLiAgKi8KKyAgeworICAgIGludCBjbnQxLCBjbnQyOworICAgIG1wX2JpdGNudF90IGJpdHMxLCBiaXRzMjsKKworICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudDEsIFBUUihOVU0ob3AxKSlbbnVtMV9zaXplIC0gMV0pOworICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudDIsIGQyaCk7CisgICAgYml0czEgPSAobXBfYml0Y250X3QpIHRtcDFfc2l6ZSAqIEdNUF9OVU1CX0JJVFMgLSBjbnQxIC0gY250MiArIDIgKiBHTVBfTkFJTF9CSVRTOworCisgICAgY291bnRfbGVhZGluZ196ZXJvcyAoY250MSwgUFRSKG51bV9vcDIpW251bTJfc2l6ZSAtIDFdKTsKKyAgICBjb3VudF9sZWFkaW5nX3plcm9zIChjbnQyLCBkMWgpOworICAgIGJpdHMyID0gKG1wX2JpdGNudF90KSB0bXAyX3NpemUgKiBHTVBfTlVNQl9CSVRTIC0gY250MSAtIGNudDIgKyAyICogR01QX05BSUxfQklUUzsKKworICAgIGlmIChiaXRzMSA+IGJpdHMyICsgMSkKKyAgICAgIHJldHVybiBudW0xX3NpZ247CisgICAgaWYgKGJpdHMyICsgb3AyX2lzX2ludCA+IGJpdHMxICsgMSkKKyAgICAgIHJldHVybiAtbnVtMV9zaWduOworICB9CisKKyAgLyogMy4gRmluYWxseSwgY3Jvc3MgbXVsdGlwbHkgYW5kIGNvbXBhcmUuICAqLworCisgIFRNUF9NQVJLOworICBpZiAob3AyX2lzX2ludCkKKyAgICB7CisgICAgICB0bXAyX3B0ciA9IFRNUF9BTExPQ19MSU1CUyAodG1wMl9zaXplKTsKKyAgICAgIHRtcDFfcHRyID0gUFRSKE5VTShvcDEpKTsKKyAgICAgIC0tdG1wMV9zaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgVE1QX0FMTE9DX0xJTUJTXzIgKHRtcDFfcHRyLHRtcDFfc2l6ZSwgdG1wMl9wdHIsdG1wMl9zaXplKTsKKworICBpZiAobnVtMV9zaXplID49IGRlbjJfc2l6ZSkKKyAgICB0bXAxX3NpemUgLT0gMCA9PSBtcG5fbXVsICh0bXAxX3B0ciwKKwkJCSAgICAgICBQVFIoTlVNKG9wMSkpLCBudW0xX3NpemUsCisJCQkgICAgICAgUFRSKGRlbl9vcDIpLCBkZW4yX3NpemUpOworICBlbHNlCisgICAgdG1wMV9zaXplIC09IDAgPT0gbXBuX211bCAodG1wMV9wdHIsCisJCQkgICAgICAgUFRSKGRlbl9vcDIpLCBkZW4yX3NpemUsCisJCQkgICAgICAgUFRSKE5VTShvcDEpKSwgbnVtMV9zaXplKTsKKyAgICB9CisKKyAgIGlmIChudW0yX3NpemUgPj0gZGVuMV9zaXplKQorICAgICB0bXAyX3NpemUgLT0gMCA9PSBtcG5fbXVsICh0bXAyX3B0ciwKKwkJCQlQVFIobnVtX29wMiksIG51bTJfc2l6ZSwKKwkJCQlQVFIoREVOKG9wMSkpLCBkZW4xX3NpemUpOworICAgZWxzZQorICAgICB0bXAyX3NpemUgLT0gMCA9PSBtcG5fbXVsICh0bXAyX3B0ciwKKwkJCQlQVFIoREVOKG9wMSkpLCBkZW4xX3NpemUsCisJCQkJUFRSKG51bV9vcDIpLCBudW0yX3NpemUpOworCisKKyAgY2MgPSB0bXAxX3NpemUgLSB0bXAyX3NpemUgIT0gMAorICAgID8gdG1wMV9zaXplIC0gdG1wMl9zaXplIDogbXBuX2NtcCAodG1wMV9wdHIsIHRtcDJfcHRyLCB0bXAxX3NpemUpOworICBUTVBfRlJFRTsKKyAgcmV0dXJuIG51bTFfc2lnbiA8IDAgPyAtY2MgOiBjYzsKK30KKworaW50CittcHFfY21wIChtcHFfc3JjcHRyIG9wMSwgbXBxX3NyY3B0ciBvcDIpCit7CisgIHJldHVybiBtcHFfY21wX251bWRlbiAob3AxLCBOVU0ob3AyKSwgREVOKG9wMikpOworfQorCitpbnQKK21wcV9jbXBfeiAobXBxX3NyY3B0ciBvcDEsIG1wel9zcmNwdHIgb3AyKQoreworICBjb25zdCBzdGF0aWMgbXBfbGltYl90IG9uZSA9IDE7CisgIGNvbnN0IHN0YXRpYyBtcHpfdCBkZW4gPSBNUFpfUk9JTklUX04gKChtcF9saW1iX3QgKikgJm9uZSwgMSk7CisKKyAgcmV0dXJuIG1wcV9jbXBfbnVtZGVuIChvcDEsIG9wMiwgZGVuKTsKK30KZGlmZiAtLWdpdCBhL21wcS9jbXBfc2kuYyBiL21wcS9jbXBfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWY0NzJjCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL2NtcF9zaS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIF9tcHFfY21wX3NpIC0tIGNvbXBhcmUgbXBxIGFuZCBsb25nL3Vsb25nIGZyYWN0aW9uLgorCitDb3B5cmlnaHQgMjAwMSwgMjAxMywgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogU29tZXRoaW5nIGxpa2UgbXBxX2NtcGFic191aSB3b3VsZCBiZSBtb3JlIHVzZWZ1bCBmb3IgdGhlIG5lZy9uZWcgY2FzZSwKKyAgIGFuZCBwZXJoYXBzIGEgdmVyc2lvbiBhY2NlcHRpbmcgYSBwYXJhbWV0ZXIgdG8gcmV2ZXJzZSB0aGUgdGVzdCwgdG8gbWFrZQorICAgaXQgYSB0YWlsIGNhbGwgaGVyZS4gICovCisKK2ludAorX21wcV9jbXBfc2kgKG1wcV9zcmNwdHIgcSwgbG9uZyBuLCB1bnNpZ25lZCBsb25nIGQpCit7CisgIC8qIG5lZWQgY2Fub25pY2FsIHNpZ24gdG8gZ2V0IHJpZ2h0IHJlc3VsdCAqLworICBBU1NFUlQgKFNJWihERU4ocSkpID4gMCk7CisKKyAgaWYgKG4gPj0gMCkKKyAgICByZXR1cm4gX21wcV9jbXBfdWkgKHEsIG4sIGQpOworICBpZiAoU0laKE5VTShxKSkgPj0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qID49MCBjbXAgPDAgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcHFfdCAgcWFiczsKKyAgICAgIFNJWihOVU0ocWFicykpID0gLVNJWihOVU0ocSkpOworICAgICAgUFRSKE5VTShxYWJzKSkgPSBQVFIoTlVNKHEpKTsKKyAgICAgIFNJWihERU4ocWFicykpID0gU0laKERFTihxKSk7CisgICAgICBQVFIoREVOKHFhYnMpKSA9IFBUUihERU4ocSkpOworCisgICAgICByZXR1cm4gLSBfbXBxX2NtcF91aSAocWFicywgTkVHX0NBU1QgKHVuc2lnbmVkIGxvbmcsIG4pLCBkKTsgICAgLyogPDAgY21wIDwwICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBxL2NtcF91aS5jIGIvbXBxL2NtcF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTlhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvY21wX3VpLmMKQEAgLTAsMCArMSw5OSBAQAorLyogbXBxX2NtcF91aSh1LHZuLHZkKSAtLSBDb21wYXJlIFUgd2l0aCBWbi9WZC4gIFJldHVybiBwb3NpdGl2ZSwgemVybywgb3IKKyAgIG5lZ2F0aXZlIGJhc2VkIG9uIGlmIFUgPiBWLCBVID09IFYsIG9yIFUgPCBWLiAgVm4gYW5kIFZkIG1heSBoYXZlCisgICBjb21tb24gZmFjdG9ycy4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAtMjAwMywgMjAwNSwgMjAxNCwgMjAxOCBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitpbnQKK19tcHFfY21wX3VpIChtcHFfc3JjcHRyIG9wMSwgdW5zaWduZWQgbG9uZyBpbnQgbnVtMiwgdW5zaWduZWQgbG9uZyBpbnQgZGVuMikKK3sKKyAgbXBfc2l6ZV90IG51bTFfc2l6ZSA9IFNJWihOVU0ob3AxKSk7CisgIG1wX3NpemVfdCBkZW4xX3NpemUgPSBTSVooREVOKG9wMSkpOworICBtcF9zaXplX3QgdG1wMV9zaXplLCB0bXAyX3NpemU7CisgIG1wX3B0ciB0bXAxX3B0ciwgdG1wMl9wdHI7CisgIG1wX2xpbWJfdCBjeV9saW1iOworICBpbnQgY2M7CisgIFRNUF9ERUNMOworCisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGlmICgobnVtMiB8IGRlbjIpID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wcV90IG9wMjsKKyAgICAgIG1wcV9pbml0IChvcDIpOworICAgICAgbXB6X3NldF91aSAobXBxX251bXJlZiAob3AyKSwgbnVtMik7CisgICAgICBtcHpfc2V0X3VpIChtcHFfZGVucmVmIChvcDIpLCBkZW4yKTsKKyAgICAgIGNjID0gbXBxX2NtcCAob3AxLCBvcDIpOworICAgICAgbXBxX2NsZWFyIChvcDIpOworICAgICAgcmV0dXJuIGNjOworICAgIH0KKyNlbmRpZgorCisgIC8qIG5lZWQgY2Fub25pY2FsIHNpZ24gdG8gZ2V0IHJpZ2h0IHJlc3VsdCAqLworICBBU1NFUlQgKGRlbjFfc2l6ZSA+IDApOworCisgIGlmIChVTkxJS0VMWSAoZGVuMiA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBpZiAobnVtMiA9PSAwKQorICAgIHJldHVybiBudW0xX3NpemU7CisgIGlmIChudW0xX3NpemUgPD0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogTlVNMSB4IERFTjIgaXMgZWl0aGVyIFRNUDFfU0laRSBsaW1icyBvciBUTVAxX1NJWkUtMSBsaW1icy4KKyAgICAgU2FtZSBmb3IgTlVNMiB4IERFTjEgd2l0aCByZXNwZWN0IHRvIFRNUDJfU0laRS4gICovCisgIC8qIElmIGZyYWMyIDw9IDEgKGkuZS4gbnVtMiA8PSBkZW4yKSwgc2hvcnRjdXQgd2l0aCBhIHNpbXBsZXIKKyAgICAgY29uZGl0aW9uOiBudW0xID4gZGVuMS4gSGVyZSB3ZSBvbmx5IHRlc3Qgc2l6ZXMuICovCisgIGlmIChudW0xX3NpemUgPiBkZW4xX3NpemUgKyAobnVtMiA+IGRlbjIpKQorICAgIC8qIE5VTTEgeCBERU4yIGlzIHN1cmVseSBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gTlVNMiB4IERFTjEuICAqLworICAgIHJldHVybiBudW0xX3NpemU7CisgIGlmIChkZW4xX3NpemUgPiBudW0xX3NpemUgKyAoZGVuMiA+IG51bTIpKQorICAgIC8qIE5VTTEgeCBERU4yIGlzIHN1cmVseSBzbWFsbGVyIGluIG1hZ25pdHVkZSB0aGFuIE5VTTIgeCBERU4xLiAgKi8KKyAgICByZXR1cm4gLW51bTFfc2l6ZTsKKworICBUTVBfTUFSSzsKKyAgVE1QX0FMTE9DX0xJTUJTXzIgKHRtcDFfcHRyLCBudW0xX3NpemUgKyAxLCB0bXAyX3B0ciwgZGVuMV9zaXplICsgMSk7CisKKyAgY3lfbGltYiA9IG1wbl9tdWxfMSAodG1wMV9wdHIsIFBUUihOVU0ob3AxKSksIG51bTFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1wX2xpbWJfdCkgZGVuMik7CisgIHRtcDFfcHRyW251bTFfc2l6ZV0gPSBjeV9saW1iOworICB0bXAxX3NpemUgPSBudW0xX3NpemUgKyAoY3lfbGltYiAhPSAwKTsKKworICBjeV9saW1iID0gbXBuX211bF8xICh0bXAyX3B0ciwgUFRSKERFTihvcDEpKSwgZGVuMV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAobXBfbGltYl90KSBudW0yKTsKKyAgdG1wMl9wdHJbZGVuMV9zaXplXSA9IGN5X2xpbWI7CisgIHRtcDJfc2l6ZSA9IGRlbjFfc2l6ZSArIChjeV9saW1iICE9IDApOworCisgIGNjID0gdG1wMV9zaXplIC0gdG1wMl9zaXplOworICBjYyA9IGNjICE9IDAgPyBjYyA6IG1wbl9jbXAgKHRtcDFfcHRyLCB0bXAyX3B0ciwgdG1wMV9zaXplKTsKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBjYzsKK30KZGlmZiAtLWdpdCBhL21wcS9kaXYuYyBiL21wcS9kaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQ5NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXBxL2Rpdi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBtcHFfZGl2IC0tIGRpdmlkZSB0d28gcmF0aW9uYWwgbnVtYmVycy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTQtMTk5NiwgMjAwMCwgMjAwMSwgMjAxNSwgMjAxOCBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wcV9kaXYgKG1wcV9wdHIgcXVvdCwgbXBxX3NyY3B0ciBvcDEsIG1wcV9zcmNwdHIgb3AyKQoreworICBtcHpfdCBnY2QxLCBnY2QyOworICBtcHpfdCB0bXAxLCB0bXAyOworICBtcF9zaXplX3Qgb3AxX3NpemU7CisgIG1wX3NpemVfdCBvcDJfc2l6ZTsKKyAgbXBfc2l6ZV90IGFsbG9jOworICBUTVBfREVDTDsKKworICBvcDJfc2l6ZSA9IFNJWihOVU0ob3AyKSk7CisKKyAgaWYgKFVOTElLRUxZIChvcDJfc2l6ZSA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBpZiAoVU5MSUtFTFkgKHF1b3QgPT0gb3AyKSkKKyAgICB7CisgICAgICBpZiAoVU5MSUtFTFkgKG9wMSA9PSBvcDIpKQorCXsKKwkgIG1wcV9zZXRfdWkgKHF1b3QsIDEsIDEpOworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogV2UgY2hlY2tlZCBmb3Igb3AxID09IG9wMjogd2UgYXJlIG5vdCBpbiB0aGUgeD14L3ggY2FzZS4KKwkgV2UgY29tcHV0ZSB4PXkveCBieSBjb21wdXRpbmcgeD1pbnYoeCkqeSAqLworICAgICAgTVBOX1BUUl9TV0FQIChQVFIoTlVNKHF1b3QpKSwgQUxMT0MoTlVNKHF1b3QpKSwKKwkJICAgIFBUUihERU4ocXVvdCkpLCBBTExPQyhERU4ocXVvdCkpKTsKKyAgICAgIGlmIChvcDJfc2l6ZSA+IDApCisJeworCSAgU0laKE5VTShxdW90KSkgPSBTSVooREVOKHF1b3QpKTsKKwkgIFNJWihERU4ocXVvdCkpID0gb3AyX3NpemU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIFNJWihOVU0ocXVvdCkpID0gLSBTSVooREVOKHF1b3QpKTsKKwkgIFNJWihERU4ocXVvdCkpID0gLSBvcDJfc2l6ZTsKKwl9CisgICAgICBtcHFfbXVsIChxdW90LCBxdW90LCBvcDEpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBvcDFfc2l6ZSA9IEFCU0laKE5VTShvcDEpKTsKKworICBpZiAob3AxX3NpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBzcGVjaWFsIGNhc2UgdGhpcyB0byBzaW1wbGlmeSBhbGxvY2F0aW9uIGxvZ2ljOyBnY2QoMCx4KSA9IHgKKwkgaXMgYSBzaW5ndWxhciBjYXNlIGZvciB0aGUgYWxsb2NhdGlvbnMuICAqLworICAgICAgU0laKE5VTShxdW90KSkgPSAwOworICAgICAgTVBaX05FV0FMTE9DIChERU4ocXVvdCksIDEpWzBdID0gMTsKKyAgICAgIFNJWihERU4ocXVvdCkpID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgb3AyX3NpemUgPSBBQlMob3AyX3NpemUpOworCisgIFRNUF9NQVJLOworCisgIGFsbG9jID0gTUlOIChvcDFfc2l6ZSwgb3AyX3NpemUpOworICBNUFpfVE1QX0lOSVQgKGdjZDEsIGFsbG9jKTsKKworICBhbGxvYyA9IE1BWCAob3AxX3NpemUsIG9wMl9zaXplKTsKKyAgTVBaX1RNUF9JTklUICh0bXAxLCBhbGxvYyk7CisKKyAgb3AyX3NpemUgPSBTSVooREVOKG9wMikpOworICBvcDFfc2l6ZSA9IFNJWihERU4ob3AxKSk7CisKKyAgYWxsb2MgPSBNSU4gKG9wMV9zaXplLCBvcDJfc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAoZ2NkMiwgYWxsb2MpOworCisgIGFsbG9jID0gTUFYIChvcDFfc2l6ZSwgb3AyX3NpemUpOworICBNUFpfVE1QX0lOSVQgKHRtcDIsIGFsbG9jKTsKKworICAvKiBRVU9UIG1pZ2h0IGJlIGlkZW50aWNhbCB0byBPUDEsIHNvIGRvbid0IHN0b3JlIHRoZSByZXN1bHQgdGhlcmUKKyAgICAgdW50aWwgd2UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGlucHV0IG9wZXJhbmQuICBXZSBjYW4gb3ZlcndyaXRlCisgICAgIHRoZSBudW1lcmF0b3Igb2YgUVVPVCB3aGVuIHdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBudW1lcmF0b3Igb2YKKyAgICAgT1AxLiAqLworCisgIG1wel9nY2QgKGdjZDEsIE5VTShvcDEpLCBOVU0ob3AyKSk7CisgIG1wel9nY2QgKGdjZDIsIERFTihvcDIpLCBERU4ob3AxKSk7CisKKyAgbXB6X2RpdmV4YWN0X2djZCAodG1wMSwgTlVNKG9wMSksIGdjZDEpOworICBtcHpfZGl2ZXhhY3RfZ2NkICh0bXAyLCBERU4ob3AyKSwgZ2NkMik7CisKKyAgbXB6X211bCAoTlVNKHF1b3QpLCB0bXAxLCB0bXAyKTsKKworICBtcHpfZGl2ZXhhY3RfZ2NkICh0bXAxLCBOVU0ob3AyKSwgZ2NkMSk7CisgIG1wel9kaXZleGFjdF9nY2QgKHRtcDIsIERFTihvcDEpLCBnY2QyKTsKKworICBtcHpfbXVsIChERU4ocXVvdCksIHRtcDEsIHRtcDIpOworCisgIC8qIEtlZXAgdGhlIGRlbm9taW5hdG9yIHBvc2l0aXZlLiAgKi8KKyAgaWYgKFNJWihERU4ocXVvdCkpIDwgMCkKKyAgICB7CisgICAgICBTSVooREVOKHF1b3QpKSA9IC1TSVooREVOKHF1b3QpKTsKKyAgICAgIFNJWihOVU0ocXVvdCkpID0gLVNJWihOVU0ocXVvdCkpOworICAgIH0KKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wcS9lcXVhbC5jIGIvbXBxL2VxdWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzNWUwNAotLS0gL2Rldi9udWxsCisrKyBiL21wcS9lcXVhbC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIG1wcV9lcXVhbCh1LHYpIC0tIENvbXBhcmUgVSwgVi4gIFJldHVybiBub24temVybyBpZiB0aGV5IGFyZSBlcXVhbCwgemVybworICAgaWYgdGhleSBhcmUgbm9uLWVxdWFsLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSwgMjAwMiwgMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXBxX2VxdWFsIChtcHFfc3JjcHRyIG9wMSwgbXBxX3NyY3B0ciBvcDIpIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc2l6ZV90ICBudW0xX3NpemUsIG51bTJfc2l6ZSwgZGVuMV9zaXplLCBkZW4yX3NpemUsIGk7CisgIG1wX3NyY3B0ciAgbnVtMV9wdHIsICBudW0yX3B0ciwgIGRlbjFfcHRyLCAgZGVuMl9wdHI7CisKKyAgLyogbmVlZCBmdWxseSBjYW5vbmljYWwgZm9yIGNvcnJlY3QgcmVzdWx0cyAqLworICBBU1NFUlRfTVBRX0NBTk9OSUNBTCAob3AxKTsKKyAgQVNTRVJUX01QUV9DQU5PTklDQUwgKG9wMik7CisKKyAgbnVtMV9zaXplID0gU0laKE5VTShvcDEpKTsKKyAgbnVtMl9zaXplID0gU0laKE5VTShvcDIpKTsKKyAgaWYgKG51bTFfc2l6ZSAhPSBudW0yX3NpemUpCisgICAgcmV0dXJuIDA7CisKKyAgZGVuMV9zaXplID0gU0laKERFTihvcDEpKTsKKyAgZGVuMl9zaXplID0gU0laKERFTihvcDIpKTsKKyAgaWYgKGRlbjFfc2l6ZSAhPSBkZW4yX3NpemUpCisgICAgcmV0dXJuIDA7CisKKyAgbnVtMV9wdHIgPSBQVFIoTlVNKG9wMSkpOworICBudW0yX3B0ciA9IFBUUihOVU0ob3AyKSk7CisgIG51bTFfc2l6ZSA9IEFCUyAobnVtMV9zaXplKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTFfc2l6ZTsgaSsrKQorICAgIGlmIChudW0xX3B0cltpXSAhPSBudW0yX3B0cltpXSkKKyAgICAgIHJldHVybiAwOworCisgIGRlbjFfcHRyID0gUFRSKERFTihvcDEpKTsKKyAgZGVuMl9wdHIgPSBQVFIoREVOKG9wMikpOworICBmb3IgKGkgPSAwOyBpIDwgZGVuMV9zaXplOyBpKyspCisgICAgaWYgKGRlbjFfcHRyW2ldICE9IGRlbjJfcHRyW2ldKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tcHEvZ2V0X2QuYyBiL21wcS9nZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTc3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvZ2V0X2QuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogZG91YmxlIG1wcV9nZXRfZCAobXBxX3Qgc3JjKSAtLSBtcHEgdG8gZG91YmxlLCByb3VuZGluZyB0b3dhcmRzIHplcm8uCisKK0NvcHlyaWdodCAxOTk1LCAxOTk2LCAyMDAxLTIwMDUsIDIwMTgsIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogQWxsIHRoYXQncyBuZWVkZWQgaXMgdG8gZ2V0IHRoZSBoaWdoIDUzIGJpdHMgb2YgdGhlIHF1b3RpZW50IG51bS9kZW4sCisgICByb3VuZGVkIHRvd2FyZHMgemVyby4gIE1vcmUgdGhhbiA1MyBiaXRzIGlzIGZpbmUsIGFueSBleGNlc3MgaXMgaWdub3JlZAorICAgYnkgbXBuX2dldF9kLgorCisgICBOX1FMSU1CUyBpcyBob3cgbWFueSBxdW90aWVudCBsaW1icyB3ZSBuZWVkIHRvIHNhdGlzZnkgdGhlIG1hbnRpc3NhIG9mIGEKKyAgIGRvdWJsZSwgYXNzdW1pbmcgdGhlIGhpZ2hlc3Qgb2YgdGhvc2UgbGltYnMgaXMgbm9uLXplcm8uICBUaGUgdGFyZ2V0CisgICBxc2l6ZSBmb3IgbXBuX3RkaXZfcXIgaXMgdGhlbiAxIG1vcmUgdGhhbiB0aGlzLCBzaW5jZSB0aGF0IGZ1bmN0aW9uIG1heQorICAgZ2l2ZSBhIHplcm8gaW4gdGhlIGhpZ2ggbGltYiAoYW5kIG5vbi16ZXJvIGluIHRoZSBzZWNvbmQgaGlnaGVzdCkuCisKKyAgIFRoZSB1c2Ugb2YgOCpzaXplb2YoZG91YmxlKSBpbiBOX1FMSU1CUyBpcyBhbiBvdmVyZXN0aW1hdGUgb2YgdGhlCisgICBtYW50aXNzYSBiaXRzLCBidXQgaXQgZ2V0cyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIHRydWUgdmFsdWUgKDUzIG9yIDQ4IG9yCisgICB3aGF0ZXZlcikgd2hlbiByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgR01QX05VTUJfQklUUywgZm9yIG5vbi1uYWlscy4KKworICAgRW5oYW5jZW1lbnRzOgorCisgICBVc2UgdGhlIHRydWUgbWFudGlzc2Egc2l6ZSBpbiB0aGUgTl9RTElNQlMgZm9ybXVsYSwgdG8gc2F2ZSBhIGRpdmlkZSBzdGVwCisgICBpbiBuYWlscy4KKworICAgRXhhbWluZSB0aGUgaGlnaCBsaW1icyBvZiBudW0gYW5kIGRlbiB0byBzZWUgaWYgdGhlIGhpZ2hlc3QgMSBiaXQgb2YgdGhlCisgICBxdW90aWVudCB3aWxsIGZhbGwgaGlnaCBlbm91Z2ggdGhhdCBqdXN0IE5fUUxJTUJTLTEgbGltYnMgaXMgZW5vdWdoIHRvCisgICBnZXQgdGhlIG5lY2Vzc2FyeSBiaXRzLCB0aGVyZWJ5IHNhdmluZyBhIGRpdmlzaW9uIHN0ZXAuCisKKyAgIEJpdCBzaGlmdCBlaXRoZXIgbnVtIG9yIGRlbiB0byBhcnJhbmdlIGZvciB0aGUgYWJvdmUgY29uZGl0aW9uIG9uIHRoZQorICAgaGlnaCAxIGJpdCBvZiB0aGUgcXVvdGllbnQsIHRvIHNhdmUgYSBkaXZpc2lvbiBzdGVwIGFsd2F5cy4gIEEgc2hpZnQgdG8KKyAgIHNhdmUgYSBkaXZpc2lvbiBzdGVwIGlzIGRlZmluaXRlbHkgd29ydGh3aGlsZSB3aXRoIG1wbl90ZGl2X3FyLCB0aG91Z2ggd2UKKyAgIG1heSB3YW50IHRvIHJlYXNzZXNzIHRoaXMgb24gYmlnIG51bS9kZW4gd2hlbiBhIHF1b3RpZW50LW9ubHkgZGl2aXNpb24KKyAgIGV4aXN0cy4KKworICAgTWF5YmUgd2UgY291bGQgZXN0aW1hdGUgdGhlIGZpbmFsIGV4cG9uZW50IHVzaW5nIG5zaXplLWRzaXplIChhbmQKKyAgIHBvc3NpYmx5IHRoZSBoaWdoIGxpbWJzIG9mIG51bSBhbmQgZGVuKSwgc28gYXMgdG8gZGV0ZWN0IG92ZXJmbG93IGFuZAorICAgcmV0dXJuIGluZmluaXR5IG9yIHplcm8gcXVpY2tseS4gIE92ZXJmbG93IGlzIG5ldmVyIHZlcnkgaGVscGZ1bCB0byBhbgorICAgYXBwbGljYXRpb24sIGFuZCBjYW4gdGhlcmVmb3JlIHByb2JhYmx5IGJlIHJlZ2FyZGVkIGFzIGFibm9ybWFsLCBidXQgd2UKKyAgIG1heSBzdGlsbCBsaWtlIHRvIG9wdGltaXplIGl0IGlmIHRoZSBjb25kaXRpb25zIGFyZSBlYXN5LiAgKFRoaXMgd291bGQKKyAgIG9ubHkgYmUgZm9yIGZsb2F0IGZvcm1hdHMgd2Uga25vdywgdW5rbm93biBmb3JtYXRzIGFyZSBub3QgaW1wb3J0YW50IGFuZAorICAgY2FuIGJlIGxlZnQgdG8gbXBuX2dldF9kLikKKworICAgRnV0dXJlOgorCisgICBJZi93aGVuIG1wbl90ZGl2X3FyIHN1cHBvcnRzIGl0cyBxeG4gcGFyYW1ldGVyIHdlIGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mCisgICBwYWRkaW5nIG4gd2l0aCB6ZXJvcyBpbiB0ZW1wb3Jhcnkgc3BhY2UuCisKKyAgIEFsdGVybmF0aXZlczoKKworICAgQW4gYWx0ZXJuYXRpdmUgYWxnb3JpdGhtLCB0aGF0IG1heSBiZSBmYXN0ZXI6CisgICAwLiBMZXQgbiBiZSBzb21ld2hhdCBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gYSBkb3VibGUuCisgICAxLiBFeHRyYWN0IHRoZSBtb3N0IHNpZ25pZmljYW50IG4gYml0cyBvZiB0aGUgZGVub21pbmF0b3IsIGFuZCBhbiBlcXVhbAorICAgICAgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUgbnVtZXJhdG9yLgorICAgMi4gSW50ZXJwcmV0IHRoZSBleHRyYWN0ZWQgbnVtYmVycyBhcyBpbnRlZ2VycywgY2FsbCB0aGVtIGEgYW5kIGIKKyAgICAgIHJlc3BlY3RpdmVseSwgYW5kIGRldmVsb3AgbiBiaXRzIG9mIHRoZSBmcmFjdGlvbnMgKChhICsgMSkgLyBiKSBhbmQKKyAgICAgIChhIC8gKGIgKyAxKSkgdXNpbmcgbXBuX2RpdnJlbS4KKyAgIDMuIElmIHRoZSBjb21wdXRlZCB2YWx1ZXMgYXJlIGlkZW50aWNhbCBVUCBUTyBUSEUgUE9TSVRJT04gV0UgQ0FSRSBBQk9VVCwKKyAgICAgIHdlIGFyZSBkb25lLiAgSWYgdGhleSBhcmUgZGlmZmVyZW50LCByZXBlYXQgdGhlIGFsZ29yaXRobSBmcm9tIHN0ZXAgMSwKKyAgICAgIGJ1dCBmaXJzdCBsZXQgbiA9IG4gKiAyLgorICAgNC4gSWYgd2UgZW5kIHVwIHVzaW5nIGFsbCBiaXRzIGZyb20gdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IsIGZhbGwKKyAgICAgIGJhY2sgdG8gYSBwbGFpbiBkaXZpc2lvbi4KKyAgIDUuIEp1c3QgdG8gbWFrZSBsaWZlIGhhcmRlciwgVGhlIGNvbXB1dGF0aW9uIG9mIGEgKyAxIGFuZCBiICsgMSBhYm92ZQorICAgICAgbWlnaHQgZ2l2ZSBjYXJyeS1vdXQuLi4gIE5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuICBJdCBtaWdodCB3b3JrIHRvCisgICAgICBzdWJ0cmFjdCAxIGluIGJvdGggY2FzZXMgaW5zdGVhZC4KKworICAgTm90IGNlcnRhaW4gaWYgdGhpcyBhcHByb2FjaCB3b3VsZCBiZSBmYXN0ZXIgdGhhbiBhIHF1b3RpZW50LW9ubHkKKyAgIGRpdmlzaW9uLiAgUHJlc3VtYWJseSBzdWNoIG9wdGltaXphdGlvbnMgYXJlIHRoZSBzb3J0IG9mIHRoaW5nIHdlIHdvdWxkCisgICBsaWtlIHRvIGhhdmUgaGVscGluZyBldmVyeXdoZXJlIHRoYXQgdXNlcyBhIHF1b3RpZW50LW9ubHkgZGl2aXNpb24uICovCisKK2RvdWJsZQorbXBxX2dldF9kIChtcHFfc3JjcHRyIHNyYykKK3sKKyAgZG91YmxlIHJlczsKKyAgbXBfc3JjcHRyIG5wLCBkcDsKKyAgbXBfcHRyIHRlbXA7CisgIG1wX3NpemVfdCBuc2l6ZSA9IFNJWihOVU0oc3JjKSk7CisgIG1wX3NpemVfdCBkc2l6ZSA9IFNJWihERU4oc3JjKSk7CisgIG1wX3NpemVfdCBxc2l6ZSwgcHJvc3BlY3RpdmVfcXNpemUsIHplcm9zOworICBtcF9zaXplX3Qgc2lnbl9xdW90aWVudCA9IG5zaXplOworICBsb25nIGV4cDsKKyNkZWZpbmUgTl9RTElNQlMgKDEgKyAoc2l6ZW9mIChkb3VibGUpICsgR01QX0xJTUJfQllURVMtMSkgLyBHTVBfTElNQl9CWVRFUykKKyAgbXBfbGltYl90IHFhcnJbTl9RTElNQlMgKyAxXTsKKyAgbXBfcHRyIHFwID0gcWFycjsKKyAgVE1QX0RFQ0w7CisKKyAgQVNTRVJUIChkc2l6ZSA+IDApOyAgICAvKiBjYW5vbmljYWwgc3JjICovCisKKyAgLyogbXBuX2dldF9kIGJlbG93IHJlcXVpcmVzIGEgbm9uLXplcm8gb3BlcmFuZCAqLworICBpZiAoVU5MSUtFTFkgKG5zaXplID09IDApKQorICAgIHJldHVybiAwLjA7CisKKyAgVE1QX01BUks7CisgIG5zaXplID0gQUJTIChuc2l6ZSk7CisgIGRzaXplID0gQUJTIChkc2l6ZSk7CisgIG5wID0gUFRSKE5VTShzcmMpKTsKKyAgZHAgPSBQVFIoREVOKHNyYykpOworCisgIHByb3NwZWN0aXZlX3FzaXplID0gbnNpemUgLSBkc2l6ZTsgICAgICAgLyogZnJvbSB1c2luZyBnaXZlbiBuLGQgKi8KKyAgcXNpemUgPSBOX1FMSU1CUzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXNpcmVkIHFzaXplICovCisKKyAgemVyb3MgPSBxc2l6ZSAtIHByb3NwZWN0aXZlX3FzaXplOyAgICAgICAvKiBwYWRkaW5nIG4gdG8gZ2V0IHFzaXplICovCisgIGV4cCA9IChsb25nKSAtemVyb3MgKiBHTVBfTlVNQl9CSVRTOyAgICAgLyogcmVsYXRpdmUgdG8gbG93IG9mIHFwICovCisKKyAgLyogemVybyBleHRlbmQgbiBpbnRvIHRlbXBvcmFyeSBzcGFjZSwgaWYgbmVjZXNzYXJ5ICovCisgIGlmICh6ZXJvcyA+IDApCisgICAgeworICAgICAgbXBfc2l6ZV90IHRzaXplOworICAgICAgdHNpemUgPSBuc2l6ZSArIHplcm9zOyAgICAgICAgICAgICAgIC8qIHNpemUgZm9yIGNvcHkgb2YgbiAqLworCisgICAgICB0ZW1wID0gVE1QX0FMTE9DX0xJTUJTICh0c2l6ZSArIDEpOworICAgICAgTVBOX0ZJTEwgKHRlbXAsIHplcm9zLCAwKTsKKyAgICAgIE1QTl9DT1BZICh0ZW1wICsgemVyb3MsIG5wLCBuc2l6ZSk7CisgICAgICBucCA9IHRlbXA7CisgICAgICBuc2l6ZSA9IHRzaXplOworICAgIH0KKyAgZWxzZSAvKiBuZWdhdGl2ZSB6ZXJvcyBtZWFucyBzaG9ydGVuIG4gKi8KKyAgICB7CisgICAgICBucCAtPSB6ZXJvczsKKyAgICAgIG5zaXplICs9IHplcm9zOworCisgICAgICB0ZW1wID0gVE1QX0FMTE9DX0xJTUJTIChuc2l6ZSArIDEpOworICAgIH0KKworICBBU1NFUlQgKHFzaXplID09IG5zaXplIC0gZHNpemUpOworICBtcG5fZGl2X3EgKHFwLCBucCwgbnNpemUsIGRwLCBkc2l6ZSwgdGVtcCk7CisKKyAgLyogc3RyaXAgcG9zc2libGUgemVybyBoaWdoIGxpbWIgKi8KKyAgcXNpemUgKz0gKHFwW3FzaXplXSAhPSAwKTsKKworICByZXMgPSBtcG5fZ2V0X2QgKHFwLCBxc2l6ZSwgc2lnbl9xdW90aWVudCwgZXhwKTsKKyAgVE1QX0ZSRUU7CisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9tcHEvZ2V0X2Rlbi5jIGIvbXBxL2dldF9kZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZkOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL2dldF9kZW4uYwpAQCAtMCwwICsxLDQyIEBACisvKiBtcHFfZ2V0X2RlbihkZW4scmF0X3NyYykgLS0gU2V0IERFTiB0byB0aGUgZGVub21pbmF0b3Igb2YgUkFUX1NSQy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTQsIDE5OTUsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHFfZ2V0X2RlbiAobXB6X3B0ciBkZW4sIG1wcV9zcmNwdHIgc3JjKQoreworICBtcF9zaXplX3Qgc2l6ZSA9IFNJWihERU4oc3JjKSk7CisgIG1wX3B0ciBkcDsKKworICBkcCA9IE1QWl9ORVdBTExPQyAoZGVuLCBzaXplKTsKKyAgU0laKGRlbikgPSBzaXplOworICBNUE5fQ09QWSAoZHAsIFBUUihERU4oc3JjKSksIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvbXBxL2dldF9udW0uYyBiL21wcS9nZXRfbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MjExYwotLS0gL2Rldi9udWxsCisrKyBiL21wcS9nZXRfbnVtLmMKQEAgLTAsMCArMSw0NCBAQAorIC8qIG1wcV9nZXRfbnVtKG51bSxyYXRfc3JjKSAtLSBTZXQgTlVNIHRvIHRoZSBudW1lcmF0b3Igb2YgUkFUX1NSQy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTQsIDE5OTUsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHFfZ2V0X251bSAobXB6X3B0ciBudW0sIG1wcV9zcmNwdHIgc3JjKQoreworICBtcF9zaXplX3Qgc2l6ZSA9IFNJWihOVU0oc3JjKSk7CisgIG1wX3NpemVfdCBhYnNfc2l6ZSA9IEFCUyAoc2l6ZSk7CisgIG1wX3B0ciBkcDsKKworICBkcCA9IE1QWl9ORVdBTExPQyAobnVtLCBhYnNfc2l6ZSk7CisgIFNJWihudW0pID0gc2l6ZTsKKworICBNUE5fQ09QWSAoZHAsIFBUUihOVU0oc3JjKSksIGFic19zaXplKTsKK30KZGlmZiAtLWdpdCBhL21wcS9nZXRfc3RyLmMgYi9tcHEvZ2V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2ZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvZ2V0X3N0ci5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIG1wcV9nZXRfc3RyIC0tIG1wcSB0byBzdHJpbmcgY29udmVyc2lvbi4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDYsIDIwMTEsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworY2hhciAqCittcHFfZ2V0X3N0ciAoY2hhciAqc3RyLCBpbnQgYmFzZSwgbXBxX3NyY3B0ciBxKQoreworICBzaXplX3QgIHN0cl9hbGxvYywgbGVuOworCisgIGlmIChiYXNlID4gNjIgfHwgYmFzZSA8IC0zNikKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJfYWxsb2MgPSAwOworICBpZiAoc3RyID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhbiBvdmVyZXN0aW1hdGUgc2luY2Ugd2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGhvdyBtdWNoIG9mCisJIHRoZSBoaWdoIGxpbWJzIG9mIG51bSBhbmQgZGVuIGFyZSB1c2VkLiAgKzIgZm9yIHJvdW5kaW5nIHVwIHRoZQorCSBjaGFycyBwZXIgYml0IG9mIG51bSBhbmQgZGVuLiAgKzMgZm9yIHNpZ24sIHNsYXNoIGFuZCAnXDAnLiAgKi8KKyAgICAgIGlmIChBQlMoYmFzZSkgPCAyKQorCWJhc2UgPSAxMDsKKyAgICAgIERJR0lUU19JTl9CQVNFX1BFUl9MSU1CIChzdHJfYWxsb2MsIEFCU0laKE5VTShxKSkgKyBTSVooREVOKHEpKSwgQUJTKGJhc2UpKTsKKyAgICAgIHN0cl9hbGxvYyArPSA2OworCisgICAgICBzdHIgPSBfX0dNUF9BTExPQ0FURV9GVU5DX1RZUEUgKHN0cl9hbGxvYywgY2hhcik7CisgICAgfQorCisgIG1wel9nZXRfc3RyIChzdHIsIGJhc2UsIG1wcV9udW1yZWYocSkpOworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIGlmICghIE1QWl9FUVVBTF8xX1AgKG1wcV9kZW5yZWYgKHEpKSkKKyAgICB7CisgICAgICBzdHJbbGVuKytdID0gJy8nOworICAgICAgbXB6X2dldF9zdHIgKHN0citsZW4sIGJhc2UsIG1wcV9kZW5yZWYocSkpOworICAgICAgbGVuICs9IHN0cmxlbiAoc3RyK2xlbik7CisgICAgfQorCisgIEFTU0VSVCAobGVuID09IHN0cmxlbihzdHIpKTsKKyAgQVNTRVJUIChzdHJfYWxsb2MgPT0gMCB8fCBsZW4rMSA8PSBzdHJfYWxsb2MpOworICBBU1NFUlQgKGxlbisxIDw9IDMgKyAvKiBzaXplIHJlY29tbWVuZGVkIHRvIGFwcGxpY2F0aW9ucyAqLworCSAgKEFCUyhiYXNlKSA8IDIgPworCSAgIG1wel9zaXplaW5iYXNlIChtcHFfbnVtcmVmKHEpLCAxMCkgKworCSAgIG1wel9zaXplaW5iYXNlIChtcHFfZGVucmVmKHEpLCAxMCkKKwkgICA6IG1wel9zaXplaW5iYXNlIChtcHFfbnVtcmVmKHEpLCBBQlMoYmFzZSkpICsKKwkgICBtcHpfc2l6ZWluYmFzZSAobXBxX2RlbnJlZihxKSwgQUJTKGJhc2UpKSkpOworCisgIGlmIChzdHJfYWxsb2MgIT0gMCkKKyAgICBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTUFZQkVfVFlQRSAoc3RyLCBzdHJfYWxsb2MsIGxlbisxLCBjaGFyKTsKKworICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvbXBxL2luaXQuYyBiL21wcS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxMDA2NgotLS0gL2Rldi9udWxsCisrKyBiL21wcS9pbml0LmMKQEAgLTAsMCArMSw0NSBAQAorLyogbXBxX2luaXQgLS0gTWFrZSBhIG5ldyByYXRpb25hbCBudW1iZXIgd2l0aCB2YWx1ZSAwLzEuCisKK0NvcHlyaWdodCAxOTkxLCAxOTk0LCAxOTk1LCAyMDAwLTIwMDIsIDIwMTUsIDIwMTggRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX2luaXQgKG1wcV9wdHIgeCkKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iPTB4YzFhMDsKKyAgQUxMT0MoTlVNKHgpKSA9IDA7CisgIFBUUihOVU0oeCkpID0gKG1wX3B0cikgJmR1bW15X2xpbWI7CisgIFNJWihOVU0oeCkpID0gMDsKKyAgQUxMT0MoREVOKHgpKSA9IDE7CisgIFBUUihERU4oeCkpID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoMSk7CisgIFBUUihERU4oeCkpWzBdID0gMTsKKyAgU0laKERFTih4KSkgPSAxOworfQpkaWZmIC0tZ2l0IGEvbXBxL2luaXRzLmMgYi9tcHEvaW5pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmY0MzQzCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL2luaXRzLmMKQEAgLTAsMCArMSw0OSBAQAorLyogbXBxX2luaXRzKCkgLS0gSW5pdGlhbGl6ZSBtdWx0aXBsZSBtcHFfdCB2YXJpYWJsZXMgYW5kIHNldCB0aGVtIHRvIDAuCisKK0NvcHlyaWdodCAyMDA5LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX2luaXRzIChtcHFfcHRyIHgsIC4uLikKK3sKKyAgdmFfbGlzdCAgYXA7CisKKyAgdmFfc3RhcnQgKGFwLCB4KTsKKworICBkbworICAgIHsKKyAgICAgIG1wcV9pbml0ICh4KTsKKyAgICAgIHggPSB2YV9hcmcgKGFwLCBtcHFfcHRyKTsKKyAgICB9CisgIHdoaWxlICh4ICE9IE5VTEwpOworCisgIHZhX2VuZCAoYXApOworfQpkaWZmIC0tZ2l0IGEvbXBxL2lucF9zdHIuYyBiL21wcS9pbnBfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NjJiYwotLS0gL2Rldi9udWxsCisrKyBiL21wcS9pbnBfc3RyLmMKQEAgLTAsMCArMSw3NSBAQAorLyogbXBxX2lucF9zdHIgLS0gcmVhZCBhbiBtcHEgZnJvbSBhIEZJTEUuCisKK0NvcHlyaWdodCAyMDAxLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworc2l6ZV90CittcHFfaW5wX3N0ciAobXBxX3B0ciBxLCBGSUxFICpmcCwgaW50IGJhc2UpCit7CisgIHNpemVfdCAgbnJlYWQ7CisgIGludCAgICAgYzsKKworICBpZiAoZnAgPT0gTlVMTCkKKyAgICBmcCA9IHN0ZGluOworCisgIFNJWihERU4ocSkpID0gMTsKKyAgTVBaX05FV0FMTE9DIChERU4ocSksIDEpWzBdID0gMTsKKworICBucmVhZCA9IG1wel9pbnBfc3RyIChtcHFfbnVtcmVmKHEpLCBmcCwgYmFzZSk7CisgIGlmIChucmVhZCA9PSAwKQorICAgIHJldHVybiAwOworCisgIGMgPSBnZXRjIChmcCk7CisgIG5yZWFkKys7CisKKyAgaWYgKGMgPT0gJy8nKQorICAgIHsKKyAgICAgIGMgPSBnZXRjIChmcCk7CisgICAgICBucmVhZCsrOworCisgICAgICBucmVhZCA9IG1wel9pbnBfc3RyX25vd2hpdGUgKG1wcV9kZW5yZWYocSksIGZwLCBiYXNlLCBjLCBucmVhZCk7CisgICAgICBpZiAobnJlYWQgPT0gMCkKKwl7CisJICBTSVooTlVNKHEpKSA9IDA7CisJICBTSVooREVOKHEpKSA9IDE7CisJICBQVFIoREVOKHEpKVswXSA9IDE7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuZ2V0YyAoYywgZnApOworICAgICAgbnJlYWQtLTsKKyAgICB9CisKKyAgcmV0dXJuIG5yZWFkOworfQpkaWZmIC0tZ2l0IGEvbXBxL2ludi5jIGIvbXBxL2ludi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTU5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvaW52LmMKQEAgLTAsMCArMSw3MCBAQAorLyogbXBxX2ludihkZXN0LHNyYykgLS0gaW52ZXJ0IGEgcmF0aW9uYWwgbnVtYmVyLCBpLmUuIHNldCBERVNUIHRvIFNSQworICAgd2l0aCB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBzd2FwcGVkLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5NCwgMTk5NSwgMjAwMCwgMjAwMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wcV9pbnYgKG1wcV9wdHIgZGVzdCwgbXBxX3NyY3B0ciBzcmMpCit7CisgIG1wX3NpemVfdCBudW1fc2l6ZSA9IFNJWihOVU0oc3JjKSk7CisgIG1wX3NpemVfdCBkZW5fc2l6ZSA9IFNJWihERU4oc3JjKSk7CisKKyAgaWYgKG51bV9zaXplIDwgMCkKKyAgICB7CisgICAgICBudW1fc2l6ZSA9IC1udW1fc2l6ZTsKKyAgICAgIGRlbl9zaXplID0gLWRlbl9zaXplOworICAgIH0KKyAgZWxzZSBpZiAoVU5MSUtFTFkgKG51bV9zaXplID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIFNJWihERU4oZGVzdCkpID0gbnVtX3NpemU7CisgIFNJWihOVU0oZGVzdCkpID0gZGVuX3NpemU7CisKKyAgLyogSWYgZGVzdCA9PSBzcmMgd2UgbWF5IGp1c3Qgc3dhcCB0aGUgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcjsKKyAgICAgd2UgZW5zdXJlZCB0aGF0IHRoZSBuZXcgZGVub21pbmF0b3IgaXMgcG9zaXRpdmUuICAqLworCisgIGlmIChkZXN0ID09IHNyYykKKyAgICB7CisgICAgICBNUF9QVFJfU1dBUCAoUFRSKE5VTShkZXN0KSksIFBUUihERU4oZGVzdCkpKTsKKyAgICAgIE1QX1NJWkVfVF9TV0FQIChBTExPQyhOVU0oZGVzdCkpLCBBTExPQyhERU4oZGVzdCkpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgZHA7CisKKyAgICAgIGRlbl9zaXplID0gQUJTIChkZW5fc2l6ZSk7CisgICAgICBkcCA9IE1QWl9ORVdBTExPQyAoTlVNKGRlc3QpLCBkZW5fc2l6ZSk7CisgICAgICBNUE5fQ09QWSAoZHAsIFBUUihERU4oc3JjKSksIGRlbl9zaXplKTsKKworICAgICAgZHAgPSBNUFpfTkVXQUxMT0MgKERFTihkZXN0KSwgbnVtX3NpemUpOworICAgICAgTVBOX0NPUFkgKGRwLCBQVFIoTlVNKHNyYykpLCBudW1fc2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXBxL21kXzJleHAuYyBiL21wcS9tZF8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNzhiMwotLS0gL2Rldi9udWxsCisrKyBiL21wcS9tZF8yZXhwLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIG1wcV9tdWxfMmV4cCwgbXBxX2Rpdl8yZXhwIC0gbXVsdGlwbHkgb3IgZGl2aWRlIGJ5IDJeTiAqLworCisvKgorQ29weXJpZ2h0IDIwMDAsIDIwMDIsIDIwMTIsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogVGhlIG11bHRpcGxpZXIvZGl2aXNvciAibiIsIHJlcHJlc2VudGluZyAyXm4sIGlzIGFwcGxpZWQgYnkgcmlnaHQgc2hpZnRpbmcKKyAgICJyIiB1bnRpbCBpdCdzIG9kZCAoaWYgaXQgaXNuJ3QgYWxyZWFkeSksIGFuZCBsZWZ0IHNoaWZ0aW5nICJsIiBmb3IgdGhlCisgICByZXN0LiAqLworCitzdGF0aWMgdm9pZAorbW9yZF8yZXhwIChtcHpfcHRyIGxkc3QsIG1wel9wdHIgcmRzdCwgbXB6X3NyY3B0ciBsc3JjLCBtcHpfc3JjcHRyIHJzcmMsCisgICAgICAgICAgIG1wX2JpdGNudF90IG4pCit7CisgIG1wX3NpemVfdCAgcnNyY19zaXplID0gU0laKHJzcmMpOworICBtcF9zaXplX3QgIGxlbiA9IEFCUyAocnNyY19zaXplKTsKKyAgbXBfcHRyICAgICByc3JjX3B0ciA9IFBUUihyc3JjKTsKKyAgbXBfcHRyICAgICBwLCByZHN0X3B0cjsKKyAgbXBfbGltYl90ICBwbG93OworCisgIHAgPSByc3JjX3B0cjsKKyAgcGxvdyA9ICpwOworICB3aGlsZSAobiA+PSBHTVBfTlVNQl9CSVRTICYmIHBsb3cgPT0gMCkKKyAgICB7CisgICAgICBuIC09IEdNUF9OVU1CX0JJVFM7CisgICAgICBwKys7CisgICAgICBwbG93ID0gKnA7CisgICAgfQorCisgIC8qIG5vIHJlYWxsb2MgaGVyZSBpZiByc3JjPT1yZHN0LCBzbyBwIGFuZCByc3JjX3B0ciByZW1haW4gdmFsaWQgKi8KKyAgbGVuIC09IChwIC0gcnNyY19wdHIpOworICByZHN0X3B0ciA9IE1QWl9SRUFMTE9DIChyZHN0LCBsZW4pOworCisgIGlmICgocGxvdyAmIDEpIHx8IG4gPT0gMCkKKyAgICB7CisgICAgICAvKiBuZWVkIElOQ1Igd2hlbiBzcmM9PWRzdCAqLworICAgICAgaWYgKHAgIT0gcmRzdF9wdHIpCisgICAgICAgIE1QTl9DT1BZX0lOQ1IgKHJkc3RfcHRyLCBwLCBsZW4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgIHNoaWZ0OworICAgICAgaWYgKHBsb3cgPT0gMCkKKyAgICAgICAgc2hpZnQgPSBuOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHNoaWZ0LCBwbG93KTsKKyAgICAgICAgICBzaGlmdCA9IE1JTiAoc2hpZnQsIG4pOworICAgICAgICB9CisgICAgICBtcG5fcnNoaWZ0IChyZHN0X3B0ciwgcCwgbGVuLCBzaGlmdCk7CisgICAgICBsZW4gLT0gKHJkc3RfcHRyW2xlbi0xXSA9PSAwKTsKKyAgICAgIG4gLT0gc2hpZnQ7CisgICAgfQorICBTSVoocmRzdCkgPSAocnNyY19zaXplID49IDApID8gbGVuIDogLWxlbjsKKworICBpZiAobikKKyAgICBtcHpfbXVsXzJleHAgKGxkc3QsIGxzcmMsIG4pOworICBlbHNlIGlmIChsZHN0ICE9IGxzcmMpCisgICAgbXB6X3NldCAobGRzdCwgbHNyYyk7Cit9CisKKwordm9pZAorbXBxX211bF8yZXhwIChtcHFfcHRyIGRzdCwgbXBxX3NyY3B0ciBzcmMsIG1wX2JpdGNudF90IG4pCit7CisgIG1vcmRfMmV4cCAoTlVNKGRzdCksIERFTihkc3QpLCBOVU0oc3JjKSwgREVOKHNyYyksIG4pOworfQorCit2b2lkCittcHFfZGl2XzJleHAgKG1wcV9wdHIgZHN0LCBtcHFfc3JjcHRyIHNyYywgbXBfYml0Y250X3QgbikKK3sKKyAgaWYgKFNJWihOVU0oc3JjKSkgPT0gMCkKKyAgICB7CisgICAgICBTSVooTlVNKGRzdCkpID0gMDsKKyAgICAgIFNJWihERU4oZHN0KSkgPSAxOworICAgICAgTVBaX05FV0FMTE9DIChERU4oZHN0KSwgMSlbMF0gPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtb3JkXzJleHAgKERFTihkc3QpLCBOVU0oZHN0KSwgREVOKHNyYyksIE5VTShzcmMpLCBuKTsKK30KZGlmZiAtLWdpdCBhL21wcS9tdWwuYyBiL21wcS9tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBkYWZjCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL211bC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiBtcHFfbXVsIC0tIG11bHRpcGx5IHR3byByYXRpb25hbCBudW1iZXJzLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5NC0xOTk2LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wcV9tdWwgKG1wcV9wdHIgcHJvZCwgbXBxX3NyY3B0ciBvcDEsIG1wcV9zcmNwdHIgb3AyKQoreworICBtcHpfdCBnY2QxLCBnY2QyOworICBtcHpfdCB0bXAxLCB0bXAyOworICBtcF9zaXplX3Qgb3AxX251bV9zaXplOworICBtcF9zaXplX3Qgb3AxX2Rlbl9zaXplOworICBtcF9zaXplX3Qgb3AyX251bV9zaXplOworICBtcF9zaXplX3Qgb3AyX2Rlbl9zaXplOworICBtcF9zaXplX3QgYWxsb2M7CisgIFRNUF9ERUNMOworCisgIGlmIChvcDEgPT0gb3AyKQorICAgIHsKKyAgICAgIC8qIE5vIG5lZWQgZm9yIGFueSBHQ0RzIHdoZW4gc3F1YXJpbmcuICovCisgICAgICBtcHpfbXVsIChtcHFfbnVtcmVmIChwcm9kKSwgbXBxX251bXJlZiAob3AxKSwgbXBxX251bXJlZiAob3AxKSk7CisgICAgICBtcHpfbXVsIChtcHFfZGVucmVmIChwcm9kKSwgbXBxX2RlbnJlZiAob3AxKSwgbXBxX2RlbnJlZiAob3AxKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG9wMV9udW1fc2l6ZSA9IEFCU0laKE5VTShvcDEpKTsKKyAgb3AxX2Rlbl9zaXplID0gICBTSVooREVOKG9wMSkpOworICBvcDJfbnVtX3NpemUgPSBBQlNJWihOVU0ob3AyKSk7CisgIG9wMl9kZW5fc2l6ZSA9ICAgU0laKERFTihvcDIpKTsKKworICBpZiAob3AxX251bV9zaXplID09IDAgfHwgb3AyX251bV9zaXplID09IDApCisgICAgeworICAgICAgLyogV2Ugc3BlY2lhbCBjYXNlIHRoaXMgdG8gc2ltcGxpZnkgYWxsb2NhdGlvbiBsb2dpYzsgZ2NkKDAseCkgPSB4CisJIGlzIGEgc2luZ3VsYXIgY2FzZSBmb3IgdGhlIGFsbG9jYXRpb25zLiAgKi8KKyAgICAgIFNJWihOVU0ocHJvZCkpID0gMDsKKyAgICAgIE1QWl9ORVdBTExPQyAoREVOKHByb2QpLCAxKVswXSA9IDE7CisgICAgICBTSVooREVOKHByb2QpKSA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIFRNUF9NQVJLOworCisgIGFsbG9jID0gTUlOIChvcDFfbnVtX3NpemUsIG9wMl9kZW5fc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAoZ2NkMSwgYWxsb2MpOworCisgIGFsbG9jID0gTUlOIChvcDJfbnVtX3NpemUsIG9wMV9kZW5fc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAoZ2NkMiwgYWxsb2MpOworCisgIGFsbG9jID0gTUFYIChvcDFfbnVtX3NpemUsIG9wMl9kZW5fc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAodG1wMSwgYWxsb2MpOworCisgIGFsbG9jID0gTUFYIChvcDJfbnVtX3NpemUsIG9wMV9kZW5fc2l6ZSk7CisgIE1QWl9UTVBfSU5JVCAodG1wMiwgYWxsb2MpOworCisgIC8qIFBST0QgbWlnaHQgYmUgaWRlbnRpY2FsIHRvIGVpdGhlciBvcGVyYW5kLCBzbyBkb24ndCBzdG9yZSB0aGUgcmVzdWx0IHRoZXJlCisgICAgIHVudGlsIHdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBpbnB1dCBvcGVyYW5kcy4gIFdlIGNhbiBvdmVyd3JpdGUgdGhlCisgICAgIG51bWVyYXRvciBvZiBQUk9EIHdoZW4gd2UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIG51bWVyYXRvcnMgb2YgT1AxIGFuZAorICAgICBPUDIuICAqLworCisgIG1wel9nY2QgKGdjZDEsIE5VTShvcDEpLCBERU4ob3AyKSk7CisgIG1wel9nY2QgKGdjZDIsIE5VTShvcDIpLCBERU4ob3AxKSk7CisKKyAgbXB6X2RpdmV4YWN0X2djZCAodG1wMSwgTlVNKG9wMSksIGdjZDEpOworICBtcHpfZGl2ZXhhY3RfZ2NkICh0bXAyLCBOVU0ob3AyKSwgZ2NkMik7CisKKyAgbXB6X211bCAoTlVNKHByb2QpLCB0bXAxLCB0bXAyKTsKKworICBtcHpfZGl2ZXhhY3RfZ2NkICh0bXAxLCBERU4ob3AyKSwgZ2NkMSk7CisgIG1wel9kaXZleGFjdF9nY2QgKHRtcDIsIERFTihvcDEpLCBnY2QyKTsKKworICBtcHpfbXVsIChERU4ocHJvZCksIHRtcDEsIHRtcDIpOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXBxL25lZy5jIGIvbXBxL25lZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGE0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvbmVnLmMKQEAgLTAsMCArMSw1NyBAQAorLyogbXBxX25lZyAtLSBuZWdhdGUgYSByYXRpb25hbC4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXBxX25lZyAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wcV9uZWcgKG1wcV9wdHIgZHN0LCBtcHFfc3JjcHRyIHNyYykKK3sKKyAgbXBfc2l6ZV90ICBudW1fc2l6ZSA9IFNJWihOVU0oc3JjKSk7CisKKyAgaWYgKHNyYyAhPSBkc3QpCisgICAgeworICAgICAgbXBfc2l6ZV90ICBzaXplOworICAgICAgbXBfcHRyIGRwOworCisgICAgICBzaXplID0gQUJTKG51bV9zaXplKTsKKyAgICAgIGRwID0gTVBaX05FV0FMTE9DIChOVU0oZHN0KSwgc2l6ZSk7CisgICAgICBNUE5fQ09QWSAoZHAsIFBUUihOVU0oc3JjKSksIHNpemUpOworCisgICAgICBzaXplID0gU0laKERFTihzcmMpKTsKKyAgICAgIGRwID0gTVBaX05FV0FMTE9DIChERU4oZHN0KSwgc2l6ZSk7CisgICAgICBTSVooREVOKGRzdCkpID0gc2l6ZTsKKyAgICAgIE1QTl9DT1BZIChkcCwgUFRSKERFTihzcmMpKSwgc2l6ZSk7CisgICAgfQorCisgIFNJWihOVU0oZHN0KSkgPSAtbnVtX3NpemU7Cit9CmRpZmYgLS1naXQgYS9tcHEvb3V0X3N0ci5jIGIvbXBxL291dF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJkZDRlCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL291dF9zdHIuYwpAQCAtMCwwICsxLDUzIEBACisvKiBtcHFfb3V0X3N0cihzdHJlYW0sYmFzZSxpbnRlZ2VyKSAqLworCisvKgorQ29weXJpZ2h0IDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworc2l6ZV90CittcHFfb3V0X3N0ciAoRklMRSAqc3RyZWFtLCBpbnQgYmFzZSwgbXBxX3NyY3B0ciBxKQoreworICBzaXplX3QgIHdyaXR0ZW47CisKKyAgaWYgKHN0cmVhbSA9PSBOVUxMKQorICAgIHN0cmVhbSA9IHN0ZG91dDsKKworICB3cml0dGVuID0gbXB6X291dF9zdHIgKHN0cmVhbSwgYmFzZSwgbXBxX251bXJlZiAocSkpOworCisgIGlmIChtcHpfY21wX3VpIChtcHFfZGVucmVmIChxKSwgMSkgIT0gMCkKKyAgICB7CisgICAgICBwdXRjICgnLycsIHN0cmVhbSk7CisgICAgICB3cml0dGVuICs9IDEgKyBtcHpfb3V0X3N0ciAoc3RyZWFtLCBiYXNlLCBtcHFfZGVucmVmIChxKSk7CisgICAgfQorCisgIHJldHVybiBmZXJyb3IgKHN0cmVhbSkgPyAwIDogd3JpdHRlbjsKK30KZGlmZiAtLWdpdCBhL21wcS9zZXQuYyBiL21wcS9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MxNWUzCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL3NldC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIG1wcV9zZXQoZGVzdCxzcmMpIC0tIFNldCBERVNUIHRvIFNSQy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTQsIDE5OTUsIDIwMDEsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX3NldCAobXBxX3B0ciBkZXN0LCBtcHFfc3JjcHRyIHNyYykKK3sKKyAgbXBfc2l6ZV90IG51bV9zaXplLCBkZW5fc2l6ZTsKKyAgbXBfc2l6ZV90IGFic19udW1fc2l6ZTsKKyAgbXBfcHRyIGRwOworCisgIG51bV9zaXplID0gU0laKE5VTShzcmMpKTsKKyAgU0laKE5VTShkZXN0KSkgPSBudW1fc2l6ZTsKKyAgYWJzX251bV9zaXplID0gQUJTIChudW1fc2l6ZSk7CisgIGRwID0gTVBaX05FV0FMTE9DIChOVU0oZGVzdCksIGFic19udW1fc2l6ZSk7CisgIE1QTl9DT1BZIChkcCwgUFRSKE5VTShzcmMpKSwgYWJzX251bV9zaXplKTsKKworICBkZW5fc2l6ZSA9IFNJWihERU4oc3JjKSk7CisgIFNJWihERU4oZGVzdCkpID0gZGVuX3NpemU7CisgIGRwID0gTVBaX05FV0FMTE9DIChERU4oZGVzdCksIGRlbl9zaXplKTsKKyAgTVBOX0NPUFkgKGRwLCBQVFIoREVOKHNyYykpLCBkZW5fc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcHEvc2V0X2QuYyBiL21wcS9zZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmM2ZhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvc2V0X2QuYwpAQCAtMCwwICsxLDE2NSBAQAorLyogbXBxX3NldF9kKG1wcV90IHEsIGRvdWJsZSBkKSAtLSBTZXQgcSB0byBkIHdpdGhvdXQgcm91bmRpbmcuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAyLCAyMDAzLCAyMDEyLCAyMDE0LCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9GTE9BVF9ICisjaW5jbHVkZSA8ZmxvYXQuaD4gIC8qIGZvciBEQkxfTUFYICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworI2lmIExJTUJTX1BFUl9ET1VCTEUgPiA0CisgIGNob2tlIG1lCisjZW5kaWYKKwordm9pZAorbXBxX3NldF9kIChtcHFfcHRyIGRlc3QsIGRvdWJsZSBkKQoreworICBpbnQgbmVnYXRpdmU7CisgIG1wX2V4cF90IGV4cDsKKyAgbXBfbGltYl90IHRwW0xJTUJTX1BFUl9ET1VCTEVdOworICBtcF9wdHIgbnAsIGRwOworICBtcF9zaXplX3Qgbm4sIGRuOworICBpbnQgYzsKKworICBET1VCTEVfTkFOX0lORl9BQ1RJT04gKGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbXBfaW52YWxpZF9vcGVyYXRpb24gKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX19nbXBfaW52YWxpZF9vcGVyYXRpb24gKCkpOworCisgIG5lZ2F0aXZlID0gZCA8IDA7CisgIGQgPSBBQlMgKGQpOworCisgIGV4cCA9IF9fZ21wX2V4dHJhY3RfZG91YmxlICh0cCwgZCk7CisKKyAgLyogVGhlcmUgYXJlIHR3byBtYWluIHZlcnNpb24gb2YgdGhlIGNvbnZlcnNpb24uICBUaGUgYHRoZW4nIGFybSBoYW5kbGVzCisgICAgIG51bWJlcnMgd2l0aCBhIGZyYWN0aW9uYWwgcGFydCwgd2hpbGUgdGhlIGBlbHNlJyBhcm0gaGFuZGxlcyBpbnRlZ2Vycy4gICovCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSA0CisgIGlmIChleHAgPD0gMSB8fCAoZXhwID09IDIgJiYgKHRwWzBdIHwgdHBbMV0pICE9IDApKQorI2VuZGlmCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAzCisgIGlmIChleHAgPD0gMSB8fCAoZXhwID09IDIgJiYgdHBbMF0gIT0gMCkpCisjZW5kaWYKKyNpZiBMSU1CU19QRVJfRE9VQkxFID09IDIKKyAgaWYgKGV4cCA8PSAxKQorI2VuZGlmCisgICAgeworICAgICAgaWYgKGQgPT0gMC4wKQorCXsKKwkgIFNJWihOVU0oZGVzdCkpID0gMDsKKwkgIFNJWihERU4oZGVzdCkpID0gMTsKKwkgIE1QWl9ORVdBTExPQyAoREVOKGRlc3QpLCAxKVswXSA9IDE7CisJICByZXR1cm47CisJfQorCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSA0CisgICAgICBucCA9IE1QWl9ORVdBTExPQyAoTlVNKGRlc3QpLCA0KTsKKyAgICAgIGlmICgodHBbMF0gfCB0cFsxXSB8IHRwWzJdKSA9PSAwKQorCW5wWzBdID0gdHBbM10sIG5uID0gMTsKKyAgICAgIGVsc2UgaWYgKCh0cFswXSB8IHRwWzFdKSA9PSAwKQorCW5wWzFdID0gdHBbM10sIG5wWzBdID0gdHBbMl0sIG5uID0gMjsKKyAgICAgIGVsc2UgaWYgKHRwWzBdID09IDApCisJbnBbMl0gPSB0cFszXSwgbnBbMV0gPSB0cFsyXSwgbnBbMF0gPSB0cFsxXSwgbm4gPSAzOworICAgICAgZWxzZQorCW5wWzNdID0gdHBbM10sIG5wWzJdID0gdHBbMl0sIG5wWzFdID0gdHBbMV0sIG5wWzBdID0gdHBbMF0sIG5uID0gNDsKKyNlbmRpZgorI2lmIExJTUJTX1BFUl9ET1VCTEUgPT0gMworICAgICAgbnAgPSBNUFpfTkVXQUxMT0MgKE5VTShkZXN0KSwgMyk7CisgICAgICBpZiAoKHRwWzBdIHwgdHBbMV0pID09IDApCisJbnBbMF0gPSB0cFsyXSwgbm4gPSAxOworICAgICAgZWxzZSBpZiAodHBbMF0gPT0gMCkKKwlucFsxXSA9IHRwWzJdLCBucFswXSA9IHRwWzFdLCBubiA9IDI7CisgICAgICBlbHNlCisJbnBbMl0gPSB0cFsyXSwgbnBbMV0gPSB0cFsxXSwgbnBbMF0gPSB0cFswXSwgbm4gPSAzOworI2VuZGlmCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAyCisgICAgICBucCA9IE1QWl9ORVdBTExPQyAoTlVNKGRlc3QpLCAyKTsKKyAgICAgIGlmICh0cFswXSA9PSAwKQorCW5wWzBdID0gdHBbMV0sIG5uID0gMTsKKyAgICAgIGVsc2UKKwlucFsxXSA9IHRwWzFdLCBucFswXSA9IHRwWzBdLCBubiA9IDI7CisjZW5kaWYKKyAgICAgIGRuID0gbm4gKyAxIC0gZXhwOworICAgICAgQVNTRVJUIChkbiA+IDApOyAvKiAtZXhwID49IC0xOyBubiA+PSAxKi8KKyAgICAgIGRwID0gTVBaX05FV0FMTE9DIChERU4oZGVzdCksIGRuKTsKKyAgICAgIE1QTl9aRVJPIChkcCwgZG4gLSAxKTsKKyAgICAgIGRwW2RuIC0gMV0gPSAxOworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGMsIG5wWzBdIHwgZHBbMF0pOworICAgICAgaWYgKGMgIT0gMCkKKwl7CisJICBtcG5fcnNoaWZ0IChucCwgbnAsIG5uLCBjKTsKKwkgIG5uIC09IG5wW25uIC0gMV0gPT0gMDsKKwkgIC0tZG47CisJICBkcFtkbiAtIDFdID0gQ05TVF9MSU1CKDEpIDw8IChHTVBfTElNQl9CSVRTIC0gYyk7CisJfQorICAgICAgU0laKERFTihkZXN0KSkgPSBkbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBubiA9IGV4cDsKKyAgICAgIG5wID0gTVBaX05FV0FMTE9DIChOVU0oZGVzdCksIG5uKTsKKyAgICAgIHN3aXRjaCAobm4pCisgICAgICAgIHsKKwlkZWZhdWx0OgorCSAgTVBOX1pFUk8gKG5wLCBubiAtIExJTUJTX1BFUl9ET1VCTEUpOworCSAgbnAgKz0gbm4gLSBMSU1CU19QRVJfRE9VQkxFOworCSAgLyogZmFsbCB0aHJvdWdoICovCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAyCisJY2FzZSAyOgorCSAgbnBbMV0gPSB0cFsxXSwgbnBbMF0gPSB0cFswXTsKKwkgIGJyZWFrOworI2VuZGlmCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAzCisJY2FzZSAzOgorCSAgbnBbMl0gPSB0cFsyXSwgbnBbMV0gPSB0cFsxXSwgbnBbMF0gPSB0cFswXTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIG5wWzFdID0gdHBbMl0sIG5wWzBdID0gdHBbMV07CisJICBicmVhazsKKyNlbmRpZgorI2lmIExJTUJTX1BFUl9ET1VCTEUgPT0gNAorCWNhc2UgNDoKKwkgIG5wWzNdID0gdHBbM10sIG5wWzJdID0gdHBbMl0sIG5wWzFdID0gdHBbMV0sIG5wWzBdID0gdHBbMF07CisJICBicmVhazsKKwljYXNlIDM6CisJICBucFsyXSA9IHRwWzNdLCBucFsxXSA9IHRwWzJdLCBucFswXSA9IHRwWzFdOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgbnBbMV0gPSB0cFszXSwgbnBbMF0gPSB0cFsyXTsKKwkgIGJyZWFrOworI2VuZGlmCisJfQorICAgICAgTVBaX05FV0FMTE9DIChERU4oZGVzdCksIDEpWzBdID0gMTsKKyAgICAgIFNJWihERU4oZGVzdCkpID0gMTsKKyAgICB9CisgIFNJWihOVU0oZGVzdCkpID0gbmVnYXRpdmUgPyAtbm4gOiBubjsKK30KZGlmZiAtLWdpdCBhL21wcS9zZXRfZGVuLmMgYi9tcHEvc2V0X2Rlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDlkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvc2V0X2Rlbi5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIG1wcV9zZXRfZGVuKGRlc3QsZGVuKSAtLSBTZXQgdGhlIGRlbm9taW5hdG9yIG9mIERFU1QgZnJvbSBERU4uCisKK0NvcHlyaWdodCAxOTkxLCAxOTk0LTE5OTYsIDIwMDAsIDIwMDEsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX3NldF9kZW4gKG1wcV9wdHIgZGVzdCwgbXB6X3NyY3B0ciBkZW4pCit7CisgIG1wX3NpemVfdCBzaXplID0gU0laIChkZW4pOworICBtcF9zaXplX3QgYWJzX3NpemUgPSBBQlMgKHNpemUpOworICBtcF9wdHIgZHA7CisKKyAgU0laKERFTihkZXN0KSkgPSBzaXplOworICBkcCA9IE1QWl9ORVdBTExPQyAoREVOKGRlc3QpLCBhYnNfc2l6ZSk7CisKKyAgTVBOX0NPUFkgKGRwLCBQVFIoZGVuKSwgYWJzX3NpemUpOworfQpkaWZmIC0tZ2l0IGEvbXBxL3NldF9mLmMgYi9tcHEvc2V0X2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFkNGZjCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL3NldF9mLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIG1wcV9zZXRfZiAtLSBzZXQgYW4gbXBxIGZyb20gYW4gbXBmLgorCitDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKK3ZvaWQKK21wcV9zZXRfZiAobXBxX3B0ciBxLCBtcGZfc3JjcHRyIGYpCit7CisgIG1wX3NpemVfdCAgZmV4cCA9IEVYUChmKTsKKyAgbXBfcHRyICAgICBmcHRyID0gUFRSKGYpOworICBtcF9zaXplX3QgIGZzaXplID0gU0laKGYpOworICBtcF9zaXplX3QgIGFic19mc2l6ZSA9IEFCUyhmc2l6ZSk7CisgIG1wX2xpbWJfdCAgZmxvdzsKKworICBpZiAoZnNpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBzZXQgcT0wICovCisgICAgICBTSVooTlVNKHEpKSA9IDA7CisgICAgICBTSVooREVOKHEpKSA9IDE7CisgICAgICBNUFpfTkVXQUxMT0MgKERFTihxKSwgMSlbMF0gPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBzdHJpcCBsb3cgemVybyBsaW1icyBmcm9tIGYgKi8KKyAgZmxvdyA9ICpmcHRyOworICBNUE5fU1RSSVBfTE9XX1pFUk9TX05PVF9aRVJPIChmcHRyLCBhYnNfZnNpemUsIGZsb3cpOworCisgIGlmIChmZXhwID49IGFic19mc2l6ZSkKKyAgICB7CisgICAgICAvKiByYWRpeCBwb2ludCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGxpbWJzLCBubyBkZW5vbWluYXRvciAqLworICAgICAgbXBfcHRyICBudW1fcHRyOworCisgICAgICBudW1fcHRyID0gTVBaX05FV0FMTE9DIChtcHFfbnVtcmVmIChxKSwgZmV4cCk7CisgICAgICBNUE5fWkVSTyAobnVtX3B0ciwgZmV4cCAtIGFic19mc2l6ZSk7CisgICAgICBNUE5fQ09QWSAobnVtX3B0ciArIGZleHAgLSBhYnNfZnNpemUsIGZwdHIsIGFic19mc2l6ZSk7CisKKyAgICAgIFNJWihOVU0ocSkpID0gZnNpemUgPj0gMCA/IGZleHAgOiAtZmV4cDsKKyAgICAgIFNJWihERU4ocSkpID0gMTsKKyAgICAgIE1QWl9ORVdBTExPQyAoREVOKHEpLCAxKVswXSA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogcmFkaXggcG9pbnQgaXMgd2l0aGluIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBsaW1icywgdXNlIGRlbm9taW5hdG9yICovCisgICAgICBtcF9wdHIgICAgIG51bV9wdHIsIGRlbl9wdHI7CisgICAgICBtcF9zaXplX3QgIGRlbl9zaXplOworCisgICAgICBkZW5fc2l6ZSA9IGFic19mc2l6ZSAtIGZleHA7CisgICAgICBudW1fcHRyID0gTVBaX05FV0FMTE9DIChtcHFfbnVtcmVmIChxKSwgYWJzX2ZzaXplKTsKKyAgICAgIGRlbl9wdHIgPSBNUFpfTkVXQUxMT0MgKG1wcV9kZW5yZWYgKHEpLCBkZW5fc2l6ZSsxKTsKKworICAgICAgaWYgKGZsb3cgJiAxKQorICAgICAgICB7CisgICAgICAgICAgLyogbm8gcG93ZXJzIG9mIHR3byB0byBzdHJpcCBmcm9tIG51bWVyYXRvciAqLworCisgICAgICAgICAgTVBOX0NPUFkgKG51bV9wdHIsIGZwdHIsIGFic19mc2l6ZSk7CisgICAgICAgICAgTVBOX1pFUk8gKGRlbl9wdHIsIGRlbl9zaXplKTsKKyAgICAgICAgICBkZW5fcHRyW2Rlbl9zaXplXSA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHJpZ2h0IHNoaWZ0IG51bWVyYXRvciwgYWRqdXN0IGRlbm9taW5hdG9yIGFjY29yZGluZ2x5ICovCisgICAgICAgICAgaW50ICBzaGlmdDsKKworICAgICAgICAgIGRlbl9zaXplLS07CisgICAgICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHNoaWZ0LCBmbG93KTsKKworICAgICAgICAgIG1wbl9yc2hpZnQgKG51bV9wdHIsIGZwdHIsIGFic19mc2l6ZSwgc2hpZnQpOworICAgICAgICAgIGFic19mc2l6ZSAtPSAobnVtX3B0clthYnNfZnNpemUtMV0gPT0gMCk7CisKKyAgICAgICAgICBNUE5fWkVSTyAoZGVuX3B0ciwgZGVuX3NpemUpOworICAgICAgICAgIGRlbl9wdHJbZGVuX3NpemVdID0gR01QX0xJTUJfSElHSEJJVCA+PiAoc2hpZnQtMSk7CisgICAgICAgIH0KKworICAgICAgU0laKE5VTShxKSkgPSBmc2l6ZSA+PSAwID8gYWJzX2ZzaXplIDogLWFic19mc2l6ZTsKKyAgICAgIFNJWihERU4ocSkpID0gZGVuX3NpemUgKyAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wcS9zZXRfbnVtLmMgYi9tcHEvc2V0X251bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDk5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvc2V0X251bS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIG1wcV9zZXRfbnVtKGRlc3QsbnVtKSAtLSBTZXQgdGhlIG51bWVyYXRvciBvZiBERVNUIGZyb20gTlVNLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5NCwgMTk5NSwgMjAwMSwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHFfc2V0X251bSAobXBxX3B0ciBkZXN0LCBtcHpfc3JjcHRyIG51bSkKK3sKKyAgbXBfc2l6ZV90IHNpemUgPSBTSVogKG51bSk7CisgIG1wX3NpemVfdCBhYnNfc2l6ZSA9IEFCUyAoc2l6ZSk7CisgIG1wX3B0ciBkcDsKKworICBTSVooTlVNKGRlc3QpKSA9IHNpemU7CisgIGRwID0gTVBaX05FV0FMTE9DIChOVU0oZGVzdCksIGFic19zaXplKTsKKworICBNUE5fQ09QWSAoZHAsIFBUUihudW0pLCBhYnNfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcHEvc2V0X3NpLmMgYi9tcHEvc2V0X3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1OTg5OQotLS0gL2Rldi9udWxsCisrKyBiL21wcS9zZXRfc2kuYwpAQCAtMCwwICsxLDYwIEBACisvKiBtcHFfc2V0X3NpKGRlc3QsdWxvbmdfbnVtLHVsb25nX2RlbikgLS0gU2V0IERFU1QgdG8gdGhlIHJhdGlvbmFsIG51bWJlcgorICAgVUxPTkdfTlVNL1VMT05HX0RFTi4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTQsIDE5OTUsIDIwMDEsIDIwMDMsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHFfc2V0X3NpIChtcHFfcHRyIGRlc3QsIHNpZ25lZCBsb25nIGludCBudW0sIHVuc2lnbmVkIGxvbmcgaW50IGRlbikKK3sKKyAgaWYgKEdNUF9OVU1CX0JJVFMgPCBCSVRTX1BFUl9VTE9ORykKKyAgICB7CisgICAgICBpZiAobnVtID09IDApICAvKiBDYW5vbmljYWxpemUgMC9kIHRvIDAvMS4gICovCisgICAgICAgIGRlbiA9IDE7CisgICAgICBtcHpfc2V0X3NpIChtcHFfbnVtcmVmIChkZXN0KSwgbnVtKTsKKyAgICAgIG1wel9zZXRfdWkgKG1wcV9kZW5yZWYgKGRlc3QpLCBkZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobnVtID09IDApCisgICAgeworICAgICAgLyogQ2Fub25pY2FsaXplIDAvZCB0byAwLzEuICAqLworICAgICAgZGVuID0gMTsKKyAgICAgIFNJWihOVU0oZGVzdCkpID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUFpfTkVXQUxMT0MgKE5VTShkZXN0KSwgMSlbMF0gPSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZywgbnVtKTsKKyAgICAgIFNJWihOVU0oZGVzdCkpID0gbnVtID4gMCA/IDEgOiAtMTsKKyAgICB9CisKKyAgTVBaX05FV0FMTE9DIChERU4oZGVzdCksIDEpWzBdID0gZGVuOworICBTSVooREVOKGRlc3QpKSA9IChkZW4gIT0gMCk7Cit9CmRpZmYgLS1naXQgYS9tcHEvc2V0X3N0ci5jIGIvbXBxL3NldF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRiYjJkCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL3NldF9zdHIuYwpAQCAtMCwwICsxLDY4IEBACisvKiBtcHFfc2V0X3N0ciAtLSBzdHJpbmcgdG8gbXBxIGNvbnZlcnNpb24uCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDE1LCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEZJWE1FOiBXb3VsZCBsaWtlIGFuIG1wel9zZXRfbWVtIChvciBzaW1pbGFyKSBhY2NlcHRpbmcgYSBwb2ludGVyIGFuZAorICAgbGVuZ3RoIHNvIHdlIHdvdWxkbid0IGhhdmUgdG8gY29weSB0aGUgbnVtZXJhdG9yIGp1c3QgdG8gbnVsbC10ZXJtaW5hdGUKKyAgIGl0LiAgKi8KKworaW50CittcHFfc2V0X3N0ciAobXBxX3B0ciBxLCBjb25zdCBjaGFyICpzdHIsIGludCBiYXNlKQoreworICBjb25zdCBjaGFyICAqc2xhc2g7CisgIGNoYXIgICAgICAgICpudW07CisgIHNpemVfdCAgICAgIG51bWxlbjsKKyAgaW50ICAgICAgICAgcmV0OworCisgIHNsYXNoID0gc3RyY2hyIChzdHIsICcvJyk7CisgIGlmIChzbGFzaCA9PSBOVUxMKQorICAgIHsKKyAgICAgIFNJWihERU4ocSkpID0gMTsKKyAgICAgIE1QWl9ORVdBTExPQyAoREVOKHEpLCAxKVswXSA9IDE7CisKKyAgICAgIHJldHVybiBtcHpfc2V0X3N0ciAobXBxX251bXJlZihxKSwgc3RyLCBiYXNlKTsKKyAgICB9CisKKyAgbnVtbGVuID0gc2xhc2ggLSBzdHI7CisgIG51bSA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAobnVtbGVuKzEsIGNoYXIpOworICBtZW1jcHkgKG51bSwgc3RyLCBudW1sZW4pOworICBudW1bbnVtbGVuXSA9ICdcMCc7CisgIHJldCA9IG1wel9zZXRfc3RyIChtcHFfbnVtcmVmKHEpLCBudW0sIGJhc2UpOworICBfX0dNUF9GUkVFX0ZVTkNfVFlQRSAobnVtLCBudW1sZW4rMSwgY2hhcik7CisKKyAgaWYgKHJldCAhPSAwKQorICAgIHJldHVybiByZXQ7CisKKyAgcmV0dXJuIG1wel9zZXRfc3RyIChtcHFfZGVucmVmKHEpLCBzbGFzaCsxLCBiYXNlKTsKK30KZGlmZiAtLWdpdCBhL21wcS9zZXRfdWkuYyBiL21wcS9zZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNkNGUzCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL3NldF91aS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIG1wcV9zZXRfdWkoZGVzdCx1bG9uZ19udW0sdWxvbmdfZGVuKSAtLSBTZXQgREVTVCB0byB0aGUgcmF0aW9uYWwgbnVtYmVyCisgICBVTE9OR19OVU0vVUxPTkdfREVOLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5NCwgMTk5NSwgMjAwMS0yMDAzLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX3NldF91aSAobXBxX3B0ciBkZXN0LCB1bnNpZ25lZCBsb25nIGludCBudW0sIHVuc2lnbmVkIGxvbmcgaW50IGRlbikKK3sKKyAgaWYgKEdNUF9OVU1CX0JJVFMgPCBCSVRTX1BFUl9VTE9ORykKKyAgICB7CisgICAgICBpZiAobnVtID09IDApICAvKiBDYW5vbmljYWxpemUgMC9kIHRvIDAvMS4gICovCisgICAgICAgIGRlbiA9IDE7CisgICAgICBtcHpfc2V0X3VpIChtcHFfbnVtcmVmIChkZXN0KSwgbnVtKTsKKyAgICAgIG1wel9zZXRfdWkgKG1wcV9kZW5yZWYgKGRlc3QpLCBkZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobnVtID09IDApCisgICAgeworICAgICAgLyogQ2Fub25pY2FsaXplIDAvZCB0byAwLzEuICAqLworICAgICAgZGVuID0gMTsKKyAgICAgIFNJWihOVU0oZGVzdCkpID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUFpfTkVXQUxMT0MgKE5VTShkZXN0KSwgMSlbMF0gPSBudW07CisgICAgICBTSVooTlVNKGRlc3QpKSA9IDE7CisgICAgfQorCisgIE1QWl9ORVdBTExPQyAoREVOKGRlc3QpLCAxKVswXSA9IGRlbjsKKyAgU0laKERFTihkZXN0KSkgPSAoZGVuICE9IDApOworfQpkaWZmIC0tZ2l0IGEvbXBxL3NldF96LmMgYi9tcHEvc2V0X3ouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzA5YzkzCi0tLSAvZGV2L251bGwKKysrIGIvbXBxL3NldF96LmMKQEAgLTAsMCArMSw0OCBAQAorLyogbXBxX3NldF96IChkZXN0LHNyYykgLS0gU2V0IERFU1QgdG8gU1JDLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSwgMjAxMiwgMjAxNSwgMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wcV9zZXRfeiAobXBxX3B0ciBkZXN0LCBtcHpfc3JjcHRyIHNyYykKK3sKKyAgbXBfc2l6ZV90IG51bV9zaXplOworICBtcF9zaXplX3QgYWJzX251bV9zaXplOworICBtcF9wdHIgZHA7CisKKyAgbnVtX3NpemUgPSBTSVogKHNyYyk7CisgIFNJWihOVU0oZGVzdCkpID0gbnVtX3NpemU7CisgIGFic19udW1fc2l6ZSA9IEFCUyAobnVtX3NpemUpOworICBkcCA9IE1QWl9ORVdBTExPQyAoTlVNKGRlc3QpLCBhYnNfbnVtX3NpemUpOworICBNUE5fQ09QWSAoZHAsIFBUUihzcmMpLCBhYnNfbnVtX3NpemUpOworCisgIE1QWl9ORVdBTExPQyAoREVOKGRlc3QpLCAxKVswXSA9IDE7CisgIFNJWihERU4oZGVzdCkpID0gMTsKK30KZGlmZiAtLWdpdCBhL21wcS9zd2FwLmMgYi9tcHEvc3dhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTUyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHEvc3dhcC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIG1wcV9zd2FwIChVLCBWKSAtLSBTd2FwIFUgYW5kIFYuCisKK0NvcHlyaWdodCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXBxX3N3YXAgKG1wcV9wdHIgdSwgbXBxX3B0ciB2KSBfX0dNUF9OT1RIUk9XCit7CisgIE1QX1NJWkVfVF9TV0FQIChBTExPQyhOVU0odSkpLCBBTExPQyhOVU0odikpKTsKKyAgTVBfU0laRV9UX1NXQVAgKEFMTE9DKERFTih1KSksIEFMTE9DKERFTih2KSkpOworICBNUF9TSVpFX1RfU1dBUCAoU0laKE5VTSh1KSksIFNJWihOVU0odikpKTsKKyAgTVBfU0laRV9UX1NXQVAgKFNJWihERU4odSkpLCBTSVooREVOKHYpKSk7CisgIE1QX1BUUl9TV0FQIChQVFIoTlVNKHUpKSwgUFRSKE5VTSh2KSkpOworICBNUF9QVFJfU1dBUCAoUFRSKERFTih1KSksIFBUUihERU4odikpKTsKK30KZGlmZiAtLWdpdCBhL21wei8yZmFjX3VpLmMgYi9tcHovMmZhY191aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWEwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovMmZhY191aS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBtcHpfMmZhY191aShSRVNVTFQsIE4pIC0tIFNldCBSRVNVTFQgdG8gTiEhLgorCitDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDIwMTIsIDIwMTUsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjZGVmaW5lIEZBQ1RPUl9MSVNUX1NUT1JFKFAsIFBSLCBNQVhfUFIsIFZFQywgSSkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIGlmICgoUFIpID4gKE1BWF9QUikpIHsJCQkJCVwKKyAgICAgIChWRUMpWyhJKSsrXSA9IChQUik7CQkJCQlcCisgICAgICAoUFIpID0gKFApOwkJCQkJCVwKKyAgICB9IGVsc2UJCQkJCQkJXAorICAgICAgKFBSKSAqPSAoUCk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEZBQ18yRFNDX1RIUkVTSE9MRCAoKEZBQ19EU0NfVEhSRVNIT0xEIDw8IDEpIHwgKEZBQ19EU0NfVEhSRVNIT0xEICYgMSkpCisjZGVmaW5lIEZBQ1RPUlNfUEVSX0xJTUIgICAoR01QX05VTUJfQklUUyAvIChMT0cyQyhGQUNfMkRTQ19USFJFU0hPTEQtMSkrMSkpCisKKy8qIENvbXB1dGVzIG4hISwgdGhlIDItbXVsdGktZmFjdG9yaWFsIG9mIG4uIChha2EgZG91YmxlLWZhY3RvcmlhbCBvciBzZW1pLWZhY3RvcmlhbCkKKyAgIFdBUk5JTkc6IGl0IGFzc3VtZXMgdGhhdCBuIGZpdHMgaW4gYSBsaW1iIQorICovCit2b2lkCittcHpfMmZhY191aSAobXB6X3B0ciB4LCB1bnNpZ25lZCBsb25nIG4pCit7CisgIEFTU0VSVCAobiA8PSBHTVBfTlVNQl9NQVgpOworCisgIGlmICgobiAmIDEpID09IDApIHsgLyogbiBpcyBldmVuLCBuID0gMmssICgyaykhISA9IGshIDJeayAqLworICAgIG1wX2xpbWJfdCBjb3VudDsKKworICAgIGlmICgobiA8PSBUQUJMRV9MSU1JVF8yTl9NSU5VU19QT1BDXzJOKSAmIChuICE9IDApKQorICAgICAgY291bnQgPSBfX2dtcF9mYWMyY250X3RhYmxlW24gLyAyIC0gMV07CisgICAgZWxzZQorICAgICAgeworCXBvcGNfbGltYiAoY291bnQsIG4pOwkvKiBwb3BjKG4pID09IHBvcGMoaykgKi8KKwljb3VudCA9IG4gLSBjb3VudDsJCS8qIG4gLSBwb3BjKG4pID09IGsgKyBrIC0gcG9wYyhrKSAqLworICAgICAgfQorICAgIG1wel9vZGRmYWNfMSAoeCwgbiA+PiAxLCAwKTsKKyAgICBtcHpfbXVsXzJleHAgKHgsIHgsIGNvdW50KTsKKyAgfSBlbHNlIHsgLyogbiBpcyBvZGQgKi8KKyAgICBpZiAobiA8PSBPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX0xJTUlUKSB7CisgICAgICBNUFpfTkVXQUxMT0MgKHgsIDEpWzBdID0gX19nbXBfb2RkMmZhY190YWJsZVtuID4+IDFdOworICAgICAgU0laICh4KSA9IDE7CisgICAgfSBlbHNlIGlmIChCRUxPV19USFJFU0hPTEQgKG4sIEZBQ18yRFNDX1RIUkVTSE9MRCkpIHsgLyogb2RkIGJhc2VjYXNlLCAqLworICAgICAgbXBfbGltYl90ICpmYWN0b3JzLCBwcm9kLCBtYXhfcHJvZDsKKyAgICAgIG1wX3NpemVfdCBqOworICAgICAgVE1QX1NERUNMOworCisgICAgICAvKiBGSVhNRTogd2UgbWlnaHQgYWxsb2MgYSBmaXhlZCBhbW91bnQgMStGQUNfMkRTQ19USFJFU0hPTEQvRkFDVE9SU19QRVJfTElNQiAqLworICAgICAgVE1QX1NNQVJLOworICAgICAgZmFjdG9ycyA9IFRNUF9TQUxMT0NfTElNQlMgKDEgKyBuIC8gKDIgKiBGQUNUT1JTX1BFUl9MSU1CKSk7CisKKyAgICAgIGZhY3RvcnNbMF0gPSBPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX01BWDsKKyAgICAgIGogPSAxOworICAgICAgcHJvZCA9IG47CisKKyAgICAgIG1heF9wcm9kID0gR01QX05VTUJfTUFYIC8gRkFDXzJEU0NfVEhSRVNIT0xEOworICAgICAgd2hpbGUgKChuIC09IDIpID4gT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCkKKwlGQUNUT1JfTElTVF9TVE9SRSAobiwgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworCisgICAgICBmYWN0b3JzW2orK10gPSBwcm9kOworICAgICAgbXB6X3Byb2RsaW1icyAoeCwgZmFjdG9ycywgaik7CisKKyAgICAgIFRNUF9TRlJFRTsKKyAgICB9IGVsc2UgeyAvKiBmb3IgdGhlIGFzeW1wdG90aWNhbGx5IGZhc3Qgb2RkIGNhc2UsIGxldCBvZGRmYWMgZG8gdGhlIGpvYi4gKi8KKyAgICAgIG1wel9vZGRmYWNfMSAoeCwgbiwgMSk7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBGQUNUT1JTX1BFUl9MSU1CCisjdW5kZWYgRkFDVE9SX0xJU1RfU1RPUkUKKyN1bmRlZiBGQUNfMkRTQ19USFJFU0hPTEQKZGlmZiAtLWdpdCBhL21wei9hYnMuYyBiL21wei9hYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZiYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2Ficy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIG1wel9hYnMoZHN0LCBzcmMpIC0tIEFzc2lnbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgU1JDIHRvIERTVC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NSwgMjAwMSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfYWJzIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9hYnMgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1KQoreworICBtcF9wdHIgd3A7CisgIG1wX3NyY3B0ciB1cDsKKyAgbXBfc2l6ZV90IHNpemU7CisKKyAgc2l6ZSA9IEFCU0laICh1KTsKKworICBpZiAodSAhPSB3KQorICAgIHsKKyAgICAgIHdwID0gTVBaX05FV0FMTE9DICh3LCBzaXplKTsKKworICAgICAgdXAgPSBQVFIgKHUpOworCisgICAgICBNUE5fQ09QWSAod3AsIHVwLCBzaXplKTsKKyAgICB9CisKKyAgU0laICh3KSA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcHovYWRkLmMgYi9tcHovYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMGFlOAotLS0gL2Rldi9udWxsCisrKyBiL21wei9hZGQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBtcHpfYWRkIC0tIGFkZCBpbnRlZ2Vycy4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2RlZmluZSBPUEVSQVRJT05fYWRkCisjaW5jbHVkZSAiYW9ycy5oIgpkaWZmIC0tZ2l0IGEvbXB6L2FkZF91aS5jIGIvbXB6L2FkZF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDE1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovYWRkX3VpLmMKQEAgLTAsMCArMSwzMyBAQAorLyogbXB6X2FkZF91aSAtLSBBZGQgYW4gbXB6X3QgYW5kIGFuIHVuc2lnbmVkIG9uZS13b3JkIGludGVnZXIuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgT1BFUkFUSU9OX2FkZF91aQorI2luY2x1ZGUgImFvcnNfdWkuaCIKZGlmZiAtLWdpdCBhL21wei9hbmQuYyBiL21wei9hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM0NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2FuZC5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBtcHpfYW5kIC0tIExvZ2ljYWwgYW5kLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNSwgMjAxMiwKKzIwMTUtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9hbmQgKG1wel9wdHIgcmVzLCBtcHpfc3JjcHRyIG9wMSwgbXB6X3NyY3B0ciBvcDIpCit7CisgIG1wX3NyY3B0ciBvcDFfcHRyLCBvcDJfcHRyOworICBtcF9zaXplX3Qgb3AxX3NpemUsIG9wMl9zaXplOworICBtcF9wdHIgcmVzX3B0cjsKKyAgbXBfc2l6ZV90IHJlc19zaXplOworICBtcF9zaXplX3QgaTsKKworICBvcDFfc2l6ZSA9IFNJWihvcDEpOworICBvcDJfc2l6ZSA9IFNJWihvcDIpOworCisgIGlmIChvcDFfc2l6ZSA8IG9wMl9zaXplKQorICAgIHsKKyAgICAgIE1QWl9TUkNQVFJfU1dBUCAob3AxLCBvcDIpOworICAgICAgTVBfU0laRV9UX1NXQVAgKG9wMV9zaXplLCBvcDJfc2l6ZSk7CisgICAgfQorCisgIG9wMV9wdHIgPSBQVFIob3AxKTsKKyAgb3AyX3B0ciA9IFBUUihvcDIpOworCisgIGlmIChvcDJfc2l6ZSA+PSAwKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IGxvb3AgZmluZHMgdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gICovCisgICAgICBmb3IgKGkgPSBvcDJfc2l6ZTsgLS1pID49IDA7KQorCWlmICgob3AxX3B0cltpXSAmIG9wMl9wdHJbaV0pICE9IDApCisJICB7CisJICAgIHJlc19zaXplID0gaSArIDE7CisJICAgIC8qIEhhbmRsZSBhbGxvY2F0aW9uLCBub3cgdGhlbiB3ZSBrbm93IGV4YWN0bHkgaG93IG11Y2ggc3BhY2UgaXMKKwkgICAgICAgbmVlZGVkIGZvciB0aGUgcmVzdWx0LiAgKi8KKwkgICAgLyogRG9uJ3QgcmUtcmVhZCBvcDFfcHRyIGFuZCBvcDJfcHRyLiAgU2luY2UgcmVzX3NpemUgPD0KKwkgICAgICAgTUlOKG9wMV9zaXplLCBvcDJfc2l6ZSksIHJlcyBpcyBub3QgY2hhbmdlZCB3aGVuIG9wMQorCSAgICAgICBpcyBpZGVudGljYWwgdG8gcmVzIG9yIG9wMiBpcyBpZGVudGljYWwgdG8gcmVzLiAgKi8KKwkgICAgU0laIChyZXMpID0gcmVzX3NpemU7CisJICAgIG1wbl9hbmRfbiAoTVBaX05FV0FMTE9DIChyZXMsIHJlc19zaXplKSwgb3AxX3B0ciwgb3AyX3B0ciwgcmVzX3NpemUpOworCSAgICByZXR1cm47CisJICB9CisKKyAgICAgIFNJWiAocmVzKSA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVE1QX0RFQ0w7CisKKyAgICAgIG9wMl9zaXplID0gLW9wMl9zaXplOworICAgICAgVE1QX01BUks7CisgICAgICBpZiAob3AxX3NpemUgPCAwKQorCXsKKwkgIG1wX3B0ciBvcHgsIG9weTsKKworCSAgLyogQm90aCBvcGVyYW5kcyBhcmUgbmVnYXRpdmUsIHNvIHdpbGwgYmUgdGhlIHJlc3VsdC4KKwkgICAgIC0oKC1PUDEpICYgKC1PUDIpKSA9IC0ofihPUDEgLSAxKSAmIH4oT1AyIC0gMSkpID0KKwkgICAgID0gfih+KE9QMSAtIDEpICYgfihPUDIgLSAxKSkgKyAxID0KKwkgICAgID0gKChPUDEgLSAxKSB8IChPUDIgLSAxKSkgKyAxICAgICAgKi8KKworCSAgLyogSXQgbWlnaHQgc2VlbSBhcyB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBhbiAoaW52YWxpZCkgcmVzdWx0IHdpdGgKKwkgICAgIGEgbGVhZGluZyB6ZXJvLWxpbWIgaGVyZSB3aGVuIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgb2YgdGhlCisJICAgICB0eXBlIDEsLDAsLC4uLCwuMC4gIEJ1dCBzb21lIGFuYWx5c2lzIHNob3dzIHRoYXQgd2Ugc3VyZWx5CisJICAgICB3b3VsZCBnZXQgY2FycnkgaW50byB0aGUgemVyby1saW1iIGluIHRoaXMgc2l0dWF0aW9uLi4uICAqLworCisJICBvcDFfc2l6ZSA9IC1vcDFfc2l6ZTsKKworCSAgVE1QX0FMTE9DX0xJTUJTXzIgKG9weCwgb3AxX3NpemUsIG9weSwgb3AyX3NpemUpOworCSAgbXBuX3N1Yl8xIChvcHgsIG9wMV9wdHIsIG9wMV9zaXplLCAobXBfbGltYl90KSAxKTsKKwkgIG9wMV9wdHIgPSBvcHg7CisKKwkgIG1wbl9zdWJfMSAob3B5LCBvcDJfcHRyLCBvcDJfc2l6ZSwgKG1wX2xpbWJfdCkgMSk7CisJICBvcDJfcHRyID0gb3B5OworCisJICByZXNfcHRyID0gTVBaX05FV0FMTE9DIChyZXMsIDEgKyBvcDJfc2l6ZSk7CisJICAvKiBEb24ndCByZS1yZWFkIE9QMV9QVFIgYW5kIE9QMl9QVFIuICBUaGV5IHBvaW50IHRvIHRlbXBvcmFyeQorCSAgICAgc3BhY2UtLW5ldmVyIHRvIHRoZSBzcGFjZSBQVFIocmVzKSB1c2VkIHRvIHBvaW50IHRvIGJlZm9yZQorCSAgICAgcmVhbGxvY2F0aW9uLiAgKi8KKworCSAgTVBOX0NPUFkgKHJlc19wdHIgKyBvcDFfc2l6ZSwgb3AyX3B0ciArIG9wMV9zaXplLAorCQkgICAgb3AyX3NpemUgLSBvcDFfc2l6ZSk7CisJICBtcG5faW9yX24gKHJlc19wdHIsIG9wMV9wdHIsIG9wMl9wdHIsIG9wMV9zaXplKTsKKwkgIFRNUF9GUkVFOworCSAgcmVzX3NpemUgPSBvcDJfc2l6ZTsKKworCSAgcmVzX3B0cltyZXNfc2l6ZV0gPSAwOworCSAgTVBOX0lOQ1JfVSAocmVzX3B0ciwgcmVzX3NpemUgKyAxLCAobXBfbGltYl90KSAxKTsKKwkgIHJlc19zaXplICs9IHJlc19wdHJbcmVzX3NpemVdOworCisJICBTSVoocmVzKSA9IC1yZXNfc2l6ZTsKKwl9CisgICAgICBlbHNlCisJeworI2lmIEFORE5FVworCSAgbXBfc2l6ZV90IG9wMl9saW07CisJICBtcF9zaXplX3QgY291bnQ7CisKKwkgIC8qIE9QMiBtdXN0IGJlIG5lZ2F0ZWQgYXMgd2l0aCBpbmZpbml0ZSBwcmVjaXNpb24uCisKKwkgICAgIFNjYW4gZnJvbSB0aGUgbG93IGVuZCBmb3IgYSBub24temVybyBsaW1iLiAgVGhlIGZpcnN0IG5vbi16ZXJvCisJICAgICBsaW1iIGlzIHNpbXBseSBuZWdhdGVkICh0d28ncyBjb21wbGVtZW50KS4gIEFueSBzdWJzZXF1ZW50CisJICAgICBsaW1icyBhcmUgb25lJ3MgY29tcGxlbWVudGVkLiAgT2YgY291cnNlLCB3ZSBkb24ndCBuZWVkIHRvCisJICAgICBoYW5kbGUgbW9yZSBsaW1icyB0aGFuIHRoZXJlIGFyZSBsaW1icyBpbiB0aGUgb3RoZXIsIHBvc2l0aXZlCisJICAgICBvcGVyYW5kIGFzIHRoZSByZXN1bHQgZm9yIHRob3NlIGxpbWJzIGlzIGdvaW5nIHRvIGJlY29tZSB6ZXJvCisJICAgICBhbnl3YXkuICAqLworCisJICAvKiBTY2FuIGZvciB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbm9uLXplcm8gT1AyIGxpbWIsIGFuZCB6ZXJvIHRoZQorCSAgICAgcmVzdWx0IG1lYW53aGlsZSBmb3IgdGhvc2UgbGltYiBwb3NpdGlvbnMuICAoV2Ugd2lsbCBzdXJlbHkKKwkgICAgIGZpbmQgYSBub24temVybyBsaW1iLCBzbyB3ZSBjYW4gd3JpdGUgdGhlIGxvb3Agd2l0aCBvbmUKKwkgICAgIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBvbmx5LikgICovCisJICBmb3IgKGkgPSAwOyBvcDJfcHRyW2ldID09IDA7IGkrKykKKwkgICAgcmVzX3B0cltpXSA9IDA7CisJICBvcDJfbGltID0gaTsKKworCSAgaWYgKG9wMV9zaXplIDw9IG9wMl9zaXplKQorCSAgICB7CisJICAgICAgLyogVGhlIG9uZXMtZXh0ZW5kZWQgT1AyIGlzID49IHRoYW4gdGhlIHplcm8tZXh0ZW5kZWQgT1AxLgorCQkgUkVTX1NJWkUgPD0gT1AxX1NJWkUuICBGaW5kIHRoZSBleGFjdCBzaXplLiAgKi8KKwkgICAgICBmb3IgKGkgPSBvcDFfc2l6ZSAtIDE7IGkgPiBvcDJfbGltOyBpLS0pCisJCWlmICgob3AxX3B0cltpXSAmIH5vcDJfcHRyW2ldKSAhPSAwKQorCQkgIGJyZWFrOworCSAgICAgIHJlc19zaXplID0gaSArIDE7CisJICAgICAgZm9yIChpID0gcmVzX3NpemUgLSAxOyBpID4gb3AyX2xpbTsgaS0tKQorCQlyZXNfcHRyW2ldID0gb3AxX3B0cltpXSAmIH5vcDJfcHRyW2ldOworCSAgICAgIHJlc19wdHJbb3AyX2xpbV0gPSBvcDFfcHRyW29wMl9saW1dICYgLW9wMl9wdHJbb3AyX2xpbV07CisJICAgICAgLyogWWVzLCB0aGlzICpjYW4qIGhhcHBlbiEgICovCisJICAgICAgTVBOX05PUk1BTElaRSAocmVzX3B0ciwgcmVzX3NpemUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGUgb25lcy1leHRlbmRlZCBPUDIgaXMgPCB0aGFuIHRoZSB6ZXJvLWV4dGVuZGVkIE9QMS4KKwkJIFJFU19TSVpFID09IE9QMV9TSVpFLCBzaW5jZSBPUDEgaXMgbm9ybWFsaXplZC4gICovCisJICAgICAgcmVzX3NpemUgPSBvcDFfc2l6ZTsKKwkgICAgICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMl9zaXplLCBvcDFfcHRyICsgb3AyX3NpemUsIG9wMV9zaXplIC0gb3AyX3NpemUpOworCSAgICAgIGZvciAoaSA9IG9wMl9zaXplIC0gMTsgaSA+IG9wMl9saW07IGktLSkKKwkJcmVzX3B0cltpXSA9IG9wMV9wdHJbaV0gJiB+b3AyX3B0cltpXTsKKwkgICAgICByZXNfcHRyW29wMl9saW1dID0gb3AxX3B0cltvcDJfbGltXSAmIC1vcDJfcHRyW29wMl9saW1dOworCSAgICB9CisjZWxzZQorCisJICAvKiBPUDEgaXMgcG9zaXRpdmUgYW5kIHplcm8tZXh0ZW5kZWQsCisJICAgICBPUDIgaXMgbmVnYXRpdmUgYW5kIG9uZXMtZXh0ZW5kZWQuCisJICAgICBUaGUgcmVzdWx0IHdpbGwgYmUgcG9zaXRpdmUuCisJICAgICBPUDEgJiAtT1AyID0gT1AxICYgfihPUDIgLSAxKS4gICovCisKKwkgIG1wX3B0ciBvcHg7CisKKwkgIG9weCA9IFRNUF9BTExPQ19MSU1CUyAob3AyX3NpemUpOworCSAgbXBuX3N1Yl8xIChvcHgsIG9wMl9wdHIsIG9wMl9zaXplLCAobXBfbGltYl90KSAxKTsKKwkgIG9wMl9wdHIgPSBvcHg7CisKKwkgIGlmIChvcDFfc2l6ZSA+IG9wMl9zaXplKQorCSAgICB7CisJICAgICAgLyogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2l6ZSBhcyBPUDEsIHNpbmNlIE9QMSBpcyBub3JtYWxpemVkCisJCSBhbmQgbG9uZ2VyIHRoYW4gdGhlIG9uZXMtZXh0ZW5kZWQgT1AyLiAgKi8KKwkgICAgICByZXNfc2l6ZSA9IG9wMV9zaXplOworCisJICAgICAgLyogSGFuZGxlIGFsbG9jYXRpb24sIG5vdyB0aGVuIHdlIGtub3cgZXhhY3RseSBob3cgbXVjaCBzcGFjZSBpcworCQkgbmVlZGVkIGZvciB0aGUgcmVzdWx0LiAgKi8KKwkgICAgICByZXNfcHRyID0gTVBaX05FV0FMTE9DIChyZXMsIHJlc19zaXplKTsKKwkgICAgICAvKiBEb24ndCByZS1yZWFkIE9QMV9QVFIgb3IgT1AyX1BUUi4gIFNpbmNlIHJlc19zaXplID0gb3AxX3NpemUsCisJCSBvcDEgaXMgbm90IGNoYW5nZWQgaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHJlcy4KKwkJIE9QMl9QVFIgcG9pbnRzIHRvIHRlbXBvcmFyeSBzcGFjZS4gICovCisKKwkgICAgICBtcG5fYW5kbl9uIChyZXNfcHRyLCBvcDFfcHRyLCBvcDJfcHRyLCBvcDJfc2l6ZSk7CisJICAgICAgTVBOX0NPUFkgKHJlc19wdHIgKyBvcDJfc2l6ZSwgb3AxX3B0ciArIG9wMl9zaXplLCByZXNfc2l6ZSAtIG9wMl9zaXplKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRmluZCBvdXQgdGhlIGV4YWN0IHJlc3VsdCBzaXplLiAgSWdub3JlIHRoZSBoaWdoIGxpbWJzIG9mIE9QMiwKKwkJIE9QMSBpcyB6ZXJvLWV4dGVuZGVkIGFuZCB3b3VsZCBtYWtlIHRoZSByZXN1bHQgemVyby4gICovCisJICAgICAgcmVzX3NpemUgPSAwOworCSAgICAgIGZvciAoaSA9IG9wMV9zaXplOyAtLWkgPj0gMDspCisJCWlmICgob3AxX3B0cltpXSAmIH5vcDJfcHRyW2ldKSAhPSAwKQorCQkgIHsKKwkJICAgIHJlc19zaXplID0gaSArIDE7CisJCSAgICAvKiBIYW5kbGUgYWxsb2NhdGlvbiwgbm93IHRoZW4gd2Uga25vdyBleGFjdGx5IGhvdyBtdWNoCisJCSAgICAgICBzcGFjZSBpcyBuZWVkZWQgZm9yIHRoZSByZXN1bHQuICAqLworCQkgICAgLyogRG9uJ3QgcmUtcmVhZCBPUDFfUFRSLiAgU2luY2UgcmVzX3NpemUgPD0gb3AxX3NpemUsCisJCSAgICAgICBvcDEgaXMgbm90IGNoYW5nZWQgaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHJlcy4gIERvbid0CisJCSAgICAgICByZS1yZWFkIE9QMl9QVFIuICBJdCBwb2ludHMgdG8gdGVtcG9yYXJ5IHNwYWNlLS1uZXZlcgorCQkgICAgICAgdG8gdGhlIHNwYWNlIFBUUihyZXMpIHVzZWQgdG8gcG9pbnQgdG8gYmVmb3JlCisJCSAgICAgICByZWFsbG9jYXRpb24uICAqLworCQkgICAgbXBuX2FuZG5fbiAoTVBaX05FV0FMTE9DIChyZXMsIHJlc19zaXplKSwgb3AxX3B0ciwgb3AyX3B0ciwgcmVzX3NpemUpOworCisJCSAgICBicmVhazsKKwkJICB9CisJICAgIH0KKyNlbmRpZgorCSAgU0laKHJlcykgPSByZXNfc2l6ZTsKKwkgIFRNUF9GUkVFOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovYW9ycy5oIGIvbXB6L2FvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJhNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2FvcnMuaApAQCAtMCwwICsxLDEyOSBAQAorLyogbXB6X2FkZCwgbXB6X3N1YiAtLSBhZGQgb3Igc3VidHJhY3QgaW50ZWdlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDExLCAyMDEyLCAyMDIwIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2lmZGVmIE9QRVJBVElPTl9hZGQKKyNkZWZpbmUgRlVOQ1RJT04gICAgIG1wel9hZGQKKyNkZWZpbmUgVkFSSUFUSU9OCisjZW5kaWYKKyNpZmRlZiBPUEVSQVRJT05fc3ViCisjZGVmaW5lIEZVTkNUSU9OICAgICBtcHpfc3ViCisjZGVmaW5lIFZBUklBVElPTiAgICAtCisjZW5kaWYKKworI2lmbmRlZiBGVU5DVElPTgorRXJyb3IsIG5lZWQgT1BFUkFUSU9OX2FkZCBvciBPUEVSQVRJT05fc3ViCisjZW5kaWYKKworCit2b2lkCitGVU5DVElPTiAobXB6X3B0ciB3LCBtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikKK3sKKyAgbXBfc3JjcHRyIHVwLCB2cDsKKyAgbXBfcHRyIHdwOworICBtcF9zaXplX3QgdXNpemUsIHZzaXplLCB3c2l6ZTsKKyAgbXBfc2l6ZV90IGFic191c2l6ZTsKKyAgbXBfc2l6ZV90IGFic192c2l6ZTsKKworICB1c2l6ZSA9IFNJWih1KTsKKyAgdnNpemUgPSBWQVJJQVRJT04gU0laKHYpOworICBhYnNfdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgYWJzX3ZzaXplID0gQUJTICh2c2l6ZSk7CisKKyAgaWYgKGFic191c2l6ZSA8IGFic192c2l6ZSkKKyAgICB7CisgICAgICAvKiBTd2FwIFUgYW5kIFYuICovCisgICAgICBNUFpfU1JDUFRSX1NXQVAgKHUsIHYpOworICAgICAgTVBfU0laRV9UX1NXQVAgKHVzaXplLCB2c2l6ZSk7CisgICAgICBNUF9TSVpFX1RfU1dBUCAoYWJzX3VzaXplLCBhYnNfdnNpemUpOworICAgIH0KKworICAvKiBUcnVlOiBBQlNfVVNJWkUgPj0gQUJTX1ZTSVpFLiAgKi8KKworICAvKiBJZiBub3Qgc3BhY2UgZm9yIHcgKGFuZCBwb3NzaWJsZSBjYXJyeSksIGluY3JlYXNlIHNwYWNlLiAgKi8KKyAgd3NpemUgPSBhYnNfdXNpemUgKyAxOworICB3cCA9IE1QWl9SRUFMTE9DICh3LCB3c2l6ZSk7CisKKyAgLyogVGhlc2UgbXVzdCBiZSBhZnRlciByZWFsbG9jICh1IG9yIHYgbWF5IGJlIHRoZSBzYW1lIGFzIHcpLiAgKi8KKyAgdXAgPSBQVFIodSk7CisgIHZwID0gUFRSKHYpOworCisgIGlmICgodXNpemUgXiB2c2l6ZSkgPCAwKQorICAgIHsKKyAgICAgIC8qIFUgYW5kIFYgaGF2ZSBkaWZmZXJlbnQgc2lnbi4gIE5lZWQgdG8gY29tcGFyZSB0aGVtIHRvIGRldGVybWluZQorCSB3aGljaCBvcGVyYW5kIHRvIHN1YnRyYWN0IGZyb20gd2hpY2guICAqLworCisgICAgICAvKiBUaGlzIHRlc3QgaXMgcmlnaHQgc2luY2UgQUJTX1VTSVpFID49IEFCU19WU0laRS4gICovCisgICAgICBpZiAoYWJzX3VzaXplICE9IGFic192c2l6ZSkKKwl7CisJICBtcG5fc3ViICh3cCwgdXAsIGFic191c2l6ZSwgdnAsIGFic192c2l6ZSk7CisJICB3c2l6ZSA9IGFic191c2l6ZTsKKwkgIE1QTl9OT1JNQUxJWkVfTk9UX1pFUk8gKHdwLCB3c2l6ZSk7CisJICBpZiAodXNpemUgPCAwKQorCSAgICB3c2l6ZSA9IC13c2l6ZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IGNtcCA9IG1wbl9jbXAgKHVwLCB2cCwgYWJzX3VzaXplKTsKKwkgIGlmIChjbXAgPCAwKQorCSAgICB7CisJICAgICAgbXBuX3N1Yl9uICh3cCwgdnAsIHVwLCBhYnNfdXNpemUpOworCSAgICAgIHdzaXplID0gYWJzX3VzaXplOworCSAgICAgIE1QTl9OT1JNQUxJWkVfTk9UX1pFUk8gKHdwLCB3c2l6ZSk7CisJICAgICAgaWYgKHVzaXplID49IDApCisJCXdzaXplID0gLXdzaXplOworCSAgICB9CisJICBlbHNlIGlmIChjbXAgPiAwKQorCSAgICB7CisJICAgICAgbXBuX3N1Yl9uICh3cCwgdXAsIHZwLCBhYnNfdXNpemUpOworCSAgICAgIHdzaXplID0gYWJzX3VzaXplOworCSAgICAgIE1QTl9OT1JNQUxJWkVfTk9UX1pFUk8gKHdwLCB3c2l6ZSk7CisJICAgICAgaWYgKHVzaXplIDwgMCkKKwkJd3NpemUgPSAtd3NpemU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgd3NpemUgPSAwOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBVIGFuZCBWIGhhdmUgc2FtZSBzaWduLiAgQWRkIHRoZW0uICAqLworICAgICAgbXBfbGltYl90IGN5X2xpbWIgPSBtcG5fYWRkICh3cCwgdXAsIGFic191c2l6ZSwgdnAsIGFic192c2l6ZSk7CisgICAgICB3cFthYnNfdXNpemVdID0gY3lfbGltYjsKKyAgICAgIHdzaXplID0gYWJzX3VzaXplICsgY3lfbGltYjsKKyAgICAgIGlmICh1c2l6ZSA8IDApCisJd3NpemUgPSAtd3NpemU7CisgICAgfQorCisgIFNJWih3KSA9IHdzaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L2FvcnNfdWkuaCBiL21wei9hb3JzX3VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjNDY3YgotLS0gL2Rldi9udWxsCisrKyBiL21wei9hb3JzX3VpLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIG1wel9hZGRfdWksIG1wel9zdWJfdWkgLS0gQWRkIG9yIHN1YnRyYWN0IGFuIG1wel90IGFuZCBhbiB1bnNpZ25lZAorICAgb25lLXdvcmQgaW50ZWdlci4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTktMjAwMiwgMjAwNCwgMjAxMiwgMjAxMywgMjAxNSwKKzIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZmRlZiBPUEVSQVRJT05fYWRkX3VpCisjZGVmaW5lIEZVTkNUSU9OICAgICAgICAgIG1wel9hZGRfdWkKKyNkZWZpbmUgRlVOQ1RJT04yICAgICAgICAgbXB6X2FkZAorI2RlZmluZSBWQVJJQVRJT05fQ01QICAgICA+PQorI2RlZmluZSBWQVJJQVRJT05fTkVHCisjZGVmaW5lIFZBUklBVElPTl9VTk5FRyAgIC0KKyNlbmRpZgorCisjaWZkZWYgT1BFUkFUSU9OX3N1Yl91aQorI2RlZmluZSBGVU5DVElPTiAgICAgICAgICBtcHpfc3ViX3VpCisjZGVmaW5lIEZVTkNUSU9OMiAgICAgICAgIG1wel9zdWIKKyNkZWZpbmUgVkFSSUFUSU9OX0NNUCAgICAgPAorI2RlZmluZSBWQVJJQVRJT05fTkVHICAgICAtCisjZGVmaW5lIFZBUklBVElPTl9VTk5FRworI2VuZGlmCisKKyNpZm5kZWYgRlVOQ1RJT04KK0Vycm9yLCBuZWVkIE9QRVJBVElPTl9hZGRfdWkgb3IgT1BFUkFUSU9OX3N1Yl91aQorI2VuZGlmCisKKwordm9pZAorRlVOQ1RJT04gKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1LCB1bnNpZ25lZCBsb25nIGludCB2dmFsKQoreworICBtcF9zcmNwdHIgdXA7CisgIG1wX3B0ciB3cDsKKyAgbXBfc2l6ZV90IHVzaXplLCB3c2l6ZTsKKyAgbXBfc2l6ZV90IGFic191c2l6ZTsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmICh2dmFsID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wel90IHY7CisgICAgICBtcF9saW1iX3QgdmxbMl07CisgICAgICBQVFIodikgPSB2bDsKKyAgICAgIHZsWzBdID0gdnZhbCAmIEdNUF9OVU1CX01BU0s7CisgICAgICB2bFsxXSA9IHZ2YWwgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIFNJWih2KSA9IDI7CisgICAgICBGVU5DVElPTjIgKHcsIHUsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgIHVzaXplID0gU0laICh1KTsKKyAgaWYgKHVzaXplID09IDApCisgICAgeworICAgICAgTVBaX05FV0FMTE9DICh3LCAxKVswXSA9IHZ2YWw7CisgICAgICBTSVogKHcpID0gVkFSSUFUSU9OX05FRyAodnZhbCAhPSAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYWJzX3VzaXplID0gQUJTICh1c2l6ZSk7CisKKyAgaWYgKHVzaXplIFZBUklBVElPTl9DTVAgMCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgY3k7CisKKyAgICAgIC8qIElmIG5vdCBzcGFjZSBmb3IgVyAoYW5kIHBvc3NpYmxlIGNhcnJ5KSwgaW5jcmVhc2Ugc3BhY2UuICAqLworICAgICAgd3AgPSBNUFpfUkVBTExPQyAodywgYWJzX3VzaXplICsgMSk7CisgICAgICAvKiBUaGVzZSBtdXN0IGJlIGFmdGVyIHJlYWxsb2MgKFUgbWF5IGJlIHRoZSBzYW1lIGFzIFcpLiAgKi8KKyAgICAgIHVwID0gUFRSICh1KTsKKworICAgICAgY3kgPSBtcG5fYWRkXzEgKHdwLCB1cCwgYWJzX3VzaXplLCAobXBfbGltYl90KSB2dmFsKTsKKyAgICAgIHdwW2Fic191c2l6ZV0gPSBjeTsKKyAgICAgIHdzaXplID0gVkFSSUFUSU9OX05FRyAoYWJzX3VzaXplICsgY3kpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIG5vdCBzcGFjZSBmb3IgVywgaW5jcmVhc2Ugc3BhY2UuICAqLworICAgICAgd3AgPSBNUFpfUkVBTExPQyAodywgYWJzX3VzaXplKTsKKyAgICAgIC8qIFRoZXNlIG11c3QgYmUgYWZ0ZXIgcmVhbGxvYyAoVSBtYXkgYmUgdGhlIHNhbWUgYXMgVykuICAqLworICAgICAgdXAgPSBQVFIgKHUpOworCisgICAgICAvKiBUaGUgc2lnbnMgYXJlIGRpZmZlcmVudC4gIE5lZWQgZXhhY3QgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUKKwkgd2hpY2ggb3BlcmFuZCB0byBzdWJ0cmFjdCBmcm9tIHdoaWNoLiAgKi8KKyAgICAgIGlmIChhYnNfdXNpemUgPT0gMSAmJiB1cFswXSA8IHZ2YWwpCisJeworCSAgd3BbMF0gPSB2dmFsIC0gdXBbMF07CisJICB3c2l6ZSA9IFZBUklBVElPTl9ORUcgMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXBuX3N1Yl8xICh3cCwgdXAsIGFic191c2l6ZSwgKG1wX2xpbWJfdCkgdnZhbCk7CisJICAvKiBTaXplIGNhbiBkZWNyZWFzZSB3aXRoIGF0IG1vc3Qgb25lIGxpbWIuICAqLworCSAgd3NpemUgPSBWQVJJQVRJT05fVU5ORUcgKGFic191c2l6ZSAtICh3cFthYnNfdXNpemUgLSAxXSA9PSAwKSk7CisJfQorICAgIH0KKworICBTSVogKHcpID0gd3NpemU7Cit9CmRpZmYgLS1naXQgYS9tcHovYW9yc211bC5jIGIvbXB6L2FvcnNtdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc2NmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2FvcnNtdWwuYwpAQCAtMCwwICsxLDE3OSBAQAorLyogbXB6X2FkZG11bCwgbXB6X3N1Ym11bCAtLSBhZGQgb3Igc3VidHJhY3QgbXVsdGlwbGUuCisKK0NvcHlyaWdodCAyMDAxLCAyMDA0LCAyMDA1LCAyMDEyLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBleHBlY3RpbmcgeCBhbmQgeSBib3RoIHdpdGggbm9uLXplcm8gaGlnaCBsaW1icyAqLworI2RlZmluZSBtcG5fY21wX3R3b3NpemVzX2x0KHhwLHhzaXplLCB5cCx5c2l6ZSkgICAgICAgICAgICAgICAgIFwKKyAgKCh4c2l6ZSkgPCAoeXNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB8fCAoKHhzaXplKSA9PSAoeXNpemUpICYmIG1wbl9jbXAgKHhwLCB5cCwgeHNpemUpIDwgMCkpCisKKworLyogc3ViPj0wIG1lYW5zIGFuIGFkZG11bCB3ICs9IHgqeSwgc3ViPDAgbWVhbnMgYSBzdWJtdWwgdyAtPSB4KnkuCisKKyAgIFRoZSBzaWducyBvZiB3LCB4IGFuZCB5IGFyZSBmdWxseSBhY2NvdW50ZWQgZm9yIGJ5IGVhY2ggZmxpcHBpbmcgInN1YiIuCisKKyAgIFRoZSBzaWduIG9mIHcgaXMgcmV0YWluZWQgZm9yIHRoZSByZXN1bHQsIHVubGVzcyB0aGUgYWJzb2x1dGUgdmFsdWUKKyAgIHN1Ym11bCB1bmRlcmZsb3dzLCBpbiB3aGljaCBjYXNlIGl0IGZsaXBzLiAgKi8KKworc3RhdGljIHZvaWQgX19nbXB6X2FvcnNtdWwgKFJFR1BBUk1fM18xIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgeCwgbXB6X3NyY3B0ciB5LCBtcF9zaXplX3Qgc3ViKSkgUkVHUEFSTV9BVFRSICgxKTsKKyNkZWZpbmUgbXB6X2FvcnNtdWwodyx4LHksc3ViKSAgX19nbXB6X2FvcnNtdWwgKFJFR1BBUk1fM18xICh3LCB4LCB5LCBzdWIpKQorCitSRUdQQVJNX0FUVFIgKDEpIHN0YXRpYyB2b2lkCittcHpfYW9yc211bCAobXB6X3B0ciB3LCBtcHpfc3JjcHRyIHgsIG1wel9zcmNwdHIgeSwgbXBfc2l6ZV90IHN1YikKK3sKKyAgbXBfc2l6ZV90ICB4c2l6ZSwgeXNpemUsIHRzaXplLCB3c2l6ZSwgd3NpemVfc2lnbmVkOworICBtcF9wdHIgICAgIHdwLCB0cDsKKyAgbXBfbGltYl90ICBjOworICBUTVBfREVDTDsKKworICAvKiB3IHVuYWZmZWN0ZWQgaWYgeD09MCBvciB5PT0wICovCisgIHhzaXplID0gU0laKHgpOworICB5c2l6ZSA9IFNJWih5KTsKKyAgaWYgKHhzaXplID09IDAgfHwgeXNpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogbWFrZSB4IHRoZSBiaWdnZXIgb2YgdGhlIHR3byAqLworICBpZiAoQUJTKHlzaXplKSA+IEFCUyh4c2l6ZSkpCisgICAgeworICAgICAgTVBaX1NSQ1BUUl9TV0FQICh4LCB5KTsKKyAgICAgIE1QX1NJWkVfVF9TV0FQICh4c2l6ZSwgeXNpemUpOworICAgIH0KKworICBzdWIgXj0geXNpemU7CisgIHlzaXplID0gQUJTKHlzaXplKTsKKworICAvKiB1c2UgbXBuX2FkZG11bF8xL21wbl9zdWJtdWxfMSBpZiBwb3NzaWJsZSAqLworICBpZiAoeXNpemUgPT0gMSkKKyAgICB7CisgICAgICBtcHpfYW9yc211bF8xICh3LCB4LCBQVFIoeSlbMF0sIHN1Yik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN1YiBePSB4c2l6ZTsKKyAgeHNpemUgPSBBQlMoeHNpemUpOworCisgIHdzaXplX3NpZ25lZCA9IFNJWih3KTsKKyAgc3ViIF49IHdzaXplX3NpZ25lZDsKKyAgd3NpemUgPSBBQlMod3NpemVfc2lnbmVkKTsKKworICB0c2l6ZSA9IHhzaXplICsgeXNpemU7CisgIHdwID0gTVBaX1JFQUxMT0MgKHcsIE1BWCAod3NpemUsIHRzaXplKSArIDEpOworCisgIGlmICh3c2l6ZV9zaWduZWQgPT0gMCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGhpZ2g7CisgICAgICAvKiBOb3RoaW5nIHRvIGFkZCB0bywganVzdCBzZXQgdz14KnkuICBObyB3PT14IG9yIHc9PXkgb3ZlcmxhcCBoZXJlLAorCSBzaW5jZSB3ZSBrbm93IHgseSE9MCBidXQgdz09MC4gICovCisgICAgICBpZiAoeCA9PSB5KQorCXsKKwkgIG1wbl9zcXIgKHdwLCBQVFIoeCkseHNpemUpOworCSAgaGlnaCA9IHdwW3RzaXplLTFdOworCX0KKyAgICAgIGVsc2UKKwloaWdoID0gbXBuX211bCAod3AsIFBUUih4KSx4c2l6ZSwgUFRSKHkpLHlzaXplKTsKKyAgICAgIHRzaXplIC09IChoaWdoID09IDApOworICAgICAgU0laKHcpID0gKHN1YiA+PSAwID8gdHNpemUgOiAtdHNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBUTVBfTUFSSzsKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRzaXplKTsKKworICBpZiAoeCA9PSB5KQorICAgIHsKKyAgICAgIG1wbl9zcXIgKHRwLCBQVFIoeCkseHNpemUpOworICAgICAgdHNpemUgLT0gKHRwW3RzaXplLTFdID09IDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBoaWdoOworICAgICAgaGlnaCA9IG1wbl9tdWwgKHRwLCBQVFIoeCkseHNpemUsIFBUUih5KSx5c2l6ZSk7CisgICAgICB0c2l6ZSAtPSAoaGlnaCA9PSAwKTsKKyAgICB9CisgIEFTU0VSVCAodHBbdHNpemUtMV0gIT0gMCk7CisgIGlmIChzdWIgPj0gMCkKKyAgICB7CisgICAgICBtcF9zcmNwdHIgdXAgICAgPSB3cDsKKyAgICAgIG1wX3NpemVfdCB1c2l6ZSA9IHdzaXplOworCisgICAgICBpZiAodXNpemUgPCB0c2l6ZSkKKwl7CisJICB1cAk9IHRwOworCSAgdXNpemUgPSB0c2l6ZTsKKwkgIHRwCT0gd3A7CisJICB0c2l6ZSA9IHdzaXplOworCisJICB3c2l6ZSA9IHVzaXplOworCX0KKworICAgICAgYyA9IG1wbl9hZGQgKHdwLCB1cCx1c2l6ZSwgdHAsdHNpemUpOworICAgICAgd3Bbd3NpemVdID0gYzsKKyAgICAgIHdzaXplICs9IChjICE9IDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3NyY3B0ciB1cCAgICA9IHdwOworICAgICAgbXBfc2l6ZV90IHVzaXplID0gd3NpemU7CisKKyAgICAgIGlmIChtcG5fY21wX3R3b3NpemVzX2x0ICh1cCx1c2l6ZSwgdHAsdHNpemUpKQorCXsKKwkgIHVwCT0gdHA7CisJICB1c2l6ZSA9IHRzaXplOworCSAgdHAJPSB3cDsKKwkgIHRzaXplID0gd3NpemU7CisKKwkgIHdzaXplID0gdXNpemU7CisJICB3c2l6ZV9zaWduZWQgPSAtd3NpemVfc2lnbmVkOworCX0KKworICAgICAgQVNTRVJUX05PQ0FSUlkgKG1wbl9zdWIgKHdwLCB1cCx1c2l6ZSwgdHAsdHNpemUpKTsKKyAgICAgIHdzaXplID0gdXNpemU7CisgICAgICBNUE5fTk9STUFMSVpFICh3cCwgd3NpemUpOworICAgIH0KKworICBTSVoodykgPSAod3NpemVfc2lnbmVkID49IDAgPyB3c2l6ZSA6IC13c2l6ZSk7CisKKyAgVE1QX0ZSRUU7Cit9CisKKwordm9pZAorbXB6X2FkZG11bCAobXB6X3B0ciB3LCBtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikKK3sKKyAgbXB6X2FvcnNtdWwgKHcsIHUsIHYsIChtcF9zaXplX3QpIDApOworfQorCit2b2lkCittcHpfc3VibXVsIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSwgbXB6X3NyY3B0ciB2KQoreworICBtcHpfYW9yc211bCAodywgdSwgdiwgKG1wX3NpemVfdCkgLTEpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2FvcnNtdWxfaS5jIGIvbXB6L2FvcnNtdWxfaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2JlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovYW9yc211bF9pLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qIG1wel9hZGRtdWxfdWksIG1wel9zdWJtdWxfdWkgLSBhZGQgb3Igc3VidHJhY3Qgc21hbGwgbXVsdGlwbGUuCisKKyAgIFRIRSBtcHpfYW9yc211bF8xIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBGT1IgSU5URVJOQUwgVVNFIE9OTFkgQU5EIElTCisgICBBTE1PU1QgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUgorICAgQ09NUExFVEVMWSBJTiBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAxMiwgMjAyMSwgMjAyMiBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzFjCisjZGVmaW5lIE1QTl9NVUxfMUMoY291dCwgZHN0LCBzcmMsIHNpemUsIG4sIGNpbikgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3V0KSA9IG1wbl9tdWxfMWMgKGRzdCwgc3JjLCBzaXplLCBuLCBjaW4pOyAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBNUE5fTVVMXzFDKGNvdXQsIGRzdCwgc3JjLCBzaXplLCBuLCBjaW4pICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgX19jeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fY3kgPSBtcG5fbXVsXzEgKGRzdCwgc3JjLCBzaXplLCBuKTsgICAgICAgICAgICAgICBcCisgICAgKGNvdXQpID0gX19jeSArIG1wbl9hZGRfMSAoZHN0LCBkc3QsIHNpemUsIGNpbik7ICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIHN1Yj49MCBtZWFucyBhbiBhZGRtdWwgdyArPSB4KnksIHN1YjwwIG1lYW5zIGEgc3VibXVsIHcgLT0geCp5LgorCisgICBBbGwgdGhhdCdzIG5lZWRlZCB0byBhY2NvdW50IGZvciBuZWdhdGl2ZSB3IG9yIHggaXMgdG8gZmxpcCAic3ViIi4KKworICAgVGhlIGZpbmFsIHcgd2lsbCByZXRhaW4gaXRzIHNpZ24sIHVubGVzcyBhbiB1bmRlcmZsb3cgb2NjdXJzIGluIGEgc3VibXVsCisgICBvZiBhYnNvbHV0ZSB2YWx1ZXMsIGluIHdoaWNoIGNhc2UgaXQncyBmbGlwcGVkLgorCisgICBJZiB4IGhhcyBtb3JlIGxpbWJzIHRoYW4gdywgdGhlbiBtcG5fc3VibXVsXzEgZm9sbG93ZWQgYnkgbXBuX2NvbSBpcworICAgdXNlZC4gIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSBtcG5fbXVsXzEgaW50byB0ZW1wb3Jhcnkgc3BhY2UgZm9sbG93ZWQKKyAgIGJ5IG1wbl9zdWJfbi4gIEF2b2lkaW5nIHRlbXBvcmFyeSBzcGFjZSBzZWVtIGdvb2QsIGFuZCBzdWJtdWwrY29tIHN0YW5kcworICAgYSBjaGFuY2Ugb2YgYmVpbmcgZmFzdGVyIHNpbmNlIGl0IGludm9sdmVzIG9ubHkgb25lIHNldCBvZiBjYXJyeQorICAgcHJvcGFnYXRpb25zLCBub3QgdHdvLiAgTm90ZSB0aGF0IGRvaW5nIGFuIGFkZG11bF8xIHdpdGggYQorICAgdHdvcy1jb21wbGVtZW50IG5lZ2F0aXZlIHkgZG9lc24ndCB3b3JrLCBiZWNhdXNlIGl0IGVmZmVjdGl2ZWx5IGFkZHMgYW4KKyAgIGV4dHJhIHggKiAyXkdNUF9MSU1CX0JJVFMuICAqLworCitSRUdQQVJNX0FUVFIoMSkgdm9pZAorbXB6X2FvcnNtdWxfMSAobXB6X3B0ciB3LCBtcHpfc3JjcHRyIHgsIG1wX2xpbWJfdCB5LCBtcF9zaXplX3Qgc3ViKQoreworICBtcF9zaXplX3QgIHhzaXplLCB3c2l6ZSwgd3NpemVfc2lnbmVkLCBuZXdfd3NpemUsIG1pbl9zaXplLCBkc2l6ZTsKKyAgbXBfc3JjcHRyICB4cDsKKyAgbXBfcHRyICAgICB3cDsKKyAgbXBfbGltYl90ICBjeTsKKworICAvKiB3IHVuYWZmZWN0ZWQgaWYgeD09MCBvciB5PT0wICovCisgIHhzaXplID0gU0laICh4KTsKKyAgaWYgKHhzaXplID09IDAgfHwgeSA9PSAwKQorICAgIHJldHVybjsKKworICBzdWIgXj0geHNpemU7CisgIHhzaXplID0gQUJTICh4c2l6ZSk7CisKKyAgd3NpemVfc2lnbmVkID0gU0laICh3KTsKKyAgaWYgKHdzaXplX3NpZ25lZCA9PSAwKQorICAgIHsKKyAgICAgIC8qIG5vdGhpbmcgdG8gYWRkIHRvLCBqdXN0IHNldCB4KnksICJzdWIiIGdpdmVzIHRoZSBzaWduICovCisgICAgICB3cCA9IE1QWl9ORVdBTExPQyAodywgeHNpemUrMSk7CisgICAgICBjeSA9IG1wbl9tdWxfMSAod3AsIFBUUih4KSwgeHNpemUsIHkpOworICAgICAgd3BbeHNpemVdID0gY3k7CisgICAgICB4c2l6ZSArPSAoY3kgIT0gMCk7CisgICAgICBTSVogKHcpID0gKHN1YiA+PSAwID8geHNpemUgOiAteHNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzdWIgXj0gd3NpemVfc2lnbmVkOworICB3c2l6ZSA9IEFCUyAod3NpemVfc2lnbmVkKTsKKworICBuZXdfd3NpemUgPSBNQVggKHdzaXplLCB4c2l6ZSk7CisgIHdwID0gTVBaX1JFQUxMT0MgKHcsIG5ld193c2l6ZSsxKTsKKyAgeHAgPSBQVFIgKHgpOworICBtaW5fc2l6ZSA9IE1JTiAod3NpemUsIHhzaXplKTsKKworICBpZiAoc3ViID49IDApCisgICAgeworICAgICAgLyogYWRkbXVsIG9mIGFic29sdXRlIHZhbHVlcyAqLworCisgICAgICBjeSA9IG1wbl9hZGRtdWxfMSAod3AsIHhwLCBtaW5fc2l6ZSwgeSk7CisgICAgICB3cCArPSBtaW5fc2l6ZTsKKyAgICAgIHhwICs9IG1pbl9zaXplOworCisgICAgICBkc2l6ZSA9IHhzaXplIC0gd3NpemU7CisjaWYgSEFWRV9OQVRJVkVfbXBuX211bF8xYworICAgICAgaWYgKGRzaXplID4gMCkKKwljeSA9IG1wbl9tdWxfMWMgKHdwLCB4cCwgZHNpemUsIHksIGN5KTsKKyAgICAgIGVsc2UgaWYgKGRzaXplIDwgMCkKKwl7CisJICBkc2l6ZSA9IC1kc2l6ZTsKKwkgIGN5ID0gbXBuX2FkZF8xICh3cCwgd3AsIGRzaXplLCBjeSk7CisJfQorI2Vsc2UKKyAgICAgIGlmIChkc2l6ZSAhPSAwKQorCXsKKwkgIG1wX2xpbWJfdCAgY3kyOworCSAgaWYgKGRzaXplID4gMCkKKwkgICAgY3kyID0gbXBuX211bF8xICh3cCwgeHAsIGRzaXplLCB5KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGRzaXplID0gLWRzaXplOworCSAgICAgIGN5MiA9IDA7CisJICAgIH0KKwkgIGN5ID0gY3kyICsgbXBuX2FkZF8xICh3cCwgd3AsIGRzaXplLCBjeSk7CisJfQorI2VuZGlmCisKKyAgICAgIHdwW2RzaXplXSA9IGN5OworICAgICAgbmV3X3dzaXplICs9IChjeSAhPSAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBzdWJtdWwgb2YgYWJzb2x1dGUgdmFsdWVzICovCisKKyAgICAgIGN5ID0gbXBuX3N1Ym11bF8xICh3cCwgeHAsIG1pbl9zaXplLCB5KTsKKyAgICAgIGlmICh3c2l6ZSA+PSB4c2l6ZSkKKwl7CisJICAvKiBpZiB3IGJpZ2dlciB0aGFuIHgsIHRoZW4gcHJvcGFnYXRlIGJvcnJvdyB0aHJvdWdoIGl0ICovCisJICBpZiAod3NpemUgIT0geHNpemUpCisJICAgIGN5ID0gbXBuX3N1Yl8xICh3cCt4c2l6ZSwgd3AreHNpemUsIHdzaXplLXhzaXplLCBjeSk7CisKKwkgIGlmIChjeSAhPSAwKQorCSAgICB7CisJICAgICAgLyogQm9ycm93IG91dCBvZiB3LCB0YWtlIHR3b3MgY29tcGxlbWVudCBuZWdhdGl2ZSB0byBnZXQKKwkJIGFic29sdXRlIHZhbHVlLCBmbGlwIHNpZ24gb2Ygdy4gICovCisJICAgICAgY3kgLT0gbXBuX25lZyAod3AsIHdwLCBuZXdfd3NpemUpOworCSAgICAgIHdwW25ld193c2l6ZV0gPSBjeTsKKwkgICAgICBuZXdfd3NpemUgKz0gKGN5ICE9IDApOworCSAgICAgIHdzaXplX3NpZ25lZCA9IC13c2l6ZV9zaWduZWQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlIC8qIHdzaXplIDwgeHNpemUgKi8KKwl7CisJICAvKiB4IGJpZ2dlciB0aGFuIHcsIHNvIHdhbnQgeCp5LXcuICBTdWJtdWwgaGFzIGdpdmVuIHcteCp5LCBzbworCSAgICAgdGFrZSB0d29zIGNvbXBsZW1lbnQgYW5kIHVzZSBhbiBtcG5fbXVsXzEgZm9yIHRoZSByZXN0LiAgKi8KKworCSAgbXBfbGltYl90ICBjeTI7CisKKwkgIC8qIC0oLWN5KmJebiArIHcteCp5KSA9IChjeS0xKSpiXm4gKyB+KHcteCp5KSArIDEgKi8KKwkgIGN5IC09IG1wbl9uZWcgKHdwLCB3cCwgd3NpemUpOworCisJICAvKiBJZiBjeS0xID09IC0xIHRoZW4gaG9sZCB0aGF0IC0xIGZvciBsYXR0ZXIuICBtcG5fc3VibXVsXzEgbmV2ZXIKKwkgICAgIHJldHVybnMgY3k9PU1QX0xJTUJfVF9NQVggc28gdGhhdCB2YWx1ZSBhbHdheXMgaW5kaWNhdGVzIGEgLTEuICovCisJICBjeTIgPSAoY3kgPT0gTVBfTElNQl9UX01BWCk7CisJICBjeSArPSBjeTI7CisJICBNUE5fTVVMXzFDIChjeSwgd3Ard3NpemUsIHhwK3dzaXplLCB4c2l6ZS13c2l6ZSwgeSwgY3kpOworCSAgd3BbbmV3X3dzaXplXSA9IGN5OworCSAgbmV3X3dzaXplICs9IChjeSAhPSAwKTsKKworCSAgLyogQXBwbHkgYW55IC0xIGZyb20gYWJvdmUuICBUaGUgdmFsdWUgYXQgd3Ard3NpemUgaXMgbm9uLXplcm8KKwkgICAgIGJlY2F1c2UgeSE9MCBhbmQgdGhlIGhpZ2ggbGltYiBvZiB4IHdpbGwgYmUgbm9uLXplcm8uICAqLworCSAgaWYgKGN5MikKKwkgICAgTVBOX0RFQ1JfVSAod3Ard3NpemUsIG5ld193c2l6ZS13c2l6ZSwgQ05TVF9MSU1CKDEpKTsKKworCSAgd3NpemVfc2lnbmVkID0gLXdzaXplX3NpZ25lZDsKKwl9CisKKyAgICAgIC8qIHN1Ym11bCBjYW4gcHJvZHVjZSBoaWdoIHplcm8gbGltYnMgZHVlIHRvIGNhbmNlbGxhdGlvbiwgYm90aCB3aGVuIHcKKwkgaGFzIG1vcmUgbGltYnMgb3IgeCBoYXMgbW9yZSAgKi8KKyAgICAgIE1QTl9OT1JNQUxJWkUgKHdwLCBuZXdfd3NpemUpOworICAgIH0KKworICBTSVogKHcpID0gKHdzaXplX3NpZ25lZCA+PSAwID8gbmV3X3dzaXplIDogLW5ld193c2l6ZSk7CisKKyAgQVNTRVJUIChuZXdfd3NpemUgPT0gMCB8fCBQVFIodylbbmV3X3dzaXplLTFdICE9IDApOworfQorCisKK3ZvaWQKK21wel9hZGRtdWxfdWkgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB4LCB1bnNpZ25lZCBsb25nIHkpCit7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIGlmIChVTkxJS0VMWSAoeSA+IEdNUF9OVU1CX01BWCkpCisgICAgeworICAgICAgbXB6X3QgdDsKKyAgICAgIG1wX3B0ciB0cDsKKyAgICAgIG1wX3NpemVfdCB4bjsKKyAgICAgIFRNUF9ERUNMOworICAgICAgVE1QX01BUks7CisgICAgICB4biA9IFNJWiAoeCk7CisgICAgICBpZiAoeG4gPT0gMCkgcmV0dXJuOworICAgICAgTVBaX1RNUF9JTklUICh0LCBBQlMgKHhuKSArIDEpOworICAgICAgdHAgPSBQVFIgKHQpOworICAgICAgdHBbMF0gPSAwOworICAgICAgTVBOX0NPUFkgKHRwICsgMSwgUFRSKHgpLCBBQlMgKHhuKSk7CisgICAgICBTSVoodCkgPSB4biA+PSAwID8geG4gKyAxIDogeG4gLSAxOworICAgICAgbXB6X2FvcnNtdWxfMSAodywgdCwgKG1wX2xpbWJfdCkgeSA+PiBHTVBfTlVNQl9CSVRTLCAobXBfc2l6ZV90KSAwKTsKKyAgICAgIFBUUih0KSA9IHRwICsgMTsKKyAgICAgIFNJWih0KSA9IHhuOworICAgICAgbXB6X2FvcnNtdWxfMSAodywgdCwgKG1wX2xpbWJfdCkgeSAmIEdNUF9OVU1CX01BU0ssIChtcF9zaXplX3QpIDApOworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgIG1wel9hb3JzbXVsXzEgKHcsIHgsIChtcF9saW1iX3QpIHksIChtcF9zaXplX3QpIDApOworfQorCit2b2lkCittcHpfc3VibXVsX3VpIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgeCwgdW5zaWduZWQgbG9uZyB5KQoreworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUworICBpZiAoeSA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcHpfdCB0OworICAgICAgbXBfcHRyIHRwOworICAgICAgbXBfc2l6ZV90IHhuOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIHhuID0gU0laICh4KTsKKyAgICAgIGlmICh4biA9PSAwKSByZXR1cm47CisgICAgICBNUFpfVE1QX0lOSVQgKHQsIEFCUyAoeG4pICsgMSk7CisgICAgICB0cCA9IFBUUiAodCk7CisgICAgICB0cFswXSA9IDA7CisgICAgICBNUE5fQ09QWSAodHAgKyAxLCBQVFIoeCksIEFCUyAoeG4pKTsKKyAgICAgIFNJWih0KSA9IHhuID49IDAgPyB4biArIDEgOiB4biAtIDE7CisgICAgICBtcHpfYW9yc211bF8xICh3LCB0LCAobXBfbGltYl90KSB5ID4+IEdNUF9OVU1CX0JJVFMsIChtcF9zaXplX3QpIC0xKTsKKyAgICAgIFBUUih0KSA9IHRwICsgMTsKKyAgICAgIFNJWih0KSA9IHhuOworICAgICAgbXB6X2FvcnNtdWxfMSAodywgdCwgKG1wX2xpbWJfdCkgeSAmIEdNUF9OVU1CX01BU0ssIChtcF9zaXplX3QpIC0xKTsKKyAgICAgIFRNUF9GUkVFOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICBtcHpfYW9yc211bF8xICh3LCB4LCAobXBfbGltYl90KSB5ICYgR01QX05VTUJfTUFTSywgKG1wX3NpemVfdCkgLTEpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2FycmF5X2luaXQuYyBiL21wei9hcnJheV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5N2YzNAotLS0gL2Rldi9udWxsCisrKyBiL21wei9hcnJheV9pbml0LmMKQEAgLTAsMCArMSw0OSBAQAorLyogbXB6X2FycmF5X2luaXQgKGFycmF5LCBhcnJheV9zaXplLCBzaXplX3Blcl9lbGVtKSAtLQorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAwLTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfYXJyYXlfaW5pdCAobXB6X3B0ciBhcnIsIG1wX3NpemVfdCBhcnJfc2l6ZSwgbXBfc2l6ZV90IG5iaXRzKQoreworICBtcF9wdHIgcDsKKyAgbXBfc2l6ZV90IGk7CisgIG1wX3NpemVfdCBubGltYnM7CisKKyAgbmxpbWJzID0gbmJpdHMgLyBHTVBfTlVNQl9CSVRTICsgMTsKKyAgcCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfTElNQlMgKGFycl9zaXplICogbmxpbWJzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXJyX3NpemU7IGkrKykKKyAgICB7CisgICAgICBBTExPQyAoJmFycltpXSkgPSBubGltYnMgKyAxOyAvKiBZZXMsIGxpZSBhIGxpdHRsZS4uLiAqLworICAgICAgU0laICgmYXJyW2ldKSA9IDA7CisgICAgICBQVFIgKCZhcnJbaV0pID0gcCArIGkgKiBubGltYnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXB6L2Jpbl91aS5jIGIvbXB6L2Jpbl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2QzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovYmluX3VpLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qIG1wel9iaW5fdWkoUkVTVUxULCBOLCBLKSAtLSBTZXQgUkVTVUxUIHRvIE4gb3ZlciBLLgorCitDb3B5cmlnaHQgMTk5OC0yMDAyLCAyMDEyLCAyMDEzLCAyMDE1LCAyMDE3LTIwMTgsIDIwMjAgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogSG93IG1hbnkgc3BlY2lhbCBjYXNlcz8gTWluaW11bSBpcyAyOiAwIGFuZCAxOworICogYWxzbyAzIHswLDEsMn0gYW5kIDUgezAsMSwyLDMsNH0gYXJlIGltcGxlbWVudGVkLgorICovCisjZGVmaW5lIEFQQVJUQUpfS0FMS1VMT0ogMgorCisvKiBXaGV0aGVyIHRvIHVzZSAoMSkgb3Igbm90ICgwKSB0aGUgZnVuY3Rpb24gbXB6X2Jpbl91aXVpIHdoZW5ldmVyCisgKiB0aGUgb3BlcmFuZHMgZml0LgorICovCisjZGVmaW5lIFVaVV9CSU5fVUlVSSAwCisKKy8qIFdoZXRoZXIgdG8gdXNlIGEgc2hvcnRjdXQgdG8gcHJlY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBmb3VyCisgKiBlbGVtZW50cyAoMSksIG9yIHByZWNvbXB1dGUgb25seSB0aGUgcHJvZHVjdCBvZiBhIGNvdXBsZSAoMCkuCisgKgorICogSW4gYm90aCBjYXNlcyB0aGUgcHJlY29tcHV0ZWQgcHJvZHVjdCBpcyB0aGVuIHVwZGF0ZWQgd2l0aCBzb21lCisgKiBsaW5lYXIgb3BlcmF0aW9ucyB0byBvYnRhaW4gdGhlIHByb2R1Y3Qgb2YgdGhlIG5leHQgZm91ciAoMSkKKyAqIFtvciB0d28gKDApXSBvcGVyYW5kcy4KKyAqLworI2RlZmluZSBLVkFST1BFIDEKKworc3RhdGljIHZvaWQKK3Bvc21wel9pbml0IChtcHpfcHRyIHIpCit7CisgIG1wX3B0ciBycDsKKyAgQVNTRVJUIChTSVogKHIpID4gMCk7CisgIHJwID0gU0laIChyKSArIE1QWl9SRUFMTE9DIChyLCBTSVogKHIpICsgMik7CisgICpycCA9IDA7CisgICorK3JwID0gMDsKK30KKworLyogRXF1aXZhbGVudCB0byBtcHpfYWRkX3VpIChyLCByLCBpbiksIGJ1dCBmYXN0ZXIgd2hlbgorICAgMCA8IFNJWiAocikgPCBBTExPQyAocikgYW5kIGxpbWJzIGFib3ZlIFNJWiAocikgY29udGFpbiAwLiAqLworc3RhdGljIHZvaWQKK3Bvc21wel9pbmNfdWkgKG1wel9wdHIgciwgdW5zaWduZWQgbG9uZyBpbikKK3sKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMKKyAgbXB6X2FkZF91aSAociwgciwgaW4pOworI2Vsc2UKKyAgQVNTRVJUIChTSVogKHIpID4gMCk7CisgIE1QTl9JTkNSX1UgKFBUUiAociksIFNJWiAocikgKyAxLCBpbik7CisgIFNJWiAocikgKz0gUFRSIChyKVtTSVogKHIpXTsKKyNlbmRpZgorfQorCisvKiBFcXVpdmFsZW50IHRvIG1wel9zdWJfdWkgKHIsIHIsIGluKSwgYnV0IGZhc3RlciB3aGVuCisgICAwIDwgU0laIChyKSBhbmQgd2Uga25vdyBpbiBhZHZhbmNlIHRoYXQgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZS4gKi8KK3N0YXRpYyB2b2lkCitwb3NtcHpfZGVjX3VpIChtcHpfcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW4pCit7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIG1wel9zdWJfdWkgKHIsIHIsIGluKTsKKyNlbHNlCisgIEFTU0VSVCAobXB6X2NtcF91aSAociwgaW4pID49IDApOworICBNUE5fREVDUl9VIChQVFIgKHIpLCBTSVogKHIpLCBpbik7CisgIFNJWiAocikgLT0gKFBUUiAocilbU0laIChyKS0xXSA9PSAwKTsKKyNlbmRpZgorfQorCisvKiBFcXVpdmFsZW50IHRvIG1wel90ZGl2X3FfMmV4cCAociwgciwgMSksIGJ1dCBmYXN0ZXIgd2hlbgorICAgMCA8IFNJWiAocikgYW5kIHdlIGtub3cgaW4gYWR2YW5jZSB0aGF0IHRoZSByZXN1bHQgaXMgcG9zaXRpdmUuICovCitzdGF0aWMgdm9pZAorcG9zbXB6X3JzaDEgKG1wel9wdHIgcikKK3sKKyAgbXBfcHRyIHJwOworICBtcF9zaXplX3Qgcm47CisKKyAgcm4gPSBTSVogKHIpOworICBycCA9IFBUUiAocik7CisgIEFTU0VSVCAocm4gPiAwKTsKKyAgbXBuX3JzaGlmdCAocnAsIHJwLCBybiwgMSk7CisgIFNJWiAocikgLT0gcnBbcm4gLSAxXSA9PSAwOworfQorCisvKiBDb21wdXRlcyByID0gbihuKygyKmstMSkpLzIKKyAgIEl0IHVzZXMgYSBzcWFyZSBpbnN0ZWFkIG9mIGEgcHJvZHVjdCwgY29tcHV0aW5nCisgICByID0gKChuK2stMSleMiArIG4gLSAoay0xKV4yKS8yCisgICBBcyBhIHNpZGUgZWZmZWN0LCBzZXRzIHQgPSBuK2stMQorICovCitzdGF0aWMgdm9pZAorbXB6X2htdWxfbmJucGsgKG1wel9wdHIgciwgbXB6X3NyY3B0ciBuLCB1bnNpZ25lZCBsb25nIGludCBrLCBtcHpfcHRyIHQpCit7CisgIEFTU0VSVCAoayA+IDAgJiYgU0laKG4pID4gMCk7CisgIC0tazsKKyAgbXB6X2FkZF91aSAodCwgbiwgayk7CisgIG1wel9tdWwgKHIsIHQsIHQpOworICBtcHpfYWRkIChyLCByLCBuKTsKKyAgcG9zbXB6X3JzaDEgKHIpOworICBpZiAoTElLRUxZIChrIDw9ICgxVUwgPDwgKEJJVFNfUEVSX1VMT05HIC8gMikpKSkKKyAgICBwb3NtcHpfZGVjX3VpIChyLCAoayArIChrICYgMSkpKihrID4+IDEpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1wel90IHRtcDsKKyAgICAgIG1wel9pbml0X3NldF91aSAodG1wLCAoayArIChrICYgMSkpKTsKKyAgICAgIG1wel9tdWxfdWkgKHRtcCwgdG1wLCBrID4+IDEpOworICAgICAgbXB6X3N1YiAociwgciwgdG1wKTsKKyAgICAgIG1wel9jbGVhciAodG1wKTsKKyAgICB9Cit9CisKKyNpZiBLVkFST1BFCitzdGF0aWMgdm9pZAorcmVrX3JhaXNpbmdfZmFjNCAobXB6X3B0ciByLCBtcHpfcHRyIHAsIG1wel9wdHIgUCwgdW5zaWduZWQgbG9uZyBpbnQgaywgdW5zaWduZWQgbG9uZyBpbnQgbGssIG1wel9wdHIgdCkKK3sKKyAgaWYgKGsgLSBsayA8IDUpCisgICAgeworICAgICAgZG8geworCXBvc21wel9pbmNfdWkgKHAsIDQqaysyKTsKKwltcHpfYWRkbXVsX3VpIChQLCBwLCA0KmspOworCXBvc21wel9kZWNfdWkgKFAsIGspOworCW1wel9tdWwgKHIsIHIsIFApOworICAgICAgfSB3aGlsZSAoLS1rID4gbGspOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wel90IGx0OworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbTsKKworICAgICAgQUxMT0MgKGx0KSA9IDA7CisgICAgICBTSVogKGx0KSA9IDA7CisgICAgICBpZiAodCA9PSBOVUxMKQorCXQgPSBsdDsKKyAgICAgIG0gPSAoKGsgKyBsaykgPj4gMSkgKyAxOworICAgICAgcmVrX3JhaXNpbmdfZmFjNCAociwgcCwgUCwgaywgbSwgdCk7CisKKyAgICAgIHBvc21wel9pbmNfdWkgKHAsIDQqbSsyKTsKKyAgICAgIG1wel9hZGRtdWxfdWkgKFAsIHAsIDQqbSk7CisgICAgICBwb3NtcHpfZGVjX3VpIChQLCBtKTsKKyAgICAgIG1wel9zZXQgKHQsIFApOworICAgICAgcmVrX3JhaXNpbmdfZmFjNCAodCwgcCwgUCwgbSAtIDEsIGxrLCBOVUxMKTsKKworICAgICAgbXB6X211bCAociwgciwgdCk7CisgICAgICBtcHpfY2xlYXIgKGx0KTsKKyAgICB9Cit9CisKKy8qIENvbXB1dGVzIChuKzEpKG4rMikuLi4obitrKS8yXihrLzIgK2svNCkgdXNpbmcgdGhlIGhlbHBlciBmdW5jdGlvbgorICAgcmVrX3JhaXNpbmdfZmFjNCwgYW5kIGV4cGxvaXRpbmcgYW4gaWRlYSBpbnNwaXJlZCBieSBhIHBpZWNlIG9mCisgICBjb2RlIHRoYXQgRnJlZHJpayBKb2hhbnNzb24gd3JvdGUgYW5kIGJ5IGEgY29tbWVudCBieSBOaWVscyBNw7ZsbGVyLgorCisgICBBc3N1bWUgayA9IDRpIHRoZW4gY29tcHV0ZToKKyAgICAgcCAgPSAobisxKShuKzRpKS8yIC0gaQorCSAgKG4rMSsxKShuKzRpKS8yID0gcCArIGkgKyAobis0aSkvMgorCSAgKG4rMSsxKShuKzRpLTEpLzIgPSBwICsgaSArICgobis0aSktKG4rMSsxKSkvMiA9IHAgKyBpICsgKG4tbis0aS0yKS8yID0gcCArIDNpLTEKKyAgICAgUCAgPSAocCArIGkpKihwKzNpLTEpLzIgPSAobisxKShuKzIpKG4rNGktMSkobis0aSkvOAorICAgICBuJyA9IG4gKyAyCisgICAgIGknID0gaSAtIDEKKwkgIChuJy0xKShuJykobicrNGknKzEpKG4nKzRpJysyKS84ID0gUAorCSAgKG4nLTEpKG4nKzRpJysyKS8yIC0gaScgLSAxID0gcAorCSAgKG4nLTErMikobicrNGknKzIpLzIgLSBpJyAtIDEgPSBwICsgKG4nKzRpJysyKQorCSAgKG4nLTErMikobicrNGknKzItMikvMiAtIGknIC0gMSA9IHAgKyAobicrNGknKzIpIC0gKG4nLTErMikgPSAgcCArIDRpJyArIDEKKwkgIChuJy0xKzIpKG4nKzRpJysyLTIpLzIgLSBpJyA9IHAgKyA0aScgKyAyCisgICAgIHAnID0gcCArIDRpJyArIDIgPSAobicrMSkobicrNGknKS8yIC0gaScKKwkgIHAnIC0gNGknIC0gMiA9IHAKKwkgIChwJyAtIDRpJyAtIDIgKyBpKSoocCcgLSA0aScgLSAyKzNpLTEpLzIgPSBQCisJICAocCcgLSA0aScgLSAyICsgaScgKyAxKSoocCcgLSA0aScgLSAyICsgM2knICsgMyAtIDEpLzIgPSBQCisJICAocCcgLSAzaScgLSAxKSoocCcgLSBpJykvMiA9IFAKKwkgIChwJyAtIDNpJyAtIDEgKyA0aScgKyAxKSoocCcgLSBpJyArIDRpJyAtIDEpLzIgPSBQICsgKDRpJyArIDEpKihwJyAtIGknKS8yICsgKHAnIC0gM2knIC0gMSArIDRpJyArIDEpKig0aScgLSAxKS8yCisJICAocCcgKyBpJykqKHAnICsgM2knIC0gMSkvMiA9IFAgKyAoNGknKSoocCcgKyBwJykvMiArIChwJyAtIGknIC0gKHAnICsgaScpKS8yCisJICAocCcgKyBpJykqKHAnICsgM2knIC0gMSkvMiA9IFAgKyA0aSdwJyArIChwJyAtIGknIC0gcCcgLSBpJykvMgorCSAgKHAnICsgaScpKihwJyArIDNpJyAtIDEpLzIgPSBQICsgNGkncCcgLSBpJworICAgICBQJyA9IFAgKyA0aSdwJyAtIGknCisKKyAgIEFuZCBjb21wdXRlIHRoZSBwcm9kdWN0IFAgKiBQJyAqIFAiIC4uLgorICovCisKK3N0YXRpYyB2b2lkCittcHpfcmFpc2luZ19mYWM0IChtcHpfcHRyIHIsIG1wel9wdHIgbiwgdW5zaWduZWQgbG9uZyBpbnQgaywgbXB6X3B0ciB0LCBtcHpfcHRyIHApCit7CisgIEFTU0VSVCAoKGsgPj0gQVBBUlRBSl9LQUxLVUxPSikgJiYgKEFQQVJUQUpfS0FMS1VMT0ogPiAwKSk7CisgIHBvc21wel9pbml0IChuKTsKKyAgcG9zbXB6X2luY191aSAobiwgMSk7CisgIFNJWiAocikgPSAwOworICBpZiAoayAmIDEpCisgICAgeworICAgICAgbXB6X3NldCAociwgbik7CisgICAgICBwb3NtcHpfaW5jX3VpIChuLCAxKTsKKyAgICB9CisgIGsgPj49IDE7CisgIGlmIChBUEFSVEFKX0tBTEtVTE9KIDwgMiAmJiBrID09IDApCisgICAgcmV0dXJuOworCisgIG1wel9obXVsX25ibnBrIChwLCBuLCBrLCB0KTsKKyAgcG9zbXB6X2luaXQgKHApOworCisgIGlmIChrICYgMSkKKyAgICB7CisgICAgICBpZiAoU0laIChyKSkKKwltcHpfbXVsIChyLCByLCBwKTsKKyAgICAgIGVsc2UKKwltcHpfc2V0IChyLCBwKTsKKyAgICAgIHBvc21wel9pbmNfdWkgKHAsIGsgLSAxKTsKKyAgICB9CisgIGsgPj49IDE7CisgIGlmIChBUEFSVEFKX0tBTEtVTE9KIDwgNCAmJiBrID09IDApCisgICAgcmV0dXJuOworCisgIG1wel9obXVsX25ibnBrICh0LCBwLCBrLCBuKTsKKyAgaWYgKFNJWiAocikpCisgICAgbXB6X211bCAociwgciwgdCk7CisgIGVsc2UKKyAgICBtcHpfc2V0IChyLCB0KTsKKworICBpZiAoQVBBUlRBSl9LQUxLVUxPSiA+IDggfHwgayA+IDEpCisgICAgeworICAgICAgcG9zbXB6X2RlY191aSAocCwgayk7CisgICAgICByZWtfcmFpc2luZ19mYWM0IChyLCBwLCB0LCBrIC0gMSwgMCwgbik7CisgICAgfQorfQorCisjZWxzZSAvKiBLVkFST1BFICovCisKK3N0YXRpYyB2b2lkCityZWtfcmFpc2luZ19mYWMgKG1wel9wdHIgciwgbXB6X3B0ciBuLCB1bnNpZ25lZCBsb25nIGludCBrLCB1bnNpZ25lZCBsb25nIGludCBsaywgbXB6X3B0ciB0MSwgbXB6X3B0ciB0MikKK3sKKyAgLyogU2hvdWxkIHRoZSB0aHJlc2hvbGQgZGVwZW5kIG9uIFNJWiAobikgPyAqLworICBpZiAoayAtIGxrIDwgMTApCisgICAgeworICAgICAgZG8geworCXBvc21wel9pbmNfdWkgKG4sIGspOworCW1wel9tdWwgKHIsIHIsIG4pOworCS0tazsKKyAgICAgIH0gd2hpbGUgKGsgPiBsayk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXB6X3QgdDM7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBtOworCisgICAgICBtID0gKChrICsgbGspID4+IDEpICsgMTsKKyAgICAgIHJla19yYWlzaW5nX2ZhYyAociwgbiwgaywgbSwgdDEsIHQyKTsKKworICAgICAgcG9zbXB6X2luY191aSAobiwgbSk7CisgICAgICBpZiAodDEgPT0gTlVMTCkKKwl7CisJICBtcHpfaW5pdF9zZXQgKHQzLCBuKTsKKwkgIHQxID0gdDM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIEFMTE9DICh0MykgPSAwOworCSAgbXB6X3NldCAodDEsIG4pOworCX0KKyAgICAgIHJla19yYWlzaW5nX2ZhYyAodDEsIG4sIG0gLSAxLCBsaywgdDIsIE5VTEwpOworCisgICAgICBtcHpfbXVsIChyLCByLCB0MSk7CisgICAgICBtcHpfY2xlYXIgKHQzKTsKKyAgICB9Cit9CisKKy8qIENvbXB1dGVzIChuKzEpKG4rMikuLi4obitrKS8yXihrLzIpIHVzaW5nIHRoZSBoZWxwZXIgZnVuY3Rpb24KKyAgIHJla19yYWlzaW5nX2ZhYywgYW5kIGV4cGxvaXRpbmcgYW4gaWRlYSBpbnNwaXJlZCBieSBhIHBpZWNlIG9mCisgICBjb2RlIHRoYXQgRnJlZHJpayBKb2hhbnNzb24gd3JvdGUuCisKKyAgIEZvcmNlIGFuIGV2ZW4gayA9IDJpIHRoZW4gY29tcHV0ZToKKyAgICAgcCAgPSAobisxKShuKzJpKS8yCisgICAgIGknID0gaSAtIDEKKyAgICAgcCA9PSAobisxKShuKzJpJysyKS8yCisgICAgIHAnID0gcCArIGknID09IChuKzIpKG4rMmknKzEpLzIKKyAgICAgbicgPSBuICsgMQorICAgICBwJz09IChuJysxKShuJysyaScpLzIgPT0gKG4rMSArMSkobisyaSAtMSkvMgorCisgICBBbmQgY29tcHV0ZSB0aGUgcHJvZHVjdCBwICogcCcgKiBwIiAuLi4KKyovCisKK3N0YXRpYyB2b2lkCittcHpfcmFpc2luZ19mYWMgKG1wel9wdHIgciwgbXB6X3B0ciBuLCB1bnNpZ25lZCBsb25nIGludCBrLCBtcHpfcHRyIHQsIG1wel9wdHIgcCkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgaGs7CisgIEFTU0VSVCAoKGsgPj0gQVBBUlRBSl9LQUxLVUxPSikgJiYgKEFQQVJUQUpfS0FMS1VMT0ogPiAxKSk7CisgIG1wel9hZGRfdWkgKG4sIG4sIDEpOworICBoayA9IGsgPj4gMTsKKyAgbXB6X2htdWxfbmJucGsgKHAsIG4sIGhrLCB0KTsKKworICBpZiAoKGsgJiAxKSAhPSAwKQorICAgIHsKKyAgICAgIG1wel9hZGRfdWkgKHQsIHQsIGhrICsgMSk7CisgICAgICBtcHpfbXVsIChyLCB0LCBwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcHpfc2V0IChyLCBwKTsKKyAgICB9CisKKyAgaWYgKChBUEFSVEFKX0tBTEtVTE9KID4gMykgfHwgKGhrID4gMSkpCisgICAgeworICAgICAgcG9zbXB6X2luaXQgKHApOworICAgICAgcmVrX3JhaXNpbmdfZmFjIChyLCBwLCBoayAtIDEsIDAsIHQsIG4pOworICAgIH0KK30KKyNlbmRpZiAvKiBLVkFST1BFICovCisKKy8qIFRoaXMgaXMgYSBwb29yIGltcGxlbWVudGF0aW9uLiAgTG9vayBhdCBiaW5fdWl1aS5jIGZvciBpbXByb3ZlbWVudCBpZGVhcy4KKyAgIEluIGZhY3QgY29uc2lkZXIgY2FsbGluZyBtcHpfYmluX3VpdWkoKSB3aGVuIHRoZSBhcmd1bWVudHMgZml0LCBsZWF2aW5nCisgICB0aGUgY29kZSBoZXJlIG9ubHkgZm9yIGJpZyBuLgorCisgICBUaGUgaWRlbnRpdHkgYmluKG4saykgPSAoLTEpXmsgKiBiaW4oLW4ray0xLGspIGNhbiBiZSBmb3VuZCBpbiBLbnV0aCB2b2wKKyAgIDEgc2VjdGlvbiAxLjIuNiBwYXJ0IEcuICovCisKK3ZvaWQKK21wel9iaW5fdWkgKG1wel9wdHIgciwgbXB6X3NyY3B0ciBuLCB1bnNpZ25lZCBsb25nIGludCBrKQoreworICBtcHpfdCAgICAgIG5pOworICBtcF9zaXplX3QgIG5lZ2F0ZTsKKworICBpZiAoU0laIChuKSA8IDApCisgICAgeworICAgICAgLyogYmluKG4saykgPSAoLTEpXmsgKiBiaW4oLW4ray0xLGspLCBhbmQgc2V0IG5pID0gLW4ray0xIC0gayA9IC1uLTEgKi8KKyAgICAgIG1wel9pbml0IChuaSk7CisgICAgICBtcHpfYWRkX3VpIChuaSwgbiwgMUwpOworICAgICAgbXB6X25lZyAobmksIG5pKTsKKyAgICAgIG5lZ2F0ZSA9IChrICYgMSk7ICAgLyogKC0xKV5rICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogYmluKG4saykgPT0gMCBpZiBrPm4KKwkgKG5vIHRlc3QgZm9yIHRoaXMgdW5kZXIgdGhlIG48MCBjYXNlLCBzaW5jZSAtbitrLTEgPj0gayB0aGVyZSkgKi8KKyAgICAgIGlmIChtcHpfY21wX3VpIChuLCBrKSA8IDApCisJeworCSAgU0laIChyKSA9IDA7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBzZXQgbmkgPSBuLWsgKi8KKyAgICAgIG1wel9pbml0IChuaSk7CisgICAgICBtcHpfc3ViX3VpIChuaSwgbiwgayk7CisgICAgICBuZWdhdGUgPSAwOworICAgIH0KKworICAvKiBOb3cgd2FudGluZyBiaW4obmkrayxrKSwgd2l0aCBuaSBwb3NpdGl2ZSwgYW5kICJuZWdhdGUiIGlzIHRoZSBzaWduICgwCisgICAgIGZvciBwb3NpdGl2ZSwgMSBmb3IgbmVnYXRpdmUpLiAqLworCisgIC8qIFJld3JpdGUgYmluKG4saykgYXMgYmluKG4sbi1rKSBpZiB0aGF0IGlzIHNtYWxsZXIuICBJbiB0aGlzIGNhc2UgaXQncworICAgICB3aGV0aGVyIG5pK2stayA8IGsgbWVhbmluZyBuaTxrLCBhbmQgaWYgc28gY2hhbmdlIHRvIGRlbm9taW5hdG9yIG5pK2staworICAgICA9IG5pLCBhbmQgbmV3IG5pIG9mIG5pK2stbmkgPSBrLiAgKi8KKyAgaWYgKG1wel9jbXBfdWkgKG5pLCBrKSA8IDApCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyAgdG1wOworICAgICAgdG1wID0gazsKKyAgICAgIGsgPSBtcHpfZ2V0X3VpIChuaSk7CisgICAgICBtcHpfc2V0X3VpIChuaSwgdG1wKTsKKyAgICB9CisKKyAgaWYgKGsgPCBBUEFSVEFKX0tBTEtVTE9KKQorICAgIHsKKyAgICAgIGlmIChrID09IDApCisJeworCSAgU0laIChyKSA9IDE7CisJICBNUFpfTkVXQUxMT0MgKHIsIDEpWzBdID0gMTsKKwl9CisjaWYgQVBBUlRBSl9LQUxLVUxPSiA+IDIKKyAgICAgIGVsc2UgaWYgKGsgPiAxKQorCXsKKwkgIG1wel9hZGRfdWkgKG5pLCBuaSwgMSArIChBUEFSVEFKX0tBTEtVTE9KID4gMiAmJiBrID4gMikpOworCSAgbXB6X211bCAociwgbmksIG5pKTsgLyogciA9IChuICsgKGs+MikpXjIgKi8KKwkgIGlmIChBUEFSVEFKX0tBTEtVTE9KID09IDIgfHwgayA9PSAyKQorCSAgICB7CisJICAgICAgbXB6X2FkZCAociwgciwgbmkpOyAvKiBuXjIrbj0gbihuKzEpICovCisJICAgICAgcG9zbXB6X3JzaDEgKHIpOworCSAgICB9CisjaWYgQVBBUlRBSl9LQUxLVUxPSiA+IDMKKyNpZiBBUEFSVEFKX0tBTEtVTE9KICE9IDUKKyNlcnJvciBOb3QgaW1wbGVtZW50ZWQhIDMgPCBBUEFSVEFKX0tBTEtVTE9KICE9IDUKKyNlbmRpZgorCSAgZWxzZSAvKiBrID4gMiAqLworCSAgICB7IC8qIGsgPSAzLCA0ICovCisJICAgICAgbXB6X3N1Yl91aSAociwgciwgMSk7IC8qIChuKzEpXjItMSAqLworCSAgICAgIGlmIChrID09IDMpCisJCXsKKwkJICBtcHpfbXVsIChyLCByLCBuaSk7IC8qICgobisxKV4yLTEpKG4rMSkgPSBuKG4rMSkobisyKSAqLworCQkgIC8qIG1wel9kaXZleGFjdF91aSAociwgciwgNik7IC9cKiA2PTM8PDE7IGRpdl9ieTMgPyAqXC8gKi8KKwkJfQorCSAgICAgIGVsc2UgLyogayA9IDQgKi8KKwkJeworCQkgIG1wel9hZGQgKG5pLCBuaSwgcik7IC8qIChuKzEpXjIrbiAqLworCQkgIG1wel9tdWwgKHIsIG5pLCBuaSk7IC8qICgobisxKV4yK24pXjIgKi8KKwkJICAvKiBXZSBzaG91bGQgc3VidHJhY3Qgb25lOiAoKG4rMSleMituKV4yLTEgPSBuKG4rMSkobisyKShuKzMpLiAqLworCQkgIC8qIFBUUiAocikgWzBdIF49IDE7IHdvdWxkIHN1ZmZpY2UsIGJ1dCBpdCBpcyBub3QgZXZlbiBuZWVkZWQsICovCisJCSAgLyogYmVjYXVzZSB0aGUgbmV4dCBkaXZpc2lvbiB3aWxsIHNoaWZ0IGF3YXkgdGhpcyBiaXQgYW55d2F5LiAgKi8KKwkJICAvKiBtcHpfZGl2ZXhhY3RfdWkgKHIsIHIsIDI0KTsgL1wqIDI0PTM8PDM7IGRpdl9ieTMgPyAqXC8gKi8KKwkJfQorCSAgICAgIG1wbl9waTFfYmRpdl9xXzEgKFBUUihyKSwgUFRSKHIpLCBTSVoociksIDMsIEdNUF9OVU1CX01BU0svMyoyKzEsIDEgfCAoaz4+MSkpOworCSAgICAgIFNJWihyKSAtPSBQVFIocikgW1NJWihyKSAtIDFdID09IDA7CisJICAgIH0KKyNlbmRpZgorCX0KKyNlbmRpZgorICAgICAgZWxzZQorCXsgLyogayA9IDEgKi8KKwkgIG1wel9hZGRfdWkgKHIsIG5pLCAxKTsKKwl9CisgICAgfQorI2lmIFVaVV9CSU5fVUlVSQorICBlbHNlIGlmIChtcHpfY21wX3VpIChuaSwgVUxPTkdfTUFYIC0gaykgPD0gMCkKKyAgICB7CisgICAgICBtcHpfYmluX3VpdWkgKHIsIG1wel9nZXRfdWkgKG5pKSArIGssIGspOworICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90IGNvdW50OworICAgICAgbXB6X3QgbnVtLCBkZW47CisKKyAgICAgIG1wel9pbml0IChudW0pOworICAgICAgbXB6X2luaXQgKGRlbik7CisKKyNpZiBLVkFST1BFCisgICAgICBtcHpfcmFpc2luZ19mYWM0IChudW0sIG5pLCBrLCBkZW4sIHIpOworICAgICAgcG9wY19saW1iIChjb3VudCwgayk7CisgICAgICBBU1NFUlQgKGsgLSAoayA+PiAxKSAtIChrID4+IDIpIC0gY291bnQgPj0gMCk7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKG51bSwgbnVtLCBrIC0gKGsgPj4gMSkgLSAoayA+PiAyKSAtIGNvdW50KTsKKyNlbHNlCisgICAgICBtcHpfcmFpc2luZ19mYWMgKG51bSwgbmksIGssIGRlbiwgcik7CisgICAgICBwb3BjX2xpbWIgKGNvdW50LCBrKTsKKyAgICAgIEFTU0VSVCAoayAtIChrID4+IDEpIC0gY291bnQgPj0gMCk7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKG51bSwgbnVtLCBrIC0gKGsgPj4gMSkgLSBjb3VudCk7CisjZW5kaWYKKworICAgICAgbXB6X29kZGZhY18xKGRlbiwgaywgMCk7CisKKyAgICAgIG1wel9kaXZleGFjdChyLCBudW0sIGRlbik7CisgICAgICBtcHpfY2xlYXIgKG51bSk7CisgICAgICBtcHpfY2xlYXIgKGRlbik7CisgICAgfQorICBtcHpfY2xlYXIgKG5pKTsKKworICBTSVoocikgPSAoU0laKHIpIF4gLW5lZ2F0ZSkgKyBuZWdhdGU7Cit9CmRpZmYgLS1naXQgYS9tcHovYmluX3VpdWkuYyBiL21wei9iaW5fdWl1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmQ0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovYmluX3VpdWkuYwpAQCAtMCwwICsxLDcwNyBAQAorLyogbXB6X2Jpbl91aXVpIC0gY29tcHV0ZSBuIG92ZXIgay4KKworQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IFRvcmJqb3JuIEdyYW5sdW5kIGFuZCBNYXJjbyBCb2RyYXRvLgorCitDb3B5cmlnaHQgMjAxMC0yMDEyLCAyMDE1LTIwMTgsIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNpZm5kZWYgQklOX0dPRVRHSEVMVUNLX1RIUkVTSE9MRAorI2RlZmluZSBCSU5fR09FVEdIRUxVQ0tfVEhSRVNIT0xEICA1MTIKKyNlbmRpZgorI2lmbmRlZiBCSU5fVUlVSV9FTkFCTEVfU01BTExEQworI2RlZmluZSBCSU5fVUlVSV9FTkFCTEVfU01BTExEQyAgICAxCisjZW5kaWYKKyNpZm5kZWYgQklOX1VJVUlfUkVDVVJTSVZFX1NNQUxMREMKKyNkZWZpbmUgQklOX1VJVUlfUkVDVVJTSVZFX1NNQUxMREMgKEdNUF9OVU1CX0JJVFMgPiAzMikKKyNlbmRpZgorCisvKiBBbGdvcml0aG06CisKKyAgIEFjY3VtdWxhdGUgY2h1bmtzIG9mIGZhY3RvcnMgZmlyc3QgbGltYi1ieS1saW1iICh1c2luZyBvbmUgb2YgbXVsMC1tdWw4KQorICAgd2hpY2ggYXJlIHRoZW4gYWNjdW11bGF0ZWQgaW50byBtcG4gbnVtYmVycy4gIFRoZSBmaXJzdCBpbm5lciBsb29wCisgICBhY2N1bXVsYXRlcyBkaXZpc29yIGZhY3RvcnMsIHRoZSAybmQgaW5uZXIgbG9vcCBhY2N1bXVsYXRlcyBleGFjdGx5IHRoZSBzYW1lCisgICBudW1iZXIgb2YgZGl2aWRlbmQgZmFjdG9ycy4gIFdlIGF2b2lkIGFjY3VtdWxhdGluZyBtb3JlIGZvciB0aGUgZGl2aXNvciwKKyAgIGV2ZW4gd2l0aCBpdHMgc21hbGxlciBmYWN0b3JzLCBzaW5jZSB3ZSBlbHNlIGNhbm5vdCBndWFyYW50ZWUgZGl2aXNpYmlsaXR5LgorCisgICBTaW5jZSB3ZSBrbm93IGVhY2ggZGl2aXNpb24gd2lsbCB5aWVsZCBhbiBpbnRlZ2VyLCB3ZSBjb21wdXRlIHRoZSBxdW90aWVudAorICAgdXNpbmcgSGVuc2VsIG5vcm06IElmIHRoZSBxdW90aWVudCBpcyBsaW1pdGVkIGJ5IDJedCwgd2UgY29tcHV0ZSBBIC8gQiBtb2QKKyAgIDJedC4KKworICAgSW1wcm92ZW1lbnRzOgorCisgICAoMSkgQW4gb2J2aW91cyBpbXByb3ZlbWVudCB0byB0aGlzIGNvZGUgd291bGQgYmUgdG8gY29tcHV0ZSBtb2QgMl50CisgICBldmVyeXdoZXJlLiAgVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IGRldGVybWluZSB0IGJlZm9yZWhhbmQsIHVubGVzcyB3ZQorICAgaW52b2tlIHNvbWUgYXBwcm94aW1hdGlvbiwgc3VjaCBhcyBTdGlybGluZydzIGZvcm11bGEuICBPZiBjb3Vyc2UsIHdlIGRvbid0CisgICBuZWVkIHQgdG8gYmUgdGlnaHQuICBIb3dldmVyLCBpdCBpcyBub3QgY2xlYXIgdGhhdCB0aGlzIHdvdWxkIGhlbHAgbXVjaCwKKyAgIG91ciBudW1iZXJzIGFyZSBrZXB0IHJlYXNvbmFibHkgc21hbGwgYWxyZWFkeS4KKworICAgKDIpIENvbXB1dGUgbm1heC9rbWF4IHNlbWktYWNjdXJhdGVseSwgd2l0aG91dCBzY2FsYXIgZGl2aXNpb24gb3IgYSBsb29wLgorICAgRXh0cmFjdGluZyB0aGUgMyBtc2IsIHRoZW4gZG9pbmcgYSB0YWJsZSBsb29rdXAgdXNpbmcgY250KjgrbXNiIGFzIGluZGV4LAorICAgd291bGQgbWFrZSBpdCBib3RoIHJlYXNvbmFibHkgYWNjdXJhdGUgYW5kIGZhc3QuICAoV2UgY291bGQgdXNlIGEgdGFibGUKKyAgIHN0b3JlZCBpbnRvIGEgbGltYiwgcGVyaGFwcy4pICBUaGUgdGFibGUgc2hvdWxkIHRha2UgdGhlIHJlbW92ZWQgZmFjdG9ycyBvZgorICAgMiBpbnRvIGFjY291bnQgKHRob3NlIGRvbmUgb24tdGhlLWZseSBpbiBtdWxOKS4KKworICAgKDMpIFRoZSBmaXJzdCB0aW1lIGluIHRoZSBsb29wIHdlIGNvbXB1dGUgdGhlIG9kZCBwYXJ0IG9mIGEKKyAgIGZhY3RvcmlhbCBpbiBrcCwgd2UgbWlnaHQgdXNlIG9kZGZhY18xIGZvciB0aGlzIHRhc2suCisgKi8KKworLyogVGhpcyB0aHJlc2hvbGQgZGV0ZXJtaW5lcyBob3cgbGFyZ2UgZGl2aXNvciB0byBhY2N1bXVsYXRlIGJlZm9yZSB3ZSBjYWxsCisgICBiZGl2LiAgUGVyaGFwcyB3ZSBzaG91bGQgbmV2ZXIgY2FsbCBiZGl2LCBhbmQgYWNjdW11bGF0ZSBhbGwgd2UgYXJlIHRvbGQsCisgICBzaW5jZSB3ZSBhcmUganVzdCBiYXNlY2FzZSBjb2RlIGFueXdheT8gIFByZXN1bWFibHksIHRoaXMgZGVwZW5kcyBvbiB0aGUKKyAgIHJlbGF0aXZlIHNwZWVkIG9mIHRoZSBhc3ltcHRvdGljYWxseSBmYXN0IGNvZGUgYW5kIHRoaXMgY29kZS4gICovCisjZGVmaW5lIFNPTUVfVEhSRVNIT0xEIDIwCisKKy8qIE11bHRpcGx5LWludG8tbGltYiBmdW5jdGlvbnMuICBUaGVzZSByZW1vdmUgZmFjdG9ycyBvZiAyIG9uLXRoZS1mbHkuICBGSVhNRToKKyAgIEFsbCB2ZXJzaW9ucyBvZiBNQVhGQUNTIGRvbid0IHRha2UgdGhpcyAyIHJlbW92YWwgaW50byBhY2NvdW50IG5vdywgbWVhbmluZworICAgdGhhdCB0aGVuLCBzaGlmdGluZyBqdXN0IGFkZHMgc29tZSBvdmVyaGVhZC4gIChXZSByZW1vdmUgZmFjdG9ycyBmcm9tIHRoZQorICAgY29tcGxldGVkIGxpbWIgYW55d2F5LikgICovCisKK3N0YXRpYyBtcF9saW1iX3QKK211bDEgKG1wX2xpbWJfdCBtKQoreworICByZXR1cm4gbTsKK30KKworc3RhdGljIG1wX2xpbWJfdAorbXVsMiAobXBfbGltYl90IG0pCit7CisgIC8qIFdlIG5lZWQgdG8gc2hpZnQgYmVmb3JlIG11bHRpcGx5aW5nLCB0byBhdm9pZCBhbiBvdmVyZmxvdy4gKi8KKyAgbXBfbGltYl90IG0wMSA9IChtIHwgMSkgKiAoKG0gKyAxKSA+PiAxKTsKKyAgcmV0dXJuIG0wMTsKK30KKworc3RhdGljIG1wX2xpbWJfdAorbXVsMyAobXBfbGltYl90IG0pCit7CisgIG1wX2xpbWJfdCBtMDEgPSAobSArIDApICogKG0gKyAxKSA+PiAxOworICBtcF9saW1iX3QgbTIgPSAobSArIDIpOworICByZXR1cm4gbTAxICogbTI7Cit9CisKK3N0YXRpYyBtcF9saW1iX3QKK211bDQgKG1wX2xpbWJfdCBtKQoreworICBtcF9saW1iX3QgbTAzID0gKG0gKyAwKSAqIChtICsgMykgPj4gMTsKKyAgcmV0dXJuIG0wMyAqIChtMDMgKyAxKTsgLyogbXVsMiAobTAzKSA/ICovCit9CisKK3N0YXRpYyBtcF9saW1iX3QKK211bDUgKG1wX2xpbWJfdCBtKQoreworICBtcF9saW1iX3QgbTAzID0gKG0gKyAwKSAqIChtICsgMykgPj4gMTsKKyAgbXBfbGltYl90IG0wMzQgPSBtMDMgKiAobSArIDQpOworICByZXR1cm4gKG0wMyArIDEpICogbTAzNDsKK30KKworc3RhdGljIG1wX2xpbWJfdAorbXVsNiAobXBfbGltYl90IG0pCit7CisgIG1wX2xpbWJfdCBtMDUgPSAobSArIDApICogKG0gKyA1KTsKKyAgbXBfbGltYl90IG0xMjM0ID0gKG0wNSArIDUpICogKG0wNSArIDUpID4+IDM7CisgIHJldHVybiBtMTIzNCAqIChtMDUgPj4gMSk7Cit9CisKK3N0YXRpYyBtcF9saW1iX3QKK211bDcgKG1wX2xpbWJfdCBtKQoreworICBtcF9saW1iX3QgbTA1ID0gKG0gKyAwKSAqIChtICsgNSk7CisgIG1wX2xpbWJfdCBtMTIzNCA9IChtMDUgKyA1KSAqIChtMDUgKyA1KSA+PiAzOworICBtcF9saW1iX3QgbTA1NiA9IG0wNSAqIChtICsgNikgPj4gMTsKKyAgcmV0dXJuIG0xMjM0ICogbTA1NjsKK30KKworc3RhdGljIG1wX2xpbWJfdAorbXVsOCAobXBfbGltYl90IG0pCit7CisgIG1wX2xpbWJfdCBtMDcgPSAobSArIDApICogKG0gKyA3KTsKKyAgbXBfbGltYl90IG0wMjU3ID0gbTA3ICogKG0wNyArIDEwKSA+PiAzOworICBtcF9saW1iX3QgbTEzNDYgPSBtMDcgKyA5ICsgbTAyNTc7CisgIHJldHVybiBtMDI1NyAqIG0xMzQ2OworfQorCisvKgorc3RhdGljIG1wX2xpbWJfdAorbXVsOSAobXBfbGltYl90IG0pCit7CisgIHJldHVybiAobSArIDgpICogbXVsOCAobSkgOworfQorCitzdGF0aWMgbXBfbGltYl90CittdWwxMCAobXBfbGltYl90IG0pCit7CisgIG1wX2xpbWJfdCBtMDkgPSAobSArIDApICogKG0gKyA5KTsKKyAgbXBfbGltYl90IG0xOCA9IChtMDkgPj4gMSkgKyA0OworICBtcF9saW1iX3QgbTAzNjkgPSBtMDkgKiAobTA5ICsgMTgpID4+IDM7CisgIG1wX2xpbWJfdCBtMjQ1NyA9IG0wOSAqIDIgKyAzNSArIG0wMzY5OworICByZXR1cm4gKChtMDM2OSAqIG0yNDU3KSA+PiAxKSAqIG0xODsKK30KKyovCisKK3R5cGVkZWYgbXBfbGltYl90ICgqIG11bGZ1bmNfdCkgKG1wX2xpbWJfdCk7CisKK3N0YXRpYyBjb25zdCBtdWxmdW5jX3QgbXVsZnVuY1tdID0ge211bDEsbXVsMixtdWwzLG11bDQsbXVsNSxtdWw2LG11bDcsbXVsOCAvKiAsbXVsOSxtdWwxMCAqL307CisjZGVmaW5lIE0gKG51bWJlcm9mKG11bGZ1bmMpKQorCisvKiBOdW1iZXIgb2YgZmFjdG9ycy1vZi0yIHJlbW92ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbXVsTiBmdW5jdGlvbi4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0Y250dGFiW10gPSB7MCwgMSwgMSwgMiwgMiwgNCwgNCwgNiAvKiw2LDgqL307CisKKyNpZiAxCisvKiBUaGlzIHZhcmlhbnQgaXMgaW5hY2N1cmF0ZSBidXQgc2hhcmUgdGhlIGNvZGUgd2l0aCBvdGhlciBmdW5jdGlvbnMuICAqLworI2RlZmluZSBNQVhGQUNTKG1heCxsKQkJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgKG1heCkgPSBsb2dfbl9tYXggKGwpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisKKy8qIFRoaXMgdmFyaWFudCBpcyBleGFjdCg/KSBidXQgdXNlcyBhIGxvb3AuICBJdCB0YWtlcyB0aGUgMiByZW1vdmFsCisgb2YgbXVsTiBpbnRvIGFjY291bnQuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgZnRhYltdID0KKyNpZiBHTVBfTlVNQl9CSVRTID09IDY0CisgIC8qIDEgdG8gOCBmYWN0b3JzIHBlciBpdGVyYXRpb24gKi8KKyAge0NOU1RfTElNQigweGZmZmZmZmZmZmZmZmZmZmYpLENOU1RfTElNQigweDE2YTA5ZTY2NyksMHgzMmNiZmMsMHgxNmEwOCwweDI0YzAsMHhhMTEsMHgzNDUsMHgxYWIgLyosMHhlOSwweDhlICovfTsKKyNlbmRpZgorI2lmIEdNUF9OVU1CX0JJVFMgPT0gMzIKKyAgLyogMSB0byA3IGZhY3RvcnMgcGVyIGl0ZXJhdGlvbiAqLworICB7MHhmZmZmZmZmZiwweDE2YTA5LDB4N2ZmLDB4MTY4LDB4NmYsMHgzZCwweDIwIC8qICwweDE3ICovfTsKKyNlbmRpZgorCisjZGVmaW5lIE1BWEZBQ1MobWF4LGwpCQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpbnQgX19pOwkJCQkJCQkJXAorICAgIGZvciAoX19pID0gbnVtYmVyb2YgKGZ0YWIpIC0gMTsgbCA+IGZ0YWJbX19pXTsgX19pLS0pCQlcCisgICAgICA7CQkJCQkJCQkJXAorICAgIChtYXgpID0gX19pICsgMTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIEVudHJ5IGkgY29udGFpbnMgKGkhLzJedCleKC0xKSB3aGVyZSB0IGlzIGNob3NlbiBzdWNoIHRoYXQgdGhlIHBhcmVudGhlc2lzCisgICBpcyBhbiBvZGQgaW50ZWdlci4gKi8KK3N0YXRpYyBjb25zdCBtcF9saW1iX3QgZmFjaW52W10gPSB7IE9ORV9MSU1CX09ERF9GQUNUT1JJQUxfSU5WRVJTRVNfVEFCTEUgfTsKKworc3RhdGljIHZvaWQKK21wel9iZGl2X2Jpbl91aXVpIChtcHpfcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW50IG4sIHVuc2lnbmVkIGxvbmcgaW50IGspCit7CisgIHVuc2lnbmVkIG5tYXgsIGttYXgsIG5tYXhub3csIG51bWZhYzsKKyAgbXBfcHRyIG5wLCBrcDsKKyAgbXBfc2l6ZV90IG5uLCBrbiwgYWxsb2M7CisgIG1wX2xpbWJfdCBpLCBqLCB0LCBpaWksIGpqaiwgY3ksIGRpbnY7CisgIGludCBjbnQ7CisgIG1wX3NpemVfdCBtYXhuOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGsgPiBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUKTsKKyAgVE1QX01BUks7CisKKyAgbWF4biA9IDEgKyBuIC8gR01QX05VTUJfQklUUzsgICAgLyogYWJzb2x1dGVseSBsYXJnZXN0IHJlc3VsdCBzaXplIChsaW1icykgKi8KKworICAvKiBGSVhNRTogVGhpcyBhbGxvY2F0aW9uIG1pZ2h0IGJlIGluc3VmZmljaWVudCwgYnV0IGlzIHVzdWFsbHkgd2F5IHRvbworICAgICBsYXJnZS4gICovCisgIGFsbG9jID0gU09NRV9USFJFU0hPTEQgLSAxICsgTUFYICgzICogbWF4biAvIDIsIFNPTUVfVEhSRVNIT0xEKTsKKyAgYWxsb2MgPSBNSU4gKGFsbG9jLCAobXBfc2l6ZV90KSBrKSArIDE7CisgIFRNUF9BTExPQ19MSU1CU18yIChucCwgYWxsb2MsIGtwLCBTT01FX1RIUkVTSE9MRCArIDEpOworCisgIE1BWEZBQ1MgKG5tYXgsIG4pOworICBBU1NFUlQgKG5tYXggPD0gTSk7CisgIE1BWEZBQ1MgKGttYXgsIGspOworICBBU1NFUlQgKGttYXggPD0gTSk7CisgIEFTU0VSVCAoayA+PSBNKTsKKworICBpID0gbiAtIGsgKyAxOworCisgIG5wWzBdID0gMTsgbm4gPSAxOworCisgIG51bWZhYyA9IDE7CisgIGogPSBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUICsgMTsKKyAgampqID0gT0REX0ZBQ1RPUklBTF9UQUJMRV9NQVg7CisgIEFTU0VSVCAoX19nbXBfb2RkZmFjX3RhYmxlW09ERF9GQUNUT1JJQUxfVEFCTEVfTElNSVRdID09IE9ERF9GQUNUT1JJQUxfVEFCTEVfTUFYKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBrcFswXSA9IGpqajsJCQkJLyogc3RvcmUgbmV3IGZhY3RvcnMgKi8KKyAgICAgIGtuID0gMTsKKyAgICAgIHQgPSBrIC0gaiArIDE7CisgICAgICBrbWF4ID0gTUlOIChrbWF4LCB0KTsKKworICAgICAgd2hpbGUgKGttYXggIT0gMCAmJiBrbiA8IFNPTUVfVEhSRVNIT0xEKQorCXsKKwkgIGpqaiA9IG11bGZ1bmNba21heCAtIDFdIChqKTsKKwkgIGogKz0ga21heDsJCQkJLyogbnVtYmVyIG9mIGZhY3RvcnMgdXNlZCAqLworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgampqKTsJLyogY291bnQgbG93IHplcm9zICovCisJICBqamogPj49IGNudDsJCQkJLyogcmVtb3ZlIHJlbWFpbmluZyBsb3cgemVyb3MgKi8KKwkgIGN5ID0gbXBuX211bF8xIChrcCwga3AsIGtuLCBqamopOwkvKiBhY2N1bXVsYXRlIG5ldyBmYWN0b3JzICovCisJICBrcFtrbl0gPSBjeTsKKwkgIGtuICs9IGN5ICE9IDA7CisJICB0ID0gayAtIGogKyAxOworCSAga21heCA9IE1JTiAoa21heCwgdCk7CisJfQorICAgICAgbnVtZmFjID0gaiAtIG51bWZhYzsKKworICAgICAgd2hpbGUgKG51bWZhYyAhPSAwKQorCXsKKwkgIG5tYXhub3cgPSBNSU4gKG5tYXgsIG51bWZhYyk7CisJICBpaWkgPSBtdWxmdW5jW25tYXhub3cgLSAxXSAoaSk7CisJICBpICs9IG5tYXhub3c7CQkJCS8qIG51bWJlciBvZiBmYWN0b3JzIHVzZWQgKi8KKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGlpaSk7CS8qIGNvdW50IGxvdyB6ZXJvcyAqLworCSAgaWlpID4+PSBjbnQ7CQkJCS8qIHJlbW92ZSByZW1haW5pbmcgbG93IHplcm9zICovCisJICBjeSA9IG1wbl9tdWxfMSAobnAsIG5wLCBubiwgaWlpKTsJLyogYWNjdW11bGF0ZSBuZXcgZmFjdG9ycyAqLworCSAgbnBbbm5dID0gY3k7CisJICBubiArPSBjeSAhPSAwOworCSAgbnVtZmFjIC09IG5tYXhub3c7CisJfQorCisgICAgICBBU1NFUlQgKG5uIDwgYWxsb2MpOworCisgICAgICBiaW52ZXJ0X2xpbWIgKGRpbnYsIGtwWzBdKTsKKyAgICAgIG5uICs9IChucFtubiAtIDFdID49IGtwW2tuIC0gMV0pOworICAgICAgbm4gLT0ga247CisgICAgICBtcG5fc2JwaTFfYmRpdl9xIChucCwgbnAsIG5uLCBrcCwgTUlOKGtuLG5uKSwgLWRpbnYpOworICAgICAgbXBuX25lZyAobnAsIG5wLCBubik7CisKKyAgICAgIGlmIChrbWF4ID09IDApCisJYnJlYWs7CisgICAgICBudW1mYWMgPSBqOworCisgICAgICBqamogPSBtdWxmdW5jW2ttYXggLSAxXSAoaik7CisgICAgICBqICs9IGttYXg7CQkJCS8qIG51bWJlciBvZiBmYWN0b3JzIHVzZWQgKi8KKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGpqaik7CQkvKiBjb3VudCBsb3cgemVyb3MgKi8KKyAgICAgIGpqaiA+Pj0gY250OwkJCQkvKiByZW1vdmUgcmVtYWluaW5nIGxvdyB6ZXJvcyAqLworICAgIH0KKworICAvKiBQdXQgYmFjayB0aGUgcmlnaHQgbnVtYmVyIG9mIGZhY3RvcnMgb2YgMi4gICovCisgIHBvcGNfbGltYiAoY250LCBuIC0gayk7CisgIHBvcGNfbGltYiAoaiwgayk7CisgIGNudCArPSBqOworICBwb3BjX2xpbWIgKGosIG4pOworICBjbnQgLT0gajsKKyAgaWYgKGNudCAhPSAwKQorICAgIHsKKyAgICAgIEFTU0VSVCAoY250IDwgR01QX05VTUJfQklUUyk7IC8qIGNhbiBoYXBwZW4sIGJ1dCBub3QgZm9yIGludGVuZGVkIHVzZSAqLworICAgICAgY3kgPSBtcG5fbHNoaWZ0IChucCwgbnAsIG5uLCBjbnQpOworICAgICAgbnBbbm5dID0gY3k7CisgICAgICBubiArPSBjeSAhPSAwOworICAgIH0KKworICBubiAtPSBucFtubiAtIDFdID09IDA7CS8qIG5vcm1hbGlzYXRpb24gKi8KKworICBrcCA9IE1QWl9ORVdBTExPQyAociwgbm4pOworICBTSVoocikgPSBubjsKKyAgTVBOX0NPUFkgKGtwLCBucCwgbm4pOworICBUTVBfRlJFRTsKK30KKworc3RhdGljIHZvaWQKK21wel9zbWFsbGtfYmluX3VpdWkgKG1wel9wdHIgciwgdW5zaWduZWQgbG9uZyBpbnQgbiwgdW5zaWduZWQgbG9uZyBpbnQgaykKK3sKKyAgdW5zaWduZWQgbm1heCwgbnVtZmFjOworICBtcF9wdHIgcnA7CisgIG1wX3NpemVfdCBybiwgYWxsb2M7CisgIG1wX2xpbWJfdCBpLCBpaWksIGN5OworICB1bnNpZ25lZCBpMmNudCwgY250OworCisgIE1BWEZBQ1MgKG5tYXgsIG4pOworICBubWF4ID0gTUlOIChubWF4LCBNKTsKKworICBpID0gbiAtIGsgKyAxOworCisgIGkyY250ID0gX19nbXBfZmFjMmNudF90YWJsZVtrIC8gMiAtIDFdOwkJLyogbG93IHplcm9zIGNvdW50ICovCisgIGlmIChubWF4ID49IGspCisgICAgeworICAgICAgTVBaX05FV0FMTE9DIChyLCAxKSBbMF0gPSBtdWxmdW5jW2sgLSAxXSAoaSkgKiBmYWNpbnZbayAtIDJdID4+CisJKGkyY250IC0gdGNudHRhYltrIC0gMV0pOworICAgICAgU0laKHIpID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY250LCAobXBfbGltYl90KSBuKTsKKyAgY250ID0gR01QX0xJTUJfQklUUyAtIGNudDsKKyAgYWxsb2MgPSBjbnQgKiBrIC8gR01QX05VTUJfQklUUyArIDM7CS8qIEZJWE1FOiBlbnN1cmUgcm91bmRpbmcgaXMgZW5vdWdoLiAqLworICBycCA9IE1QWl9ORVdBTExPQyAociwgYWxsb2MpOworCisgIHJwWzBdID0gbXVsZnVuY1tubWF4IC0gMV0gKGkpOworICBybiA9IDE7CisgIGkgKz0gbm1heDsJCQkJLyogbnVtYmVyIG9mIGZhY3RvcnMgdXNlZCAqLworICBpMmNudCAtPSB0Y250dGFiW25tYXggLSAxXTsJCS8qIGxvdyB6ZXJvcyBjb3VudCAqLworICBudW1mYWMgPSBrIC0gbm1heDsKKyAgZG8KKyAgICB7CisgICAgICBubWF4ID0gTUlOIChubWF4LCBudW1mYWMpOworICAgICAgaWlpID0gbXVsZnVuY1tubWF4IC0gMV0gKGkpOworICAgICAgaSArPSBubWF4OwkJCS8qIG51bWJlciBvZiBmYWN0b3JzIHVzZWQgKi8KKyAgICAgIGkyY250IC09IHRjbnR0YWJbbm1heCAtIDFdOwkvKiB1cGRhdGUgbG93IHplcm9zIGNvdW50ICovCisgICAgICBjeSA9IG1wbl9tdWxfMSAocnAsIHJwLCBybiwgaWlpKTsJLyogYWNjdW11bGF0ZSBuZXcgZmFjdG9ycyAqLworICAgICAgcnBbcm5dID0gY3k7CisgICAgICBybiArPSBjeSAhPSAwOworICAgICAgbnVtZmFjIC09IG5tYXg7CisgICAgfSB3aGlsZSAobnVtZmFjICE9IDApOworCisgIEFTU0VSVCAocm4gPCBhbGxvYyk7CisKKyAgbXBuX3BpMV9iZGl2X3FfMSAocnAsIHJwLCBybiwgX19nbXBfb2RkZmFjX3RhYmxlW2tdLCBmYWNpbnZbayAtIDJdLCBpMmNudCk7CisgIC8qIEEgdHdvLWZvbGQsIGJyYW5jaC1mcmVlIG5vcm1hbGlzYXRpb24gaXMgcG9zc2libGUgOiovCisgIC8qIHJuIC09IHJwW3JuIC0gMV0gPT0gMDsgKi8KKyAgLyogcm4gLT0gcnBbcm4gLSAxXSA9PSAwOyAqLworICBNUE5fTk9STUFMSVpFX05PVF9aRVJPIChycCwgcm4pOworCisgIFNJWihyKSA9IHJuOworfQorCisvKiBBbGdvcml0aG06CisKKyAgIFBsYWluIGFuZCBzaW1wbHkgbXVsdGlwbHkgdGhpbmdzIHRvZ2V0aGVyLgorCisgICBXZSB0YWJ1bGF0ZSBmYWN0b3JpYWxzIChrIS8yXnQpXigtMSkgbW9kIEIgKHdoZXJlIHQgaXMgY2hvc2VuIHN1Y2gKKyAgIHRoYXQgayEvMl50IGlzIG9kZCkuCisKKyovCisKK3N0YXRpYyBtcF9saW1iX3QKK2JjX2Jpbl91aXVpICh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGspCit7CisgIHJldHVybiAoKF9fZ21wX29kZGZhY190YWJsZVtuXSAqIGZhY2ludltrIC0gMl0gKiBmYWNpbnZbbiAtIGsgLSAyXSkKKyAgICA8PCAoX19nbXBfZmFjMmNudF90YWJsZVtuIC8gMiAtIDFdIC0gX19nbXBfZmFjMmNudF90YWJsZVtrIC8gMiAtIDFdIC0gX19nbXBfZmFjMmNudF90YWJsZVsobi1rKSAvIDIgLSAxXSkpCisgICAgJiBHTVBfTlVNQl9NQVNLOworfQorCisvKiBBbGdvcml0aG06CisKKyAgIFJlY3Vyc2l2ZWx5IGV4cGxvaXQgdGhlIHJlbGF0aW9uCisgICBiaW4obixrKSA9IGJpbihuLGs+PjEpKmJpbihuLWs+PjEsay1rPj4xKS9iaW4oayxrPj4xKSAuCisKKyAgIFZhbHVlcyBmb3IgYmlub21pYWwoayxrPj4xKSB0aGF0IGZpdCBpbiBhIGxpbWIgYXJlIHByZWNvbXB1dGVkCisgICAod2l0aCBpbnZlcnNlcykuCisqLworCisvKiBiaW4ya2tbaSAtIE9ERF9DRU5UUkFMX0JJTk9NSUFMX09GRlNFVF0gPQorICAgYmlub21pYWwoaSoyLGkpLzJedCAod2hlcmUgdCBpcyBjaG9zZW4gc28gdGhhdCBpdCBpcyBvZGQpLiAqLworc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBiaW4ya2tbXSA9IHsgT05FX0xJTUJfT0REX0NFTlRSQUxfQklOT01JQUxfVEFCTEUgfTsKKworLyogYmluMmtraW52W2ldID0gYmluMmtrW2ldXi0xIG1vZCBCICovCitzdGF0aWMgY29uc3QgbXBfbGltYl90IGJpbjJra2ludltdID0geyBPTkVfTElNQl9PRERfQ0VOVFJBTF9CSU5PTUlBTF9JTlZFUlNFX1RBQkxFIH07CisKKy8qIGJpbjJra1tpXSA9IGJpbm9taWFsKChpK01JTl9TKSoyLGkrTUlOX1MpLzJedC4gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgdCB2YWx1ZXMuICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmYWMyYmluW10gPSB7IENFTlRSQUxfQklOT01JQUxfMkZBQ19UQUJMRSB9OworCitzdGF0aWMgdm9pZAorbXB6X3NtYWxsa2RjX2Jpbl91aXVpIChtcHpfcHRyIHIsIHVuc2lnbmVkIGxvbmcgaW50IG4sIHVuc2lnbmVkIGxvbmcgaW50IGspCit7CisgIG1wX3B0ciBycDsKKyAgbXBfc2l6ZV90IHJuOworICB1bnNpZ25lZCBsb25nIGludCBoazsKKworICBoayA9IGsgPj4gMTsKKworICBpZiAoKCEgQklOX1VJVUlfUkVDVVJTSVZFX1NNQUxMREMpIHx8IGhrIDw9IE9ERF9GQUNUT1JJQUxfVEFCTEVfTElNSVQpCisgICAgbXB6X3NtYWxsa19iaW5fdWl1aSAociwgbiwgaGspOworICBlbHNlCisgICAgbXB6X3NtYWxsa2RjX2Jpbl91aXVpIChyLCBuLCBoayk7CisgIGsgLT0gaGs7CisgIG4gLT0gaGs7CisgIGlmIChuIDw9IE9ERF9GQUNUT1JJQUxfRVhUVEFCTEVfTElNSVQpIHsKKyAgICBtcF9saW1iX3QgY3k7CisgICAgcm4gPSBTSVogKHIpOworICAgIHJwID0gTVBaX1JFQUxMT0MgKHIsIHJuICsgMSk7CisgICAgY3kgPSBtcG5fbXVsXzEgKHJwLCBycCwgcm4sIGJjX2Jpbl91aXVpIChuLCBrKSk7CisgICAgcnAgW3JuXSA9IGN5OworICAgIHJuICs9IGN5ICE9IDA7CisgIH0gZWxzZSB7CisgICAgbXBfbGltYl90IGJ1ZmZlcltPRERfQ0VOVFJBTF9CSU5PTUlBTF9UQUJMRV9MSU1JVCArIDNdOworICAgIG1wel90IHQ7CisKKyAgICBBTExPQyAodCkgPSBPRERfQ0VOVFJBTF9CSU5PTUlBTF9UQUJMRV9MSU1JVCArIDM7CisgICAgUFRSICh0KSA9IGJ1ZmZlcjsKKyAgICBpZiAoKCEgQklOX1VJVUlfUkVDVVJTSVZFX1NNQUxMREMpIHx8IGsgPD0gT0REX0ZBQ1RPUklBTF9UQUJMRV9MSU1JVCkKKyAgICAgIG1wel9zbWFsbGtfYmluX3VpdWkgKHQsIG4sIGspOworICAgIGVsc2UKKyAgICAgIG1wel9zbWFsbGtkY19iaW5fdWl1aSAodCwgbiwgayk7CisgICAgbXB6X211bCAociwgciwgdCk7CisgICAgcnAgPSBQVFIgKHIpOworICAgIHJuID0gU0laIChyKTsKKyAgfQorCisgIG1wbl9waTFfYmRpdl9xXzEgKHJwLCBycCwgcm4sIGJpbjJra1trIC0gT0REX0NFTlRSQUxfQklOT01JQUxfT0ZGU0VUXSwKKwkJICAgIGJpbjJra2ludltrIC0gT0REX0NFTlRSQUxfQklOT01JQUxfT0ZGU0VUXSwKKwkJICAgIGZhYzJiaW5bayAtIE9ERF9DRU5UUkFMX0JJTk9NSUFMX09GRlNFVF0gLSAoayAhPSBoaykpOworICAvKiBBIHR3by1mb2xkLCBicmFuY2gtZnJlZSBub3JtYWxpc2F0aW9uIGlzIHBvc3NpYmxlIDoqLworICAvKiBybiAtPSBycFtybiAtIDFdID09IDA7ICovCisgIC8qIHJuIC09IHJwW3JuIC0gMV0gPT0gMDsgKi8KKyAgTVBOX05PUk1BTElaRV9OT1RfWkVSTyAocnAsIHJuKTsKKworICBTSVoocikgPSBybjsKK30KKworLyogbXB6X2dvZXRnaGVsdWNrX2Jpbl91aXVpKFJFU1VMVCwgTiwgSykgLS0gU2V0IFJFU1VMVCB0byBiaW5vbWlhbChOLEspLgorICoKKyAqIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhbGdvcml0aG0gYnkgUC4gR29ldGdoZWx1Y2ssICJDb21wdXRpbmcKKyAqIEJpbm9taWFsIENvZWZmaWNpZW50cyIsIFRoZSBBbWVyaWNhbiBNYXRoZW1hdGljYWwgTW9udGhseSwgVm9sLiA5NCwKKyAqIE5vLiA0IChBcHJpbCAxOTg3KSwgcHAuIDM2MC0zNjUuCisgKgorICogQWNrbm93bGVkZ21lbnQ6IFBldGVyIEx1c2NobnkgZGlkIHNwb3QgdGhlIHNsb3duZXNzIG9mIHRoZSBwcmV2aW91cworICogY29kZSBhbmQgc3VnZ2VzdGVkIHRoZSByZWZlcmVuY2UuCisgKi8KKworLyogVE9ETzogUmVtb3ZlIGR1cGxpY2F0ZWQgY29uc3RhbnRzIC8gbWFjcm9zIC8gc3RhdGljIGZ1bmN0aW9ucy4uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBtYWNyb3M6IGNvbW1vbiBtYWNyb3MsIGZvciBzd2luZy9mYWMvYmluICgmc2lldmUpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQUNUT1JfTElTVF9BUFBFTkQoUFIsIE1BWF9QUiwgVkVDLCBJKQkJCVwKKyAgaWYgKChQUikgPiAoTUFYX1BSKSkgewkJCQkJXAorICAgIChWRUMpWyhJKSsrXSA9IChQUik7CQkJCQlcCisgICAgKFBSKSA9IDE7CQkJCQkJCVwKKyAgfQorCisjZGVmaW5lIEZBQ1RPUl9MSVNUX1NUT1JFKFAsIFBSLCBNQVhfUFIsIFZFQywgSSkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIGlmICgoUFIpID4gKE1BWF9QUikpIHsJCQkJCVwKKyAgICAgIChWRUMpWyhJKSsrXSA9IChQUik7CQkJCQlcCisgICAgICAoUFIpID0gKFApOwkJCQkJCVwKKyAgICB9IGVsc2UJCQkJCQkJXAorICAgICAgKFBSKSAqPSAoUCk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfQ09OVElOVUUocHJpbWUsZW5kKQkJCVwKKyAgICBfX21heF9pID0gKGVuZCk7CQkJCQkJXAorCQkJCQkJCQlcCisgICAgZG8gewkJCQkJCQlcCisgICAgICArK19faTsJCQkJCQkJXAorICAgICAgaWYgKCgqX19zaWV2ZSAmIF9fbWFzaykgPT0gMCkJCQkJXAorCXsJCQkJCQkJXAorCSAgbXBfbGltYl90IHByaW1lOwkJCQkJXAorCSAgcHJpbWUgPSBpZF90b19uKF9faSkKKworI2RlZmluZSBMT09QX09OX1NJRVZFX0JFR0lOKHByaW1lLHN0YXJ0LGVuZCxvZmYsc2lldmUpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19tYXNrLCAqX19zaWV2ZSwgX19tYXhfaSwgX19pOwkJCVwKKwkJCQkJCQkJXAorICAgIF9faSA9IChzdGFydCktKG9mZik7CQkJCQlcCisgICAgX19zaWV2ZSA9IChzaWV2ZSkgKyBfX2kgLyBHTVBfTElNQl9CSVRTOwkJCVwKKyAgICBfX21hc2sgPSBDTlNUX0xJTUIoMSkgPDwgKF9faSAlIEdNUF9MSU1CX0JJVFMpOwkJXAorICAgIF9faSArPSAob2ZmKTsJCQkJCQlcCisJCQkJCQkJCVwKKyAgICBMT09QX09OX1NJRVZFX0NPTlRJTlVFKHByaW1lLGVuZCkKKworI2RlZmluZSBMT09QX09OX1NJRVZFX1NUT1AJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICAgIF9fbWFzayA9IF9fbWFzayA8PCAxIHwgX19tYXNrID4+IChHTVBfTElNQl9CSVRTLTEpOwlcCisgICAgICBfX3NpZXZlICs9IF9fbWFzayAmIDE7CQkJCQlcCisgICAgfSAgd2hpbGUgKF9faSA8PSBfX21heF9pKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfRU5ECQkJCQlcCisgICAgTE9PUF9PTl9TSUVWRV9TVE9QOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gc2lldmU6IHNpZXZpbmcgZnVuY3Rpb25zIGFuZCB0b29scyBmb3IgcHJpbWVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgV0FOVF9BU1NFUlQKK3N0YXRpYyBtcF9saW1iX3QKK2JpdF90b19uIChtcF9saW1iX3QgYml0KSB7IHJldHVybiAoYml0KjMrNCl8MTsgfQorI2VuZGlmCisKKy8qIGlkX3RvX24gKHgpID0gYml0X3RvX24gKHgtMSkgPSAoaWQqMysxKXwxKi8KK3N0YXRpYyBtcF9saW1iX3QKK2lkX3RvX24gIChtcF9saW1iX3QgaWQpICB7IHJldHVybiBpZCozKzErKGlkJjEpOyB9CisKKy8qIG5fdG9fYml0IChuKSA9ICgobi0xKSYoLUNOU1RfTElNQigyKSkpLzNVLTEgKi8KK3N0YXRpYyBtcF9saW1iX3QKK25fdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKChuLTUpfDEpLzNVOyB9CisKK3N0YXRpYyBtcF9zaXplX3QKK3ByaW1lc2lldmVfc2l6ZSAobXBfbGltYl90IG4pIHsgcmV0dXJuIG5fdG9fYml0KG4pIC8gR01QX0xJTUJfQklUUyArIDE7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gYmlub21pYWw6IGZhc3QgYmlub21pYWwgaW1wbGVtZW50YXRpb24gICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENPVU5UX0FfUFJJTUUoUCwgTiwgSywgUFIsIE1BWF9QUiwgVkVDLCBJKQlcCisgIGRvIHsJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX2EsIF9fYiwgX19wcmltZSwgX19tYSxfX21iOwkJXAorICAgIF9fcHJpbWUgPSAoUCk7CQkJCQlcCisgICAgX19hID0gKE4pOyBfX2IgPSAoSyk7IF9fbWIgPSAwOwkJCVwKKyAgICBGQUNUT1JfTElTVF9BUFBFTkQoUFIsIE1BWF9QUiwgVkVDLCBJKTsJCVwKKyAgICBkbyB7CQkJCQkJXAorICAgICAgX19tYiArPSBfX2IgJSBfX3ByaW1lOyBfX2IgLz0gX19wcmltZTsJCVwKKyAgICAgIF9fbWEgPSBfX2EgJSBfX3ByaW1lOyBfX2EgLz0gX19wcmltZTsJCVwKKyAgICAgIGlmIChfX21hIDwgX19tYikgewkJCQlcCisgICAgICAgIF9fbWIgPSAxOyAoUFIpICo9IF9fcHJpbWU7CQkJXAorICAgICAgfSBlbHNlICBfX21iID0gMDsJCQkJCVwKKyAgICB9IHdoaWxlIChfX2EgPj0gX19wcmltZSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSF9DT1VOVF9BX1BSSU1FKFAsIE4sIEssIFBSLCBNQVhfUFIsIFZFQywgSSkJXAorICBkbyB7CQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19wcmltZTsJCQkJCVwKKyAgICBfX3ByaW1lID0gKFApOwkJCQkJXAorICAgIGlmICgoKE4pICUgX19wcmltZSkgPCAoKEspICUgX19wcmltZSkpIHsJCVwKKyAgICAgIEZBQ1RPUl9MSVNUX1NUT1JFIChfX3ByaW1lLCBQUiwgTUFYX1BSLCBWRUMsIEkpOwlcCisgICAgfQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybnMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgc3FhcmUgcm9vdCBvZiB4LgorICogSXQgZ2l2ZXM6CisgKiAgIGxpbWJfYXBwcnNxcnQgKHgpIF4gMiA8PSB4IDwgKGxpbWJfYXBwcnNxcnQgKHgpKzEpIF4gMgorICogb3IKKyAqICAgeCA8PSBsaW1iX2FwcHJzcXJ0ICh4KSBeIDIgPD0geCAqIDkvOAorICovCitzdGF0aWMgbXBfbGltYl90CitsaW1iX2FwcHJzcXJ0IChtcF9saW1iX3QgeCkKK3sKKyAgaW50IHM7CisKKyAgQVNTRVJUICh4ID4gMik7CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKHMsIHgpOworICBzID0gKEdNUF9MSU1CX0JJVFMgLSBzKSA+PiAxOworICByZXR1cm4gKChDTlNUX0xJTUIoMSkgPDwgKHMgLSAxKSkgKyAoeCA+PiAxID4+IHMpKTsKK30KKworc3RhdGljIHZvaWQKK21wel9nb2V0Z2hlbHVja19iaW5fdWl1aSAobXB6X3B0ciByLCB1bnNpZ25lZCBsb25nIGludCBuLCB1bnNpZ25lZCBsb25nIGludCBrKQoreworICBtcF9saW1iX3QgKnNpZXZlLCAqZmFjdG9ycywgY291bnQ7CisgIG1wX2xpbWJfdCBwcm9kLCBtYXhfcHJvZDsKKyAgbXBfc2l6ZV90IGo7CisgIFRNUF9ERUNMOworCisgIEFTU0VSVCAoQklOX0dPRVRHSEVMVUNLX1RIUkVTSE9MRCA+PSAxMyk7CisgIEFTU0VSVCAobiA+PSAyNSk7CisKKyAgVE1QX01BUks7CisgIHNpZXZlID0gVE1QX0FMTE9DX0xJTUJTIChwcmltZXNpZXZlX3NpemUgKG4pKTsKKworICBjb3VudCA9IGdtcF9wcmltZXNpZXZlIChzaWV2ZSwgbikgKyAxOworICBmYWN0b3JzID0gVE1QX0FMTE9DX0xJTUJTIChjb3VudCAvIGxvZ19uX21heCAobikgKyAxKTsKKworICBtYXhfcHJvZCA9IEdNUF9OVU1CX01BWCAvIG47CisKKyAgLyogSGFuZGxlIHByaW1lcyA9IDIsIDMgc2VwYXJhdGVseS4gKi8KKyAgcG9wY19saW1iIChjb3VudCwgbiAtIGspOworICBwb3BjX2xpbWIgKGosIGspOworICBjb3VudCArPSBqOworICBwb3BjX2xpbWIgKGosIG4pOworICBjb3VudCAtPSBqOworICBwcm9kID0gQ05TVF9MSU1CKDEpIDw8IGNvdW50OworCisgIGogPSAwOworICBDT1VOVF9BX1BSSU1FICgzLCBuLCBrLCBwcm9kLCBtYXhfcHJvZCwgZmFjdG9ycywgaik7CisKKyAgLyogQWNjdW11bGF0ZSBwcmltZSBmYWN0b3JzIGZyb20gNSB0byBuLzIgKi8KKyAgICB7CisgICAgICBtcF9saW1iX3QgczsKKworICAgICAgcyA9IGxpbWJfYXBwcnNxcnQobik7CisgICAgICBzID0gbl90b19iaXQgKHMpOworICAgICAgQVNTRVJUIChiaXRfdG9fbiAocysxKSAqIGJpdF90b19uIChzKzEpID4gbik7CisgICAgICBBU1NFUlQgKHMgPD0gbl90b19iaXQgKG4gPj4gMSkpOworICAgICAgTE9PUF9PTl9TSUVWRV9CRUdJTiAocHJpbWUsIG5fdG9fYml0ICg1KSwgcywgMCxzaWV2ZSk7CisgICAgICBDT1VOVF9BX1BSSU1FIChwcmltZSwgbiwgaywgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworICAgICAgTE9PUF9PTl9TSUVWRV9TVE9QOworCisgICAgICBBU1NFUlQgKG1heF9wcm9kIDw9IEdNUF9OVU1CX01BWCAvIDIpOworICAgICAgbWF4X3Byb2QgPDw9IDE7CisKKyAgICAgIExPT1BfT05fU0lFVkVfQ09OVElOVUUgKHByaW1lLCBuX3RvX2JpdCAobiA+PiAxKSk7CisgICAgICBTSF9DT1VOVF9BX1BSSU1FIChwcmltZSwgbiwgaywgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworICAgICAgTE9PUF9PTl9TSUVWRV9FTkQ7CisKKyAgICAgIG1heF9wcm9kID4+PSAxOworICAgIH0KKworICAvKiBTdG9yZSBwcmltZXMgZnJvbSAobi1rKSsxIHRvIG4gKi8KKyAgQVNTRVJUIChuX3RvX2JpdCAobiAtIGspIDwgbl90b19iaXQgKG4pKTsKKworICBMT09QX09OX1NJRVZFX0JFR0lOIChwcmltZSwgbl90b19iaXQgKG4gLSBrKSArIDEsIG5fdG9fYml0IChuKSwgMCxzaWV2ZSk7CisgIEZBQ1RPUl9MSVNUX1NUT1JFIChwcmltZSwgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworICBMT09QX09OX1NJRVZFX0VORDsKKworICBpZiAoTElLRUxZIChqICE9IDApKQorICAgIHsKKyAgICAgIGZhY3RvcnNbaisrXSA9IHByb2Q7CisgICAgICBtcHpfcHJvZGxpbWJzIChyLCBmYWN0b3JzLCBqKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBNUFpfTkVXQUxMT0MgKHIsIDEpWzBdID0gcHJvZDsKKyAgICAgIFNJWiAocikgPSAxOworICAgIH0KKyAgVE1QX0ZSRUU7Cit9CisKKyN1bmRlZiBDT1VOVF9BX1BSSU1FCisjdW5kZWYgU0hfQ09VTlRfQV9QUklNRQorI3VuZGVmIExPT1BfT05fU0lFVkVfRU5ECisjdW5kZWYgTE9PUF9PTl9TSUVWRV9TVE9QCisjdW5kZWYgTE9PUF9PTl9TSUVWRV9CRUdJTgorI3VuZGVmIExPT1BfT05fU0lFVkVfQ09OVElOVUUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVuZCBvZiBpbXBsZW1lbnRhdGlvbiBvZiBHb2V0Z2hlbHVjaydzIGFsZ29yaXRobSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCittcHpfYmluX3VpdWkgKG1wel9wdHIgciwgdW5zaWduZWQgbG9uZyBpbnQgbiwgdW5zaWduZWQgbG9uZyBpbnQgaykKK3sKKyAgaWYgKFVOTElLRUxZIChuIDwgaykpIHsKKyAgICBTSVogKHIpID0gMDsKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMKKyAgfSBlbHNlIGlmIChVTkxJS0VMWSAobiA+IEdNUF9OVU1CX01BWCkpIHsKKyAgICBtcHpfdCB0bXA7CisKKyAgICBtcHpfaW5pdF9zZXRfdWkgKHRtcCwgbik7CisgICAgbXB6X2Jpbl91aSAociwgdG1wLCBrKTsKKyAgICBtcHpfY2xlYXIgKHRtcCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBBU1NFUlQgKG4gPD0gR01QX05VTUJfTUFYKTsKKyAgICAvKiBSZXdyaXRlIGJpbihuLGspIGFzIGJpbihuLG4taykgaWYgdGhhdCBpcyBzbWFsbGVyLiAqLworICAgIGsgPSBNSU4gKGssIG4gLSBrKTsKKyAgICBpZiAoayA8IDIpIHsKKyAgICAgIE1QWl9ORVdBTExPQyAociwgMSlbMF0gPSBrID8gbiA6IDE7IC8qIDEgKyAoKC1rKSAmIChuLTEpKTsgKi8KKyAgICAgIFNJWihyKSA9IDE7CisgICAgfSBlbHNlIGlmIChuIDw9IE9ERF9GQUNUT1JJQUxfRVhUVEFCTEVfTElNSVQpIHsgLyogayA+PSAyLCBuID49IDQgKi8KKyAgICAgIE1QWl9ORVdBTExPQyAociwgMSlbMF0gPSBiY19iaW5fdWl1aSAobiwgayk7CisgICAgICBTSVoocikgPSAxOworICAgIH0gZWxzZSBpZiAoayA8PSBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUKQorICAgICAgbXB6X3NtYWxsa19iaW5fdWl1aSAociwgbiwgayk7CisgICAgZWxzZSBpZiAoQklOX1VJVUlfRU5BQkxFX1NNQUxMREMgJiYKKwkgICAgIGsgPD0gKEJJTl9VSVVJX1JFQ1VSU0lWRV9TTUFMTERDID8gT0REX0NFTlRSQUxfQklOT01JQUxfVEFCTEVfTElNSVQgOiBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUKSogMikKKyAgICAgIG1wel9zbWFsbGtkY19iaW5fdWl1aSAociwgbiwgayk7CisgICAgZWxzZSBpZiAoQUJPVkVfVEhSRVNIT0xEIChrLCBCSU5fR09FVEdIRUxVQ0tfVEhSRVNIT0xEKSAmJgorCSAgICAgayA+IChuID4+IDQpKSAvKiBrID4gT0REX0ZBQ1RPUklBTF9UQUJMRV9MSU1JVCAqLworICAgICAgbXB6X2dvZXRnaGVsdWNrX2Jpbl91aXVpIChyLCBuLCBrKTsKKyAgICBlbHNlCisgICAgICBtcHpfYmRpdl9iaW5fdWl1aSAociwgbiwgayk7CisgIH0KK30KZGlmZiAtLWdpdCBhL21wei9jZGl2X3EuYyBiL21wei9jZGl2X3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTllYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NkaXZfcS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG1wel9jZGl2X3EgLS0gRGl2aXNpb24gcm91bmRpbmcgdGhlIHF1b3RpZW50IHRvd2FyZHMgK2luZmluaXR5LiAgVGhlCisgICByZW1haW5kZXIgZ2V0cyB0aGUgb3Bwb3NpdGUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDIwMDAsIDIwMDEsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfY2Rpdl9xIChtcHpfcHRyIHF1b3QsIG1wel9zcmNwdHIgZGl2aWRlbmQsIG1wel9zcmNwdHIgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IGRpdmlkZW5kX3NpemUgPSBTSVogKGRpdmlkZW5kKTsKKyAgbXBfc2l6ZV90IGRpdmlzb3Jfc2l6ZSA9IFNJWiAoZGl2aXNvcik7CisgIG1wel90IHJlbTsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgTVBaX1RNUF9JTklUIChyZW0sIEFCUyAoZGl2aXNvcl9zaXplKSk7CisKKyAgbXB6X3RkaXZfcXIgKHF1b3QsIHJlbSwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgIGlmICgoZGl2aXNvcl9zaXplIF4gZGl2aWRlbmRfc2l6ZSkgPj0gMCAmJiBTSVogKHJlbSkgIT0gMCkKKyAgICBtcHpfYWRkX3VpIChxdW90LCBxdW90LCAxTCk7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovY2Rpdl9xX3VpLmMgYi9tcHovY2Rpdl9xX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5ZDlhMwotLS0gL2Rldi9udWxsCisrKyBiL21wei9jZGl2X3FfdWkuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbXB6X2NkaXZfcV91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAraW5maW5pdHkuICBUaGUKKyAgIHJlbWFpbmRlciBnZXRzIHRoZSBvcHBvc2l0ZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4gIEluIG9yZGVyIHRvIG1ha2UgaXQKKyAgIGFsd2F5cyBmaXQgaW50byB0aGUgcmV0dXJuIHR5cGUsIHRoZSBuZWdhdGl2ZSBvZiB0aGUgdHJ1ZSByZW1haW5kZXIgaXMKKyAgIHJldHVybmVkLgorCitDb3B5cmlnaHQgMTk5NCwgMTk5NiwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwNCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit1bnNpZ25lZCBsb25nIGludAorbXB6X2NkaXZfcV91aSAobXB6X3B0ciBxdW90LCBtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uLCBxbjsKKyAgbXBfcHRyIG5wLCBxcDsKKyAgbXBfbGltYl90IHJsOworCisgIGlmIChVTkxJS0VMWSAoZGl2aXNvciA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBucyA9IFNJWihkaXZpZGVuZCk7CisgIGlmIChucyA9PSAwKQorICAgIHsKKyAgICAgIFNJWihxdW90KSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBxcCA9IE1QWl9SRUFMTE9DIChxdW90LCBubik7CisgIG5wID0gUFRSKGRpdmlkZW5kKTsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmIChkaXZpc29yID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBkcFsyXSwgcnBbMl07CisKKyAgICAgIGlmIChubiA9PSAxKQkJLyogdGRpdl9xciByZXF1aXJlbWVudHM7IHRlc3RlZCBhYm92ZSBmb3IgMCAqLworCXsKKwkgIHFwWzBdID0gMDsKKwkgIHJsID0gbnBbMF07CisJICBxbiA9IDE7CQkvKiBhIHdoaXRlIGxpZSwgZml4ZWQgYmVsb3cgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgZHBbMF0gPSBkaXZpc29yICYgR01QX05VTUJfTUFTSzsKKwkgIGRwWzFdID0gZGl2aXNvciA+PiBHTVBfTlVNQl9CSVRTOworCSAgbXBuX3RkaXZfcXIgKHFwLCBycCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCBkcCwgKG1wX3NpemVfdCkgMik7CisJICBybCA9IHJwWzBdICsgKHJwWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworCSAgcW4gPSBubiAtIDIgKyAxOworCX0KKworICAgICAgaWYgKHJsICE9IDAgJiYgbnMgPj0gMCkKKwl7CisJICBtcG5faW5jcl91IChxcCwgKG1wX2xpbWJfdCkgMSk7CisJICBybCA9IGRpdmlzb3IgLSBybDsKKwl9CisKKyAgICAgIHFuIC09IHFwW3FuIC0gMV0gPT0gMDsgcW4gLT0gcW4gIT0gMCAmJiBxcFtxbiAtIDFdID09IDA7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBybCA9IG1wbl9kaXZyZW1fMSAocXAsIChtcF9zaXplX3QpIDAsIG5wLCBubiwgKG1wX2xpbWJfdCkgZGl2aXNvcik7CisKKyAgICAgIGlmIChybCAhPSAwICYmIG5zID49IDApCisJeworCSAgbXBuX2luY3JfdSAocXAsIChtcF9saW1iX3QpIDEpOworCSAgcmwgPSBkaXZpc29yIC0gcmw7CisJfQorCisgICAgICBxbiA9IG5uIC0gKHFwW25uIC0gMV0gPT0gMCk7CisgICAgfQorCisgIFNJWihxdW90KSA9IG5zID49IDAgPyBxbiA6IC1xbjsKKyAgcmV0dXJuIHJsOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NkaXZfcXIuYyBiL21wei9jZGl2X3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5Yjg5MgotLS0gL2Rldi9udWxsCisrKyBiL21wei9jZGl2X3FyLmMKQEAgLTAsMCArMSw2NCBAQAorLyogbXB6X2NkaXZfcXIgLS0gRGl2aXNpb24gcm91bmRpbmcgdGhlIHF1b3RpZW50IHRvd2FyZHMgK2luZmluaXR5LiAgVGhlCisgICByZW1haW5kZXIgZ2V0cyB0aGUgb3Bwb3NpdGUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDIwMDAsIDIwMDEsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfY2Rpdl9xciAobXB6X3B0ciBxdW90LCBtcHpfcHRyIHJlbSwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgbXB6X3NyY3B0ciBkaXZpc29yKQoreworICBtcF9zaXplX3QgZGl2aXNvcl9zaXplID0gU0laIChkaXZpc29yKTsKKyAgbXBfc2l6ZV90IHhzaXplOworICBtcHpfdCB0ZW1wX2Rpdmlzb3I7CQkvKiBOLkIuOiBsaXZlcyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zISAqLworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICAvKiBXZSBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZGl2aXNvciBhZnRlciB0aGUgcXVvdGllbnQgYW5kCisgICAgIHJlbWFpbmRlciBoYXZlIGJlZW4gcHJlbGltaW5hcnkgY2FsY3VsYXRlZC4gIFdlIGhhdmUgdG8gY29weSBpdCB0bworICAgICB0ZW1wb3Jhcnkgc3BhY2UgaWYgaXQncyB0aGUgc2FtZSB2YXJpYWJsZSBhcyBlaXRoZXIgUVVPVCBvciBSRU0uICAqLworICBpZiAocXVvdCA9PSBkaXZpc29yIHx8IHJlbSA9PSBkaXZpc29yKQorICAgIHsKKyAgICAgIE1QWl9UTVBfSU5JVCAodGVtcF9kaXZpc29yLCBBQlMgKGRpdmlzb3Jfc2l6ZSkpOworICAgICAgbXB6X3NldCAodGVtcF9kaXZpc29yLCBkaXZpc29yKTsKKyAgICAgIGRpdmlzb3IgPSB0ZW1wX2Rpdmlzb3I7CisgICAgfQorCisgIHhzaXplID0gU0laIChkaXZpZGVuZCkgXiBkaXZpc29yX3NpemU7OworICBtcHpfdGRpdl9xciAocXVvdCwgcmVtLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgaWYgKHhzaXplID49IDAgJiYgU0laIChyZW0pICE9IDApCisgICAgeworICAgICAgbXB6X2FkZF91aSAocXVvdCwgcXVvdCwgMUwpOworICAgICAgbXB6X3N1YiAocmVtLCByZW0sIGRpdmlzb3IpOworICAgIH0KKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wei9jZGl2X3FyX3VpLmMgYi9tcHovY2Rpdl9xcl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY2Rpdl9xcl91aS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBtcHpfY2Rpdl9xcl91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAraW5maW5pdHkuICBUaGUKKyAgIHJlbWFpbmRlciBnZXRzIHRoZSBvcHBvc2l0ZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4gIEluIG9yZGVyIHRvIG1ha2UgaXQKKyAgIGFsd2F5cyBmaXQgaW50byB0aGUgcmV0dXJuIHR5cGUsIHRoZSBuZWdhdGl2ZSBvZiB0aGUgdHJ1ZSByZW1haW5kZXIgaXMKKyAgIHJldHVybmVkLgorCitDb3B5cmlnaHQgMTk5NC0xOTk2LCAxOTk5LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfY2Rpdl9xcl91aSAobXB6X3B0ciBxdW90LCBtcHpfcHRyIHJlbSwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBpbnQgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IG5zLCBubiwgcW47CisgIG1wX3B0ciBucCwgcXA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICBTSVoocXVvdCkgPSAwOworICAgICAgU0laKHJlbSkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gQUJTKG5zKTsKKyAgcXAgPSBNUFpfUkVBTExPQyAocXVvdCwgbm4pOworICBucCA9IFBUUihkaXZpZGVuZCk7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAoZGl2aXNvciA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgZHBbMl07CisgICAgICBtcF9wdHIgcnA7CisgICAgICBtcF9zaXplX3Qgcm47CisKKyAgICAgIHJwID0gTVBaX1JFQUxMT0MgKHJlbSwgMik7CisKKyAgICAgIGlmIChubiA9PSAxKQkJLyogdGRpdl9xciByZXF1aXJlbWVudHM7IHRlc3RlZCBhYm92ZSBmb3IgMCAqLworCXsKKwkgIHFwWzBdID0gMDsKKwkgIHFuID0gMTsJCS8qIGEgd2hpdGUgbGllLCBmaXhlZCBiZWxvdyAqLworCSAgcmwgPSBucFswXTsKKwkgIHJwWzBdID0gcmw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRwWzBdID0gZGl2aXNvciAmIEdNUF9OVU1CX01BU0s7CisJICBkcFsxXSA9IGRpdmlzb3IgPj4gR01QX05VTUJfQklUUzsKKwkgIG1wbl90ZGl2X3FyIChxcCwgcnAsIChtcF9zaXplX3QpIDAsIG5wLCBubiwgZHAsIChtcF9zaXplX3QpIDIpOworCSAgcmwgPSBycFswXSArIChycFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKwkgIHFuID0gbm4gLSAyICsgMTsKKwl9CisKKyAgICAgIGlmIChybCAhPSAwICYmIG5zID49IDApCisJeworCSAgbXBuX2luY3JfdSAocXAsIChtcF9saW1iX3QpIDEpOworCSAgcmwgPSBkaXZpc29yIC0gcmw7CisJICBycFswXSA9IHJsICYgR01QX05VTUJfTUFTSzsKKwkgIHJwWzFdID0gcmwgPj4gR01QX05VTUJfQklUUzsKKwl9CisKKyAgICAgIHFuIC09IHFwW3FuIC0gMV0gPT0gMDsgcW4gLT0gcW4gIT0gMCAmJiBxcFtxbiAtIDFdID09IDA7CisgICAgICBybiA9IDEgKyAocmwgPiBHTVBfTlVNQl9NQVgpOyAgcm4gLT0gKHJwW3JuIC0gMV0gPT0gMCk7CisgICAgICBTSVoocmVtKSA9IC1ybjsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX2RpdnJlbV8xIChxcCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCAobXBfbGltYl90KSBkaXZpc29yKTsKKyAgICAgIGlmIChybCA9PSAwKQorCVNJWihyZW0pID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAobnMgPj0gMCkKKwkgICAgeworCSAgICAgIG1wbl9pbmNyX3UgKHFwLCAobXBfbGltYl90KSAxKTsKKwkgICAgICBybCA9IGRpdmlzb3IgLSBybDsKKwkgICAgfQorCisJICBNUFpfTkVXQUxMT0MgKHJlbSwgMSlbMF0gPSBybDsKKwkgIFNJWihyZW0pID0gLShybCAhPSAwKTsKKwl9CisgICAgICBxbiA9IG5uIC0gKHFwW25uIC0gMV0gPT0gMCk7CisgICAgfQorCisgIFNJWihxdW90KSA9IG5zID49IDAgPyBxbiA6IC1xbjsKKyAgcmV0dXJuIHJsOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NkaXZfci5jIGIvbXB6L2NkaXZfci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzYyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY2Rpdl9yLmMKQEAgLTAsMCArMSw2MCBAQAorLyogbXB6X2NkaXZfciAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAraW5maW5pdHkuICBUaGUKKyAgIHJlbWFpbmRlciBnZXRzIHRoZSBvcHBvc2l0ZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4KKworQ29weXJpZ2h0IDE5OTQtMTk5NiwgMjAwMSwgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9jZGl2X3IgKG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIGRpdmlkZW5kLCBtcHpfc3JjcHRyIGRpdmlzb3IpCit7CisgIG1wX3NpemVfdCBkaXZpc29yX3NpemUgPSBTSVogKGRpdmlzb3IpOworICBtcHpfdCB0ZW1wX2Rpdmlzb3I7CQkvKiBOLkIuOiBsaXZlcyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zISAqLworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICAvKiBXZSBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZGl2aXNvciBhZnRlciB0aGUgcmVtYWluZGVyIGhhcyBiZWVuCisgICAgIHByZWxpbWluYXJ5IGNhbGN1bGF0ZWQuICBXZSBoYXZlIHRvIGNvcHkgaXQgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0J3MKKyAgICAgdGhlIHNhbWUgdmFyaWFibGUgYXMgUkVNLiAgKi8KKyAgaWYgKHJlbSA9PSBkaXZpc29yKQorICAgIHsKKworICAgICAgTVBaX1RNUF9JTklUICh0ZW1wX2Rpdmlzb3IsIEFCUyAoZGl2aXNvcl9zaXplKSk7CisgICAgICBtcHpfc2V0ICh0ZW1wX2Rpdmlzb3IsIGRpdmlzb3IpOworICAgICAgZGl2aXNvciA9IHRlbXBfZGl2aXNvcjsKKyAgICB9CisKKyAgbXB6X3RkaXZfciAocmVtLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgaWYgKChkaXZpc29yX3NpemUgXiBTSVogKGRpdmlkZW5kKSkgPj0gMCAmJiBTSVogKHJlbSkgIT0gMCkKKyAgICBtcHpfc3ViIChyZW0sIHJlbSwgZGl2aXNvcik7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovY2Rpdl9yX3VpLmMgYi9tcHovY2Rpdl9yX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNTFkYgotLS0gL2Rldi9udWxsCisrKyBiL21wei9jZGl2X3JfdWkuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogbXB6X2NkaXZfcl91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAraW5maW5pdHkuICBUaGUKKyAgIHJlbWFpbmRlciBnZXRzIHRoZSBvcHBvc2l0ZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4gIEluIG9yZGVyIHRvIG1ha2UgaXQKKyAgIGFsd2F5cyBmaXQgaW50byB0aGUgcmV0dXJuIHR5cGUsIHRoZSBuZWdhdGl2ZSBvZiB0aGUgdHJ1ZSByZW1haW5kZXIgaXMKKyAgIHJldHVybmVkLgorCitDb3B5cmlnaHQgMTk5NC0xOTk2LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfY2Rpdl9yX3VpIChtcHpfcHRyIHJlbSwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBpbnQgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IG5zLCBubjsKKyAgbXBfcHRyIG5wOworICBtcF9saW1iX3Qgcmw7CisKKyAgaWYgKFVOTElLRUxZIChkaXZpc29yID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIG5zID0gU0laKGRpdmlkZW5kKTsKKyAgaWYgKG5zID09IDApCisgICAgeworICAgICAgU0laKHJlbSkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gQUJTKG5zKTsKKyAgbnAgPSBQVFIoZGl2aWRlbmQpOworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmIChkaXZpc29yID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBkcFsyXTsKKyAgICAgIG1wX3B0ciBycCwgcXA7CisgICAgICBtcF9zaXplX3Qgcm47CisgICAgICBUTVBfREVDTDsKKworICAgICAgcnAgPSBNUFpfUkVBTExPQyAocmVtLCAyKTsKKworICAgICAgaWYgKG5uID09IDEpCQkvKiB0ZGl2X3FyIHJlcXVpcmVtZW50czsgdGVzdGVkIGFib3ZlIGZvciAwICovCisJeworCSAgcmwgPSBucFswXTsKKwkgIHJwWzBdID0gcmw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIFRNUF9NQVJLOworCSAgZHBbMF0gPSBkaXZpc29yICYgR01QX05VTUJfTUFTSzsKKwkgIGRwWzFdID0gZGl2aXNvciA+PiBHTVBfTlVNQl9CSVRTOworCSAgcXAgPSBUTVBfQUxMT0NfTElNQlMgKG5uIC0gMiArIDEpOworCSAgbXBuX3RkaXZfcXIgKHFwLCBycCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCBkcCwgKG1wX3NpemVfdCkgMik7CisJICBUTVBfRlJFRTsKKwkgIHJsID0gcnBbMF0gKyAocnBbMV0gPDwgR01QX05VTUJfQklUUyk7CisJfQorCisgICAgICBpZiAocmwgIT0gMCAmJiBucyA+PSAwKQorCXsKKwkgIHJsID0gZGl2aXNvciAtIHJsOworCSAgcnBbMF0gPSBybCAmIEdNUF9OVU1CX01BU0s7CisJICBycFsxXSA9IHJsID4+IEdNUF9OVU1CX0JJVFM7CisJfQorCisgICAgICBybiA9IDEgKyAocmwgPiBHTVBfTlVNQl9NQVgpOyAgcm4gLT0gKHJwW3JuIC0gMV0gPT0gMCk7CisgICAgICBTSVoocmVtKSA9IC1ybjsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX21vZF8xIChucCwgbm4sIChtcF9saW1iX3QpIGRpdmlzb3IpOworICAgICAgaWYgKHJsID09IDApCisJU0laKHJlbSkgPSAwOworICAgICAgZWxzZQorCXsKKwkgIGlmIChucyA+PSAwKQorCSAgICBybCA9IGRpdmlzb3IgLSBybDsKKworCSAgTVBaX05FV0FMTE9DIChyZW0sIDEpWzBdID0gcmw7CisJICBTSVoocmVtKSA9IC0xOworCX0KKyAgICB9CisKKyAgcmV0dXJuIHJsOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NkaXZfdWkuYyBiL21wei9jZGl2X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhMWM0OQotLS0gL2Rldi9udWxsCisrKyBiL21wei9jZGl2X3VpLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIG1wel9jZGl2X3VpIC0tIERpdmlzaW9uIHJvdW5kaW5nIHRoZSBxdW90aWVudCB0b3dhcmRzICtpbmZpbml0eS4gIFRoZQorICAgcmVtYWluZGVyIGdldHMgdGhlIG9wcG9zaXRlIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yLiAgSW4gb3JkZXIgdG8gbWFrZSBpdAorICAgYWx3YXlzIGZpdCBpbnRvIHRoZSByZXR1cm4gdHlwZSwgdGhlIG5lZ2F0aXZlIG9mIHRoZSB0cnVlIHJlbWFpbmRlciBpcworICAgcmV0dXJuZWQuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel9jZGl2X3VpIChtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uOworICBtcF9wdHIgbnA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBucCA9IFBUUihkaXZpZGVuZCk7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKGRpdmlzb3IgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90IGRwWzJdLCBycFsyXTsKKyAgICAgIG1wX3B0ciBxcDsKKyAgICAgIG1wX3NpemVfdCBybjsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBpZiAobm4gPT0gMSkJCS8qIHRkaXZfcXIgcmVxdWlyZW1lbnRzOyB0ZXN0ZWQgYWJvdmUgZm9yIDAgKi8KKwl7CisJICBybCA9IG5wWzBdOworCSAgcnBbMF0gPSBybDsKKwl9CisgICAgICBlbHNlCisJeworCSAgVE1QX01BUks7CisJICBkcFswXSA9IGRpdmlzb3IgJiBHTVBfTlVNQl9NQVNLOworCSAgZHBbMV0gPSBkaXZpc29yID4+IEdNUF9OVU1CX0JJVFM7CisJICBxcCA9IFRNUF9BTExPQ19MSU1CUyAobm4gLSAyICsgMSk7CisJICBtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIGRwLCAobXBfc2l6ZV90KSAyKTsKKwkgIFRNUF9GUkVFOworCSAgcmwgPSBycFswXSArIChycFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKwl9CisKKyAgICAgIGlmIChybCAhPSAwICYmIG5zID49IDApCisJeworCSAgcmwgPSBkaXZpc29yIC0gcmw7CisJICBycFswXSA9IHJsICYgR01QX05VTUJfTUFTSzsKKwkgIHJwWzFdID0gcmwgPj4gR01QX05VTUJfQklUUzsKKwl9CisKKyAgICAgIHJuID0gMSArIChybCA+IEdNUF9OVU1CX01BWCk7ICBybiAtPSAocnBbcm4gLSAxXSA9PSAwKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX21vZF8xIChucCwgbm4sIChtcF9saW1iX3QpIGRpdmlzb3IpOworICAgICAgaWYgKHJsID09IDApCisJOworICAgICAgZWxzZQorCXsKKwkgIGlmIChucyA+PSAwKQorCSAgICBybCA9IGRpdmlzb3IgLSBybDsKKwl9CisgICAgfQorCisgIHJldHVybiBybDsKK30KZGlmZiAtLWdpdCBhL21wei9jZmRpdl9xXzJleHAuYyBiL21wei9jZmRpdl9xXzJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNlYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NmZGl2X3FfMmV4cC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBtcHpfY2Rpdl9xXzJleHAsIG1wel9mZGl2X3FfMmV4cCAtLSBxdW90aWVudCBmcm9tIG1weiBkaXZpZGVkIGJ5IDJebi4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDEsIDIwMDIsIDIwMDQsIDIwMTIsCisyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBkaXI9PTEgZm9yIGNlaWwsIGRpcj09LTEgZm9yIGZsb29yICovCisKK3N0YXRpYyB2b2lkIF9fZ21wel9jZmRpdl9xXzJleHAgKFJFR1BBUk1fM18xIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCwgaW50KSkgUkVHUEFSTV9BVFRSICgxKTsKKyNkZWZpbmUgY2ZkaXZfcV8yZXhwKHcsdSxjbnQsZGlyKSAgX19nbXB6X2NmZGl2X3FfMmV4cCAoUkVHUEFSTV8zXzEgKHcsdSxjbnQsZGlyKSkKKworUkVHUEFSTV9BVFRSICgxKSBzdGF0aWMgdm9pZAorY2ZkaXZfcV8yZXhwIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSwgbXBfYml0Y250X3QgY250LCBpbnQgZGlyKQoreworICBtcF9zaXplX3QgIHdzaXplLCB1c2l6ZSwgYWJzX3VzaXplLCBsaW1iX2NudCwgaTsKKyAgbXBfc3JjcHRyICB1cDsKKyAgbXBfcHRyICAgICB3cDsKKyAgbXBfbGltYl90ICByb3VuZCwgcm1hc2s7CisKKyAgdXNpemUgPSBTSVogKHUpOworICBhYnNfdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgbGltYl9jbnQgPSBjbnQgLyBHTVBfTlVNQl9CSVRTOworICB3c2l6ZSA9IGFic191c2l6ZSAtIGxpbWJfY250OworICBpZiAod3NpemUgPD0gMCkKKyAgICB7CisgICAgICAvKiB1IDwgMioqY250LCBzbyByZXN1bHQgMSwgMCBvciAtMSBhY2NvcmRpbmcgdG8gcm91bmRpbmcgKi8KKyAgICAgIE1QWl9ORVdBTExPQyAodywgMSlbMF0gPSAxOworICAgICAgU0laKHcpID0gKHVzaXplID09IDAgfHwgKHVzaXplIF4gZGlyKSA8IDAgPyAwIDogZGlyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogKzEgbGltYiB0byBhbGxvdyBmb3IgbXBuX2FkZF8xIGJlbG93ICovCisgIHdwID0gTVBaX1JFQUxMT0MgKHcsIHdzaXplKzEpOworCisgIC8qIENoZWNrIGZvciByb3VuZGluZyBpZiBkaXJlY3Rpb24gbWF0Y2hlcyB1IHNpZ24uCisgICAgIFNldCByb3VuZCBpZiB3ZSdyZSBza2lwcGluZyBub24temVybyBsaW1icy4gICovCisgIHVwID0gUFRSKHUpOworICByb3VuZCA9IDA7CisgIHJtYXNrID0gKCh1c2l6ZSBeIGRpcikgPj0gMCA/IE1QX0xJTUJfVF9NQVggOiAwKTsKKyAgaWYgKHJtYXNrICE9IDApCisgICAgZm9yIChpID0gMDsgaSA8IGxpbWJfY250ICYmIHJvdW5kID09IDA7IGkrKykKKyAgICAgIHJvdW5kID0gdXBbaV07CisKKyAgY250ICU9IEdNUF9OVU1CX0JJVFM7CisgIGlmIChjbnQgIT0gMCkKKyAgICB7CisgICAgICByb3VuZCB8PSBybWFzayAmIG1wbl9yc2hpZnQgKHdwLCB1cCArIGxpbWJfY250LCB3c2l6ZSwgY250KTsKKyAgICAgIHdzaXplIC09ICh3cFt3c2l6ZSAtIDFdID09IDApOworICAgIH0KKyAgZWxzZQorICAgIE1QTl9DT1BZX0lOQ1IgKHdwLCB1cCArIGxpbWJfY250LCB3c2l6ZSk7CisKKyAgaWYgKHJvdW5kICE9IDApCisgICAgeworICAgICAgaWYgKHdzaXplICE9IDApCisJeworCSAgbXBfbGltYl90IGN5OworCSAgY3kgPSBtcG5fYWRkXzEgKHdwLCB3cCwgd3NpemUsIENOU1RfTElNQigxKSk7CisJICB3cFt3c2l6ZV0gPSBjeTsKKwkgIHdzaXplICs9IGN5OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBzaGlmdGVkIHNvbWV0aGluZyB0byB6ZXJvLiAgKi8KKwkgIHdwWzBdID0gMTsKKwkgIHdzaXplID0gMTsKKwl9CisgICAgfQorICBTSVoodykgPSAodXNpemUgPj0gMCA/IHdzaXplIDogLXdzaXplKTsKK30KKworCit2b2lkCittcHpfY2Rpdl9xXzJleHAgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1LCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIGNmZGl2X3FfMmV4cCAodywgdSwgY250LCAxKTsKK30KKwordm9pZAorbXB6X2ZkaXZfcV8yZXhwIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSwgbXBfYml0Y250X3QgY250KQoreworICBjZmRpdl9xXzJleHAgKHcsIHUsIGNudCwgLTEpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NmZGl2X3JfMmV4cC5jIGIvbXB6L2NmZGl2X3JfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGI5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY2ZkaXZfcl8yZXhwLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qIG1wel9jZGl2X3JfMmV4cCwgbXB6X2ZkaXZfcl8yZXhwIC0tIHJlbWFpbmRlciBmcm9tIG1weiBkaXZpZGVkIGJ5IDJebi4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEJpdCBtYXNrIG9mICJuIiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGEgbGltYi4gKi8KKyNkZWZpbmUgTE9XX01BU0sobikgICAoKENOU1RfTElNQigxKSA8PCAobikpIC0gMSkKKworCisvKiBkaXI9PTEgZm9yIGNlaWwsIGRpcj09LTEgZm9yIGZsb29yICovCisKK3N0YXRpYyB2b2lkIF9fZ21wel9jZmRpdl9yXzJleHAgKFJFR1BBUk1fM18xIChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcF9iaXRjbnRfdCwgaW50KSkgUkVHUEFSTV9BVFRSICgxKTsKKyNkZWZpbmUgY2ZkaXZfcl8yZXhwKHcsdSxjbnQsZGlyKSAgX19nbXB6X2NmZGl2X3JfMmV4cCAoUkVHUEFSTV8zXzEgKHcsIHUsIGNudCwgZGlyKSkKKworUkVHUEFSTV9BVFRSICgxKSBzdGF0aWMgdm9pZAorY2ZkaXZfcl8yZXhwIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSwgbXBfYml0Y250X3QgY250LCBpbnQgZGlyKQoreworICBtcF9zaXplX3QgIHVzaXplLCBhYnNfdXNpemUsIGxpbWJfY250LCBpOworICBtcF9zcmNwdHIgIHVwOworICBtcF9wdHIgICAgIHdwOworICBtcF9saW1iX3QgIGhpZ2g7CisKKyAgdXNpemUgPSBTSVoodSk7CisgIGlmICh1c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIFNJWih3KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGxpbWJfY250ID0gY250IC8gR01QX05VTUJfQklUUzsKKyAgY250ICU9IEdNUF9OVU1CX0JJVFM7CisgIGFic191c2l6ZSA9IEFCUyAodXNpemUpOworCisgIC8qIE1QWl9SRUFMTE9DKHcpIGJlbG93IGlzIG9ubHkgd2hlbiB3IT11LCBzbyB3ZSBjYW4gZmV0Y2ggUFRSKHUpIGhlcmUKKyAgICAgbmljZSBhbmQgZWFybHkgKi8KKyAgdXAgPSBQVFIodSk7CisKKyAgaWYgKCh1c2l6ZSBeIGRpcikgPCAwKQorICAgIHsKKyAgICAgIC8qIFJvdW5kIHRvd2FyZHMgemVybywgbWVhbnMganVzdCB0cnVuY2F0ZSAqLworCisgICAgICBpZiAodyA9PSB1KQorCXsKKwkgIC8qIGlmIGFscmVhZHkgc21hbGxlciB0aGFuIGxpbWJfY250IHRoZW4gZG8gbm90aGluZyAqLworCSAgaWYgKGFic191c2l6ZSA8PSBsaW1iX2NudCkKKwkgICAgcmV0dXJuOworCSAgd3AgPSAobXBfcHRyKSB1cDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaSA9IE1JTiAoYWJzX3VzaXplLCBsaW1iX2NudCsxKTsKKwkgIHdwID0gTVBaX05FV0FMTE9DICh3LCBpKTsKKwkgIE1QTl9DT1BZICh3cCwgdXAsIGkpOworCisJICAvKiBpZiBzbWFsbGVyIHRoYW4gbGltYl9jbnQgdGhlbiBvbmx5IHRoZSBjb3B5IGlzIG5lZWRlZCAqLworCSAgaWYgKGFic191c2l6ZSA8PSBsaW1iX2NudCkKKwkgICAgeworCSAgICAgIFNJWih3KSA9IHVzaXplOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBSb3VuZCBhd2F5IGZyb20gemVybywgbWVhbnMgdHdvcyBjb21wbGVtZW50IGlmIG5vbi16ZXJvICovCisKKyAgICAgIC8qIGlmIHUhPTAgYW5kIHNtYWxsZXIgdGhhbiBkaXZpc29yLCB0aGVuIG11c3QgbmVnYXRlICovCisgICAgICBpZiAoYWJzX3VzaXplIDw9IGxpbWJfY250KQorCWdvdG8gbmVnYXRlOworCisgICAgICAvKiBpZiBub24temVybyBsb3cgbGltYiwgdGhlbiBtdXN0IG5lZ2F0ZSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWJfY250OyBpKyspCisJaWYgKHVwW2ldICE9IDApCisJICBnb3RvIG5lZ2F0ZTsKKworICAgICAgLyogaWYgbm9uLXplcm8gcGFydGlhbCBsaW1iLCB0aGVuIG11c3QgbmVnYXRlICovCisgICAgICBpZiAoKHVwW2xpbWJfY250XSAmIExPV19NQVNLIChjbnQpKSAhPSAwKQorCWdvdG8gbmVnYXRlOworCisgICAgICAvKiBvdGhlcndpc2UgbG93IGJpdHMgb2YgdSBhcmUgemVybywgc28gdGhhdCdzIHRoZSByZXN1bHQgKi8KKyAgICAgIFNJWih3KSA9IDA7CisgICAgICByZXR1cm47CisKKyAgICBuZWdhdGU6CisgICAgICAvKiB0d29zIGNvbXBsZW1lbnQgbmVnYXRpb24gdG8gZ2V0IDIqKmNudC11ICovCisKKyAgICAgIHdwID0gTVBaX1JFQUxMT0MgKHcsIGxpbWJfY250KzEpOworICAgICAgdXAgPSBQVFIodSk7CisKKyAgICAgIC8qIE9uZXMgY29tcGxlbWVudCAqLworICAgICAgaSA9IE1JTiAoYWJzX3VzaXplLCBsaW1iX2NudCsxKTsKKyAgICAgIEFTU0VSVF9DQVJSWSAobXBuX25lZyAod3AsIHVwLCBpKSk7CisgICAgICBmb3IgKCA7IGkgPD0gbGltYl9jbnQ7IGkrKykKKwl3cFtpXSA9IEdNUF9OVU1CX01BWDsKKworICAgICAgdXNpemUgPSAtdXNpemU7CisgICAgfQorCisgIC8qIE1hc2sgdGhlIGhpZ2ggbGltYiAqLworICBoaWdoID0gd3BbbGltYl9jbnRdOworICBoaWdoICY9IExPV19NQVNLIChjbnQpOworICB3cFtsaW1iX2NudF0gPSBoaWdoOworCisgIC8qIFN0cmlwIGFueSBjb25zZXF1ZW50IGhpZ2ggemVyb3MgKi8KKyAgd2hpbGUgKGhpZ2ggPT0gMCkKKyAgICB7CisgICAgICBsaW1iX2NudC0tOworICAgICAgaWYgKGxpbWJfY250IDwgMCkKKwl7CisJICBTSVoodykgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICAgIGhpZ2ggPSB3cFtsaW1iX2NudF07CisgICAgfQorCisgIGxpbWJfY250Kys7CisgIFNJWih3KSA9ICh1c2l6ZSA+PSAwID8gbGltYl9jbnQgOiAtbGltYl9jbnQpOworfQorCisKK3ZvaWQKK21wel9jZGl2X3JfMmV4cCAobXB6X3B0ciB3LCBtcHpfc3JjcHRyIHUsIG1wX2JpdGNudF90IGNudCkKK3sKKyAgY2ZkaXZfcl8yZXhwICh3LCB1LCBjbnQsIDEpOworfQorCit2b2lkCittcHpfZmRpdl9yXzJleHAgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1LCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIGNmZGl2X3JfMmV4cCAodywgdSwgY250LCAtMSk7Cit9CmRpZmYgLS1naXQgYS9tcHovY2xlYXIuYyBiL21wei9jbGVhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzM4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY2xlYXIuYwpAQCAtMCwwICsxLDQwIEBACisvKiBtcHpfY2xlYXIgLS0gZGUtYWxsb2NhdGUgdGhlIHNwYWNlIG9jY3VwaWVkIGJ5IHRoZSBkeW5hbWljIGRpZ2l0IHNwYWNlIG9mCisgICBhbiBpbnRlZ2VyLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAwLCAyMDAxLCAyMDEyLCAyMDE0LCAyMDE1IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9jbGVhciAobXB6X3B0ciB4KQoreworICBpZiAoQUxMT0MgKHgpKQorICAgIF9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoUFRSICh4KSwgQUxMT0MoeCkpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NsZWFycy5jIGIvbXB6L2NsZWFycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzI1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY2xlYXJzLmMKQEAgLTAsMCArMSw1MCBAQAorLyogbXB6X2NsZWFycygpIC0tIENsZWFyIG11bHRpcGxlIG1wel90IHZhcmlhYmxlcy4KKworQ29weXJpZ2h0IDIwMDksIDIwMTQsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfY2xlYXJzIChtcHpfcHRyIHgsIC4uLikKK3sKKyAgdmFfbGlzdCAgYXA7CisKKyAgdmFfc3RhcnQgKGFwLCB4KTsKKworICBkbworICAgIHsKKyAgICAgIGlmIChBTExPQyAoeCkpCisJX19HTVBfRlJFRV9GVU5DX0xJTUJTIChQVFIgKHgpLCBBTExPQyAoeCkpOworICAgICAgeCA9IHZhX2FyZyAoYXAsIG1wel9wdHIpOworICAgIH0KKyAgd2hpbGUgKHggIT0gTlVMTCk7CisKKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9tcHovY2xyYml0LmMgYi9tcHovY2xyYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzYzg1NAotLS0gL2Rldi9udWxsCisrKyBiL21wei9jbHJiaXQuYwpAQCAtMCwwICsxLDExNSBAQAorLyogbXB6X2NscmJpdCAtLSBjbGVhciBhIHNwZWNpZmllZCBiaXQuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDEsIDIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfY2xyYml0IChtcHpfcHRyIGQsIG1wX2JpdGNudF90IGJpdF9pZHgpCit7CisgIG1wX3NpemVfdCBkc2l6ZSA9IFNJWiAoZCk7CisgIG1wX3B0ciBkcCA9IFBUUiAoZCk7CisgIG1wX3NpemVfdCBsaW1iX2lkeDsKKyAgbXBfbGltYl90IG1hc2s7CisKKyAgbGltYl9pZHggPSBiaXRfaWR4IC8gR01QX05VTUJfQklUUzsKKyAgbWFzayA9IENOU1RfTElNQigxKSA8PCAoYml0X2lkeCAlIEdNUF9OVU1CX0JJVFMpOworICBpZiAoZHNpemUgPj0gMCkKKyAgICB7CisgICAgICBpZiAobGltYl9pZHggPCBkc2l6ZSkKKwl7CisJICBtcF9saW1iX3QgIGRsaW1iOworCSAgZGxpbWIgPSBkcFtsaW1iX2lkeF0gJiB+bWFzazsKKwkgIGRwW2xpbWJfaWR4XSA9IGRsaW1iOworCisJICBpZiAoVU5MSUtFTFkgKChkbGltYiA9PSAwKSArIGxpbWJfaWR4ID09IGRzaXplKSkgLyogZHNpemUgPT0gbGltYl9pZHggKyAxICovCisJICAgIHsKKwkgICAgICAvKiBoaWdoIGxpbWIgYmVjYW1lIHplcm8sIG11c3Qgbm9ybWFsaXplICovCisJICAgICAgTVBOX05PUk1BTElaRSAoZHAsIGxpbWJfaWR4KTsKKwkgICAgICBTSVogKGQpID0gbGltYl9pZHg7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNpbXVsYXRlIHR3bydzIGNvbXBsZW1lbnQgYXJpdGhtZXRpYywgaS5lLiBzaW11bGF0ZQorCSAxLiBTZXQgT1AgPSB+KE9QIC0gMSkgW3dpdGggaW5maW5pdGVseSBtYW55IGxlYWRpbmcgb25lc10uCisJIDIuIGNsZWFyIHRoZSBiaXQuCisJIDMuIFNldCBPUCA9IH5PUCArIDEuICAqLworCisgICAgICBkc2l6ZSA9IC1kc2l6ZTsKKworICAgICAgaWYgKGxpbWJfaWR4IDwgZHNpemUpCisJeworCSAgbXBfc2l6ZV90IHplcm9fYm91bmQ7CisKKwkgIC8qIE5vIGluZGV4IHVwcGVyIGJvdW5kIG9uIHRoaXMgbG9vcCwgd2UncmUgc3VyZSB0aGVyZSdzIGEgbm9uLXplcm8gbGltYgorCSAgICAgc29vbmVyIG9yIGxhdGVyLiAgKi8KKwkgIHplcm9fYm91bmQgPSAwOworCSAgd2hpbGUgKGRwW3plcm9fYm91bmRdID09IDApCisJICAgIHplcm9fYm91bmQrKzsKKworCSAgaWYgKGxpbWJfaWR4ID4gemVyb19ib3VuZCkKKwkgICAgeworCSAgICAgIGRwW2xpbWJfaWR4XSB8PSBtYXNrOworCSAgICB9CisJICBlbHNlIGlmIChsaW1iX2lkeCA9PSB6ZXJvX2JvdW5kKQorCSAgICB7CisJICAgICAgbXBfbGltYl90ICBkbGltYjsKKwkgICAgICBkbGltYiA9ICgoKGRwW2xpbWJfaWR4XSAtIDEpIHwgbWFzaykgKyAxKSAmIEdNUF9OVU1CX01BU0s7CisJICAgICAgZHBbbGltYl9pZHhdID0gZGxpbWI7CisKKwkgICAgICBpZiAoZGxpbWIgPT0gMCkKKwkJeworCQkgIC8qIEluY3JlbWVudCBhdCBsaW1iX2lkeCArIDEuICBFeHRlbmQgdGhlIG51bWJlciB3aXRoIGEgemVybyBsaW1iCisJCSAgICAgZm9yIHNpbXBsaWNpdHkuICAqLworCQkgIGRwID0gTVBaX1JFQUxMT0MgKGQsIGRzaXplICsgMSk7CisJCSAgZHBbZHNpemVdID0gMDsKKwkJICBNUE5fSU5DUl9VIChkcCArIGxpbWJfaWR4ICsgMSwgZHNpemUgLSBsaW1iX2lkeCwgMSk7CisJCSAgZHNpemUgKz0gZHBbZHNpemVdOworCisJCSAgU0laIChkKSA9IC1kc2l6ZTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVWdoLiAgVGhlIGJpdCBzaG91bGQgYmUgY2xlYXJlZCBvdXRzaWRlIG9mIHRoZSBlbmQgb2YgdGhlCisJICAgICBudW1iZXIuICBXZSBoYXZlIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBudW1iZXIuICAqLworCSAgZHAgPSBNUFpfUkVBTExPQyAoZCwgbGltYl9pZHggKyAxKTsKKwkgIFNJWiAoZCkgPSAtKGxpbWJfaWR4ICsgMSk7CisJICBNUE5fWkVSTyAoZHAgKyBkc2l6ZSwgbGltYl9pZHggLSBkc2l6ZSk7CisJICBkcFtsaW1iX2lkeF0gPSBtYXNrOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovY21wLmMgYi9tcHovY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YzAyMwotLS0gL2Rldi9udWxsCisrKyBiL21wei9jbXAuYwpAQCAtMCwwICsxLDUzIEBACisvKiBtcHpfY21wKHUsdikgLS0gQ29tcGFyZSBVLCBWLiAgUmV0dXJuIHBvc2l0aXZlLCB6ZXJvLCBvciBuZWdhdGl2ZQorICAgYmFzZWQgb24gaWYgVSA+IFYsIFUgPT0gViwgb3IgVSA8IFYuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAxLCAyMDAyLCAyMDExLCAyMDIwIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXB6X2NtcCAobXB6X3NyY3B0ciB1LCBtcHpfc3JjcHRyIHYpIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc2l6ZV90ICB1c2l6ZSwgdnNpemUsIGFzaXplOworICBtcF9zcmNwdHIgIHVwLCB2cDsKKyAgaW50ICAgICAgICBjbXA7CisKKyAgdXNpemUgPSBTSVoodSk7CisgIHZzaXplID0gU0laKHYpOworICAvKiBDYW5ub3QgdXNlIHVzaXplIC0gdnNpemUsIG1heSBvdmVyZmxvdyBhbiAiaW50IiAqLworICBpZiAodXNpemUgIT0gdnNpemUpCisgICAgcmV0dXJuICh1c2l6ZSA+IHZzaXplKSA/IDEgOiAtMTsKKworICBhc2l6ZSA9IEFCUyAodXNpemUpOworICB1cCA9IFBUUih1KTsKKyAgdnAgPSBQVFIodik7CisgIE1QTl9DTVAgKGNtcCwgdXAsIHZwLCBhc2l6ZSk7CisgIHJldHVybiAodXNpemUgPj0gMCA/IGNtcCA6IC1jbXApOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NtcF9kLmMgYi9tcHovY21wX2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI1ZThiCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NtcF9kLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIG1wel9jbXBfZCAtLSBjb21wYXJlIGFic29sdXRlIHZhbHVlcyBvZiBtcHogYW5kIGRvdWJsZS4KKworQ29weXJpZ2h0IDIwMDEtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9GTE9BVF9ICisjaW5jbHVkZSA8ZmxvYXQuaD4gIC8qIGZvciBEQkxfTUFYICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2RlZmluZSBSRVRVUk5fQ01QKHpsLCBkbCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHpsaW1iID0gKHpsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRsaW1iID0gKGRsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh6bGltYiAhPSBkbGltYikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuICh6bGltYiA+PSBkbGltYiA/IHJldCA6IC1yZXQpOyAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFVFVSTl9OT05aRVJPKHB0ciwgc2l6ZSwgdmFsKSAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChfX2kgPSAoc2l6ZSktMTsgX19pID49IDA7IF9faS0tKSAgICAgICBcCisgICAgICBpZiAoKHB0cilbX19pXSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworaW50CittcHpfY21wX2QgKG1wel9zcmNwdHIgeiwgZG91YmxlIGQpCit7CisgIG1wX2xpbWJfdCAgZGFycmF5W0xJTUJTX1BFUl9ET1VCTEVdLCB6bGltYiwgZGxpbWI7CisgIG1wX3NyY3B0ciAgenA7CisgIG1wX3NpemVfdCAgenNpemU7CisgIGludCAgICAgICAgZGV4cCwgcmV0OworCisgIC8qIGQ9TmFOIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uLCB0aGVyZSdzIG5vIHNlbnNpYmxlIHJldHVybiB2YWx1ZS4KKyAgICAgZD1JbmYgb3IgLUluZiBpcyBhbHdheXMgYmlnZ2VyIHRoYW4gei4gICovCisgIERPVUJMRV9OQU5fSU5GX0FDVElPTiAoZCwgX19nbXBfaW52YWxpZF9vcGVyYXRpb24gKCksIGdvdG8gel96ZXJvKTsKKworICAvKiAxLiBFaXRoZXIgb3BlcmFuZCB6ZXJvLiAqLworICB6c2l6ZSA9IFNJWih6KTsKKyAgaWYgKGQgPT0gMC4wKQorICAgIHJldHVybiB6c2l6ZTsKKyAgaWYgKHpzaXplID09IDApCisgICAgeworICAgIHpfemVybzoKKyAgICAgIHJldHVybiAoZCA8IDAuMCA/IDEgOiAtMSk7CisgICAgfQorCisgIC8qIDIuIE9wcG9zaXRlIHNpZ25zLiAqLworICBpZiAoenNpemUgPj0gMCkKKyAgICB7CisgICAgICBpZiAoZCA8IDAuMCkKKwlyZXR1cm4gMTsgICAgLyogPj0wIGNtcCA8MCAqLworICAgICAgcmV0ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZCA+PSAwLjApCisJcmV0dXJuIC0xOyAgIC8qIDwwIGNtcCA+PTAgKi8KKyAgICAgIHJldCA9IC0xOworICAgICAgZCA9IC1kOworICAgICAgenNpemUgPSAtenNpemU7CisgICAgfQorCisgIC8qIDMuIFNtYWxsIGQsIGtub3dpbmcgYWJzKHopID49IDEuICovCisgIGlmIChkIDwgMS4wKQorICAgIHJldHVybiByZXQ7CisKKyAgZGV4cCA9IF9fZ21wX2V4dHJhY3RfZG91YmxlIChkYXJyYXksIGQpOworICBBU1NFUlQgKGRleHAgPj0gMSk7CisKKyAgLyogNC4gQ2hlY2sgZm9yIGRpZmZlcmVudCBoaWdoIGxpbWIgcG9zaXRpb25zLiAqLworICBpZiAoenNpemUgIT0gZGV4cCkKKyAgICByZXR1cm4gKHpzaXplID49IGRleHAgPyByZXQgOiAtcmV0KTsKKworICAvKiA1LiBMaW1iIGRhdGEuICovCisgIHpwID0gUFRSKHopOworCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAyCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTFdLCBkYXJyYXlbMV0pOworICBpZiAoenNpemUgPT0gMSkKKyAgICByZXR1cm4gKGRhcnJheVswXSAhPSAwID8gLXJldCA6IDApOworCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTJdLCBkYXJyYXlbMF0pOworICBSRVRVUk5fTk9OWkVSTyAoenAsIHpzaXplLTIsIHJldCk7CisjZW5kaWYKKworI2lmIExJTUJTX1BFUl9ET1VCTEUgPT0gMworICBSRVRVUk5fQ01QICh6cFt6c2l6ZS0xXSwgZGFycmF5WzJdKTsKKyAgaWYgKHpzaXplID09IDEpCisgICAgcmV0dXJuICgoZGFycmF5WzBdIHwgZGFycmF5WzFdKSAhPSAwID8gLXJldCA6IDApOworCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTJdLCBkYXJyYXlbMV0pOworICBpZiAoenNpemUgPT0gMikKKyAgICByZXR1cm4gKGRhcnJheVswXSAhPSAwID8gLXJldCA6IDApOworCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTNdLCBkYXJyYXlbMF0pOworICBSRVRVUk5fTk9OWkVSTyAoenAsIHpzaXplLTMsIHJldCk7CisjZW5kaWYKKworI2lmIExJTUJTX1BFUl9ET1VCTEUgPj0gNAorICB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8PSBMSU1CU19QRVJfRE9VQkxFOyBpKyspCisgICAgICB7CisJUkVUVVJOX0NNUCAoenBbenNpemUtaV0sIGRhcnJheVtMSU1CU19QRVJfRE9VQkxFLWldKTsKKwlpZiAoaSA+PSB6c2l6ZSkKKwkgIFJFVFVSTl9OT05aRVJPIChkYXJyYXksIExJTUJTX1BFUl9ET1VCTEUtaSwgLXJldCk7CisgICAgICB9CisgICAgUkVUVVJOX05PTlpFUk8gKHpwLCB6c2l6ZS1MSU1CU19QRVJfRE9VQkxFLCByZXQpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL21wei9jbXBfc2kuYyBiL21wei9jbXBfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzI5NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NtcF9zaS5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIG1wel9jbXBfc2kodSx2KSAtLSBDb21wYXJlIGFuIGludGVnZXIgVSB3aXRoIGEgc2luZ2xlLXdvcmQgaW50IFYuCisgICBSZXR1cm4gcG9zaXRpdmUsIHplcm8sIG9yIG5lZ2F0aXZlIGJhc2VkIG9uIGlmIFUgPiBWLCBVID09IFYsIG9yIFUgPCBWLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk2LCAyMDAwLTIwMDIsIDIwMTIsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitpbnQKK19tcHpfY21wX3NpIChtcHpfc3JjcHRyIHUsIHNpZ25lZCBsb25nIGludCB2X2RpZ2l0KSBfX0dNUF9OT1RIUk9XCit7CisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIC8qIEZJWE1FLiAgVGhpcyBpc24ndCB2ZXJ5IHByZXR0eS4gICovCisgIG1wel90IHRtcDsKKyAgbXBfbGltYl90IHR0WzJdOworICBQVFIodG1wKSA9IHR0OworICBBTExPQyh0bXApID0gMjsKKyAgbXB6X3NldF9zaSAodG1wLCB2X2RpZ2l0KTsKKyAgcmV0dXJuIG1wel9jbXAgKHUsIHRtcCk7CisjZWxzZQorCisgIG1wX3NpemVfdCB2c2l6ZSwgdXNpemU7CisKKyAgdXNpemUgPSBTSVogKHUpOworICB2c2l6ZSA9ICh2X2RpZ2l0ID4gMCkgLSAodl9kaWdpdCA8IDApOworCisgIGlmICgodXNpemUgPT0gMCkgfCAodXNpemUgIT0gdnNpemUpKQorICAgIHJldHVybiB1c2l6ZSAtIHZzaXplOworICBlbHNlIHsKKyAgICBtcF9saW1iX3QgdV9kaWdpdCwgYWJzdl9kaWdpdDsKKworICAgIHVfZGlnaXQgPSBQVFIgKHUpWzBdOworICAgIGFic3ZfZGlnaXQgPSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZywgdl9kaWdpdCk7CisKKyAgICBpZiAodV9kaWdpdCA9PSBhYnN2X2RpZ2l0KQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodV9kaWdpdCA+IGFic3ZfZGlnaXQpCisgICAgICByZXR1cm4gdXNpemU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIC11c2l6ZTsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tcHovY21wX3VpLmMgYi9tcHovY21wX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MGFiNwotLS0gL2Rldi9udWxsCisrKyBiL21wei9jbXBfdWkuYwpAQCAtMCwwICsxLDc3IEBACisvKiBtcHpfY21wX3VpLmMgLS0gQ29tcGFyZSBhbiBtcHpfdCBhIHdpdGggYW4gbXBfbGltYl90IGIuICBSZXR1cm4gcG9zaXRpdmUsCisgIHplcm8sIG9yIG5lZ2F0aXZlIGJhc2VkIG9uIGlmIGEgPiBiLCBhID09IGIsIG9yIGEgPCBiLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk2LCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CitfbXB6X2NtcF91aSAobXB6X3NyY3B0ciB1LCB1bnNpZ25lZCBsb25nIGludCB2X2RpZ2l0KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3B0ciB1cDsKKyAgbXBfc2l6ZV90IHVuOworICBtcF9saW1iX3QgdWw7CisKKyAgdXAgPSBQVFIodSk7CisgIHVuID0gU0laKHUpOworCisgIGlmICh1biA9PSAwKQorICAgIHJldHVybiAtKHZfZGlnaXQgIT0gMCk7CisKKyAgaWYgKHVuID09IDEpCisgICAgeworICAgICAgdWwgPSB1cFswXTsKKyAgICAgIGlmICh1bCA+IHZfZGlnaXQpCisJcmV0dXJuIDE7CisgICAgICBpZiAodWwgPCB2X2RpZ2l0KQorCXJldHVybiAtMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIEdNUF9OQUlMX0JJVFMgIT0gMAorICBpZiAodl9kaWdpdCA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBpZiAodW4gPT0gMikKKwl7CisJICB1bCA9IHVwWzBdICsgKHVwWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworCisJICBpZiAoKHVwWzFdID4+IEdNUF9OQUlMX0JJVFMpICE9IDApCisJICAgIHJldHVybiAxOworCisJICBpZiAodWwgPiB2X2RpZ2l0KQorCSAgICByZXR1cm4gMTsKKwkgIGlmICh1bCA8IHZfZGlnaXQpCisJICAgIHJldHVybiAtMTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gdW4gPiAwID8gMSA6IC0xOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NtcGFicy5jIGIvbXB6L2NtcGFicy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOWYxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY21wYWJzLmMKQEAgLTAsMCArMSw1MyBAQAorLyogbXB6X2NtcGFicyh1LHYpIC0tIENvbXBhcmUgVSwgVi4gIFJldHVybiBwb3NpdGl2ZSwgemVybywgb3IgbmVnYXRpdmUKKyAgIGJhc2VkIG9uIGlmIFUgPiBWLCBVID09IFYsIG9yIFUgPCBWLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMjAwMC0yMDAyLCAyMDIwIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CittcHpfY21wYWJzIChtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3QgIHVzaXplLCB2c2l6ZTsKKyAgbXBfc3JjcHRyICB1cCwgdnA7CisgIGludCAgICAgICAgY21wOworCisgIHVzaXplID0gQUJTSVogKHUpOworICB2c2l6ZSA9IEFCU0laICh2KTsKKyAgLyogQ2Fubm90IHVzZSB1c2l6ZSAtIHZzaXplLCBtYXkgb3ZlcmZsb3cgYW4gImludCIgKi8KKyAgaWYgKHVzaXplICE9IHZzaXplKQorICAgIHJldHVybiAodXNpemUgPiB2c2l6ZSkgPyAxIDogLTE7CisKKyAgdXAgPSBQVFIodSk7CisgIHZwID0gUFRSKHYpOworICBNUE5fQ01QIChjbXAsIHVwLCB2cCwgdXNpemUpOworICByZXR1cm4gY21wOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NtcGFic19kLmMgYi9tcHovY21wYWJzX2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQzMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NtcGFic19kLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIG1wel9jbXBhYnNfZCAtLSBjb21wYXJlIGFic29sdXRlIHZhbHVlcyBvZiBtcHogYW5kIGRvdWJsZS4KKworQ29weXJpZ2h0IDIwMDEtMjAwMywgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgSEFWRV9GTE9BVF9ICisjaW5jbHVkZSA8ZmxvYXQuaD4gIC8qIGZvciBEQkxfTUFYICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2RlZmluZSBSRVRVUk5fQ01QKHpsLCBkbCkgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgemxpbWIgPSAoemwpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRsaW1iID0gKGRsKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoemxpbWIgIT0gZGxpbWIpICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gKHpsaW1iID49IGRsaW1iID8gMSA6IC0xKTsgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFVFVSTl9OT05aRVJPKHB0ciwgc2l6ZSwgdmFsKSAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChfX2kgPSAoc2l6ZSktMTsgX19pID49IDA7IF9faS0tKSAgICAgICBcCisgICAgICBpZiAoKHB0cilbX19pXSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworaW50CittcHpfY21wYWJzX2QgKG1wel9zcmNwdHIgeiwgZG91YmxlIGQpCit7CisgIG1wX2xpbWJfdCAgZGFycmF5W0xJTUJTX1BFUl9ET1VCTEVdLCB6bGltYiwgZGxpbWI7CisgIG1wX3NyY3B0ciAgenA7CisgIG1wX3NpemVfdCAgenNpemU7CisgIGludCAgICAgICAgZGV4cDsKKworICAvKiBkPU5hTiBpcyBhbiBpbnZhbGlkIG9wZXJhdGlvbiwgdGhlcmUncyBubyBzZW5zaWJsZSByZXR1cm4gdmFsdWUuCisgICAgIGQ9SW5mIG9yIC1JbmYgaXMgYWx3YXlzIGJpZ2dlciB0aGFuIHouICAqLworICBET1VCTEVfTkFOX0lORl9BQ1RJT04gKGQsIF9fZ21wX2ludmFsaWRfb3BlcmF0aW9uICgpLCByZXR1cm4gLTEpOworCisgIC8qIDEuIENoZWNrIGZvciBlaXRoZXIgb3BlcmFuZCB6ZXJvLiAqLworICB6c2l6ZSA9IFNJWih6KTsKKyAgaWYgKGQgPT0gMC4wKQorICAgIHJldHVybiAoenNpemUgIT0gMCk7CisgIGlmICh6c2l6ZSA9PSAwKQorICAgIHJldHVybiAtMTsgLyogZCAhPSAwICovCisKKyAgLyogMi4gSWdub3JlIHNpZ25zLiAqLworICB6c2l6ZSA9IEFCUyh6c2l6ZSk7CisgIGQgPSBBQlMoZCk7CisKKyAgLyogMy4gU21hbGwgZCwga25vd2luZyBhYnMoeikgPj0gMS4gKi8KKyAgaWYgKGQgPCAxLjApCisgICAgcmV0dXJuIDE7CisKKyAgZGV4cCA9IF9fZ21wX2V4dHJhY3RfZG91YmxlIChkYXJyYXksIGQpOworICBBU1NFUlQgKGRleHAgPj0gMSk7CisKKyAgLyogNC4gQ2hlY2sgZm9yIGRpZmZlcmVudCBoaWdoIGxpbWIgcG9zaXRpb25zLiAqLworICBpZiAoenNpemUgIT0gZGV4cCkKKyAgICByZXR1cm4gKHpzaXplID49IGRleHAgPyAxIDogLTEpOworCisgIC8qIDUuIExpbWIgZGF0YS4gKi8KKyAgenAgPSBQVFIoeik7CisKKyNpZiBMSU1CU19QRVJfRE9VQkxFID09IDIKKyAgUkVUVVJOX0NNUCAoenBbenNpemUtMV0sIGRhcnJheVsxXSk7CisgIGlmICh6c2l6ZSA9PSAxKQorICAgIHJldHVybiAoZGFycmF5WzBdICE9IDAgPyAtMSA6IDApOworCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTJdLCBkYXJyYXlbMF0pOworICBSRVRVUk5fTk9OWkVSTyAoenAsIHpzaXplLTIsIDEpOworI2VuZGlmCisKKyNpZiBMSU1CU19QRVJfRE9VQkxFID09IDMKKyAgUkVUVVJOX0NNUCAoenBbenNpemUtMV0sIGRhcnJheVsyXSk7CisgIGlmICh6c2l6ZSA9PSAxKQorICAgIHJldHVybiAoKGRhcnJheVswXSB8IGRhcnJheVsxXSkgIT0gMCA/IC0xIDogMCk7CisKKyAgUkVUVVJOX0NNUCAoenBbenNpemUtMl0sIGRhcnJheVsxXSk7CisgIGlmICh6c2l6ZSA9PSAyKQorICAgIHJldHVybiAoZGFycmF5WzBdICE9IDAgPyAtMSA6IDApOworCisgIFJFVFVSTl9DTVAgKHpwW3pzaXplLTNdLCBkYXJyYXlbMF0pOworICBSRVRVUk5fTk9OWkVSTyAoenAsIHpzaXplLTMsIDEpOworI2VuZGlmCisKKyNpZiBMSU1CU19QRVJfRE9VQkxFID49IDQKKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPD0gTElNQlNfUEVSX0RPVUJMRTsgaSsrKQorICAgICAgeworCVJFVFVSTl9DTVAgKHpwW3pzaXplLWldLCBkYXJyYXlbTElNQlNfUEVSX0RPVUJMRS1pXSk7CisJaWYgKGkgPj0genNpemUpCisJICBSRVRVUk5fTk9OWkVSTyAoZGFycmF5LCBMSU1CU19QRVJfRE9VQkxFLWksIC0xKTsKKyAgICAgIH0KKyAgICBSRVRVUk5fTk9OWkVSTyAoenAsIHpzaXplLUxJTUJTX1BFUl9ET1VCTEUsIDEpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL21wei9jbXBhYnNfdWkuYyBiL21wei9jbXBhYnNfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmZmIzCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NtcGFic191aS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIG1wel9jbXBhYnNfdWkuYyAtLSBDb21wYXJlIGFuIG1wel90IGEgd2l0aCBhbiBtcF9saW1iX3QgYi4gIFJldHVybiBwb3NpdGl2ZSwKKyAgemVybywgb3IgbmVnYXRpdmUgYmFzZWQgb24gaWYgYSA+IGIsIGEgPT0gYiwgb3IgYSA8IGIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDE5OTcsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXB6X2NtcGFic191aSAobXB6X3NyY3B0ciB1LCB1bnNpZ25lZCBsb25nIGludCB2X2RpZ2l0KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3B0ciB1cDsKKyAgbXBfc2l6ZV90IHVuOworICBtcF9saW1iX3QgdWw7CisKKyAgdXAgPSBQVFIodSk7CisgIHVuID0gU0laKHUpOworCisgIGlmICh1biA9PSAwKQorICAgIHJldHVybiAtKHZfZGlnaXQgIT0gMCk7CisKKyAgdW4gPSBBQlMgKHVuKTsKKworICBpZiAodW4gPT0gMSkKKyAgICB7CisgICAgICB1bCA9IHVwWzBdOworICAgICAgaWYgKHVsID4gdl9kaWdpdCkKKwlyZXR1cm4gMTsKKyAgICAgIGlmICh1bCA8IHZfZGlnaXQpCisJcmV0dXJuIC0xOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGlmICh2X2RpZ2l0ID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIGlmICh1biA9PSAyKQorCXsKKwkgIHVsID0gdXBbMF0gKyAodXBbMV0gPDwgR01QX05VTUJfQklUUyk7CisKKwkgIGlmICh1bCA+IHZfZGlnaXQpCisJICAgIHJldHVybiAxOworCSAgaWYgKHVsIDwgdl9kaWdpdCkKKwkgICAgcmV0dXJuIC0xOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyNlbmRpZgorCisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbXB6L2NvbS5jIGIvbXB6L2NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZDIyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovY29tLmMKQEAgLTAsMCArMSw4NyBAQAorLyogbXB6X2NvbShtcHpfcHRyIGRzdCwgbXB6X3B0ciBzcmMpIC0tIEFzc2lnbiB0aGUgYml0LWNvbXBsZW1lbnRlZCB2YWx1ZSBvZgorICAgU1JDIHRvIERTVC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDIwMDEsIDIwMDMsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2NvbSAobXB6X3B0ciBkc3QsIG1wel9zcmNwdHIgc3JjKQoreworICBtcF9zaXplX3Qgc2l6ZSA9IFNJWiAoc3JjKTsKKyAgbXBfc3JjcHRyIHNyY19wdHI7CisgIG1wX3B0ciBkc3RfcHRyOworCisgIGlmIChzaXplID49IDApCisgICAgeworICAgICAgLyogQXMgd2l0aCBpbmZpbml0ZSBwcmVjaXNpb246IG9uZSdzIGNvbXBsZW1lbnQsIHR3bydzIGNvbXBsZW1lbnQuCisJIEJ1dCB0aGlzIGNhbiBiZSBzaW1wbGlmaWVkIHVzaW5nIHRoZSBpZGVudGl0eSAteCA9IH54ICsgMS4KKwkgU28gd2UncmUgZ29pbmcgdG8gY29tcHV0ZSAofn54KSArIDEgPSB4ICsgMSEgICovCisKKyAgICAgIGlmIChVTkxJS0VMWSAoc2l6ZSA9PSAwKSkKKwl7CisJICAvKiBzcGVjaWFsIGNhc2UsIGFzIG1wbl9hZGRfMSB3YW50cyBzaXplIT0wICovCisJICBNUFpfTkVXQUxMT0MgKGRzdCwgMSlbMF0gPSAxOworCSAgU0laIChkc3QpID0gLTE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKworCSAgZHN0X3B0ciA9IE1QWl9SRUFMTE9DIChkc3QsIHNpemUgKyAxKTsKKworCSAgc3JjX3B0ciA9IFBUUiAoc3JjKTsKKworCSAgY3kgPSBtcG5fYWRkXzEgKGRzdF9wdHIsIHNyY19wdHIsIHNpemUsIChtcF9saW1iX3QpIDEpOworCSAgZHN0X3B0cltzaXplXSA9IGN5OworCSAgc2l6ZSArPSBjeTsKKworCSAgLyogU3RvcmUgYSBuZWdhdGl2ZSBzaXplLCB0byBpbmRpY2F0ZSBvbmVzLWV4dGVuc2lvbi4gICovCisJICBTSVogKGRzdCkgPSAtc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBcyB3aXRoIGluZmluaXRlIHByZWNpc2lvbjogdHdvJ3MgY29tcGxlbWVudCwgdGhlbiBvbmUncyBjb21wbGVtZW50LgorCSBCdXQgdGhhdCBjYW4gYmUgc2ltcGxpZmllZCB1c2luZyB0aGUgaWRlbnRpdHkgLXggPSB+KHggLSAxKS4KKwkgU28gd2UncmUgZ29pbmcgdG8gY29tcHV0ZSB+fih4IC0gMSkgPSB4IC0gMSEgICovCisgICAgICBzaXplID0gLXNpemU7CisKKyAgICAgIGRzdF9wdHIgPSBNUFpfUkVBTExPQyAoZHN0LCBzaXplKTsKKworICAgICAgc3JjX3B0ciA9IFBUUiAoc3JjKTsKKworICAgICAgbXBuX3N1Yl8xIChkc3RfcHRyLCBzcmNfcHRyLCBzaXplLCAobXBfbGltYl90KSAxKTsKKyAgICAgIHNpemUgLT0gZHN0X3B0cltzaXplIC0gMV0gPT0gMDsKKworICAgICAgLyogU3RvcmUgYSBwb3NpdGl2ZSBzaXplLCB0byBpbmRpY2F0ZSB6ZXJvLWV4dGVuc2lvbi4gICovCisgICAgICBTSVogKGRzdCkgPSBzaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wei9jb21iaXQuYyBiL21wei9jb21iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI5ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NvbWJpdC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKiBtcHpfY29tYml0IC0tIGNvbXBsZW1lbnQgYSBzcGVjaWZpZWQgYml0LgorCitDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9jb21iaXQgKG1wel9wdHIgZCwgbXBfYml0Y250X3QgYml0X2luZGV4KQoreworICBtcF9zaXplX3QgZHNpemUgPSBTSVooZCk7CisgIG1wX3B0ciBkcCA9IFBUUihkKTsKKworICBtcF9zaXplX3QgbGltYl9pbmRleCA9IGJpdF9pbmRleCAvIEdNUF9OVU1CX0JJVFM7CisgIG1wX2xpbWJfdCBiaXQgPSAoQ05TVF9MSU1CICgxKSA8PCAoYml0X2luZGV4ICUgR01QX05VTUJfQklUUykpOworCisgIC8qIENoZWNrIGZvciB0aGUgbW9zdCBjb21tb24gY2FzZTogUG9zaXRpdmUgaW5wdXQsIG5vIHJlYWxsb2Mgb3IKKyAgICAgbm9ybWFsaXphdGlvbiBuZWVkZWQuICovCisgIGlmIChsaW1iX2luZGV4ICsgMSA8IGRzaXplKQorICAgIGRwW2xpbWJfaW5kZXhdIF49IGJpdDsKKworICAvKiBDaGVjayBmb3IgdGhlIGhhaXJ5IGNhc2UuIGQgPCAwLCBhbmQgd2UgaGF2ZSBhbGwgemVybyBiaXRzIHRvIHRoZQorICAgICByaWdodCBvZiB0aGUgYml0IHRvIHRvZ2dsZS4gKi8KKyAgZWxzZSBpZiAobGltYl9pbmRleCA8IC1kc2l6ZQorCSAgICYmIChsaW1iX2luZGV4ID09IDAgfHwgbXBuX3plcm9fcCAoZHAsIGxpbWJfaW5kZXgpKQorCSAgICYmIChkcFtsaW1iX2luZGV4XSAmIChiaXQgLSAxKSkgPT0gMCkKKyAgICB7CisgICAgICBBU1NFUlQgKGRzaXplIDwgMCk7CisgICAgICBkc2l6ZSA9IC1kc2l6ZTsKKworICAgICAgaWYgKGRwW2xpbWJfaW5kZXhdICYgYml0KQorCXsKKwkgIC8qIFdlIHRvZ2dsZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgb25lIGJpdC4gQ29ycmVzcG9uZHMgdG8KKwkgICAgIGFuIGFkZCwgd2l0aCBwb3RlbnRpYWwgY2FycnkgcHJvcGFnYXRpb24sIG9uIHRoZSBhYnNvbHV0ZQorCSAgICAgdmFsdWUuICovCisJICBkcCA9IE1QWl9SRUFMTE9DIChkLCAxICsgZHNpemUpOworCSAgZHBbZHNpemVdID0gMDsKKwkgIE1QTl9JTkNSX1UgKGRwICsgbGltYl9pbmRleCwgMSArIGRzaXplIC0gbGltYl9pbmRleCwgYml0KTsKKwkgIFNJWihkKSA9IC0gZHNpemUgLSBkcFtkc2l6ZV07CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFdlIHRvZ2dsZSBhIHplcm8gYml0LCBzdWJ0cmFjdCBmcm9tIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKwkgIE1QTl9ERUNSX1UgKGRwICsgbGltYl9pbmRleCwgZHNpemUgLSBsaW1iX2luZGV4LCBiaXQpOworCSAgLyogVGhlIGFic29sdXRlIHZhbHVlIHNocmlua2VkIGJ5IGF0IG1vc3Qgb25lIGJpdC4gKi8KKwkgIGRzaXplIC09IGRwW2RzaXplIC0gMV0gPT0gMDsKKwkgIEFTU0VSVCAoZHNpemUgPiAwICYmIGRwW2RzaXplIC0gMV0gIT0gMCk7CisJICBTSVogKGQpID0gLWRzaXplOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaW1wbGUgY2FzZTogVG9nZ2xlIHRoZSBiaXQgaW4gdGhlIGFic29sdXRlIHZhbHVlLiAqLworICAgICAgZHNpemUgPSBBQlMoZHNpemUpOworICAgICAgaWYgKGxpbWJfaW5kZXggPCBkc2l6ZSkKKwl7CisJICBtcF9saW1iX3QJIGRsaW1iOworCSAgZGxpbWIgPSBkcFtsaW1iX2luZGV4XSBeIGJpdDsKKwkgIGRwW2xpbWJfaW5kZXhdID0gZGxpbWI7CisKKwkgIC8qIENhbiBoYXBwZW4gb25seSB3aGVuIGxpbWJfaW5kZXggPSBkc2l6ZSAtIDEuIEF2b2lkIFNJWihkKQorCSAgICAgYm9va2tlZXBpbmcgaW4gdGhlIGNvbW1vbiBjYXNlLiAqLworCSAgaWYgKFVOTElLRUxZICgoZGxpbWIgPT0gMCkgKyBsaW1iX2luZGV4ID09IGRzaXplKSkgLyogZHNpemUgPT0gbGltYl9pbmRleCArIDEgKi8KKwkgICAgeworCSAgICAgIC8qIGhpZ2ggbGltYiBiZWNhbWUgemVybywgbXVzdCBub3JtYWxpemUgKi8KKwkgICAgICBNUE5fTk9STUFMSVpFIChkcCwgbGltYl9pbmRleCk7CisJICAgICAgU0laIChkKSA9IFNJWiAoZCkgPj0gMCA/IGxpbWJfaW5kZXggOiAtbGltYl9pbmRleDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBkcCA9IE1QWl9SRUFMTE9DIChkLCBsaW1iX2luZGV4ICsgMSk7CisJICBNUE5fWkVSTyhkcCArIGRzaXplLCBsaW1iX2luZGV4IC0gZHNpemUpOworCSAgZHBbbGltYl9pbmRleCsrXSA9IGJpdDsKKwkgIFNJWihkKSA9IFNJWihkKSA+PSAwID8gbGltYl9pbmRleCA6IC1saW1iX2luZGV4OworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovY29uZy5jIGIvbXB6L2NvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJkODM1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NvbmcuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogbXB6X2NvbmdydWVudF9wIC0tIHRlc3QgY29uZ3J1ZW5jZSBvZiB0d28gbXB6J3MuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIEZvciBiaWcgZGl2aXNvcnMgdGhpcyBjb2RlIGlzIG9ubHkgdmVyeSBzbGlnaHRseSBiZXR0ZXIgdGhhbiB0aGUgdXNlcgorICAgZG9pbmcgYSBjb21iaW5hdGlvbiBvZiBtcHpfc3ViIGFuZCBtcHpfdGRpdl9yLCBidXQgaXQncyBxdWl0ZSBjb252ZW5pZW50LAorICAgYW5kIHBlcmhhcHMgaW4gdGhlIGZ1dHVyZSBjYW4gYmUgaW1wcm92ZWQsIGluIHNpbWlsYXIgd2F5cyB0bworICAgbXBuX2RpdmlzaWJsZV9wIHBlcmhhcHMuCisKKyAgIFRoZSBjc2l6ZT09MSAvIGRzaXplPT0xIHNwZWNpYWwgY2FzZSBtYWtlcyBtcHpfY29uZ3J1ZW50X3AgYXMgZ29vZCBhcworICAgbXB6X2NvbmdydWVudF91aV9wIG9uIHJlbGV2YW50IG9wZXJhbmRzLCB0aG91Z2ggc3VjaCBhIGNvbWJpbmF0aW9uCisgICBwcm9iYWJseSBkb2Vzbid0IG9jY3VyIG9mdGVuLgorCisgICBBbHRlcm5hdGl2ZXM6CisKKyAgIElmIGM8ZCB0aGVuIGl0J2Qgd29yayB0byBqdXN0IGZvcm0gYSVkIGFuZCBjb21wYXJlIGEgYW5kIGMgKGVpdGhlciBhcworICAgYT09YyBvciBhK2M9PWQgZGVwZW5kaW5nIG9uIHRoZSBzaWducyksIGJ1dCB0aGUgc2F2aW5nIGZyb20gYXZvaWRpbmcgdGhlCisgICBhYnMoYS1jKSBjYWxjdWxhdGlvbiB3b3VsZCBiZSBzbWFsbCBjb21wYXJlZCB0byB0aGUgZGl2aXNpb24uCisKKyAgIFNpbWlsYXJseSBpZiBib3RoIGE8ZCBhbmQgYzxkIHRoZW4gaXQgd291bGQgd29yayB0byBqdXN0IGNvbXBhcmUgYSBhbmQgYworICAgKGE9PWMgb3IgYStjPT1kKSwgYnV0IHRoaXMgaXNuJ3QgY29uc2lkZXJlZCBhIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgY2FzZQorICAgYW5kIHNvIGlzbid0IGRvbmUgZm9yIHRoZSBtb21lbnQuCisKKyAgIExvdyB6ZXJvIGxpbWJzIG9uIGQgY291bGQgYmUgc3RyaXBwZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGxpbWJzIG9mIGEKKyAgIGFuZCBjIHRlc3RlZCBhbmQgc2tpcHBlZCwgYnV0IGRvaW5nIHNvIHdvdWxkIGludHJvZHVjZSBhIGJvcnJvdyB3aGVuIGEKKyAgIGFuZCBjIGRpZmZlciBpbiBzaWduIGFuZCBoYXZlIG5vbi16ZXJvIHNraXBwZWQgbGltYnMuICBJdCBkb2Vzbid0IHNlZW0KKyAgIHdvcnRoIHRoZSBjb21wbGljYXRpb25zIHRvIGRvIHRoaXMsIHNpbmNlIGxvdyB6ZXJvIGxpbWJzIG9uIGQgc2hvdWxkCisgICBvY2N1ciBvbmx5IHJhcmVseS4gICovCisKK2ludAorbXB6X2NvbmdydWVudF9wIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYywgbXB6X3NyY3B0ciBkKQoreworICBtcF9zaXplX3QgIGFzaXplLCBjc2l6ZSwgZHNpemUsIHNpZ247CisgIG1wX3NyY3B0ciAgYXAsIGNwLCBkcDsKKyAgbXBfcHRyICAgICB4cDsKKyAgbXBfbGltYl90ICBhbG93LCBjbG93LCBkbG93LCBkbWFzaywgcjsKKyAgaW50ICAgICAgICByZXN1bHQ7CisgIFRNUF9ERUNMOworCisgIGRzaXplID0gU0laKGQpOworICBpZiAoVU5MSUtFTFkgKGRzaXplID09IDApKQorICAgIHJldHVybiAobXB6X2NtcCAoYSwgYykgPT0gMCk7CisKKyAgZHNpemUgPSBBQlMoZHNpemUpOworICBkcCA9IFBUUihkKTsKKworICBpZiAoQUJTSVooYSkgPCBBQlNJWihjKSkKKyAgICBNUFpfU1JDUFRSX1NXQVAgKGEsIGMpOworCisgIGFzaXplID0gU0laKGEpOworICBjc2l6ZSA9IFNJWihjKTsKKyAgc2lnbiA9IChhc2l6ZSBeIGNzaXplKTsKKworICBhc2l6ZSA9IEFCUyhhc2l6ZSk7CisgIGFwID0gUFRSKGEpOworCisgIGlmIChjc2l6ZSA9PSAwKQorICAgIHJldHVybiBtcG5fZGl2aXNpYmxlX3AgKGFwLCBhc2l6ZSwgZHAsIGRzaXplKTsKKworICBjc2l6ZSA9IEFCUyhjc2l6ZSk7CisgIGNwID0gUFRSKGMpOworCisgIGFsb3cgPSBhcFswXTsKKyAgY2xvdyA9IGNwWzBdOworICBkbG93ID0gZHBbMF07CisKKyAgLyogQ2hlY2sgYT09YyBtb2QgbG93IHplcm8gYml0cyBvZiBkbG93LiAgVGhpcyBtaWdodCBjYXRjaCBhIGZldyBjYXNlcyBvZgorICAgICBhIT1jIHF1aWNrbHksIGFuZCBpdCBoZWxwcyB0aGUgY3NpemU9PTEgc3BlY2lhbCBjYXNlcyBiZWxvdy4gICovCisgIGRtYXNrID0gTE9XX1pFUk9TX01BU0sgKGRsb3cpICYgR01QX05VTUJfTUFTSzsKKyAgYWxvdyA9IChzaWduID49IDAgPyBhbG93IDogLWFsb3cpOworICBpZiAoKChhbG93LWNsb3cpICYgZG1hc2spICE9IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGNzaXplID09IDEpCisgICAgeworICAgICAgaWYgKGRzaXplID09IDEpCisJeworCWNvbmdfMToKKwkgIGlmIChzaWduIDwgMCkKKwkgICAgTkVHX01PRCAoY2xvdywgY2xvdywgZGxvdyk7CisKKwkgIGlmIChBQk9WRV9USFJFU0hPTEQgKGFzaXplLCBCTU9EXzFfVE9fTU9EXzFfVEhSRVNIT0xEKSkKKwkgICAgeworCSAgICAgIHIgPSBtcG5fbW9kXzEgKGFwLCBhc2l6ZSwgZGxvdyk7CisJICAgICAgaWYgKGNsb3cgPCBkbG93KQorCQlyZXR1cm4gciA9PSBjbG93OworCSAgICAgIGVsc2UKKwkJcmV0dXJuIHIgPT0gKGNsb3cgJSBkbG93KTsKKwkgICAgfQorCisJICBpZiAoKGRsb3cgJiAxKSA9PSAwKQorCSAgICB7CisJICAgICAgLyogU3RyaXAgbG93IHplcm8gYml0cyB0byBnZXQgb2RkIGQgcmVxdWlyZWQgYnkgbW9kZXhhY3QuICBJZgorCQkgZD09ZSoyXm4gdGhlbiBhPT1jIG1vZCBkIGlmIGFuZCBvbmx5IGlmIGJvdGggYT09YyBtb2QgZSBhbmQKKwkJIGE9PWMgbW9kIDJebiwgdGhlIGxhdHRlciBoYXZpbmcgYmVlbiBkb25lIGFib3ZlLiAgKi8KKwkgICAgICB1bnNpZ25lZAl0d29zOworCSAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBkbG93KTsKKwkgICAgICBkbG93ID4+PSB0d29zOworCSAgICB9CisKKwkgIHIgPSBtcG5fbW9kZXhhY3RfMWNfb2RkIChhcCwgYXNpemUsIGRsb3csIGNsb3cpOworCSAgcmV0dXJuIHIgPT0gMCB8fCByID09IGRsb3c7CisJfQorCisgICAgICAvKiBkbG93PT0wIGlzIGF2b2lkZWQgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBib3RoZXIgaGFuZGxpbmcgZXh0cmEgbG93CisJIHplcm8gYml0cyBpZiBkc2Vjb25kIGlzIGV2ZW4gKHdvdWxkIGludm9sdmUgYm9ycm93IGlmIGEsYyBkaWZmZXIgaW4KKwkgc2lnbiBhbmQgYWxvdyxjbG93IT0wKS4gICovCisgICAgICBpZiAoZHNpemUgPT0gMiAmJiBkbG93ICE9IDApCisJeworCSAgbXBfbGltYl90ICBkc2Vjb25kID0gZHBbMV07CisKKwkgIGlmIChkc2Vjb25kIDw9IGRtYXNrKQorCSAgICB7CisJICAgICAgdW5zaWduZWQJIHR3b3M7CisJICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKHR3b3MsIGRsb3cpOworCSAgICAgIGRsb3cgPSAoZGxvdyA+PiB0d29zKSB8IChkc2Vjb25kIDw8IChHTVBfTlVNQl9CSVRTLXR3b3MpKTsKKwkgICAgICBBU1NFUlRfTElNQiAoZGxvdyk7CisKKwkgICAgICAvKiBkbG93IHdpbGwgYmUgb2RkIGhlcmUsIHNvIHRoZSB0ZXN0IGZvciBpdCBldmVuIHVuZGVyIGNvbmdfMQorCQkgaXMgdW5uZWNlc3NhcnksIGJ1dCB0aGUgcmVzdCBvZiB0aGF0IGNvZGUgaXMgd2FudGVkLiAqLworCSAgICAgIGdvdG8gY29uZ18xOworCSAgICB9CisJfQorICAgIH0KKworICBUTVBfTUFSSzsKKyAgeHAgPSBUTVBfQUxMT0NfTElNQlMgKGFzaXplKzEpOworCisgIC8qIGNhbGN1bGF0ZSBhYnMoYS1jKSAqLworICBpZiAoc2lnbiA+PSAwKQorICAgIHsKKyAgICAgIC8qIHNhbWUgc2lnbnMsIHN1YnRyYWN0ICovCisgICAgICBpZiAoYXNpemUgPiBjc2l6ZSB8fCBtcG5fY21wIChhcCwgY3AsIGFzaXplKSA+PSAwKQorCUFTU0VSVF9OT0NBUlJZIChtcG5fc3ViICh4cCwgYXAsIGFzaXplLCBjcCwgY3NpemUpKTsKKyAgICAgIGVsc2UKKwlBU1NFUlRfTk9DQVJSWSAobXBuX3N1Yl9uICh4cCwgY3AsIGFwLCBhc2l6ZSkpOworICAgICAgTVBOX05PUk1BTElaRSAoeHAsIGFzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBkaWZmZXJlbnQgc2lnbnMsIGFkZCAqLworICAgICAgbXBfbGltYl90ICBjYXJyeTsKKyAgICAgIGNhcnJ5ID0gbXBuX2FkZCAoeHAsIGFwLCBhc2l6ZSwgY3AsIGNzaXplKTsKKyAgICAgIHhwW2FzaXplXSA9IGNhcnJ5OworICAgICAgYXNpemUgKz0gKGNhcnJ5ICE9IDApOworICAgIH0KKworICByZXN1bHQgPSBtcG5fZGl2aXNpYmxlX3AgKHhwLCBhc2l6ZSwgZHAsIGRzaXplKTsKKworICBUTVBfRlJFRTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL21wei9jb25nXzJleHAuYyBiL21wei9jb25nXzJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU5NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2NvbmdfMmV4cC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBtcHpfY29uZ3J1ZW50XzJleHBfcCAtLSB0ZXN0IGNvbmdydWVuY2Ugb2YgbXB6IG1vZCAyXm4uCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK21wel9jb25ncnVlbnRfMmV4cF9wIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYywgbXBfYml0Y250X3QgZCkgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3QgICAgICBpLCBkbGltYnM7CisgIHVuc2lnbmVkICAgICAgIGRiaXRzOworICBtcF9wdHIgICAgICAgICBhcCwgY3A7CisgIG1wX2xpbWJfdCAgICAgIGRtYXNrLCBhbGltYiwgY2xpbWIsIHN1bTsKKyAgbXBfc2l6ZV90ICAgICAgYXMsIGNzLCBhc2l6ZSwgY3NpemU7CisKKyAgYXMgPSBTSVooYSk7CisgIGFzaXplID0gQUJTKGFzKTsKKworICBjcyA9IFNJWihjKTsKKyAgY3NpemUgPSBBQlMoY3MpOworCisgIGlmIChhc2l6ZSA8IGNzaXplKQorICAgIHsKKyAgICAgIE1QWl9TUkNQVFJfU1dBUCAoYSwgYyk7CisgICAgICBNUF9TSVpFX1RfU1dBUCAoYXNpemUsIGNzaXplKTsKKyAgICB9CisKKyAgZGxpbWJzID0gZCAvIEdNUF9OVU1CX0JJVFM7CisgIGRiaXRzID0gZCAlIEdNUF9OVU1CX0JJVFM7CisgIGRtYXNrID0gKENOU1RfTElNQigxKSA8PCBkYml0cykgLSAxOworCisgIGFwID0gUFRSKGEpOworICBjcCA9IFBUUihjKTsKKworICBpZiAoY3NpemUgPT0gMCkKKyAgICBnb3RvIGFfemVyb3M7CisKKyAgaWYgKChjcyBeIGFzKSA+PSAwKQorICAgIHsKKyAgICAgIC8qIHNhbWUgc2lnbnMsIGRpcmVjdCBjb21wYXJpc29uICovCisKKyAgICAgIC8qIGE9PWMgZm9yIGxpbWJzIGluIGNvbW1vbiAqLworICAgICAgaWYgKG1wbl9jbXAgKGFwLCBjcCwgTUlOIChjc2l6ZSwgZGxpbWJzKSkgIT0gMCkKKwlyZXR1cm4gMDsKKworICAgICAgLyogaWYgdGhhdCdzIGFsbCBvZiBkbGltYnMsIHRoZW4gYT09YyBmb3IgcmVtYWluaW5nIGJpdHMgKi8KKyAgICAgIGlmIChjc2l6ZSA+IGRsaW1icykKKwlyZXR1cm4gKChhcFtkbGltYnNdLWNwW2RsaW1ic10pICYgZG1hc2spID09IDA7CisKKyAgICBhX3plcm9zOgorICAgICAgLyogYSByZW1haW5zLCBuZWVkIGFsbCB6ZXJvIGJpdHMgKi8KKworICAgICAgLyogaWYgZCBjb3ZlcnMgYWxsIG9mIGEgYW5kIGMsIHRoZW4gbXVzdCBiZSBleGFjdGx5IGVxdWFsICovCisgICAgICBpZiAoYXNpemUgPD0gZGxpbWJzKQorCXJldHVybiBhc2l6ZSA9PSBjc2l6ZTsKKworICAgICAgLyogd2hvbGUgbGltYnMgemVybyAqLworICAgICAgZm9yIChpID0gY3NpemU7IGkgPCBkbGltYnM7IGkrKykKKwlpZiAoYXBbaV0gIT0gMCkKKwkgIHJldHVybiAwOworCisgICAgICAvKiBwYXJ0aWFsIGxpbWIgemVybyAqLworICAgICAgcmV0dXJuIChhcFtkbGltYnNdICYgZG1hc2spID09IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogZGlmZmVyZW50IHNpZ25zLCBuZWdhdGVkIGNvbXBhcmlzb24gKi8KKworICAgICAgLyogY29tbW9uIGxvdyB6ZXJvIGxpbWJzLCBzdG9wcGluZyBhdCBmaXJzdCBub24temVyb3MsIHdoaWNoIG11c3QKKwkgbWF0Y2ggdHdvcyBjb21wbGVtZW50ICovCisgICAgICBpID0gMDsKKyAgICAgIGRvCisJeworCSAgQVNTRVJUIChpIDwgY3NpemUpOyAgLyogYWx3YXlzIGhhdmUgYSBub24temVybyBsaW1iIG9uIGMgKi8KKwkgIGFsaW1iID0gYXBbaV07CisJICBjbGltYiA9IGNwW2ldOworCSAgc3VtID0gKGFsaW1iICsgY2xpbWIpICYgR01QX05VTUJfTUFTSzsKKworCSAgaWYgKGkgPj0gZGxpbWJzKQorCSAgICByZXR1cm4gKHN1bSAmIGRtYXNrKSA9PSAwOworCSAgKytpOworCisJICAvKiByZXF1aXJlIGJvdGggemVybywgb3IgZmlyc3Qgbm9uLXplcm9zIGFzIHR3b3MtY29tcGxlbWVudHMgKi8KKwkgIGlmIChzdW0gIT0gMCkKKwkgICAgcmV0dXJuIDA7CisJfSB3aGlsZSAoYWxpbWIgPT0gMCk7CisKKyAgICAgIC8qIGZ1cnRoZXIgbGltYnMgbWF0Y2hpbmcgYXMgb25lcy1jb21wbGVtZW50ICovCisgICAgICBmb3IgKDsgaSA8IGNzaXplOyArK2kpCisJeworCSAgYWxpbWIgPSBhcFtpXTsKKwkgIGNsaW1iID0gY3BbaV07CisJICBzdW0gPSBhbGltYiBeIGNsaW1iIF4gR01QX05VTUJfTUFTSzsKKworCSAgaWYgKGkgPj0gZGxpbWJzKQorCSAgICByZXR1cm4gKHN1bSAmIGRtYXNrKSA9PSAwOworCisJICBpZiAoc3VtICE9IDApCisJICAgIHJldHVybiAwOworCX0KKworICAgICAgLyogbm8gbW9yZSBjLCBzbyByZXF1aXJlIGFsbCAxIGJpdHMgaW4gYSAqLworCisgICAgICBpZiAoYXNpemUgPCBkbGltYnMpCisJcmV0dXJuIDA7ICAgLyogbm90IGVub3VnaCBhICovCisKKyAgICAgIC8qIHdob2xlIGxpbWJzICovCisgICAgICBmb3IgKCA7IGkgPCBkbGltYnM7IGkrKykKKwlpZiAoYXBbaV0gIT0gR01QX05VTUJfTUFYKQorCSAgcmV0dXJuIDA7CisKKyAgICAgIC8qIGlmIG9ubHkgd2hvbGUgbGltYnMsIG5vIGZ1cnRoZXIgZmV0Y2hlcyBmcm9tIGEgKi8KKyAgICAgIGlmIChkYml0cyA9PSAwKQorCXJldHVybiAxOworCisgICAgICAvKiBuZWVkIGVub3VnaCBhICovCisgICAgICBpZiAoYXNpemUgPT0gZGxpbWJzKQorCXJldHVybiAwOworCisgICAgICByZXR1cm4gKChhcFtkbGltYnNdKzEpICYgZG1hc2spID09IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXB6L2NvbmdfdWkuYyBiL21wei9jb25nX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4NmMyMwotLS0gL2Rldi9udWxsCisrKyBiL21wei9jb25nX3VpLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qIG1wel9jb25ncnVlbnRfdWlfcCAtLSB0ZXN0IGNvbmdydWVuY2Ugb2YgbXB6IGFuZCB1bG9uZy4KKworQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBUaGVyZSdzIHNvbWUgZXhwbGljaXQgY2hlY2tzIGZvciBjPGQgc2luY2UgaXQgc2VlbXMgcmVhc29uYWJseSBsaWtlbHkgYW4KKyAgIGFwcGxpY2F0aW9uIG1pZ2h0IHVzZSB0aGF0IGluIGEgdGVzdC4KKworICAgSG9wZWZ1bGx5IHRoZSBjb21waWxlciBjYW4gZ2VuZXJhdGUgc29tZXRoaW5nIGdvb2QgZm9yIHI9PShjJWQpLCB0aG91Z2gKKyAgIGlmIG1vZGV4YWN0IGlzIGJlaW5nIHVzZWQgZXhjbHVzaXZlbHkgdGhlbiB0aGF0J3Mgbm90IHJlYWNoZWQuICAqLworCitpbnQKK21wel9jb25ncnVlbnRfdWlfcCAobXB6X3NyY3B0ciBhLCB1bnNpZ25lZCBsb25nIGN1LCB1bnNpZ25lZCBsb25nIGR1KQoreworICBtcF9zcmNwdHIgIGFwOworICBtcF9zaXplX3QgIGFzaXplOworICBtcF9saW1iX3QgIGMsIGQsIHI7CisKKyAgaWYgKFVOTElLRUxZIChkdSA9PSAwKSkKKyAgICByZXR1cm4gKG1wel9jbXBfdWkgKGEsIGN1KSA9PSAwKTsKKworICBhc2l6ZSA9IFNJWihhKTsKKyAgaWYgKGFzaXplID09IDApCisgICAgeworICAgICAgaWYgKGN1IDwgZHUpCisJcmV0dXJuIGN1ID09IDA7CisgICAgICBlbHNlCisJcmV0dXJuIChjdSAlIGR1KSA9PSAwOworICAgIH0KKworICAvKiBGb3IgbmFpbHMgZG9uJ3QgdHJ5IHRvIGJlIGNsZXZlciBpZiBjIG9yIGQgaXMgYmlnZ2VyIHRoYW4gYSBsaW1iLCBqdXN0CisgICAgIGZha2UgdXAgc29tZSBtcHpfdCdzIGFuZCBnbyB0byB0aGUgbWFpbiBtcHpfY29uZ3J1ZW50X3AuICAqLworICBpZiAoZHUgPiBHTVBfTlVNQl9NQVggfHwgY3UgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90ICBjbGltYnNbMl0sIGRsaW1ic1syXTsKKyAgICAgIG1wel90ICAgICAgY3osIGR6OworCisgICAgICBBTExPQyhjeikgPSAyOworICAgICAgUFRSKGN6KSA9IGNsaW1iczsKKyAgICAgIEFMTE9DKGR6KSA9IDI7CisgICAgICBQVFIoZHopID0gZGxpbWJzOworCisgICAgICBtcHpfc2V0X3VpIChjeiwgY3UpOworICAgICAgbXB6X3NldF91aSAoZHosIGR1KTsKKyAgICAgIHJldHVybiBtcHpfY29uZ3J1ZW50X3AgKGEsIGN6LCBkeik7CisgICAgfQorCisgIC8qIE5FR19NT0Qgd29ya3Mgb24gbGltYnMsIHNvIGNvbnZlcnQgdWxvbmcgdG8gbGltYiAqLworICBjID0gY3U7CisgIGQgPSBkdTsKKworICBpZiAoYXNpemUgPCAwKQorICAgIHsKKyAgICAgIGFzaXplID0gLWFzaXplOworICAgICAgTkVHX01PRCAoYywgYywgZCk7CisgICAgfQorCisgIGFwID0gUFRSIChhKTsKKworICBpZiAoQUJPVkVfVEhSRVNIT0xEIChhc2l6ZSwgQk1PRF8xX1RPX01PRF8xX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgciA9IG1wbl9tb2RfMSAoYXAsIGFzaXplLCBkKTsKKyAgICAgIGlmIChjIDwgZCkKKwlyZXR1cm4gciA9PSBjOworICAgICAgZWxzZQorCXJldHVybiByID09IChjICUgZCk7CisgICAgfQorCisgIGlmICgoZCAmIDEpID09IDApCisgICAgeworICAgICAgLyogU3RyaXAgbG93IHplcm8gYml0cyB0byBnZXQgb2RkIGQgcmVxdWlyZWQgYnkgbW9kZXhhY3QuICBJZgorCSBkPT1lKjJebiB0aGVuIGE9PWMgbW9kIGQgaWYgYW5kIG9ubHkgaWYgYm90aCBhPT1jIG1vZCAyXm4KKwkgYW5kIGE9PWMgbW9kIGUuICAqLworCisgICAgICB1bnNpZ25lZAl0d29zOworCisgICAgICBpZiAoKGFwWzBdLWMpICYgTE9XX1pFUk9TX01BU0sgKGQpKQorCXJldHVybiAwOworCisgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAodHdvcywgZCk7CisgICAgICBkID4+PSB0d29zOworICAgIH0KKworICByID0gbXBuX21vZGV4YWN0XzFjX29kZCAoYXAsIGFzaXplLCBkLCBjKTsKKyAgcmV0dXJuIHIgPT0gMCB8fCByID09IGQ7Cit9CmRpZmYgLS1naXQgYS9tcHovZGl2ZV91aS5jIGIvbXB6L2RpdmVfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU5Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2RpdmVfdWkuYwpAQCAtMCwwICsxLDY4IEBACisvKiBtcHpfZGl2ZXhhY3RfdWkgLS0gZXhhY3QgZGl2aXNpb24gbXB6IGJ5IHVsb25nLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9kaXZleGFjdF91aSAobXB6X3B0ciBkc3QsIG1wel9zcmNwdHIgc3JjLCB1bnNpZ25lZCBsb25nIGRpdmlzb3IpCit7CisgIG1wX3NpemVfdCAgc2l6ZSwgYWJzX3NpemU7CisgIG1wX3B0ciAgICAgZHN0X3B0cjsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgLyogRm9yIG5haWxzIGRvbid0IHRyeSB0byBiZSBjbGV2ZXIgaWYgZCBpcyBiaWdnZXIgdGhhbiBhIGxpbWIsIGp1c3QgZmFrZQorICAgICB1cCBhbiBtcHpfdCBhbmQgZ28gdG8gdGhlIG1haW4gbXB6X2RpdmV4YWN0LiAgKi8KKyAgaWYgKGRpdmlzb3IgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90ICBkbGltYnNbMl07CisgICAgICBtcHpfdCAgICAgIGR6OworICAgICAgQUxMT0MoZHopID0gMjsKKyAgICAgIFBUUihkeikgPSBkbGltYnM7CisgICAgICBtcHpfc2V0X3VpIChkeiwgZGl2aXNvcik7CisgICAgICBtcHpfZGl2ZXhhY3QgKGRzdCwgc3JjLCBkeik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpemUgPSBTSVooc3JjKTsKKyAgaWYgKHNpemUgPT0gMCkKKyAgICB7CisgICAgICBTSVooZHN0KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICBhYnNfc2l6ZSA9IEFCUyAoc2l6ZSk7CisKKyAgZHN0X3B0ciA9IE1QWl9SRUFMTE9DIChkc3QsIGFic19zaXplKTsKKworICBNUE5fRElWUkVNX09SX0RJVkVYQUNUXzEgKGRzdF9wdHIsIFBUUihzcmMpLCBhYnNfc2l6ZSwgKG1wX2xpbWJfdCkgZGl2aXNvcik7CisgIGFic19zaXplIC09IChkc3RfcHRyW2Fic19zaXplLTFdID09IDApOworICBTSVooZHN0KSA9IChzaXplID49IDAgPyBhYnNfc2l6ZSA6IC1hYnNfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcHovZGl2ZWdjZC5jIGIvbXB6L2RpdmVnY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIzNmMzCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2RpdmVnY2QuYwpAQCAtMCwwICsxLDE1NiBAQAorLyogbXB6X2RpdmV4YWN0X2djZCAtLSBleGFjdCBkaXZpc2lvbiBvcHRpbWl6ZWQgZm9yIEdDRHMuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIEFORCBBUkUgQUxNT1NUIENFUlRBSU4gVE8KKyAgIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgSU4gRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDUsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogU2V0IHEgdG8gYS9kLCBleHBlY3RpbmcgZCB0byBiZSBmcm9tIGEgR0NEIGFuZCB0aGVyZWZvcmUgdXN1YWxseSBzbWFsbC4KKworICAgVGhlIGRpc3RyaWJ1dGlvbiBvZiBHQ0RzIG9mIHJhbmRvbSBudW1iZXJzIGNhbiBiZSBmb3VuZCBpbiBLbnV0aCB2b2x1bWUgMgorICAgc2VjdGlvbiA0LjUuMiB0aGVvcmVtIEQuCisKKyAgICAgICAgICAgIEdDRCAgICAgY2hhbmNlCisgICAgICAgICAgICAgMSAgICAgICA2MC44JQorICAgICAgICAgICAgMl5rICAgICAgMjAuMiUgICAgICgxPD1rPDMyKQorICAgICAgICAgICAzKjJeayAgICAgIDkuMCUgICAgICgxPD1rPDMyKQorICAgICAgICAgICBvdGhlciAgICAgMTAuMSUKKworICAgT25seSB0aGUgbG93IGxpbWIgaXMgZXhhbWluZWQgZm9yIG9wdGltaXphdGlvbnMsIHNpbmNlIEdDRHMgYmlnZ2VyIHRoYW4KKyAgIDJeMzIgKG9yIDJeNjQpIHdpbGwgb2NjdXIgdmVyeSBpbmZyZXF1ZW50bHkuCisKKyAgIEZ1dHVyZTogVGhpcyBjb3VsZCBjaGFuZ2UgdG8gYW4gbXBuX2RpdmV4YWN0X2djZCwgcG9zc2libHkgcGFydGx5CisgICBpbmxpbmVkLCBpZi93aGVuIHRoZSByZWxldmFudCBtcHEgZnVuY3Rpb25zIGNoYW5nZSB0byBhbiBtcG4gYmFzZWQKKyAgIGltcGxlbWVudGF0aW9uLiAgKi8KKworCisjaWYgR01QX05VTUJfQklUUyAlIDIgPT0gMAorc3RhdGljIHZvaWQKK21wel9kaXZleGFjdF9ieTMgKG1wel9wdHIgcSwgbXB6X3NyY3B0ciBhKQoreworICBtcF9zaXplX3QgIHNpemUgPSBTSVooYSk7CisgIG1wX3NpemVfdCAgYWJzX3NpemUgPSBBQlMoc2l6ZSk7CisgIG1wX3B0ciAgICAgcXA7CisKKyAgcXAgPSBNUFpfUkVBTExPQyAocSwgYWJzX3NpemUpOworCisgIG1wbl9iZGl2X2RibTEgKHFwLCBQVFIoYSksIGFic19zaXplLCBHTVBfTlVNQl9NQVNLIC8gMyk7CisKKyAgYWJzX3NpemUgLT0gKHFwW2Fic19zaXplLTFdID09IDApOworICBTSVoocSkgPSAoc2l6ZT4wID8gYWJzX3NpemUgOiAtYWJzX3NpemUpOworfQorI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgNCA9PSAwCitzdGF0aWMgdm9pZAorbXB6X2RpdmV4YWN0X2J5NSAobXB6X3B0ciBxLCBtcHpfc3JjcHRyIGEpCit7CisgIG1wX3NpemVfdCAgc2l6ZSA9IFNJWihhKTsKKyAgbXBfc2l6ZV90ICBhYnNfc2l6ZSA9IEFCUyhzaXplKTsKKyAgbXBfcHRyICAgICBxcDsKKworICBxcCA9IE1QWl9SRUFMTE9DIChxLCBhYnNfc2l6ZSk7CisKKyAgbXBuX2JkaXZfZGJtMSAocXAsIFBUUihhKSwgYWJzX3NpemUsIEdNUF9OVU1CX01BU0sgLyA1KTsKKworICBhYnNfc2l6ZSAtPSAocXBbYWJzX3NpemUtMV0gPT0gMCk7CisgIFNJWihxKSA9IChzaXplPjAgPyBhYnNfc2l6ZSA6IC1hYnNfc2l6ZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK21wel9kaXZleGFjdF9saW1iIChtcHpfcHRyIHEsIG1wel9zcmNwdHIgYSwgbXBfbGltYl90IGQpCit7CisgIG1wX3NpemVfdCAgc2l6ZSA9IFNJWihhKTsKKyAgbXBfc2l6ZV90ICBhYnNfc2l6ZSA9IEFCUyhzaXplKTsKKyAgbXBfcHRyICAgICBxcDsKKworICBxcCA9IE1QWl9SRUFMTE9DIChxLCBhYnNfc2l6ZSk7CisKKyAgTVBOX0RJVlJFTV9PUl9ESVZFWEFDVF8xIChxcCwgUFRSKGEpLCBhYnNfc2l6ZSwgZCk7CisKKyAgYWJzX3NpemUgLT0gKHFwW2Fic19zaXplLTFdID09IDApOworICBTSVoocSkgPSAoc2l6ZSA+IDAgPyBhYnNfc2l6ZSA6IC1hYnNfc2l6ZSk7Cit9CisKK3ZvaWQKK21wel9kaXZleGFjdF9nY2QgKG1wel9wdHIgcSwgbXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGQpCit7CisgIEFTU0VSVCAobXB6X3NnbiAoZCkgPiAwKTsKKworICBpZiAoU0laKGEpID09IDApCisgICAgeworICAgICAgU0laKHEpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKFNJWihkKSA9PSAxKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCAgZGwgPSBQVFIoZClbMF07CisgICAgICBpbnQgICAgICAgIHR3b3M7CisKKyAgICAgIGlmICgoZGwgJiAxKSA9PSAwKQorCXsKKwkgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBkbCk7CisJICBkbCA+Pj0gdHdvczsKKwkgIG1wel90ZGl2X3FfMmV4cCAocSwgYSwgdHdvcyk7CisJICBhID0gcTsKKwl9CisKKyAgICAgIGlmIChkbCA9PSAxKQorCXsKKwkgIGlmIChxICE9IGEpCisJICAgIG1wel9zZXQgKHEsIGEpOworCSAgcmV0dXJuOworCX0KKyNpZiBHTVBfTlVNQl9CSVRTICUgMiA9PSAwCisgICAgICBpZiAoZGwgPT0gMykKKwl7CisJICBtcHpfZGl2ZXhhY3RfYnkzIChxLCBhKTsKKwkgIHJldHVybjsKKwl9CisjZW5kaWYKKyNpZiBHTVBfTlVNQl9CSVRTICUgNCA9PSAwCisgICAgICBpZiAoZGwgPT0gNSkKKwl7CisJICBtcHpfZGl2ZXhhY3RfYnk1IChxLCBhKTsKKwkgIHJldHVybjsKKwl9CisjZW5kaWYKKworICAgICAgbXB6X2RpdmV4YWN0X2xpbWIgKHEsIGEsIGRsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbXB6X2RpdmV4YWN0IChxLCBhLCBkKTsKK30KZGlmZiAtLWdpdCBhL21wei9kaXZleGFjdC5jIGIvbXB6L2RpdmV4YWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21wei9kaXZleGFjdC5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIG1wel9kaXZleGFjdCAtLSBmaW5kcyBxdW90aWVudCB3aGVuIGtub3duIHRoYXQgcXVvdCAqIGRlbiA9PSBudW0gJiYgZGVuICE9IDAuCisKK0NvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBOaWVscyBNw7ZsbGVyLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk4LCAyMDAwLTIwMDIsIDIwMDUtMjAwNywgMjAwOSwgMjAxMiBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9kaXZleGFjdCAobXB6X3B0ciBxdW90LCBtcHpfc3JjcHRyIG51bSwgbXB6X3NyY3B0ciBkZW4pCit7CisgIG1wX3B0ciBxcDsKKyAgbXBfc2l6ZV90IHFuOworICBtcF9zcmNwdHIgbnAsIGRwOworICBtcF9zaXplX3Qgbm4sIGRuOworICBUTVBfREVDTDsKKworI2lmIFdBTlRfQVNTRVJUCisgIHsKKyAgICBtcHpfdCAgcmVtOworICAgIG1wel9pbml0IChyZW0pOworICAgIG1wel90ZGl2X3IgKHJlbSwgbnVtLCBkZW4pOworICAgIEFTU0VSVCAoU0laKHJlbSkgPT0gMCk7CisgICAgbXB6X2NsZWFyIChyZW0pOworICB9CisjZW5kaWYKKworICBubiA9IEFCU0laIChudW0pOworICBkbiA9IEFCU0laIChkZW4pOworCisgIGlmIChubiA8IGRuKQorICAgIHsKKyAgICAgIC8qIFRoaXMgc3BlY2lhbCBjYXNlIGF2b2lkcyBzZWdmYXVsdHMgYmVsb3cgd2hlbiB0aGUgZnVuY3Rpb24gaXMKKwkgaW5jb3JyZWN0bHkgY2FsbGVkIHdpdGggfE58IDwgfER8LCBOICE9IDAuICBJdCBhbHNvIGhhbmRsZXMgdGhlCisJIHdlbGwtZGVmaW5lZCBjYXNlIE4gPSAwLiAgKi8KKyAgICAgIFNJWihxdW90KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHFuID0gbm4gLSBkbiArIDE7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKHF1b3QgPT0gbnVtIHx8IHF1b3QgPT0gZGVuKQorICAgIHFwID0gVE1QX0FMTE9DX0xJTUJTIChxbik7CisgIGVsc2UKKyAgICBxcCA9IE1QWl9ORVdBTExPQyAocXVvdCwgcW4pOworCisgIG5wID0gUFRSKG51bSk7CisgIGRwID0gUFRSKGRlbik7CisKKyAgbXBuX2RpdmV4YWN0IChxcCwgbnAsIG5uLCBkcCwgZG4pOworICBNUE5fTk9STUFMSVpFIChxcCwgcW4pOworCisgIGlmIChxcCAhPSBQVFIocXVvdCkpCisgICAgTVBOX0NPUFkgKE1QWl9ORVdBTExPQyAocXVvdCwgcW4pLCBxcCwgcW4pOworCisgIFNJWihxdW90KSA9IChTSVoobnVtKSBeIFNJWihkZW4pKSA+PSAwID8gcW4gOiAtcW47CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovZGl2aXMuYyBiL21wei9kaXZpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDI5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZGl2aXMuYwpAQCAtMCwwICsxLDQzIEBACisvKiBtcHpfZGl2aXNpYmxlX3AgLS0gbXB6IGJ5IG1weiBkaXZpc2liaWxpdHkgdGVzdAorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXB6X2RpdmlzaWJsZV9wIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgZCkKK3sKKyAgbXBfc2l6ZV90IGRzaXplID0gU0laKGQpOworICBtcF9zaXplX3QgYXNpemUgPSBTSVooYSk7CisKKyAgaWYgKFVOTElLRUxZIChkc2l6ZSA9PSAwKSkKKyAgICByZXR1cm4gKGFzaXplID09IDApOworCisgIHJldHVybiBtcG5fZGl2aXNpYmxlX3AgKFBUUihhKSwgQUJTKGFzaXplKSwgUFRSKGQpLCBBQlMoZHNpemUpKTsKK30KZGlmZiAtLWdpdCBhL21wei9kaXZpc18yZXhwLmMgYi9tcHovZGl2aXNfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2IwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZGl2aXNfMmV4cC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIG1wel9kaXZpc2libGVfMmV4cF9wIC0tIG1weiBieSAyXm4gZGl2aXNpYmlsaXR5IHRlc3QKKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorbXB6X2RpdmlzaWJsZV8yZXhwX3AgKG1wel9zcmNwdHIgYSwgbXBfYml0Y250X3QgZCkgX19HTVBfTk9USFJPVworeworICBtcF9zaXplX3QgICAgICBpLCBkbGltYnM7CisgIHVuc2lnbmVkICAgICAgIGRiaXRzOworICBtcF9wdHIgICAgICAgICBhcDsKKyAgbXBfbGltYl90ICAgICAgZG1hc2s7CisgIG1wX3NpemVfdCAgICAgIGFzaXplOworCisgIGFzaXplID0gQUJTSVooYSk7CisgIGRsaW1icyA9IGQgLyBHTVBfTlVNQl9CSVRTOworCisgIC8qIGlmIGQgY292ZXJzIHRoZSB3aG9sZSBvZiBhLCB0aGVuIG9ubHkgYT09MCBpcyBkaXZpc2libGUgKi8KKyAgaWYgKGFzaXplIDw9IGRsaW1icykKKyAgICByZXR1cm4gYXNpemUgPT0gMDsKKworICAvKiB3aG9sZSBsaW1icyBtdXN0IGJlIHplcm8gKi8KKyAgYXAgPSBQVFIoYSk7CisgIGZvciAoaSA9IDA7IGkgPCBkbGltYnM7IGkrKykKKyAgICBpZiAoYXBbaV0gIT0gMCkKKyAgICAgIHJldHVybiAwOworCisgIC8qIGxlZnQgb3ZlciBiaXRzIG11c3QgYmUgemVybyAqLworICBkYml0cyA9IGQgJSBHTVBfTlVNQl9CSVRTOworICBkbWFzayA9IChDTlNUX0xJTUIoMSkgPDwgZGJpdHMpIC0gMTsKKyAgcmV0dXJuIChhcFtkbGltYnNdICYgZG1hc2spID09IDA7Cit9CmRpZmYgLS1naXQgYS9tcHovZGl2aXNfdWkuYyBiL21wei9kaXZpc191aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGM3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZGl2aXNfdWkuYwpAQCAtMCwwICsxLDgwIEBACisvKiBtcHpfZGl2aXNpYmxlX3VpX3AgLS0gbXB6IGJ5IHVsb25nIGRpdmlzaWJpbGl0eSB0ZXN0LgorCitDb3B5cmlnaHQgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKK2ludAorbXB6X2RpdmlzaWJsZV91aV9wIChtcHpfc3JjcHRyIGEsIHVuc2lnbmVkIGxvbmcgZCkKK3sKKyAgbXBfc2l6ZV90ICBhc2l6ZTsKKyAgbXBfcHRyICAgICBhcDsKKyAgdW5zaWduZWQgICB0d29zOworCisgIGFzaXplID0gU0laKGEpOworICBpZiAoVU5MSUtFTFkgKGQgPT0gMCkpCisgICAgcmV0dXJuIChhc2l6ZSA9PSAwKTsKKworICBpZiAoYXNpemUgPT0gMCkgIC8qIDAgZGl2aXNpYmxlIGJ5IGFueSBkICovCisgICAgcmV0dXJuIDE7CisKKyAgLyogRm9yIG5haWxzIGRvbid0IHRyeSB0byBiZSBjbGV2ZXIgaWYgZCBpcyBiaWdnZXIgdGhhbiBhIGxpbWIsIGp1c3QgZmFrZQorICAgICB1cCBhbiBtcHpfdCBhbmQgZ28gdG8gdGhlIG1haW4gbXB6X2RpdmlzaWJsZV9wLiAgKi8KKyAgaWYgKGQgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90ICBkbGltYnNbMl07CisgICAgICBtcHpfdCAgICAgIGR6OworICAgICAgQUxMT0MoZHopID0gMjsKKyAgICAgIFBUUihkeikgPSBkbGltYnM7CisgICAgICBtcHpfc2V0X3VpIChkeiwgZCk7CisgICAgICByZXR1cm4gbXB6X2RpdmlzaWJsZV9wIChhLCBkeik7CisgICAgfQorCisgIGFwID0gUFRSKGEpOworICBhc2l6ZSA9IEFCUyhhc2l6ZSk7ICAvKiBpZ25vcmUgc2lnbiBvZiBhICovCisKKyAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAoYXNpemUsIEJNT0RfMV9UT19NT0RfMV9USFJFU0hPTEQpKQorICAgIHJldHVybiBtcG5fbW9kXzEgKGFwLCBhc2l6ZSwgKG1wX2xpbWJfdCkgZCkgPT0gMDsKKworICBpZiAoISAoZCAmIDEpKQorICAgIHsKKyAgICAgIC8qIFN0cmlwIGxvdyB6ZXJvIGJpdHMgdG8gZ2V0IG9kZCBkIHJlcXVpcmVkIGJ5IG1vZGV4YWN0LiAgSWYgZD09ZSoyXm4KKwkgYW5kIGEgaXMgZGl2aXNpYmxlIGJ5IDJebiBhbmQgYnkgZSwgdGhlbiBpdCdzIGRpdmlzaWJsZSBieSBkLiAqLworCisgICAgICBpZiAoKGFwWzBdICYgTE9XX1pFUk9TX01BU0sgKGQpKSAhPSAwKQorCXJldHVybiAwOworCisgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAodHdvcywgKG1wX2xpbWJfdCkgZCk7CisgICAgICBkID4+PSB0d29zOworICAgIH0KKworICByZXR1cm4gbXBuX21vZGV4YWN0XzFfb2RkIChhcCwgYXNpemUsIChtcF9saW1iX3QpIGQpID09IDA7Cit9CmRpZmYgLS1naXQgYS9tcHovZHVtcC5jIGIvbXB6L2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM1ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2R1bXAuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBtcHpfZHVtcCAtIER1bXAgYW4gaW50ZWdlciB0byBzdGRvdXQuCisKKyAgIFRISVMgSVMgQU4gSU5URVJOQUwgRlVOQ1RJT04gV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLiAgSVQgSVMgTk9UIFNBRkUgVE8KKyAgIENBTEwgVEhJUyBGVU5DVElPTiBESVJFQ1RMWS4gIElOIEZBQ1QsIElUIElTIEFMTU9TVCBHVUFSQU5URUVEIFRIQVQgVEhJUworICAgRlVOQ1RJT04gV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCisKK0NvcHlyaWdodCAxOTk5LTIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBmb3Igc3RybGVuICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2R1bXAgKG1wel9zcmNwdHIgdSkKK3sKKyAgY2hhciAqc3RyOworCisgIHN0ciA9IG1wel9nZXRfc3RyICgwLCAxMCwgdSk7CisgIHByaW50ZiAoIiVzXG4iLCBzdHIpOworICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgc3RybGVuIChzdHIpICsgMSk7Cit9CmRpZmYgLS1naXQgYS9tcHovZXhwb3J0LmMgYi9tcHovZXhwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhY2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL21wei9leHBvcnQuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogbXB6X2V4cG9ydCAtLSBjcmVhdGUgd29yZCBkYXRhIGZyb20gbXB6LgorCitDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisjaWYgSEFWRV9MSU1CX0JJR19FTkRJQU4KKyNkZWZpbmUgSE9TVF9FTkRJQU4gICAgIDEKKyNlbmRpZgorI2lmIEhBVkVfTElNQl9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEhPU1RfRU5ESUFOICAgICAoLTEpCisjZW5kaWYKKyNpZm5kZWYgSE9TVF9FTkRJQU4KK3N0YXRpYyBjb25zdCBtcF9saW1iX3QgIGVuZGlhbl90ZXN0ID0gKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUy03KSkgLSAxOworI2RlZmluZSBIT1NUX0VORElBTiAgICAgKCogKHNpZ25lZCBjaGFyICopICZlbmRpYW5fdGVzdCkKKyNlbmRpZgorCit2b2lkICoKK21wel9leHBvcnQgKHZvaWQgKmRhdGEsIHNpemVfdCAqY291bnRwLCBpbnQgb3JkZXIsCisJICAgIHNpemVfdCBzaXplLCBpbnQgZW5kaWFuLCBzaXplX3QgbmFpbCwgbXB6X3NyY3B0ciB6KQoreworICBtcF9zaXplX3QgICAgICB6c2l6ZTsKKyAgbXBfc3JjcHRyICAgICAgenA7CisgIHNpemVfdCAgICAgICAgIGNvdW50LCBkdW1teTsKKyAgdW5zaWduZWQgbG9uZyAgbnVtYjsKKyAgdW5zaWduZWQgICAgICAgYWxpZ247CisKKyAgQVNTRVJUIChvcmRlciA9PSAxIHx8IG9yZGVyID09IC0xKTsKKyAgQVNTRVJUIChlbmRpYW4gPT0gMSB8fCBlbmRpYW4gPT0gMCB8fCBlbmRpYW4gPT0gLTEpOworICBBU1NFUlQgKG5haWwgPD0gOCpzaXplKTsKKyAgQVNTRVJUIChuYWlsIDwgIDgqc2l6ZSB8fCBTSVooeikgPT0gMCk7IC8qIG5haWwgPCA4KnNpemUrKFNJWih6KT09MCkgKi8KKworICBpZiAoY291bnRwID09IE5VTEwpCisgICAgY291bnRwID0gJmR1bW15OworCisgIHpzaXplID0gU0laKHopOworICBpZiAoenNpemUgPT0gMCkKKyAgICB7CisgICAgICAqY291bnRwID0gMDsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICB6c2l6ZSA9IEFCUyAoenNpemUpOworICB6cCA9IFBUUih6KTsKKyAgbnVtYiA9IDgqc2l6ZSAtIG5haWw7CisgIE1QTl9TSVpFSU5CQVNFXzJFWFAgKGNvdW50LCB6cCwgenNpemUsIG51bWIpOworICAqY291bnRwID0gY291bnQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICBkYXRhID0gKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoY291bnQqc2l6ZSk7CisKKyAgaWYgKGVuZGlhbiA9PSAwKQorICAgIGVuZGlhbiA9IEhPU1RfRU5ESUFOOworCisgIGFsaWduID0gKChjaGFyICopIGRhdGEgLSAoY2hhciAqKSBOVUxMKSAlIHNpemVvZiAobXBfbGltYl90KTsKKworICBpZiAobmFpbCA9PSBHTVBfTkFJTF9CSVRTKQorICAgIHsKKyAgICAgIGlmIChzaXplID09IHNpemVvZiAobXBfbGltYl90KSAmJiBhbGlnbiA9PSAwKQorCXsKKwkgIGlmIChvcmRlciA9PSAtMSAmJiBlbmRpYW4gPT0gSE9TVF9FTkRJQU4pCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAoKG1wX3B0cikgZGF0YSwgenAsIChtcF9zaXplX3QpIGNvdW50KTsKKwkgICAgICByZXR1cm4gZGF0YTsKKwkgICAgfQorCSAgaWYgKG9yZGVyID09IDEgJiYgZW5kaWFuID09IEhPU1RfRU5ESUFOKQorCSAgICB7CisJICAgICAgTVBOX1JFVkVSU0UgKChtcF9wdHIpIGRhdGEsIHpwLCAobXBfc2l6ZV90KSBjb3VudCk7CisJICAgICAgcmV0dXJuIGRhdGE7CisJICAgIH0KKworCSAgaWYgKG9yZGVyID09IC0xICYmIGVuZGlhbiA9PSAtSE9TVF9FTkRJQU4pCisJICAgIHsKKwkgICAgICBNUE5fQlNXQVAgKChtcF9wdHIpIGRhdGEsIHpwLCAobXBfc2l6ZV90KSBjb3VudCk7CisJICAgICAgcmV0dXJuIGRhdGE7CisJICAgIH0KKwkgIGlmIChvcmRlciA9PSAxICYmIGVuZGlhbiA9PSAtSE9TVF9FTkRJQU4pCisJICAgIHsKKwkgICAgICBNUE5fQlNXQVBfUkVWRVJTRSAoKG1wX3B0cikgZGF0YSwgenAsIChtcF9zaXplX3QpIGNvdW50KTsKKwkgICAgICByZXR1cm4gZGF0YTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgeworICAgIG1wX2xpbWJfdCAgICAgIGxpbWIsIHdiaXRzbWFzazsKKyAgICBzaXplX3QgICAgICAgICBpLCBudW1iOworICAgIG1wX3NpemVfdCAgICAgIGosIHdieXRlcywgd29mZnNldDsKKyAgICB1bnNpZ25lZCBjaGFyICAqZHA7CisgICAgaW50ICAgICAgICAgICAgbGJpdHMsIHdiaXRzOworICAgIG1wX3NyY3B0ciAgICAgIHplbmQ7CisKKyAgICBudW1iID0gc2l6ZSAqIDggLSBuYWlsOworCisgICAgLyogd2hvbGUgYnl0ZXMgcGVyIHdvcmQgKi8KKyAgICB3Ynl0ZXMgPSBudW1iIC8gODsKKworICAgIC8qIHBvc3NpYmxlIHBhcnRpYWwgYnl0ZSAqLworICAgIHdiaXRzID0gbnVtYiAlIDg7CisgICAgd2JpdHNtYXNrID0gKENOU1RfTElNQigxKSA8PCB3Yml0cykgLSAxOworCisgICAgLyogb2Zmc2V0IHRvIGdldCB0byB0aGUgbmV4dCB3b3JkICovCisgICAgd29mZnNldCA9IChlbmRpYW4gPj0gMCA/IHNpemUgOiAtIChtcF9zaXplX3QpIHNpemUpCisgICAgICArIChvcmRlciA8IDAgPyBzaXplIDogLSAobXBfc2l6ZV90KSBzaXplKTsKKworICAgIC8qIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgKi8KKyAgICBkcCA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEKKyAgICAgICsgKG9yZGVyID49IDAgPyAoY291bnQtMSkqc2l6ZSA6IDApICsgKGVuZGlhbiA+PSAwID8gc2l6ZS0xIDogMCk7CisKKyNkZWZpbmUgRVhUUkFDVChOLCBNQVNLKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAobGJpdHMgPj0gKE4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICpkcCA9IGxpbWIgTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGltYiA+Pj0gKE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsYml0cyAtPSAoTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1wX2xpbWJfdCAgbmV3bGltYjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmV3bGltYiA9ICh6cCA9PSB6ZW5kID8gMCA6ICp6cCsrKTsgICAgICAgICAgIFwKKyAgICAgICAgICAqZHAgPSAobGltYiB8IChuZXdsaW1iIDw8IGxiaXRzKSkgTUFTSzsgICAgICAgXAorICAgICAgICAgIGxpbWIgPSBuZXdsaW1iID4+ICgoTiktbGJpdHMpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGJpdHMgKz0gR01QX05VTUJfQklUUyAtIChOKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICB6ZW5kID0genAgKyB6c2l6ZTsKKyAgICBsYml0cyA9IDA7CisgICAgbGltYiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICB7CisJZm9yIChqID0gMDsgaiA8IHdieXRlczsgaisrKQorCSAgeworCSAgICBFWFRSQUNUICg4LCArIDApOworCSAgICBkcCAtPSBlbmRpYW47CisJICB9CisJaWYgKHdiaXRzICE9IDApCisJICB7CisJICAgIEVYVFJBQ1QgKHdiaXRzLCAmIHdiaXRzbWFzayk7CisJICAgIGRwIC09IGVuZGlhbjsKKwkgICAgaisrOworCSAgfQorCWZvciAoIDsgaiA8IHNpemU7IGorKykKKwkgIHsKKwkgICAgKmRwID0gJ1wwJzsKKwkgICAgZHAgLT0gZW5kaWFuOworCSAgfQorCWRwICs9IHdvZmZzZXQ7CisgICAgICB9CisKKyAgICBBU1NFUlQgKHpwID09IFBUUih6KSArIEFCU0laKHopKTsKKworICAgIC8qIGxvdyBieXRlIG9mIHdvcmQgYWZ0ZXIgbW9zdCBzaWduaWZpY2FudCAqLworICAgIEFTU0VSVCAoZHAgPT0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YQorCSAgICArIChvcmRlciA8IDAgPyBjb3VudCpzaXplIDogLSAobXBfc2l6ZV90KSBzaXplKQorCSAgICArIChlbmRpYW4gPj0gMCA/IChtcF9zaXplX3QpIHNpemUgLSAxIDogMCkpOworICB9CisgIHJldHVybiBkYXRhOworfQpkaWZmIC0tZ2l0IGEvbXB6L2ZhY191aS5jIGIvbXB6L2ZhY191aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTk4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZmFjX3VpLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIG1wel9mYWNfdWkoUkVTVUxULCBOKSAtLSBTZXQgUkVTVUxUIHRvIE4hLgorCitDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NSwgMjAwMC0yMDAzLCAyMDExLCAyMDEyLCAyMDE1LCAyMDIxIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNkZWZpbmUgRkFDVE9SX0xJU1RfU1RPUkUoUCwgUFIsIE1BWF9QUiwgVkVDLCBJKQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgaWYgKChQUikgPiAoTUFYX1BSKSkgewkJCQkJXAorICAgICAgKFZFQylbKEkpKytdID0gKFBSKTsJCQkJCVwKKyAgICAgIChQUikgPSAoUCk7CQkJCQkJXAorICAgIH0gZWxzZQkJCQkJCQlcCisgICAgICAoUFIpICo9IChQKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQKKyNkZWZpbmUgRkFDVE9SU19QRVJfTElNQiAoR01QX05VTUJfQklUUyAvIChMT0cyQyhGQUNfRFNDX1RIUkVTSE9MRF9MSU1JVC0xKSsxKSkKKyNlbHNlCisjZGVmaW5lIEZBQ1RPUlNfUEVSX0xJTUIgKEdNUF9OVU1CX0JJVFMgLyAoTE9HMkMoRkFDX09ERF9USFJFU0hPTEQpKzEpKQorI2VuZGlmCisKKy8qIENvbXB1dGVzIG4hLCB0aGUgZmFjdG9yaWFsIG9mIG4uCisgICBXQVJOSU5HOiBpdCBhc3N1bWVzIHRoYXQgbiBmaXRzIGluIGEgbGltYiEKKyAqLwordm9pZAorbXB6X2ZhY191aSAobXB6X3B0ciB4LCB1bnNpZ25lZCBsb25nIG4pCit7CisgIHN0YXRpYyBjb25zdCBtcF9saW1iX3QgdGFibGVbXSA9IHsgT05FX0xJTUJfRkFDVE9SSUFMX1RBQkxFIH07CisKKyAgQVNTRVJUIChuIDw9IEdNUF9OVU1CX01BWCk7CisKKyAgaWYgKG4gPCBudW1iZXJvZiAodGFibGUpKQorICAgIHsKKyAgICAgIE1QWl9ORVdBTExPQyAoeCwgMSlbMF0gPSB0YWJsZVtuXTsKKyAgICAgIFNJWiAoeCkgPSAxOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChuLCBGQUNfT0REX1RIUkVTSE9MRCkpCisgICAgeworICAgICAgbXBfbGltYl90IHByb2QsIG1heF9wcm9kOworICAgICAgbXBfc2l6ZV90IGo7CisgICAgICBtcF9wdHIgICAgZmFjdG9yczsKKyAgICAgIG1wX2xpbWJfdCBmYWMsIGRpZmYgPSBuIC0gbnVtYmVyb2YgKHRhYmxlKTsKKyAgICAgIFRNUF9TREVDTDsKKworICAgICAgVE1QX1NNQVJLOworICAgICAgZmFjdG9ycyA9IFRNUF9TQUxMT0NfTElNQlMgKDIgKyBkaWZmIC8gRkFDVE9SU19QRVJfTElNQik7CisKKyAgICAgIGZhY3RvcnNbMF0gPSB0YWJsZVtudW1iZXJvZiAodGFibGUpLTFdOworICAgICAgaiA9IDE7CisgICAgICBpZiAoKGRpZmYgJiAxKSA9PSAwKQorCXsKKwkgIHByb2QgPSBuOworCSAgLyogaWYgKGRpZmYgIT0gMCkgKi8KKwkgICAgZmFjID0gLS1uICogbnVtYmVyb2YgKHRhYmxlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJvZCA9IG4gKiBudW1iZXJvZiAodGFibGUpOworCSAgZmFjID0gcHJvZCArIC0tZGlmZjsKKwl9CisKKyNpZiBUVU5FX1BST0dSQU1fQlVJTEQKKyAgICAgIG1heF9wcm9kID0gR01QX05VTUJfTUFYIC8gKEZBQ19EU0NfVEhSRVNIT0xEX0xJTUlUICogRkFDX0RTQ19USFJFU0hPTERfTElNSVQpOworI2Vsc2UKKyAgICAgIG1heF9wcm9kID0gR01QX05VTUJfTUFYIC8KKwkoKChGQUNfT0REX1RIUkVTSE9MRCArIG51bWJlcm9mICh0YWJsZSkgKyAxKSAvIDIpICoKKwkgKChGQUNfT0REX1RIUkVTSE9MRCArIG51bWJlcm9mICh0YWJsZSkpIC8gMikpOworI2VuZGlmCisgICAgICBmb3IgKDtkaWZmICE9IDA7IGZhYyArPSAoZGlmZiAtPSAyKSkKKwlGQUNUT1JfTElTVF9TVE9SRSAoZmFjLCBwcm9kLCBtYXhfcHJvZCwgZmFjdG9ycywgaik7CisKKyAgICAgIGZhY3RvcnNbaisrXSA9IHByb2Q7CisgICAgICBtcHpfcHJvZGxpbWJzICh4LCBmYWN0b3JzLCBqKTsKKworICAgICAgVE1QX1NGUkVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjb3VudDsKKyAgICAgIG1wel9vZGRmYWNfMSAoeCwgbiwgMCk7CisgICAgICBpZiAobiA8PSBUQUJMRV9MSU1JVF8yTl9NSU5VU19QT1BDXzJOKQorCWNvdW50ID0gX19nbXBfZmFjMmNudF90YWJsZVtuIC8gMiAtIDFdOworICAgICAgZWxzZQorCXsKKwkgIHBvcGNfbGltYiAoY291bnQsIG4pOworCSAgY291bnQgPSBuIC0gY291bnQ7CisJfQorICAgICAgbXB6X211bF8yZXhwICh4LCB4LCBjb3VudCk7CisgICAgfQorfQorCisjdW5kZWYgRkFDVE9SU19QRVJfTElNQgorI3VuZGVmIEZBQ1RPUl9MSVNUX1NUT1JFCmRpZmYgLS1naXQgYS9tcHovZmRpdl9xLmMgYi9tcHovZmRpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MDIzZQotLS0gL2Rldi9udWxsCisrKyBiL21wei9mZGl2X3EuYwpAQCAtMCwwICsxLDUyIEBACisvKiBtcHpfZmRpdl9xIC0tIERpdmlzaW9uIHJvdW5kaW5nIHRoZSBxdW90aWVudCB0b3dhcmRzIC1pbmZpbml0eS4KKyAgIFRoZSByZW1haW5kZXIgZ2V0cyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4KKworQ29weXJpZ2h0IDE5OTQtMTk5NiwgMjAwMCwgMjAwMSwgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9mZGl2X3EgKG1wel9wdHIgcXVvdCwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgbXB6X3NyY3B0ciBkaXZpc29yKQoreworICBtcF9zaXplX3QgZGl2aWRlbmRfc2l6ZSA9IFNJWiAoZGl2aWRlbmQpOworICBtcF9zaXplX3QgZGl2aXNvcl9zaXplID0gU0laIChkaXZpc29yKTsKKyAgbXB6X3QgcmVtOworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICBNUFpfVE1QX0lOSVQgKHJlbSwgQUJTIChkaXZpc29yX3NpemUpKTsKKworICBtcHpfdGRpdl9xciAocXVvdCwgcmVtLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgaWYgKChkaXZpc29yX3NpemUgXiBkaXZpZGVuZF9zaXplKSA8IDAgJiYgU0laIChyZW0pICE9IDApCisgICAgbXB6X3N1Yl91aSAocXVvdCwgcXVvdCwgMUwpOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L2ZkaXZfcV91aS5jIGIvbXB6L2ZkaXZfcV91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWY5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZmRpdl9xX3VpLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIG1wel9mZGl2X3FfdWkgLS0gRGl2aXNpb24gcm91bmRpbmcgdGhlIHF1b3RpZW50IHRvd2FyZHMgLWluZmluaXR5LgorICAgVGhlIHJlbWFpbmRlciBnZXRzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yLgorCitDb3B5cmlnaHQgMTk5NC0xOTk2LCAxOTk5LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfZmRpdl9xX3VpIChtcHpfcHRyIHF1b3QsIG1wel9zcmNwdHIgZGl2aWRlbmQsIHVuc2lnbmVkIGxvbmcgaW50IGRpdmlzb3IpCit7CisgIG1wX3NpemVfdCBucywgbm4sIHFuOworICBtcF9wdHIgbnAsIHFwOworICBtcF9saW1iX3Qgcmw7CisKKyAgaWYgKFVOTElLRUxZIChkaXZpc29yID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIG5zID0gU0laKGRpdmlkZW5kKTsKKyAgaWYgKG5zID09IDApCisgICAgeworICAgICAgU0laKHF1b3QpID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBubiA9IEFCUyhucyk7CisgIHFwID0gTVBaX1JFQUxMT0MgKHF1b3QsIG5uKTsKKyAgbnAgPSBQVFIoZGl2aWRlbmQpOworCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKGRpdmlzb3IgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90IGRwWzJdLCBycFsyXTsKKworICAgICAgaWYgKG5uID09IDEpCQkvKiB0ZGl2X3FyIHJlcXVpcmVtZW50czsgdGVzdGVkIGFib3ZlIGZvciAwICovCisJeworCSAgcXBbMF0gPSAwOworCSAgcmwgPSBucFswXTsKKwkgIHFuID0gMTsJCS8qIGEgd2hpdGUgbGllLCBmaXhlZCBiZWxvdyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkcFswXSA9IGRpdmlzb3IgJiBHTVBfTlVNQl9NQVNLOworCSAgZHBbMV0gPSBkaXZpc29yID4+IEdNUF9OVU1CX0JJVFM7CisJICBtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIGRwLCAobXBfc2l6ZV90KSAyKTsKKwkgIHJsID0gcnBbMF0gKyAocnBbMV0gPDwgR01QX05VTUJfQklUUyk7CisJICBxbiA9IG5uIC0gMiArIDE7CisJfQorCisgICAgICBpZiAocmwgIT0gMCAmJiBucyA8IDApCisJeworCSAgbXBuX2luY3JfdSAocXAsIChtcF9saW1iX3QpIDEpOworCSAgcmwgPSBkaXZpc29yIC0gcmw7CisJfQorCisgICAgICBxbiAtPSBxcFtxbiAtIDFdID09IDA7IHFuIC09IHFuICE9IDAgJiYgcXBbcW4gLSAxXSA9PSAwOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgcmwgPSBtcG5fZGl2cmVtXzEgKHFwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIChtcF9saW1iX3QpIGRpdmlzb3IpOworCisgICAgICBpZiAocmwgIT0gMCAmJiBucyA8IDApCisJeworCSAgbXBuX2luY3JfdSAocXAsIChtcF9saW1iX3QpIDEpOworCSAgcmwgPSBkaXZpc29yIC0gcmw7CisJfQorCisgICAgICBxbiA9IG5uIC0gKHFwW25uIC0gMV0gPT0gMCk7CisgICAgfQorCisgIFNJWihxdW90KSA9IG5zID49IDAgPyBxbiA6IC1xbjsKKyAgcmV0dXJuIHJsOworfQpkaWZmIC0tZ2l0IGEvbXB6L2ZkaXZfcXIuYyBiL21wei9mZGl2X3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNjE2NgotLS0gL2Rldi9udWxsCisrKyBiL21wei9mZGl2X3FyLmMKQEAgLTAsMCArMSw2NCBAQAorLyogbXB6X2ZkaXZfcXIgLS0gRGl2aXNpb24gcm91bmRpbmcgdGhlIHF1b3RpZW50IHRvd2FyZHMgLWluZmluaXR5LgorICAgVGhlIHJlbWFpbmRlciBnZXRzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yLgorCitDb3B5cmlnaHQgMTk5NC0xOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2ZkaXZfcXIgKG1wel9wdHIgcXVvdCwgbXB6X3B0ciByZW0sIG1wel9zcmNwdHIgZGl2aWRlbmQsIG1wel9zcmNwdHIgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IGRpdmlzb3Jfc2l6ZSA9IFNJWiAoZGl2aXNvcik7CisgIG1wX3NpemVfdCB4c2l6ZTsKKyAgbXB6X3QgdGVtcF9kaXZpc29yOwkJLyogTi5CLjogbGl2ZXMgdW50aWwgZnVuY3Rpb24gcmV0dXJucyEgKi8KKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgLyogV2UgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGRpdmlzb3IgYWZ0ZXIgdGhlIHF1b3RpZW50IGFuZAorICAgICByZW1haW5kZXIgaGF2ZSBiZWVuIHByZWxpbWluYXJ5IGNhbGN1bGF0ZWQuICBXZSBoYXZlIHRvIGNvcHkgaXQgdG8KKyAgICAgdGVtcG9yYXJ5IHNwYWNlIGlmIGl0J3MgdGhlIHNhbWUgdmFyaWFibGUgYXMgZWl0aGVyIFFVT1Qgb3IgUkVNLiAgKi8KKyAgaWYgKHF1b3QgPT0gZGl2aXNvciB8fCByZW0gPT0gZGl2aXNvcikKKyAgICB7CisgICAgICBNUFpfVE1QX0lOSVQgKHRlbXBfZGl2aXNvciwgQUJTIChkaXZpc29yX3NpemUpKTsKKyAgICAgIG1wel9zZXQgKHRlbXBfZGl2aXNvciwgZGl2aXNvcik7CisgICAgICBkaXZpc29yID0gdGVtcF9kaXZpc29yOworICAgIH0KKworICB4c2l6ZSA9IFNJWiAoZGl2aWRlbmQpIF4gZGl2aXNvcl9zaXplOzsKKyAgbXB6X3RkaXZfcXIgKHF1b3QsIHJlbSwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgIGlmICh4c2l6ZSA8IDAgJiYgU0laIChyZW0pICE9IDApCisgICAgeworICAgICAgbXB6X3N1Yl91aSAocXVvdCwgcXVvdCwgMUwpOworICAgICAgbXB6X2FkZCAocmVtLCByZW0sIGRpdmlzb3IpOworICAgIH0KKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wei9mZGl2X3FyX3VpLmMgYi9tcHovZmRpdl9xcl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NGNhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZmRpdl9xcl91aS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiBtcHpfZmRpdl9xcl91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAtaW5maW5pdHkuCisgICBUaGUgcmVtYWluZGVyIGdldHMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDE5OTksIDIwMDEsIDIwMDIsIDIwMDQsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel9mZGl2X3FyX3VpIChtcHpfcHRyIHF1b3QsIG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uLCBxbjsKKyAgbXBfcHRyIG5wLCBxcDsKKyAgbXBfbGltYl90IHJsOworCisgIGlmIChVTkxJS0VMWSAoZGl2aXNvciA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBucyA9IFNJWihkaXZpZGVuZCk7CisgIGlmIChucyA9PSAwKQorICAgIHsKKyAgICAgIFNJWihxdW90KSA9IDA7CisgICAgICBTSVoocmVtKSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBxcCA9IE1QWl9SRUFMTE9DIChxdW90LCBubik7CisgIG5wID0gUFRSKGRpdmlkZW5kKTsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmIChkaXZpc29yID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBkcFsyXTsKKyAgICAgIG1wX3B0ciBycDsKKyAgICAgIG1wX3NpemVfdCBybjsKKworICAgICAgcnAgPSBNUFpfUkVBTExPQyAocmVtLCAyKTsKKworICAgICAgaWYgKG5uID09IDEpCQkvKiB0ZGl2X3FyIHJlcXVpcmVtZW50czsgdGVzdGVkIGFib3ZlIGZvciAwICovCisJeworCSAgcXBbMF0gPSAwOworCSAgcW4gPSAxOwkJLyogYSB3aGl0ZSBsaWUsIGZpeGVkIGJlbG93ICovCisJICBybCA9IG5wWzBdOworCSAgcnBbMF0gPSBybDsKKwl9CisgICAgICBlbHNlCisJeworCSAgZHBbMF0gPSBkaXZpc29yICYgR01QX05VTUJfTUFTSzsKKwkgIGRwWzFdID0gZGl2aXNvciA+PiBHTVBfTlVNQl9CSVRTOworCSAgbXBuX3RkaXZfcXIgKHFwLCBycCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCBkcCwgKG1wX3NpemVfdCkgMik7CisJICBybCA9IHJwWzBdICsgKHJwWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworCSAgcW4gPSBubiAtIDIgKyAxOworCX0KKworICAgICAgaWYgKHJsICE9IDAgJiYgbnMgPCAwKQorCXsKKwkgIG1wbl9pbmNyX3UgKHFwLCAobXBfbGltYl90KSAxKTsKKwkgIHJsID0gZGl2aXNvciAtIHJsOworCSAgcnBbMF0gPSBybCAmIEdNUF9OVU1CX01BU0s7CisJICBycFsxXSA9IHJsID4+IEdNUF9OVU1CX0JJVFM7CisJfQorCisgICAgICBxbiAtPSBxcFtxbiAtIDFdID09IDA7IHFuIC09IHFuICE9IDAgJiYgcXBbcW4gLSAxXSA9PSAwOworICAgICAgcm4gPSAxICsgKHJsID4gR01QX05VTUJfTUFYKTsgIHJuIC09IChycFtybiAtIDFdID09IDApOworICAgICAgU0laKHJlbSkgPSBybjsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX2RpdnJlbV8xIChxcCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCAobXBfbGltYl90KSBkaXZpc29yKTsKKyAgICAgIGlmIChybCA9PSAwKQorCVNJWihyZW0pID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAobnMgPCAwKQorCSAgICB7CisJICAgICAgbXBuX2luY3JfdSAocXAsIChtcF9saW1iX3QpIDEpOworCSAgICAgIHJsID0gZGl2aXNvciAtIHJsOworCSAgICB9CisKKwkgIE1QWl9ORVdBTExPQyAocmVtLCAxKVswXSA9IHJsOworCSAgU0laKHJlbSkgPSBybCAhPSAwOworCX0KKyAgICAgIHFuID0gbm4gLSAocXBbbm4gLSAxXSA9PSAwKTsKKyAgICB9CisKKyAgU0laKHF1b3QpID0gbnMgPj0gMCA/IHFuIDogLXFuOworICByZXR1cm4gcmw7Cit9CmRpZmYgLS1naXQgYS9tcHovZmRpdl9yLmMgYi9tcHovZmRpdl9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhM2M4ZQotLS0gL2Rldi9udWxsCisrKyBiL21wei9mZGl2X3IuYwpAQCAtMCwwICsxLDU5IEBACisvKiBtcHpfZmRpdl9yIC0tIERpdmlzaW9uIHJvdW5kaW5nIHRoZSBxdW90aWVudCB0b3dhcmRzIC1pbmZpbml0eS4KKyAgIFRoZSByZW1haW5kZXIgZ2V0cyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvci4KKworQ29weXJpZ2h0IDE5OTQtMTk5NiwgMjAwMSwgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9mZGl2X3IgKG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIGRpdmlkZW5kLCBtcHpfc3JjcHRyIGRpdmlzb3IpCit7CisgIG1wX3NpemVfdCBkaXZpc29yX3NpemUgPSBTSVogKGRpdmlzb3IpOworICBtcHpfdCB0ZW1wX2Rpdmlzb3I7CQkvKiBOLkIuOiBsaXZlcyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zISAqLworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICAvKiBXZSBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZGl2aXNvciBhZnRlciB0aGUgcmVtYWluZGVyIGhhcyBiZWVuCisgICAgIHByZWxpbWluYXJ5IGNhbGN1bGF0ZWQuICBXZSBoYXZlIHRvIGNvcHkgaXQgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0J3MKKyAgICAgdGhlIHNhbWUgdmFyaWFibGUgYXMgUkVNLiAgKi8KKyAgaWYgKHJlbSA9PSBkaXZpc29yKQorICAgIHsKKyAgICAgIE1QWl9UTVBfSU5JVCAodGVtcF9kaXZpc29yLCBBQlMgKGRpdmlzb3Jfc2l6ZSkpOworICAgICAgbXB6X3NldCAodGVtcF9kaXZpc29yLCBkaXZpc29yKTsKKyAgICAgIGRpdmlzb3IgPSB0ZW1wX2Rpdmlzb3I7CisgICAgfQorCisgIG1wel90ZGl2X3IgKHJlbSwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgIGlmICgoZGl2aXNvcl9zaXplIF4gU0laIChkaXZpZGVuZCkpIDwgMCAmJiBTSVogKHJlbSkgIT0gMCkKKyAgICBtcHpfYWRkIChyZW0sIHJlbSwgZGl2aXNvcik7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovZmRpdl9yX3VpLmMgYi9tcHovZmRpdl9yX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkZjhhOAotLS0gL2Rldi9udWxsCisrKyBiL21wei9mZGl2X3JfdWkuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogbXB6X2ZkaXZfcl91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAtaW5maW5pdHkuCisgICBUaGUgcmVtYWluZGVyIGdldHMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel9mZGl2X3JfdWkgKG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uOworICBtcF9wdHIgbnA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICBTSVoocmVtKSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBucCA9IFBUUihkaXZpZGVuZCk7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKGRpdmlzb3IgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90IGRwWzJdOworICAgICAgbXBfcHRyIHJwLCBxcDsKKyAgICAgIG1wX3NpemVfdCBybjsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBycCA9IE1QWl9SRUFMTE9DIChyZW0sIDIpOworCisgICAgICBpZiAobm4gPT0gMSkJCS8qIHRkaXZfcXIgcmVxdWlyZW1lbnRzOyB0ZXN0ZWQgYWJvdmUgZm9yIDAgKi8KKwl7CisJICBybCA9IG5wWzBdOworCSAgcnBbMF0gPSBybDsKKwl9CisgICAgICBlbHNlCisJeworCSAgVE1QX01BUks7CisJICBkcFswXSA9IGRpdmlzb3IgJiBHTVBfTlVNQl9NQVNLOworCSAgZHBbMV0gPSBkaXZpc29yID4+IEdNUF9OVU1CX0JJVFM7CisJICBxcCA9IFRNUF9BTExPQ19MSU1CUyAobm4gLSAyICsgMSk7CisJICBtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIGRwLCAobXBfc2l6ZV90KSAyKTsKKwkgIFRNUF9GUkVFOworCSAgcmwgPSBycFswXSArIChycFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKwl9CisKKyAgICAgIGlmIChybCAhPSAwICYmIG5zIDwgMCkKKwl7CisJICBybCA9IGRpdmlzb3IgLSBybDsKKwkgIHJwWzBdID0gcmwgJiBHTVBfTlVNQl9NQVNLOworCSAgcnBbMV0gPSBybCA+PiBHTVBfTlVNQl9CSVRTOworCX0KKworICAgICAgcm4gPSAxICsgKHJsID4gR01QX05VTUJfTUFYKTsgIHJuIC09IChycFtybiAtIDFdID09IDApOworICAgICAgU0laKHJlbSkgPSBybjsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX21vZF8xIChucCwgbm4sIChtcF9saW1iX3QpIGRpdmlzb3IpOworICAgICAgaWYgKHJsID09IDApCisJU0laKHJlbSkgPSAwOworICAgICAgZWxzZQorCXsKKwkgIGlmIChucyA8IDApCisJICAgIHJsID0gZGl2aXNvciAtIHJsOworCisJICBNUFpfTkVXQUxMT0MgKHJlbSwgMSlbMF0gPSBybDsKKwkgIFNJWihyZW0pID0gMTsKKwl9CisgICAgfQorCisgIHJldHVybiBybDsKK30KZGlmZiAtLWdpdCBhL21wei9mZGl2X3VpLmMgYi9tcHovZmRpdl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYWFjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZmRpdl91aS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBtcHpfZmRpdl91aSAtLSBEaXZpc2lvbiByb3VuZGluZyB0aGUgcXVvdGllbnQgdG93YXJkcyAtaW5maW5pdHkuCisgICBUaGUgcmVtYWluZGVyIGdldHMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGVub21pbmF0b3IuCisKK0NvcHlyaWdodCAxOTk0LTE5OTYsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel9mZGl2X3VpIChtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uOworICBtcF9wdHIgbnA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBucCA9IFBUUihkaXZpZGVuZCk7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKGRpdmlzb3IgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgbXBfbGltYl90IGRwWzJdLCBycFsyXTsKKyAgICAgIG1wX3B0ciBxcDsKKyAgICAgIG1wX3NpemVfdCBybjsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBpZiAobm4gPT0gMSkJCS8qIHRkaXZfcXIgcmVxdWlyZW1lbnRzOyB0ZXN0ZWQgYWJvdmUgZm9yIDAgKi8KKwl7CisJICBybCA9IG5wWzBdOworCSAgcnBbMF0gPSBybDsKKwl9CisgICAgICBlbHNlCisJeworCSAgVE1QX01BUks7CisJICBkcFswXSA9IGRpdmlzb3IgJiBHTVBfTlVNQl9NQVNLOworCSAgZHBbMV0gPSBkaXZpc29yID4+IEdNUF9OVU1CX0JJVFM7CisJICBxcCA9IFRNUF9BTExPQ19MSU1CUyAobm4gLSAyICsgMSk7CisJICBtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIGRwLCAobXBfc2l6ZV90KSAyKTsKKwkgIFRNUF9GUkVFOworCSAgcmwgPSBycFswXSArIChycFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKwl9CisKKyAgICAgIGlmIChybCAhPSAwICYmIG5zIDwgMCkKKwl7CisJICBybCA9IGRpdmlzb3IgLSBybDsKKwkgIHJwWzBdID0gcmwgJiBHTVBfTlVNQl9NQVNLOworCSAgcnBbMV0gPSBybCA+PiBHTVBfTlVNQl9CSVRTOworCX0KKworICAgICAgcm4gPSAxICsgKHJsID4gR01QX05VTUJfTUFYKTsgIHJuIC09IChycFtybiAtIDFdID09IDApOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgcmwgPSBtcG5fbW9kXzEgKG5wLCBubiwgKG1wX2xpbWJfdCkgZGl2aXNvcik7CisgICAgICBpZiAocmwgPT0gMCkKKwk7CisgICAgICBlbHNlCisJeworCSAgaWYgKG5zIDwgMCkKKwkgICAgcmwgPSBkaXZpc29yIC0gcmw7CisJfQorICAgIH0KKworICByZXR1cm4gcmw7Cit9CmRpZmYgLS1naXQgYS9tcHovZmliMl91aS5jIGIvbXB6L2ZpYjJfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI2MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2ZpYjJfdWkuYwpAQCAtMCwwICsxLDU4IEBACisvKiBtcHpfZmliMl91aSAtLSBjYWxjdWxhdGUgRmlib25hY2NpIG51bWJlcnMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDEyLCAyMDE0LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wel9maWIyX3VpIChtcHpfcHRyIGZuLCBtcHpfcHRyIGZuc3ViMSwgdW5zaWduZWQgbG9uZyBuKQoreworICBtcF9wdHIgICAgIGZwLCBmMXA7CisgIG1wX3NpemVfdCAgc2l6ZTsKKworICBpZiAobiA8PSBGSUJfVEFCTEVfTElNSVQpCisgICAgeworICAgICAgTVBaX05FV0FMTE9DIChmbiwgMSlbMF0gPSBGSUJfVEFCTEUgKG4pOworICAgICAgU0laKGZuKSA9IChuICE9IDApOyAgICAgIC8qIEZbMF09PTAsIG90aGVycyBhcmUgIT0wICovCisgICAgICBNUFpfTkVXQUxMT0MgKGZuc3ViMSwgMSlbMF0gPSBGSUJfVEFCTEUgKChpbnQpIG4gLSAxKTsKKyAgICAgIFNJWihmbnN1YjEpID0gKG4gIT0gMSk7ICAvKiBGWzEtMV09PTAsIG90aGVycyBhcmUgIT0wICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpemUgPSBNUE5fRklCMl9TSVpFIChuKTsKKyAgZnAgPSAgTVBaX05FV0FMTE9DIChmbiwgICAgIHNpemUpOworICBmMXAgPSBNUFpfTkVXQUxMT0MgKGZuc3ViMSwgc2l6ZSk7CisKKyAgc2l6ZSA9IG1wbl9maWIyX3VpIChmcCwgZjFwLCBuKTsKKworICBTSVooZm4pICAgICA9IHNpemU7CisgIFNJWihmbnN1YjEpID0gc2l6ZSAtIChmMXBbc2l6ZS0xXSA9PSAwKTsKK30KZGlmZiAtLWdpdCBhL21wei9maWJfdWkuYyBiL21wei9maWJfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVmM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2ZpYl91aS5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiBtcHpfZmliX3VpIC0tIGNhbGN1bGF0ZSBGaWJvbmFjY2kgbnVtYmVycy4KKworQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAwNSwgMjAxMiwgMjAxNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIGNoYW5nZSB0byAiI2RlZmluZSBUUkFDRSh4KSB4IiB0byBnZXQgc29tZSB0cmFjZXMgKi8KKyNkZWZpbmUgVFJBQ0UoeCkKKworCisvKiBJbiB0aGUgRlsyaysxXSBiZWxvdyBmb3IgayBvZGQsIHRoZSAtMiB3b24ndCBnaXZlIGEgYm9ycm93IGZyb20gdGhlIGxvdworICAgbGltYiBiZWNhdXNlIHRoZSByZXN1bHQgRlsyaysxXSBpcyBhbiBGWzRtKzNdIGFuZCBzdWNoIG51bWJlcnMgYXJlIGFsd2F5cworICAgPT0gMSwgMiBvciA1IG1vZCA4LCB3aGVyZWFzIGFuIHVuZGVyZmxvdyB3b3VsZCBsZWF2ZSA2IG9yIDcuICAoVGhpcyBpcworICAgdGhlIHNhbWUgYXMgaW4gbXBuX2ZpYjJfdWkuKQorCisgICBJbiB0aGUgRlsyaysxXSBmb3IgayBldmVuLCB0aGUgKzIgd29uJ3QgZ2l2ZSBhIGNhcnJ5IG91dCBvZiB0aGUgbG93IGxpbWIKKyAgIGluIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiAgVGhpcyBpcyBhbiBGWzRtKzFdIGFuZCB3ZSBjbGFpbSB0aGF0IEZbMyoyXmIrMV0KKyAgID09IDEgbW9kIDJeYiBpcyB0aGUgZmlyc3QgRls0bSsxXSBjb25ncnVlbnQgdG8gMCBvciAxIG1vZCAyXmIsIGFuZCBoZW5jZQorICAgaWYgbiA8IDJeR01QX05VTUJfQklUUyB0aGVuIEZbbl0gY2Fubm90IGhhdmUgYSBsb3cgbGltYiBvZiAwIG9yIDEuICBObworICAgcHJvb2YgZm9yIHRoaXMgY2xhaW0sIGJ1dCBpdCdzIGJlZW4gdmVyaWZpZWQgdXAgdG8gYj09MzIgYW5kIGhhcyBzdWNoIGEKKyAgIG5pY2UgcGF0dGVybiBpdCBtdXN0IGJlIHRydWUgOi0pLiAgT2YgaW50ZXJlc3QgaXMgdGhhdCBGWzMqMl5iXSA9PSAwIG1vZAorICAgMl4oYisxKSBzZWVtcyB0byBob2xkIHRvby4KKworICAgV2hlbiBuID49IDJeR01QX05VTUJfQklUUywgd2hpY2ggY2FuIGFyaXNlIGluIGEgbmFpbHMgYnVpbGQsIHRoZW4gdGhlIGxvdworICAgbGltYiBvZiBGWzRtKzFdIGNhbiBjZXJ0YWlubHkgYmUgMSwgYW5kIGFuIG1wbl9hZGRfMSBtdXN0IGJlIHVzZWQuICAqLworCit2b2lkCittcHpfZmliX3VpIChtcHpfcHRyIGZuLCB1bnNpZ25lZCBsb25nIG4pCit7CisgIG1wX3B0ciAgICAgICAgIGZwLCB4cCwgeXA7CisgIG1wX3NpemVfdCAgICAgIHNpemUsIHhhbGxvYzsKKyAgdW5zaWduZWQgbG9uZyAgbjI7CisgIG1wX2xpbWJfdCAgICAgIGM7CisgIFRNUF9ERUNMOworCisgIGlmIChuIDw9IEZJQl9UQUJMRV9MSU1JVCkKKyAgICB7CisgICAgICBNUFpfTkVXQUxMT0MgKGZuLCAxKVswXSA9IEZJQl9UQUJMRSAobik7CisgICAgICBTSVooZm4pID0gKG4gIT0gMCk7ICAgICAgLyogRlswXT09MCwgb3RoZXJzIGFyZSAhPTAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbjIgPSBuLzI7CisgIHhhbGxvYyA9IE1QTl9GSUIyX1NJWkUgKG4yKSArIDE7CisgIGZwID0gTVBaX05FV0FMTE9DIChmbiwgMiAqIHhhbGxvYyk7CisKKyAgVE1QX01BUks7CisgIFRNUF9BTExPQ19MSU1CU18yICh4cCx4YWxsb2MsIHlwLHhhbGxvYyk7CisgIHNpemUgPSBtcG5fZmliMl91aSAoeHAsIHlwLCBuMik7CisKKyAgVFJBQ0UgKHByaW50ZiAoIm1wel9maWJfdWkgbGFzdCBzdGVwIG49JWx1IHNpemU9JWxkIGJpdD0lbHVcbiIsCisJCSBuID4+IDEsIHNpemUsIG4mMSk7CisJIG1wbl90cmFjZSAoInhwIiwgeHAsIHNpemUpOworCSBtcG5fdHJhY2UgKCJ5cCIsIHlwLCBzaXplKSk7CisKKyAgaWYgKG4gJiAxKQorICAgIHsKKyAgICAgIC8qIEZbMmsrMV0gPSAoMkZba10rRltrLTFdKSooMkZba10tRltrLTFdKSArIDIqKC0xKV5rICAqLworICAgICAgbXBfc2l6ZV90ICB4c2l6ZSwgeXNpemU7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkX25fc3ViX24KKyAgICAgIHhwW3NpemVdID0gbXBuX2xzaGlmdCAoeHAsIHhwLCBzaXplLCAxKTsKKyAgICAgIHlwW3NpemVdID0gMDsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fYWRkX25fc3ViX24gKHhwLCB5cCwgeHAsIHlwLCBzaXplKzEpKTsKKyAgICAgIHhzaXplID0gc2l6ZSArICh4cFtzaXplXSAhPSAwKTsKKyAgICAgIEFTU0VSVCAoeXBbc2l6ZV0gPD0gMSk7CisgICAgICB5c2l6ZSA9IHNpemUgKyB5cFtzaXplXTsKKyNlbHNlCisgICAgICBtcF9saW1iX3QgIGMyOworCisgICAgICBjMiA9IG1wbl9sc2hpZnQgKGZwLCB4cCwgc2l6ZSwgMSk7CisgICAgICBjID0gYzIgKyBtcG5fYWRkX24gKHhwLCBmcCwgeXAsIHNpemUpOworICAgICAgeHBbc2l6ZV0gPSBjOworICAgICAgeHNpemUgPSBzaXplICsgKGMgIT0gMCk7CisgICAgICBjMiAtPSBtcG5fc3ViX24gKHlwLCBmcCwgeXAsIHNpemUpOworICAgICAgeXBbc2l6ZV0gPSBjMjsKKyAgICAgIEFTU0VSVCAoYzIgPD0gMSk7CisgICAgICB5c2l6ZSA9IHNpemUgKyBjMjsKKyNlbmRpZgorCisgICAgICBzaXplID0geHNpemUgKyB5c2l6ZTsKKyAgICAgIGMgPSBtcG5fbXVsIChmcCwgeHAsIHhzaXplLCB5cCwgeXNpemUpOworCisjaWYgR01QX05VTUJfQklUUyA+PSBCSVRTX1BFUl9VTE9ORworICAgICAgLyogbm8gb3ZlcmZsb3csIHNlZSBjb21tZW50cyBhYm92ZSAqLworICAgICAgQVNTRVJUIChuICYgMiA/IGZwWzBdID49IDIgOiBmcFswXSA8PSBHTVBfTlVNQl9NQVgtMik7CisgICAgICBmcFswXSArPSAobiAmIDIgPyAtQ05TVF9MSU1CKDIpIDogQ05TVF9MSU1CKDIpKTsKKyNlbHNlCisgICAgICBpZiAobiAmIDIpCisJeworCSAgQVNTRVJUIChmcFswXSA+PSAyKTsKKwkgIGZwWzBdIC09IDI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIEFTU0VSVCAoYyAhPSBHTVBfTlVNQl9NQVgpOyAvKiBiZWNhdXNlIGl0J3MgdGhlIGhpZ2ggb2YgYSBtdWwgKi8KKwkgIGMgKz0gbXBuX2FkZF8xIChmcCwgZnAsIHNpemUtMSwgQ05TVF9MSU1CKDIpKTsKKwkgIGZwW3NpemUtMV0gPSBjOworCX0KKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZbMmtdID0gRltrXSooRltrXSsyRltrLTFdKSAqLworCisgICAgICBtcF9zaXplX3QgIHhzaXplLCB5c2l6ZTsKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgICAgICBjID0gbXBuX2FkZGxzaDFfbiAoeXAsIHhwLCB5cCwgc2l6ZSk7CisjZWxzZQorICAgICAgYyA9IG1wbl9sc2hpZnQgKHlwLCB5cCwgc2l6ZSwgMSk7CisgICAgICBjICs9IG1wbl9hZGRfbiAoeXAsIHlwLCB4cCwgc2l6ZSk7CisjZW5kaWYKKyAgICAgIHlwW3NpemVdID0gYzsKKyAgICAgIHhzaXplID0gc2l6ZTsKKyAgICAgIHlzaXplID0gc2l6ZSArIChjICE9IDApOworICAgICAgc2l6ZSArPSB5c2l6ZTsKKyAgICAgIGMgPSBtcG5fbXVsIChmcCwgeXAsIHlzaXplLCB4cCwgeHNpemUpOworICAgIH0KKworICAvKiBvbmUgb3IgdHdvIGhpZ2ggemVyb3MgKi8KKyAgc2l6ZSAtPSAoYyA9PSAwKTsKKyAgc2l6ZSAtPSAoZnBbc2l6ZS0xXSA9PSAwKTsKKyAgU0laKGZuKSA9IHNpemU7CisKKyAgVFJBQ0UgKHByaW50ZiAoImRvbmUgc3BlY2lhbCwgc2l6ZT0lbGRcbiIsIHNpemUpOworCSBtcG5fdHJhY2UgKCJmcCAiLCBmcCwgc2l6ZSkpOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L2ZpdHNfcy5oIGIvbXB6L2ZpdHNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDZhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZml0c19zLmgKQEAgLTAsMCArMSw2MCBAQAorLyogaW50IG1wel9maXRzX1hfcCAobXB6X3QgeikgLS0gdGVzdCB3aGV0aGVyIHogZml0cyBzaWduZWQgdHlwZSBYLgorCitDb3B5cmlnaHQgMTk5NywgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK0ZVTkNUSU9OIChtcHpfc3JjcHRyIHopIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc2l6ZV90IG4gPSBTSVooeik7CisgIG1wX3B0ciBwID0gUFRSKHopOworICBtcF9saW1iX3QgbGltYiA9IHBbMF07CisKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKG4gPT0gMSkKKyAgICByZXR1cm4gbGltYiA8PSBNQVhJTVVNOworICBpZiAobiA9PSAtMSkKKyAgICByZXR1cm4gbGltYiA8PSBORUdfQ0FTVCAobXBfbGltYl90LCBNSU5JTVVNKTsKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgeworICAgIGlmICgocFsxXSA+PiBHTVBfTkFJTF9CSVRTKSA9PSAwKQorICAgICAgeworCWxpbWIgKz0gcFsxXSA8PCBHTVBfTlVNQl9CSVRTOworCWlmIChuID09IDIpCisJICByZXR1cm4gbGltYiA8PSBNQVhJTVVNOworCWlmIChuID09IC0yKQorCSAgcmV0dXJuIGxpbWIgPD0gTkVHX0NBU1QgKG1wX2xpbWJfdCwgTUlOSU1VTSk7CisgICAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wei9maXRzX3NpbnQuYyBiL21wei9maXRzX3NpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ4YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2ZpdHNfc2ludC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGludCBtcHpfZml0c19zaW50X3AgKG1wel90IHopIC0tIHRlc3Qgd2hldGhlciB6IGZpdHMgYW4gaW50LgorCitDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjZGVmaW5lIEZVTkNUSU9OICBtcHpfZml0c19zaW50X3AKKyNkZWZpbmUgTUFYSU1VTSAgIElOVF9NQVgKKyNkZWZpbmUgTUlOSU1VTSAgIElOVF9NSU4KKworI2luY2x1ZGUgImZpdHNfcy5oIgpkaWZmIC0tZ2l0IGEvbXB6L2ZpdHNfc2xvbmcuYyBiL21wei9maXRzX3Nsb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwNmEwMAotLS0gL2Rldi9udWxsCisrKyBiL21wei9maXRzX3Nsb25nLmMKQEAgLTAsMCArMSwzNiBAQAorLyogaW50IG1wel9maXRzX3Nsb25nX3AgKG1wel90IHopIC0tIHRlc3Qgd2hldGhlciB6IGZpdHMgYSBsb25nLgorCitDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjZGVmaW5lIEZVTkNUSU9OICBtcHpfZml0c19zbG9uZ19wCisjZGVmaW5lIE1BWElNVU0gICBMT05HX01BWAorI2RlZmluZSBNSU5JTVVNICAgTE9OR19NSU4KKworI2luY2x1ZGUgImZpdHNfcy5oIgpkaWZmIC0tZ2l0IGEvbXB6L2ZpdHNfc3Nob3J0LmMgYi9tcHovZml0c19zc2hvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFkNmIwCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2ZpdHNfc3Nob3J0LmMKQEAgLTAsMCArMSwzNiBAQAorLyogaW50IG1wel9maXRzX3NzaG9ydF9wIChtcHpfdCB6KSAtLSB0ZXN0IHdoZXRoZXIgeiBmaXRzIGEgc2hvcnQuCisKK0NvcHlyaWdodCAxOTk3LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgRlVOQ1RJT04gIG1wel9maXRzX3NzaG9ydF9wCisjZGVmaW5lIE1BWElNVU0gICBTSFJUX01BWAorI2RlZmluZSBNSU5JTVVNICAgU0hSVF9NSU4KKworI2luY2x1ZGUgImZpdHNfcy5oIgpkaWZmIC0tZ2l0IGEvbXB6L2ZpdHNfdWludC5jIGIvbXB6L2ZpdHNfdWludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWNjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZml0c191aW50LmMKQEAgLTAsMCArMSwzMyBAQAorLyogbXB6X2ZpdHNfdWludF9wIC0tIHRlc3Qgd2hldGhlciB6IGZpdHMgYW4gdW5zaWduZWQgaW50LgorCitDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfZml0c191aW50X3AgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wei9maXRzX3Vsb25nLmMgYi9tcHovZml0c191bG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDg4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZml0c191bG9uZy5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wel9maXRzX3Vsb25nX3AgLS0gdGVzdCB3aGV0aGVyIHogZml0cyBhbiB1bnNpZ25lZCBsb25nLgorCitDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfZml0c191bG9uZ19wIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCmRpZmYgLS1naXQgYS9tcHovZml0c191c2hvcnQuYyBiL21wei9maXRzX3VzaG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODczZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZml0c191c2hvcnQuYwpAQCAtMCwwICsxLDMzIEBACisvKiBtcHpfZml0c191c2hvcnRfcCAtLSB0ZXN0IHdoZXRoZXIgeiBmaXRzIGFuIHVuc2lnbmVkIHNob3J0LgorCitDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfZml0c191c2hvcnRfcCAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgpkaWZmIC0tZ2l0IGEvbXB6L2djZC5jIGIvbXB6L2djZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTcxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZ2NkLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIG1wei9nY2QuYzogICBDYWxjdWxhdGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHR3byBpbnRlZ2Vycy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAtMjAwMiwgMjAwNSwgMjAxMCwgMjAxNSwgMjAxNgorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKwordm9pZAorbXB6X2djZCAobXB6X3B0ciBnLCBtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgZ196ZXJvX2JpdHMsIHVfemVyb19iaXRzLCB2X3plcm9fYml0czsKKyAgbXBfc2l6ZV90IGdfemVyb19saW1icywgdV96ZXJvX2xpbWJzLCB2X3plcm9fbGltYnM7CisgIG1wX3B0ciB0cDsKKyAgbXBfcHRyIHVwOworICBtcF9zaXplX3QgdXNpemU7CisgIG1wX3B0ciB2cDsKKyAgbXBfc2l6ZV90IHZzaXplOworICBtcF9zaXplX3QgZ3NpemU7CisgIFRNUF9ERUNMOworCisgIHVwID0gUFRSKHUpOworICB1c2l6ZSA9IEFCU0laICh1KTsKKyAgdnAgPSBQVFIodik7CisgIHZzaXplID0gQUJTSVogKHYpOworICAvKiBHQ0QoMCwgVikgPT0gVi4gICovCisgIGlmICh1c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIFNJWiAoZykgPSB2c2l6ZTsKKyAgICAgIGlmIChnID09IHYpCisJcmV0dXJuOworICAgICAgdHAgPSBNUFpfTkVXQUxMT0MgKGcsIHZzaXplKTsKKyAgICAgIE1QTl9DT1BZICh0cCwgdnAsIHZzaXplKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogR0NEKFUsIDApID09IFUuICAqLworICBpZiAodnNpemUgPT0gMCkKKyAgICB7CisgICAgICBTSVogKGcpID0gdXNpemU7CisgICAgICBpZiAoZyA9PSB1KQorCXJldHVybjsKKyAgICAgIHRwID0gTVBaX05FV0FMTE9DIChnLCB1c2l6ZSk7CisgICAgICBNUE5fQ09QWSAodHAsIHVwLCB1c2l6ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh1c2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIFNJWiAoZykgPSAxOworICAgICAgTVBaX05FV0FMTE9DIChnLCAxKVswXSA9IG1wbl9nY2RfMSAodnAsIHZzaXplLCB1cFswXSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh2c2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIFNJWihnKSA9IDE7CisgICAgICBNUFpfTkVXQUxMT0MgKGcsIDEpWzBdID0gbXBuX2djZF8xICh1cCwgdXNpemUsIHZwWzBdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisKKyAgLyogIEVsaW1pbmF0ZSBsb3cgemVybyBiaXRzIGZyb20gVSBhbmQgViBhbmQgbW92ZSB0byB0ZW1wb3Jhcnkgc3RvcmFnZS4gICovCisgIHRwID0gdXA7CisgIHdoaWxlICgqdHAgPT0gMCkKKyAgICB0cCsrOworICB1X3plcm9fbGltYnMgPSB0cCAtIHVwOworICB1c2l6ZSAtPSB1X3plcm9fbGltYnM7CisgIGNvdW50X3RyYWlsaW5nX3plcm9zICh1X3plcm9fYml0cywgKnRwKTsKKyAgdXAgPSBUTVBfQUxMT0NfTElNQlMgKHVzaXplKTsKKyAgaWYgKHVfemVyb19iaXRzICE9IDApCisgICAgeworICAgICAgbXBuX3JzaGlmdCAodXAsIHRwLCB1c2l6ZSwgdV96ZXJvX2JpdHMpOworICAgICAgdXNpemUgLT0gdXBbdXNpemUgLSAxXSA9PSAwOworICAgIH0KKyAgZWxzZQorICAgIE1QTl9DT1BZICh1cCwgdHAsIHVzaXplKTsKKworICB0cCA9IHZwOworICB3aGlsZSAoKnRwID09IDApCisgICAgdHArKzsKKyAgdl96ZXJvX2xpbWJzID0gdHAgLSB2cDsKKyAgdnNpemUgLT0gdl96ZXJvX2xpbWJzOworICBjb3VudF90cmFpbGluZ196ZXJvcyAodl96ZXJvX2JpdHMsICp0cCk7CisgIHZwID0gVE1QX0FMTE9DX0xJTUJTICh2c2l6ZSk7CisgIGlmICh2X3plcm9fYml0cyAhPSAwKQorICAgIHsKKyAgICAgIG1wbl9yc2hpZnQgKHZwLCB0cCwgdnNpemUsIHZfemVyb19iaXRzKTsKKyAgICAgIHZzaXplIC09IHZwW3ZzaXplIC0gMV0gPT0gMDsKKyAgICB9CisgIGVsc2UKKyAgICBNUE5fQ09QWSAodnAsIHRwLCB2c2l6ZSk7CisKKyAgaWYgKHVfemVyb19saW1icyA+IHZfemVyb19saW1icykKKyAgICB7CisgICAgICBnX3plcm9fbGltYnMgPSB2X3plcm9fbGltYnM7CisgICAgICBnX3plcm9fYml0cyA9IHZfemVyb19iaXRzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdfemVyb19saW1icyA9IHVfemVyb19saW1iczsKKyAgICAgIGlmICh1X3plcm9fbGltYnMgPCB2X3plcm9fbGltYnMpCisJZ196ZXJvX2JpdHMgPSB1X3plcm9fYml0czsKKyAgICAgIGVsc2UgIC8qICBFcXVhbC4gICovCisJZ196ZXJvX2JpdHMgPSBNSU4gKHVfemVyb19iaXRzLCB2X3plcm9fYml0cyk7CisgICAgfQorCisgIC8qICBDYWxsIG1wbl9nY2QuICBUaGUgMm5kIGFyZ3VtZW50IG11c3Qgbm90IGhhdmUgbW9yZSBiaXRzIHRoYW4gdGhlIDFzdC4gICovCisgIHZzaXplID0gKHVzaXplIDwgdnNpemUgfHwgKHVzaXplID09IHZzaXplICYmIHVwW3VzaXplLTFdIDwgdnBbdnNpemUtMV0pKQorICAgID8gbXBuX2djZCAodnAsIHZwLCB2c2l6ZSwgdXAsIHVzaXplKQorICAgIDogbXBuX2djZCAodnAsIHVwLCB1c2l6ZSwgdnAsIHZzaXplKTsKKworICAvKiAgSGVyZSBHIDwtLSBWIDw8IChnX3plcm9fbGltYnMqR01QX0xJTUJfQklUUyArIGdfemVyb19iaXRzKS4gICovCisgIGdzaXplID0gdnNpemUgKyBnX3plcm9fbGltYnM7CisgIGlmIChnX3plcm9fYml0cyAhPSAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBjeV9saW1iOworICAgICAgZ3NpemUgKz0gKHZwW3ZzaXplIC0gMV0gPj4gKEdNUF9OVU1CX0JJVFMgLSBnX3plcm9fYml0cykpICE9IDA7CisgICAgICB0cCA9IE1QWl9ORVdBTExPQyAoZywgZ3NpemUpOworICAgICAgTVBOX1pFUk8gKHRwLCBnX3plcm9fbGltYnMpOworCisgICAgICB0cCA9IHRwICsgZ196ZXJvX2xpbWJzOworICAgICAgY3lfbGltYiA9IG1wbl9sc2hpZnQgKHRwLCB2cCwgdnNpemUsIGdfemVyb19iaXRzKTsKKyAgICAgIGlmIChjeV9saW1iICE9IDApCisJdHBbdnNpemVdID0gY3lfbGltYjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0cCA9IE1QWl9ORVdBTExPQyAoZywgZ3NpemUpOworICAgICAgTVBOX1pFUk8gKHRwLCBnX3plcm9fbGltYnMpOworICAgICAgTVBOX0NPUFkgKHRwICsgZ196ZXJvX2xpbWJzLCB2cCwgdnNpemUpOworICAgIH0KKworICBTSVogKGcpID0gZ3NpemU7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L2djZF91aS5jIGIvbXB6L2djZF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWE0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZ2NkX3VpLmMKQEAgLTAsMCArMSw5MiBAQAorLyogbXB6X2djZF91aSAtLSBDYWxjdWxhdGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHR3byBpbnRlZ2Vycy4KKworQ29weXJpZ2h0IDE5OTQsIDE5OTYsIDE5OTktMjAwNCwgMjAxNSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel9nY2RfdWkgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1LCB1bnNpZ25lZCBsb25nIGludCB2KQoreworICBtcF9zaXplX3QgdW47CisgIG1wX2xpbWJfdCByZXM7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAodiA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcHpfdCB2eiwgbHc7CisgICAgICBtcF9saW1iX3QgdmxpbWJzWzJdLCB3bGltYnNbMl07CisKKyAgICAgIGlmICh3ID09IE5VTEwpCisJeworCSAgUFRSKGx3KSA9IHdsaW1iczsKKwkgIEFMTE9DKGx3KSA9IDI7CisJICBTSVoobHcpID0gMDsKKwkgIHcgPSBsdzsKKwl9CisgICAgICB2bGltYnNbMF0gPSB2ICYgR01QX05VTUJfTUFTSzsKKyAgICAgIHZsaW1ic1sxXSA9IHYgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIFBUUih2eikgPSB2bGltYnM7CisgICAgICBTSVoodnopID0gMjsKKyAgICAgIG1wel9nY2QgKHcsIHUsIHZ6KTsKKyAgICAgIC8qIGJlY2F1c2UgdiE9MCB3ZSB3aWxsIGhhdmUgdzw9diBoZW5jZSBmaXR0aW5nIGEgdWxvbmcgKi8KKyAgICAgIEFTU0VSVCAobXB6X2ZpdHNfdWxvbmdfcCAodykpOworICAgICAgcmV0dXJuIG1wel9nZXRfdWkgKHcpOworICAgIH0KKyNlbmRpZgorCisgIHVuID0gQUJTSVoodSk7CisKKyAgaWYgKHVuID09IDApCisgICAgcmVzID0gdjsKKyAgZWxzZSBpZiAodiA9PSAwKQorICAgIHsKKyAgICAgIGlmICh3ICE9IE5VTEwpCisJeworCSAgaWYgKHUgIT0gdykKKwkgICAgeworCSAgICAgIE1QWl9ORVdBTExPQyAodywgdW4pOworCSAgICAgIE1QTl9DT1BZIChQVFIodyksIFBUUih1KSwgdW4pOworCSAgICB9CisJICBTSVoodykgPSB1bjsKKwl9CisgICAgICAvKiBSZXR1cm4gdSBpZiBpdCBmaXRzIGEgdWxvbmcsIG90aGVyd2lzZSAwLiAqLworICAgICAgcmVzID0gUFRSKHUpWzBdOworICAgICAgcmV0dXJuICh1biA9PSAxICYmIHJlcyA8PSBVTE9OR19NQVggPyByZXMgOiAwKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXMgPSBtcG5fZ2NkXzEgKFBUUih1KSwgdW4sIChtcF9saW1iX3QpIHYpOworCisgIGlmICh3ICE9IE5VTEwpCisgICAgeworICAgICAgTVBaX05FV0FMTE9DICh3LCAxKVswXSA9IHJlczsKKyAgICAgIFNJWih3KSA9IHJlcyAhPSAwOworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL21wei9nY2RleHQuYyBiL21wei9nY2RleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWY3M2MyCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2djZGV4dC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKiBtcHpfZ2NkZXh0KGcsIHMsIHQsIGEsIGIpIC0tIFNldCBHIHRvIGdjZChhLCBiKSwgYW5kIFMgYW5kIFQgc3VjaCB0aGF0CisgICBnID0gYXMgKyBidC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NywgMjAwMCwgMjAwMSwgMjAwNSwgMjAxMSwgMjAxMiwgMjAxNSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPiAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9nY2RleHQgKG1wel9wdHIgZywgbXB6X3B0ciBzLCBtcHpfcHRyIHQsIG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiKQoreworICBtcF9zaXplX3QgYXNpemUsIGJzaXplOworICBtcF9wdHIgdG1wX2FwLCB0bXBfYnA7CisgIG1wX3NpemVfdCBnc2l6ZSwgc3NpemUsIHRtcF9zc2l6ZTsKKyAgbXBfcHRyIGdwLCB0bXBfZ3AsIHRtcF9zcDsKKyAgVE1QX0RFQ0w7CisKKyAgLyogbXBuX2djZGV4dCByZXF1aXJlcyB0aGF0IFVzaXplID49IFZzaXplLiAgVGhlcmVmb3JlLCB3ZSBvZnRlbgorICAgICBoYXZlIHRvIHN3YXAgVSBhbmQgVi4gIFRoZSBjb21wdXRlZCBjb2ZhY3RvciB3aWxsIGJlIHRoZQorICAgICAic21hbGxlc3QiIG9uZSwgd2hpY2ggaXMgZmFzdGVyIHRvIHByb2R1Y2UuICBUaGUgd2FudGVkIG9uZSB3aWxsCisgICAgIGJlIGNvbXB1dGVkIGhlcmU7IHRoaXMgaXMgbmVlZGVkIGFueXdheSB3aGVuIGJvdGggYXJlIHJlcXVlc3RlZC4gICovCisKKyAgYXNpemUgPSBBQlNJWiAoYSk7CisgIGJzaXplID0gQUJTSVogKGIpOworCisgIEFTU0VSVCAocyAhPSBOVUxMKTsKKworICBpZiAoYXNpemUgPCBic2l6ZSkKKyAgICB7CisgICAgICBNUFpfU1JDUFRSX1NXQVAgKGEsIGIpOworICAgICAgTVBfU0laRV9UX1NXQVAgKGFzaXplLCBic2l6ZSk7CisgICAgICBNUFpfUFRSX1NXQVAgKHMsIHQpOworICAgIH0KKworICBpZiAoYnNpemUgPT0gMCkKKyAgICB7CisgICAgICAvKiBnID0gfGF8LCBzID0gc2duKGEpLCB0ID0gMC4gKi8KKyAgICAgIHNzaXplID0gU0laIChhKSA+PSAwID8gKGFzaXplICE9IDApIDogLTE7CisKKyAgICAgIGlmIChnICE9IE5VTEwpCisJeworCSAgLyogSWYgZyA9PSBhLCB0aGVuIEFMTE9DKGcpID09IEFMTE9DKGEpID49IGFzaXplLCBpLmUuCisJICAgICB0aGUgbmV4dCBNUFpfTkVXQUxMT0MgcmV0dXJucyB0aGUgb2xkIFBUUihhKSAuKi8KKwkgIGdwID0gTVBaX05FV0FMTE9DIChnLCBhc2l6ZSk7CisJICBNUE5fQ09QWSAoZ3AsIFBUUiAoYSksIGFzaXplKTsKKwkgIFNJWiAoZykgPSBhc2l6ZTsKKwl9CisgICAgICBpZiAodCAhPSBOVUxMKQorCVNJWiAodCkgPSAwOworICAgICAgaWYgKHMgIT0gTlVMTCkKKwl7CisJICBTSVogKHMpID0gc3NpemU7CisJICBNUFpfTkVXQUxMT0MgKHMsIDEpWzBdID0gMTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIFRNUF9NQVJLOworCisgIFRNUF9BTExPQ19MSU1CU18yICh0bXBfZ3AsIGJzaXplLCB0bXBfc3AsIGFzaXplICsgYnNpemUgKyBic2l6ZSArIDEpOworICB0bXBfYnAgPSB0bXBfc3AgKyBic2l6ZSArIDE7CisgIHRtcF9hcCA9IHRtcF9icCArIGJzaXplOworICBNUE5fQ09QWSAodG1wX2FwLCBQVFIgKGEpLCBhc2l6ZSk7CisgIE1QTl9DT1BZICh0bXBfYnAsIFBUUiAoYiksIGJzaXplKTsKKworICBnc2l6ZSA9IG1wbl9nY2RleHQgKHRtcF9ncCwgdG1wX3NwLCAmdG1wX3NzaXplLCB0bXBfYXAsIGFzaXplLCB0bXBfYnAsIGJzaXplKTsKKworICBzc2l6ZSA9IEFCUyAodG1wX3NzaXplKTsKKyAgdG1wX3NzaXplID0gU0laIChhKSA+PSAwID8gdG1wX3NzaXplIDogLXRtcF9zc2l6ZTsKKworICBpZiAodCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1wel90IHg7CisgICAgICBtcHpfdCBndG1wLCBzdG1wOworCisgICAgICBQVFIgKGd0bXApID0gdG1wX2dwOworICAgICAgU0laIChndG1wKSA9IGdzaXplOworCisgICAgICBQVFIgKHN0bXApID0gdG1wX3NwOworICAgICAgU0laIChzdG1wKSA9IHRtcF9zc2l6ZTsKKworICAgICAgQVNTRVJUIChzc2l6ZSA8PSBic2l6ZSk7IC8qIHNzaXplKjIgKyBhc2l6ZSArIDEgPD0gYXNpemUgKyBic2l6ZSoyICsgMSAqLworICAgICAgUFRSICh4KSA9IHRtcF9zcCArIHNzaXplOworICAgICAgQUxMT0MgKHgpID0gc3NpemUgKyBhc2l6ZSArIDE7CisKKyAgICAgIG1wel9tdWwgKHgsIHN0bXAsIGEpOworICAgICAgbXB6X3N1YiAoeCwgZ3RtcCwgeCk7CisgICAgICBtcHpfZGl2ZXhhY3QgKHQsIHgsIGIpOworICAgIH0KKworICBpZiAocyAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1wX3B0ciBzcDsKKworICAgICAgc3AgPSBNUFpfTkVXQUxMT0MgKHMsIHNzaXplKTsKKyAgICAgIE1QTl9DT1BZIChzcCwgdG1wX3NwLCBzc2l6ZSk7CisgICAgICBTSVogKHMpID0gdG1wX3NzaXplOworICAgIH0KKworICBpZiAoZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGdwID0gTVBaX05FV0FMTE9DIChnLCBnc2l6ZSk7CisgICAgICBNUE5fQ09QWSAoZ3AsIHRtcF9ncCwgZ3NpemUpOworICAgICAgU0laIChnKSA9IGdzaXplOworICAgIH0KKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wei9nZXRfZC5jIGIvbXB6L2dldF9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkNGUzNgotLS0gL2Rldi9udWxsCisrKyBiL21wei9nZXRfZC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIGRvdWJsZSBtcHpfZ2V0X2QgKG1wel90IHNyYykgLS0gUmV0dXJuIHRoZSBkb3VibGUgYXBwcm94aW1hdGlvbiB0byBTUkMuCisKK0NvcHlyaWdodCAxOTk2LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitkb3VibGUKK21wel9nZXRfZCAobXB6X3NyY3B0ciB6KQoreworICBtcF9zaXplX3Qgc2l6ZTsKKworICBzaXplID0gU0laICh6KTsKKyAgaWYgKFVOTElLRUxZIChzaXplID09IDApKQorICAgIHJldHVybiAwLjA7CisKKyAgcmV0dXJuIG1wbl9nZXRfZCAoUFRSICh6KSwgQUJTIChzaXplKSwgc2l6ZSwgMEwpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2dldF9kXzJleHAuYyBiL21wei9nZXRfZF8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMzY0YQotLS0gL2Rldi9udWxsCisrKyBiL21wei9nZXRfZF8yZXhwLmMKQEAgLTAsMCArMSw1MyBAQAorLyogZG91YmxlIG1wel9nZXRfZF8yZXhwIChzaWduZWQgbG9uZyBpbnQgKmV4cCwgbXB6X3Qgc3JjKS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDMsIDIwMDQsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK2RvdWJsZQorbXB6X2dldF9kXzJleHAgKHNpZ25lZCBsb25nIGludCAqZXhwMiwgbXB6X3NyY3B0ciBzcmMpCit7CisgIG1wX3NpemVfdCBzaXplLCBhYnNfc2l6ZTsKKyAgbXBfc3JjcHRyIHB0cjsKKyAgbG9uZyBleHA7CisKKyAgc2l6ZSA9IFNJWihzcmMpOworICBpZiAoVU5MSUtFTFkgKHNpemUgPT0gMCkpCisgICAgeworICAgICAgKmV4cDIgPSAwOworICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgcHRyID0gUFRSKHNyYyk7CisgIGFic19zaXplID0gQUJTKHNpemUpOworICBNUE5fU0laRUlOQkFTRV8yRVhQKGV4cCwgcHRyLCBhYnNfc2l6ZSwgMSk7CisgICpleHAyID0gZXhwOworICByZXR1cm4gbXBuX2dldF9kIChwdHIsIGFic19zaXplLCBzaXplLCAtZXhwKTsKK30KZGlmZiAtLWdpdCBhL21wei9nZXRfc2kuYyBiL21wei9nZXRfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjViZTJlCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2dldF9zaS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG1wel9nZXRfc2koaW50ZWdlcikgLS0gUmV0dXJuIHRoZSBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCBmcm9tIElOVEVHRVIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDAtMjAwMiwgMjAwNiwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3NpZ25lZCBsb25nIGludAorbXB6X2dldF9zaSAobXB6X3NyY3B0ciB6KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3B0ciB6cCA9IFBUUiAoeik7CisgIG1wX3NpemVfdCBzaXplID0gU0laICh6KTsKKyAgbXBfbGltYl90IHpsID0genBbMF07CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgaWYgKFVMT05HX01BWCA+IEdNUF9OVU1CX01BWCAmJiBBQlMgKHNpemUpID49IDIpCisgICAgemwgfD0genBbMV0gPDwgR01QX05VTUJfQklUUzsKKyNlbmRpZgorCisgIGlmIChzaXplID4gMCkKKyAgICByZXR1cm4gemwgJiBMT05HX01BWDsKKyAgZWxzZSBpZiAoc2l6ZSA8IDApCisgICAgLyogVGhpcyBleHByZXNzaW9uIGlzIG5lY2Vzc2FyeSB0byBwcm9wZXJseSBoYW5kbGUgMHg4MDAwMDAwMCAqLworICAgIHJldHVybiAtMSAtIChsb25nKSAoKHpsIC0gMSkgJiBMT05HX01BWCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wei9nZXRfc3RyLmMgYi9tcHovZ2V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGE5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovZ2V0X3N0ci5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiBtcHpfZ2V0X3N0ciAoc3RyaW5nLCBiYXNlLCBtcF9zcmMpIC0tIENvbnZlcnQgdGhlIG11bHRpcGxlIHByZWNpc2lvbgorICAgbnVtYmVyIE1QX1NSQyB0byBhIHN0cmluZyBTVFJJTkcgb2YgYmFzZSBCQVNFLiAgSWYgU1RSSU5HIGlzIE5VTEwKKyAgIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVzdWx0LiAgSW4gYW55IGNhc2UsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCisgICByZXN1bHQuICBJZiBTVFJJTkcgaXMgbm90IE5VTEwsIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgZW5vdWdoIHNwYWNlIGlzCisgICBhdmFpbGFibGUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAtMjAwMiwgMjAwNSwgMjAxMiwgMjAxNyBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogZm9yIHN0cmxlbiAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworY2hhciAqCittcHpfZ2V0X3N0ciAoY2hhciAqcmVzX3N0ciwgaW50IGJhc2UsIG1wel9zcmNwdHIgeCkKK3sKKyAgbXBfcHRyIHhwOworICBtcF9zaXplX3QgeF9zaXplID0gU0laICh4KTsKKyAgY2hhciAqcmV0dXJuX3N0cjsKKyAgc2l6ZV90IHN0cl9zaXplOworICBzaXplX3QgYWxsb2Nfc2l6ZSA9IDA7CisgIGNvbnN0IGNoYXIgKm51bV90b190ZXh0OworICBpbnQgaTsKKyAgVE1QX0RFQ0w7CisKKyAgbnVtX3RvX3RleHQgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICBpZiAoYmFzZSA+IDEpCisgICAgeworICAgICAgaWYgKGJhc2UgPD0gMzYpCisJbnVtX3RvX3RleHQgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgICAgIGVsc2UgaWYgKFVOTElLRUxZIChiYXNlID4gNjIpKQorCXJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAoYmFzZSA+IC0yKQorICAgIHsKKyAgICAgIGJhc2UgPSAxMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiYXNlID0gLWJhc2U7CisgICAgICBpZiAoVU5MSUtFTFkgKGJhc2UgPiAzNikpCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIGFsbG9jYXRlIHN0cmluZyBmb3IgdGhlIHVzZXIgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChyZXNfc3RyID09IE5VTEwpCisgICAgeworICAgICAgLyogZGlnaXRzLCBudWxsIHRlcm1pbmF0b3IsIHBvc3NpYmxlIG1pbnVzIHNpZ24gKi8KKyAgICAgIE1QTl9TSVpFSU5CQVNFIChhbGxvY19zaXplLCBQVFIoeCksIEFCUyh4X3NpemUpLCBiYXNlKTsKKyAgICAgIGFsbG9jX3NpemUgKz0gMSArICh4X3NpemU8MCk7CisgICAgICByZXNfc3RyID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChhbGxvY19zaXplLCBjaGFyKTsKKyAgICB9CisgIHJldHVybl9zdHIgPSByZXNfc3RyOworCisgIGlmICh4X3NpemUgPCAwKQorICAgIHsKKyAgICAgICpyZXNfc3RyKysgPSAnLSc7CisgICAgICB4X3NpemUgPSAteF9zaXplOworICAgIH0KKworICAvKiBtcG5fZ2V0X3N0ciBjbG9iYmVycyBpdHMgaW5wdXQgb24gbm9uIHBvd2VyLW9mLTIgYmFzZXMgKi8KKyAgVE1QX01BUks7CisgIHhwID0gUFRSICh4KTsKKyAgaWYgKCEgUE9XMl9QIChiYXNlKSkKKyAgICB7CisgICAgICB4cCA9IFRNUF9BTExPQ19MSU1CUyAoeF9zaXplIHwgMSk7ICAvKiB8MSBpbiBjYXNlIHhfc2l6ZT09MCAqLworICAgICAgTVBOX0NPUFkgKHhwLCBQVFIgKHgpLCB4X3NpemUpOworICAgIH0KKworICBzdHJfc2l6ZSA9IG1wbl9nZXRfc3RyICgodW5zaWduZWQgY2hhciAqKSByZXNfc3RyLCBiYXNlLCB4cCwgeF9zaXplKTsKKyAgQVNTRVJUIChhbGxvY19zaXplID09IDAgfHwgc3RyX3NpemUgPD0gYWxsb2Nfc2l6ZSAtIChTSVooeCkgPCAwKSk7CisKKyAgLyogQ29udmVydCByZXN1bHQgdG8gcHJpbnRhYmxlIGNoYXJzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cl9zaXplOyBpKyspCisgICAgcmVzX3N0cltpXSA9IG51bV90b190ZXh0WyhpbnQpIHJlc19zdHJbaV1dOworICByZXNfc3RyW3N0cl9zaXplXSA9IDA7CisKKyAgVE1QX0ZSRUU7CisKKyAgLyogaWYgYWxsb2NhdGVkIHRoZW4gcmVzaXplIGRvd24gdG8gdGhlIGFjdHVhbCBzcGFjZSByZXF1aXJlZCAqLworICBpZiAoYWxsb2Nfc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIHNpemVfdCAgYWN0dWFsX3NpemUgPSBzdHJfc2l6ZSArIDEgKyAocmVzX3N0ciAtIHJldHVybl9zdHIpOworICAgICAgQVNTRVJUIChhY3R1YWxfc2l6ZSA9PSBzdHJsZW4gKHJldHVybl9zdHIpICsgMSk7CisgICAgICBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTUFZQkVfVFlQRSAocmV0dXJuX3N0ciwgYWxsb2Nfc2l6ZSwgYWN0dWFsX3NpemUsCisJCQkJCWNoYXIpOworICAgIH0KKyAgcmV0dXJuIHJldHVybl9zdHI7Cit9CmRpZmYgLS1naXQgYS9tcHovZ2V0X3VpLmMgYi9tcHovZ2V0X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3ZWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21wei9nZXRfdWkuYwpAQCAtMCwwICsxLDMzIEBACisvKiBtcHpfZ2V0X3VpKGludGVnZXIpIC0tIFJldHVybiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgZnJvbSBJTlRFR0VSLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wel9nZXRfdWkgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wei9nZXRsaW1ibi5jIGIvbXB6L2dldGxpbWJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0ZDc2NAotLS0gL2Rldi9udWxsCisrKyBiL21wei9nZXRsaW1ibi5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1wel9nZXRsaW1ibihpbnRlZ2VyLG4pIC0tIFJldHVybiB0aGUgTjp0aCBsaW1iIGZyb20gSU5URUdFUi4KKworQ29weXJpZ2h0IDE5OTMtMTk5NiwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfZ2V0bGltYm4gMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wei9oYW1kaXN0LmMgYi9tcHovaGFtZGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaGFtZGlzdC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiBtcHpfaGFtZGlzdCAtLSBjYWxjdWxhdGUgaGFtbWluZyBkaXN0YW5jZS4KKworQ29weXJpZ2h0IDE5OTQsIDE5OTYsIDIwMDEsIDIwMDIsIDIwMDktMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworbXBfYml0Y250X3QKK21wel9oYW1kaXN0IChtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikgX19HTVBfTk9USFJPVworeworICBtcF9zcmNwdHIgICAgICB1cCwgdnA7CisgIG1wX3NpemVfdCAgICAgIHVzaXplLCB2c2l6ZTsKKyAgbXBfYml0Y250X3QgICAgY291bnQ7CisKKyAgdXNpemUgPSBTSVoodSk7CisgIHZzaXplID0gU0laKHYpOworCisgIHVwID0gUFRSKHUpOworICB2cCA9IFBUUih2KTsKKworICBpZiAodXNpemUgPj0gMCkKKyAgICB7CisgICAgICBpZiAodnNpemUgPCAwKQorCXJldHVybiB+IChtcF9iaXRjbnRfdCkgMDsKKworICAgICAgLyogcG9zaXRpdmUvcG9zaXRpdmUgKi8KKworICAgICAgaWYgKHVzaXplIDwgdnNpemUpCisJTVBOX1NSQ1BUUl9TV0FQICh1cCx1c2l6ZSwgdnAsdnNpemUpOworCisgICAgICBjb3VudCA9IDA7CisgICAgICBpZiAodnNpemUgIT0gMCkKKwljb3VudCA9IG1wbl9oYW1kaXN0ICh1cCwgdnAsIHZzaXplKTsKKworICAgICAgdXNpemUgLT0gdnNpemU7CisgICAgICBpZiAodXNpemUgIT0gMCkKKwljb3VudCArPSBtcG5fcG9wY291bnQgKHVwICsgdnNpemUsIHVzaXplKTsKKworICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCAgdWxpbWIsIHZsaW1iOworICAgICAgbXBfc2l6ZV90ICBvbGRfdnNpemUsIHN0ZXA7CisKKyAgICAgIGlmICh2c2l6ZSA+PSAwKQorCXJldHVybiB+IChtcF9iaXRjbnRfdCkgMDsKKworICAgICAgLyogbmVnYXRpdmUvbmVnYXRpdmUgKi8KKworICAgICAgdXNpemUgPSAtdXNpemU7CisgICAgICB2c2l6ZSA9IC12c2l6ZTsKKworICAgICAgLyogc2tpcCBjb21tb24gbG93IHplcm9zICovCisgICAgICBmb3IgKDs7KQorCXsKKwkgIEFTU0VSVCAodXNpemUgPiAwKTsKKwkgIEFTU0VSVCAodnNpemUgPiAwKTsKKworCSAgdXNpemUtLTsKKwkgIHZzaXplLS07CisKKwkgIHVsaW1iID0gKnVwKys7CisJICB2bGltYiA9ICp2cCsrOworCisJICBpZiAodWxpbWIgIT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIGlmICh2bGltYiAhPSAwKQorCSAgICB7CisJICAgICAgTVBOX1NSQ1BUUl9TV0FQICh1cCx1c2l6ZSwgdnAsdnNpemUpOworCSAgICAgIHVsaW1iID0gdmxpbWI7CisJICAgICAgdmxpbWIgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICAvKiB0d29zIGNvbXBsZW1lbnQgZmlyc3Qgbm9uLXplcm8gbGltYnMgKHVsaW1iIGlzIG5vbi16ZXJvLCBidXQgdmxpbWIKKwkgbWlnaHQgYmUgemVybykgKi8KKyAgICAgIHVsaW1iID0gLXVsaW1iOworICAgICAgdmxpbWIgPSAtdmxpbWI7CisgICAgICBwb3BjX2xpbWIgKGNvdW50LCAodWxpbWIgXiB2bGltYikgJiBHTVBfTlVNQl9NQVNLKTsKKworICAgICAgaWYgKHZsaW1iID09IDApCisJeworCSAgbXBfYml0Y250X3QgIHR3b3Njb3VudDsKKworCSAgLyogZmlyc3Qgbm9uLXplcm8gb2YgdiAqLworCSAgb2xkX3ZzaXplID0gdnNpemU7CisJICBkbworCSAgICB7CisJICAgICAgQVNTRVJUICh2c2l6ZSA+IDApOworCSAgICAgIHZzaXplLS07CisJICAgICAgdmxpbWIgPSAqdnArKzsKKwkgICAgfQorCSAgd2hpbGUgKHZsaW1iID09IDApOworCisJICAvKiBwYXJ0IG9mIHUgY29ycmVzcG9uZGluZyB0byBza2lwcGVkIHYgemVyb3MgKi8KKwkgIHN0ZXAgPSBvbGRfdnNpemUgLSB2c2l6ZSAtIDE7CisJICBjb3VudCArPSBzdGVwICogR01QX05VTUJfQklUUzsKKwkgIHN0ZXAgPSBNSU4gKHN0ZXAsIHVzaXplKTsKKwkgIGlmIChzdGVwICE9IDApCisJICAgIHsKKwkgICAgICBjb3VudCAtPSBtcG5fcG9wY291bnQgKHVwLCBzdGVwKTsKKwkgICAgICB1c2l6ZSAtPSBzdGVwOworCSAgICAgIHVwICs9IHN0ZXA7CisJICAgIH0KKworCSAgLyogRmlyc3Qgbm9uLXplcm8gdmxpbWIgYXMgdHdvcyBjb21wbGVtZW50LCB4b3Igd2l0aCBvbmVzCisJICAgICBjb21wbGVtZW50IHVsaW1iLiAgTm90ZSAtdl4ofjBedSkgPT0gKHYtMSledS4gKi8KKwkgIHZsaW1iLS07CisJICBpZiAodXNpemUgIT0gMCkKKwkgICAgeworCSAgICAgIHVzaXplLS07CisJICAgICAgdmxpbWIgXj0gKnVwKys7CisJICAgIH0KKwkgIHBvcGNfbGltYiAodHdvc2NvdW50LCB2bGltYik7CisJICBjb3VudCArPSB0d29zY291bnQ7CisJfQorCisgICAgICAvKiBPdmVybGFwcGluZyBwYXJ0IG9mIHUgYW5kIHYsIGlmIGFueS4gIE9uZXMgY29tcGxlbWVudCBib3RoLCBzbyBqdXN0CisJIHBsYWluIGhhbWRpc3QuICovCisgICAgICBzdGVwID0gTUlOICh1c2l6ZSwgdnNpemUpOworICAgICAgaWYgKHN0ZXAgIT0gMCkKKwl7CisJICBjb3VudCArPSBtcG5faGFtZGlzdCAodXAsIHZwLCBzdGVwKTsKKwkgIHVzaXplIC09IHN0ZXA7CisJICB2c2l6ZSAtPSBzdGVwOworCSAgdXAgKz0gc3RlcDsKKwkgIHZwICs9IHN0ZXA7CisJfQorCisgICAgICAvKiBSZW1haW5pbmcgaGlnaCBwYXJ0IG9mIHUgb3IgdiwgaWYgYW55LCBvbmVzIGNvbXBsZW1lbnQgYnV0IHhvcgorCSBhZ2FpbnN0IGFsbCBvbmVzIGluIHRoZSBvdGhlciwgc28gcGxhaW4gcG9wY291bnQuICovCisgICAgICBpZiAodXNpemUgIT0gMCkKKwl7CisJcmVtYWluaW5nOgorCSAgY291bnQgKz0gbXBuX3BvcGNvdW50ICh1cCwgdXNpemUpOworCX0KKyAgICAgIGVsc2UgaWYgKHZzaXplICE9IDApCisJeworCSAgdXAgPSB2cDsKKwkgIHVzaXplID0gdnNpemU7CisJICBnb3RvIHJlbWFpbmluZzsKKwl9CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXB6L2ltcG9ydC5jIGIvbXB6L2ltcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjA2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaW1wb3J0LmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIG1wel9pbXBvcnQgLS0gc2V0IG1weiBmcm9tIHdvcmQgZGF0YS4KKworQ29weXJpZ2h0IDIwMDIsIDIwMTIsIDIwMjEsIDIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworCisjaWYgSEFWRV9MSU1CX0JJR19FTkRJQU4KKyNkZWZpbmUgSE9TVF9FTkRJQU4gICAgIDEKKyNlbmRpZgorI2lmIEhBVkVfTElNQl9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEhPU1RfRU5ESUFOICAgICAoLTEpCisjZW5kaWYKKyNpZm5kZWYgSE9TVF9FTkRJQU4KK3N0YXRpYyBjb25zdCBtcF9saW1iX3QgIGVuZGlhbl90ZXN0ID0gKENOU1RfTElNQigxKSA8PCAoR01QX0xJTUJfQklUUy03KSkgLSAxOworI2RlZmluZSBIT1NUX0VORElBTiAgICAgKCogKHNpZ25lZCBjaGFyICopICZlbmRpYW5fdGVzdCkKKyNlbmRpZgorCisKK3ZvaWQKK21wel9pbXBvcnQgKG1wel9wdHIgeiwgc2l6ZV90IGNvdW50LCBpbnQgb3JkZXIsCisJICAgIHNpemVfdCBzaXplLCBpbnQgZW5kaWFuLCBzaXplX3QgbmFpbCwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgbXBfc2l6ZV90ICB6c2l6ZTsKKyAgbXBfcHRyICAgICB6cDsKKworICBBU1NFUlQgKG9yZGVyID09IDEgfHwgb3JkZXIgPT0gLTEpOworICBBU1NFUlQgKGVuZGlhbiA9PSAxIHx8IGVuZGlhbiA9PSAwIHx8IGVuZGlhbiA9PSAtMSk7CisgIEFTU0VSVCAobmFpbCA8PSA4KnNpemUpOworCisgIHpzaXplID0gQklUU19UT19MSU1CUyAoY291bnQgKiAoOCpzaXplIC0gbmFpbCkpOworICB6cCA9IE1QWl9ORVdBTExPQyAoeiwgenNpemUpOworCisgIGlmIChlbmRpYW4gPT0gMCkKKyAgICBlbmRpYW4gPSBIT1NUX0VORElBTjsKKworICAvKiBDYW4ndCB1c2UgdGhlc2Ugc3BlY2lhbCBjYXNlcyB3aXRoIG5haWxzIGN1cnJlbnRseSwgc2luY2UgdGhleSBkb24ndAorICAgICBtYXNrIG91dCB0aGUgbmFpbCBiaXRzIGluIHRoZSBpbnB1dCBkYXRhLiAgKi8KKyAgaWYgKG5haWwgPT0gMCAmJiBHTVBfTkFJTF9CSVRTID09IDAKKyAgICAgICYmIHNpemUgPT0gc2l6ZW9mIChtcF9saW1iX3QpCisgICAgICAmJiAoKChjaGFyICopIGRhdGEgLSAoY2hhciAqKSBOVUxMKSAlIHNpemVvZiAobXBfbGltYl90KSkgPT0gMCAvKiBhbGlnbiAqLykKKyAgICB7CisgICAgICBpZiAob3JkZXIgPT0gLTEpCisJeworCSAgaWYgKGVuZGlhbiA9PSBIT1NUX0VORElBTikKKwkgICAgTVBOX0NPUFkgKHpwLCAobXBfc3JjcHRyKSBkYXRhLCAobXBfc2l6ZV90KSBjb3VudCk7CisJICBlbHNlIC8qIGlmIChlbmRpYW4gPT0gLSBIT1NUX0VORElBTikgKi8KKwkgICAgTVBOX0JTV0FQICh6cCwgKG1wX3NyY3B0cikgZGF0YSwgKG1wX3NpemVfdCkgY291bnQpOworCX0KKyAgICAgIGVsc2UgLyogaWYgKG9yZGVyID09IDEpICovCisJeworCSAgaWYgKGVuZGlhbiA9PSBIT1NUX0VORElBTikKKwkgICAgTVBOX1JFVkVSU0UgKHpwLCAobXBfc3JjcHRyKSBkYXRhLCAobXBfc2l6ZV90KSBjb3VudCk7CisJICBlbHNlIC8qIGlmIChlbmRpYW4gPT0gLSBIT1NUX0VORElBTikgKi8KKwkgICAgTVBOX0JTV0FQX1JFVkVSU0UgKHpwLCAobXBfc3JjcHRyKSBkYXRhLCAobXBfc2l6ZV90KSBjb3VudCk7CisJfQorICAgIH0KKyAgZWxzZQorICB7CisgICAgbXBfbGltYl90ICAgICAgbGltYiwgYnl0ZSwgd2JpdHNtYXNrOworICAgIHNpemVfdCAgICAgICAgIGksIGosIG51bWIsIHdieXRlczsKKyAgICBtcF9zaXplX3QgICAgICB3b2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgICpkcDsKKyAgICBpbnQgICAgICAgICAgICBsYml0cywgd2JpdHM7CisKKyAgICBudW1iID0gc2l6ZSAqIDggLSBuYWlsOworCisgICAgLyogd2hvbGUgYnl0ZXMgdG8gcHJvY2VzcyAqLworICAgIHdieXRlcyA9IG51bWIgLyA4OworCisgICAgLyogcGFydGlhbCBieXRlIHRvIHByb2Nlc3MgKi8KKyAgICB3Yml0cyA9IG51bWIgJSA4OworICAgIHdiaXRzbWFzayA9IChDTlNUX0xJTUIoMSkgPDwgd2JpdHMpIC0gMTsKKworICAgIC8qIG9mZnNldCB0byBnZXQgdG8gdGhlIG5leHQgd29yZCBhZnRlciBwcm9jZXNzaW5nIHdieXRlcyBhbmQgd2JpdHMgKi8KKyAgICB3b2Zmc2V0ID0gKG51bWIgKyA3KSAvIDg7CisgICAgd29mZnNldCA9IChlbmRpYW4gPj0gMCA/IHdvZmZzZXQgOiAtd29mZnNldCkKKyAgICAgICsgKG9yZGVyIDwgMCA/IHNpemUgOiAtIChtcF9zaXplX3QpIHNpemUpOworCisgICAgLyogbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAqLworICAgIGRwID0gKHVuc2lnbmVkIGNoYXIgKikgZGF0YQorICAgICAgKyAob3JkZXIgPj0gMCA/IChjb3VudC0xKSpzaXplIDogMCkgKyAoZW5kaWFuID49IDAgPyBzaXplLTEgOiAwKTsKKworI2RlZmluZSBBQ0NVTVVMQVRFKE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFTU0VSVCAobGJpdHMgPCBHTVBfTlVNQl9CSVRTKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgQVNTRVJUIChsaW1iIDw9IChDTlNUX0xJTUIoMSkgPDwgbGJpdHMpIC0gMSk7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGxpbWIgfD0gKG1wX2xpbWJfdCkgYnl0ZSA8PCBsYml0czsgICAgICAgICAgICAgICAgXAorICAgICAgbGJpdHMgKz0gKE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAobGJpdHMgPj0gR01QX05VTUJfQklUUykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICp6cCsrID0gbGltYiAmIEdNUF9OVU1CX01BU0s7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGJpdHMgLT0gR01QX05VTUJfQklUUzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBBU1NFUlQgKGxiaXRzIDwgKE4pKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxpbWIgPSBieXRlID4+ICgoTikgLSBsYml0cyk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgbGltYiA9IDA7CisgICAgbGJpdHMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgeworCWZvciAoaiA9IDA7IGogPCB3Ynl0ZXM7IGorKykKKwkgIHsKKwkgICAgYnl0ZSA9ICpkcDsKKwkgICAgZHAgLT0gZW5kaWFuOworCSAgICBBQ0NVTVVMQVRFICg4KTsKKwkgIH0KKwlpZiAod2JpdHMgIT0gMCkKKwkgIHsKKwkgICAgYnl0ZSA9ICpkcCAmIHdiaXRzbWFzazsKKwkgICAgZHAgLT0gZW5kaWFuOworCSAgICBBQ0NVTVVMQVRFICh3Yml0cyk7CisJICB9CisJZHAgKz0gd29mZnNldDsKKyAgICAgIH0KKworICAgIGlmIChsYml0cyAhPSAwKQorICAgICAgeworCUFTU0VSVCAobGJpdHMgPD0gR01QX05VTUJfQklUUyk7CisJQVNTRVJUX0xJTUIgKGxpbWIpOworCSp6cCsrID0gbGltYjsKKyAgICAgIH0KKworICAgIEFTU0VSVCAoenAgPT0gUFRSKHopICsgenNpemUpOworCisgICAgLyogbG93IGJ5dGUgb2Ygd29yZCBhZnRlciBtb3N0IHNpZ25pZmljYW50ICovCisgICAgQVNTRVJUIChkcCA9PSAodW5zaWduZWQgY2hhciAqKSBkYXRhCisJICAgICsgKG9yZGVyIDwgMCA/IGNvdW50KnNpemUgOiAtIChtcF9zaXplX3QpIHNpemUpCisJICAgICsgKGVuZGlhbiA+PSAwID8gKG1wX3NpemVfdCkgc2l6ZSAtIDEgOiAwKSk7CisKKyAgfQorCisgIHpwID0gUFRSKHopOworICBNUE5fTk9STUFMSVpFICh6cCwgenNpemUpOworICBTSVooeikgPSB6c2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9pbml0LmMgYi9tcHovaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWEyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaW5pdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIG1wel9pbml0KCkgLS0gTWFrZSBhIG5ldyBtdWx0aXBsZSBwcmVjaXNpb24gbnVtYmVyIHdpdGggdmFsdWUgMC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NSwgMjAwMC0yMDAyLCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9pbml0IChtcHpfcHRyIHgpIF9fR01QX05PVEhST1cKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iPTB4YzFhMDsKKyAgQUxMT0MgKHgpID0gMDsKKyAgUFRSICh4KSA9IChtcF9wdHIpICZkdW1teV9saW1iOworICBTSVogKHgpID0gMDsKK30KZGlmZiAtLWdpdCBhL21wei9pbml0Mi5jIGIvbXB6L2luaXQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiNDZiZgotLS0gL2Rldi9udWxsCisrKyBiL21wei9pbml0Mi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIG1wel9pbml0MiAtLSBpbml0aWFsaXplIG1weiwgd2l0aCByZXF1ZXN0ZWQgc2l6ZSBpbiBiaXRzLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwOCwgMjAyMSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9pbml0MiAobXB6X3B0ciB4LCBtcF9iaXRjbnRfdCBiaXRzKQoreworICBtcF9zaXplX3QgIG5ld19hbGxvYzsKKworICBiaXRzIC09IChiaXRzICE9IDApOwkJLyogUm91bmQgZG93biwgZXhjZXB0IGlmIDAgKi8KKyAgbmV3X2FsbG9jID0gMSArIGJpdHMgLyBHTVBfTlVNQl9CSVRTOworCisgIGlmIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpID4gc2l6ZW9mIChpbnQpKSAvKiBwYXJhbSB2cyBfbXBfc2l6ZSBmaWVsZCAqLworICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAobmV3X2FsbG9jID4gSU5UX01BWCkpCisJTVBaX09WRVJGTE9XOworICAgIH0KKworICBQVFIoeCkgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChuZXdfYWxsb2MpOworICBBTExPQyh4KSA9IG5ld19hbGxvYzsKKyAgU0laKHgpID0gMDsKK30KZGlmZiAtLWdpdCBhL21wei9pbml0cy5jIGIvbXB6L2luaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2MDc0NAotLS0gL2Rldi9udWxsCisrKyBiL21wei9pbml0cy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIG1wel9pbml0cygpIC0tIEluaXRpYWxpemUgbXVsdGlwbGUgbXB6X3QgdmFyaWFibGVzIGFuZCBzZXQgdGhlbSB0byAwLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9pbml0cyAobXB6X3B0ciB4LCAuLi4pIF9fR01QX05PVEhST1cKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iPTB4YzFhMDsKKyAgdmFfbGlzdCAgYXA7CisKKyAgdmFfc3RhcnQgKGFwLCB4KTsKKworICBkbworICAgIHsKKyAgICAgIEFMTE9DICh4KSA9IDA7CisgICAgICBQVFIgKHgpID0gKG1wX3B0cikgJmR1bW15X2xpbWI7CisgICAgICBTSVogKHgpID0gMDsKKworICAgICAgeCA9IHZhX2FyZyAoYXAsIG1wel9wdHIpOworICAgIH0KKyAgd2hpbGUgKHggIT0gTlVMTCk7CisKKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9tcHovaW5wX3Jhdy5jIGIvbXB6L2lucF9yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZkOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2lucF9yYXcuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogbXB6X2lucF9yYXcgLS0gcmVhZCBhbiBtcHpfdCBpbiByYXcgZm9ybWF0LgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNSwgMjAxMiwgMjAxNiwgMjAyMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBOVE9IX0xJTUJfRkVUQ0ggZmV0Y2hlcyBhIGxpbWIgd2hpY2ggaXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChpZS4gYmlnCisgICBlbmRpYW4pIGFuZCBwcm9kdWNlcyBhIG5vcm1hbCBob3N0IGJ5dGUgb3JkZXIgcmVzdWx0LiAqLworCisjaWYgSEFWRV9MSU1CX0JJR19FTkRJQU4KKyNkZWZpbmUgTlRPSF9MSU1CX0ZFVENIKGxpbWIsIHNyYykgIGRvIHsgKGxpbWIpID0gKihzcmMpOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBIQVZFX0xJTUJfTElUVExFX0VORElBTgorI2RlZmluZSBOVE9IX0xJTUJfRkVUQ0gobGltYiwgc3JjKSAgQlNXQVBfTElNQl9GRVRDSCAobGltYiwgc3JjKQorI2VuZGlmCisKKyNpZm5kZWYgTlRPSF9MSU1CX0ZFVENICisjZGVmaW5lIE5UT0hfTElNQl9GRVRDSChsaW1iLCBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqX19wID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgKHNyYyk7ICBcCisgICAgbXBfbGltYl90ICBfX2xpbWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2xpbWIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBHTVBfTElNQl9CWVRFUzsgX19pKyspICAgICAgICAgICAgICAgXAorICAgICAgX19saW1iID0gKF9fbGltYiA8PCA4KSB8IF9fcFtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobGltYikgPSBfX2xpbWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBFbmhhbmNlbWVudDogVGhlIGJ5dGUgc3dhcCBsb29wIG91Z2h0IHRvIGJlIHNhZmUgdG8gdmVjdG9yaXplIG9uIENyYXkKKyAgIGV0YywgYnV0IHNvbWVvbmUgd2hvIGtub3dzIHdoYXQgdGhleSdyZSBkb2luZyBuZWVkcyB0byBjaGVjayBpdC4gICovCisKK3NpemVfdAorbXB6X2lucF9yYXcgKG1wel9wdHIgeCwgRklMRSAqZnApCit7CisgIHVuc2lnbmVkIGNoYXIgIGNzaXplX2J5dGVzWzRdOworICBtcF9zaXplX3QgICAgICBjc2l6ZSwgYWJzX3hzaXplLCBpOworICBzaXplX3QgICAgICAgICBzaXplOworICBzaXplX3QgICAgICAgICBhYnNfY3NpemU7CisgIGNoYXIgICAgICAgICAgICpjcDsKKyAgbXBfcHRyICAgICAgICAgeHAsIHNwLCBlcDsKKyAgbXBfbGltYl90ICAgICAgc2xpbWIsIGVsaW1iOworCisgIGlmIChmcCA9PSAwKQorICAgIGZwID0gc3RkaW47CisKKyAgLyogNCBieXRlcyBmb3Igc2l6ZSAqLworICBpZiAoVU5MSUtFTFkgKGZyZWFkIChjc2l6ZV9ieXRlcywgc2l6ZW9mIChjc2l6ZV9ieXRlcyksIDEsIGZwKSAhPSAxKSkKKyAgICByZXR1cm4gMDsKKworICBzaXplID0gKCgoc2l6ZV90KSBjc2l6ZV9ieXRlc1swXSA8PCAyNCkgKyAoKHNpemVfdCkgY3NpemVfYnl0ZXNbMV0gPDwgMTYpICsKKwkgICgoc2l6ZV90KSBjc2l6ZV9ieXRlc1syXSA8PCA4KSAgKyAoKHNpemVfdCkgY3NpemVfYnl0ZXNbM10pKTsKKworICBpZiAoc2l6ZSA8IDB4ODAwMDAwMDB1KQorICAgIGNzaXplID0gc2l6ZTsKKyAgZWxzZQorICAgIGNzaXplID0gc2l6ZSAtIDB4ODAwMDAwMDB1IC0gMHg4MDAwMDAwMHU7CisKKyAgYWJzX2NzaXplID0gQUJTIChjc2l6ZSk7CisKKyAgaWYgKFVOTElLRUxZIChhYnNfY3NpemUgPiB+KG1wX2JpdGNudF90KSAwIC8gOCkpCisgICAgcmV0dXJuIDA7IC8qIEJpdCBzaXplIG92ZXJmbG93cyAqLworCisgIC8qIHJvdW5kIHVwIHRvIGEgbXVsdGlwbGUgb2YgbGltYnMgKi8KKyAgYWJzX3hzaXplID0gQklUU19UT19MSU1CUyAoKG1wX2JpdGNudF90KSBhYnNfY3NpemUgKiA4KTsKKworICBpZiAoYWJzX3hzaXplICE9IDApCisgICAgeworICAgICAgeHAgPSBNUFpfTkVXQUxMT0MgKHgsIGFic194c2l6ZSk7CisKKyAgICAgIC8qIEdldCBsaW1iIGJvdW5kYXJpZXMgcmlnaHQgaW4gdGhlIHJlYWQsIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUKKwkgbm9uLW5haWxzIGNhc2UuICAqLworICAgICAgeHBbMF0gPSAwOworICAgICAgY3AgPSAoY2hhciAqKSAoeHAgKyBhYnNfeHNpemUpIC0gYWJzX2NzaXplOworICAgICAgaWYgKFVOTElLRUxZIChmcmVhZCAoY3AsIGFic19jc2l6ZSwgMSwgZnApICE9IDEpKQorCXJldHVybiAwOworCisgICAgICBpZiAoR01QX05BSUxfQklUUyA9PSAwKQorCXsKKwkgIC8qIFJldmVyc2UgbGltYnMgdG8gbGVhc3Qgc2lnbmlmaWNhbnQgZmlyc3QsIGFuZCBieXRlIHN3YXAuICBJZgorCSAgICAgYWJzX3hzaXplIGlzIG9kZCB0aGVuIG9uIHRoZSBsYXN0IGl0ZXJhdGlvbiBlbGltYiBhbmQgc2xpbWIgYXJlCisJICAgICB0aGUgc2FtZS4gIEl0IGRvZXNuJ3Qgc2VlbSBleHRyYSBjb2RlIHRvIGhhbmRsZSB0aGF0IGNhc2UKKwkgICAgIHNlcGFyYXRlbHksIHRvIHNhdmUgYW4gTlRPSC4gICovCisJICBzcCA9IHhwOworCSAgZXAgPSB4cCArIGFic194c2l6ZS0xOworCSAgZm9yIChpID0gMDsgaSA8IChhYnNfeHNpemUrMSkvMjsgaSsrKQorCSAgICB7CisJICAgICAgTlRPSF9MSU1CX0ZFVENIIChlbGltYiwgZXApOworCSAgICAgIE5UT0hfTElNQl9GRVRDSCAoc2xpbWIsIHNwKTsKKwkgICAgICAqc3ArKyA9IGVsaW1iOworCSAgICAgICplcC0tID0gc2xpbWI7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSXQgb3VnaHQgdG8gYmUgcG9zc2libGUgdG8gZG8gdGhlIHRyYW5zZm9ybWF0aW9uIGluLXBsYWNlLCBidXQKKwkgICAgIGZvciBub3cgaXQncyBlYXNpZXIgdG8gdXNlIGFuIGV4dHJhIHRlbXBvcmFyeSBhcmVhLiAgKi8KKwkgIG1wX2xpbWJfdCAgYnl0ZSwgbGltYjsKKwkgIGludAkgICAgIGJpdHM7CisJICBtcF9zaXplX3QgIHRwb3M7CisJICBtcF9wdHIgICAgIHRwOworCSAgVE1QX0RFQ0w7CisKKwkgIFRNUF9NQVJLOworCSAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKGFic194c2l6ZSk7CisJICBsaW1iID0gMDsKKwkgIGJpdHMgPSAwOworCSAgdHBvcyA9IDA7CisJICBmb3IgKGkgPSBhYnNfY3NpemUtMTsgaSA+PSAwOyBpLS0pCisJICAgIHsKKwkgICAgICBieXRlID0gKHVuc2lnbmVkIGNoYXIpIGNwW2ldOworCSAgICAgIGxpbWIgfD0gKGJ5dGUgPDwgYml0cyk7CisJICAgICAgYml0cyArPSA4OworCSAgICAgIGlmIChiaXRzID49IEdNUF9OVU1CX0JJVFMpCisJCXsKKwkJICBBU1NFUlQgKHRwb3MgPCBhYnNfeHNpemUpOworCQkgIHRwW3Rwb3MrK10gPSBsaW1iICYgR01QX05VTUJfTUFTSzsKKwkJICBiaXRzIC09IEdNUF9OVU1CX0JJVFM7CisJCSAgQVNTRVJUIChiaXRzIDwgOCk7CisJCSAgbGltYiA9IGJ5dGUgPj4gKDggLSBiaXRzKTsKKwkJfQorCSAgICB9CisJICBpZiAoYml0cyAhPSAwKQorCSAgICB7CisJICAgICAgQVNTRVJUICh0cG9zIDwgYWJzX3hzaXplKTsKKwkgICAgICB0cFt0cG9zKytdID0gbGltYjsKKwkgICAgfQorCSAgQVNTRVJUICh0cG9zID09IGFic194c2l6ZSk7CisKKwkgIE1QTl9DT1BZICh4cCwgdHAsIGFic194c2l6ZSk7CisJICBUTVBfRlJFRTsKKwl9CisKKyAgICAgIC8qIEdNUCAxLnggbXB6X291dF9yYXcgd3JvdGUgaGlnaCB6ZXJvIGJ5dGVzLCBzdHJpcCBhbnkgaGlnaCB6ZXJvCisJIGxpbWJzIHJlc3VsdGluZyBmcm9tIHRoaXMuICBTaG91bGQgYmUgYSBub24temVybyB2YWx1ZSBoZXJlLCBidXQKKwkgZm9yIHNhZmV0eSBkb24ndCBhc3N1bWUgdGhhdC4gKi8KKyAgICAgIE1QTl9OT1JNQUxJWkUgKHhwLCBhYnNfeHNpemUpOworICAgIH0KKworICBTSVooeCkgPSAoY3NpemUgPj0gMCA/IGFic194c2l6ZSA6IC1hYnNfeHNpemUpOworICByZXR1cm4gYWJzX2NzaXplICsgNDsKK30KZGlmZiAtLWdpdCBhL21wei9pbnBfc3RyLmMgYi9tcHovaW5wX3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTYwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaW5wX3N0ci5jCkBAIC0wLDAgKzEsMTczIEBACisvKiBtcHpfaW5wX3N0cihkZXN0X2ludGVnZXIsIHN0cmVhbSwgYmFzZSkgLS0gSW5wdXQgYSBudW1iZXIgaW4gYmFzZQorICAgQkFTRSBmcm9tIHN0ZGlvIHN0cmVhbSBTVFJFQU0gYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gREVTVF9JTlRFR0VSLgorCisgICBPRiBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSwgT05MWSBtcHpfaW5wX3N0ciBJUyBGT1IgRVhURVJOQUwgVVNFLCBUSEUKKyAgIFJFU1QgQVJFIElOVEVSTkFMUyBBTkQgQVJFIEFMTU9TVCBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFCisgICBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk4LCAyMDAwLTIwMDMsIDIwMTEtMjAxMyBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjZGVmaW5lIGRpZ2l0X3ZhbHVlX3RhYiBfX2dtcF9kaWdpdF92YWx1ZV90YWIKKworc2l6ZV90CittcHpfaW5wX3N0ciAobXB6X3B0ciB4LCBGSUxFICpzdHJlYW0sIGludCBiYXNlKQoreworICBpbnQgYzsKKyAgc2l6ZV90IG5yZWFkOworCisgIGlmIChzdHJlYW0gPT0gMCkKKyAgICBzdHJlYW0gPSBzdGRpbjsKKworICBucmVhZCA9IDA7CisKKyAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KKyAgZG8KKyAgICB7CisgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKKyAgICAgIG5yZWFkKys7CisgICAgfQorICB3aGlsZSAoaXNzcGFjZSAoYykpOworCisgIHJldHVybiBtcHpfaW5wX3N0cl9ub3doaXRlICh4LCBzdHJlYW0sIGJhc2UsIGMsIG5yZWFkKTsKK30KKworLyogc2hhcmVkIGJ5IG1wcV9pbnBfc3RyICovCitzaXplX3QKK21wel9pbnBfc3RyX25vd2hpdGUgKG1wel9wdHIgeCwgRklMRSAqc3RyZWFtLCBpbnQgYmFzZSwgaW50IGMsIHNpemVfdCBucmVhZCkKK3sKKyAgY2hhciAqc3RyOworICBzaXplX3QgYWxsb2Nfc2l6ZSwgc3RyX3NpemU7CisgIGludCBuZWdhdGl2ZTsKKyAgbXBfc2l6ZV90IHhzaXplOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkaWdpdF92YWx1ZTsKKworICBBU1NFUlRfQUxXQVlTIChFT0YgPT0gLTEpOwkvKiBGSVhNRTogaGFuZGxlIHRoaXMgYnkgYWRkaW5nIGV4cGxpY2l0ICovCisJCQkJLyogY29tcGFyaXNvbnMgb2YgYyBhbmQgRU9GIGJlZm9yZSBlYWNoICAqLworCQkJCS8qIHJlYWQgb2YgZGlnaXRfdmFsdWVbXS4gICovCisKKyAgZGlnaXRfdmFsdWUgPSBkaWdpdF92YWx1ZV90YWI7CisgIGlmIChiYXNlID4gMzYpCisgICAgeworICAgICAgLyogRm9yIGJhc2VzID4gMzYsIHVzZSB0aGUgY29sbGF0aW5nIHNlcXVlbmNlCisJIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LiAgKi8KKyAgICAgIGRpZ2l0X3ZhbHVlICs9IDIwODsKKyAgICAgIGlmIChVTkxJS0VMWSAoYmFzZSA+IDYyKSkKKwlyZXR1cm4gMDsJCS8qIHRvbyBsYXJnZSBiYXNlICovCisgICAgfQorCisgIG5lZ2F0aXZlID0gMDsKKyAgaWYgKGMgPT0gJy0nKQorICAgIHsKKyAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworICAgICAgbnJlYWQrKzsKKyAgICB9CisKKyAgaWYgKGMgPT0gRU9GIHx8IGRpZ2l0X3ZhbHVlW2NdID49IChiYXNlID09IDAgPyAxMCA6IGJhc2UpKQorICAgIHJldHVybiAwOwkJCS8qIGVycm9yIGlmIG5vIGRpZ2l0cyAqLworCisgIC8qIElmIEJBU0UgaXMgMCwgdHJ5IHRvIGZpbmQgb3V0IHRoZSBiYXNlIGJ5IGxvb2tpbmcgYXQgdGhlIGluaXRpYWwKKyAgICAgY2hhcmFjdGVycy4gICovCisgIGlmIChiYXNlID09IDApCisgICAgeworICAgICAgYmFzZSA9IDEwOworICAgICAgaWYgKGMgPT0gJzAnKQorCXsKKwkgIGJhc2UgPSA4OworCSAgYyA9IGdldGMgKHN0cmVhbSk7CisJICBucmVhZCsrOworCSAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKQorCSAgICB7CisJICAgICAgYmFzZSA9IDE2OworCSAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworCSAgICAgIG5yZWFkKys7CisJICAgIH0KKwkgIGVsc2UgaWYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKQorCSAgICB7CisJICAgICAgYmFzZSA9IDI7CisJICAgICAgYyA9IGdldGMgKHN0cmVhbSk7CisJICAgICAgbnJlYWQrKzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogU2tpcCBsZWFkaW5nIHplcm9zLiAgKi8KKyAgd2hpbGUgKGMgPT0gJzAnKQorICAgIHsKKyAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworICAgICAgbnJlYWQrKzsKKyAgICB9CisKKyAgYWxsb2Nfc2l6ZSA9IDEwMDsKKyAgc3RyID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChhbGxvY19zaXplLCBjaGFyKTsKKyAgc3RyX3NpemUgPSAwOworCisgIHdoaWxlIChjICE9IEVPRikKKyAgICB7CisgICAgICBpbnQgZGlnOworICAgICAgZGlnID0gZGlnaXRfdmFsdWVbY107CisgICAgICBpZiAoZGlnID49IGJhc2UpCisJYnJlYWs7CisgICAgICBpZiAoc3RyX3NpemUgPj0gYWxsb2Nfc2l6ZSkKKwl7CisJICBzaXplX3Qgb2xkX2FsbG9jX3NpemUgPSBhbGxvY19zaXplOworCSAgYWxsb2Nfc2l6ZSA9IGFsbG9jX3NpemUgKiAzIC8gMjsKKwkgIHN0ciA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19UWVBFIChzdHIsIG9sZF9hbGxvY19zaXplLCBhbGxvY19zaXplLCBjaGFyKTsKKwl9CisgICAgICBzdHJbc3RyX3NpemUrK10gPSBkaWc7CisgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKKyAgICB9CisgIG5yZWFkICs9IHN0cl9zaXplOworCisgIHVuZ2V0YyAoYywgc3RyZWFtKTsKKyAgbnJlYWQtLTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHN0cmluZyBpcyBub3QgZW1wdHksIG1wbl9zZXRfc3RyIHdvdWxkIGZhaWwuICAqLworICBpZiAoc3RyX3NpemUgPT0gMCkKKyAgICB7CisgICAgICBTSVogKHgpID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBMSU1CU19QRVJfRElHSVRfSU5fQkFTRSAoeHNpemUsIHN0cl9zaXplLCBiYXNlKTsKKyAgICAgIE1QWl9ORVdBTExPQyAoeCwgeHNpemUpOworCisgICAgICAvKiBDb252ZXJ0IHRoZSBieXRlIGFycmF5IGluIGJhc2UgQkFTRSB0byBvdXIgYmlnbnVtIGZvcm1hdC4gICovCisgICAgICB4c2l6ZSA9IG1wbl9zZXRfc3RyIChQVFIgKHgpLCAodW5zaWduZWQgY2hhciAqKSBzdHIsIHN0cl9zaXplLCBiYXNlKTsKKyAgICAgIFNJWiAoeCkgPSBuZWdhdGl2ZSA/IC14c2l6ZSA6IHhzaXplOworICAgIH0KKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzdHIsIGFsbG9jX3NpemUpOworICByZXR1cm4gbnJlYWQ7Cit9CmRpZmYgLS1naXQgYS9tcHovaW52ZXJ0LmMgYi9tcHovaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzMmQxMwotLS0gL2Rldi9udWxsCisrKyBiL21wei9pbnZlcnQuYwpAQCAtMCwwICsxLDcyIEBACisvKiBtcHpfaW52ZXJ0IChpbnYsIHgsIG4pLiAgRmluZCBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIFggaW4gWihOKS4KKyAgIElmIFggaGFzIGFuIGludmVyc2UsIHJldHVybiBub24temVybyBhbmQgc3RvcmUgaW52ZXJzZSBpbiBJTlZFUlNFLAorICAgb3RoZXJ3aXNlLCByZXR1cm4gMCBhbmQgcHV0IGdhcmJhZ2UgaW4gSU5WRVJTRS4KKworQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwNSwgMjAxMiwgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK2ludAorbXB6X2ludmVydCAobXB6X3B0ciBpbnZlcnNlLCBtcHpfc3JjcHRyIHgsIG1wel9zcmNwdHIgbikKK3sKKyAgbXB6X3QgZ2NkLCB0bXA7CisgIG1wX3NpemVfdCB4c2l6ZSwgbnNpemUsIHNpemU7CisgIFRNUF9ERUNMOworCisgIHhzaXplID0gQUJTSVogKHgpOworICBuc2l6ZSA9IEFCU0laIChuKTsKKworICBzaXplID0gTUFYICh4c2l6ZSwgbnNpemUpICsgMTsKKyAgVE1QX01BUks7CisKKyAgTVBaX1RNUF9JTklUIChnY2QsIHNpemUpOworICBNUFpfVE1QX0lOSVQgKHRtcCwgc2l6ZSk7CisgIG1wel9nY2RleHQgKGdjZCwgdG1wLCAobXB6X3B0cikgMCwgeCwgbik7CisKKyAgLyogSWYgbm8gaW52ZXJzZSBleGlzdGVkLCByZXR1cm4gd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHRoYXQuICAqLworICBpZiAoIU1QWl9FUVVBTF8xX1AgKGdjZCkpCisgICAgeworICAgICAgVE1QX0ZSRUU7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHdlIHJldHVybiBhIHBvc2l0aXZlIGludmVyc2UuICAqLworICBpZiAoU0laICh0bXApIDwgMCkKKyAgICB7CisgICAgICBpZiAoU0laIChuKSA8IDApCisJbXB6X3N1YiAoaW52ZXJzZSwgdG1wLCBuKTsKKyAgICAgIGVsc2UKKwltcHpfYWRkIChpbnZlcnNlLCB0bXAsIG4pOworICAgIH0KKyAgZWxzZQorICAgIG1wel9zZXQgKGludmVyc2UsIHRtcCk7CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbXB6L2lvci5jIGIvbXB6L2lvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjMwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaW9yLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIG1wel9pb3IgLS0gTG9naWNhbCBpbmNsdXNpdmUgb3IuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDEyLCAyMDEzLAorMjAxNS0yMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2lvciAobXB6X3B0ciByZXMsIG1wel9zcmNwdHIgb3AxLCBtcHpfc3JjcHRyIG9wMikKK3sKKyAgbXBfc3JjcHRyIG9wMV9wdHIsIG9wMl9wdHI7CisgIG1wX3NpemVfdCBvcDFfc2l6ZSwgb3AyX3NpemU7CisgIG1wX3B0ciByZXNfcHRyOworICBtcF9zaXplX3QgcmVzX3NpemU7CisgIG1wX3NpemVfdCBpOworCisgIG9wMV9zaXplID0gU0laKG9wMSk7CisgIG9wMl9zaXplID0gU0laKG9wMik7CisKKyAgaWYgKG9wMV9zaXplIDwgb3AyX3NpemUpCisgICAgeworICAgICAgTVBaX1NSQ1BUUl9TV0FQIChvcDEsIG9wMik7CisgICAgICBNUF9TSVpFX1RfU1dBUCAob3AxX3NpemUsIG9wMl9zaXplKTsKKyAgICB9CisKKyAgb3AxX3B0ciA9IFBUUihvcDEpOworICByZXNfcHRyID0gUFRSKHJlcyk7CisKKyAgaWYgKG9wMl9zaXplID49IDApCisgICAgeworICAgICAgaWYgKHJlc19wdHIgIT0gb3AxX3B0cikKKwl7CisJICByZXNfcHRyID0gTVBaX1JFQUxMT0MgKHJlcywgb3AxX3NpemUpOworCSAgLyogTm8gb3ZlcmxhcHBpbmcgcG9zc2libGU6IG9wMV9wdHIgPSBQVFIob3AxKTsgKi8KKwkgIE1QTl9DT1BZIChyZXNfcHRyICsgb3AyX3NpemUsIG9wMV9wdHIgKyBvcDJfc2l6ZSwKKwkJICAgIG9wMV9zaXplIC0gb3AyX3NpemUpOworCX0KKyAgICAgIGlmIChMSUtFTFkgKG9wMl9zaXplICE9IDApKQorCW1wbl9pb3JfbiAocmVzX3B0ciwgb3AxX3B0ciwgUFRSKG9wMiksIG9wMl9zaXplKTsKKworICAgICAgU0laKHJlcykgPSBvcDFfc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgb3B4OworICAgICAgVE1QX0RFQ0w7CisKKyAgICAgIFRNUF9NQVJLOworICAgICAgaWYgKG9wMV9zaXplIDwgMCkKKwl7CisJICBtcF9wdHIgb3B5OworCisJICAvKiBCb3RoIG9wZXJhbmRzIGFyZSBuZWdhdGl2ZSwgc28gd2lsbCBiZSB0aGUgcmVzdWx0LgorCSAgICAgLSgoLU9QMSkgfCAoLU9QMikpID0gLSh+KE9QMSAtIDEpIHwgfihPUDIgLSAxKSkgPQorCSAgICAgPSB+KH4oT1AxIC0gMSkgfCB+KE9QMiAtIDEpKSArIDEgPQorCSAgICAgPSAoKE9QMSAtIDEpICYgKE9QMiAtIDEpKSArIDEgICAgICAqLworCisJICByZXNfc2l6ZSA9IC1vcDFfc2l6ZTsKKworCSAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uOiBEZWNyZWFzZSBtcG5fc3ViIHByZWNpc2lvbiwKKwkgICAgIGFzIHdlIHdvbid0IHVzZSB0aGUgZW50aXJlIHJlcyBvZiBib3RoLiAgKi8KKwkgIFRNUF9BTExPQ19MSU1CU18yIChvcHgsIHJlc19zaXplLCBvcHksIHJlc19zaXplKTsKKwkgIG1wbl9zdWJfMSAob3B4LCBvcDFfcHRyLCByZXNfc2l6ZSwgKG1wX2xpbWJfdCkgMSk7CisJICBvcDFfcHRyID0gb3B4OworCisJICBtcG5fc3ViXzEgKG9weSwgUFRSKG9wMiksIHJlc19zaXplLCAobXBfbGltYl90KSAxKTsKKwkgIG9wMl9wdHIgPSBvcHk7CisKKwkgIC8qIEZpcnN0IGxvb3AgZmluZHMgdGhlIHNpemUgb2YgdGhlIHJlc3VsdC4gICovCisJICBmb3IgKGkgPSByZXNfc2l6ZTsgLS1pID49IDA7KQorCSAgICBpZiAoKG9wMV9wdHJbaV0gJiBvcDJfcHRyW2ldKSAhPSAwKQorCSAgICAgIGJyZWFrOworCSAgcmVzX3NpemUgPSBpICsgMTsKKworCSAgcmVzX3B0ciA9IE1QWl9ORVdBTExPQyAocmVzLCByZXNfc2l6ZSArIDEpOworCisJICBpZiAocmVzX3NpemUgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFNlY29uZCBsb29wIGNvbXB1dGVzIHRoZSByZWFsIHJlc3VsdC4gICovCisJICAgICAgbXBuX2FuZF9uIChyZXNfcHRyLCBvcDFfcHRyLCBvcDJfcHRyLCByZXNfc2l6ZSk7CisKKwkgICAgICByZXNfcHRyW3Jlc19zaXplXSA9IDA7CisJICAgICAgTVBOX0lOQ1JfVSAocmVzX3B0ciwgcmVzX3NpemUgKyAxLCAxKTsKKwkgICAgICByZXNfc2l6ZSArPSByZXNfcHRyW3Jlc19zaXplXTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVzX3B0clswXSA9IDE7CisJICAgICAgcmVzX3NpemUgPSAxOworCSAgICB9CisKKwkgIFNJWihyZXMpID0gLXJlc19zaXplOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcF9saW1iX3QgY3k7CisJICBtcF9zaXplX3QgY291bnQ7CisKKwkgIC8qIE9wZXJhbmQgMiBuZWdhdGl2ZSwgc28gd2lsbCBiZSB0aGUgcmVzdWx0LgorCSAgICAgLShPUDEgfCAoLU9QMikpID0gLShPUDEgfCB+KE9QMiAtIDEpKSA9CisJICAgICA9IH4oT1AxIHwgfihPUDIgLSAxKSkgKyAxID0KKwkgICAgID0gKH5PUDEgJiAoT1AyIC0gMSkpICsgMSAgICAgICovCisKKwkgIG9wMl9zaXplID0gLW9wMl9zaXplOworCisJICByZXNfcHRyID0gTVBaX1JFQUxMT0MgKHJlcywgb3AyX3NpemUpOworCSAgb3AxX3B0ciA9IFBUUihvcDEpOworCisJICBvcHggPSBUTVBfQUxMT0NfTElNQlMgKG9wMl9zaXplKTsKKwkgIG1wbl9zdWJfMSAob3B4LCBQVFIob3AyKSwgb3AyX3NpemUsIChtcF9saW1iX3QpIDEpOworCSAgb3AyX3B0ciA9IG9weDsKKwkgIG9wMl9zaXplIC09IG9wMl9wdHJbb3AyX3NpemUgLSAxXSA9PSAwOworCisJICBpZiAob3AxX3NpemUgPj0gb3AyX3NpemUpCisJICAgIHsKKwkgICAgICAvKiBXZSBjYW4ganVzdCBpZ25vcmUgdGhlIHBhcnQgb2YgT1AxIHRoYXQgc3RyZXRjaGVzIGFib3ZlIE9QMiwKKwkJIGJlY2F1c2UgdGhlIHJlc3VsdCBsaW1icyBhcmUgemVybyB0aGVyZS4gICovCisKKwkgICAgICAvKiBGaXJzdCBsb29wIGZpbmRzIHRoZSBzaXplIG9mIHRoZSByZXN1bHQuICAqLworCSAgICAgIGZvciAoaSA9IG9wMl9zaXplOyAtLWkgPj0gMDspCisJCWlmICgofm9wMV9wdHJbaV0gJiBvcDJfcHRyW2ldKSAhPSAwKQorCQkgIGJyZWFrOworCSAgICAgIHJlc19zaXplID0gaSArIDE7CisJICAgICAgY291bnQgPSByZXNfc2l6ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcmVzX3NpemUgPSBvcDJfc2l6ZTsKKworCSAgICAgIC8qIENvcHkgdGhlIHBhcnQgb2YgT1AyIHRoYXQgc3RyZXRjaGVzIGFib3ZlIE9QMSwgdG8gUkVTLiAgKi8KKwkgICAgICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMV9zaXplLCBvcDJfcHRyICsgb3AxX3NpemUsIG9wMl9zaXplIC0gb3AxX3NpemUpOworCSAgICAgIGNvdW50ID0gb3AxX3NpemU7CisJICAgIH0KKworCSAgaWYgKHJlc19zaXplICE9IDApCisJICAgIHsKKwkgICAgICAvKiBTZWNvbmQgbG9vcCBjb21wdXRlcyB0aGUgcmVhbCByZXN1bHQuICAqLworCSAgICAgIGlmIChMSUtFTFkgKGNvdW50ICE9IDApKQorCQltcG5fYW5kbl9uIChyZXNfcHRyLCBvcDJfcHRyLCBvcDFfcHRyLCBjb3VudCk7CisKKwkgICAgICBjeSA9IG1wbl9hZGRfMSAocmVzX3B0ciwgcmVzX3B0ciwgcmVzX3NpemUsIChtcF9saW1iX3QpIDEpOworCSAgICAgIGlmIChjeSkKKwkJeworCQkgIHJlc19wdHJbcmVzX3NpemVdID0gY3k7CisJCSAgKytyZXNfc2l6ZTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByZXNfcHRyWzBdID0gMTsKKwkgICAgICByZXNfc2l6ZSA9IDE7CisJICAgIH0KKworCSAgU0laKHJlcykgPSAtcmVzX3NpemU7CisJfQorICAgICAgVE1QX0ZSRUU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXB6L2lzZXQuYyBiL21wei9pc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyY2FkYQotLS0gL2Rldi9udWxsCisrKyBiL21wei9pc2V0LmMKQEAgLTAsMCArMSw1MiBAQAorLyogbXB6X2luaXRfc2V0IChzcmNfaW50ZWdlcikgLS0gTWFrZSBhIG5ldyBtdWx0aXBsZSBwcmVjaXNpb24gbnVtYmVyIHdpdGgKKyAgIGEgdmFsdWUgY29waWVkIGZyb20gU1JDX0lOVEVHRVIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2luaXRfc2V0IChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSkKK3sKKyAgbXBfcHRyIHdwLCB1cDsKKyAgbXBfc2l6ZV90IHVzaXplLCBzaXplOworCisgIHVzaXplID0gU0laICh1KTsKKyAgc2l6ZSA9IEFCUyAodXNpemUpOworCisgIEFMTE9DICh3KSA9IE1BWCAoc2l6ZSwgMSk7CisgIHdwID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoQUxMT0MgKHcpKTsKKworICBQVFIgKHcpID0gd3A7CisgIHVwID0gUFRSICh1KTsKKworICBNUE5fQ09QWSAod3AsIHVwLCBzaXplKTsKKyAgU0laICh3KSA9IHVzaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L2lzZXRfZC5jIGIvbXB6L2lzZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDRhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovaXNldF9kLmMKQEAgLTAsMCArMSw0MyBAQAorLyogbXB6X2luaXRfc2V0X2QoaW50ZWdlciwgdmFsKSAtLSBJbml0aWFsaXplIGFuZCBhc3NpZ24gSU5URUdFUiB3aXRoIGEgZG91YmxlCisgICB2YWx1ZSBWQUwuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAwLCAyMDAxLCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2luaXRfc2V0X2QgKG1wel9wdHIgZGVzdCwgZG91YmxlIHZhbCkKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iPTB4YzFhMDsKKworICBBTExPQyAoZGVzdCkgPSAwOworICBTSVogKGRlc3QpID0gMDsKKyAgUFRSIChkZXN0KSA9IChtcF9wdHIpICZkdW1teV9saW1iOworICBtcHpfc2V0X2QgKGRlc3QsIHZhbCk7Cit9CmRpZmYgLS1naXQgYS9tcHovaXNldF9zaS5jIGIvbXB6L2lzZXRfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2lzZXRfc2kuYwpAQCAtMCwwICsxLDU4IEBACisvKiBtcHpfaW5pdF9zZXRfc2koZGVzdCx2YWwpIC0tIE1ha2UgYSBuZXcgbXVsdGlwbGUgcHJlY2lzaW9uIGluIERFU1QgYW5kCisgICBhc3NpZ24gVkFMIHRvIHRoZSBuZXcgbnVtYmVyLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAwLTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfaW5pdF9zZXRfc2kgKG1wel9wdHIgZGVzdCwgc2lnbmVkIGxvbmcgaW50IHZhbCkKK3sKKyAgbXBfc2l6ZV90IHNpemU7CisgIG1wX2xpbWJfdCB2bDsKKworICBBTExPQyAoZGVzdCkgPSAxOworICBQVFIgKGRlc3QpID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoMSk7CisKKyAgdmwgPSAobXBfbGltYl90KSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZyBpbnQsIHZhbCk7CisKKyAgUFRSIChkZXN0KVswXSA9IHZsICYgR01QX05VTUJfTUFTSzsKKyAgc2l6ZSA9IHZsICE9IDA7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgaWYgKHZsID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIE1QWl9SRUFMTE9DIChkZXN0LCAyKTsKKyAgICAgIFBUUiAoZGVzdClbMV0gPSB2bCA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgc2l6ZSA9IDI7CisgICAgfQorI2VuZGlmCisKKyAgU0laIChkZXN0KSA9IHZhbCA+PSAwID8gc2l6ZSA6IC1zaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L2lzZXRfc3RyLmMgYi9tcHovaXNldF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYxMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2lzZXRfc3RyLmMKQEAgLTAsMCArMSw0NyBAQAorLyogbXB6X2luaXRfc2V0X3N0cihzdHJpbmcsIGJhc2UpIC0tIENvbnZlcnQgdGhlIFwwLXRlcm1pbmF0ZWQgc3RyaW5nIFNUUklORyBpbgorICAgYmFzZSBCQVNFIHRvIGEgbXVsdGlwbGUgcHJlY2lzaW9uIGludGVnZXIuICBBbGxvdyB3aGl0ZSBzcGFjZSBpbiB0aGUgc3RyaW5nLgorICAgSWYgQkFTRSA9PSAwIGRldGVybWluZSB0aGUgYmFzZSBpbiB0aGUgQyBzdGFuZGFyZCB3YXksIGkuZS4gIDB4aGguLi5oIG1lYW5zCisgICBiYXNlIDE2LCAwb28uLi5vIG1lYW5zIGJhc2UgOCwgb3RoZXJ3aXNlIGFzc3VtZSBiYXNlIDEwLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAwLTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCitpbnQKK21wel9pbml0X3NldF9zdHIgKG1wel9wdHIgeCwgY29uc3QgY2hhciAqc3RyLCBpbnQgYmFzZSkKK3sKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCBkdW1teV9saW1iPTB4YzFhMDsKKyAgQUxMT0MgKHgpID0gMDsKKyAgUFRSICh4KSA9IChtcF9wdHIpICZkdW1teV9saW1iOworCisgIC8qIGlmIHN0ciBoYXMgbm8gZGlnaXRzIG1wel9zZXRfc3RyIGxlYXZlcyB4LT5fbXBfc2l6ZSB1bnNldCAqLworICBTSVogKHgpID0gMDsKKworICByZXR1cm4gbXB6X3NldF9zdHIgKHgsIHN0ciwgYmFzZSk7Cit9CmRpZmYgLS1naXQgYS9tcHovaXNldF91aS5jIGIvbXB6L2lzZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE4ZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2lzZXRfdWkuYwpAQCAtMCwwICsxLDU4IEBACisvKiBtcHpfaW5pdF9zZXRfdWkoZGVzdCx2YWwpIC0tIE1ha2UgYSBuZXcgbXVsdGlwbGUgcHJlY2lzaW9uIGluIERFU1QgYW5kCisgICBhc3NpZ24gVkFMIHRvIHRoZSBuZXcgbnVtYmVyLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAwLTIwMDIsIDIwMDQsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfaW5pdF9zZXRfdWkgKG1wel9wdHIgZGVzdCwgdW5zaWduZWQgbG9uZyBpbnQgdmFsKQoreworICBtcF9zaXplX3Qgc2l6ZTsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmICh2YWwgPiBHTVBfTlVNQl9NQVgpCisgICAgeworICAgICAgQUxMT0MgKGRlc3QpID0gMjsKKyAgICAgIFBUUiAoZGVzdCkgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTICgyKTsKKyAgICAgIFBUUiAoZGVzdClbMV0gPSB2YWwgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIHNpemUgPSAyOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgQUxMT0MgKGRlc3QpID0gMTsKKyAgICAgIFBUUiAoZGVzdCkgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTICgxKTsKKworICAgICAgc2l6ZSA9IHZhbCAhPSAwOworICAgIH0KKyAgUFRSIChkZXN0KVswXSA9IHZhbCAmIEdNUF9OVU1CX01BU0s7CisKKyAgU0laIChkZXN0KSA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcHovamFjb2JpLmMgYi9tcHovamFjb2JpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1NTZkNwotLS0gL2Rldi9udWxsCisrKyBiL21wei9qYWNvYmkuYwpAQCAtMCwwICsxLDIxMCBAQAorLyogbXB6X2phY29iaSwgbXB6X2xlZ2VuZHJlLCBtcHpfa3JvbmVja2VyIC0tIG1wei9tcHogSmFjb2JpIHN5bWJvbHMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDIsIDIwMDUsIDIwMTAtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIFRoaXMgY29kZSBkb2VzIHRyaXBsZSBkdXR5IGFzIG1wel9qYWNvYmksIG1wel9sZWdlbmRyZSBhbmQKKyAgIG1wel9rcm9uZWNrZXIuIEZvciBBQkkgY29tcGF0aWJpbGl0eSwgdGhlIGxpbmsgc3ltYm9sIGlzCisgICBfX2dtcHpfamFjb2JpLCBub3QgX19nbXB6X2tyb25lY2tlciwgZXZlbiB0aG91Z2ggdGhlIGxhdHRlciB3b3VsZAorICAgYmUgbW9yZSBsb2dpY2FsLgorCisgICBtcHpfamFjb2JpIGNvdWxkIGFzc3VtZSBiIGlzIG9kZCwgYnV0IHRoZSBpbXByb3ZlbWVudHMgZnJvbSB0aGF0IHNlZW0KKyAgIHNtYWxsIGNvbXBhcmVkIHRvIG90aGVyIG9wZXJhdGlvbnMsIGFuZCBhbnl0aGluZyBzaWduaWZpY2FudCBzaG91bGQgYmUKKyAgIGNoZWNrZWQgYXQgcnVuLXRpbWUgc2luY2Ugd2UnZCBsaWtlIG9kZCBiIHRvIGdvIGZhc3QgaW4gbXB6X2tyb25lY2tlcgorICAgdG9vLgorCisgICBtcHpfbGVnZW5kcmUgY291bGQgYXNzdW1lIGIgaXMgYW4gb2RkIHByaW1lLCBidXQga25vd2luZyB0aGlzIGRvZXNuJ3QKKyAgIHByZXNlbnQgYW55IG9idmlvdXMgYmVuZWZpdHMuICBSZXN1bHQgMCB3b3VsZG4ndCBhcmlzZSAodW5sZXNzICJhIiBpcyBhCisgICBtdWx0aXBsZSBvZiBiKSwgYnV0IHRoZSBjaGVja2luZyBmb3IgdGhhdCB0YWtlcyBsaXR0bGUgdGltZSBjb21wYXJlZCB0bworICAgb3RoZXIgb3BlcmF0aW9ucy4KKworICAgRW5oYW5jZW1lbnRzOgorCisgICBtcG5fYmRpdl9xciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIG1wbl90ZGl2X3FyLgorCisqLworCitpbnQKK21wel9qYWNvYmkgKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiKQoreworICBtcF9zcmNwdHIgIGFzcmNwLCBic3JjcDsKKyAgbXBfc2l6ZV90ICBhc2l6ZSwgYnNpemU7CisgIG1wX2xpbWJfdCAgYWxvdywgYmxvdzsKKyAgbXBfcHRyICAgICBhcCwgYnA7CisgIHVuc2lnbmVkICAgYnR3b3M7CisgIGludCAgICAgICAgcmVzdWx0X2JpdDE7CisgIGludCAgICAgICAgcmVzOworICBUTVBfREVDTDsKKworICBhc2l6ZSA9IFNJWihhKTsKKyAgYXNyY3AgPSBQVFIoYSk7CisgIGFsb3cgPSBhc3JjcFswXTsKKworICBic2l6ZSA9IFNJWihiKTsKKyAgYnNyY3AgPSBQVFIoYik7CisgIGJsb3cgPSBic3JjcFswXTsKKworICAvKiBUaGUgTVBOIGphY29iaSBmdW5jdGlvbnMgcmVxdWlyZSBwb3NpdGl2ZSBhIGFuZCBiLCBhbmQgYiBvZGQuIFNvCisgICAgIHdlIG11c3QgdG8gaGFuZGxlIHRoZSBjYXNlcyBvZiBhIG9yIGIgemVybywgdGhlbiBzaWducywgYW5kIHRoZW4KKyAgICAgdGhlIGNhc2Ugb2YgZXZlbiBiLgorICAqLworCisgIGlmIChic2l6ZSA9PSAwKQorICAgIC8qIChhLzApID0gWyBhID0gMSBvciBhID0gLTEgXSAqLworICAgIHJldHVybiBKQUNPQklfTFMwIChhbG93LCBhc2l6ZSk7CisKKyAgaWYgKGFzaXplID09IDApCisgICAgLyogKDAvYikgPSBbIGIgPSAxIG9yIGIgPSAtIDEgXSAqLworICAgIHJldHVybiBKQUNPQklfMExTIChibG93LCBic2l6ZSk7CisKKyAgaWYgKCAoKChhbG93IHwgYmxvdykgJiAxKSA9PSAwKSkKKyAgICAvKiBDb21tb24gZmFjdG9yIG9mIDIgPT0+IChhL2IpID0gMCAqLworICAgIHJldHVybiAwOworCisgIGlmIChic2l6ZSA8IDApCisgICAgeworICAgICAgLyogKGEvLTEpID0gLTEgaWYgYSA8IDAsICsxIGlmIGEgPj0gMCAqLworICAgICAgcmVzdWx0X2JpdDEgPSAoYXNpemUgPCAwKSA8PCAxOworICAgICAgYnNpemUgPSAtYnNpemU7CisgICAgfQorICBlbHNlCisgICAgcmVzdWx0X2JpdDEgPSAwOworCisgIEpBQ09CSV9TVFJJUF9MT1dfWkVST1MgKHJlc3VsdF9iaXQxLCBhbG93LCBic3JjcCwgYnNpemUsIGJsb3cpOworCisgIGNvdW50X3RyYWlsaW5nX3plcm9zIChidHdvcywgYmxvdyk7CisgIGJsb3cgPj49IGJ0d29zOworCisgIGlmIChic2l6ZSA+IDEgJiYgYnR3b3MgPiAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBiMSA9IGJzcmNwWzFdOworICAgICAgYmxvdyB8PSBiMSA8PCAoR01QX05VTUJfQklUUyAtIGJ0d29zKTsKKyAgICAgIGlmIChic2l6ZSA9PSAyICYmIChiMSA+PiBidHdvcykgPT0gMCkKKwlic2l6ZSA9IDE7CisgICAgfQorCisgIGlmIChhc2l6ZSA8IDApCisgICAgeworICAgICAgLyogKC0xL2IpID0gLTEgaWZmIGIgPSAzIChtb2QgNCkgKi8KKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9OMUJfQklUMShibG93KTsKKyAgICAgIGFzaXplID0gLWFzaXplOworICAgIH0KKworICBKQUNPQklfU1RSSVBfTE9XX1pFUk9TIChyZXN1bHRfYml0MSwgYmxvdywgYXNyY3AsIGFzaXplLCBhbG93KTsKKworICAvKiBFbnN1cmUgYXNpemUgPj0gYnNpemUuIFRha2UgYWR2YW50YWdlIG9mIHRoZSBnZW5lcmFsaXplZAorICAgICByZWNpcHJvY2l0eSBsYXcgKGEvYioyXm4pID0gKGIqMl5uIC8gYSkgKiBSRUNJUChhLGIpICovCisKKyAgaWYgKGFzaXplIDwgYnNpemUpCisgICAgeworICAgICAgTVBOX1NSQ1BUUl9TV0FQIChhc3JjcCwgYXNpemUsIGJzcmNwLCBic2l6ZSk7CisgICAgICBNUF9MSU1CX1RfU1dBUCAoYWxvdywgYmxvdyk7CisKKyAgICAgIC8qIE5PVEU6IFRoZSB2YWx1ZSBvZiBhbG93IChvbGQgYmxvdykgaXMgYSBiaXQgc3VidGxlLiBGb3IgdGhpcyBjb2RlCisJIHBhdGgsIHdlIGdldCBhbG93IGFzIHRoZSBsb3csIGFsd2F5cyBvZGQsIGxpbWIgb2Ygc2hpZnRlZCBBLiBXaGljaCBpcworCSB3aGF0IHdlIG5lZWQgZm9yIHRoZSByZWNpcHJvY2l0eSB1cGRhdGUgYmVsb3cuCisKKwkgSG93ZXZlciwgYWxsIG90aGVyIHVzZXMgb2YgYWxvdyBhc3N1bWVzIHRoYXQgaXQgaXMgKm5vdCoKKwkgc2hpZnRlZC4gTHVja2lseSwgYWxvdyBtYXR0ZXJzIG9ubHkgd2hlbiBlaXRoZXIKKworCSArIGJ0d29zID4gMCwgaW4gd2hpY2ggY2FzZSBBIGlzIGFsd2F5cyBvZGQKKworCSArIGFzaXplID09IGJzaXplID09IDEsIGluIHdoaWNoIGNhc2UgdGhpcyBjb2RlIHBhdGggaXMgbmV2ZXIKKwkgICB0YWtlbi4gKi8KKworICAgICAgY291bnRfdHJhaWxpbmdfemVyb3MgKGJ0d29zLCBibG93KTsKKyAgICAgIGJsb3cgPj49IGJ0d29zOworCisgICAgICBpZiAoYnNpemUgPiAxICYmIGJ0d29zID4gMCkKKwl7CisJICBtcF9saW1iX3QgYjEgPSBic3JjcFsxXTsKKwkgIGJsb3cgfD0gYjEgPDwgKEdNUF9OVU1CX0JJVFMgLSBidHdvcyk7CisJICBpZiAoYnNpemUgPT0gMiAmJiAoYjEgPj4gYnR3b3MpID09IDApCisJICAgIGJzaXplID0gMTsKKwl9CisKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9SRUNJUF9VVV9CSVQxIChhbG93LCBibG93KTsKKyAgICB9CisKKyAgaWYgKGJzaXplID09IDEpCisgICAgeworICAgICAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX1RXT1NfVV9CSVQxKGJ0d29zLCBhbG93KTsKKworICAgICAgaWYgKGJsb3cgPT0gMSkKKwlyZXR1cm4gSkFDT0JJX0JJVDFfVE9fUE4gKHJlc3VsdF9iaXQxKTsKKworICAgICAgaWYgKGFzaXplID4gMSkKKwlKQUNPQklfTU9EX09SX01PREVYQUNUXzFfT0REIChyZXN1bHRfYml0MSwgYWxvdywgYXNyY3AsIGFzaXplLCBibG93KTsKKworICAgICAgcmV0dXJuIG1wbl9qYWNvYmlfYmFzZSAoYWxvdywgYmxvdywgcmVzdWx0X2JpdDEpOworICAgIH0KKworICAvKiBBbGxvY2F0aW9uIHN0cmF0ZWd5OiBGb3IgQSwgd2UgYWxsb2NhdGUgYSB3b3JraW5nIGNvcHkgb25seSBmb3IgQSAlIEIsIGJ1dAorICAgICB3aGVuIEEgaXMgbXVjaCBsYXJnZXIgdGhhbiBCLCB3ZSBoYXZlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbGFyZ2UKKyAgICAgcXVvdGllbnQuIFdlIHVzZSB0aGUgc2FtZSBhcmVhLCBwb2ludGVkIHRvIGJ5IGJwLCBmb3IgYm90aCB0aGUgcXVvdGllbnQKKyAgICAgQS9CIGFuZCB0aGUgd29ya2luZyBjb3B5IG9mIEIuICovCisKKyAgVE1QX01BUks7CisKKyAgaWYgKGFzaXplID49IDIqYnNpemUpCisgICAgVE1QX0FMTE9DX0xJTUJTXzIgKGFwLCBic2l6ZSwgYnAsIGFzaXplIC0gYnNpemUgKyAxKTsKKyAgZWxzZQorICAgIFRNUF9BTExPQ19MSU1CU18yIChhcCwgYnNpemUsIGJwLCBic2l6ZSk7CisKKyAgLyogSW4gdGhlIGNhc2Ugb2YgZXZlbiBCLCB3ZSBjb25jZXB0dWFsbHkgc2hpZnQgb3V0IHRoZSBwb3dlcnMgb2YgdHdvIGZpcnN0LAorICAgICBhbmQgdGhlbiBkaXZpZGUgQSBtb2QgQi4gSGVuY2UsIHdoZW4gdGFraW5nIHRob3NlIHBvd2VycyBvZiB0d28gaW50bworICAgICBhY2NvdW50LCB3ZSBtdXN0IHVzZSBhbG93ICpiZWZvcmUqIHRoZSBkaXZpc2lvbi4gRG9pbmcgdGhlIGFjdHVhbCBkaXZpc2lvbgorICAgICBmaXJzdCBpcyBvaywgYmVjYXVzZSB0aGUgcG9pbnQgaXMgdG8gcmVtb3ZlIG11bHRpcGxlcyBvZiBCIGZyb20gQSwgYW5kCisgICAgIG11bHRpcGxlcyBvZiAyXmsgQiBhcmUgZ29vZCBlbm91Z2guICovCisgIGlmIChhc2l6ZSA+IGJzaXplKQorICAgIG1wbl90ZGl2X3FyIChicCwgYXAsIDAsIGFzcmNwLCBhc2l6ZSwgYnNyY3AsIGJzaXplKTsKKyAgZWxzZQorICAgIE1QTl9DT1BZIChhcCwgYXNyY3AsIGJzaXplKTsKKworICBpZiAoYnR3b3MgPiAwKQorICAgIHsKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9UV09TX1VfQklUMShidHdvcywgYWxvdyk7CisKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChtcG5fcnNoaWZ0IChicCwgYnNyY3AsIGJzaXplLCBidHdvcykpOworICAgICAgYnNpemUgLT0gKGFwW2JzaXplLTFdIHwgYnBbYnNpemUtMV0pID09IDA7CisgICAgfQorICBlbHNlCisgICAgTVBOX0NPUFkgKGJwLCBic3JjcCwgYnNpemUpOworCisgIEFTU0VSVCAoYmxvdyA9PSBicFswXSk7CisgIHJlcyA9IG1wbl9qYWNvYmlfbiAoYXAsIGJwLCBic2l6ZSwKKwkJICAgICAgbXBuX2phY29iaV9pbml0IChhcFswXSwgYmxvdywgKHJlc3VsdF9iaXQxPj4xKSAmIDEpKTsKKworICBUTVBfRlJFRTsKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL21wei9rcm9uc3ouYyBiL21wei9rcm9uc3ouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNjOTcxCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2tyb25zei5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBtcHpfc2lfa3JvbmVja2VyIC0tIGxvbmcrbXB6IEtyb25lY2tlci9KYWNvYmkgc3ltYm9sLgorCitDb3B5cmlnaHQgMTk5OS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKK2ludAorbXB6X3NpX2tyb25lY2tlciAobG9uZyBhLCBtcHpfc3JjcHRyIGIpCit7CisgIG1wX3NyY3B0ciAgYl9wdHI7CisgIG1wX2xpbWJfdCAgYl9sb3c7CisgIG1wX3NpemVfdCAgYl9zaXplOworICBtcF9zaXplX3QgIGJfYWJzX3NpemU7CisgIG1wX2xpbWJfdCAgYV9saW1iLCBiX3JlbTsKKyAgdW5zaWduZWQgICB0d29zOworICBpbnQgICAgICAgIHJlc3VsdF9iaXQxOworCisjaWYgR01QX05VTUJfQklUUyA8IEJJVFNfUEVSX1VMT05HCisgIGlmIChhID4gR01QX05VTUJfTUFYIHx8IGEgPCAtR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCAgYWxpbWJzWzJdOworICAgICAgbXB6X3QgICAgICBhejsKKyAgICAgIEFMTE9DKGF6KSA9IG51bWJlcm9mIChhbGltYnMpOworICAgICAgUFRSKGF6KSA9IGFsaW1iczsKKyAgICAgIG1wel9zZXRfc2kgKGF6LCBhKTsKKyAgICAgIHJldHVybiBtcHpfa3JvbmVja2VyIChheiwgYik7CisgICAgfQorI2VuZGlmCisKKyAgYl9zaXplID0gU0laIChiKTsKKyAgaWYgKGJfc2l6ZSA9PSAwKQorICAgIHJldHVybiBKQUNPQklfUzAgKGEpOyAgLyogKGEvMCkgKi8KKworICAvKiBhY2NvdW50IGZvciB0aGUgZWZmZWN0IG9mIHRoZSBzaWduIG9mIGIsIHRoZW4gaWdub3JlIGl0ICovCisgIHJlc3VsdF9iaXQxID0gSkFDT0JJX0JTR05fU1NfQklUMSAoYSwgYl9zaXplKTsKKworICBiX3B0ciA9IFBUUihiKTsKKyAgYl9sb3cgPSBiX3B0clswXTsKKyAgYl9hYnNfc2l6ZSA9IEFCUyAoYl9zaXplKTsKKworICBpZiAoKGJfbG93ICYgMSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBiIG9kZCAqLworCisgICAgICByZXN1bHRfYml0MSBePSBKQUNPQklfQVNHTl9TVV9CSVQxIChhLCBiX2xvdyk7CisgICAgICBhX2xpbWIgPSBBQlNfQ0FTVChtcF9saW1iX3QsIGEpOworCisgICAgICBpZiAoKGFfbGltYiAmIDEpID09IDApCisJeworCSAgLyogKDAvYik9MSBmb3IgYj0rLy0xLCAwIG90aGVyd2lzZSAqLworCSAgaWYgKGFfbGltYiA9PSAwKQorCSAgICByZXR1cm4gKGJfYWJzX3NpemUgPT0gMSAmJiBiX2xvdyA9PSAxKTsKKworCSAgLyogYSBldmVuLCBiIG9kZCAqLworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKHR3b3MsIGFfbGltYik7CisJICBhX2xpbWIgPj49IHR3b3M7CisJICAvKiAoYSoyXm4vYikgPSAoYS9iKSAqIHR3b3MobixhKSAqLworCSAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX1RXT1NfVV9CSVQxICh0d29zLCBiX2xvdyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIChldmVuL2V2ZW4pPTAsIGFuZCAoMC9iKT0wIGZvciBiIT0rLy0xICovCisgICAgICBpZiAoKGEgJiAxKSA9PSAwKQorCXJldHVybiAwOworCisgICAgICAvKiBhIG9kZCwgYiBldmVuCisKKwkgRXN0YWJsaXNoIHNoaWZ0ZWQgYl9sb3cgd2l0aCB2YWxpZCBiaXQxIGZvciBBU0dOIGFuZCBSRUNJUCBiZWxvdy4KKwkgWmVybyBsaW1icyBzdHJpcHBlZCBhcmUgYWNjb3VudGVkIGZvciwgYnV0IHplcm8gYml0cyBvbiBiX2xvdyBhcmUKKwkgbm90IGJlY2F1c2UgdGhleSByZW1haW4gaW4ge2JfcHRyLGJfYWJzX3NpemV9IGZvciB0aGUKKwkgSkFDT0JJX01PRF9PUl9NT0RFWEFDVF8xX09ERC4gKi8KKworICAgICAgSkFDT0JJX1NUUklQX0xPV19aRVJPUyAocmVzdWx0X2JpdDEsIGEsIGJfcHRyLCBiX2Fic19zaXplLCBiX2xvdyk7CisgICAgICBpZiAoKGJfbG93ICYgMSkgPT0gMCkKKwl7CisJICBpZiAoVU5MSUtFTFkgKGJfbG93ID09IEdNUF9OVU1CX0hJR0hCSVQpKQorCSAgICB7CisJICAgICAgLyogbmVlZCBiX3B0clsxXSB0byBnZXQgYml0MSBpbiBiX2xvdyAqLworCSAgICAgIGlmIChiX2Fic19zaXplID09IDEpCisJCXsKKwkJICAvKiAoYS8weDgwMDAwMDAwKSA9IChhLzIpXihCUE1MLTEpICovCisJCSAgaWYgKChHTVBfTlVNQl9CSVRTICUgMikgPT0gMCkKKwkJICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9UV09fVV9CSVQxIChhKTsKKwkJICByZXR1cm4gSkFDT0JJX0JJVDFfVE9fUE4gKHJlc3VsdF9iaXQxKTsKKwkJfQorCisJICAgICAgLyogYl9hYnNfc2l6ZSA+IDEgKi8KKwkgICAgICBiX2xvdyA9IGJfcHRyWzFdIDw8IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBiX2xvdyk7CisJICAgICAgYl9sb3cgPj49IHR3b3M7CisJICAgIH0KKwl9CisKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9BU0dOX1NVX0JJVDEgKGEsIGJfbG93KTsKKyAgICAgIGFfbGltYiA9ICh1bnNpZ25lZCBsb25nKSBBQlMoYSk7CisgICAgfQorCisgIGlmIChhX2xpbWIgPT0gMSkKKyAgICByZXR1cm4gSkFDT0JJX0JJVDFfVE9fUE4gKHJlc3VsdF9iaXQxKTsgIC8qICgxL2IpPTEgKi8KKworICAvKiAoYS9iKjJebikgPSAoYioyXm4gbW9kIGEgLyBhKSAqIHJlY2lwKGEsYikgKi8KKyAgSkFDT0JJX01PRF9PUl9NT0RFWEFDVF8xX09ERCAocmVzdWx0X2JpdDEsIGJfcmVtLCBiX3B0ciwgYl9hYnNfc2l6ZSwgYV9saW1iKTsKKyAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX1JFQ0lQX1VVX0JJVDEgKGFfbGltYiwgYl9sb3cpOworICByZXR1cm4gbXBuX2phY29iaV9iYXNlIChiX3JlbSwgYV9saW1iLCByZXN1bHRfYml0MSk7Cit9CmRpZmYgLS1naXQgYS9tcHova3JvbnV6LmMgYi9tcHova3JvbnV6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1YzZkZAotLS0gL2Rldi9udWxsCisrKyBiL21wei9rcm9udXouYwpAQCAtMCwwICsxLDEyOSBAQAorLyogbXB6X3VpX2tyb25lY2tlciAtLSB1bG9uZyttcHogS3JvbmVja2VyL0phY29iaSBzeW1ib2wuCisKK0NvcHlyaWdodCAxOTk5LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworaW50CittcHpfdWlfa3JvbmVja2VyICh1bnNpZ25lZCBsb25nIGEsIG1wel9zcmNwdHIgYikKK3sKKyAgbXBfc3JjcHRyICBiX3B0cjsKKyAgbXBfbGltYl90ICBiX2xvdzsKKyAgaW50ICAgICAgICBiX2Fic19zaXplOworICBtcF9saW1iX3QgIGJfcmVtOworICBpbnQgICAgICAgIHR3b3M7CisgIGludCAgICAgICAgcmVzdWx0X2JpdDE7CisKKyAgLyogKGEvLTEpPTEgd2hlbiBhPj0wLCBzbyB0aGUgc2lnbiBvZiBiIGlzIGlnbm9yZWQgKi8KKyAgYl9hYnNfc2l6ZSA9IEFCU0laIChiKTsKKworICBpZiAoYl9hYnNfc2l6ZSA9PSAwKQorICAgIHJldHVybiBKQUNPQklfVTAgKGEpOyAgLyogKGEvMCkgKi8KKworICBpZiAoYSA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGFsaW1ic1syXTsKKyAgICAgIG1wel90ICAgICAgYXo7CisgICAgICBBTExPQyhheikgPSBudW1iZXJvZiAoYWxpbWJzKTsKKyAgICAgIFBUUihheikgPSBhbGltYnM7CisgICAgICBtcHpfc2V0X3VpIChheiwgYSk7CisgICAgICByZXR1cm4gbXB6X2tyb25lY2tlciAoYXosIGIpOworICAgIH0KKworICBiX3B0ciA9IFBUUihiKTsKKyAgYl9sb3cgPSBiX3B0clswXTsKKyAgcmVzdWx0X2JpdDEgPSAwOworCisgIGlmICghIChiX2xvdyAmIDEpKQorICAgIHsKKyAgICAgIC8qICgwL2IpPTAgZm9yIGIhPSsvLTE7IGFuZCAoZXZlbi9ldmVuKT0wICovCisgICAgICBpZiAoISAoYSAmIDEpKQorCXJldHVybiAwOworCisgICAgICAvKiBhIG9kZCwgYiBldmVuCisKKwkgRXN0YWJsaXNoIHNoaWZ0ZWQgYl9sb3cgd2l0aCB2YWxpZCBiaXQxIGZvciB0aGUgUkVDSVAgYmVsb3cuICBaZXJvCisJIGxpbWJzIHN0cmlwcGVkIGFyZSBhY2NvdW50ZWQgZm9yLCBidXQgemVybyBiaXRzIG9uIGJfbG93IGFyZSBub3QKKwkgYmVjYXVzZSB0aGV5IHJlbWFpbiBpbiB7Yl9wdHIsYl9hYnNfc2l6ZX0gZm9yCisJIEpBQ09CSV9NT0RfT1JfTU9ERVhBQ1RfMV9PREQuICovCisKKyAgICAgIEpBQ09CSV9TVFJJUF9MT1dfWkVST1MgKHJlc3VsdF9iaXQxLCBhLCBiX3B0ciwgYl9hYnNfc2l6ZSwgYl9sb3cpOworICAgICAgaWYgKCEgKGJfbG93ICYgMSkpCisJeworCSAgaWYgKFVOTElLRUxZIChiX2xvdyA9PSBHTVBfTlVNQl9ISUdIQklUKSkKKwkgICAgeworCSAgICAgIC8qIG5lZWQgYl9wdHJbMV0gdG8gZ2V0IGJpdDEgaW4gYl9sb3cgKi8KKwkgICAgICBpZiAoYl9hYnNfc2l6ZSA9PSAxKQorCQl7CisJCSAgLyogKGEvMHg4MC4uLjAwKSA9PSAoYS8yKV4oTlVNQi0xKSAqLworCQkgIGlmICgoR01QX05VTUJfQklUUyAlIDIpID09IDApCisJCSAgICB7CisJCSAgICAgIC8qIEpBQ09CSV9TVFJJUF9MT1dfWkVST1MgZG9lcyBub3RoaW5nIHRvIHJlc3VsdF9iaXQxCisJCQkgd2hlbiBHTVBfTlVNQl9CSVRTIGlzIGV2ZW4sIHNvIGl0J3Mgc3RpbGwgMC4gKi8KKwkJICAgICAgQVNTRVJUIChyZXN1bHRfYml0MSA9PSAwKTsKKwkJICAgICAgcmVzdWx0X2JpdDEgPSBKQUNPQklfVFdPX1VfQklUMSAoYSk7CisJCSAgICB9CisJCSAgcmV0dXJuIEpBQ09CSV9CSVQxX1RPX1BOIChyZXN1bHRfYml0MSk7CisJCX0KKworCSAgICAgIC8qIGJfYWJzX3NpemUgPiAxICovCisJICAgICAgYl9sb3cgPSBiX3B0clsxXSA8PCAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAodHdvcywgYl9sb3cpOworCSAgICAgIGJfbG93ID4+PSB0d29zOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhID09IDApICAgICAgICAvKiAoMC9iKT0xIGZvciBiPSsvLTEsIDAgb3RoZXJ3aXNlICovCisJcmV0dXJuIChiX2Fic19zaXplID09IDEgJiYgYl9sb3cgPT0gMSk7CisKKyAgICAgIGlmICghIChhICYgMSkpCisJeworCSAgLyogYSBldmVuLCBiIG9kZCAqLworCSAgY291bnRfdHJhaWxpbmdfemVyb3MgKHR3b3MsIGEpOworCSAgYSA+Pj0gdHdvczsKKwkgIC8qIChhKjJebi9iKSA9IChhL2IpICogKDIvYSlebiAqLworCSAgcmVzdWx0X2JpdDEgPSBKQUNPQklfVFdPU19VX0JJVDEgKHR3b3MsIGJfbG93KTsKKwl9CisgICAgfQorCisgIGlmIChhID09IDEpCisgICAgcmV0dXJuIEpBQ09CSV9CSVQxX1RPX1BOIChyZXN1bHRfYml0MSk7ICAvKiAoMS9iKT0xICovCisKKyAgLyogKGEvYioyXm4pID0gKGIqMl5uIG1vZCBhIC8gYSkgKiBSRUNJUChhLGIpICovCisgIEpBQ09CSV9NT0RfT1JfTU9ERVhBQ1RfMV9PREQgKHJlc3VsdF9iaXQxLCBiX3JlbSwgYl9wdHIsIGJfYWJzX3NpemUsIGEpOworICByZXN1bHRfYml0MSBePSBKQUNPQklfUkVDSVBfVVVfQklUMSAoYSwgYl9sb3cpOworICByZXR1cm4gbXBuX2phY29iaV9iYXNlIChiX3JlbSwgKG1wX2xpbWJfdCkgYSwgcmVzdWx0X2JpdDEpOworfQpkaWZmIC0tZ2l0IGEvbXB6L2tyb256cy5jIGIvbXB6L2tyb256cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjNmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHova3JvbnpzLmMKQEAgLTAsMCArMSw5MiBAQAorLyogbXB6X2tyb25lY2tlcl9zaSAtLSBtcHorbG9uZyBLcm9uZWNrZXIvSmFjb2JpIHN5bWJvbC4KKworQ29weXJpZ2h0IDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBBZnRlciB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYiBpcyBlc3RhYmxpc2hlZCBpdCdzIHRyZWF0ZWQgYXMgYW4gdW5zaWduZWQKKyAgIGxvbmcsIGJlY2F1c2UgMHg4MC4uMDAgZG9lc24ndCBmaXQgaW4gYSBzaWduZWQgbG9uZy4gKi8KKworaW50CittcHpfa3JvbmVja2VyX3NpIChtcHpfc3JjcHRyIGEsIGxvbmcgYikKK3sKKyAgbXBfc3JjcHRyICBhX3B0cjsKKyAgbXBfc2l6ZV90ICBhX3NpemU7CisgIG1wX2xpbWJfdCAgYV9yZW0sIGJfbGltYjsKKyAgaW50ICAgICAgICByZXN1bHRfYml0MTsKKworICBhX3NpemUgPSBTSVooYSk7CisgIGlmIChhX3NpemUgPT0gMCkKKyAgICByZXR1cm4gSkFDT0JJXzBTIChiKTsKKworI2lmIEdNUF9OVU1CX0JJVFMgPCBCSVRTX1BFUl9VTE9ORworICBpZiAoYiA+IEdNUF9OVU1CX01BWCB8fCBiIDwgLUdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGJsaW1ic1syXTsKKyAgICAgIG1wel90ICAgICAgYno7CisgICAgICBBTExPQyhieikgPSBudW1iZXJvZiAoYmxpbWJzKTsKKyAgICAgIFBUUihieikgPSBibGltYnM7CisgICAgICBtcHpfc2V0X3NpIChieiwgYik7CisgICAgICByZXR1cm4gbXB6X2tyb25lY2tlciAoYSwgYnopOworICAgIH0KKyNlbmRpZgorCisgIHJlc3VsdF9iaXQxID0gSkFDT0JJX0JTR05fU1NfQklUMSAoYV9zaXplLCBiKTsKKyAgYl9saW1iID0gQUJTX0NBU1QgKHVuc2lnbmVkIGxvbmcsIGIpOworICBhX3B0ciA9IFBUUihhKTsKKworICBpZiAoKGJfbGltYiAmIDEpID09IDApCisgICAgeworICAgICAgbXBfbGltYl90ICBhX2xvdyA9IGFfcHRyWzBdOworICAgICAgaW50ICAgICAgICB0d29zOworCisgICAgICBpZiAoYl9saW1iID09IDApCisJcmV0dXJuIEpBQ09CSV9MUzAgKGFfbG93LCBhX3NpemUpOyAgIC8qIChhLzApICovCisKKyAgICAgIGlmICghIChhX2xvdyAmIDEpKQorCXJldHVybiAwOyAgLyogKGV2ZW4vZXZlbik9MCAqLworCisgICAgICAvKiAoYS8yKT0oMi9hKSBmb3IgYSBvZGQgKi8KKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zICh0d29zLCBiX2xpbWIpOworICAgICAgYl9saW1iID4+PSB0d29zOworICAgICAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX1RXT1NfVV9CSVQxICh0d29zLCBhX2xvdyk7CisgICAgfQorCisgIGlmIChiX2xpbWIgPT0gMSkKKyAgICByZXR1cm4gSkFDT0JJX0JJVDFfVE9fUE4gKHJlc3VsdF9iaXQxKTsgIC8qIChhLzEpPTEgZm9yIGFueSBhICovCisKKyAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX0FTR05fU1VfQklUMSAoYV9zaXplLCBiX2xpbWIpOworICBhX3NpemUgPSBBQlMoYV9zaXplKTsKKworICAvKiAoYS9iKSA9IChhIG1vZCBiIC8gYikgKi8KKyAgSkFDT0JJX01PRF9PUl9NT0RFWEFDVF8xX09ERCAocmVzdWx0X2JpdDEsIGFfcmVtLCBhX3B0ciwgYV9zaXplLCBiX2xpbWIpOworICByZXR1cm4gbXBuX2phY29iaV9iYXNlIChhX3JlbSwgYl9saW1iLCByZXN1bHRfYml0MSk7Cit9CmRpZmYgLS1naXQgYS9tcHova3Jvbnp1LmMgYi9tcHova3Jvbnp1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmYmY3OQotLS0gL2Rldi9udWxsCisrKyBiL21wei9rcm9uenUuYwpAQCAtMCwwICsxLDg4IEBACisvKiBtcHpfa3JvbmVja2VyX3VpIC0tIG1weit1bG9uZyBLcm9uZWNrZXIvSmFjb2JpIHN5bWJvbC4KKworQ29weXJpZ2h0IDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCitpbnQKK21wel9rcm9uZWNrZXJfdWkgKG1wel9zcmNwdHIgYSwgdW5zaWduZWQgbG9uZyBiKQoreworICBtcF9zcmNwdHIgIGFfcHRyOworICBtcF9zaXplX3QgIGFfc2l6ZTsKKyAgbXBfbGltYl90ICBhX3JlbTsKKyAgaW50ICAgICAgICByZXN1bHRfYml0MTsKKworICBhX3NpemUgPSBTSVooYSk7CisgIGlmIChhX3NpemUgPT0gMCkKKyAgICByZXR1cm4gSkFDT0JJXzBVIChiKTsKKworICBpZiAoYiA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGJsaW1ic1syXTsKKyAgICAgIG1wel90ICAgICAgYno7CisgICAgICBBTExPQyhieikgPSBudW1iZXJvZiAoYmxpbWJzKTsKKyAgICAgIFBUUihieikgPSBibGltYnM7CisgICAgICBtcHpfc2V0X3VpIChieiwgYik7CisgICAgICByZXR1cm4gbXB6X2tyb25lY2tlciAoYSwgYnopOworICAgIH0KKworICBhX3B0ciA9IFBUUihhKTsKKyAgaWYgKChiICYgMSkgIT0gMCkKKyAgICB7CisgICAgICByZXN1bHRfYml0MSA9IEpBQ09CSV9BU0dOX1NVX0JJVDEgKGFfc2l6ZSwgYik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90ICBhX2xvdyA9IGFfcHRyWzBdOworICAgICAgaW50ICAgICAgICB0d29zOworCisgICAgICBpZiAoYiA9PSAwKQorCXJldHVybiBKQUNPQklfTFMwIChhX2xvdywgYV9zaXplKTsgICAvKiAoYS8wKSAqLworCisgICAgICBpZiAoISAoYV9sb3cgJiAxKSkKKwlyZXR1cm4gMDsgIC8qIChldmVuL2V2ZW4pPTAgKi8KKworICAgICAgLyogKGEvMik9KDIvYSkgZm9yIGEgb2RkICovCisgICAgICBjb3VudF90cmFpbGluZ196ZXJvcyAodHdvcywgYik7CisgICAgICBiID4+PSB0d29zOworICAgICAgcmVzdWx0X2JpdDEgPSAoSkFDT0JJX1RXT1NfVV9CSVQxICh0d29zLCBhX2xvdykKKwkJICAgICBeIEpBQ09CSV9BU0dOX1NVX0JJVDEgKGFfc2l6ZSwgYikpOworICAgIH0KKworICBpZiAoYiA9PSAxKQorICAgIHJldHVybiBKQUNPQklfQklUMV9UT19QTiAocmVzdWx0X2JpdDEpOyAgLyogKGEvMSk9MSBmb3IgYW55IGEgKi8KKworICBhX3NpemUgPSBBQlMoYV9zaXplKTsKKworICAvKiAoYS9iKSA9IChhIG1vZCBiIC8gYikgKi8KKyAgSkFDT0JJX01PRF9PUl9NT0RFWEFDVF8xX09ERCAocmVzdWx0X2JpdDEsIGFfcmVtLCBhX3B0ciwgYV9zaXplLCBiKTsKKyAgcmV0dXJuIG1wbl9qYWNvYmlfYmFzZSAoYV9yZW0sIChtcF9saW1iX3QpIGIsIHJlc3VsdF9iaXQxKTsKK30KZGlmZiAtLWdpdCBhL21wei9sY20uYyBiL21wei9sY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA3ZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2xjbS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIG1wel9sY20gLS0gbXB6L21weiBsZWFzdCBjb21tb24gbXVsdGlwbGUuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X2xjbSAobXB6X3B0ciByLCBtcHpfc3JjcHRyIHUsIG1wel9zcmNwdHIgdikKK3sKKyAgbXB6X3QgZzsKKyAgbXBfc2l6ZV90IHVzaXplLCB2c2l6ZTsKKyAgVE1QX0RFQ0w7CisKKyAgdXNpemUgPSBTSVogKHUpOworICB2c2l6ZSA9IFNJWiAodik7CisgIGlmICh1c2l6ZSA9PSAwIHx8IHZzaXplID09IDApCisgICAgeworICAgICAgU0laIChyKSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICB1c2l6ZSA9IEFCUyAodXNpemUpOworICB2c2l6ZSA9IEFCUyAodnNpemUpOworCisgIGlmICh2c2l6ZSA9PSAxIHx8IHVzaXplID09IDEpCisgICAgeworICAgICAgbXBfbGltYl90ICB2bCwgZ2wsIGM7CisgICAgICBtcF9zcmNwdHIgIHVwOworICAgICAgbXBfcHRyICAgICBycDsKKworICAgICAgaWYgKHVzaXplID09IDEpCisJeworCSAgdXNpemUgPSB2c2l6ZTsKKwkgIE1QWl9TUkNQVFJfU1dBUCAodSwgdik7CisJfQorCisgICAgICBNUFpfUkVBTExPQyAociwgdXNpemUrMSk7CisKKyAgICAgIHVwID0gUFRSKHUpOworICAgICAgdmwgPSBQVFIodilbMF07CisgICAgICBnbCA9IG1wbl9nY2RfMSAodXAsIHVzaXplLCB2bCk7CisgICAgICB2bCAvPSBnbDsKKworICAgICAgcnAgPSBQVFIocik7CisgICAgICBjID0gbXBuX211bF8xIChycCwgdXAsIHVzaXplLCB2bCk7CisgICAgICBycFt1c2l6ZV0gPSBjOworICAgICAgdXNpemUgKz0gKGMgIT0gMCk7CisgICAgICBTSVoocikgPSB1c2l6ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisgIE1QWl9UTVBfSU5JVCAoZywgdXNpemUpOyAvKiB2ICE9IDAgaW1wbGllcyB8Z2NkKHUsdil8IDw9IHx1fCAqLworCisgIG1wel9nY2QgKGcsIHUsIHYpOworICBtcHpfZGl2ZXhhY3QgKGcsIHUsIGcpOworICBtcHpfbXVsIChyLCBnLCB2KTsKKworICBTSVogKHIpID0gQUJTIChTSVogKHIpKTsJLyogcmVzdWx0IGFsd2F5cyBwb3NpdGl2ZSAqLworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L2xjbV91aS5jIGIvbXB6L2xjbV91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTk5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbGNtX3VpLmMKQEAgLTAsMCArMSw3OCBAQAorLyogbXB6X2xjbV91aSAtLSBsZWFzdCBjb21tb24gbXVsdGlwbGUgb2YgbXB6IGFuZCB1bG9uZy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKwordm9pZAorbXB6X2xjbV91aSAobXB6X3B0ciByLCBtcHpfc3JjcHRyIHUsIHVuc2lnbmVkIGxvbmcgdikKK3sKKyAgbXBfc2l6ZV90ICAgICAgdXNpemU7CisgIG1wX3NyY3B0ciAgICAgIHVwOworICBtcF9wdHIgICAgICAgICBycDsKKyAgdW5zaWduZWQgbG9uZyAgZzsKKyAgbXBfbGltYl90ICAgICAgYzsKKworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmICh2ID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wel90IHZ6OworICAgICAgbXBfbGltYl90IHZsaW1ic1syXTsKKyAgICAgIHZsaW1ic1swXSA9IHYgJiBHTVBfTlVNQl9NQVNLOworICAgICAgdmxpbWJzWzFdID0gdiA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgUFRSKHZ6KSA9IHZsaW1iczsKKyAgICAgIFNJWih2eikgPSAyOworICAgICAgbXB6X2xjbSAociwgdSwgdnopOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgIC8qIHJlc3VsdCB6ZXJvIGlmIGVpdGhlciBvcGVyYW5kIHplcm8gKi8KKyAgdXNpemUgPSBTSVoodSk7CisgIGlmICh1c2l6ZSA9PSAwIHx8IHYgPT0gMCkKKyAgICB7CisgICAgICBTSVoocikgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKyAgdXNpemUgPSBBQlModXNpemUpOworCisgIE1QWl9SRUFMTE9DIChyLCB1c2l6ZSsxKTsKKworICB1cCA9IFBUUih1KTsKKyAgZyA9ICh1bnNpZ25lZCBsb25nKSBtcG5fZ2NkXzEgKHVwLCB1c2l6ZSwgKG1wX2xpbWJfdCkgdik7CisgIHYgLz0gZzsKKworICBycCA9IFBUUihyKTsKKyAgYyA9IG1wbl9tdWxfMSAocnAsIHVwLCB1c2l6ZSwgKG1wX2xpbWJfdCkgdik7CisgIHJwW3VzaXplXSA9IGM7CisgIHVzaXplICs9IChjICE9IDApOworICBTSVoocikgPSB1c2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9saW1ic19maW5pc2guYyBiL21wei9saW1ic19maW5pc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDI4MzlkCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2xpbWJzX2ZpbmlzaC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIG1wel9maW5pc2hfbGltYnMgLS0gVXBkYXRlIG1weiBhZnRlciB3cml0aW5nIHRvIHRoZSBsaW1iIGFycmF5LgorCitDb3B5cmlnaHQgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9saW1ic19maW5pc2ggKG1wel9wdHIgeCwgbXBfc2l6ZV90IHhzKQoreworICBtcF9zaXplX3QgeG4gPSBBQlMoeHMpOworICBNUE5fTk9STUFMSVpFIChQVFIgKHgpLCB4bik7CisgIFNJWiAoeCkgPSB4cyA8IDAgPyAteG4gOiB4bjsKK30KZGlmZiAtLWdpdCBhL21wei9saW1ic19tb2RpZnkuYyBiL21wei9saW1ic19tb2RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc4YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L2xpbWJzX21vZGlmeS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIG1wel9saW1ic19tb2RpZnkgLS0gUmVhZC1hbmQtbW9kaWZ5IGFjY2VzcyB0byB0aGUgbXBuLXN0eWxlIGxpbWIgYXJyYXkuCisKK0NvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworbXBfcHRyCittcHpfbGltYnNfbW9kaWZ5IChtcHpfcHRyIHgsIG1wX3NpemVfdCBuKQoreworICBBU1NFUlQgKG4gPiAwKTsKKyAgcmV0dXJuIE1QWl9SRUFMTE9DICh4LCBuKTsKK30KZGlmZiAtLWdpdCBhL21wei9saW1ic19yZWFkLmMgYi9tcHovbGltYnNfcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWYwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbGltYnNfcmVhZC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIG1wel9saW1ic19yZWFkIC0tIFJlYWQgYWNjZXNzIHRvIHRoZSBtcG4tc3R5bGUgbGltYiBhcnJheS4KKworQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCittcF9zcmNwdHIKK21wel9saW1ic19yZWFkIChtcHpfc3JjcHRyIHgpCit7CisgIHJldHVybiBQVFIoeCk7Cit9CmRpZmYgLS1naXQgYS9tcHovbGltYnNfd3JpdGUuYyBiL21wei9saW1ic193cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTZhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbGltYnNfd3JpdGUuYwpAQCAtMCwwICsxLDM4IEBACisvKiBtcHpfbGltYnNfd3JpdGUgLS0gV3JpdGUgYWNjZXNzIHRvIHRoZSBtcG4tc3R5bGUgbGltYiBhcnJheS4KKworQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCittcF9wdHIKK21wel9saW1ic193cml0ZSAobXB6X3B0ciB4LCBtcF9zaXplX3QgbikKK3sKKyAgQVNTRVJUIChuID4gMCk7CisgIHJldHVybiBNUFpfTkVXQUxMT0MgKHgsIG4pOworfQpkaWZmIC0tZ2l0IGEvbXB6L2x1Y21vZC5jIGIvbXB6L2x1Y21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWQ0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbHVjbW9kLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIG1wel9sdWNhc19tb2QgLS0gSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc3Ryb25nIEx1Y2FzCisgICBwcmltYWxpdHkgdGVzdC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitDb250cmlidXRlZCBieSBNYXJjbyBCb2RyYXRvLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogQ29tcHV0ZXMgVl97aysxfSwgUV57aysxfSAobW9kIG4pIGZvciB0aGUgTHVjYXMnIHNlcXVlbmNlCSovCisvKiB3aXRoIFA9MSwgUT1ROyBrID0gbj4+YjAuCSovCisvKiBSZXF1aXJlcyBuID4gNDsgYjAgPiAwOyAtMipRIG11c3Qgbm90IG92ZXJmbG93IGEgbG9uZy4JKi8KKy8qIElmIFVfe2srMX09PTAgKG1vZCBuKSBvciBWX3trKzF9PT0wIChtb2QgbiksIGl0IHJldHVybnMgMSwJKi8KKy8qIG90aGVyd2lzZSBpdCByZXR1cm5zIDAgYW5kIHNldHMgVj1WX3trKzF9IGFuZCBRaz1RXntrKzF9LgkqLworLyogViB3aWxsIG5ldmVyIGdyb3cgYmV5b25kIFNJWihuKSwgUWsgbm90IGJleW9uZCAyKlNJWihuKS4JKi8KK2ludAorbXB6X2x1Y2FzX21vZCAobXB6X3B0ciBWLCBtcHpfcHRyIFFrLCBsb25nIFEsCisJICAgICAgIG1wX2JpdGNudF90IGIwLCBtcHpfc3JjcHRyIG4sIG1wel9wdHIgVDEsIG1wel9wdHIgVDIpCit7CisgIG1wX2JpdGNudF90IGJzOworICBpbnQgcmVzOworCisgIEFTU0VSVCAoYjAgPiAwKTsKKyAgQVNTRVJUIChTSVogKG4pID4gMSB8fCBTSVogKG4pID4gMCAmJiBQVFIgKG4pIFswXSA+IDQpOworCisgIG1wel9zZXRfdWkgKFYsIDEpOyAvKiBVMSA9IDEgKi8KKyAgYnMgPSBtcHpfc2l6ZWluYmFzZSAobiwgMikgLSAyOworICBpZiAoVU5MSUtFTFkgKGJzIDwgYjApKQorICAgIHsKKyAgICAgIC8qIG4gPSAyXmIwIC0gMSwgc2hvdWxkIHdlIHVzZSBMdWNhcy1MZWhtZXIgaW5zdGVhZD8gKi8KKyAgICAgIEFTU0VSVCAoYnMgPT0gYjAgLSAyKTsKKyAgICAgIG1wel9zZXRfc2kgKFFrLCBRKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgbXB6X3NldF91aSAoUWssIDEpOyAvKiBVMiA9IDEgKi8KKworICBkbworICAgIHsKKyAgICAgIC8qIFdlIHVzZSB0aGUgaXRlcmF0aW9uIHN1Z2dlc3RlZCBpbiAiRWxlbWVudGFyeSBOdW1iZXIgVGhlb3J5IgkqLworICAgICAgLyogYnkgUGV0ZXIgSGFja21hbiAoTm92ZW1iZXIgMSwgMjAwOSksIHNlY3Rpb24gIkwuWFZJSSBTY2FsYXIJKi8KKyAgICAgIC8qIEZvcm11bGFzIiwgZnJvbSBodHRwOi8vaGFja21hdC5zZS9rdXJzZXIvVEFUTTU0L2Jvb2t0b3QucGRmCSovCisgICAgICAvKiBVX3sya30gPSAyKlVfe2srMX0qVV9rIC0gUCpVX2teMgkqLworICAgICAgLyogVV97MmsrMX0gPSBVX3trKzF9XjIgIC0gUSpVX2teMgkqLworICAgICAgLyogVV97MmsrMn0gPSBQKlVfe2srMX1eMiAtIDIqUSpVX3trKzF9KlVfawkqLworICAgICAgLyogV2Ugbm90ZSB0aGF0IFVfezJrKzJ9ID0gUCpVX3syaysxfSAtIFEqVV97Mmt9CSovCisgICAgICAvKiBUaGUgZm9ybXVsYXMgYXJlIHNwZWNpYWxpemVkIGZvciBQPTEsIGFuZCBvbmx5IHNxdWFyZXM6CSovCisgICAgICAvKiBVX3sya30gICA9IFVfe2srMX1eMiAtIHxVX3trKzF9IC0gVV9rfF4yCSovCisgICAgICAvKiBVX3syaysxfSA9IFVfe2srMX1eMiAtIFEqVV9rXjIJCSovCisgICAgICAvKiBVX3syaysyfSA9IFVfezJrKzF9ICAtIFEqVV97Mmt9CSovCisgICAgICBtcHpfbXVsIChUMSwgUWssIFFrKTsJLyogVV97aysxfV4yCQkqLworICAgICAgbXB6X3N1YiAoUWssIFYsIFFrKTsJLyogfFVfe2srMX0gLSBVX2t8CSovCisgICAgICBtcHpfbXVsIChUMiwgUWssIFFrKTsJLyogfFVfe2srMX0gLSBVX2t8XjIJKi8KKyAgICAgIG1wel9tdWwgKFFrLCBWLCBWKTsJLyogVV9rXjIJCSovCisgICAgICBtcHpfc3ViIChUMiwgVDEsIFQyKTsJLyogVV97aysxfV4yIC0gKFVfe2srMX0gLSBVX2spXjIJKi8KKyAgICAgIGlmIChRID4gMCkJCS8qIFVfe2srMX1eMiAtIFEgVV9rXjIgPSBVX3syaysxfQkqLworCW1wel9zdWJtdWxfdWkgKFQxLCBRaywgUSk7CisgICAgICBlbHNlCisJbXB6X2FkZG11bF91aSAoVDEsIFFrLCBORUdfQ0FTVCAodW5zaWduZWQgbG9uZywgUSkpOworCisgICAgICAvKiBBIHN0ZXAgay0+aysxIGlzIHBlcmZvcm1lZCBpZiB0aGUgYml0IGluICRuJCBpcyAxCSovCisgICAgICBpZiAobXB6X3RzdGJpdCAobiwgYnMpKQorCXsKKwkgIC8qIFVfezJrKzJ9ID0gVV97MmsrMX0gLSBRKlVfezJrfQkqLworCSAgbXB6X211bF9zaSAoVDIsIFQyLCBRKTsKKwkgIG1wel9zdWIgKFQyLCBUMSwgVDIpOworCSAgbXB6X3N3YXAgKFQxLCBUMik7CisJfQorICAgICAgbXB6X3RkaXZfciAoUWssIFQxLCBuKTsKKyAgICAgIG1wel90ZGl2X3IgKFYsIFQyLCBuKTsKKyAgICB9IHdoaWxlICgtLWJzID49IGIwKTsKKworICByZXMgPSBTSVogKFFrKSA9PSAwOworICBpZiAoIXJlcykgeworICAgIG1wel9tdWxfc2kgKFQxLCBWLCAtMipRKTsKKyAgICBtcHpfYWRkIChUMSwgUWssIFQxKTsJLyogVl9rID0gVV9rIC0gMlEqVV97ay0xfSAqLworICAgIG1wel90ZGl2X3IgKFYsIFQxLCBuKTsKKyAgICByZXMgPSBTSVogKFYpID09IDA7CisgICAgaWYgKCFyZXMgJiYgYjAgPiAxKSB7CisgICAgICAvKiBWX2sgYW5kIFFeayB3aWxsIGJlIG5lZWRlZCBmb3IgZnVydGhlciBjaGVjaywgY29tcHV0ZSB0aGVtLgkqLworICAgICAgLyogRklYTUU6IEhlcmUgd2UgY29tcHV0ZSBWX2teMiBhbmQgc3RvcmUgVl9rLCBidXQgdGhlIGZvcm1lcgkqLworICAgICAgLyogd2lsbCBiZSByZWNvbXB1dGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBzaG91bCB3ZSBzdG9yZQkqLworICAgICAgLyogdGhhdCBpbnN0ZWFkPwkJCQkJCQkqLworICAgICAgbXB6X211bCAoVDIsIFQxLCBUMSk7CS8qIFZfa14yICovCisgICAgICBtcHpfbXVsIChUMSwgUWssIFFrKTsJLyogUF4yIFVfa14yID0gVV9rXjIgKi8KKyAgICAgIG1wel9zdWIgKFQyLCBUMiwgVDEpOworICAgICAgQVNTRVJUIChTSVogKFQyKSA9PSAwIHx8IFBUUiAoVDIpIFswXSAlIDQgPT0gMCk7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKFQyLCBUMiwgMik7CS8qIChWX2teMiAtIFBeMiBVX2teMikgLyA0ICovCisgICAgICBpZiAoUSA+IDApCQkvKiAoVl9rXjIgLSAoUF4yIC00USkgVV9rXjIpIC8gNCA9IFFeayAqLworCW1wel9hZGRtdWxfdWkgKFQyLCBUMSwgUSk7CisgICAgICBlbHNlCisJbXB6X3N1Ym11bF91aSAoVDIsIFQxLCBORUdfQ0FTVCAodW5zaWduZWQgbG9uZywgUSkpOworICAgICAgbXB6X3RkaXZfciAoUWssIFQyLCBuKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbXB6L2x1Y251bTJfdWkuYyBiL21wei9sdWNudW0yX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjM2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL21wei9sdWNudW0yX3VpLmMKQEAgLTAsMCArMSw5NCBAQAorLyogbXB6X2x1Y251bTJfdWkgLS0gY2FsY3VsYXRlIEx1Y2FzIG51bWJlcnMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzLCAyMDA1LCAyMDEyLCAyMDE1LCAyMDE2LCAyMDE4IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkCittcHpfbHVjbnVtMl91aSAobXB6X3B0ciBsbiwgbXB6X3B0ciBsbnN1YjEsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgbXBfcHRyICAgICBscCwgbDFwLCBmMXA7CisgIG1wX3NpemVfdCAgc2l6ZTsKKyAgbXBfbGltYl90ICBjOworICBUTVBfREVDTDsKKworICBBU1NFUlQgKGxuICE9IGxuc3ViMSk7CisKKyAgLyogaGFuZGxlIHNtYWxsIG4gcXVpY2tseSwgYW5kIGhpZGUgdGhlIHNwZWNpYWwgY2FzZSBmb3IgTFstMV09LTEgKi8KKyAgaWYgKG4gPD0gRklCX1RBQkxFX0xVQ05VTV9MSU1JVCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGYgID0gRklCX1RBQkxFIChuKTsKKyAgICAgIG1wX2xpbWJfdCAgZjEgPSBGSUJfVEFCTEUgKChpbnQpIG4gLSAxKTsKKworICAgICAgLyogTFtuXSA9IEZbbl0gKyAyRltuLTFdICovCisgICAgICBNUFpfTkVXQUxMT0MgKGxuLCAxKVswXSA9IGYgKyAyKmYxOworICAgICAgU0laKGxuKSA9IDE7CisKKyAgICAgIC8qIExbbi0xXSA9IDJGW25dIC0gRltuLTFdLCBidXQgYWxsb3cgZm9yIExbLTFdPS0xICovCisgICAgICBNUFpfTkVXQUxMT0MgKGxuc3ViMSwgMSlbMF0gPSAobiA9PSAwID8gMSA6IDIqZiAtIGYxKTsKKyAgICAgIFNJWihsbnN1YjEpID0gKG4gPT0gMCA/IC0xIDogMSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisgIHNpemUgPSBNUE5fRklCMl9TSVpFIChuKTsKKyAgZjFwID0gVE1QX0FMTE9DX0xJTUJTIChzaXplKTsKKworICBscCAgPSBNUFpfTkVXQUxMT0MgKGxuLCAgICAgc2l6ZSsxKTsKKyAgbDFwID0gTVBaX05FV0FMTE9DIChsbnN1YjEsIHNpemUrMSk7CisKKyAgc2l6ZSA9IG1wbl9maWIyX3VpIChsMXAsIGYxcCwgbik7CisKKyAgLyogTFtuXSA9IEZbbl0gKyAyRltuLTFdICovCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDFfbgorICBjID0gbXBuX2FkZGxzaDFfbiAobHAsIGwxcCwgZjFwLCBzaXplKTsKKyNlbHNlCisgIGMgPSBtcG5fbHNoaWZ0IChscCwgZjFwLCBzaXplLCAxKTsKKyAgYyArPSBtcG5fYWRkX24gKGxwLCBscCwgbDFwLCBzaXplKTsKKyNlbmRpZgorICBscFtzaXplXSA9IGM7CisgIFNJWihsbikgPSBzaXplICsgKGMgIT0gMCk7CisKKyAgLyogTFtuLTFdID0gMkZbbl0gLSBGW24tMV0gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMV9uCisgIGMgPSBtcG5fcnNibHNoMV9uIChsMXAsIGYxcCwgbDFwLCBzaXplKTsKKyNlbHNlCisgIGMgPSBtcG5fbHNoaWZ0IChsMXAsIGwxcCwgc2l6ZSwgMSk7CisgIGMgLT0gbXBuX3N1Yl9uIChsMXAsIGwxcCwgZjFwLCBzaXplKTsKKyNlbmRpZgorICBBU1NFUlQgKChtcF9saW1iX3NpZ25lZF90KSBjID49IDApOworICBsMXBbc2l6ZV0gPSBjOworICBTSVoobG5zdWIxKSA9IHNpemUgKyAoYyAhPSAwKTsKKworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wei9sdWNudW1fdWkuYyBiL21wei9sdWNudW1fdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjEzYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L2x1Y251bV91aS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiBtcHpfbHVjbnVtX3VpIC0tIGNhbGN1bGF0ZSBMdWNhcyBudW1iZXIuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzLCAyMDA1LCAyMDExLCAyMDEyLCAyMDE1LCAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIGNoYW5nZSB0aGlzIHRvICIjZGVmaW5lIFRSQUNFKHgpIHgiIGZvciBkaWFnbm9zdGljcyAqLworI2RlZmluZSBUUkFDRSh4KQorCisKKy8qIE5vdGVzOgorCisgICBGb3IgdGhlICs0IGluIExbMmsrMV0gd2hlbiBrIGlzIGV2ZW4sIGFsbCBMWzRtKzNdID09IDQsIDUgb3IgNyBtb2QgOCwgc28KKyAgIHRoZXJlIGNhbid0IGJlIGFuIG92ZXJmbG93IGFwcGx5aW5nICs0IHRvIGp1c3QgdGhlIGxvdyBsaW1iIChzaW5jZSB0aGF0CisgICB3b3VsZCBsZWF2ZSAwLCAxLCAyIG9yIDMgbW9kIDgpLgorCisgICBGb3IgdGhlIC00IGluIExbMmsrMV0gd2hlbiBrIGlzIGV2ZW4sIGl0IHNlZW1zIChubyBwcm9vZikgdGhhdAorICAgTFszKjJeKGItMiktM10gPT0gLTQgbW9kIDJeYiwgc28gZm9yIGluc3RhbmNlIHdpdGggYSAzMi1iaXQgbGltYgorICAgTFsweEJGRkZGRkZEXSA9PSAweEZGRkZGRkZDIG1vZCAyXjMyLCBhbmQgdGhpcyBpbXBsaWVzIGEgYm9ycm93IGZyb20gdGhlCisgICBsb3cgbGltYi4gIE9idmlvdXNseSBMWzB4QkZGRkZGRkRdIGlzIGEgaHVnZSBudW1iZXIsIGJ1dCBpdCdzIGF0IGxlYXN0CisgICBjb25jZWl2YWJsZSB0byBjYWxjdWxhdGUgaXQsIHNvIGl0IHByb2JhYmx5IHNob3VsZCBiZSBoYW5kbGVkLgorCisgICBGb3IgdGhlIC0yIGluIExbMmtdIHdpdGggayBldmVuLCBpdCBzZWVtcyAobm8gcHJvb2YpIExbMl4oYi0xKV0gPT0gLTEgbW9kCisgICAyXmIsIHNvIGZvciBpbnN0YW5jZSBpbiAzMi1iaXRzIExbMHg4MDAwMDAwMF0gaGFzIGEgbG93IGxpbWIgb2YKKyAgIDB4RkZGRkZGRkYgc28gdGhlcmUgd291bGQgaGF2ZSBiZWVuIGEgYm9ycm93LiAgQWdhaW4gTFsweDgwMDAwMDAwXSBpcworICAgb2J2aW91c2x5IGh1Z2UsIGJ1dCBwcm9iYWJseSBzaG91bGQgYmUgbWFkZSB0byB3b3JrLiAgKi8KKwordm9pZAorbXB6X2x1Y251bV91aSAobXB6X3B0ciBsbiwgdW5zaWduZWQgbG9uZyBuKQoreworICBtcF9zaXplX3QgIGxhbGxvYywgeGFsbG9jLCBsc2l6ZSwgeHNpemU7CisgIG1wX3B0ciAgICAgbHAsIHhwOworICBtcF9saW1iX3QgIGM7CisgIGludCAgICAgICAgemVyb3M7CisgIFRNUF9ERUNMOworCisgIFRSQUNFIChwcmludGYgKCJtcG5fbHVjbnVtX3VpIG49JWx1XG4iLCBuKSk7CisKKyAgaWYgKG4gPD0gRklCX1RBQkxFX0xVQ05VTV9MSU1JVCkKKyAgICB7CisgICAgICAvKiBMW25dID0gRltuXSArIDJGW24tMV0gKi8KKyAgICAgIE1QWl9ORVdBTExPQyAobG4sIDEpWzBdID0gRklCX1RBQkxFKG4pICsgMiAqIEZJQl9UQUJMRSAoKGludCkgbiAtIDEpOworICAgICAgU0laKGxuKSA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qICsxIHNpbmNlIExbbl09RltuXSsyRltuLTFdIG1pZ2h0IGJlIDEgbGltYiBiaWdnZXIgdGhhbiBGW25dLCBmdXJ0aGVyICsxCisgICAgIHNpbmNlIHNxdWFyZSBvciBtdWwgdXNlZCBiZWxvdyBtaWdodCBuZWVkIGFuIGV4dHJhIGxpbWIgb3ZlciB0aGUgdHJ1ZQorICAgICBzaXplICovCisgIGxhbGxvYyA9IE1QTl9GSUIyX1NJWkUgKG4pICsgMjsKKyAgbHAgPSBNUFpfTkVXQUxMT0MgKGxuLCBsYWxsb2MpOworCisgIFRNUF9NQVJLOworICB4YWxsb2MgPSBsYWxsb2M7CisgIHhwID0gVE1QX0FMTE9DX0xJTUJTICh4YWxsb2MpOworCisgIC8qIFN0cmlwIHRyYWlsaW5nIHplcm9zIGZyb20gbiwgdW50aWwgZWl0aGVyIGFuIG9kZCBudW1iZXIgaXMgcmVhY2hlZAorICAgICB3aGVyZSB0aGUgTFsyaysxXSBmb3JtdWxhIGNhbiBiZSB1c2VkLCBvciB1bnRpbCBuIGZpdHMgd2l0aGluIHRoZQorICAgICBGSUJfVEFCTEUgZGF0YS4gIFRoZSB0YWJsZSBpcyBwcmVmZXJyZWQgb2YgY291cnNlLiAgKi8KKyAgemVyb3MgPSAwOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChuICYgMSkKKwl7CisJICAvKiBMWzJrKzFdID0gNSpGW2stMV0qKDIqRltrXStGW2stMV0pIC0gNCooLTEpXmsgKi8KKworCSAgbXBfc2l6ZV90ICB5YWxsb2MsIHlzaXplOworCSAgbXBfcHRyICAgICB5cDsKKworCSAgVFJBQ0UgKHByaW50ZiAoIiAgaW5pdGlhbCBvZGQgbj0lbHVcbiIsIG4pKTsKKworCSAgeWFsbG9jID0gTVBOX0ZJQjJfU0laRSAobi8yKTsKKwkgIHlwID0gVE1QX0FMTE9DX0xJTUJTICh5YWxsb2MpOworCSAgQVNTRVJUICh4YWxsb2MgPj0geWFsbG9jKTsKKworCSAgeHNpemUgPSBtcG5fZmliMl91aSAoeHAsIHlwLCBuLzIpOworCisJICAvKiBwb3NzaWJsZSBoaWdoIHplcm8gb24gRltrLTFdICovCisJICB5c2l6ZSA9IHhzaXplOworCSAgeXNpemUgLT0gKHlwW3lzaXplLTFdID09IDApOworCSAgQVNTRVJUICh5cFt5c2l6ZS0xXSAhPSAwKTsKKworCSAgLyogeHAgPSAyKkZba10gKyBGW2stMV0gKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisJICBjID0gbXBuX2FkZGxzaDFfbiAoeHAsIHlwLCB4cCwgeHNpemUpOworI2Vsc2UKKwkgIGMgPSBtcG5fbHNoaWZ0ICh4cCwgeHAsIHhzaXplLCAxKTsKKwkgIGMgKz0gbXBuX2FkZF9uICh4cCwgeHAsIHlwLCB4c2l6ZSk7CisjZW5kaWYKKwkgIEFTU0VSVCAoeGFsbG9jID49IHhzaXplKzEpOworCSAgeHBbeHNpemVdID0gYzsKKwkgIHhzaXplICs9IChjICE9IDApOworCSAgQVNTRVJUICh4cFt4c2l6ZS0xXSAhPSAwKTsKKworCSAgQVNTRVJUIChsYWxsb2MgPj0geHNpemUgKyB5c2l6ZSk7CisJICBjID0gbXBuX211bCAobHAsIHhwLCB4c2l6ZSwgeXAsIHlzaXplKTsKKwkgIGxzaXplID0geHNpemUgKyB5c2l6ZTsKKwkgIGxzaXplIC09IChjID09IDApOworCisJICAvKiBscCA9IDUqbHAgKi8KKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uCisJICBjID0gbXBuX2FkZGxzaDJfbiAobHAsIGxwLCBscCwgbHNpemUpOworI2Vsc2UKKwkgIC8qIEZJWE1FOiBJcyB0aGlzIGZhc3RlciB0aGFuIG1wbl9tdWxfMSA/ICovCisJICBjID0gbXBuX2xzaGlmdCAoeHAsIGxwLCBsc2l6ZSwgMik7CisJICBjICs9IG1wbl9hZGRfbiAobHAsIGxwLCB4cCwgbHNpemUpOworI2VuZGlmCisJICBBU1NFUlQgKGxhbGxvYyA+PSBsc2l6ZSsxKTsKKwkgIGxwW2xzaXplXSA9IGM7CisJICBsc2l6ZSArPSAoYyAhPSAwKTsKKworCSAgLyogbHAgPSBscCAtIDQqKC0xKV5rICovCisJICBpZiAobiAmIDIpCisJICAgIHsKKwkgICAgICAvKiBubyBvdmVyZmxvdywgc2VlIGNvbW1lbnRzIGFib3ZlICovCisJICAgICAgQVNTRVJUIChscFswXSA8PSBNUF9MSU1CX1RfTUFYLTQpOworCSAgICAgIGxwWzBdICs9IDQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIHdvbid0IGdvIG5lZ2F0aXZlICovCisJICAgICAgTVBOX0RFQ1JfVSAobHAsIGxzaXplLCBDTlNUX0xJTUIoNCkpOworCSAgICB9CisKKwkgIFRSQUNFIChtcG5fdHJhY2UgKCIgIGwiLGxwLCBsc2l6ZSkpOworCSAgYnJlYWs7CisJfQorCisgICAgICBNUF9QVFJfU1dBUCAoeHAsIGxwKTsgLyogYmFsYW5jZSB0aGUgc3dhcHMgd2FudGVkIGluIHRoZSBMWzJrXSBiZWxvdyAqLworICAgICAgemVyb3MrKzsKKyAgICAgIG4gLz0gMjsKKworICAgICAgaWYgKG4gPD0gRklCX1RBQkxFX0xVQ05VTV9MSU1JVCkKKwl7CisJICAvKiBMW25dID0gRltuXSArIDJGW24tMV0gKi8KKwkgIGxwWzBdID0gRklCX1RBQkxFIChuKSArIDIgKiBGSUJfVEFCTEUgKChpbnQpIG4gLSAxKTsKKwkgIGxzaXplID0gMTsKKworCSAgVFJBQ0UgKHByaW50ZiAoIiAgaW5pdGlhbCBzbWFsbCBuPSVsdVxuIiwgbik7CisJCSBtcG5fdHJhY2UgKCIgIGwiLGxwLCBsc2l6ZSkpOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBmb3IgKCA7IHplcm9zICE9IDA7IHplcm9zLS0pCisgICAgeworICAgICAgLyogTFsya10gPSBMW2tdXjIgKyAyKigtMSleayAqLworCisgICAgICBUUkFDRSAocHJpbnRmICgiICB6ZXJvcz0lZFxuIiwgemVyb3MpKTsKKworICAgICAgQVNTRVJUICh4YWxsb2MgPj0gMipsc2l6ZSk7CisgICAgICBtcG5fc3FyICh4cCwgbHAsIGxzaXplKTsKKyAgICAgIGxzaXplICo9IDI7CisgICAgICBsc2l6ZSAtPSAoeHBbbHNpemUtMV0gPT0gMCk7CisKKyAgICAgIC8qIEZpcnN0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGs9PW4gZGV0ZXJtaW5lcyAoLTEpXmssIGFmdGVyIHRoYXQgayBpcworCSBhbHdheXMgZXZlbiBhbmQgd2Ugc2V0IG49MCB0byBpbmRpY2F0ZSB0aGF0LiAgKi8KKyAgICAgIGlmIChuICYgMSkKKwl7CisJICAvKiBMW25dXjIgPT0gMCBvciAxIG1vZCA0LCBsaWtlIGFsbCBzcXVhcmVzLCBzbyArMiBnaXZlcyBubyBjYXJyeSAqLworCSAgQVNTRVJUICh4cFswXSA8PSBNUF9MSU1CX1RfTUFYLTIpOworCSAgeHBbMF0gKz0gMjsKKwkgIG4gPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiB3b24ndCBnbyBuZWdhdGl2ZSAqLworCSAgTVBOX0RFQ1JfVSAoeHAsIGxzaXplLCBDTlNUX0xJTUIoMikpOworCX0KKworICAgICAgTVBfUFRSX1NXQVAgKHhwLCBscCk7CisgICAgICBBU1NFUlQgKGxwW2xzaXplLTFdICE9IDApOworICAgIH0KKworICAvKiBzaG91bGQgZW5kIHVwIGluIHRoZSByaWdodCBzcG90IGFmdGVyIGFsbCB0aGUgeHAvbHAgc3dhcHMgKi8KKyAgQVNTRVJUIChscCA9PSBQVFIobG4pKTsKKyAgU0laKGxuKSA9IGxzaXplOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L21mYWNfdWl1aS5jIGIvbXB6L21mYWNfdWl1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTVhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbWZhY191aXVpLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIG1wel9tZmFjX3VpdWkoUkVTVUxULCBOLCBNKSAtLSBTZXQgUkVTVUxUIHRvIE4hXihNKSA9IE4oTi1NKShOLTJNKS4uLgorCitDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDIwMTIsIDIwMTMsIDIwMTUsIDIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gbWFjcm9zOiBjb21tb24gbWFjcm9zLCBmb3Igc3dpbmcvZmFjL2JpbiAoJnNpZXZlKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRkFDVE9SX0xJU1RfU1RPUkUoUCwgUFIsIE1BWF9QUiwgVkVDLCBJKQkJXAorICBkbyB7CQkJCQkJCQlcCisgICAgaWYgKChQUikgPiAoTUFYX1BSKSkgewkJCQkJXAorICAgICAgKFZFQylbKEkpKytdID0gKFBSKTsJCQkJCVwKKyAgICAgIChQUikgPSAoUCk7CQkJCQkJXAorICAgIH0gZWxzZQkJCQkJCQlcCisgICAgICAoUFIpICo9IChQKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZWN0aW9uIG9kZXIgZmFjdG9yaWFsczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbXB6X21mYWNfdWl1aSAoeCwgbiwgbSkgY29tcHV0ZXMgeCA9IG4hXihtKSA9IG4qKG4tbSkqKG4tMm0pKi4uLiAgICovCisKK3ZvaWQKK21wel9tZmFjX3VpdWkgKG1wel9wdHIgeCwgdW5zaWduZWQgbG9uZyBuLCB1bnNpZ25lZCBsb25nIG0pCit7CisgIEFTU0VSVCAobiA8PSBHTVBfTlVNQl9NQVgpOworICBBU1NFUlQgKG0gIT0gMCk7CisKKyAgaWYgKChuIDwgMykgfCAobiAtIDMgPCBtIC0gMSkpIHsgLyogKG4gPCAzIHx8IG4gLSAxIDw9IG0gfHwgbSA9PSAwKSAqLworICAgIE1QWl9ORVdBTExPQyAoeCwgMSlbMF0gPSBuICsgKG4gPT0gMCk7CisgICAgU0laICh4KSA9IDE7CisgIH0gZWxzZSB7IC8qIDAgPCBtIDwgbiAtIDEgPCBHTVBfTlVNQl9NQVggKi8KKyAgICBtcF9saW1iX3QgZywgc247CisgICAgbXB6X3QgICAgIHQ7CisKKyAgICBzbiA9IG47CisgICAgZyA9IG1wbl9nY2RfMSAoJnNuLCAxLCBtKTsKKyAgICBpZiAoZyA+IDEpIHsgbi89ZzsgbS89ZzsgfQorCisgICAgaWYgKG0gPD0gMikgeyAvKiBmYWMgb3IgMmZhYyAqLworICAgICAgaWYgKG0gPT0gMSkgeworCWlmIChnID4gMikgeworCSAgbXB6X2luaXQgKHQpOworCSAgbXB6X2ZhY191aSAodCwgbik7CisJICBzbiA9IG47CisJfSBlbHNlIHsKKwkgIGlmIChnID09IDIpCisJICAgIG1wel8yZmFjX3VpICh4LCBuIDw8IDEpOworCSAgZWxzZQorCSAgICBtcHpfZmFjX3VpICh4LCBuKTsKKwkgIHJldHVybjsKKwl9CisgICAgICB9IGVsc2UgeyAvKiBtID09IDIgKi8KKwlpZiAoZyA+IDEpIHsKKwkgIG1wel9pbml0ICh0KTsKKwkgIG1wel8yZmFjX3VpICh0LCBuKTsKKwkgIHNuID0gbiAvIDIgKyAxOworCX0gZWxzZSB7CisJICBtcHpfMmZhY191aSAoeCwgbik7CisJICByZXR1cm47CisJfQorICAgICAgfQorICAgIH0gZWxzZSB7IC8qIG0gPj0gMywgZ2NkKG4sbSkgPSAxICovCisgICAgICBtcF9saW1iX3QgKmZhY3RvcnM7CisgICAgICBtcF9saW1iX3QgcHJvZCwgbWF4X3Byb2Q7CisgICAgICBtcF9zaXplX3QgajsKKyAgICAgIFRNUF9ERUNMOworCisgICAgICBzbiA9IG4gLyBtICsgMTsKKworICAgICAgaiA9IDA7CisgICAgICBwcm9kID0gbjsKKyAgICAgIG4gLT0gbTsKKyAgICAgIG1heF9wcm9kID0gR01QX05VTUJfTUFYIC8gbjsKKworICAgICAgaWYgKGcgPiAxKQorCWZhY3RvcnMgPSBNUFpfTkVXQUxMT0MgKHgsIHNuIC8gbG9nX25fbWF4IChuKSArIDIpOworICAgICAgZWxzZSB7CisJVE1QX01BUks7CisJZmFjdG9ycyA9IFRNUF9BTExPQ19MSU1CUyAoc24gLyBsb2dfbl9tYXggKG4pICsgMik7CisgICAgICB9CisKKyAgICAgIGZvciAoOyBuID4gbTsgbiAtPSBtKQorCUZBQ1RPUl9MSVNUX1NUT1JFIChuLCBwcm9kLCBtYXhfcHJvZCwgZmFjdG9ycywgaik7CisKKyAgICAgIGZhY3RvcnNbaisrXSA9IG47CisgICAgICBmYWN0b3JzW2orK10gPSBwcm9kOworCisgICAgICBpZiAoZyA+IDEpIHsKKwltcHpfaW5pdCAodCk7CisJbXB6X3Byb2RsaW1icyAodCwgZmFjdG9ycywgaik7CisgICAgICB9IGVsc2UgeworCW1wel9wcm9kbGltYnMgKHgsIGZhY3RvcnMsIGopOworCVRNUF9GUkVFOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICBtcHpfdCBwOworCisgICAgICBtcHpfaW5pdCAocCk7CisgICAgICBtcHpfdWlfcG93X3VpIChwLCBnLCBzbik7IC8qIGdec24gKi8KKyAgICAgIG1wel9tdWwgKHgsIHAsIHQpOworICAgICAgbXB6X2NsZWFyIChwKTsKKyAgICAgIG1wel9jbGVhciAodCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tcHovbWlsbGVycmFiaW4uYyBiL21wei9taWxsZXJyYWJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzRkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbWlsbGVycmFiaW4uYwpAQCAtMCwwICsxLDIxNiBAQAorLyogbXB6X21pbGxlcnJhYmluKG4scmVwcykgLS0gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb2JhYmlsaXN0aWMgcHJpbWFsaXR5CisgICB0ZXN0IGZvdW5kIGluIEtudXRoJ3MgU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zIGJvb2suICBJZiB0aGUgZnVuY3Rpb24KKyAgIG1wel9taWxsZXJyYWJpbigpIHJldHVybnMgMCB0aGVuIG4gaXMgbm90IHByaW1lLiAgSWYgaXQgcmV0dXJucyAxLCB0aGVuIG4gaXMKKyAgICdwcm9iYWJseScgcHJpbWUuICBUaGUgcHJvYmFiaWxpdHkgb2YgYSBmYWxzZSBwb3NpdGl2ZSBpcyAoMS80KSoqcmVwcywgd2hlcmUKKyAgIHJlcHMgaXMgdGhlIG51bWJlciBvZiBpbnRlcm5hbCBwYXNzZXMgb2YgdGhlIHByb2JhYmlsaXN0aWMgYWxnb3JpdGhtLiAgS251dGgKKyAgIGluZGljYXRlcyB0aGF0IDI1IHBhc3NlcyBhcmUgcmVhc29uYWJsZS4KKworICAgV2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGZpcnN0IDI0IE1SLXRlc3RzIGFyZSBzdWJzdGl0dXRlZCBieSBhCisgICBCYWlsbGllLVBTVyBwcm9iYWJsZSBwcmltZSB0ZXN0LgorCisgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCYWlsbGllLVBTVyB0ZXN0IHdhcyBjaGVja2VkIHVwIHRvIDI0NjMqMTBeMTIsCisgICBmb3Igc21hbGxlciB2YWx1ZXMgbm8gTVItdGVzdCBpcyBwZXJmb3JtZWQsIHJlZ2FyZGxlc3Mgb2YgcmVwcywgYW5kCisgICAyICgic3VyZWx5IHByaW1lIikgaXMgcmV0dXJuZWQgaWYgdGhlIG51bWJlciB3YXMgbm90IHByb3ZlZCBjb21wb3NpdGUuCisKKyAgIElmIEdNUF9CUFNXX05PRkFMU0VQT1NJVElWRVNfVVBUT182NEJJVFMgaXMgZGVmaW5lZCBhcyBub24temVybywKKyAgIHRoZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgQmFpbGxpZS1QU1cgdGVzdCB3YXMgY2hlY2tlZCB1cCB0byAyXjY0LgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYtMjAwMiwgMjAwNSwgMjAxNCwgMjAxOC0yMDIyIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworQ29udHJpYnV0ZWQgYnkgSm9obiBBbWFuYXRpZGVzLgorQ2hhbmdlZCB0byAiQlBTVywgdGhlbiBNaWxsZXIgUmFiaW4gaWYgcmVxdWlyZWQiIGJ5IE1hcmNvIEJvZHJhdG8uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaWZuZGVmIEdNUF9CUFNXX05PRkFMU0VQT1NJVElWRVNfVVBUT182NEJJVFMKKyNkZWZpbmUgR01QX0JQU1dfTk9GQUxTRVBPU0lUSVZFU19VUFRPXzY0QklUUyAwCisjZW5kaWYKKworc3RhdGljIGludCBtaWxsZXJyYWJpbiAobXB6X3NyY3B0ciwKKwkJCW1wel9wdHIsIG1wel9wdHIsCisJCQltcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7CisKK2ludAorbXB6X21pbGxlcnJhYmluIChtcHpfc3JjcHRyIG4sIGludCByZXBzKQoreworICBtcHpfdCBubSwgeCwgeSwgcTsKKyAgbXBfYml0Y250X3QgazsKKyAgaW50IGlzX3ByaW1lOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisKKyAgQVNTRVJUIChTSVogKG4pID4gMCk7CisgIE1QWl9UTVBfSU5JVCAobm0sIFNJWiAobikgKyAxKTsKKyAgbXB6X3RkaXZfcV8yZXhwIChubSwgbiwgMSk7CisKKyAgTVBaX1RNUF9JTklUICh4LCBTSVogKG4pICsgMSk7CisgIE1QWl9UTVBfSU5JVCAoeSwgMiAqIFNJWiAobikpOyAvKiBtcHpfcG93bV91aSBuZWVkcyBleGNlc3NpdmUgbWVtb3J5ISEhICovCisgIE1QWl9UTVBfSU5JVCAocSwgU0laIChuKSk7CisKKyAgLyogRmluZCBxIGFuZCBrLCB3aGVyZSBxIGlzIG9kZCBhbmQgbiA9IDEgKyAyKiprICogcS4gICovCisgIGsgPSBtcG5fc2NhbjEgKFBUUiAobm0pLCAwKTsKKyAgbXB6X3RkaXZfcV8yZXhwIChxLCBubSwgayk7CisgICsrazsKKworICAvKiBCUFNXIHRlc3QgKi8KKyAgbXB6X3NldF91aSAoeCwgMik7CisgIGlzX3ByaW1lID0gbWlsbGVycmFiaW4gKG4sIHgsIHksIHEsIGspICYmIG1wel9zdHJvbmdsdWNhcyAobiwgeCwgeSk7CisKKyAgaWYgKGlzX3ByaW1lKQorICAgIHsKKyAgICAgIGlmICgKKyNpZiBHTVBfQlBTV19OT0ZBTFNFUE9TSVRJVkVTX1VQVE9fNjRCSVRTCisJICAvKiBDb25zaWRlciBudW1iZXJzIHVwIHRvIDJeNjQgdGhhdCBwYXNzIHRoZSBCUFNXIHRlc3QgYXMgcHJpbWVzLiAqLworI2lmIEdNUF9OVU1CX0JJVFMgPD0gNjQKKwkgIFNJWiAobikgPD0gNjQgLyBHTVBfTlVNQl9CSVRTCisjZWxzZQorCSAgMAorI2VuZGlmCisjaWYgNjQgJSBHTVBfTlVNQl9CSVRTICE9IDAKKwkgIHx8IFNJWiAobikgLSA2NCAvIEdNUF9OVU1CX0JJVFMgPT0gKFBUUiAobikgWzY0IC8gR01QX05VTUJfQklUU10gPCBDTlNUX0xJTUIoMSkgPDwgNjQgJSBHTVBfTlVNQl9CSVRTKQorI2VuZGlmCisjZWxzZQorCSAgLyogQ29uc2lkZXIgbnVtYmVycyB1cCB0byAzNSoyXjQ2IHRoYXQgcGFzcyB0aGUgQlBTVyB0ZXN0IGFzIHByaW1lcy4KKwkgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIHRlc3RlZCB1cCB0byAyNDYzKjEwXjEyID4gMl41MSsyXjQ3KzJeNDYgKi8KKwkgIC8qIDJeNSA8IDM1ID0gMGIxMDAwMTEgPCAyXjYgKi8KKyNkZWZpbmUgR01QX0JQU1dfTElNQl9DT05TVCBDTlNUX0xJTUIoMzUpCisjZGVmaW5lIEdNUF9CUFNXX0JJVFNfQ09OU1QgKExPRzJDKDM1KSAtIDEpCisjZGVmaW5lIEdNUF9CUFNXX0JJVFNfTElNSVQgKDQ2ICsgR01QX0JQU1dfQklUU19DT05TVCkKKworI2RlZmluZSBHTVBfQlBTV19MSU1CU19MSU1JVCAoR01QX0JQU1dfQklUU19MSU1JVCAvIEdNUF9OVU1CX0JJVFMpCisjZGVmaW5lIEdNUF9CUFNXX0JJVFNfTU9EIChHTVBfQlBTV19CSVRTX0xJTUlUICUgR01QX05VTUJfQklUUykKKworI2lmIEdNUF9OVU1CX0JJVFMgPD0gIEdNUF9CUFNXX0JJVFNfTElNSVQKKwkgIFNJWiAobikgPD0gR01QX0JQU1dfTElNQlNfTElNSVQKKyNlbHNlCisJICAwCisjZW5kaWYKKyNpZiBHTVBfQlBTV19CSVRTX01PRCA+PSAgR01QX0JQU1dfQklUU19DT05TVAorCSAgfHwgU0laIChuKSAtIEdNUF9CUFNXX0xJTUJTX0xJTUlUID09IChQVFIgKG4pIFtHTVBfQlBTV19MSU1CU19MSU1JVF0gPCBHTVBfQlBTV19MSU1CX0NPTlNUIDw8IChHTVBfQlBTV19CSVRTX01PRCAtIEdNUF9CUFNXX0JJVFNfQ09OU1QpKQorI2Vsc2UKKyNpZiBHTVBfQlBTV19CSVRTX01PRCAhPSAwCisJICB8fCBTSVogKG4pIC0gR01QX0JQU1dfTElNQlNfTElNSVQgPT0gKFBUUiAobikgW0dNUF9CUFNXX0xJTUJTX0xJTUlUXSA8IEdNUF9CUFNXX0xJTUJfQ09OU1QgPj4gKEdNUF9CUFNXX0JJVFNfQ09OU1QgLSAgR01QX0JQU1dfQklUU19NT0QpKQorI2Vsc2UKKyNpZiBHTVBfTlVNQl9CSVRTID4gR01QX0JQU1dfQklUU19DT05TVAorCSAgfHwgU0laIChubSkgLSBHTVBfQlBTV19MSU1CU19MSU1JVCArIDEgPT0gKFBUUiAobm0pIFtHTVBfQlBTV19MSU1CU19MSU1JVCAtIDFdIDwgR01QX0JQU1dfTElNQl9DT05TVCA8PCAoR01QX05VTUJfQklUUyAtIDEgLSBHTVBfQlBTV19CSVRTX0NPTlNUKSkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmIEdNUF9CUFNXX0JJVFNfTElNSVQKKyN1bmRlZiBHTVBfQlBTV19MSU1CX0NPTlNUCisjdW5kZWYgR01QX0JQU1dfQklUU19DT05TVAorI3VuZGVmIEdNUF9CUFNXX0xJTUJTX0xJTUlUCisjdW5kZWYgR01QX0JQU1dfQklUU19NT0QKKworI2VuZGlmCisJICApCisJaXNfcHJpbWUgPSAyOworICAgICAgZWxzZQorCXsKKwkgIHJlcHMgLT0gMjQ7CisJICBpZiAocmVwcyA+IDApCisJICAgIHsKKwkgICAgICBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlOworCSAgICAgIC8qIChuLTUpLzIgKi8KKwkgICAgICBtcHpfc3ViX3VpIChubSwgbm0sIDJMKTsKKwkgICAgICBBU1NFUlQgKG1wel9jbXBfdWkgKG5tLCAxTCkgPj0gMCk7CisKKwkgICAgICBnbXBfcmFuZGluaXRfZGVmYXVsdCAocnN0YXRlKTsKKworCSAgICAgIGRvCisJCXsKKwkJICAvKiAzIHRvIChuLTEpLzIgaW5jbHVzaXZlLCBkb24ndCB3YW50IDEsIDAgb3IgMiAqLworCQkgIG1wel91cmFuZG9tbSAoeCwgcnN0YXRlLCBubSk7CisJCSAgbXB6X2FkZF91aSAoeCwgeCwgM0wpOworCisJCSAgaXNfcHJpbWUgPSBtaWxsZXJyYWJpbiAobiwgeCwgeSwgcSwgayk7CisJCX0gd2hpbGUgKC0tcmVwcyA+IDAgJiYgaXNfcHJpbWUpOworCisJICAgICAgZ21wX3JhbmRjbGVhciAocnN0YXRlKTsKKwkgICAgfQorCX0KKyAgICB9CisgIFRNUF9GUkVFOworICByZXR1cm4gaXNfcHJpbWU7Cit9CisKK3N0YXRpYyBpbnQKK21vZF9lcV9tMSAobXB6X3NyY3B0ciB4LCBtcHpfc3JjcHRyIG0pCit7CisgIG1wX3NpemVfdCBtczsKKyAgbXBfc3JjcHRyIG1wLCB4cDsKKworICBtcyA9IFNJWiAobSk7CisgIGlmIChTSVogKHgpICE9IG1zKQorICAgIHJldHVybiAwOworICBBU1NFUlQgKG1zID4gMCk7CisKKyAgbXAgPSBQVFIgKG0pOworICB4cCA9IFBUUiAoeCk7CisgIEFTU0VSVCAoKG1wWzBdIC0gMSkgPT0gKG1wWzBdIF4gMSkpOyAvKiBuIGlzIG9kZCAqLworCisgIGlmICgoKnhwIF4gQ05TVF9MSU1CKDEpIF4gKm1wKSAhPSBDTlNUX0xJTUIoMCkpIC8qIHhwWzBdICE9IG1wWzBdIC0gMSAqLworICAgIHJldHVybiAwOworICBlbHNlCisgICAgeworICAgICAgaW50IGNtcDsKKworICAgICAgLS1tczsKKyAgICAgICsreHA7CisgICAgICArK21wOworCisgICAgICBNUE5fQ01QIChjbXAsIHhwLCBtcCwgbXMpOworCisgICAgICByZXR1cm4gY21wID09IDA7CisgICAgfQorfQorCitzdGF0aWMgaW50CittaWxsZXJyYWJpbiAobXB6X3NyY3B0ciBuLCBtcHpfcHRyIHgsIG1wel9wdHIgeSwKKwkgICAgIG1wel9zcmNwdHIgcSwgbXBfYml0Y250X3QgaykKK3sKKyAgbXB6X3Bvd20gKHksIHgsIHEsIG4pOworCisgIGlmIChtcHpfY21wX3VpICh5LCAxTCkgPT0gMCB8fCBtb2RfZXFfbTEgKHksIG4pKQorICAgIHJldHVybiAxOworCisgIGZvciAobXBfYml0Y250X3QgaSA9IDE7IGkgPCBrOyArK2kpCisgICAgeworICAgICAgbXB6X3Bvd21fdWkgKHksIHksIDJMLCBuKTsKKyAgICAgIGlmIChtb2RfZXFfbTEgKHksIG4pKQorCXJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tcHovbW9kLmMgYi9tcHovbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1Y2RiMQotLS0gL2Rldi9udWxsCisrKyBiL21wei9tb2QuYwpAQCAtMCwwICsxLDY3IEBACisvKiBtcHpfbW9kIC0tIFRoZSBtYXRoZW1hdGljYWwgbW9kIGZ1bmN0aW9uLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk2LCAyMDAxLCAyMDAyLCAyMDA1LCAyMDEwLCAyMDEyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9tb2QgKG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIGRpdmlkZW5kLCBtcHpfc3JjcHRyIGRpdmlzb3IpCit7CisgIG1wX3NpemVfdCBybiwgYm47CisgIG1wel90IHRlbXBfZGl2aXNvcjsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgYm4gPSBBQlNJWihkaXZpc29yKTsKKworICAvKiBXZSBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZGl2aXNvciBhZnRlciB0aGUgcmVtYWluZGVyIGhhcyBiZWVuCisgICAgIHByZWxpbWluYXJ5IGNhbGN1bGF0ZWQuICBXZSBoYXZlIHRvIGNvcHkgaXQgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0J3MKKyAgICAgdGhlIHNhbWUgdmFyaWFibGUgYXMgUkVNLiAgKi8KKyAgaWYgKHJlbSA9PSBkaXZpc29yKQorICAgIHsKKyAgICAgIFBUUih0ZW1wX2Rpdmlzb3IpID0gVE1QX0FMTE9DX0xJTUJTIChibik7CisgICAgICBNUE5fQ09QWSAoUFRSKHRlbXBfZGl2aXNvciksIFBUUihkaXZpc29yKSwgYm4pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFBUUih0ZW1wX2Rpdmlzb3IpID0gUFRSKGRpdmlzb3IpOworICAgIH0KKyAgU0laKHRlbXBfZGl2aXNvcikgPSBibjsKKyAgZGl2aXNvciA9IHRlbXBfZGl2aXNvcjsKKworICBtcHpfdGRpdl9yIChyZW0sIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICBybiA9IFNJWiAocmVtKTsKKyAgaWYgKHJuIDwgMCkKKyAgICBtcHpfYWRkIChyZW0sIHJlbSwgZGl2aXNvcik7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovbXVsLmMgYi9tcHovbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwZGY5ZgotLS0gL2Rldi9udWxsCisrKyBiL21wei9tdWwuYwpAQCAtMCwwICsxLDE1OSBAQAorLyogbXB6X211bCAtLSBNdWx0aXBseSB0d28gaW50ZWdlcnMuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDA5LCAyMDExLCAyMDEyLAorMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkCittcHpfbXVsIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSwgbXB6X3NyY3B0ciB2KQoreworICBtcF9zaXplX3QgdXNpemU7CisgIG1wX3NpemVfdCB2c2l6ZTsKKyAgbXBfc2l6ZV90IHdzaXplOworICBtcF9zaXplX3Qgc2lnbl9wcm9kdWN0OworICBtcF9wdHIgdXAsIHZwOworICBtcF9wdHIgd3A7CisgIG1wX3B0ciBmcmVlX21lOworICBzaXplX3QgZnJlZV9tZV9zaXplOworICBtcF9saW1iX3QgY3lfbGltYjsKKyAgVE1QX0RFQ0w7CisKKyAgdXNpemUgPSBTSVogKHUpOworICB2c2l6ZSA9IFNJWiAodik7CisgIHNpZ25fcHJvZHVjdCA9IHVzaXplIF4gdnNpemU7CisgIHVzaXplID0gQUJTICh1c2l6ZSk7CisgIHZzaXplID0gQUJTICh2c2l6ZSk7CisKKyAgaWYgKHVzaXplIDwgdnNpemUpCisgICAgeworICAgICAgTVBaX1NSQ1BUUl9TV0FQICh1LCB2KTsKKyAgICAgIE1QX1NJWkVfVF9TV0FQICh1c2l6ZSwgdnNpemUpOworICAgIH0KKworICBpZiAodnNpemUgPT0gMCkKKyAgICB7CisgICAgICBTSVogKHcpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgaWYgKHZzaXplIDw9IDIpCisgICAgeworICAgICAgd3AgPSBNUFpfUkVBTExPQyAodywgdXNpemUrdnNpemUpOworICAgICAgaWYgKHZzaXplID09IDEpCisJY3lfbGltYiA9IG1wbl9tdWxfMSAod3AsIFBUUiAodSksIHVzaXplLCBQVFIgKHYpWzBdKTsKKyAgICAgIGVsc2UKKwl7CisJICBjeV9saW1iID0gbXBuX211bF8yICh3cCwgUFRSICh1KSwgdXNpemUsIFBUUiAodikpOworCSAgdXNpemUrKzsKKwl9CisgICAgICB3cFt1c2l6ZV0gPSBjeV9saW1iOworICAgICAgdXNpemUgKz0gKGN5X2xpbWIgIT0gMCk7CisgICAgICBTSVogKHcpID0gKHNpZ25fcHJvZHVjdCA+PSAwID8gdXNpemUgOiAtdXNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlCisgIGlmICh2c2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIHdwID0gTVBaX1JFQUxMT0MgKHcsIHVzaXplKzEpOworICAgICAgY3lfbGltYiA9IG1wbl9tdWxfMSAod3AsIFBUUiAodSksIHVzaXplLCBQVFIgKHYpWzBdKTsKKyAgICAgIHdwW3VzaXplXSA9IGN5X2xpbWI7CisgICAgICB1c2l6ZSArPSAoY3lfbGltYiAhPSAwKTsKKyAgICAgIFNJWiAodykgPSAoc2lnbl9wcm9kdWN0ID49IDAgPyB1c2l6ZSA6IC11c2l6ZSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgVE1QX01BUks7CisgIGZyZWVfbWUgPSBOVUxMOworICB1cCA9IFBUUiAodSk7CisgIHZwID0gUFRSICh2KTsKKyAgd3AgPSBQVFIgKHcpOworCisgIC8qIEVuc3VyZSBXIGhhcyBzcGFjZSBlbm91Z2ggdG8gc3RvcmUgdGhlIHJlc3VsdC4gICovCisgIHdzaXplID0gdXNpemUgKyB2c2l6ZTsKKyAgaWYgKEFMTE9DICh3KSA8IHdzaXplKQorICAgIHsKKyAgICAgIGlmIChBTExPQyAodykgIT0gMCkKKwl7CisJICBpZiAod3AgPT0gdXAgfHwgd3AgPT0gdnApCisJICAgIHsKKwkgICAgICBmcmVlX21lID0gd3A7CisJICAgICAgZnJlZV9tZV9zaXplID0gQUxMT0MgKHcpOworCSAgICB9CisJICBlbHNlCisJICAgICgqX19nbXBfZnJlZV9mdW5jKSAod3AsIChzaXplX3QpIEFMTE9DICh3KSAqIEdNUF9MSU1CX0JZVEVTKTsKKwl9CisKKyAgICAgIEFMTE9DICh3KSA9IHdzaXplOworICAgICAgd3AgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTICh3c2l6ZSk7CisgICAgICBQVFIgKHcpID0gd3A7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTWFrZSBVIGFuZCBWIG5vdCBvdmVybGFwIHdpdGggVy4gICovCisgICAgICBpZiAod3AgPT0gdXApCisJeworCSAgLyogVyBhbmQgVSBhcmUgaWRlbnRpY2FsLiAgQWxsb2NhdGUgdGVtcG9yYXJ5IHNwYWNlIGZvciBVLiAgKi8KKwkgIHVwID0gVE1QX0FMTE9DX0xJTUJTICh1c2l6ZSk7CisJICAvKiBJcyBWIGlkZW50aWNhbCB0b28/ICBLZWVwIGl0IGlkZW50aWNhbCB3aXRoIFUuICAqLworCSAgaWYgKHdwID09IHZwKQorCSAgICB2cCA9IHVwOworCSAgLyogQ29weSB0byB0aGUgdGVtcG9yYXJ5IHNwYWNlLiAgKi8KKwkgIE1QTl9DT1BZICh1cCwgd3AsIHVzaXplKTsKKwl9CisgICAgICBlbHNlIGlmICh3cCA9PSB2cCkKKwl7CisJICAvKiBXIGFuZCBWIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wb3Jhcnkgc3BhY2UgZm9yIFYuICAqLworCSAgdnAgPSBUTVBfQUxMT0NfTElNQlMgKHZzaXplKTsKKwkgIC8qIENvcHkgdG8gdGhlIHRlbXBvcmFyeSBzcGFjZS4gICovCisJICBNUE5fQ09QWSAodnAsIHdwLCB2c2l6ZSk7CisJfQorICAgIH0KKworICBpZiAodXAgPT0gdnApCisgICAgeworICAgICAgbXBuX3NxciAod3AsIHVwLCB1c2l6ZSk7CisgICAgICBjeV9saW1iID0gd3Bbd3NpemUgLSAxXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjeV9saW1iID0gbXBuX211bCAod3AsIHVwLCB1c2l6ZSwgdnAsIHZzaXplKTsKKyAgICB9CisKKyAgd3NpemUgLT0gY3lfbGltYiA9PSAwOworCisgIFNJWiAodykgPSBzaWduX3Byb2R1Y3QgPCAwID8gLXdzaXplIDogd3NpemU7CisgIGlmIChmcmVlX21lICE9IE5VTEwpCisgICAgKCpfX2dtcF9mcmVlX2Z1bmMpIChmcmVlX21lLCBmcmVlX21lX3NpemUgKiBHTVBfTElNQl9CWVRFUyk7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L211bF8yZXhwLmMgYi9tcHovbXVsXzJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ0ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L211bF8yZXhwLmMKQEAgLTAsMCArMSw3MiBAQAorLyogbXB6X211bF8yZXhwIC0tIE11bHRpcGx5IGEgYmlnbnVtIGJ5IDIqKkNOVAorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMSwgMjAwMiwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfbXVsXzJleHAgKG1wel9wdHIgciwgbXB6X3NyY3B0ciB1LCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIG1wX3NpemVfdCB1biwgcm47CisgIG1wX3NpemVfdCBsaW1iX2NudDsKKyAgbXBfcHRyIHJwOworICBtcF9zcmNwdHIgdXA7CisgIG1wX2xpbWJfdCBybGltYjsKKworICB1biA9IEFCU0laICh1KTsKKyAgbGltYl9jbnQgPSBjbnQgLyBHTVBfTlVNQl9CSVRTOworICBybiA9IHVuICsgbGltYl9jbnQ7CisKKyAgaWYgKHVuID09IDApCisgICAgcm4gPSAwOworICBlbHNlCisgICAgeworICAgICAgcnAgPSBNUFpfUkVBTExPQyAociwgcm4gKyAxKTsKKyAgICAgIHVwID0gUFRSKHUpOworCisgICAgICBjbnQgJT0gR01QX05VTUJfQklUUzsKKyAgICAgIGlmIChjbnQgIT0gMCkKKwl7CisJICBybGltYiA9IG1wbl9sc2hpZnQgKHJwICsgbGltYl9jbnQsIHVwLCB1biwgY250KTsKKwkgIHJwW3JuXSA9IHJsaW1iOworCSAgcm4gKz0gKHJsaW1iICE9IDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fQ09QWV9ERUNSIChycCArIGxpbWJfY250LCB1cCwgdW4pOworCX0KKworICAgICAgLyogWmVybyBhbGwgd2hvbGUgbGltYnMgYXQgbG93IGVuZC4gIERvIGl0IGhlcmUgYW5kIG5vdCBiZWZvcmUgY2FsbGluZworCSBtcG5fbHNoaWZ0LCBub3QgdG8gbG9zZSBmb3IgVSA9PSBSLiAgKi8KKyAgICAgIE1QTl9aRVJPIChycCwgbGltYl9jbnQpOworICAgIH0KKworICBTSVoocikgPSBTSVoodSkgPj0gMCA/IHJuIDogLXJuOworfQpkaWZmIC0tZ2l0IGEvbXB6L211bF9pLmggYi9tcHovbXVsX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM5YzJmCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L211bF9pLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIG1wel9tdWxfdWkvc2kgKHByb2R1Y3QsIG11bHRpcGxpZXIsIHNtYWxsX211bHRpcGxpY2FuZCkgLS0gU2V0IFBST0RVQ1QgdG8KKyAgIE1VTFRJUExJQ0FUT1IgdGltZXMgU01BTExfTVVMVElQTElDQU5ELgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyLCAyMDA1LCAyMDA4LCAyMDEyIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworI2lmZGVmIE9QRVJBVElPTl9tdWxfc2kKKyNkZWZpbmUgRlVOQ1RJT04gICAgICAgICAgICAgICBtcHpfbXVsX3NpCisjZGVmaW5lIE1VTFRJUExJQ0FORF9VTlNJR05FRAorI2RlZmluZSBNVUxUSVBMSUNBTkRfQUJTKHgpICAgIEFCU19DQVNUKHVuc2lnbmVkIGxvbmcsICh4KSkKKyNlbmRpZgorCisjaWZkZWYgT1BFUkFUSU9OX211bF91aQorI2RlZmluZSBGVU5DVElPTiAgICAgICAgICAgICAgIG1wel9tdWxfdWkKKyNkZWZpbmUgTVVMVElQTElDQU5EX1VOU0lHTkVEICB1bnNpZ25lZAorI2RlZmluZSBNVUxUSVBMSUNBTkRfQUJTKHgpICAgIHgKKyNlbmRpZgorCisjaWZuZGVmIEZVTkNUSU9OCitFcnJvciwgZXJyb3IsIHVucmVjb2duaXNlZCBPUEVSQVRJT04KKyNlbmRpZgorCisKK3ZvaWQKK0ZVTkNUSU9OIChtcHpfcHRyIHByb2QsIG1wel9zcmNwdHIgbXVsdCwKKyAgICAgICAgICBNVUxUSVBMSUNBTkRfVU5TSUdORUQgbG9uZyBpbnQgc21hbGxfbXVsdCkKK3sKKyAgbXBfc2l6ZV90IHNpemU7CisgIG1wX3NpemVfdCBzaWduX3Byb2R1Y3Q7CisgIG1wX2xpbWJfdCBzbWw7CisgIG1wX2xpbWJfdCBjeTsKKyAgbXBfcHRyIHBwOworCisgIHNpZ25fcHJvZHVjdCA9IFNJWihtdWx0KTsKKyAgaWYgKHNpZ25fcHJvZHVjdCA9PSAwIHx8IHNtYWxsX211bHQgPT0gMCkKKyAgICB7CisgICAgICBTSVoocHJvZCkgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzaXplID0gQUJTIChzaWduX3Byb2R1Y3QpOworCisgIHNtbCA9IE1VTFRJUExJQ0FORF9BQlMgKHNtYWxsX211bHQpOworCisgIGlmIChzbWwgPD0gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIHBwID0gTVBaX1JFQUxMT0MgKHByb2QsIHNpemUgKyAxKTsKKyAgICAgIGN5ID0gbXBuX211bF8xIChwcCwgUFRSKG11bHQpLCBzaXplLCBzbWwpOworICAgICAgcHBbc2l6ZV0gPSBjeTsKKyAgICAgIHNpemUgKz0gY3kgIT0gMDsKKyAgICB9CisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGVsc2UKKyAgICB7CisgICAgICAvKiBPcGVyYW5kIHRvbyBsYXJnZSBmb3IgdGhlIGN1cnJlbnQgbmFpbHMgc2l6ZS4gIFVzZSB0ZW1wb3JhcnkgZm9yCisJIGludGVybWVkaWF0ZSBwcm9kdWN0cywgdG8gYWxsb3cgcHJvZCBhbmQgbXVsdCBiZWluZyBpZGVudGljYWwuICAqLworICAgICAgbXBfcHRyIHRwOworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAyKTsKKworICAgICAgLyogVXNlLCBtYXliZSwgbXBuX211bF8yPyAqLworICAgICAgY3kgPSBtcG5fbXVsXzEgKHRwLCBQVFIobXVsdCksIHNpemUsIHNtbCAmIEdNUF9OVU1CX01BU0spOworICAgICAgdHBbc2l6ZV0gPSBjeTsKKyAgICAgIGN5ID0gbXBuX2FkZG11bF8xICh0cCArIDEsIFBUUihtdWx0KSwgc2l6ZSwgc21sID4+IEdNUF9OVU1CX0JJVFMpOworICAgICAgdHBbc2l6ZSArIDFdID0gY3k7CisgICAgICBzaXplICs9IDI7CisgICAgICBNUE5fTk9STUFMSVpFX05PVF9aRVJPICh0cCwgc2l6ZSk7IC8qIHRvbyBnZW5lcmFsLCBuZWVkIHRvIHRyaW0gb25lIG9yIHR3byBsaW1iICovCisgICAgICBwcCA9IE1QWl9ORVdBTExPQyAocHJvZCwgc2l6ZSk7CisgICAgICBNUE5fQ09QWSAocHAsIHRwLCBzaXplKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyNlbmRpZgorCisgIFNJWihwcm9kKSA9ICgoc2lnbl9wcm9kdWN0IDwgMCkgXiAoc21hbGxfbXVsdCA8IDApKSA/IC1zaXplIDogc2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9tdWxfc2kuYyBiL21wei9tdWxfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjI5ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L211bF9zaS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIG1wel9tdWxfc2kgKHByb2R1Y3QsIG11bHRpcGxpZXIsIHNtYWxsX211bHRpcGxpY2FuZCkgLS0gU2V0IFBST0RVQ1QgdG8KKyAgIE1VTFRJUExJQ0FUT1IgdGltZXMgU01BTExfTVVMVElQTElDQU5ELgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjZGVmaW5lIE9QRVJBVElPTl9tdWxfc2kKKyNpbmNsdWRlICJtdWxfaS5oIgpkaWZmIC0tZ2l0IGEvbXB6L211bF91aS5jIGIvbXB6L211bF91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOThjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbXVsX3VpLmMKQEAgLTAsMCArMSwzNCBAQAorLyogbXB6X211bF91aSAocHJvZHVjdCwgbXVsdGlwbGllciwgc21hbGxfbXVsdGlwbGljYW5kKSAtLSBTZXQgUFJPRFVDVCB0bworICAgTVVMVElQTElDQVRPUiB0aW1lcyBTTUFMTF9NVUxUSVBMSUNBTkQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNkZWZpbmUgT1BFUkFUSU9OX211bF91aQorI2luY2x1ZGUgIm11bF9pLmgiCmRpZmYgLS1naXQgYS9tcHovbl9wb3dfdWkuYyBiL21wei9uX3Bvd191aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjkzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovbl9wb3dfdWkuYwpAQCAtMCwwICsxLDUzMiBAQAorLyogbXB6X25fcG93X3VpIC0tIG1wbiByYWlzZWQgdG8gdWxvbmcuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNSwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBDaGFuZ2UgdGhpcyB0byAiI2RlZmluZSBUUkFDRSh4KSB4IiBmb3Igc29tZSB0cmFjZXMuICovCisjZGVmaW5lIFRSQUNFKHgpCisKKworLyogVXNlIHRoaXMgdG8gdGVzdCB0aGUgbXVsXzIgY29kZSBvbiBhIENQVSB3aXRob3V0IGEgbmF0aXZlIHZlcnNpb24gb2YgdGhhdAorICAgcm91dGluZS4gICovCisjaWYgMAorI2RlZmluZSBtcG5fbXVsXzIgIHJlZm1wbl9tdWxfMgorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fbXVsXzIgIDEKKyNlbmRpZgorCisKKy8qIG1wel9wb3dfdWkgYW5kIG1wel91aV9wb3dfdWkgd2FudCB0byBzaGFyZSBhbG1vc3QgYWxsIG9mIHRoaXMgY29kZS4KKyAgIHVpX3Bvd191aSBkb2Vzbid0IG5lZWQgdGhlIG1wbl9tdWwgYmFzZWQgcG93ZXJpbmcgbG9vcCBvciB0aGUgdGVzdHMgb24KKyAgIGJzaXplPT0yIG9yID4yLCBidXQgc2VwYXJhdGluZyB0aGF0IGlzbid0IGVhc3kgYmVjYXVzZSB0aGVyZSdzIHNoYXJlZAorICAgY29kZSBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgKHRoZSBzaXplIGNhbGN1bGF0aW9ucyBhbmQgdGhlIHBvd2VycyBvZiAyCisgICBoYW5kbGluZykuCisKKyAgIEFsdGVybmF0aXZlczoKKworICAgSXQgd291bGQgd29yayB0byBqdXN0IHVzZSB0aGUgbXBuX211bCBwb3dlcmluZyBsb29wIGZvciAxIGFuZCAyIGxpbWIKKyAgIGJhc2VzLCBidXQgdGhlIGN1cnJlbnQgc2VwYXJhdGUgbG9vcCBhbGxvd3MgbXVsXzEgYW5kIG11bF8yIHRvIGJlIGRvbmUKKyAgIGluLXBsYWNlLCB3aGljaCBtaWdodCBoZWxwIGNhY2hlIGxvY2FsaXR5IGEgYml0LiAgSWYgbXBuX211bCB3YXMgcmVsYXhlZAorICAgdG8gYWxsb3cgc291cmNlPT1kZXN0IHdoZW4gdm49PTEgb3IgMiB0aGVuIHNvbWUgcG9pbnRlciB0d2lkZGxpbmcgbWlnaHQKKyAgIGxldCB1cyBnZXQgdGhlIHNhbWUgZWZmZWN0IGluIG9uZSBsb29wLgorCisgICBUaGUgaW5pdGlhbCBwb3dlcmluZyBmb3IgYnNpemU9PTEgaW50byBibGltYiBvciBibGltYjpibGltYl9sb3cgZG9lc24ndAorICAgZm9ybSB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBwb3dlciBvZiBiIHRoYXQgZml0cywgb25seSB0aGUgYmlnZ2VzdCBwb3dlciBvZgorICAgMiBwb3dlciwgaWUuIGJeKDJebikuICBJdCdkIGJlIHBvc3NpYmxlIHRvIGNob29zZSBhIGJpZ2dlciBwb3dlciwgcGVyaGFwcworICAgdXNpbmcgbXBfYmFzZXNbYl0uYmlnX2Jhc2UgZm9yIHNtYWxsIGIsIGFuZCB0aGVyZWJ5IGdldCBiZXR0ZXIgdmFsdWUKKyAgIGZyb20gbXBuX211bF8xIG9yIG1wbl9tdWxfMiBpbiB0aGUgYmlnbnVtIHBvd2VyaW5nLiAgSXQncyBmZWx0IHRoYXQgZG9pbmcKKyAgIHNvIHdvdWxkIGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBpdCdzIHdvcnRoLCBhbmQgY291bGQgd2VsbCBlbmQgdXAgYmVpbmcKKyAgIGEgc2xvd2Rvd24gZm9yIHNtYWxsIGUuICBGb3IgYmlnIGUgb24gdGhlIG90aGVyIGhhbmQgdGhlIGFsZ29yaXRobSBpcworICAgZG9taW5hdGVkIGJ5IG1wbl9zcXIgc28gdGhlcmUgd291bGRuJ3QgbXVjaCBvZiBhIHNhdmluZy4gIFRoZSBjdXJyZW50CisgICBjb2RlIGNhbiBiZSB2aWV3ZWQgYXMgc2ltcGx5IGRvaW5nIHRoZSBmaXJzdCBmZXcgc3RlcHMgb2YgdGhlIHBvd2VyaW5nIGluCisgICBhIHNpbmdsZSBvciBkb3VibGUgbGltYiB3aGVyZSBwb3NzaWJsZS4KKworICAgSWYgcj09YiwgYW5kIGJsb3dfdHdvcz09MCwgYW5kIHIgbXVzdCBiZSByZWFsbG9jJ2VkLCB0aGVuIHRoZSB0ZW1wb3JhcnkKKyAgIGNvcHkgbWFkZSBvZiBiIGlzIHVubmVjZXNzYXJ5LiAgV2UgY291bGQganVzdCB1c2UgdGhlIG9sZCBhbGxvYydlZCBibG9jaworICAgYW5kIGZyZWUgaXQgYXQgdGhlIGVuZC4gIEJ1dCBhcnJhbmdpbmcgdGhpcyBzZWVtcyBsaWtlIGEgbG90IG1vcmUgdHJvdWJsZQorICAgdGhhbiBpdCdzIHdvcnRoLiAgKi8KKworCisvKiBmbG9vcihzcXJ0KEdNUF9OVU1CX01BWCkpLCBpZS4gdGhlIGJpZ2dlc3QgdmFsdWUgdGhhdCBjYW4gYmUgc3F1YXJlZCBpbgorICAgYSBsaW1iIHdpdGhvdXQgb3ZlcmZsb3dpbmcuCisgICBGSVhNRTogVGhpcyBmb3JtdWxhIGlzIGFuIHVuZGVyZXN0aW1hdGUgd2hlbiBHTVBfTlVNQl9CSVRTIGlzIG9kZC4gKi8KKworI2RlZmluZSBHTVBfTlVNQl9IQUxGTUFYICAoKChtcF9saW1iX3QpIDEgPDwgR01QX05VTUJfQklUUy8yKSAtIDEpCisKKworLyogVGhlIGZvbGxvd2luZyBhcmUgZm9yIGNvbnZlbmllbmNlLCB0aGV5IHVwZGF0ZSB0aGUgc2l6ZSBhbmQgY2hlY2sgdGhlCisgICBhbGxvYy4gICovCisKKyNkZWZpbmUgTVBOX1NRUihkc3QsIGFsbG9jLCBzcmMsIHNpemUpICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlQgKDIqKHNpemUpIDw9IChhbGxvYykpOyAgICAgICAgICAgICAgIFwKKyAgICBtcG5fc3FyIChkc3QsIHNyYywgc2l6ZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc2l6ZSkgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc2l6ZSkgLT0gKChkc3QpWyhzaXplKS0xXSA9PSAwKTsgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fTVVMKGRzdCwgYWxsb2MsIHNyYywgc2l6ZSwgc3JjMiwgc2l6ZTIpICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIGN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVCAoKHNpemUpICsgKHNpemUyKSA8PSAoYWxsb2MpKTsgICAgICAgICAgICAgICBcCisgICAgY3kgPSBtcG5fbXVsIChkc3QsIHNyYywgc2l6ZSwgc3JjMiwgc2l6ZTIpOyAgICAgICAgIFwKKyAgICAoc2l6ZSkgKz0gKHNpemUyKSAtIChjeSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QTl9NVUxfMihwdHIsIHNpemUsIGFsbG9jLCBtdWx0KSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90ICBjeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUICgoc2l6ZSkrMiA8PSAoYWxsb2MpKTsgICAgICAgICAgICAgICBcCisgICAgY3kgPSBtcG5fbXVsXzIgKHB0ciwgcHRyLCBzaXplLCBtdWx0KTsgICAgICBcCisgICAgKHNpemUpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHB0cilbKHNpemUpXSA9IGN5OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNpemUpICs9IChjeSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX01VTF8xKHB0ciwgc2l6ZSwgYWxsb2MsIGxpbWIpICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIGN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlQgKChzaXplKSsxIDw9IChhbGxvYykpOyAgICAgICAgICAgICAgIFwKKyAgICBjeSA9IG1wbl9tdWxfMSAocHRyLCBwdHIsIHNpemUsIGxpbWIpOyAgICAgIFwKKyAgICAocHRyKVtzaXplXSA9IGN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc2l6ZSkgKz0gKGN5ICE9IDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fTFNISUZUKHB0ciwgc2l6ZSwgYWxsb2MsIHNoaWZ0KSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgY3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVCAoKHNpemUpKzEgPD0gKGFsbG9jKSk7ICAgICAgICAgICAgICAgXAorICAgIGN5ID0gbXBuX2xzaGlmdCAocHRyLCBwdHIsIHNpemUsIHNoaWZ0KTsgICAgXAorICAgIChwdHIpW3NpemVdID0gY3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzaXplKSArPSAoY3kgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1QTl9SU0hJRlRfT1JfQ09QWShkc3QsIHNyYywgc2l6ZSwgc2hpZnQpICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoc2hpZnQpID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNUE5fQ09QWSAoZHN0LCBzcmMsIHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1wbl9yc2hpZnQgKGRzdCwgc3JjLCBzaXplLCBzaGlmdCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgKHNpemUpIC09ICgoZHN0KVsoc2l6ZSktMV0gPT0gMCk7ICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogcmFsbG9jIGFuZCB0YWxsb2MgYXJlIG9ubHkgd2FudGVkIGZvciBBU1NFUlRzLCBhZnRlciB0aGUgaW5pdGlhbCBzcGFjZQorICAgYWxsb2NhdGlvbnMuICBBdm9pZCB3cml0aW5nIHZhbHVlcyB0byB0aGVtIGluIGEgbm9ybWFsIGJ1aWxkLCB0byBlbnN1cmUKKyAgIHRoZSBjb21waWxlciBsZXRzIHRoZW0gZ28gZGVhZC4gIGdjYyBhbHJlYWR5IGZpZ3VyZXMgdGhpcyBvdXQgaXRzZWxmCisgICBhY3R1YWxseS4gICovCisKKyNkZWZpbmUgU1dBUF9SUF9UUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTVBfUFRSX1NXQVAgKHJwLCB0cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlRfQ09ERSAoTVBfU0laRV9UX1NXQVAgKHJhbGxvYywgdGFsbG9jKSk7ICAgICAgXAorICB9IHdoaWxlICgwKQorCisKK3ZvaWQKK21wel9uX3Bvd191aSAobXB6X3B0ciByLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBic2l6ZSwgdW5zaWduZWQgbG9uZyBpbnQgZSkKK3sKKyAgbXBfcHRyICAgICAgICAgcnA7CisgIG1wX3NpemVfdCAgICAgIHJ0d29zX2xpbWJzLCByYWxsb2MsIHJzaXplOworICBpbnQgICAgICAgICAgICBybmVnLCBpLCBjbnQsIGJ0d29zLCByX2JwX292ZXJsYXA7CisgIG1wX2xpbWJfdCAgICAgIGJsaW1iLCBybDsKKyAgbXBfYml0Y250X3QgICAgcnR3b3NfYml0czsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgbXBfbGltYl90ICAgICAgYmxpbWJfbG93LCBybF9oaWdoOworI2Vsc2UKKyAgbXBfbGltYl90ICAgICAgYl90d29saW1ic1syXTsKKyNlbmRpZgorICBUTVBfREVDTDsKKworICBUUkFDRSAocHJpbnRmICgibXB6X25fcG93X3VpIHJwPTB4JWxYIGJwPTB4JWxYIGJzaXplPSVsZCBlPSVsdSAoMHglbFgpXG4iLAorCQkgUFRSKHIpLCBicCwgYnNpemUsIGUsIGUpOworCSBtcG5fdHJhY2UgKCJiIiwgYnAsIGJzaXplKSk7CisKKyAgQVNTRVJUIChic2l6ZSA9PSAwIHx8IGJwW0FCUyhic2l6ZSktMV0gIT0gMCk7CisgIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AgKFBUUihyKSwgQUxMT0MociksIGJwLCBBQlMoYnNpemUpKSk7CisKKyAgLyogYl4wID09IDEsIGluY2x1ZGluZyAwXjAgPT0gMSAqLworICBpZiAoZSA9PSAwKQorICAgIHsKKyAgICAgIE1QWl9ORVdBTExPQyAociwgMSlbMF0gPSAxOworICAgICAgU0laKHIpID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogMF5lID09IDAgYXBhcnQgZnJvbSAwXjAgYWJvdmUgKi8KKyAgaWYgKGJzaXplID09IDApCisgICAgeworICAgICAgU0laKHIpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogU2lnbiBvZiB0aGUgZmluYWwgcmVzdWx0LiAqLworICBybmVnID0gKGJzaXplIDwgMCAmJiAoZSAmIDEpICE9IDApOworICBic2l6ZSA9IEFCUyAoYnNpemUpOworICBUUkFDRSAocHJpbnRmICgicm5lZyAlZFxuIiwgcm5lZykpOworCisgIHJfYnBfb3ZlcmxhcCA9IChQVFIocikgPT0gYnApOworCisgIC8qIFN0cmlwIGxvdyB6ZXJvIGxpbWJzIGZyb20gYi4gKi8KKyAgcnR3b3NfbGltYnMgPSAwOworICBmb3IgKGJsaW1iID0gKmJwOyBibGltYiA9PSAwOyBibGltYiA9ICorK2JwKQorICAgIHsKKyAgICAgIHJ0d29zX2xpbWJzICs9IGU7CisgICAgICBic2l6ZS0tOyBBU1NFUlQgKGJzaXplID49IDEpOworICAgIH0KKyAgVFJBQ0UgKHByaW50ZiAoInRyYWlsaW5nIHplcm8gcnR3b3NfbGltYnM9JWxkXG4iLCBydHdvc19saW1icykpOworCisgIC8qIFN0cmlwIGxvdyB6ZXJvIGJpdHMgZnJvbSBiLiAqLworICBjb3VudF90cmFpbGluZ196ZXJvcyAoYnR3b3MsIGJsaW1iKTsKKyAgYmxpbWIgPj49IGJ0d29zOworICBydHdvc19iaXRzID0gZSAqIGJ0d29zOworICBydHdvc19saW1icyArPSBydHdvc19iaXRzIC8gR01QX05VTUJfQklUUzsKKyAgcnR3b3NfYml0cyAlPSBHTVBfTlVNQl9CSVRTOworICBUUkFDRSAocHJpbnRmICgidHJhaWxpbmcgemVybyBidHdvcz0lZCBydHdvc19saW1icz0lbGQgcnR3b3NfYml0cz0lbHVcbiIsCisJCSBidHdvcywgcnR3b3NfbGltYnMsIHJ0d29zX2JpdHMpKTsKKworICBUTVBfTUFSSzsKKworICBybCA9IDE7CisjaWYgSEFWRV9OQVRJVkVfbXBuX211bF8yCisgIHJsX2hpZ2ggPSAwOworI2VuZGlmCisKKyAgaWYgKGJzaXplID09IDEpCisgICAgeworICAgIGJzaXplXzE6CisgICAgICAvKiBQb3dlciB1cCBhcyBmYXIgYXMgcG9zc2libGUgd2l0aGluIGJsaW1iLiAgV2Ugc3RhcnQgaGVyZSB3aXRoIGUhPTAsCisJIGJ1dCBpZiBlIGlzIHNtYWxsIHRoZW4gd2UgbWlnaHQgcmVhY2ggZT09MCBhbmQgdGhlIHdob2xlIGJeZSBpbiBybC4KKwkgTm90aWNlIHRoaXMgY29kZSB3b3JrcyB3aGVuIGJsaW1iPT0xIHRvbywgcmVhY2hpbmcgZT09MC4gICovCisKKyAgICAgIHdoaWxlIChibGltYiA8PSBHTVBfTlVNQl9IQUxGTUFYKQorCXsKKwkgIFRSQUNFIChwcmludGYgKCJzbWFsbCBlPTB4JWxYIGJsaW1iPTB4JWxYIHJsPTB4JWxYXG4iLAorCQkJIGUsIGJsaW1iLCBybCkpOworCSAgQVNTRVJUIChlICE9IDApOworCSAgaWYgKChlICYgMSkgIT0gMCkKKwkgICAgcmwgKj0gYmxpbWI7CisJICBlID4+PSAxOworCSAgaWYgKGUgPT0gMCkKKwkgICAgZ290byBnb3Rfcmw7CisJICBibGltYiAqPSBibGltYjsKKwl9CisKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgICAgIFRSQUNFIChwcmludGYgKCJzaW5nbGUgcG93ZXIsIGU9MHglbFggYj0weCVsWCBybD0weCVsWFxuIiwKKwkJICAgICBlLCBibGltYiwgcmwpKTsKKworICAgICAgLyogQ2FuIHBvd2VyIGIgb25jZSBtb3JlIGludG8gYmxpbWI6YmxpbWJfbG93ICovCisgICAgICBic2l6ZSA9IDI7CisgICAgICBBU1NFUlQgKGUgIT0gMCk7CisgICAgICBpZiAoKGUgJiAxKSAhPSAwKQorCXsKKwkgIHVtdWxfcHBtbSAocmxfaGlnaCwgcmwsIHJsLCBibGltYiA8PCBHTVBfTkFJTF9CSVRTKTsKKwkgIHJsID4+PSBHTVBfTkFJTF9CSVRTOworCX0KKyAgICAgIGUgPj49IDE7CisgICAgICB1bXVsX3BwbW0gKGJsaW1iLCBibGltYl9sb3csIGJsaW1iLCBibGltYiA8PCBHTVBfTkFJTF9CSVRTKTsKKyAgICAgIGJsaW1iX2xvdyA+Pj0gR01QX05BSUxfQklUUzsKKworICAgIGdvdF9ybDoKKyAgICAgIFRSQUNFIChwcmludGYgKCJkb3VibGUgcG93ZXIgZT0weCVsWCBibGltYj0weCVsWDoweCVsWCBybD0weCVsWDolbFhcbiIsCisJCSAgICAgZSwgYmxpbWIsIGJsaW1iX2xvdywgcmxfaGlnaCwgcmwpKTsKKworICAgICAgLyogQ29tYmluZSBsZWZ0LW92ZXIgcnR3b3NfYml0cyBpbnRvIHJsX2hpZ2g6cmwgdG8gYmUgaGFuZGxlZCBieSB0aGUKKwkgZmluYWwgbXVsXzEgb3IgbXVsXzIgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBsc2hpZnQuCisJIC0gcmxfaGlnaDpybCBtdXN0bid0IGJlIDEgKHNpbmNlIHRoZW4gdGhlcmUncyBubyBmaW5hbCBtdWwpCisJIC0gcmxfaGlnaCBtdXN0bid0IG92ZXJmbG93CisJIC0gcmxfaGlnaCBtdXN0bid0IGNoYW5nZSB0byBub24temVybywgc2luY2UgbXVsXzErbHNoaWZ0IGlzCisJIHByb2JhYmx5IGZhc3RlciB0aGFuIG11bF8yIChGSVhNRTogaXMgdGhpcyB0cnVlPykgICovCisKKyAgICAgIGlmIChydHdvc19iaXRzICE9IDAKKwkgICYmICEgKHJsX2hpZ2ggPT0gMCAmJiBybCA9PSAxKQorCSAgJiYgKHJsX2hpZ2ggPj4gKEdNUF9OVU1CX0JJVFMtcnR3b3NfYml0cykpID09IDApCisJeworCSAgbXBfbGltYl90ICBuZXdfcmxfaGlnaCA9IChybF9oaWdoIDw8IHJ0d29zX2JpdHMpCisJICAgIHwgKHJsID4+IChHTVBfTlVNQl9CSVRTLXJ0d29zX2JpdHMpKTsKKwkgIGlmICghIChybF9oaWdoID09IDAgJiYgbmV3X3JsX2hpZ2ggIT0gMCkpCisJICAgIHsKKwkgICAgICBybF9oaWdoID0gbmV3X3JsX2hpZ2g7CisJICAgICAgcmwgPDw9IHJ0d29zX2JpdHM7CisJICAgICAgcnR3b3NfYml0cyA9IDA7CisJICAgICAgVFJBQ0UgKHByaW50ZiAoIm1lcmdlZCBydHdvc19iaXRzLCBybD0weCVsWDolbFhcbiIsCisJCQkgICAgIHJsX2hpZ2gsIHJsKSk7CisJICAgIH0KKwl9CisjZWxzZQorICAgIGdvdF9ybDoKKyAgICAgIFRSQUNFIChwcmludGYgKCJzbWFsbCBwb3dlciBlPTB4JWxYIGJsaW1iPTB4JWxYIHJsPTB4JWxYXG4iLAorCQkgICAgIGUsIGJsaW1iLCBybCkpOworCisgICAgICAvKiBDb21iaW5lIGxlZnQtb3ZlciBydHdvc19iaXRzIGludG8gcmwgdG8gYmUgaGFuZGxlZCBieSB0aGUgZmluYWwKKwkgbXVsXzEgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBsc2hpZnQuCisJIC0gcmwgbXVzdG4ndCBiZSAxIChzaW5jZSB0aGVuIHRoZXJlJ3Mgbm8gZmluYWwgbXVsKQorCSAtIHJsIG11c3RuJ3Qgb3ZlcmZsb3cJKi8KKworICAgICAgaWYgKHJ0d29zX2JpdHMgIT0gMAorCSAgJiYgcmwgIT0gMQorCSAgJiYgKHJsID4+IChHTVBfTlVNQl9CSVRTLXJ0d29zX2JpdHMpKSA9PSAwKQorCXsKKwkgIHJsIDw8PSBydHdvc19iaXRzOworCSAgcnR3b3NfYml0cyA9IDA7CisJICBUUkFDRSAocHJpbnRmICgibWVyZ2VkIHJ0d29zX2JpdHMsIHJsPTB4JWxYXG4iLCBybCkpOworCX0KKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoYnNpemUgPT0gMikKKyAgICB7CisgICAgICBtcF9saW1iX3QgIGJzZWNvbmQgPSBicFsxXTsKKyAgICAgIGlmIChidHdvcyAhPSAwKQorCWJsaW1iIHw9IChic2Vjb25kIDw8IChHTVBfTlVNQl9CSVRTIC0gYnR3b3MpKSAmIEdNUF9OVU1CX01BU0s7CisgICAgICBic2Vjb25kID4+PSBidHdvczsKKyAgICAgIGlmIChic2Vjb25kID09IDApCisJeworCSAgLyogVHdvIGxpbWJzIGJlY2FtZSBvbmUgYWZ0ZXIgcnNoaWZ0LiAqLworCSAgYnNpemUgPSAxOworCSAgZ290byBic2l6ZV8xOworCX0KKworICAgICAgVFJBQ0UgKHByaW50ZiAoImJzaXplPT0yIHVzaW5nIGI9MHglbFg6JWxYIiwgYnNlY29uZCwgYmxpbWIpKTsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgICAgIGJsaW1iX2xvdyA9IGJsaW1iOworI2Vsc2UKKyAgICAgIGJwID0gYl90d29saW1iczsKKyAgICAgIGJfdHdvbGltYnNbMF0gPSBibGltYjsKKyAgICAgIGJfdHdvbGltYnNbMV0gPSBic2Vjb25kOworI2VuZGlmCisgICAgICBibGltYiA9IGJzZWNvbmQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHJfYnBfb3ZlcmxhcCB8fCBidHdvcyAhPSAwKQorCXsKKwkgIG1wX3B0ciB0cCA9IFRNUF9BTExPQ19MSU1CUyAoYnNpemUpOworCSAgTVBOX1JTSElGVF9PUl9DT1BZICh0cCwgYnAsIGJzaXplLCBidHdvcyk7CisJICBicCA9IHRwOworCSAgVFJBQ0UgKHByaW50ZiAoInJzaGlmdCBvciBjb3B5IGJwLGJzaXplLCBuZXcgYnNpemU9JWxkXG4iLCBic2l6ZSkpOworCX0KKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgICAgIC8qIGluIGNhc2UgMyBsaW1icyByc2hpZnQgdG8gMiBhbmQgaGVuY2UgdXNlIHRoZSBtdWxfMiBsb29wIGJlbG93ICovCisgICAgICBibGltYl9sb3cgPSBicFswXTsKKyNlbmRpZgorICAgICAgYmxpbWIgPSBicFtic2l6ZS0xXTsKKworICAgICAgVFJBQ0UgKHByaW50ZiAoImJpZyBic2l6ZT0lbGQgICIsIGJzaXplKTsKKwkgICAgIG1wbl90cmFjZSAoImIiLCBicCwgYnNpemUpKTsKKyAgICB9CisKKyAgLyogQXQgdGhpcyBwb2ludCBibGltYiBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHRoZSBiYXNlIHRvIHVzZS4KKworICAgICBFYWNoIGZhY3RvciBvZiBiIHRha2VzIChic2l6ZSpCUE1MLWNudCkgYml0cyBhbmQgdGhlcmUncyBlIG9mIHRoZW07ICsxCisgICAgIGxpbWIgdG8gcm91bmQgdXAgdGhlIGRpdmlzaW9uOyArMSBmb3IgbXVsdGlwbGllcyBhbGwgdXNpbmcgYW4gZXh0cmEKKyAgICAgbGltYiBvdmVyIHRoZSB0cnVlIHNpemU7ICsyIGZvciBybCBhdCB0aGUgZW5kOyArMSBmb3IgbHNoaWZ0IGF0IHRoZQorICAgICBlbmQuCisKKyAgICAgVGhlIHNpemUgY2FsY3VsYXRpb24gaGVyZSBpcyByZWFzb25hYmx5IGFjY3VyYXRlLiAgVGhlIGJhc2UgaXMgYXQgbGVhc3QKKyAgICAgaGFsZiBhIGxpbWIsIHNvIGluIDMyIGJpdHMgdGhlIHdvcnN0IGNhc2UgaXMgMl4xNisxIHRyZWF0ZWQgYXMgMTcgYml0cworICAgICB3aGVuIGl0IHdpbGwgcG93ZXIgdXAgYXMganVzdCBvdmVyIDE2LCBhbiBvdmVyZXN0aW1hdGUgb2YgMTcvMTYgPQorICAgICA2LjI1JS4gIEZvciBhIDY0LWJpdCBsaW1iIGl0J3MgaGFsZiB0aGF0LgorCisgICAgIElmIGU9PTAgdGhlbiBibGltYiB3b24ndCBiZSBhbnl0aGluZyB1c2VmdWwgKHRob3VnaCBpdCB3aWxsIGJlCisgICAgIG5vbi16ZXJvKSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgc2luY2Ugd2UganVzdCBlbmQgdXAgd2l0aCByYWxsb2M9PTUsCisgICAgIGFuZCB0aGF0J3MgZmluZSBmb3IgMiBsaW1icyBvZiBybCBhbmQgMSBvZiBsc2hpZnQuICAqLworCisgIEFTU0VSVCAoYmxpbWIgIT0gMCk7CisgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgYmxpbWIpOworICByYWxsb2MgPSAoYnNpemUqR01QX05VTUJfQklUUyAtIGNudCArIEdNUF9OQUlMX0JJVFMpICogZSAvIEdNUF9OVU1CX0JJVFMgKyA1OworICBUUkFDRSAocHJpbnRmICgicmFsbG9jICVsZCwgZnJvbSBic2l6ZT0lbGQgYmxpbWI9MHglbFggY250PSVkXG4iLAorCQkgcmFsbG9jLCBic2l6ZSwgYmxpbWIsIGNudCkpOworICBycCA9IE1QWl9ORVdBTExPQyAociwgcmFsbG9jICsgcnR3b3NfbGltYnMpOworCisgIC8qIExvdyB6ZXJvIGxpbWJzIHJlc3VsdGluZyBmcm9tIHBvd2VycyBvZiAyLiAqLworICBNUE5fWkVSTyAocnAsIHJ0d29zX2xpbWJzKTsKKyAgcnAgKz0gcnR3b3NfbGltYnM7CisKKyAgaWYgKGUgPT0gMCkKKyAgICB7CisgICAgICAvKiBBbnkgZT09MCBvdGhlciB0aGFuIHZpYSBic2l6ZT09MSBvciBic2l6ZT09MiBpcyBjb3ZlcmVkIGF0IHRoZQorCSBzdGFydC4gKi8KKyAgICAgIHJwWzBdID0gcmw7CisgICAgICByc2l6ZSA9IDE7CisjaWYgSEFWRV9OQVRJVkVfbXBuX211bF8yCisgICAgICBycFsxXSA9IHJsX2hpZ2g7CisgICAgICByc2l6ZSArPSAocmxfaGlnaCAhPSAwKTsKKyNlbmRpZgorICAgICAgQVNTRVJUIChycFtyc2l6ZS0xXSAhPSAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9wdHIgICAgIHRwOworICAgICAgbXBfc2l6ZV90ICB0YWxsb2M7CisKKyAgICAgIC8qIEluIHRoZSBtcG5fbXVsXzEgb3IgbXBuX211bF8yIGxvb3BzIG9yIGluIHRoZSBtcG5fbXVsIGxvb3Agd2hlbiB0aGUKKwkgbG93IGJpdCBvZiBlIGlzIHplcm8sIHRwIG9ubHkgaGFzIHRvIGhvbGQgdGhlIHNlY29uZCBsYXN0IHBvd2VyCisJIHN0ZXAsIHdoaWNoIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIGZpbmFsIHJlc3VsdC4gIFRoZXJlJ3Mgbm8gbmVlZAorCSB0byByb3VuZCB1cCB0aGUgZGl2aWRlIGJ5IDIsIHNpbmNlIHJhbGxvYyBpbmNsdWRlcyBhICsyIGZvciBybAorCSB3aGljaCBub3QgbmVlZGVkIGJ5IHRwLiAgSW4gdGhlIG1wbl9tdWwgbG9vcCB3aGVuIHRoZSBsb3cgYml0IG9mIGUKKwkgaXMgMSwgdHAgbXVzdCBob2xkIG5lYXJseSB0aGUgZnVsbCByZXN1bHQsIHNvIGp1c3Qgc2l6ZSBpdCB0aGUgc2FtZQorCSBhcyBycC4gICovCisKKyAgICAgIHRhbGxvYyA9IHJhbGxvYzsKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgICAgIGlmIChic2l6ZSA8PSAyIHx8IChlICYgMSkgPT0gMCkKKwl0YWxsb2MgLz0gMjsKKyNlbHNlCisgICAgICBpZiAoYnNpemUgPD0gMSB8fCAoZSAmIDEpID09IDApCisJdGFsbG9jIC89IDI7CisjZW5kaWYKKyAgICAgIFRSQUNFIChwcmludGYgKCJ0YWxsb2MgJWxkXG4iLCB0YWxsb2MpKTsKKyAgICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTICh0YWxsb2MpOworCisgICAgICAvKiBHbyBmcm9tIGhpZ2ggdG8gbG93IG92ZXIgdGhlIGJpdHMgb2YgZSwgc3RhcnRpbmcgd2l0aCBpIHBvaW50aW5nIGF0CisJIHRoZSBiaXQgYmVsb3cgdGhlIGhpZ2hlc3QgMSAod2hpY2ggd2lsbCBtZWFuIGk9PS0xIGlmIGU9PTEpLiAgKi8KKyAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKGNudCwgKG1wX2xpbWJfdCkgZSk7CisgICAgICBpID0gR01QX0xJTUJfQklUUyAtIGNudCAtIDI7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgICAgIGlmIChic2l6ZSA8PSAyKQorCXsKKwkgIG1wX2xpbWJfdCAgbXVsdFsyXTsKKworCSAgLyogQW55IGJzaXplPT0xIHdpbGwgaGF2ZSBiZWVuIHBvd2VyZWQgYWJvdmUgdG8gYmUgdHdvIGxpbWJzLiAqLworCSAgQVNTRVJUIChic2l6ZSA9PSAyKTsKKwkgIEFTU0VSVCAoYmxpbWIgIT0gMCk7CisKKwkgIC8qIEFycmFuZ2UgdGhlIGZpbmFsIHJlc3VsdCBlbmRzIHVwIGluIHIsIG5vdCBpbiB0aGUgdGVtcCBzcGFjZSAqLworCSAgaWYgKChpICYgMSkgPT0gMCkKKwkgICAgU1dBUF9SUF9UUDsKKworCSAgcnBbMF0gPSBibGltYl9sb3c7CisJICBycFsxXSA9IGJsaW1iOworCSAgcnNpemUgPSAyOworCisJICBtdWx0WzBdID0gYmxpbWJfbG93OworCSAgbXVsdFsxXSA9IGJsaW1iOworCisJICBmb3IgKCA7IGkgPj0gMDsgaS0tKQorCSAgICB7CisJICAgICAgVFJBQ0UgKHByaW50ZiAoIm11bF8yIGxvb3AgaT0lZCBlPTB4JWxYLCByc2l6ZT0lbGQgcmFsbG9jPSVsZCB0YWxsb2M9JWxkXG4iLAorCQkJICAgICBpLCBlLCByc2l6ZSwgcmFsbG9jLCB0YWxsb2MpOworCQkgICAgIG1wbl90cmFjZSAoInIiLCBycCwgcnNpemUpKTsKKworCSAgICAgIE1QTl9TUVIgKHRwLCB0YWxsb2MsIHJwLCByc2l6ZSk7CisJICAgICAgU1dBUF9SUF9UUDsKKwkgICAgICBpZiAoKGUgJiAoMUwgPDwgaSkpICE9IDApCisJCU1QTl9NVUxfMiAocnAsIHJzaXplLCByYWxsb2MsIG11bHQpOworCSAgICB9CisKKwkgIFRSQUNFIChtcG5fdHJhY2UgKCJtdWxfMiBiZWZvcmUgcmwsIHIiLCBycCwgcnNpemUpKTsKKwkgIGlmIChybF9oaWdoICE9IDApCisJICAgIHsKKwkgICAgICBtdWx0WzBdID0gcmw7CisJICAgICAgbXVsdFsxXSA9IHJsX2hpZ2g7CisJICAgICAgTVBOX01VTF8yIChycCwgcnNpemUsIHJhbGxvYywgbXVsdCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJsICE9IDEpCisJICAgIE1QTl9NVUxfMSAocnAsIHJzaXplLCByYWxsb2MsIHJsKTsKKwl9CisjZWxzZQorICAgICAgaWYgKGJzaXplID09IDEpCisJeworCSAgLyogQXJyYW5nZSB0aGUgZmluYWwgcmVzdWx0IGVuZHMgdXAgaW4gciwgbm90IGluIHRoZSB0ZW1wIHNwYWNlICovCisJICBpZiAoKGkgJiAxKSA9PSAwKQorCSAgICBTV0FQX1JQX1RQOworCisJICBycFswXSA9IGJsaW1iOworCSAgcnNpemUgPSAxOworCisJICBmb3IgKCA7IGkgPj0gMDsgaS0tKQorCSAgICB7CisJICAgICAgVFJBQ0UgKHByaW50ZiAoIm11bF8xIGxvb3AgaT0lZCBlPTB4JWxYLCByc2l6ZT0lbGQgcmFsbG9jPSVsZCB0YWxsb2M9JWxkXG4iLAorCQkJICAgICBpLCBlLCByc2l6ZSwgcmFsbG9jLCB0YWxsb2MpOworCQkgICAgIG1wbl90cmFjZSAoInIiLCBycCwgcnNpemUpKTsKKworCSAgICAgIE1QTl9TUVIgKHRwLCB0YWxsb2MsIHJwLCByc2l6ZSk7CisJICAgICAgU1dBUF9SUF9UUDsKKwkgICAgICBpZiAoKGUgJiAoMUwgPDwgaSkpICE9IDApCisJCU1QTl9NVUxfMSAocnAsIHJzaXplLCByYWxsb2MsIGJsaW1iKTsKKwkgICAgfQorCisJICBUUkFDRSAobXBuX3RyYWNlICgibXVsXzEgYmVmb3JlIHJsLCByIiwgcnAsIHJzaXplKSk7CisJICBpZiAocmwgIT0gMSkKKwkgICAgTVBOX01VTF8xIChycCwgcnNpemUsIHJhbGxvYywgcmwpOworCX0KKyNlbmRpZgorICAgICAgZWxzZQorCXsKKwkgIGludCAgcGFyaXR5OworCisJICAvKiBBcnJhbmdlIHRoZSBmaW5hbCByZXN1bHQgZW5kcyB1cCBpbiByLCBub3QgaW4gdGhlIHRlbXAgc3BhY2UgKi8KKwkgIFVMT05HX1BBUklUWSAocGFyaXR5LCBlKTsKKwkgIGlmICgoKHBhcml0eSBeIGkpICYgMSkgIT0gMCkKKwkgICAgU1dBUF9SUF9UUDsKKworCSAgTVBOX0NPUFkgKHJwLCBicCwgYnNpemUpOworCSAgcnNpemUgPSBic2l6ZTsKKworCSAgZm9yICggOyBpID49IDA7IGktLSkKKwkgICAgeworCSAgICAgIFRSQUNFIChwcmludGYgKCJtdWwgbG9vcCBpPSVkIGU9MHglbFgsIHJzaXplPSVsZCByYWxsb2M9JWxkIHRhbGxvYz0lbGRcbiIsCisJCQkgICAgIGksIGUsIHJzaXplLCByYWxsb2MsIHRhbGxvYyk7CisJCSAgICAgbXBuX3RyYWNlICgiciIsIHJwLCByc2l6ZSkpOworCisJICAgICAgTVBOX1NRUiAodHAsIHRhbGxvYywgcnAsIHJzaXplKTsKKwkgICAgICBTV0FQX1JQX1RQOworCSAgICAgIGlmICgoZSAmICgxTCA8PCBpKSkgIT0gMCkKKwkJeworCQkgIE1QTl9NVUwgKHRwLCB0YWxsb2MsIHJwLCByc2l6ZSwgYnAsIGJzaXplKTsKKwkJICBTV0FQX1JQX1RQOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIEFTU0VSVCAocnAgPT0gUFRSKHIpICsgcnR3b3NfbGltYnMpOworICBUUkFDRSAobXBuX3RyYWNlICgiZW5kIGxvb3AgciIsIHJwLCByc2l6ZSkpOworICBUTVBfRlJFRTsKKworICAvKiBBcHBseSBhbnkgcGFydGlhbCBsaW1iIGZhY3RvcnMgb2YgMi4gKi8KKyAgaWYgKHJ0d29zX2JpdHMgIT0gMCkKKyAgICB7CisgICAgICBNUE5fTFNISUZUIChycCwgcnNpemUsIHJhbGxvYywgKHVuc2lnbmVkKSBydHdvc19iaXRzKTsKKyAgICAgIFRSQUNFIChtcG5fdHJhY2UgKCJsc2hpZnQgciIsIHJwLCByc2l6ZSkpOworICAgIH0KKworICByc2l6ZSArPSBydHdvc19saW1iczsKKyAgU0laKHIpID0gKHJuZWcgPyAtcnNpemUgOiByc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tcHovbmVnLmMgYi9tcHovbmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzZmJjZgotLS0gL2Rldi9udWxsCisrKyBiL21wei9uZWcuYwpAQCAtMCwwICsxLDU2IEBACisvKiBtcHpfbmVnKG1wel9wdHIgZHN0LCBtcHpfcHRyIHNyYykgLS0gQXNzaWduIHRoZSBuZWdhdGVkIHZhbHVlIG9mIFNSQyB0byBEU1QuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXB6X25lZyAxCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfbmVnIChtcHpfcHRyIHcsIG1wel9zcmNwdHIgdSkKK3sKKyAgbXBfcHRyIHdwOworICBtcF9zcmNwdHIgdXA7CisgIG1wX3NpemVfdCB1c2l6ZSwgc2l6ZTsKKworICB1c2l6ZSA9IFNJWiAodSk7CisKKyAgaWYgKHUgIT0gdykKKyAgICB7CisgICAgICBzaXplID0gQUJTICh1c2l6ZSk7CisKKyAgICAgIHdwID0gTVBaX05FV0FMTE9DICh3LCBzaXplKTsKKworICAgICAgdXAgPSBQVFIgKHUpOworCisgICAgICBNUE5fQ09QWSAod3AsIHVwLCBzaXplKTsKKyAgICB9CisKKyAgU0laICh3KSA9IC11c2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9uZXh0cHJpbWUuYyBiL21wei9uZXh0cHJpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmUyNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L25leHRwcmltZS5jCkBAIC0wLDAgKzEsMjkxIEBACisvKiBtcHpfbmV4dHByaW1lKHAsdCkgLSBjb21wdXRlIHRoZSBuZXh0IHByaW1lID4gdCBhbmQgc3RvcmUgdGhhdCBpbiBwLgorCitDb3B5cmlnaHQgMTk5OS0yMDAxLCAyMDA4LCAyMDA5LCAyMDEyLCAyMDIwLTIwMjIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTmllbHMgTcO2bGxlciBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQuCitJbXByb3ZlZCBieSBTZXRoIFRyb2lzaS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBzaWV2ZTogc2lldmluZyBmdW5jdGlvbnMgYW5kIHRvb2xzIGZvciBwcmltZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBtcF9saW1iX3QKK25fdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKChuLTUpfDEpLzNVOyB9CisKK3N0YXRpYyBtcF9zaXplX3QKK3ByaW1lc2lldmVfc2l6ZSAobXBfbGltYl90IG4pIHsgcmV0dXJuIG5fdG9fYml0KG4pIC8gR01QX0xJTUJfQklUUyArIDE7IH0KKworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcmltZWdhcF9zbWFsbFtdID0KK3sKKyAgMiwyLDQsMiw0LDIsNCw2LDIsNiw0LDIsNCw2LDYsMiw2LDQsMiw2LDQsNiw4LDQsMiw0LDIsNCwxNCw0LDYsCisgIDIsMTAsMiw2LDYsNCw2LDYsMiwxMCwyLDQsMiwxMiwxMiw0LDIsNCw2LDIsMTAsNiw2LDYsMiw2LDQsMiwxMCwxNCw0LDIsCisgIDQsMTQsNiwxMCwyLDQsNiw4LDYsNiw0LDYsOCw0LDgsMTAsMiwxMCwyLDYsNCw2LDgsNCwyLDQsMTIsOCw0LDgsNCw2LAorICAxMiwyLDE4LDYsMTAKK307CisKKyNkZWZpbmUgTlVNQkVSX09GX1BSSU1FUyAxMDAKKyNkZWZpbmUgTEFTVF9QUklNRSA1NTcKKy8qIE5QX1NNQUxMX0xJTUlUID0gcHJldnByaW1lIChMQVNUX1BSSU1FIF4gMikgKi8KKyNkZWZpbmUgTlBfU01BTExfTElNSVQgMzEwMjQzCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitjYWxjdWxhdGVfc2lldmVsaW1pdChtcF9iaXRjbnRfdCBuYml0cykgeworICB1bnNpZ25lZCBsb25nIHNpZXZlX2xpbWl0OworCisgIC8qIEVzdGltYXRlIGEgZ29vZCBzaWV2ZSBib3VuZC4gQmFzZWQgb24gZGVyaXZhdGl2ZSBvZgorICAgKiAgIE1lcnRlbidzIDNyZCB0aGVvcmVtICogYXZnIGdhcCAqIGNvc3Qgb2YgbW9kCisgICAqICAgICAgdnMKKyAgICogICBDb3N0IG9mIFBSUCB0ZXN0IE8oTl4yLjU1KQorICAgKi8KKyAgaWYgKG5iaXRzIDwgMTI4MTgpCisgICAgeworICAgICAgbXB6X3QgdG1wOworICAgICAgLyogc2lldmVfbGltaXQgfj0gbmJpdHMgXiAoNS8yKSAvIDEyNCAqLworICAgICAgbXB6X2luaXQgKHRtcCk7CisgICAgICBtcHpfdWlfcG93X3VpICh0bXAsIG5iaXRzLCA1KTsKKyAgICAgIG1wel90ZGl2X3FfdWkodG1wLCB0bXAsIDEyNCoxMjQpOworICAgICAgLyogdG1wIDwgMTI4MTheNS8oMTI0KjEyNCkgPCAyXjU1IDwgMl42NCAqLworICAgICAgbXB6X3NxcnQgKHRtcCwgdG1wKTsKKworICAgICAgc2lldmVfbGltaXQgPSBtcHpfZ2V0X3VpKHRtcCk7CisgICAgICBtcHpfY2xlYXIgKHRtcCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTGFyZ2VyIHRocmVzaG9sZCBpcyBmYXN0ZXIgYnV0IHRha2VzIChuL2xuKG4pICsgbi8yNCkgbWVtb3J5LgorICAgICAgICogRm9yIDMzLDAwMCBiaXRzIGxpbWl0dGluZyB0byAxNTBNIGlzIH4xMiUgc2xvd2VyIHRoYW4gdXNpbmcgdGhlCisgICAgICAgKiBvcHRpbWFsIDEuNUcgc2lldmVfbGltaXQuCisgICAgICAgKi8KKyAgICAgIHNpZXZlX2xpbWl0ID0gMTUwMDAwMDAxOworICAgIH0KKworICBBU1NFUlQgKDEwMDAgPCBzaWV2ZV9saW1pdCAmJiBzaWV2ZV9saW1pdCA8PSAxNTAwMDAwMDEpOworICByZXR1cm4gc2lldmVfbGltaXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZmluZG5leHRfc21hbGwgKHVuc2lnbmVkIHQsIHNob3J0IGRpZmYpCit7CisgIC8qIEZvciBkaWZmPSAyLCBleHBlY3QgdCA9IDEgaWYgb3BlcmFuZCB3YXMgbmVnYXRpdmUuCisgICAqIEZvciBkaWZmPS0yLCBleHBlY3QgdCA+PSAzCisgICAqLworICBBU1NFUlQgKHQgPj0gMyB8fCAoZGlmZiA+IDAgJiYgdCA+PSAxKSk7CisgIEFTU0VSVCAodCA8IE5QX1NNQUxMX0xJTUlUKTsKKworICAvKiBTdGFydCBmcm9tIG5leHQgY2FuZGlkYXRlICgyIG9yIG9kZCkgKi8KKyAgdCA9IGRpZmYgPiAwID8KKyAgICAodCArIDEpIHwgKHQgIT0gMSkgOgorICAgICgodCAtIDIpIHwgMSkgKyAodCA9PSAzKTsKKworICBmb3IgKDsgOyB0ICs9IGRpZmYpCisgICAgeworICAgICAgdW5zaWduZWQgcHJpbWUgPSAzOworICAgICAgZm9yIChpbnQgaSA9IDA7IDsgcHJpbWUgKz0gcHJpbWVnYXBfc21hbGxbaSsrXSkKKwl7CisJICB1bnNpZ25lZCBxLCByOworCSAgcSA9IHQgLyBwcmltZTsKKwkgIHIgPSB0IC0gcSAqIHByaW1lOyAvKiByID0gdCAlIHByaW1lOyAqLworCSAgaWYgKHEgPCBwcmltZSkKKwkgICAgcmV0dXJuIHQ7CisJICBpZiAociA9PSAwKQorCSAgICBicmVhazsKKwkgIEFTU0VSVCAoaSA8IE5VTUJFUl9PRl9QUklNRVMpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRuZXh0IChtcHpfcHRyIHAsCisgICAgICAgICAgdW5zaWduZWQgbG9uZygqbmVnYXRpdmVfbW9kX3VpKShjb25zdCBtcHpfdCwgdW5zaWduZWQgbG9uZyksCisgICAgICAgICAgdm9pZCgqaW5jcmVtZW50X3VpKShtcHpfdCwgY29uc3QgbXB6X3QsIHVuc2lnbmVkIGxvbmcpKQoreworICBjaGFyICpjb21wb3NpdGU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByaW1lZ2FwOworICB1bnNpZ25lZCBsb25nIHByaW1lX2xpbWl0OworICBtcF9zaXplX3QgcG47CisgIG1wX2JpdGNudF90IG5iaXRzOworICBpbnQgaSwgbTsKKyAgdW5zaWduZWQgb2Rkc19pbl9jb21wb3NpdGVfc2lldmU7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworICBwbiA9IFNJWihwKTsKKyAgTVBOX1NJWkVJTkJBU0VfMkVYUChuYml0cywgUFRSKHApLCBwbiwgMSk7CisgIC8qIFNtYWxsZXIgbnVtYmVycyBoYW5kbGVkIGVhcmxpZXIgKi8KKyAgQVNTRVJUIChuYml0cyA+PSAzKTsKKyAgLyogTWFrZSBwIG9kZCAqLworICBQVFIocClbMF0gfD0gMTsKKworICBpZiAobmJpdHMgLyAyIDw9IE5VTUJFUl9PRl9QUklNRVMpCisgICAgeworICAgICAgcHJpbWVnYXAgPSBwcmltZWdhcF9zbWFsbDsKKyAgICAgIHByaW1lX2xpbWl0ID0gbmJpdHMgLyAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2lldmVfbGltaXQ7CisgICAgICBtcF9saW1iX3QgKnNpZXZlOworICAgICAgdW5zaWduZWQgY2hhciAqcHJpbWVnYXBfdG1wOworICAgICAgdW5zaWduZWQgbG9uZyBsYXN0X3ByaW1lOworCisgICAgICAvKiBzaWV2ZSBudW1iZXJzIHVwIHRvIHNpZXZlX2xpbWl0IGFuZCBzYXZlIHByaW1lIGNvdW50ICovCisgICAgICBzaWV2ZV9saW1pdCA9IGNhbGN1bGF0ZV9zaWV2ZWxpbWl0KG5iaXRzKTsKKyAgICAgIHNpZXZlID0gVE1QX0FMTE9DX0xJTUJTIChwcmltZXNpZXZlX3NpemUgKHNpZXZlX2xpbWl0KSk7CisgICAgICBwcmltZV9saW1pdCA9IGdtcF9wcmltZXNpZXZlKHNpZXZlLCBzaWV2ZV9saW1pdCk7CisKKyAgICAgIC8qIFRPRE86IFN0b3JpbmcgKHByaW1lIC0gbGFzdF9wcmltZSkvMiB3b3VsZCBhbGxvdyB0aGlzIHRvIGdvCisJIHVwIHRvIHRoZSBnYXAgMzA0NTk5NTA4NTM3KzUxND0zMDQ1OTk1MDkwNTEgLgorCSBXaXRoIHRoZSBjdXJyZW50IGNvZGUgb3VyIGxpbWl0IGlzIDQzNjI3MzAwOSsyODI9NDM2MjczMjkxICovCisgICAgICBBU1NFUlQgKHNpZXZlX2xpbWl0IDwgNDM2MjczMjkxKTsKKyAgICAgIC8qIFRISU5LOiBNZW1vcnkgdXNlZCBieSBib3RoIHNpZXZlIGFuZCBwcmltZWdhcF90bXAgaXMga2VwdAorCSBhbGxvY2F0ZWQsIGJ1dCB0aGV5IG1heSBvdmVybGFwIGlmIHByaW1lZ2FwIGlzIGZpbGxlZCBmcm9tCisJIGxhcmdlciBkb3duIHRvIHNtYWxsZXIgcHJpbWVzLi4uCisgICAgICAgKi8KKworICAgICAgLyogTmVlZGVkIHRvIGF2b2lkIGFzc2lnbm1lbnQgb2YgcmVhZC1vbmx5IGxvY2F0aW9uICovCisgICAgICBwcmltZWdhcF90bXAgPSBUTVBfQUxMT0NfVFlQRSAocHJpbWVfbGltaXQsIHVuc2lnbmVkIGNoYXIpOworICAgICAgcHJpbWVnYXAgPSBwcmltZWdhcF90bXA7CisKKyAgICAgIGkgPSAwOworICAgICAgbGFzdF9wcmltZSA9IDM7CisgICAgICAvKiBUSElOSzogc2hvdWxkIHdlIGdldCByaWQgb2Ygc2lldmVfbGltaXQgYW5kIHVzZSAoaSA8IHByaW1lX2xpbWl0KT8gKi8KKyAgICAgIGZvciAobXBfbGltYl90IGogPSA0LCAqc3AgPSBzaWV2ZTsgaiA8IHNpZXZlX2xpbWl0OyBqICs9IEdNUF9MSU1CX0JJVFMgKiAzKQorCWZvciAobXBfbGltYl90IGIgPSBqLCB4ID0gfiAqKHNwKyspOyB4ICE9IDA7IGIgKz0gMywgeCA+Pj0gMSkKKwkgIGlmICh4ICYgMSkKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdCBwcmltZSA9IGIgfCAxOworCSAgICAgIHByaW1lZ2FwX3RtcFtpKytdID0gcHJpbWUgLSBsYXN0X3ByaW1lOworCSAgICAgIGxhc3RfcHJpbWUgPSBwcmltZTsKKwkgICAgfQorCisgICAgICAvKiBCb3RoIHByaW1lc2lldmUgYW5kIHByaW1lX2xpbWl0IGlnbm9yZSB0aGUgZmlyc3QgdHdvIHByaW1lcy4gKi8KKyAgICAgIEFTU0VSVChpID09IHByaW1lX2xpbWl0KTsKKyAgICB9CisKKyAgaWYgKG5iaXRzIDw9IDMyKQorICAgIG9kZHNfaW5fY29tcG9zaXRlX3NpZXZlID0gMzM2IC8gMjsKKyAgZWxzZSBpZiAobmJpdHMgPD0gNjQpCisgICAgb2Rkc19pbl9jb21wb3NpdGVfc2lldmUgPSAxNTUwIC8gMjsKKyAgZWxzZQorICAgIC8qIENvcnJlc3BvbmRzIHRvIGEgbWVyaXQgMTQgcHJpbWVfZ2FwLCB3aGljaCBpcyByYXJlLiAqLworICAgIG9kZHNfaW5fY29tcG9zaXRlX3NpZXZlID0gNSAqIG5iaXRzOworCisgIC8qIGNvbXBvc2l0ZVsyKmldIHN0b3JlcyBpZiBwKzIqaSBpcyBhIGtub3duIGNvbXBvc2l0ZSAqLworICBjb21wb3NpdGUgPSBUTVBfQUxMT0NfVFlQRSAob2Rkc19pbl9jb21wb3NpdGVfc2lldmUsIGNoYXIpOworCisgIGZvciAoOzspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBkaWZmZXJlbmNlOworICAgICAgdW5zaWduZWQgbG9uZyBpbmNyLCBwcmltZTsKKyAgICAgIGludCBwcmltZXRlc3Q7CisKKyAgICAgIG1lbXNldCAoY29tcG9zaXRlLCAwLCBvZGRzX2luX2NvbXBvc2l0ZV9zaWV2ZSk7CisgICAgICBwcmltZSA9IDM7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWVfbGltaXQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc3RhbmNlIHRvIG5leHQgbXVsdGlwbGUgb2YgcHJpbWUgKi8KKyAgICAgICAgICBtID0gbmVnYXRpdmVfbW9kX3VpKHAsIHByaW1lKTsKKyAgICAgICAgICAvKiBPbmx5IGNhcmUgYWJvdXQgb2RkIG11bHRpcGxpZXMgb2YgcHJpbWUuICovCisgICAgICAgICAgaWYgKG0gJiAxKQorICAgICAgICAgICAgbSArPSBwcmltZTsKKyAgICAgICAgICBtID4+PSAxOworCisgICAgICAgICAgLyogTWFyayBvZmYgYW55IGNvbXBvc2l0ZXMgaW4gc2lldmUgKi8KKyAgICAgICAgICBmb3IgKDsgbSA8IG9kZHNfaW5fY29tcG9zaXRlX3NpZXZlOyBtICs9IHByaW1lKQorICAgICAgICAgICAgY29tcG9zaXRlW21dID0gMTsKKyAgICAgICAgICBwcmltZSArPSBwcmltZWdhcFtpXTsKKyAgICAgICAgfQorCisgICAgICBkaWZmZXJlbmNlID0gMDsKKyAgICAgIGZvciAoaW5jciA9IDA7IGluY3IgPCBvZGRzX2luX2NvbXBvc2l0ZV9zaWV2ZTsgZGlmZmVyZW5jZSArPSAyLCBpbmNyICs9IDEpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoY29tcG9zaXRlW2luY3JdKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBpbmNyZW1lbnRfdWkocCwgcCwgZGlmZmVyZW5jZSk7CisgICAgICAgICAgZGlmZmVyZW5jZSA9IDA7CisKKyAgICAgICAgICAvKiBNaWxsZXItUmFiaW4gdGVzdCAqLworICAgICAgICAgIHByaW1ldGVzdCA9IG1wel9taWxsZXJyYWJpbiAocCwgMjUpOworICAgICAgICAgIGlmIChwcmltZXRlc3QpCisJICAgIHsKKwkgICAgICBUTVBfRlJFRTsKKwkgICAgICByZXR1cm4gcHJpbWV0ZXN0OworCSAgICB9CisgICAgICAgIH0KKworICAgICAgLyogU2lldmUgbmV4dCBzZWdtZW50LCB2ZXJ5IHJhcmUgKi8KKyAgICAgIGluY3JlbWVudF91aShwLCBwLCBkaWZmZXJlbmNlKTsKKyAgfQorfQorCit2b2lkCittcHpfbmV4dHByaW1lIChtcHpfcHRyIHAsIG1wel9zcmNwdHIgbikKK3sKKyAgLyogSGFuZGxlIG5lZ2F0aXZlIGFuZCBzbWFsbCBudW1iZXJzICovCisgIGlmIChtcHpfY21wX3VpIChuLCBOUF9TTUFMTF9MSU1JVCkgPCAwKQorICAgIHsKKyAgICAgIEFTU0VSVCAoTlBfU01BTExfTElNSVQgPCBVSU5UX01BWCk7CisgICAgICBtcHpfc2V0X3VpIChwLCBmaW5kbmV4dF9zbWFsbCAoU0laIChuKSA+IDAgPyBtcHpfZ2V0X3VpIChuKSA6IDEsICsyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEZpcnN0IG9kZCBncmVhdGVyIHRoYW4gbiAqLworICBtcHpfYWRkX3VpIChwLCBuLCAxKTsKKworICBmaW5kbmV4dChwLCBtcHpfY2Rpdl91aSwgbXB6X2FkZF91aSk7Cit9CisKK2ludAorbXB6X3ByZXZwcmltZSAobXB6X3B0ciBwLCBtcHpfc3JjcHRyIG4pCit7CisgIC8qIEhhbmRsZSBuZWdhdGl2ZSBhbmQgc21hbGwgbnVtYmVycyAqLworICBpZiAobXB6X2NtcF91aSAobiwgMikgPD0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAobXB6X2NtcF91aSAobiwgTlBfU01BTExfTElNSVQpIDwgMCkKKyAgICB7CisgICAgICBBU1NFUlQgKE5QX1NNQUxMX0xJTUlUIDwgVUlOVF9NQVgpOworICAgICAgbXB6X3NldF91aSAocCwgZmluZG5leHRfc21hbGwgKG1wel9nZXRfdWkgKG4pLCAtMikpOworICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgIC8qIEZpcnN0IG9kZCBsZXNzIHRoYW4gbiAqLworICBtcHpfc3ViX3VpIChwLCBuLCAyKTsKKworICByZXR1cm4gZmluZG5leHQocCwgbXB6X3RkaXZfdWksIG1wel9zdWJfdWkpOworfQorCmRpZmYgLS1naXQgYS9tcHovb2RkZmFjXzEuYyBiL21wei9vZGRmYWNfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGMwODUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovb2RkZmFjXzEuYwpAQCAtMCwwICsxLDQzNSBAQAorLyogbXB6X29kZGZhY18xKFJFU1VMVCwgTikgLS0gU2V0IFJFU1VMVCB0byB0aGUgb2RkIGZhY3RvciBvZiBOIS4KKworQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKK1RIRSBGVU5DVElPTiBJTiBUSElTIEZJTEUgSVMgSU5URVJOQUwgV0lUSCBBIE1VVEFCTEUgSU5URVJGQUNFLgorSVQgSVMgT05MWSBTQUZFIFRPIFJFQUNIIElUIFRIUk9VR0ggRE9DVU1FTlRFRCBJTlRFUkZBQ0VTLgorSU4gRkFDVCwgSVQgSVMgQUxNT1NUIEdVQVJBTlRFRUQgVEhBVCBJVCBXSUxMIENIQU5HRSBPUgorRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAxMC0yMDEyLCAyMDE1LTIwMTcsIDIwMjAsIDIwMjEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKy8qIFRPRE86CisgICAtIHNwbGl0IHRoaXMgZmlsZSBpbiBzbWFsbGVyIHBhcnRzIHdpdGggZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJlY3ljbGVkIGZvciBkaWZmZXJlbnQgY29tcHV0YXRpb25zLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gbWFjcm9zOiBjb21tb24gbWFjcm9zLCBmb3IgbXN3aW5nL2ZhYy9iaW4gKCZzaWV2ZSkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQUNUT1JfTElTVF9BUFBFTkQoUFIsIE1BWF9QUiwgVkVDLCBJKQkJCVwKKyAgaWYgKChQUikgPiAoTUFYX1BSKSkgewkJCQkJXAorICAgIChWRUMpWyhJKSsrXSA9IChQUik7CQkJCQlcCisgICAgKFBSKSA9IDE7CQkJCQkJCVwKKyAgfQorCisjZGVmaW5lIEZBQ1RPUl9MSVNUX1NUT1JFKFAsIFBSLCBNQVhfUFIsIFZFQywgSSkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIGlmICgoUFIpID4gKE1BWF9QUikpIHsJCQkJCVwKKyAgICAgIChWRUMpWyhJKSsrXSA9IChQUik7CQkJCQlcCisgICAgICAoUFIpID0gKFApOwkJCQkJCVwKKyAgICB9IGVsc2UJCQkJCQkJXAorICAgICAgKFBSKSAqPSAoUCk7CQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfQ09OVElOVUUocHJpbWUsZW5kKQkJCVwKKyAgICBfX21heF9pID0gKGVuZCk7CQkJCQkJXAorCQkJCQkJCQlcCisgICAgZG8gewkJCQkJCQlcCisgICAgICArK19faTsJCQkJCQkJXAorICAgICAgaWYgKCgqX19zaWV2ZSAmIF9fbWFzaykgPT0gMCkJCQkJXAorCXsJCQkJCQkJXAorCSAgbXBfbGltYl90IHByaW1lOwkJCQkJXAorCSAgcHJpbWUgPSBpZF90b19uKF9faSkKKworI2RlZmluZSBMT09QX09OX1NJRVZFX0JFR0lOKHByaW1lLHN0YXJ0LGVuZCxvZmYsc2lldmUpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19tYXNrLCAqX19zaWV2ZSwgX19tYXhfaSwgX19pOwkJCVwKKwkJCQkJCQkJXAorICAgIF9faSA9IChzdGFydCktKG9mZik7CQkJCQlcCisgICAgX19zaWV2ZSA9IChzaWV2ZSkgKyBfX2kgLyBHTVBfTElNQl9CSVRTOwkJCVwKKyAgICBfX21hc2sgPSBDTlNUX0xJTUIoMSkgPDwgKF9faSAlIEdNUF9MSU1CX0JJVFMpOwkJXAorICAgIF9faSArPSAob2ZmKTsJCQkJCQlcCisJCQkJCQkJCVwKKyAgICBMT09QX09OX1NJRVZFX0NPTlRJTlVFKHByaW1lLGVuZCkKKworI2RlZmluZSBMT09QX09OX1NJRVZFX1NUT1AJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICAgIF9fbWFzayA9IF9fbWFzayA8PCAxIHwgX19tYXNrID4+IChHTVBfTElNQl9CSVRTLTEpOwlcCisgICAgICBfX3NpZXZlICs9IF9fbWFzayAmIDE7CQkJCQlcCisgICAgfSAgd2hpbGUgKF9faSA8PSBfX21heF9pKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfRU5ECQkJCQlcCisgICAgTE9PUF9PTl9TSUVWRV9TVE9QOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gc2lldmU6IHNpZXZpbmcgZnVuY3Rpb25zIGFuZCB0b29scyBmb3IgcHJpbWVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgV0FOVF9BU1NFUlQKK3N0YXRpYyBtcF9saW1iX3QKK2JpdF90b19uIChtcF9saW1iX3QgYml0KSB7IHJldHVybiAoYml0KjMrNCl8MTsgfQorI2VuZGlmCisKKy8qIGlkX3RvX24gKHgpID0gYml0X3RvX24gKHgtMSkgPSAoaWQqMysxKXwxKi8KK3N0YXRpYyBtcF9saW1iX3QKK2lkX3RvX24gIChtcF9saW1iX3QgaWQpICB7IHJldHVybiBpZCozKzErKGlkJjEpOyB9CisKKy8qIG5fdG9fYml0IChuKSA9ICgobi0xKSYoLUNOU1RfTElNQigyKSkpLzNVLTEgKi8KK3N0YXRpYyBtcF9saW1iX3QKK25fdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKChuLTUpfDEpLzNVOyB9CisKKyNpZiBXQU5UX0FTU0VSVAorc3RhdGljIG1wX3NpemVfdAorcHJpbWVzaWV2ZV9zaXplIChtcF9saW1iX3QgbikgeyByZXR1cm4gbl90b19iaXQobikgLyBHTVBfTElNQl9CSVRTICsgMTsgfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZWN0aW9uIG1zd2luZzogMi1tdWx0aXN3aW5nIGZhY3RvcmlhbCAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmV0dXJucyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBzcWFyZSByb290IG9mIHguCisgKiBJdCBnaXZlczoKKyAqICAgbGltYl9hcHByc3FydCAoeCkgXiAyIDw9IHggPCAobGltYl9hcHByc3FydCAoeCkrMSkgXiAyCisgKiBvcgorICogICB4IDw9IGxpbWJfYXBwcnNxcnQgKHgpIF4gMiA8PSB4ICogOS84CisgKi8KK3N0YXRpYyBtcF9saW1iX3QKK2xpbWJfYXBwcnNxcnQgKG1wX2xpbWJfdCB4KQoreworICBpbnQgczsKKworICBBU1NFUlQgKHggPiAyKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAocywgeCk7CisgIHMgPSAoR01QX0xJTUJfQklUUyAtIHMpID4+IDE7CisgIHJldHVybiAoKENOU1RfTElNQigxKSA8PCAocyAtIDEpKSArICh4ID4+IDEgPj4gcykpOworfQorCisjaWYgMAorLyogQSBjb3VudC10aGVuLWV4cG9uZW50aWF0ZSB2YXJpYW50IGZvciBTV0lOR19BX1BSSU1FICovCisjZGVmaW5lIFNXSU5HX0FfUFJJTUUoUCwgTiwgUFIsIE1BWF9QUiwgVkVDLCBJKQkJXAorICBkbyB7CQkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19xLCBfX3ByaW1lOwkJCQlcCisgICAgaW50IF9fZXhwOwkJCQkJCVwKKyAgICBfX3ByaW1lID0gKFApOwkJCQkJXAorICAgIF9fZXhwID0gMDsJCQkJCQlcCisgICAgX19xID0gKE4pOwkJCQkJCVwKKyAgICBkbyB7CQkJCQkJXAorICAgICAgX19xIC89IF9fcHJpbWU7CQkJCQlcCisgICAgICBfX2V4cCArPSBfX3EgJiAxOwkJCQkJXAorICAgIH0gd2hpbGUgKF9fcSA+PSBfX3ByaW1lKTsJCQkJXAorICAgIGlmIChfX2V4cCkgeyAvKiBTdG9yZSAkcHJpbWVee2V4cH0kICovCQlcCisgICAgICBmb3IgKF9fcSA9IF9fcHJpbWU7IC0tX19leHA7IF9fcSAqPSBfX3ByaW1lKTsJXAorICAgICAgRkFDVE9SX0xJU1RfU1RPUkUoX19xLCBQUiwgTUFYX1BSLCBWRUMsIEkpOwlcCisgICAgfTsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgU1dJTkdfQV9QUklNRShQLCBOLCBQUiwgTUFYX1BSLCBWRUMsIEkpCVwKKyAgZG8gewkJCQkJCVwKKyAgICBtcF9saW1iX3QgX19xLCBfX3ByaW1lOwkJCVwKKyAgICBfX3ByaW1lID0gKFApOwkJCQlcCisgICAgRkFDVE9SX0xJU1RfQVBQRU5EKFBSLCBNQVhfUFIsIFZFQywgSSk7CVwKKyAgICBfX3EgPSAoTik7CQkJCQlcCisgICAgZG8gewkJCQkJXAorICAgICAgX19xIC89IF9fcHJpbWU7CQkJCVwKKyAgICAgIGlmICgoX19xICYgMSkgIT0gMCkgKFBSKSAqPSBfX3ByaW1lOwlcCisgICAgfSB3aGlsZSAoX19xID49IF9fcHJpbWUpOwkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFNIX1NXSU5HX0FfUFJJTUUoUCwgTiwgUFIsIE1BWF9QUiwgVkVDLCBJKQlcCisgIGRvIHsJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX3ByaW1lOwkJCQkJXAorICAgIF9fcHJpbWUgPSAoUCk7CQkJCQlcCisgICAgaWYgKCgoKE4pIC8gX19wcmltZSkgJiAxKSAhPSAwKQkJCVwKKyAgICAgIEZBQ1RPUl9MSVNUX1NUT1JFKF9fcHJpbWUsIFBSLCBNQVhfUFIsIFZFQywgSSk7CVwKKyAgfSB3aGlsZSAoMCkKKworLyogbXB6XzJtdWx0aXN3aW5nXzEgY29tcHV0ZXMgdGhlIG9kZCBwYXJ0IG9mIHRoZSAyLW11bHRpc3dpbmcKKyAgIGZhY3RvcmlhbCBvZiB0aGUgcGFyYW1ldGVyIG4uICBUaGUgcmVzdWx0IHggaXMgYW4gb2RkIHBvc2l0aXZlCisgICBpbnRlZ2VyIHNvIHRoYXQgbXVsdGlzd2luZyhuLDIpID0geCAyXmEuCisKKyAgIFVzZXMgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgYnkgUGV0ZXIgTHVzY2hueSBpbiAiRGl2aWRlLCBTd2luZyBhbmQKKyAgIENvbnF1ZXIgdGhlIEZhY3RvcmlhbCEiLgorCisgICBUaGUgcG9pbnRlciBzaWV2ZSBwb2ludHMgdG8gcHJpbWVzaWV2ZV9zaXplKG4pIGxpbWJzIGNvbnRhaW5pbmcgYQorICAgYml0LWFycmF5IHdoZXJlIHByaW1lcyBhcmUgbWFya2VkIGFzIDAuCisgICBFbm91Z2ggKEZJWE1FOiBleHBsYWluIDotKSBsaW1icyBtdXN0IGJlIHBvaW50ZWQgYnkgZmFjdG9ycy4KKyAqLworCitzdGF0aWMgdm9pZAorbXB6XzJtdWx0aXN3aW5nXzEgKG1wel9wdHIgeCwgbXBfbGltYl90IG4sIG1wX3B0ciBzaWV2ZSwgbXBfcHRyIGZhY3RvcnMpCit7CisgIG1wX2xpbWJfdCBwcm9kLCBtYXhfcHJvZDsKKyAgbXBfc2l6ZV90IGo7CisKKyAgQVNTRVJUIChuID4gMjUpOworCisgIGogPSAwOworICBwcm9kICA9IC0obiAmIDEpOworICBuICY9IH4gQ05TVF9MSU1CKDEpOyAvKiBuLTEsIGlmIG4gaXMgb2RkICovCisKKyAgcHJvZCA9IChwcm9kICYgbikgKyAxOyAvKiB0aGUgb3JpZ2luYWwgbiwgaWYgaXQgd2FzIG9kZCwgMSBvdGhlcndpc2UgKi8KKyAgbWF4X3Byb2QgPSBHTVBfTlVNQl9NQVggLyAobi0xKTsKKworICAvKiBIYW5kbGUgcHJpbWUgPSAzIHNlcGFyYXRlbHkuICovCisgIFNXSU5HX0FfUFJJTUUgKDMsIG4sIHByb2QsIG1heF9wcm9kLCBmYWN0b3JzLCBqKTsKKworICAvKiBTd2luZyBwcmltZXMgZnJvbSA1IHRvIG4vMyAqLworICB7CisgICAgbXBfbGltYl90IHMsIGxfbWF4X3Byb2Q7CisKKyAgICBzID0gbGltYl9hcHByc3FydChuKTsKKyAgICBBU1NFUlQgKHMgPj0gNSk7CisgICAgcyA9IG5fdG9fYml0IChzKTsKKyAgICBBU1NFUlQgKGJpdF90b19uIChzKzEpICogYml0X3RvX24gKHMrMSkgPiBuKTsKKyAgICBBU1NFUlQgKHMgPCBuX3RvX2JpdCAobiAvIDMpKTsKKyAgICBMT09QX09OX1NJRVZFX0JFR0lOIChwcmltZSwgbl90b19iaXQgKDUpLCBzLCAwLHNpZXZlKTsKKyAgICBTV0lOR19BX1BSSU1FIChwcmltZSwgbiwgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworICAgIExPT1BfT05fU0lFVkVfU1RPUDsKKworICAgIEFTU0VSVCAobWF4X3Byb2QgPD0gR01QX05VTUJfTUFYIC8gMyk7CisKKyAgICBsX21heF9wcm9kID0gbWF4X3Byb2QgKiAzOworCisgICAgTE9PUF9PTl9TSUVWRV9DT05USU5VRSAocHJpbWUsIG5fdG9fYml0IChuLzMpKTsKKyAgICBTSF9TV0lOR19BX1BSSU1FIChwcmltZSwgbiwgcHJvZCwgbF9tYXhfcHJvZCwgZmFjdG9ycywgaik7CisgICAgTE9PUF9PTl9TSUVWRV9FTkQ7CisgIH0KKworICAvKiBTdG9yZSBwcmltZXMgZnJvbSAobisxKS8yIHRvIG4gKi8KKyAgTE9PUF9PTl9TSUVWRV9CRUdJTiAocHJpbWUsIG5fdG9fYml0IChuID4+IDEpICsgMSwgbl90b19iaXQgKG4pLCAwLHNpZXZlKTsKKyAgRkFDVE9SX0xJU1RfU1RPUkUgKHByaW1lLCBwcm9kLCBtYXhfcHJvZCwgZmFjdG9ycywgaik7CisgIExPT1BfT05fU0lFVkVfRU5EOworCisgIGlmIChMSUtFTFkgKGogIT0gMCkpCisgICAgeworICAgICAgZmFjdG9yc1tqKytdID0gcHJvZDsKKyAgICAgIG1wel9wcm9kbGltYnMgKHgsIGZhY3RvcnMsIGopOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEFTU0VSVCAoQUxMT0MgKHgpID4gMCk7CisgICAgICBQVFIgKHgpWzBdID0gcHJvZDsKKyAgICAgIFNJWiAoeCkgPSAxOworICAgIH0KK30KKworI3VuZGVmIFNXSU5HX0FfUFJJTUUKKyN1bmRlZiBTSF9TV0lOR19BX1BSSU1FCisjdW5kZWYgTE9PUF9PTl9TSUVWRV9FTkQKKyN1bmRlZiBMT09QX09OX1NJRVZFX1NUT1AKKyN1bmRlZiBMT09QX09OX1NJRVZFX0JFR0lOCisjdW5kZWYgTE9PUF9PTl9TSUVWRV9DT05USU5VRQorI3VuZGVmIEZBQ1RPUl9MSVNUX0FQUEVORAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBvZGRmYWM6IG9kZCBmYWN0b3JpYWwsIG5lZWRlZCBhbHNvIGJ5IGJpbm9taWFsKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZJWE1FOiByZWZpbmUgY2hlIGZvbGxvd2luZyBlc3RpbWF0ZS4gKi8KKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRAorI2RlZmluZSBGQUNUT1JTX1BFUl9MSU1CIChHTVBfTlVNQl9CSVRTICogMiAvIChMT0cyQyhGQUNfRFNDX1RIUkVTSE9MRF9MSU1JVCpGQUNfRFNDX1RIUkVTSE9MRF9MSU1JVC0xKSsxKSAtIDEpCisjZWxzZQorI2RlZmluZSBGQUNUT1JTX1BFUl9MSU1CIChHTVBfTlVNQl9CSVRTICogMiAvIChMT0cyQyhGQUNfRFNDX1RIUkVTSE9MRCpGQUNfRFNDX1RIUkVTSE9MRC0xKSsxKSAtIDEpCisjZW5kaWYKKworLyogbXB6X29kZGZhY18xIGNvbXB1dGVzIHRoZSBvZGQgcGFydCBvZiB0aGUgZmFjdG9yaWFsIG9mIHRoZQorICAgcGFyYW1ldGVyIG4uICBJLmUuIG4hID0geCAyXmEsIHdoZXJlIHggaXMgdGhlIHJldHVybmVkIHZhbHVlOiBhbgorICAgb2RkIHBvc2l0aXZlIGludGVnZXIuCisKKyAgIElmIGZsYWcgIT0gMCBhIHNxdWFyZSBpcyBza2lwcGVkIGluIHRoZSBEU0MgcGFydCwgZS5nLgorICAgaWYgbiBpcyBvZGQsIG4gPiBGQUNfRFNDX1RIUkVTSE9MRCBhbmQgZmxhZyA9IDEsIHggaXMgc2V0IHRvIG4hIS4KKworICAgSWYgbiBpcyB0b28gc21hbGwsIGZsYWcgaXMgaWdub3JlZCwgYW5kIGFuIEFTU0VSVCBjYW4gYmUgdHJpZ2dlcmVkLgorCisgICBUT0RPOiBGQUNfRFNDX1RIUkVTSE9MRCBpcyB1c2VkIGhlcmUgd2l0aCB0d28gZGlmZmVyZW50IHJvbGVzOgorICAgIC0gdG8gZGVjaWRlIHdoZW4gcHJpbWUgZmFjdG9yaXNhdGlvbiBpcyBuZWVkZWQsCisgICAgLSB0byBzdG9wIHRoZSByZWN1cnNpb24sIG9uY2Ugc2lldmluZyBpcyBkb25lLgorICAgTWF5YmUgdHdvIHRocmVzaG9sZHMgY2FuIGRvIGEgYmV0dGVyIGpvYi4KKyAqLwordm9pZAorbXB6X29kZGZhY18xIChtcHpfcHRyIHgsIG1wX2xpbWJfdCBuLCB1bnNpZ25lZCBmbGFnKQoreworICBBU1NFUlQgKG4gPD0gR01QX05VTUJfTUFYKTsKKyAgQVNTRVJUIChmbGFnID09IDAgfHwgKGZsYWcgPT0gMSAmJiBuID4gT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCArIDEgJiYgQUJPVkVfVEhSRVNIT0xEIChuLCBGQUNfRFNDX1RIUkVTSE9MRCkpKTsKKworICBpZiAobiA8PSBPRERfRkFDVE9SSUFMX1RBQkxFX0xJTUlUKQorICAgIHsKKyAgICAgIE1QWl9ORVdBTExPQyAoeCwgMSlbMF0gPSBfX2dtcF9vZGRmYWNfdGFibGVbbl07CisgICAgICBTSVogKHgpID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKG4gPD0gT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCArIDEpCisgICAgeworICAgICAgbXBfcHRyICAgcHg7CisKKyAgICAgIHB4ID0gTVBaX05FV0FMTE9DICh4LCAyKTsKKyAgICAgIHVtdWxfcHBtbSAocHhbMV0sIHB4WzBdLCBfX2dtcF9vZGQyZmFjX3RhYmxlWyhuIC0gMSkgPj4gMV0sIF9fZ21wX29kZGZhY190YWJsZVtuID4+IDFdKTsKKyAgICAgIFNJWiAoeCkgPSAyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHM7CisgICAgICBtcF9wdHIgICBmYWN0b3JzOworCisgICAgICBzID0gMDsKKyAgICAgIHsKKwltcF9saW1iX3QgdG47CisJbXBfbGltYl90IHByb2QsIG1heF9wcm9kOworCW1wX3NpemVfdCBqOworCVRNUF9TREVDTDsKKworI2lmIFRVTkVfUFJPR1JBTV9CVUlMRAorCUFTU0VSVCAoRkFDX0RTQ19USFJFU0hPTERfTElNSVQgPj0gRkFDX0RTQ19USFJFU0hPTEQpOworCUFTU0VSVCAoRkFDX0RTQ19USFJFU0hPTEQgPj0gMiAqIChPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX0xJTUlUICsgMikpOworI2VuZGlmCisKKwkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcmVjdXJzaXZlIHN0ZXBzIGZvciB0aGUgRFNDIGFsZ29yaXRobS4gKi8KKwlmb3IgKHRuID0gbjsgQUJPVkVfVEhSRVNIT0xEICh0biwgRkFDX0RTQ19USFJFU0hPTEQpOyBzKyspCisJICB0biA+Pj0gMTsKKworCWogPSAwOworCisJVE1QX1NNQVJLOworCWZhY3RvcnMgPSBUTVBfU0FMTE9DX0xJTUJTICgxICsgdG4gLyBGQUNUT1JTX1BFUl9MSU1CKTsKKwlBU1NFUlQgKHRuID49IEZBQ1RPUlNfUEVSX0xJTUIpOworCisJcHJvZCA9IDE7CisjaWYgVFVORV9QUk9HUkFNX0JVSUxECisJbWF4X3Byb2QgPSBHTVBfTlVNQl9NQVggLyAoRkFDX0RTQ19USFJFU0hPTERfTElNSVQgKiBGQUNfRFNDX1RIUkVTSE9MRF9MSU1JVCk7CisjZWxzZQorCW1heF9wcm9kID0gR01QX05VTUJfTUFYIC8gKEZBQ19EU0NfVEhSRVNIT0xEICogRkFDX0RTQ19USFJFU0hPTEQpOworI2VuZGlmCisKKwlBU1NFUlQgKHRuID4gT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCArIDEpOworCWRvIHsKKwkgIGZhY3RvcnNbaisrXSA9IE9ERF9ET1VCTEVGQUNUT1JJQUxfVEFCTEVfTUFYOworCSAgbXBfbGltYl90IGRpZmYgPSAodG4gLSBPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX0xJTUlUKSAmIC1DTlNUX0xJTUIgKDIpOworCSAgaWYgKChkaWZmICYgMikgIT0gMCkKKwkgICAgeworCSAgICAgIEZBQ1RPUl9MSVNUX1NUT1JFIChPRERfRE9VQkxFRkFDVE9SSUFMX1RBQkxFX0xJTUlUICsgZGlmZiwgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworCSAgICAgIGRpZmYgLT0gMjsKKwkgICAgfQorCSAgaWYgKGRpZmYgIT0gMCkKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdCBmYWMgPSAoT0REX0RPVUJMRUZBQ1RPUklBTF9UQUJMRV9MSU1JVCArIDIpICoKKwkJKE9ERF9ET1VCTEVGQUNUT1JJQUxfVEFCTEVfTElNSVQgKyBkaWZmKTsKKwkgICAgICBkbyB7CisJCUZBQ1RPUl9MSVNUX1NUT1JFIChmYWMsIHByb2QsIG1heF9wcm9kLCBmYWN0b3JzLCBqKTsKKwkJZGlmZiAtPSA0OworCQlmYWMgKz0gZGlmZiAqIDI7CisJICAgICAgfSB3aGlsZSAoZGlmZiAhPSAwKTsKKwkgICAgfQorCSAgbWF4X3Byb2QgPDw9IDI7CisJICB0biA+Pj0gMTsKKwl9IHdoaWxlICh0biA+IE9ERF9ET1VCTEVGQUNUT1JJQUxfVEFCTEVfTElNSVQgKyAxKTsKKworCWZhY3RvcnNbaisrXSA9IHByb2Q7CisJZmFjdG9yc1tqKytdID0gX19nbXBfb2RkMmZhY190YWJsZVsodG4gLSAxKSA+PiAxXTsKKwlmYWN0b3JzW2orK10gPSBfX2dtcF9vZGRmYWNfdGFibGVbdG4gPj4gMV07CisJbXB6X3Byb2RsaW1icyAoeCwgZmFjdG9ycywgaik7CisKKwlUTVBfU0ZSRUU7CisgICAgICB9CisKKyAgICAgIGlmIChzICE9IDApCisJLyogVXNlIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGJ5IFBldGVyIEx1c2NobnkgaW4gIkRpdmlkZSwKKwkgICBTd2luZyBhbmQgQ29ucXVlciB0aGUgRmFjdG9yaWFsISIuCisKKwkgICBJbXByb3ZlbWVudDogdGhlcmUgYXJlIHR3byB0ZW1wb3JhcnkgYnVmZmVycywgZmFjdG9ycyBhbmQKKwkgICBzcXVhcmUsIHRoYXQgYXJlIG5ldmVyIHVzZWQgdG9nZXRoZXI7IHdpdGggYSBnb29kIGVzdGltYXRlCisJICAgb2YgdGhlIG1heGltYWwgbmVlZGVkIHNpemUsIHRoZXkgY291bGQgc2hhcmUgYSBzaW5nbGUKKwkgICBhbGxvY2F0aW9uLgorCSovCisJeworCSAgbXB6X3QgbXN3aW5nOworCSAgbXBfcHRyIHNpZXZlOworCSAgbXBfc2l6ZV90IHNpemU7CisJICBUTVBfREVDTDsKKworCSAgVE1QX01BUks7CisKKwkgIGZsYWctLTsKKwkgIHNpemUgPSBuIC8gR01QX05VTUJfQklUUyArIDQ7CisJICBBU1NFUlQgKHByaW1lc2lldmVfc2l6ZSAobiAtIDEpIDw9IHNpemUgLSAoc2l6ZSAvIDIgKyAxKSk7CisJICAvKiAyLW11bHRpc3dpbmcobikgPCAyXihuLTEpKnNxcnQobi9waSkgPCAyXihuK0dNUF9OVU1CX0JJVFMpOworCSAgICAgb25lIG1vcmUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IG11bCwgYW5vdGhlciBmb3IgdGhlIHNpZXZlICovCisJICBNUFpfVE1QX0lOSVQgKG1zd2luZywgc2l6ZSk7CisJICAvKiBJbml0aWFsaXplIHNpemUsIHNvIHRoYXQgQVNTRVJUIGNhbiBjaGVjayBpdCBjb3JyZWN0bHkuICovCisJICBBU1NFUlRfQ09ERSAoU0laIChtc3dpbmcpID0gMCk7CisKKwkgIC8qIFB1dCB0aGUgc2lldmUgb24gdGhlIHNlY29uZCBoYWxmLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBsYXN0IG1zd2luZy4gKi8KKwkgIHNpZXZlID0gUFRSIChtc3dpbmcpICsgc2l6ZSAvIDIgKyAxOworCisJICBzaXplID0gKGdtcF9wcmltZXNpZXZlIChzaWV2ZSwgbiAtIDEpICsgMSkgLyBsb2dfbl9tYXggKG4pICsgMTsKKworCSAgZmFjdG9ycyA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSk7CisJICBkbyB7CisJICAgIG1wX3B0ciAgICBzcXVhcmUsIHB4OworCSAgICBtcF9zaXplX3QgbngsIG5zOworCSAgICBtcF9saW1iX3QgY3k7CisJICAgIFRNUF9ERUNMOworCisJICAgIHMtLTsKKwkgICAgQVNTRVJUIChBQlNJWiAobXN3aW5nKSA8IEFMTE9DIChtc3dpbmcpIC8gMik7IC8qIENoZWNrOiBzaWV2ZSBoYXMgbm90IGJlZW4gb3ZlcndyaXR0ZW4gKi8KKwkgICAgbXB6XzJtdWx0aXN3aW5nXzEgKG1zd2luZywgbiA+PiBzLCBzaWV2ZSwgZmFjdG9ycyk7CisKKwkgICAgVE1QX01BUks7CisJICAgIG54ID0gU0laICh4KTsKKwkgICAgaWYgKHMgPT0gZmxhZykgeworCSAgICAgIHNpemUgPSBueDsKKwkgICAgICBzcXVhcmUgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUpOworCSAgICAgIE1QTl9DT1BZIChzcXVhcmUsIFBUUiAoeCksIG54KTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICBzaXplID0gbnggPDwgMTsKKwkgICAgICBzcXVhcmUgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUpOworCSAgICAgIG1wbl9zcXIgKHNxdWFyZSwgUFRSICh4KSwgbngpOworCSAgICAgIHNpemUgLT0gKHNxdWFyZVtzaXplIC0gMV0gPT0gMCk7CisJICAgIH0KKwkgICAgbnMgPSBTSVogKG1zd2luZyk7CisJICAgIG54ID0gc2l6ZSArIG5zOworCSAgICBweCA9IE1QWl9ORVdBTExPQyAoeCwgbngpOworCSAgICBBU1NFUlQgKG5zIDw9IHNpemUpOworCSAgICBjeSA9IG1wbl9tdWwgKHB4LCBzcXVhcmUsIHNpemUsIFBUUihtc3dpbmcpLCBucyk7IC8qIG4hPSBuJCAqIGZsb29yKG4vMikhXjIgKi8KKworCSAgICBTSVooeCkgPSBueCAtIChjeSA9PSAwKTsKKwkgICAgVE1QX0ZSRUU7CisJICB9IHdoaWxlIChzICE9IDApOworCSAgVE1QX0ZSRUU7CisJfQorICAgIH0KK30KKworI3VuZGVmIEZBQ1RPUlNfUEVSX0xJTUIKKyN1bmRlZiBGQUNUT1JfTElTVF9TVE9SRQpkaWZmIC0tZ2l0IGEvbXB6L291dF9yYXcuYyBiL21wei9vdXRfcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmZDA4NgotLS0gL2Rldi9udWxsCisrKyBiL21wei9vdXRfcmF3LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIG1wel9vdXRfcmF3IC0tIHdyaXRlIGFuIG1wel90IGluIHJhdyBmb3JtYXQuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogSFRPTl9MSU1CX1NUT1JFIHRha2VzIGEgbm9ybWFsIGhvc3QgYnl0ZSBvcmRlciBsaW1iIGFuZCBzdG9yZXMgaXQgYXMKKyAgIG5ldHdvcmsgYnl0ZSBvcmRlciAoaWUuIGJpZyBlbmRpYW4pLiAqLworCisjaWYgSEFWRV9MSU1CX0JJR19FTkRJQU4KKyNkZWZpbmUgSFRPTl9MSU1CX1NUT1JFKGRzdCwgbGltYikgIGRvIHsgKihkc3QpID0gKGxpbWIpOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBIQVZFX0xJTUJfTElUVExFX0VORElBTgorI2RlZmluZSBIVE9OX0xJTUJfU1RPUkUoZHN0LCBsaW1iKSAgQlNXQVBfTElNQl9TVE9SRSAoZHN0LCBsaW1iKQorI2VuZGlmCisKKyNpZm5kZWYgSFRPTl9MSU1CX1NUT1JFCisjZGVmaW5lIEhUT05fTElNQl9TVE9SRShkc3QsIGxpbWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90ICBfX2xpbWIgPSAobGltYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciAgICAgICpfX3AgPSAoY2hhciAqKSAoZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBHTVBfTElNQl9CWVRFUzsgX19pKyspICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX3BbX19pXSA9IChjaGFyKSAoX19saW1iID4+ICgoR01QX0xJTUJfQllURVMtMSAtIF9faSkgKiA4KSk7ICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworCitzaXplX3QKK21wel9vdXRfcmF3IChGSUxFICpmcCwgbXB6X3NyY3B0ciB4KQoreworICBtcF9zaXplX3QgICB4c2l6ZSwgYWJzX3hzaXplLCBieXRlcywgaTsKKyAgbXBfc3JjcHRyICAgeHA7CisgIGNoYXIgICAgICAgICp0cCwgKmJwOworICBtcF9saW1iX3QgICB4bGltYjsKKyAgaW50ICAgICAgICAgemVyb3M7CisgIHNpemVfdCAgICAgIHRzaXplLCBzc2l6ZTsKKworICB4c2l6ZSA9IFNJWih4KTsKKyAgYWJzX3hzaXplID0gQUJTICh4c2l6ZSk7CisgIGJ5dGVzID0gKGFic194c2l6ZSAqIEdNUF9OVU1CX0JJVFMgKyA3KSAvIDg7CisgIHRzaXplID0gUk9VTkRfVVBfTVVMVElQTEUgKCh1bnNpZ25lZCkgNCwgR01QX0xJTUJfQllURVMpICsgYnl0ZXM7CisKKyAgdHAgPSBfX0dNUF9BTExPQ0FURV9GVU5DX1RZUEUgKHRzaXplLCBjaGFyKTsKKyAgYnAgPSB0cCArIFJPVU5EX1VQX01VTFRJUExFICgodW5zaWduZWQpIDQsIEdNUF9MSU1CX0JZVEVTKTsKKworICBpZiAoYnl0ZXMgIT0gMCkKKyAgICB7CisgICAgICBicCArPSBieXRlczsKKyAgICAgIHhwID0gUFRSICh4KTsKKyAgICAgIGkgPSBhYnNfeHNpemU7CisKKyAgICAgIGlmIChHTVBfTkFJTF9CSVRTID09IDApCisJeworCSAgLyogcmV2ZXJzZSBsaW1iIG9yZGVyLCBhbmQgYnl0ZSBzd2FwIGlmIG5lY2Vzc2FyeSAqLworI2lmZGVmIF9DUkFZCisJICBfUHJhZ21hICgiX0NSSSBpdmRlcCIpOworI2VuZGlmCisJICBkbworCSAgICB7CisJICAgICAgYnAgLT0gR01QX0xJTUJfQllURVM7CisJICAgICAgeGxpbWIgPSAqeHA7CisJICAgICAgSFRPTl9MSU1CX1NUT1JFICgobXBfcHRyKSBicCwgeGxpbWIpOworCSAgICAgIHhwKys7CisJICAgIH0KKwkgIHdoaWxlICgtLWkgPiAwKTsKKworCSAgLyogc3RyaXAgaGlnaCB6ZXJvIGJ5dGVzICh3aXRob3V0IGZldGNoaW5nIGZyb20gYnApICovCisJICBjb3VudF9sZWFkaW5nX3plcm9zICh6ZXJvcywgeGxpbWIpOworCSAgemVyb3MgLz0gODsKKwkgIGJwICs9IHplcm9zOworCSAgYnl0ZXMgLT0gemVyb3M7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wX2xpbWJfdCAgbmV3X3hsaW1iOworCSAgaW50ICAgICAgICBiaXRzOworCSAgQVNTRVJUX0NPREUgKGNoYXIgKmJwX29yaWcgPSBicCAtIGJ5dGVzKTsKKworCSAgQVNTRVJUX0FMV0FZUyAoR01QX05VTUJfQklUUyA+PSA4KTsKKworCSAgYml0cyA9IDA7CisJICB4bGltYiA9IDA7CisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgd2hpbGUgKGJpdHMgPj0gOCkKKwkJeworCQkgIEFTU0VSVCAoYnAgPiBicF9vcmlnKTsKKwkJICAqLS1icCA9IHhsaW1iICYgMHhGRjsKKwkJICB4bGltYiA+Pj0gODsKKwkJICBiaXRzIC09IDg7CisJCX0KKworCSAgICAgIGlmIChpID09IDApCisJCWJyZWFrOworCisJICAgICAgbmV3X3hsaW1iID0gKnhwKys7CisJICAgICAgaS0tOworCSAgICAgIEFTU0VSVCAoYnAgPiBicF9vcmlnKTsKKwkgICAgICAqLS1icCA9ICh4bGltYiB8IChuZXdfeGxpbWIgPDwgYml0cykpICYgMHhGRjsKKwkgICAgICB4bGltYiA9IG5ld194bGltYiA+PiAoOCAtIGJpdHMpOworCSAgICAgIGJpdHMgKz0gR01QX05VTUJfQklUUyAtIDg7CisJICAgIH0KKworCSAgaWYgKGJpdHMgIT0gMCkKKwkgICAgeworCSAgICAgIEFTU0VSVCAoYnAgPiBicF9vcmlnKTsKKwkgICAgICAqLS1icCA9IHhsaW1iOworCSAgICB9CisKKwkgIEFTU0VSVCAoYnAgPT0gYnBfb3JpZyk7CisJICB3aGlsZSAoKmJwID09IDApCisJICAgIHsKKwkgICAgICBicCsrOworCSAgICAgIGJ5dGVzLS07CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIHRvdGFsIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gKi8KKyAgc3NpemUgPSA0ICsgYnl0ZXM7CisKKyAgLyogdHdvcyBjb21wbGVtZW50IG5lZ2F0aXZlIGZvciB0aGUgc2l6ZSB2YWx1ZSAqLworICBieXRlcyA9ICh4c2l6ZSA+PSAwID8gYnl0ZXMgOiAtYnl0ZXMpOworCisgIC8qIHNvIHdlIGRvbid0IHJlbHkgb24gc2lnbiBleHRlbnNpb24gaW4gIj4+IiAqLworICBBU1NFUlRfQUxXQVlTIChzaXplb2YgKGJ5dGVzKSA+PSA0KTsKKworICBicFstNF0gPSBieXRlcyA+PiAyNDsKKyAgYnBbLTNdID0gYnl0ZXMgPj4gMTY7CisgIGJwWy0yXSA9IGJ5dGVzID4+IDg7CisgIGJwWy0xXSA9IGJ5dGVzOworICBicCAtPSA0OworCisgIGlmIChmcCA9PSAwKQorICAgIGZwID0gc3Rkb3V0OworICBpZiAoZndyaXRlIChicCwgc3NpemUsIDEsIGZwKSAhPSAxKQorICAgIHNzaXplID0gMDsKKworICAoKl9fZ21wX2ZyZWVfZnVuYykgKHRwLCB0c2l6ZSk7CisgIHJldHVybiBzc2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9vdXRfc3RyLmMgYi9tcHovb3V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZDhhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovb3V0X3N0ci5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBtcHpfb3V0X3N0cihzdHJlYW0sIGJhc2UsIGludGVnZXIpIC0tIE91dHB1dCB0byBTVFJFQU0gdGhlIG11bHRpIHByZWMuCisgICBpbnRlZ2VyIElOVEVHRVIgaW4gYmFzZSBCQVNFLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMSwgMjAwNSwgMjAxMSwgMjAxMiwgMjAxNyBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworc2l6ZV90CittcHpfb3V0X3N0ciAoRklMRSAqc3RyZWFtLCBpbnQgYmFzZSwgbXB6X3NyY3B0ciB4KQoreworICBtcF9wdHIgeHA7CisgIG1wX3NpemVfdCB4X3NpemUgPSBTSVogKHgpOworICB1bnNpZ25lZCBjaGFyICpzdHI7CisgIHNpemVfdCBzdHJfc2l6ZTsKKyAgc2l6ZV90IGk7CisgIHNpemVfdCB3cml0dGVuOworICBjb25zdCBjaGFyICpudW1fdG9fdGV4dDsKKyAgVE1QX0RFQ0w7CisKKyAgaWYgKHN0cmVhbSA9PSAwKQorICAgIHN0cmVhbSA9IHN0ZG91dDsKKworICBudW1fdG9fdGV4dCA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgIGlmIChiYXNlID4gMSkKKyAgICB7CisgICAgICBpZiAoYmFzZSA8PSAzNikKKwludW1fdG9fdGV4dCA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICAgICAgZWxzZSBpZiAoVU5MSUtFTFkgKGJhc2UgPiA2MikpCisJICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoYmFzZSA+IC0yKQorICAgIHsKKyAgICAgIGJhc2UgPSAxMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiYXNlID0gLWJhc2U7CisgICAgICBpZiAoVU5MSUtFTFkgKGJhc2UgPiAzNikpCisJcmV0dXJuIDA7CisgICAgfQorCisgIHdyaXR0ZW4gPSAwOworCisgIGlmICh4X3NpemUgPCAwKQorICAgIHsKKyAgICAgIGZwdXRjICgnLScsIHN0cmVhbSk7CisgICAgICB4X3NpemUgPSAteF9zaXplOworICAgICAgd3JpdHRlbiA9IDE7CisgICAgfQorCisgIFRNUF9NQVJLOworCisgIERJR0lUU19JTl9CQVNFX1BFUl9MSU1CIChzdHJfc2l6ZSwgeF9zaXplLCBiYXNlKTsKKyAgc3RyX3NpemUgKz0gMzsKKyAgc3RyID0gKHVuc2lnbmVkIGNoYXIgKikgVE1QX0FMTE9DIChzdHJfc2l6ZSk7CisKKyAgeHAgPSBQVFIgKHgpOworICBpZiAoISBQT1cyX1AgKGJhc2UpKQorICAgIHsKKyAgICAgIHhwID0gVE1QX0FMTE9DX0xJTUJTICh4X3NpemUgfCAxKTsgIC8qIHwxIGluIGNhc2UgeF9zaXplPT0wICovCisgICAgICBNUE5fQ09QWSAoeHAsIFBUUiAoeCksIHhfc2l6ZSk7CisgICAgfQorCisgIHN0cl9zaXplID0gbXBuX2dldF9zdHIgKHN0ciwgYmFzZSwgeHAsIHhfc2l6ZSk7CisKKyAgLyogQ29udmVydCByZXN1bHQgdG8gcHJpbnRhYmxlIGNoYXJzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cl9zaXplOyBpKyspCisgICAgc3RyW2ldID0gbnVtX3RvX3RleHRbc3RyW2ldXTsKKyAgc3RyW3N0cl9zaXplXSA9IDA7CisKKyAgeworICAgIHNpemVfdCBmd3JldDsKKyAgICBmd3JldCA9IGZ3cml0ZSAoKGNoYXIgKikgc3RyLCAxLCBzdHJfc2l6ZSwgc3RyZWFtKTsKKyAgICB3cml0dGVuICs9IGZ3cmV0OworICB9CisKKyAgVE1QX0ZSRUU7CisgIHJldHVybiBmZXJyb3IgKHN0cmVhbSkgPyAwIDogd3JpdHRlbjsKK30KZGlmZiAtLWdpdCBhL21wei9wZXJmcG93LmMgYi9tcHovcGVyZnBvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmI0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcGVyZnBvdy5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIG1wel9wZXJmZWN0X3Bvd2VyX3AoYXJnKSAtLSBSZXR1cm4gbm9uLXplcm8gaWYgQVJHIGlzIGEgcGVyZmVjdCBwb3dlciwKKyAgIHplcm8gb3RoZXJ3aXNlLgorCitDb3B5cmlnaHQgMTk5OC0yMDAxLCAyMDA1LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CittcHpfcGVyZmVjdF9wb3dlcl9wIChtcHpfc3JjcHRyIHUpCit7CisgIHJldHVybiBtcG5fcGVyZmVjdF9wb3dlcl9wIChQVFIgKHUpLCBTSVogKHUpKTsKK30KZGlmZiAtLWdpdCBhL21wei9wZXJmc3FyLmMgYi9tcHovcGVyZnNxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcGVyZnNxci5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIG1wel9wZXJmZWN0X3NxdWFyZV9wKGFyZykgLS0gUmV0dXJuIG5vbi16ZXJvIGlmIEFSRyBpcyBhIHBlcmZlY3Qgc3F1YXJlLAorICAgemVybyBvdGhlcndpc2UuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCmRpZmYgLS1naXQgYS9tcHovcG9wY291bnQuYyBiL21wei9wb3Bjb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTg1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcG9wY291bnQuYwpAQCAtMCwwICsxLDM0IEBACisvKiBtcHpfcG9wY291bnQobXB6X3B0ciBvcCkgLS0gUG9wdWxhdGlvbiBjb3VudCBvZiBPUC4gIElmIHRoZSBvcGVyYW5kIGlzCisgICBuZWdhdGl2ZSwgcmV0dXJuIH4wIChhIG5vdmVsIHJlcHJlc2VudGF0aW9uIG9mIGluZmluaXR5KS4KKworQ29weXJpZ2h0IDE5OTQsIDE5OTYsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX19HTVBfRk9SQ0VfbXB6X3BvcGNvdW50IDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCmRpZmYgLS1naXQgYS9tcHovcG93X3VpLmMgYi9tcHovcG93X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhZmFhNwotLS0gL2Rldi9udWxsCisrKyBiL21wei9wb3dfdWkuYwpAQCAtMCwwICsxLDUyIEBACisvKiBtcHpfcG93X3VpIC0tIG1weiByYWlzZWQgdG8gdWxvbmcuCisKK0NvcHlyaWdodCAyMDAxLCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3Bvd191aSAobXB6X3B0ciByLCBtcHpfc3JjcHRyIGIsIHVuc2lnbmVkIGxvbmcgaW50IGUpCit7CisgIC8qIFdlIHRlc3Qgc29tZSBzbWFsbCBleHBvbmVudHMgaGVyZSwgbWFpbmx5IHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZgorICAgICBtcHpfbl9wb3dfdWkgZm9yIHNtYWxsIGJhc2VzIGFuZCBleHBvbmVudHMuICAqLworICBzd2l0Y2ggKGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIG1wel9zZXRfdWkgKHIsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgbXB6X3NldCAociwgYik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtcHpfbXVsIChyLCBiLCBiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtcHpfbl9wb3dfdWkgKHIsIFBUUihiKSwgKG1wX3NpemVfdCkgU0laKGIpLCBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovcG93bS5jIGIvbXB6L3Bvd20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJmOGUzCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3Bvd20uYwpAQCAtMCwwICsxLDI4MiBAQAorLyogbXB6X3Bvd20ocmVzLGJhc2UsZXhwLG1vZCkgLS0gU2V0IFIgdG8gKFVeRSkgbW9kIE0uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBUb3Jiam9ybiBHcmFubHVuZC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNSwgMjAwOCwgMjAwOSwKKzIwMTEsIDIwMTIsIDIwMTUsIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBUT0RPCisKKyAqIEltcHJvdmUgaGFuZGxpbmcgb2YgYnVmZmVycy4gIEl0IGlzIHByZXR0eSB1Z2x5IG5vdy4KKworICogRm9yIGV2ZW4gbW9kdWxpLCB3ZSBjb21wdXRlIGEgYmludmVydCBvZiBpdHMgb2RkIHBhcnQgYm90aCBoZXJlIGFuZCBpbgorICAgbXBuX3Bvd20uICBIb3cgY2FuIHdlIGF2b2lkIHRoaXMgcmVjb21wdXRhdGlvbj8KKyovCisKKy8qCisgIGIgXiBlIG1vZCBtICAgcmVzCisgIDAgICAwICAgICAwICAgID8KKyAgMCAgIGUgICAgIDAgICAgPworICAwICAgMCAgICAgbSAgICA/CisgIDAgICBlICAgICBtICAgIDAKKyAgYiAgIDAgICAgIDAgICAgPworICBiICAgZSAgICAgMCAgICA/CisgIGIgICAwICAgICBtICAgIDEgbW9kIG0KKyAgYiAgIGUgICAgIG0gICAgYl5lIG1vZCBtCisqLworCisjZGVmaW5lIEhBTkRMRV9ORUdBVElWRV9FWFBPTkVOVCAxCisKK3ZvaWQKK21wel9wb3dtIChtcHpfcHRyIHIsIG1wel9zcmNwdHIgYiwgbXB6X3NyY3B0ciBlLCBtcHpfc3JjcHRyIG0pCit7CisgIG1wX3NpemVfdCBuLCBub2RkLCBuY250OworICBpbnQgY250OworICBtcF9wdHIgcnAsIHRwOworICBtcF9zcmNwdHIgYnAsIGVwLCBtcDsKKyAgbXBfc2l6ZV90IHJuLCBibiwgZXMsIGVuLCBpdGNoOworICBtcHpfdCBuZXdfYjsJCQkvKiBub3RlOiB2YWx1ZSBsaXZlcyBsb25nIHZpYSAnYicgKi8KKyAgVE1QX0RFQ0w7CisKKyAgbiA9IEFCU0laKG0pOworICBpZiAoVU5MSUtFTFkgKG4gPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbXAgPSBQVFIobSk7CisKKyAgVE1QX01BUks7CisKKyAgZXMgPSBTSVooZSk7CisgIGlmIChVTkxJS0VMWSAoZXMgPD0gMCkpCisgICAgeworICAgICAgaWYgKGVzID09IDApCisJeworCSAgLyogYl4wIG1vZCBtLCAgYiBpcyBhbnl0aGluZyBhbmQgbSBpcyBub24temVyby4KKwkgICAgIFJlc3VsdCBpcyAxIG1vZCBtLCBpLmUuLCAxIG9yIDAgZGVwZW5kaW5nIG9uIGlmIG0gPSAxLiAgKi8KKwkgIFNJWihyKSA9IG4gIT0gMSB8fCBtcFswXSAhPSAxOworCSAgTVBaX05FV0FMTE9DIChyLCAxKVswXSA9IDE7CisJICBUTVBfRlJFRTsJLyogd2UgaGF2ZW4ndCByZWFsbHkgYWxsb2NhdGVkIGFueXRoaW5nIGhlcmUgKi8KKwkgIHJldHVybjsKKwl9CisjaWYgSEFORExFX05FR0FUSVZFX0VYUE9ORU5UCisgICAgICBNUFpfVE1QX0lOSVQgKG5ld19iLCBuICsgMSk7CisKKyAgICAgIGlmIChVTkxJS0VMWSAoISBtcHpfaW52ZXJ0IChuZXdfYiwgYiwgbSkpKQorCURJVklERV9CWV9aRVJPOworICAgICAgYiA9IG5ld19iOworICAgICAgZXMgPSAtZXM7CisjZWxzZQorICAgICAgRElWSURFX0JZX1pFUk87CisjZW5kaWYKKyAgICB9CisgIGVuID0gZXM7CisKKyAgYm4gPSBBQlNJWihiKTsKKworICBpZiAoVU5MSUtFTFkgKGJuID09IDApKQorICAgIHsKKyAgICAgIFNJWihyKSA9IDA7CisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZXAgPSBQVFIoZSk7CisKKyAgLyogSGFuZGxlIChiXjEgbW9kIG0pIGVhcmx5LCBzaW5jZSBtcG5fcG93KiBkbyBub3QgaGFuZGxlIHRoYXQgY2FzZS4gICovCisgIGlmIChVTkxJS0VMWSAoZW4gPT0gMSAmJiBlcFswXSA9PSAxKSkKKyAgICB7CisgICAgICBycCA9IFRNUF9BTExPQ19MSU1CUyAobik7CisgICAgICBicCA9IFBUUihiKTsKKyAgICAgIGlmIChibiA+PSBuKQorCXsKKwkgIG1wX3B0ciBxcCA9IFRNUF9BTExPQ19MSU1CUyAoYm4gLSBuICsgMSk7CisJICBtcG5fdGRpdl9xciAocXAsIHJwLCAwTCwgYnAsIGJuLCBtcCwgbik7CisJICBybiA9IG47CisJICBNUE5fTk9STUFMSVpFIChycCwgcm4pOworCisJICBpZiAocm4gIT0gMCAmJiBTSVooYikgPCAwKQorCSAgICB7CisJICAgICAgbXBuX3N1YiAocnAsIG1wLCBuLCBycCwgcm4pOworCSAgICAgIHJuID0gbjsKKwkgICAgICBNUE5fTk9STUFMSVpFX05PVF9aRVJPIChycCwgcm4pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChTSVooYikgPCAwKQorCSAgICB7CisJICAgICAgbXBuX3N1YiAocnAsIG1wLCBuLCBicCwgYm4pOworCSAgICAgIHJuID0gbjsKKwkgICAgICBNUE5fTk9STUFMSVpFX05PVF9aRVJPIChycCwgcm4pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocnAsIGJwLCBibik7CisJICAgICAgcm4gPSBibjsKKwkgICAgfQorCX0KKyAgICAgIGdvdG8gcmV0OworICAgIH0KKworICAvKiBSZW1vdmUgbG93IHplcm8gbGltYnMgZnJvbSBNLiAgVGhpcyBsb29wIHdpbGwgdGVybWluYXRlIGZvciBjb3JyZWN0bHkKKyAgICAgcmVwcmVzZW50ZWQgbXB6IG51bWJlcnMuICAqLworICBuY250ID0gMDsKKyAgd2hpbGUgKFVOTElLRUxZIChtcFswXSA9PSAwKSkKKyAgICB7CisgICAgICBtcCsrOworICAgICAgbmNudCsrOworICAgIH0KKyAgbm9kZCA9IG4gLSBuY250OworICBjbnQgPSAwOworICBpZiAobXBbMF0gJSAyID09IDApCisgICAgeworICAgICAgbXBfcHRyIG5ld21wID0gVE1QX0FMTE9DX0xJTUJTIChub2RkKTsKKyAgICAgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIG1wWzBdKTsKKyAgICAgIG1wbl9yc2hpZnQgKG5ld21wLCBtcCwgbm9kZCwgY250KTsKKyAgICAgIG5vZGQgLT0gbmV3bXBbbm9kZCAtIDFdID09IDA7CisgICAgICBtcCA9IG5ld21wOworICAgICAgbmNudCsrOworICAgIH0KKworICBpZiAobmNudCAhPSAwKQorICAgIHsKKyAgICAgIC8qIFdlIHdpbGwgY2FsbCBib3RoIG1wbl9wb3dtIGFuZCBtcG5fcG93bG8uICAqLworICAgICAgLyogcnAgbmVlZHMgbiwgbXBuX3Bvd2xvIG5lZWRzIDRuLCB0aGUgMiBtcG5fYmludmVydCBtaWdodCBuZWVkIG1vcmUgKi8KKyAgICAgIG1wX3NpemVfdCBuX2xhcmdlc3RfYmludmVydCA9IE1BWCAobmNudCwgbm9kZCk7CisgICAgICBtcF9zaXplX3QgaXRjaF9iaW52ZXJ0ID0gbXBuX2JpbnZlcnRfaXRjaCAobl9sYXJnZXN0X2JpbnZlcnQpOworICAgICAgaXRjaCA9IDMgKiBuICsgTUFYIChpdGNoX2JpbnZlcnQsIDIgKiBuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSB3aWxsIGNhbGwganVzdCBtcG5fcG93bS4gICovCisgICAgICBtcF9zaXplX3QgaXRjaF9iaW52ZXJ0ID0gbXBuX2JpbnZlcnRfaXRjaCAobm9kZCk7CisgICAgICBpdGNoID0gbiArIE1BWCAoaXRjaF9iaW52ZXJ0LCAyICogbik7CisgICAgfQorICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoaXRjaCk7CisKKyAgcnAgPSB0cDsgIHRwICs9IG47CisKKyAgYnAgPSBQVFIoYik7CisgIG1wbl9wb3dtIChycCwgYnAsIGJuLCBlcCwgZW4sIG1wLCBub2RkLCB0cCk7CisKKyAgcm4gPSBuOworCisgIGlmIChuY250ICE9IDApCisgICAgeworICAgICAgbXBfcHRyIHIyLCB4cCwgeXAsIG9kZF9pbnZfMmV4cDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdDsKKyAgICAgIGludCBiY250OworCisgICAgICBpZiAoYm4gPCBuY250KQorCXsKKwkgIG1wX3B0ciBuZXdicCA9IFRNUF9BTExPQ19MSU1CUyAobmNudCk7CisJICBNUE5fQ09QWSAobmV3YnAsIGJwLCBibik7CisJICBNUE5fWkVSTyAobmV3YnAgKyBibiwgbmNudCAtIGJuKTsKKwkgIGJwID0gbmV3YnA7CisJfQorCisgICAgICByMiA9IHRwOworCisgICAgICBpZiAoYnBbMF0gJSAyID09IDApCisJeworCSAgaWYgKGVuID4gMSkKKwkgICAgeworCSAgICAgIE1QTl9aRVJPIChyMiwgbmNudCk7CisJICAgICAgZ290byB6ZXJvOworCSAgICB9CisKKwkgIEFTU0VSVCAoZW4gPT0gMSk7CisJICB0ID0gKG5jbnQgLSAoY250ICE9IDApKSAqIEdNUF9OVU1CX0JJVFMgKyBjbnQ7CisKKwkgIC8qIENvdW50IG51bWJlciBvZiBsb3cgemVybyBiaXRzIGluIEIsIHVwIHRvIDMuICAqLworCSAgYmNudCA9ICgweDEyMTMgPj4gKChicFswXSAmIDcpIDw8IDEpKSAmIDB4MzsKKwkgIC8qIE5vdGUgdGhhdCBlcFswXSAqIGJjbnQgbWlnaHQgb3ZlcmZsb3csIGJ1dCB0aGF0IGp1c3QgcmVzdWx0cworCSAgICAgaW4gYSBtaXNzZWQgb3B0aW1pemF0aW9uLiAgKi8KKwkgIGlmIChlcFswXSAqIGJjbnQgPj0gdCkKKwkgICAgeworCSAgICAgIE1QTl9aRVJPIChyMiwgbmNudCk7CisJICAgICAgZ290byB6ZXJvOworCSAgICB9CisJfQorCisgICAgICBtcG5fcG93bG8gKHIyLCBicCwgZXAsIGVuLCBuY250LCB0cCArIG5jbnQpOworCisgICAgemVybzoKKyAgICAgIGlmIChub2RkIDwgbmNudCkKKwl7CisJICBtcF9wdHIgbmV3bXAgPSBUTVBfQUxMT0NfTElNQlMgKG5jbnQpOworCSAgTVBOX0NPUFkgKG5ld21wLCBtcCwgbm9kZCk7CisJICBNUE5fWkVSTyAobmV3bXAgKyBub2RkLCBuY250IC0gbm9kZCk7CisJICBtcCA9IG5ld21wOworCX0KKworICAgICAgb2RkX2ludl8yZXhwID0gdHAgKyBuOworICAgICAgbXBuX2JpbnZlcnQgKG9kZF9pbnZfMmV4cCwgbXAsIG5jbnQsIHRwICsgMiAqIG4pOworCisgICAgICBtcG5fc3ViIChyMiwgcjIsIG5jbnQsIHJwLCBub2RkID4gbmNudCA/IG5jbnQgOiBub2RkKTsKKworICAgICAgeHAgPSB0cCArIDIgKiBuOworICAgICAgbXBuX211bGxvX24gKHhwLCBvZGRfaW52XzJleHAsIHIyLCBuY250KTsKKworICAgICAgaWYgKGNudCAhPSAwKQorCXhwW25jbnQgLSAxXSAmPSAoQ05TVF9MSU1CKDEpIDw8IGNudCkgLSAxOworCisgICAgICB5cCA9IHRwOworICAgICAgaWYgKG5jbnQgPiBub2RkKQorCW1wbl9tdWwgKHlwLCB4cCwgbmNudCwgbXAsIG5vZGQpOworICAgICAgZWxzZQorCW1wbl9tdWwgKHlwLCBtcCwgbm9kZCwgeHAsIG5jbnQpOworCisgICAgICBtcG5fYWRkIChycCwgeXAsIG4sIHJwLCBub2RkKTsKKworICAgICAgQVNTRVJUIChub2RkICsgbmNudCA+PSBuKTsKKyAgICAgIEFTU0VSVCAobm9kZCArIG5jbnQgPD0gbiArIDEpOworICAgIH0KKworICBNUE5fTk9STUFMSVpFIChycCwgcm4pOworCisgIGlmICgoZXBbMF0gJiAxKSAmJiBTSVooYikgPCAwICYmIHJuICE9IDApCisgICAgeworICAgICAgbXBuX3N1YiAocnAsIFBUUihtKSwgbiwgcnAsIHJuKTsKKyAgICAgIHJuID0gbjsKKyAgICAgIE1QTl9OT1JNQUxJWkUgKHJwLCBybik7CisgICAgfQorCisgcmV0OgorICBNUFpfTkVXQUxMT0MgKHIsIHJuKTsKKyAgU0laKHIpID0gcm47CisgIE1QTl9DT1BZIChQVFIociksIHJwLCBybik7CisKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovcG93bV9zZWMuYyBiL21wei9wb3dtX3NlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTgxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcG93bV9zZWMuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbXB6X3Bvd21fc2VjKHJlcyxiYXNlLGV4cCxtb2QpIC0tIFNldCBSIHRvIChVXkUpIG1vZCBNLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDIsIDIwMDUsIDIwMDgsIDIwMDksCisyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wel9wb3dtX3NlYyAobXB6X3B0ciByLCBtcHpfc3JjcHRyIGIsIG1wel9zcmNwdHIgZSwgbXB6X3NyY3B0ciBtKQoreworICBtcF9zaXplX3QgbjsKKyAgbXBfcHRyIHJwLCB0cDsKKyAgbXBfc3JjcHRyIGJwLCBlcCwgbXA7CisgIG1wX3NpemVfdCBybiwgYm4sIGVzLCBlbjsKKyAgVE1QX0RFQ0w7CisKKyAgbiA9IEFCU0laKG0pOworCisgIG1wID0gUFRSKG0pOworCisgIGlmIChVTkxJS0VMWSAoKG4gPT0gMCkgfHwgKG1wWzBdICUgMiA9PSAwKSkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgZXMgPSBTSVooZSk7CisgIGlmIChVTkxJS0VMWSAoZXMgPD0gMCkpCisgICAgeworICAgICAgaWYgKGVzID09IDApCisJeworCSAgLyogYl4wIG1vZCBtLCAgYiBpcyBhbnl0aGluZyBhbmQgbSBpcyBub24temVyby4KKwkgICAgIFJlc3VsdCBpcyAxIG1vZCBtLCBpLmUuLCAxIG9yIDAgZGVwZW5kaW5nIG9uIGlmIG0gPSAxLiAgKi8KKwkgIFNJWihyKSA9IG4gIT0gMSB8fCBtcFswXSAhPSAxOworCSAgTVBaX05FV0FMTE9DIChyLCAxKVswXSA9IDE7CisJICByZXR1cm47CisJfQorICAgICAgRElWSURFX0JZX1pFUk87CisgICAgfQorICBlbiA9IGVzOworCisgIGJuID0gQUJTSVooYik7CisKKyAgaWYgKFVOTElLRUxZIChibiA9PSAwKSkKKyAgICB7CisgICAgICBTSVoocikgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICBUTVBfTUFSSzsKKyAgVE1QX0FMTE9DX0xJTUJTXzIgKHJwLCBuLAorCQkgICAgIHRwLCBtcG5fc2VjX3Bvd21faXRjaCAoYm4sIGVuICogR01QX05VTUJfQklUUywgbikpOworCisgIGJwID0gUFRSKGIpOworICBlcCA9IFBUUihlKTsKKworICBtcG5fc2VjX3Bvd20gKHJwLCBicCwgYm4sIGVwLCBlbiAqIEdNUF9OVU1CX0JJVFMsIG1wLCBuLCB0cCk7CisKKyAgcm4gPSBuOworCisgIE1QTl9OT1JNQUxJWkUgKHJwLCBybik7CisKKyAgaWYgKChlcFswXSAmIDEpICYmIFNJWihiKSA8IDAgJiYgcm4gIT0gMCkKKyAgICB7CisgICAgICBtcG5fc3ViIChycCwgUFRSKG0pLCBuLCBycCwgcm4pOworICAgICAgcm4gPSBuOworICAgICAgTVBOX05PUk1BTElaRSAocnAsIHJuKTsKKyAgICB9CisKKyAgTVBaX05FV0FMTE9DIChyLCBybik7CisgIFNJWihyKSA9IHJuOworICBNUE5fQ09QWSAoUFRSKHIpLCBycCwgcm4pOworCisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L3Bvd21fdWkuYyBiL21wei9wb3dtX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkM2VkOAotLS0gL2Rldi9udWxsCisrKyBiL21wei9wb3dtX3VpLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIG1wel9wb3dtX3VpKHJlcyxiYXNlLGV4cCxtb2QpIC0tIFNldCBSIHRvIChCXkUpIG1vZCBNLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmrDtnJuIEdyYW5sdW5kLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMjAwMC0yMDAyLCAyMDA1LCAyMDA4LCAyMDA5LAorMjAxMS0yMDEzLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogVGhpcyBjb2RlIGlzIHZlcnkgb2xkLCBhbmQgc2hvdWxkIGJlIHJld3JpdHRlbiB0byBjdXJyZW50IEdNUCBzdGFuZGFyZC4gIEl0CisgICBpcyBzbG93ZXIgdGhhbiBtcHpfcG93bSBmb3IgbGFyZ2UgZXhwb25lbnRzLCBidXQgYWxzbyBmb3Igc21hbGwgZXhwb25lbnRzCisgICB3aGVuIHRoZSBtb2QgYXJndW1lbnQgaXMgc21hbGwuCisKKyAgIEFzIGFuIGludGVybWVkaWF0ZSBzb2x1dGlvbiwgd2Ugbm93IGRlZmxlY3QgdG8gbXB6X3Bvd20gZm9yIGV4cG9uZW50cyA+PSAyMC4KKyovCisKKy8qCisgIGIgXiBlIG1vZCBtICAgcmVzCisgIDAgICAwICAgICAwICAgID8KKyAgMCAgIGUgICAgIDAgICAgPworICAwICAgMCAgICAgbSAgICA/CisgIDAgICBlICAgICBtICAgIDAKKyAgYiAgIDAgICAgIDAgICAgPworICBiICAgZSAgICAgMCAgICA/CisgIGIgICAwICAgICBtICAgIDEgbW9kIG0KKyAgYiAgIGUgICAgIG0gICAgYl5lIG1vZCBtCisqLworCitzdGF0aWMgdm9pZAorbW9kIChtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sIGdtcF9waTFfdCAqZGludiwgbXBfcHRyIHRwKQoreworICBtcF9wdHIgcXAgPSB0cDsKKworICBpZiAoZG4gPT0gMSkKKyAgICB7CisgICAgICBucFswXSA9IG1wbl9kaXZyZW1fMSAocXAsIChtcF9zaXplX3QpIDAsIG5wLCBubiwgZHBbMF0pOworICAgIH0KKyAgZWxzZSBpZiAoZG4gPT0gMikKKyAgICB7CisgICAgICBtcG5fZGl2X3FyXzJuX3BpMSAocXAsIG5wLCBucCwgbm4sIGRwWzFdLCBkcFswXSwgZGludi0+aW52MzIpOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgRENfRElWX1FSX1RIUkVTSE9MRCkgfHwKKwkgICBCRUxPV19USFJFU0hPTEQgKG5uIC0gZG4sIERDX0RJVl9RUl9USFJFU0hPTEQpKQorICAgIHsKKyAgICAgIG1wbl9zYnBpMV9kaXZfcXIgKHFwLCBucCwgbm4sIGRwLCBkbiwgZGludi0+aW52MzIpOworICAgIH0KKyAgZWxzZSBpZiAoQkVMT1dfVEhSRVNIT0xEIChkbiwgTVVQSV9ESVZfUVJfVEhSRVNIT0xEKSB8fCAgIC8qIGZhc3QgY29uZGl0aW9uICovCisJICAgQkVMT1dfVEhSRVNIT0xEIChubiwgMiAqIE1VX0RJVl9RUl9USFJFU0hPTEQpIHx8IC8qIGZhc3QgY29uZGl0aW9uICovCisJICAgKGRvdWJsZSkgKDIgKiAoTVVfRElWX1FSX1RIUkVTSE9MRCAtIE1VUElfRElWX1FSX1RIUkVTSE9MRCkpICogZG4gLyogc2xvdy4uLiAqLworCSAgICsgKGRvdWJsZSkgTVVQSV9ESVZfUVJfVEhSRVNIT0xEICogbm4gPiAoZG91YmxlKSBkbiAqIG5uKSAgICAvKiAuLi5jb25kaXRpb24gKi8KKyAgICB7CisgICAgICBtcG5fZGNwaTFfZGl2X3FyIChxcCwgbnAsIG5uLCBkcCwgZG4sIGRpbnYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgc2VwYXJhdGUgcmVtYWluZGVyIGFyZWEsIHNpbmNlIG1wbl9tdV9kaXZfcXIgZG9lcworCSBub3QgaGFuZGxlIG92ZXJsYXAgYmV0d2VlbiB0aGUgbnVtZXJhdG9yIGFuZCByZW1haW5kZXIgYXJlYXMuCisJIEZJWE1FOiBNYWtlIGl0IGhhbmRsZSBzdWNoIG92ZXJsYXAuICAqLworICAgICAgbXBfcHRyIHJwLCBzY3JhdGNoOworICAgICAgbXBfc2l6ZV90IGl0Y2g7CisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworCisgICAgICBpdGNoID0gbXBuX211X2Rpdl9xcl9pdGNoIChubiwgZG4sIDApOworICAgICAgcnAgPSBUTVBfQkFMTE9DX0xJTUJTIChkbik7CisgICAgICBzY3JhdGNoID0gVE1QX0JBTExPQ19MSU1CUyAoaXRjaCk7CisKKyAgICAgIG1wbl9tdV9kaXZfcXIgKHFwLCBycCwgbnAsIG5uLCBkcCwgZG4sIHNjcmF0Y2gpOworICAgICAgTVBOX0NPUFkgKG5wLCBycCwgZG4pOworCisgICAgICBUTVBfRlJFRTsKKyAgICB9Cit9CisKKy8qIENvbXB1dGUgdCA9IGEgbW9kIG0sIGEgaXMgZGVmaW5lZCBieSAoYXAsYW4pLCBtIGlzIGRlZmluZWQgYnkgKG1wLG1uKSwgYW5kCisgICB0IGlzIGRlZmluZWQgYnkgKHRwLG1uKS4gICovCitzdGF0aWMgdm9pZAorcmVkdWNlIChtcF9wdHIgdHAsIG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IGFuLCBtcF9zcmNwdHIgbXAsIG1wX3NpemVfdCBtbiwgZ21wX3BpMV90ICpkaW52KQoreworICBtcF9wdHIgcnAsIHNjcmF0Y2g7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBUTVBfQUxMT0NfTElNQlNfMiAocnAsIGFuLCBzY3JhdGNoLCBhbiAtIG1uICsgMSk7CisgIE1QTl9DT1BZIChycCwgYXAsIGFuKTsKKyAgbW9kIChycCwgYW4sIG1wLCBtbiwgZGludiwgc2NyYXRjaCk7CisgIE1QTl9DT1BZICh0cCwgcnAsIG1uKTsKKworICBUTVBfRlJFRTsKK30KKwordm9pZAorbXB6X3Bvd21fdWkgKG1wel9wdHIgciwgbXB6X3NyY3B0ciBiLCB1bnNpZ25lZCBsb25nIGludCBlbCwgbXB6X3NyY3B0ciBtKQoreworICBpZiAoZWwgPCAyMCkKKyAgICB7CisgICAgICBtcF9wdHIgeHAsIHRwLCBtcCwgYnAsIHNjcmF0Y2g7CisgICAgICBtcF9zaXplX3QgeG4sIHRuLCBtbiwgYm47CisgICAgICBpbnQgbV96ZXJvX2NudDsKKyAgICAgIGludCBjOworICAgICAgbXBfbGltYl90IGUsIG0yOworICAgICAgZ21wX3BpMV90IGRpbnY7CisgICAgICBUTVBfREVDTDsKKworICAgICAgbXAgPSBQVFIobSk7CisgICAgICBtbiA9IEFCU0laKG0pOworICAgICAgaWYgKFVOTElLRUxZIChtbiA9PSAwKSkKKwlESVZJREVfQllfWkVSTzsKKworICAgICAgaWYgKGVsIDw9IDEpCisJeworCSAgaWYgKGVsID09IDEpCisJICAgIHsKKwkgICAgICBtcHpfbW9kIChyLCBiLCBtKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC8qIEV4cG9uZW50IGlzIHplcm8sIHJlc3VsdCBpcyAxIG1vZCBNLCBpLmUuLCAxIG9yIDAgZGVwZW5kaW5nIG9uIGlmCisJICAgICBNIGVxdWFscyAxLiAgKi8KKwkgIFNJWihyKSA9IG1uICE9IDEgfHwgbXBbMF0gIT0gMTsKKwkgIE1QWl9ORVdBTExPQyAociwgMSlbMF0gPSAxOworCSAgcmV0dXJuOworCX0KKworICAgICAgVE1QX01BUks7CisKKyAgICAgIC8qIE5vcm1hbGl6ZSBtIChpLmUuIG1ha2UgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCkgYXMgcmVxdWlyZWQgYnkKKwkgZGl2aXNpb24gZnVuY3Rpb25zIGJlbG93LiAgKi8KKyAgICAgIGNvdW50X2xlYWRpbmdfemVyb3MgKG1femVyb19jbnQsIG1wW21uIC0gMV0pOworICAgICAgbV96ZXJvX2NudCAtPSBHTVBfTkFJTF9CSVRTOworICAgICAgaWYgKG1femVyb19jbnQgIT0gMCkKKwl7CisJICBtcF9wdHIgbmV3X21wID0gVE1QX0FMTE9DX0xJTUJTIChtbik7CisJICBtcG5fbHNoaWZ0IChuZXdfbXAsIG1wLCBtbiwgbV96ZXJvX2NudCk7CisJICBtcCA9IG5ld19tcDsKKwl9CisKKyAgICAgIG0yID0gbW4gPT0gMSA/IDAgOiBtcFttbiAtIDJdOworICAgICAgaW52ZXJ0X3BpMSAoZGludiwgbXBbbW4gLSAxXSwgbTIpOworCisgICAgICBibiA9IEFCU0laKGIpOworICAgICAgYnAgPSBQVFIoYik7CisgICAgICBpZiAoYm4gPiBtbikKKwl7CisJICAvKiBSZWR1Y2UgcG9zc2libHkgaHVnZSBiYXNlLiAgVXNlIGEgZnVuY3Rpb24gY2FsbCB0byByZWR1Y2UsIHNpbmNlIHdlCisJICAgICBkb24ndCB3YW50IHRoZSBxdW90aWVudCBhbGxvY2F0aW9uIHRvIGxpdmUgdW50aWwgZnVuY3Rpb24gcmV0dXJuLiAgKi8KKwkgIG1wX3B0ciBuZXdfYnAgPSBUTVBfQUxMT0NfTElNQlMgKG1uKTsKKwkgIHJlZHVjZSAobmV3X2JwLCBicCwgYm4sIG1wLCBtbiwgJmRpbnYpOworCSAgYnAgPSBuZXdfYnA7CisJICBibiA9IG1uOworCSAgLyogQ2Fub25pY2FsaXplIHRoZSBiYXNlLCBzaW5jZSB3ZSBhcmUgcG90ZW50aWFsbHkgZ29pbmcgdG8gbXVsdGlwbHkgd2l0aAorCSAgICAgaXQgcXVpdGUgYSBmZXcgdGltZXMuICAqLworCSAgTVBOX05PUk1BTElaRSAoYnAsIGJuKTsKKwl9CisKKyAgICAgIGlmIChibiA9PSAwKQorCXsKKwkgIFNJWihyKSA9IDA7CisJICBUTVBfRlJFRTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIFRNUF9BTExPQ19MSU1CU18zICh4cCwgbW4sIHNjcmF0Y2gsIG1uICsgMSwgdHAsIDIgKiBtbiArIDEpOworCisgICAgICBNUE5fQ09QWSAoeHAsIGJwLCBibik7CisgICAgICB4biA9IGJuOworCisgICAgICBlID0gZWw7CisgICAgICBjb3VudF9sZWFkaW5nX3plcm9zIChjLCBlKTsKKyAgICAgIGUgPSAoZSA8PCBjKSA8PCAxOwkJLyogc2hpZnQgdGhlIGV4cCBiaXRzIHRvIHRoZSBsZWZ0LCBsb3NlIG1zYiAqLworICAgICAgYyA9IEdNUF9MSU1CX0JJVFMgLSAxIC0gYzsKKworICAgICAgQVNTRVJUIChjICE9IDApOyAvKiBlbCA+IDEgKi8KKwl7CisJICAvKiBNYWluIGxvb3AuICovCisJICBkbworCSAgICB7CisJICAgICAgbXBuX3NxciAodHAsIHhwLCB4bik7CisJICAgICAgdG4gPSAyICogeG47IHRuIC09IHRwW3RuIC0gMV0gPT0gMDsKKwkgICAgICBpZiAodG4gPCBtbikKKwkJeworCQkgIE1QTl9DT1BZICh4cCwgdHAsIHRuKTsKKwkJICB4biA9IHRuOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgbW9kICh0cCwgdG4sIG1wLCBtbiwgJmRpbnYsIHNjcmF0Y2gpOworCQkgIE1QTl9DT1BZICh4cCwgdHAsIG1uKTsKKwkJICB4biA9IG1uOworCQl9CisKKwkgICAgICBpZiAoKG1wX2xpbWJfc2lnbmVkX3QpIGUgPCAwKQorCQl7CisJCSAgbXBuX211bCAodHAsIHhwLCB4biwgYnAsIGJuKTsKKwkJICB0biA9IHhuICsgYm47IHRuIC09IHRwW3RuIC0gMV0gPT0gMDsKKwkJICBpZiAodG4gPCBtbikKKwkJICAgIHsKKwkJICAgICAgTVBOX0NPUFkgKHhwLCB0cCwgdG4pOworCQkgICAgICB4biA9IHRuOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgbW9kICh0cCwgdG4sIG1wLCBtbiwgJmRpbnYsIHNjcmF0Y2gpOworCQkgICAgICBNUE5fQ09QWSAoeHAsIHRwLCBtbik7CisJCSAgICAgIHhuID0gbW47CisJCSAgICB9CisJCX0KKwkgICAgICBlIDw8PSAxOworCSAgICAgIGMtLTsKKwkgICAgfQorCSAgd2hpbGUgKGMgIT0gMCk7CisJfQorCisgICAgICAvKiBXZSBzaGlmdGVkIG0gbGVmdCBtX3plcm9fY250IHN0ZXBzLiAgQWRqdXN0IHRoZSByZXN1bHQgYnkgcmVkdWNpbmcgaXQKKwkgd2l0aCB0aGUgb3JpZ2luYWwgTS4gICovCisgICAgICBpZiAobV96ZXJvX2NudCAhPSAwKQorCXsKKwkgIG1wX2xpbWJfdCBjeTsKKwkgIGN5ID0gbXBuX2xzaGlmdCAodHAsIHhwLCB4biwgbV96ZXJvX2NudCk7CisJICB0cFt4bl0gPSBjeTsgeG4gKz0gY3kgIT0gMDsKKworCSAgaWYgKHhuID49IG1uKQorCSAgICB7CisJICAgICAgbW9kICh0cCwgeG4sIG1wLCBtbiwgJmRpbnYsIHNjcmF0Y2gpOworCSAgICAgIHhuID0gbW47CisJICAgIH0KKwkgIG1wbl9yc2hpZnQgKHhwLCB0cCwgeG4sIG1femVyb19jbnQpOworCX0KKyAgICAgIE1QTl9OT1JNQUxJWkUgKHhwLCB4bik7CisKKyAgICAgIGlmICgoZWwgJiAxKSAhPSAwICYmIFNJWihiKSA8IDAgJiYgeG4gIT0gMCkKKwl7CisJICBtcCA9IFBUUihtKTsJCQkvKiB3YW50IG9yaWdpbmFsLCB1bm5vcm1hbGl6ZWQgbSAqLworCSAgbXBuX3N1YiAoeHAsIG1wLCBtbiwgeHAsIHhuKTsKKwkgIHhuID0gbW47CisJICBNUE5fTk9STUFMSVpFICh4cCwgeG4pOworCX0KKyAgICAgIE1QWl9ORVdBTExPQyAociwgeG4pOworICAgICAgU0laIChyKSA9IHhuOworICAgICAgTVBOX0NPUFkgKFBUUihyKSwgeHAsIHhuKTsKKworICAgICAgVE1QX0ZSRUU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRm9yIGxhcmdlIGV4cG9uZW50cywgZmFrZSBhbiBtcHpfdCBleHBvbmVudCBhbmQgZGVmbGVjdCB0byB0aGUgbW9yZQorCSBzb3BoaXN0aWNhdGVkIG1wel9wb3dtLiAgKi8KKyAgICAgIG1wel90IGU7CisgICAgICBtcF9saW1iX3QgZXBbTElNQlNfUEVSX1VMT05HXTsKKyAgICAgIE1QWl9GQUtFX1VJIChlLCBlcCwgZWwpOworICAgICAgbXB6X3Bvd20gKHIsIGIsIGUsIG0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wei9wcHJpbWVfcC5jIGIvbXB6L3BwcmltZV9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhMjFjMgotLS0gL2Rldi9udWxsCisrKyBiL21wei9wcHJpbWVfcC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBtcHpfcHJvYmFiX3ByaW1lX3AgLS0KKyAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9iYWJpbGlzdGljIHByaW1hbGl0eSB0ZXN0IGZvdW5kIGluIEtudXRoJ3MKKyAgIFNlbWludW1lcmljYWwgQWxnb3JpdGhtcyBib29rLiAgSWYgdGhlIGZ1bmN0aW9uIG1wel9wcm9iYWJfcHJpbWVfcCgpCisgICByZXR1cm5zIDAgdGhlbiBuIGlzIG5vdCBwcmltZS4gIElmIGl0IHJldHVybnMgMSwgdGhlbiBuIGlzICdwcm9iYWJseScKKyAgIHByaW1lLiAgSWYgaXQgcmV0dXJucyAyLCBuIGlzIHN1cmVseSBwcmltZS4gIFRoZSBwcm9iYWJpbGl0eSBvZiBhIGZhbHNlCisgICBwb3NpdGl2ZSBpcyAoMS80KSoqcmVwcywgd2hlcmUgcmVwcyBpcyB0aGUgbnVtYmVyIG9mIGludGVybmFsIHBhc3NlcyBvZiB0aGUKKyAgIHByb2JhYmlsaXN0aWMgYWxnb3JpdGhtLiAgS251dGggaW5kaWNhdGVzIHRoYXQgMjUgcGFzc2VzIGFyZSByZWFzb25hYmxlLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5Ni0yMDAyLCAyMDA1LCAyMDE1LCAyMDE2IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworc3RhdGljIGludCBpc3ByaW1lICh1bnNpZ25lZCBsb25nIGludCk7CisKKworLyogTVBOX01PRF9PUl9NT0RFWEFDVF8xX09ERCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIG1wbl9tb2RfMSBmb3IgdGhlIHRyaWFsCisgICBkaXZpc2lvbi4gIEl0IGdpdmVzIGEgcmVzdWx0IHdoaWNoIGlzIG5vdCB0aGUgYWN0dWFsIHJlbWFpbmRlciByIGJ1dCBhCisgICB2YWx1ZSBjb25ncnVlbnQgdG8gcioyXm4gbW9kIGQuICBTaW5jZSBhbGwgdGhlIHByaW1lcyBiZWluZyB0ZXN0ZWQgYXJlCisgICBvZGQsIHIqMl5uIG1vZCBwIHdpbGwgYmUgMCBpZiBhbmQgb25seSBpZiByIG1vZCBwIGlzIDAuICAqLworCitpbnQKK21wel9wcm9iYWJfcHJpbWVfcCAobXB6X3NyY3B0ciBuLCBpbnQgcmVwcykKK3sKKyAgbXBfbGltYl90IHI7CisgIG1wel90IG4yOworCisgIC8qIEhhbmRsZSBzbWFsbCBhbmQgbmVnYXRpdmUgbi4gICovCisgIGlmIChtcHpfY21wX3VpIChuLCAxMDAwMDAwTCkgPD0gMCkKKyAgICB7CisgICAgICBpZiAobXB6X2NtcGFic191aSAobiwgMTAwMDAwMEwpIDw9IDApCisJeworCSAgaW50IGlzX3ByaW1lOworCSAgdW5zaWduZWQgbG9uZyBuMDsKKwkgIG4wID0gbXB6X2dldF91aSAobik7CisJICBpc19wcmltZSA9IG4wICYgKG4wID4gMSkgPyBpc3ByaW1lIChuMCkgOiBuMCA9PSAyOworCSAgcmV0dXJuIGlzX3ByaW1lID8gMiA6IDA7CisJfQorICAgICAgLyogTmVnYXRpdmUgbnVtYmVyLiAgTmVnYXRlIGFuZCBmYWxsIG91dC4gICovCisgICAgICBQVFIobjIpID0gUFRSKG4pOworICAgICAgU0laKG4yKSA9IC1TSVoobik7CisgICAgICBuID0gbjI7CisgICAgfQorCisgIC8qIElmIG4gaXMgbm93IGV2ZW4sIGl0IGlzIG5vdCBhIHByaW1lLiAgKi8KKyAgaWYgKG1wel9ldmVuX3AgKG4pKQorICAgIHJldHVybiAwOworCisjaWYgZGVmaW5lZCAoUFApCisgIC8qIENoZWNrIGlmIG4gaGFzIHNtYWxsIGZhY3RvcnMuICAqLworI2lmIGRlZmluZWQgKFBQX0lOVkVSVEVEKQorICByID0gTVBOX01PRF9PUl9QUkVJTlZfTU9EXzEgKFBUUihuKSwgKG1wX3NpemVfdCkgU0laKG4pLCAobXBfbGltYl90KSBQUCwKKwkJCSAgICAgICAobXBfbGltYl90KSBQUF9JTlZFUlRFRCk7CisjZWxzZQorICByID0gbXBuX21vZF8xIChQVFIobiksIChtcF9zaXplX3QpIFNJWihuKSwgKG1wX2xpbWJfdCkgUFApOworI2VuZGlmCisgIGlmIChyICUgMyA9PSAwCisjaWYgR01QX0xJTUJfQklUUyA+PSA0CisgICAgICB8fCByICUgNSA9PSAwCisjZW5kaWYKKyNpZiBHTVBfTElNQl9CSVRTID49IDgKKyAgICAgIHx8IHIgJSA3ID09IDAKKyNlbmRpZgorI2lmIEdNUF9MSU1CX0JJVFMgPj0gMTYKKyAgICAgIHx8IHIgJSAxMSA9PSAwIHx8IHIgJSAxMyA9PSAwCisjZW5kaWYKKyNpZiBHTVBfTElNQl9CSVRTID49IDMyCisgICAgICB8fCByICUgMTcgPT0gMCB8fCByICUgMTkgPT0gMCB8fCByICUgMjMgPT0gMCB8fCByICUgMjkgPT0gMAorI2VuZGlmCisjaWYgR01QX0xJTUJfQklUUyA+PSA2NAorICAgICAgfHwgciAlIDMxID09IDAgfHwgciAlIDM3ID09IDAgfHwgciAlIDQxID09IDAgfHwgciAlIDQzID09IDAKKyAgICAgIHx8IHIgJSA0NyA9PSAwIHx8IHIgJSA1MyA9PSAwCisjZW5kaWYKKyAgICAgICkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLyogUFAgKi8KKworICAvKiBEbyBtb3JlIGRpdmlkaW5nLiAgV2UgY29sbGVjdCBzbWFsbCBwcmltZXMsIHVzaW5nIHVtdWxfcHBtbSwgdW50aWwgd2UKKyAgICAgb3ZlcmZsb3cgYSBzaW5nbGUgbGltYi4gIFdlIGRpdmlkZSBvdXIgbnVtYmVyIGJ5IHRoZSBzbWFsbCBwcmltZXMgcHJvZHVjdCwKKyAgICAgYW5kIGxvb2sgZm9yIGZhY3RvcnMgaW4gdGhlIHJlbWFpbmRlci4gICovCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBsbjI7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgcTsKKyAgICBtcF9saW1iX3QgcDEsIHAwLCBwOworICAgIHVuc2lnbmVkIGludCBwcmltZXNbMTVdOworICAgIGludCBucHJpbWVzOworCisgICAgbnByaW1lcyA9IDA7CisgICAgcCA9IDE7CisgICAgbG4yID0gbXB6X3NpemVpbmJhc2UgKG4sIDIpOwkvKiBGSVhNRTogdHVuZSB0aGlzIGxpbWl0ICovCisgICAgZm9yIChxID0gUFBfRklSU1RfT01JVFRFRDsgcSA8IGxuMjsgcSArPSAyKQorICAgICAgeworCWlmIChpc3ByaW1lIChxKSkKKwkgIHsKKwkgICAgdW11bF9wcG1tIChwMSwgcDAsIHAsIHEpOworCSAgICBpZiAocDEgIT0gMCkKKwkgICAgICB7CisJCXIgPSBNUE5fTU9EX09SX01PREVYQUNUXzFfT0REIChQVFIobiksIChtcF9zaXplX3QpIFNJWihuKSwgcCk7CisJCXdoaWxlICgtLW5wcmltZXMgPj0gMCkKKwkJICBpZiAociAlIHByaW1lc1tucHJpbWVzXSA9PSAwKQorCQkgICAgeworCQkgICAgICBBU1NFUlRfQUxXQVlTIChtcG5fbW9kXzEgKFBUUihuKSwgKG1wX3NpemVfdCkgU0laKG4pLCAobXBfbGltYl90KSBwcmltZXNbbnByaW1lc10pID09IDApOworCQkgICAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJcCA9IHE7CisJCW5wcmltZXMgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJcCA9IHAwOworCSAgICAgIH0KKwkgICAgcHJpbWVzW25wcmltZXMrK10gPSBxOworCSAgfQorICAgICAgfQorICB9CisKKyAgLyogUGVyZm9ybSBhIG51bWJlciBvZiBNaWxsZXItUmFiaW4gdGVzdHMuICAqLworICByZXR1cm4gbXB6X21pbGxlcnJhYmluIChuLCByZXBzKTsKK30KKworc3RhdGljIGludAoraXNwcmltZSAodW5zaWduZWQgbG9uZyBpbnQgdCkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcSwgciwgZDsKKworICBBU1NFUlQgKHQgPj0gMyAmJiAodCAmIDEpICE9IDApOworCisgIGQgPSAzOworICBkbyB7CisgICAgICBxID0gdCAvIGQ7CisgICAgICByID0gdCAtIHEgKiBkOworICAgICAgaWYgKHEgPCBkKQorCXJldHVybiAxOworICAgICAgZCArPSAyOworICB9IHdoaWxlIChyICE9IDApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wei9wcmltb3JpYWxfdWkuYyBiL21wei9wcmltb3JpYWxfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTE3NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3ByaW1vcmlhbF91aS5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBtcHpfcHJpbW9yaWFsX3VpKFJFUywgTikgLS0gU2V0IFJFUyB0byBOIyB0aGUgcHJvZHVjdCBvZiBwcmltZXMgPD0gTi4KKworQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKK0NvcHlyaWdodCAyMDEyLCAyMDE1LCAyMDE2LCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogVE9ETzogUmVtb3ZlIGR1cGxpY2F0ZWQgY29uc3RhbnRzIC8gbWFjcm9zIC8gc3RhdGljIGZ1bmN0aW9ucy4uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBtYWNyb3M6IGNvbW1vbiBtYWNyb3MsIGZvciBzd2luZy9mYWMvYmluICgmc2lldmUpICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQUNUT1JfTElTVF9TVE9SRShQLCBQUiwgTUFYX1BSLCBWRUMsIEkpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBpZiAoKFBSKSA+IChNQVhfUFIpKSB7CQkJCQlcCisgICAgICAoVkVDKVsoSSkrK10gPSAoUFIpOwkJCQkJXAorICAgICAgKFBSKSA9IChQKTsJCQkJCQlcCisgICAgfSBlbHNlCQkJCQkJCVwKKyAgICAgIChQUikgKj0gKFApOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gc2lldmU6IHNpZXZpbmcgZnVuY3Rpb25zIGFuZCB0b29scyBmb3IgcHJpbWVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgV0FOVF9BU1NFUlQKKy8qIG5fdG9fYml0IChuKSA9ICgobi0xKSYoLUNOU1RfTElNQigyKSkpLzNVLTEgKi8KK3N0YXRpYyBtcF9saW1iX3QKK25fdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKChuLTUpfDEpLzNVOyB9CisKK3N0YXRpYyBtcF9zaXplX3QKK3ByaW1lc2lldmVfc2l6ZSAobXBfbGltYl90IG4pIHsgcmV0dXJuIG5fdG9fYml0KG4pIC8gR01QX0xJTUJfQklUUyArIDE7IH0KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBwcmltb3JpYWw6IGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK21wel9wcmltb3JpYWxfdWkgKG1wel9wdHIgcmVzLCB1bnNpZ25lZCBsb25nIG4pCit7CisgIEFTU0VSVCAobiA8PSBHTVBfTlVNQl9NQVgpOworCisgIGlmIChuIDwgNSkKKyAgICB7CisgICAgICAvKiBUaGUgc21hbGxlc3QgNSByZXN1bHRzIGZvciBwcmltb3JpYWwgYXJlIHN0b3JlZCAqLworICAgICAgLyogaW4gYSAxNS1iaXRzIGNvbnN0YW50IChmaXZlIG9jdGFsIGRpZ2l0cykJICovCisgICAgICBNUFpfTkVXQUxMT0MgKHJlcywgMSlbMF0gPSAoMDY2MjExID4+IChuICogMykpICYgNzsKKyAgICAgIFNJWiAocmVzKSA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbXBfbGltYl90ICpzaWV2ZSwgKmZhY3RvcnM7CisgICAgICBtcF9zaXplX3Qgc2l6ZSwgajsKKyAgICAgIG1wX2xpbWJfdCBwcm9kOworICAgICAgVE1QX0RFQ0w7CisKKyAgICAgIC8qIFRyeSB0byBlc3RpbWF0ZSB0aGUgcmVzdWx0IHNpemUsIHRvIGF2b2lkCSovCisgICAgICAvKiByZXNpemluZywgYW5kIHRvIGluaXRpYWxseSBzdG9yZSB0aGUgc2lldmUuCSovCisgICAgICBzaXplID0gbiAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBzaXplID0gc2l6ZSArIChzaXplID4+IDEpICsgMTsKKyAgICAgIEFTU0VSVCAoc2l6ZSA+PSBwcmltZXNpZXZlX3NpemUgKG4pKTsKKyAgICAgIHNpZXZlID0gTVBaX05FV0FMTE9DIChyZXMsIHNpemUpOworICAgICAgc2l6ZSA9IChnbXBfcHJpbWVzaWV2ZSAoc2lldmUsIG4pICsgMSkgLyBsb2dfbl9tYXggKG4pICsgMTsKKworICAgICAgVE1QX01BUks7CisgICAgICBmYWN0b3JzID0gVE1QX0FMTE9DX0xJTUJTIChzaXplKTsKKworICAgICAgaiA9IDA7CisKKyAgICAgIHByb2QgPSA2OworCisgICAgICAvKiBTdG9yZSBwcmltZXMgZnJvbSA1IHRvIG4gKi8KKyAgICAgIHsKKwltcF9saW1iX3QgbWF4X3Byb2Q7CisKKwltYXhfcHJvZCA9IEdNUF9OVU1CX01BWCAvIG47CisKKwkvKiBMb29wIG9uIHNpZXZlZCBwcmltZXMuICovCisJZm9yIChtcF9saW1iX3QgaSA9IDQsICpzcCA9IHNpZXZlOyBpIDwgbjsgaSArPSBHTVBfTElNQl9CSVRTICogMykKKwkgIGZvciAobXBfbGltYl90IGIgPSBpLCB4ID0gfiAqKHNwKyspOyB4ICE9IDA7IGIgKz0gMywgeCA+Pj0gMSkKKwkgICAgaWYgKHggJiAxKQorCSAgICAgIHsKKwkJbXBfbGltYl90IHByaW1lID0gYiB8IDE7CisJCUZBQ1RPUl9MSVNUX1NUT1JFIChwcmltZSwgcHJvZCwgbWF4X3Byb2QsIGZhY3RvcnMsIGopOworCSAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGogIT0gMCkKKwl7CisJICBmYWN0b3JzW2orK10gPSBwcm9kOworCSAgbXB6X3Byb2RsaW1icyAocmVzLCBmYWN0b3JzLCBqKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgUFRSIChyZXMpWzBdID0gcHJvZDsKKwkgIFNJWiAocmVzKSA9IDE7CisJfQorCisgICAgICBUTVBfRlJFRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovcHJvZGxpbWJzLmMgYi9tcHovcHJvZGxpbWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmMDZhMQotLS0gL2Rldi9udWxsCisrKyBiL21wei9wcm9kbGltYnMuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogbXB6X3Byb2RsaW1icyhSRVNVTFQsIFYsIExFTikgLS0gU2V0IFJFU1VMVCB0byBWWzBdKlZbMV0qLi4uKlZbTEVOLTFdLgorCitDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworVEhFIEZVTkNUSU9OIElOIFRISVMgRklMRSBJUyBJTlRFUk5BTCBXSVRIIEEgTVVUQUJMRSBJTlRFUkZBQ0UuCitJVCBJUyBPTkxZIFNBRkUgVE8gUkVBQ0ggSVQgVEhST1VHSCBET0NVTUVOVEVEIElOVEVSRkFDRVMuCitJTiBGQUNULCBJVCBJUyBBTE1PU1QgR1VBUkFOVEVFRCBUSEFUIElUIFdJTEwgQ0hBTkdFIE9SCitESVNBUFBFQVIgSU4gQSBGVVRVUkUgR05VIE1QIFJFTEVBU0UuCisKK0NvcHlyaWdodCAyMDEwLTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VjdGlvbiBsaXN0LXByb2Q6IHByb2R1Y3Qgb2YgYSBsaXN0IC0+IG1wel90ICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZJWE1FOiBzaG91bGQgYmUgdHVuZWQgKi8KKyNpZm5kZWYgUkVDVVJTSVZFX1BST0RfVEhSRVNIT0xECisjZGVmaW5lIFJFQ1VSU0lWRV9QUk9EX1RIUkVTSE9MRCAoTVVMX1RPT00yMl9USFJFU0hPTEQpCisjZW5kaWYKKworLyogQ29tcHV0ZXMgdGhlIHByb2R1Y3Qgb2YgdGhlIGo+MSBsaW1icyBwb2ludGVkIGJ5IGZhY3RvcnMsIHB1dHMgdGhlCisgKiByZXN1bHQgaW4geC4gSXQgYXNzdW1lcyB0aGF0IGFsbCBsaW1icyBhcmUgbm9uLXplcm8uIEFib3ZlCisgKiBLYXJhdHN1YmEncyB0aHJlc2hvbGQgaXQgdXNlcyBhIGJpbmFyeSBzcGxpdHRpbmcgc3RyYXRlZ3ksIHRvIGdhaW4KKyAqIHNwZWVkIGJ5IHRoZSBhc3ltcHRvdGljYWxseSBmYXN0IG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobXMuCisgKgorICogVGhlIGxpc3QgaW4gIHtmYWN0b3JzLCBqfSBpcyBvdmVyd3JpdHRlbi4KKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlc3VsdAorICovCisKK21wX3NpemVfdAorbXB6X3Byb2RsaW1icyAobXB6X3B0ciB4LCBtcF9wdHIgZmFjdG9ycywgbXBfc2l6ZV90IGopCit7CisgIG1wX2xpbWJfdCBjeTsKKyAgbXBfc2l6ZV90IHNpemUsIGk7CisgIG1wX3B0ciAgICBwcm9kOworCisgIEFTU0VSVCAoaiA+IDEpOworICBBU1NFUlQgKFJFQ1VSU0lWRV9QUk9EX1RIUkVTSE9MRCA+IDMpOworCisgIGlmIChCRUxPV19USFJFU0hPTEQgKGosIFJFQ1VSU0lWRV9QUk9EX1RIUkVTSE9MRCkpIHsKKyAgICBqLS07CisgICAgc2l6ZSA9IDE7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgajsgaSsrKQorICAgICAgeworCWN5ID0gbXBuX211bF8xIChmYWN0b3JzLCBmYWN0b3JzLCBzaXplLCBmYWN0b3JzW2ldKTsKKwlmYWN0b3JzW3NpemVdID0gY3k7CisJc2l6ZSArPSBjeSAhPSAwOworICAgICAgfTsKKworICAgIHByb2QgPSBNUFpfTkVXQUxMT0MgKHgsIHNpemUgKyAxKTsKKworICAgIGN5ID0gbXBuX211bF8xIChwcm9kLCBmYWN0b3JzLCBzaXplLCBmYWN0b3JzW2ldKTsKKyAgICBwcm9kW3NpemVdID0gY3k7CisgICAgcmV0dXJuIFNJWiAoeCkgPSBzaXplICsgKGN5ICE9IDApOworICB9IGVsc2UgeworICAgIG1wel90IHgxLCB4MjsKKyAgICBUTVBfREVDTDsKKworICAgIGkgPSBqID4+IDE7CisgICAgaiAtPSBpOworICAgIFRNUF9NQVJLOworCisgICAgTVBaX1RNUF9JTklUICh4Miwgaik7CisKKyAgICBQVFIgKHgxKSA9IGZhY3RvcnMgKyBpOworICAgIEFMTE9DICh4MSkgPSBqOworICAgIGogPSBtcHpfcHJvZGxpbWJzICh4MiwgZmFjdG9ycyArIGksIGopOworICAgIGkgPSBtcHpfcHJvZGxpbWJzICh4MSwgZmFjdG9ycywgaSk7CisgICAgc2l6ZSA9IGkgKyBqOworICAgIHByb2QgPSBNUFpfTkVXQUxMT0MgKHgsIHNpemUpOworICAgIGlmIChpID49IGopCisgICAgICBjeSA9IG1wbl9tdWwgKHByb2QsIFBUUih4MSksIGksIFBUUih4MiksIGopOworICAgIGVsc2UKKyAgICAgIGN5ID0gbXBuX211bCAocHJvZCwgUFRSKHgyKSwgaiwgUFRSKHgxKSwgaSk7CisgICAgVE1QX0ZSRUU7CisKKyAgICByZXR1cm4gU0laICh4KSA9IHNpemUgLSAoY3kgPT0gMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL21wei9yYW5kb20uYyBiL21wei9yYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFlNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3JhbmRvbS5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIG1wel9yYW5kb20gLS0gR2VuZXJhdGUgYSByYW5kb20gbXB6X3Qgb2Ygc3BlY2lmaWVkIHNpemUgaW4gbGltYnMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3JhbmRvbSAobXB6X3B0ciB4LCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXB6X3VyYW5kb21iICh4LCBSQU5EUywgKHVuc2lnbmVkIGxvbmcpIChBQlMgKHNpemUpICogR01QX05VTUJfQklUUykpOworICBpZiAoc2l6ZSA8IDApCisgICAgU0laKHgpID0gLVNJWih4KTsKK30KZGlmZiAtLWdpdCBhL21wei9yYW5kb20yLmMgYi9tcHovcmFuZG9tMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzI1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcmFuZG9tMi5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIG1wel9yYW5kb20yIC0tIEdlbmVyYXRlIGEgcG9zaXRpdmUgcmFuZG9tIG1wel90IG9mIHNwZWNpZmllZCBzaXplLCB3aXRoCisgICBsb25nIHJ1bnMgb2YgY29uc2VjdXRpdmUgb25lcyBhbmQgemVyb3MgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbi4KKyAgIE1lYW50IGZvciB0ZXN0aW5nIG9mIG90aGVyIE1QIHJvdXRpbmVzLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMSwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfcmFuZG9tMiAobXB6X3B0ciB4LCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90IGFic19zaXplOworICBtcF9wdHIgeHA7CisKKyAgYWJzX3NpemUgPSBBQlMgKHNpemUpOworICBpZiAoYWJzX3NpemUgIT0gMCkKKyAgICB7CisgICAgICB4cCA9IE1QWl9ORVdBTExPQyAoeCwgYWJzX3NpemUpOworCisgICAgICBtcG5fcmFuZG9tMiAoeHAsIGFic19zaXplKTsKKyAgICB9CisKKyAgU0laICh4KSA9IHNpemU7Cit9CmRpZmYgLS1naXQgYS9tcHovcmVhbGxvYy5jIGIvbXB6L3JlYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg4ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3JlYWxsb2MuYwpAQCAtMCwwICsxLDcwIEBACisvKiBfbXB6X3JlYWxsb2MgLS0gbWFrZSB0aGUgbXB6X3QgaGF2ZSBORVdfQUxMT0MgZGlnaXRzIGFsbG9jYXRlZC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NSwgMjAwMCwgMjAwMSwgMjAwOCwgMjAxNSwgMjAyMSwgMjAyMiBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkICoKK19tcHpfcmVhbGxvYyAobXB6X3B0ciBtLCBtcF9zaXplX3QgbmV3X2FsbG9jKQoreworICBtcF9wdHIgbXA7CisKKyAgLyogTmV2ZXIgYWxsb2NhdGUgemVybyBzcGFjZS4gKi8KKyAgbmV3X2FsbG9jID0gTUFYIChuZXdfYWxsb2MsIDEpOworCisgIGlmIChzaXplb2YgKG1wX3NpemVfdCkgPT0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAobmV3X2FsbG9jID4gVUxPTkdfTUFYIC8gR01QX05VTUJfQklUUykpCisJTVBaX09WRVJGTE9XOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAobmV3X2FsbG9jID4gSU5UX01BWCkpCisJTVBaX09WRVJGTE9XOworICAgIH0KKworICBpZiAoQUxMT0MgKG0pID09IDApCisgICAgeworICAgICAgbXAgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChuZXdfYWxsb2MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wID0gX19HTVBfUkVBTExPQ0FURV9GVU5DX0xJTUJTIChQVFIgKG0pLCBBTExPQyAobSksIG5ld19hbGxvYyk7CisKKyAgICAgIC8qIERvbid0IGNyZWF0ZSBhbiBpbnZhbGlkIG51bWJlcjsgaWYgdGhlIGN1cnJlbnQgdmFsdWUgZG9lc24ndCBmaXQgYWZ0ZXIKKwkgcmVhbGxvY2F0aW9uLCBjbGVhciBpdCB0byAwLiAgKi8KKyAgICAgIGlmIChVTkxJS0VMWSAoQUJTSVogKG0pID4gbmV3X2FsbG9jKSkKKwlTSVogKG0pID0gMDsKKyAgICB9CisKKyAgUFRSIChtKSA9IG1wOworICBBTExPQyhtKSA9IG5ld19hbGxvYzsKKyAgcmV0dXJuICh2b2lkICopIG1wOworfQpkaWZmIC0tZ2l0IGEvbXB6L3JlYWxsb2MyLmMgYi9tcHovcmVhbGxvYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzMwNzdlCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3JlYWxsb2MyLmMKQEAgLTAsMCArMSw2MyBAQAorLyogbXB6X3JlYWxsb2MyIC0tIGNoYW5nZSBhbGxvY2F0ZWQgZGF0YSBzaXplLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwOCwgMjAxNSwgMjAyMSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCitJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfcmVhbGxvYzIgKG1wel9wdHIgbSwgbXBfYml0Y250X3QgYml0cykKK3sKKyAgbXBfc2l6ZV90IG5ld19hbGxvYzsKKworICBiaXRzIC09IChiaXRzICE9IDApOwkJLyogUm91bmQgZG93biwgZXhjZXB0IGlmIDAgKi8KKyAgbmV3X2FsbG9jID0gMSArIGJpdHMgLyBHTVBfTlVNQl9CSVRTOworCisgIGlmIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpID4gc2l6ZW9mIChpbnQpKSAvKiBwYXJhbSB2cyBfbXBfc2l6ZSBmaWVsZCAqLworICAgIHsKKyAgICAgIGlmIChVTkxJS0VMWSAobmV3X2FsbG9jID4gSU5UX01BWCkpCisJTVBaX09WRVJGTE9XOworICAgIH0KKworICBpZiAoQUxMT0MgKG0pID09IDApCisgICAgeworICAgICAgUFRSIChtKSA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfTElNQlMgKG5ld19hbGxvYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUFRSIChtKSA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19MSU1CUyAoUFRSKG0pLCBBTExPQyhtKSwgbmV3X2FsbG9jKTsKKworICAgICAgLyogRG9uJ3QgY3JlYXRlIGFuIGludmFsaWQgbnVtYmVyOyBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2Vzbid0IGZpdCBhZnRlcgorCSByZWFsbG9jYXRpb24sIGNsZWFyIGl0IHRvIDAuICAqLworICAgICAgaWYgKEFCU0laKG0pID4gbmV3X2FsbG9jKQorCVNJWihtKSA9IDA7CisgICAgfQorCisgIEFMTE9DKG0pID0gbmV3X2FsbG9jOworfQpkaWZmIC0tZ2l0IGEvbXB6L3JlbW92ZS5jIGIvbXB6L3JlbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTUxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcmVtb3ZlLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIG1wel9yZW1vdmUgLS0gZGl2aWRlIG91dCBhIGZhY3RvciBhbmQgcmV0dXJuIGl0cyBtdWx0aXBsaWNpdHkuCisKK0NvcHlyaWdodCAxOTk4LTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCittcF9iaXRjbnRfdAorbXB6X3JlbW92ZSAobXB6X3B0ciBkZXN0LCBtcHpfc3JjcHRyIHNyYywgbXB6X3NyY3B0ciBmKQoreworICBtcF9iaXRjbnRfdCBwd3I7CisgIG1wX3NyY3B0ciBmcDsKKyAgbXBfc2l6ZV90IHNuLCBmbiwgYWZuOworICBtcF9saW1iX3QgZnAwOworCisgIHNuID0gU0laIChzcmMpOworICBmbiA9IFNJWiAoZik7CisgIGZwID0gUFRSIChmKTsKKyAgYWZuID0gQUJTIChmbik7CisgIGZwMCA9IGZwWzBdOworCisgIGlmIChVTkxJS0VMWSAoKGFmbiA8PSAoZnAwID09IDEpKSAvKiBtcHpfY21wYWJzX3VpIChmLCAxKSA8PSAwICovCisJCXwgKHNuID09IDApKSkKKyAgICB7CisgICAgICAvKiAgZiA9IDAgb3IgZiA9ICstIDEgb3Igc3JjID0gMCAqLworICAgICAgaWYgKGFmbiA9PSAwKQorCURJVklERV9CWV9aRVJPOworICAgICAgbXB6X3NldCAoZGVzdCwgc3JjKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoKGZwMCAmIDEpICE9IDApCisgICAgeyAvKiBmIGlzIG9kZCAqLworICAgICAgbXBfcHRyIGRwOworICAgICAgbXBfc2l6ZV90IGRuOworCisgICAgICBkbiA9IEFCUyAoc24pOworICAgICAgZHAgPSBNUFpfUkVBTExPQyAoZGVzdCwgZG4pOworCisgICAgICBwd3IgPSBtcG5fcmVtb3ZlIChkcCwgJmRuLCBQVFIoc3JjKSwgZG4sIFBUUihmKSwgYWZuLCB+KG1wX2JpdGNudF90KSAwKTsKKworICAgICAgU0laIChkZXN0KSA9ICgocHdyICYgKGZuIDwgMCkpIF4gKHNuIDwgMCkpID8gLWRuIDogZG47CisgICAgfQorICBlbHNlIGlmIChhZm4gPT0gKGZwMCA9PSAyKSkKKyAgICB7IC8qIG1wel9jbXBhYnNfdWkgKGYsIDIpID09IDAgKi8KKyAgICAgIHB3ciA9IG1wel9zY2FuMSAoc3JjLCAwKTsKKyAgICAgIG1wel9kaXZfMmV4cCAoZGVzdCwgc3JjLCBwd3IpOworICAgICAgaWYgKHB3ciAmIChmbiA8IDApKSAvKigocHdyICUgMiA9PSAxKSAmJiAoU0laIChmKSA8IDApKSovCisJbXB6X25lZyAoZGVzdCwgZGVzdCk7CisgICAgfQorICBlbHNlCisgICAgeyAvKiBmICE9ICstMiAqLworICAgICAgbXB6X3QgeCwgcmVtOworCisgICAgICBtcHpfaW5pdCAocmVtKTsKKyAgICAgIG1wel9pbml0ICh4KTsKKworICAgICAgcHdyID0gMDsKKyAgICAgIG1wel90ZGl2X3FyICh4LCByZW0sIHNyYywgZik7CisgICAgICBpZiAoU0laIChyZW0pID09IDApCisJeworCSAgbXB6X3QgZnBvd1tHTVBfTElNQl9CSVRTXTsJCS8qIFJlYWxseSBNUF9TSVpFX1RfQklUUyAqLworCSAgaW50IHA7CisKKyNpZiBXQU5UX09SSUdJTkFMX0RFU1QKKwkgIG1wX3B0ciBkcDsKKwkgIGRwID0gUFRSIChkZXN0KTsKKyNlbmRpZgorICAgICAgLyogV2UgY291bGQgcGVyaGFwcyBjb21wdXRlIG1wel9zY2FuMShzcmMsMCkvbXB6X3NjYW4xKGYsMCkuICBJdCBpcyBhbgorCSB1cHBlciBib3VuZCBvZiB0aGUgcmVzdWx0IHdlJ3JlIHNlZWtpbmcuICBXZSBjb3VsZCBhbHNvIHNoaWZ0IGRvd24gdGhlCisJIG9wZXJhbmRzIHNvIHRoYXQgdGhleSBiZWNvbWUgb2RkLCB0byBtYWtlIGludGVybWVkaWF0ZSB2YWx1ZXMKKwkgc21hbGxlci4gICovCisJICBtcHpfaW5pdF9zZXQgKGZwb3dbMF0sIGYpOworCSAgbXB6X3N3YXAgKGRlc3QsIHgpOworCisJICBwID0gMTsKKyAgICAgIC8qIERpdmlkZSBieSBmLCBmXjIgLi4uIGZeKDJeaykgdW50aWwgd2UgZ2V0IGEgcmVtYWluZGVyIGZvciBmXigyXmspLiAgKi8KKwkgIHdoaWxlIChBQlNJWiAoZGVzdCkgPj0gMiAqIEFCU0laIChmcG93W3AgLSAxXSkgLSAxKQorCSAgICB7CisJICAgICAgbXB6X2luaXQgKGZwb3dbcF0pOworCSAgICAgIG1wel9tdWwgKGZwb3dbcF0sIGZwb3dbcCAtIDFdLCBmcG93W3AgLSAxXSk7CisJICAgICAgbXB6X3RkaXZfcXIgKHgsIHJlbSwgZGVzdCwgZnBvd1twXSk7CisJICAgICAgaWYgKFNJWiAocmVtKSAhPSAwKSB7CisJCW1wel9jbGVhciAoZnBvd1twXSk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgICBtcHpfc3dhcCAoZGVzdCwgeCk7CisJICAgICAgcCsrOworCSAgICB9CisKKwkgIHB3ciA9ICgobXBfYml0Y250X3QpMSA8PCBwKSAtIDE7CisKKyAgICAgIC8qIERpdmlkZSBieSBmXigyXihrLTEpKSwgZl4oMl4oay0yKSksIC4uLiwgZiBmb3IgYWxsIGRpdmlzb3JzIHRoYXQgZ2l2ZQorCSBhIHplcm8gcmVtYWluZGVyLiAgKi8KKwkgIHdoaWxlICgtLXAgPj0gMCkKKwkgICAgeworCSAgICAgIG1wel90ZGl2X3FyICh4LCByZW0sIGRlc3QsIGZwb3dbcF0pOworCSAgICAgIGlmIChTSVogKHJlbSkgPT0gMCkKKwkJeworCQkgIHB3ciArPSAobXBfYml0Y250X3QpMSA8PCBwOworCQkgIG1wel9zd2FwIChkZXN0LCB4KTsKKwkJfQorCSAgICAgIG1wel9jbGVhciAoZnBvd1twXSk7CisJICAgIH0KKworI2lmIFdBTlRfT1JJR0lOQUxfREVTVAorCSAgaWYgKFBUUiAoeCkgPT0gZHApIHsKKwkgICAgbXB6X3N3YXAgKGRlc3QsIHgpOworCSAgICBtcHpfc2V0IChkZXN0LCB4KTsKKwkgIH0KKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwltcHpfc2V0IChkZXN0LCBzcmMpOworCisgICAgICBtcHpfY2xlYXIgKHgpOworICAgICAgbXB6X2NsZWFyIChyZW0pOworICAgIH0KKworICByZXR1cm4gcHdyOworfQpkaWZmIC0tZ2l0IGEvbXB6L3JvaW5pdF9uLmMgYi9tcHovcm9pbml0X24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI1NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3JvaW5pdF9uLmMKQEAgLTAsMCArMSw0MyBAQAorLyogbXB6X3JvaW5pdF9uIC0tIEluaXRpYWxpemUgbXB6IHdpdGggcmVhZC1vbmx5IGxpbWIgYXJyYXkuCisKK0NvcHlyaWdodCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworbXB6X3NyY3B0cgorbXB6X3JvaW5pdF9uIChtcHpfcHRyIHgsIG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IHhzKQoreworICBtcF9zaXplX3QgeG4gPSBBQlMoeHMpOworICBNUE5fTk9STUFMSVpFICh4cCwgeG4pOworCisgIEFMTE9DICh4KSA9IDA7CisgIFNJWiAoeCkgPSB4cyA8IDAgPyAteG4gOiB4bjsKKyAgUFRSICh4KSA9IChtcF9wdHIpIHhwOworICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL21wei9yb290LmMgYi9tcHovcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGQzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcm9vdC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIG1wel9yb290KHJvb3QsIHUsIG50aCkgLS0gIFNldCBST09UIHRvIGZsb29yKFVeKDEvbnRoKSkuCisgICBSZXR1cm4gYW4gaW5kaWNhdGlvbiBpZiB0aGUgcmVzdWx0IGlzIGV4YWN0LgorCitDb3B5cmlnaHQgMTk5OS0yMDAzLCAyMDA1LCAyMDEyLCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50CittcHpfcm9vdCAobXB6X3B0ciByb290LCBtcHpfc3JjcHRyIHUsIHVuc2lnbmVkIGxvbmcgaW50IG50aCkKK3sKKyAgbXBfcHRyIHJvb3RwLCB1cDsKKyAgbXBfc2l6ZV90IHVzLCB1biwgcm9vdG4sIHJlbW47CisgIFRNUF9ERUNMOworCisgIHVzID0gU0laKHUpOworCisgIC8qIGV2ZW4gcm9vdHMgb2YgbmVnYXRpdmVzIHByb3Zva2UgYW4gZXhjZXB0aW9uICovCisgIGlmIChVTkxJS0VMWSAodXMgPCAwICYmIChudGggJiAxKSA9PSAwKSkKKyAgICBTUVJUX09GX05FR0FUSVZFOworCisgIGlmIChVTkxJS0VMWSAobnRoIDw9IDEpKQorICAgIHsKKyAgICAgIC8qIHJvb3QgZXh0cmFjdGlvbiBpbnRlcnByZXRlZCBhcyBjXigxL250aCkgbWVhbnMgYSB6ZXJvdGggcm9vdCBzaG91bGQKKwkgcHJvdm9rZSBhIGRpdmlkZSBieSB6ZXJvLCBkbyB0aGlzIGV2ZW4gaWYgYz09MCAqLworICAgICAgaWYgKFVOTElLRUxZIChudGggPT0gMCkpCisJRElWSURFX0JZX1pFUk87CisgICAgICAvKiBudGggPT0gMSAqLworICAgICAgaWYgKHJvb3QgIT0gTlVMTCAmJiB1ICE9IHJvb3QpCisJbXB6X3NldCAocm9vdCwgdSk7CisgICAgICByZXR1cm4gMTsJCQkvKiBleGFjdCByZXN1bHQgKi8KKyAgICB9CisKKyAgaWYgKHVzID09IDApCisgICAgeworICAgICAgaWYgKHJvb3QgIT0gTlVMTCkKKwlTSVoocm9vdCkgPSAwOworICAgICAgcmV0dXJuIDE7CQkJLyogZXhhY3QgcmVzdWx0ICovCisgICAgfQorCisgIHVuID0gQUJTICh1cyk7CisgIHJvb3RuID0gKHVuIC0gMSkgLyBudGggKyAxOworCisgIFRNUF9NQVJLOworCisgIC8qIEZJWE1FOiBQZXJoYXBzIGRpc2FsbG93IHJvb3QgPT0gTlVMTCAqLworICBpZiAocm9vdCAhPSBOVUxMICYmIHUgIT0gcm9vdCkKKyAgICByb290cCA9IE1QWl9ORVdBTExPQyAocm9vdCwgcm9vdG4pOworICBlbHNlCisgICAgcm9vdHAgPSBUTVBfQUxMT0NfTElNQlMgKHJvb3RuKTsKKworICB1cCA9IFBUUih1KTsKKyAgcmVtbiA9IG1wbl9yb290cmVtIChyb290cCwgTlVMTCwgdXAsIHVuLCAobXBfbGltYl90KSBudGgpOworCisgIGlmIChyb290ICE9IE5VTEwpCisgICAgeworICAgICAgU0laKHJvb3QpID0gdXMgPj0gMCA/IHJvb3RuIDogLXJvb3RuOworICAgICAgaWYgKHUgPT0gcm9vdCkKKwlNUE5fQ09QWSAodXAsIHJvb3RwLCByb290bik7CisgICAgfQorCisgIFRNUF9GUkVFOworICByZXR1cm4gcmVtbiA9PSAwOworfQpkaWZmIC0tZ2l0IGEvbXB6L3Jvb3RyZW0uYyBiL21wei9yb290cmVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5NTNkYgotLS0gL2Rldi9udWxsCisrKyBiL21wei9yb290cmVtLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIG1wel9yb290cmVtKHJvb3QsIHJlbSwgdSwgbnRoKSAtLSAgU2V0IFJPT1QgdG8gdHJ1bmMoVV4oMS9udGgpKSBhbmQKKyAgIHNldCBSRU0gdG8gdGhlIHJlbWFpbmRlci4KKworQ29weXJpZ2h0IDE5OTktMjAwMywgMjAwNSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9yb290cmVtIChtcHpfcHRyIHJvb3QsIG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIHUsIHVuc2lnbmVkIGxvbmcgaW50IG50aCkKK3sKKyAgbXBfcHRyIHJvb3RwLCB1cCwgcmVtcDsKKyAgbXBfc2l6ZV90IHVzLCB1biwgcm9vdG4sIHJlbW47CisgIFRNUF9ERUNMOworCisgIHVzID0gU0laKHUpOworCisgIC8qIGV2ZW4gcm9vdHMgb2YgbmVnYXRpdmVzIHByb3Zva2UgYW4gZXhjZXB0aW9uICovCisgIGlmIChVTkxJS0VMWSAodXMgPCAwICYmIChudGggJiAxKSA9PSAwKSkKKyAgICBTUVJUX09GX05FR0FUSVZFOworCisgIC8qIHJvb3QgZXh0cmFjdGlvbiBpbnRlcnByZXRlZCBhcyBjXigxL250aCkgbWVhbnMgYSB6ZXJvdGggcm9vdCBzaG91bGQKKyAgICAgcHJvdm9rZSBhIGRpdmlkZSBieSB6ZXJvLCBkbyB0aGlzIGV2ZW4gaWYgYz09MCAqLworICBpZiAoVU5MSUtFTFkgKG50aCA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBpZiAodXMgPT0gMCkKKyAgICB7CisgICAgICBpZiAocm9vdCAhPSBOVUxMKQorCVNJWihyb290KSA9IDA7CisgICAgICBTSVoocmVtKSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHVuID0gQUJTICh1cyk7CisgIHJvb3RuID0gKHVuIC0gMSkgLyBudGggKyAxOworCisgIFRNUF9NQVJLOworCisgIC8qIEZJWE1FOiBQZXJoYXBzIGRpc2FsbG93IHJvb3QgPT0gTlVMTCAqLworICBpZiAocm9vdCAhPSBOVUxMICYmIHUgIT0gcm9vdCkKKyAgICByb290cCA9IE1QWl9ORVdBTExPQyAocm9vdCwgcm9vdG4pOworICBlbHNlCisgICAgcm9vdHAgPSBUTVBfQUxMT0NfTElNQlMgKHJvb3RuKTsKKworICBpZiAodSAhPSByZW0pCisgICAgcmVtcCA9IE1QWl9ORVdBTExPQyAocmVtLCB1bik7CisgIGVsc2UKKyAgICByZW1wID0gVE1QX0FMTE9DX0xJTUJTICh1bik7CisKKyAgdXAgPSBQVFIodSk7CisKKyAgaWYgKG50aCA9PSAxKQorICAgIHsKKyAgICAgIE1QTl9DT1BZIChyb290cCwgdXAsIHVuKTsKKyAgICAgIHJlbW4gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlbW4gPSBtcG5fcm9vdHJlbSAocm9vdHAsIHJlbXAsIHVwLCB1biwgKG1wX2xpbWJfdCkgbnRoKTsKKyAgICB9CisKKyAgaWYgKHJvb3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBTSVoocm9vdCkgPSB1cyA+PSAwID8gcm9vdG4gOiAtcm9vdG47CisgICAgICBpZiAodSA9PSByb290KQorCU1QTl9DT1BZICh1cCwgcm9vdHAsIHJvb3RuKTsKKyAgICB9CisKKyAgaWYgKHUgPT0gcmVtKQorICAgIE1QTl9DT1BZICh1cCwgcmVtcCwgcmVtbik7CisgIFNJWihyZW0pID0gdXMgPj0gMCA/IHJlbW4gOiAtcmVtbjsKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovcnJhbmRvbWIuYyBiL21wei9ycmFuZG9tYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGM5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovcnJhbmRvbWIuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbXB6X3JyYW5kb21iIC0tIEdlbmVyYXRlIGEgcG9zaXRpdmUgcmFuZG9tIG1wel90IG9mIHNwZWNpZmllZCBiaXQgc2l6ZSwgd2l0aAorICAgbG9uZyBydW5zIG9mIGNvbnNlY3V0aXZlIG9uZXMgYW5kIHplcm9zIGluIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uCisgICBNZWFudCBmb3IgdGVzdGluZyBvZiBvdGhlciBNUCByb3V0aW5lcy4KKworQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAwNCwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3N0YXRpYyB2b2lkIGdtcF9ycmFuZG9tYiAobXBfcHRyLCBnbXBfcmFuZHN0YXRlX3B0ciwgbXBfYml0Y250X3QpOworCit2b2lkCittcHpfcnJhbmRvbWIgKG1wel9wdHIgeCwgZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLCBtcF9iaXRjbnRfdCBuYml0cykKK3sKKyAgbXBfc2l6ZV90IG5sOworICBtcF9wdHIgeHA7CisKKyAgbmwgPSBCSVRTX1RPX0xJTUJTIChuYml0cyk7CisgIGlmIChuYml0cyAhPSAwKQorICAgIHsKKyAgICAgIHhwID0gTVBaX05FV0FMTE9DICh4LCBubCk7CisgICAgICBnbXBfcnJhbmRvbWIgKHhwLCByc3RhdGUsIG5iaXRzKTsKKyAgICB9CisKKyAgU0laKHgpID0gbmw7Cit9CisKKy8qIEFzayBfZ21wX3JhbmQgZm9yIDMyIGJpdHMgcGVyIGNhbGwgdW5sZXNzIHRoYXQncyBtb3JlIHRoYW4gYSBsaW1iIGNhbiBob2xkLgorICAgVGh1cywgd2UgZ2V0IHRoZSBzYW1lIHJhbmRvbSBudW1iZXIgc2VxdWVuY2UgaW4gdGhlIGNvbW1vbiBjYXNlcy4KKyAgIEZJWE1FOiBXZSBzaG91bGQgYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIHJhbmRvbSBudW1iZXIgc2VxdWVuY2UhICAqLworI2lmIEdNUF9OVU1CX0JJVFMgPCAzMgorI2RlZmluZSBCSVRTX1BFUl9SQU5EQ0FMTCBHTVBfTlVNQl9CSVRTCisjZWxzZQorI2RlZmluZSBCSVRTX1BFUl9SQU5EQ0FMTCAzMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitnbXBfcnJhbmRvbWIgKG1wX3B0ciBycCwgZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLCBtcF9iaXRjbnRfdCBuYml0cykKK3sKKyAgbXBfYml0Y250X3QgYmk7CisgIG1wX2xpbWJfdCByYW5tOwkJLyogYnVmZmVyIGZvciByYW5kb20gYml0cyAqLworICB1bnNpZ25lZCBjYXBfY2h1bmtzaXplLCBjaHVua3NpemU7CisgIG1wX3NpemVfdCBpOworCisgIC8qIFNldCBlbnRpcmUgcmVzdWx0IHRvIDExMS4uMSAgKi8KKyAgaSA9IEJJVFNfVE9fTElNQlMgKG5iaXRzKSAtIDE7CisgIHJwW2ldID0gR01QX05VTUJfTUFYID4+IChHTVBfTlVNQl9CSVRTIC0gKG5iaXRzICUgR01QX05VTUJfQklUUykpICUgR01QX05VTUJfQklUUzsKKyAgZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHJwW2ldID0gR01QX05VTUJfTUFYOworCisgIF9nbXBfcmFuZCAoJnJhbm0sIHJzdGF0ZSwgQklUU19QRVJfUkFORENBTEwpOworICBjYXBfY2h1bmtzaXplID0gbmJpdHMgLyAocmFubSAlIDQgKyAxKTsKKyAgY2FwX2NodW5rc2l6ZSArPSBjYXBfY2h1bmtzaXplID09IDA7IC8qIG1ha2UgaXQgYXQgbGVhc3QgMSAqLworCisgIGJpID0gbmJpdHM7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBfZ21wX3JhbmQgKCZyYW5tLCByc3RhdGUsIEJJVFNfUEVSX1JBTkRDQUxMKTsKKyAgICAgIGNodW5rc2l6ZSA9IDEgKyByYW5tICUgY2FwX2NodW5rc2l6ZTsKKyAgICAgIGJpID0gKGJpIDwgY2h1bmtzaXplKSA/IDAgOiBiaSAtIGNodW5rc2l6ZTsKKworICAgICAgaWYgKGJpID09IDApCisJYnJlYWs7CQkJLyogbG93IGNodW5rIGlzIC4uLjEgKi8KKworICAgICAgcnBbYmkgLyBHTVBfTlVNQl9CSVRTXSBePSBDTlNUX0xJTUIgKDEpIDw8IGJpICUgR01QX05VTUJfQklUUzsKKworICAgICAgX2dtcF9yYW5kICgmcmFubSwgcnN0YXRlLCBCSVRTX1BFUl9SQU5EQ0FMTCk7CisgICAgICBjaHVua3NpemUgPSAxICsgcmFubSAlIGNhcF9jaHVua3NpemU7CisgICAgICBiaSA9IChiaSA8IGNodW5rc2l6ZSkgPyAwIDogYmkgLSBjaHVua3NpemU7CisKKyAgICAgIG1wbl9pbmNyX3UgKHJwICsgYmkgLyBHTVBfTlVNQl9CSVRTLCBDTlNUX0xJTUIgKDEpIDw8IGJpICUgR01QX05VTUJfQklUUyk7CisKKyAgICAgIGlmIChiaSA9PSAwKQorCWJyZWFrOwkJCS8qIGxvdyBjaHVuayBpcyAuLi4wICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbXB6L3NjYW4wLmMgYi9tcHovc2NhbjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBmMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NjYW4wLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIG1wel9zY2FuMCAtLSBzZWFyY2ggZm9yIGEgMCBiaXQuCisKK0NvcHlyaWdodCAyMDAwLTIwMDIsIDIwMDQsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogbXBuX3NjYW4wIGNhbid0IGJlIHVzZWQgZm9yIHRoZSB1PjAgc2VhcmNoIHNpbmNlIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIDAKKyAgIGJpdCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZGF0YS4gIG1wbl9zY2FuMSBjb3VsZCBiZSB1c2VkIGZvciB0aGUgaW52ZXJ0ZWQKKyAgIHNlYXJjaCB1bmRlciB1PDAsIGJ1dCB1c3VhbGx5IHRoZSBzZWFyY2ggd29uJ3QgZ28gdmVyeSBmYXIgc28gaXQgc2VlbXMKKyAgIHJlYXNvbmFibGUgdG8gaW5saW5lIHRoYXQgY29kZS4gICovCisKK21wX2JpdGNudF90CittcHpfc2NhbjAgKG1wel9zcmNwdHIgdSwgbXBfYml0Y250X3Qgc3RhcnRpbmdfYml0KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3NyY3B0ciAgICAgIHVfcHRyID0gUFRSKHUpOworICBtcF9zaXplX3QgICAgICBzaXplID0gU0laKHUpOworICBtcF9zaXplX3QgICAgICBhYnNfc2l6ZSA9IEFCUyhzaXplKTsKKyAgbXBfc3JjcHRyICAgICAgdV9lbmQgPSB1X3B0ciArIGFic19zaXplOworICBtcF9zaXplX3QgICAgICBzdGFydGluZ19saW1iID0gc3RhcnRpbmdfYml0IC8gR01QX05VTUJfQklUUzsKKyAgbXBfc3JjcHRyICAgICAgcCA9IHVfcHRyICsgc3RhcnRpbmdfbGltYjsKKyAgbXBfbGltYl90ICAgICAgbGltYjsKKyAgaW50ICAgICAgICAgICAgY250OworCisgIC8qIFdoZW4gcGFzdCBlbmQsIHRoZXJlJ3MgYW4gaW1tZWRpYXRlIDAgYml0IGZvciB1Pj0wLCBvciBubyAwIGJpdHMgZm9yCisgICAgIHU8MC4gIE5vdGljZSB0aGlzIHRlc3QgcGlja3MgdXAgYWxsIGNhc2VzIG9mIHU9PTAgdG9vLiAqLworICBpZiAoc3RhcnRpbmdfbGltYiA+PSBhYnNfc2l6ZSkKKyAgICByZXR1cm4gKHNpemUgPj0gMCA/IHN0YXJ0aW5nX2JpdCA6IH4obXBfYml0Y250X3QpIDApOworCisgIGxpbWIgPSAqcDsKKworICBpZiAoc2l6ZSA+PSAwKQorICAgIHsKKyAgICAgIC8qIE1hc2sgdG8gMSBhbGwgYml0cyBiZWZvcmUgc3RhcnRpbmdfYml0LCB0aHVzIGlnbm9yaW5nIHRoZW0uICovCisgICAgICBsaW1iIHw9IChDTlNUX0xJTUIoMSkgPDwgKHN0YXJ0aW5nX2JpdCAlIEdNUF9OVU1CX0JJVFMpKSAtIDE7CisKKyAgICAgIC8qIFNlYXJjaCBmb3IgYSBsaW1iIHdoaWNoIGlzbid0IGFsbCBvbmVzLiAgSWYgdGhlIGVuZCBpcyByZWFjaGVkIHRoZW4KKwkgdGhlIHplcm8gYml0IGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBpcyByZXR1cm5lZC4gICovCisgICAgICB3aGlsZSAobGltYiA9PSBHTVBfTlVNQl9NQVgpCisJeworCSAgcCsrOworCSAgaWYgKHAgPT0gdV9lbmQpCisJICAgIHJldHVybiAobXBfYml0Y250X3QpIGFic19zaXplICogR01QX05VTUJfQklUUzsKKwkgIGxpbWIgPSAqcDsKKwl9CisKKyAgICAgIC8qIE5vdyBzZWVrIGxvdyAxIGJpdC4gKi8KKyAgICAgIGxpbWIgPSB+bGltYjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtcF9zcmNwdHIgIHE7CisKKyAgICAgIC8qIElmIHRoZXJlJ3MgYSBub24temVybyBsaW1iIGJlZm9yZSBvdXJzIHRoZW4gd2UncmUgaW4gdGhlIG9uZXMKKwkgY29tcGxlbWVudCByZWdpb24uICBTZWFyY2ggZnJvbSAqKHAtMSkgZG93bndhcmRzIHNpbmNlIHRoYXQgbWlnaHQKKwkgZ2l2ZSBiZXR0ZXIgY2FjaGUgbG9jYWxpdHksIGFuZCBzaW5jZSBhIG5vbi16ZXJvIGluIHRoZSBtaWRkbGUgb2YgYQorCSBudW1iZXIgaXMgcGVyaGFwcyBhIHRvdWNoIG1vcmUgbGlrZWx5IHRoYW4gYXQgdGhlIGVuZC4gICovCisgICAgICBxID0gcDsKKyAgICAgIHdoaWxlIChxICE9IHVfcHRyKQorCXsKKwkgIHEtLTsKKwkgIGlmICgqcSAhPSAwKQorCSAgICBnb3RvIGludmVydGVkOworCX0KKworICAgICAgLyogQWRqdXN0IHNvIH5saW1iIGltcGxpZWQgYnkgc2VhcmNoaW5nIGZvciAxIGJpdCBiZWxvdyBiZWNvbWVzIC1saW1iLgorCSBJZiBsaW1iPT0wIGhlcmUgdGhlbiB0aGlzIGlzbid0IHRoZSBiZWdpbm5pbmcgb2YgdHdvcyBjb21wbGVtZW50CisJIGludmVyc2lvbiwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSBsaW1iPT0wIGlzIGEgemVybyBiaXQKKwkgaW1tZWRpYXRlbHkgKC0xIGlzIGFsbCBvbmVzIGZvciBiZWxvdykuICAqLworICAgICAgbGltYi0tOworCisgICAgaW52ZXJ0ZWQ6CisgICAgICAvKiBOb3cgc2Vla2luZyBhIDEgYml0LiAqLworCisgICAgICAvKiBNYXNrIHRvIDAgYWxsIGJpdHMgYmVmb3JlIHN0YXJ0aW5nX2JpdCwgdGh1cyBpZ25vcmluZyB0aGVtLiAqLworICAgICAgbGltYiAmPSAoTVBfTElNQl9UX01BWCA8PCAoc3RhcnRpbmdfYml0ICUgR01QX05VTUJfQklUUykpOworCisgICAgICBpZiAobGltYiA9PSAwKQorCXsKKwkgIC8qIElmIHRoZSBoaWdoIGxpbWIgaXMgemVybyBhZnRlciBtYXNraW5nLCB0aGVuIG5vIDEgYml0cyBwYXN0CisJICAgICBzdGFydGluZ19iaXQuICAqLworCSAgcCsrOworCSAgaWYgKHAgPT0gdV9lbmQpCisJICAgIHJldHVybiB+KG1wX2JpdGNudF90KSAwOworCisJICAvKiBTZWFyY2ggZnVydGhlciBmb3IgYSBub24temVybyBsaW1iLiAgVGhlIGhpZ2ggbGltYiBpcyBub24temVybywKKwkgICAgIGlmIG5vdGhpbmcgZWxzZS4gICovCisJICBmb3IgKDs7KQorCSAgICB7CisJICAgICAgbGltYiA9ICpwOworCSAgICAgIGlmIChsaW1iICE9IDApCisJCWJyZWFrOworCSAgICAgIHArKzsKKwkgICAgICBBU1NFUlQgKHAgPCB1X2VuZCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIEFTU0VSVCAobGltYiAhPSAwKTsKKyAgY291bnRfdHJhaWxpbmdfemVyb3MgKGNudCwgbGltYik7CisgIHJldHVybiAobXBfYml0Y250X3QpIChwIC0gdV9wdHIpICogR01QX05VTUJfQklUUyArIGNudDsKK30KZGlmZiAtLWdpdCBhL21wei9zY2FuMS5jIGIvbXB6L3NjYW4xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5NjE0NwotLS0gL2Rldi9udWxsCisrKyBiL21wei9zY2FuMS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBtcHpfc2NhbjEgLS0gc2VhcmNoIGZvciBhIDEgYml0LgorCitDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDA0LCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKy8qIG1wbl9zY2FuMCBjYW4ndCBiZSB1c2VkIGZvciB0aGUgaW52ZXJ0ZWQgdTwwIHNlYXJjaCBzaW5jZSB0aGVyZSBtaWdodCBub3QKKyAgIGJlIGEgMCBiaXQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGRhdGEuICBtcG5fc2NhbjEgY291bGQgYmUgdXNlZCB1bmRlciB1PjAKKyAgIChleGNlcHQgd2hlbiBpbiB0aGUgaGlnaCBsaW1iKSwgYnV0IHVzdWFsbHkgdGhlIHNlYXJjaCB3b24ndCBnbyB2ZXJ5IGZhcgorICAgc28gaXQgc2VlbXMgcmVhc29uYWJsZSB0byBpbmxpbmUgdGhhdCBjb2RlLiAgKi8KKworbXBfYml0Y250X3QKK21wel9zY2FuMSAobXB6X3NyY3B0ciB1LCBtcF9iaXRjbnRfdCBzdGFydGluZ19iaXQpIF9fR01QX05PVEhST1cKK3sKKyAgbXBfc3JjcHRyICAgICAgdV9wdHIgPSBQVFIodSk7CisgIG1wX3NpemVfdCAgICAgIHNpemUgPSBTSVoodSk7CisgIG1wX3NpemVfdCAgICAgIGFic19zaXplID0gQUJTKHNpemUpOworICBtcF9zcmNwdHIgICAgICB1X2VuZCA9IHVfcHRyICsgYWJzX3NpemUgLSAxOworICBtcF9zaXplX3QgICAgICBzdGFydGluZ19saW1iID0gc3RhcnRpbmdfYml0IC8gR01QX05VTUJfQklUUzsKKyAgbXBfc3JjcHRyICAgICAgcCA9IHVfcHRyICsgc3RhcnRpbmdfbGltYjsKKyAgbXBfbGltYl90ICAgICAgbGltYjsKKyAgaW50ICAgICAgICAgICAgY250OworCisgIC8qIFBhc3QgdGhlIGVuZCB0aGVyZSdzIG5vIDEgYml0cyBmb3IgdT49MCwgb3IgYW4gaW1tZWRpYXRlIDEgYml0IGZvciB1PDAuCisgICAgIE5vdGljZSB0aGlzIHRlc3QgcGlja3MgdXAgYW55IHU9PTAgdG9vLiAqLworICBpZiAoc3RhcnRpbmdfbGltYiA+PSBhYnNfc2l6ZSkKKyAgICByZXR1cm4gKHNpemUgPj0gMCA/IH4obXBfYml0Y250X3QpIDAgOiBzdGFydGluZ19iaXQpOworCisgIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNhc2UsIHdoZXJlIHNpZ24gaXMgbm90IHJlbGV2YW50ISAqLworICBpZiAoc3RhcnRpbmdfYml0ID09IDApCisgICAgZ290byBzaG9ydF9jdXQ7CisKKyAgbGltYiA9ICpwOworCisgIGlmIChzaXplID49IDApCisgICAgeworICAgICAgLyogTWFzayB0byAwIGFsbCBiaXRzIGJlZm9yZSBzdGFydGluZ19iaXQsIHRodXMgaWdub3JpbmcgdGhlbS4gKi8KKyAgICAgIGxpbWIgJj0gKE1QX0xJTUJfVF9NQVggPDwgKHN0YXJ0aW5nX2JpdCAlIEdNUF9OVU1CX0JJVFMpKTsKKworICAgICAgaWYgKGxpbWIgPT0gMCkKKwl7CisJICAvKiBJZiBpdCdzIHRoZSBoaWdoIGxpbWIgd2hpY2ggaXMgemVybyBhZnRlciBtYXNraW5nLCB0aGVuIHRoZXJlJ3MKKwkgICAgIG5vIDEgYml0cyBhZnRlciBzdGFydGluZ19iaXQuICAqLworCSAgaWYgKHAgPT0gdV9lbmQpCisJICAgIHJldHVybiB+KG1wX2JpdGNudF90KSAwOworCisJICAvKiBPdGhlcndpc2Ugc2VhcmNoIGZ1cnRoZXIgZm9yIGEgbm9uLXplcm8gbGltYi4gIFRoZSBoaWdoIGxpbWIgaXMKKwkgICAgIG5vbi16ZXJvLCBpZiBub3RoaW5nIGVsc2UuICAqLworCXNlYXJjaF9ub256ZXJvOgorCSAgZG8KKwkgICAgeworCSAgICAgIEFTU0VSVCAocCAhPSB1X2VuZCk7CisJICAgICAgcCsrOworCSAgICBzaG9ydF9jdXQ6CisJICAgICAgbGltYiA9ICpwOworCSAgICB9CisJICB3aGlsZSAobGltYiA9PSAwKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlcmUncyBhIG5vbi16ZXJvIGxpbWIgYmVmb3JlIG91cnMgdGhlbiB3ZSdyZSBpbiB0aGUgb25lcworCSBjb21wbGVtZW50IHJlZ2lvbi4gICovCisgICAgICBpZiAoc3RhcnRpbmdfbGltYiA9PSAwIHx8IG1wbl96ZXJvX3AgKHVfcHRyLCBzdGFydGluZ19saW1iKSkgeworCWlmIChsaW1iID09IDApCisJICAvKiBTZWVraW5nIGZvciB0aGUgZmlyc3Qgbm9uLXplcm8gYml0LCBpdCBpcyB0aGUgc2FtZSBmb3IgdSBhbmQgLXUuICovCisJICBnb3RvIHNlYXJjaF9ub256ZXJvOworCisJLyogQWRqdXN0IHNvIH5saW1iIGltcGxpZWQgYnkgc2VhcmNoaW5nIGZvciAwIGJpdCBiZWNvbWVzIC1saW1iLiAgKi8KKwlsaW1iLS07CisgICAgICB9CisKKyAgICAgIC8qIE5vdyBzZWVraW5nIGEgMCBiaXQuICovCisKKyAgICAgIC8qIE1hc2sgdG8gMSBhbGwgYml0cyBiZWZvcmUgc3RhcnRpbmdfYml0LCB0aHVzIGlnbm9yaW5nIHRoZW0uICovCisgICAgICBsaW1iIHw9IChDTlNUX0xJTUIoMSkgPDwgKHN0YXJ0aW5nX2JpdCAlIEdNUF9OVU1CX0JJVFMpKSAtIDE7CisKKyAgICAgIC8qIFNlYXJjaCBmb3IgYSBsaW1iIHdoaWNoIGlzIG5vdCBhbGwgb25lcy4gIElmIHRoZSBlbmQgaXMgcmVhY2hlZAorCSB0aGVuIHRoZSB6ZXJvIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBpcyB0aGUgcmVzdWx0LiAgKi8KKyAgICAgIHdoaWxlIChsaW1iID09IEdNUF9OVU1CX01BWCkKKwl7CisJICBpZiAocCA9PSB1X2VuZCkKKwkgICAgcmV0dXJuIChtcF9iaXRjbnRfdCkgYWJzX3NpemUgKiBHTVBfTlVNQl9CSVRTOworCSAgcCsrOworCSAgbGltYiA9ICpwOworCX0KKworICAgICAgLyogTm93IHNlZWtpbmcgbG93IDEgYml0LiAqLworICAgICAgbGltYiA9IH5saW1iOworICAgIH0KKworICBBU1NFUlQgKGxpbWIgIT0gMCk7CisgIGNvdW50X3RyYWlsaW5nX3plcm9zIChjbnQsIGxpbWIpOworICByZXR1cm4gKG1wX2JpdGNudF90KSAocCAtIHVfcHRyKSAqIEdNUF9OVU1CX0JJVFMgKyBjbnQ7Cit9CmRpZmYgLS1naXQgYS9tcHovc2V0LmMgYi9tcHovc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4OWFmMwotLS0gL2Rldi9udWxsCisrKyBiL21wei9zZXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKiBtcHpfc2V0IChkZXN0X2ludGVnZXIsIHNyY19pbnRlZ2VyKSAtLSBBc3NpZ24gREVTVF9JTlRFR0VSIGZyb20gU1JDX0lOVEVHRVIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDAsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wel9zZXQgKG1wel9wdHIgdywgbXB6X3NyY3B0ciB1KQoreworICBtcF9wdHIgd3AsIHVwOworICBtcF9zaXplX3QgdXNpemUsIHNpemU7CisKKyAgdXNpemUgPSBTSVoodSk7CisgIHNpemUgPSBBQlMgKHVzaXplKTsKKworICB3cCA9IE1QWl9ORVdBTExPQyAodywgc2l6ZSk7CisKKyAgdXAgPSBQVFIodSk7CisKKyAgTVBOX0NPUFkgKHdwLCB1cCwgc2l6ZSk7CisgIFNJWih3KSA9IHVzaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L3NldF9kLmMgYi9tcHovc2V0X2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JkYTExCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NldF9kLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIG1wel9zZXRfZChpbnRlZ2VyLCB2YWwpIC0tIEFzc2lnbiBJTlRFR0VSIHdpdGggYSBkb3VibGUgdmFsdWUgVkFMLgorCitDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMjAwMC0yMDAzLCAyMDA2LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX0ZMT0FUX0gKKyNpbmNsdWRlIDxmbG9hdC5oPiAgLyogZm9yIERCTF9NQVggKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBXZSB1c2VkIHRvIGhhdmUgYSBzcGVjaWFsIGNhc2UgZm9yIGQgPCBNUF9CQVNFX0FTX0RPVUJMRSwganVzdCBjYXN0aW5nCisgICBkb3VibGUgLT4gbGltYi4gIFVuZm9ydHVuYXRlbHkgZ2NjIDMuMyBvbiBwb3dlcnBjOTcwLWFwcGxlLWRhcndpbjYuOC41CisgICBnb3QgdGhpcyB3cm9uZy4gIChJdCBhc3N1bWVkIF9fZml4dW5zZGZkaSByZXR1cm5lZCBpdHMgcmVzdWx0IGluIGEgc2luZ2xlCisgICA2NC1iaXQgcmVnaXN0ZXIsIHdoZXJlIGluc3RlYWQgdGhhdCBmdW5jdGlvbiBmb2xsb3dlZCB0aGUgY2FsbGluZworICAgY29udmVudGlvbnMgYW5kIGdhdmUgdGhlIHJlc3VsdCBpbiB0d28gcGFydHMgcjMgYW5kIHI0LikgIEhlbmNlIHRoZSB1c2UKKyAgIG9mIF9fZ21wX2V4dHJhY3RfZG91YmxlIGluIGFsbCBjYXNlcy4gICovCisKK3ZvaWQKK21wel9zZXRfZCAobXB6X3B0ciByLCBkb3VibGUgZCkKK3sKKyAgaW50IG5lZ2F0aXZlOworICBtcF9saW1iX3QgdHBbTElNQlNfUEVSX0RPVUJMRV07CisgIG1wX3B0ciBycDsKKyAgbXBfc2l6ZV90IHJuOworCisgIERPVUJMRV9OQU5fSU5GX0FDVElPTiAoZCwKKwkJCSBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAoKSwKKwkJCSBfX2dtcF9pbnZhbGlkX29wZXJhdGlvbiAoKSk7CisKKyAgbmVnYXRpdmUgPSBkIDwgMDsKKyAgZCA9IEFCUyAoZCk7CisKKyAgcm4gPSBfX2dtcF9leHRyYWN0X2RvdWJsZSAodHAsIGQpOworCisgIGlmIChybiA8PSAwKQorICAgIHJuID0gMDsKKworICBycCA9IE1QWl9ORVdBTExPQyAociwgcm4pOworCisgIHN3aXRjaCAocm4pCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBNUE5fWkVSTyAocnAsIHJuIC0gTElNQlNfUEVSX0RPVUJMRSk7CisgICAgICBycCArPSBybiAtIExJTUJTX1BFUl9ET1VCTEU7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyNpZiBMSU1CU19QRVJfRE9VQkxFID09IDIKKyAgICBjYXNlIDI6CisgICAgICBycFsxXSA9IHRwWzFdLCBycFswXSA9IHRwWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcnBbMF0gPSB0cFsxXTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgTElNQlNfUEVSX0RPVUJMRSA9PSAzCisgICAgY2FzZSAzOgorICAgICAgcnBbMl0gPSB0cFsyXSwgcnBbMV0gPSB0cFsxXSwgcnBbMF0gPSB0cFswXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHJwWzFdID0gdHBbMl0sIHJwWzBdID0gdHBbMV07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBycFswXSA9IHRwWzJdOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBMSU1CU19QRVJfRE9VQkxFID09IDQKKyAgICBjYXNlIDQ6CisgICAgICBycFszXSA9IHRwWzNdLCBycFsyXSA9IHRwWzJdLCBycFsxXSA9IHRwWzFdLCBycFswXSA9IHRwWzBdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgcnBbMl0gPSB0cFszXSwgcnBbMV0gPSB0cFsyXSwgcnBbMF0gPSB0cFsxXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHJwWzFdID0gdHBbM10sIHJwWzBdID0gdHBbMl07CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBycFswXSA9IHRwWzNdOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIDA6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgU0laKHIpID0gbmVnYXRpdmUgPyAtcm4gOiBybjsKK30KZGlmZiAtLWdpdCBhL21wei9zZXRfZi5jIGIvbXB6L3NldF9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlY2MwYgotLS0gL2Rldi9udWxsCisrKyBiL21wei9zZXRfZi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIG1wel9zZXRfZiAoZGVzdF9pbnRlZ2VyLCBzcmNfZmxvYXQpIC0tIEFzc2lnbiBERVNUX0lOVEVHRVIgZnJvbSBTUkNfRkxPQVQuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAxLCAyMDEyLCAyMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkCittcHpfc2V0X2YgKG1wel9wdHIgdywgbXBmX3NyY3B0ciB1KQoreworICBtcF9wdHIgICAgd3AsIHVwOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgbXBfZXhwX3QgIGV4cDsKKworICAvKiBhYnModSk8MSB0cnVuY2F0ZXMgdG8gemVybyAqLworICBleHAgPSBFWFAgKHUpOworICBpZiAoZXhwIDw9IDApCisgICAgeworICAgICAgU0laKHcpID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgd3AgPSBNUFpfTkVXQUxMT0MgKHcsIGV4cCk7CisgIHVwID0gUFRSKHUpOworCisgIHNpemUgPSBTSVogKHUpOworICBTSVoodykgPSAoc2l6ZSA+PSAwID8gZXhwIDogLWV4cCk7CisgIHNpemUgPSBBQlMgKHNpemUpOworCisgIGlmIChleHAgPiBzaXplKQorICAgIHsKKyAgICAgIC8qIHBhZCB3aXRoIGxvdyB6ZXJvcyB0byBnZXQgYSB0b3RhbCAiZXhwIiBtYW55IGxpbWJzICovCisgICAgICBtcF9zaXplX3QgIHplcm9zID0gZXhwIC0gc2l6ZTsKKyAgICAgIE1QTl9aRVJPICh3cCwgemVyb3MpOworICAgICAgd3AgKz0gemVyb3M7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogZXhwPD1zaXplLCB0cnVuY2F0ZSB0byB0aGUgaGlnaCAiZXhwIiBtYW55IGxpbWJzICovCisgICAgICB1cCArPSAoc2l6ZSAtIGV4cCk7CisgICAgICBzaXplID0gZXhwOworICAgIH0KKworICBNUE5fQ09QWSAod3AsIHVwLCBzaXplKTsKK30KZGlmZiAtLWdpdCBhL21wei9zZXRfcS5jIGIvbXB6L3NldF9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MDI0NwotLS0gL2Rldi9udWxsCisrKyBiL21wei9zZXRfcS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIG1wel9zZXRfcSAoZGVzdF9pbnRlZ2VyLCBzcmNfcmF0aW9uYWwpIC0tIEFzc2lnbiBERVNUX0lOVEVHRVIgZnJvbQorICAgU1JDX3JhdGlvbmFsLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfX0dNUF9GT1JDRV9tcHpfc2V0X3EgMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKZGlmZiAtLWdpdCBhL21wei9zZXRfc2kuYyBiL21wei9zZXRfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNhZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NldF9zaS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIG1wel9zZXRfc2koZGVzdCx2YWwpIC0tIEFzc2lnbiBERVNUIHdpdGggYSBzbWFsbCB2YWx1ZSBWQUwuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDAtMjAwMiwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfc2V0X3NpIChtcHpfcHRyIGRlc3QsIHNpZ25lZCBsb25nIGludCB2YWwpCit7CisgIG1wX3NpemVfdCBzaXplOworICBtcF9saW1iX3Qgdmw7CisKKyAgdmwgPSAobXBfbGltYl90KSBBQlNfQ0FTVCAodW5zaWduZWQgbG9uZyBpbnQsIHZhbCk7CisKKyAgTVBaX05FV0FMTE9DIChkZXN0LCAxKVswXSA9IHZsICYgR01QX05VTUJfTUFTSzsKKyAgc2l6ZSA9IHZsICE9IDA7CisKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgaWYgKHZsID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIE1QWl9SRUFMTE9DIChkZXN0LCAyKTsKKyAgICAgIFBUUiAoZGVzdClbMV0gPSB2bCA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgc2l6ZSA9IDI7CisgICAgfQorI2VuZGlmCisKKyAgU0laIChkZXN0KSA9IHZhbCA+PSAwID8gc2l6ZSA6IC1zaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L3NldF9zdHIuYyBiL21wei9zZXRfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMTAyYgotLS0gL2Rldi9udWxsCisrKyBiL21wei9zZXRfc3RyLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIG1wel9zZXRfc3RyKG1wX2Rlc3QsIHN0cmluZywgYmFzZSkgLS0gQ29udmVydCB0aGUgXDAtdGVybWluYXRlZAorICAgc3RyaW5nIFNUUklORyBpbiBiYXNlIEJBU0UgdG8gbXVsdGlwbGUgcHJlY2lzaW9uIGludGVnZXIgaW4KKyAgIE1QX0RFU1QuICBBbGxvdyB3aGl0ZSBzcGFjZSBpbiB0aGUgc3RyaW5nLiAgSWYgQkFTRSA9PSAwIGRldGVybWluZQorICAgdGhlIGJhc2UgaW4gdGhlIEMgc3RhbmRhcmQgd2F5LCBpLmUuICAweGhoLi4uaCBtZWFucyBiYXNlIDE2LAorICAgMG9vLi4ubyBtZWFucyBiYXNlIDgsIG90aGVyd2lzZSBhc3N1bWUgYmFzZSAxMC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYtMTk5OCwgMjAwMC0yMDAzLCAyMDA1LCAyMDExLTIwMTMgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNkZWZpbmUgZGlnaXRfdmFsdWVfdGFiIF9fZ21wX2RpZ2l0X3ZhbHVlX3RhYgorCitpbnQKK21wel9zZXRfc3RyIChtcHpfcHRyIHgsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGJhc2UpCit7CisgIHNpemVfdCBzdHJfc2l6ZTsKKyAgY2hhciAqcywgKmJlZ3M7CisgIHNpemVfdCBpOworICBtcF9zaXplX3QgeHNpemU7CisgIGludCBjOworICBpbnQgbmVnYXRpdmU7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRpZ2l0X3ZhbHVlOworICBUTVBfREVDTDsKKworICBkaWdpdF92YWx1ZSA9IGRpZ2l0X3ZhbHVlX3RhYjsKKyAgaWYgKGJhc2UgPiAzNikKKyAgICB7CisgICAgICAvKiBGb3IgYmFzZXMgPiAzNiwgdXNlIHRoZSBjb2xsYXRpbmcgc2VxdWVuY2UKKwkgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouICAqLworICAgICAgZGlnaXRfdmFsdWUgKz0gMjA4OworICAgICAgaWYgKFVOTElLRUxZIChiYXNlID4gNjIpKQorCXJldHVybiAtMTsJCS8qIHRvbyBsYXJnZSBiYXNlICovCisgICAgfQorCisgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCisgIGRvCisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7CisgIHdoaWxlIChpc3NwYWNlIChjKSk7CisKKyAgbmVnYXRpdmUgPSAwOworICBpZiAoYyA9PSAnLScpCisgICAgeworICAgICAgbmVnYXRpdmUgPSAxOworICAgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7CisgICAgfQorCisgIGlmIChkaWdpdF92YWx1ZVtjXSA+PSAoYmFzZSA9PSAwID8gMTAgOiBiYXNlKSkKKyAgICByZXR1cm4gLTE7CQkJLyogZXJyb3IgaWYgbm8gdmFsaWQgZGlnaXRzICovCisKKyAgLyogSWYgQkFTRSBpcyAwLCB0cnkgdG8gZmluZCBvdXQgdGhlIGJhc2UgYnkgbG9va2luZyBhdCB0aGUgaW5pdGlhbAorICAgICBjaGFyYWN0ZXJzLiAgKi8KKyAgaWYgKGJhc2UgPT0gMCkKKyAgICB7CisgICAgICBiYXNlID0gMTA7CisgICAgICBpZiAoYyA9PSAnMCcpCisJeworCSAgYmFzZSA9IDg7CisJICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKwkgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykKKwkgICAgeworCSAgICAgIGJhc2UgPSAxNjsKKwkgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKwkgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnYicgfHwgYyA9PSAnQicpCisJICAgIHsKKwkgICAgICBiYXNlID0gMjsKKwkgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogU2tpcCBsZWFkaW5nIHplcm9zIGFuZCB3aGl0ZSBzcGFjZS4gICovCisgIHdoaWxlIChjID09ICcwJyB8fCBpc3NwYWNlIChjKSkKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKyAgLyogTWFrZSBzdXJlIHRoZSBzdHJpbmcgZG9lcyBub3QgYmVjb21lIGVtcHR5LCBtcG5fc2V0X3N0ciB3b3VsZCBmYWlsLiAgKi8KKyAgaWYgKGMgPT0gMCkKKyAgICB7CisgICAgICBTSVogKHgpID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBUTVBfTUFSSzsKKyAgc3RyX3NpemUgPSBzdHJsZW4gKHN0ciAtIDEpOworICBzID0gYmVncyA9IChjaGFyICopIFRNUF9BTExPQyAoc3RyX3NpemUgKyAxKTsKKworICAvKiBSZW1vdmUgc3BhY2VzIGZyb20gdGhlIHN0cmluZyBhbmQgY29udmVydCB0aGUgcmVzdWx0IGZyb20gQVNDSUkgdG8gYQorICAgICBieXRlIGFycmF5LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cl9zaXplOyBpKyspCisgICAgeworICAgICAgaWYgKCFpc3NwYWNlIChjKSkKKwl7CisJICBpbnQgZGlnID0gZGlnaXRfdmFsdWVbY107CisJICBpZiAoVU5MSUtFTFkgKGRpZyA+PSBiYXNlKSkKKwkgICAgeworCSAgICAgIFRNUF9GUkVFOworCSAgICAgIHJldHVybiAtMTsKKwkgICAgfQorCSAgKnMrKyA9IGRpZzsKKwl9CisgICAgICBjID0gKHVuc2lnbmVkIGNoYXIpICpzdHIrKzsKKyAgICB9CisKKyAgc3RyX3NpemUgPSBzIC0gYmVnczsKKworICBMSU1CU19QRVJfRElHSVRfSU5fQkFTRSAoeHNpemUsIHN0cl9zaXplLCBiYXNlKTsKKyAgTVBaX05FV0FMTE9DICh4LCB4c2l6ZSk7CisKKyAgLyogQ29udmVydCB0aGUgYnl0ZSBhcnJheSBpbiBiYXNlIEJBU0UgdG8gb3VyIGJpZ251bSBmb3JtYXQuICAqLworICB4c2l6ZSA9IG1wbl9zZXRfc3RyIChQVFIgKHgpLCAodW5zaWduZWQgY2hhciAqKSBiZWdzLCBzdHJfc2l6ZSwgYmFzZSk7CisgIFNJWiAoeCkgPSBuZWdhdGl2ZSA/IC14c2l6ZSA6IHhzaXplOworCisgIFRNUF9GUkVFOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21wei9zZXRfdWkuYyBiL21wei9zZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmU5NWQxCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NldF91aS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIG1wel9zZXRfdWkoaW50ZWdlciwgdmFsKSAtLSBBc3NpZ24gSU5URUdFUiB3aXRoIGEgc21hbGwgdmFsdWUgVkFMLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9zZXRfdWkgKG1wel9wdHIgZGVzdCwgdW5zaWduZWQgbG9uZyBpbnQgdmFsKQoreworICBtcF9zaXplX3Qgc2l6ZTsKKworICBNUFpfTkVXQUxMT0MgKGRlc3QsIDEpWzBdID0gdmFsICYgR01QX05VTUJfTUFTSzsKKyAgc2l6ZSA9IHZhbCAhPSAwOworCisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTICAvKiBhdm9pZCB3YXJuaW5ncyBhYm91dCBzaGlmdCBhbW91bnQgKi8KKyAgaWYgKHZhbCA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBNUFpfUkVBTExPQyAoZGVzdCwgMik7CisgICAgICBQVFIgKGRlc3QpWzFdID0gdmFsID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICBzaXplID0gMjsKKyAgICB9CisjZW5kaWYKKworICBTSVogKGRlc3QpID0gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei9zZXRiaXQuYyBiL21wei9zZXRiaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhhNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NldGJpdC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKiBtcHpfc2V0Yml0IC0tIHNldCBhIHNwZWNpZmllZCBiaXQuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDE5OTcsIDE5OTksIDIwMDEsIDIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3NldGJpdCAobXB6X3B0ciBkLCBtcF9iaXRjbnRfdCBiaXRfaWR4KQoreworICBtcF9zaXplX3QgZHNpemUgPSBTSVogKGQpOworICBtcF9wdHIgZHAgPSBQVFIgKGQpOworICBtcF9zaXplX3QgbGltYl9pZHg7CisgIG1wX2xpbWJfdCBtYXNrOworCisgIGxpbWJfaWR4ID0gYml0X2lkeCAvIEdNUF9OVU1CX0JJVFM7CisgIG1hc2sgPSBDTlNUX0xJTUIoMSkgPDwgKGJpdF9pZHggJSBHTVBfTlVNQl9CSVRTKTsKKyAgaWYgKGRzaXplID49IDApCisgICAgeworICAgICAgaWYgKGxpbWJfaWR4IDwgZHNpemUpCisJeworCSAgZHBbbGltYl9pZHhdIHw9IG1hc2s7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFVnaC4gIFRoZSBiaXQgc2hvdWxkIGJlIHNldCBvdXRzaWRlIG9mIHRoZSBlbmQgb2YgdGhlCisJICAgICBudW1iZXIuICBXZSBoYXZlIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBudW1iZXIuICAqLworCSAgZHAgPSBNUFpfUkVBTExPQyAoZCwgbGltYl9pZHggKyAxKTsKKwkgIFNJWiAoZCkgPSBsaW1iX2lkeCArIDE7CisJICBNUE5fWkVSTyAoZHAgKyBkc2l6ZSwgbGltYl9pZHggLSBkc2l6ZSk7CisJICBkcFtsaW1iX2lkeF0gPSBtYXNrOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaW11bGF0ZSB0d28ncyBjb21wbGVtZW50IGFyaXRobWV0aWMsIGkuZS4gc2ltdWxhdGUKKwkgMS4gU2V0IE9QID0gfihPUCAtIDEpIFt3aXRoIGluZmluaXRlbHkgbWFueSBsZWFkaW5nIG9uZXNdLgorCSAyLiBTZXQgdGhlIGJpdC4KKwkgMy4gU2V0IE9QID0gfk9QICsgMS4gICovCisKKyAgICAgIGRzaXplID0gLWRzaXplOworCisgICAgICBpZiAobGltYl9pZHggPCBkc2l6ZSkKKwl7CisJICBtcF9zaXplX3QgemVyb19ib3VuZDsKKwkgIC8qIE5vIGluZGV4IHVwcGVyIGJvdW5kIG9uIHRoaXMgbG9vcCwgd2UncmUgc3VyZSB0aGVyZSdzIGEgbm9uLXplcm8gbGltYgorCSAgICAgc29vbmVyIG9yIGxhdGVyLiAgKi8KKwkgIHplcm9fYm91bmQgPSAwOworCSAgd2hpbGUgKGRwW3plcm9fYm91bmRdID09IDApCisJICAgIHplcm9fYm91bmQrKzsKKworCSAgaWYgKGxpbWJfaWR4ID4gemVyb19ib3VuZCkKKwkgICAgeworCSAgICAgIG1wX2xpbWJfdAkgZGxpbWI7CisJICAgICAgZGxpbWIgPSBkcFtsaW1iX2lkeF0gJiB+bWFzazsKKwkgICAgICBkcFtsaW1iX2lkeF0gPSBkbGltYjsKKworCSAgICAgIGlmIChVTkxJS0VMWSAoKGRsaW1iID09IDApICsgbGltYl9pZHggPT0gZHNpemUpKSAvKiBkc2l6ZSA9PSBsaW1iX2lkeCArIDEgKi8KKwkJeworCQkgIC8qIGhpZ2ggbGltYiBiZWNhbWUgemVybywgbXVzdCBub3JtYWxpemUgKi8KKwkJICBNUE5fTk9STUFMSVpFIChkcCwgbGltYl9pZHgpOworCQkgIFNJWiAoZCkgPSAtbGltYl9pZHg7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAobGltYl9pZHggPT0gemVyb19ib3VuZCkKKwkgICAgeworCSAgICAgIGRwW2xpbWJfaWR4XSA9ICgoZHBbbGltYl9pZHhdIC0gMSkgJiB+bWFzaykgKyAxOworCSAgICAgIEFTU0VSVCAoZHBbbGltYl9pZHhdICE9IDApOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBNUE5fREVDUl9VIChkcCArIGxpbWJfaWR4LCBkc2l6ZSAtIGxpbWJfaWR4LCBtYXNrKTsKKwkgICAgICBkc2l6ZSAtPSBkcFtkc2l6ZSAtIDFdID09IDA7CisJICAgICAgU0laIChkKSA9IC1kc2l6ZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovc2l6ZS5jIGIvbXB6L3NpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFhNTllCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NpemUuYwpAQCAtMCwwICsxLDM0IEBACisvKiBtcHpfc2l6ZSh4KSAtLSByZXR1cm4gdGhlIG51bWJlciBvZiBsaW1zIGN1cnJlbnRseSB1c2VkIGJ5IHRoZQorICAgdmFsdWUgb2YgaW50ZWdlciBYLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5My0xOTk1LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9fR01QX0ZPUkNFX21wel9zaXplIDEKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCmRpZmYgLS1naXQgYS9tcHovc2l6ZWluYmFzZS5jIGIvbXB6L3NpemVpbmJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFiZDAxCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NpemVpbmJhc2UuYwpAQCAtMCwwICsxLDQyIEBACisvKiBtcHpfc2l6ZWluYmFzZSh4LCBiYXNlKSAtLSByZXR1cm4gYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgbnVtYmVyIG9mCisgICBjaGFyYWN0ZXIgdGhlIGludGVnZXIgWCB3b3VsZCBoYXZlIHByaW50ZWQgaW4gYmFzZSBCQVNFLiAgVGhlCisgICBhcHByb3hpbWF0aW9uIGlzIG5ldmVyIHRvbyBzbWFsbC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMtMTk5NSwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworc2l6ZV90CittcHpfc2l6ZWluYmFzZSAobXB6X3NyY3B0ciB4LCBpbnQgYmFzZSkgX19HTVBfTk9USFJPVworeworICBzaXplX3QgIHJlc3VsdDsKKyAgTVBOX1NJWkVJTkJBU0UgKHJlc3VsdCwgUFRSKHgpLCBBQlNJWih4KSwgYmFzZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9tcHovc3FydC5jIGIvbXB6L3NxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQyZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3NxcnQuYwpAQCAtMCwwICsxLDc2IEBACisvKiBtcHpfc3FydChyb290LCB1KSAtLSAgU2V0IFJPT1QgdG8gZmxvb3Ioc3FydChVKSkuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDEyLCAyMDE1IEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+IC8qIGZvciBOVUxMICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3NxcnQgKG1wel9wdHIgcm9vdCwgbXB6X3NyY3B0ciBvcCkKK3sKKyAgbXBfc2l6ZV90IG9wX3NpemUsIHJvb3Rfc2l6ZTsKKyAgbXBfcHRyIHJvb3RfcHRyLCBvcF9wdHI7CisKKyAgb3Bfc2l6ZSA9IFNJWiAob3ApOworICBpZiAoVU5MSUtFTFkgKG9wX3NpemUgPD0gMCkpCisgICAgeworICAgICAgaWYgKFVOTElLRUxZIChvcF9zaXplIDwgMCkpCisJU1FSVF9PRl9ORUdBVElWRTsKKyAgICAgIFNJWihyb290KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFRoZSBzaXplIG9mIHRoZSByb290IGlzIGFjY3VyYXRlIGFmdGVyIHRoaXMgc2ltcGxlIGNhbGN1bGF0aW9uLiAgKi8KKyAgcm9vdF9zaXplID0gKG9wX3NpemUgKyAxKSAvIDI7CisgIFNJWiAocm9vdCkgPSByb290X3NpemU7CisKKyAgb3BfcHRyID0gUFRSIChvcCk7CisKKyAgaWYgKHJvb3QgPT0gb3ApCisgICAgeworICAgICAgLyogQWxsb2NhdGUgdGVtcCBzcGFjZSBmb3IgdGhlIHJvb3QsIHdoaWNoIHdlIHRoZW4gY29weSB0byB0aGUKKwkgc2hhcmVkIE9QL1JPT1QgdmFyaWFibGUuICAqLworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKworICAgICAgcm9vdF9wdHIgPSBUTVBfQUxMT0NfTElNQlMgKHJvb3Rfc2l6ZSk7CisgICAgICBtcG5fc3FydHJlbSAocm9vdF9wdHIsIE5VTEwsIG9wX3B0ciwgb3Bfc2l6ZSk7CisKKyAgICAgIE1QTl9DT1BZIChvcF9wdHIsIHJvb3RfcHRyLCByb290X3NpemUpOworCisgICAgICBUTVBfRlJFRTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByb290X3B0ciA9IE1QWl9ORVdBTExPQyAocm9vdCwgcm9vdF9zaXplKTsKKworICAgICAgbXBuX3NxcnRyZW0gKHJvb3RfcHRyLCBOVUxMLCBvcF9wdHIsIG9wX3NpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21wei9zcXJ0cmVtLmMgYi9tcHovc3FydHJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODBkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovc3FydHJlbS5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIG1wel9zcXJ0cmVtKHJvb3QscmVtLHgpIC0tIFNldCBST09UIHRvIGZsb29yKHNxcnQoWCkpIGFuZCBSRU0KKyAgIHRvIHRoZSByZW1haW5kZXIsIGkuZS4gWCAtIFJPT1QqKjIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDExLCAyMDEyLCAyMDE1IEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel9zcXJ0cmVtIChtcHpfcHRyIHJvb3QsIG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIG9wKQoreworICBtcF9zaXplX3Qgb3Bfc2l6ZSwgcm9vdF9zaXplLCByZW1fc2l6ZTsKKyAgbXBfcHRyIHJvb3RfcHRyLCBvcF9wdHIsIHJlbV9wdHI7CisKKyAgb3Bfc2l6ZSA9IFNJWiAob3ApOworICBpZiAoVU5MSUtFTFkgKG9wX3NpemUgPD0gMCkpCisgICAgeworICAgICAgaWYgKFVOTElLRUxZIChvcF9zaXplIDwgMCkpCisJU1FSVF9PRl9ORUdBVElWRTsKKyAgICAgIFNJWihyb290KSA9IDA7CisgICAgICBTSVoocmVtKSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE5vLW9wIGlmIHJlbSA9PSBvcCAqLworICByZW1fcHRyID0gTVBaX05FV0FMTE9DIChyZW0sIG9wX3NpemUpOworCisgIC8qIFRoZSBzaXplIG9mIHRoZSByb290IGlzIGFjY3VyYXRlIGFmdGVyIHRoaXMgc2ltcGxlIGNhbGN1bGF0aW9uLiAgKi8KKyAgcm9vdF9zaXplID0gKG9wX3NpemUgKyAxKSAvIDI7CisgIFNJWiAocm9vdCkgPSByb290X3NpemU7CisKKyAgb3BfcHRyID0gUFRSIChvcCk7CisKKyAgaWYgKHJvb3QgPT0gb3ApCisgICAgeworICAgICAgLyogQWxsb2NhdGUgdGVtcCBzcGFjZSBmb3IgdGhlIHJvb3QsIHdoaWNoIHdlIHRoZW4gY29weSB0byB0aGUKKwkgc2hhcmVkIE9QL1JPT1QgdmFyaWFibGUuICAqLworICAgICAgVE1QX0RFQ0w7CisgICAgICBUTVBfTUFSSzsKKworICAgICAgcm9vdF9wdHIgPSBUTVBfQUxMT0NfTElNQlMgKHJvb3Rfc2l6ZSk7CisgICAgICByZW1fc2l6ZSA9IG1wbl9zcXJ0cmVtIChyb290X3B0ciwgcmVtX3B0ciwgb3BfcHRyLCBvcF9zaXplKTsKKworICAgICAgaWYgKHJlbSAhPSByb290KQkvKiBEb24ndCBvdmVyd3JpdGUgcmVtYWluZGVyICovCisJTVBOX0NPUFkgKG9wX3B0ciwgcm9vdF9wdHIsIHJvb3Rfc2l6ZSk7CisKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJvb3RfcHRyID0gTVBaX05FV0FMTE9DIChyb290LCByb290X3NpemUpOworCisgICAgICByZW1fc2l6ZSA9IG1wbl9zcXJ0cmVtIChyb290X3B0ciwgcmVtX3B0ciwgb3BfcHRyLCBvcF9zaXplKTsKKyAgICB9CisKKyAgLyogV3JpdGUgcmVtYWluZGVyIHNpemUgbGFzdCwgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIGdpdmUgb25seSB0aGUgc3F1YXJlIHJvb3QKKyAgICAgcmVtYWluZGVyLCB3aGVuIHBhc3NlZCBST09UID09IFJFTS4gICovCisgIFNJWiAocmVtKSA9IHJlbV9zaXplOworfQpkaWZmIC0tZ2l0IGEvbXB6L3N0cm9uZ2x1Y2FzLmMgYi9tcHovc3Ryb25nbHVjYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmYxY2UwCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3N0cm9uZ2x1Y2FzLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qIG1wel9zdHJvbmdsdWNhcyhuLCB0MSwgdDIpIC0tIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJvbmcgTHVjYXMKKyAgIHByaW1hbGl0eSB0ZXN0IG9uIG4sIHVzaW5nIHBhcmFtZXRlcnMgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBCUFNXIHRlc3QuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAxOCwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworQ29udHJpYnV0ZWQgYnkgTWFyY28gQm9kcmF0by4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyogUmV0dXJucyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBzcWFyZSByb290IG9mIHguCisgKiBJdCBnaXZlczoKKyAqICAgbGltYl9hcHByc3FydCAoeCkgXiAyIDw9IHggPCAobGltYl9hcHByc3FydCAoeCkrMSkgXiAyCisgKiBvcgorICogICB4IDw9IGxpbWJfYXBwcnNxcnQgKHgpIF4gMiA8PSB4ICogOS84CisgKi8KK3N0YXRpYyBtcF9saW1iX3QKK2xpbWJfYXBwcnNxcnQgKG1wX2xpbWJfdCB4KQoreworICBpbnQgczsKKworICBBU1NFUlQgKHggPiAyKTsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAocywgeCk7CisgIHMgPSAoR01QX0xJTUJfQklUUyAtIHMpID4+IDE7CisgIHJldHVybiAoKENOU1RfTElNQigxKSA8PCAocyAtIDEpKSArICh4ID4+IDEgPj4gcykpOworfQorCitzdGF0aWMgaW50CittcHpfb2RkamFjb2JpX3VpIChtcHpfdCBiLCBtcF9saW1iX3QgYSkKK3sKKyAgbXBfbGltYl90ICBiX3JlbTsKKyAgaW50ICAgICAgICByZXN1bHRfYml0MTsKKworICBBU1NFUlQgKGEgJiAxKTsKKyAgQVNTRVJUIChhID4gMSk7CisgIEFTU0VSVCAoU0laIChiKSA+IDApOworICBBU1NFUlQgKCgqUFRSIChiKSAmIDEpID09IDEpOworCisgIHJlc3VsdF9iaXQxID0gMDsKKyAgSkFDT0JJX01PRF9PUl9NT0RFWEFDVF8xX09ERCAocmVzdWx0X2JpdDEsIGJfcmVtLCBQVFIgKGIpLCBTSVogKGIpLCBhKTsKKyAgaWYgKFVOTElLRUxZIChiX3JlbSA9PSAwKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiBtcG5famFjb2JpX2Jhc2UgKGJfcmVtLCBhLCByZXN1bHRfYml0MSk7Cit9CisKKworLyogUGVyZm9ybXMgc3Ryb25nIEx1Y2FzJyB0ZXN0IG9uIHgsIHdpdGggcGFyYW1ldGVycyBzdWdnZXN0ZWQgKi8KKy8qIGZvciB0aGUgQlBTVyB0ZXN0LiBRayBhbmQgViBhcmUgcGFzc2VkIHRvIHJlY3ljbGUgdmFyaWFibGVzLiAqLworLyogUmVxdWlyZXMgR0NEICh4LDYpID0gMS4qLworaW50CittcHpfc3Ryb25nbHVjYXMgKG1wel9zcmNwdHIgeCwgbXB6X3B0ciBWLCBtcHpfcHRyIFFrKQoreworICBtcF9iaXRjbnRfdCBiMDsKKyAgbXB6X3QgbjsKKyAgbXBfbGltYl90IEQ7IC8qIFRoZSBhYnNvbHV0ZSB2YWx1ZSBpcyBzdG9yZWQuICovCisgIG1wX2xpbWJfdCBnOworICBsb25nIFE7CisgIG1wel90IFQxLCBUMjsKKworICAvKiBUZXN0IG9uIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgbXB6X3JvaW5pdF9uIChuLCBQVFIgKHgpLCBBQlNJWiAoeCkpOworCisgIEFTU0VSVCAobXB6X29kZF9wIChuKSk7CisgIC8qIEFTU0VSVCAobXB6X2djZF91aSAoTlVMTCwgbiwgNikgPT0gMSk7CSovCisjaWYgR01QX05VTUJfQklUUyAlIDE2ID09IDAKKyAgLyogKDJeMTIgLSAxKSB8ICgyXntHTVBfTlVNQl9CSVRTKjMvNH0gLSAxKQkqLworICBnID0gbXBuX21vZF8zNGxzdWIxIChQVFIgKG4pLCBTSVogKG4pKTsKKyAgLyogKDJeMTIgLSAxKSA9IDNeMiAqIDUgKiA3ICogMTMJCSovCisgIEFTU0VSVCAoZyAlIDMgIT0gMCAmJiBnICUgNSAhPSAwICYmIGcgJSA3ICE9IDApOworICBpZiAoKGcgJSA1ICYgMikgIT0gMCkKKyAgICAvKiAoNS9uKSA9IC0xLCBpZmYgbiA9IDIgb3IgMyAobW9kIDUpCSovCisgICAgLyogRCA9IDU7IFEgPSAtMSAqLworICAgIHJldHVybiBtcG5fc3Ryb25nZmlibyAoUFRSIChuKSwgU0laIChuKSwgUFRSIChWKSk7CisgIGVsc2UgaWYgKCEgUE9XMl9QIChnICUgNykpCisgICAgLyogKC03L24pID0gLTEsIGlmZiBuID0gMyw1IG9yIDYgKG1vZCA3KQkqLworICAgIEQgPSA3OyAvKiBRID0gMiAqLworICAgIC8qICg5L24pID0gLTEsIG5ldmVyOiA5ID0gM14yCSovCisgIGVsc2UgaWYgKG1wel9vZGRqYWNvYmlfdWkgKG4sIDExKSA9PSAtMSkKKyAgICAvKiAoLTExL24pID0gKG4vMTEpCSovCisgICAgRCA9IDExOyAvKiBRID0gMyAqLworICBlbHNlIGlmICgoKChnICUgMTMgLSAoZyAlIDEzID4+IDMpKSAmIDcpID4gNCkgfHwKKwkgICAoKChnICUgMTMgLSAoZyAlIDEzID4+IDMpKSAmIDcpID09IDIpKQorICAgIC8qICgxMy9uKSA9IC0xLCBpZmYgbiA9IDIsNSw2LDcsOCBvciAxMSAobW9kIDEzKQkqLworICAgIEQgPSAxMzsgLyogUSA9IC0zICovCisgIGVsc2UgaWYgKGcgJSAzID09IDIpCisgICAgLyogKC0xNS9uKSA9IChuLzE1KSA9IChuLzUpKihuLzMpCSovCisgICAgLyogSGVyZSwgKG4vNSkgPSAxLCBhbmQJCSovCisgICAgLyogKG4vMykgPSAtMSwgaWZmIG4gPSAyIChtb2QgMykJKi8KKyAgICBEID0gMTU7IC8qIFEgPSA0ICovCisjaWYgR01QX05VTUJfQklUUyAlIDMyID09IDAKKyAgLyogKDJeMjQgLSAxKSB8ICgyXntHTVBfTlVNQl9CSVRTKjMvNH0gLSAxKQkqLworICAvKiAoMl4yNCAtIDEpID0gKDJeMTIgLSAxKSAqIDE3ICogMjQxCQkqLworICBlbHNlIGlmICghIFBPVzJfUCAoZyAlIDE3KSAmJiAhIFBPVzJfUCAoMTcgLSBnICUgMTcpKQorICAgIC8qICgxNy9uKSA9IC0xLCBpZmYgbiAhPSArLTEsKy0yLCstNCwrLTggKG1vZCAxNykJKi8KKyAgICBEID0gMTc7IC8qIFEgPSAtNCAqLworI2VuZGlmCisjZWxzZQorICBpZiAobXB6X29kZGphY29iaV91aSAobiwgNSkgPT0gLTEpCisgICAgcmV0dXJuIG1wbl9zdHJvbmdmaWJvIChQVFIgKG4pLCBTSVogKG4pLCBQVFIgKFYpKTsKKyNlbmRpZgorICBlbHNlCisgIHsKKyAgICBtcF9saW1iX3QgbWF4RDsKKyAgICBpbnQgamFjOworCisgICAgLyogbiBpcyBvZGQsIHRvIHBvc3NpYmx5IGJlIGEgc3F1YXJlLCBuICUgOCA9IDEgaXMgbmVlZGVkLiAqLworICAgIGlmICgoKCpQVFIgKG4pICYgNikgPT0gMCkgJiYgVU5MSUtFTFkgKG1wel9wZXJmZWN0X3NxdWFyZV9wIChuKSkpCisgICAgICByZXR1cm4gMDsgLyogQSBzcXVhcmUgaXMgY29tcG9zaXRlLiAqLworCisgICAgLyogQ2hlY2sgRHMgdXAgdG8gc3F1YXJlIHJvb3QgKGluIGNhc2UsIG4gaXMgcHJpbWUpCisgICAgICAgb3IgYXZvaWQgb3ZlcmZsb3dzICovCisgICAgaWYgKFNJWiAobikgPT0gMSkKKyAgICAgIG1heEQgPSBsaW1iX2FwcHJzcXJ0ICgqIFBUUiAobikpOworICAgIGVsc2UgaWYgKEJJVFNfUEVSX1VMT05HID49IEdNUF9OVU1CX0JJVFMgJiYgU0laIChuKSA9PSAyKQorICAgICAgbXBuX3NxcnRyZW0gKCZtYXhELCAobXBfcHRyKSBOVUxMLCBQVFIgKG4pLCAyKTsKKyAgICBlbHNlCisgICAgICBtYXhEID0gR01QX05VTUJfTUFYOworICAgIG1heEQgPSBNSU4gKG1heEQsIFVMT05HX01BWCk7CisKKyAgICB1bnNpZ25lZCBEZGlmZiA9IDI7CisjaWYgR01QX05VTUJfQklUUyAlIDE2ID09IDAKKyAgICBjb25zdCB1bnNpZ25lZCBEMiA9IDY7CisjaWYgR01QX05VTUJfQklUUyAlIDMyID09IDAKKyAgICBEID0gMTk7CisgICAgRGRpZmYgPSA0OworI2Vsc2UKKyAgICBEID0gMTc7CisjZW5kaWYKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgRDIgPSA0OworICAgIEQgPSA3OworI2VuZGlmCisKKyAgICAvKiBTZWFyY2ggYSBEIHN1Y2ggdGhhdCAoRC9uKSA9IC0xIGluIHRoZSBzZXF1ZW5jZSA1LC03LDksLTExLC4uCSovCisgICAgLyogRm9yIHRob3NlIERzIHdlIGhhdmUgKEQvbikgPSAobi98RHwpCSovCisgICAgLyogRklYTUU6IFNob3VsZCB3ZSBsb29wIG9ubHkgb24gcHJpbWUgRHM/CSovCisgICAgLyogVGhlIG9ubHkgaW50ZXJlc3RpbmcgY29tcG9zaXRlIEQgaXMgMTUsIGJlY2F1c2UgMyBpcyBub3QgdGVzdGVkLgkqLworICAgIGZvciAoOzspCisgICAgICB7CisJamFjID0gbXB6X29kZGphY29iaV91aSAobiwgRCk7CisJaWYgKGphYyAhPSAxKQorCSAgYnJlYWs7CisJaWYgKFVOTElLRUxZIChEID49IG1heEQpKQorCSAgcmV0dXJuIDE7CisJRCArPSBEZGlmZjsKKwlEZGlmZiA9IEQyIC0gRGRpZmY7CisgICAgICB9CisKKyAgICBpZiAoVU5MSUtFTFkgKGphYyA9PSAwKSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgLyogRD0gUF4yIC0gNFE7IFAgPSAxOyBRID0gKDEtRCkvNCAqLworICBRID0gKEQgJiAyKSA/IChEID4+IDIpICsgMSA6IC0obG9uZykgKEQgPj4gMik7CisgIC8qIEFTU0VSVCAobXB6X3NpX2tyb25lY2tlciAoKEQgJiAyKSA/IE5FR19DQVNUIChsb25nLCBEKSA6IEQsIG4pID09IC0xKTsgKi8KKworICAvKiBuLShEL24pID0gbisxID0gZCoyXntiMH0sIHdpdGggZCA9IChuPj5iMCkgfCAxICovCisgIGIwID0gbXB6X3NjYW4wIChuLCAwKTsKKworICBtcHpfaW5pdCAoVDEpOworICBtcHpfaW5pdCAoVDIpOworCisgIC8qIElmIFVkICE9IDAgJiYgVmQgIT0gMCAqLworICBpZiAobXB6X2x1Y2FzX21vZCAoViwgUWssIFEsIGIwLCBuLCBUMSwgVDIpID09IDApCisgICAgaWYgKExJS0VMWSAoLS1iMCAhPSAwKSkKKyAgICAgIGZvciAoOzspCisJeworCSAgLyogVl97Mmt9IDwtIFZfayBeIDIgLSAyUV5rICovCisJICBtcHpfbXVsIChUMiwgViwgVik7CisJICBtcHpfc3VibXVsX3VpIChUMiwgUWssIDIpOworCSAgbXB6X3RkaXZfciAoViwgVDIsIG4pOworCSAgaWYgKFNJWiAoVikgPT0gMCB8fCBVTkxJS0VMWSAoLS1iMCA9PSAwKSkKKwkgICAgYnJlYWs7CisJICAvKiBRXnsya30gPSAoUV5rKV4yICovCisJICBtcHpfbXVsIChUMiwgUWssIFFrKTsKKwkgIG1wel90ZGl2X3IgKFFrLCBUMiwgbik7CisJfQorCisgIG1wel9jbGVhciAoVDEpOworICBtcHpfY2xlYXIgKFQyKTsKKworICByZXR1cm4gKGIwICE9IDApOworfQpkaWZmIC0tZ2l0IGEvbXB6L3N1Yi5jIGIvbXB6L3N1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYjAyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovc3ViLmMKQEAgLTAsMCArMSwzMyBAQAorLyogbXB6X3N1YiAtLSBzdWJ0cmFjdCBpbnRlZ2Vycy4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2RlZmluZSBPUEVSQVRJT05fc3ViCisjaW5jbHVkZSAiYW9ycy5oIgpkaWZmIC0tZ2l0IGEvbXB6L3N1Yl91aS5jIGIvbXB6L3N1Yl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTIzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovc3ViX3VpLmMKQEAgLTAsMCArMSwzMyBAQAorLyogbXB6X3N1Yl91aSAtLSBTdWJ0cmFjdCBhbiBtcHpfdCBhbmQgYW4gdW5zaWduZWQgb25lLXdvcmQgaW50ZWdlci4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2RlZmluZSBPUEVSQVRJT05fc3ViX3VpCisjaW5jbHVkZSAiYW9yc191aS5oIgpkaWZmIC0tZ2l0IGEvbXB6L3N3YXAuYyBiL21wei9zd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1ZmFjMAotLS0gL2Rldi9udWxsCisrKyBiL21wei9zd2FwLmMKQEAgLTAsMCArMSwzOSBAQAorLyogbXB6X3N3YXAgKGRlc3RfaW50ZWdlciwgc3JjX2ludGVnZXIpIC0tIFN3YXAgVSBhbmQgVi4KKworQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDIwMDEsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfc3dhcCAobXB6X3B0ciB1LCBtcHpfcHRyIHYpIF9fR01QX05PVEhST1cKK3sKKyAgTVBfU0laRV9UX1NXQVAgKEFMTE9DKHUpLCBBTExPQyh2KSk7CisgIE1QX1NJWkVfVF9TV0FQIChTSVoodSksIFNJWih2KSk7CisgIE1QX1BUUl9TV0FQIChQVFIodiksIFBUUih1KSk7Cit9CmRpZmYgLS1naXQgYS9tcHovdGRpdl9xLmMgYi9tcHovdGRpdl9xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1MDAxZAotLS0gL2Rldi9udWxsCisrKyBiL21wei90ZGl2X3EuYwpAQCAtMCwwICsxLDg3IEBACisvKiBtcHpfdGRpdl9xIC0tIGRpdmlkZSB0d28gaW50ZWdlcnMgYW5kIHByb2R1Y2UgYSBxdW90aWVudC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMDUsIDIwMTAsIDIwMTIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCit2b2lkCittcHpfdGRpdl9xIChtcHpfcHRyIHF1b3QsIG1wel9zcmNwdHIgbnVtLCBtcHpfc3JjcHRyIGRlbikKK3sKKyAgbXBfc2l6ZV90IHFsOworICBtcF9zaXplX3QgbnMsIGRzLCBubCwgZGw7CisgIG1wX3B0ciBucCwgZHAsIHFwLCB0cDsKKyAgVE1QX0RFQ0w7CisKKyAgbnMgPSBTSVogKG51bSk7CisgIGRzID0gU0laIChkZW4pOworICBubCA9IEFCUyAobnMpOworICBkbCA9IEFCUyAoZHMpOworICBxbCA9IG5sIC0gZGwgKyAxOworCisgIGlmIChVTkxJS0VMWSAoZGwgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgaWYgKHFsIDw9IDApCisgICAgeworICAgICAgU0laIChxdW90KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHFwID0gTVBaX1JFQUxMT0MgKHF1b3QsIHFsKTsKKworICBUTVBfTUFSSzsKKyAgZHAgPSBQVFIgKGRlbik7CisKKyAgLyogQ29weSBkZW5vbWluYXRvciB0byB0ZW1wb3Jhcnkgc3BhY2UgaWYgaXQgb3ZlcmxhcHMgd2l0aCB0aGUgcXVvdGllbnQuICAqLworICBpZiAoZHAgPT0gcXApCisgICAgeworICAgICAgbXBfcHRyIHRwOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKGRsKTsKKyAgICAgIE1QTl9DT1BZICh0cCwgZHAsIGRsKTsKKyAgICAgIGRwID0gdHA7CisgICAgfQorCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChubCArIDEpOworICBucCA9IFBUUiAobnVtKTsKKyAgLyogQ29weSBudW1lcmF0b3IgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0IG92ZXJsYXBzIHdpdGggdGhlIHF1b3RpZW50LiAgKi8KKyAgaWYgKG5wID09IHFwKQorICAgIHsKKyAgICAgIE1QTl9DT1BZICh0cCwgbnAsIG5sKTsKKyAgICAgIC8qIE92ZXJsYXAgZGl2aWRlbmQgYW5kIHNjcmF0Y2guICAqLworICAgICAgbnAgPSB0cDsKKyAgICB9CisgIG1wbl9kaXZfcSAocXAsIG5wLCBubCwgZHAsIGRsLCB0cCk7CisKKyAgcWwgLT0gIHFwW3FsIC0gMV0gPT0gMDsKKworICBTSVogKHF1b3QpID0gKG5zIF4gZHMpID49IDAgPyBxbCA6IC1xbDsKKyAgVE1QX0ZSRUU7Cit9CmRpZmYgLS1naXQgYS9tcHovdGRpdl9xXzJleHAuYyBiL21wei90ZGl2X3FfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjliZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovdGRpdl9xXzJleHAuYwpAQCAtMCwwICsxLDY3IEBACisvKiBtcHpfdGRpdl9xXzJleHAgLS0gRGl2aWRlIGFuIGludGVnZXIgYnkgMioqQ05ULiAgUm91bmQgdGhlIHF1b3RpZW50CisgICB0b3dhcmRzIC1pbmZpbml0eS4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDIwMDEsIDIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3RkaXZfcV8yZXhwIChtcHpfcHRyIHIsIG1wel9zcmNwdHIgdSwgbXBfYml0Y250X3QgY250KQoreworICBtcF9zaXplX3QgdW4sIHJuOworICBtcF9zaXplX3QgbGltYl9jbnQ7CisgIG1wX3B0ciBycDsKKyAgbXBfc3JjcHRyIHVwOworCisgIHVuID0gU0laKHUpOworICBsaW1iX2NudCA9IGNudCAvIEdNUF9OVU1CX0JJVFM7CisgIHJuID0gQUJTICh1bikgLSBsaW1iX2NudDsKKworICBpZiAocm4gPD0gMCkKKyAgICBybiA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBycCA9IE1QWl9SRUFMTE9DIChyLCBybik7CisgICAgICB1cCA9IFBUUih1KSArIGxpbWJfY250OworCisgICAgICBjbnQgJT0gR01QX05VTUJfQklUUzsKKyAgICAgIGlmIChjbnQgIT0gMCkKKwl7CisJICBtcG5fcnNoaWZ0IChycCwgdXAsIHJuLCBjbnQpOworCSAgcm4gLT0gcnBbcm4gLSAxXSA9PSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fQ09QWV9JTkNSIChycCwgdXAsIHJuKTsKKwl9CisgICAgfQorCisgIFNJWihyKSA9IHVuID49IDAgPyBybiA6IC1ybjsKK30KZGlmZiAtLWdpdCBhL21wei90ZGl2X3FfdWkuYyBiL21wei90ZGl2X3FfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFjNTFlCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3RkaXZfcV91aS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIG1wel90ZGl2X3FfdWkocXVvdCwgZGl2aWRlbmQsIGRpdmlzb3JfbGltYikKKyAgIC0tIERpdmlkZSBESVZJREVORCBieSBESVZJU09SX0xJTUIgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gUVVPVC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMTIgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel90ZGl2X3FfdWkgKG1wel9wdHIgcXVvdCwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBpbnQgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IG5zLCBubiwgcW47CisgIG1wX3B0ciBucCwgcXA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICBTSVoocXVvdCkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gQUJTKG5zKTsKKyAgcXAgPSBNUFpfUkVBTExPQyAocXVvdCwgbm4pOworICBucCA9IFBUUihkaXZpZGVuZCk7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAoZGl2aXNvciA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgZHBbMl0sIHJwWzJdOworCisgICAgICBpZiAobm4gPT0gMSkJCS8qIHRkaXZfcXIgcmVxdWlyZW1lbnRzOyB0ZXN0ZWQgYWJvdmUgZm9yIDAgKi8KKwl7CisJICBTSVoocXVvdCkgPSAwOworCSAgcmwgPSBucFswXTsKKwkgIHJldHVybiBybDsKKwl9CisKKyAgICAgIGRwWzBdID0gZGl2aXNvciAmIEdNUF9OVU1CX01BU0s7CisgICAgICBkcFsxXSA9IGRpdmlzb3IgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIG1wbl90ZGl2X3FyIChxcCwgcnAsIChtcF9zaXplX3QpIDAsIG5wLCBubiwgZHAsIChtcF9zaXplX3QpIDIpOworICAgICAgcmwgPSBycFswXSArIChycFsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIHFuID0gbm4gLSAyICsgMTsgcW4gLT0gcXBbcW4gLSAxXSA9PSAwOyBxbiAtPSBxbiAhPSAwICYmIHFwW3FuIC0gMV0gPT0gMDsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHJsID0gbXBuX2RpdnJlbV8xIChxcCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCAobXBfbGltYl90KSBkaXZpc29yKTsKKyAgICAgIHFuID0gbm4gLSAocXBbbm4gLSAxXSA9PSAwKTsKKyAgICB9CisKKyAgU0laKHF1b3QpID0gbnMgPj0gMCA/IHFuIDogLXFuOworICByZXR1cm4gcmw7Cit9CmRpZmYgLS1naXQgYS9tcHovdGRpdl9xci5jIGIvbXB6L3RkaXZfcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDgyOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3RkaXZfcXIuYwpAQCAtMCwwICsxLDExMSBAQAorLyogbXB6X3RkaXZfcXIocXVvdCxyZW0sZGl2aWRlbmQsZGl2aXNvcikgLS0gU2V0IFFVT1QgdG8gRElWSURFTkQvRElWSVNPUiwKKyAgIGFuZCBSRU0gdG8gRElWSURFTkQgbW9kIERJVklTT1IuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDExLCAyMDEyLCAyMDIxIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKwordm9pZAorbXB6X3RkaXZfcXIgKG1wel9wdHIgcXVvdCwgbXB6X3B0ciByZW0sIG1wel9zcmNwdHIgbnVtLCBtcHpfc3JjcHRyIGRlbikKK3sKKyAgbXBfc2l6ZV90IHFsLCBuMDsKKyAgbXBfc2l6ZV90IG5zLCBkcywgbmwsIGRsOworICBtcF9wdHIgbnAsIGRwLCBxcCwgcnA7CisgIFRNUF9ERUNMOworCisgIG5zID0gU0laIChudW0pOworICBkcyA9IFNJWiAoZGVuKTsKKyAgbmwgPSBBQlMgKG5zKTsKKyAgZGwgPSBBQlMgKGRzKTsKKyAgcWwgPSBubCAtIGRsICsgMTsKKworICBpZiAoVU5MSUtFTFkgKGRsID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIHJwID0gTVBaX1JFQUxMT0MgKHJlbSwgZGwpOworCisgIGlmIChxbCA8PSAwKQorICAgIHsKKyAgICAgIGlmIChudW0gIT0gcmVtKQorCXsKKwkgIG5wID0gUFRSIChudW0pOworCSAgTVBOX0NPUFkgKHJwLCBucCwgbmwpOworCSAgU0laIChyZW0pID0gU0laIChudW0pOworCX0KKyAgICAgIC8qIFRoaXMgbmVlZHMgdG8gZm9sbG93IHRoZSBhc3NpZ25tZW50IHRvIHJlbSwgaW4gY2FzZSB0aGUKKwkgbnVtZXJhdG9yIGFuZCBxdW90aWVudCBhcmUgdGhlIHNhbWUuICAqLworICAgICAgU0laIChxdW90KSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHFwID0gTVBaX1JFQUxMT0MgKHF1b3QsIHFsKTsKKworICBUTVBfTUFSSzsKKyAgbnAgPSBQVFIgKG51bSk7CisgIGRwID0gUFRSIChkZW4pOworCisgIC8qIEZJWE1FOiBXZSBzaG91bGQgdGhpbmsgYWJvdXQgaG93IHRvIGhhbmRsZSB0aGUgdGVtcG9yYXJ5IGFsbG9jYXRpb24uCisgICAgIFBlcmhhcHMgbXBuX3RkaXZfcXIgc2hvdWxkIGhhbmRsZSBpdCwgc2luY2UgaXQgYW55d2F5IG9mdGVuIG5lZWRzIHRvCisgICAgIGFsbG9jYXRlIHRlbXAgc3BhY2UuICAqLworCisgIC8qIENvcHkgZGVub21pbmF0b3IgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0IG92ZXJsYXBzIHdpdGggdGhlIHF1b3RpZW50CisgICAgIG9yIHJlbWFpbmRlci4gICovCisgIGlmIChkcCA9PSBycCB8fCBkcCA9PSBxcCkKKyAgICB7CisgICAgICBtcF9wdHIgdHA7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoZGwpOworICAgICAgTVBOX0NPUFkgKHRwLCBkcCwgZGwpOworICAgICAgZHAgPSB0cDsKKyAgICB9CisgIC8qIENvcHkgbnVtZXJhdG9yIHRvIHRlbXBvcmFyeSBzcGFjZSBpZiBpdCBvdmVybGFwcyB3aXRoIHRoZSBxdW90aWVudCBvcgorICAgICByZW1haW5kZXIuICAqLworICBpZiAobnAgPT0gcnAgfHwgbnAgPT0gcXApCisgICAgeworICAgICAgbXBfcHRyIHRwOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKG5sKTsKKyAgICAgIE1QTl9DT1BZICh0cCwgbnAsIG5sKTsKKyAgICAgIG5wID0gdHA7CisgICAgfQorCisgIGZvciAobjAgPSAwOyAqZHAgPT0gMDsgKytkcCkKKyAgICB7CisgICAgICBycCBbbjArK10gPSAqbnArKzsKKyAgICAgIC0tbmw7CisgICAgfQorICBtcG5fdGRpdl9xciAocXAsIHJwICsgbjAsIDBMLCBucCwgbmwsIGRwLCBkbCAtIG4wKTsKKworICBxbCAtPSAgcXBbcWwgLSAxXSA9PSAwOworICBNUE5fTk9STUFMSVpFIChycCwgZGwpOworCisgIFNJWiAocXVvdCkgPSAobnMgXiBkcykgPj0gMCA/IHFsIDogLXFsOworICBTSVogKHJlbSkgPSBucyA+PSAwID8gZGwgOiAtZGw7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L3RkaXZfcXJfdWkuYyBiL21wei90ZGl2X3FyX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxYzlmYQotLS0gL2Rldi9udWxsCisrKyBiL21wei90ZGl2X3FyX3VpLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIG1wel90ZGl2X3FyX3VpKHF1b3QscmVtLGRpdmlkZW5kLHNob3J0X2Rpdmlzb3IpIC0tCisgICBTZXQgUVVPVCB0byBESVZJREVORCAvIFNIT1JUX0RJVklTT1IKKyAgIGFuZCBSRU0gdG8gRElWSURFTkQgbW9kIFNIT1JUX0RJVklTT1IuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk4LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDEyLCAyMDE1CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfdGRpdl9xcl91aSAobXB6X3B0ciBxdW90LCBtcHpfcHRyIHJlbSwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBpbnQgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IG5zLCBubiwgcW47CisgIG1wX3B0ciBucCwgcXA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICBTSVoocXVvdCkgPSAwOworICAgICAgU0laKHJlbSkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gQUJTKG5zKTsKKyAgcXAgPSBNUFpfUkVBTExPQyAocXVvdCwgbm4pOworICBucCA9IFBUUihkaXZpZGVuZCk7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAoZGl2aXNvciA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgZHBbMl07CisgICAgICBtcF9wdHIgcnA7CisgICAgICBtcF9zaXplX3Qgcm47CisKKyAgICAgIGlmIChubiA9PSAxKQkJLyogdGRpdl9xciByZXF1aXJlbWVudHM7IHRlc3RlZCBhYm92ZSBmb3IgMCAqLworCXsKKwkgIFNJWihxdW90KSA9IDA7CisJICBybCA9IG5wWzBdOworCSAgU0laKHJlbSkgPSBucyA+PSAwID8gMSA6IC0xOworCSAgTVBaX05FV0FMTE9DIChyZW0sIDEpWzBdID0gcmw7CisJICByZXR1cm4gcmw7CisJfQorCisgICAgICBycCA9IE1QWl9SRUFMTE9DIChyZW0sIDIpOworCisgICAgICBkcFswXSA9IGRpdmlzb3IgJiBHTVBfTlVNQl9NQVNLOworICAgICAgZHBbMV0gPSBkaXZpc29yID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICBtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIGRwLCAobXBfc2l6ZV90KSAyKTsKKyAgICAgIHJsID0gcnBbMF0gKyAocnBbMV0gPDwgR01QX05VTUJfQklUUyk7CisgICAgICBxbiA9IG5uIC0gMiArIDE7IHFuIC09IHFwW3FuIC0gMV0gPT0gMDsgcW4gLT0gcW4gIT0gMCAmJiBxcFtxbiAtIDFdID09IDA7CisgICAgICBybiA9IDIgLSAocnBbMV0gPT0gMCk7ICBybiAtPSAocnBbcm4gLSAxXSA9PSAwKTsKKyAgICAgIFNJWihyZW0pID0gbnMgPj0gMCA/IHJuIDogLXJuOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgcmwgPSBtcG5fZGl2cmVtXzEgKHFwLCAobXBfc2l6ZV90KSAwLCBucCwgbm4sIChtcF9saW1iX3QpIGRpdmlzb3IpOworICAgICAgaWYgKHJsID09IDApCisJU0laKHJlbSkgPSAwOworICAgICAgZWxzZQorCXsKKwkgIFNJWihyZW0pID0gbnMgPj0gMCA/IDEgOiAtMTsKKwkgIE1QWl9ORVdBTExPQyAocmVtLCAxKVswXSA9IHJsOworCX0KKyAgICAgIHFuID0gbm4gLSAocXBbbm4gLSAxXSA9PSAwKTsKKyAgICB9CisKKyAgU0laKHF1b3QpID0gbnMgPj0gMCA/IHFuIDogLXFuOworICByZXR1cm4gcmw7Cit9CmRpZmYgLS1naXQgYS9tcHovdGRpdl9yLmMgYi9tcHovdGRpdl9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjMzhkNgotLS0gL2Rldi9udWxsCisrKyBiL21wei90ZGl2X3IuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogbXB6X3RkaXZfcihyZW0sIGRpdmlkZW5kLCBkaXZpc29yKSAtLSBTZXQgUkVNIHRvIERJVklERU5EIG1vZCBESVZJU09SLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMjAwMCwgMjAwMSwgMjAwNSwgMjAxMiwgMjAyMSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK3ZvaWQKK21wel90ZGl2X3IgKG1wel9wdHIgcmVtLCBtcHpfc3JjcHRyIG51bSwgbXB6X3NyY3B0ciBkZW4pCit7CisgIG1wX3NpemVfdCBxbCwgbjA7CisgIG1wX3NpemVfdCBucywgbmwsIGRsOworICBtcF9wdHIgbnAsIGRwLCBxcCwgcnA7CisgIFRNUF9ERUNMOworCisgIG5zID0gU0laIChudW0pOworICBubCA9IEFCUyAobnMpOworICBkbCA9IEFCU0laIChkZW4pOworICBxbCA9IG5sIC0gZGwgKyAxOworCisgIGlmIChVTkxJS0VMWSAoZGwgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgaWYgKHFsIDw9IDApCisgICAgeworICAgICAgaWYgKG51bSAhPSByZW0pCisJeworCSAgU0laIChyZW0pID0gbnM7CisJICBycCA9IE1QWl9ORVdBTExPQyAocmVtLCBubCk7CisJICBucCA9IFBUUiAobnVtKTsKKwkgIE1QTl9DT1BZIChycCwgbnAsIG5sKTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIHJwID0gTVBaX1JFQUxMT0MgKHJlbSwgZGwpOworCisgIFRNUF9NQVJLOworICBxcCA9IFRNUF9BTExPQ19MSU1CUyAocWwpOworICBucCA9IFBUUiAobnVtKTsKKyAgZHAgPSBQVFIgKGRlbik7CisKKyAgLyogRklYTUU6IFdlIHNob3VsZCB0aGluayBhYm91dCBob3cgdG8gaGFuZGxlIHRoZSB0ZW1wb3JhcnkgYWxsb2NhdGlvbi4KKyAgICAgUGVyaGFwcyBtcG5fdGRpdl9xciBzaG91bGQgaGFuZGxlIGl0LCBzaW5jZSBpdCBhbnl3YXkgb2Z0ZW4gbmVlZHMgdG8KKyAgICAgYWxsb2NhdGUgdGVtcCBzcGFjZS4gICovCisKKyAgLyogQ29weSBkZW5vbWluYXRvciB0byB0ZW1wb3Jhcnkgc3BhY2UgaWYgaXQgb3ZlcmxhcHMgd2l0aCB0aGUgcmVtYWluZGVyLiAgKi8KKyAgaWYgKGRwID09IHJwKQorICAgIHsKKyAgICAgIG1wX3B0ciB0cDsKKyAgICAgIHRwID0gVE1QX0FMTE9DX0xJTUJTIChkbCk7CisgICAgICBNUE5fQ09QWSAodHAsIGRwLCBkbCk7CisgICAgICBkcCA9IHRwOworICAgIH0KKyAgLyogQ29weSBudW1lcmF0b3IgdG8gdGVtcG9yYXJ5IHNwYWNlIGlmIGl0IG92ZXJsYXBzIHdpdGggdGhlIHJlbWFpbmRlci4gICovCisgIGlmIChucCA9PSBycCkKKyAgICB7CisgICAgICBtcF9wdHIgdHA7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAobmwpOworICAgICAgTVBOX0NPUFkgKHRwLCBucCwgbmwpOworICAgICAgbnAgPSB0cDsKKyAgICB9CisKKyAgZm9yIChuMCA9IDA7ICpkcCA9PSAwOyArK2RwKQorICAgIHsKKyAgICAgIHJwIFtuMCsrXSA9ICpucCsrOworICAgICAgLS1ubDsKKyAgICB9CisgIG1wbl90ZGl2X3FyIChxcCwgcnAgKyBuMCwgMEwsIG5wLCBubCwgZHAsIGRsIC0gbjApOworCisgIE1QTl9OT1JNQUxJWkUgKHJwLCBkbCk7CisKKyAgU0laIChyZW0pID0gbnMgPj0gMCA/IGRsIDogLWRsOworICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL21wei90ZGl2X3JfMmV4cC5jIGIvbXB6L3RkaXZfcl8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhODFmNwotLS0gL2Rldi9udWxsCisrKyBiL21wei90ZGl2X3JfMmV4cC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIG1wel90ZGl2X3JfMmV4cCAtLSBEaXZpZGUgYW4gaW50ZWdlciBieSAyKipDTlQgYW5kIHByb2R1Y2UgYSByZW1haW5kZXIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLTE5OTUsIDIwMDEsIDIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCittcHpfdGRpdl9yXzJleHAgKG1wel9wdHIgcmVzLCBtcHpfc3JjcHRyIGluLCBtcF9iaXRjbnRfdCBjbnQpCit7CisgIG1wX3NpemVfdCBpbl9zaXplID0gQUJTSVogKGluKTsKKyAgbXBfc2l6ZV90IHJlc19zaXplOworICBtcF9zaXplX3QgbGltYl9jbnQgPSBjbnQgLyBHTVBfTlVNQl9CSVRTOworICBtcF9zcmNwdHIgaW5fcHRyID0gUFRSIChpbik7CisKKyAgaWYgKGluX3NpemUgPiBsaW1iX2NudCkKKyAgICB7CisgICAgICAvKiBUaGUgaW5wdXQgb3BlcmFuZCBpcyAocHJvYmFibHkpIGdyZWF0ZXIgdGhhbiAyKipDTlQuICAqLworICAgICAgbXBfbGltYl90IHg7CisKKyAgICAgIHggPSBpbl9wdHJbbGltYl9jbnRdICYgKCgobXBfbGltYl90KSAxIDw8IGNudCAlIEdNUF9OVU1CX0JJVFMpIC0gMSk7CisgICAgICBpZiAoeCAhPSAwKQorCXsKKwkgIHJlc19zaXplID0gbGltYl9jbnQgKyAxOworCSAgTVBaX1JFQUxMT0MgKHJlcywgcmVzX3NpemUpOworCisJICBQVFIgKHJlcylbbGltYl9jbnRdID0geDsKKwl9CisgICAgICBlbHNlCisJeworCSAgTVBOX05PUk1BTElaRSAoaW5fcHRyLCBsaW1iX2NudCk7CisKKwkgIE1QWl9SRUFMTE9DIChyZXMsIGxpbWJfY250KTsKKworCSAgcmVzX3NpemUgPSBsaW1iX2NudDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIGlucHV0IG9wZXJhbmQgaXMgc21hbGxlciB0aGFuIDIqKkNOVC4gIFdlIHBlcmZvcm0gYSBuby1vcCwKKwkgYXBhcnQgZnJvbSB0aGF0IHdlIG1pZ2h0IG5lZWQgdG8gY29weSBJTiB0byBSRVMuICAqLworICAgICAgbGltYl9jbnQgPSBpbl9zaXplOworICAgICAgTVBaX1JFQUxMT0MgKHJlcywgbGltYl9jbnQpOworCisgICAgICByZXNfc2l6ZSA9IGxpbWJfY250OworICAgIH0KKworICBpZiAocmVzICE9IGluKQorICAgIE1QTl9DT1BZIChQVFIgKHJlcyksIFBUUiAoaW4pLCBsaW1iX2NudCk7CisgIFNJWiAocmVzKSA9IFNJWiAoaW4pID49IDAgPyByZXNfc2l6ZSA6IC1yZXNfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei90ZGl2X3JfdWkuYyBiL21wei90ZGl2X3JfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RhOGVmCi0tLSAvZGV2L251bGwKKysrIGIvbXB6L3RkaXZfcl91aS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIG1wel90ZGl2X3JfdWkocmVtLCBkaXZpZGVuZCwgZGl2aXNvcl9saW1iKQorICAgLS0gU2V0IFJFTSB0byBESVZERU5EIG1vZCBESVZJU09SX0xJTUIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk4LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDEyLAorMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfdGRpdl9yX3VpIChtcHpfcHRyIHJlbSwgbXB6X3NyY3B0ciBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBpbnQgZGl2aXNvcikKK3sKKyAgbXBfc2l6ZV90IG5zLCBubjsKKyAgbXBfcHRyIG5wOworICBtcF9saW1iX3Qgcmw7CisKKyAgaWYgKFVOTElLRUxZIChkaXZpc29yID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIG5zID0gU0laKGRpdmlkZW5kKTsKKyAgaWYgKG5zID09IDApCisgICAgeworICAgICAgU0laKHJlbSkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG5uID0gQUJTKG5zKTsKKyAgbnAgPSBQVFIoZGl2aWRlbmQpOworI2lmIEJJVFNfUEVSX1VMT05HID4gR01QX05VTUJfQklUUyAgLyogYXZvaWQgd2FybmluZ3MgYWJvdXQgc2hpZnQgYW1vdW50ICovCisgIGlmIChkaXZpc29yID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBkcFsyXTsKKyAgICAgIG1wX3B0ciBycCwgcXA7CisgICAgICBtcF9zaXplX3Qgcm47CisgICAgICBUTVBfREVDTDsKKworICAgICAgaWYgKG5uID09IDEpCQkvKiB0ZGl2X3FyIHJlcXVpcmVtZW50czsgdGVzdGVkIGFib3ZlIGZvciAwICovCisJeworCSAgcmwgPSBucFswXTsKKwkgIFNJWihyZW0pID0gbnMgPj0gMCA/IDEgOiAtMTsKKwkgIE1QWl9ORVdBTExPQyAocmVtLCAxKVswXSA9IHJsOworCSAgcmV0dXJuIHJsOworCX0KKworICAgICAgcnAgPSBNUFpfTkVXQUxMT0MgKHJlbSwgMik7CisKKyAgICAgIFRNUF9NQVJLOworICAgICAgZHBbMF0gPSBkaXZpc29yICYgR01QX05VTUJfTUFTSzsKKyAgICAgIGRwWzFdID0gZGl2aXNvciA+PiBHTVBfTlVNQl9CSVRTOworICAgICAgcXAgPSBUTVBfQUxMT0NfTElNQlMgKG5uIC0gMiArIDEpOworICAgICAgbXBuX3RkaXZfcXIgKHFwLCBycCwgKG1wX3NpemVfdCkgMCwgbnAsIG5uLCBkcCwgKG1wX3NpemVfdCkgMik7CisgICAgICBUTVBfRlJFRTsKKyAgICAgIHJsID0gcnBbMF0gKyAocnBbMV0gPDwgR01QX05VTUJfQklUUyk7CisgICAgICBybiA9IDIgLSAocnBbMV0gPT0gMCk7ICBybiAtPSAocnBbcm4gLSAxXSA9PSAwKTsKKyAgICAgIFNJWihyZW0pID0gbnMgPj0gMCA/IHJuIDogLXJuOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgcmwgPSBtcG5fbW9kXzEgKG5wLCBubiwgKG1wX2xpbWJfdCkgZGl2aXNvcik7CisgICAgICBpZiAocmwgPT0gMCkKKwlTSVoocmVtKSA9IDA7CisgICAgICBlbHNlCisJeworCSAgU0laKHJlbSkgPSBucyA+PSAwID8gMSA6IC0xOworCSAgTVBaX05FV0FMTE9DIChyZW0sIDEpWzBdID0gcmw7CisJfQorICAgIH0KKworICByZXR1cm4gcmw7Cit9CmRpZmYgLS1naXQgYS9tcHovdGRpdl91aS5jIGIvbXB6L3RkaXZfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE4NTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbXB6L3RkaXZfdWkuYwpAQCAtMCwwICsxLDg0IEBACisvKiBtcHpfdGRpdl91aShkaXZpZGVuZCwgZGl2aXNvcl9saW1iKSAtLSBSZXR1cm4gRElWREVORCBtb2QgRElWSVNPUl9MSU1CLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5Ni0xOTk4LCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDEyIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKwordW5zaWduZWQgbG9uZyBpbnQKK21wel90ZGl2X3VpIChtcHpfc3JjcHRyIGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGludCBkaXZpc29yKQoreworICBtcF9zaXplX3QgbnMsIG5uOworICBtcF9wdHIgbnA7CisgIG1wX2xpbWJfdCBybDsKKworICBpZiAoVU5MSUtFTFkgKGRpdmlzb3IgPT0gMCkpCisgICAgRElWSURFX0JZX1pFUk87CisKKyAgbnMgPSBTSVooZGl2aWRlbmQpOworICBpZiAobnMgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbm4gPSBBQlMobnMpOworICBucCA9IFBUUihkaXZpZGVuZCk7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAoZGl2aXNvciA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcF9saW1iX3QgZHBbMl0sIHJwWzJdOworICAgICAgbXBfcHRyIHFwOworICAgICAgbXBfc2l6ZV90IHJuOworICAgICAgVE1QX0RFQ0w7CisKKyAgICAgIGlmIChubiA9PSAxKQkJLyogdGRpdl9xciByZXF1aXJlbWVudHM7IHRlc3RlZCBhYm92ZSBmb3IgMCAqLworCXsKKwkgIHJsID0gbnBbMF07CisJICByZXR1cm4gcmw7CisJfQorCisgICAgICBUTVBfTUFSSzsKKyAgICAgIGRwWzBdID0gZGl2aXNvciAmIEdNUF9OVU1CX01BU0s7CisgICAgICBkcFsxXSA9IGRpdmlzb3IgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIHFwID0gVE1QX0FMTE9DX0xJTUJTIChubiAtIDIgKyAxKTsKKyAgICAgIG1wbl90ZGl2X3FyIChxcCwgcnAsIChtcF9zaXplX3QpIDAsIG5wLCBubiwgZHAsIChtcF9zaXplX3QpIDIpOworICAgICAgVE1QX0ZSRUU7CisgICAgICBybCA9IHJwWzBdICsgKHJwWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworICAgICAgcm4gPSAyIC0gKHJwWzFdID09IDApOyAgcm4gLT0gKHJwW3JuIC0gMV0gPT0gMCk7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBybCA9IG1wbl9tb2RfMSAobnAsIG5uLCAobXBfbGltYl90KSBkaXZpc29yKTsKKyAgICB9CisKKyAgcmV0dXJuIHJsOworfQpkaWZmIC0tZ2l0IGEvbXB6L3RzdGJpdC5jIGIvbXB6L3RzdGJpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzI1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tcHovdHN0Yml0LmMKQEAgLTAsMCArMSw4MCBAQAorLyogbXB6X3RzdGJpdCAtLSB0ZXN0IGEgc3BlY2lmaWVkIGJpdC4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEZvciBuZWdhdGl2ZXMgdGhlIGVmZmVjdGl2ZSB0d29zIGNvbXBsZW1lbnQgaXMgYWNoaWV2ZWQgYnkgbmVnYXRpbmcgdGhlCisgICBsaW1iIHRlc3RlZCwgZWl0aGVyIHdpdGggYSBvbmVzIG9yIHR3b3MgY29tcGxlbWVudC4gIFR3b3MgY29tcGxlbWVudAorICAgKCItIikgaXMgdXNlZCBpZiB0aGVyZSdzIG9ubHkgemVybyBsaW1icyBiZWxvdyB0aGUgb25lIGJlaW5nIHRlc3RlZC4KKyAgIE9uZXMgY29tcGxlbWVudCAoIn4iKSBpcyB1c2VkIGlmIHRoZXJlJ3MgYSBub24temVybyBiZWxvdy4gIE5vdGUgdGhhdCAiLSIKKyAgIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgbGltYiBleGFtaW5lZCBpcyAwIChhbmQgdGhlIHRydWUgYmVnaW5uaW5nIG9mIHR3b3MKKyAgIGNvbXBsZW1lbnQgaXMgZnVydGhlciB1cCkuCisKKyAgIFRlc3RpbmcgdGhlIGxpbWJzIGJlbG93IHAgaXMgdW5hdm9pZGFibGUgb24gbmVnYXRpdmVzLCBidXQgd2lsbCB1c3VhbGx5CisgICBuZWVkIHRvIGV4YW1pbmUgb25seSAqKHAtMSkuICBUaGUgc2VhcmNoIGlzIGRvbmUgZnJvbSAqKHAtMSkgZG93biB0bworICAgKnVfcHRyLCBzaW5jZSB0aGF0IG1pZ2h0IGdpdmUgYmV0dGVyIGNhY2hlIGxvY2FsaXR5LCBhbmQgYmVjYXVzZSBhCisgICBub24temVybyBsaW1iIGlzIHBlcmhhcHMgYSB0b3VjaCBtb3JlIGxpa2VseSBpbiB0aGUgbWlkZGxlIG9mIGEgbnVtYmVyCisgICB0aGFuIGF0IHRoZSBsb3cgZW5kLgorCisgICBCaXRzIHBhc3QgdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YSBzaW1wbHkgZm9sbG93IHNpZ24gb2YgdS4gIE5vdGljZSB0aGF0CisgICB0aGUgbGltYl9pbmRleCA+PSBhYnNfc2l6ZSB0ZXN0IGNvdmVycyB1PTAgdG9vLiAgKi8KKworaW50CittcHpfdHN0Yml0IChtcHpfc3JjcHRyIHUsIG1wX2JpdGNudF90IGJpdF9pbmRleCkgX19HTVBfTk9USFJPVworeworICBtcF9zcmNwdHIgICAgICB1X3B0ciAgICAgID0gUFRSKHUpOworICBtcF9zaXplX3QgICAgICBzaXplICAgICAgID0gU0laKHUpOworICB1bnNpZ25lZCAgICAgICBhYnNfc2l6ZSAgID0gQUJTKHNpemUpOworICBtcF9zaXplX3QgICAgICBsaW1iX2luZGV4ID0gYml0X2luZGV4IC8gR01QX05VTUJfQklUUzsKKyAgbXBfc3JjcHRyICAgICAgcCAgICAgICAgICA9IHVfcHRyICsgbGltYl9pbmRleDsKKyAgbXBfbGltYl90ICAgICAgbGltYjsKKworICBpZiAobGltYl9pbmRleCA+PSBhYnNfc2l6ZSkKKyAgICByZXR1cm4gKHNpemUgPCAwKTsKKworICBsaW1iID0gKnA7CisgIGlmIChzaXplIDwgMCkKKyAgICB7CisgICAgICBsaW1iID0gLWxpbWI7ICAgICAvKiB0d29zIGNvbXBsZW1lbnQgKi8KKworICAgICAgd2hpbGUgKHAgIT0gdV9wdHIpCisJeworCSAgcC0tOworCSAgaWYgKCpwICE9IDApCisJICAgIHsKKwkgICAgICBsaW1iLS07CS8qIG1ha2UgaXQgYSBvbmVzIGNvbXBsZW1lbnQgaW5zdGVhZCAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gKGxpbWIgPj4gKGJpdF9pbmRleCAlIEdNUF9OVU1CX0JJVFMpKSAmIDE7Cit9CmRpZmYgLS1naXQgYS9tcHovdWlfcG93X3VpLmMgYi9tcHovdWlfcG93X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmMmQzYQotLS0gL2Rldi9udWxsCisrKyBiL21wei91aV9wb3dfdWkuYwpAQCAtMCwwICsxLDU4IEBACisvKiBtcHpfdWlfcG93X3VpIC0tIHVsb25nIHJhaXNlZCB0byB1bG9uZy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK3ZvaWQKK21wel91aV9wb3dfdWkgKG1wel9wdHIgciwgdW5zaWduZWQgbG9uZyBiLCB1bnNpZ25lZCBsb25nIGUpCit7CisjaWYgR01QX05BSUxfQklUUyAhPSAwCisgIGlmIChiID4gR01QX05VTUJfTUFYKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBiYlsyXTsKKyAgICAgIGJiWzBdID0gYiAmIEdNUF9OVU1CX01BU0s7CisgICAgICBiYlsxXSA9IGIgPj4gR01QX05VTUJfQklUUzsKKyAgICAgIG1wel9uX3Bvd191aSAociwgYmIsIChtcF9zaXplX3QpIDIsIGUpOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgeworI2lmZGVmIF9MT05HX0xPTkdfTElNQgorICAgICAgLyogaTM4NiBnY2MgMi45NS4zIGRvZXNuJ3QgcmVjb2duaXNlIGJsaW1iIGNhbiBiZSBlbGltaW5hdGVkIHdoZW4KKwkgbXBfbGltYl90IGlzIGFuIHVuc2lnbmVkIGxvbmcsIHNvIG9ubHkgdXNlIGEgc2VwYXJhdGUgYmxpbWIgd2hlbgorCSBuZWNlc3NhcnkuICAqLworICAgICAgbXBfbGltYl90ICBibGltYiA9IGI7CisgICAgICBtcHpfbl9wb3dfdWkgKHIsICZibGltYiwgKG1wX3NpemVfdCkgKGIgIT0gMCksIGUpOworI2Vsc2UKKyAgICAgIG1wel9uX3Bvd191aSAociwgJmIsICAgICAobXBfc2l6ZV90KSAoYiAhPSAwKSwgZSk7CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tcHovdWlfc3ViLmMgYi9tcHovdWlfc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwZWRiOQotLS0gL2Rldi9udWxsCisrKyBiL21wei91aV9zdWIuYwpAQCAtMCwwICsxLDkwIEBACisvKiBtcHpfdWlfc3ViIC0tIFN1YnRyYWN0IGFuIHVuc2lnbmVkIG9uZS13b3JkIGludGVnZXIgYW5kIGFuIG1wel90LgorCitDb3B5cmlnaHQgMjAwMiwgMjAwNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel91aV9zdWIgKG1wel9wdHIgdywgdW5zaWduZWQgbG9uZyBpbnQgdXZhbCwgbXB6X3NyY3B0ciB2KQoreworICBtcF9wdHIgdnAsIHdwOworICBtcF9zaXplX3Qgdm4sIHduOworICBtcF9saW1iX3QgY3k7CisKKyNpZiBCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMgIC8qIGF2b2lkIHdhcm5pbmdzIGFib3V0IHNoaWZ0IGFtb3VudCAqLworICBpZiAodXZhbCA+IEdNUF9OVU1CX01BWCkKKyAgICB7CisgICAgICBtcHpfdCB1OworICAgICAgbXBfbGltYl90IHVsWzJdOworICAgICAgUFRSKHUpID0gdWw7CisgICAgICB1bFswXSA9IHV2YWwgJiBHTVBfTlVNQl9NQVNLOworICAgICAgdWxbMV0gPSB1dmFsID4+IEdNUF9OVU1CX0JJVFM7CisgICAgICBTSVoodSkgPSAyOworICAgICAgbXB6X3N1YiAodywgdSwgdik7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgdm4gPSBTSVoodik7CisKKyAgaWYgKHZuID4gMSkKKyAgICB7CisgICAgICB3cCA9IE1QWl9SRUFMTE9DICh3LCB2bik7CisgICAgICB2cCA9IFBUUih2KTsKKyAgICAgIG1wbl9zdWJfMSAod3AsIHZwLCB2biwgKG1wX2xpbWJfdCkgdXZhbCk7CisgICAgICB3biA9IC0odm4gLSAod3Bbdm4gLSAxXSA9PSAwKSk7CisgICAgfQorICBlbHNlIGlmICh2biA+PSAwKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCB2cDA7CisgICAgICB2cDAgPSBQVFIgKHYpWzBdICYgLSAobXBfbGltYl90KSB2bjsKKyAgICAgIHdwID0gTVBaX05FV0FMTE9DICh3LCAxKTsKKyAgICAgIGlmICh1dmFsID49IHZwMCkKKwl7CisJICB3cFswXSA9IHV2YWwgLSB2cDA7CisJICB3biA9IHdwWzBdICE9IDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHdwWzBdID0gdnAwIC0gdXZhbDsKKwkgIHduID0gLTE7CisJfQorICAgIH0KKyAgZWxzZSAvKiAodm4gPCAwKSAqLworICAgIHsKKyAgICAgIHZuID0gLXZuOworICAgICAgd3AgPSBNUFpfUkVBTExPQyAodywgdm4gKyAxKTsKKyAgICAgIHZwID0gUFRSKHYpOworICAgICAgY3kgPSBtcG5fYWRkXzEgKHdwLCB2cCwgdm4sIChtcF9saW1iX3QpIHV2YWwpOworICAgICAgd3Bbdm5dID0gY3k7CisgICAgICB3biA9IHZuICsgKGN5ICE9IDApOworICAgIH0KKworICBTSVoodykgPSB3bjsKK30KZGlmZiAtLWdpdCBhL21wei91cmFuZG9tYi5jIGIvbXB6L3VyYW5kb21iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2YWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL21wei91cmFuZG9tYi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIG1wel91cmFuZG9tYiAocm9wLCBzdGF0ZSwgbikgLS0gR2VuZXJhdGUgYSB1bmlmb3JtIHBzZXVkb3JhbmRvbQorICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAyXk4gLSAxLCBpbmNsdXNpdmUsIHVzaW5nIFNUQVRFIGFzIHRoZQorICAgcmFuZG9tIHN0YXRlIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGdtcF9yYW5kaW5pdCgpLgorCitDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK21wel91cmFuZG9tYiAobXB6X3B0ciByb3AsIGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwgbXBfYml0Y250X3QgbmJpdHMpCit7CisgIG1wX3B0ciBycDsKKyAgbXBfc2l6ZV90IHNpemU7CisKKyAgc2l6ZSA9IEJJVFNfVE9fTElNQlMgKG5iaXRzKTsKKyAgcnAgPSBNUFpfTkVXQUxMT0MgKHJvcCwgc2l6ZSk7CisKKyAgX2dtcF9yYW5kIChycCwgcnN0YXRlLCBuYml0cyk7CisgIE1QTl9OT1JNQUxJWkUgKHJwLCBzaXplKTsKKyAgU0laIChyb3ApID0gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL21wei91cmFuZG9tbS5jIGIvbXB6L3VyYW5kb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2YjBiYQotLS0gL2Rldi9udWxsCisrKyBiL21wei91cmFuZG9tbS5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIG1wel91cmFuZG9tbSAocm9wLCBzdGF0ZSwgbikgLS0gR2VuZXJhdGUgYSB1bmlmb3JtIHBzZXVkb3JhbmRvbQorICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byBOLTEsIHVzaW5nIFNUQVRFIGFzIHRoZSByYW5kb20gc3RhdGUKKyAgIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGdtcF9yYW5kaW5pdCgpLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMiwgMjAxMiwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIgLyogZm9yIGNvdW50X2xlYWRpbmdfemVyb3MgKi8KKworCisjZGVmaW5lIE1BWF9VUkFORE9NTV9JVEVSICA4MAorCit2b2lkCittcHpfdXJhbmRvbW0gKG1wel9wdHIgcm9wLCBnbXBfcmFuZHN0YXRlX3B0ciByc3RhdGUsIG1wel9zcmNwdHIgbikKK3sKKyAgbXBfcHRyIHJwLCBucDsKKyAgbXBfc2l6ZV90IG5iaXRzLCBzaXplOworICBtcF9saW1iX3Qgbmg7CisgIGludCBjb3VudDsKKyAgaW50IHBvdzI7CisgIGludCBjbXA7CisgIFRNUF9ERUNMOworCisgIHNpemUgPSBBQlNJWiAobik7CisgIGlmIChVTkxJS0VMWSAoc2l6ZSA9PSAwKSkKKyAgICBESVZJREVfQllfWkVSTzsKKworICBucCA9IFBUUiAobik7CisgIG5oID0gbnBbc2l6ZSAtIDFdOworCisgIC8qIERldGVjdCB3aGV0aGVyIG4gaXMgYSBwb3dlciBvZiAyLiAgKi8KKyAgcG93MiA9IFBPVzJfUCAobmgpICYmIChzaXplID09IDEgfHwgbXBuX3plcm9fcCAobnAsIHNpemUgLSAxKSk7CisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoY291bnQsIG5oKTsKKyAgbmJpdHMgPSBzaXplICogR01QX05VTUJfQklUUyAtIChjb3VudCAtIEdNUF9OQUlMX0JJVFMpIC0gcG93MjsKKyAgaWYgKG5iaXRzID09IDApCQkvKiBuYml0cyA9PSAwIG1lYW5zIHRoYXQgbiB3YXMgPT0gMS4gICovCisgICAgeworICAgICAgU0laIChyb3ApID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgVE1QX01BUks7CisgIGlmIChyb3AgPT0gbikKKyAgICB7CisgICAgICBtcF9wdHIgdHA7CisgICAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSk7CisgICAgICBNUE5fQ09QWSAodHAsIG5wLCBzaXplKTsKKyAgICAgIG5wID0gdHA7CisgICAgfQorCisgIC8qIEhlcmUgdGhlIGFsbG9jYXRlZCBzaXplIGNhbiBiZSBvbmUgdG9vIG11Y2ggaWYgbiBpcyBhIHBvd2VyIG9mCisgICAgICgyXkdNUF9OVU1CX0JJVFMpIGJ1dCBpdCdzIGNvbnZlbmllbnQgZm9yIHVzaW5nIG1wbl9jbXAgYmVsb3cuICAqLworICBycCA9IE1QWl9ORVdBTExPQyAocm9wLCBzaXplKTsKKyAgLyogQ2xlYXIgbGFzdCBsaW1iIHRvIHByZXZlbnQgdGhlIGNhc2UgaW4gd2hpY2ggc2l6ZSBpcyBvbmUgdG9vIG11Y2guICAqLworICBycFtzaXplIC0gMV0gPSAwOworCisgIGNvdW50ID0gTUFYX1VSQU5ET01NX0lURVI7CS8qIFNldCBpdGVyYXRpb24gY291bnQgbGltaXQuICAqLworICBkbworICAgIHsKKyAgICAgIF9nbXBfcmFuZCAocnAsIHJzdGF0ZSwgbmJpdHMpOworICAgICAgTVBOX0NNUCAoY21wLCBycCwgbnAsIHNpemUpOworICAgIH0KKyAgd2hpbGUgKGNtcCA+PSAwICYmIC0tY291bnQgIT0gMCk7CisKKyAgaWYgKGNvdW50ID09IDApCisgICAgLyogVG9vIG1hbnkgaXRlcmF0aW9uczsgcmV0dXJuIHJlc3VsdCBtb2QgbiA9PSByZXN1bHQgLSBuICovCisgICAgbXBuX3N1Yl9uIChycCwgcnAsIG5wLCBzaXplKTsKKworICBNUE5fTk9STUFMSVpFIChycCwgc2l6ZSk7CisgIFNJWiAocm9wKSA9IHNpemU7CisgIFRNUF9GUkVFOworfQpkaWZmIC0tZ2l0IGEvbXB6L3hvci5jIGIvbXB6L3hvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzY1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9tcHoveG9yLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIG1wel94b3IgLS0gTG9naWNhbCB4b3IuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDA1LCAyMDEyLAorMjAxNS0yMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorbXB6X3hvciAobXB6X3B0ciByZXMsIG1wel9zcmNwdHIgb3AxLCBtcHpfc3JjcHRyIG9wMikKK3sKKyAgbXBfc3JjcHRyIG9wMV9wdHIsIG9wMl9wdHI7CisgIG1wX3NpemVfdCBvcDFfc2l6ZSwgb3AyX3NpemU7CisgIG1wX3B0ciByZXNfcHRyOworICBtcF9zaXplX3QgcmVzX3NpemU7CisKKyAgb3AxX3NpemUgPSBTSVoob3AxKTsKKyAgb3AyX3NpemUgPSBTSVoob3AyKTsKKworICBpZiAob3AxX3NpemUgPCBvcDJfc2l6ZSkKKyAgICB7CisgICAgICBNUFpfU1JDUFRSX1NXQVAgKG9wMSwgb3AyKTsKKyAgICAgIE1QX1NJWkVfVF9TV0FQIChvcDFfc2l6ZSwgb3AyX3NpemUpOworICAgIH0KKworICBvcDFfcHRyID0gUFRSKG9wMSk7CisgIHJlc19wdHIgPSBQVFIocmVzKTsKKworICBpZiAob3AyX3NpemUgPj0gMCkKKyAgICB7CisgICAgICBpZiAocmVzX3B0ciAhPSBvcDFfcHRyKQorCXsKKwkgIHJlc19wdHIgPSBNUFpfUkVBTExPQyAocmVzLCBvcDFfc2l6ZSk7CisJICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMl9zaXplLCBvcDFfcHRyICsgb3AyX3NpemUsCisJCSAgICBvcDFfc2l6ZSAtIG9wMl9zaXplKTsKKwl9CisgICAgICBpZiAoTElLRUxZIChvcDJfc2l6ZSAhPSAwKSkKKwltcG5feG9yX24gKHJlc19wdHIsIG9wMV9wdHIsIFBUUihvcDIpLCBvcDJfc2l6ZSk7CisgICAgICByZXNfc2l6ZSA9IG9wMV9zaXplOworCisgICAgICBNUE5fTk9STUFMSVpFIChyZXNfcHRyLCByZXNfc2l6ZSk7CisgICAgICBTSVoocmVzKSA9IHJlc19zaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3B0ciBvcHg7CisgICAgICBUTVBfREVDTDsKKworICAgICAgb3AyX3NpemUgPSAtb3AyX3NpemU7CisgICAgICBUTVBfTUFSSzsKKyAgICAgIGlmIChvcDFfc2l6ZSA8IDApCisJeworCSAgbXBfcHRyIG9weTsKKworCSAgLyogQm90aCBvcGVyYW5kcyBhcmUgbmVnYXRpdmUsIHRoZSByZXN1bHQgd2lsbCBiZSBwb3NpdGl2ZS4KKwkgICAgICAoLU9QMSkgXiAoLU9QMikgPQorCSAgICAgPSB+KE9QMSAtIDEpIF4gfihPUDIgLSAxKSA9CisJICAgICA9IChPUDEgLSAxKSBeIChPUDIgLSAxKSAgKi8KKworCSAgb3AxX3NpemUgPSAtb3AxX3NpemU7CisKKwkgIC8qIFBvc3NpYmxlIG9wdGltaXphdGlvbjogRGVjcmVhc2UgbXBuX3N1YiBwcmVjaXNpb24sCisJICAgICBhcyB3ZSB3b24ndCB1c2UgdGhlIGVudGlyZSByZXMgb2YgYm90aC4gICovCisJICBUTVBfQUxMT0NfTElNQlNfMiAob3B4LCBvcDFfc2l6ZSwgb3B5LCBvcDJfc2l6ZSk7CisJICBtcG5fc3ViXzEgKG9weCwgb3AxX3B0ciwgb3AxX3NpemUsIChtcF9saW1iX3QpIDEpOworCSAgb3AxX3B0ciA9IG9weDsKKworCSAgbXBuX3N1Yl8xIChvcHksIFBUUihvcDIpLCBvcDJfc2l6ZSwgKG1wX2xpbWJfdCkgMSk7CisJICBvcDJfcHRyID0gb3B5OworCisJICByZXNfcHRyID0gTVBaX05FV0FMTE9DIChyZXMsIG9wMl9zaXplKTsKKwkgIC8qIERvbid0IHJlLXJlYWQgT1AxX1BUUiBhbmQgT1AyX1BUUi4gIFRoZXkgcG9pbnQgdG8gdGVtcG9yYXJ5CisJICAgICBzcGFjZS0tbmV2ZXIgdG8gdGhlIHNwYWNlIFBUUihyZXMpIHVzZWQgdG8gcG9pbnQgdG8gYmVmb3JlCisJICAgICByZWFsbG9jYXRpb24uICAqLworCisJICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMV9zaXplLCBvcDJfcHRyICsgb3AxX3NpemUsCisJCSAgICBvcDJfc2l6ZSAtIG9wMV9zaXplKTsKKwkgIG1wbl94b3JfbiAocmVzX3B0ciwgb3AxX3B0ciwgb3AyX3B0ciwgb3AxX3NpemUpOworCSAgVE1QX0ZSRUU7CisJICByZXNfc2l6ZSA9IG9wMl9zaXplOworCisJICBNUE5fTk9STUFMSVpFIChyZXNfcHRyLCByZXNfc2l6ZSk7CisJICBTSVoocmVzKSA9IHJlc19zaXplOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBPcGVyYW5kIDIgbmVnYXRpdmUsIHNvIHdpbGwgYmUgdGhlIHJlc3VsdC4KKwkgICAgIC0oT1AxIF4gKC1PUDIpKSA9IC0oT1AxIF4gfihPUDIgLSAxKSkgPQorCSAgICAgPSB+KE9QMSBeIH4oT1AyIC0gMSkpICsgMSA9CisJICAgICA9IChPUDEgXiAoT1AyIC0gMSkpICsgMSAgICAgICovCisKKwkgIHJlc19zaXplID0gTUFYIChvcDFfc2l6ZSwgb3AyX3NpemUpOworCSAgcmVzX3B0ciA9IE1QWl9SRUFMTE9DIChyZXMsIHJlc19zaXplICsgMSk7CisJICBvcDFfcHRyID0gUFRSKG9wMSk7CisKKwkgIG9weCA9IFRNUF9BTExPQ19MSU1CUyAob3AyX3NpemUpOworCSAgbXBuX3N1Yl8xIChvcHgsIFBUUihvcDIpLCBvcDJfc2l6ZSwgKG1wX2xpbWJfdCkgMSk7CisJICBvcDJfcHRyID0gb3B4OworCisJICBpZiAocmVzX3NpemUgPT0gb3AxX3NpemUpCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMl9zaXplLCBvcDFfcHRyICsgb3AyX3NpemUsIG9wMV9zaXplIC0gb3AyX3NpemUpOworCSAgICAgIG1wbl94b3JfbiAocmVzX3B0ciwgb3AxX3B0ciwgb3AyX3B0ciwgb3AyX3NpemUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocmVzX3B0ciArIG9wMV9zaXplLCBvcDJfcHRyICsgb3AxX3NpemUsIG9wMl9zaXplIC0gb3AxX3NpemUpOworCSAgICAgIGlmIChMSUtFTFkgKG9wMV9zaXplICE9IDApKQorCQltcG5feG9yX24gKHJlc19wdHIsIG9wMV9wdHIsIG9wMl9wdHIsIG9wMV9zaXplKTsKKwkgICAgfQorCSAgVE1QX0ZSRUU7CisKKwkgIHJlc19wdHJbcmVzX3NpemVdID0gMDsKKwkgIE1QTl9JTkNSX1UgKHJlc19wdHIsIHJlc19zaXplICsgMSwgKG1wX2xpbWJfdCkgMSk7CisJICByZXNfc2l6ZSArPSByZXNfcHRyW3Jlc19zaXplXTsKKworCSAgTVBOX05PUk1BTElaRV9OT1RfWkVSTyAocmVzX3B0ciwgcmVzX3NpemUpOworCSAgU0laKHJlcykgPSAtcmVzX3NpemU7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL25leHRwcmltZS5jIGIvbmV4dHByaW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNjBkZAotLS0gL2Rldi9udWxsCisrKyBiL25leHRwcmltZS5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBnbXBfbmV4dHByaW1lIC0tIGdlbmVyYXRlIHNtYWxsIHByaW1lcyByZWFzb25hYmx5IGVmZmljaWVudGx5IGZvciBpbnRlcm5hbAorICAgR01QIG5lZWRzLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQuICBNaXNjZWxsYW5lb3VzCisgICBpbXByb3ZlbWVudHMgYnkgTWFydGluIEJvaWouCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBJTlRFUk5BTCBXSVRIIE1VVEFCTEUgSU5URVJGQUNFUy4gIElUIElTIE9OTFkKKyAgIFNBRkUgVE8gUkVBQ0ggVEhFTSBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4gIElOIEZBQ1QsIElUIElTIEFMTU9TVAorICAgR1VBUkFOVEVFRCBUSEFUIFRIRVkgV0lMTCBDSEFOR0UgT1IgRElTQVBQRUFSIElOIEEgRlVUVVJFIEdOVSBNUCBSRUxFQVNFLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyoKKyAgT3B0aW1pc2F0aW9uIGlkZWFzOgorCisgIDEuIFVucm9sbCB0aGUgc2lldmluZyBsb29wcy4gIFNob3VsZCByZWFjaCAxIHdyaXRlL2N5Y2xlLiAgVGhhdCB3b3VsZCBiZSBhIDJ4CisgICAgIGltcHJvdmVtZW50LgorCisgIDIuIFNlcGFyYXRlIHNpZXZpbmcgd2l0aCBwcmltZXMgcCA8IFNJRVZFU0laRSBhbmQgcCA+PSBTSUVWRVNJWkUuICBUaGUgbGF0dGVyCisgICAgIHdpbGwgbmVlZCBhdCBtb3N0IG9uZSB3cml0ZSwgYW5kIHRodXMgbm90IG5lZWQgYW55IGlubmVyIGxvb3AuCisKKyAgMy4gRm9yIHByaW1lcyBwID49IFNJRVZFU0laRSwgaS5lLiwgdHlwaWNhbGx5IHRoZSBtYWpvcml0eSBvZiBwcmltZXMsIHdlCisgICAgIHBlcmZvcm0gbW9yZSB0aGFuIG9uZSBkaXZpc2lvbiBwZXIgc2lldmluZyB3cml0ZS4gIFRoYXQgbWlnaHQgZG9taW5hdGUgdGhlCisgICAgIGVudGlyZSBydW4gdGltZSBmb3IgdGhlIG5leHRwcmltZSBmdW5jdGlvbi4gIEEgaW5jcmVtZW50YWxseSBpbml0aWFsaXNlZAorICAgICByZW1haW5kZXIgdGFibGUgb2YgUGkoNjU1MzYpID0gNjU0MiAxNi1iaXQgZW50cmllcyBjb3VsZCByZXBsYWNlIHRoYXQKKyAgICAgZGl2aXNpb24uCisqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBtZW1zZXQgKi8KKworCit1bnNpZ25lZCBsb25nIGludAorZ21wX25leHRwcmltZSAoZ21wX3ByaW1lc2lldmVfdCAqcHMpCit7CisgIHVuc2lnbmVkIGxvbmcgcCwgZCwgcGk7CisgIHVuc2lnbmVkIGNoYXIgKnNwOworICBzdGF0aWMgdW5zaWduZWQgY2hhciBhZGR0YWJbXSA9CisgICAgeyAyLDQsMiw0LDYsMiw2LDQsMiw0LDYsNiwyLDYsNCwyLDYsNCw2LDgsNCwyLDQsMiw0LDgsNiw0LDYsMiw0LDYsMiw2LDYsNCwKKyAgICAgIDIsNCw2LDIsNiw0LDIsNCwyLDEwLDIsMTAgfTsKKyAgdW5zaWduZWQgY2hhciAqYWRkcCA9IGFkZHRhYjsKKyAgdW5zaWduZWQgbG9uZyBhaTsKKworICAvKiBMb29rIGZvciBhbHJlYWR5IHNpZXZlZCBwcmltZXMuICBBIHNlbnRpbmVsIGF0IHRoZSBlbmQgb2YgdGhlIHNpZXZpbmcKKyAgICAgYXJlYSBhbGxvd3MgdXMgdG8gdXNlIGEgdmVyeSBzaW1wbGUgbG9vcCBoZXJlLiAgKi8KKyAgZCA9IHBzLT5kOworICBzcCA9IHBzLT5zICsgZDsKKyAgd2hpbGUgKCpzcCAhPSAwKQorICAgIHNwKys7CisgIGlmIChzcCAhPSBwcy0+cyArIFNJRVZFU0laRSkKKyAgICB7CisgICAgICBkID0gc3AgLSBwcy0+czsKKyAgICAgIHBzLT5kID0gZCArIDE7CisgICAgICByZXR1cm4gcHMtPnMwICsgMiAqIGQ7CisgICAgfQorCisgIC8qIEhhbmRsZSB0aGUgbnVtYmVyIDIgc2VwYXJhdGVseS4gICovCisgIGlmIChwcy0+czAgPCAzKQorICAgIHsKKyAgICAgIHBzLT5zMCA9IDMgLSAyICogU0lFVkVTSVpFOyAvKiBUcmlja3kgKi8KKyAgICAgIHJldHVybiAyOworICAgIH0KKworICAvKiBFeGhhdXN0ZWQgY29tcHV0ZWQgcHJpbWVzLiAgUmVzaWV2ZSwgdGhlbiBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseS4gICovCisKKyNpZiAwCisgIGZvciAoc3AgPSBwcy0+czsgc3AgPCBwcy0+cyArIFNJRVZFU0laRTsgc3ArKykKKyAgICAqc3AgPSAwOworI2Vsc2UKKyAgbWVtc2V0IChwcy0+cywgMCwgU0lFVkVTSVpFKTsKKyNlbmRpZgorCisgIHBzLT5zMCArPSAyICogU0lFVkVTSVpFOworCisgIC8qIFVwZGF0ZSBzcXJ0X3MwIGFzIG5lZWRlZC4gICovCisgIHdoaWxlICgocHMtPnNxcnRfczAgKyAxKSAqIChwcy0+c3FydF9zMCArIDEpIDw9IHBzLT5zMCArIDIgKiBTSUVWRVNJWkUgLSAxKQorICAgIHBzLT5zcXJ0X3MwKys7CisKKyAgcGkgPSAoKHBzLT5zMCArIDMpIC8gMikgJSAzOworICBpZiAocGkgPiAwKQorICAgIHBpID0gMyAtIHBpOworICBpZiAocHMtPnMwICsgMiAqIHBpIDw9IDMpCisgICAgcGkgKz0gMzsKKyAgc3AgPSBwcy0+cyArIHBpOworICB3aGlsZSAoc3AgPCBwcy0+cyArIFNJRVZFU0laRSkKKyAgICB7CisgICAgICAqc3AgPSAxLCBzcCArPSAzOworICAgIH0KKworICBwaSA9ICgocHMtPnMwICsgNSkgLyAyKSAlIDU7CisgIGlmIChwaSA+IDApCisgICAgcGkgPSA1IC0gcGk7CisgIGlmIChwcy0+czAgKyAyICogcGkgPD0gNSkKKyAgICBwaSArPSA1OworICBzcCA9IHBzLT5zICsgcGk7CisgIHdoaWxlIChzcCA8IHBzLT5zICsgU0lFVkVTSVpFKQorICAgIHsKKyAgICAgICpzcCA9IDEsIHNwICs9IDU7CisgICAgfQorCisgIHBpID0gKChwcy0+czAgKyA3KSAvIDIpICUgNzsKKyAgaWYgKHBpID4gMCkKKyAgICBwaSA9IDcgLSBwaTsKKyAgaWYgKHBzLT5zMCArIDIgKiBwaSA8PSA3KQorICAgIHBpICs9IDc7CisgIHNwID0gcHMtPnMgKyBwaTsKKyAgd2hpbGUgKHNwIDwgcHMtPnMgKyBTSUVWRVNJWkUpCisgICAgeworICAgICAgKnNwID0gMSwgc3AgKz0gNzsKKyAgICB9CisKKyAgcCA9IDExOworICBhaSA9IDA7CisgIHdoaWxlIChwIDw9IHBzLT5zcXJ0X3MwKQorICAgIHsKKyAgICAgIHBpID0gKChwcy0+czAgKyBwKSAvIDIpICUgcDsKKyAgICAgIGlmIChwaSA+IDApCisJcGkgPSBwIC0gcGk7CisgICAgICBpZiAocHMtPnMwICsgMiAqIHBpIDw9IHApCisJICBwaSArPSBwOworICAgICAgc3AgPSBwcy0+cyArIHBpOworICAgICAgd2hpbGUgKHNwIDwgcHMtPnMgKyBTSUVWRVNJWkUpCisJeworCSAgKnNwID0gMSwgc3AgKz0gcDsKKwl9CisgICAgICBwICs9IGFkZHBbYWldOworICAgICAgYWkgPSAoYWkgKyAxKSAlIDQ4OworICAgIH0KKyAgcHMtPmQgPSAwOworICByZXR1cm4gZ21wX25leHRwcmltZSAocHMpOworfQorCit2b2lkCitnbXBfaW5pdF9wcmltZXNpZXZlIChnbXBfcHJpbWVzaWV2ZV90ICpwcykKK3sKKyAgcHMtPnMwID0gMDsKKyAgcHMtPnNxcnRfczAgPSAwOworICBwcy0+ZCA9IFNJRVZFU0laRTsKKyAgcHMtPnNbU0lFVkVTSVpFXSA9IDA7CQkvKiBzZW50aW5lbCAqLworfQpkaWZmIC0tZ2l0IGEvcGF0Y2hlcy9leGNlcHRpb25zLmRpZmYgYi9wYXRjaGVzL2V4Y2VwdGlvbnMuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZhNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGF0Y2hlcy9leGNlcHRpb25zLmRpZmYKQEAgLTAsMCArMSwzNDAgQEAKK01ha2UgR01QIGNvbXBpbGUgaW4gYSBub2V4Y2VwdCBlbnZpcm9ubWVudAorCitHTVAgdGhyb3dzIGV4Y2VwdGlvbnMgdG8gaW5kaWNhdGUgZXJyb3JzIGxpa2UgZmFpbGVkIGFsbG9jYXRpb24gb3IgbmVnYXRpdmUKK2ZhY3RvcmlhbHMuIENoYW5nZSB0aGVzZSB0byBwcmludCBhIHRlcnNlIGVycm9yIG1lc3NhZ2UgYW5kIFNJR0FCUlQuCisKK0lkZWFsbHksIHRoZXNlIHdvdWxkIGBMT0coRkFUQUwpYC4gSG93ZXZlciwgZ2l2aW5nIEdNUCBhbiBBYnNlaWwgZGVwZW5kZW5jeQorYnJlYWtzIEhhc2tlbGwgYmluYXJpZXMuIChUaGUgcHJvYmxlbWF0aWMgZGVwZW5kZW5jeSBjaGFpbiBhcHBlYXJzIHRvIGJlCitIYXNrZWxsIC0+IEdNUCAtPiBBYnNlaWwgLT4gbGlidW53aW5kLikgSW5zdGVhZCwganVzdCBsb2cgdXNpbmcgYHN0ZDo6Y2VycmAgYW5kCitjYWxsIGBzdGQ6OmFib3J0YDsgdGhlIGFibm9ybWFsIHRlcm1pbmF0aW9uIHdpbGwgdHJpZ2dlciBhIHN0YWNrIHRyYWNlIGluCitnb29nbGUzIGJpbmFyaWVzIGFueXdheS4KKworVGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2YgY2wvNTA5MTUyMjguCisKKy0tLSBhL2dtcHh4LmgKKysrKyBiL2dtcHh4LmgKK0BAIC0zOSw3ICszOSwxMiBAQCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworICNpbmNsdWRlIDx1dGlsaXR5PgorICNpbmNsdWRlIDxhbGdvcml0aG0+ICAvKiBzd2FwICovCisgI2luY2x1ZGUgPHN0cmluZz4KKysjaWZkZWYgX19FWENFUFRJT05TCisgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKysjZWxzZQorKyNpbmNsdWRlIDxjc3RkbGliPgorKyNpbmNsdWRlIDxpb3N0cmVhbT4KKysjZW5kaWYKKyAjaW5jbHVkZSA8Y2Zsb2F0PgorICNpbmNsdWRlIDxnbXAuaD4KKyAKK0BAIC0xMjQwLDcgKzEyNDUsMTQgQEAgc3RydWN0IF9fZ21wX2ZhY19mdW5jdGlvbgorICAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIHNpZ25lZCBsb25nIGwpCisgICB7CisgICAgIGlmIChsIDwgMCkKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IgKCJmYWN0b3JpYWwobmVnYXRpdmUpIik7CisrI2Vsc2UKKysgICAgICB7CisrICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6ZG9tYWluX2Vycm9yOiBmYWN0b3JpYWwobmVnYXRpdmUpXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgZXZhbCh6LCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihsKSk7CisgICB9CisgICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KQorQEAgLTEyNDgsOSArMTI2MCwyMyBAQCBzdHJ1Y3QgX19nbXBfZmFjX2Z1bmN0aW9uCisgICAgIGlmICghbXB6X2ZpdHNfdWxvbmdfcCh3KSkKKyAgICAgICB7CisgCWlmIChtcHpfc2duKHcpIDwgMCkKKysjaWZkZWYgX19FWENFUFRJT05TCisgCSAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IgKCJmYWN0b3JpYWwobmVnYXRpdmUpIik7CisrI2Vsc2UKKysgICAgICAgICB7CisrCSAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6ZG9tYWluX2Vycm9yOiBmYWN0b3JpYWwobmVnYXRpdmUpXG4iOworKyAgICAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgICAgIH0KKysjZW5kaWYKKyAJZWxzZQorKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOyAvLyBvciBzdGQ6Om92ZXJmbG93X2Vycm9yICgiZmFjdG9yaWFsIik/CisrI2Vsc2UKKysgICAgICAgICB7CisrCSAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6YmFkX2FsbG9jXG4iOworKyAgICAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgICAgIH0KKysjZW5kaWYKKyAgICAgICB9CisgICAgIGV2YWwoeiwgbXB6X2dldF91aSh3KSk7CisgICB9CitAQCAtMTI2NCw3ICsxMjkwLDE0IEBAIHN0cnVjdCBfX2dtcF9wcmltb3JpYWxfZnVuY3Rpb24KKyAgIHN0YXRpYyB2b2lkIGV2YWwobXB6X3B0ciB6LCBzaWduZWQgbG9uZyBsKQorICAgeworICAgICBpZiAobCA8IDApCisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yICgicHJpbW9yaWFsKG5lZ2F0aXZlKSIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmRvbWFpbl9lcnJvcjogcHJpbW9yaWFsKG5lZ2F0aXZlKVxuIjsKKysgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICB9CisrI2VuZGlmCisgICAgIGV2YWwoeiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obCkpOworICAgfQorICAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIG1wel9zcmNwdHIgdykKK0BAIC0xMjcyLDkgKzEzMDUsMjMgQEAgc3RydWN0IF9fZ21wX3ByaW1vcmlhbF9mdW5jdGlvbgorICAgICBpZiAoIW1wel9maXRzX3Vsb25nX3AodykpCisgICAgICAgeworIAlpZiAobXB6X3Nnbih3KSA8IDApCisrI2lmZGVmIF9fRVhDRVBUSU9OUworIAkgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yICgicHJpbW9yaWFsKG5lZ2F0aXZlKSIpOworKyNlbHNlCisrICAgICAgICAgeworKwkgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmRvbWFpbl9lcnJvcjogcHJpbW9yaWFsKG5lZ2F0aXZlKVxuIjsKKysgICAgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICAgICB9CisrI2VuZGlmCisgCWVsc2UKKysjaWZkZWYgX19FWENFUFRJT05TCisgCSAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsgLy8gb3Igc3RkOjpvdmVyZmxvd19lcnJvciAoInByaW1vcmlhbCIpPworKyNlbHNlCisrICAgICAgICAgeworKwkgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmJhZF9hbGxvY1xuIjsKKysgICAgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICAgICB9CisrI2VuZGlmCisgICAgICAgfQorICAgICBldmFsKHosIG1wel9nZXRfdWkodykpOworICAgfQorQEAgLTEyOTksNyArMTM0NiwxNCBAQCBzdHJ1Y3QgX19nbXBfZmliX2Z1bmN0aW9uCisgICBzdGF0aWMgdm9pZCBldmFsKG1wel9wdHIgeiwgbXB6X3NyY3B0ciB3KQorICAgeworICAgICBpZiAoIW1wel9maXRzX3Nsb25nX3AodykpCisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7IC8vIG9yIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgKCJmaWJvbmFjY2kiKT8KKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjpiYWRfYWxsb2NcbiI7CisrICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgfQorKyNlbmRpZgorICAgICBldmFsKHosIG1wel9nZXRfc2kodykpOworICAgfQorICAgc3RhdGljIHZvaWQgZXZhbChtcHpfcHRyIHosIGRvdWJsZSBkKQorQEAgLTE2NTAsNyArMTcwNCwxNCBAQCBwdWJsaWM6CisgICAgIGlmIChtcHpfaW5pdF9zZXRfc3RyIChtcCwgcywgYmFzZSkgIT0gMCkKKyAgICAgICB7CisgICAgICAgICBtcHpfY2xlYXIgKG1wKTsKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHpfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgICB7CisrICAgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHpfc2V0X3N0clxuIjsKKysgICAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgICAgfQorKyNlbmRpZgorICAgICAgIH0KKyAgIH0KKyAgIGV4cGxpY2l0IF9fZ21wX2V4cHIoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIGludCBiYXNlID0gMCkKK0BAIC0xNjU4LDcgKzE3MTksMTQgQEAgcHVibGljOgorICAgICBpZiAobXB6X2luaXRfc2V0X3N0cihtcCwgcy5jX3N0cigpLCBiYXNlKSAhPSAwKQorICAgICAgIHsKKyAgICAgICAgIG1wel9jbGVhciAobXApOworKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wel9zZXRfc3RyIik7CisrI2Vsc2UKKysgICAgICAgIHsKKysgICAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wel9zZXRfc3RyXG4iOworKyAgICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgICB9CisrI2VuZGlmCisgICAgICAgfQorICAgfQorIAorQEAgLTE2ODUsMTMgKzE3NTMsMjcgQEAgcHVibGljOgorICAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBjaGFyICpzKQorICAgeworICAgICBpZiAobXB6X3NldF9zdHIgKG1wLCBzLCAwKSAhPSAwKQorKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHpfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wel9zZXRfc3RyXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgcmV0dXJuICp0aGlzOworICAgfQorICAgX19nbXBfZXhwciAmIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmcykKKyAgIHsKKyAgICAgaWYgKG1wel9zZXRfc3RyKG1wLCBzLmNfc3RyKCksIDApICE9IDApCisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wel9zZXRfc3RyIik7CisrI2Vsc2UKKysgICAgICB7CisrICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6aW52YWxpZF9hcmd1bWVudDogbXB6X3NldF9zdHJcbiI7CisrICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgfQorKyNlbmRpZgorICAgICByZXR1cm4gKnRoaXM7CisgICB9CisgCitAQCAtMTgyOCw3ICsxOTEwLDE0IEBAIHB1YmxpYzoKKyAgICAgZWxzZSBpZiAobXBxX3NldF9zdHIobXAsIHMsIGJhc2UpICE9IDApCisgICAgICAgeworICAgICAgICAgbXBxX2NsZWFyIChtcCk7CisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBxX3NldF9zdHIiKTsKKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHFfc2V0X3N0clxuIjsKKysgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICB9CisrI2VuZGlmCisgICAgICAgfQorICAgfQorICAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCBzdGQ6OnN0cmluZyAmcywgaW50IGJhc2UgPSAwKQorQEAgLTE4MzcsNyArMTkyNiwxNCBAQCBwdWJsaWM6CisgICAgIGlmIChtcHFfc2V0X3N0ciAobXAsIHMuY19zdHIoKSwgYmFzZSkgIT0gMCkKKyAgICAgICB7CisgICAgICAgICBtcHFfY2xlYXIgKG1wKTsKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHFfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wcV9zZXRfc3RyXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgICB9CisgICB9CisgICBleHBsaWNpdCBfX2dtcF9leHByKG1wcV9zcmNwdHIgcSkKK0BAIC0xODc0LDEzICsxOTcwLDI3IEBAIHB1YmxpYzoKKyAgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oY29uc3QgY2hhciAqcykKKyAgIHsKKyAgICAgaWYgKG1wcV9zZXRfc3RyIChtcCwgcywgMCkgIT0gMCkKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBxX3NldF9zdHIiKTsKKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcHFfc2V0X3N0clxuIjsKKysgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICB9CisrI2VuZGlmCisgICAgIHJldHVybiAqdGhpczsKKyAgIH0KKyAgIF9fZ21wX2V4cHIgJiBvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcgJnMpCisgICB7CisgICAgIGlmIChtcHFfc2V0X3N0cihtcCwgcy5jX3N0cigpLCAwKSAhPSAwKQorKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcHFfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wcV9zZXRfc3RyXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgcmV0dXJuICp0aGlzOworICAgfQorIAorQEAgLTIwMzgsNyArMjE0OCwxNCBAQCBwdWJsaWM6CisgICAgIGlmIChtcGZfaW5pdF9zZXRfc3RyIChtcCwgcywgMCkgIT0gMCkKKyAgICAgICB7CisgICAgICAgICBtcGZfY2xlYXIgKG1wKTsKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcGZfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wZl9zZXRfc3RyXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgICB9CisgICB9CisgICBfX2dtcF9leHByKGNvbnN0IGNoYXIgKnMsIG1wX2JpdGNudF90IHByZWMsIGludCBiYXNlID0gMCkKK0BAIC0yMDQ3LDcgKzIxNjQsMTQgQEAgcHVibGljOgorICAgICBpZiAobXBmX3NldF9zdHIobXAsIHMsIGJhc2UpICE9IDApCisgICAgICAgeworICAgICAgICAgbXBmX2NsZWFyIChtcCk7CisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBmX3NldF9zdHIiKTsKKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcGZfc2V0X3N0clxuIjsKKysgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICB9CisrI2VuZGlmCisgICAgICAgfQorICAgfQorICAgZXhwbGljaXQgX19nbXBfZXhwcihjb25zdCBzdGQ6OnN0cmluZyAmcykKK0BAIC0yMDU1LDcgKzIxNzksMTQgQEAgcHVibGljOgorICAgICBpZiAobXBmX2luaXRfc2V0X3N0cihtcCwgcy5jX3N0cigpLCAwKSAhPSAwKQorICAgICAgIHsKKyAgICAgICAgIG1wZl9jbGVhciAobXApOworKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wZl9zZXRfc3RyIik7CisrI2Vsc2UKKysgICAgICB7CisrICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6aW52YWxpZF9hcmd1bWVudDogbXBmX3NldF9zdHJcbiI7CisrICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgfQorKyNlbmRpZgorICAgICAgIH0KKyAgIH0KKyAgIF9fZ21wX2V4cHIoY29uc3Qgc3RkOjpzdHJpbmcgJnMsIG1wX2JpdGNudF90IHByZWMsIGludCBiYXNlID0gMCkKK0BAIC0yMDY0LDcgKzIxOTUsMTQgQEAgcHVibGljOgorICAgICBpZiAobXBmX3NldF9zdHIobXAsIHMuY19zdHIoKSwgYmFzZSkgIT0gMCkKKyAgICAgICB7CisgICAgICAgICBtcGZfY2xlYXIgKG1wKTsKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQgKCJtcGZfc2V0X3N0ciIpOworKyNlbHNlCisrICAgICAgeworKyAgICAgICAgc3RkOjpjZXJyIDw8ICJzdGQ6OmludmFsaWRfYXJndW1lbnQ6IG1wZl9zZXRfc3RyXG4iOworKyAgICAgICAgc3RkOjphYm9ydCgpOworKyAgICAgIH0KKysjZW5kaWYKKyAgICAgICB9CisgICB9CisgCitAQCAtMjA5MywxMyArMjIzMSwyNyBAQCBwdWJsaWM6CisgICBfX2dtcF9leHByICYgb3BlcmF0b3I9KGNvbnN0IGNoYXIgKnMpCisgICB7CisgICAgIGlmIChtcGZfc2V0X3N0ciAobXAsIHMsIDApICE9IDApCisrI2lmZGVmIF9fRVhDRVBUSU9OUworICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIm1wZl9zZXRfc3RyIik7CisrI2Vsc2UKKysgICAgICB7CisrICAgICAgICBzdGQ6OmNlcnIgPDwgInN0ZDo6aW52YWxpZF9hcmd1bWVudDogbXBmX3NldF9zdHJcbiI7CisrICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgfQorKyNlbmRpZgorICAgICByZXR1cm4gKnRoaXM7CisgICB9CisgICBfX2dtcF9leHByICYgb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZzKQorICAgeworICAgICBpZiAobXBmX3NldF9zdHIobXAsIHMuY19zdHIoKSwgMCkgIT0gMCkKKysjaWZkZWYgX19FWENFUFRJT05TCisgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICgibXBmX3NldF9zdHIiKTsKKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjppbnZhbGlkX2FyZ3VtZW50OiBtcGZfc2V0X3N0clxuIjsKKysgICAgICAgIHN0ZDo6YWJvcnQoKTsKKysgICAgICB9CisrI2VuZGlmCisgICAgIHJldHVybiAqdGhpczsKKyAgIH0KKyAKK0BAIC0zNTA1LDcgKzM2NTcsMTQgQEAgcHVibGljOgorIAkJbXBfYml0Y250X3Qgc2l6ZSkKKyAgIHsKKyAgICAgaWYgKGYgKHN0YXRlLCBzaXplKSA9PSAwKQorKyNpZmRlZiBfX0VYQ0VQVElPTlMKKyAgICAgICB0aHJvdyBzdGQ6Omxlbmd0aF9lcnJvciAoImdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUiKTsKKysjZWxzZQorKyAgICAgIHsKKysgICAgICAgIHN0ZDo6Y2VyciA8PCAic3RkOjpsZW5ndGhfZXJyb3I6IGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemVcbiI7CisrICAgICAgICBzdGQ6OmFib3J0KCk7CisrICAgICAgfQorKyNlbmRpZgorICAgfQorIAorICAgfmdtcF9yYW5kY2xhc3MoKSB7IGdtcF9yYW5kY2xlYXIoc3RhdGUpOyB9CmRpZmYgLS1naXQgYS9wYXRjaGVzL292ZXJmbG93LmRpZmYgYi9wYXRjaGVzL292ZXJmbG93LmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwYmY1NAotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoZXMvb3ZlcmZsb3cuZGlmZgpAQCAtMCwwICsxLDIyIEBACitGaXggaW5jb3JyZWN0IG92ZXJmbG93IHRlc3QsIHRoYXQgaXRzZWxmIG92ZXJmbG93ZWQuCisKKyIodW5zaWduZWQgbG9uZykoeCAqIHkpIiB3aWxsIG11bHRpcGx5IGludHMgeCBhbmQgeSBpbnRvIGEgbmV3IGludCwgdGhlbgorY29udmVydHMgdGhlIGludCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcuIFJlcGxhY2UgaXQgd2l0aAorIih1bnNpZ25lZCBsb25nKSh4KSAqICh1bnNpZ25lZCBsb25nKSh5KSIgd2hpY2ggcGVyZm9ybXMgdGhlIG11bHRpcGxpY2F0aW9uIGluIGEKK2xhcmdlciBzcGFjZS4KKworQ29udmVydGVkIGZyb20gY2wvMTQ3MDg4Njc3LgorCistLS0gYS9tcG4vZ2VuZXJpYy9nZXRfZC5jCisrKysgYi9tcG4vZ2VuZXJpYy9nZXRfZC5jCitAQCAtMTUxLDggKzE1MSw4IEBAIG1wbl9nZXRfZCAobXBfc3JjcHRyIHVwLCBtcF9zaXplX3Qgc2l6ZSwKKyAgIC8qIEFkanVzdCBleHAgdG8gYSByYWRpeCBwb2ludCBqdXN0IGFib3ZlIHt1cCxzaXplfSwgZ3VhcmRpbmcgYWdhaW5zdAorICAgICAgb3ZlcmZsb3cuICBBZnRlciB0aGlzIGV4cCBjYW4gb2YgY291cnNlIGJlIHJlZHVjZWQgdG8gYW55d2hlcmUgd2l0aGluCisgICAgICB0aGUge3VwLHNpemV9IHJlZ2lvbiB3aXRob3V0IHVuZGVyZmxvdy4gICovCistICBpZiAoVU5MSUtFTFkgKCh1bnNpZ25lZCBsb25nKSAoR01QX05VTUJfQklUUyAqIHNpemUpCistCQk+ICgodW5zaWduZWQgbG9uZykgTE9OR19NQVggLSBleHApKSkKKysgIGlmIChVTkxJS0VMWSAoKHVuc2lnbmVkIGxvbmcpIChHTVBfTlVNQl9CSVRTKSAqICh1bnNpZ25lZCBsb25nKSAoc2l6ZSkKKysJCT4gKExPTkdfTUFYIC0gKHVuc2lnbmVkIGxvbmcpIGV4cCkpKQorICAgICB7CisgI2lmIF9HTVBfSUVFRV9GTE9BVFMKKyAgICAgICBnb3RvIGllZWVfaW5maW5pdHk7CmRpZmYgLS1naXQgYS9wYXRjaGVzL3NlcmllcyBiL3BhdGNoZXMvc2VyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWIwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaGVzL3NlcmllcwpAQCAtMCwwICsxLDIgQEAKK2V4Y2VwdGlvbnMuZGlmZgorb3ZlcmZsb3cuZGlmZgpkaWZmIC0tZ2l0IGEvcHJpbWVzaWV2ZS5jIGIvcHJpbWVzaWV2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2N2ZhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9wcmltZXNpZXZlLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qIHByaW1lc2lldmUgKEJJVF9BUlJBWSwgTikgLS0gRmlsbHMgdGhlIEJJVF9BUlJBWSB3aXRoIGEgbWFzayBmb3IgcHJpbWVzIHVwIHRvIE4uCisKK0NvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCitUSEUgRlVOQ1RJT04gSU4gVEhJUyBGSUxFIElTIElOVEVSTkFMIFdJVEggQSBNVVRBQkxFIElOVEVSRkFDRS4KK0lUIElTIE9OTFkgU0FGRSBUTyBSRUFDSCBJVCBUSFJPVUdIIERPQ1VNRU5URUQgSU5URVJGQUNFUy4KK0lOIEZBQ1QsIElUIElTIEFMTU9TVCBHVUFSQU5URUVEIFRIQVQgSVQgV0lMTCBDSEFOR0UgT1IKK0RJU0FQUEVBUiBJTiBBIEZVVFVSRSBHTlUgTVAgUkVMRUFTRS4KKworQ29weXJpZ2h0IDIwMTAtMjAxMiwgMjAxNSwgMjAxNiwgMjAyMSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZiAwCitzdGF0aWMgbXBfbGltYl90CitiaXRfdG9fbiAobXBfbGltYl90IGJpdCkgeyByZXR1cm4gKGJpdCozKzQpfDE7IH0KKyNlbmRpZgorCisvKiBpZF90b19uICh4KSA9IGJpdF90b19uICh4LTEpID0gKGlkKjMrMSl8MSovCitzdGF0aWMgbXBfbGltYl90CitpZF90b19uICAobXBfbGltYl90IGlkKSAgeyByZXR1cm4gaWQqMysxKyhpZCYxKTsgfQorCisvKiBuX2Z0b19iaXQgKG4pID0gKChuLTEpJigtQ05TVF9MSU1CKDIpKSkvM1UtMSAqLworc3RhdGljIG1wX2xpbWJfdAorbl9mdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKChuLTUpfDEpLzNVOyB9CisKKy8qIG5fY3RvX2JpdCAobikgPSAoKG4tMikmKC1DTlNUX0xJTUIoMikpKS8zVSAqLworc3RhdGljIG1wX2xpbWJfdAorbl9jdG9fYml0IChtcF9saW1iX3QgbikgeyByZXR1cm4gKG58MSkvM1UtMTsgfQorCisjaWYgMAorc3RhdGljIG1wX3NpemVfdAorcHJpbWVzaWV2ZV9zaXplIChtcF9saW1iX3QgbikgeyByZXR1cm4gbl9mdG9fYml0KG4pIC8gR01QX0xJTUJfQklUUyArIDE7IH0KKyNlbmRpZgorCisjZGVmaW5lIFNFVF9PRkYxKG0xLCBtMiwgTTEsIE0yLCBvZmYsIEJJVFMpCQlcCisgIGlmIChvZmYpIHsJCQkJCQlcCisgICAgaWYgKG9mZiA8IEdNUF9MSU1CX0JJVFMpIHsJCQkJXAorICAgICAgbTEgPSAoTTEgPj4gb2ZmKSB8IChNMiA8PCAoR01QX0xJTUJfQklUUyAtIG9mZikpOwlcCisgICAgICBpZiAob2ZmIDw9IEJJVFMgLSBHTVBfTElNQl9CSVRTKSB7CQlcCisJbTIgPSBNMSA8PCAoQklUUyAtIEdNUF9MSU1CX0JJVFMgLSBvZmYpCQlcCisJICB8IE0yID4+IG9mZjsJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJXAorCW0xIHw9IE0xIDw8IChCSVRTIC0gb2ZmKTsJCQlcCisJbTIgPSBNMSA+PiAob2ZmICsgR01QX0xJTUJfQklUUyAtIEJJVFMpOwlcCisgICAgICB9CQkJCQkJCVwKKyAgICB9IGVsc2UgewkJCQkJCVwKKyAgICAgIG0xID0gTTEgPDwgKEJJVFMgLSBvZmYpCQkJCVwKKwl8IE0yID4+IChvZmYgLSBHTVBfTElNQl9CSVRTKTsJCQlcCisgICAgICBtMiA9IE0yIDw8IChCSVRTIC0gb2ZmKQkJCQlcCisJfCBNMSA+PiAob2ZmICsgR01QX0xJTUJfQklUUyAtIEJJVFMpOwkJXAorICAgIH0JCQkJCQkJXAorICB9IGVsc2UgewkJCQkJCVwKKyAgICBtMSA9IE0xOyBtMiA9IE0yOwkJCQkJXAorICB9CisKKyNkZWZpbmUgU0VUX09GRjIobTEsIG0yLCBtMywgTTEsIE0yLCBNMywgb2ZmLCBCSVRTKQlcCisgIGlmIChvZmYpIHsJCQkJCQlcCisgICAgaWYgKG9mZiA8PSBHTVBfTElNQl9CSVRTKSB7CQkJCVwKKyAgICAgIG0xID0gTTIgPDwgKEdNUF9MSU1CX0JJVFMgLSBvZmYpOwkJCVwKKyAgICAgIG0yID0gTTMgPDwgKEdNUF9MSU1CX0JJVFMgLSBvZmYpOwkJCVwKKyAgICAgIGlmIChvZmYgIT0gR01QX0xJTUJfQklUUykgewkJCVwKKwltMSB8PSAoTTEgPj4gb2ZmKTsJCQkJXAorCW0yIHw9IChNMiA+PiBvZmYpOwkJCQlcCisgICAgICB9CQkJCQkJCVwKKyAgICAgIGlmIChvZmYgPD0gQklUUyAtIDIgKiBHTVBfTElNQl9CSVRTKSB7CQlcCisJbTMgPSBNMSA8PCAoQklUUyAtIDIgKiBHTVBfTElNQl9CSVRTIC0gb2ZmKQlcCisJICB8IE0zID4+IG9mZjsJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJXAorCW0yIHw9IE0xIDw8IChCSVRTIC0gR01QX0xJTUJfQklUUyAtIG9mZik7CVwKKwltMyA9IE0xID4+IChvZmYgKyAyICogR01QX0xJTUJfQklUUyAtIEJJVFMpOwlcCisgICAgICB9CQkJCQkJCVwKKyAgICB9IGVsc2UgaWYgKG9mZiA8IDIgKkdNUF9MSU1CX0JJVFMpIHsJCVwKKyAgICAgIG0xID0gTTIgPj4gKG9mZiAtIEdNUF9MSU1CX0JJVFMpCQkJXAorCXwgTTMgPDwgKDIgKiBHTVBfTElNQl9CSVRTIC0gb2ZmKTsJCVwKKyAgICAgIGlmIChvZmYgPD0gQklUUyAtIEdNUF9MSU1CX0JJVFMpIHsJCVwKKwltMiA9IE0zID4+IChvZmYgLSBHTVBfTElNQl9CSVRTKQkJXAorCSAgfCBNMSA8PCAoQklUUyAtIEdNUF9MSU1CX0JJVFMgLSBvZmYpOwkJXAorCW0zID0gTTIgPDwgKEJJVFMgLSBHTVBfTElNQl9CSVRTIC0gb2ZmKTsJXAorCWlmIChvZmYgIT0gQklUUyAtIEdNUF9MSU1CX0JJVFMpIHsJCVwKKwkgIG0zIHw9IE0xID4+IChvZmYgKyAyICogR01QX0xJTUJfQklUUyAtIEJJVFMpOwlcCisJfQkJCQkJCVwKKyAgICAgIH0gZWxzZSB7CQkJCQkJXAorCW0xIHw9IE0xIDw8IChCSVRTIC0gb2ZmKTsJCQlcCisJbTIgPSBNMiA8PCAoQklUUyAtIG9mZikJCQkJXAorCSAgfCBNMSA+PiAoR01QX0xJTUJfQklUUyAtIEJJVFMgKyBvZmYpOwkJXAorCW0zID0gTTIgPj4gKEdNUF9MSU1CX0JJVFMgLSBCSVRTICsgb2ZmKTsJXAorICAgICAgfQkJCQkJCQlcCisgICAgfSBlbHNlIHsJCQkJCQlcCisgICAgICBtMSA9IE0xIDw8IChCSVRTIC0gb2ZmKQkJCQlcCisJfCBNMyA+PiAob2ZmIC0gMiAqIEdNUF9MSU1CX0JJVFMpOwkJXAorICAgICAgbTIgPSBNMiA8PCAoQklUUyAtIG9mZikJCQkJXAorCXwgTTEgPj4gKG9mZiArIEdNUF9MSU1CX0JJVFMgLSBCSVRTKTsJCVwKKyAgICAgIG0zID0gTTMgPDwgKEJJVFMgLSBvZmYpCQkJCVwKKwl8IE0yID4+IChvZmYgKyBHTVBfTElNQl9CSVRTIC0gQklUUyk7CQlcCisgICAgfQkJCQkJCQlcCisgIH0gZWxzZSB7CQkJCQkJXAorICAgIG0xID0gTTE7IG0yID0gTTI7IG0zID0gTTM7CQkJCVwKKyAgfQorCisjZGVmaW5lIFJPVEFURTEobTEsIG0yLCBCSVRTKQkJCVwKKyAgZG8gewkJCQkJCVwKKyAgICBtcF9saW1iX3QgX190bXA7CQkJCVwKKyAgICBfX3RtcCA9IG0xID4+ICgyICogR01QX0xJTUJfQklUUyAtIEJJVFMpOwlcCisgICAgbTEgPSAobTEgPDwgKEJJVFMgLSBHTVBfTElNQl9CSVRTKSkgfCBtMjsJXAorICAgIG0yID0gX190bXA7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUk9UQVRFMihtMSwgbTIsIG0zLCBCSVRTKQkJXAorICBkbyB7CQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX3RtcDsJCQkJXAorICAgIF9fdG1wID0gbTIgPj4gKDMgKiBHTVBfTElNQl9CSVRTIC0gQklUUyk7CVwKKyAgICBtMiA9IG0yIDw8IChCSVRTIC0gR01QX0xJTUJfQklUUyAqIDIpCVwKKyAgICAgIHwgbTEgPj4gKDMgKiBHTVBfTElNQl9CSVRTIC0gQklUUyk7CVwKKyAgICBtMSA9IG0xIDw8IChCSVRTIC0gR01QX0xJTUJfQklUUyAqIDIpIHwgbTM7CVwKKyAgICBtMyA9IF9fdG1wOwkJCQkJXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgbXBfbGltYl90CitmaWxsX2JpdHBhdHRlcm4gKG1wX3B0ciBiaXRfYXJyYXksIG1wX3NpemVfdCBsaW1icywgbXBfbGltYl90IG9mZnNldCkKK3sKKyNpZmRlZiBTSUVWRV8yTVNLMgorICBtcF9saW1iX3QgbTExLCBtMTIsIG0yMSwgbTIyLCBtMjM7CisKKyAgeyAvKiBjb3JyZWN0bHkgaGFuZGxlIG9mZnNldCA9PSAwLi4uICovCisgICAgbXBfbGltYl90IG9mZjEgPSBvZmZzZXQgJSAoMTEgKiA1ICogMik7CisgICAgU0VUX09GRjEgKG0xMSwgbTEyLCBTSUVWRV9NQVNLMSwgU0lFVkVfTUFTS1QsIG9mZjEsIDExICogNSAqIDIpOworICAgIG9mZnNldCAlPSAxMyAqIDcgKiAyOworICAgIFNFVF9PRkYyIChtMjEsIG0yMiwgbTIzLCBTSUVWRV8yTVNLMSwgU0lFVkVfMk1TSzIsIFNJRVZFXzJNU0tULCBvZmZzZXQsIDEzICogNyAqIDIpOworICB9CisgIC8qIFRISU5LOiBDb25zaWRlciBoYW5kbGluZyBvZGQgdmFsdWVzIG9mICdsaW1icycgb3V0c2lkZSB0aGUgbG9vcCwKKyAgICAgdG8gaGF2ZSBhIHNpbmdsZSBleGl0IGNvbmRpdGlvbi4gKi8KKyAgZG8geworICAgIGJpdF9hcnJheVswXSA9IG0xMSB8IG0yMTsKKyAgICBpZiAoLS1saW1icyA9PSAwKQorICAgICAgYnJlYWs7CisgICAgUk9UQVRFMSAobTExLCBtMTIsIDExICogNSAqIDIpOworICAgIGJpdF9hcnJheVsxXSA9IG0xMSB8IG0yMjsKKyAgICBiaXRfYXJyYXkgKz0gMjsKKyAgICBST1RBVEUxIChtMTEsIG0xMiwgMTEgKiA1ICogMik7CisgICAgUk9UQVRFMiAobTIxLCBtMjIsIG0yMywgMTMgKiA3ICogMik7CisgIH0gd2hpbGUgKC0tbGltYnMgIT0gMCk7CisgIHJldHVybiBuX2N0b19iaXQgKDEzICsgMSk7CisjZWxzZQorI2lmZGVmIFNJRVZFX01BU0syCisgIG1wX2xpbWJfdCBtYXNrLCBtYXNrMiwgdGFpbDsKKworICB7IC8qIGNvcnJlY3RseSBoYW5kbGUgb2Zmc2V0ID09IDAuLi4gKi8KKyAgICBvZmZzZXQgJT0gNyAqIDUgKiAyOworICAgIFNFVF9PRkYyIChtYXNrLCBtYXNrMiwgdGFpbCwgU0lFVkVfTUFTSzEsIFNJRVZFX01BU0syLCBTSUVWRV9NQVNLVCwgb2Zmc2V0LCA3ICogNSAqIDIpOworICB9CisgIC8qIFRISU5LOiBDb25zaWRlciBoYW5kbGluZyBvZGQgdmFsdWVzIG9mICdsaW1icycgb3V0c2lkZSB0aGUgbG9vcCwKKyAgICAgdG8gaGF2ZSBhIHNpbmdsZSBleGl0IGNvbmRpdGlvbi4gKi8KKyAgZG8geworICAgIGJpdF9hcnJheVswXSA9IG1hc2s7CisgICAgaWYgKC0tbGltYnMgPT0gMCkKKyAgICAgIGJyZWFrOworICAgIGJpdF9hcnJheVsxXSA9IG1hc2syOworICAgIGJpdF9hcnJheSArPSAyOworICAgIFJPVEFURTIgKG1hc2ssIG1hc2syLCB0YWlsLCA3ICogNSAqIDIpOworICB9IHdoaWxlICgtLWxpbWJzICE9IDApOworICByZXR1cm4gbl9jdG9fYml0ICg3ICsgMSk7CisjZWxzZQorICBNUE5fRklMTCAoYml0X2FycmF5LCBsaW1icywgQ05TVF9MSU1CKDApKTsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYmxvY2tfcmVzaWV2ZSAobXBfcHRyIGJpdF9hcnJheSwgbXBfc2l6ZV90IGxpbWJzLCBtcF9saW1iX3Qgb2Zmc2V0LAorCSAgICAgICBtcF9zcmNwdHIgc2lldmUpCit7CisgIG1wX3NpemVfdCBiaXRzLCBvZmYgPSBvZmZzZXQ7CisgIG1wX2xpbWJfdCBtYXNrLCBpOworCisgIEFTU0VSVCAobGltYnMgPiAwKTsKKworICBiaXRzID0gbGltYnMgKiBHTVBfTElNQl9CSVRTIC0gMTsKKworICBpID0gZmlsbF9iaXRwYXR0ZXJuIChiaXRfYXJyYXksIGxpbWJzLCBvZmZzZXQpOworCisgIEFTU0VSVCAoaSA8IEdNUF9MSU1CX0JJVFMpOworCisgIG1hc2sgPSBDTlNUX0xJTUIoMSkgPDwgaTsKKyAgZG8geworICAgICsraTsKKyAgICBpZiAoKCpzaWV2ZSAmIG1hc2spID09IDApCisgICAgICB7CisJbXBfc2l6ZV90IHN0ZXAsIGxpbmRleDsKKwltcF9saW1iX3QgbG1hc2s7CisJdW5zaWduZWQgIG1hc2tyb3Q7CisKKwlzdGVwID0gaWRfdG9fbihpKTsKKworLyoJbGluZGV4ID0gbl90b19iaXQoaWRfdG9fbihpKSppZF90b19uKGkpKTsgKi8KKwlsaW5kZXggPSBpKihzdGVwKzEpLTErKC0oaSYxKSYoaSsxKSk7CisvKglsaW5kZXggPSBpKihzdGVwKzErKGkmMSkpLTErKGkmMSk7ICovCisJaWYgKGxpbmRleCA+IGJpdHMgKyBvZmYpCisJICBicmVhazsKKworCXN0ZXAgPDw9IDE7CisJbWFza3JvdCA9IHN0ZXAgJSBHTVBfTElNQl9CSVRTOworCisJaWYgKGxpbmRleCA8IG9mZikKKwkgIGxpbmRleCArPSBzdGVwICogKChvZmYgLSBsaW5kZXggLSAxKSAvIHN0ZXAgKyAxKTsKKworCWxpbmRleCAtPSBvZmY7CisKKwlsbWFzayA9IENOU1RfTElNQigxKSA8PCAobGluZGV4ICUgR01QX0xJTUJfQklUUyk7CisJZm9yICggOyBsaW5kZXggPD0gYml0czsgbGluZGV4ICs9IHN0ZXApIHsKKwkgIGJpdF9hcnJheVtsaW5kZXggLyBHTVBfTElNQl9CSVRTXSB8PSBsbWFzazsKKwkgIGxtYXNrID0gbG1hc2sgPDwgbWFza3JvdCB8IGxtYXNrID4+IChHTVBfTElNQl9CSVRTIC0gbWFza3JvdCk7CisJfTsKKworLyoJbGluZGV4ID0gbl90b19iaXQoaWRfdG9fbihpKSpiaXRfdG9fbihpKSk7ICovCisJbGluZGV4ID0gaSooaSozKzYpKyhpJjEpOworCisJaWYgKGxpbmRleCA8IG9mZikKKwkgIGxpbmRleCArPSBzdGVwICogKChvZmYgLSBsaW5kZXggLSAxKSAvIHN0ZXAgKyAxKTsKKworCWxpbmRleCAtPSBvZmY7CisKKwlsbWFzayA9IENOU1RfTElNQigxKSA8PCAobGluZGV4ICUgR01QX0xJTUJfQklUUyk7CisJZm9yICggOyBsaW5kZXggPD0gYml0czsgbGluZGV4ICs9IHN0ZXApIHsKKwkgIGJpdF9hcnJheVtsaW5kZXggLyBHTVBfTElNQl9CSVRTXSB8PSBsbWFzazsKKwkgIGxtYXNrID0gbG1hc2sgPDwgbWFza3JvdCB8IGxtYXNrID4+IChHTVBfTElNQl9CSVRTIC0gbWFza3JvdCk7CisJfTsKKyAgICAgIH0KKyAgICAgIG1hc2sgPSBtYXNrIDw8IDEgfCBtYXNrID4+IChHTVBfTElNQl9CSVRTLTEpOworICAgICAgc2lldmUgKz0gbWFzayAmIDE7CisgIH0gd2hpbGUgKDEpOworfQorCisjZGVmaW5lIEJMT0NLX1NJWkUgMjA0OAorCisvKiBGaWxscyBiaXRfYXJyYXkgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgZnVuY3Rpb24gb2YgY29tcG9zaXRlCisgICBudW1iZXJzIHVwIHRvIHRoZSBwYXJhbWV0ZXIgbi4gSS5lLiBhIGJpdCBzZXQgdG8gIjEiIHJlcHJlc2VudHMgYQorICAgY29tcG9zaXRlLCBhICIwIiByZXByZXNlbnRzIGEgcHJpbWUuCisKKyAgIFRoZSBwcmltZXNpZXZlX3NpemUobikgbGltYnMgcG9pbnRlZCB0byBieSBiaXRfYXJyYXkgYXJlCisgICBvdmVyd3JpdHRlbi4gVGhlIHJldHVybmVkIHZhbHVlIGNvdW50cyBwcmltZSBpbnRlZ2VycyBpbiB0aGUKKyAgIGludGVydmFsIFs0LCBuXS4gTm90ZSB0aGF0IG4gPiA0LgorCisgICBFdmVuIG51bWJlcnMgYW5kIG11bHRpcGxlcyBvZiAzIGFyZSBleGNsdWRlZCAiYSBwcmlvcmkiLCBvbmx5CisgICBudW1iZXJzIGVxdWl2YWxlbnQgdG8gKy8tIDEgbW9kIDYgaGF2ZSB0aGVpciBiaXQgaW4gdGhlIGFycmF5LgorCisgICBPbmNlIHNpZXZlZCwgaWYgdGhlIGJpdCBiIGlzIFpFUk8gaXQgcmVwcmVzZW50IGEgcHJpbWUsIHRoZQorICAgcmVwcmVzZW50ZWQgcHJpbWUgaXMgYml0X3RvX24oYiksIGlmIHRoZSBMU2JpdCBpcyBiaXQgMCwgb3IKKyAgIGlkX3RvX24oYiksIGlmIHlvdSBjYWxsICIxIiB0aGUgZmlyc3QgYml0LgorICovCisKK21wX2xpbWJfdAorZ21wX3ByaW1lc2lldmUgKG1wX3B0ciBiaXRfYXJyYXksIG1wX2xpbWJfdCBuKQoreworICBtcF9zaXplX3Qgc2l6ZTsKKyAgbXBfbGltYl90IGJpdHM7CisgIHN0YXRpYyBtcF9saW1iX3QgcHJlc2lldmVkW10gPSB7UFJJTUVTSUVWRV9JTklUX1RBQkxFfTsKKworICBBU1NFUlQgKG4gPiA0KTsKKworICBiaXRzID0gbl9mdG9fYml0KG4pOworICBzaXplID0gYml0cyAvIEdNUF9MSU1CX0JJVFMgKyAxOworCisgIGZvciAobXBfc2l6ZV90IGogPSAwLCBsaW0gPSBNSU4gKHNpemUsIFBSSU1FU0lFVkVfTlVNQkVST0ZfVEFCTEUpOworICAgICAgIGogPCBsaW07ICsraikKKyAgICBiaXRfYXJyYXkgW2pdID0gcHJlc2lldmVkIFtqXTsgLyogbWVtY29weT8gKi8KKworICBpZiAoc2l6ZSA+IFBSSU1FU0lFVkVfTlVNQkVST0ZfVEFCTEUpIHsKKyAgICBtcF9zaXplX3Qgb2ZmOworICAgIG9mZiA9IHNpemUgPiAyICogQkxPQ0tfU0laRSA/IEJMT0NLX1NJWkUgKyAoc2l6ZSAlIEJMT0NLX1NJWkUpIDogc2l6ZTsKKyAgICBibG9ja19yZXNpZXZlIChiaXRfYXJyYXkgKyBQUklNRVNJRVZFX05VTUJFUk9GX1RBQkxFLAorCQkgICBvZmYgLSBQUklNRVNJRVZFX05VTUJFUk9GX1RBQkxFLAorCQkgICBHTVBfTElNQl9CSVRTICogUFJJTUVTSUVWRV9OVU1CRVJPRl9UQUJMRSwgYml0X2FycmF5KTsKKyAgICBmb3IgKDsgb2ZmIDwgc2l6ZTsgb2ZmICs9IEJMT0NLX1NJWkUpCisgICAgICBibG9ja19yZXNpZXZlIChiaXRfYXJyYXkgKyBvZmYsIEJMT0NLX1NJWkUsIG9mZiAqIEdNUF9MSU1CX0JJVFMsIGJpdF9hcnJheSk7CisgIH0KKworICBpZiAoKGJpdHMgKyAxKSAlIEdNUF9MSU1CX0JJVFMgIT0gMCkKKyAgICBiaXRfYXJyYXlbc2l6ZS0xXSB8PSBNUF9MSU1CX1RfTUFYIDw8ICgoYml0cyArIDEpICUgR01QX0xJTUJfQklUUyk7CisKKyAgcmV0dXJuIHNpemUgKiBHTVBfTElNQl9CSVRTIC0gbXBuX3BvcGNvdW50IChiaXRfYXJyYXksIHNpemUpOworfQorCisjdW5kZWYgQkxPQ0tfU0laRQorI3VuZGVmIFNJRVZFX01BU0sxCisjdW5kZWYgU0lFVkVfTUFTSzIKKyN1bmRlZiBTSUVWRV9NQVNLVAorI3VuZGVmIFNJRVZFXzJNU0sxCisjdW5kZWYgU0lFVkVfMk1TSzIKKyN1bmRlZiBTSUVWRV8yTVNLVAorI3VuZGVmIFNFVF9PRkYxCisjdW5kZWYgU0VUX09GRjIKKyN1bmRlZiBST1RBVEUxCisjdW5kZWYgUk9UQVRFMgpkaWZmIC0tZ2l0IGEvcHJpbnRmL2FzcHJpbnRmLmMgYi9wcmludGYvYXNwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg3Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnRmL2FzcHJpbnRmLmMKQEAgLTAsMCArMSw0NyBAQAorLyogZ21wX2FzcHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gYWxsb2NhdGVkIHNwYWNlLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK2dtcF9hc3ByaW50ZiAoY2hhciAqKnJlc3VsdCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgIGFwOworICBpbnQgICAgICByZXQ7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworCisgIHJldCA9IGdtcF92YXNwcmludGYgKHJlc3VsdCwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL2FzcHJudGZmdW5zLmMgYi9wcmludGYvYXNwcm50ZmZ1bnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJhODBjCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnRmL2FzcHJudGZmdW5zLmMKQEAgLTAsMCArMSw3MSBAQAorLyogX19nbXBfYXNwcmludGZfbWVtb3J5IGV0YyAtLSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFsbG9jYXRlZCBzcGFjZS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyogVGhlc2Ugcm91dGluZXMgYXJlIGluIGEgc2VwYXJhdGUgZmlsZSBzbyB0aGF0IHRoZSBtcHpfdCwgbXBxX3QgYW5kIG1wZl90CisgICBvcGVyYXRvcjw8IHJvdXRpbmVzIGNhbiBhdm9pZCBkcmFnZ2luZyB2c25wcmludGYgaW50byB0aGUgbGluayAodmlhCisgICBfX2dtcF9hc3ByaW50Zl9mb3JtYXQpLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorX19nbXBfYXNwcmludGZfbWVtb3J5IChzdHJ1Y3QgZ21wX2FzcHJpbnRmX3QgKmQsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgR01QX0FTUFJJTlRGX1RfTkVFRCAoZCwgbGVuKTsKKyAgbWVtY3B5IChkLT5idWYgKyBkLT5zaXplLCBzdHIsIGxlbik7CisgIGQtPnNpemUgKz0gbGVuOworICByZXR1cm4gbGVuOworfQorCitpbnQKK19fZ21wX2FzcHJpbnRmX3JlcHMgKHN0cnVjdCBnbXBfYXNwcmludGZfdCAqZCwgaW50IGMsIGludCByZXBzKQoreworICBHTVBfQVNQUklOVEZfVF9ORUVEIChkLCByZXBzKTsKKyAgbWVtc2V0IChkLT5idWYgKyBkLT5zaXplLCBjLCByZXBzKTsKKyAgZC0+c2l6ZSArPSByZXBzOworICByZXR1cm4gcmVwczsKK30KKworaW50CitfX2dtcF9hc3ByaW50Zl9maW5hbCAoc3RydWN0IGdtcF9hc3ByaW50Zl90ICpkKQoreworICBjaGFyICAqYnVmID0gZC0+YnVmOworICBBU1NFUlQgKGQtPmFsbG9jID49IGQtPnNpemUgKyAxKTsKKyAgYnVmW2QtPnNpemVdID0gJ1wwJzsKKyAgX19HTVBfUkVBTExPQ0FURV9GVU5DX01BWUJFX1RZUEUgKGJ1ZiwgZC0+YWxsb2MsIGQtPnNpemUrMSwgY2hhcik7CisgICpkLT5yZXN1bHQgPSBidWY7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL2RvcHJudC5jIGIvcHJpbnRmL2RvcHJudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODY2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvZG9wcm50LmMKQEAgLTAsMCArMSw2MjUgQEAKKy8qIF9fZ21wX2RvcHJudCAtLSBwcmludGYgc3R5bGUgZm9ybWF0dGVkIG91dHB1dC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgICAgLyogZm9yIERFQ0lNQUxfUE9JTlQgaW4gZ2xpYmMgbGFuZ2luZm8uaCAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCS8qIG5lZWRlZCBmb3IgdGhlIEhBVkVfLCBjb3VsZCBhbHNvIG1vdmUgZ21wIGluY2xzICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPiAgICAgLyogZm9yIGlzZGlnaXQgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLyogZm9yIHB0cmRpZmZfdCAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+IC8qIGZvciBpbnRtYXhfdCAqLworI2VuZGlmCisjaWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9MQU5HSU5GT19ICisjaW5jbHVkZSA8bGFuZ2luZm8uaD4gIC8qIGZvciBubF9sYW5naW5mbyAqLworI2VuZGlmCisKKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+ICAgIC8qIGZvciBsb2NhbGVjb252ICovCisjZW5kaWYKKworI2lmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIHF1YWRfdCAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIGNoYW5nZSB0aGlzIHRvICIjZGVmaW5lIFRSQUNFKHgpIHgiIGZvciBkaWFnbm9zdGljcyAqLworI2RlZmluZSBUUkFDRSh4KQorCisKKy8qIFNob3VsZCBiZSBwb3J0YWJsZSwgYnV0IGluIGFueSBjYXNlIHRoaXMgaXMgb25seSB1c2VkIHVuZGVyIHNvbWUgQVNTRVJUcy4gKi8KKyNkZWZpbmUgdmFfZXF1YWwoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtZW1jbXAgKCYoeCksICYoeSksIHNpemVvZih2YV9saXN0KSkgPT0gMCkKKworCisvKiBwcmludGYgaXMgY29udmVuaWVudCBiZWNhdXNlIGl0IGFsbG93cyB2YXJpb3VzIHR5cGVzIHRvIGJlIHByaW50ZWQgaW4gb25lCisgICBmYWlybHkgY29tcGFjdCBjYWxsLCBzbyBoYXZpbmcgZ21wX3ByaW50ZiBzdXBwb3J0IHRoZSBzdGFuZGFyZCB0eXBlcyBhcworICAgd2VsbCBhcyB0aGUgZ21wIG9uZXMgaXMgaW1wb3J0YW50LiAgVGhpcyBlbmRzIHVwIG1lYW5pbmcgYWxsIHRoZSBzdGFuZGFyZAorICAgcGFyc2luZyBtdXN0IGJlIGR1cGxpY2F0ZWQsIHRvIGdldCBhIG5ldyByb3V0aW5lIHJlY29nbmlzaW5nIHRoZSBnbXAKKyAgIGV4dHJhcy4KKworICAgV2l0aCB0aGUgY3VycmVudGx5IGZhdm91cmVkIGhhbmRsaW5nIG9mIG1weiBldGMgYXMgWiwgUSBhbmQgRiB0eXBlCisgICBtYXJrZXJzLCBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgZ2xpYmMgcmVnaXN0ZXJfcHJpbnRmX2Z1bmN0aW9uIHNpbmNlCisgICB0aGF0IG9ubHkgYWNjZXB0cyBuZXcgY29udmVyc2lvbiBjaGFyYWN0ZXJzLCBub3QgbmV3IHR5cGVzLiAgSWYgWiB3YXMgYQorICAgY29udmVyc2lvbiB0aGVyZSdkIGJlIG5vIHdheSB0byBzcGVjaWZ5IGhleCwgZGVjaW1hbCBvciBvY3RhbCwgb3IKKyAgIHNpbWlsYXJseSB3aXRoIEYgbm8gd2F5IHRvIHNwZWNpZnkgZml4ZWQgcG9pbnQgb3Igc2NpZW50aWZpYyBmb3JtYXQuCisKKyAgIEl0IHNlZW1zIHdpc2VzdCB0byBwYXNzIGNvbnZlcnNpb25zICVmLCAlZSBhbmQgJWcgb2YgZmxvYXQsIGRvdWJsZSBhbmQKKyAgIGxvbmcgZG91YmxlIG92ZXIgdG8gdGhlIHN0YW5kYXJkIHByaW50Zi4gIEl0J2QgYmUgaGFyZCB0byBiZSBzdXJlIG9mCisgICBnZXR0aW5nIHRoZSByaWdodCBoYW5kbGluZyBmb3IgTmFOcywgcm91bmRpbmcsIGV0Yy4gIEludGVnZXIgY29udmVyc2lvbnMKKyAgICVkIGV0YyBhbmQgc3RyaW5nIGNvbnZlcnNpb25zICVzIG9uIHRoZSBvdGhlciBoYW5kIGNvdWxkIGJlIGVhc2lseSBlbm91Z2gKKyAgIGhhbmRsZWQgd2l0aGluIGdtcF9kb3BybnQsIGJ1dCBpZiBmbG9hdHMgYXJlIGdvaW5nIHRvIGxpYmMgdGhlbiBpdCdzIGp1c3QKKyAgIGFzIGVhc3kgdG8gc2VuZCBhbGwgbm9uLWdtcCB0eXBlcyB0aGVyZS4KKworICAgIloiIHdhcyBhIHR5cGUgbWFya2VyIGZvciBzaXplX3QgaW4gb2xkIGdsaWJjLCBidXQgdGhlcmUgc2VlbXMgbm8gbmVlZCB0bworICAgcHJvdmlkZSBhY2Nlc3MgdG8gdGhhdCBub3cgInoiIGlzIHN0YW5kYXJkLgorCisgICBJbiBHTVAgNC4xLjEgd2UgZG9jdW1lbnRlZCAibGwiIGFuZCAiTCIgYXMgYmVpbmcgZXF1aXZhbGVudCwgYnV0IGluIEM5OQorICAgaW4gZmFjdCAibGwiIGlzIGp1c3QgZm9yIGxvbmcgbG9uZyBhbmQgIkwiIGp1c3QgZm9yIGxvbmcgZG91YmxlLgorICAgQXBwYXJlbnRseSBHTElCQyBhbGxvd3MgIkwiIGZvciBsb25nIGxvbmcgdGhvdWdoLiAgVGhpcyBkb2Vzbid0IGFmZmVjdAorICAgdXMgYXMgc3VjaCwgc2luY2UgYm90aCBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIEMgbGlicmFyeS4gIFRvIGJlCisgICBjb25zaXN0ZW50IHdpdGggd2hhdCB3ZSBzYWlkIGJlZm9yZSwgdGhlIHR3byBhcmUgdHJlYXRlZCBlcXVpdmFsZW50bHkKKyAgIGhlcmUsIGFuZCBpdCdzIGxlZnQgdG8gdGhlIEMgbGlicmFyeSB0byBkbyB3aGF0IGl0IHRoaW5rcyB3aXRoIHRoZW0uCisKKyAgIFBvc3NpYmlsaXRpZXM6CisKKyAgICJiIiBtaWdodCBiZSBuaWNlIGZvciBiaW5hcnkgb3V0cHV0LCBhbmQgY291bGQgZXZlbiBiZSBzdXBwb3J0ZWQgZm9yIHRoZQorICAgc3RhbmRhcmQgQyB0eXBlcyB0b28gaWYgZGVzaXJlZC4KKworICAgUE9TSVggc3R5bGUgIiVuJCIgcGFyYW1ldGVyIG51bWJlcmluZyB3b3VsZCBiZSBwb3NzaWJsZSwgYnV0IHdvdWxkIG5lZWQKKyAgIHRvIGJlIGhhbmRsZWQgY29tcGxldGVseSB3aXRoaW4gZ21wX2RvcHJudCwgc2luY2UgdGhlIG51bWJlcmluZyB3aWxsIGJlCisgICBhbGwgZGlmZmVyZW50IG9uY2UgdGhlIGZvcm1hdCBzdHJpbmcgaXQgY3V0IGludG8gcGllY2VzLgorCisgICBTb21lIG9wdGlvbnMgZm9yIG1wcSBmb3JtYXR0aW5nIHdvdWxkIGJlIGdvb2QuICBQZXJoYXBzIGEgbm9uLXplcm8KKyAgIHByZWNpc2lvbiBmaWVsZCBjb3VsZCBnaXZlIGEgd2lkdGggZm9yIHRoZSBkZW5vbWluYXRvciBhbmQgbWVhbiBhbHdheXMKKyAgIHB1dCBhICIvIi4gIEEgZm9ybSAibitwL3EiIG1pZ2h0IGludGVyZXN0aW5nIHRvbywgdGhvdWdoIHBlcmhhcHMgdGhhdCdzCisgICBiZXR0ZXIgbGVmdCB0byBhcHBsaWNhdGlvbnMuCisKKyAgIFJpZ2h0IG5vdyB0aGVyZSdzIG5vIHdheSBmb3IgYW4gYXBwbGljYXRpb24gdG8ga25vdyB3aGV0aGVyIHR5cGVzIGxpa2UKKyAgIGludG1heF90IGFyZSBzdXBwb3J0ZWQgaGVyZS4gIElmIGNvbmZpZ3VyZSBpcyBkb2luZyBpdHMgam9iIGFuZCB0aGUgc2FtZQorICAgY29tcGlsZXIgaXMgdXNlZCBmb3IgZ21wIGFzIGZvciB0aGUgYXBwbGljYXRpb24gdGhlbiB0aGVyZSBzaG91bGRuJ3QgYmUKKyAgIGFueSBwcm9ibGVtLCBidXQgcGVyaGFwcyBnbXAuaCBzaG91bGQgaGF2ZSBzb21lIHByZXByb2Nlc3NvciBzeW1ib2xzIHRvCisgICBzYXkgd2hhdCBsaWJnbXAgY2FuIGRvLiAgKi8KKworCisKKy8qIElmIGEgZ21wIGZvcm1hdCBpcyB0aGUgdmVyeSBmaXJzdCB0aGluZyBvciB0aGVyZSBhcmUgdHdvIGdtcCBmb3JtYXRzIHdpdGgKKyAgIG5vdGhpbmcgaW4gYmV0d2VlbiB0aGVuIHdlJ2xsIHJlYWNoIGhlcmUgd2l0aCB0aGlzX2ZtdCA9PSBsYXN0X2ZtdCBhbmQgd2UKKyAgIGNhbiBkbyBub3RoaW5nIGluIHRoYXQgY2FzZS4KKworICAgbGFzdF9hcCBpcyBhbHdheXMgcmVwbGFjZWQgYWZ0ZXIgYSBGTFVTSCwgc28gaXQgZG9lc24ndCBtYXR0ZXIgaWYgdmFfbGlzdAorICAgaXMgYSBjYWxsLWJ5LXJlZmVyZW5jZSBhbmQgdGhlIGZ1bnMtPmZvcm1hdCByb3V0aW5lIG1vZGlmaWVzIGl0LiAgKi8KKworI2RlZmluZSBGTFVTSCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodGhpc19mbXQgPT0gbGFzdF9mbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJVFJBQ0UgKHByaW50ZiAoIm5vdGhpbmcgdG8gZmx1c2hcbiIpKTsgICAgICAgICAgXAorCUFTU0VSVCAodmFfZXF1YWwgKHRoaXNfYXAsIGxhc3RfYXApKTsgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlBU1NFUlQgKCp0aGlzX2ZtdCA9PSAnJScpOyAgICAgICAgICAgICAgICAgICAgICBcCisJKnRoaXNfZm10ID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVRSQUNFIChwcmludGYgKCJmbHVzaCBcIiVzXCJcbiIsIGxhc3RfZm10KSk7ICAgIFwKKwlET1BSTlRfRk9STUFUIChsYXN0X2ZtdCwgbGFzdF9hcCk7ICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBQYXJzZSB1cCB0aGUgZ2l2ZW4gZm9ybWF0IHN0cmluZyBhbmQgZG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCB1c2luZyB0aGUKKyAgIGdpdmVuICJmdW5zIiByb3V0aW5lcy4gIFRoZSBkYXRhIHBhcmFtZXRlciBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aG9zZQorICAgcm91dGluZXMuICAqLworCitpbnQKK19fZ21wX2RvcHJudCAoY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgKmZ1bnMsIHZvaWQgKmRhdGEsCisJICAgICAgY29uc3QgY2hhciAqb3JpZ19mbXQsIHZhX2xpc3Qgb3JpZ19hcCkKK3sKKyAgdmFfbGlzdCAgYXAsIHRoaXNfYXAsIGxhc3RfYXA7CisgIHNpemVfdCAgIGFsbG9jX2ZtdF9zaXplLCBvcmlnX2ZtdF9zaXplOworICBjaGFyICAgICAqZm10LCAqYWxsb2NfZm10LCAqbGFzdF9mbXQsICp0aGlzX2ZtdCwgKmdtcF9zdHI7CisgIGludCAgICAgIHJldHZhbCA9IDA7CisgIGludCAgICAgIHR5cGUsIGZjaGFyLCAqdmFsdWUsIHNlZW5fcHJlY2lzaW9uOworICBzdHJ1Y3QgZG9wcm50X3BhcmFtc190IHBhcmFtOworCisgIFRSQUNFIChwcmludGYgKCJnbXBfZG9wcm50IFwiJXNcIlxuIiwgb3JpZ19mbXQpKTsKKworICAvKiBEb24ndCBtb2RpZnkgb3JpZ19hcCwgaWYgdmFfbGlzdCBpcyBhY3R1YWxseSBhbiBhcnJheSBhbmQgaGVuY2UgY2FsbCBieQorICAgICByZWZlcmVuY2UuICBJdCBjb3VsZCBiZSBhcmd1ZWQgdGhhdCBpdCdkIGJlIG1vcmUgZWZmaWNpZW50IHRvIGxlYXZlIHRoZQorICAgICBjYWxsZXIgdG8gbWFrZSBhIGNvcHkgaWYgaXQgY2FyZWQsIGJ1dCBkb2luZyBzbyBoZXJlIGlzIGdvaW5nIHRvIGJlIGEKKyAgICAgdmVyeSBzbWFsbCBwYXJ0IG9mIHRoZSB0b3RhbCB3b3JrLCBhbmQgd2UgbWF5IGFzIHdlbGwga2VlcCBhcHBsaWNhdGlvbnMKKyAgICAgb3V0IG9mIHRyb3VibGUuICAqLworICB2YV9jb3B5IChhcCwgb3JpZ19hcCk7CisKKyAgLyogVGhlIGZvcm1hdCBzdHJpbmcgaXMgY2hvcHBlZCB1cCBpbnRvIHBpZWNlcyB0byBiZSBwYXNzZWQgdG8KKyAgICAgZnVucy0+Zm9ybWF0LiAgVW5mb3J0dW5hdGVseSB0aGF0IG1lYW5zIGl0IGhhcyB0byBiZSBjb3BpZWQgc28gZWFjaAorICAgICBwaWVjZSBjYW4gYmUgbnVsbC10ZXJtaW5hdGVkLiAgV2UncmUgbm90IGdvaW5nIHRvIGJlIHZlcnkgZmFzdCBoZXJlLCBzbworICAgICB1c2UgX19nbXBfYWxsb2NhdGVfZnVuYyByYXRoZXIgdGhhbiBUTVBfQUxMT0MsIHRvIGF2b2lkIG92ZXJmbG93aW5nIHRoZQorICAgICBzdGFjayBpZiBhIGxvbmcgb3V0cHV0IHN0cmluZyBpcyBnaXZlbi4gICovCisgIGFsbG9jX2ZtdF9zaXplID0gb3JpZ19mbXRfc2l6ZSA9IHN0cmxlbiAob3JpZ19mbXQpICsgMTsKKyNpZiBfTE9OR19MT05HX0xJTUIKKyAgLyogZm9yIGEgbG9uZyBsb25nIGxpbWIgd2UgY2hhbmdlICVNeCB0byAlbGx4LCBzbyBjb3VsZCBuZWVkIGFuIGV4dHJhIDEKKyAgICAgY2hhciBmb3IgZXZlcnkgMyBleGlzdGluZyAqLworICBhbGxvY19mbXRfc2l6ZSArPSBhbGxvY19mbXRfc2l6ZSAvIDM7CisjZW5kaWYKKyAgYWxsb2NfZm10ID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChhbGxvY19mbXRfc2l6ZSwgY2hhcik7CisgIGZtdCA9IGFsbG9jX2ZtdDsKKyAgbWVtY3B5IChmbXQsIG9yaWdfZm10LCBvcmlnX2ZtdF9zaXplKTsKKworICAvKiBsYXN0X2ZtdCBhbmQgbGFzdF9hcCBhcmUganVzdCBhZnRlciB0aGUgbGFzdCBvdXRwdXQsIGFuZCBoZW5jZSB3aGVyZQorICAgICB0aGUgbmV4dCBvdXRwdXQgd2lsbCBiZWdpbiwgd2hlbiB0aGF0J3MgZG9uZSAqLworICBsYXN0X2ZtdCA9IGZtdDsKKyAgdmFfY29weSAobGFzdF9hcCwgYXApOworCisgIGZvciAoOzspCisgICAgeworICAgICAgVFJBQ0UgKHByaW50ZiAoIm5leHQ6IFwiJXNcIlxuIiwgZm10KSk7CisKKyAgICAgIGZtdCA9IHN0cmNociAoZm10LCAnJScpOworICAgICAgaWYgKGZtdCA9PSBOVUxMKQorCWJyZWFrOworCisgICAgICAvKiB0aGlzX2ZtdCBhbmQgdGhpc19hcCBhcmUgdGhlIGN1cnJlbnQgJyUnIHNlcXVlbmNlIGJlaW5nIGNvbnNpZGVyZWQgKi8KKyAgICAgIHRoaXNfZm10ID0gZm10OworICAgICAgdmFfY29weSAodGhpc19hcCwgYXApOworICAgICAgZm10Kys7IC8qIHNraXAgdGhlICclJyAqLworCisgICAgICBUUkFDRSAocHJpbnRmICgiY29uc2lkZXJpbmdcbiIpOworCSAgICAgcHJpbnRmICgiICBsYXN0OiBcIiVzXCJcbiIsIGxhc3RfZm10KTsKKwkgICAgIHByaW50ZiAoIiAgdGhpczogXCIlc1wiXG4iLCB0aGlzX2ZtdCkpOworCisgICAgICB0eXBlID0gJ1wwJzsKKyAgICAgIHZhbHVlID0gJnBhcmFtLndpZHRoOworCisgICAgICBwYXJhbS5iYXNlID0gMTA7CisgICAgICBwYXJhbS5jb252ID0gMDsKKyAgICAgIHBhcmFtLmV4cGZtdCA9ICJlJWMlMDJsZCI7CisgICAgICBwYXJhbS5leHB0aW1lczQgPSAwOworICAgICAgcGFyYW0uZmlsbCA9ICcgJzsKKyAgICAgIHBhcmFtLmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9SSUdIVDsKKyAgICAgIHBhcmFtLnByZWMgPSA2OworICAgICAgcGFyYW0uc2hvd2Jhc2UgPSBET1BSTlRfU0hPV0JBU0VfTk87CisgICAgICBwYXJhbS5zaG93cG9pbnQgPSAwOworICAgICAgcGFyYW0uc2hvd3RyYWlsaW5nID0gMTsKKyAgICAgIHBhcmFtLnNpZ24gPSAnXDAnOworICAgICAgcGFyYW0ud2lkdGggPSAwOworICAgICAgc2Vlbl9wcmVjaXNpb24gPSAwOworCisgICAgICAvKiBUaGlzIGxvb3AgcGFyc2VzIGEgc2luZ2xlICUgc2VxdWVuY2UuICAiYnJlYWsiIGZyb20gdGhlIHN3aXRjaAorCSBtZWFucyBjb250aW51ZSB3aXRoIHRoaXMgJSwgImdvdG8gbmV4dCIgbWVhbnMgdGhlIGNvbnZlcnNpb24KKwkgY2hhcmFjdGVyIGhhcyBiZWVuIHNlZW4gYW5kIGEgbmV3ICUgc2hvdWxkIGJlIHNvdWdodC4gICovCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGZjaGFyID0gKmZtdCsrOworCSAgaWYgKGZjaGFyID09ICdcMCcpCisJICAgIGJyZWFrOworCisJICBzd2l0Y2ggKGZjaGFyKSB7CisKKwkgIGNhc2UgJ2EnOgorCSAgICAvKiAlYSBiZWhhdmVzIGxpa2UgJWUsIGJ1dCBkZWZhdWx0cyB0byBhbGwgc2lnbmlmaWNhbnQgZGlnaXRzLAorCSAgICAgICBhbmQgdGhlcmUncyBubyBsZWFkaW5nIHplcm9zIG9uIHRoZSBleHBvbmVudCAod2hpY2ggaXMgaW4KKwkgICAgICAgZmFjdCBiaXQtYmFzZWQpICovCisJICAgIHBhcmFtLmJhc2UgPSAxNjsKKwkgICAgcGFyYW0uZXhwZm10ID0gInAlYyVsZCI7CisJICAgIGdvdG8gY29udl9hOworCSAgY2FzZSAnQSc6CisJICAgIHBhcmFtLmJhc2UgPSAtMTY7CisJICAgIHBhcmFtLmV4cGZtdCA9ICJQJWMlbGQiOworCSAgY29udl9hOgorCSAgICBwYXJhbS5jb252ID0gRE9QUk5UX0NPTlZfU0NJRU5USUZJQzsKKwkgICAgcGFyYW0uZXhwdGltZXM0ID0gMTsKKwkgICAgaWYgKCEgc2Vlbl9wcmVjaXNpb24pCisJICAgICAgcGFyYW0ucHJlYyA9IC0xOyAgLyogZGVmYXVsdCB0byBhbGwgZGlnaXRzICovCisJICAgIHBhcmFtLnNob3diYXNlID0gRE9QUk5UX1NIT1dCQVNFX1lFUzsKKwkgICAgcGFyYW0uc2hvd3RyYWlsaW5nID0gMTsKKwkgICAgZ290byBmbG9hdGluZ19hOworCisJICBjYXNlICdjJzoKKwkgICAgLyogTGV0J3MgYXNzdW1lIHdjaGFyX3Qgd2lsbCBiZSBwcm9tb3RlZCB0byAiaW50IiBpbiB0aGUgY2FsbCwKKwkgICAgICAgdGhlIHNhbWUgYXMgY2hhciB3aWxsIGJlLiAqLworCSAgICAodm9pZCkgdmFfYXJnIChhcCwgaW50KTsKKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdkJzoKKwkgIGNhc2UgJ2knOgorCSAgY2FzZSAndSc6CisJICBpbnRlZ2VyOgorCSAgICBUUkFDRSAocHJpbnRmICgiaW50ZWdlciwgYmFzZT0lZFxuIiwgcGFyYW0uYmFzZSkpOworCSAgICBpZiAoISBzZWVuX3ByZWNpc2lvbikKKwkgICAgICBwYXJhbS5wcmVjID0gLTE7CisJICAgIHN3aXRjaCAodHlwZSkgeworCSAgICBjYXNlICdqJzoKKwkgICAgICAvKiBMZXQncyBhc3N1bWUgdWludG1heF90IGlzIHRoZSBzYW1lIHNpemUgYXMgaW50bWF4X3QuICovCisjaWYgSEFWRV9JTlRNQVhfVAorCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBpbnRtYXhfdCk7CisjZWxzZQorCSAgICAgIEFTU0VSVF9GQUlMIChpbnRtYXhfdCBub3QgYXZhaWxhYmxlKTsKKyNlbmRpZgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdsJzoKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgbG9uZyk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ0wnOgorI2lmIEhBVkVfTE9OR19MT05HCisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGxvbmcgbG9uZyk7CisjZWxzZQorCSAgICAgIEFTU0VSVF9GQUlMIChsb25nIGxvbmcgbm90IGF2YWlsYWJsZSk7CisjZW5kaWYKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnTic6CisJICAgICAgeworCQltcF9wdHIgICAgIHhwOworCQltcF9zaXplX3QgIHhzaXplLCBhYnNfeHNpemU7CisJCW1wel90ICAgICAgejsKKwkJRkxVU0ggKCk7CisJCXhwID0gdmFfYXJnIChhcCwgbXBfcHRyKTsKKwkJUFRSKHopID0geHA7CisJCXhzaXplID0gKGludCkgdmFfYXJnIChhcCwgbXBfc2l6ZV90KTsKKwkJYWJzX3hzaXplID0gQUJTICh4c2l6ZSk7CisJCU1QTl9OT1JNQUxJWkUgKHhwLCBhYnNfeHNpemUpOworCQlTSVooeikgPSAoeHNpemUgPj0gMCA/IGFic194c2l6ZSA6IC1hYnNfeHNpemUpOworCQlBU1NFUlRfQ09ERSAoQUxMT0MoeikgPSBhYnNfeHNpemUpOworCQlnbXBfc3RyID0gbXB6X2dldF9zdHIgKE5VTEwsIHBhcmFtLmJhc2UsIHopOworCQlnb3RvIGdtcF9pbnRlZ2VyOworCSAgICAgIH0KKwkgICAgICAvKiBicmVhazsgKi8KKwkgICAgY2FzZSAncSc6CisJICAgICAgLyogcXVhZF90IGlzIHByb2JhYmx5IHRoZSBzYW1lIGFzIGxvbmcgbG9uZywgYnV0IGxldCdzIHRyZWF0CisJCSBpdCBzZXBhcmF0ZWx5IGp1c3QgdG8gYmUgc3VyZS4gIEFsc28gbGV0J3MgYXNzdW1lIHVfcXVhZF90CisJCSB3aWxsIGJlIHRoZSBzYW1lIHNpemUgYXMgcXVhZF90LiAgKi8KKyNpZiBIQVZFX1FVQURfVAorCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBxdWFkX3QpOworI2Vsc2UKKwkgICAgICBBU1NFUlRfRkFJTCAocXVhZF90IG5vdCBhdmFpbGFibGUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ1EnOgorCSAgICAgIEZMVVNIICgpOworCSAgICAgIGdtcF9zdHIgPSBtcHFfZ2V0X3N0ciAoTlVMTCwgcGFyYW0uYmFzZSwgdmFfYXJnKGFwLCBtcHFfc3JjcHRyKSk7CisJICAgICAgZ290byBnbXBfaW50ZWdlcjsKKwkgICAgY2FzZSAndCc6CisjaWYgSEFWRV9QVFJESUZGX1QKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgcHRyZGlmZl90KTsKKyNlbHNlCisJICAgICAgQVNTRVJUX0ZBSUwgKHB0cmRpZmZfdCBub3QgYXZhaWxhYmxlKTsKKyNlbmRpZgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd6JzoKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgc2l6ZV90KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnWic6CisJICAgICAgeworCQlpbnQgICByZXQ7CisJCUZMVVNIICgpOworCQlnbXBfc3RyID0gbXB6X2dldF9zdHIgKE5VTEwsIHBhcmFtLmJhc2UsCisJCQkJICAgICAgIHZhX2FyZyAoYXAsIG1wel9zcmNwdHIpKTsKKwkgICAgICBnbXBfaW50ZWdlcjoKKwkJcmV0ID0gX19nbXBfZG9wcm50X2ludGVnZXIgKGZ1bnMsIGRhdGEsICZwYXJhbSwgZ21wX3N0cik7CisJCSBfX0dNUF9GUkVFX0ZVTkNfVFlQRSAoZ21wX3N0ciwgc3RybGVuKGdtcF9zdHIpKzEsIGNoYXIpOworCQlET1BSTlRfQUNDVU1VTEFURSAocmV0KTsKKwkJdmFfY29weSAobGFzdF9hcCwgYXApOworCQlsYXN0X2ZtdCA9IGZtdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogZGVmYXVsdCBpcyBhbiAiaW50IiwgYW5kIHRoaXMgaW5jbHVkZXMgaD1zaG9ydCBhbmQgaGg9Y2hhcgorCQkgc2luY2UgdGhleSdyZSBwcm9tb3RlZCB0byBpbnQgaW4gYSBmdW5jdGlvbiBjYWxsICovCisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdFJzoKKwkgICAgcGFyYW0uYmFzZSA9IC0xMDsKKwkgICAgcGFyYW0uZXhwZm10ID0gIkUlYyUwMmxkIjsKKwkgICAgLypGQUxMVEhSVSovCisJICBjYXNlICdlJzoKKwkgICAgcGFyYW0uY29udiA9IERPUFJOVF9DT05WX1NDSUVOVElGSUM7CisJICBmbG9hdGluZzoKKwkgICAgaWYgKHBhcmFtLnNob3diYXNlID09IERPUFJOVF9TSE9XQkFTRV9OT05aRVJPKQorCSAgICAgIHsKKwkJLyogIyBpbiAlZSwgJWYgYW5kICVnICovCisJCXBhcmFtLnNob3dwb2ludCA9IDE7CisJCXBhcmFtLnNob3d0cmFpbGluZyA9IDE7CisJICAgICAgfQorCSAgZmxvYXRpbmdfYToKKwkgICAgc3dpdGNoICh0eXBlKSB7CisJICAgIGNhc2UgJ0YnOgorCSAgICAgIEZMVVNIICgpOworCSAgICAgIERPUFJOVF9BQ0NVTVVMQVRFIChfX2dtcF9kb3BybnRfbXBmIChmdW5zLCBkYXRhLCAmcGFyYW0sCisJCQkJCQkgICBHTVBfREVDSU1BTF9QT0lOVCwKKwkJCQkJCSAgIHZhX2FyZyAoYXAsIG1wZl9zcmNwdHIpKSk7CisJICAgICAgdmFfY29weSAobGFzdF9hcCwgYXApOworCSAgICAgIGxhc3RfZm10ID0gZm10OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdMJzoKKyNpZiBIQVZFX0xPTkdfRE9VQkxFCisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGxvbmcgZG91YmxlKTsKKyNlbHNlCisJICAgICAgQVNTRVJUX0ZBSUwgKGxvbmcgZG91YmxlIG5vdCBhdmFpbGFibGUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGRvdWJsZSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdmJzoKKwkgICAgcGFyYW0uY29udiA9IERPUFJOVF9DT05WX0ZJWEVEOworCSAgICBnb3RvIGZsb2F0aW5nOworCisJICBjYXNlICdGJzogLyogbXBmX3QgICAgICovCisJICBjYXNlICdqJzogLyogaW50bWF4X3QgICovCisJICBjYXNlICdMJzogLyogbG9uZyBsb25nICovCisJICBjYXNlICdOJzogLyogbXBuICAgICAgICovCisJICBjYXNlICdxJzogLyogcXVhZF90ICAgICovCisJICBjYXNlICdRJzogLyogbXBxX3QgICAgICovCisJICBjYXNlICd0JzogLyogcHRyZGlmZl90ICovCisJICBjYXNlICd6JzogLyogc2l6ZV90ICAgICovCisJICBjYXNlICdaJzogLyogbXB6X3QgICAgICovCisJICBzZXRfdHlwZToKKwkgICAgdHlwZSA9IGZjaGFyOworCSAgICBicmVhazsKKworCSAgY2FzZSAnRyc6CisJICAgIHBhcmFtLmJhc2UgPSAtMTA7CisJICAgIHBhcmFtLmV4cGZtdCA9ICJFJWMlMDJsZCI7CisJICAgIC8qRkFMTFRIUlUqLworCSAgY2FzZSAnZyc6CisJICAgIHBhcmFtLmNvbnYgPSBET1BSTlRfQ09OVl9HRU5FUkFMOworCSAgICBwYXJhbS5zaG93dHJhaWxpbmcgPSAwOworCSAgICBnb3RvIGZsb2F0aW5nOworCisJICBjYXNlICdoJzoKKwkgICAgaWYgKHR5cGUgIT0gJ2gnKQorCSAgICAgIGdvdG8gc2V0X3R5cGU7CisJICAgIHR5cGUgPSAnSCc7ICAgLyogaW50ZXJuYWwgY29kZSBmb3IgImhoIiAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAnbCc6CisJICAgIGlmICh0eXBlICE9ICdsJykKKwkgICAgICBnb3RvIHNldF90eXBlOworCSAgICB0eXBlID0gJ0wnOyAgIC8qICJsbCIgbWVhbnMgIkwiICovCisJICAgIGJyZWFrOworCisJICBjYXNlICdtJzoKKwkgICAgLyogZ2xpYmMgc3RyZXJyb3IoZXJybm8pLCBubyBhcmd1bWVudCAqLworCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ00nOiAvKiBtcF9saW1iX3QgKi8KKwkgICAgLyogbXVuZyBmb3JtYXQgc3RyaW5nIHRvIGwgb3IgbGwgYW5kIGxldCBwbGFpbiBwcmludGYgaGFuZGxlIGl0ICovCisjaWYgX0xPTkdfTE9OR19MSU1CCisJICAgIG1lbW1vdmUgKGZtdCsxLCBmbXQsIHN0cmxlbiAoZm10KSsxKTsKKwkgICAgZm10Wy0xXSA9ICdsJzsKKwkgICAgZm10WzBdID0gJ2wnOworCSAgICBmbXQrKzsKKwkgICAgdHlwZSA9ICdMJzsKKyNlbHNlCisJICAgIGZtdFstMV0gPSAnbCc7CisJICAgIHR5cGUgPSAnbCc7CisjZW5kaWYKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJ24nOgorCSAgICB7CisJICAgICAgdm9pZCAgKnA7CisJICAgICAgRkxVU0ggKCk7CisJICAgICAgcCA9IHZhX2FyZyAoYXAsIHZvaWQgKik7CisJICAgICAgc3dpdGNoICh0eXBlKSB7CisJICAgICAgY2FzZSAnXDAnOiAqIChpbnQgICAgICAgKikgcCA9IHJldHZhbDsgYnJlYWs7CisJICAgICAgY2FzZSAnRic6ICBtcGZfc2V0X3NpICgobXBmX3B0cikgcCwgKGxvbmcpIHJldHZhbCk7IGJyZWFrOworCSAgICAgIGNhc2UgJ0gnOiAgKiAoY2hhciAgICAgICopIHAgPSByZXR2YWw7IGJyZWFrOworCSAgICAgIGNhc2UgJ2gnOiAgKiAoc2hvcnQgICAgICopIHAgPSByZXR2YWw7IGJyZWFrOworI2lmIEhBVkVfSU5UTUFYX1QKKwkgICAgICBjYXNlICdqJzogICogKGludG1heF90ICAqKSBwID0gcmV0dmFsOyBicmVhazsKKyNlbHNlCisJICAgICAgY2FzZSAnaic6ICBBU1NFUlRfRkFJTCAoaW50bWF4X3Qgbm90IGF2YWlsYWJsZSk7IGJyZWFrOworI2VuZGlmCisJICAgICAgY2FzZSAnbCc6ICAqIChsb25nICAgICAgKikgcCA9IHJldHZhbDsgYnJlYWs7CisjaWYgSEFWRV9RVUFEX1QgJiYgSEFWRV9MT05HX0xPTkcKKwkgICAgICBjYXNlICdxJzoKKwkJQVNTRVJUX0FMV0FZUyAoc2l6ZW9mIChxdWFkX3QpID09IHNpemVvZiAobG9uZyBsb25nKSk7CisJCS8qRkFMTFRIUlUqLworI2Vsc2UKKwkgICAgICBjYXNlICdxJzogIEFTU0VSVF9GQUlMIChxdWFkX3Qgbm90IGF2YWlsYWJsZSk7IGJyZWFrOworI2VuZGlmCisjaWYgSEFWRV9MT05HX0xPTkcKKwkgICAgICBjYXNlICdMJzogICogKGxvbmcgbG9uZyAqKSBwID0gcmV0dmFsOyBicmVhazsKKyNlbHNlCisJICAgICAgY2FzZSAnTCc6ICBBU1NFUlRfRkFJTCAobG9uZyBsb25nIG5vdCBhdmFpbGFibGUpOyBicmVhazsKKyNlbmRpZgorCSAgICAgIGNhc2UgJ04nOgorCQl7CisJCSAgbXBfc2l6ZV90ICBuOworCQkgIG4gPSB2YV9hcmcgKGFwLCBtcF9zaXplX3QpOworCQkgIG4gPSBBQlMgKG4pOworCQkgIGlmIChuICE9IDApCisJCSAgICB7CisJCSAgICAgICogKG1wX3B0cikgcCA9IHJldHZhbDsKKwkJICAgICAgTVBOX1pFUk8gKChtcF9wdHIpIHAgKyAxLCBuIC0gMSk7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnUSc6ICBtcHFfc2V0X3NpICgobXBxX3B0cikgcCwgKGxvbmcpIHJldHZhbCwgMUwpOyBicmVhazsKKyNpZiBIQVZFX1BUUkRJRkZfVAorCSAgICAgIGNhc2UgJ3QnOiAgKiAocHRyZGlmZl90ICopIHAgPSByZXR2YWw7IGJyZWFrOworI2Vsc2UKKwkgICAgICBjYXNlICd0JzogIEFTU0VSVF9GQUlMIChwdHJkaWZmX3Qgbm90IGF2YWlsYWJsZSk7IGJyZWFrOworI2VuZGlmCisJICAgICAgY2FzZSAneic6ICAqIChzaXplX3QgICAgKikgcCA9IHJldHZhbDsgYnJlYWs7CisJICAgICAgY2FzZSAnWic6ICBtcHpfc2V0X3NpICgobXB6X3B0cikgcCwgKGxvbmcpIHJldHZhbCk7IGJyZWFrOworCSAgICAgIH0KKwkgICAgfQorCSAgICB2YV9jb3B5IChsYXN0X2FwLCBhcCk7CisJICAgIGxhc3RfZm10ID0gZm10OworCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ28nOgorCSAgICBwYXJhbS5iYXNlID0gODsKKwkgICAgZ290byBpbnRlZ2VyOworCisJICBjYXNlICdwJzoKKwkgIGNhc2UgJ3MnOgorCSAgICAvKiAidm9pZCAqIiB3aWxsIGJlIGdvb2QgZW5vdWdoIGZvciAiY2hhciAqIiBvciAid2NoYXJfdCAqIiwgbm8KKwkgICAgICAgbmVlZCBmb3Igc2VwYXJhdGUgY29kZS4gICovCisJICAgICh2b2lkKSB2YV9hcmcgKGFwLCBjb25zdCB2b2lkICopOworCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ3gnOgorCSAgICBwYXJhbS5iYXNlID0gMTY7CisJICAgIGdvdG8gaW50ZWdlcjsKKwkgIGNhc2UgJ1gnOgorCSAgICBwYXJhbS5iYXNlID0gLTE2OworCSAgICBnb3RvIGludGVnZXI7CisKKwkgIGNhc2UgJyUnOgorCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJyMnOgorCSAgICBwYXJhbS5zaG93YmFzZSA9IERPUFJOVF9TSE9XQkFTRV9OT05aRVJPOworCSAgICBicmVhazsKKworCSAgY2FzZSAnXCcnOgorCSAgICAvKiBnbGliYyBkaWdpdCBncm91cGluZywganVzdCBwYXNzIGl0IHRocm91Z2gsIG5vIHN1cHBvcnQgZm9yIGl0CisJICAgICAgIG9uIGdtcCB0eXBlcyAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAnKyc6CisJICBjYXNlICcgJzoKKwkgICAgcGFyYW0uc2lnbiA9IGZjaGFyOworCSAgICBicmVhazsKKworCSAgY2FzZSAnLSc6CisJICAgIHBhcmFtLmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9MRUZUOworCSAgICBicmVhazsKKwkgIGNhc2UgJy4nOgorCSAgICBzZWVuX3ByZWNpc2lvbiA9IDE7CisJICAgIHBhcmFtLnByZWMgPSAtMTsgLyogIi4iIGFsb25lIG1lYW5zIGFsbCBuZWNlc3NhcnkgZGlnaXRzICovCisJICAgIHZhbHVlID0gJnBhcmFtLnByZWM7CisJICAgIGJyZWFrOworCisJICBjYXNlICcqJzoKKwkgICAgeworCSAgICAgIGludCBuID0gdmFfYXJnIChhcCwgaW50KTsKKworCSAgICAgIGlmICh2YWx1ZSA9PSAmcGFyYW0ud2lkdGgpCisJCXsKKwkJICAvKiBuZWdhdGl2ZSB3aWR0aCBtZWFucyBsZWZ0IGp1c3RpZnkgKi8KKwkJICBpZiAobiA8IDApCisJCSAgICB7CisJCSAgICAgIHBhcmFtLmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9MRUZUOworCQkgICAgICBuID0gLW47CisJCSAgICB9CisJCSAgcGFyYW0ud2lkdGggPSBuOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogZG9uJ3QgYWxsb3cgbmVnYXRpdmUgcHJlY2lzaW9uICovCisJCSAgcGFyYW0ucHJlYyA9IE1BWCAoMCwgbik7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnMCc6CisJICAgIGlmICh2YWx1ZSA9PSAmcGFyYW0ud2lkdGgpCisJICAgICAgeworCQkvKiBpbiB3aWR0aCBmaWVsZCwgc2V0IGZpbGwgKi8KKwkJcGFyYW0uZmlsbCA9ICcwJzsKKworCQkvKiBmb3IgcmlnaHQganVzdGlmeSwgcHV0IHRoZSBmaWxsIGFmdGVyIGFueSBtaW51cyBzaWduICovCisJCWlmIChwYXJhbS5qdXN0aWZ5ID09IERPUFJOVF9KVVNUSUZZX1JJR0hUKQorCQkgIHBhcmFtLmp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9JTlRFUk5BTDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIGluIHByZWNpc2lvbiBmaWVsZCwgc2V0IHZhbHVlICovCisJCSp2YWx1ZSA9IDA7CisJICAgICAgfQorCSAgICBicmVhazsKKworCSAgY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOgorCSAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJICAgIC8qIHByb2Nlc3MgYWxsIGRpZ2l0cyB0byBmb3JtIGEgdmFsdWUgKi8KKwkgICAgeworCSAgICAgIGludCAgbiA9IDA7CisJICAgICAgZG8geworCQluID0gbiAqIDEwICsgKGZjaGFyLScwJyk7CisJCWZjaGFyID0gKmZtdCsrOworCSAgICAgIH0gd2hpbGUgKGlzYXNjaWkgKGZjaGFyKSAmJiBpc2RpZ2l0IChmY2hhcikpOworCSAgICAgIGZtdC0tOyAvKiB1bmdldCB0aGUgbm9uLWRpZ2l0ICovCisJICAgICAgKnZhbHVlID0gbjsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgLyogc29tZXRoaW5nIGludmFsaWQgKi8KKwkgICAgQVNTRVJUICgwKTsKKwkgICAgZ290byBuZXh0OworCSAgfQorCX0KKworICAgIG5leHQ6CisgICAgICAvKiBTdG9wIHBhcnNpbmcgdGhlIGN1cnJlbnQgIiUiIGZvcm1hdCwgbG9vayBmb3IgYSBuZXcgb25lLiAqLworICAgICAgOworICAgIH0KKworICBUUkFDRSAocHJpbnRmICgicmVtYWluZGVyOiBcIiVzXCJcbiIsIGxhc3RfZm10KSk7CisgIGlmICgqbGFzdF9mbXQgIT0gJ1wwJykKKyAgICBET1BSTlRfRk9STUFUIChsYXN0X2ZtdCwgbGFzdF9hcCk7CisKKyAgaWYgKGZ1bnMtPmZpbmFsICE9IE5VTEwpCisgICAgaWYgKCgqZnVucy0+ZmluYWwpIChkYXRhKSA9PSAtMSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyBkb25lOgorICBfX0dNUF9GUkVFX0ZVTkNfVFlQRSAoYWxsb2NfZm10LCBhbGxvY19mbXRfc2l6ZSwgY2hhcik7CisgIHJldHVybiByZXR2YWw7CisKKyBlcnJvcjoKKyAgcmV0dmFsID0gLTE7CisgIGdvdG8gZG9uZTsKK30KZGlmZiAtLWdpdCBhL3ByaW50Zi9kb3BybnRmLmMgYi9wcmludGYvZG9wcm50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhN2UwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvZG9wcm50Zi5jCkBAIC0wLDAgKzEsMzg5IEBACisvKiBfX2dtcF9kb3BybnRfbXBmIC0tIG1wZiBmb3JtYXR0ZWQgb3V0cHV0LgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgLyogZm9yIHZhX2xpc3QgYW5kIGhlbmNlIGRvcHJudF9mdW5zX3QgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKworLyogY2hhbmdlIHRoaXMgdG8gIiNkZWZpbmUgVFJBQ0UoeCkgeCIgZm9yIGRpYWdub3N0aWNzICovCisjZGVmaW5lIFRSQUNFKHgpCisKKworLyogVGhlIHNlcGFyYXRlIG9mIF9fZ21wX2RvcHJudF9mbG9hdF9kaWdpdHMgYW5kIF9fZ21wX2RvcHJudF9mbG9hdCBpcyBzbworICAgc29tZSBDKysgY2FuIGRvIHRoZSBtcGZfZ2V0X3N0ciBhbmQgcmVsZWFzZSBpdCBpbiBjYXNlIG9mIGFuIGV4Y2VwdGlvbiAqLworCisjZGVmaW5lIERJR0lUX1ZBTFVFKGMpICAgICAgICAgICAgICAgICAgXAorICAoaXNkaWdpdCAoYykgICA/IChjKSAtICcwJyAgICAgICAgICAgIFwKKyAgIDogaXNsb3dlciAoYykgPyAoYykgLSAnYScgKyAxMCAgICAgICBcCisgICA6ICAgICAgICAgICAgICAgKGMpIC0gJ0EnICsgMTApCisKK2ludAorX19nbXBfZG9wcm50X21wZiAoY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgKmZ1bnMsCisJCSAgdm9pZCAqZGF0YSwKKwkJICBjb25zdCBzdHJ1Y3QgZG9wcm50X3BhcmFtc190ICpwLAorCQkgIGNvbnN0IGNoYXIgKnBvaW50LAorCQkgIG1wZl9zcmNwdHIgZikKK3sKKyAgaW50ICAgICAgICAgcHJlYywgbmRpZ2l0cywgZnJlZV9zaXplLCBsZW4sIG5ld2xlbiwganVzdGlmeSwganVzdGxlbiwgZXhwbGVuOworICBpbnQgICAgICAgICBzaG93YmFzZWxlbiwgc2lnbiwgc2lnbmxlbiwgaW50bGVuLCBpbnR6ZXJvcywgcG9pbnRsZW47CisgIGludCAgICAgICAgIGZyYWN6ZXJvcywgZnJhY2xlbiwgcHJlY3plcm9zOworICBjaGFyICAgICAgICAqcywgKmZyZWVfcHRyOworICBtcF9leHBfdCAgICBleHA7CisgIGNoYXIgICAgICAgIGV4cG9uZW50W0dNUF9MSU1CX0JJVFMgKyAxMF07CisgIGNvbnN0IGNoYXIgICpzaG93YmFzZTsKKyAgaW50ICAgICAgICAgcmV0dmFsID0gMDsKKworICBUUkFDRSAocHJpbnRmICgiX19nbXBfZG9wcm50X2Zsb2F0XG4iKTsKKwkgcHJpbnRmICgiICBjb252PSVkIHByZWM9JWRcbiIsIHAtPmNvbnYsIHAtPnByZWMpKTsKKworICBwcmVjID0gcC0+cHJlYzsKKyAgaWYgKHByZWMgPD0gLTEpCisgICAgeworICAgICAgLyogYWxsIGRpZ2l0cyAqLworICAgICAgbmRpZ2l0cyA9IDA7CisKKyAgICAgIC8qIGFycmFuZ2UgdGhlIGZpeGVkL3NjaWVudGlmaWMgZGVjaXNpb24gb24gYSAicHJlYyIgaW1wbGllZCBieSBob3cKKwkgbWFueSBzaWduaWZpY2FudCBkaWdpdHMgdGhlcmUgYXJlICovCisgICAgICBpZiAocC0+Y29udiA9PSBET1BSTlRfQ09OVl9HRU5FUkFMKQorCU1QRl9TSUdOSUZJQ0FOVF9ESUdJVFMgKHByZWMsIFBSRUMoZiksIEFCUyhwLT5iYXNlKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChwLT5jb252KSB7CisgICAgICBjYXNlIERPUFJOVF9DT05WX0ZJWEVEOgorCS8qIFByZWNpc2lvbiBpcyBkaWdpdHMgYWZ0ZXIgdGhlIHJhZGl4IHBvaW50LiAgVHJ5IG5vdCB0byBnZW5lcmF0ZQorCSAgIHRvbyBtYW55IG1vcmUgdGhhbiB3aWxsIGFjdHVhbGx5IGJlIHJlcXVpcmVkLiAgSWYgZj49MSB0aGVuCisJICAgb3ZlcmVzdGltYXRlIHRoZSBpbnRlZ2VyIHBhcnQsIGFuZCBhZGQgcHJlYy4gIElmIGY8MSB0aGVuCisJICAgdW5kZXJlc3RpbWF0ZSB0aGUgemVyb3MgYmV0d2VlbiB0aGUgcmFkaXggcG9pbnQgYW5kIHRoZSBmaXJzdAorCSAgIGRpZ2l0IGFuZCBzdWJ0cmFjdCB0aGF0IGZyb20gcHJlYy4gIEluIGVpdGhlciBjYXNlIGFkZCAyIHNvIHRoZQorCSAgIHJvdW5kIHRvIG5lYXJlc3QgY2FuIGJlIGFwcGxpZWQgYWNjdXJhdGVseS4gIEZpbmFsbHksIHdlIGFkZCAxIHRvCisJICAgaGFuZGxlIHRoZSBjYXNlIG9mIDEtZXBzIHdoZXJlIEVYUChmKSA9IDAgYnV0IG1wZl9nZXRfc3RyIHJldHVybnMKKwkgICBleHAgYXMgMS4gICovCisJbmRpZ2l0cyA9IHByZWMgKyAyICsgMQorCSAgKyBFWFAoZikgKiAobXBfYmFzZXNbQUJTKHAtPmJhc2UpXS5jaGFyc19wZXJfbGltYiArIChFWFAoZik+PTApKTsKKwluZGlnaXRzID0gTUFYIChuZGlnaXRzLCAxKTsKKwlicmVhazsKKworICAgICAgY2FzZSBET1BSTlRfQ09OVl9TQ0lFTlRJRklDOgorCS8qIHByZWNpc2lvbiBpcyBkaWdpdHMgYWZ0ZXIgdGhlIHJhZGl4IHBvaW50LCBhbmQgdGhlcmUncyBvbmUgZGlnaXQKKwkgICBiZWZvcmUgKi8KKwluZGlnaXRzID0gcHJlYyArIDE7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJQVNTRVJUICgwKTsKKwkvKkZBTExUSFJVKi8KKworICAgICAgY2FzZSBET1BSTlRfQ09OVl9HRU5FUkFMOgorCS8qIHByZWNpc2lvbiBpcyB0b3RhbCBkaWdpdHMsIGJ1dCBiZSBzdXJlIHRvIGFzayBtcGZfZ2V0X3N0ciBmb3IgYXQKKwkgICBsZWFzdCAxLCBub3QgMCAqLworCW5kaWdpdHMgPSBNQVggKHByZWMsIDEpOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgVFJBQ0UgKHByaW50ZiAoIiAgbmRpZ2l0cyAlZFxuIiwgbmRpZ2l0cykpOworCisgIHMgPSBtcGZfZ2V0X3N0ciAoTlVMTCwgJmV4cCwgcC0+YmFzZSwgbmRpZ2l0cywgZik7CisgIGxlbiA9IHN0cmxlbiAocyk7CisgIGZyZWVfcHRyID0gczsKKyAgZnJlZV9zaXplID0gbGVuICsgMTsKKyAgVFJBQ0UgKHByaW50ZiAoIiAgcyAgICVzXG4iLCBzKTsKKwkgcHJpbnRmICgiICBleHAgJWxkXG4iLCBleHApOworCSBwcmludGYgKCIgIGxlbiAlZFxuIiwgbGVuKSk7CisKKyAgLyogRm9yIGZpeGVkIG1vZGUgY2hlY2sgdGhlIG5kaWdpdHMgZm9ybWVkIGFib3ZlIHdhcyBpbiBmYWN0IGVub3VnaCBmb3IKKyAgICAgdGhlIGludGVnZXIgcGFydCBwbHVzIHAtPnByZWMgYWZ0ZXIgdGhlIHJhZGl4IHBvaW50LiAqLworICBBU1NFUlQgKChwLT5jb252ID09IERPUFJOVF9DT05WX0ZJWEVEICYmIHAtPnByZWMgPiAtMSkKKwkgID8gbmRpZ2l0cyA+PSBNQVggKDEsIGV4cCArIHAtPnByZWMgKyAyKSA6IDEpOworCisgIHNpZ24gPSBwLT5zaWduOworICBpZiAoc1swXSA9PSAnLScpCisgICAgeworICAgICAgc2lnbiA9IHNbMF07CisgICAgICBzKyssIGxlbi0tOworICAgIH0KKyAgc2lnbmxlbiA9IChzaWduICE9ICdcMCcpOworICBUUkFDRSAocHJpbnRmICgiICBzaWduICVjICBzaWdubGVuICVkXG4iLCBzaWduLCBzaWdubGVuKSk7CisKKyAgc3dpdGNoIChwLT5jb252KSB7CisgIGNhc2UgRE9QUk5UX0NPTlZfRklYRUQ6CisgICAgaWYgKHByZWMgPD0gLTEpCisgICAgICBwcmVjID0gTUFYICgwLCBsZW4tZXhwKTsgICAvKiByZXRhaW4gYWxsIGRpZ2l0cyAqLworCisgICAgLyogVHJ1bmNhdGUgaWYgbmVjZXNzYXJ5IHNvIGZyYWN0aW9uIHdpbGwgYmUgYXQgbW9zdCBwcmVjIGRpZ2l0cy4gKi8KKyAgICBBU1NFUlQgKHByZWMgPj0gMCk7CisgICAgbmV3bGVuID0gZXhwICsgcHJlYzsKKyAgICBpZiAobmV3bGVuIDwgMCkKKyAgICAgIHsKKwkvKiBmaXJzdCBub24temVybyBkaWdpdCBpcyBiZWxvdyB0YXJnZXQgcHJlYywgYW5kIGF0IGxlYXN0IG9uZSB6ZXJvCisJICAgZGlnaXQgaW4gYmV0d2Vlbiwgc28gcHJpbnQgemVybyAqLworCWxlbiA9IDA7CisJZXhwID0gMDsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChsZW4gPD0gbmV3bGVuKQorICAgICAgeworCS8qIGFscmVhZHkgZ290IGZldyBlbm91Z2ggZGlnaXRzICovCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCS8qIGRpc2NhcmQgZXhjZXNzIGRpZ2l0cyBhbmQgcm91bmQgdG8gbmVhcmVzdCAqLworCisJY29uc3QgY2hhciAgKm51bV90b190ZXh0ID0gKHAtPmJhc2UgPj0gMAorCQkJCSAgICA/ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisJCQkJICAgIDogIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpOworCWludCAgYmFzZSA9IEFCUyhwLT5iYXNlKTsKKwlpbnQgIG47CisKKwlBU1NFUlQgKGJhc2UgPD0gMzYpOworCisJbGVuID0gbmV3bGVuOworCW4gPSBESUdJVF9WQUxVRSAoc1tsZW5dKTsKKwlUUkFDRSAocHJpbnRmICgiICByb3VuZGluZyB3aXRoICVkXG4iLCBuKSk7CisJaWYgKG4gPj0gKGJhc2UgKyAxKSAvIDIpCisJICB7CisJICAgIC8qIHByb3BhZ2F0ZSBhIGNhcnJ5ICovCisJICAgIGZvciAoOzspCisJICAgICAgeworCQlpZiAobGVuID09IDApCisJCSAgeworCQkgICAgc1swXSA9ICcxJzsKKwkJICAgIGxlbiA9IDE7CisJCSAgICBleHArKzsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJbiA9IERJR0lUX1ZBTFVFIChzW2xlbi0xXSk7CisJCUFTU0VSVCAobiA+PSAwICYmIG4gPCBiYXNlKTsKKwkJbisrOworCQlpZiAobiAhPSBiYXNlKQorCQkgIHsKKwkJICAgIFRSQUNFIChwcmludGYgKCIgIHN0b3Jpbmcgbm93ICVkXG4iLCBuKSk7CisJCSAgICBzW2xlbi0xXSA9IG51bV90b190ZXh0W25dOworCQkgICAgYnJlYWs7CisJCSAgfQorCQlsZW4tLTsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiB0cnVuY2F0ZSBvbmx5LCBzdHJpcCBhbnkgdHJhaWxpbmcgemVyb3Mgbm93IGV4cG9zZWQgKi8KKwkgICAgd2hpbGUgKGxlbiA+IDAgJiYgc1tsZW4tMV0gPT0gJzAnKQorCSAgICAgIGxlbi0tOworCSAgfQorCisJLyogQ2FuIGhhdmUgbmV3bGVuPT0wLCBpbiB3aGljaCBjYXNlIHRoZSB0cnVuY2F0ZSB3YXMganVzdCB0byBjaGVjaworCSAgIGZvciBhIGNhcnJ5IHR1cm5pbmcgaXQgaW50byAiMSIuICBJZiB3ZSdyZSBsZWZ0IHdpdGggbGVuPT0wIHRoZW4KKwkgICBhZGp1c3QgZXhwIHRvIG1hdGNoLiAgKi8KKwlpZiAobGVuID09IDApCisJICBleHAgPSAwOworICAgICAgfQorCisgIGZpeGVkOgorICAgIEFTU0VSVCAobGVuID09IDAgPyBleHAgPT0gMCA6IDEpOworICAgIGlmIChleHAgPD0gMCkKKyAgICAgIHsKKwlUUkFDRSAocHJpbnRmICgiICBmaXhlZCAwLjAwMHNzc1xuIikpOworCWludGxlbiA9IDA7CisJaW50emVyb3MgPSAxOworCWZyYWN6ZXJvcyA9IC1leHA7CisJZnJhY2xlbiA9IGxlbjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJVFJBQ0UgKHByaW50ZiAoIiAgZml4ZWQgc3NzLnNzcyBvciBzc3MwMDBcbiIpKTsKKwlpbnRsZW4gPSBNSU4gKGxlbiwgZXhwKTsKKwlpbnR6ZXJvcyA9IGV4cCAtIGludGxlbjsKKwlmcmFjemVyb3MgPSAwOworCWZyYWNsZW4gPSBsZW4gLSBpbnRsZW47CisgICAgICB9CisgICAgZXhwbGVuID0gMDsKKyAgICBicmVhazsKKworICBjYXNlIERPUFJOVF9DT05WX1NDSUVOVElGSUM6CisgICAgeworICAgICAgbG9uZyBpbnQgZXhwdmFsOworICAgICAgY2hhciAgZXhwc2lnbjsKKworICAgICAgaWYgKHByZWMgPD0gLTEpCisJcHJlYyA9IE1BWCAoMCwgbGVuLTEpOyAgIC8qIHJldGFpbiBhbGwgZGlnaXRzICovCisKKyAgICBzY2llbnRpZmljOgorICAgICAgVFJBQ0UgKHByaW50ZiAoIiAgc2NpZW50aWZpYyBzLnNzc1xuIikpOworCisgICAgICBpbnRsZW4gPSBNSU4gKDEsIGxlbik7CisgICAgICBpbnR6ZXJvcyA9IChpbnRsZW4gPT0gMCA/IDEgOiAwKTsKKyAgICAgIGZyYWN6ZXJvcyA9IDA7CisgICAgICBmcmFjbGVuID0gbGVuIC0gaW50bGVuOworCisgICAgICBleHB2YWwgPSAoZXhwLWludGxlbik7CisgICAgICBpZiAocC0+ZXhwdGltZXM0KQorCWV4cHZhbCA8PD0gMjsKKworICAgICAgLyogU3BsaXQgb3V0IHRoZSBzaWduIHNpbmNlICVvIG9yICV4IGluIGV4cGZtdCBnaXZlIG5lZ2F0aXZlcyBhcyB0d29zCisJIGNvbXBsZW1lbnQsIG5vdCB3aXRoIGEgc2lnbi4gKi8KKyAgICAgIGV4cHNpZ24gPSAoZXhwdmFsID49IDAgPyAnKycgOiAnLScpOworICAgICAgZXhwdmFsID0gQUJTIChleHB2YWwpOworCisjaWYgSEFWRV9WU05QUklOVEYKKyAgICAgIGV4cGxlbiA9IHNucHJpbnRmIChleHBvbmVudCwgc2l6ZW9mKGV4cG9uZW50KSwKKwkJCSBwLT5leHBmbXQsIGV4cHNpZ24sIGV4cHZhbCk7CisgICAgICAvKiB0ZXN0IGZvciA8IHNpemVvZi0xIHNpbmNlIGEgZ2xpYmMgMi4wLnggcmV0dXJuIG9mIHNpemVvZi0xIG1pZ2h0CisJIG1lYW4gdHJ1bmNhdGlvbiAqLworICAgICAgQVNTRVJUIChleHBsZW4gPj0gMCAmJiBleHBsZW4gPCBzaXplb2YoZXhwb25lbnQpLTEpOworI2Vsc2UKKyAgICAgIHNwcmludGYgKGV4cG9uZW50LCBwLT5leHBmbXQsIGV4cHNpZ24sIGV4cHZhbCk7CisgICAgICBleHBsZW4gPSBzdHJsZW4gKGV4cG9uZW50KTsKKyAgICAgIEFTU0VSVCAoZXhwbGVuIDwgc2l6ZW9mKGV4cG9uZW50KSk7CisjZW5kaWYKKyAgICAgIFRSQUNFIChwcmludGYgKCIgIGV4cGZtdCAlcyBnaXZlcyAlc1xuIiwgcC0+ZXhwZm10LCBleHBvbmVudCkpOworICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIEFTU0VSVCAoMCk7CisgICAgLypGQUxMVEhSVSovICAvKiB0byBzdG9wIHZhcmlhYmxlcyBsb29raW5nIHVuaW5pdGlhbGl6ZWQgKi8KKworICBjYXNlIERPUFJOVF9DT05WX0dFTkVSQUw6CisgICAgLyogVGhlIGV4cG9uZW50IGZvciAic2NpZW50aWZpYyIgd2lsbCBiZSBleHAtMSwgY2hvb3NlIHNjaWVudGlmaWMgaWYKKyAgICAgICB0aGlzIGlzIDwgLTQgb3IgPj0gcHJlYyAoYW5kIG1pbmltdW0gMSBmb3IgcHJlYykuICBGb3IgZj09MCB3aWxsIGhhdmUKKyAgICAgICBleHA9PTAgYW5kIGdldCB0aGUgZGVzaXJlZCAiZml4ZWQiLiAgVGhpcyBydWxlIGZvbGxvd3MgZ2xpYmMuICBGb3IKKyAgICAgICBmaXhlZCB0aGVyZSdzIG5vIG5lZWQgdG8gdHJ1bmNhdGUsIHRoZSBkZXNpcmVkIG5kaWdpdHMgd2lsbCBhbHJlYWR5CisgICAgICAgYmUgYXMgcmVxdWlyZWQuICAqLworICAgIGlmIChleHAtMSA8IC00IHx8IGV4cC0xID49IE1BWCAoMSwgcHJlYykpCisgICAgICBnb3RvIHNjaWVudGlmaWM7CisgICAgZWxzZQorICAgICAgZ290byBmaXhlZDsKKyAgfQorCisgIFRSQUNFIChwcmludGYgKCIgIGludGxlbiAlZCBpbnR6ZXJvcyAlZCBmcmFjemVyb3MgJWQgZnJhY2xlbiAlZFxuIiwKKwkJIGludGxlbiwgaW50emVyb3MsIGZyYWN6ZXJvcywgZnJhY2xlbikpOworICBBU1NFUlQgKHAtPnByZWMgPD0gLTEKKwkgID8gaW50bGVuICsgZnJhY2xlbiA9PSBzdHJsZW4gKHMpCisJICA6IGludGxlbiArIGZyYWNsZW4gPD0gc3RybGVuIChzKSk7CisKKyAgaWYgKHAtPnNob3d0cmFpbGluZykKKyAgICB7CisgICAgICAvKiBQYWQgdG8gcmVxdWVzdGVkIHByZWNpc2lvbiB3aXRoIHRyYWlsaW5nIHplcm9zLCBmb3IgZ2VuZXJhbCB0aGlzIGlzCisJIGFsbCBkaWdpdHMsIGZvciBmaXhlZCBhbmQgc2NpZW50aWZpYyBqdXN0IHRoZSBmcmFjdGlvbi4gICovCisgICAgICBwcmVjemVyb3MgPSBwcmVjIC0gKGZyYWN6ZXJvcyArIGZyYWNsZW4KKwkJCSAgKyAocC0+Y29udiA9PSBET1BSTlRfQ09OVl9HRU5FUkFMCisJCQkgICAgID8gaW50bGVuICsgaW50emVyb3MgOiAwKSk7CisgICAgICBwcmVjemVyb3MgPSBNQVggKDAsIHByZWN6ZXJvcyk7CisgICAgfQorICBlbHNlCisgICAgcHJlY3plcm9zID0gMDsKKyAgVFJBQ0UgKHByaW50ZiAoIiAgcHJlYz0lZCBzaG93dHJhaWxpbmc9JWQsIHBhZCB3aXRoIHByZWN6ZXJvcyAlZFxuIiwKKwkJIHByZWMsIHAtPnNob3d0cmFpbGluZywgcHJlY3plcm9zKSk7CisKKyAgLyogcmFkaXggcG9pbnQgaWYgbmVlZGVkLCBvciBpZiBmb3JjZWQgKi8KKyAgcG9pbnRsZW4gPSAoKGZyYWN6ZXJvcyArIGZyYWNsZW4gKyBwcmVjemVyb3MpICE9IDAgfHwgcC0+c2hvd3BvaW50ICE9IDApCisgICAgPyBzdHJsZW4gKHBvaW50KSA6IDA7CisgIFRSQUNFIChwcmludGYgKCIgIHBvaW50IHwlc3wgIHBvaW50bGVuICVkXG4iLCBwb2ludCwgcG9pbnRsZW4pKTsKKworICAvKiBOb3RpY2UgdGhlIHRlc3QgZm9yIGEgbm9uLXplcm8gdmFsdWUgaXMgZG9uZSBhZnRlciBhbnkgdHJ1bmNhdGlvbiBmb3IKKyAgICAgRE9QUk5UX0NPTlZfRklYRUQuICovCisgIHNob3diYXNlID0gTlVMTDsKKyAgc2hvd2Jhc2VsZW4gPSAwOworICBzd2l0Y2ggKHAtPnNob3diYXNlKSB7CisgIGRlZmF1bHQ6CisgICAgQVNTRVJUICgwKTsKKyAgICAvKkZBTExUSFJVKi8KKyAgY2FzZSBET1BSTlRfU0hPV0JBU0VfTk86CisgICAgYnJlYWs7CisgIGNhc2UgRE9QUk5UX1NIT1dCQVNFX05PTlpFUk86CisgICAgaWYgKGludGxlbiA9PSAwICYmIGZyYWNsZW4gPT0gMCkKKyAgICAgIGJyZWFrOworICAgIC8qRkFMTFRIUlUqLworICBjYXNlIERPUFJOVF9TSE9XQkFTRV9ZRVM6CisgICAgc3dpdGNoIChwLT5iYXNlKSB7CisgICAgY2FzZSAxNjogIHNob3diYXNlID0gIjB4Ijsgc2hvd2Jhc2VsZW4gPSAyOyBicmVhazsKKyAgICBjYXNlIC0xNjogc2hvd2Jhc2UgPSAiMFgiOyBzaG93YmFzZWxlbiA9IDI7IGJyZWFrOworICAgIGNhc2UgODogICBzaG93YmFzZSA9ICIwIjsgIHNob3diYXNlbGVuID0gMTsgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIFRSQUNFIChwcmludGYgKCIgIHNob3diYXNlICVzIHNob3diYXNlbGVuICVkXG4iLAorCQkgc2hvd2Jhc2UgPT0gTlVMTCA/ICIiIDogc2hvd2Jhc2UsIHNob3diYXNlbGVuKSk7CisKKyAgLyogbGVmdCBvdmVyIGZpZWxkIHdpZHRoICovCisgIGp1c3RsZW4gPSBwLT53aWR0aCAtIChzaWdubGVuICsgc2hvd2Jhc2VsZW4gKyBpbnRsZW4gKyBpbnR6ZXJvcyArIHBvaW50bGVuCisJCQkrIGZyYWN6ZXJvcyArIGZyYWNsZW4gKyBwcmVjemVyb3MgKyBleHBsZW4pOworICBUUkFDRSAocHJpbnRmICgiICBqdXN0bGVuICVkIGZpbGwgMHglWFxuIiwganVzdGxlbiwgcC0+ZmlsbCkpOworCisgIGp1c3RpZnkgPSBwLT5qdXN0aWZ5OworICBpZiAoanVzdGxlbiA8PSAwKSAvKiBubyBqdXN0aWZ5aW5nIGlmIGV4Y2VlZCB3aWR0aCAqLworICAgIGp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9OT05FOworCisgIFRSQUNFIChwcmludGYgKCIgIGp1c3RpZnkgdHlwZSAlZCAgaW50bGVuICVkIHBvaW50bGVuICVkIGZyYWNsZW4gJWRcbiIsCisJCSBqdXN0aWZ5LCBpbnRsZW4sIHBvaW50bGVuLCBmcmFjbGVuKSk7CisKKyAgaWYgKGp1c3RpZnkgPT0gRE9QUk5UX0pVU1RJRllfUklHSFQpICAgICAgICAgLyogcGFkIGZvciByaWdodCAqLworICAgIERPUFJOVF9SRVBTIChwLT5maWxsLCBqdXN0bGVuKTsKKworICBpZiAoc2lnbmxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaWduICovCisgICAgRE9QUk5UX1JFUFMgKHNpZ24sIDEpOworCisgIERPUFJOVF9NRU1PUllfTUFZQkUgKHNob3diYXNlLCBzaG93YmFzZWxlbik7IC8qIGJhc2UgKi8KKworICBpZiAoanVzdGlmeSA9PSBET1BSTlRfSlVTVElGWV9JTlRFUk5BTCkgICAgICAvKiBwYWQgZm9yIGludGVybmFsICovCisgICAgRE9QUk5UX1JFUFMgKHAtPmZpbGwsIGp1c3RsZW4pOworCisgIERPUFJOVF9NRU1PUlkgKHMsIGludGxlbik7ICAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgKi8KKyAgRE9QUk5UX1JFUFNfTUFZQkUgKCcwJywgaW50emVyb3MpOworCisgIERPUFJOVF9NRU1PUllfTUFZQkUgKHBvaW50LCBwb2ludGxlbik7ICAgICAgIC8qIHBvaW50ICovCisKKyAgRE9QUk5UX1JFUFNfTUFZQkUgKCcwJywgZnJhY3plcm9zKTsgICAgICAgICAgLyogZnJhYyAqLworICBET1BSTlRfTUVNT1JZX01BWUJFIChzK2ludGxlbiwgZnJhY2xlbik7CisKKyAgRE9QUk5UX1JFUFNfTUFZQkUgKCcwJywgcHJlY3plcm9zKTsgICAgICAgICAgLyogcHJlYyAqLworCisgIERPUFJOVF9NRU1PUllfTUFZQkUgKGV4cG9uZW50LCBleHBsZW4pOyAgICAgIC8qIGV4cCAqLworCisgIGlmIChqdXN0aWZ5ID09IERPUFJOVF9KVVNUSUZZX0xFRlQpICAgICAgICAgIC8qIHBhZCBmb3IgbGVmdCAqLworICAgIERPUFJOVF9SRVBTIChwLT5maWxsLCBqdXN0bGVuKTsKKworIGRvbmU6CisgIF9fR01QX0ZSRUVfRlVOQ19UWVBFIChmcmVlX3B0ciwgZnJlZV9zaXplLCBjaGFyKTsKKyAgcmV0dXJuIHJldHZhbDsKKworIGVycm9yOgorICByZXR2YWwgPSAtMTsKKyAgZ290byBkb25lOworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL2RvcHJudGkuYyBiL3ByaW50Zi9kb3BybnRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZjY0MwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9kb3BybnRpLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIF9fZ21wX2RvcHJudF9pbnRlZ2VyIC0tIGludGVnZXIgc3R5bGUgZm9ybWF0dGVkIG91dHB1dC4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8qIGZvciB2YV9saXN0IGFuZCBoZW5jZSBkb3BybnRfZnVuc190ICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitfX2dtcF9kb3BybnRfaW50ZWdlciAoY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgKmZ1bnMsCisJCSAgICAgIHZvaWQgKmRhdGEsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBkb3BybnRfcGFyYW1zX3QgKnAsCisJCSAgICAgIGNvbnN0IGNoYXIgKnMpCit7CisgIGludCAgICAgICAgIHJldHZhbCA9IDA7CisgIGludCAgICAgICAgIHNsZW4sIGp1c3RsZW4sIHNob3diYXNlbGVuLCBzaWduLCBzaWdubGVuLCBzbGFzaGxlbiwgemVyb3M7CisgIGludCAgICAgICAgIGp1c3RpZnksIGRlbl9zaG93YmFzZWxlbjsKKyAgY29uc3QgY2hhciAgKnNsYXNoLCAqc2hvd2Jhc2U7CisKKyAgLyogJysnIG9yICcgJyBpZiB3YW50ZWQsIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgJy0nICovCisgIHNpZ24gPSBwLT5zaWduOworICBpZiAoc1swXSA9PSAnLScpCisgICAgeworICAgICAgc2lnbiA9IHNbMF07CisgICAgICBzKys7CisgICAgfQorICBzaWdubGVuID0gKHNpZ24gIT0gJ1wwJyk7CisKKyAgLyogaWYgdGhlIHByZWNpc2lvbiB3YXMgZXhwbGljaXRseSAwLCBwcmludCBub3RoaW5nIGZvciBhIDAgdmFsdWUgKi8KKyAgaWYgKCpzID09ICcwJyAmJiBwLT5wcmVjID09IDApCisgICAgcysrOworCisgIHNsZW4gPSBzdHJsZW4gKHMpOworICBzbGFzaCA9IHN0cmNociAocywgJy8nKTsKKworICBzaG93YmFzZSA9IE5VTEw7CisgIHNob3diYXNlbGVuID0gMDsKKworICBpZiAocC0+c2hvd2Jhc2UgIT0gRE9QUk5UX1NIT1dCQVNFX05PKQorICAgIHsKKyAgICAgIHN3aXRjaCAocC0+YmFzZSkgeworICAgICAgY2FzZSAxNjogIHNob3diYXNlID0gIjB4Ijsgc2hvd2Jhc2VsZW4gPSAyOyBicmVhazsKKyAgICAgIGNhc2UgLTE2OiBzaG93YmFzZSA9ICIwWCI7IHNob3diYXNlbGVuID0gMjsgYnJlYWs7CisgICAgICBjYXNlIDg6ICAgc2hvd2Jhc2UgPSAiMCI7ICBzaG93YmFzZWxlbiA9IDE7IGJyZWFrOworICAgICAgfQorICAgIH0KKworICBkZW5fc2hvd2Jhc2VsZW4gPSBzaG93YmFzZWxlbjsKKyAgaWYgKHNsYXNoID09IE5VTEwKKyAgICAgIHx8IChwLT5zaG93YmFzZSA9PSBET1BSTlRfU0hPV0JBU0VfTk9OWkVSTyAmJiBzbGFzaFsxXSA9PSAnMCcpKQorICAgIGRlbl9zaG93YmFzZWxlbiA9IDA7CisKKyAgaWYgKHAtPnNob3diYXNlID09IERPUFJOVF9TSE9XQkFTRV9OT05aRVJPICYmIHNbMF0gPT0gJzAnKQorICAgIHNob3diYXNlbGVuID0gMDsKKworICAvKiB0aGUgaW5mbHVlbmNlIG9mIHAtPnByZWMgb24gbXBxIGlzIGN1cnJlbnRseSB1bmRlZmluZWQgKi8KKyAgemVyb3MgPSBNQVggKDAsIHAtPnByZWMgLSBzbGVuKTsKKworICAvKiBzcGFjZSBsZWZ0IG92ZXIgYWZ0ZXIgYWN0dWFsIG91dHB1dCBsZW5ndGggKi8KKyAganVzdGxlbiA9IHAtPndpZHRoCisgICAgLSAoc3RybGVuKHMpICsgc2lnbmxlbiArIHNob3diYXNlbGVuICsgZGVuX3Nob3diYXNlbGVuICsgemVyb3MpOworCisgIGp1c3RpZnkgPSBwLT5qdXN0aWZ5OworICBpZiAoanVzdGxlbiA8PSAwKSAvKiBubyBqdXN0aWZ5aW5nIGlmIGV4Y2VlZCB3aWR0aCAqLworICAgIGp1c3RpZnkgPSBET1BSTlRfSlVTVElGWV9OT05FOworCisgIGlmIChqdXN0aWZ5ID09IERPUFJOVF9KVVNUSUZZX1JJR0hUKSAgICAgICAgICAgICAvKiBwYWQgcmlnaHQgKi8KKyAgICBET1BSTlRfUkVQUyAocC0+ZmlsbCwganVzdGxlbik7CisKKyAgRE9QUk5UX1JFUFNfTUFZQkUgKHNpZ24sIHNpZ25sZW4pOyAgICAgICAgICAgICAgIC8qIHNpZ24gKi8KKworICBET1BSTlRfTUVNT1JZX01BWUJFIChzaG93YmFzZSwgc2hvd2Jhc2VsZW4pOyAgICAgLyogYmFzZSAqLworCisgIERPUFJOVF9SRVBTX01BWUJFICgnMCcsIHplcm9zKTsgICAgICAgICAgICAgICAgICAvKiB6ZXJvcyAqLworCisgIGlmIChqdXN0aWZ5ID09IERPUFJOVF9KVVNUSUZZX0lOVEVSTkFMKSAgICAgICAgICAvKiBwYWQgaW50ZXJuYWwgKi8KKyAgICBET1BSTlRfUkVQUyAocC0+ZmlsbCwganVzdGxlbik7CisKKyAgLyogaWYgdGhlcmUncyBhIHNob3diYXNlIG9uIHRoZSBkZW5vbWluYXRvciwgdGhlbiBwcmludCB0aGUgbnVtZXJhdG9yCisgICAgIHNlcGFyYXRlbHkgc28gaXQgY2FuIGJlIGluc2VydGVkICovCisgIGlmIChkZW5fc2hvd2Jhc2VsZW4gIT0gMCkKKyAgICB7CisgICAgICBBU1NFUlQgKHNsYXNoICE9IE5VTEwpOworICAgICAgc2xhc2hsZW4gPSBzbGFzaCsxIC0gczsKKyAgICAgIERPUFJOVF9NRU1PUlkgKHMsIHNsYXNobGVuKTsgICAgICAgICAgICAgICAgIC8qIG51bWVyYXRvciBhbmQgc2xhc2ggKi8KKyAgICAgIHNsZW4gLT0gc2xhc2hsZW47CisgICAgICBzICs9IHNsYXNobGVuOworICAgICAgRE9QUk5UX01FTU9SWSAoc2hvd2Jhc2UsIGRlbl9zaG93YmFzZWxlbik7CisgICAgfQorCisgIERPUFJOVF9NRU1PUlkgKHMsIHNsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIsIG9yIGRlbm9taW5hdG9yICovCisKKyAgaWYgKGp1c3RpZnkgPT0gRE9QUk5UX0pVU1RJRllfTEVGVCkgICAgICAgICAgICAgIC8qIHBhZCBsZWZ0ICovCisgICAgRE9QUk5UX1JFUFMgKHAtPmZpbGwsIGp1c3RsZW4pOworCisgZG9uZToKKyAgcmV0dXJuIHJldHZhbDsKKworIGVycm9yOgorICByZXR2YWwgPSAtMTsKKyAgZ290byBkb25lOworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL2ZwcmludGYuYyBiL3ByaW50Zi9mcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOGIzYgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9mcHJpbnRmLmMKQEAgLTAsMCArMSw0OCBAQAorLyogZ21wX2ZwcmludGYgLS0gZm9ybWF0dGVkIG91dHB1dC4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK2dtcF9mcHJpbnRmIChGSUxFICpmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgIGFwOworICBpbnQgICAgICByZXQ7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworCisgIHJldCA9IF9fZ21wX2RvcHJudCAoJl9fZ21wX2ZwcmludGZfZnVucywgZnAsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3ByaW50Zi9vYnByaW50Zi5jIGIvcHJpbnRmL29icHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyZDZkZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9vYnByaW50Zi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGdtcF9vYnN0YWNrX3ByaW50ZiAtLSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIG9ic3RhY2suCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX09CU1RBQ0tfVlBSSU5URgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8b2JzdGFjay5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK2dtcF9vYnN0YWNrX3ByaW50ZiAoc3RydWN0IG9ic3RhY2sgKm9iLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCAgYXA7CisgIGludCAgICAgIHJldDsKKworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgQVNTRVJUICghIE1FTV9PVkVSTEFQX1AgKG9ic3RhY2tfYmFzZShvYiksIG9ic3RhY2tfb2JqZWN0X3NpemUob2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LCBzdHJsZW4oZm10KSsxKSk7CisKKyAgcmV0ID0gX19nbXBfZG9wcm50ICgmX19nbXBfb2JzdGFja19wcmludGZfZnVucywgb2IsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIHJldDsKK30KKworI2Vsc2UKK3R5cGVkZWYgaW50IF9fZ21wX2R1bW15X3R5cGVkZWY7CisjZW5kaWYgLyogSEFWRV9PQlNUQUNLX1ZQUklOVEYgKi8KZGlmZiAtLWdpdCBhL3ByaW50Zi9vYnBybnRmZnVucy5jIGIvcHJpbnRmL29icHJudGZmdW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTRlOAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9vYnBybnRmZnVucy5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIF9fZ21wX29ic3RhY2tfcHJpbnRmX2Z1bnMgLS0gc3VwcG9ydCBmb3IgZ21wX29ic3RhY2tfcHJpbnRmIGFuZAorICAgZ21wX29ic3RhY2tfdnByaW50Zi4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX09CU1RBQ0tfVlBSSU5URgorCisjZGVmaW5lIF9HTlVfU09VUkNFICAgLyogYXNrIGdsaWJjIDxzdGRpby5oPiBmb3Igb2JzdGFja192cHJpbnRmICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAvKiBmb3Igb2JzdGFja192cHJpbnRmICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b2JzdGFjay5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitzdGF0aWMgaW50CitnbXBfb2JzdGFja19tZW1vcnkgKHN0cnVjdCBvYnN0YWNrICpvYiwgY29uc3QgY2hhciAqcHRyLCBzaXplX3QgbGVuKQoreworICBvYnN0YWNrX2dyb3cgKG9iLCBwdHIsIGxlbik7CisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQKK2dtcF9vYnN0YWNrX3JlcHMgKHN0cnVjdCBvYnN0YWNrICpvYiwgaW50IGMsIGludCByZXBzKQoreworICBvYnN0YWNrX2JsYW5rIChvYiwgcmVwcyk7CisgIG1lbXNldCAoKGNoYXIgKikgb2JzdGFja19uZXh0X2ZyZWUob2IpIC0gcmVwcywgYywgcmVwcyk7CisgIHJldHVybiByZXBzOworfQorCitjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfb2JzdGFja19wcmludGZfZnVucyA9IHsKKyAgKGRvcHJudF9mb3JtYXRfdCkgb2JzdGFja192cHJpbnRmLAorICAoZG9wcm50X21lbW9yeV90KSBnbXBfb2JzdGFja19tZW1vcnksCisgIChkb3BybnRfcmVwc190KSAgIGdtcF9vYnN0YWNrX3JlcHMKK307CisKKyNlbHNlCit0eXBlZGVmIGludCBfX2dtcF9kdW1teV90eXBlZGVmOworI2VuZGlmIC8qIEhBVkVfT0JTVEFDS19WUFJJTlRGICovCmRpZmYgLS1naXQgYS9wcmludGYvb2J2cHJpbnRmLmMgYi9wcmludGYvb2J2cHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2M2MxMQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9vYnZwcmludGYuYwpAQCAtMCwwICsxLDUzIEBACisvKiBnbXBfb2JzdGFja192cHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gb2JzdGFjay4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfT0JTVEFDS19WUFJJTlRGCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxvYnN0YWNrLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX29ic3RhY2tfdnByaW50ZiAoc3RydWN0IG9ic3RhY2sgKm9iLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgIEFTU0VSVCAoISBNRU1fT1ZFUkxBUF9QIChvYnN0YWNrX2Jhc2Uob2IpLCBvYnN0YWNrX29iamVjdF9zaXplKG9iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdCwgc3RybGVuKGZtdCkrMSkpOworCisgIHJldHVybiBfX2dtcF9kb3BybnQgKCZfX2dtcF9vYnN0YWNrX3ByaW50Zl9mdW5zLCBvYiwgZm10LCBhcCk7Cit9CisKKyNlbHNlCit0eXBlZGVmIGludCBfX2dtcF9kdW1teV90eXBlZGVmOworI2VuZGlmIC8qIEhBVkVfT0JTVEFDS19WUFJJTlRGICovCmRpZmYgLS1naXQgYS9wcmludGYvcHJpbnRmLmMgYi9wcmludGYvcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlY2IwYgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9wcmludGYuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBnbXBfcHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitnbXBfcHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCAgYXA7CisgIGludCAgICAgIHJldDsKKworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgcmV0ID0gX19nbXBfZG9wcm50ICgmX19nbXBfZnByaW50Zl9mdW5zLCBzdGRvdXQsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3ByaW50Zi9wcmludGZmdW5zLmMgYi9wcmludGYvcHJpbnRmZnVucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzM4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvcHJpbnRmZnVucy5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIF9fZ21wX2ZwcmludGZfZnVucyAtLSBzdXBwb3J0IGZvciBmb3JtYXR0ZWQgb3V0cHV0IHRvIEZJTEVzLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworLyogU3VuT1MgNCBzdGRpby5oIGRvZXNuJ3QgcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgdGhpcyAqLworI2lmICEgSEFWRV9ERUNMX1ZGUFJJTlRGCitpbnQgdmZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQKK2dtcF9mcHJpbnRmX21lbW9yeSAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgcmV0dXJuIGZ3cml0ZSAoc3RyLCAxLCBsZW4sIGZwKTsKK30KKworLyogZ2xpYmMgcHV0YyBpcyBhIGZ1bmN0aW9uLCBhdCBsZWFzdCB3aGVuIGl0J3MgaW4gbXVsdGktdGhyZWFkZWQgbW9kZSBvcgorICAgc29tZSBzdWNoLCBzbyBmd3JpdGUgY2h1bmtzIGluc3RlYWQgb2YgbWFraW5nIG1hbnkgY2FsbHMuICovCitzdGF0aWMgaW50CitnbXBfZnByaW50Zl9yZXBzIChGSUxFICpmcCwgaW50IGMsIGludCByZXBzKQoreworICBjaGFyICBidWZbMjU2XTsKKyAgaW50ICAgaSwgcGllY2UsIHJldDsKKyAgQVNTRVJUIChyZXBzID49IDApOworCisgIG1lbXNldCAoYnVmLCBjLCBNSU4gKHJlcHMsIHNpemVvZiAoYnVmKSkpOworICBmb3IgKGkgPSByZXBzOyBpID4gMDsgaSAtPSBzaXplb2YgKGJ1ZikpCisgICAgeworICAgICAgcGllY2UgPSBNSU4gKGksIHNpemVvZiAoYnVmKSk7CisgICAgICByZXQgPSBmd3JpdGUgKGJ1ZiwgMSwgcGllY2UsIGZwKTsKKyAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICBBU1NFUlQgKHJldCA9PSBwaWVjZSk7CisgICAgfQorCisgIHJldHVybiByZXBzOworfQorCitjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfZnByaW50Zl9mdW5zID0geworICAoZG9wcm50X2Zvcm1hdF90KSB2ZnByaW50ZiwKKyAgKGRvcHJudF9tZW1vcnlfdCkgZ21wX2ZwcmludGZfbWVtb3J5LAorICAoZG9wcm50X3JlcHNfdCkgICBnbXBfZnByaW50Zl9yZXBzLAorfTsKZGlmZiAtLWdpdCBhL3ByaW50Zi9yZXBsLXZzbnByaW50Zi5jIGIvcHJpbnRmL3JlcGwtdnNucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiNDA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9yZXBsLXZzbnByaW50Zi5jCkBAIC0wLDAgKzEsMzkzIEBACisvKiBfX2dtcF9yZXBsYWNlbWVudF92c25wcmludGYgLS0gZm9yIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSB2c25wcmludGYsIG9yCisgICBvbmx5IGhhdmUgYSBicm9rZW4gb25lLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2RlZmluZSBfR05VX1NPVVJDRSAgICAvKiBmb3Igc3RybmxlbiBwcm90b3R5cGUgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+ICAgICAvKiBmb3IgaXNkaWdpdCAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAvKiBmb3IgcHRyZGlmZl90ICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4gICAgIC8qIGZvciBOVUxMICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZiBIQVZFX0ZMT0FUX0gKKyNpbmNsdWRlIDxmbG9hdC5oPiAgICAgLyogZm9yIERCTF9NQVhfMTBfRVhQIGV0YyAqLworI2VuZGlmCisKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4gLyogZm9yIGludG1heF90ICovCisjZW5kaWYKKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBxdWFkX3QgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWYgISBIQVZFX1ZTTlBSSU5URiAgIC8qIG9ubHkgbmVlZCB0aGlzIGZpbGUgaWYgd2UgZG9uJ3QgaGF2ZSB2c25wcmludGYgKi8KKworLyogQXV0b2NvbmYgbm90ZXMgdGhhdCBBSVggNC4zIGhhcyBhIGJyb2tlbiBzdHJubGVuLCBidXQgZm9ydHVuYXRlbHkgaXQKKyAgIGRvZXNuJ3QgYWZmZWN0IHVzIHNpbmNlIF9fZ21wX3JlcGxhY2VtZW50X3ZzbnByaW50ZiBpcyBub3QgcmVxdWlyZWQgb24KKyAgIHRoYXQgc3lzdGVtLiAgKi8KKyNpZiAhIEhBVkVfU1RSTkxFTgorc3RhdGljIHNpemVfdAorc3RybmxlbiAoY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7CisgIHNpemVfdCAgaTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICBpZiAoc1tpXSA9PSAnXDAnKQorICAgICAgYnJlYWs7CisgIHJldHVybiBpOworfQorI2VuZGlmCisKKworLyogVGhlIGFwcHJvYWNoIGhlcmUgaXMgdG8gcGFyc2UgdGhlIGZtdCBzdHJpbmcsIGFuZCBkZWNpZGUgaG93IG11Y2ggc3BhY2UKKyAgIGl0IHJlcXVpcmVzLCB0aGVuIHVzZSB2c3ByaW50ZiBpbnRvIGEgYmlnIGVub3VnaCBidWZmZXIuICBUaGUgc3BhY2UKKyAgIGNhbGN1bGF0ZWQgaXNuJ3QgYW4gZXhhY3QgYW1vdW50LCBidXQgaXQncyBjZXJ0YWlubHkgbm8gbGVzcyB0aGFuCisgICByZXF1aXJlZC4KKworICAgVGhpcyBjb2RlIHdhcyBpbnNwaXJlZCBieSBHTlUgbGliaWJlcnR5L3Zhc3ByaW50Zi5jIGJ1dCB3ZSBzdXBwb3J0IG1vcmUKKyAgIGRhdGF0eXBlcywgd2hlbiBhdmFpbGFibGUuCisKKyAgIG1pbmd3MzIgLSBkb2Vzbid0IGhhdmUgdnNucHJpbnRmLCBpdCBzZWVtcy4gIEJlY2F1c2UgZ2NjIGlzIHVzZWQgYSBmdWxsCisgICAgICAgc2V0IG9mIHR5cGVzIGFyZSBhdmFpbGFibGUsIGJ1dCAibG9uZyBkb3VibGUiIGlzIGp1c3QgYSBwbGFpbiBJRUVFCisgICAgICAgNjQtYml0ICJkb3VibGUiIGFuZCBMREJMX01BWF9FWFBfMTAgaXMgY29ycmVzcG9uZGluZ2x5IGRlZmluZWQsIHNvIHdlCisgICAgICAgYXZvaWQgdGhlIGJpZyAxNS1iaXQgZXhwb25lbnQgZXN0aW1hdGUuICAqLworCitpbnQKK19fZ21wX3JlcGxhY2VtZW50X3ZzbnByaW50ZiAoY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm9yaWdfZm10LCB2YV9saXN0IG9yaWdfYXApCit7CisgIHZhX2xpc3QgICAgIGFwOworICBjb25zdCBjaGFyICAqZm10OworICBzaXplX3QgICAgICB0b3RhbF93aWR0aCwgaW50ZWdlcl9zaXplb2YsIGZsb2F0aW5nX3NpemVvZiwgbGVuOworICBjaGFyICAgICAgICBmY2hhciwgdHlwZTsKKyAgaW50ICAgICAgICAgd2lkdGgsIHByZWMsIHNlZW5fcHJlYywgZG91YmxlX2RpZ2l0cywgbG9uZ19kb3VibGVfZGlnaXRzOworICBpbnQgICAgICAgICAqdmFsdWU7CisKKyAgLyogcHJlc2VydmUgb3JpZ19hcCBmb3IgdXNlIGFmdGVyIHNpemUgZXN0aW1hdGlvbiAqLworICB2YV9jb3B5IChhcCwgb3JpZ19hcCk7CisKKyAgZm10ID0gb3JpZ19mbXQ7CisgIHRvdGFsX3dpZHRoID0gc3RybGVuIChmbXQpICsgMTsgICAvKiAxIGV4dHJhIGZvciB0aGUgJ1wwJyAqLworCisgIGludGVnZXJfc2l6ZW9mID0gc2l6ZW9mIChsb25nKTsKKyNpZiBIQVZFX0xPTkdfTE9ORworICBpbnRlZ2VyX3NpemVvZiA9IE1BWCAoaW50ZWdlcl9zaXplb2YsIHNpemVvZiAobG9uZyBsb25nKSk7CisjZW5kaWYKKyNpZiBIQVZFX1FVQURfVAorICBpbnRlZ2VyX3NpemVvZiA9IE1BWCAoaW50ZWdlcl9zaXplb2YsIHNpemVvZiAocXVhZF90KSk7CisjZW5kaWYKKworICBmbG9hdGluZ19zaXplb2YgPSBzaXplb2YgKGRvdWJsZSk7CisjaWYgSEFWRV9MT05HX0RPVUJMRQorICBmbG9hdGluZ19zaXplb2YgPSBNQVggKGZsb2F0aW5nX3NpemVvZiwgc2l6ZW9mIChsb25nIGRvdWJsZSkpOworI2VuZGlmCisKKyAgLyogSUVFRSBkb3VibGUgb3IgVkFYIEcgZmxvYXRzIGhhdmUgYW4gMTEgYml0IGV4cG9uZW50LCBzbyB0aGUgZGVmYXVsdCBpcworICAgICBhIG1heGltdW0gMzA4IGRlY2ltYWwgZGlnaXRzLiAgVkFYIEQgZmxvYXRzIGhhdmUgb25seSBhbiA4IGJpdAorICAgICBleHBvbmVudCwgYnV0IHdlIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gZGV0ZWN0IHRoYXQgZGlyZWN0bHkuICAqLworICBkb3VibGVfZGlnaXRzID0gMzA4OworI2lmZGVmIERCTF9NQVhfMTBfRVhQCisgIC8qIGJ1dCBpbiBhbnkgY2FzZSBwcmVmZXIgYSB2YWx1ZSB0aGUgY29tcGlsZXIgc2F5cyAqLworICBkb3VibGVfZGlnaXRzID0gREJMX01BWF8xMF9FWFA7CisjZW5kaWYKKworICAvKiBJRUVFIDEyOC1iaXQgcXVhZCwgSW50ZWwgODAtYml0IHRlbXBvcmFyeSwgb3IgVkFYIEggZmxvYXRzIGFsbCBoYXZlIDE1CisgICAgIGJpdCBleHBvbmVudHMsIHNvIHRoZSBkZWZhdWx0IGlzIGEgbWF4aW11bSA0OTMyIGRlY2ltYWwgZGlnaXRzLiAgKi8KKyAgbG9uZ19kb3VibGVfZGlnaXRzID0gNDkzMjsKKyAgLyogYnV0IGlmIGRvdWJsZSA9PSBsb25nIGRvdWJsZSwgdGhlbiBnbyB3aXRoIHRoYXQgc2l6ZSAqLworI2lmIEhBVkVfTE9OR19ET1VCTEUKKyAgaWYgKHNpemVvZiAoZG91YmxlKSA9PSBzaXplb2YgKGxvbmcgZG91YmxlKSkKKyAgICBsb25nX2RvdWJsZV9kaWdpdHMgPSBkb3VibGVfZGlnaXRzOworI2VuZGlmCisjaWZkZWYgTERCTF9NQVhfMTBfRVhQCisgIC8qIGJ1dCBpbiBhbnkgY2FzZSBwcmVmZXIgYSB2YWx1ZSB0aGUgY29tcGlsZXIgc2F5cyAqLworICBsb25nX2RvdWJsZV9kaWdpdHMgPSBMREJMX01BWF8xMF9FWFA7CisjZW5kaWYKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGZtdCA9IHN0cmNociAoZm10LCAnJScpOworICAgICAgaWYgKGZtdCA9PSBOVUxMKQorCWJyZWFrOworICAgICAgZm10Kys7CisKKyAgICAgIHR5cGUgPSAnXDAnOworICAgICAgd2lkdGggPSAwOworICAgICAgcHJlYyA9IDY7CisgICAgICBzZWVuX3ByZWMgPSAwOworICAgICAgdmFsdWUgPSAmd2lkdGg7CisKKyAgICAgIGZvciAoOzspCisJeworCSAgZmNoYXIgPSAqZm10Kys7CisJICBzd2l0Y2ggKGZjaGFyKSB7CisKKwkgIGNhc2UgJ2MnOgorCSAgICAvKiBjaGFyLCBhbHJlYWR5IGFjY291bnRlZCBmb3IgYnkgc3RybGVuKGZtdCkgKi8KKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdkJzoKKwkgIGNhc2UgJ2knOgorCSAgY2FzZSAnbyc6CisJICBjYXNlICd4JzoKKwkgIGNhc2UgJ1gnOgorCSAgY2FzZSAndSc6CisJICAgIC8qIGF0IG1vc3QgMyBkaWdpdHMgcGVyIGJ5dGUgaW4gaGV4LCBkZWMgb3Igb2N0YWwsIHBsdXMgYSBzaWduICovCisJICAgIHRvdGFsX3dpZHRoICs9IDMgKiBpbnRlZ2VyX3NpemVvZiArIDE7CisKKwkgICAgc3dpdGNoICh0eXBlKSB7CisJICAgIGNhc2UgJ2onOgorCSAgICAgIC8qIExldCdzIGFzc3VtZSB1aW50bWF4X3QgaXMgdGhlIHNhbWUgc2l6ZSBhcyBpbnRtYXhfdC4gKi8KKyNpZiBIQVZFX0lOVE1BWF9UCisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGludG1heF90KTsKKyNlbHNlCisJICAgICAgQVNTRVJUX0ZBSUwgKGludG1heF90IG5vdCBhdmFpbGFibGUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2wnOgorCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBsb25nKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnTCc6CisjaWYgSEFWRV9MT05HX0xPTkcKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgbG9uZyBsb25nKTsKKyNlbHNlCisJICAgICAgQVNTRVJUX0ZBSUwgKGxvbmcgbG9uZyBub3QgYXZhaWxhYmxlKTsKKyNlbmRpZgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdxJzoKKwkgICAgICAvKiBxdWFkX3QgaXMgcHJvYmFibHkgdGhlIHNhbWUgYXMgbG9uZyBsb25nLCBidXQgbGV0J3MgdHJlYXQKKwkJIGl0IHNlcGFyYXRlbHkganVzdCB0byBiZSBzdXJlLiAgQWxzbyBsZXQncyBhc3N1bWUgdV9xdWFkX3QKKwkJIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSBhcyBxdWFkX3QuICAqLworI2lmIEhBVkVfUVVBRF9UCisJICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIHF1YWRfdCk7CisjZWxzZQorCSAgICAgIEFTU0VSVF9GQUlMIChxdWFkX3Qgbm90IGF2YWlsYWJsZSk7CisjZW5kaWYKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAndCc6CisjaWYgSEFWRV9QVFJESUZGX1QKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgcHRyZGlmZl90KTsKKyNlbHNlCisJICAgICAgQVNTRVJUX0ZBSUwgKHB0cmRpZmZfdCBub3QgYXZhaWxhYmxlKTsKKyNlbmRpZgorCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd6JzoKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgc2l6ZV90KTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICAvKiBkZWZhdWx0IGlzIGFuICJpbnQiLCBhbmQgdGhpcyBpbmNsdWRlcyBoPXNob3J0IGFuZCBoaD1jaGFyCisJCSBzaW5jZSB0aGV5J3JlIHByb21vdGVkIHRvIGludCBpbiBhIGZ1bmN0aW9uIGNhbGwgKi8KKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgaW50KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ0UnOgorCSAgY2FzZSAnZSc6CisJICBjYXNlICdHJzoKKwkgIGNhc2UgJ2cnOgorCSAgICAvKiBSZXF1ZXN0ZWQgZGVjaW1hbHMsIHNpZ24sIHBvaW50IGFuZCBlLCBwbHVzIGFuIG92ZXJlc3RpbWF0ZQorCSAgICAgICBvZiBleHBvbmVudCBkaWdpdHMgKHRoZSBhc3N1bXB0aW9uIGlzIGFsbCB0aGUgZmxvYXQgaXMKKwkgICAgICAgZXhwb25lbnQhKS4gICovCisJICAgIHRvdGFsX3dpZHRoICs9IHByZWMgKyAzICsgZmxvYXRpbmdfc2l6ZW9mICogMzsKKwkgICAgaWYgKHR5cGUgPT0gJ0wnKQorCSAgICAgIHsKKyNpZiBIQVZFX0xPTkdfRE9VQkxFCisJCSh2b2lkKSB2YV9hcmcgKGFwLCBsb25nIGRvdWJsZSk7CisjZWxzZQorCQlBU1NFUlRfRkFJTCAobG9uZyBkb3VibGUgbm90IGF2YWlsYWJsZSk7CisjZW5kaWYKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICAodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdmJzoKKwkgICAgLyogUmVxdWVzdGVkIGRlY2ltYWxzLCBzaWduIGFuZCBwb2ludCwgYW5kIGEgbWFyZ2luIGZvciBlcnJvciwKKwkgICAgICAgdGhlbiBhZGQgdGhlIG1heGltdW0gZGlnaXRzIHRoYXQgY2FuIGJlIGluIHRoZSBpbnRlZ2VyIHBhcnQsCisJICAgICAgIGJhc2VkIG9uIHRoZSBtYXhpbXVtIGV4cG9uZW50IHZhbHVlLiAqLworCSAgICB0b3RhbF93aWR0aCArPSBwcmVjICsgMiArIDEwOworCSAgICBpZiAodHlwZSA9PSAnTCcpCisJICAgICAgeworI2lmIEhBVkVfTE9OR19ET1VCTEUKKwkJKHZvaWQpIHZhX2FyZyAoYXAsIGxvbmcgZG91YmxlKTsKKwkJdG90YWxfd2lkdGggKz0gbG9uZ19kb3VibGVfZGlnaXRzOworI2Vsc2UKKwkJQVNTRVJUX0ZBSUwgKGxvbmcgZG91YmxlIG5vdCBhdmFpbGFibGUpOworI2VuZGlmCisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkodm9pZCkgdmFfYXJnIChhcCwgZG91YmxlKTsKKwkJdG90YWxfd2lkdGggKz0gZG91YmxlX2RpZ2l0czsKKwkgICAgICB9CisJICAgIGdvdG8gbmV4dDsKKworCSAgY2FzZSAnaCc6ICAvKiBzaG9ydCBvciBjaGFyICovCisJICBjYXNlICdqJzogIC8qIGludG1heF90ICovCisJICBjYXNlICdMJzogIC8qIGxvbmcgbG9uZyBvciBsb25nIGRvdWJsZSAqLworCSAgY2FzZSAncSc6ICAvKiBxdWFkX3QgKi8KKwkgIGNhc2UgJ3QnOiAgLyogcHRyZGlmZl90ICovCisJICBjYXNlICd6JzogIC8qIHNpemVfdCAqLworCSAgc2V0X3R5cGU6CisJICAgIHR5cGUgPSBmY2hhcjsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJ2wnOgorCSAgICAvKiBsb25nIG9yIGxvbmcgbG9uZyAqLworCSAgICBpZiAodHlwZSAhPSAnbCcpCisJICAgICAgZ290byBzZXRfdHlwZTsKKwkgICAgdHlwZSA9ICdMJzsgICAvKiAibGwiIG1lYW5zICJMIiAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAnbic6CisJICAgIC8qIGJ5dGVzIHdyaXR0ZW4sIG5vIG91dHB1dCBhcyBzdWNoICovCisJICAgICh2b2lkKSB2YV9hcmcgKGFwLCB2b2lkICopOworCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ3MnOgorCSAgICAvKiBJZiBubyBwcmVjaXNpb24gd2FzIGdpdmVuLCB0aGVuIGRldGVybWluZSB0aGUgc3RyaW5nIGxlbmd0aAorCSAgICAgICBhbmQgcHV0IGl0IHRoZXJlLCB0byBiZSBhZGRlZCB0byB0aGUgdG90YWwgdW5kZXIgIm5leHQiLiAgSWYKKwkgICAgICAgYSBwcmVjaXNpb24gd2FzIGdpdmVuIHRoZW4gdGhhdCdzIGFscmVhZHkgdGhlIG1heGltdW0gZnJvbQorCSAgICAgICB0aGlzIGZpZWxkLCBidXQgc2VlIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gdGhhdCwKKwkgICAgICAgaW4gY2FzZSB0aGUgbGltaXQgd2FzIHZlcnkgYmlnLiAgKi8KKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgICpzID0gdmFfYXJnIChhcCwgY29uc3QgY2hhciAqKTsKKwkgICAgICBwcmVjID0gKHNlZW5fcHJlYyA/IHN0cm5sZW4gKHMsIHByZWMpIDogc3RybGVuIChzKSk7CisJICAgIH0KKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICdwJzoKKwkgICAgLyogcG9pbnRlciwgbGV0J3MgYXNzdW1lIGF0IHdvcnN0IGl0J3Mgb2N0YWwgd2l0aCBzb21lIHBhZGRpbmcgKi8KKwkgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGNvbnN0IHZvaWQgKik7CisJICAgIHRvdGFsX3dpZHRoICs9IDMgKiBzaXplb2YgKHZvaWQgKikgKyAxNjsKKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICclJzoKKwkgICAgLyogbGl0ZXJhbCAlLCBhbHJlYWR5IGFjY291bnRlZCBmb3IgYnkgc3RybGVuKGZtdCkgKi8KKwkgICAgZ290byBuZXh0OworCisJICBjYXNlICcjJzoKKwkgICAgLyogc2hvd2Jhc2UsIGF0IG1vc3QgMiBmb3IgIjB4IiAqLworCSAgICB0b3RhbF93aWR0aCArPSAyOworCSAgICBicmVhazsKKworCSAgY2FzZSAnKyc6CisJICBjYXNlICcgJzoKKwkgICAgLyogc2lnbiwgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIHVuZGVyIG51bWVyaWNzICovCisJICAgIGJyZWFrOworCisJICBjYXNlICctJzoKKwkgICAgLyogbGVmdCBqdXN0aWZ5LCBubyBlZmZlY3Qgb24gdG90YWwgd2lkdGggKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJy4nOgorCSAgICBzZWVuX3ByZWMgPSAxOworCSAgICB2YWx1ZSA9ICZwcmVjOworCSAgICBicmVhazsKKworCSAgY2FzZSAnKic6CisJICAgIHsKKwkgICAgICAvKiBuZWdhdGl2ZSB3aWR0aCBtZWFucyBsZWZ0IGp1c3RpZnkgd2hpY2ggY2FuIGJlIGlnbm9yZWQsCisJCSBuZWdhdGl2ZSBwcmVjIHdvdWxkIGJlIGludmFsaWQsIGp1c3QgdXNlIGFic29sdXRlIHZhbHVlICovCisJICAgICAgaW50IG4gPSB2YV9hcmcgKGFwLCBpbnQpOworCSAgICAgICp2YWx1ZSA9IEFCUyAobik7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwkgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKwkgICAgLyogcHJvY2VzcyBhbGwgZGlnaXRzIHRvIGZvcm0gYSB2YWx1ZSAqLworCSAgICB7CisJICAgICAgaW50ICBuID0gMDsKKwkgICAgICBkbyB7CisJCW4gPSBuICogMTAgKyAoZmNoYXItJzAnKTsKKwkJZmNoYXIgPSAqZm10Kys7CisJICAgICAgfSB3aGlsZSAoaXNhc2NpaSAoZmNoYXIpICYmIGlzZGlnaXQgKGZjaGFyKSk7CisJICAgICAgZm10LS07IC8qIHVuZ2V0IHRoZSBub24tZGlnaXQgKi8KKwkgICAgICAqdmFsdWUgPSBuOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICAvKiBpbmNvbXBsZXRlIG9yIGludmFsaWQgJSBzZXF1ZW5jZSAqLworCSAgICBBU1NFUlQgKDApOworCSAgICBnb3RvIG5leHQ7CisJICB9CisJfQorCisgICAgbmV4dDoKKyAgICAgIHRvdGFsX3dpZHRoICs9IHdpZHRoOworICAgICAgdG90YWxfd2lkdGggKz0gcHJlYzsKKyAgICB9CisKKyAgaWYgKHRvdGFsX3dpZHRoIDw9IGJ1Zl9zaXplKQorICAgIHsKKyAgICAgIHZzcHJpbnRmIChidWYsIG9yaWdfZm10LCBvcmlnX2FwKTsKKyAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICAqczsKKworICAgICAgcyA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAodG90YWxfd2lkdGgsIGNoYXIpOworICAgICAgdnNwcmludGYgKHMsIG9yaWdfZm10LCBvcmlnX2FwKTsKKyAgICAgIGxlbiA9IHN0cmxlbiAocyk7CisgICAgICBpZiAoYnVmX3NpemUgIT0gMCkKKwl7CisJICBzaXplX3QgIGNvcHlsZW4gPSBNSU4gKGxlbiwgYnVmX3NpemUtMSk7CisJICBtZW1jcHkgKGJ1ZiwgcywgY29weWxlbik7CisJICBidWZbY29weWxlbl0gPSAnXDAnOworCX0KKyAgICAgIF9fR01QX0ZSRUVfRlVOQ19UWVBFIChzLCB0b3RhbF93aWR0aCwgY2hhcik7CisgICAgfQorCisgIC8qIElmIHRvdGFsX3dpZHRoIHdhcyBzb21laG93IHdyb25nIHRoZW4gY2hhbmNlcyBhcmUgd2UndmUgYWxyZWFkeQorICAgICBjbG9iYmVyZWQgbWVtb3J5LCBidXQgbWF5YmUgdGhpcyBjaGVjayB3aWxsIHN0aWxsIHdvcmsuICAqLworICBBU1NFUlRfQUxXQVlTIChsZW4gPCB0b3RhbF93aWR0aCk7CisKKyAgcmV0dXJuIGxlbjsKK30KKworI2VuZGlmIC8qICEgSEFWRV9WU05QUklOVEYgKi8KZGlmZiAtLWdpdCBhL3ByaW50Zi9zbnByaW50Zi5jIGIvcHJpbnRmL3NucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhMzNmOAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi9zbnByaW50Zi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGdtcF9zbnByaW50ZiAtLSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIGZpeGVkIHNpemUgYnVmZmVyLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAvKiBmb3Igc3RybGVuICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3NucHJpbnRmIChjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgc3RydWN0IGdtcF9zbnByaW50Zl90IGQ7CisgIHZhX2xpc3QgIGFwOworICBpbnQgICAgICByZXQ7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworICBkLmJ1ZiA9IGJ1ZjsKKyAgZC5zaXplID0gc2l6ZTsKKworICBBU1NFUlQgKCEgTUVNX09WRVJMQVBfUCAoYnVmLCBzaXplLCBmbXQsIHN0cmxlbihmbXQpKzEpKTsKKworICByZXQgPSBfX2dtcF9kb3BybnQgKCZfX2dtcF9zbnByaW50Zl9mdW5zLCAmZCwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL3NucHJudGZmdW5zLmMgYi9wcmludGYvc25wcm50ZmZ1bnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODVjN2FiCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnRmL3NucHJudGZmdW5zLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIF9fZ21wX3NucHJpbnRmX2Z1bnMgLS0gc3VwcG9ydCBmb3IgZ21wX3NucHJpbnRmIGFuZCBnbXBfdnNucHJpbnRmLgorCisgICBUSEUgRlVOQ1RJT05TIElOIFRISVMgRklMRSBBUkUgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgVEhFWSdSRSBBTE1PU1QKKyAgIENFUlRBSU4gVE8gQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTgorICAgRlVUVVJFIEdOVSBNUCBSRUxFQVNFUy4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisjaWYgISBIQVZFX1ZTTlBSSU5URgorI2RlZmluZSB2c25wcmludGYgIF9fZ21wX3JlcGxhY2VtZW50X3ZzbnByaW50ZgorI2VuZGlmCisKKworLyogZ2xpYmMgMi4wLnggdnNucHJpbnRmIHJldHVybnMgZWl0aGVyIC0xIG9yIHNpemUtMSBmb3IgYW4gb3ZlcmZsb3csIHdpdGgKKyAgIG5vIGluZGljYXRpb24gaG93IGJpZyB0aGUgb3V0cHV0IHdvdWxkIGhhdmUgYmVlbi4gIEl0J3MgbmVjZXNzYXJ5IHRvCisgICByZS1ydW4gdG8gZGV0ZXJtaW5lIHRoYXQgc2l6ZS4KKworICAgInNpemUtMSIgd291bGQgbWVhbiBzdWNjZXNzIGZyb20gYSBDOTkgdnNucHJpbnRmLCBhbmQgdGhlIHJlLXJ1biBpcworICAgdW5uZWNlc3NhcnkgaW4gdGhpcyBjYXNlLCBidXQgd2UgZG9uJ3QgYm90aGVyIHRvIHRyeSB0byBkZXRlY3Qgd2hhdCBzb3J0CisgICBvZiB2c25wcmludGYgd2UndmUgZ290LiAgc2l6ZS0xIHNob3VsZCBvY2N1ciByYXJlbHkgaW4gbm9ybWFsCisgICBjaXJjdW1zdGFuY2VzLgorCisgICB2c25wcmludGYgbWlnaHQgdHJhc2ggaXQncyBnaXZlbiBhcCAoaXQgZG9lcyBmb3IgaW5zdGFuY2UgaW4gZ2xpYmMgMi4xLjMKKyAgIG9uIHBvd2VycGMpLCBzbyBjb3B5IGl0IGluIGNhc2Ugd2UgbmVlZCB0byB1c2UgaXQgdG8gcHJvYmUgZm9yIHRoZSBzaXplCisgICBvdXRwdXQgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQuICBOb3RlIHRoZXJlJ3Mgbm8gbmVlZCB0byBwcmVzZXJ2ZQorICAgaXQgZm9yIG91ciBjYWxsZXJzLCBqdXN0IGZvciBvdXJzZWx2ZXMuICAqLworCitzdGF0aWMgaW50CitnbXBfc25wcmludGZfZm9ybWF0IChzdHJ1Y3QgZ21wX3NucHJpbnRmX3QgKmQsIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3Qgb3JpZ19hcCkKK3sKKyAgaW50ICAgICAgcmV0OworICBzaXplX3QgICBzdGVwLCBhbGxvYywgYXZhaWw7CisgIHZhX2xpc3QgIGFwOworICBjaGFyICAgICAqcDsKKworICBBU1NFUlQgKGQtPnNpemUgPj0gMCk7CisKKyAgYXZhaWwgPSBkLT5zaXplOworICBpZiAoYXZhaWwgPiAxKQorICAgIHsKKyAgICAgIHZhX2NvcHkgKGFwLCBvcmlnX2FwKTsKKyAgICAgIHJldCA9IHZzbnByaW50ZiAoZC0+YnVmLCBhdmFpbCwgZm10LCBhcCk7CisgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICBzdGVwID0gTUlOIChyZXQsIGF2YWlsLTEpOworICAgICAgZC0+c2l6ZSAtPSBzdGVwOworICAgICAgZC0+YnVmICs9IHN0ZXA7CisKKyAgICAgIGlmIChyZXQgIT0gYXZhaWwtMSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyogcHJvYmFibHkgZ2xpYmMgMi4wLnggdHJ1bmNhdGVkIG91dHB1dCwgcHJvYmUgZm9yIGFjdHVhbCBzaXplICovCisgICAgICBhbGxvYyA9IE1BWCAoMTI4LCByZXQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5vIHNwYWNlIHRvIHdyaXRlIGFueXRoaW5nLCBqdXN0IHByb2JlIGZvciBzaXplICovCisgICAgICBhbGxvYyA9IDEyODsKKyAgICB9CisKKyAgZG8KKyAgICB7CisgICAgICBhbGxvYyAqPSAyOworICAgICAgcCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAoYWxsb2MsIGNoYXIpOworICAgICAgdmFfY29weSAoYXAsIG9yaWdfYXApOworICAgICAgcmV0ID0gdnNucHJpbnRmIChwLCBhbGxvYywgZm10LCBhcCk7CisgICAgICBfX0dNUF9GUkVFX0ZVTkNfVFlQRSAocCwgYWxsb2MsIGNoYXIpOworICAgIH0KKyAgd2hpbGUgKHJldCA9PSBhbGxvYy0xKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitnbXBfc25wcmludGZfbWVtb3J5IChzdHJ1Y3QgZ21wX3NucHJpbnRmX3QgKmQsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgc2l6ZV90IG47CisKKyAgQVNTRVJUIChkLT5zaXplID49IDApOworCisgIGlmIChkLT5zaXplID4gMSkKKyAgICB7CisgICAgICBuID0gTUlOIChkLT5zaXplLTEsIGxlbik7CisgICAgICBtZW1jcHkgKGQtPmJ1Ziwgc3RyLCBuKTsKKyAgICAgIGQtPmJ1ZiArPSBuOworICAgICAgZC0+c2l6ZSAtPSBuOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorZ21wX3NucHJpbnRmX3JlcHMgKHN0cnVjdCBnbXBfc25wcmludGZfdCAqZCwgaW50IGMsIGludCByZXBzKQoreworICBzaXplX3QgbjsKKworICBBU1NFUlQgKHJlcHMgPj0gMCk7CisgIEFTU0VSVCAoZC0+c2l6ZSA+PSAwKTsKKworICBpZiAoZC0+c2l6ZSA+IDEpCisgICAgeworICAgICAgbiA9IE1JTiAoZC0+c2l6ZS0xLCByZXBzKTsKKyAgICAgIG1lbXNldCAoZC0+YnVmLCBjLCBuKTsKKyAgICAgIGQtPmJ1ZiArPSBuOworICAgICAgZC0+c2l6ZSAtPSBuOworICAgIH0KKyAgcmV0dXJuIHJlcHM7Cit9CisKK3N0YXRpYyBpbnQKK2dtcF9zbnByaW50Zl9maW5hbCAoc3RydWN0IGdtcF9zbnByaW50Zl90ICpkKQoreworICBpZiAoZC0+c2l6ZSA+PSAxKQorICAgIGQtPmJ1ZlswXSA9ICdcMCc7CisgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgZG9wcm50X2Z1bnNfdCAgX19nbXBfc25wcmludGZfZnVucyA9IHsKKyAgKGRvcHJudF9mb3JtYXRfdCkgZ21wX3NucHJpbnRmX2Zvcm1hdCwKKyAgKGRvcHJudF9tZW1vcnlfdCkgZ21wX3NucHJpbnRmX21lbW9yeSwKKyAgKGRvcHJudF9yZXBzX3QpICAgZ21wX3NucHJpbnRmX3JlcHMsCisgIChkb3BybnRfZmluYWxfdCkgIGdtcF9zbnByaW50Zl9maW5hbAorfTsKZGlmZiAtLWdpdCBhL3ByaW50Zi9zcHJpbnRmLmMgYi9wcmludGYvc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTJhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvc3ByaW50Zi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIGdtcF9zcHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gdW5yZXN0cmljdGVkIHN0cmluZy4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgLyogZm9yIHN0cmxlbiAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitpbnQKK2dtcF9zcHJpbnRmIChjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworI2lmIFdBTlRfQVNTRVJUCisgIGludCAgICAgIGZtdGxlbiA9IHN0cmxlbihmbXQpOworI2VuZGlmCisgIHZhX2xpc3QgIGFwOworICBpbnQgICAgICByZXQ7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworCisgIHJldCA9IF9fZ21wX2RvcHJudCAoJl9fZ21wX3NwcmludGZfZnVucywgJmJ1ZiwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworCisgIEFTU0VSVCAoISBNRU1fT1ZFUkxBUF9QIChidWYsIHN0cmxlbihidWYpKzEsIGZtdCwgZm10bGVuKzEpKTsKKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL3NwcmludGZmdW5zLmMgYi9wcmludGYvc3ByaW50ZmZ1bnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzgxZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnRmL3NwcmludGZmdW5zLmMKQEAgLTAsMCArMSw5NCBAQAorLyogX19nbXBfc3ByaW50Zl9mdW5zIC0tIHN1cHBvcnQgZm9yIGdtcF9zcHJpbnRmIGFuZCBnbXBfdnNwcmludGYuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIFRoZSBkYXRhIHBhcmFtZXRlciAiYnVmcCIgcG9pbnRzIHRvIGEgImNoYXIgKmJ1ZiIgd2hpY2ggaXMgdGhlIG5leHQKKyAgIGNoYXJhY3RlciB0byBiZSB3cml0dGVuLCBoYXZpbmcgc3RhcnRlZCBhcyB0aGUgZGVzdGluYXRpb24gZnJvbSB0aGUKKyAgIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyB0aGVuIGluY3JlYXNlZCBlYWNoIHRpbWUgb3V0cHV0IGlzIHByb2R1Y2VkLiAgKi8KKworCisvKiBJZiB2c3ByaW50ZiByZXR1cm5zIC0xIHRoZW4gcGFzcyBpdCB1cHdhcmRzLiAgSXQgZG9lc24ndCBtYXR0ZXIgdGhhdAorICAgIipidWZwIiBpcyBydWluZWQgaW4gdGhpcyBjYXNlLCBzaW5jZSBnbXBfZG9wcmludCB3aWxsIGJhaWwgb3V0CisgICBpbW1lZGlhdGVseSBhbnl3YXkuICAqLworc3RhdGljIGludAorZ21wX3NwcmludGZfZm9ybWF0IChjaGFyICoqYnVmcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICBjaGFyICAqYnVmID0gKmJ1ZnA7CisgIGludCAgIHJldDsKKyAgdnNwcmludGYgKGJ1ZiwgZm10LCBhcCk7CisgIHJldCA9IHN0cmxlbiAoYnVmKTsKKyAgKmJ1ZnAgPSBidWYgKyByZXQ7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2dtcF9zcHJpbnRmX21lbW9yeSAoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikKK3sKKyAgY2hhciAgKmJ1ZiA9ICpidWZwOworICAqYnVmcCA9IGJ1ZiArIGxlbjsKKyAgbWVtY3B5IChidWYsIHN0ciwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorZ21wX3NwcmludGZfcmVwcyAoY2hhciAqKmJ1ZnAsIGludCBjLCBpbnQgcmVwcykKK3sKKyAgY2hhciAgKmJ1ZiA9ICpidWZwOworICBBU1NFUlQgKHJlcHMgPj0gMCk7CisgICpidWZwID0gYnVmICsgcmVwczsKKyAgbWVtc2V0IChidWYsIGMsIHJlcHMpOworICByZXR1cm4gcmVwczsKK30KKworc3RhdGljIGludAorZ21wX3NwcmludGZfZmluYWwgKGNoYXIgKipidWZwKQoreworICBjaGFyICAqYnVmID0gKmJ1ZnA7CisgICpidWYgPSAnXDAnOworICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRvcHJudF9mdW5zX3QgIF9fZ21wX3NwcmludGZfZnVucyA9IHsKKyAgKGRvcHJudF9mb3JtYXRfdCkgZ21wX3NwcmludGZfZm9ybWF0LAorICAoZG9wcm50X21lbW9yeV90KSBnbXBfc3ByaW50Zl9tZW1vcnksCisgIChkb3BybnRfcmVwc190KSAgIGdtcF9zcHJpbnRmX3JlcHMsCisgIChkb3BybnRfZmluYWxfdCkgIGdtcF9zcHJpbnRmX2ZpbmFsCit9OwpkaWZmIC0tZ2l0IGEvcHJpbnRmL3Zhc3ByaW50Zi5jIGIvcHJpbnRmL3Zhc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvdmFzcHJpbnRmLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIGdtcF92YXNwcmludGYgLS0gZm9ybWF0dGVkIG91dHB1dCB0byBhbiBhbGxvY2F0ZWQgc3BhY2UuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpZiAhIEhBVkVfVlNOUFJJTlRGCisjZGVmaW5lIHZzbnByaW50ZiAgX19nbXBfcmVwbGFjZW1lbnRfdnNucHJpbnRmCisjZW5kaWYKKworCisvKiB2YXNwcmludGYgaXNuJ3QgdXNlZCBzaW5jZSB3ZSBwcmVmZXIgYWxsIEdNUCBhbGxvY3MgdG8gZ28gdGhyb3VnaAorICAgX19nbXBfYWxsb2NhdGVfZnVuYywgYW5kIGluIHBhcnRpY3VsYXIgd2UgZG9uJ3Qgd2FudCB0aGUgLTEgcmV0dXJuIGZyb20KKyAgIHZhc3ByaW50ZiBmb3Igb3V0LW9mLW1lbW9yeSwgaW5zdGVhZCBfX2dtcF9hbGxvY2F0ZV9mdW5jIHNob3VsZCBoYW5kbGUKKyAgIHRoYXQuICBVc2luZyB2c25wcmludGYgdW5mb3J0dW5hdGVseSBtZWFucyB3ZSBtaWdodCBoYXZlIHRvIHJlLXJ1biBpdCBpZgorICAgb3VyIGN1cnJlbnQgc3BhY2UgaXMgaW5zdWZmaWNpZW50LgorCisgICBUaGUgaW5pdGlhbCBndWVzcyBmb3IgdGhlIG5lZWRlZCBzcGFjZSBpcyBhbiBhcmJpdHJhcnkgMjU2IGJ5dGVzLiAgSWYKKyAgIHRoYXQgKGFuZCBhbnkgZXh0cmEgR01QX0FTUFJJTlRGX1RfTkVFRCBtaWdodCBnaXZlKSBpc24ndCBlbm91Z2ggdGhlbiBhbgorICAgSVNPIEM5OSBzdGFuZGFyZCB2c25wcmludGYgd2lsbCB0ZWxsIHVzIHdoYXQgd2UgcmVhbGx5IG5lZWQuCisKKyAgIEdMSUJDIDIuMC54IHZzbnByaW50ZiByZXR1cm5zIGVpdGhlciAtMSBvciBzcGFjZS0xIHRvIGluZGljYXRlIG92ZXJmbG93LAorICAgd2l0aG91dCBnaXZpbmcgYW55IGluZGljYXRpb24gaG93IG11Y2ggaXMgcmVhbGx5IG5lZWRlZC4gIEluIHRoaXMgY2FzZQorICAga2VlcCB0cnlpbmcgd2l0aCBkb3VibGUgdGhlIHNwYWNlIGVhY2ggdGltZS4KKworICAgQSByZXR1cm4gb2Ygc3BhY2UtMSBpcyBzdWNjZXNzIG9uIGEgQzk5IHZzbnByaW50ZiwgYnV0IHdlJ3JlIG5vdAorICAgYm90aGVyaW5nIHRvIGlkZW50aWZ5IHdoaWNoIHN0eWxlIHZzbnByaW50ZiB3ZSd2ZSBnb3QsIHNvIGp1c3QgdGFrZSB0aGUKKyAgIHBlc3NpbWlzdGljIG9wdGlvbiBhbmQgYXNzdW1lIGl0J3MgZ2xpYmMgMi4wLnguCisKKyAgIE5vdGljZSB0aGUgdXNlIG9mIHJldCsyIGZvciB0aGUgbmV3IHNwYWNlIGluIHRoZSBDOTkgY2FzZS4gIFRoaXMgZW5zdXJlcworICAgdGhlIG5leHQgdnNucHJpbnRmIHJldHVybiB2YWx1ZSB3aWxsIGJlIHNwYWNlLTIsIHdoaWNoIGlzIHVuYW1iaWd1b3VzbHkKKyAgIHN1Y2Nlc3NmdWwuICBCdXQgYWN0dWFsbHkgR01QX0FTUFJJTlRGX1RfTkVFRCgpIHdpbGwgcmVhbGxvYyB0byBldmVuCisgICBiaWdnZXIgdGhhbiB0aGF0IHJldCsyLgorCisgICB2c25wcmludGYgbWlnaHQgdHJhc2ggaXQncyBnaXZlbiBhcCwgc28gY29weSBpdCBpbiBjYXNlIHdlIG5lZWQgdG8gdXNlIGl0CisgICBtb3JlIHRoYW4gb25jZS4gIFNlZSBjb21tZW50cyB3aXRoIGdtcF9zbnByaW50Zl9mb3JtYXQuICAqLworCitzdGF0aWMgaW50CitnbXBfYXNwcmludGZfZm9ybWF0IChzdHJ1Y3QgZ21wX2FzcHJpbnRmX3QgKmQsIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3Qgb3JpZ19hcCkKK3sKKyAgaW50ICAgICAgcmV0OworICB2YV9saXN0ICBhcDsKKyAgc2l6ZV90ICAgc3BhY2UgPSAyNTY7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBHTVBfQVNQUklOVEZfVF9ORUVEIChkLCBzcGFjZSk7CisgICAgICBzcGFjZSA9IGQtPmFsbG9jIC0gZC0+c2l6ZTsKKyAgICAgIHZhX2NvcHkgKGFwLCBvcmlnX2FwKTsKKyAgICAgIHJldCA9IHZzbnByaW50ZiAoZC0+YnVmICsgZC0+c2l6ZSwgc3BhY2UsIGZtdCwgYXApOworICAgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgIEFTU0VSVCAoc3RybGVuIChkLT5idWYgKyBkLT5zaXplKSA9PSBzcGFjZS0xKTsKKyAgICAgICAgICByZXQgPSBzcGFjZS0xOworICAgICAgICB9CisKKyAgICAgIC8qIGRvbmUgaWYgb3V0cHV0IGZpdHMgaW4gb3VyIHNwYWNlICovCisgICAgICBpZiAocmV0IDwgc3BhY2UtMSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChyZXQgPT0gc3BhY2UtMSkKKyAgICAgICAgc3BhY2UgKj0gMjsgICAgIC8qIHBvc3NpYmxlIGdsaWJjIDIuMC54LCBzbyBkb3VibGUgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgc3BhY2UgPSByZXQrMjsgIC8qIEM5OSwgc28gbm93IGtub3cgc3BhY2UgcmVxdWlyZWQgKi8KKyAgICB9CisKKyAgZC0+c2l6ZSArPSByZXQ7CisgIHJldHVybiByZXQ7Cit9CisKK2NvbnN0IHN0cnVjdCBkb3BybnRfZnVuc190ICBfX2dtcF9hc3ByaW50Zl9mdW5zID0geworICAoZG9wcm50X2Zvcm1hdF90KSBnbXBfYXNwcmludGZfZm9ybWF0LAorICAoZG9wcm50X21lbW9yeV90KSBfX2dtcF9hc3ByaW50Zl9tZW1vcnksCisgIChkb3BybnRfcmVwc190KSAgIF9fZ21wX2FzcHJpbnRmX3JlcHMsCisgIChkb3BybnRfZmluYWxfdCkgIF9fZ21wX2FzcHJpbnRmX2ZpbmFsCit9OworCitpbnQKK2dtcF92YXNwcmludGYgKGNoYXIgKipyZXN1bHQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgc3RydWN0IGdtcF9hc3ByaW50Zl90ICBkOworICBHTVBfQVNQUklOVEZfVF9JTklUIChkLCByZXN1bHQpOworICByZXR1cm4gX19nbXBfZG9wcm50ICgmX19nbXBfYXNwcmludGZfZnVucywgJmQsIGZtdCwgYXApOworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL3ZmcHJpbnRmLmMgYi9wcmludGYvdmZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQxOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnRmL3ZmcHJpbnRmLmMKQEAgLTAsMCArMSw0MSBAQAorLyogZ21wX3ZmcHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitnbXBfdmZwcmludGYgKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgIHJldHVybiBfX2dtcF9kb3BybnQgKCZfX2dtcF9mcHJpbnRmX2Z1bnMsIGZwLCBmbXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50Zi92cHJpbnRmLmMgYi9wcmludGYvdnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTIyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvdnByaW50Zi5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIGdtcF92cHJpbnRmIC0tIGZvcm1hdHRlZCBvdXRwdXQuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitnbXBfdnByaW50ZiAoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICByZXR1cm4gX19nbXBfZG9wcm50ICgmX19nbXBfZnByaW50Zl9mdW5zLCBzdGRvdXQsIGZtdCwgYXApOworfQpkaWZmIC0tZ2l0IGEvcHJpbnRmL3ZzbnByaW50Zi5jIGIvcHJpbnRmL3ZzbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzJmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludGYvdnNucHJpbnRmLmMKQEAgLTAsMCArMSw0NyBAQAorLyogZ21wX3ZzbnByaW50ZiAtLSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIGZpeGVkIHNpemUgYnVmZmVyLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAvKiBmb3Igc3RybGVuICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3ZzbnByaW50ZiAoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICBzdHJ1Y3QgZ21wX3NucHJpbnRmX3QgZDsKKworICBBU1NFUlQgKCEgTUVNX09WRVJMQVBfUCAoYnVmLCBzaXplLCBmbXQsIHN0cmxlbihmbXQpKzEpKTsKKworICBkLmJ1ZiA9IGJ1ZjsKKyAgZC5zaXplID0gc2l6ZTsKKyAgcmV0dXJuIF9fZ21wX2RvcHJudCAoJl9fZ21wX3NucHJpbnRmX2Z1bnMsICZkLCBmbXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50Zi92c3ByaW50Zi5jIGIvcHJpbnRmL3ZzcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkZTE5MwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50Zi92c3ByaW50Zi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIGdtcF92c3ByaW50ZiAtLSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGFuIHVucmVzdHJpY3RlZCBzdHJpbmcuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgIC8qIGZvciBzdHJsZW4gKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitnbXBfdnNwcmludGYgKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworI2lmIFdBTlRfQVNTRVJUCisgIGludCAgZm10bGVuID0gc3RybGVuKGZtdCk7CisjZW5kaWYKKyAgaW50ICByZXQ7CisKKyAgcmV0ID0gX19nbXBfZG9wcm50ICgmX19nbXBfc3ByaW50Zl9mdW5zLCAmYnVmLCBmbXQsIGFwKTsKKworICBBU1NFUlQgKCEgTUVNX09WRVJMQVBfUCAoYnVmLCBzdHJsZW4oYnVmKSsxLCBmbXQsIGZtdGxlbisxKSk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3JhbmQvcmFuZC5jIGIvcmFuZC9yYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5NGM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIGdtcF9yYW5kaW5pdCAoc3RhdGUsIGFsZ29yaXRobSwgLi4uKSAtLSBJbml0aWFsaXplIGEgcmFuZG9tIHN0YXRlLgorCitDb3B5cmlnaHQgMTk5OS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCitnbXBfcmFuZGluaXQgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwgZ21wX3JhbmRhbGdfdCBhbGcsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBhbGcpOworCisgIHN3aXRjaCAoYWxnKSB7CisgIGNhc2UgR01QX1JBTkRfQUxHX0xDOgorICAgIGlmICghIGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgKHJzdGF0ZSwgdmFfYXJnIChhcCwgdW5zaWduZWQgbG9uZykpKQorICAgICAgZ21wX2Vycm5vIHw9IEdNUF9FUlJPUl9JTlZBTElEX0FSR1VNRU5UOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGdtcF9lcnJubyB8PSBHTVBfRVJST1JfVU5TVVBQT1JURURfQVJHVU1FTlQ7CisgICAgYnJlYWs7CisgIH0KKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRidWkuYyBiL3JhbmQvcmFuZGJ1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWU5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRidWkuYwpAQCAtMCwwICsxLDU2IEBACisvKiBnbXBfdXJhbmRvbWJfdWkgLS0gcmFuZG9tIGJpdHMgcmV0dXJuZWQgaW4gYSB1bG9uZy4KKworQ29weXJpZ2h0IDIwMDMsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIEN1cnJlbnRseSBiaXRzPj1CSVRTX1BFUl9VTE9ORyBpcyBxdWlldGx5IHRydW5jYXRlZCB0byBCSVRTX1BFUl9VTE9ORywKKyAgIG1heWJlIHRoaXMgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBvciBzb21ldGhpbmcuICAqLworCit1bnNpZ25lZCBsb25nCitnbXBfdXJhbmRvbWJfdWkgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwgdW5zaWduZWQgbG9uZyBiaXRzKQoreworICBtcF9saW1iX3QgIGFbTElNQlNfUEVSX1VMT05HXTsKKworICAvKiBzdGFydCB3aXRoIHplcm9zLCBzaW5jZSBpZiBiaXRzPT0wIHRoZW4gX2dtcF9yYW5kIHdpbGwgc3RvcmUgbm90aGluZyBhdAorICAgICBhbGwsIG9yIGlmIGJpdHMgPD0gR01QX05VTUJfQklUUyB0aGVuIGl0IHdpbGwgc3RvcmUgb25seSBhWzBdICovCisgIGFbMF0gPSAwOworI2lmIExJTUJTX1BFUl9VTE9ORyA+IDEKKyAgYVsxXSA9IDA7CisjZW5kaWYKKworICBfZ21wX3JhbmQgKGEsIHJzdGF0ZSwgTUlOIChiaXRzLCBCSVRTX1BFUl9VTE9ORykpOworCisjaWYgTElNQlNfUEVSX1VMT05HID09IDEKKyAgcmV0dXJuIGFbMF07CisjZWxzZQorICByZXR1cm4gYVswXSB8IChhWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRjbHIuYyBiL3JhbmQvcmFuZGNsci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTk0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRjbHIuYwpAQCAtMCwwICsxLDM3IEBACisvKiBnbXBfcmFuZGNsZWFyIChzdGF0ZSkgLS0gQ2xlYXIgYW5kIGRlYWxsb2NhdGUgcmFuZG9tIHN0YXRlIFNUQVRFLgorCitDb3B5cmlnaHQgMTk5OS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKwordm9pZAorZ21wX3JhbmRjbGVhciAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlKQoreworICAoKigoZ21wX3JhbmRmbnB0cl90ICopIFJOR19GTlBUUiAocnN0YXRlKSktPnJhbmRjbGVhcl9mbikgKHJzdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRkZWYuYyBiL3JhbmQvcmFuZGRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDljY2UKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRkZWYuYwpAQCAtMCwwICsxLDM3IEBACisvKiBnbXBfcmFuZGluaXRfZGVmYXVsdCAtLSBpbml0aWFsaXplIGEgcmFuZG9tIHN0YXRlIHdpdGggYSBkZWZhdWx0IGFsZ29yaXRobS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCitnbXBfcmFuZGluaXRfZGVmYXVsdCAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlKQoreworICBnbXBfcmFuZGluaXRfbXQgKHJzdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRpc2V0LmMgYi9yYW5kL3JhbmRpc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiNWI5NwotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZGlzZXQuYwpAQCAtMCwwICsxLDM4IEBACisvKiBnbXBfcmFuZGluaXRfc2V0IC0tIGluaXRpYWxpemUgd2l0aCBhIGNvcHkgb2YgYW5vdGhlciBnbXBfcmFuZHN0YXRlX3QuCisKK0NvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCit2b2lkCitnbXBfcmFuZGluaXRfc2V0IChnbXBfcmFuZHN0YXRlX3B0ciBkc3QsIGdtcF9yYW5kc3RhdGVfc3JjcHRyIHNyYykKK3sKKyAgKCooKGdtcF9yYW5kZm5wdHJfdCAqKSBSTkdfRk5QVFIgKHNyYykpLT5yYW5kaXNldF9mbikgKGRzdCwgc3JjKTsKK30KZGlmZiAtLWdpdCBhL3JhbmQvcmFuZGxjMnMuYyBiL3JhbmQvcmFuZGxjMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVmYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmFuZC9yYW5kbGMycy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgLS0gaW5pdGlhbGl6ZSBhIHJhbmRvbSBzdGF0ZSB3aXRoIGEgbGluZWFyCisgICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIG9mIGEgcmVxdWVzdGVkIHNpemUuCisKK0NvcHlyaWdodCAxOTk5LTIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPiAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogQXJyYXkgb2YgTEMtc2NoZW1lcywgb3JkZXJlZCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHRoZSBmaXJzdAorICAgbWVtYmVyICh0aGUgJ20yZXhwJyB2YWx1ZSkuICBUaGUgZW5kIG9mIHRoZSBhcnJheSBpcyBpbmRpY2F0ZWQgd2l0aAorICAgYW4gZW50cnkgY29udGFpbmluZyBhbGwgemVyb3MuICAqLworCisvKiBBbGwgbXVsdGlwbGllcnMgYXJlIGluIHRoZSByYW5nZSAwLjAxKm0gYW5kIDAuOTkqbSwgYW5kIGFyZQorY29uZ3J1ZW50IHRvIDUgKG1vZCA4KS4KK1RoZXkgYWxsIHBhc3MgdGhlIHNwZWN0cmFsIHRlc3Qgd2l0aCBWdCA+PSAyXigzMC90KSBhbmQgbWVyaXQgPj0gMS4KKyhVcCB0byBhbmQgaW5jbHVkaW5nIDE5NiBiaXRzLCBtZXJpdCBpcyA+PSAzLikgICovCisKK3N0cnVjdCBfX2dtcF9yYW5kX2xjX3NjaGVtZV9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgbTJleHA7CS8qIE1vZHVsdXMgaXMgMiBeIG0yZXhwLiAqLworICBjb25zdCBjaGFyICphc3RyOwkJLyogTXVsdGlwbGllciBpbiBzdHJpbmcgZm9ybS4gKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgYzsJCS8qIEFkZGVuZC4gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX19nbXBfcmFuZF9sY19zY2hlbWVfc3RydWN0IF9fZ21wX3JhbmRfbGNfc2NoZW1lW10gPQoreworICB7MzIsICIyOUNGNTM1IiwJICAgICAxfSwKKyAgezMzLCAiNTFGNjY2RCIsCSAgICAgMX0sCisgIHszNCwgIkEzRDczQUQiLAkgICAgIDF9LAorICB7MzUsICIxNDdFNUI4NSIsCSAgICAgMX0sCisgIHszNiwgIjI4RjcyNUM1IiwJICAgICAxfSwKKyAgezM3LCAiNTFFRTMxMDUiLAkgICAgIDF9LAorICB7MzgsICJBM0RENUNERCIsCSAgICAgMX0sCisgIHszOSwgIjE0N0FGODMzRCIsCSAgICAgMX0sCisgIHs0MCwgIjI4RjVEQTE3NSIsCSAgICAgMX0sCisgIHs1NiwgIkFBN0Q3MzUyMzRDMEREIiwgIDF9LAorICB7NjQsICJCQUVDRDUxNURBRjBCNDlEIiwgMX0sCisgIHsxMDAsICIyOTI3ODdFQkQzMzI5QUQ3RTc1NzVFMkZEIiwgMX0sCisgIHsxMjgsICI0OEE3NEYzNjdGQTdCNUM4QUNCQjM2OTAxMzA4RkE4NSIsIDF9LAorICB7MTU2LCAiNzhBN0ZERERDNDM2MTFCNTI3QzNGMUQ3NjBGMzZFNUQ3RkM3QzQ1IiwgMX0sCisgIHsxOTYsICI0MUJBMkUxMDRFRTM0QzY2QjM1MjBDRTcwNkE1NjQ5OERFNkQ0NDcyMUU1RTI0RjUiLCAxfSwKKyAgezIwMCwgIjRFNUEyNEMzOEI5ODFFQUZFODRDRDlEMEJFQzQ4RTgzOTExMzYyQzExNEYzMDA3MkM1IiwgMX0sCisgIHsyNTYsICJBRjY2QkE5MzJBQUY1OEEwNzFGRDhGMDc0MkE5OUEwQzc2OTgyRDY0ODUwOTk3M0RCODAyMzAzMTI4QTE0Q0I1IiwgMX0sCisgIHswLCBOVUxMLCAwfQkJCS8qIEVuZCBvZiBhcnJheS4gKi8KK307CisKK2ludAorZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLCBtcF9iaXRjbnRfdCBzaXplKQoreworICBjb25zdCBzdHJ1Y3QgX19nbXBfcmFuZF9sY19zY2hlbWVfc3RydWN0ICpzcDsKKyAgbXB6X3QgYTsKKworICAvKiBQaWNrIGEgc2NoZW1lLiAgKi8KKyAgZm9yIChzcCA9IF9fZ21wX3JhbmRfbGNfc2NoZW1lOyBzcC0+bTJleHAgIT0gMDsgc3ArKykKKyAgICBpZiAoc3AtPm0yZXhwIC8gMiA+PSBzaXplKQorICAgICAgZ290byBmb3VuZDsKKyAgcmV0dXJuIDA7CisKKyBmb3VuZDoKKyAgLyogSW5zdGFsbCBzY2hlbWUuICAqLworICBtcHpfaW5pdF9zZXRfc3RyIChhLCBzcC0+YXN0ciwgMTYpOworICBnbXBfcmFuZGluaXRfbGNfMmV4cCAocnN0YXRlLCBhLCBzcC0+Yywgc3AtPm0yZXhwKTsKKyAgbXB6X2NsZWFyIChhKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRsYzJ4LmMgYi9yYW5kL3JhbmRsYzJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjYjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZGxjMnguYwpAQCAtMCwwICsxLDMzMSBAQAorLyogTGluZWFyIENvbmdydWVudGlhbCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMTk5OS0yMDAzLCAyMDA1LCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBTdGF0ZSBzdHJ1Y3R1cmUgZm9yIExDLCB0aGUgUk5HX1NUQVRFKCkgcG9pbnRlciBpbiBhIGdtcF9yYW5kc3RhdGVfdC4KKworICAgX21wX3NlZWQgaG9sZHMgdGhlIGN1cnJlbnQgc2VlZCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAgdG8gMl5tMmV4cC0xLgorICAgU0laKF9tcF9zZWVkKSBpcyBmaXhlZCBhdCBCSVRTX1RPX0xJTUJTKF9tcF9tMmV4cCkgYW5kIHRoZSB2YWx1ZSBpcworICAgcGFkZGVkIHdpdGggaGlnaCB6ZXJvIGxpbWJzIGlmIG5lY2Vzc2FyeS4gIEFMTE9DKF9tcF9zZWVkKSBpcyB0aGUgY3VycmVudAorICAgc2l6ZSBvZiBQVFIoX21wX3NlZWQpIGluIHRoZSB1c3VhbCB3YXkuICBUaGVyZSBvbmx5IG5lZWRzIHRvIGJlCisgICBCSVRTX1RPX0xJTUJTKF9tcF9tMmV4cCkgYWxsb2NhdGVkLCBidXQgdGhlIG1weiBmdW5jdGlvbnMgaW4gdGhlCisgICBpbml0aWFsaXphdGlvbiBhbmQgc2VlZGluZyBlbmQgdXAgbWFraW5nIGl0IGEgYml0IG1vcmUgdGhhbiB0aGlzLgorCisgICBfbXBfYSBpcyB0aGUgImEiIG11bHRpcGxpZXIsIGluIHRoZSByYW5nZSAwIHRvIDJebTJleHAtMS4gIFNJWihfbXBfYSkgaXMKKyAgIHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBpbiB0aGUgbm9ybWFsIHdheSBmb3IgYW4gbXB6X3QsIGV4Y2VwdCB0aGF0IGEgdmFsdWUKKyAgIG9mIHplcm8gaXMgaGVsZCB3aXRoIFNJWihfbXBfYSk9PTEgYW5kIFBUUihfbXBfYSlbMF09PTAuICBUaGlzIG1ha2VzIGl0CisgICBlYXN5IHRvIGNhbGwgbXBuX211bCwgYW5kIHRoZSBjYXNlIG9mIGE9PTAgaXMgaGlnaGx5IHVuLXJhbmRvbSBhbmQgbm90CisgICB3b3J0aCBhbnkgdHJvdWJsZSB0byBvcHRpbWl6ZS4KKworICAge19jcCxfY259IGlzIHRoZSAiYyIgYWRkZW5kLiAgTm9ybWFsbHkgX2NuIGlzIDEsIGJ1dCB3aGVuIG5haWxzIGFyZSBpbgorICAgdXNlIGEgdWxvbmcgY2FuIGJlIGJpZ2dlciB0aGFuIG9uZSBsaW1iLCBhbmQgaW4gdGhpcyBjYXNlIF9jbiBpcyAyIGlmCisgICBuZWNlc3NhcnkuICBjPT0wIGlzIHN0b3JlZCBhcyBfY3BbMF09PTAgYW5kIF9jbj09MSwgd2hpY2ggbWFrZXMgaXQgZWFzeQorICAgdG8gY2FsbCBfX0dNUE5fQURELiAgYz09MCBpcyBmYWlybHkgdW4tcmFuZG9tIHNvIGlzbid0IHdvcnRoIG9wdGltaXppbmcuCisKKyAgIF9tcF9tMmV4cCBnaXZlcyB0aGUgbW9kdWx1cywgbmFtZWx5IDJebTJleHAuICBXZSBkZW1hbmQgbTJleHA+PTEsIHNpbmNlCisgICBtMmV4cD09MCB3b3VsZCBtZWFuIG5vIGJpdHMgYXQgYWxsIG91dCBvZiBlYWNoIGl0ZXJhdGlvbiwgd2hpY2ggbWFrZXMgbm8KKyAgIHNlbnNlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBtcHpfdCAgICAgICAgICBfbXBfc2VlZDsKKyAgbXB6X3QgICAgICAgICAgX21wX2E7CisgIG1wX3NpemVfdCAgICAgIF9jbjsKKyAgbXBfbGltYl90ICAgICAgX2NwW0xJTUJTX1BFUl9VTE9OR107CisgIHVuc2lnbmVkIGxvbmcgIF9tcF9tMmV4cDsKK30gZ21wX3JhbmRfbGNfc3RydWN0OworCisKKy8qIGxjIChycCwgc3RhdGUpIC0tIEdlbmVyYXRlIG5leHQgbnVtYmVyIGluIExDIHNlcXVlbmNlLiAgUmV0dXJuIHRoZQorICAgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gdGhlIHJlc3VsdC4gIERpc2NhcmRzIHRoZSBsb3dlciBoYWxmIG9mIHRoZQorICAgcmVzdWx0LiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50CitsYyAobXBfcHRyIHJwLCBnbXBfcmFuZHN0YXRlX3B0ciByc3RhdGUpCit7CisgIG1wX3B0ciB0cCwgc2VlZHAsIGFwOworICBtcF9zaXplX3QgdGE7CisgIG1wX3NpemVfdCB0biwgc2VlZG4sIGFuOworICB1bnNpZ25lZCBsb25nIGludCBtMmV4cDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgYml0czsKKyAgbXBfc2l6ZV90IHhuOworICBnbXBfcmFuZF9sY19zdHJ1Y3QgKnA7CisgIFRNUF9ERUNMOworCisgIHAgPSAoZ21wX3JhbmRfbGNfc3RydWN0ICopIFJOR19TVEFURSAocnN0YXRlKTsKKworICBtMmV4cCA9IHAtPl9tcF9tMmV4cDsKKworICBzZWVkcCA9IFBUUiAocC0+X21wX3NlZWQpOworICBzZWVkbiA9IFNJWiAocC0+X21wX3NlZWQpOworCisgIGFwID0gUFRSIChwLT5fbXBfYSk7CisgIGFuID0gU0laIChwLT5fbXBfYSk7CisKKyAgLyogQWxsb2NhdGUgdGVtcG9yYXJ5IHN0b3JhZ2UuICBMZXQgdGhlcmUgYmUgcm9vbSBmb3IgY2FsY3VsYXRpb24gb2YKKyAgICAgKEEgKiBzZWVkICsgQykgJSBNLCBvciBNIGlmIGJpZ2dlciB0aGFuIHRoYXQuICAqLworCisgIFRNUF9NQVJLOworCisgIHRhID0gYW4gKyBzZWVkbiArIDE7CisgIHRuID0gQklUU19UT19MSU1CUyAobTJleHApOworICBpZiAodGEgPD0gdG4pIC8qIHRoYXQgaXMsIGlmICh0YSA8IHRuICsgMSkgKi8KKyAgICB7CisgICAgICBtcF9zaXplX3QgdG1wID0gYW4gKyBzZWVkbjsKKyAgICAgIHRhID0gdG4gKyAxOworICAgICAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKHRhKTsKKyAgICAgIE1QTl9aRVJPICgmdHBbdG1wXSwgdGEgLSB0bXApOyAvKiBtcG5fbXVsIHdvbid0IHplcm8gaXQgb3V0LiAgKi8KKyAgICB9CisgIGVsc2UKKyAgICB0cCA9IFRNUF9BTExPQ19MSU1CUyAodGEpOworCisgIC8qIHQgPSBhICogc2VlZC4gIE5PVEU6IGFuIGlzIGFsd2F5cyA+IDA7IHNlZSBpbml0aWFsaXphdGlvbi4gICovCisgIEFTU0VSVCAoc2VlZG4gPj0gYW4gJiYgYW4gPiAwKTsKKyAgbXBuX211bCAodHAsIHNlZWRwLCBzZWVkbiwgYXAsIGFuKTsKKworICAvKiB0ID0gdCArIGMuICBOT1RFOiB0biBpcyBhbHdheXMgPj0gcC0+X2NuIChwcmVjb25kaXRpb24gZm9yIF9fR01QTl9BREQpOworICAgICBzZWUgaW5pdGlhbGl6YXRpb24uICAqLworICBBU1NFUlQgKHRuID49IHAtPl9jbik7CisgIG1wbl9hZGQgKHRwLCB0cCwgdG4sIHAtPl9jcCwgcC0+X2NuKTsKKworICAvKiB0ID0gdCAlIG0gKi8KKyAgdHBbbTJleHAgLyBHTVBfTlVNQl9CSVRTXSAmPSAoQ05TVF9MSU1CICgxKSA8PCBtMmV4cCAlIEdNUF9OVU1CX0JJVFMpIC0gMTsKKworICAvKiBTYXZlIHJlc3VsdCBhcyBuZXh0IHNlZWQuICAqLworICBNUE5fQ09QWSAoUFRSIChwLT5fbXBfc2VlZCksIHRwLCB0bik7CisKKyAgLyogRGlzY2FyZCB0aGUgbG93ZXIgbTJleHAvMiBvZiB0aGUgcmVzdWx0LiAgKi8KKyAgYml0cyA9IG0yZXhwIC8gMjsKKyAgeG4gPSBiaXRzIC8gR01QX05VTUJfQklUUzsKKworICB0biAtPSB4bjsKKyAgaWYgKHRuID4gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgY250ID0gYml0cyAlIEdNUF9OVU1CX0JJVFM7CisgICAgICBpZiAoY250ICE9IDApCisJeworCSAgbXBuX3JzaGlmdCAodHAsIHRwICsgeG4sIHRuLCBjbnQpOworCSAgTVBOX0NPUFlfSU5DUiAocnAsIHRwLCB4biArIDEpOworCX0KKyAgICAgIGVsc2UJCQkvKiBFdmVuIGxpbWIgYm91bmRhcnkuICAqLworCU1QTl9DT1BZX0lOQ1IgKHJwLCB0cCArIHhuLCB0bik7CisgICAgfQorCisgIFRNUF9GUkVFOworCisgIC8qIFJldHVybiBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiB0aGUgcmVzdWx0LiAgKi8KKyAgcmV0dXJuIChtMmV4cCArIDEpIC8gMjsKK30KKworCisvKiBPYnRhaW4gYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4gICovCitzdGF0aWMgdm9pZAorcmFuZGdldF9sYyAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLCBtcF9wdHIgcnAsIHVuc2lnbmVkIGxvbmcgaW50IG5iaXRzKQoreworICB1bnNpZ25lZCBsb25nIGludCByYml0cG9zOworICBpbnQgY2h1bmtfbmJpdHM7CisgIG1wX3B0ciB0cDsKKyAgbXBfc2l6ZV90IHRuOworICBnbXBfcmFuZF9sY19zdHJ1Y3QgKnA7CisgIFRNUF9ERUNMOworCisgIHAgPSAoZ21wX3JhbmRfbGNfc3RydWN0ICopIFJOR19TVEFURSAocnN0YXRlKTsKKworICBUTVBfTUFSSzsKKworICBjaHVua19uYml0cyA9IHAtPl9tcF9tMmV4cCAvIDI7CisgIHRuID0gQklUU19UT19MSU1CUyAoY2h1bmtfbmJpdHMpOworCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTICh0bik7CisKKyAgcmJpdHBvcyA9IDA7CisgIHdoaWxlIChyYml0cG9zICsgY2h1bmtfbmJpdHMgPD0gbmJpdHMpCisgICAgeworICAgICAgbXBfcHRyIHIycCA9IHJwICsgcmJpdHBvcyAvIEdNUF9OVU1CX0JJVFM7CisKKyAgICAgIGlmIChyYml0cG9zICUgR01QX05VTUJfQklUUyAhPSAwKQorCXsKKwkgIG1wX2xpbWJfdCBzYXZlbGltYiwgcmN5OworCSAgLyogVGFyZ2V0IG9mIG5ldyBjaHVuayBpcyBub3QgYml0IGFsaWduZWQuICBVc2UgdGVtcCBzcGFjZQorCSAgICAgYW5kIGFsaWduIHRoaW5ncyBieSBzaGlmdGluZyBpdCB1cC4gICovCisJICBsYyAodHAsIHJzdGF0ZSk7CisJICBzYXZlbGltYiA9IHIycFswXTsKKwkgIHJjeSA9IG1wbl9sc2hpZnQgKHIycCwgdHAsIHRuLCByYml0cG9zICUgR01QX05VTUJfQklUUyk7CisJICByMnBbMF0gfD0gc2F2ZWxpbWI7CisJICAvKiBib2d1cyAqLworCSAgaWYgKChjaHVua19uYml0cyAlIEdNUF9OVU1CX0JJVFMgKyByYml0cG9zICUgR01QX05VTUJfQklUUykKKwkgICAgICA+IEdNUF9OVU1CX0JJVFMpCisJICAgIHIycFt0bl0gPSByY3k7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRhcmdldCBvZiBuZXcgY2h1bmsgaXMgYml0IGFsaWduZWQuICBMZXQgYGxjJyBwdXQgYml0cworCSAgICAgZGlyZWN0bHkgaW50byBvdXIgdGFyZ2V0IHZhcmlhYmxlLiAgKi8KKwkgIGxjIChyMnAsIHJzdGF0ZSk7CisJfQorICAgICAgcmJpdHBvcyArPSBjaHVua19uYml0czsKKyAgICB9CisKKyAgLyogSGFuZGxlIGxhc3QgWzAuLmNodW5rX25iaXRzKSBiaXRzLiAgKi8KKyAgaWYgKHJiaXRwb3MgIT0gbmJpdHMpCisgICAgeworICAgICAgbXBfcHRyIHIycCA9IHJwICsgcmJpdHBvcyAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBpbnQgbGFzdF9uYml0cyA9IG5iaXRzIC0gcmJpdHBvczsKKyAgICAgIHRuID0gQklUU19UT19MSU1CUyAobGFzdF9uYml0cyk7CisgICAgICBsYyAodHAsIHJzdGF0ZSk7CisgICAgICBpZiAocmJpdHBvcyAlIEdNUF9OVU1CX0JJVFMgIT0gMCkKKwl7CisJICBtcF9saW1iX3Qgc2F2ZWxpbWIsIHJjeTsKKwkgIC8qIFRhcmdldCBvZiBuZXcgY2h1bmsgaXMgbm90IGJpdCBhbGlnbmVkLiAgVXNlIHRlbXAgc3BhY2UKKwkgICAgIGFuZCBhbGlnbiB0aGluZ3MgYnkgc2hpZnRpbmcgaXQgdXAuICAqLworCSAgc2F2ZWxpbWIgPSByMnBbMF07CisJICByY3kgPSBtcG5fbHNoaWZ0IChyMnAsIHRwLCB0biwgcmJpdHBvcyAlIEdNUF9OVU1CX0JJVFMpOworCSAgcjJwWzBdIHw9IHNhdmVsaW1iOworCSAgaWYgKHJiaXRwb3MgKyB0biAqIEdNUF9OVU1CX0JJVFMgLSByYml0cG9zICUgR01QX05VTUJfQklUUyA8IG5iaXRzKQorCSAgICByMnBbdG5dID0gcmN5OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fQ09QWSAocjJwLCB0cCwgdG4pOworCX0KKyAgICAgIC8qIE1hc2sgb2ZmIHRvcCBiaXRzIGlmIG5lZWRlZC4gICovCisgICAgICBpZiAobmJpdHMgJSBHTVBfTlVNQl9CSVRTICE9IDApCisJcnBbbmJpdHMgLyBHTVBfTlVNQl9CSVRTXQorCSAgJj0gfih+Q05TVF9MSU1CICgwKSA8PCBuYml0cyAlIEdNUF9OVU1CX0JJVFMpOworICAgIH0KKworICBUTVBfRlJFRTsKK30KKworCitzdGF0aWMgdm9pZAorcmFuZHNlZWRfbGMgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwgbXB6X3NyY3B0ciBzZWVkKQoreworICBnbXBfcmFuZF9sY19zdHJ1Y3QgKnAgPSAoZ21wX3JhbmRfbGNfc3RydWN0ICopIFJOR19TVEFURSAocnN0YXRlKTsKKyAgbXB6X3B0ciBzZWVkeiA9IHAtPl9tcF9zZWVkOworICBtcF9zaXplX3Qgc2VlZG4gPSBCSVRTX1RPX0xJTUJTIChwLT5fbXBfbTJleHApOworCisgIC8qIFN0b3JlIHAtPl9tcF9zZWVkIGFzIGFuIHVubm9ybWFsaXplZCBpbnRlZ2VyIHdpdGggc2l6ZSBlbm91Z2gKKyAgICAgZm9yIG51bWJlcnMgdXAgdG8gMl5tMmV4cC0xLiAgVGhhdCBzaXplIGNhbid0IGJlIHplcm8uICAqLworICBtcHpfZmRpdl9yXzJleHAgKHNlZWR6LCBzZWVkLCBwLT5fbXBfbTJleHApOworICBNUE5fWkVSTyAoJlBUUiAoc2VlZHopW1NJWiAoc2VlZHopXSwgc2VlZG4gLSBTSVogKHNlZWR6KSk7CisgIFNJWiAoc2VlZHopID0gc2VlZG47Cit9CisKKworc3RhdGljIHZvaWQKK3JhbmRjbGVhcl9sYyAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlKQoreworICBnbXBfcmFuZF9sY19zdHJ1Y3QgKnAgPSAoZ21wX3JhbmRfbGNfc3RydWN0ICopIFJOR19TVEFURSAocnN0YXRlKTsKKworICBtcHpfY2xlYXIgKHAtPl9tcF9zZWVkKTsKKyAgbXB6X2NsZWFyIChwLT5fbXBfYSk7CisgICgqX19nbXBfZnJlZV9mdW5jKSAocCwgc2l6ZW9mIChnbXBfcmFuZF9sY19zdHJ1Y3QpKTsKK30KKworc3RhdGljIHZvaWQgcmFuZGlzZXRfbGMgKGdtcF9yYW5kc3RhdGVfcHRyLCBnbXBfcmFuZHN0YXRlX3NyY3B0cik7CisKK3N0YXRpYyBjb25zdCBnbXBfcmFuZGZucHRyX3QgTGluZWFyX0NvbmdydWVudGlhbF9HZW5lcmF0b3IgPSB7CisgIHJhbmRzZWVkX2xjLAorICByYW5kZ2V0X2xjLAorICByYW5kY2xlYXJfbGMsCisgIHJhbmRpc2V0X2xjCit9OworCitzdGF0aWMgdm9pZAorcmFuZGlzZXRfbGMgKGdtcF9yYW5kc3RhdGVfcHRyIGRzdCwgZ21wX3JhbmRzdGF0ZV9zcmNwdHIgc3JjKQoreworICBnbXBfcmFuZF9sY19zdHJ1Y3QgKmRzdHAsICpzcmNwOworCisgIHNyY3AgPSAoZ21wX3JhbmRfbGNfc3RydWN0ICopIFJOR19TVEFURSAoc3JjKTsKKyAgZHN0cCA9IChnbXBfcmFuZF9sY19zdHJ1Y3QgKikgKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoc2l6ZW9mIChnbXBfcmFuZF9sY19zdHJ1Y3QpKTsKKworICBSTkdfU1RBVEUgKGRzdCkgPSAobXBfbGltYl90ICopICh2b2lkICopIGRzdHA7CisgIFJOR19GTlBUUiAoZHN0KSA9ICh2b2lkICopICZMaW5lYXJfQ29uZ3J1ZW50aWFsX0dlbmVyYXRvcjsKKworICAvKiBfbXBfc2VlZCBhbmQgX21wX2EgbWlnaHQgYmUgdW5ub3JtYWxpemVkIChoaWdoIHplcm8gbGltYnMpLCBidXQKKyAgICAgbXB6X2luaXRfc2V0IHdvbid0IHdvcnJ5IGFib3V0IHRoYXQgKi8KKyAgbXB6X2luaXRfc2V0IChkc3RwLT5fbXBfc2VlZCwgc3JjcC0+X21wX3NlZWQpOworICBtcHpfaW5pdF9zZXQgKGRzdHAtPl9tcF9hLCAgICBzcmNwLT5fbXBfYSk7CisKKyAgZHN0cC0+X2NuID0gc3JjcC0+X2NuOworCisgIGRzdHAtPl9jcFswXSA9IHNyY3AtPl9jcFswXTsKKyAgaWYgKExJTUJTX1BFUl9VTE9ORyA+IDEpCisgICAgZHN0cC0+X2NwWzFdID0gc3JjcC0+X2NwWzFdOworICBpZiAoTElNQlNfUEVSX1VMT05HID4gMikgIC8qIHVzdWFsbHkgdGhlcmUncyBvbmx5IDEgb3IgMiAqLworICAgIE1QTl9DT1BZIChkc3RwLT5fY3AgKyAyLCBzcmNwLT5fY3AgKyAyLCBMSU1CU19QRVJfVUxPTkcgLSAyKTsKKworICBkc3RwLT5fbXBfbTJleHAgPSBzcmNwLT5fbXBfbTJleHA7Cit9CisKKwordm9pZAorZ21wX3JhbmRpbml0X2xjXzJleHAgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwKKwkJICAgICAgbXB6X3NyY3B0ciBhLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBjLAorCQkgICAgICBtcF9iaXRjbnRfdCBtMmV4cCkKK3sKKyAgZ21wX3JhbmRfbGNfc3RydWN0ICpwOworICBtcF9zaXplX3Qgc2VlZG4gPSBCSVRTX1RPX0xJTUJTIChtMmV4cCk7CisKKyAgQVNTRVJUX0FMV0FZUyAobTJleHAgIT0gMCk7CisKKyAgcCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAoMSwgZ21wX3JhbmRfbGNfc3RydWN0KTsKKyAgUk5HX1NUQVRFIChyc3RhdGUpID0gKG1wX2xpbWJfdCAqKSAodm9pZCAqKSBwOworICBSTkdfRk5QVFIgKHJzdGF0ZSkgPSAodm9pZCAqKSAmTGluZWFyX0NvbmdydWVudGlhbF9HZW5lcmF0b3I7CisKKyAgLyogYWxsb2NhdGUgbTJleHAgYml0cyBvZiBzcGFjZSBmb3IgcC0+X21wX3NlZWQsIGFuZCBpbml0aWFsIHNlZWQgIjEiICovCisgIG1wel9pbml0MiAocC0+X21wX3NlZWQsIG0yZXhwKTsKKyAgTVBOX1pFUk8gKFBUUiAocC0+X21wX3NlZWQpLCBzZWVkbik7CisgIFNJWiAocC0+X21wX3NlZWQpID0gc2VlZG47CisgIFBUUiAocC0+X21wX3NlZWQpWzBdID0gMTsKKworICAvKiAiYSIsIGZvcmNlZCB0byAwIHRvIDJebTJleHAtMSAqLworICBtcHpfaW5pdCAocC0+X21wX2EpOworICBtcHpfZmRpdl9yXzJleHAgKHAtPl9tcF9hLCBhLCBtMmV4cCk7CisKKyAgLyogQXZvaWQgU0laKGEpID09IDAgdG8gYXZvaWQgY2hlY2tpbmcgZm9yIHNwZWNpYWwgY2FzZSBpbiBsYygpLiAgKi8KKyAgaWYgKFNJWiAocC0+X21wX2EpID09IDApCisgICAgeworICAgICAgU0laIChwLT5fbXBfYSkgPSAxOworICAgICAgTVBaX05FV0FMTE9DIChwLT5fbXBfYSwgMSlbMF0gPSBDTlNUX0xJTUIgKDApOworICAgIH0KKworICBNUE5fU0VUX1VJIChwLT5fY3AsIHAtPl9jbiwgYyk7CisKKyAgLyogSW50ZXJuYWxseSB3ZSBtYXkgZGlzY2FyZCBhbnkgYml0cyBvZiBjIGFib3ZlIG0yZXhwLiAgVGhlIGZvbGxvd2luZworICAgICBjb2RlIGVuc3VyZXMgdGhhdCBfX0dNUE5fQUREIGluIGxjKCkgd2lsbCBhbHdheXMgd29yay4gICovCisgIGlmIChzZWVkbiA8IHAtPl9jbikKKyAgICBwLT5fY24gPSAocC0+X2NwWzBdICE9IDApOworCisgIHAtPl9tcF9tMmV4cCA9IG0yZXhwOworfQpkaWZmIC0tZ2l0IGEvcmFuZC9yYW5kbXQuYyBiL3JhbmQvcmFuZG10LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmODg5NAotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZG10LmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qIE1lcnNlbm5lIFR3aXN0ZXIgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZ1bmN0aW9ucy4KKworICAgVEhFIEZVTkNUSU9OUyBJTiBUSElTIEZJTEUgQVJFIEZPUiBJTlRFUk5BTCBVU0UgT05MWS4gIFRIRVknUkUgQUxNT1NUCisgICBDRVJUQUlOIFRPIEJFIFNVQkpFQ1QgVE8gSU5DT01QQVRJQkxFIENIQU5HRVMgT1IgRElTQVBQRUFSIENPTVBMRVRFTFkgSU4KKyAgIEZVVFVSRSBHTlUgTVAgUkVMRUFTRVMuCisKK0NvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4gICAvKiBmb3IgTlVMTCAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJyYW5kbXQuaCIKKworCisvKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTWVyc2VubmUgVHdpc3RlciBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgYnkgVGFrdWppIE5pc2hpbXVyYSBhbmQgTWFrb3RvIE1hdHN1bW90by4gIFRoZSBidWZmZXIgaW5pdGlhbGl6YXRpb24KKyAgIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCBpbiBvcmRlciB0byBwZXJtaXQgc2VlZHMgZ3JlYXRlciB0aGFuIDJeMzItMS4KKworICAgVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3BlY2lhbCBfX2dtcF9yYW5kaW5pdF9tdF9ub3NlZWQgd2hpY2ggZXhjbHVkZXMgdGhlCisgICBzZWVkaW5nIGZ1bmN0aW9uIGZyb20gdGhlIGdtcF9yYW5kZm5wdHJfdCByb3V0aW5lcy4gIFRoaXMgaXMgZm9yIHVzZSBieQorICAgbXBuX3JhbmRvbSBhbmQgbXBuX3JhbmRvbTIgb24gdGhlIGdsb2JhbCByYW5kb20gZ2VuZXJhdG9yLiAgTVQgc2VlZGluZworICAgdXNlcyBtcHogZnVuY3Rpb25zLCBhbmQgd2UgZG9uJ3Qgd2FudCBtcG4gcm91dGluZXMgZHJhZ2dpbmcgbXB6IGZ1bmN0aW9ucworICAgaW50byB0aGUgbGluay4gICovCisKKworLyogRGVmYXVsdCBzZWVkIHRvIHVzZSB3aGVuIHRoZSBnZW5lcmF0b3IgaXMgbm90IGluaXRpYWxpemVkLiAgKi8KKyNkZWZpbmUgREVGQVVMVF9TRUVEIDU0ODkgLyogd2FzIDQzNTcgKi8KKworLyogVGVtcGVyaW5nIG1hc2tzLiAgKi8KKyNkZWZpbmUgTUFTS18xIDB4OUQyQzU2ODAKKyNkZWZpbmUgTUFTS18yIDB4RUZDNjAwMDAKKworLyogSW5pdGlhbCBzdGF0ZSBvZiBidWZmZXIgd2hlbiBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQgc2VlZC4gICovCitzdGF0aWMgY29uc3QgZ21wX3VpbnRfbGVhc3QzMl90IGRlZmF1bHRfc3RhdGVbTl0gPQoreworICAweEQyNDdCMjMzLDB4OUU1QUE4RjEsMHgwRkZBOTgxQiwweDlEQ0IwOTgwLDB4NzQyMDBGMkIsMHhBNTc2RDA0NCwKKyAgMHhFOUYwNUFERiwweDE1MzhCRkY1LDB4NTk4MThCQkYsMHhDRjlFNThEOCwweDA5RkNFMDMyLDB4NkExQzY2M0YsCisgIDB4NTExNkU3OEEsMHg2OUIzRTBGQSwweDZEOTJENjY1LDB4RDBBOEJFOTgsMHhGNjY5QjczNCwweDQxQUMxQjY4LAorICAweDYzMDQyM0YxLDB4NEI4RDZCOEEsMHhDMkM0NkRENywweDU2ODA3NDdELDB4NDM3MDNFOEYsMHgzQjYxMDNEMiwKKyAgMHg0OUU1RUIzRiwweENCREFCNEMxLDB4OUM5ODhFMjMsMHg3NDdCRUUwQiwweDkxMTFFMzI5LDB4OUYwMzFCNUEsCisgIDB4RUNDQTcxQjksMHgyQUZFNEVGOCwweDg0MjFDN0VELDB4QUM4OUFGRjEsMHhBRUQ5MERGMywweDJERDc0RjAxLAorICAweDE0OTA2QTEzLDB4NzU4NzNGQTksMHhGRjgzRjg3NywweDUwMjhBMEM5LDB4MTFCNEM0MUQsMHg3Q0FFREJDNCwKKyAgMHg4NjcyRDBBNywweDQ4QTdDMTA5LDB4ODMyMEU1OUYsMHhCQzBCM0Q1RiwweDc1QTMwODg2LDB4RjlFMEQxMjgsCisgIDB4NDFBRjc1ODAsMHgyMzlCQjk0RCwweEM2N0EzQzgxLDB4NzRFRUJENkUsMHhCQzAyQjUzQywweDcyN0VBNDQ5LAorICAweDZCOEEyODA2LDB4NTg1M0IwREEsMHhCREUwMzJGNCwweENFMjM0ODg1LDB4MzIwRDYxNDUsMHg0OENDMDUzRiwKKyAgMHgwMERCQzREMiwweEQ1NUEyMzk3LDB4RTEwNTlCNkYsMHgxQzNFMDVEMSwweDA5NjU3QzY0LDB4RDA3Q0I2NjEsCisgIDB4NkU5ODJFMzQsMHg2REQxRDc3NywweEVERUQxMDcxLDB4RDc5REZENjUsMHhGODE2RERDRSwweEI2RkFGMUU0LAorICAweDFDNzcxMDc0LDB4MzExODM1QkQsMHgxOEY5NTJGNywweEY4RjQwMzUwLDB4NEVDRUQzNTQsMHg3QzhBQzEyQiwKKyAgMHgzMUE5OTk0RCwweDRGRDQ3NzQ3LDB4REMyMjdBMjMsMHg2REZBRkRERiwweDY3OTZFNzQ4LDB4MEM2RjYzNEYsCisgIDB4Rjk5MkZBMUQsMHg0Q0Y2NzBDOSwweDA2N0RGRDMxLDB4QTdBM0UxQTUsMHg4Q0Q3RDlERiwweDk3MkNDQjM0LAorICAweDY3QzgyMTU2LDB4RDU0OEY2QTgsMHgwNDVDRUMyMSwweEYzMjQwQkZCLDB4REVGNjU2QTcsMHg0M0RFMDhDNSwKKyAgMHhEQUQxRjkyRiwweDM3MjZDNTZCLDB4MTQwOUYxOUEsMHg5NDJGRDE0NywweEI5MjY3NDlDLDB4QUREQzMxQjgsCisgIDB4NTNEMEQ4NjksMHhEMUJBNTJGRSwweDY3MjJERjhDLDB4MjJEOTVBNzQsMHg3REMxQjUyQSwweDFERUM2RkQ1LAorICAweDcyNjI4NzRELDB4MEE3MjVEQzksMHhFNkE4MTkzRCwweEEwNTI4MzVBLDB4REM5QUQ5MjgsMHhFNTlFQkI5MCwKKyAgMHg3MERCQTlGRiwweEQ2MTI3NDlELDB4NUE1QTYzOEMsMHg2MDg2RUMzNywweDJBNTc5NzA5LDB4MTQ0OUVBM0EsCisgIDB4QkM4RTNDMDYsMHgyRjkwMDY2NiwweEZCRTc0RkQxLDB4NkIzNUI5MTEsMHhGODMzNTAwOCwweEVGMUU5NzlELAorICAweDczOEFCMjlELDB4QTJEQzBGREMsMHg3Njk2MzA1RCwweEY1NDI5REFDLDB4OEM0MTgxM0IsMHg4MDczRTAyRSwKKyAgMHhCRUY4M0NDRCwweDdCNTBBOTVBLDB4MDVFRTU4NjIsMHgwMDgyOUVDRSwweDhDQTE5NThDLDB4QkU0RUEyRTIsCisgIDB4NDI5M0JCNzMsMHg2NTZGN0IyMywweDQxNzMxNkQ4LDB4NDQ2N0Q3Q0YsMHgyMjAwRTYzQiwweDEwOTA1MEM4LAorICAweDgxNENCRTQ3LDB4MzZCMUQ0QTgsMHgzNkFGOTMwNSwweDMwODMyN0IzLDB4RUJDRDczNDQsMHhBNzM4REUyNywKKyAgMHg1QTEwQzM5OSwweDQxNDIzNzFELDB4NjRBMTg1MjgsMHgwQjMxRThCMiwweDY0MTA1N0I5LDB4NkFGQzM2M0IsCisgIDB4MTA4QUQ5NTMsMHg5RDREQTIzNCwweDBDMkQ5MTU5LDB4MUM4QTFBMUYsMHgzMTBDNjZCQSwweDg3QUExMDcwLAorICAweERBQzgzMkZGLDB4MEE0MzM0MjIsMHg3QUYxNTgxMiwweDJEOEQ5QkQwLDB4OTk1QTI1RTksMHgyNTMyNkNBQywKKyAgMHhBMzQzODREQiwweDRDODQyMUNDLDB4NEYwMzE1RUMsMHgyOUU4NjQ5RSwweEE3NzMyRDZGLDB4MkU5NEQzRTMsCisgIDB4N0Q5OEEzNDAsMHgzOTdDNEQ3NCwweDY1OURCNERFLDB4NzQ3RDRFOUEsMHhEOURCODQzNSwweDQ2NTlEQkU5LAorICAweDMxM0U2REM1LDB4MjlEMTA0REMsMHg5RjIyNkNCQSwweDQ1MkYxOEIwLDB4RDBCQzUwNjgsMHg4NDRDQTI5OSwKKyAgMHg3ODJCMjk0RSwweDRBRTJFQjdCLDB4QTRDNDc1RjgsMHg3MEE4MTMxMSwweDRCM0U4QkNDLDB4N0UyMEQ0QkEsCisgIDB4QUJDQTMzQzksMHg1N0JFMjk2MCwweDQ0RjlCNDE5LDB4MkU1Njc3NDYsMHg3MkVCNzU3QSwweDEwMkNDMEU4LAorICAweEIwN0YzMkI5LDB4RDBEQUJENTksMHhCQTg1QUQ2QiwweEYzRTIwNjY3LDB4OThENzdEODEsMHgxOTdBRkE0NywKKyAgMHg1MThFRTlBQywweEUxMENFNUEyLDB4MDFDRjJDMkEsMHhEM0EzQUYzRCwweDE2RERGRDY1LDB4NjY5MjMyRjgsCisgIDB4MUM1MEEzMDEsMHhCOTNEOTE1MSwweDkzNTREM0Y0LDB4ODQ3RDc5RDAsMHhENUZFMkVDNiwweDFGN0IwNjEwLAorICAweEZBNkI5MEE1LDB4QzU4NzkwNDEsMHgyRTdEQzA1RSwweDQyM0YxRjMyLDB4RUY2MjNEREIsMHg0OUMxMzI4MCwKKyAgMHg5ODcxNEU5MiwweEM3QjZFNEFELDB4QzQzMTg0NjYsMHgwNzM3RjMxMiwweDREM0MwMDNGLDB4OUFDQzFGMUYsCisgIDB4NUYxQzkyNkQsMHgwODVGQTc3MSwweDE4NUE4M0EyLDB4RjlBQTE1OUQsMHgwQjBCMDEzMiwweEY5OEU3QTQzLAorICAweENEOUVCREJFLDB4MDE5MENCMjksMHgxMEQ5M0ZCNiwweDNCOEE0RDk3LDB4NjZBNjVBNDEsMHhFNDNFNzY2RiwKKyAgMHg3N0JFM0M0MSwweEI5Njg2MzY0LDB4Q0IzNjk5NEQsMHg2ODQ2QTI4NywweDU2N0U3N0Y3LDB4MzYxNzhERDgsCisgIDB4QkRFNkIxRjIsMHhCNkVGREM2NCwweDgyOTUwMzI0LDB4NDIwNTNGNDcsMHhDMDlCRTUxQywweDA5NDJENzYyLAorICAweDM1RjkyQzdGLDB4MzY3REVDNjEsMHg2RUUzRDk4MywweERCQUFGNzhBLDB4MjY1RDJDNDcsMHg4RUI0QkY1QywKKyAgMHgzM0IyMzJENywweEIwMTM3RTc3LDB4MzczQzM5QTcsMHg4RDJCMkU3NiwweEM3NTEwRjAxLDB4NTBGOUUwMzIsCisgIDB4N0IxRkREREIsMHg3MjRDMkFBRSwweEIxMEVDQjMxLDB4Q0NBM0QxQjgsMHg3RjBCQ0YxMCwweDQyNTRCQkJELAorICAweEUzRjkzQjk3LDB4MjMwNTAzOUIsMHg1MzEyMEUyMiwweDFBMkYzQjlBLDB4MEZEREJEOTcsMHgwMTE4NTYxRSwKKyAgMHgwQTc5OEUxMywweDlFMEIzQUNELDB4REI2QzlGMTUsMHhGNTEyRDBBMiwweDlFOEMzQTI4LDB4RUUyMTg0QUUsCisgIDB4MDA1MUVDMkYsMHgyNDMyRjc0RiwweEIwQUE2NkVBLDB4NTUxMjhEODgsMHhGN0Q4M0EzOCwweDREQUU4RTgyLAorICAweDNGREM5OEQ2LDB4NUYwQkQzNDEsMHg3MjQ0QkUxRCwweEM3QjQ4RTc4LDB4MkQ0NzMwNTMsMHg0Mzg5MkUyMCwKKyAgMHhCQTBGMUYyQSwweDUyNEQ0ODk1LDB4MkUxMEJDQjEsMHg0QzM3MkQ4MSwweDVDM0U1MENELDB4Q0Y2MUNDMkUsCisgIDB4OTMxNzA5QUIsMHg4MUIzQUVGQywweDM5RTk0MDVFLDB4N0ZGRTEwOEMsMHg0RkJCM0ZGOCwweDA2QUJFNDUwLAorICAweDdGNUJGNTFFLDB4QTRFM0NERkQsMHhEQjBGNkM2RiwweDE1OUExMjI3LDB4M0I5RkVENTUsMHhEMjBCNkY3RiwKKyAgMHhGQkU5Q0M4MywweDY0ODU2NjE5LDB4QkY1MkI4QUYsMHg5RDcwMDZCMCwweDcxMTY1QkM2LDB4QUUzMjRBRUUsCisgIDB4MjlEMjdGMkMsMHg3OTRDMjA4NiwweDc0NDQ1Q0UyLDB4NzgyOTE1Q0MsMHhENENFNjg4NiwweDMyODlBRTdDLAorICAweDUzREVGMjk3LDB4NDE4NUY3RUQsMHg4OEI3MjQwMCwweDNDMDlEQzExLDB4QkNFM0FBQjYsMHg2QTc1OTM0QSwKKyAgMHhCMjY3RTM5OSwweDAwMERGMUJGLDB4MTkzQkE1RTIsMHhGQTNFMTk3NywweDE3OUUxNEY2LDB4MUVFREUyOTgsCisgIDB4NjkxRjBCMDYsMHhCODRGNzhBQywweEMxQzE1MzE2LDB4RkZGRjNBRDYsMHgwQjQ1NzM4MywweDUxOENENjEyLAorICAweDA1QTAwRjNFLDB4RDVCN0QyNzUsMHg0QzVFQ0NENywweEUwMkNEMEJFLDB4NTU1OEU5RjIsMHgwQzg5QkJGMCwKKyAgMHhBM0Q5NjIyNywweDI4MzJEMkIyLDB4RjY2N0I4OTcsMHhENDU1NjU1NCwweEY5RDJGMDFGLDB4RkExRTNGQUUsCisgIDB4NTJDMkUxRUUsMHhFNTQ1MUYzMSwweDdFODQ5NzI5LDB4REFCREI2N0EsMHg1NEJGNUU3RSwweEY4MzFDMjcxLAorICAweDVGMUExN0UzLDB4OUQxNDBBRkUsMHg5Mjc0MUM0NywweDQ4Q0ZBQkNFLDB4OUNCQkU0NzcsMHg5QzNFRTU3RiwKKyAgMHhCMDdENEMzOSwweENDMjFCQ0UyLDB4Njk3NzA4QjEsMHg1OERBMkE2QiwweDIzNzBEQjE2LDB4NkU2NDE5NDgsCisgIDB4QUNDNUJENTIsMHg4NjhGMjRDQywweENBMURCMEY1LDB4NENBREE0OTIsMHgzRjQ0M0U1NCwweEM0QTRENUU5LAorICAweEYwMEFENjcwLDB4RTkzQzg2RTAsMHhGRTkwNjUxQSwweERERTUzMkEzLDB4QTY2NDU4REYsMHhBQjdENzE1MSwKKyAgMHgwRTJFNzc1RiwweEM5MTA5Rjk5LDB4OEQ5NkQ1OUYsMHg3M0NFRjE0QywweEM3NEU4OEU5LDB4MDI3MTJEQzAsCisgIDB4MDRGNDE3MzUsMHgyRTU5MTRBMiwweDU5RjRCMkZCLDB4MDI4N0ZDODMsMHg4MEJDMDM0MywweEY2QjMyNTU5LAorICAweEM3NDE3OEQ0LDB4RjFEOTkxMjMsMHgzODNDQ0MwNywweEFDQzA2MzdELDB4MDg2M0E1NDgsMHhBNkZDQUM4NSwKKyAgMHgyQTEzRUZGMCwweEFGMkVFREIxLDB4NDFFNzI3NTAsMHhFMEM2QjM0MiwweDVEQTIyQjQ2LDB4NjM1NTU5RTAsCisgIDB4RDJFQTQwQUMsMHgxMEFBOThDMCwweDE5MDk2NDk3LDB4MTEyQzU0MkIsMHgyQzg1MDQwQywweEE4NjhFN0QwLAorICAweDZFMjYwMTg4LDB4RjU5NkQzOTAsMHhDM0JCNUQ3QSwweDdBMkFBOTM3LDB4REZEMTUwMzIsMHg2NzgwQUUzQiwKKyAgMHhEQjVGOUNEOCwweDhCRDI2NkIwLDB4Nzc0NEFGMTIsMHhCNDYzQjFCMCwweDU4OTYyOUM5LDB4RTMwREJDNkUsCisgIDB4ODgwRjU1NjksMHgyMDlFNkUxNiwweDlERUNBNTBDLDB4MDI5ODdBNTcsMHhCRUQzRUE1NywweEQzQTY3OEFBLAorICAweDcwREQwMzBELDB4MENGRDlDNUQsMHg5MkExOEU5OSwweEY1NzQwNjE5LDB4N0Y2RjBBN0QsMHgxMzRDQUY5QSwKKyAgMHg3MEY1QkFFNCwweDIzRENBN0I1LDB4NEQ3ODhGQ0QsMHhDN0YwNzg0NywweEJDRjc3REExLDB4OTA3MUQ1NjgsCisgIDB4RkM2MjdFQTEsMHhBRTAwNEI3NywweDY2QjU0QkNCLDB4N0VGMkRBQUMsMHhEQ0Q1QUMzMCwweEI5QkRGNzMwLAorICAweDUwNUE5N0E3LDB4OUQ4ODFGRDMsMHhBREI3OTZDQywweDk0QTFEMjAyLDB4OTc1MzVEN0YsMHgzMUVDMjBDMCwKKyAgMHhCMTg4N0E5OCwweEMxNDc1MDY5LDB4QTZGNzNBRjMsMHg3MUU0RTA2NywweDQ2QTU2OURFLDB4RDJBREU0MzAsCisgIDB4NkYwNzYyQzcsMHhGNTA4NzZGNCwweDUzNTEwNTQyLDB4MDM3NDFDM0UsMHg1MzUwMjIyNCwweEQ4RTU0RDYwLAorICAweDNDNDRBQjFBLDB4MzQ5NzJCNDYsMHg3NEJGQTg5RCwweEQ3RDc2OEUwLDB4MzdFNjA1REMsMHhFMTNEMUJERiwKKyAgMHg1MDUxQzQyMSwweEI5RTA1N0JFLDB4QjcxN0ExNEMsMHhBMTczMEM0MywweEI5OTYzOEJFLDB4QjVENUYzNkQsCisgIDB4RTk2MEQ5RUEsMHg2QjEzODhEMywweEVDQjZEM0I2LDB4QkRCRThCODMsMHgyRTI5QUZDNSwweDc2NEQ3MUVDLAorICAweDRCOEY0RjQzLDB4QzIxRERDMDAsMHhBNjNGNjU3RiwweDgyNjc4MTMwLDB4REJGNTM1QUMsMHhBNTk0RkM1OCwKKyAgMHg5NDI2ODZCQywweEJEOUI2NTdCLDB4NEEwRjlCNjEsMHg0NEZGMTg0RiwweDM4RTEwQTJGLDB4NjE5MTA2MjYsCisgIDB4NUUyNDc2MzYsMHg3MTA2RDEzNywweEM2MjgwMkYwLDB4QkQxRDFGMDAsMHg3Q0MwRENCMiwweEVENjM0OTA5LAorICAweERDMTNCMjRFLDB4OTc5OUM0OTksMHhENzdFM0Q2QSwweDE0NzczQjY4LDB4OTY3QTRGQjcsMHgzNUVFQ0ZCMSwKKyAgMHgyQTUxMTBCOCwweEUyRjBBRjk0LDB4OUQwOURFQTUsMHgyMDI1NUQyNywweDU3NzFEMzRCLDB4RTEwODlFRTQsCisgIDB4MjQ2RjMzMEIsMHg4RjdDQUVFNSwweEQzMDY0NzEyLDB4NzVDQUZCRUUsMHhCOTRGNzAyOCwweEVEOTUzNjY2LAorICAweDVEMTk3NUI0LDB4NUFGODEyNzEsMHgxM0JFMjAyNSwweDg1MTk0NjU5LDB4MzA4MDUzMzEsMHhFQzlENDZDMCwKKyAgMHhCQzAyN0MzNiwweDJBRjg0MTg4LDB4QzIxNDFCODAsMHhDMDJCMUU0QSwweDA0RDM2MTc3LDB4RkM1MEU5RDcsCisgIDB4MzlDRTc5REEsMHg5MTdFMEEwMCwweEVGN0EwQkY0LDB4QTk4QkQ4RDEsMHgxOTQyNEREMiwweDk0MzlERjFGLAorICAweEM0MkFGNzQ2LDB4QUREQkU4M0UsMHg4NTIyMUYwRCwweDQ1NTYzRTkwLDB4OTA5NUVDNTIsMHg3Nzg4N0IyNSwKKyAgMHg4QUU0NjA2NCwweEJENDNCNzFBLDB4QkI1NDE5NTYsMHg3MzY2Q0Y5RCwweEVFOEUxNzM3LDB4QjVBNzI3QzksCisgIDB4NTA3NkIzRTcsMHhGQzcwQkFDQSwweENFMTM1Qjc1LDB4QzRFOTFBQTMsMHhGMDM0MTkxMSwweDUzNDMwQzNGLAorICAweDg4NkIwODI0LDB4NkJCNUI4QjcsMHgzM0UyMTI1NCwweEYxOTNCNDU2LDB4NUIwOTYxN0YsMHgyMTVGRkY1MCwKKyAgMHg0OEQ5N0VGMSwweDM1NjQ3OUFCLDB4NkVBOUREQzQsMHgwRDM1Mjc0NiwweEEyRjVDRTQzLDB4QjIyNkExQjMsCisgIDB4MTMyOUVBM0MsMHg3QTMzN0NDMiwweEI1Q0NFMTNELDB4NTYzRTNCNUIsMHg1MzRFOEU4RiwweDU2MTM5OUM5LAorICAweEUxNTk2MzkyLDB4QjBGMDMxMjUsMHg0NTg2NjQ1QiwweDFGMzcxODQ3LDB4OTRFQUFCRDEsMHg0MUY5N0VERCwKKyAgMHhFM0U1QTM5QiwweDcxQzc3NEUyLDB4NTA3Mjk2RjQsMHg1OTYwMTMzQiwweDc4NTJDNDk0LDB4M0Y1QjI2OTEsCisgIDB4QTNGODc3NzQsMHg1QTdBRjg5RSwweDE3REEzRjI4LDB4RTlEOTUxNkQsMHhGQ0MxQzFENSwweEU0NjE4NjI4LAorICAweDA0MDgxMDQ3LDB4RDhFNERCNUYsMHhEQzM4MDQxNiwweDhDNDkzM0UyLDB4OTUwNzRENTMsMHhCMUIwMDMyRCwKKyAgMHhDQzgxMDJFQSwweDcxNjQxMjQzLDB4OThENkVCNkEsMHg5MEZFQzk0NSwweEEwOTE0MzQ1LDB4NkZBQjAzN0QsCisgIDB4NzBGNDlDNEQsMHgwNUJGNUIwRSwweDkyN0FBRjdGLDB4QTE5NDBGNjEsMHhGRUUwNzU2RiwweEY4MTUzNjlGLAorICAweDVDMDAyNTNCLDB4RjJCOTc2MkYsMHg0QUVCM0NDQywweDEwNjlGMzg2LDB4RkJBNEU3QjksMHg3MDMzMjY2NSwKKyAgMHg2QkNBODEwRSwweDg1QUI4MDU4LDB4QUU0QjJCMkYsMHg5RDEyMDcxMiwweEJFRThFQUNCLDB4Nzc2QTExMTIKK307CisKK3ZvaWQKK19fZ21wX210X3JlY2FsY19idWZmZXIgKGdtcF91aW50X2xlYXN0MzJfdCBtdFtdKQoreworICBnbXBfdWludF9sZWFzdDMyX3QgeTsKKyAgaW50IGtrOworCisgIGZvciAoa2sgPSAwOyBrayA8IE4gLSBNOyBraysrKQorICAgIHsKKyAgICAgIHkgPSAobXRba2tdICYgMHg4MDAwMDAwMCkgfCAobXRba2sgKyAxXSAmIDB4N0ZGRkZGRkYpOworICAgICAgbXRba2tdID0gbXRba2sgKyBNXSBeICh5ID4+IDEpIF4gKCh5ICYgMHgwMSkgIT0gMCA/IE1BVFJJWF9BIDogMCk7CisgICAgfQorICBmb3IgKDsga2sgPCBOIC0gMTsga2srKykKKyAgICB7CisgICAgICB5ID0gKG10W2trXSAmIDB4ODAwMDAwMDApIHwgKG10W2trICsgMV0gJiAweDdGRkZGRkZGKTsKKyAgICAgIG10W2trXSA9IG10W2trIC0gKE4gLSBNKV0gXiAoeSA+PiAxKSBeICgoeSAmIDB4MDEpICE9IDAgPyBNQVRSSVhfQSA6IDApOworICAgIH0KKworICB5ID0gKG10W04gLSAxXSAmIDB4ODAwMDAwMDApIHwgKG10WzBdICYgMHg3RkZGRkZGRik7CisgIG10W04gLSAxXSA9IG10W00gLSAxXSBeICh5ID4+IDEpIF4gKCh5ICYgMHgwMSkgIT0gMCA/IE1BVFJJWF9BIDogMCk7Cit9CisKKworLyogR2V0IG5iaXRzIGJpdHMgb2Ygb3V0cHV0IGZyb20gdGhlIGdlbmVyYXRvciBpbnRvIGRlc3QuCisgICBOb3RlIHRoYXQgTWVyc2VubmUgVHdpc3RlciBpcyBkZXNpZ25lZCB0byBwcm9kdWNlIG91dHB1dHMgaW4KKyAgIDMyLWJpdCB3b3Jkcy4gICovCit2b2lkCitfX2dtcF9yYW5kZ2V0X210IChnbXBfcmFuZHN0YXRlX3B0ciByc3RhdGUsIG1wX3B0ciBkZXN0LCB1bnNpZ25lZCBsb25nIGludCBuYml0cykKK3sKKyAgZ21wX3VpbnRfbGVhc3QzMl90IHk7CisgIGludCByYml0czsKKyAgbXBfc2l6ZV90IGk7CisgIG1wX3NpemVfdCBubGltYnM7CisgIGludCAqcG10aTsKKyAgZ21wX3VpbnRfbGVhc3QzMl90ICptdDsKKworICBwbXRpID0gJigoZ21wX3JhbmRfbXRfc3RydWN0ICopIFJOR19TVEFURSAocnN0YXRlKSktPm10aTsKKyAgbXQgPSAoKGdtcF9yYW5kX210X3N0cnVjdCAqKSBSTkdfU1RBVEUgKHJzdGF0ZSkpLT5tdDsKKworICBubGltYnMgPSBuYml0cyAvIEdNUF9OVU1CX0JJVFM7CisgIHJiaXRzID0gbmJpdHMgJSBHTVBfTlVNQl9CSVRTOworCisjZGVmaW5lIE5FWFRfUkFORE9NCQkJXAorICBkbwkJCQkJXAorICAgIHsJCQkJCVwKKyAgICAgIGlmICgqcG10aSA+PSBOKQkJCVwKKwl7CQkJCVwKKwkgIF9fZ21wX210X3JlY2FsY19idWZmZXIgKG10KTsgIFwKKwkgICpwbXRpID0gMDsJCQlcCisJfQkJCQlcCisgICAgICB5ID0gbXRbKCpwbXRpKSsrXTsJCVwKKyAgICAgIHkgXj0gKHkgPj4gMTEpOwkJCVwKKyAgICAgIHkgXj0gKHkgPDwgNykgJiBNQVNLXzE7CQlcCisgICAgICB5IF49ICh5IDw8IDE1KSAmIE1BU0tfMjsJCVwKKyAgICAgIHkgXj0gKHkgPj4gMTgpOwkJCVwKKyAgICB9CQkJCQlcCisgIHdoaWxlICgwKQorCisKKyAgLyogSGFuZGxlIHRoZSBjb21tb24gY2FzZXMgb2YgMzItIG9yIDY0LWJpdCBsaW1icyB3aXRoIGZhc3QsCisgICAgIG9wdGltaXplZCByb3V0aW5lcywgYW5kIHRoZSByZXN0IG9mIGNhc2VzIHdpdGggYSBnZW5lcmFsCisgICAgIHJvdXRpbmUuICBJbiBhbGwgY2FzZXMsIG5vIG1vcmUgdGhhbiAzMSBiaXRzIGFyZSByZWplY3RlZAorICAgICBmb3IgdGhlIGxhc3QgbGltYiBzbyB0aGF0IGV2ZXJ5IHZlcnNpb24gb2YgdGhlIGNvZGUgaXMKKyAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlcnMuICAqLworCisjaWYgKEdNUF9OVU1CX0JJVFMgPT0gMzIpCisKKyAgZm9yIChpID0gMDsgaSA8IG5saW1iczsgaSsrKQorICAgIHsKKyAgICAgIE5FWFRfUkFORE9NOworICAgICAgZGVzdFtpXSA9IChtcF9saW1iX3QpIHk7CisgICAgfQorICBpZiAocmJpdHMpCisgICAgeworICAgICAgTkVYVF9SQU5ET007CisgICAgICBkZXN0W25saW1ic10gPSAobXBfbGltYl90KSAoeSAmIH4oVUxPTkdfTUFYIDw8IHJiaXRzKSk7CisgICAgfQorCisjZWxzZSAvKiBHTVBfTlVNQl9CSVRTICE9IDMyICovCisjaWYgKEdNUF9OVU1CX0JJVFMgPT0gNjQpCisKKyAgZm9yIChpID0gMDsgaSA8IG5saW1iczsgaSsrKQorICAgIHsKKyAgICAgIE5FWFRfUkFORE9NOworICAgICAgZGVzdFtpXSA9IChtcF9saW1iX3QpIHk7CisgICAgICBORVhUX1JBTkRPTTsKKyAgICAgIGRlc3RbaV0gfD0gKG1wX2xpbWJfdCkgeSA8PCAzMjsKKyAgICB9CisgIGlmIChyYml0cykKKyAgICB7CisgICAgICBpZiAocmJpdHMgPCAzMikKKwl7CisJICBORVhUX1JBTkRPTTsKKwkgIGRlc3RbbmxpbWJzXSA9IChtcF9saW1iX3QpICh5ICYgfihVTE9OR19NQVggPDwgcmJpdHMpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgTkVYVF9SQU5ET007CisJICBkZXN0W25saW1ic10gPSAobXBfbGltYl90KSB5OworCSAgaWYgKHJiaXRzID4gMzIpCisJICAgIHsKKwkgICAgICBORVhUX1JBTkRPTTsKKwkgICAgICBkZXN0W25saW1ic10gfD0KKwkJKChtcF9saW1iX3QpICh5ICYgfihVTE9OR19NQVggPDwgKHJiaXRzLTMyKSkpKSA8PCAzMjsKKwkgICAgfQorCX0KKyAgICB9CisKKyNlbHNlIC8qIEdNUF9OVU1CX0JJVFMgIT0gNjQgKi8KKworICB7CisgICAgLyogRmFsbCBiYWNrIHRvIGEgZ2VuZXJhbCBhbGdvcml0aG0uICBUaGlzIGFsZ29yaXRobSB3b3JrcyBieQorICAgICAgIGtlZXBpbmcgYSBwb29sIG9mIHVwIHRvIDY0IGJpdHMgKDIgb3V0cHV0cyBmcm9tIE1UKSBhY3RpbmcKKyAgICAgICBhcyBhIHNoaWZ0IHJlZ2lzdGVyIGZyb20gd2hpY2ggYml0cyBhcmUgY29uc3VtZWQgYXMgbmVlZGVkLgorICAgICAgIEJpdHMgYXJlIGNvbnN1bWVkIHVzaW5nIHRoZSBMU0IgYml0cyBvZiBiaXRwb29sX2wsIGFuZAorICAgICAgIGluc2VydGVkIHZpYSBiaXRwb29sX2ggYW5kIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KKworICAgIGdtcF91aW50X2xlYXN0MzJfdCBiaXRwb29sX2ggPSAwOworICAgIGdtcF91aW50X2xlYXN0MzJfdCBiaXRwb29sX2wgPSAwOworICAgIGludCBiaXRzX2luX3Bvb2wgPSAwOwkvKiBIb2xkcyBudW1iZXIgb2YgdmFsaWQgYml0cyBpbiB0aGUgcG9vbC4gICovCisgICAgaW50IGJpdHNfdG9fZmlsbDsJCS8qIEhvbGRzIHRvdGFsIG51bWJlciBvZiBiaXRzIHRvIHB1dCBpbgorCQkJCSAgIGRlc3RpbmF0aW9uLiAgKi8KKyAgICBpbnQgYml0aWR4OwkJCS8qIEhvbGRzIHRoZSBkZXN0aW5hdGlvbiBiaXQgcG9zaXRpb24uICAqLworICAgIG1wX3NpemVfdCBubGltYnMyOwkJLyogTnVtYmVyIG9mIHdob2xlK3BhcnRpYWwgbGltYnMgdG8gZmlsbC4gICovCisKKyAgICBubGltYnMyID0gbmxpbWJzICsgKHJiaXRzICE9IDApOworCisgICAgZm9yIChpID0gMDsgaSA8IG5saW1iczI7IGkrKykKKyAgICAgIHsKKwliaXRpZHggPSAwOworCWlmIChpIDwgbmxpbWJzKQorCSAgYml0c190b19maWxsID0gR01QX05VTUJfQklUUzsKKwllbHNlCisJICBiaXRzX3RvX2ZpbGwgPSByYml0czsKKworCWRlc3RbaV0gPSBDTlNUX0xJTUIgKDApOworCXdoaWxlIChiaXRzX3RvX2ZpbGwgPj0gMzIpIC8qIFByb2Nlc3Mgd2hvbGUgMzItYml0IGJsb2NrcyBmaXJzdC4gICovCisJICB7CisJICAgIGlmIChiaXRzX2luX3Bvb2wgPCAzMikJLyogTmVlZCBtb3JlIGJpdHMuICAqLworCSAgICAgIHsKKwkJLyogNjQtYml0IHJpZ2h0IHNoaWZ0LiAgKi8KKwkJTkVYVF9SQU5ET007CisJCWJpdHBvb2xfaCA9IHk7CisJCWJpdHBvb2xfbCB8PSAoYml0cG9vbF9oIDw8IGJpdHNfaW5fcG9vbCkgJiAweEZGRkZGRkZGOworCQlpZiAoYml0c19pbl9wb29sID09IDApCisJCSAgYml0cG9vbF9oID0gMDsKKwkJZWxzZQorCQkgIGJpdHBvb2xfaCA+Pj0gMzIgLSBiaXRzX2luX3Bvb2w7CisJCWJpdHNfaW5fcG9vbCArPSAzMjsJLyogV2UndmUgZ290IDMyIG1vcmUgYml0cy4gICovCisJICAgICAgfQorCisJICAgIC8qIEZpbGwgYSAzMi1iaXQgY2h1bmsuICAqLworCSAgICBkZXN0W2ldIHw9ICgobXBfbGltYl90KSBiaXRwb29sX2wpIDw8IGJpdGlkeDsKKwkgICAgYml0cG9vbF9sID0gYml0cG9vbF9oOworCSAgICBiaXRzX2luX3Bvb2wgLT0gMzI7CisJICAgIGJpdHNfdG9fZmlsbCAtPSAzMjsKKwkgICAgYml0aWR4ICs9IDMyOworCSAgfQorCisJLyogQ292ZXIgdGhlIGNhc2Ugd2hlcmUgR01QX05VTUJfQklUUyBpcyBub3QgYSBtdWx0aXBsZSBvZiAzMi4gICovCisJaWYgKGJpdHNfdG9fZmlsbCAhPSAwKQorCSAgeworCSAgICBpZiAoYml0c19pbl9wb29sIDwgYml0c190b19maWxsKQorCSAgICAgIHsKKwkJTkVYVF9SQU5ET007CisJCWJpdHBvb2xfaCA9IHk7CisJCWJpdHBvb2xfbCB8PSAoYml0cG9vbF9oIDw8IGJpdHNfaW5fcG9vbCkgJiAweEZGRkZGRkZGOworCQlpZiAoYml0c19pbl9wb29sID09IDApCisJCSAgYml0cG9vbF9oID0gMDsKKwkJZWxzZQorCQkgIGJpdHBvb2xfaCA+Pj0gMzIgLSBiaXRzX2luX3Bvb2w7CisJCWJpdHNfaW5fcG9vbCArPSAzMjsKKwkgICAgICB9CisKKwkgICAgZGVzdFtpXSB8PSAoKChtcF9saW1iX3QpIGJpdHBvb2xfbAorCQkJICYgfih+Q05TVF9MSU1CICgwKSA8PCBiaXRzX3RvX2ZpbGwpKQorCQkJPDwgYml0aWR4KTsKKwkgICAgYml0cG9vbF9sID0gKChiaXRwb29sX2wgPj4gYml0c190b19maWxsKQorCQkJIHwgKGJpdHBvb2xfaCA8PCAoMzIgLSBiaXRzX3RvX2ZpbGwpKSkgJiAweEZGRkZGRkZGOworCSAgICBiaXRwb29sX2ggPj49IGJpdHNfdG9fZmlsbDsKKwkgICAgYml0c19pbl9wb29sIC09IGJpdHNfdG9fZmlsbDsKKwkgIH0KKyAgICAgIH0KKyAgfQorCisjZW5kaWYgLyogR01QX05VTUJfQklUUyAhPSA2NCAqLworI2VuZGlmIC8qIEdNUF9OVU1CX0JJVFMgIT0gMzIgKi8KK30KKwordm9pZAorX19nbXBfcmFuZGNsZWFyX210IChnbXBfcmFuZHN0YXRlX3B0ciByc3RhdGUpCit7CisgICgqX19nbXBfZnJlZV9mdW5jKSAoKHZvaWQgKikgUk5HX1NUQVRFIChyc3RhdGUpLAorCQkgICAgICBBTExPQyAocnN0YXRlLT5fbXBfc2VlZCkgKiBHTVBfTElNQl9CWVRFUyk7Cit9CisKK3ZvaWQgX19nbXBfcmFuZGlzZXRfbXQgKGdtcF9yYW5kc3RhdGVfcHRyLCBnbXBfcmFuZHN0YXRlX3NyY3B0cik7CisKK3N0YXRpYyBjb25zdCBnbXBfcmFuZGZucHRyX3QgTWVyc2VubmVfVHdpc3Rlcl9HZW5lcmF0b3JfTm9zZWVkID0geworICBOVUxMLAorICBfX2dtcF9yYW5kZ2V0X210LAorICBfX2dtcF9yYW5kY2xlYXJfbXQsCisgIF9fZ21wX3JhbmRpc2V0X210Cit9OworCit2b2lkCitfX2dtcF9yYW5kaXNldF9tdCAoZ21wX3JhbmRzdGF0ZV9wdHIgZHN0LCBnbXBfcmFuZHN0YXRlX3NyY3B0ciBzcmMpCit7CisgIGNvbnN0IG1wX3NpemVfdCBzeiA9ICgoc2l6ZW9mIChnbXBfcmFuZF9tdF9zdHJ1Y3QpIC0gMSkgLyBHTVBfTElNQl9CWVRFUykgKyAxOworICBnbXBfcmFuZF9tdF9zdHJ1Y3QgKmRzdHAsICpzcmNwOworICBtcF9zaXplX3QgaTsKKworICAvKiBTZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbnMuICAqLworICBSTkdfRk5QVFIgKGRzdCkgPSBSTkdfRk5QVFIoc3JjKTsKKworICAvKiBBbGxvY2F0ZSB0aGUgTVQtc3BlY2lmaWMgc3RhdGUuICAqLworICBkc3RwID0gKGdtcF9yYW5kX210X3N0cnVjdCAqKSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChzeik7CisgIFJOR19TVEFURSAoZHN0KSA9IChtcF9wdHIpIGRzdHA7CisgIEFMTE9DIChkc3QtPl9tcF9zZWVkKSA9IHN6OyAgICAgLyogSW5pdGlhbGl6ZSBhbGxvYyBmaWVsZCB0byBwbGFjYXRlIENhbW0uICAqLworCisgIC8qIENvcHkgc3RhdGUuICAqLworICBzcmNwID0gKGdtcF9yYW5kX210X3N0cnVjdCAqKSBSTkdfU1RBVEUgKHNyYyk7CisgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgZHN0cC0+bXRbaV0gPSBzcmNwLT5tdFtpXTsKKworICBkc3RwLT5tdGkgPSBzcmNwLT5tdGk7Cit9CisKK3ZvaWQKK19fZ21wX3JhbmRpbml0X210X25vc2VlZCAoZ21wX3JhbmRzdGF0ZV9wdHIgZHN0KQoreworICBjb25zdCBtcF9zaXplX3Qgc3ogPSAoKHNpemVvZiAoZ21wX3JhbmRfbXRfc3RydWN0KSAtIDEpIC8gR01QX0xJTUJfQllURVMpICsgMTsKKyAgZ21wX3JhbmRfbXRfc3RydWN0ICpkc3RwOworICBtcF9zaXplX3QgaTsKKworICAvKiBTZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbnMuICAqLworICBSTkdfRk5QVFIgKGRzdCkgPSAodm9pZCAqKSAmTWVyc2VubmVfVHdpc3Rlcl9HZW5lcmF0b3JfTm9zZWVkOworCisgIC8qIEFsbG9jYXRlIHRoZSBNVC1zcGVjaWZpYyBzdGF0ZS4gICovCisgIGRzdHAgPSAoZ21wX3JhbmRfbXRfc3RydWN0ICopIF9fR01QX0FMTE9DQVRFX0ZVTkNfTElNQlMgKHN6KTsKKyAgUk5HX1NUQVRFIChkc3QpID0gKG1wX3B0cikgZHN0cDsKKyAgQUxMT0MgKGRzdC0+X21wX3NlZWQpID0gc3o7ICAgICAvKiBJbml0aWFsaXplIGFsbG9jIGZpZWxkIHRvIHBsYWNhdGUgQ2FtbS4gICovCisKKyAgLyogU2V0IHN0YXRlIGZvciBkZWZhdWx0IHNlZWQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIGRzdHAtPm10W2ldID0gZGVmYXVsdF9zdGF0ZVtpXTsKKworICBkc3RwLT5tdGkgPSBXQVJNX1VQICUgTjsKK30KZGlmZiAtLWdpdCBhL3JhbmQvcmFuZG10LmggYi9yYW5kL3JhbmRtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjhiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRtdC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIE1lcnNlbm5lIFR3aXN0ZXIgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRlZmluZXMuCisKK0NvcHlyaWdodCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIE51bWJlciBvZiBleHRyYWN0aW9ucyB1c2VkIHRvIHdhcm0gdGhlIGJ1ZmZlciB1cC4gICovCisjZGVmaW5lIFdBUk1fVVAgMjAwMAorCisvKiBQZXJpb2QgcGFyYW1ldGVycy4gICovCisjZGVmaW5lIE4gNjI0CisjZGVmaW5lIE0gMzk3CisjZGVmaW5lIE1BVFJJWF9BIDB4OTkwOEIwREYgICAvKiBDb25zdGFudCB2ZWN0b3IgYS4gICovCisKKy8qIFN0YXRlIHN0cnVjdHVyZSBmb3IgTVQuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ21wX3VpbnRfbGVhc3QzMl90IG10W05dOyAgICAvKiBTdGF0ZSBhcnJheS4gICovCisgIGludCBtdGk7ICAgICAgICAgICAgICAgICAgICAgLyogSW5kZXggb2YgY3VycmVudCB2YWx1ZS4gICovCit9IGdtcF9yYW5kX210X3N0cnVjdDsKKworCit2b2lkIF9fZ21wX210X3JlY2FsY19idWZmZXIgKGdtcF91aW50X2xlYXN0MzJfdCAqKTsKK3ZvaWQgX19nbXBfcmFuZGdldF9tdCAoZ21wX3JhbmRzdGF0ZV9wdHIsIG1wX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOwordm9pZCBfX2dtcF9yYW5kY2xlYXJfbXQgKGdtcF9yYW5kc3RhdGVfcHRyKTsKK3ZvaWQgX19nbXBfcmFuZGlzZXRfbXQgKGdtcF9yYW5kc3RhdGVfcHRyLCBnbXBfcmFuZHN0YXRlX3NyY3B0cik7CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRtdHMuYyBiL3JhbmQvcmFuZG10cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTVhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRtdHMuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogTWVyc2VubmUgVHdpc3RlciBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAxMywgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAicmFuZG10LmgiCisKKworLyogQ2FsY3VsYXRlIChiXmUpIG1vZCAoMl5uLWspIGZvciBlPTEwNzQ4ODg5OTYsIG49MTk5MzcgYW5kIGs9MjAwMjMsCisgICBuZWVkZWQgYnkgdGhlIHNlZWRpbmcgZnVuY3Rpb24gYmVsb3cuICAqLworc3RhdGljIHZvaWQKK21hbmdsZV9zZWVkIChtcHpfcHRyIHIpCit7CisgIG1wel90ICAgICAgICAgIHQsIGI7CisgIHVuc2lnbmVkIGxvbmcgIGUgPSAweDQwMTE4MTI0OworICB1bnNpZ25lZCBsb25nICBiaXQgPSAweDIwMDAwMDAwOworCisgIG1wel9pbml0MiAodCwgMTk5MzdMKTsKKyAgbXB6X2luaXRfc2V0IChiLCByKTsKKworICBkbworICAgIHsKKyAgICAgIG1wel9tdWwgKHIsIHIsIHIpOworCisgICAgcmVkdWNlOgorICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgIG1wel90ZGl2X3FfMmV4cCAodCwgciwgMTk5MzdMKTsKKyAgICAgICAgICBpZiAoU0laICh0KSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgbXB6X3RkaXZfcl8yZXhwIChyLCByLCAxOTkzN0wpOworICAgICAgICAgIG1wel9hZGRtdWxfdWkgKHIsIHQsIDIwMDIzTCk7CisgICAgICAgIH0KKworICAgICAgaWYgKChlICYgYml0KSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgZSBePSBiaXQ7CisgICAgICAgICAgbXB6X211bCAociwgciwgYik7CisgICAgICAgICAgZ290byByZWR1Y2U7CisgICAgICAgIH0KKworICAgICAgYml0ID4+PSAxOworICAgIH0KKyAgd2hpbGUgKGJpdCAhPSAwKTsKKworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKGIpOworfQorCisKKy8qIFNlZWRpbmcgZnVuY3Rpb24uICBVc2VzIHBvd2VyaW5nIG1vZHVsbyBhIG5vbi1NZXJzZW5uZSBwcmltZSB0byBvYnRhaW4KKyAgIGEgcGVybXV0YXRpb24gb2YgdGhlIGlucHV0IHNlZWQgc3BhY2UuICBUaGUgbW9kdWx1cyBpcyAyXjE5OTM3LTIwMDIzLAorICAgd2hpY2ggaXMgcHJvYmFibHkgcHJpbWUuICBUaGUgcG93ZXIgaXMgMTA3NDg4ODk5Ni4gIEluIG9yZGVyIHRvIGF2b2lkCisgICBzZWVkcyAwIGFuZCAxIGdlbmVyYXRpbmcgaW52YWxpZCBvciBzdHJhbmdlIG91dHB1dCwgdGhlIGlucHV0IHNlZWQgaXMKKyAgIGZpcnN0IG1hbmlwdWxhdGVkIGFzIGZvbGxvd3M6CisKKyAgICAgc2VlZDEgPSBzZWVkIG1vZCAoMl4xOTkzNy0yMDAyNykgKyAyCisKKyAgIHNvIHRoYXQgc2VlZDEgbGllcyBiZXR3ZWVuIDIgYW5kIDJeMTk5MzctMjAwMjYgaW5jbHVzaXZlLiBUaGVuIHRoZQorICAgcG93ZXJpbmcgaXMgcGVyZm9ybWVkIGFzIGZvbGxvd3M6CisKKyAgICAgc2VlZDIgPSAoc2VlZDFeMTA3NDg4ODk5NikgbW9kICgyXjE5OTM3LTIwMDIzKQorCisgICBhbmQgdGhlbiBzZWVkMiBpcyB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgYnVmZmVyLgorCisgICBUaGlzIG1ldGhvZCBhaW1zIHRvIGdpdmUgZ3VhcmFudGVlcyB0aGF0OgorICAgICBhKSBzZWVkMiB3aWxsIG5ldmVyIGJlIHplcm8sCisgICAgIGIpIHNlZWQyIHdpbGwgdmVyeSBzZWxkb20gaGF2ZSBhIHZlcnkgbG93IHBvcHVsYXRpb24gb2Ygb25lcyBpbiBpdHMKKwliaW5hcnkgcmVwcmVzZW50YXRpb24sIGFuZAorICAgICBjKSBldmVyeSBzZWVkIGJldHdlZW4gMCBhbmQgMl4xOTkzNy0yMDAyOCAoaW5jbHVzaXZlKSB3aWxsIHlpZWxkIGEKKwlkaWZmZXJlbnQgc2VxdWVuY2UuCisKKyAgIENBVkVBVFM6CisKKyAgIFRoZSBwZXJpb2Qgb2YgdGhlIHNlZWRpbmcgZnVuY3Rpb24gaXMgMl4xOTkzNy0yMDAyNy4gIFRoaXMgbWVhbnMgdGhhdAorICAgd2l0aCBzZWVkcyAyXjE5OTM3LTIwMDI3LCAyXjE5OTM3LTIwMDI2LCAuLi4gdGhlIGV4YWN0IHNhbWUgc2VxdWVuY2VzCisgICBhcmUgb2J0YWluZWQgYXMgd2l0aCBzZWVkcyAwLCAxLCBldGMuOyBpdCBhbHNvIG1lYW5zIHRoYXQgc2VlZCAtMQorICAgcHJvZHVjZXMgdGhlIHNhbWUgc2VxdWVuY2UgYXMgc2VlZCAyXjE5OTM3LTIwMDI4LCBldGMuCisKKyAgIE1vcmVvdmVyLCBjKSBpcyBub3QgZ3VhcmFudGVkLCB0aGVyZSBhcmUgbWFueSBzZWVkcyB5aWVsZGluZyB0byB0aGUKKyAgIHNhbWUgc2VxdWVuY2UsIGJlY2F1c2UgZ2NkICgxMDc0ODg4OTk2LCAyXjE5OTM3IC0gMjAwMjMgLSAxKSA9IDEyLgorICAgRS5nLiB4IGFuZCB4Jz14KjE5XigoMl4xOTkzNy0yMDAyMy0xKSAvIDEyKSBtb2QgKDJeMTk5MzctMjAwMjMpLCBpZgorICAgY2hvc2VuIGFzIHNlZWQxLCBnZW5lcmF0ZSB0aGUgc2FtZSBzZWVkMiwgZm9yIGV2ZXJ5IHguCisgICBTaW1pbGFybHkgeCIgY2FuIGJlIG9idGFpbmVkIGZyb20geCcsIG9idGFpbmluZyAxMiBkaWZmZXJlbnQKKyAgIHZhbHVlcy4KKyAqLworCitzdGF0aWMgdm9pZAorcmFuZHNlZWRfbXQgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwgbXB6X3NyY3B0ciBzZWVkKQoreworICBpbnQgaTsKKyAgc2l6ZV90IGNudDsKKworICBnbXBfcmFuZF9tdF9zdHJ1Y3QgKnA7CisgIG1wel90IG1vZDsgICAgLyogTW9kdWx1cy4gICovCisgIG1wel90IHNlZWQxOyAgLyogSW50ZXJtZWRpYXRlIHJlc3VsdC4gICovCisKKyAgcCA9IChnbXBfcmFuZF9tdF9zdHJ1Y3QgKikgUk5HX1NUQVRFIChyc3RhdGUpOworCisgIG1wel9pbml0MiAobW9kLCAxOTkzOEwpOworICBtcHpfaW5pdDIgKHNlZWQxLCAxOTkzN0wpOworCisgIG1wel9zZXRiaXQgKG1vZCwgMTk5MzdMKTsKKyAgbXB6X3N1Yl91aSAobW9kLCBtb2QsIDIwMDI3TCk7CisgIG1wel9tb2QgKHNlZWQxLCBzZWVkLCBtb2QpOwkvKiBSZWR1Y2UgYHNlZWQnIG1vZHVsbyBgbW9kJy4gICovCisgIG1wel9jbGVhciAobW9kKTsKKyAgbXB6X2FkZF91aSAoc2VlZDEsIHNlZWQxLCAyTCk7CS8qIHNlZWQxIGlzIG5vdyByZWFkeS4gICovCisgIG1hbmdsZV9zZWVkIChzZWVkMSk7CS8qIFBlcmZvcm0gdGhlIG1hbmdsaW5nIGJ5IHBvd2VyaW5nLiAgKi8KKworICAvKiBDb3B5IHRoZSBsYXN0IGJpdCBpbnRvIGJpdCAzMSBvZiBtdFswXSBhbmQgY2xlYXIgaXQuICAqLworICBwLT5tdFswXSA9IChtcHpfdHN0Yml0IChzZWVkMSwgMTk5MzZMKSAhPSAwKSA/IDB4ODAwMDAwMDAgOiAwOworICBtcHpfY2xyYml0IChzZWVkMSwgMTk5MzZMKTsKKworICAvKiBTcGxpdCBzZWVkMSBpbnRvIE4tMSAzMi1iaXQgY2h1bmtzLiAgKi8KKyAgbXB6X2V4cG9ydCAoJnAtPm10WzFdLCAmY250LCAtMSwgc2l6ZW9mIChwLT5tdFsxXSksIDAsCisgICAgICAgICAgICAgIDggKiBzaXplb2YgKHAtPm10WzFdKSAtIDMyLCBzZWVkMSk7CisgIG1wel9jbGVhciAoc2VlZDEpOworICBjbnQrKzsKKyAgQVNTRVJUIChjbnQgPD0gTik7CisgIHdoaWxlIChjbnQgPCBOKQorICAgIHAtPm10W2NudCsrXSA9IDA7CisKKyAgLyogV2FybSB0aGUgZ2VuZXJhdG9yIHVwIGlmIG5lY2Vzc2FyeS4gICovCisgIGlmIChXQVJNX1VQICE9IDApCisgICAgZm9yIChpID0gMDsgaSA8IFdBUk1fVVAgLyBOOyBpKyspCisgICAgICBfX2dtcF9tdF9yZWNhbGNfYnVmZmVyIChwLT5tdCk7CisKKyAgcC0+bXRpID0gV0FSTV9VUCAlIE47Cit9CisKKworc3RhdGljIGNvbnN0IGdtcF9yYW5kZm5wdHJfdCBNZXJzZW5uZV9Ud2lzdGVyX0dlbmVyYXRvciA9IHsKKyAgcmFuZHNlZWRfbXQsCisgIF9fZ21wX3JhbmRnZXRfbXQsCisgIF9fZ21wX3JhbmRjbGVhcl9tdCwKKyAgX19nbXBfcmFuZGlzZXRfbXQKK307CisKKy8qIEluaXRpYWxpemUgTVQtc3BlY2lmaWMgZGF0YS4gICovCit2b2lkCitnbXBfcmFuZGluaXRfbXQgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSkKK3sKKyAgX19nbXBfcmFuZGluaXRfbXRfbm9zZWVkIChyc3RhdGUpOworICBSTkdfRk5QVFIgKHJzdGF0ZSkgPSAodm9pZCAqKSAmTWVyc2VubmVfVHdpc3Rlcl9HZW5lcmF0b3I7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRtdWkuYyBiL3JhbmQvcmFuZG11aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjkyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5kL3JhbmRtdWkuYwpAQCAtMCwwICsxLDg1IEBACisvKiBnbXBfdXJhbmRvbW1fdWkgLS0gdW5pZm9ybSByYW5kb20gbnVtYmVyIDAgdG8gTi0xIGZvciB1bG9uZyBOLgorCitDb3B5cmlnaHQgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworCisvKiBJZiBuIGlzIGEgcG93ZXIgb2YgMiB0aGVuIHRoZSB0ZXN0IHJldDxuIGlzIGFsd2F5cyB0cnVlIGFuZCB0aGUgbG9vcCBpcworICAgdW5uZWNlc3NhcnksIGJ1dCB0aGVyZSdzIG5vIG5lZWQgdG8gYWRkIHNwZWNpYWwgY29kZSBmb3IgdGhpcy4gIEp1c3QgZ2V0CisgICB0aGUgImJpdHMiIGNhbGN1bGF0aW9uIGNvcnJlY3QgYW5kIGxldCBpdCBnbyB0aHJvdWdoIG5vcm1hbGx5LgorCisgICBJZiBuIGlzIDEgdGhlbiB3aWxsIGhhdmUgYml0cz09MCBhbmQgX2dtcF9yYW5kIHdpbGwgcHJvZHVjZSBubyBvdXRwdXQgYW5kCisgICB3ZSBhbHdheXMgcmV0dXJuIDAuICBBZ2FpbiB0aGVyZSBzZWVtcyBubyBuZWVkIGZvciBhIHNwZWNpYWwgY2FzZSwganVzdAorICAgaW5pdGlhbGl6ZSBhWzBdPTAgYW5kIGxldCBpdCBnbyB0aHJvdWdoIG5vcm1hbGx5LiAgKi8KKworI2RlZmluZSBNQVhfVVJBTkRPTU1fSVRFUiAgODAKKwordW5zaWduZWQgbG9uZworZ21wX3VyYW5kb21tX3VpIChnbXBfcmFuZHN0YXRlX3B0ciByc3RhdGUsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgbXBfbGltYl90ICAgICAgYVtMSU1CU19QRVJfVUxPTkddOworICB1bnNpZ25lZCBsb25nICByZXQsIGJpdHMsIGxlYWRpbmc7CisgIGludCAgICAgICAgICAgIGk7CisKKyAgaWYgKFVOTElLRUxZIChuID09IDApKQorICAgIERJVklERV9CWV9aRVJPOworCisgIC8qIHN0YXJ0IHdpdGggemVyb3MsIHNpbmNlIGlmIGJpdHM9PTAgdGhlbiBfZ21wX3JhbmQgd2lsbCBzdG9yZSBub3RoaW5nIGF0CisgICAgIGFsbCAoYml0cz09MCBhcmlzZXMgd2hlbiBuPT0xKSwgb3IgaWYgYml0cyA8PSBHTVBfTlVNQl9CSVRTIHRoZW4gaXQKKyAgICAgd2lsbCBzdG9yZSBvbmx5IGFbMF0uICAqLworICBhWzBdID0gMDsKKyNpZiBMSU1CU19QRVJfVUxPTkcgPiAxCisgIGFbMV0gPSAwOworI2VuZGlmCisKKyAgY291bnRfbGVhZGluZ196ZXJvcyAobGVhZGluZywgKG1wX2xpbWJfdCkgbik7CisgIGJpdHMgPSBHTVBfTElNQl9CSVRTIC0gbGVhZGluZyAtIChQT1cyX1AobikgIT0gMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9VUkFORE9NTV9JVEVSOyBpKyspCisgICAgeworICAgICAgX2dtcF9yYW5kIChhLCByc3RhdGUsIGJpdHMpOworI2lmIExJTUJTX1BFUl9VTE9ORyA9PSAxCisgICAgICByZXQgPSBhWzBdOworI2Vsc2UKKyAgICAgIHJldCA9IGFbMF0gfCAoYVsxXSA8PCBHTVBfTlVNQl9CSVRTKTsKKyNlbmRpZgorICAgICAgaWYgKExJS0VMWSAocmV0IDwgbikpICAgLyogdXN1YWxseSBvbmUgaXRlcmF0aW9uIHN1ZmZpY2VzICovCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgLyogVG9vIG1hbnkgaXRlcmF0aW9ucywgdGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgZGVnZW5lcmF0ZSBhYm91dCB0aGUKKyAgICAgcnN0YXRlIGFsZ29yaXRobS4gIFJldHVybiByJW4uICAqLworICByZXQgLT0gbjsKKyAgQVNTRVJUIChyZXQgPCBuKTsKKworIGRvbmU6CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRzLmMgYi9yYW5kL3JhbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0MzZhNAotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZHMuYwpAQCAtMCwwICsxLDQxIEBACisvKiBfX2dtcF9yYW5kcyAtLSBnbG9iYWwgcmFuZG9tIHN0YXRlIGZvciBvbGQtc3R5bGUgcmFuZG9tIGZ1bmN0aW9ucy4KKworICAgRVZFUllUSElORyBJTiBUSElTIEZJTEUgSVMgRk9SIElOVEVSTkFMIFVTRSBPTkxZLiAgSVQnUyBBTE1PU1QgQ0VSVEFJTiBUTworICAgQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBPUiBESVNBUFBFQVIgQ09NUExFVEVMWSBJTiBGVVRVUkUgR05VCisgICBNUCBSRUxFQVNFUy4gICovCisKKy8qCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworLyogVXNlIHRoaXMgdmlhIHRoZSBSQU5EUyBtYWNybyBpbiBnbXAtaW1wbC5oICovCitjaGFyICAgICAgICAgICAgIF9fZ21wX3JhbmRzX2luaXRpYWxpemVkID0gMDsKK2dtcF9yYW5kc3RhdGVfdCAgX19nbXBfcmFuZHM7CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRzZC5jIGIvcmFuZC9yYW5kc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBhMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmFuZC9yYW5kc2QuYwpAQCAtMCwwICsxLDM4IEBACisvKiBnbXBfcmFuZHNlZWQgKHN0YXRlLCBzZWVkKSAtLSBTZXQgaW5pdGlhbCBzZWVkIFNFRUQgaW4gcmFuZG9tIHN0YXRlIFNUQVRFLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKK3ZvaWQKK2dtcF9yYW5kc2VlZCAoZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlLAorCSAgICAgIG1wel9zcmNwdHIgc2VlZCkKK3sKKyAgKCooKGdtcF9yYW5kZm5wdHJfdCAqKSBSTkdfRk5QVFIgKHJzdGF0ZSkpLT5yYW5kc2VlZF9mbikgKHJzdGF0ZSwgc2VlZCk7Cit9CmRpZmYgLS1naXQgYS9yYW5kL3JhbmRzZHVpLmMgYi9yYW5kL3JhbmRzZHVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYTE0OAotLS0gL2Rldi9udWxsCisrKyBiL3JhbmQvcmFuZHNkdWkuYwpAQCAtMCwwICsxLDQzIEBACisvKiBnbXBfcmFuZHNlZWRfdWkgKHN0YXRlLCBzZWVkKSAtLSBTZXQgaW5pdGlhbCBzZWVkIFNFRUQgaW4gcmFuZG9tCisgICBzdGF0ZSBTVEFURS4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCit2b2lkCitnbXBfcmFuZHNlZWRfdWkgKGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgc2VlZCkKK3sKKyAgbXB6X3QgenNlZWQ7CisgIG1wX2xpbWJfdCB6bGltYnNbTElNQlNfUEVSX1VMT05HXTsKKworICBNUFpfRkFLRV9VSSAoenNlZWQsIHpsaW1icywgc2VlZCk7CisgIGdtcF9yYW5kc2VlZCAocnN0YXRlLCB6c2VlZCk7Cit9CmRpZmYgLS1naXQgYS9zY2FuZi9kb3NjYW4uYyBiL3NjYW5mL2Rvc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjczYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zY2FuZi9kb3NjYW4uYwpAQCAtMCwwICsxLDc2NiBAQAorLyogX19nbXBfZG9zY2FuIC0tIGZvcm1hdHRlZCBpbnB1dCBpbnRlcm5hbHMuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjZGVmaW5lIF9HTlVfU09VUkNFICAgIC8qIGZvciBERUNJTUFMX1BPSU5UIGluIGxhbmdpbmZvLmggKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgkvKiBuZWVkZWQgZm9yIHRoZSBIQVZFXywgY291bGQgYWxzbyBtb3ZlIGdtcCBpbmNscyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLyogZm9yIHB0cmRpZmZfdCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAgIC8qIGZvciBzdHJ0b2wgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfTEFOR0lORk9fSAorI2luY2x1ZGUgPGxhbmdpbmZvLmg+ICAvKiBmb3IgbmxfbGFuZ2luZm8gKi8KKyNlbmRpZgorCisjaWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPiAgICAvKiBmb3IgbG9jYWxlY29udiAqLworI2VuZGlmCisKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4gLyogZm9yIGludG1heF90ICovCisjZW5kaWYKKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBxdWFkX3QgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBDaGFuZ2UgdGhpcyB0byAiI2RlZmluZSBUUkFDRSh4KSB4IiBmb3Igc29tZSB0cmFjZXMuICovCisjZGVmaW5lIFRSQUNFKHgpCisKKworLyogR2VuZXJhbDoKKworICAgICAgIEl0J3MgbmVjZXNzYXJ5IHRvIHBhcnNlIHVwIHRoZSBmb3JtYXQgc3RyaW5nIHRvIHJlY29nbmlzZSB0aGUgR01QCisgICAgICAgZXh0cmEgdHlwZXMgRiwgUSBhbmQgWi4gIE90aGVyIHR5cGVzIGFuZCBjb252ZXJzaW9ucyBhcmUgcGFzc2VkCisgICAgICAgYWNyb3NzIHRvIHRoZSBzdGFuZGFyZCBzc2NhbmYgb3IgZnNjYW5mIHZpYSBmdW5zLT5zY2FuLCBmb3IgZWFzZSBvZgorICAgICAgIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBlc3NlbnRpYWwgaW4gdGhlIGNhc2Ugb2Ygc29tZXRoaW5nIGxpa2UgZ2xpYmMKKyAgICAgICAlcCB3aGVyZSB0aGUgcG9pbnRlciBmb3JtYXQgaXNuJ3QgYWN0dWFsbHkgZG9jdW1lbnRlZC4KKworICAgICAgIEJlY2F1c2UgZnVucy0+c2NhbiBkb2Vzbid0IGdldCB0aGUgd2hvbGUgaW5wdXQgaXQgY2FuJ3QgcHV0IHRoZSByaWdodAorICAgICAgIHZhbHVlcyBpbiBmb3IgJW4sIHNvIHRoYXQncyBoYW5kbGVkIGluIF9fZ21wX2Rvc2Nhbi4gIE5laXRoZXIgc3NjYW5mCisgICAgICAgbm9yIGZzY2FuZiBkaXJlY3RseSBpbmRpY2F0ZSBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgcmVhZCwgc28gYW4KKyAgICAgICBleHRyYSAlbiBpcyBhcHBlbmRlZCB0byBlYWNoIHJ1biBmb3IgdGhhdC4gIEZvciBmc2NhbmYgdGhpcyBtZXJlbHkKKyAgICAgICBzdXBwb3J0cyBvdXIgJW4gb3V0cHV0LCBidXQgZm9yIHNzY2FuZiBpdCBsZXRzIGZ1bnMtPnN0ZXAgbW92ZSB1cworICAgICAgIGFsb25nIHRoZSBpbnB1dCBzdHJpbmcuCisKKyAgICAgICBXaGl0ZXNwYWNlIGFuZCBsaXRlcmFsIG1hdGNoZXMgaW4gdGhlIGZvcm1hdCBzdHJpbmcsIGluY2x1ZGluZyAlJSwKKyAgICAgICBhcmUgaGFuZGxlZCBkaXJlY3RseSB3aXRoaW4gX19nbXBfZG9zY2FuLiAgVGhpcyBpcyByZWFzb25hYmx5CisgICAgICAgZWZmaWNpZW50LCBhbmQgYXZvaWRzIHNvbWUgc3VzcGljaW91cyBiZWhhdmlvdXIgb2JzZXJ2ZWQgaW4gdmFyaW91cworICAgICAgIHN5c3RlbSBsaWJjJ3MuICBHTElCQyAyLjIuNCBmb3IgaW5zdGFuY2UgcmV0dXJucyAwIG9uCisKKwkgICBzc2NhbmYoIiAiLCAiIHgiKQorICAgICAgIG9yCisJICAgc3NjYW5mKCIgIiwgIiB4JWQiLCZuKQorCisgICAgICAgd2hlcmVhcyB3ZSB0aGluayB0aGV5IHNob3VsZCByZXR1cm4gRU9GLCBzaW5jZSBlbmQtb2Ytc3RyaW5nIGlzCisgICAgICAgcmVhY2hlZCB3aGVuIGEgbWF0Y2ggb2YgIngiIGlzIHJlcXVpcmVkLgorCisgICAgICAgRm9yIHN0YW5kYXJkICUgY29udmVyc2lvbnMsIGZ1bnMtPnNjYW4gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2gKKyAgICAgICBjb252ZXJzaW9uLiAgSWYgd2UgaGFkIHZmc2NhbmYgYW5kIHZzc2NhbmYgYW5kIGNvdWxkIHJlbHkgb24gdGhlaXIKKyAgICAgICBmaXhlZCB0ZXh0IG1hdGNoaW5nIGJlaGF2aW91ciB0aGVuIHdlIGNvdWxkIGNhbGwgdGhlbSB3aXRoIG11bHRpcGxlCisgICAgICAgY29uc2VjdXRpdmUgc3RhbmRhcmQgY29udmVyc2lvbnMuICBCdXQgcGxhaW4gZnNjYW5mIGFuZCBzc2NhbmYgd29yaworICAgICAgIGZpbmUsIGFuZCBwYXJzaW5nIG9uZSBmaWVsZCBhdCBhIHRpbWUgc2hvdWxkbid0IGJlIHRvbyBtdWNoIG9mIGEKKyAgICAgICBzbG93ZG93bi4KKworICAgZ21wc2NhbjoKKworICAgICAgIGdtcHNjYW4gcmVhZHMgYSBnbXAgdHlwZS4gIEl0J3Mgb25seSB1c2VkIGZyb20gb25lIHBsYWNlLCBidXQgaXMgYQorICAgICAgIHNlcGFyYXRlIHN1YnJvdXRpbmUgdG8gYXZvaWQgYSBiaWcgY2h1bmsgb2YgY29tcGxpY2F0ZWQgY29kZSBpbiB0aGUKKyAgICAgICBtaWRkbGUgb2YgX19nbXBfZG9zY2FuLiAgV2l0aGluIGdtcHNjYW4gYSBjb3VwbGUgb2YgbG9vcGJhY2tzIG1ha2UgaXQKKyAgICAgICBwb3NzaWJsZSB0byBzaGFyZSBjb2RlIGZvciBwYXJzaW5nIGludGVnZXJzLCByYXRpb25hbHMgYW5kIGZsb2F0cy4KKworICAgICAgIEluIGdtcHNjYW4gbm9ybWFsbHkgb25lIGNoYXIgb2YgbG9va2FoZWFkIGlzIG1haW50YWluZWQsIGJ1dCB3aGVuIHdpZHRoCisgICAgICAgaXMgcmVhY2hlZCB0aGF0IHN0b3BzLCBvbiB0aGUgcHJpbmNpcGxlIHRoYXQgYW4gZmdldGMvdW5nZXRjIG9mIGEgY2hhcgorICAgICAgIHBhc3Qgd2hlcmUgd2UncmUgdG9sZCB0byBzdG9wIHdvdWxkIGJlIHVuZGVzaXJhYmxlLiAgImNoYXJzIiBpcyBob3cgbWFueQorICAgICAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHJlYWQgc28gZmFyLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgYy4gIFdoZW4KKyAgICAgICBjaGFycz09d2lkdGggYW5kIGFub3RoZXIgY2hhcmFjdGVyIGlzIGRlc2lyZWQgdGhlbiBhIGp1bXAgaXMgZG9uZSB0byB0aGUKKyAgICAgICAiY29udmVydCIgc3RhZ2UuICBjIGlzIGludmFsaWQgYW5kIG11c3RuJ3QgYmUgdW5nZXQnZWQgaW4gdGhpcyBjYXNlOworICAgICAgIGNoYXJzIGlzIHNldCB0byB3aWR0aCsxIHRvIGluZGljYXRlIHRoYXQuCisKKyAgICAgICBnbXBzY2FuIG5vcm1hbGx5IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQuICAtMSBtZWFucyBhbgorICAgICAgIGludmFsaWQgZmllbGQsIC0yIG1lYW5zIEVPRiByZWFjaGVkIGJlZm9yZSBhbnkgbWF0Y2hpbmcgY2hhcmFjdGVycworICAgICAgIHdlcmUgcmVhZC4KKworICAgICAgIEZvciBoZXggZmxvYXRzLCB0aGUgbWFudGlzc2EgcGFydCBpcyBwYXNzZWQgdG8gbXBmX3NldF9zdHIsIHRoZW4gdGhlCisgICAgICAgZXhwb25lbnQgaXMgYXBwbGllZCB3aXRoIG1wZl9tdWxfZXhwIG9yIG1wZl9kaXZfMmV4cC4gIFRoaXMgaXMgZWFzaWVyCisgICAgICAgdGhhbiB0ZWFjaGluZyBtcGZfc2V0X3N0ciBhYm91dCBhbiBleHBvbmVudCBmYWN0b3IgKGllLiAyKSBkaWZmZXJpbmcKKyAgICAgICBmcm9tIHRoZSBtYW50aXNzYSByYWRpeCBwb2ludCBmYWN0b3IgKGllLiAxNikuICBtcGZfbXVsX2V4cCBhbmQKKyAgICAgICBtcGZfZGl2XzJleHAgd2lsbCBwcmVzZXJ2ZSB0aGUgYXBwbGljYXRpb24gcmVxdWVzdGVkIHByZWNpc2lvbiwgc28KKyAgICAgICBub3RoaW5nIGluIHRoYXQgcmVzcGVjdCBpcyBsb3N0IGJ5IG1ha2luZyB0aGlzIGEgdHdvLXN0ZXAgcHJvY2Vzcy4KKworICAgTWF0Y2hpbmcgYW5kIGVycm9yczoKKworICAgICAgIEM5OSA3LjE5LjYuMiBwYXJhcyA5IGFuZCAxMCBzYXkgYW4gaW5wdXQgaXRlbSBpcyByZWFkIGFzIHRoZSBsb25nZXN0CisgICAgICAgc3RyaW5nIHdoaWNoIGlzIGEgbWF0Y2ggZm9yIHRoZSBhcHByb3ByaWF0ZSB0eXBlLCBvciBhIHByZWZpeCBvZiBhCisgICAgICAgbWF0Y2guICBXaXRoIHRoYXQgZG9uZSwgaWYgaXQncyBvbmx5IGEgcHJlZml4IHRoZW4gdGhlIHJlc3VsdCBpcyBhCisgICAgICAgbWF0Y2hpbmcgZmFpbHVyZSwgaWUuIGludmFsaWQgaW5wdXQuCisKKyAgICAgICBUaGlzIHJ1bGUgc2VlbXMgZmFpcmx5IGNsZWFyLCBidXQgZG9lc24ndCBzZWVtIHRvIGJlIHVuaXZlcnNhbGx5CisgICAgICAgYXBwbGllZCBpbiBzeXN0ZW0gQyBsaWJyYXJpZXMuICBFdmVuIEdMSUJDIGRvZXNuJ3Qgc2VlbSB0byBnZXQgaXQKKyAgICAgICByaWdodCwgaW5zb2ZhciBhcyBpdCBzZWVtcyB0byBhY2NlcHQgc29tZSBhcHBhcmVudGx5IGludmFsaWQgZm9ybXMuCisgICAgICAgRWcuIGdsaWJjIDIuMy4xIGFjY2VwdHMgIjB4IiBmb3IgYSAiJWkiLCB3aGVyZSBhIHJlYWRpbmcgb2YgdGhlCisgICAgICAgc3RhbmRhcmQgd291bGQgc3VnZ2VzdCBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBkaWdpdHMgc2hvdWxkIGJlCisgICAgICAgcmVxdWlyZWQgYWZ0ZXIgYW4gIjB4Ii4KKworICAgICAgIEEgZm9vdG5vdGUgdG8gNy4xOS42LjIgcGFyYSAxNyBub3RlcyBob3cgdGhpcyBpbnB1dCBpdGVtIHJlYWRpbmcgY2FuCisgICAgICAgbWVhbiBpbnB1dHMgYWNjZXB0YWJsZSB0byBzdHJ0b2wgYXJlIG5vdCBhY2NlcHRhYmxlIHRvIGZzY2FuZi4gIFdlCisgICAgICAgdGhpbmsgdGhpcyBjb25maXJtcyBvdXIgcmVhZGluZyBvZiAiMHgiIGFzIGludmFsaWQuCisKKyAgICAgICBDbGVhcmx5IGdtcF9zc2NhbmYgY291bGQgYmFja3RyYWNrIHRvIGEgbG9uZ2VzdCBpbnB1dCB3aGljaCB3YXMgYQorICAgICAgIHZhbGlkIG1hdGNoIGZvciBhIGdpdmVuIGl0ZW0sIGJ1dCB0aGlzIGlzIG5vdCBkb25lLCBzaW5jZSBDOTkgc2F5cworICAgICAgIHNzY2FuZiBpcyBpZGVudGljYWwgdG8gZnNjYW5mLCBzbyB3ZSBtYWtlIGdtcF9zc2NhbmYgaWRlbnRpY2FsIHRvCisgICAgICAgZ21wX2ZzY2FuZi4KKworICAgVHlwZXM6CisKKyAgICAgICBDOTkgc2F5cyAibGwiIGlzIGZvciBsb25nIGxvbmcsIGFuZCAiTCIgaXMgZm9yIGxvbmcgZG91YmxlIGZsb2F0cy4KKyAgICAgICBVbmZvcnR1bmF0ZWx5IGluIEdNUCA0LjEuMSB3ZSBkb2N1bWVudGVkIHRoZSB0d28gYXMgZXF1aXZhbGVudC4gIFRoaXMKKyAgICAgICBkb2Vzbid0IGFmZmVjdCB1cyBkaXJlY3RseSwgc2luY2UgYm90aCBhcmUgcGFzc2VkIHRocm91Z2ggdG8gcGxhaW4KKyAgICAgICBzY2FuZi4gIEl0IHNlZW1zIHdpc2VzdCBub3QgdG8gdHJ5IHRvIGVuZm9yY2UgdGhlIEM5OSBydWxlLiAgVGhpcyBpcworICAgICAgIGNvbnNpc3RlbnQgd2l0aCB3aGF0IHdlIHNhaWQgYmVmb3JlLCB0aG91Z2ggd2hldGhlciBpdCBhY3R1YWxseQorICAgICAgIHdvcmtlZCB3YXMgYWx3YXlzIHVwIHRvIHRoZSBDIGxpYnJhcnkuCisKKyAgIEFsdGVybmF0aXZlczoKKworICAgICAgIENvbnNpZGVyYXRpb24gd2FzIGdpdmVuIHRvIHVzaW5nIHNlcGFyYXRlIGNvZGUgZm9yIGdtcF9mc2NhbmYgYW5kCisgICAgICAgZ21wX3NzY2FuZi4gIFRoZSBzc2NhbmYgY2FzZSBjb3VsZCB6aXAgYWNyb3NzIGEgc3RyaW5nIGRvaW5nIGxpdGVyYWwKKyAgICAgICBtYXRjaGVzIG9yIHJlY29nbmlzaW5nIGRpZ2l0cyBpbiBnbXBzY2FuLCByYXRoZXIgdGhhbiBtYWtpbmcgYQorICAgICAgIGZ1bmN0aW9uIGNhbGwgZnVuLT5nZXQgcGVyIGNoYXJhY3Rlci4gIFRoZSBmc2NhbmYgY291bGQgdXNlIGdldGMKKyAgICAgICByYXRoZXIgdGhhbiBmZ2V0YyB0b28sIHdoaWNoIG1pZ2h0IGhlbHAgdGhvc2Ugc3lzdGVtcyB3aGVyZSBnZXRjIGlzIGEKKyAgICAgICBtYWNybyBvciBvdGhlcndpc2UgaW5saW5lZC4gIEJ1dCBub25lIG9mIHRoaXMgc2Nhbm5pbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAgICB3aWxsIGJlIHBhcnRpY3VsYXJseSBmYXN0LCBzbyB0aGUgdHdvIGFyZSBkb25lIHRvZ2V0aGVyIHRvIGtlZXAgaXQgYQorICAgICAgIGxpdHRsZSBzaW1wbGVyIGZvciBub3cuCisKKyAgICAgICBWYXJpb3VzIG11bHRpYnl0ZSBzdHJpbmcgaXNzdWVzIGFyZSBub3QgYWRkcmVzc2VkLCBmb3IgYSBzdGFydCBDOTkKKyAgICAgICBzY2FuZiBzYXlzIHRoZSBmb3JtYXQgc3RyaW5nIGlzIG11bHRpYnl0ZS4gIFNpbmNlIHdlIHBhc3MgJWMsICVzIGFuZAorICAgICAgICVbIHRvIHRoZSBzeXN0ZW0gc2NhbmYsIHRoZXkgbWlnaHQgZG8gbXVsdGlieXRlIHJlYWRzIGFscmVhZHksIGJ1dAorICAgICAgIGl0J3MgYW5vdGhlciBtYXR0ZXIgd2hldGhlciBvciBub3QgdGhhdCBjYW4gYmUgdXNlZCwgc2luY2Ugb3VyIGRpZ2l0CisgICAgICAgYW5kIHdoaXRlc3BhY2UgcGFyc2luZyBpcyBvbmx5IHVuaWJ5dGUuICBUaGUgcGxhbiBpcyB0byBxdWlldGx5CisgICAgICAgaWdub3JlIG11bHRpYnl0ZSBsb2NhbGVzIGZvciBub3cuICBUaGlzIGlzIG5vdCBhcyBiYWQgYXMgaXQgc291bmRzLAorICAgICAgIHNpbmNlIEdNUCBpcyBwcmVzdW1hYmx5IHVzZWQgbW9zdGx5IG9uIG51bWJlcnMsIHdoaWNoIGNhbiBiZQorICAgICAgIHBlcmZlY3RseSBhZGVxdWF0ZWx5IHRyZWF0ZWQgaW4gcGxhaW4gQVNDSUkuCisKKyovCisKKworc3RydWN0IGdtcF9kb3NjYW5fcGFyYW1zX3QgeworICBpbnQJYmFzZTsKKyAgaW50CWlnbm9yZTsKKyAgY2hhcgl0eXBlOworICBpbnQJd2lkdGg7Cit9OworCisKKyNkZWZpbmUgR0VUKGMpCQkJXAorICBkbyB7CQkJCVwKKyAgICBBU1NFUlQgKGNoYXJzIDw9IHdpZHRoKTsJXAorICAgIGNoYXJzKys7CQkJXAorICAgIGlmIChjaGFycyA+IHdpZHRoKQkJXAorICAgICAgZ290byBjb252ZXJ0OwkJXAorICAgIChjKSA9ICgqZnVucy0+Z2V0KSAoZGF0YSk7CVwKKyAgfSB3aGlsZSAoMCkKKworLyogc3RvcmUgaW50byAicyIsIGV4dGVuZGluZyBpZiBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgU1RPUkUoYykJCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEFTU0VSVCAoc191cHRvIDw9IHNfYWxsb2MpOwkJCQkJCVwKKyAgICBpZiAoc191cHRvID49IHNfYWxsb2MpCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlzaXplX3QJc19hbGxvY19uZXcgPSBzX2FsbG9jICsgU19BTExPQ19TVEVQOwkJCVwKKwlzID0gX19HTVBfUkVBTExPQ0FURV9GVU5DX1RZUEUgKHMsIHNfYWxsb2MsIHNfYWxsb2NfbmV3LCBjaGFyKTsgXAorCXNfYWxsb2MgPSBzX2FsbG9jX25ldzsJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHNbc191cHRvKytdID0gYzsJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFNfQUxMT0NfU1RFUCAgNTEyCisKK3N0YXRpYyBpbnQKK2dtcHNjYW4gKGNvbnN0IHN0cnVjdCBnbXBfZG9zY2FuX2Z1bnNfdCAqZnVucywgdm9pZCAqZGF0YSwKKwkgY29uc3Qgc3RydWN0IGdtcF9kb3NjYW5fcGFyYW1zX3QgKnAsIHZvaWQgKmRzdCkKK3sKKyAgaW50CSAgY2hhcnMsIGMsIGJhc2UsIGZpcnN0LCB3aWR0aCwgc2Vlbl9wb2ludCwgc2Vlbl9kaWdpdCwgaGV4ZmxvYXQ7CisgIHNpemVfdCAgc191cHRvLCBzX2FsbG9jLCBoZXhleHA7CisgIGNoYXIJICAqczsKKyAgaW50CSAgaW52YWxpZCA9IDA7CisKKyAgVFJBQ0UgKHByaW50ZiAoImdtcHNjYW5cbiIpKTsKKworICBBU1NFUlQgKHAtPnR5cGUgPT0gJ0YnIHx8IHAtPnR5cGUgPT0gJ1EnIHx8IHAtPnR5cGUgPT0gJ1onKTsKKworICBjID0gKCpmdW5zLT5nZXQpIChkYXRhKTsKKyAgaWYgKGMgPT0gRU9GKQorICAgIHJldHVybiAtMjsKKworICBjaGFycyA9IDE7CisgIGZpcnN0ID0gMTsKKyAgc2Vlbl9wb2ludCA9IDA7CisgIHdpZHRoID0gKHAtPndpZHRoID09IDAgPyBJTlRfTUFYLTEgOiBwLT53aWR0aCk7CisgIGJhc2UgPSBwLT5iYXNlOworICBzX2FsbG9jID0gU19BTExPQ19TVEVQOworICBzID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChzX2FsbG9jLCBjaGFyKTsKKyAgc191cHRvID0gMDsKKyAgaGV4ZmxvYXQgPSAwOworICBoZXhleHAgPSAwOworCisgYW5vdGhlcjoKKyAgc2Vlbl9kaWdpdCA9IDA7CisgIGlmIChjID09ICctJykKKyAgICB7CisgICAgICBTVE9SRSAoYyk7CisgICAgICBnb3RvIGdldF9mb3Jfc2lnbjsKKyAgICB9CisgIGVsc2UgaWYgKGMgPT0gJysnKQorICAgIHsKKyAgICAgIC8qIGRvbid0IHN0b3JlICcrJywgaXQncyBub3QgYWNjZXB0ZWQgYnkgbXB6X3NldF9zdHIgZXRjICovCisgICAgZ2V0X2Zvcl9zaWduOgorICAgICAgR0VUIChjKTsKKyAgICB9CisKKyAgaWYgKGJhc2UgPT0gMCkKKyAgICB7CisgICAgICBiYXNlID0gMTA7CQkgIC8qIGRlY2ltYWwgaWYgbm8gYmFzZSBpbmRpY2F0b3IgKi8KKyAgICAgIGlmIChjID09ICcwJykKKwl7CisJICBzZWVuX2RpZ2l0ID0gMTsJICAvKiAwIGFsb25lIGlzIGEgdmFsaWQgbnVtYmVyICovCisJICBpZiAocC0+dHlwZSAhPSAnRicpCisJICAgIGJhc2UgPSA4OwkJICAvKiBsZWFkaW5nIDAgaXMgb2N0YWwsIGZvciBub24tZmxvYXRzICovCisJICBTVE9SRSAoYyk7CisJICBHRVQgKGMpOworCSAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKQorCSAgICB7CisJICAgICAgYmFzZSA9IDE2OworCSAgICAgIHNlZW5fZGlnaXQgPSAwOwkgIC8qIG11c3QgaGF2ZSBkaWdpdHMgYWZ0ZXIgYW4gMHggKi8KKwkgICAgICBpZiAocC0+dHlwZSA9PSAnRicpIC8qIGRvbid0IHBhc3MgJ3gnIHRvIG1wZl9zZXRfc3RyX3BvaW50ICovCisJCWhleGZsb2F0ID0gMTsKKwkgICAgICBlbHNlCisJCVNUT1JFIChjKTsKKwkgICAgICBHRVQgKGMpOworCSAgICB9CisJfQorICAgIH0KKworIGRpZ2l0czoKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAoYmFzZSA9PSAxNikKKwl7CisJICBpZiAoISBpc3hkaWdpdCAoYykpCisJICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBpc2RpZ2l0IChjKSkKKwkgICAgYnJlYWs7CisJICBpZiAoYmFzZSA9PSA4ICYmIChjID09ICc4JyB8fCBjID09ICc5JykpCisJICAgIGJyZWFrOworCX0KKworICAgICAgc2Vlbl9kaWdpdCA9IDE7CisgICAgICBTVE9SRSAoYyk7CisgICAgICBHRVQgKGMpOworICAgIH0KKworICBpZiAoZmlyc3QpCisgICAgeworICAgICAgLyogZGVjaW1hbCBwb2ludCAqLworICAgICAgaWYgKHAtPnR5cGUgPT0gJ0YnICYmICEgc2Vlbl9wb2ludCkKKwl7CisJICAvKiBGb3IgYSBtdWx0aS1jaGFyYWN0ZXIgZGVjaW1hbCBwb2ludCwgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcworCSAgICAgcHJlc2VudCB0aGVuIGFsbCBvZiBpdCBtdXN0IGJlLCBvdGhlcndpc2UgdGhlIGlucHV0IGlzCisJICAgICBjb25zaWRlcmVkIGludmFsaWQuICAqLworCSAgY29uc3QgY2hhciAgKnBvaW50ID0gR01QX0RFQ0lNQUxfUE9JTlQ7CisJICBpbnQJICAgICAgcGMgPSAodW5zaWduZWQgY2hhcikgKnBvaW50Kys7CisJICBpZiAoYyA9PSBwYykKKwkgICAgeworCSAgICAgIGZvciAoOzspCisJCXsKKwkJICBTVE9SRSAoYyk7CisJCSAgR0VUIChjKTsKKwkJICBwYyA9ICh1bnNpZ25lZCBjaGFyKSAqcG9pbnQrKzsKKwkJICBpZiAocGMgPT0gJ1wwJykKKwkJICAgIGJyZWFrOworCQkgIGlmIChjICE9IHBjKQorCQkgICAgZ290byBzZXRfaW52YWxpZDsKKwkJfQorCSAgICAgIHNlZW5fcG9pbnQgPSAxOworCSAgICAgIGdvdG8gZGlnaXRzOworCSAgICB9CisJfQorCisgICAgICAvKiBleHBvbmVudCAqLworICAgICAgaWYgKHAtPnR5cGUgPT0gJ0YnKQorCXsKKwkgIGlmIChoZXhmbG9hdCAmJiAoYyA9PSAncCcgfHwgYyA9PSAnUCcpKQorCSAgICB7CisJICAgICAgaGV4ZXhwID0gc191cHRvOyAvKiBleHBvbmVudCBsb2NhdGlvbiAqLworCSAgICAgIGJhc2UgPSAxMDsgICAgICAgLyogZXhwb25lbnQgaW4gZGVjaW1hbCAqLworCSAgICAgIGdvdG8gZXhwb25lbnQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKCEgaGV4ZmxvYXQgJiYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSkKKwkgICAgeworCSAgICBleHBvbmVudDoKKwkgICAgICAvKiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGluIHRoZSBtYW50aXNzYSwganVzdCBhbiBleHBvbmVudAorCQkgaXMgbm90IGdvb2QgZW5vdWdoICovCisJICAgICAgaWYgKCEgc2Vlbl9kaWdpdCkKKwkJZ290byBzZXRfaW52YWxpZDsKKworCSAgICBkb19zZWNvbmQ6CisJICAgICAgZmlyc3QgPSAwOworCSAgICAgIFNUT1JFIChjKTsKKwkgICAgICBHRVQgKGMpOworCSAgICAgIGdvdG8gYW5vdGhlcjsKKwkgICAgfQorCX0KKworICAgICAgLyogZGVub21pbmF0b3IgKi8KKyAgICAgIGlmIChwLT50eXBlID09ICdRJyAmJiBjID09ICcvJykKKwl7CisJICAvKiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGluIHRoZSBudW1lcmF0b3IgKi8KKwkgIGlmICghIHNlZW5fZGlnaXQpCisJICAgIGdvdG8gc2V0X2ludmFsaWQ7CisKKwkgIC8qIG5vdyBsb29rIGZvciBhdCBsZWFzdCBvbmUgZGlnaXQgaW4gdGhlIGRlbm9taW5hdG9yICovCisJICBzZWVuX2RpZ2l0ID0gMDsKKworCSAgLyogYWxsb3cgdGhlIGJhc2UgdG8gYmUgcmVkZXRlcm1pbmVkIGZvciAiJWkiICovCisJICBiYXNlID0gcC0+YmFzZTsKKwkgIGdvdG8gZG9fc2Vjb25kOworCX0KKyAgICB9CisKKyBjb252ZXJ0OgorICBpZiAoISBzZWVuX2RpZ2l0KQorICAgIHsKKyAgICBzZXRfaW52YWxpZDoKKyAgICAgIGludmFsaWQgPSAxOworICAgICAgZ290byBkb25lOworICAgIH0KKworICBpZiAoISBwLT5pZ25vcmUpCisgICAgeworICAgICAgU1RPUkUgKCdcMCcpOworICAgICAgVFJBQ0UgKHByaW50ZiAoIgljb252ZXJ0IFwiJXNcIlxuIiwgcykpOworCisgICAgICAvKiBXZSBvdWdodCB0byBoYXZlIHBhcnNlZCBvdXQgYSB2YWxpZCBzdHJpbmcgYWJvdmUsIHNvIGp1c3QgdGVzdAorCSBtcHpfc2V0X3N0ciBldGMgd2l0aCBhbiBBU1NFUlQuICAqLworICAgICAgc3dpdGNoIChwLT50eXBlKSB7CisgICAgICBjYXNlICdGJzoKKwl7CisJICBtcGZfcHRyICBmID0gKG1wZl9wdHIpIGRzdDsKKwkgIGlmIChoZXhleHAgIT0gMCkKKwkgICAgc1toZXhleHBdID0gJ1wwJzsKKwkgIEFTU0VSVF9OT0NBUlJZIChtcGZfc2V0X3N0ciAoZiwgcywgaGV4ZmxvYXQgPyAxNiA6IDEwKSk7CisJICBpZiAoaGV4ZXhwICE9IDApCisJICAgIHsKKwkgICAgICBjaGFyICpkdW1teTsKKwkgICAgICBsb25nICBleHA7CisJICAgICAgZXhwID0gc3RydG9sIChzICsgaGV4ZXhwICsgMSwgJmR1bW15LCAxMCk7CisJICAgICAgaWYgKGV4cCA+PSAwKQorCQltcGZfbXVsXzJleHAgKGYsIGYsICh1bnNpZ25lZCBsb25nKSBleHApOworCSAgICAgIGVsc2UKKwkJbXBmX2Rpdl8yZXhwIChmLCBmLCBORUdfQ0FTVCAodW5zaWduZWQgbG9uZywgZXhwKSk7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgICBjYXNlICdRJzoKKwlBU1NFUlRfTk9DQVJSWSAobXBxX3NldF9zdHIgKChtcHFfcHRyKSBkc3QsIHMsIHAtPmJhc2UpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ1onOgorCUFTU0VSVF9OT0NBUlJZIChtcHpfc2V0X3N0ciAoKG1wel9wdHIpIGRzdCwgcywgcC0+YmFzZSkpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlBU1NFUlQgKDApOworCS8qRkFMTFRIUlUqLworCWJyZWFrOworICAgICAgfQorICAgIH0KKworIGRvbmU6CisgIEFTU0VSVCAoY2hhcnMgPD0gd2lkdGgrMSk7CisgIGlmIChjaGFycyAhPSB3aWR0aCsxKQorICAgIHsKKyAgICAgICgqZnVucy0+dW5nZXQpIChjLCBkYXRhKTsKKyAgICAgIFRSQUNFIChwcmludGYgKCIJdW5nZXRjICVkLCB0byBnaXZlICVkIGNoYXJzXG4iLCBjLCBjaGFycy0xKSk7CisgICAgfQorICBjaGFycy0tOworCisgICgqX19nbXBfZnJlZV9mdW5jKSAocywgc19hbGxvYyk7CisKKyAgaWYgKGludmFsaWQpCisgICAgeworICAgICAgVFJBQ0UgKHByaW50ZiAoIglpbnZhbGlkXG4iKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIFRSQUNFIChwcmludGYgKCIgIHJldHVybiAlZCBjaGFycyAoY2Ygd2lkdGggJWQpXG4iLCBjaGFycywgd2lkdGgpKTsKKyAgcmV0dXJuIGNoYXJzOworfQorCisKKy8qIFJlYWQgYW5kIGRpc2NhcmQgd2hpdGVzcGFjZSwgaWYgYW55LiAgUmV0dXJuIG51bWJlciBvZiBjaGFycyBza2lwcGVkLgorICAgV2hpdGVzcGFjZSBza2lwcGluZyBuZXZlciBwcm92b2tlcyB0aGUgRU9GIHJldHVybiBmcm9tIF9fZ21wX2Rvc2Nhbiwgc28KKyAgIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byB3YXRjaCBmb3IgRU9GIGZyb20gZnVucy0+Z2V0LCAqLworc3RhdGljIGludAorc2tpcF93aGl0ZSAoY29uc3Qgc3RydWN0IGdtcF9kb3NjYW5fZnVuc190ICpmdW5zLCB2b2lkICpkYXRhKQoreworICBpbnQgIGM7CisgIGludCAgcmV0ID0gMDsKKworICBkbworICAgIHsKKyAgICAgIGMgPSAoZnVucy0+Z2V0KSAoZGF0YSk7CisgICAgICByZXQrKzsKKyAgICB9CisgIHdoaWxlIChpc3NwYWNlIChjKSk7CisKKyAgKGZ1bnMtPnVuZ2V0KSAoYywgZGF0YSk7CisgIHJldC0tOworCisgIFRSQUNFIChwcmludGYgKCIgIHNraXAgd2hpdGUgJWRcbiIsIHJldCkpOworICByZXR1cm4gcmV0OworfQorCisKK2ludAorX19nbXBfZG9zY2FuIChjb25zdCBzdHJ1Y3QgZ21wX2Rvc2Nhbl9mdW5zX3QgKmZ1bnMsIHZvaWQgKmRhdGEsCisJICAgICAgY29uc3QgY2hhciAqb3JpZ19mbXQsIHZhX2xpc3Qgb3JpZ19hcCkKK3sKKyAgc3RydWN0IGdtcF9kb3NjYW5fcGFyYW1zX3QgIHBhcmFtOworICB2YV9saXN0ICAgICBhcDsKKyAgY2hhcgkgICAgICAqYWxsb2NfZm10OworICBjb25zdCBjaGFyICAqZm10LCAqdGhpc19mbXQsICplbmRfZm10OworICBzaXplX3QgICAgICBvcmlnX2ZtdF9sZW4sIGFsbG9jX2ZtdF9zaXplLCBsZW47CisgIGludAkgICAgICBuZXdfZmllbGRzLCBuZXdfY2hhcnM7CisgIGNoYXIJICAgICAgZmNoYXI7CisgIGludAkgICAgICBmaWVsZHMgPSAwOworICBpbnQJICAgICAgY2hhcnMgPSAwOworCisgIFRSQUNFIChwcmludGYgKCJfX2dtcF9kb3NjYW4gXCIlc1wiXG4iLCBvcmlnX2ZtdCk7CisJIGlmIChmdW5zLT5zY2FuID09IChnbXBfZG9zY2FuX3NjYW5fdCkgc3NjYW5mKQorCSAgIHByaW50ZiAoIiAgcz1cIiVzXCJcbiIsICogKGNvbnN0IGNoYXIgKiopIGRhdGEpKTsKKworICAvKiBEb24ndCBtb2RpZnkgb3JpZ19hcCwgaWYgdmFfbGlzdCBpcyBhY3R1YWxseSBhbiBhcnJheSBhbmQgaGVuY2UgY2FsbCBieQorICAgICByZWZlcmVuY2UuICBJdCBjb3VsZCBiZSBhcmd1ZWQgdGhhdCBpdCdkIGJlIG1vcmUgZWZmaWNpZW50IHRvIGxlYXZlCisgICAgIGNhbGxlcnMgdG8gbWFrZSBhIGNvcHkgaWYgdGhleSBjYXJlLCBidXQgZG9pbmcgc28gaGVyZSBpcyBnb2luZyB0byBiZSBhCisgICAgIHZlcnkgc21hbGwgcGFydCBvZiB0aGUgdG90YWwgd29yaywgYW5kIHdlIG1heSBhcyB3ZWxsIGtlZXAgYXBwbGljYXRpb25zCisgICAgIG91dCBvZiB0cm91YmxlLiAgKi8KKyAgdmFfY29weSAoYXAsIG9yaWdfYXApOworCisgIC8qIFBhcnRzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIGFyZSBnb2luZyB0byBiZSBjb3BpZWQgc28gdGhhdCBhICIgJW4iIGNhbgorICAgICBiZSBhcHBlbmRlZC4gIGFsbG9jX2ZtdCBpcyBzb21lIHNwYWNlIGZvciB0aGF0LiAgb3JpZ19mbXRfbGVuKzQgd2lsbCBiZQorICAgICBuZWVkZWQgaWYgZm10IGNvbnNpc3RzIG9mIGEgc2luZ2xlICIlIiBzcGVjaWZpZXIsIGJ1dCBvdGhlcndpc2UgaXMgYW4KKyAgICAgb3ZlcmVzdGltYXRlLiAgV2UncmUgbm90IGdvaW5nIHRvIGJlIHZlcnkgZmFzdCBoZXJlLCBzbyB1c2UKKyAgICAgX19nbXBfYWxsb2NhdGVfZnVuYyByYXRoZXIgdGhhbiBUTVBfQUxMT0MuICAqLworICBvcmlnX2ZtdF9sZW4gPSBzdHJsZW4gKG9yaWdfZm10KTsKKyAgYWxsb2NfZm10X3NpemUgPSBvcmlnX2ZtdF9sZW4gKyA0OworICBhbGxvY19mbXQgPSBfX0dNUF9BTExPQ0FURV9GVU5DX1RZUEUgKGFsbG9jX2ZtdF9zaXplLCBjaGFyKTsKKworICBmbXQgPSBvcmlnX2ZtdDsKKyAgQVNTRVJUX0NPREUgKGVuZF9mbXQgPSBvcmlnX2ZtdCArIG9yaWdfZm10X2xlbik7CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgbmV4dDoKKyAgICAgIGZjaGFyID0gKmZtdCsrOworCisgICAgICBpZiAoZmNoYXIgPT0gJ1wwJykKKwlicmVhazsKKworICAgICAgaWYgKGlzc3BhY2UgKGZjaGFyKSkKKwl7CisJICBjaGFycyArPSBza2lwX3doaXRlIChmdW5zLCBkYXRhKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGZjaGFyICE9ICclJykKKwl7CisJICBpbnQgIGM7CisJbGl0ZXJhbDoKKwkgIGMgPSAoZnVucy0+Z2V0KSAoZGF0YSk7CisJICBpZiAoYyAhPSBmY2hhcikKKwkgICAgeworCSAgICAgIChmdW5zLT51bmdldCkgKGMsIGRhdGEpOworCSAgICAgIGlmIChjID09IEVPRikKKwkJeworCQllb2Zfbm9fbWF0Y2g6CisJCSAgaWYgKGZpZWxkcyA9PSAwKQorCQkgICAgZmllbGRzID0gRU9GOworCQl9CisJICAgICAgZ290byBkb25lOworCSAgICB9CisJICBjaGFycysrOworCSAgY29udGludWU7CisJfQorCisgICAgICBwYXJhbS50eXBlID0gJ1wwJzsKKyAgICAgIHBhcmFtLmJhc2UgPSAwOwkgLyogZm9yIGUsZixnLGkgKi8KKyAgICAgIHBhcmFtLmlnbm9yZSA9IDA7CisgICAgICBwYXJhbS53aWR0aCA9IDA7CisKKyAgICAgIHRoaXNfZm10ID0gZm10LTE7CisgICAgICBUUkFDRSAocHJpbnRmICgiCXRoaXNfZm10IFwiJXNcIlxuIiwgdGhpc19mbXQpKTsKKworICAgICAgZm9yICg7OykKKwl7CisJICBBU1NFUlQgKGZtdCA8PSBlbmRfZm10KTsKKworCSAgZmNoYXIgPSAqZm10Kys7CisJICBzd2l0Y2ggKGZjaGFyKSB7CisKKwkgIGNhc2UgJ1wwJzogIC8qIHVudGVybWluYXRlZCAlIHNlcXVlbmNlICovCisJICAgIEFTU0VSVCAoMCk7CisJICAgIGdvdG8gZG9uZTsKKworCSAgY2FzZSAnJSc6ICAgLyogbGl0ZXJhbCAlICovCisJICAgIGdvdG8gbGl0ZXJhbDsKKworCSAgY2FzZSAnWyc6ICAgLyogY2hhcmFjdGVyIHJhbmdlICovCisJICAgIGZjaGFyID0gKmZtdCsrOworCSAgICBpZiAoZmNoYXIgPT0gJ14nKQorCSAgICAgIGZjaGFyID0gKmZtdCsrOworCSAgICAvKiAnXScgYWxsb3dlZCBhcyB0aGUgZmlyc3QgY2hhciAocG9zc2libHkgYWZ0ZXIgJ14nKSAqLworCSAgICBpZiAoZmNoYXIgPT0gJ10nKQorCSAgICAgIGZjaGFyID0gKmZtdCsrOworCSAgICBmb3IgKDs7KQorCSAgICAgIHsKKwkJQVNTRVJUIChmbXQgPD0gZW5kX2ZtdCk7CisJCWlmIChmY2hhciA9PSAnXDAnKQorCQkgIHsKKwkJICAgIC8qIHVudGVybWluYXRlZCAlIHNlcXVlbmNlICovCisJCSAgICBBU1NFUlQgKDApOworCQkgICAgZ290byBkb25lOworCQkgIH0KKwkJaWYgKGZjaGFyID09ICddJykKKwkJICBicmVhazsKKwkJZmNoYXIgPSAqZm10Kys7CisJICAgICAgfQorCSAgICAvKkZBTExUSFJVKi8KKwkgIGNhc2UgJ2MnOiAgIC8qIGNoYXJhY3RlcnMgKi8KKwkgIGNhc2UgJ3MnOiAgIC8qIHN0cmluZyBvZiBub24td2hpdGVzcGFjZSAqLworCSAgY2FzZSAncCc6ICAgLyogcG9pbnRlciAqLworCSAgbGliY190eXBlOgorCSAgICBsZW4gPSBmbXQgLSB0aGlzX2ZtdDsKKwkgICAgbWVtY3B5IChhbGxvY19mbXQsIHRoaXNfZm10LCBsZW4pOworCSAgICBhbGxvY19mbXRbbGVuKytdID0gJyUnOworCSAgICBhbGxvY19mbXRbbGVuKytdID0gJ24nOworCSAgICBhbGxvY19mbXRbbGVuXSA9ICdcMCc7CisKKwkgICAgVFJBQ0UgKHByaW50ZiAoIiAgc2NhbiBcIiVzXCJcbiIsIGFsbG9jX2ZtdCk7CisJCSAgIGlmIChmdW5zLT5zY2FuID09IChnbXBfZG9zY2FuX3NjYW5fdCkgc3NjYW5mKQorCQkgICAgIHByaW50ZiAoIglzPVwiJXNcIlxuIiwgKiAoY29uc3QgY2hhciAqKikgZGF0YSkpOworCisJICAgIG5ld19jaGFycyA9IC0xOworCSAgICBpZiAocGFyYW0uaWdub3JlKQorCSAgICAgIHsKKwkJbmV3X2ZpZWxkcyA9ICgqZnVucy0+c2NhbikgKGRhdGEsIGFsbG9jX2ZtdCwgJm5ld19jaGFycywgTlVMTCk7CisJCUFTU0VSVCAobmV3X2ZpZWxkcyA9PSAwIHx8IG5ld19maWVsZHMgPT0gRU9GKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXZvaWQgKmFyZyA9IHZhX2FyZyAoYXAsIHZvaWQgKik7CisJCW5ld19maWVsZHMgPSAoKmZ1bnMtPnNjYW4pIChkYXRhLCBhbGxvY19mbXQsIGFyZywgJm5ld19jaGFycyk7CisJCUFTU0VSVCAobmV3X2ZpZWxkcz09MCB8fCBuZXdfZmllbGRzPT0xIHx8IG5ld19maWVsZHM9PUVPRik7CisKKwkJaWYgKG5ld19maWVsZHMgPT0gMCkKKwkJICBnb3RvIGRvbmU7ICAvKiBpbnZhbGlkIGlucHV0ICovCisKKwkJaWYgKG5ld19maWVsZHMgPT0gMSkKKwkJICBBU1NFUlQgKG5ld19jaGFycyAhPSAtMSk7CisJICAgICAgfQorCSAgICBUUkFDRSAocHJpbnRmICgiICBuZXdfZmllbGRzICVkICAgbmV3X2NoYXJzICVkXG4iLAorCQkJICAgbmV3X2ZpZWxkcywgbmV3X2NoYXJzKSk7CisKKwkgICAgaWYgKG5ld19maWVsZHMgPT0gLTEpCisJICAgICAgZ290byBlb2Zfbm9fbWF0Y2g7ICAvKiBFT0YgYmVmb3JlIGFueXRoaW5nIG1hdGNoZWQgKi8KKworCSAgICAvKiBVbmRlciBwYXJhbS5pZ25vcmUsIHdoZW4gbmV3X2ZpZWxkcz09MCB3ZSBkb24ndCBrbm93IGlmCisJICAgICAgIGl0J3MgYSBzdWNjZXNzZnVsIG1hdGNoIG9yIGFuIGludmFsaWQgZmllbGQuICBuZXdfY2hhcnMKKwkgICAgICAgd29uJ3QgaGF2ZSBiZWVuIGFzc2lnbmVkIGlmIGl0IHdhcyBhbiBpbnZhbGlkIGZpZWxkLiAgKi8KKwkgICAgaWYgKG5ld19jaGFycyA9PSAtMSkKKwkgICAgICBnb3RvIGRvbmU7ICAvKiBpbnZhbGlkIGlucHV0ICovCisKKwkgICAgY2hhcnMgKz0gbmV3X2NoYXJzOworCSAgICAoKmZ1bnMtPnN0ZXApIChkYXRhLCBuZXdfY2hhcnMpOworCisJICBpbmNyZW1lbnRfZmllbGRzOgorCSAgICBpZiAoISBwYXJhbS5pZ25vcmUpCisJICAgICAgZmllbGRzKys7CisJICAgIGdvdG8gbmV4dDsKKworCSAgY2FzZSAnZCc6ICAgLyogZGVjaW1hbCAqLworCSAgY2FzZSAndSc6ICAgLyogZGVjaW1hbCAqLworCSAgICBwYXJhbS5iYXNlID0gMTA7CisJICAgIGdvdG8gbnVtZXJpYzsKKworCSAgY2FzZSAnZSc6ICAgLyogZmxvYXQgKi8KKwkgIGNhc2UgJ0UnOiAgIC8qIGZsb2F0ICovCisJICBjYXNlICdmJzogICAvKiBmbG9hdCAqLworCSAgY2FzZSAnZyc6ICAgLyogZmxvYXQgKi8KKwkgIGNhc2UgJ0cnOiAgIC8qIGZsb2F0ICovCisJICBjYXNlICdpJzogICAvKiBpbnRlZ2VyIHdpdGggYmFzZSBtYXJrZXIgKi8KKwkgIG51bWVyaWM6CisJICAgIGlmIChwYXJhbS50eXBlICE9ICdGJyAmJiBwYXJhbS50eXBlICE9ICdRJyAmJiBwYXJhbS50eXBlICE9ICdaJykKKwkgICAgICBnb3RvIGxpYmNfdHlwZTsKKworCSAgICBjaGFycyArPSBza2lwX3doaXRlIChmdW5zLCBkYXRhKTsKKworCSAgICBuZXdfY2hhcnMgPSBnbXBzY2FuIChmdW5zLCBkYXRhLCAmcGFyYW0sCisJCQkJIHBhcmFtLmlnbm9yZSA/IE5VTEwgOiB2YV9hcmcgKGFwLCB2b2lkKikpOworCSAgICBpZiAobmV3X2NoYXJzID09IC0yKQorCSAgICAgIGdvdG8gZW9mX25vX21hdGNoOworCSAgICBpZiAobmV3X2NoYXJzID09IC0xKQorCSAgICAgIGdvdG8gZG9uZTsKKworCSAgICBBU1NFUlQgKG5ld19jaGFycyA+PSAwKTsKKwkgICAgY2hhcnMgKz0gbmV3X2NoYXJzOworCSAgICBnb3RvIGluY3JlbWVudF9maWVsZHM7CisKKwkgIGNhc2UgJ2EnOiAgIC8qIGdsaWJjIGFsbG9jYXRlIHN0cmluZyAqLworCSAgY2FzZSAnXCcnOiAgLyogZ2xpYmMgZGlnaXQgZ3JvdXBpbmdzICovCisJICAgIGJyZWFrOworCisJICBjYXNlICdGJzogICAvKiBtcGZfdCAqLworCSAgY2FzZSAnaic6ICAgLyogaW50bWF4X3QgKi8KKwkgIGNhc2UgJ0wnOiAgIC8qIGxvbmcgbG9uZyAqLworCSAgY2FzZSAncSc6ICAgLyogcXVhZF90ICovCisJICBjYXNlICdRJzogICAvKiBtcHFfdCAqLworCSAgY2FzZSAndCc6ICAgLyogcHRyZGlmZl90ICovCisJICBjYXNlICd6JzogICAvKiBzaXplX3QgKi8KKwkgIGNhc2UgJ1onOiAgIC8qIG1wel90ICovCisJICBzZXRfdHlwZToKKwkgICAgcGFyYW0udHlwZSA9IGZjaGFyOworCSAgICBicmVhazsKKworCSAgY2FzZSAnaCc6ICAgLyogc2hvcnQgb3IgY2hhciAqLworCSAgICBpZiAocGFyYW0udHlwZSAhPSAnaCcpCisJICAgICAgZ290byBzZXRfdHlwZTsKKwkgICAgcGFyYW0udHlwZSA9ICdIJzsJLyogaW50ZXJuYWwgY29kZSBmb3IgImhoIiAqLworCSAgICBicmVhazsKKworCSAgICBnb3RvIG51bWVyaWM7CisKKwkgIGNhc2UgJ2wnOiAgIC8qIGxvbmcsIGxvbmcgbG9uZywgZG91YmxlIG9yIGxvbmcgZG91YmxlICovCisJICAgIGlmIChwYXJhbS50eXBlICE9ICdsJykKKwkgICAgICBnb3RvIHNldF90eXBlOworCSAgICBwYXJhbS50eXBlID0gJ0wnOwkvKiAibGwiIG1lYW5zICJMIiAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAnbic6CisJICAgIGlmICghIHBhcmFtLmlnbm9yZSkKKwkgICAgICB7CisJCXZvaWQgICpwOworCQlwID0gdmFfYXJnIChhcCwgdm9pZCAqKTsKKwkJVFJBQ0UgKHByaW50ZiAoIiAgc3RvcmUgJSVuIHRvICVwXG4iLCBwKSk7CisJCXN3aXRjaCAocGFyYW0udHlwZSkgeworCQljYXNlICdcMCc6ICogKGludAkqKSBwID0gY2hhcnM7IGJyZWFrOworCQljYXNlICdGJzogIG1wZl9zZXRfc2kgKChtcGZfcHRyKSBwLCAobG9uZykgY2hhcnMpOyBicmVhazsKKwkJY2FzZSAnSCc6ICAqIChjaGFyCSopIHAgPSBjaGFyczsgYnJlYWs7CisJCWNhc2UgJ2gnOiAgKiAoc2hvcnQJKikgcCA9IGNoYXJzOyBicmVhazsKKyNpZiBIQVZFX0lOVE1BWF9UCisJCWNhc2UgJ2onOiAgKiAoaW50bWF4X3QJKikgcCA9IGNoYXJzOyBicmVhazsKKyNlbHNlCisJCWNhc2UgJ2onOiAgQVNTRVJUX0ZBSUwgKGludG1heF90IG5vdCBhdmFpbGFibGUpOyBicmVhazsKKyNlbmRpZgorCQljYXNlICdsJzogICogKGxvbmcJKikgcCA9IGNoYXJzOyBicmVhazsKKyNpZiBIQVZFX1FVQURfVCAmJiBIQVZFX0xPTkdfTE9ORworCQljYXNlICdxJzoKKwkJICBBU1NFUlRfQUxXQVlTIChzaXplb2YgKHF1YWRfdCkgPT0gc2l6ZW9mIChsb25nIGxvbmcpKTsKKwkJICAvKkZBTExUSFJVKi8KKyNlbHNlCisJCWNhc2UgJ3EnOiAgQVNTRVJUX0ZBSUwgKHF1YWRfdCBub3QgYXZhaWxhYmxlKTsgYnJlYWs7CisjZW5kaWYKKyNpZiBIQVZFX0xPTkdfTE9ORworCQljYXNlICdMJzogICogKGxvbmcgbG9uZyAqKSBwID0gY2hhcnM7IGJyZWFrOworI2Vsc2UKKwkJY2FzZSAnTCc6ICBBU1NFUlRfRkFJTCAobG9uZyBsb25nIG5vdCBhdmFpbGFibGUpOyBicmVhazsKKyNlbmRpZgorCQljYXNlICdRJzogIG1wcV9zZXRfc2kgKChtcHFfcHRyKSBwLCAobG9uZykgY2hhcnMsIDFMKTsgYnJlYWs7CisjaWYgSEFWRV9QVFJESUZGX1QKKwkJY2FzZSAndCc6ICAqIChwdHJkaWZmX3QgKikgcCA9IGNoYXJzOyBicmVhazsKKyNlbHNlCisJCWNhc2UgJ3QnOiAgQVNTRVJUX0ZBSUwgKHB0cmRpZmZfdCBub3QgYXZhaWxhYmxlKTsgYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAneic6ICAqIChzaXplX3QJKikgcCA9IGNoYXJzOyBicmVhazsKKwkJY2FzZSAnWic6ICBtcHpfc2V0X3NpICgobXB6X3B0cikgcCwgKGxvbmcpIGNoYXJzKTsgYnJlYWs7CisJCWRlZmF1bHQ6IEFTU0VSVCAoMCk7IGJyZWFrOworCQl9CisJICAgICAgfQorCSAgICBnb3RvIG5leHQ7CisKKwkgIGNhc2UgJ28nOgorCSAgICBwYXJhbS5iYXNlID0gODsKKwkgICAgZ290byBudW1lcmljOworCisJICBjYXNlICd4JzoKKwkgIGNhc2UgJ1gnOgorCSAgICBwYXJhbS5iYXNlID0gMTY7CisJICAgIGdvdG8gbnVtZXJpYzsKKworCSAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCSAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCSAgICBwYXJhbS53aWR0aCA9IDA7CisJICAgIGRvIHsKKwkgICAgICBwYXJhbS53aWR0aCA9IHBhcmFtLndpZHRoICogMTAgKyAoZmNoYXItJzAnKTsKKwkgICAgICBmY2hhciA9ICpmbXQrKzsKKwkgICAgfSB3aGlsZSAoaXNkaWdpdCAoZmNoYXIpKTsKKwkgICAgZm10LS07IC8qIHVuZ2V0IHRoZSBub24tZGlnaXQgKi8KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJyonOgorCSAgICBwYXJhbS5pZ25vcmUgPSAxOworCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgLyogc29tZXRoaW5nIGludmFsaWQgaW4gYSAlIHNlcXVlbmNlICovCisJICAgIEFTU0VSVCAoMCk7CisJICAgIGdvdG8gbmV4dDsKKwkgIH0KKwl9CisgICAgfQorCisgZG9uZToKKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChhbGxvY19mbXQsIGFsbG9jX2ZtdF9zaXplKTsKKyAgcmV0dXJuIGZpZWxkczsKK30KZGlmZiAtLWdpdCBhL3NjYW5mL2ZzY2FuZi5jIGIvc2NhbmYvZnNjYW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3NGFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NjYW5mL2ZzY2FuZi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIGdtcF9mc2NhbmYgLS0gZm9ybWF0dGVkIGlucHV0IGZyb20gYSBGSUxFLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX2ZzY2FuZiAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0ICBhcDsKKyAgaW50ICAgICAgcmV0OworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgcmV0ID0gX19nbXBfZG9zY2FuICgmX19nbXBfZnNjYW5mX2Z1bnMsIGZwLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zY2FuZi9mc2NhbmZmdW5zLmMgYi9zY2FuZi9mc2NhbmZmdW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMjkzOQotLS0gL2Rldi9udWxsCisrKyBiL3NjYW5mL2ZzY2FuZmZ1bnMuYwpAQCAtMCwwICsxLDYxIEBACisvKiBfX2dtcF9mc2NhbmZfZnVucyAtLSBzdXBwb3J0IGZvciBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBhIEZJTEUuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBTdW5PUyA0IHN0ZGlvLmggZG9lc24ndCBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlICovCisjaWYgISBIQVZFX0RFQ0xfRkdFVEMKK2ludCBmZ2V0YyAoRklMRSAqKTsKKyNlbmRpZgorI2lmICEgSEFWRV9ERUNMX0ZTQ0FORgoraW50IGZzY2FuZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CisjZW5kaWYKKyNpZiAhIEhBVkVfREVDTF9VTkdFVEMKK2ludCB1bmdldGMgKGludCwgRklMRSAqKTsKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCitzdGVwIChGSUxFICpmcCwgaW50IG4pCit7Cit9CisKK2NvbnN0IHN0cnVjdCBnbXBfZG9zY2FuX2Z1bnNfdCAgX19nbXBfZnNjYW5mX2Z1bnMgPSB7CisgIChnbXBfZG9zY2FuX3NjYW5fdCkgIGZzY2FuZiwKKyAgKGdtcF9kb3NjYW5fc3RlcF90KSAgc3RlcCwKKyAgKGdtcF9kb3NjYW5fZ2V0X3QpICAgZmdldGMsCisgIChnbXBfZG9zY2FuX3VuZ2V0X3QpIHVuZ2V0YywKK307CmRpZmYgLS1naXQgYS9zY2FuZi9zY2FuZi5jIGIvc2NhbmYvc2NhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDUxODhjCi0tLSAvZGV2L251bGwKKysrIGIvc2NhbmYvc2NhbmYuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBnbXBfc2NhbmYgLS0gZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4uCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKworaW50CitnbXBfc2NhbmYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0ICBhcDsKKyAgaW50ICAgICAgcmV0OworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgcmV0ID0gX19nbXBfZG9zY2FuICgmX19nbXBfZnNjYW5mX2Z1bnMsIHN0ZGluLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zY2FuZi9zc2NhbmYuYyBiL3NjYW5mL3NzY2FuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9zY2FuZi9zc2NhbmYuYwpAQCAtMCwwICsxLDUyIEBACisvKiBnbXBfc3NjYW5mIC0tIGZvcm1hdHRlZCBpbnB1dCBmcm9tIGEgc3RyaW5nLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3NzY2FuZiAoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgIGFwOworICBpbnQgICAgICByZXQ7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKworI2lmIFNTQ0FORl9XUklUQUJMRV9JTlBVVAorICAvKiBsZXQgZ21wX3Zzc2NhbmYgaGFuZGxlIHRoZSBjb3B5aW5nICovCisgIHJldCA9IGdtcF92c3NjYW5mIChzLCBmbXQsIGFwKTsKKyNlbHNlCisgIHJldCA9IF9fZ21wX2Rvc2NhbiAoJl9fZ21wX3NzY2FuZl9mdW5zLCAodm9pZCAqKSAmcywgZm10LCBhcCk7CisjZW5kaWYKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zY2FuZi9zc2NhbmZmdW5zLmMgYi9zY2FuZi9zc2NhbmZmdW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlNmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NjYW5mL3NzY2FuZmZ1bnMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyogX19nbXBfc3NjYW5mX2Z1bnMgLS0gc3VwcG9ydCBmb3IgZm9ybWF0dGVkIGlucHV0IGZyb20gYSBzdHJpbmcuCisKKyAgIFRIRSBGVU5DVElPTlMgSU4gVEhJUyBGSUxFIEFSRSBGT1IgSU5URVJOQUwgVVNFIE9OTFkuICBUSEVZJ1JFIEFMTU9TVAorICAgQ0VSVEFJTiBUTyBCRSBTVUJKRUNUIFRPIElOQ09NUEFUSUJMRSBDSEFOR0VTIE9SIERJU0FQUEVBUiBDT01QTEVURUxZIElOCisgICBGVVRVUkUgR05VIE1QIFJFTEVBU0VTLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKyNpZiAwCitzdGF0aWMgaW50CitzY2FuIChjb25zdCBjaGFyICoqc3AsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgaW50IHJldDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHJldCA9IHZzc2NhbmYoKnNwLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgcmV0dXJuIHJldDsKK30KKyNlbHNlCitzdGF0aWMgaW50CitzY2FuIChjb25zdCBjaGFyICoqc3AsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2b2lkICpwMSwgKnAyOworICBpbnQgcmV0OworCisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgcDEgPSB2YV9hcmcgKGFwLCB2b2lkICopOworICBwMiA9IHZhX2FyZyAoYXAsIHZvaWQgKik7CisKKyAgcmV0ID0gc3NjYW5mICgqc3AsIGZtdCwgcDEsIHAyKTsKKworICB2YV9lbmQgKGFwKTsKKworICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzdGVwIChjb25zdCBjaGFyICoqc3AsIGludCBuKQoreworICBBU1NFUlQgKG4gPj0gMCk7CisKKyAgLyogc2hvdWxkbid0IHB1c2ggdXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKyNpZiBXQU5UX0FTU0VSVAorICB7CisgICAgaW50ICBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBBU1NFUlQgKCgqc3ApW2ldICE9ICdcMCcpOworICB9CisjZW5kaWYKKworICAoKnNwKSArPSBuOworfQorCitzdGF0aWMgaW50CitnZXQgKGNvbnN0IGNoYXIgKipzcCkKK3sKKyAgY29uc3QgY2hhciAgKnM7CisgIGludCAgYzsKKyAgcyA9ICpzcDsKKyAgYyA9ICh1bnNpZ25lZCBjaGFyKSAqcysrOworICBpZiAoYyA9PSAnXDAnKQorICAgIHJldHVybiBFT0Y7CisgICpzcCA9IHM7CisgIHJldHVybiBjOworfQorCitzdGF0aWMgdm9pZAordW5nZXQgKGludCBjLCBjb25zdCBjaGFyICoqc3ApCit7CisgIGNvbnN0IGNoYXIgICpzOworICBzID0gKnNwOworICBpZiAoYyA9PSBFT0YpCisgICAgeworICAgICAgQVNTRVJUICgqcyA9PSAnXDAnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHMtLTsKKyAgQVNTRVJUICgodW5zaWduZWQgY2hhcikgKnMgPT0gYyk7CisgICpzcCA9IHM7Cit9CisKK2NvbnN0IHN0cnVjdCBnbXBfZG9zY2FuX2Z1bnNfdCAgX19nbXBfc3NjYW5mX2Z1bnMgPSB7CisgIChnbXBfZG9zY2FuX3NjYW5fdCkgIHNjYW4sCisgIChnbXBfZG9zY2FuX3N0ZXBfdCkgIHN0ZXAsCisgIChnbXBfZG9zY2FuX2dldF90KSAgIGdldCwKKyAgKGdtcF9kb3NjYW5fdW5nZXRfdCkgdW5nZXQsCit9OwpkaWZmIC0tZ2l0IGEvc2NhbmYvdmZzY2FuZi5jIGIvc2NhbmYvdmZzY2FuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjgxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zY2FuZi92ZnNjYW5mLmMKQEAgLTAsMCArMSw0MSBAQAorLyogZ21wX3Zmc2NhbmYgLS0gZm9ybWF0dGVkIGlucHV0IGZyb20gYSBGSUxFLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3Zmc2NhbmYgKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgIHJldHVybiBfX2dtcF9kb3NjYW4gKCZfX2dtcF9mc2NhbmZfZnVucywgZnAsIGZtdCwgYXApOworfQpkaWZmIC0tZ2l0IGEvc2NhbmYvdnNjYW5mLmMgYi9zY2FuZi92c2NhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThjZmMxCi0tLSAvZGV2L251bGwKKysrIGIvc2NhbmYvdnNjYW5mLmMKQEAgLTAsMCArMSw0MiBAQAorLyogZ21wX3ZzY2FuZiAtLSBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBzdGRpbi4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXI6CisKKyAgKiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworb3IKKworICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgIGxhdGVyIHZlcnNpb24uCisKK29yIGJvdGggaW4gcGFyYWxsZWwsIGFzIGhlcmUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCitvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBjb3BpZXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZCB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwKK3NlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3ZzY2FuZiAoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICByZXR1cm4gX19nbXBfZG9zY2FuICgmX19nbXBfZnNjYW5mX2Z1bnMsIHN0ZGluLCBmbXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL3NjYW5mL3Zzc2NhbmYuYyBiL3NjYW5mL3Zzc2NhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdiOThhCi0tLSAvZGV2L251bGwKKysrIGIvc2NhbmYvdnNzY2FuZi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGdtcF92c3NjYW5mIC0tIGZvcm1hdHRlZCBpbnB1dCBmcm9tIGEgc3RyaW5nLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKK2ludAorZ21wX3Zzc2NhbmYgKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyNpZiBTU0NBTkZfV1JJVEFCTEVfSU5QVVQKKyAgLyogV2Ugb25seSBhY3R1YWxseSBuZWVkIHRoaXMgaWYgdGhlcmUncyBzdGFuZGFyZCBDIHR5cGVzIGluIGZtdCwgYW5kIGlmCisgICAgICJzIiBpcyBub3QgYWxyZWFkeSB3cml0YWJsZSwgYnV0IGl0J3MgdG9vIG11Y2ggdHJvdWJsZSB0byBjaGVjayB0aGF0LAorICAgICBhbmQgaW4gYW55IGNhc2UgdGhpcyB3cml0YWJsZSBzc2NhbmYgaW5wdXQgYnVzaW5lc3MgaXMgb25seSBmb3IgYSBmZXcKKyAgICAgb2xkIHN5c3RlbXMuICovCisgIHNpemVfdCBzaXplOworICBjaGFyICAgKmFsbG9jOworICBpbnQgICAgcmV0OworICBzaXplID0gc3RybGVuIChzKSArIDE7CisgIGFsbG9jID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFIChzaXplLCBjaGFyKTsKKyAgbWVtY3B5IChhbGxvYywgcywgc2l6ZSk7CisgIHMgPSBhbGxvYzsKKyAgcmV0ID0gX19nbXBfZG9zY2FuICgmX19nbXBfc3NjYW5mX2Z1bnMsICh2b2lkICopICZzLCBmbXQsIGFwKTsKKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChhbGxvYywgc2l6ZSk7CisgIHJldHVybiByZXQ7CisKKyNlbHNlCisgIHJldHVybiBfX2dtcF9kb3NjYW4gKCZfX2dtcF9zc2NhbmZfZnVucywgKHZvaWQgKikgJnMsIGZtdCwgYXApOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS90YWwtZGVidWcuYyBiL3RhbC1kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzI3YWEKLS0tIC9kZXYvbnVsbAorKysgYi90YWwtZGVidWcuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogVE1QX0FMTE9DIHJvdXRpbmVzIGZvciBkZWJ1Z2dpbmcuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisKKy8qIFRoaXMgbWV0aG9kIGFpbXMgdG8gaGVscCBhIG1hbGxvYyBkZWJ1Z2dlciBmaW5kIHByb2JsZW1zLiAgQSBsaW5rZWQgbGlzdAorICAgb2YgYWxsb2NhdGVkIGJsb2NrIGlzIGtlcHQgZm9yIFRNUF9GUkVFIHRvIHJlbGVhc2UuICBUaGlzIGlzIHJlZW50cmFudAorICAgYW5kIHRocmVhZCBzYWZlLgorCisgICBFYWNoIFRNUF9BTExPQyBpcyBhIHNlcGFyYXRlIG1hbGxvY2VkIGJsb2NrLCBzbyByZWR6b25lcyBvciBzZW50aW5lbHMKKyAgIGFwcGxpZWQgYnkgYSBtYWxsb2MgZGVidWdnZXIgZWl0aGVyIGFib3ZlIG9yIGJlbG93IGNhbiBndWFyZCBhZ2FpbnN0CisgICBhY2Nlc3NlcyBvdXRzaWRlIHRoZSBhbGxvY2F0ZWQgYXJlYS4KKworICAgQSBtYXJrZXIgaXMgYSAic3RydWN0IHRtcF9kZWJ1Z190ICoiIHNvIHRoYXQgVE1QX0RFQ0wgY2FuIGluaXRpYWxpemUgaXQKKyAgIHRvIE5VTEwgYW5kIHdlIGNhbiBkZXRlY3QgVE1QX0FMTE9DIHdpdGhvdXQgVE1QX01BUksuCisKKyAgIEl0IHdpbGwgd29yayB0byByZWFsbG9jIGFuIE1QWl9UTVBfSU5JVCB2YXJpYWJsZSwgYnV0IHdoZW4gVE1QX0ZSRUUgY29tZXMKKyAgIHRvIHJlbGVhc2UgdGhlIG1lbW9yeSBpdCB3aWxsIGhhdmUgdGhlIG9sZCBzaXplLCB0aGVyZWJ5IHRyaWdnZXJpbmcgYW4KKyAgIGVycm9yIGZyb20gdGVzdHMvbWVtb3J5LmMuCisKKyAgIFBvc3NpYmlsaXRpZXM6CisKKyAgIEl0J2QgYmUgcG9zc2libGUgdG8ga2VlcCBhIGdsb2JhbCBsaXN0IG9mIGFjdGl2ZSAic3RydWN0IHRtcF9kZWJ1Z190IgorICAgcmVjb3Jkcywgc28gYXQgdGhlIGVuZCBvZiBhIHByb2dyYW0gYW55IFRNUCBsZWFrcyBjb3VsZCBiZSBwcmludGVkLiAgQnV0CisgICBpZiBvbmx5IGEgY291cGxlIG9mIHJvdXRpbmVzIGFyZSB1bmRlciB0ZXN0IGF0IGFueSBvbmUgdGltZSB0aGVuIHRoZQorICAgbGlrZWx5IGN1bHByaXQgc2hvdWxkIGJlIGVhc3kgZW5vdWdoIHRvIHNwb3QuICAqLworCisKK3ZvaWQKK19fZ21wX3RtcF9kZWJ1Z19tYXJrIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG1wX2RlYnVnX3QgKiptYXJrcCwgc3RydWN0IHRtcF9kZWJ1Z190ICptYXJrLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlY2xfbmFtZSwgY29uc3QgY2hhciAqbWFya19uYW1lKQoreworICBpZiAoc3RyY21wIChtYXJrX25hbWUsIGRlY2xfbmFtZSkgIT0gMCkKKyAgICB7CisgICAgICBfX2dtcF9hc3NlcnRfaGVhZGVyIChmaWxlLCBsaW5lKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkdOVSBNUDogVE1QX01BUksoJXMpIGJ1dCBUTVBfREVDTCglcykgaXMgaW4gc2NvcGVcbiIsCisgICAgICAgICAgICAgICBtYXJrX25hbWUsIGRlY2xfbmFtZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKCptYXJrcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIF9fZ21wX2Fzc2VydF9oZWFkZXIgKGZpbGUsIGxpbmUpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiR05VIE1QOiBSZXBlYXQgb2YgVE1QX01BUksoJXMpXG4iLCBtYXJrX25hbWUpOworICAgICAgaWYgKG1hcmstPmZpbGUgIT0gTlVMTCAmJiBtYXJrLT5maWxlWzBdICE9ICdcMCcgJiYgbWFyay0+bGluZSAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIF9fZ21wX2Fzc2VydF9oZWFkZXIgKG1hcmstPmZpbGUsIG1hcmstPmxpbmUpOworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgInByZXZpb3VzIHdhcyBoZXJlXG4iKTsKKyAgICAgICAgfQorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgICptYXJrcCA9IG1hcms7CisgIG1hcmstPmZpbGUgPSBmaWxlOworICBtYXJrLT5saW5lID0gbGluZTsKKyAgbWFyay0+bGlzdCA9IE5VTEw7Cit9CisKK3ZvaWQgKgorX19nbXBfdG1wX2RlYnVnX2FsbG9jIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG1wX2RlYnVnX3QgKiptYXJrcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVjbF9uYW1lLCBzaXplX3Qgc2l6ZSkKK3sKKyAgc3RydWN0IHRtcF9kZWJ1Z190ICAgICAgICAqbWFyayA9ICptYXJrcDsKKyAgc3RydWN0IHRtcF9kZWJ1Z19lbnRyeV90ICAqcDsKKworICBBU1NFUlRfQUxXQVlTIChzaXplID49IDEpOworCisgIGlmIChtYXJrID09IE5VTEwpCisgICAgeworICAgICAgX19nbXBfYXNzZXJ0X2hlYWRlciAoZmlsZSwgbGluZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJHTlUgTVA6IFRNUF9BTExPQyB3aXRob3V0IFRNUF9NQVJLKCVzKVxuIiwgZGVjbF9uYW1lKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBwID0gX19HTVBfQUxMT0NBVEVfRlVOQ19UWVBFICgxLCBzdHJ1Y3QgdG1wX2RlYnVnX2VudHJ5X3QpOworICBwLT5zaXplID0gc2l6ZTsKKyAgcC0+YmxvY2sgPSAoKl9fZ21wX2FsbG9jYXRlX2Z1bmMpIChzaXplKTsKKyAgcC0+bmV4dCA9IG1hcmstPmxpc3Q7CisgIG1hcmstPmxpc3QgPSBwOworICByZXR1cm4gcC0+YmxvY2s7Cit9CisKK3ZvaWQKK19fZ21wX3RtcF9kZWJ1Z19mcmVlIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0bXBfZGVidWdfdCAqKm1hcmtwLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlY2xfbmFtZSwgY29uc3QgY2hhciAqZnJlZV9uYW1lKQoreworICBzdHJ1Y3QgdG1wX2RlYnVnX3QgICAgICAgICptYXJrID0gKm1hcmtwOworICBzdHJ1Y3QgdG1wX2RlYnVnX2VudHJ5X3QgICpwLCAqbmV4dDsKKworICBpZiAobWFyayA9PSBOVUxMKQorICAgIHsKKyAgICAgIF9fZ21wX2Fzc2VydF9oZWFkZXIgKGZpbGUsIGxpbmUpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiR05VIE1QOiBUTVBfRlJFRSglcykgd2l0aG91dCBUTVBfTUFSSyglcylcbiIsCisgICAgICAgICAgICAgICBmcmVlX25hbWUsIGRlY2xfbmFtZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKHN0cmNtcCAoZnJlZV9uYW1lLCBkZWNsX25hbWUpICE9IDApCisgICAgeworICAgICAgX19nbXBfYXNzZXJ0X2hlYWRlciAoZmlsZSwgbGluZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJHTlUgTVA6IFRNUF9GUkVFKCVzKSB3aGVuIFRNUF9ERUNMKCVzKSBpcyBpbiBzY29wZVxuIiwKKyAgICAgICAgICAgICAgIGZyZWVfbmFtZSwgZGVjbF9uYW1lKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBwID0gbWFyay0+bGlzdDsKKyAgd2hpbGUgKHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXh0ID0gcC0+bmV4dDsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAocC0+YmxvY2ssIHAtPnNpemUpOworICAgICAgX19HTVBfRlJFRV9GVU5DX1RZUEUgKHAsIDEsIHN0cnVjdCB0bXBfZGVidWdfZW50cnlfdCk7CisgICAgICBwID0gbmV4dDsKKyAgICB9CisKKyAgKm1hcmtwID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3RhbC1ub3RyZWVudC5jIGIvdGFsLW5vdHJlZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZmE4NAotLS0gL2Rldi9udWxsCisrKyBiL3RhbC1ub3RyZWVudC5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiBTdGFjayBhbGxvY2F0aW9uIHJvdXRpbmVzLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgbWFjaGluZXMgd2l0aG91dCBzdXBwb3J0CisgICBmb3IgdGhlIGBhbGxvY2EnIGZ1bmN0aW9uLgorCitDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OS0yMDAxLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCitzdHJ1Y3QgdG1wX3N0YWNrCit7CisgIHZvaWQgKmVuZDsKKyAgdm9pZCAqYWxsb2NfcG9pbnQ7CisgIHN0cnVjdCB0bXBfc3RhY2sgKnByZXY7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdG1wX3N0YWNrIHRtcF9zdGFjazsKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfdG90YWxfYWxsb2NhdGlvbiA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RvdGFsX2FsbG9jYXRpb24gPSAwOworCitzdGF0aWMgdG1wX3N0YWNrIHh4eCA9IHsmeHh4LCAmeHh4LCAwfTsKK3N0YXRpYyB0bXBfc3RhY2sgKmN1cnJlbnQgPSAmeHh4OworCisvKiBUaGUgcm91bmRlZCBzaXplIG9mIHRoZSBoZWFkZXIgb2YgZWFjaCBhbGxvY2F0aW9uIGJsb2NrLiAgKi8KKyNkZWZpbmUgSFNJWiAgIFJPVU5EX1VQX01VTFRJUExFIChzaXplb2YgKHRtcF9zdGFjayksIF9fVE1QX0FMSUdOKQorCisKKy8qIEFsbG9jYXRlIGEgYmxvY2sgb2YgZXhhY3RseSA8c2l6ZT4gYnl0ZXMuICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgdGhyb3VnaCB0aGUgVE1QX0FMTE9DIG1hY3JvLCB3aGljaCB0YWtlcyBjYXJlIG9mIHJvdW5kaW5nL2FsaWdubWVudC4gICovCit2b2lkICoKK19fZ21wX3RtcF9hbGxvYyAodW5zaWduZWQgbG9uZyBzaXplKQoreworICB2b2lkICp0aGF0OworCisgIEFTU0VSVCAoKHNpemUgJSBfX1RNUF9BTElHTikgPT0gMCk7CisgIEFTU0VSVCAoKCh1bnNpZ25lZCkgY3VycmVudC0+YWxsb2NfcG9pbnQgJSBfX1RNUF9BTElHTikgPT0gMCk7CisKKyAgaWYgKHNpemUgPiAoY2hhciAqKSBjdXJyZW50LT5lbmQgLSAoY2hhciAqKSBjdXJyZW50LT5hbGxvY19wb2ludCkKKyAgICB7CisgICAgICB2b2lkICpjaHVuazsKKyAgICAgIHRtcF9zdGFjayAqaGVhZGVyOworICAgICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOworICAgICAgdW5zaWduZWQgbG9uZyBub3c7CisKKyAgICAgIC8qIEFsbG9jYXRlIGEgY2h1bmsgdGhhdCBtYWtlcyB0aGUgdG90YWwgY3VycmVudCBhbGxvY2F0aW9uIHNvbWV3aGF0CisJIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG9jYXRpb24gZXZlci4gIElmIHNpemUgaXMgdmVyeSBsYXJnZSwgd2UKKwkgYWxsb2NhdGUgdGhhdCBtdWNoLiAgKi8KKworICAgICAgbm93ID0gY3VycmVudF90b3RhbF9hbGxvY2F0aW9uICsgc2l6ZTsKKyAgICAgIGlmIChub3cgPiBtYXhfdG90YWxfYWxsb2NhdGlvbikKKwl7CisJICAvKiBXZSBuZWVkIG1vcmUgdGVtcG9yYXJ5IG1lbW9yeSB0aGFuIGV2ZXIgYmVmb3JlLiAgSW5jcmVhc2UKKwkgICAgIGZvciBmdXR1cmUgbmVlZHMuICAqLworCSAgbm93ID0gKG5vdyAqIDMgLyAyICsgX19UTVBfQUxJR04gLSAxKSAmIC1fX1RNUF9BTElHTjsKKwkgIGNodW5rX3NpemUgPSBub3cgLSBjdXJyZW50X3RvdGFsX2FsbG9jYXRpb24gKyBIU0laOworCSAgY3VycmVudF90b3RhbF9hbGxvY2F0aW9uID0gbm93OworCSAgbWF4X3RvdGFsX2FsbG9jYXRpb24gPSBjdXJyZW50X3RvdGFsX2FsbG9jYXRpb247CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNodW5rX3NpemUgPSBtYXhfdG90YWxfYWxsb2NhdGlvbiAtIGN1cnJlbnRfdG90YWxfYWxsb2NhdGlvbiArIEhTSVo7CisJICBjdXJyZW50X3RvdGFsX2FsbG9jYXRpb24gPSBtYXhfdG90YWxfYWxsb2NhdGlvbjsKKwl9CisKKyAgICAgIGNodW5rID0gKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoY2h1bmtfc2l6ZSk7CisgICAgICBoZWFkZXIgPSAodG1wX3N0YWNrICopIGNodW5rOworICAgICAgaGVhZGVyLT5lbmQgPSAoY2hhciAqKSBjaHVuayArIGNodW5rX3NpemU7CisgICAgICBoZWFkZXItPmFsbG9jX3BvaW50ID0gKGNoYXIgKikgY2h1bmsgKyBIU0laOworICAgICAgaGVhZGVyLT5wcmV2ID0gY3VycmVudDsKKyAgICAgIGN1cnJlbnQgPSBoZWFkZXI7CisgICAgfQorCisgIHRoYXQgPSBjdXJyZW50LT5hbGxvY19wb2ludDsKKyAgY3VycmVudC0+YWxsb2NfcG9pbnQgPSAoY2hhciAqKSB0aGF0ICsgc2l6ZTsKKyAgQVNTRVJUICgoKHVuc2lnbmVkKSB0aGF0ICUgX19UTVBfQUxJR04pID09IDApOworICByZXR1cm4gdGhhdDsKK30KKworLyogVHlwaWNhbGx5IGNhbGxlZCBhdCBmdW5jdGlvbiBlbnRyeS4gIDxtYXJrPiBpcyBhc3NpZ25lZCBzbyB0aGF0CisgICBfX2dtcF90bXBfZnJlZSBjYW4gbGF0ZXIgYmUgdXNlZCB0byByZWNsYWltIGFsbCBzdWJzZXF1ZW50bHkgYWxsb2NhdGVkCisgICBzdG9yYWdlLiAgKi8KK3ZvaWQKK19fZ21wX3RtcF9tYXJrIChzdHJ1Y3QgdG1wX21hcmtlciAqbWFyaykKK3sKKyAgbWFyay0+d2hpY2hfY2h1bmsgPSBjdXJyZW50OworICBtYXJrLT5hbGxvY19wb2ludCA9IGN1cnJlbnQtPmFsbG9jX3BvaW50OworfQorCisvKiBGcmVlIGV2ZXJ5dGhpbmcgYWxsb2NhdGVkIHNpbmNlIDxtYXJrPiB3YXMgYXNzaWduZWQgYnkgX19nbXBfdG1wX21hcmsgKi8KK3ZvaWQKK19fZ21wX3RtcF9mcmVlIChzdHJ1Y3QgdG1wX21hcmtlciAqbWFyaykKK3sKKyAgd2hpbGUgKG1hcmstPndoaWNoX2NodW5rICE9IGN1cnJlbnQpCisgICAgeworICAgICAgdG1wX3N0YWNrICp0bXA7CisKKyAgICAgIHRtcCA9IGN1cnJlbnQ7CisgICAgICBjdXJyZW50ID0gdG1wLT5wcmV2OworICAgICAgY3VycmVudF90b3RhbF9hbGxvY2F0aW9uIC09ICgoKGNoYXIgKikgKHRtcC0+ZW5kKSAtIChjaGFyICopIHRtcCkgLSBIU0laKTsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAodG1wLCAoY2hhciAqKSB0bXAtPmVuZCAtIChjaGFyICopIHRtcCk7CisgICAgfQorICBjdXJyZW50LT5hbGxvY19wb2ludCA9IG1hcmstPmFsbG9jX3BvaW50OworfQpkaWZmIC0tZ2l0IGEvdGFsLXJlZW50LmMgYi90YWwtcmVlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQzZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGFsLXJlZW50LmMKQEAgLTAsMCArMSw4MSBAQAorLyogVE1QX0FMTE9DIHJvdXRpbmVzIHVzaW5nIG1hbGxvYyBpbiBhIHJlZW50cmFudCBmYXNoaW9uLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlcjoKKworICAqIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitvcgorCisgICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICAgbGF0ZXIgdmVyc2lvbi4KKworb3IgYm90aCBpbiBwYXJhbGxlbCwgYXMgaGVyZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGNvcGllcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5LiAgSWYgbm90LAorc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworCisvKiBFYWNoIFRNUF9BTExPQyB1c2VzIF9fZ21wX2FsbG9jYXRlX2Z1bmMgdG8gZ2V0IGEgYmxvY2sgb2YgbWVtb3J5IG9mIHRoZQorICAgc2l6ZSByZXF1ZXN0ZWQsIHBsdXMgYSBoZWFkZXIgYXQgdGhlIHN0YXJ0IHdoaWNoIGlzIHVzZWQgdG8gaG9sZCB0aGUKKyAgIGJsb2NrcyBvbiBhIGxpbmtlZCBsaXN0IGluIHRoZSBtYXJrZXIgdmFyaWFibGUsIHJlYWR5IGZvciBUTVBfRlJFRSB0bworICAgcmVsZWFzZS4KKworICAgQ2FsbGVycyBzaG91bGQgdHJ5IHRvIGRvIG11bHRpcGxlIGFsbG9jcyB3aXRoIG9uZSBjYWxsLCBpbiB0aGUgc3R5bGUgb2YKKyAgIFRNUF9BTExPQ19MSU1CU18yIGlmIGl0J3MgZWFzeSB0byBhcnJhbmdlLCBzaW5jZSB0aGF0IHdpbGwga2VlcCBkb3duIHRoZQorICAgbnVtYmVyIG9mIHNlcGFyYXRlIG1hbGxvYyBjYWxscy4KKworICAgRW5oYW5jZW1lbnRzOgorCisgICBDb3VsZCBpbmxpbmUgYm90aCBUTVBfQUxMT0MgYW5kIFRNUF9GUkVFLCB0aG91Z2ggVE1QX0FMTE9DIHdvdWxkIG5lZWQgdGhlCisgICBjb21waWxlciB0byBoYXZlICJpbmxpbmUiIHNpbmNlIGl0IHJldHVybnMgYSB2YWx1ZS4gIFRoZSBjYWxscyB0byBtYWxsb2MKKyAgIHdpbGwgYmUgc2xvdyB0aG91Z2gsIHNvIGl0IGhhcmRseSBzZWVtcyB3b3J0aCB3b3JyeWluZyBhYm91dCBvbmUgZXh0cmEKKyAgIGxldmVsIG9mIGZ1bmN0aW9uIGNhbGwuICAqLworCisKKyNkZWZpbmUgSFNJWiAgIFJPVU5EX1VQX01VTFRJUExFIChzaXplb2YgKHN0cnVjdCB0bXBfcmVlbnRyYW50X3QpLCBfX1RNUF9BTElHTikKKwordm9pZCAqCitfX2dtcF90bXBfcmVlbnRyYW50X2FsbG9jIChzdHJ1Y3QgdG1wX3JlZW50cmFudF90ICoqbWFya3AsIHNpemVfdCBzaXplKQoreworICBjaGFyICAgICpwOworICBzaXplX3QgIHRvdGFsX3NpemU7CisKKyNkZWZpbmUgUCAgICgoc3RydWN0IHRtcF9yZWVudHJhbnRfdCAqKSBwKQorCisgIHRvdGFsX3NpemUgPSBzaXplICsgSFNJWjsKKyAgcCA9IF9fR01QX0FMTE9DQVRFX0ZVTkNfVFlQRSAodG90YWxfc2l6ZSwgY2hhcik7CisgIFAtPnNpemUgPSB0b3RhbF9zaXplOworICBQLT5uZXh0ID0gKm1hcmtwOworICAqbWFya3AgPSBQOworICByZXR1cm4gcCArIEhTSVo7Cit9CisKK3ZvaWQKK19fZ21wX3RtcF9yZWVudHJhbnRfZnJlZSAoc3RydWN0IHRtcF9yZWVudHJhbnRfdCAqbWFyaykKK3sKKyAgc3RydWN0IHRtcF9yZWVudHJhbnRfdCAgKm5leHQ7CisKKyAgd2hpbGUgKG1hcmsgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXh0ID0gbWFyay0+bmV4dDsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAoKGNoYXIgKikgbWFyaywgbWFyay0+c2l6ZSk7CisgICAgICBtYXJrID0gbmV4dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9hbWQ2NGNhbGwuYXNtIGIvdGVzdHMvYW1kNjRjYWxsLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNiMDFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYW1kNjRjYWxsLmFzbQpAQCAtMCwwICsxLDE2NyBAQAorZG5sICBBTUQ2NCBjYWxsaW5nIGNvbnZlbnRpb25zIGNoZWNraW5nLgorCitkbmwgIENvcHlyaWdodCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CitkbmwgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworZG5sICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUKK2RubCAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworZG5sICBUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK2RubCAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorZG5sICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitkbmwgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK2RubCAgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlCitkbmwgIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2RubCAgVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgY29kZSBhdHRlbXB0cyB0byBrZWVwIHRoZSBjYWxsL3JldHVybgorZG5sICBwcmVkaWN0aW9uIHN0YWNrIHZhbGlkLCBidXQgbWF0Y2hpbmcgY2FsbHMgYW5kIHJldHVybnMuCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyB2b2lkIHg4Nl9mbGRjdyAodW5zaWduZWQgc2hvcnQgY3cpOworQworQyBFeGVjdXRlIGFuIGZsZGN3LCBzZXR0aW5nIHRoZSB4ODcgY29udHJvbCB3b3JkIHRvIGN3LgorCitQUk9MT0dVRSh4ODZfZmxkY3cpCisJbW92CSVyZGksIC04KCVyc3ApCisJZmxkY3cJLTgoJXJzcCkKKwlyZXQKK0VQSUxPR1VFKCkKKworCitDIHVuc2lnbmVkIHNob3J0IHg4Nl9mc3RjdyAodm9pZCk7CitDCitDIEV4ZWN1dGUgYW4gZnN0Y3csIHJldHVybmluZyB0aGUgY3VycmVudCB4ODcgY29udHJvbCB3b3JkLgorCitQUk9MT0dVRSh4ODZfZnN0Y3cpCisJbW92cQkkMCwgLTgoJXJzcCkKKwlmc3RjdwktOCglcnNwKQorCW1vdgktOCglcnNwKSwgJXJheAorCXJldAorRVBJTE9HVUUoKQorCisKK2RubCAgSW5zdHJ1bWVudGVkIHByb2ZpbGluZyB3b24ndCBjb21lIG91dCBxdWl0ZSByaWdodCBiZWxvdywgc2luY2Ugd2UgZG9uJ3QgZG8KK2RubCAgYW4gYWN0dWFsICJyZXQiLiAgVGhlcmUncyBvbmx5IGEgZmV3IGluc3RydWN0aW9ucyBoZXJlLCBzbyB0aGVyZSdzIG5vCitkbmwgIGdyZWF0IG5lZWQgdG8gZ2V0IHRoZW0gc2VwYXJhdGVseSBhY2NvdW50ZWQsIGp1c3QgbGV0IHRoZW0gZ2V0IGF0dHJpYnV0ZWQKK2RubCAgdG8gdGhlIGNhbGxlci4gIEZJWE1FIHRoaXMgY29tbWVudCBtaWdodCBubyBsb25nZXIgYmUgdHJ1ZS4KKworaWZlbHNlKFdBTlRfUFJPRklMSU5HLGluc3RydW1lbnQsCitgZGVmaW5lKGBXQU5UX1BST0ZJTElORycsbm8pJykKKworCitDIGludCBjYWxsaW5nX2NvbnZlbnRpb25zICguLi4pOworQworQyBUaGUgZ2xvYmFsIHZhcmlhYmxlICJjYWxsaW5nX2NvbnZlbnRpb25zX2Z1bmN0aW9uIiBpcyB0aGUgZnVuY3Rpb24gdG8KK0MgY2FsbCwgd2l0aCB0aGUgYXJndW1lbnRzIGFzIHBhc3NlZCBoZXJlLgorQworQyBQZXJoYXBzIHRoZSBmaW5pdCBzaG91bGQgYmUgZG9uZSBvbmx5IGlmIHRoZSB0YWdzIHdvcmQgaXNuJ3QgY2xlYXIsIGJ1dAorQyBub3RoaW5nIHVzZXMgdGhlIHJvdW5kaW5nIG1vZGUgb3IgYW55dGhpbmcgYXQgdGhlIG1vbWVudC4KKworZGVmaW5lKGBXQU5UX1JCWCcsIGV2YWwoOCowKSgkMSkpCitkZWZpbmUoYFdBTlRfUkJQJywgZXZhbCg4KjEpKCQxKSkKK2RlZmluZShgV0FOVF9SMTInLCBldmFsKDgqMikoJDEpKQorZGVmaW5lKGBXQU5UX1IxMycsIGV2YWwoOCozKSgkMSkpCitkZWZpbmUoYFdBTlRfUjE0JywgZXZhbCg4KjQpKCQxKSkKK2RlZmluZShgV0FOVF9SMTUnLCBldmFsKDgqNSkoJDEpKQorCitkZWZpbmUoYEpVTktfUkFYJywgZXZhbCg4KjYpKCQxKSkKK2RlZmluZShgSlVOS19SMTAnLCBldmFsKDgqNykoJDEpKQorZGVmaW5lKGBKVU5LX1IxMScsIGV2YWwoOCo4KSgkMSkpCisKK2RlZmluZShgU0FWRV9SQlgnLCBldmFsKDgqOSkoJDEpKQorZGVmaW5lKGBTQVZFX1JCUCcsIGV2YWwoOCoxMCkoJDEpKQorZGVmaW5lKGBTQVZFX1IxMicsIGV2YWwoOCoxMSkoJDEpKQorZGVmaW5lKGBTQVZFX1IxMycsIGV2YWwoOCoxMikoJDEpKQorZGVmaW5lKGBTQVZFX1IxNCcsIGV2YWwoOCoxMykoJDEpKQorZGVmaW5lKGBTQVZFX1IxNScsIGV2YWwoOCoxNCkoJDEpKQorCitkZWZpbmUoYFJFVEFERFInLCAgZXZhbCg4KjE1KSgkMSkpCisKK2RlZmluZShgUkJYJywJICAgZXZhbCg4KjE2KSgkMSkpCitkZWZpbmUoYFJCUCcsCSAgIGV2YWwoOCoxNykoJDEpKQorZGVmaW5lKGBSMTInLAkgICBldmFsKDgqMTgpKCQxKSkKK2RlZmluZShgUjEzJywJICAgZXZhbCg4KjE5KSgkMSkpCitkZWZpbmUoYFIxNCcsCSAgIGV2YWwoOCoyMCkoJDEpKQorZGVmaW5lKGBSMTUnLAkgICBldmFsKDgqMjEpKCQxKSkKK2RlZmluZShgUkZMQUdTJywgICBldmFsKDgqMjIpKCQxKSkKKworCitkZWZpbmUoRywKK200X2Fzc2VydF9udW1hcmdzKDEpCitgR1NZTV9QUkVGSVhgJyQxJykKKworCVRFWFQKKwlBTElHTigzMikKK1BST0xPR1VFKGNhbGxpbmdfY29udmVudGlvbnMpCisJbW92CUcoY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXMpQEdPVFBDUkVMKCVyaXApLCAlcmF4CisJcG9wCVJFVEFERFIoJXJheCkKKworCW1vdgklcmJ4LCBTQVZFX1JCWCglcmF4KQorCW1vdgklcmJwLCBTQVZFX1JCUCglcmF4KQorCW1vdgklcjEyLCBTQVZFX1IxMiglcmF4KQorCW1vdgklcjEzLCBTQVZFX1IxMyglcmF4KQorCW1vdgklcjE0LCBTQVZFX1IxNCglcmF4KQorCW1vdgklcjE1LCBTQVZFX1IxNSglcmF4KQorCisJQyBWYWx1ZXMgd2UgZXhwZWN0IHRvIHNlZSB1bmNoYW5nZWQsIGFzIHBlciBhbWQ2NGNoZWNrLmMKKwltb3YJV0FOVF9SQlgoJXJheCksICVyYngKKwltb3YJV0FOVF9SQlAoJXJheCksICVyYnAKKwltb3YJV0FOVF9SMTIoJXJheCksICVyMTIKKwltb3YJV0FOVF9SMTMoJXJheCksICVyMTMKKwltb3YJV0FOVF9SMTQoJXJheCksICVyMTQKKwltb3YJV0FOVF9SMTUoJXJheCksICVyMTUKKworCUMgVHJ5IHRvIHByb3Zva2UgYSBwcm9ibGVtIGJ5IHN0YXJ0aW5nIHdpdGgganVuayBpbiB0aGUgY2FsbGVyLXNhdmVzCisJQyByZWdpc3RlcnMsIGVzcGVjaWFsbHkgJXJheCB3aGljaCB3aWxsIGJlIHRoZSByZXR1cm4gdmFsdWUuCitDCW1vdglKVU5LX1JBWCglcmF4KSwgJXJheAkJQyBvdmVyd3JpdHRlbiBiZWxvdyBhbnl3YXkKKwltb3YJSlVOS19SMTAoJXJheCksICVyMTAKKwltb3YJSlVOS19SMTEoJXJheCksICVyMTEKKworCW1vdglHKGNhbGxpbmdfY29udmVudGlvbnNfZnVuY3Rpb24pQEdPVFBDUkVMKCVyaXApLCAlcmF4CisJY2FsbAkqKCVyYXgpCisKKwltb3YJRyhjYWxsaW5nX2NvbnZlbnRpb25zX3ZhbHVlcylAR09UUENSRUwoJXJpcCksICVyY3gKKworCW1vdgklcmJ4LCBSQlgoJXJjeCkKKwltb3YJJXJicCwgUkJQKCVyY3gpCisJbW92CSVyMTIsIFIxMiglcmN4KQorCW1vdgklcjEzLCBSMTMoJXJjeCkKKwltb3YJJXIxNCwgUjE0KCVyY3gpCisJbW92CSVyMTUsIFIxNSglcmN4KQorCisJcHVzaGYKKwlwb3AJJXJieAorCW1vdgklcmJ4LCBSRkxBR1MoJXJjeCkKKworCW1vdglTQVZFX1JCWCglcmN4KSwgJXJieAorCW1vdglTQVZFX1JCUCglcmN4KSwgJXJicAorCW1vdglTQVZFX1IxMiglcmN4KSwgJXIxMgorCW1vdglTQVZFX1IxMyglcmN4KSwgJXIxMworCW1vdglTQVZFX1IxNCglcmN4KSwgJXIxNAorCW1vdglTQVZFX1IxNSglcmN4KSwgJXIxNQorCisJQyBPdmVyd3JpdGUgcGFyYW1ldGVyIHJlZ2lzdGVycworQwltb3YJSlVOS19SOSglcmN4KSwgJXI5CitDCW1vdglKVU5LX1I4KCVyY3gpLCAlcjgKK0MJbW92CUpVTktfUkNYKCVyY3gpLCAlcmN4CitDCW1vdglKVU5LX1JEWCglcmN4KSwgJXJkeAorQwltb3YJSlVOS19SU0koJXJjeCksICVyc2kKK0MJbW92CUpVTktfUkRJKCVyY3gpLCAlcmRpCisKKwlwdXNoCVJFVEFERFIoJXJjeCkKKworCW1vdglHKGNhbGxpbmdfY29udmVudGlvbnNfZmVudilAR09UUENSRUwoJXJpcCksICVyY3gKKwlmc3RlbnYJKCVyY3gpCisJZmluaXQKKworCXJldAorCitFUElMT0dVRSgpCmRpZmYgLS1naXQgYS90ZXN0cy9hbWQ2NGNoZWNrLmMgYi90ZXN0cy9hbWQ2NGNoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjZGJlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FtZDY0Y2hlY2suYwpAQCAtMCwwICsxLDExMSBAQAorLyogQU1ENjQgY2FsbGluZyBjb252ZW50aW9ucyBjaGVja2luZy4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBWZWN0b3IgaWYgY29uc3RhbnRzIGFuZCByZWdpc3RlciB2YWx1ZXMuICBXZSB1c2Ugb25lIHZlY3RvciB0byBhbGxvdyBhY2Nlc3MKKyAgIHZpYSBhIGJhc2UgcG9pbnRlciwgdmVyeSBiZW5lZmljaWFsIGZvciB0aGUgUElDLWVuYWJsZWQgYW1kNjRjYWxsLmFzbS4gICovCittcF9saW1iX3QgY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXNbMjNdID0KK3sKKyAgQ05TVF9MSU1CKDB4MTIzNDU2Nzg4NzY1NDMyMSksCS8qIHdhbnRfcmJ4ICovCisgIENOU1RfTElNQigweDg5QUJDREVGRkVEQ0JBOTgpLAkvKiB3YW50X3JicCAqLworICBDTlNUX0xJTUIoMHhERUFEQkVFRkJBREVDQUZFKSwJLyogd2FudF9yMTIgKi8KKyAgQ05TVF9MSU1CKDB4RkZFRUREQ0NCQkFBOTk4OCksCS8qIHdhbnRfcjEzICovCisgIENOU1RfTElNQigweDAwMTEyMjMzNDQ1NTY2NzcpLAkvKiB3YW50X3IxNCAqLworICBDTlNUX0xJTUIoMHgxMjM0NDMyMTU2Nzg4NzY1KSwJLyogd2FudF9yMTUgKi8KKworICBDTlNUX0xJTUIoMHhGRUVEQUJCQUNBQUZCRUVEKSwJLyogSlVOS19SQVggKi8KKyAgQ05TVF9MSU1CKDB4QUI3OERFODlGRjUxMjVCQiksCS8qIEpVTktfUjEwICovCisgIENOU1RfTElNQigweDEyMzg5MDE4OTAxODkwMzEpCQkvKiBKVU5LX1IxMSAqLworCisgIC8qIHJlc3Qgb2YgYXJyYXkgdXNlZCBmb3IgZHluYW1pYyB2YWx1ZXMuICAqLworfTsKKworLyogSW5kZXggc3RhcnRzIGZvciB2YXJpb3VzIHJlZ2lvbnMgaW4gYWJvdmUgdmVjdG9yLiAgKi8KKyNkZWZpbmUgV0FOVAkwCisjZGVmaW5lIEpVTksJNgorI2RlZmluZSBTQVZFCTkKKyNkZWZpbmUgUkVUQUREUgkxNQorI2RlZmluZSBWQUwJMTYKKyNkZWZpbmUgUkZMQUdTCTIyCisKKy8qIHZhbHVlcyB0byBjaGVjayAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorc3RydWN0IHsKKyAgaW50ICBjb250cm9sOworICBpbnQgIHN0YXR1czsKKyAgaW50ICB0YWc7CisgIGludCAgb3RoZXJbNF07Cit9IGNhbGxpbmdfY29udmVudGlvbnNfZmVudjsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworY29uc3QgY2hhciAqcmVnbmFtZVs2XSA9IHsicmJ4IiwgInJicCIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUifTsKKworI2RlZmluZSBESVJfQklUKHJmbGFncykgICAoKChyZmxhZ3MpICYgKDE8PDEwKSkgIT0gMCkKKworCisvKiBSZXR1cm4gMSBpZiBvaywgMCBpZiBub3QgKi8KKworaW50CitjYWxsaW5nX2NvbnZlbnRpb25zX2NoZWNrICh2b2lkKQoreworICBjb25zdCBjaGFyICAqaGVhZGVyID0gIlZpb2xhdGVkIGNhbGxpbmcgY29udmVudGlvbnM6XG4iOworICBpbnQgIHJldCA9IDE7CisgIGludCBpOworCisjZGVmaW5lIENIRUNLKGNhbGxyZWcsIHJlZ3N0ciwgdmFsdWUpCQkJXAorICBpZiAoY2FsbHJlZyAhPSB2YWx1ZSkJCQkJCVwKKyAgICB7CQkJCQkJCVwKKyAgICAgIHByaW50ZiAoIiVzICAgJXMJZ290IDB4JTAxNmxYIHdhbnQgMHglMDE2bFhcbiIsCVwKKwkgICAgICBoZWFkZXIsIHJlZ3N0ciwgY2FsbHJlZywgdmFsdWUpOwkJXAorICAgICAgaGVhZGVyID0gIiI7CQkJCQlcCisgICAgICByZXQgPSAwOwkJCQkJCVwKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICBDSEVDSyAoY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXNbVkFMK2ldLCByZWduYW1lW2ldLCBjYWxsaW5nX2NvbnZlbnRpb25zX3ZhbHVlc1tXQU5UK2ldKTsKKyAgICB9CisKKyAgaWYgKERJUl9CSVQgKGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzW1JGTEFHU10pICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXMgICByZmxhZ3MgZGlyIGJpdCAgZ290ICVkIHdhbnQgMFxuIiwKKwkgICAgICBoZWFkZXIsIERJUl9CSVQgKGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzW1JGTEFHU10pKTsKKyAgICAgIGhlYWRlciA9ICIiOworICAgICAgcmV0ID0gMDsKKyAgICB9CisKKyAgaWYgKChjYWxsaW5nX2NvbnZlbnRpb25zX2ZlbnYudGFnICYgMHhGRkZGKSAhPSAweEZGRkYpCisgICAgeworICAgICAgcHJpbnRmICgiJXMgICBmcHUgdGFncyAgZ290IDB4JVggd2FudCAweEZGRkZcbiIsCisJICAgICAgaGVhZGVyLCBjYWxsaW5nX2NvbnZlbnRpb25zX2ZlbnYudGFnICYgMHhGRkZGKTsKKyAgICAgIGhlYWRlciA9ICIiOworICAgICAgcmV0ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2FybTMyY2FsbC5hc20gYi90ZXN0cy9hcm0zMmNhbGwuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDQ1MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hcm0zMmNhbGwuYXNtCkBAIC0wLDAgKzEsODMgQEAKK2RubCAgQVJNMzIgY2FsbGluZyBjb252ZW50aW9ucyBjaGVja2luZy4KKworZG5sICBDb3B5cmlnaHQgMjAwMCwgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAxMCwgMjAxMywgMjAxNiBGcmVlIFNvZnR3YXJlCitkbmwgIEZvdW5kYXRpb24sIEluYy4KKworZG5sICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworZG5sICBUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorZG5sICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK2RubCAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlCitkbmwgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK2RubCAgVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCitkbmwgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK2RubCAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorZG5sICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitkbmwgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCitkbmwgIHdpdGggdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZQorZG5sICBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKworCitkbmwgIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGNvZGUgYXR0ZW1wdHMgdG8ga2VlcCB0aGUgY2FsbC9yZXR1cm4KK2RubCAgcHJlZGljdGlvbiBzdGFjayB2YWxpZCwgYnV0IG1hdGNoaW5nIGNhbGxzIGFuZCByZXR1cm5zLgorCitpbmNsdWRlKGBjb25maWcubTQnKQorCisKK0MgaW50IGNhbGxpbmdfY29udmVudGlvbnMgKC4uLik7CitDCitDIFRoZSBnbG9iYWwgdmFyaWFibGUgImNhbGxpbmdfY29udmVudGlvbnNfZnVuY3Rpb24iIGlzIHRoZSBmdW5jdGlvbiB0bworQyBjYWxsLCB3aXRoIHRoZSBhcmd1bWVudHMgYXMgcGFzc2VkIGhlcmUuCisKK2RlZmluZShgV0FOVF9DQUxMRUVfU0FWRVMnLAlldmFsKDQqMCkpCitkZWZpbmUoYFNBVkVfQ0FMTEVFX1NBVkVTJywJZXZhbCg0KjgpKQorZGVmaW5lKGBSRVRBRERSJywJCWV2YWwoNCoxNikpCitkZWZpbmUoYEdPVF9DQUxMRUVfU0FWRVMnLAlldmFsKDQqMTcpKQorZGVmaW5lKGBKVU5LX1BBUkFNUycsCQlldmFsKDQqMjUpKQorCisJVEVYVAorCUFMSUdOKDMyKQorUFJPTE9HVUUoY2FsbGluZ19jb252ZW50aW9ucykKKwlMRUEoCXIxMiwgY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXMpCisKKwlDIFByZXNlcnZlIGNhbGxlZS1zYXZlcyByZWdpc3RlcnMsIGluY2x1ZGluZyB0aGUgbGluayByZWdpc3RlciByMTQKKwlhZGQJcjEyLCByMTIsICNTQVZFX0NBTExFRV9TQVZFUworCXN0bQlyMTIsIHtyNC1yMTEscjE0fQorCXN1YglyMTIsIHIxMiwgI1NBVkVfQ0FMTEVFX1NBVkVTCisKKwlDIFB1dCBjaG9zZW4ganVuayBpbnRvIGNhbGxlZS1zYXZlcyByZWdpc3RlcnMKKwlhZGQJcjEyLCByMTIsICNXQU5UX0NBTExFRV9TQVZFUworCWxkbQlyMTIsIHtyNC1yMTF9CisJc3ViCXIxMiwgcjEyLCAjV0FOVF9DQUxMRUVfU0FWRVMKKworCUMgTm8gY2FsbGVlLXNhdmVzIHJlZ2lzdGVycyBvbiBhcm0gZXhjZXB0IHIxMiBhbmQgcGFyYW1ldGVyIHJlZ2lzdGVycworCUMKKworCUMgTWFrZSB0aGUgYWN0dWFsIGNhbGwKKwlMRUEoCXIxMiwgY2FsbGluZ19jb252ZW50aW9uc19mdW5jdGlvbikKKwlsZHIJcjEyLCBbcjEyXQorCW1vdglyMTQsIHBjCisJcmV0dXJuCXIxMgorCisJTEVBKAlyMTIsIGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzKQorCisJQyBTYXZlIGNhbGxlZS1zYXZlcyByZWdpc3RlcnMgYWZ0ZXIgY2FsbAorCWFkZAlyMTIsIHIxMiwgI0dPVF9DQUxMRUVfU0FWRVMKKwlzdG0JcjEyLCB7cjQtcjExfQorCXN1YglyMTIsIHIxMiwgI0dPVF9DQUxMRUVfU0FWRVMKKworCUMgUmVzdG9yZSBjYWxsZWUtc2F2ZXMgcmVnaXN0ZXJzLCBpbmNsdWRpbmcgdGhlIGxpbmsgcmVnaXN0ZXIgcjE0CisJYWRkCXIxMiwgcjEyLCAjU0FWRV9DQUxMRUVfU0FWRVMKKwlsZG0JcjEyLCB7cjQtcjExLHIxNH0KKwlzdWIJcjEyLCByMTIsICNTQVZFX0NBTExFRV9TQVZFUworCisJQyBPdmVyd3JpdGUgcGFyYW1ldGVyIHJlZ2lzdGVycy4gIE5vdGUgdGhhdCB3ZSBvdmVyd3JpdGUgcjEsIHdoaWNoCisJQyBjb3VsZCBob2xkIG9uZSBoYWxmIG9mIGEgNjQtYml0IHJldHVybiB2YWx1ZSwgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoYXQKKwlDIGluIEdNUC4KKwlhZGQJcjEyLCByMTIsICNKVU5LX1BBUkFNUworCWxkbQlyMTIsIHtyMS1yM30KKworCXJldHVybglyMTQKK0VQSUxPR1VFKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2FybTMyY2hlY2suYyBiL3Rlc3RzL2FybTMyY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTlmODZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYXJtMzJjaGVjay5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIEFSTTMyIGNhbGxpbmcgY29udmVudGlvbnMgY2hlY2tpbmcuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA0LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogVmVjdG9yIGlmIGNvbnN0YW50cyBhbmQgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KK21wX2xpbWJfdCBjYWxsaW5nX2NvbnZlbnRpb25zX3ZhbHVlc1syOV0gPQoreworICAweDEyMzQ1Njc4LAkvKiAgMCB3YW50X3I0ICovCisgIDB4ODc2NTQzMjEsCS8qICAxIHdhbnRfcjUgKi8KKyAgMHg4OUFCQ0RFRiwJLyogIDIgd2FudF9yNiAqLworICAweEZFRENCQTk4LAkvKiAgMyB3YW50X3I3ICovCisgIDB4REVBREJFRUYsCS8qICA0IHdhbnRfcjggKi8KKyAgMHhCQURFQ0FGRSwJLyogIDUgd2FudF9yOSAqLworICAweEZGRUVERENDLAkvKiAgNiB3YW50X3IxMCAqLworICAweEJCQUE5OTg4LAkvKiAgNyB3YW50X3IxMSAqLworCisgIDB4MDAwMDAwMDAsCS8qICA4IHNhdmVfcjQgKi8KKyAgMHgwMDAwMDAwMCwJLyogIDkgc2F2ZV9yNSAqLworICAweDAwMDAwMDAwLAkvKiAxMCBzYXZlX3I2ICovCisgIDB4MDAwMDAwMDAsCS8qIDExIHNhdmVfcjcgKi8KKyAgMHgwMDAwMDAwMCwJLyogMTIgc2F2ZV9yOCAqLworICAweDAwMDAwMDAwLAkvKiAxMyBzYXZlX3I5ICovCisgIDB4MDAwMDAwMDAsCS8qIDE0IHNhdmVfcjEwICovCisgIDB4MDAwMDAwMDAsCS8qIDE1IHNhdmVfcjExICovCisgIDB4MDAwMDAwMDAsCS8qIDE2IHNhdmVfcjE0ICovCisKKyAgMHgwMDAwMDAwMCwJLyogMTcgZ290X3I0ICovCisgIDB4MDAwMDAwMDAsCS8qIDE4IGdvdF9yNSAqLworICAweDAwMDAwMDAwLAkvKiAxOSBnb3RfcjYgKi8KKyAgMHgwMDAwMDAwMCwJLyogMjAgZ290X3I3ICovCisgIDB4MDAwMDAwMDAsCS8qIDIxIGdvdF9yOCAqLworICAweDAwMDAwMDAwLAkvKiAyMiBnb3RfcjkgKi8KKyAgMHgwMDAwMDAwMCwJLyogMjMgZ290X3IxMCAqLworICAweDAwMDAwMDAwLAkvKiAyNCBnb3RfcjExICovCisKKyAgMHgwMDExMjIzMywJLyogMjUganVua19yMCAqLworICAweDQ0NTU2Njc3LAkvKiAyNiBqdW5rX3IxICovCisgIDB4MTIzNDQzMjEsCS8qIDI3IGp1bmtfcjIgKi8KKyAgMHg1Njc4ODc2NSwJLyogMjgganVua19yMyAqLworfTsKKworLyogSW5kZXggc3RhcnRzIGZvciB2YXJpb3VzIHJlZ2lvbnMgaW4gYWJvdmUgdmVjdG9yLiAgKi8KKyNkZWZpbmUgV0FOVF9DQUxMRUVfU0FWRVMJMAorI2RlZmluZSBTQVZFX0NBTExFRV9TQVZFUwk4CisjZGVmaW5lIFJFVEFERFIJCQkxNgorI2RlZmluZSBHT1RfQ0FMTEVFX1NBVkVTCTE3CisjZGVmaW5lIEpVTktfUEFSQU1TCQkyNQorCisvKiBSZXR1cm4gMSBpZiBvaywgMCBpZiBub3QgKi8KKworaW50CitjYWxsaW5nX2NvbnZlbnRpb25zX2NoZWNrICh2b2lkKQoreworICBjb25zdCBjaGFyICAqaGVhZGVyID0gIlZpb2xhdGVkIGNhbGxpbmcgY29udmVudGlvbnM6XG4iOworICBpbnQgIHJldCA9IDE7CisgIGludCBpOworCisjZGVmaW5lIENIRUNLKGNhbGxyZWcsIHJlZ251bSwgdmFsdWUpCQkJCQlcCisgIGlmIChjYWxscmVnICE9IHZhbHVlKQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIHByaW50ZiAoIiVzICAgciVkCWdvdCAweCUwOGxYIHdhbnQgMHglMDhsWFxuIiwJCQlcCisJICAgICAgaGVhZGVyLCByZWdudW0sIGNhbGxyZWcsIHZhbHVlKTsJCQkJXAorICAgICAgaGVhZGVyID0gIiI7CQkJCQkJCVwKKyAgICAgIHJldCA9IDA7CQkJCQkJCQlcCisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgQ0hFQ0sgKGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzW0dPVF9DQUxMRUVfU0FWRVMgKyBpXSwKKwkgICAgIGkgKyA0LAorCSAgICAgY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXNbV0FOVF9DQUxMRUVfU0FWRVMgKyBpXSk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvY2xvY2FsZS5jIGIvdGVzdHMvY3h4L2Nsb2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdjMzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L2Nsb2NhbGUuYwpAQCAtMCwwICsxLDY2IEBACisvKiBNYW5pcHVsYWJsZSBsb2NhbGVjb252IGFuZCBubF9sYW5naW5mby4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfTkxfVFlQRVNfSAorI2luY2x1ZGUgPG5sX3R5cGVzLmg+ICAvKiBmb3IgbmxfaXRlbSAqLworI2VuZGlmCisKKyNpZiBIQVZFX0xBTkdJTkZPX0gKKyNpbmNsdWRlIDxsYW5naW5mby5oPiAgLyogZm9yIG5sX2xhbmdpbmZvICovCisjZW5kaWYKKworI2lmIEhBVkVfTE9DQUxFX0gKKyNpbmNsdWRlIDxsb2NhbGUuaD4gICAgLyogZm9yIGxjb252ICovCisjZW5kaWYKKworCisvKiBSZXBsYWNlIHRoZSBsaWJjIGxvY2FsZWNvbnYgYW5kIG5sX2xhbmdpbmZvIHdpdGggb25lcyB3ZSBjYW4gbWFuaXB1bGF0ZS4KKworICAgVGhpcyBpcyBkb25lIGluIGEgQyBmaWxlIHNpbmNlIGlmIGl0IHdhcyBpbiBhIEMrKyBmaWxlIHRoZW4gd2UnZCBoYXZlIHRvCisgICBtYXRjaCB0aGUgInRocm93IiBvciBsYWNrIHRoZXJlb2YgZGVjbGFyZWQgZm9yIGxvY2FsZWNvbnYgaW4gPGxvY2FsZS5oPi4KKyAgIGcrKyAzLjIgZ2l2ZXMgYW4gZXJyb3IgYWJvdXQgbWlzbWF0Y2hlZCB0aHJvd3MgdW5kZXIgIi1wZWRhbnRpYyIsIG90aGVyCisgICBDKysgY29tcGlsZXJzIG1heSB2ZXJ5IHBvc3NpYmx5IGRvIHNvIHRvby4gICovCisKK2V4dGVybiBjaGFyIHBvaW50X3N0cmluZ1tdOworCisjaWYgSEFWRV9MT0NBTEVDT05WICYmICEgZGVmaW5lZCBfX01JTkdXMzJfXworc3RydWN0IGxjb252ICoKK2xvY2FsZWNvbnYgKHZvaWQpCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9fR0xJQkNfXworICB0aHJvdygpCisjZW5kaWYKK3sKKyAgc3RhdGljIHN0cnVjdCBsY29udiAgbDsKKyAgbC5kZWNpbWFsX3BvaW50ID0gcG9pbnRfc3RyaW5nOworICByZXR1cm4gJmw7Cit9CisjZW5kaWYKKworI2lmIEhBVkVfTkxfTEFOR0lORk8KK2NoYXIgKgorbmxfbGFuZ2luZm8gKG5sX2l0ZW0gbikKKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIGRlZmluZWQgX19HTElCQ19fCisgIHRocm93KCkKKyNlbmRpZgoreworICByZXR1cm4gcG9pbnRfc3RyaW5nOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1hc3NpZ24uY2MgYi90ZXN0cy9jeHgvdC1hc3NpZ24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExYjBkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWFzc2lnbi5jYwpAQCAtMCwwICsxLDYwMyBAQAorLyogVGVzdCBtcCpfY2xhc3MgYXNzaWdubWVudCBvcGVyYXRvcnMuCisKK0NvcHlyaWdodCAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImdtcHh4LmgiCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6aW52YWxpZF9hcmd1bWVudDsKKworCit2b2lkCitjaGVja19tcHogKHZvaWQpCit7CisgIC8vIG9wZXJhdG9yPShjb25zdCBtcHpfY2xhc3MgJikKKyAgeworICAgIG1wel9jbGFzcyBhKDEyMyksIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IG9wZXJhdG9yPShjb25zdCBfX2dtcF9leHByPFQsIFU+ICYpCisgIC8vIG5vdCB0ZXN0ZWQgaGVyZSwgc2VlIHQtdW5hcnkuY2MsIHQtYmluYXJ5LmNjCisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBjaGFyKQorICB7CisgICAgc2lnbmVkIGNoYXIgYSA9IC0xMjc7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTI3KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPSh1bnNpZ25lZCBjaGFyKQorICB7CisgICAgdW5zaWduZWQgY2hhciBhID0gMjU1OworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMjU1KTsKKyAgfQorCisgIC8vIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgY2hhciwgbWFjaGluZSBkZXBlbmRlbnQKKyAgeworICAgIG1wel9jbGFzcyBhOworICAgIGEgPSAnQSc7IEFTU0VSVF9BTFdBWVMoYSA9PSA2NSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhOworICAgIGEgPSAneic7IEFTU0VSVF9BTFdBWVMoYSA9PSAxMjIpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBpbnQpCisgIHsKKyAgICBzaWduZWQgaW50IGEgPSAwOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IC0xMjM7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gMzI3Njc7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAzMjc2Nyk7CisgIH0KKworICAvLyBvcGVyYXRvcj0odW5zaWduZWQgaW50KQorICB7CisgICAgdW5zaWduZWQgaW50IGEgPSA2NTUzNXU7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSA2NTUzNXUpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBzaG9ydCBpbnQpCisgIHsKKyAgICBzaWduZWQgc2hvcnQgaW50IGEgPSAtMTIzNDU7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzNDUpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHVuc2lnbmVkIHNob3J0IGludCkKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBhID0gNTQzMjF1OworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gNTQzMjF1KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShzaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBzaWduZWQgbG9uZyBpbnQgYSA9IC0xMjM0NTY3ODkwTDsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBvcGVyYXRvcj0odW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBhID0gMzQ1Njc4OTAxMlVMOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMzQ1Njc4OTAxMlVMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShmbG9hdCkKKyAgeworICAgIGZsb2F0IGEgPSAxMjMuMDsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMyk7CisgIH0KKworICAvLyBvcGVyYXRvcj0oZG91YmxlKQorICB7CisgICAgZG91YmxlIGEgPSAwLjA7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorICB7CisgICAgZG91YmxlIGEgPSAtMTIuMzc1OworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyKTsKKyAgfQorICB7CisgICAgZG91YmxlIGEgPSA2Ljc4OWUrMzsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDY3ODkpOworICB9CisgIHsKKyAgICBkb3VibGUgYSA9IDkuMzc1ZS0xOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKworICAvLyBvcGVyYXRvcj0obG9uZyBkb3VibGUpCisgIC8vIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQKKworICAvLyBvcGVyYXRvcj0oY29uc3QgY2hhciAqKQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICIxMjM0NTY3ODkwIjsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmKQorICB7CisgICAgc3RyaW5nIGEoIjEyMzQ1Njc4OTAiKTsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShjb25zdCBjaGFyICopIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IGNoYXIgKmEgPSAiYWJjIjsKKyAgICAgIG1wel9jbGFzcyBiOworICAgICAgYiA9IGE7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICYpIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBhKCJkZWYiKTsKKyAgICAgIG1wel9jbGFzcyBiOworICAgICAgYiA9IGE7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gc3dhcChtcHpfY2xhc3MgJikKKyAgeworICAgIG1wel9jbGFzcyBhKDEyMyk7CisgICAgbXB6X2NsYXNzIGIoNDU2KTsKKyAgICBhLnN3YXAoYik7CisgICAgYS5zd2FwKGEpOworICAgIEFTU0VSVF9BTFdBWVMoYSA9PSA0NTYpOworICAgIEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gc3dhcChtcHpfY2xhc3MgJiwgbXB6X2NsYXNzICYpCisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjMpOworICAgIG1wel9jbGFzcyBiKDQ1Nik7CisgICAgOjpzd2FwKGEsIGIpOworICAgIDo6c3dhcChhLCBhKTsKKyAgICBBU1NFUlRfQUxXQVlTKGEgPT0gNDU2KTsKKyAgICBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzKTsKKyAgfQorICB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIG1wel9jbGFzcyBhKDEyMyk7CisgICAgbXB6X2NsYXNzIGIoNDU2KTsKKyAgICBzd2FwKGEsIGIpOworICAgIHN3YXAoYSwgYSk7CisgICAgQVNTRVJUX0FMV0FZUyhhID09IDQ1Nik7CisgICAgQVNTRVJUX0FMV0FZUyhiID09IDEyMyk7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBxICh2b2lkKQoreworICAvLyBvcGVyYXRvcj0oY29uc3QgbXBxX2NsYXNzICYpCisgIHsKKyAgICBtcHFfY2xhc3MgYSgxLCAyKSwgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDAuNSk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gb3BlcmF0b3I9KGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJikKKyAgLy8gbm90IHRlc3RlZCBoZXJlLCBzZWUgdC11bmFyeS5jYywgdC1iaW5hcnkuY2MKKworICAvLyBvcGVyYXRvcj0oc2lnbmVkIGNoYXIpCisgIHsKKyAgICBzaWduZWQgY2hhciBhID0gLTEyNzsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjcpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHVuc2lnbmVkIGNoYXIpCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGEgPSAyNTU7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAyNTUpOworICB9CisKKyAgLy8gZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCBjaGFyLCBtYWNoaW5lIGRlcGVuZGVudAorICB7CisgICAgbXBxX2NsYXNzIGE7CisgICAgYSA9ICdBJzsgQVNTRVJUX0FMV0FZUyhhID09IDY1KTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzIGE7CisgICAgYSA9ICd6JzsgQVNTRVJUX0FMV0FZUyhhID09IDEyMik7CisgIH0KKworICAvLyBvcGVyYXRvcj0oc2lnbmVkIGludCkKKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IDA7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gLTEyMzsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjMpOworICB9CisgIHsKKyAgICBzaWduZWQgaW50IGEgPSAzMjc2NzsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDMyNzY3KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPSh1bnNpZ25lZCBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgYSA9IDY1NTM1dTsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDY1NTM1dSk7CisgIH0KKworICAvLyBvcGVyYXRvcj0oc2lnbmVkIHNob3J0IGludCkKKyAgeworICAgIHNpZ25lZCBzaG9ydCBpbnQgYSA9IC0xMjM0NTsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NSk7CisgIH0KKworICAvLyBvcGVyYXRvcj0odW5zaWduZWQgc2hvcnQgaW50KQorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGEgPSA1NDMyMXU7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSA1NDMyMXUpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHNpZ25lZCBsb25nIGludCBhID0gLTEyMzQ1Njc4OTBMOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPSh1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGEgPSAzNDU2Nzg5MDEyVUw7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAzNDU2Nzg5MDEyVUwpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KGZsb2F0KQorICB7CisgICAgZmxvYXQgYSA9IDEyMy4wOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShkb3VibGUpCisgIHsKKyAgICBkb3VibGUgYSA9IDAuMDsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDApOworICB9CisgIHsKKyAgICBkb3VibGUgYSA9IC0xMi4zNzU7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIuMzc1KTsKKyAgfQorICB7CisgICAgZG91YmxlIGEgPSA2Ljc4OWUrMzsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDY3ODkpOworICB9CisgIHsKKyAgICBkb3VibGUgYSA9IDkuMzc1ZS0xOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMC45Mzc1KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShsb25nIGRvdWJsZSkKKyAgLy8gY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAorCisgIC8vIG9wZXJhdG9yPShjb25zdCBjaGFyICopCisgIHsKKyAgICBjb25zdCBjaGFyICphID0gIjEyMzQ1Njc4OTAiOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDU2Nzg5MEwpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICYpCisgIHsKKyAgICBzdHJpbmcgYSgiMTIzNDU2Nzg5MCIpOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDU2Nzg5MEwpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KGNvbnN0IGNoYXIgKikgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgY2hhciAqYSA9ICJhYmMiOworICAgICAgbXBxX2NsYXNzIGI7CisgICAgICBiID0gYTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAoaW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICB9CisgIH0KKworICAvLyBvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcgJikgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgc3RyaW5nIGEoImRlZiIpOworICAgICAgbXBxX2NsYXNzIGI7CisgICAgICBiID0gYTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAoaW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICB9CisgIH0KKworICAvLyBzd2FwKG1wcV9jbGFzcyAmKQorICB7CisgICAgbXBxX2NsYXNzIGEoMywgMik7CisgICAgbXBxX2NsYXNzIGIoLTEsIDQpOworICAgIGEuc3dhcChiKTsKKyAgICBhLnN3YXAoYSk7CisgICAgQVNTRVJUX0FMV0FZUyhhID09IC0uMjUpOworICAgIEFTU0VSVF9BTFdBWVMoYiA9PSAxLjUpOworICB9CisKKyAgLy8gc3dhcChtcHFfY2xhc3MgJiwgbXBxX2NsYXNzICYpCisgIHsKKyAgICBtcHFfY2xhc3MgYSgzLCAyKTsKKyAgICBtcHFfY2xhc3MgYigtMSwgNCk7CisgICAgOjpzd2FwKGEsIGIpOworICAgIDo6c3dhcChhLCBhKTsKKyAgICBBU1NFUlRfQUxXQVlTKGEgPT0gLS4yNSk7CisgICAgQVNTRVJUX0FMV0FZUyhiID09IDEuNSk7CisgIH0KKyAgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBtcHFfY2xhc3MgYSgzLCAyKTsKKyAgICBtcHFfY2xhc3MgYigtMSwgNCk7CisgICAgc3dhcChhLCBiKTsKKyAgICBzd2FwKGEsIGEpOworICAgIEFTU0VSVF9BTFdBWVMoYSA9PSAtLjI1KTsKKyAgICBBU1NFUlRfQUxXQVlTKGIgPT0gMS41KTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcGYgKHZvaWQpCit7CisgIC8vIG9wZXJhdG9yPShjb25zdCBtcGZfY2xhc3MgJikKKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyksIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IG9wZXJhdG9yPShjb25zdCBfX2dtcF9leHByPFQsIFU+ICYpCisgIC8vIG5vdCB0ZXN0ZWQgaGVyZSwgc2VlIHQtdW5hcnkuY2MsIHQtYmluYXJ5LmNjCisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBjaGFyKQorICB7CisgICAgc2lnbmVkIGNoYXIgYSA9IC0xMjc7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTI3KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPSh1bnNpZ25lZCBjaGFyKQorICB7CisgICAgdW5zaWduZWQgY2hhciBhID0gMjU1OworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMjU1KTsKKyAgfQorCisgIC8vIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgY2hhciwgbWFjaGluZSBkZXBlbmRlbnQKKyAgeworICAgIG1wZl9jbGFzcyBhOworICAgIGEgPSAnQSc7IEFTU0VSVF9BTFdBWVMoYSA9PSA2NSk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhOworICAgIGEgPSAneic7IEFTU0VSVF9BTFdBWVMoYSA9PSAxMjIpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBpbnQpCisgIHsKKyAgICBzaWduZWQgaW50IGEgPSAwOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IC0xMjM7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gMzI3Njc7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAzMjc2Nyk7CisgIH0KKworICAvLyBvcGVyYXRvcj0odW5zaWduZWQgaW50KQorICB7CisgICAgdW5zaWduZWQgaW50IGEgPSA2NTUzNXU7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSA2NTUzNXUpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHNpZ25lZCBzaG9ydCBpbnQpCisgIHsKKyAgICBzaWduZWQgc2hvcnQgaW50IGEgPSAtMTIzNDU7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzNDUpOworICB9CisKKyAgLy8gb3BlcmF0b3I9KHVuc2lnbmVkIHNob3J0IGludCkKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBhID0gNTQzMjF1OworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gNTQzMjF1KTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShzaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBzaWduZWQgbG9uZyBpbnQgYSA9IC0xMjM0NTY3ODkwTDsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBvcGVyYXRvcj0odW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBhID0gMzQ1Njc4OTAxMlVMOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gMzQ1Njc4OTAxMlVMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShmbG9hdCkKKyAgeworICAgIGZsb2F0IGEgPSAxMjMuMDsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMyk7CisgIH0KKworICAvLyBvcGVyYXRvcj0oZG91YmxlKQorICB7CisgICAgZG91YmxlIGEgPSAwLjA7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorICB7CisgICAgZG91YmxlIGEgPSAtMTIuMzc1OworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyLjM3NSk7CisgIH0KKyAgeworICAgIGRvdWJsZSBhID0gNi43ODllKzM7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGE7IEFTU0VSVF9BTFdBWVMoYiA9PSA2Nzg5KTsKKyAgfQorICB7CisgICAgZG91YmxlIGEgPSA5LjM3NWUtMTsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDAuOTM3NSk7CisgIH0KKworICAvLyBvcGVyYXRvcj0obG9uZyBkb3VibGUpCisgIC8vIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQKKworICAvLyBvcGVyYXRvcj0oY29uc3QgY2hhciAqKQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICIxMjM0NTY3ODkwIjsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmKQorICB7CisgICAgc3RyaW5nIGEoIjEyMzQ1Njc4OTAiKTsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gYTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPShjb25zdCBjaGFyICopIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IGNoYXIgKmEgPSAiYWJjIjsKKyAgICAgIG1wZl9jbGFzcyBiOworICAgICAgYiA9IGE7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICYpIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBhKCJkZWYiKTsKKyAgICAgIG1wZl9jbGFzcyBiOworICAgICAgYiA9IGE7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gc3dhcChtcGZfY2xhc3MgJikKKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgbXBmX2NsYXNzIGIoNDU2KTsKKyAgICBhLnN3YXAoYik7CisgICAgYS5zd2FwKGEpOworICAgIEFTU0VSVF9BTFdBWVMoYSA9PSA0NTYpOworICAgIEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gc3dhcChtcGZfY2xhc3MgJiwgbXBmX2NsYXNzICYpCisgIHsKKyAgICBtcGZfY2xhc3MgYSgxMjMpOworICAgIG1wZl9jbGFzcyBiKDQ1Nik7CisgICAgOjpzd2FwKGEsIGIpOworICAgIDo6c3dhcChhLCBhKTsKKyAgICBBU1NFUlRfQUxXQVlTKGEgPT0gNDU2KTsKKyAgICBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzKTsKKyAgfQorICB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgbXBmX2NsYXNzIGIoNDU2KTsKKyAgICBzd2FwKGEsIGIpOworICAgIHN3YXAoYSwgYSk7CisgICAgQVNTRVJUX0FMV0FZUyhhID09IDQ1Nik7CisgICAgQVNTRVJUX0FMV0FZUyhiID09IDEyMyk7CisgIH0KK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0KCk7CisKKyAgY2hlY2tfbXB6KCk7CisgIGNoZWNrX21wcSgpOworICBjaGVja19tcGYoKTsKKworICB0ZXN0c19lbmQoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1iaW5hcnkuY2MgYi90ZXN0cy9jeHgvdC1iaW5hcnkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3YWRmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWJpbmFyeS5jYwpAQCAtMCwwICsxLDQ2NSBAQAorLyogVGVzdCBtcCpfY2xhc3MgYmluYXJ5IGV4cHJlc3Npb25zLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA4LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgImdtcHh4LmgiCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK3ZvaWQKK2NoZWNrX21weiAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBtcHpfY2xhc3MgYyhhICsgYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAzKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMyksIGIoNCk7CisgICAgbXB6X2NsYXNzIGM7CisgICAgYyA9IGEgKiBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gMTIpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSg1KSwgYigzKTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAlIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAyKTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBVLCBPcD4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSk7CisgICAgc2lnbmVkIGludCBiID0gMzsKKyAgICBtcHpfY2xhc3MgYyhhIC0gYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKC04KTsKKyAgICB1bnNpZ25lZCBpbnQgYiA9IDI7CisgICAgbXB6X2NsYXNzIGM7CisgICAgYyA9IGEgLyBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTQpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKTsKKyAgICBkb3VibGUgYiA9IDMuMDsKKyAgICBtcHpfY2xhc3MgYyhhICsgYik7IEFTU0VSVF9BTFdBWVMoYyA9PSA1KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoNCk7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGEgKyAwOyBBU1NFUlRfQUxXQVlTKGIgPT0gNCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8VSwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDMpOworICAgIHNpZ25lZCBpbnQgYiA9IDk7CisgICAgbXB6X2NsYXNzIGMoYiAvIGEpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMyk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxWLCBXPiwgT3A+ID4KKyAgLy8gdHlwZSBvZiByZXN1bHQgY2FuJ3QgYmUgbXB6CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIFcsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VSwgVj4sIF9fZ21wX2V4cHI8VCwgVz4sIE9wPiA+CisgIC8vIHR5cGUgb2YgcmVzdWx0IGNhbid0IGJlIG1wegorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBfX2dtcF9leHByPFQsIFU+LCBPcD4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMyksIGIoNCk7CisgICAgbXB6X2NsYXNzIGMoYSAqICgtYikpOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTEyKTsKKyAgICBjID0gYyAqICgtYik7IEFTU0VSVF9BTFdBWVMoYyA9PSA0OCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDMpLCBiKDIpLCBjKDEpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSAoYSAlIGIpICsgYzsgQVNTRVJUX0FMV0FZUyhkID09IDIpOworICAgIGQgPSAoYSAlIGIpICsgZDsgQVNTRVJUX0FMV0FZUyhkID09IDMpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIFYsIE9wPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgtNSk7CisgICAgdW5zaWduZWQgaW50IGIgPSAyOworICAgIG1wel9jbGFzcyBjKCgtYSkgPDwgYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAyMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDUpLCBiKC00KTsKKyAgICBzaWduZWQgaW50IGMgPSAzOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSAoYSAqIGIpID4+IGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMyk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8VSwgX19nbXBfZXhwcjxULCBWPiwgT3A+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDQpOworICAgIGRvdWJsZSBjID0gNjsKKyAgICBtcHpfY2xhc3MgZChjIC8gKGEgLSBiKSk7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDMpLCBiKDIpOworICAgIGRvdWJsZSBjID0gMTsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYyArIChhICsgYik7IEFTU0VSVF9BTFdBWVMoZCA9PSA2KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBXLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFYsIFc+LCBPcD4gPgorICAvLyB0eXBlIG9mIHJlc3VsdCBjYW4ndCBiZSBtcHoKKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxVLCBWPiwgX19nbXBfZXhwcjxULCBXPiwgT3A+ID4KKyAgLy8gdHlwZSBvZiByZXN1bHQgY2FuJ3QgYmUgbXB6CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8VCwgVj4sIE9wPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgzKSwgYig1KSwgYyg3KTsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gKGEgLSBiKSAqICgtYyk7IEFTU0VSVF9BTFdBWVMoZCA9PSAxNCk7CisgICAgZCA9IChiIC0gZCkgKiAoLWEpOyBBU1NFUlRfQUxXQVlTKGQgPT0gMjcpOworICAgIGQgPSAoYSAtIGIpICogKC1kKTsgQVNTRVJUX0FMV0FZUyhkID09IDU0KTsKKyAgfQorCisgIHsKKyAgICBtcHpfY2xhc3MgYSgweGNhZmUpLCBiKDB4YmVlZiksIGMsIHdhbnQ7CisgICAgYyA9IGEgJiBiOyBBU1NFUlRfQUxXQVlTIChjID09IDB4OGFlZSk7CisgICAgYyA9IGEgfCBiOyBBU1NFUlRfQUxXQVlTIChjID09IDB4ZmVmZik7CisgICAgYyA9IGEgXiBiOyBBU1NFUlRfQUxXQVlTIChjID09IDB4NzQxMSk7CisgICAgYyA9IGEgJiAweGJlZWY7IEFTU0VSVF9BTFdBWVMgKGMgPT0gMHg4YWVlKTsKKyAgICBjID0gYSB8IDB4YmVlZjsgQVNTRVJUX0FMV0FZUyAoYyA9PSAweGZlZmYpOworICAgIGMgPSBhIF4gMHhiZWVmOyBBU1NFUlRfQUxXQVlTIChjID09IDB4NzQxMSk7CisgICAgYyA9IGEgJiAtMHhiZWVmOyBBU1NFUlRfQUxXQVlTIChjID09IDB4NDAxMCk7CisgICAgYyA9IGEgfCAtMHhiZWVmOyBBU1NFUlRfQUxXQVlTIChjID09IC0weDM0MDEpOworICAgIGMgPSBhIF4gLTB4YmVlZjsgQVNTRVJUX0FMV0FZUyAoYyA9PSAtMHg3NDExKTsKKyAgICBjID0gYSAmIDQ4ODc5LjA7IEFTU0VSVF9BTFdBWVMgKGMgPT0gMHg4YWVlKTsKKyAgICBjID0gYSB8IDQ4ODc5LjA7IEFTU0VSVF9BTFdBWVMgKGMgPT0gMHhmZWZmKTsKKyAgICBjID0gYSBeIDQ4ODc5LjA7IEFTU0VSVF9BTFdBWVMgKGMgPT0gMHg3NDExKTsKKworICAgIGMgPSBhIHwgMTI2NzY1MDYwMDIyODIyOTQwMTQ5NjcwMzIwNTM3Ni4wOyAvLyAyXjEwMAorICAgIHdhbnQgPSAiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwY2FmZSI7CisgICAgQVNTRVJUX0FMV0FZUyAoYyA9PSB3YW50KTsKKyAgfQorCit9CisKK3ZvaWQKK2NoZWNrX21wcSAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxLCAyKSwgYigzLCA0KTsKKyAgICBtcHFfY2xhc3MgYyhhICsgYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAxLjI1KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBVLCBPcD4gPgorICB7CisgICAgbXBxX2NsYXNzIGEoMSwgMik7CisgICAgc2lnbmVkIGludCBiID0gMzsKKyAgICBtcHFfY2xhc3MgYyhhIC0gYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMi41KTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzIGEoMSwgMik7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IGEgKyAwOyBBU1NFUlRfQUxXQVlTKGIgPT0gMC41KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxVLCBfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgorICB7CisgICAgbXBxX2NsYXNzIGEoMiwgMyk7CisgICAgc2lnbmVkIGludCBiID0gNDsKKyAgICBtcHFfY2xhc3MgYzsKKyAgICBjID0gYiAvIGE7IEFTU0VSVF9BTFdBWVMoYyA9PSA2KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBfX2dtcF9leHByPFUsIFY+LCBPcD4gPgorICB7CisgICAgbXBxX2NsYXNzIGEoMSwgMik7CisgICAgbXB6X2NsYXNzIGIoMSk7CisgICAgbXBxX2NsYXNzIGMoYSArIGIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMS41KTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzIGEoMiwgMyk7CisgICAgbXB6X2NsYXNzIGIoMSk7CisgICAgZG91YmxlIGMgPSAyLjA7CisgICAgbXBxX2NsYXNzIGQ7CisgICAgZCA9IGEgKiAoYiArIGMpOyBBU1NFUlRfQUxXQVlTKGQgPT0gMik7CisgICAgZCA9IGQgKiAoYiArIGMpOyBBU1NFUlRfQUxXQVlTKGQgPT0gNik7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxVLCBWPiwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDIsIDMpOworICAgIG1wel9jbGFzcyBiKDQpOworICAgIG1wcV9jbGFzcyBjKGIgLyBhKTsgQVNTRVJUX0FMV0FZUyhjID09IDYpOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgyLCAzKTsKKyAgICBtcHpfY2xhc3MgYigxKSwgYyg0KTsKKyAgICBtcHFfY2xhc3MgZDsKKyAgICBkID0gKGIgLSBjKSAqIGE7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMik7CisgICAgZCA9IChiIC0gYykgKiBkOyBBU1NFUlRfQUxXQVlTKGQgPT0gNik7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBUPiwgX19nbXBfZXhwcjxULCBVPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDQpOworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBhICogKC1iKTsgQVNTRVJUX0FMV0FZUyhjID09IC0wLjI1KTsKKyAgICBhID0gYSAqICgtYik7IEFTU0VSVF9BTFdBWVMoYSA9PSAtMC4yNSk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDIsIDMpLCBjKDEsIDQpOworICAgIG1wcV9jbGFzcyBkKChhIC8gYikgKyBjKTsgQVNTRVJUX0FMV0FZUyhkID09IDAuNzUpOworICAgIGMgPSAoYSAvIGIpICsgYzsgQVNTRVJUX0FMV0FZUyhjID09IDAuNzUpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIFYsIE9wPiA+CisgIHsKKyAgICBtcHFfY2xhc3MgYSgzLCA4KTsKKyAgICB1bnNpZ25lZCBpbnQgYiA9IDQ7CisgICAgbXBxX2NsYXNzIGMoKC1hKSA8PCBiKTsgQVNTRVJUX0FMV0FZUyhjID09IC02KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxVLCBfX2dtcF9leHByPFQsIFY+LCBPcD4gPgorICB7CisgICAgbXBxX2NsYXNzIGEoMSwgMiksIGIoMSwgNCk7CisgICAgZG91YmxlIGMgPSA2LjA7CisgICAgbXBxX2NsYXNzIGQ7CisgICAgZCA9IGMgLyAoYSArIGIpOyBBU1NFUlRfQUxXQVlTKGQgPT0gOCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxWLCBXPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDIpLCBiKDEsIDQpOworICAgIG1wel9jbGFzcyBjKDEpOworICAgIG1wcV9jbGFzcyBkKChhICsgYikgLSBjKTsgQVNTRVJUX0FMV0FZUyhkID09IC0wLjI1KTsKKyAgICBkID0gKGEgKyBkKSAtIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMC43NSk7CisgICAgZCA9IChhICsgZCkgLSBkLmdldF9udW0oKTsgQVNTRVJUX0FMV0FZUyhkID09IDIuNzUpOworICAgIGQgPSAoMiAqIGQpICogZC5nZXRfZGVuKCk7IEFTU0VSVF9BTFdBWVMoZCA9PSAyMik7CisgICAgZCA9IChiICogZCkgLyAtZC5nZXRfbnVtKCk7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMC4yNSk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDIpOworICAgIG1wel9jbGFzcyBjKDIpLCBkKDQpOworICAgIG1wcV9jbGFzcyBlOworICAgIGUgPSAoYSAqIGIpIC8gKGMgLSBkKTsgQVNTRVJUX0FMV0FZUyhlID09IC0wLjI1KTsKKyAgICBlID0gKDIgKiBlKSAvIChjIC0gZCk7IEFTU0VSVF9BTFdBWVMoZSA9PSAgMC4yNSk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxVLCBWPiwgX19nbXBfZXhwcjxULCBXPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDQpOworICAgIG1wel9jbGFzcyBjKC0zKTsKKyAgICBtcHFfY2xhc3MgZChjICogKGEgKiBiKSk7IEFTU0VSVF9BTFdBWVMoZCA9PSAtMC43NSk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDUpOworICAgIG1wel9jbGFzcyBjKDYpOworICAgIHNpZ25lZCBpbnQgZCA9IDQ7CisgICAgbXBxX2NsYXNzIGU7CisgICAgZSA9IChjICUgZCkgLyAoYSAqIGIpOyBBU1NFUlRfQUxXQVlTKGUgPT0gMTApOworICAgIGUgPSAoZS5nZXRfbnVtKCkgJSBkKSAvICgyIC8gZSk7IEFTU0VSVF9BTFdBWVMoZSA9PSAxMCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxULCBWPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDQpLCBjKDIsIDUpOworICAgIG1wcV9jbGFzcyBkOworICAgIGQgPSAoYSAqIGIpIC8gKC1jKTsgQVNTRVJUX0FMV0FZUyhkID09IC0wLjYyNSk7CisgICAgZCA9IChjICogZCkgLyAoLWIpOyBBU1NFUlRfQUxXQVlTKDMgKiBkID09IDEpOworICAgIGQgPSAoYSAqIGMpIC8gKC1kKTsgQVNTRVJUX0FMV0FZUyg1ICogZCA9PSAtMik7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBmICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBUPiwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wZl9jbGFzcyBhKDEpLCBiKDIpOworICAgIG1wZl9jbGFzcyBjKGEgKyBiKTsgQVNTRVJUX0FMV0FZUyhjID09IDMpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgYSgxLjUpLCBiKDYpOworICAgIG1wZl9jbGFzcyBjOworICAgIGMgPSBhIC8gYjsgQVNTRVJUX0FMV0FZUyhjID09IDAuMjUpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIFUsIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgxKTsKKyAgICBzaWduZWQgaW50IGIgPSAtMjsKKyAgICBtcGZfY2xhc3MgYyhhIC0gYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAzKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGEoMik7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IGEgKyAwOyBBU1NFUlRfQUxXQVlTKGIgPT0gMik7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8VSwgX19nbXBfZXhwcjxULCBUPiwgT3A+ID4KKyAgeworICAgIG1wZl9jbGFzcyBhKDIpOworICAgIHVuc2lnbmVkIGludCBiID0gMzsKKyAgICBtcGZfY2xhc3MgYzsKKyAgICBjID0gYiAvIGE7IEFTU0VSVF9BTFdBWVMoYyA9PSAxLjUpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIF9fZ21wX2V4cHI8VSwgVj4sIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgyKTsKKyAgICBtcHpfY2xhc3MgYigzKTsKKyAgICBtcGZfY2xhc3MgYyhhIC0gYik7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMSk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDMpOworICAgIG1wel9jbGFzcyBiKDIpLCBjKDEpOworICAgIG1wZl9jbGFzcyBkOworICAgIGQgPSBhICogKGIgKyBjKTsgQVNTRVJUX0FMV0FZUyhkID09IDkpOworICAgIGEgPSBhICogKGIgKyBjKTsgQVNTRVJUX0FMV0FZUyhhID09IDkpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VSwgVj4sIF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSg2KTsKKyAgICBtcHFfY2xhc3MgYigzLCA0KTsKKyAgICBtcGZfY2xhc3MgYyhhICogYik7IEFTU0VSVF9BTFdBWVMoYyA9PSA0LjUpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIF9fZ21wX2V4cHI8VCwgVT4sIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgyKSwgYigtMyk7CisgICAgbXBmX2NsYXNzIGM7CisgICAgYyA9IGEgKiAoLWIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gNik7CisgICAgYyA9IGMgKiAoLWIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMTgpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgzKSwgYig0KSwgYyg1KTsKKyAgICBtcGZfY2xhc3MgZDsKKyAgICBkID0gKGEgLyBiKSAtIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAtNC4yNSk7CisgICAgYyA9IChhIC8gYikgLSBjOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTQuMjUpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIFYsIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgzKTsKKyAgICB1bnNpZ25lZCBpbnQgYiA9IDI7CisgICAgbXBmX2NsYXNzIGMoKC1hKSA+PiBiKTsgQVNTRVJUX0FMV0FZUyhjID09IC0wLjc1KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxVLCBfX2dtcF9leHByPFQsIFY+LCBPcD4gPgorICB7CisgICAgbXBmX2NsYXNzIGEoMiksIGIoMyk7CisgICAgZG91YmxlIGMgPSA1LjA7CisgICAgbXBmX2NsYXNzIGQ7CisgICAgZCA9IGMgLyAoYSArIGIpOyBBU1NFUlRfQUxXQVlTKGQgPT0gMSk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgX19nbXBfZXhwcjxWLCBXPiwgT3A+ID4KKyAgeworICAgIG1wZl9jbGFzcyBhKDIpLCBiKDMpOworICAgIG1wel9jbGFzcyBjKDQpOworICAgIG1wZl9jbGFzcyBkOworICAgIGQgPSAoYSArIGIpICogYzsgQVNTRVJUX0FMV0FZUyhkID09IDIwKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGEoMiksIGIoMyk7CisgICAgbXBxX2NsYXNzIGMoMSwgMiksIGQoMSwgNCk7CisgICAgbXBmX2NsYXNzIGU7CisgICAgZSA9IChhICogYikgLyAoYyArIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gOCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxVLCBWPiwgX19nbXBfZXhwcjxULCBXPiwgT3A+ID4KKyAgeworICAgIG1wZl9jbGFzcyBhKDEpLCBiKDIpOworICAgIG1wcV9jbGFzcyBjKDMpOworICAgIG1wZl9jbGFzcyBkKGMgLyAoYSArIGIpKTsgQVNTRVJUX0FMV0FZUyhkID09IDEpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgYSgxKTsKKyAgICBtcHpfY2xhc3MgYigyKTsKKyAgICBtcHFfY2xhc3MgYygzLCA0KTsKKyAgICBtcGZfY2xhc3MgZDsKKyAgICBkID0gKC1jKSArIChhICsgYik7IEFTU0VSVF9BTFdBWVMoZCA9PSAyLjI1KTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBfX2dtcF9leHByPFQsIFY+LCBPcD4gPgorICB7CisgICAgbXBmX2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgbXBmX2NsYXNzIGQ7CisgICAgZCA9IChhICsgYikgKiAoLWMpOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTkpOworICB9Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIGNoZWNrX21weigpOworICBjaGVja19tcHEoKTsKKyAgY2hlY2tfbXBmKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3QtY2FzdC5jYyBiL3Rlc3RzL2N4eC90LWNhc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzYjNiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWNhc3QuY2MKQEAgLTAsMCArMSw1NiBAQAorLyogVGVzdCBnKysgLVdvbGQtc3R5bGUtY2FzdCBjbGVhbmxpbmVzcy4KKworQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJnbXB4eC5oIgorCisKKy8qIFRoaXMgY29kZSBkb2Vzbid0IGRvIGFueXRoaW5nIHdoZW4gcnVuLCBpdCBqdXN0IGV4cGFuZHMgdmFyaW91cyBDIG1hY3JvcworICAgdG8gc2VlIHRoYXQgdGhleSBkb24ndCB0cmlnZ2VyIGNvbXBpbGUtdGltZSB3YXJuaW5ncyBmcm9tIGcrKworICAgLVdvbGQtc3R5bGUtY2FzdC4gIFRoaXMgb3B0aW9uIGlzbid0IHVzZWQgaW4gYSBub3JtYWwgYnVpbGQsIGl0IGhhcyB0byBiZQorICAgYWRkZWQgbWFudWFsbHkgdG8gbWFrZSB0aGlzIHRlc3Qgd29ydGh3aGlsZS4gICovCisKK3ZvaWQKK2NoZWNrX21hY3JvcyAodm9pZCkKK3sKKyAgbXB6X3QgICAgICAgICAgejsKKyAgbG9uZyAgICAgICAgICAgbCA9IDEyMzsKKyAgdW5zaWduZWQgbG9uZyAgdSA9IDQ1NjsKKyAgaW50ICAgICAgICAgICAgaTsKKyAgbXBfbGltYl90ICAgICAgbGltYjsKKworICBtcHpfaW5pdF9zZXRfdWkgKHosIDBMKTsKKyAgaSA9IG1wel9vZGRfcCAoeik7CisgIGkgPSBtcHpfZXZlbl9wICh6KTsKKyAgaSA9IG1wel9jbXBfc2kgKHosIGwpOworICBpID0gbXB6X2NtcF91aSAoeiwgdSk7CisgIG1wel9jbGVhciAoeik7CisKKyAgbGltYiA9IEdNUF9OVU1CX01BU0s7CisgIGxpbWIgPSBHTVBfTlVNQl9NQVg7CisgIGxpbWIgPSBHTVBfTkFJTF9NQVNLOworCisgIG1wbl9kaXZtb2QgKCZsaW1iLCAmbGltYiwgMSwgJmxpbWIsIDEpOworICBtcG5fZGl2ZXhhY3RfYnkzICgmbGltYiwgJmxpbWIsIDEpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3QtY29uc3RyLmNjIGIvdGVzdHMvY3h4L3QtY29uc3RyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDg3OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1jb25zdHIuY2MKQEAgLTAsMCArMSw3NTUgQEAKKy8qIFRlc3QgbXAqX2NsYXNzIGNvbnN0cnVjdG9ycy4KKworQ29weXJpZ2h0IDIwMDEtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiZ21weHguaCIKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKwordm9pZAorY2hlY2tfbXB6ICh2b2lkKQoreworICAvLyBtcHpfY2xhc3MoKQorICB7CisgICAgbXB6X2NsYXNzIGE7IEFTU0VSVF9BTFdBWVMoYSA9PSAwKTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhjb25zdCBtcHpfY2xhc3MgJikKKyAgLy8gc2VlIGJlbG93CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+IG1wel9jbGFzcyhjb25zdCBfX2dtcF9leHByPFQsIFU+ICYpCisgIC8vIG5vdCB0ZXN0ZWQgaGVyZSwgc2VlIHQtdW5hcnkuY2MsIHQtYmluYXJ5LmNjCisKKyAgLy8gbXB6X2NsYXNzKHNpZ25lZCBjaGFyKQorICB7CisgICAgc2lnbmVkIGNoYXIgYSA9IC0xMjc7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTI3KTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyh1bnNpZ25lZCBjaGFyKQorICB7CisgICAgdW5zaWduZWQgY2hhciBhID0gMjU1OworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMjU1KTsKKyAgfQorCisgIC8vIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgY2hhciwgbWFjaGluZSBkZXBlbmRlbnQKKyAgeworICAgIG1wel9jbGFzcyBhKCdBJyk7IEFTU0VSVF9BTFdBWVMoYSA9PSA2NSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKCd6Jyk7IEFTU0VSVF9BTFdBWVMoYSA9PSAxMjIpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKHNpZ25lZCBpbnQpCisgIHsKKyAgICBzaWduZWQgaW50IGEgPSAwOworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IC0xMjM7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gNDU2NzsKKyAgICBtcHpfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDQ1NjcpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKHVuc2lnbmVkIGludCkKKyAgeworICAgIHVuc2lnbmVkIGludCBhID0gODkwOworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gODkwKTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhzaWduZWQgc2hvcnQgaW50KQorICB7CisgICAgc2lnbmVkIHNob3J0IGludCBhID0gLTEyMzQ1OworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyMzQ1KTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyh1bnNpZ25lZCBzaG9ydCBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYSA9IDU0MzIxdTsKKyAgICBtcHpfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDU0MzIxdSk7CisgIH0KKworICAvLyBtcHpfY2xhc3Moc2lnbmVkIGxvbmcgaW50KQorICB7CisgICAgc2lnbmVkIGxvbmcgaW50IGEgPSAtMTIzNDU2Nzg5MEw7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzNDU2Nzg5MEwpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKHVuc2lnbmVkIGxvbmcgaW50KQorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgYSA9IDFVTCA8PCAzMDsKKyAgICBtcHpfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEwNzM3NDE4MjRMKTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhmbG9hdCkKKyAgeworICAgIGZsb2F0IGEgPSAxMjMuNDU7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKGRvdWJsZSkKKyAgeworICAgIGRvdWJsZSBhID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAzKTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhsb25nIGRvdWJsZSkKKyAgLy8gY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAorCisgIC8vIG1wel9jbGFzcyhjb25zdCBjaGFyICopCisgIHsKKyAgICBjb25zdCBjaGFyICphID0gIjEyMzQ1Njc4OTAiOworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDU2Nzg5MEwpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKGNvbnN0IGNoYXIgKiwgaW50KQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICJGRkZGIjsKKyAgICBpbnQgYmFzZSA9IDE2OworICAgIG1wel9jbGFzcyBiKGEsIGJhc2UpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNjU1MzV1KTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmKQorICB7CisgICAgc3RyaW5nIGEoIjEyMzQ1Njc4OTAiKTsKKyAgICBtcHpfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG1wel9jbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmLCBpbnQpCisgIHsKKyAgICBzdHJpbmcgYSgiNzc3NyIpOworICAgIGludCBiYXNlID0gODsKKyAgICBtcHpfY2xhc3MgYihhLCBiYXNlKTsgQVNTRVJUX0FMV0FZUyhiID09IDQwOTUpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKGNvbnN0IGNoYXIgKikgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgY2hhciAqYSA9ICJBQkMiOworICAgICAgbXB6X2NsYXNzIGIoYSk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gbXB6X2NsYXNzKGNvbnN0IGNoYXIgKiwgaW50KSB3aXRoIGludmFsaWQKKyAgeworICAgIHRyeSB7CisgICAgICBjb25zdCBjaGFyICphID0gIkdISSI7CisgICAgICBpbnQgYmFzZSA9IDE2OworICAgICAgbXB6X2NsYXNzIGIoYSwgYmFzZSk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gbXB6X2NsYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICYpIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBhKCJhYmMiKTsKKyAgICAgIG1wel9jbGFzcyBiKGEpOworICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7ICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICB9IGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeworICAgIH0KKyAgfQorCisgIC8vIG1wel9jbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmLCBpbnQpIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBhKCJaWloiKTsKKyAgICAgIGludCBiYXNlID0gODsKKyAgICAgIG1wel9jbGFzcyBiKGEsIGJhc2UpOworICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7ICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICB9IGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeworICAgIH0KKyAgfQorCisgIC8vIG1wel9jbGFzcyhtcHpfc3JjcHRyKQorICB7CisgICAgbXB6X3QgYTsKKyAgICBtcHpfaW5pdF9zZXRfdWkoYSwgMTAwKTsKKyAgICBtcHpfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEwMCk7CisgICAgbXB6X2NsZWFyKGEpOworICB9CisKKyAgLy8gbXB6X2NsYXNzKGNvbnN0IG1wel9jbGFzcyAmKQorICB7CisgICAgbXB6X2NsYXNzIGEoMTIzNDUpOyAvLyB0ZXN0ZWQgYWJvdmUsIGFzc3VtZSBpdCB3b3JrcworICAgIG1wel9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDUpOworICB9CisKKyAgLy8gbm8gY29uc3RydWN0b3IgZm9yIGJvb2wsIGJ1dCBpdCBnZXRzIGNhc3RlZCB0byBpbnQKKyAgeworICAgIGJvb2wgYSA9IHRydWU7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxKTsKKyAgfQorICB7CisgICAgYm9vbCBhID0gZmFsc2U7CisgICAgbXB6X2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcHEgKHZvaWQpCit7CisgIC8vIG1wcV9jbGFzcygpCisgIHsKKyAgICBtcHFfY2xhc3MgYTsgQVNTRVJUX0FMV0FZUyhhID09IDApOworICB9CisKKyAgLy8gbXBxX2NsYXNzKGNvbnN0IG1wcV9jbGFzcyAmKQorICAvLyBzZWUgYmVsb3cKKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gbXBxX2NsYXNzKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJikKKyAgLy8gbm90IHRlc3RlZCBoZXJlLCBzZWUgdC11bmFyeS5jYywgdC1iaW5hcnkuY2MKKworICAvLyBtcHFfY2xhc3Moc2lnbmVkIGNoYXIpCisgIHsKKyAgICBzaWduZWQgY2hhciBhID0gLTEyNzsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjcpOworICB9CisKKyAgLy8gbXBxX2NsYXNzKHVuc2lnbmVkIGNoYXIpCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGEgPSAyNTU7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAyNTUpOworICB9CisKKyAgLy8gZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZCBjaGFyLCBtYWNoaW5lIGRlcGVuZGVudAorICB7CisgICAgbXBxX2NsYXNzIGEoJ0EnKTsgQVNTRVJUX0FMV0FZUyhhID09IDY1KTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzIGEoJ3onKTsgQVNTRVJUX0FMV0FZUyhhID09IDEyMik7CisgIH0KKworICAvLyBtcHFfY2xhc3Moc2lnbmVkIGludCkKKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IDA7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gLTEyMzsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjMpOworICB9CisgIHsKKyAgICBzaWduZWQgaW50IGEgPSA0NTY3OworICAgIG1wcV9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNDU2Nyk7CisgIH0KKworICAvLyBtcHFfY2xhc3ModW5zaWduZWQgaW50KQorICB7CisgICAgdW5zaWduZWQgaW50IGEgPSA4OTA7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA4OTApOworICB9CisKKyAgLy8gbXBxX2NsYXNzKHNpZ25lZCBzaG9ydCBpbnQpCisgIHsKKyAgICBzaWduZWQgc2hvcnQgaW50IGEgPSAtMTIzNDU7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzNDUpOworICB9CisKKyAgLy8gbXBxX2NsYXNzKHVuc2lnbmVkIHNob3J0IGludCkKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBhID0gNTQzMjF1OworICAgIG1wcV9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNTQzMjF1KTsKKyAgfQorCisgIC8vIG1wcV9jbGFzcyhzaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBzaWduZWQgbG9uZyBpbnQgYSA9IC0xMjM0NTY3ODkwTDsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBtcHFfY2xhc3ModW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBhID0gMVVMIDw8IDMwOworICAgIG1wcV9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTA3Mzc0MTgyNEwpOworICB9CisKKyAgLy8gbXBxX2NsYXNzKGZsb2F0KQorICB7CisgICAgZmxvYXQgYSA9IDAuNjI1OworICAgIG1wcV9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMC42MjUpOworICB9CisKKyAgLy8gbXBxX2NsYXNzKGRvdWJsZSkKKyAgeworICAgIGRvdWJsZSBhID0gMS4yNTsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEuMjUpOworICB9CisKKyAgLy8gbXBxX2NsYXNzKGxvbmcgZG91YmxlKQorICAvLyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkCisKKyAgLy8gbXBxX2NsYXNzKGNvbnN0IGNoYXIgKikKKyAgeworICAgIGNvbnN0IGNoYXIgKmEgPSAiMTIzNDU2Nzg5MCI7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBtcHFfY2xhc3MoY29uc3QgY2hhciAqLCBpbnQpCisgIHsKKyAgICBjb25zdCBjaGFyICphID0gIkZGRkYiOworICAgIGludCBiYXNlID0gMTY7CisgICAgbXBxX2NsYXNzIGIoYSwgYmFzZSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA2NTUzNXUpOworICAgIG1wcV9jbGFzcyBjKDAsIDEpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMCk7CisgIH0KKworICAvLyBtcHFfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJikKKyAgeworICAgIHN0cmluZyBhKCIxMjM0NTY3ODkwIik7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBtcHFfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJiwgaW50KQorICB7CisgICAgc3RyaW5nIGEoIjc3NzciKTsKKyAgICBpbnQgYmFzZSA9IDg7CisgICAgbXBxX2NsYXNzIGIoYSwgYmFzZSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA0MDk1KTsKKyAgfQorCisgIC8vIG1wcV9jbGFzcyhjb25zdCBjaGFyICopIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IGNoYXIgKmEgPSAiYWJjIjsKKyAgICAgIG1wcV9jbGFzcyBiKGEpOworICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7ICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICB9IGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeworICAgIH0KKyAgfQorCisgIC8vIG1wcV9jbGFzcyhjb25zdCBjaGFyICosIGludCkgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgY2hhciAqYSA9ICJaWloiOworICAgICAgaW50IGJhc2UgPSAxNjsKKyAgICAgIG1wcV9jbGFzcyBiIChhLCBiYXNlKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAoaW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICB9CisgIH0KKworICAvLyBtcHFfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJikgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgc3RyaW5nIGEoImFiYyIpOworICAgICAgbXBxX2NsYXNzIGIoYSk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gbXBxX2NsYXNzKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGludCkgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgc3RyaW5nIGEoIlpaWiIpOworICAgICAgaW50IGJhc2UgPSA4OworICAgICAgbXBxX2NsYXNzIGIgKGEsIGJhc2UpOworICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7ICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICB9IGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeworICAgIH0KKyAgfQorCisgIC8vIG1wcV9jbGFzcyhtcHFfc3JjcHRyKQorICB7CisgICAgbXBxX3QgYTsKKyAgICBtcHFfaW5pdChhKTsKKyAgICBtcHFfc2V0X3VpKGEsIDEwMCwgMSk7CisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMDApOworICAgIG1wcV9jbGVhcihhKTsKKyAgfQorCisgIC8vIG1wcV9jbGFzcyhjb25zdCBtcHpfY2xhc3MgJiwgY29uc3QgbXB6X2NsYXNzICYpCisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjMpLCBiKDQpOyAvLyB0ZXN0ZWQgYWJvdmUsIGFzc3VtZSBpdCB3b3JrcworICAgIG1wcV9jbGFzcyBjKGEsIGIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMzAuNzUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgtMSksIGIoMik7ICAvLyB0ZXN0ZWQgYWJvdmUsIGFzc3VtZSBpdCB3b3JrcworICAgIG1wcV9jbGFzcyBjKGEsIGIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTAuNSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDUpLCBiKDQpOyAvLyB0ZXN0ZWQgYWJvdmUsIGFzc3VtZSBpdCB3b3JrcworICAgIG1wcV9jbGFzcyBjKGEsIGIpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMS4yNSk7CisgIH0KKworICAvLyBtcHFfY2xhc3MoY29uc3QgbXB6X2NsYXNzICYpCisgIHsKKyAgICBtcHFfY2xhc3MgYSgxMjM0NSk7IC8vIHRlc3RlZCBhYm92ZSwgYXNzdW1lIGl0IHdvcmtzCisgICAgbXBxX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NSk7CisgIH0KKworICAvLyBubyBjb25zdHJ1Y3RvciBmb3IgYm9vbCwgYnV0IGl0IGdldHMgY2FzdGVkIHRvIGludAorICB7CisgICAgYm9vbCBhID0gdHJ1ZTsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisgIHsKKyAgICBib29sIGEgPSBmYWxzZTsKKyAgICBtcHFfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDApOworICB9Cit9CisKK3ZvaWQKK2NoZWNrX21wZiAodm9pZCkKK3sKKyAgLy8gbXBmX2NsYXNzKCkKKyAgeworICAgIG1wZl9jbGFzcyBhOyBBU1NFUlRfQUxXQVlTKGEgPT0gMCk7CisgIH0KKworICAvLyBtcGZfY2xhc3MoY29uc3QgbXBmX2NsYXNzICYpCisgIC8vIG1wZl9jbGFzcyhjb25zdCBtcGZfY2xhc3MgJiwgdW5zaWduZWQgbG9uZyBpbnQpCisgIC8vIHNlZSBiZWxvdworCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBtcGZfY2xhc3MoY29uc3QgX19nbXBfZXhwcjxULCBVPiAmKQorICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gbXBmX2NsYXNzKGNvbnN0IF9fZ21wX2V4cHI8VCwgVT4gJiwKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGludCkKKyAgLy8gbm90IHRlc3RlZCBoZXJlLCBzZWUgdC11bmFyeS5jYywgdC1iaW5hcnkuY2MKKworICAvLyBtcGZfY2xhc3Moc2lnbmVkIGNoYXIpCisgIHsKKyAgICBzaWduZWQgY2hhciBhID0gLTEyNzsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjcpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHNpZ25lZCBjaGFyLCB1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHNpZ25lZCBjaGFyIGEgPSAtMTsKKyAgICBpbnQgcHJlYyA9IDY0OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHVuc2lnbmVkIGNoYXIpCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGEgPSAyNTU7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAyNTUpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGxvbmcgaW50KQorICB7CisgICAgdW5zaWduZWQgY2hhciBhID0gMTI4OworICAgIGludCBwcmVjID0gMTI4OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTI4KTsKKyAgfQorCisgIC8vIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgY2hhciwgbWFjaGluZSBkZXBlbmRlbnQKKyAgeworICAgIG1wZl9jbGFzcyBhKCdBJyk7IEFTU0VSVF9BTFdBWVMoYSA9PSA2NSk7CisgIH0KKyAgeworICAgIGludCBwcmVjID0gMjU2OworICAgIG1wZl9jbGFzcyBhKCd6JywgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYSA9PSAxMjIpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHNpZ25lZCBpbnQpCisgIHsKKyAgICBzaWduZWQgaW50IGEgPSAwOworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIHNpZ25lZCBpbnQgYSA9IC0xMjM7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMTIzKTsKKyAgfQorICB7CisgICAgc2lnbmVkIGludCBhID0gNDU2NzsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDQ1NjcpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KQorICB7CisgICAgc2lnbmVkIGludCBhID0gLTEyMzsKKyAgICBpbnQgcHJlYyA9IDY0OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyMyk7CisgIH0KKworICAvLyBtcGZfY2xhc3ModW5zaWduZWQgaW50KQorICB7CisgICAgdW5zaWduZWQgaW50IGEgPSA4OTA7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA4OTApOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgYSA9IDg5MDsKKyAgICBpbnQgcHJlYyA9IDEyODsKKyAgICBtcGZfY2xhc3MgYihhLCBwcmVjKTsgQVNTRVJUX0FMV0FZUyhiID09IDg5MCk7CisgIH0KKworICAvLyBtcGZfY2xhc3Moc2lnbmVkIHNob3J0IGludCkKKyAgeworICAgIHNpZ25lZCBzaG9ydCBpbnQgYSA9IC0xMjM0NTsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NSk7CisgIH0KKworICAvLyBtcGZfY2xhc3Moc2lnbmVkIHNob3J0IGludCwgdW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBzaWduZWQgc2hvcnQgaW50IGEgPSA2Nzg5OworICAgIGludCBwcmVjID0gMjU2OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNjc4OSk7CisgIH0KKworICAvLyBtcGZfY2xhc3ModW5zaWduZWQgc2hvcnQgaW50KQorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGEgPSA1NDMyMXU7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA1NDMyMXUpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHVuc2lnbmVkIHNob3J0IGludCwgdW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYSA9IDU0MzIxdTsKKyAgICBpbnQgcHJlYyA9IDY0OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNTQzMjF1KTsKKyAgfQorCisgIC8vIG1wZl9jbGFzcyhzaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBzaWduZWQgbG9uZyBpbnQgYSA9IC0xMjM0NTY3ODkwTDsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBtcGZfY2xhc3Moc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHNpZ25lZCBsb25nIGludCBhID0gLTEyMzQ1Njc4OTBMOworICAgIGludCBwcmVjID0gMTI4OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzcyh1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGEgPSAzNDU2Nzg5MDEyVUw7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAzNDU2Nzg5MDEyVUwpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGEgPSAzNDU2Nzg5MDEyVUw7CisgICAgaW50IHByZWMgPSAyNTY7CisgICAgbXBmX2NsYXNzIGIoYSwgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYiA9PSAzNDU2Nzg5MDEyVUwpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKGZsb2F0KQorICB7CisgICAgZmxvYXQgYSA9IDEyMzQuNTsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQuNSk7CisgIH0KKworICAvLyBtcGZfY2xhc3MoZmxvYXQsIHVuc2lnbmVkIGxvbmcgaW50KQorICB7CisgICAgZmxvYXQgYSA9IDEyMzQuNTsKKyAgICBpbnQgcHJlYyA9IDY0OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNC41KTsKKyAgfQorCisgIC8vIG1wZl9jbGFzcyhkb3VibGUpCisgIHsKKyAgICBkb3VibGUgYSA9IDEyMzQ1LjA7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NSk7CisgIH0KKyAgeworICAgIGRvdWJsZSBhID0gMS4yMzQ1ZSs0OworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDUpOworICB9CisgIHsKKyAgICBkb3VibGUgYSA9IDMxMi41ZS0yOworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMy4xMjUpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKGRvdWJsZSwgdW5zaWduZWQgbG9uZyBpbnQpCisgIHsKKyAgICBkb3VibGUgYSA9IDUuNDMyMWUrNDsKKyAgICBpbnQgcHJlYyA9IDEyODsKKyAgICBtcGZfY2xhc3MgYihhLCBwcmVjKTsgQVNTRVJUX0FMV0FZUyhiID09IDU0MzIxTCk7CisgIH0KKworICAvLyBtcGZfY2xhc3MobG9uZyBkb3VibGUpCisgIC8vIG1wZl9jbGFzcyhsb25nIGRvdWJsZSwgdW5zaWduZWQgbG9uZyBpbnQpCisgIC8vIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQKKworICAvLyBtcGZfY2xhc3MoY29uc3QgY2hhciAqKQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICIxMjM0NTY3ODkwIjsKKyAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzcyhjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgaW50LCBpbnQgPSAwKQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICIxMjM0NTY3ODkwIjsKKyAgICBpbnQgcHJlYyA9IDI1NjsKKyAgICBtcGZfY2xhc3MgYihhLCBwcmVjKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgfQorICB7CisgICAgY29uc3QgY2hhciAqYSA9ICI3Nzc3NzciOworICAgIGludCBwcmVjID0gNjQsIGJhc2UgPSA4OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMsIGJhc2UpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMjYyMTQzTCk7CisgIH0KKworICAvLyBtcGZfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJikKKyAgeworICAgIHN0cmluZyBhKCIxMjM0NTY3ODkwIik7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NTY3ODkwTCk7CisgIH0KKworICAvLyBtcGZfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJiwgdW5zaWduZWQgbG9uZyBpbnQsIGludCA9IDApCisgIHsKKyAgICBzdHJpbmcgYSgiMTIzNDU2Nzg5MCIpOworICAgIGludCBwcmVjID0gMTI4OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDU2Nzg5MEwpOworICB9CisgIHsKKyAgICBzdHJpbmcgYSgiRkZGRiIpOworICAgIGludCBwcmVjID0gMjU2LCBiYXNlID0gMTY7CisgICAgbXBmX2NsYXNzIGIoYSwgcHJlYywgYmFzZSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA2NTUzNXUpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKGNvbnN0IGNoYXIgKikgd2l0aCBpbnZhbGlkCisgIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgY2hhciAqYSA9ICJhYmMiOworICAgICAgbXBmX2NsYXNzIGIoYSk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisKKyAgLy8gbXBmX2NsYXNzKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyBpbnQsIGludCA9IDApIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIGNvbnN0IGNoYXIgKmEgPSAiZGVmIjsKKyAgICAgIGludCBwcmVjID0gMjU2OworICAgICAgbXBmX2NsYXNzIGIoYSwgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NTY3ODkwTCk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisgIHsKKyAgICB0cnkgeworICAgICAgY29uc3QgY2hhciAqYSA9ICJnaGkiOworICAgICAgaW50IHByZWMgPSA2NCwgYmFzZSA9IDg7CisgICAgICBtcGZfY2xhc3MgYihhLCBwcmVjLCBiYXNlKTsgQVNTRVJUX0FMV0FZUyhiID09IDI2MjE0M0wpOworICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7ICAvKiBzaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KKyAgICB9IGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeworICAgIH0KKyAgfQorCisgIC8vIG1wZl9jbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmKSB3aXRoIGludmFsaWQKKyAgeworICAgIHRyeSB7CisgICAgICBzdHJpbmcgYSgiYWJjIik7CisgICAgICBtcGZfY2xhc3MgYihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMzQ1Njc4OTBMKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAoaW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICB9CisgIH0KKworICAvLyBtcGZfY2xhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJiwgdW5zaWduZWQgbG9uZyBpbnQsIGludCA9IDApIHdpdGggaW52YWxpZAorICB7CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBhKCJkZWYiKTsKKyAgICAgIGludCBwcmVjID0gMTI4OworICAgICAgbXBmX2NsYXNzIGIoYSwgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjM0NTY3ODkwTCk7CisgICAgICBBU1NFUlRfQUxXQVlTICgwKTsgIC8qIHNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIH0gY2F0Y2ggKGludmFsaWRfYXJndW1lbnQmKSB7CisgICAgfQorICB9CisgIHsKKyAgICB0cnkgeworICAgICAgc3RyaW5nIGEoImdoaSIpOworICAgICAgaW50IHByZWMgPSAyNTYsIGJhc2UgPSAxNjsKKyAgICAgIG1wZl9jbGFzcyBiKGEsIHByZWMsIGJhc2UpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNjU1MzV1KTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAoaW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICB9CisgIH0KKworICAvLyBtcGZfY2xhc3MobXBmX3NyY3B0cikKKyAgeworICAgIG1wZl90IGE7CisgICAgbXBmX2luaXRfc2V0X3VpKGEsIDEwMCk7CisgICAgbXBmX2NsYXNzIGIoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMDApOworICAgIG1wZl9jbGVhcihhKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzcyhtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIG1wZl90IGE7CisgICAgaW50IHByZWMgPSA2NDsKKyAgICBtcGZfaW5pdF9zZXRfdWkoYSwgMTAwKTsKKyAgICBtcGZfY2xhc3MgYihhLCBwcmVjKTsgQVNTRVJUX0FMV0FZUyhiID09IDEwMCk7CisgICAgbXBmX2NsZWFyKGEpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKGNvbnN0IG1wZl9jbGFzcyAmKQorICB7CisgICAgbXBmX2NsYXNzIGEoMTIzNDUpOyAvLyB0ZXN0ZWQgYWJvdmUsIGFzc3VtZSBpdCB3b3JrcworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDUpOworICB9CisKKyAgLy8gbXBmX2NsYXNzKGNvbnN0IG1wZl9jbGFzcyAmLCB1bnNpZ25lZCBsb25nIGludCkKKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMzQ1KTsgLy8gdGVzdGVkIGFib3ZlLCBhc3N1bWUgaXQgd29ya3MKKyAgICBpbnQgcHJlYyA9IDY0OworICAgIG1wZl9jbGFzcyBiKGEsIHByZWMpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMTIzNDUpOworICB9CisKKyAgLy8gbm8gY29uc3RydWN0b3JzIGZvciBib29sLCBidXQgaXQgZ2V0cyBjYXN0ZWQgdG8gaW50CisgIHsKKyAgICBib29sIGEgPSB0cnVlOworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMSk7CisgIH0KKyAgeworICAgIGJvb2wgYSA9IGZhbHNlOworICAgIG1wZl9jbGFzcyBiKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIGJvb2wgYSA9IHRydWU7CisgICAgaW50IHByZWMgPSAxMjg7CisgICAgbXBmX2NsYXNzIGIoYSwgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxKTsKKyAgfQorICB7CisgICAgYm9vbCBhID0gZmFsc2U7CisgICAgaW50IHByZWMgPSAyNTY7CisgICAgbXBmX2NsYXNzIGIoYSwgcHJlYyk7IEFTU0VSVF9BTFdBWVMoYiA9PSAwKTsKKyAgfQorfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQoKTsKKworICBjaGVja19tcHooKTsKKyAgY2hlY2tfbXBxKCk7CisgIGNoZWNrX21wZigpOworCisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LWN4eDExLmNjIGIvdGVzdHMvY3h4L3QtY3h4MTEuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2ZmNjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWN4eDExLmNjCkBAIC0wLDAgKzEsMjMyIEBACisvKiBUZXN0IEMrKzExIGZlYXR1cmVzCisKK0NvcHlyaWdodCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmIF9fR01QWFhfVVNFX0NYWDExCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCit2b2lkIGNoZWNrX25vZXhjZXB0ICgpCit7CisgIG1wel9jbGFzcyB6MSwgejI7CisgIG1wcV9jbGFzcyBxMSwgcTI7CisgIG1wZl9jbGFzcyBmMSwgZjI7CisgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoejEgPSBzdGQ6Om1vdmUoejIpKSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQobm9leGNlcHQocTEgPSBzdGQ6Om1vdmUocTIpKSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoZjEgPSBzdGQ6Om1vdmUoZjIpKSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQobm9leGNlcHQocTEgPSBzdGQ6Om1vdmUoejEpKSwgInNvcnJ5Iik7CisKKyAgLy8gT25seSBtcHogaGFzIGxhenkgYWxsb2NhdGlvbiBmb3Igbm93CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxtcHpfY2xhc3M+Ojp2YWx1ZSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxtcHpfY2xhc3M+Ojp2YWx1ZSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfbm90aHJvd19kZWZhdWx0X2NvbnN0cnVjdGlibGU8bXBxX2NsYXNzPjo6dmFsdWUsICJzb3JyeSIpOworICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPG1wcV9jbGFzcz46OnZhbHVlLCAic29ycnkiKTsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjppc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0aWJsZTxtcGZfY2xhc3M+Ojp2YWx1ZSwgInNvcnJ5Iik7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8bXBmX2NsYXNzPjo6dmFsdWUsICJzb3JyeSIpOworfQorCit2b2lkIGNoZWNrX2NvbW1vbl90eXBlICgpCit7CisjZGVmaW5lIENIRUNLX0NPTU1PTl9UWVBFMShULCBSZXMpIFwKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjpjb21tb25fdHlwZTxUPjo6dHlwZSwgUmVzPjo6dmFsdWUsICJzb3JyeSIpCisjZGVmaW5lIENIRUNLX0NPTU1PTl9UWVBFKFQsIFUsIFJlcykgXAorICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxzdGQ6OmNvbW1vbl90eXBlPFQsIFU+Ojp0eXBlLCBSZXM+Ojp2YWx1ZSwgInNvcnJ5IikKKyNkZWZpbmUgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTjEoVCwgUmVzKSBcCisgIENIRUNLX0NPTU1PTl9UWVBFKCAgc2lnbmVkIGNoYXIgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKHVuc2lnbmVkIGNoYXIgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKCAgc2lnbmVkIHNob3J0LCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKHVuc2lnbmVkIHNob3J0LCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKCAgc2lnbmVkIGludCAgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKHVuc2lnbmVkIGludCAgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKCAgc2lnbmVkIGxvbmcgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKHVuc2lnbmVkIGxvbmcgLCBULCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKGZsb2F0ICwgVCwgUmVzKTsgXAorICBDSEVDS19DT01NT05fVFlQRShkb3VibGUsIFQsIFJlcykKKyNkZWZpbmUgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTjIoVCwgUmVzKSBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsICAgc2lnbmVkIGNoYXIgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsIHVuc2lnbmVkIGNoYXIgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsICAgc2lnbmVkIHNob3J0LCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsIHVuc2lnbmVkIHNob3J0LCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsICAgc2lnbmVkIGludCAgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsIHVuc2lnbmVkIGludCAgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsICAgc2lnbmVkIGxvbmcgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsIHVuc2lnbmVkIGxvbmcgLCBSZXMpOyBcCisgIENIRUNLX0NPTU1PTl9UWVBFKFQsIGZsb2F0ICwgUmVzKTsgXAorICBDSEVDS19DT01NT05fVFlQRShULCBkb3VibGUsIFJlcykKKyNkZWZpbmUgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTihULCBSZXMpIFwKKyAgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTjEoVCwgUmVzKTsgXAorICBDSEVDS19DT01NT05fVFlQRV9CVUlMVElOMihULCBSZXMpCisgIC8qIFRoZXNlIHdvdWxkIGp1c3Qgd29yayB3aXRoIGltcGxpY2l0IGNvbnZlcnNpb25zICovCisgIENIRUNLX0NPTU1PTl9UWVBFIChtcHpfY2xhc3MsIG1wcV9jbGFzcywgbXBxX2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKG1wel9jbGFzcywgbXBmX2NsYXNzLCBtcGZfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRSAobXBmX2NsYXNzLCBtcHFfY2xhc3MsIG1wZl9jbGFzcyk7CisKKyAgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTiAobXB6X2NsYXNzLCBtcHpfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRV9CVUlMVElOIChtcHFfY2xhc3MsIG1wcV9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFX0JVSUxUSU4gKG1wZl9jbGFzcywgbXBmX2NsYXNzKTsKKworICBtcHpfY2xhc3MgejsgbXBxX2NsYXNzIHE7IG1wZl9jbGFzcyBmOworCisgIENIRUNLX0NPTU1PTl9UWVBFIChkZWNsdHlwZSgteiksIG1wel9jbGFzcywgbXB6X2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC1xKSwgbXBxX2NsYXNzLCBtcHFfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRSAoZGVjbHR5cGUoLWYpLCBtcGZfY2xhc3MsIG1wZl9jbGFzcyk7CisKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC16KSwgbXBxX2NsYXNzLCBtcHFfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRSAoZGVjbHR5cGUoLXopLCBtcGZfY2xhc3MsIG1wZl9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFIChkZWNsdHlwZSgtcSksIG1wZl9jbGFzcywgbXBmX2NsYXNzKTsKKworICAvKiBUaGVzZSByZXF1aXJlIGEgY29tbW9uX3R5cGUgc3BlY2lhbGl6YXRpb24gKi8KKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC16KSwgZGVjbHR5cGUoeit6KSwgbXB6X2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC1xKSwgZGVjbHR5cGUocStxKSwgbXBxX2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC1mKSwgZGVjbHR5cGUoZitmKSwgbXBmX2NsYXNzKTsKKworICBDSEVDS19DT01NT05fVFlQRSAoZGVjbHR5cGUoLXEpLCBtcHpfY2xhc3MsIG1wcV9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFIChkZWNsdHlwZSgtZiksIG1wel9jbGFzcywgbXBmX2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC1mKSwgbXBxX2NsYXNzLCBtcGZfY2xhc3MpOworCisgIENIRUNLX0NPTU1PTl9UWVBFIChkZWNsdHlwZSgteiksIGRlY2x0eXBlKC1xKSwgbXBxX2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC16KSwgZGVjbHR5cGUoLWYpLCBtcGZfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRSAoZGVjbHR5cGUoLXEpLCBkZWNsdHlwZSgtZiksIG1wZl9jbGFzcyk7CisKKyAgLyogY29tbW9uX3R5cGUgbm93IGRlY2F5cyAqLworICBDSEVDS19DT01NT05fVFlQRSAoZGVjbHR5cGUoLXopLCBkZWNsdHlwZSgteiksIG1wel9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFIChkZWNsdHlwZSgtcSksIGRlY2x0eXBlKC1xKSwgbXBxX2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUgKGRlY2x0eXBlKC1mKSwgZGVjbHR5cGUoLWYpLCBtcGZfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRTEgKGRlY2x0eXBlKC16KSwgbXB6X2NsYXNzKTsKKyAgQ0hFQ0tfQ09NTU9OX1RZUEUxIChkZWNsdHlwZSgtcSksIG1wcV9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFMSAoZGVjbHR5cGUoLWYpLCBtcGZfY2xhc3MpOworCisgIC8qIFBhaW5mdWwgKi8KKyAgQ0hFQ0tfQ09NTU9OX1RZUEVfQlVJTFRJTiAoZGVjbHR5cGUoLXopLCBtcHpfY2xhc3MpOworICBDSEVDS19DT01NT05fVFlQRV9CVUlMVElOIChkZWNsdHlwZSgtcSksIG1wcV9jbGFzcyk7CisgIENIRUNLX0NPTU1PTl9UWVBFX0JVSUxUSU4gKGRlY2x0eXBlKC1mKSwgbXBmX2NsYXNzKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSA9IFQ+Cit2b2lkIGNoZWNrX21vdmVfaW5pdCAoKQoreworICB7CisgICAgLy8gRGVsZXRlIG1vdmVkLWZyb20geDEKKyAgICBUIHgxID0gMzsKKyAgICBVIHgyID0gc3RkOjptb3ZlKHgxKTsKKyAgICBBU1NFUlRfQUxXQVlTICh4MiA9PSAzKTsKKyAgfQorICB7CisgICAgLy8gQXNzaWduIHRvIG1vdmVkLWZyb20geDEKKyAgICBUIHgxID0gMjsKKyAgICBVIHgyID0gc3RkOjptb3ZlKHgxKTsKKyAgICB4MSA9IC03OworICAgIEFTU0VSVF9BTFdBWVMgKHgxID09IC03KTsKKyAgICBBU1NFUlRfQUxXQVlTICh4MiA9PSAyKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVID0gVD4KK3ZvaWQgY2hlY2tfbW92ZV9hc3NpZ24gKCkKK3sKKyAgeworICAgIC8vIERlbGV0ZSBtb3ZlZC1mcm9tIHgxCisgICAgVCB4MSA9IDM7IFUgeDI7CisgICAgeDIgPSBzdGQ6Om1vdmUoeDEpOworICAgIEFTU0VSVF9BTFdBWVMgKHgyID09IDMpOworICB9CisgIHsKKyAgICAvLyBBc3NpZ24gdG8gbW92ZWQtZnJvbSB4MQorICAgIFQgeDEgPSAyOyBVIHgyOworICAgIHgyID0gc3RkOjptb3ZlKHgxKTsKKyAgICB4MSA9IC03OworICAgIEFTU0VSVF9BTFdBWVMgKHgxID09IC03KTsKKyAgICBBU1NFUlRfQUxXQVlTICh4MiA9PSAyKTsKKyAgfQorICB7CisgICAgLy8gU2VsZiBtb3ZlLWFzc2lnbiAobm90IG5lY2Vzc2FyeSwgYnV0IGl0IGhhcHBlbnMgdG8gd29yay4uLikKKyAgICBUIHggPSA0OworICAgIHggPSBzdGQ6Om1vdmUoeCk7CisgICAgQVNTRVJUX0FMV0FZUyAoeCA9PSA0KTsKKyAgfQorfQorCit2b2lkIGNoZWNrX3VzZXJfZGVmaW5lZF9saXRlcmFsICgpCit7CisgIEFTU0VSVF9BTFdBWVMgKDEyM19tcHogJSA1ID09IDMpOworICBBU1NFUlRfQUxXQVlTICgtMTFfbXBxIC8gMjIgPT0gLS41KTsKKyAgQVNTRVJUX0FMV0FZUyAoMTEyLjVlLTFfbXBmICogNCA9PSA0NSk7CisgIHsKKyAgICBtcHpfY2xhc3MgcmVmICggIjEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzIiwgMTYpOworICAgIEFTU0VSVF9BTFdBWVMgKDB4MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjNfbXB6ID09IHJlZik7CisgIH0KK30KKworLy8gQ2hlY2sgZm9yIGV4cGxpY2l0IGNvbnZlcnNpb24gdG8gYm9vbAordm9pZCBpbXBsaWNpdF9ib29sKGJvb2wpOworaW50IGltcGxpY2l0X2Jvb2woLi4uKTsKKwordm9pZCBjaGVja19ib29sX2NvbnZlcnNpb24gKCkKK3sKKyAgY29uc3QgbXB6X2NsYXNzIHpuID0gLTI7CisgIGNvbnN0IG1wcV9jbGFzcyBxbiA9IC0yOworICBjb25zdCBtcGZfY2xhc3MgZm4gPSAtMjsKKyAgY29uc3QgbXB6X2NsYXNzIHowID0gIDA7CisgIGNvbnN0IG1wcV9jbGFzcyBxMCA9ICAwOworICBjb25zdCBtcGZfY2xhc3MgZjAgPSAgMDsKKyAgY29uc3QgbXB6X2NsYXNzIHpwID0gKzI7CisgIGNvbnN0IG1wcV9jbGFzcyBxcCA9ICsyOworICBjb25zdCBtcGZfY2xhc3MgZnAgPSArMjsKKyAgaWYgKHpuICYmIHFuICYmIGZuICYmIHpwICYmIHFwICYmIGZwICYmICF6MCAmJiAhcTAgJiYgIWYwKQorICAgIHsKKyAgICAgIGlmICh6MCB8fCBxMCB8fCBmMCkgQVNTRVJUX0FMV0FZUyhmYWxzZSk7CisgICAgfQorICBlbHNlIEFTU0VSVF9BTFdBWVMoZmFsc2UpOworICBkZWNsdHlwZShpbXBsaWNpdF9ib29sKHpuKSkgemkgPSAxOworICBkZWNsdHlwZShpbXBsaWNpdF9ib29sKHFuKSkgcWkgPSAxOworICBkZWNsdHlwZShpbXBsaWNpdF9ib29sKGZuKSkgZmkgPSAxOworICAodm9pZCkoemkrcWkrZmkpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0KCk7CisKKyAgY2hlY2tfbm9leGNlcHQoKTsKKyAgY2hlY2tfY29tbW9uX3R5cGUoKTsKKyAgY2hlY2tfbW92ZV9pbml0PG1wel9jbGFzcz4oKTsKKyAgY2hlY2tfbW92ZV9pbml0PG1wcV9jbGFzcz4oKTsKKyAgY2hlY2tfbW92ZV9pbml0PG1wZl9jbGFzcz4oKTsKKyAgY2hlY2tfbW92ZV9hc3NpZ248bXB6X2NsYXNzPigpOworICBjaGVja19tb3ZlX2Fzc2lnbjxtcHFfY2xhc3M+KCk7CisgIGNoZWNrX21vdmVfYXNzaWduPG1wZl9jbGFzcz4oKTsKKyAgY2hlY2tfbW92ZV9pbml0PG1wel9jbGFzcyxtcHFfY2xhc3M+KCk7CisgIGNoZWNrX21vdmVfYXNzaWduPG1wel9jbGFzcyxtcHFfY2xhc3M+KCk7CisgIGNoZWNrX3VzZXJfZGVmaW5lZF9saXRlcmFsKCk7CisgIGNoZWNrX2Jvb2xfY29udmVyc2lvbigpOworCisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KKworI2Vsc2UKK2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3QtZG8tZXhjZXB0aW9ucy13b3JrLWF0LWFsbC13aXRoLXRoaXMtY29tcGlsZXIuY2MgYi90ZXN0cy9jeHgvdC1kby1leGNlcHRpb25zLXdvcmstYXQtYWxsLXdpdGgtdGhpcy1jb21waWxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRlYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtZG8tZXhjZXB0aW9ucy13b3JrLWF0LWFsbC13aXRoLXRoaXMtY29tcGlsZXIuY2MKQEAgLTAsMCArMSwzOCBAQAorLyogVGVzdCBpZiB0aGUgY29tcGlsZXIgaGFzIHdvcmtpbmcgdHJ5IC8gdGhyb3cgLyBjYXRjaC4KKworQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK2lubGluZSB2b2lkCit0aHJvd19leHByICgpCit7CisgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCAoIlRlc3QiKTsKK30KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50CittYWluICgpCit7CisgIHRyeQorICB7CisgICAgdGhyb3dfZXhwcigpOworICB9CisgIGNhdGNoIChpbnZhbGlkX2FyZ3VtZW50JikgeyB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1oZWFkZXJzLmNjIGIvdGVzdHMvY3h4L3QtaGVhZGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY3YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtaGVhZGVycy5jYwpAQCAtMCwwICsxLDI2IEBACisvKiBUZXN0IHRoYXQgZ21weHguaCBjb21waWxlcyBjb3JyZWN0bHkuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21weHguaCIKKworaW50CittYWluICh2b2lkKQoreworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LWlvc3RyZWFtLmNjIGIvdGVzdHMvY3h4L3QtaW9zdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWlvc3RyZWFtLmNjCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUZXN0IHN0cmVhbSBmb3JtYXR0ZWQgaW5wdXQgYW5kIG91dHB1dCBvbiBtcCpfY2xhc3MKKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiZ21weHguaCIKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIFRoZSB0ZXN0cyBhcmUgZXh0cmVtZWx5IGJhc2ljLiBUaGVzZSBmdW5jdGlvbnMganVzdCBmb3J3YXJkIHRvIHRoZQorLy8gb25lcyB0ZXN0ZWQgaW4gdC1pc3RyZWFtLmNjIGFuZCB0LW9zdHJlYW0uY2M7IHdlIHJlbHkgb24gdGhvc2UgZm9yCisvLyBhZHZhbmNlZCB0ZXN0cyBhbmQgb25seSBjaGVjayB0aGUgc3ludGF4IGhlcmUuCisKK3ZvaWQKK2NoZWNraSAoKQoreworICB7CisgICAgaXN0cmluZ3N0cmVhbSBpKCIxMjMiKTsKKyAgICBtcHpfY2xhc3MgeDsKKyAgICBpID4+IHg7CisgICAgQVNTRVJUX0FMV0FZUyAoeCA9PSAxMjMpOworICB9CisgIHsKKyAgICBpc3RyaW5nc3RyZWFtIGkoIjMvNCIpOworICAgIG1wcV9jbGFzcyB4OworICAgIGkgPj4geDsKKyAgICBBU1NFUlRfQUxXQVlTICh4ID09IC43NSk7CisgIH0KKyAgeworICAgIGlzdHJpbmdzdHJlYW0gaSgiMS41Iik7CisgICAgbXBmX2NsYXNzIHg7CisgICAgaSA+PiB4OworICAgIEFTU0VSVF9BTFdBWVMgKHggPT0gMS41KTsKKyAgfQorfQorCit2b2lkCitjaGVja28gKCkKK3sKKyAgeworICAgIG9zdHJpbmdzdHJlYW0gbzsKKyAgICBtcHpfY2xhc3MgeD0xMjM7CisgICAgbyA8PCB4OworICAgIEFTU0VSVF9BTFdBWVMgKG8uc3RyKCkgPT0gIjEyMyIpOworICB9CisgIHsKKyAgICBvc3RyaW5nc3RyZWFtIG87CisgICAgbXB6X2NsYXNzIHg9MTIzOworICAgIG8gPDwgKHgrMSk7CisgICAgQVNTRVJUX0FMV0FZUyAoby5zdHIoKSA9PSAiMTI0Iik7CisgIH0KKyAgeworICAgIG9zdHJpbmdzdHJlYW0gbzsKKyAgICBtcHFfY2xhc3MgeCgzLDQpOworICAgIG8gPDwgeDsKKyAgICBBU1NFUlRfQUxXQVlTIChvLnN0cigpID09ICIzLzQiKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBvOworICAgIG1wcV9jbGFzcyB4KDMsNCk7CisgICAgbyA8PCAoeCsxKTsKKyAgICBBU1NFUlRfQUxXQVlTIChvLnN0cigpID09ICI3LzQiKTsKKyAgfQorICB7CisgICAgb3N0cmluZ3N0cmVhbSBvOworICAgIG1wZl9jbGFzcyB4PTEuNTsKKyAgICBvIDw8IHg7CisgICAgQVNTRVJUX0FMV0FZUyAoby5zdHIoKSA9PSAiMS41Iik7CisgIH0KKyAgeworICAgIG9zdHJpbmdzdHJlYW0gbzsKKyAgICBtcGZfY2xhc3MgeD0xLjU7CisgICAgbyA8PCAoeCsxKTsKKyAgICBBU1NFUlRfQUxXQVlTIChvLnN0cigpID09ICIyLjUiKTsKKyAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNraSAoKTsKKyAgY2hlY2tvICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1pc3RyZWFtLmNjIGIvdGVzdHMvY3h4L3QtaXN0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJjYmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtaXN0cmVhbS5jYwpAQCAtMCwwICsxLDU5OCBAQAorLyogVGVzdCBpc3RyZWFtIGZvcm1hdHRlZCBpbnB1dC4KKworQ29weXJpZ2h0IDIwMDEtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvLyBVbmRlciBvcHRpb25fY2hlY2tfc3RhbmRhcmQsIHRoZSB2YXJpb3VzIHRlc3QgY2FzZXMgZm9yIG1weiBvcGVyYXRvcj4+CisvLyBhcmUgcHV0IHRocm91Z2ggdGhlIHN0YW5kYXJkIG9wZXJhdG9yPj4gZm9yIGxvbmcsIGFuZCBsaWtld2lzZSBtcGYKKy8vIG9wZXJhdG9yPj4gaXMgcHV0IHRocm91Z2ggZG91YmxlLgorLy8KKy8vIEluIGcrKyAzLjMgdGhpcyByZXN1bHRzIGluIHNvbWUgcHJpbnRvdXRzIGFib3V0IHRoZSBmaW5hbCBwb3NpdGlvbgorLy8gaW5kaWNhdGVkIGZvciBzb21ldGhpbmcgbGlrZSAiLmUxMjMiLiAgT3VyIG1wZiBjb2RlIHN0b3BzIGF0IHRoZSAiZSIKKy8vIHNpbmNlIHRoZXJlJ3Mgbm8gbWFudGlzc2EgZGlnaXRzLCBidXQgZysrIHJlYWRzIHRoZSB3aG9sZSB0aGluZyBhbmQgb25seQorLy8gdGhlbiBkZWNpZGVzIGl0J3MgYmFkLgorCitib29sIG9wdGlvbl9jaGVja19zdGFuZGFyZCA9IGZhbHNlOworCisKKy8vIE9uIHNvbWUgdmVyc2lvbnMgb2YgZysrIDIuOTYgaXQncyBiZWVuIG9ic2VydmVkIHRoYXQgcHV0YmFjaygpIG1heSBsZWF2ZQorLy8gdGVsbGcoKSB1bmNoYW5nZWQuICBXZSBiZWxpZXZlIHRoaXMgaXMgaW5jb3JyZWN0IGFuZCBwcmVzdW1hYmx5IHRoZQorLy8gcmVzdWx0IG9mIGEgYnVnLCBzaW5jZSBmb3IgaW5zdGFuY2UgaXQncyBvayBpbiBnKysgMi45NSBhbmQgZysrIDMuMy4gIFdlCisvLyBkZXRlY3QgdGhlIHByb2JsZW0gYXQgcnVudGltZSBhbmQgZGlzYWJsZSBhZmZlY3RlZCBjaGVja3MuCisKK2Jvb2wgcHV0YmFja190ZWxsZ193b3JrcyA9IHRydWU7CisKK3ZvaWQKK2NoZWNrX3B1dGJhY2tfdGVsbGcgKHZvaWQpCit7CisgIGlzdHJpbmdzdHJlYW0gaW5wdXQgKCJoZWxsbyIpOworICBzdHJlYW1wb3MgIG9sZF9wb3MsIG5ld19wb3M7CisgIGNoYXIgIGM7CisKKyAgaW5wdXQuZ2V0KGMpOworICBvbGRfcG9zID0gaW5wdXQudGVsbGcoKTsKKyAgaW5wdXQucHV0YmFjayhjKTsKKyAgbmV3X3BvcyA9IGlucHV0LnRlbGxnKCk7CisKKyAgaWYgKG9sZF9wb3MgPT0gbmV3X3BvcykKKyAgICB7CisgICAgICBjb3V0IDw8ICJXYXJuaW5nLCBpc3RyaW5nc3RyZWFtIGhhcyBhIGJ1ZzogcHV0YmFjaygpIGRvZXNuJ3QgdXBkYXRlIHRlbGxnKCkuXG4iOzsKKyAgICAgIGNvdXQgPDwgIlRlc3RzIG9uIHRlbGxnKCkgd2lsbCBiZSBza2lwcGVkLlxuIjsKKyAgICAgIHB1dGJhY2tfdGVsbGdfd29ya3MgPSBmYWxzZTsKKyAgICB9Cit9CisKKworI2RlZmluZSBXUk9ORyhzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCBzdHIgIiwgZGF0YVsiIDw8IGkgPDwgIl1cbiI7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgIiAgaW5wdXQ6IFwiIiA8PCBkYXRhW2ldLmlucHV0IDw8ICJcIlxuIjsgICAgICAgICAgIFwKKyAgICBjb3V0IDw8ICIgIGZsYWdzOiAiIDw8IGhleCA8PCBpbnB1dC5mbGFncygpIDw8IGRlYyA8PCAiXG4iOyBcCisgIH0gd2hpbGUgKDApCisKK3ZvaWQKK2NoZWNrX21weiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgICAgKmlucHV0OworICAgIGludCAgICAgICAgICAgIHdhbnRfcG9zOworICAgIGNvbnN0IGNoYXIgICAgICp3YW50OworICAgIGlvczo6Zm10ZmxhZ3MgIGZsYWdzOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICAgICAgLTEsICIwIiwgICAgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIxMjMiLCAgICAtMSwgIjEyMyIsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjAxMjMiLCAgIC0xLCAiODMiLCAgIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMHgxMjMiLCAgLTEsICIyOTEiLCAgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICItMTIzIiwgICAtMSwgIi0xMjMiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi0wMTIzIiwgIC0xLCAiLTgzIiwgIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiLTB4MTIzIiwgLTEsICItMjkxIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIrMTIzIiwgICAtMSwgIjEyMyIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiKzAxMjMiLCAgLTEsICI4MyIsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIisweDEyMyIsIC0xLCAiMjkxIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKworICAgIHsgIjAiLCAgICAgLTEsICIwIiwgICAgaW9zOjpkZWMgfSwKKyAgICB7ICIxZiIsICAgICAxLCAiMSIsICAgIGlvczo6ZGVjIH0sCisgICAgeyAiMDExZiIsICAgMywgIjExIiwgICBpb3M6OmRlYyB9LAorICAgIHsgIjEyMyIsICAgLTEsICIxMjMiLCAgaW9zOjpkZWMgfSwKKyAgICB7ICItMWYiLCAgICAyLCAiLTEiLCAgIGlvczo6ZGVjIH0sCisgICAgeyAiLTAxMWYiLCAgNCwgIi0xMSIsICBpb3M6OmRlYyB9LAorICAgIHsgIi0xMjMiLCAgLTEsICItMTIzIiwgaW9zOjpkZWMgfSwKKyAgICB7ICIrMWYiLCAgICAyLCAiMSIsICAgIGlvczo6ZGVjIH0sCisgICAgeyAiKzAxMWYiLCAgNCwgIjExIiwgICBpb3M6OmRlYyB9LAorICAgIHsgIisxMjMiLCAgLTEsICIxMjMiLCAgaW9zOjpkZWMgfSwKKworICAgIHsgIjAiLCAgICAtMSwgIjAiLCAgIGlvczo6b2N0IH0sCisgICAgeyAiMTIzIiwgIC0xLCAiODMiLCAgaW9zOjpvY3QgfSwKKyAgICB7ICItMTIzIiwgLTEsICItODMiLCBpb3M6Om9jdCB9LAorICAgIHsgIisxMjMiLCAtMSwgIjgzIiwgIGlvczo6b2N0IH0sCisKKyAgICB7ICIwIiwgICAgLTEsICIwIiwgICAgaW9zOjpoZXggfSwKKyAgICB7ICIxMjMiLCAgLTEsICIyOTEiLCAgaW9zOjpoZXggfSwKKyAgICB7ICJmZiIsICAgLTEsICIyNTUiLCAgaW9zOjpoZXggfSwKKyAgICB7ICJGRiIsICAgLTEsICIyNTUiLCAgaW9zOjpoZXggfSwKKyAgICB7ICItMTIzIiwgLTEsICItMjkxIiwgaW9zOjpoZXggfSwKKyAgICB7ICItZmYiLCAgLTEsICItMjU1IiwgaW9zOjpoZXggfSwKKyAgICB7ICItRkYiLCAgLTEsICItMjU1IiwgaW9zOjpoZXggfSwKKyAgICB7ICIrMTIzIiwgLTEsICIyOTEiLCAgaW9zOjpoZXggfSwKKyAgICB7ICIrZmYiLCAgLTEsICIyNTUiLCAgaW9zOjpoZXggfSwKKyAgICB7ICIrRkYiLCAgLTEsICIyNTUiLCAgaW9zOjpoZXggfSwKKyAgICB7ICJhYiIsICAgLTEsICIxNzEiLCAgaW9zOjpoZXggfSwKKyAgICB7ICJjZCIsICAgLTEsICIyMDUiLCAgaW9zOjpoZXggfSwKKyAgICB7ICJlZiIsICAgLTEsICIyMzkiLCAgaW9zOjpoZXggfSwKKworICAgIHsgIiAxMjMiLCAgMCwgTlVMTCwgIChpb3M6OmZtdGZsYWdzKSAwIH0sICAgLy8gbm90IHdpdGhvdXQgc2tpcHdzCisgICAgeyAiIDEyMyIsIC0xLCAiMTIzIiwgaW9zOjpza2lwd3MgfSwKKyAgfTsKKworICBtcHpfdCAgICAgIGdvdCwgd2FudDsKKyAgYm9vbCAgICAgICBnb3Rfb2ssIHdhbnRfb2s7CisgIGJvb2wgICAgICAgZ290X2VvZiwgd2FudF9lb2Y7CisgIGxvbmcgICAgICAgZ290X3NpLCB3YW50X3NpOworICBzdHJlYW1wb3MgIGluaXRfdGVsbGcsIGdvdF9wb3MsIHdhbnRfcG9zOworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBzaXplX3QgaW5wdXRfbGVuZ3RoID0gc3RybGVuIChkYXRhW2ldLmlucHV0KTsKKyAgICAgIHdhbnRfcG9zID0gKGRhdGFbaV0ud2FudF9wb3MgPT0gLTEKKyAgICAgICAgICAgICAgICAgID8gaW5wdXRfbGVuZ3RoIDogZGF0YVtpXS53YW50X3Bvcyk7CisgICAgICB3YW50X2VvZiA9ICh3YW50X3BvcyA9PSBzdHJlYW1wb3MoaW5wdXRfbGVuZ3RoKSk7CisKKyAgICAgIHdhbnRfb2sgPSAoZGF0YVtpXS53YW50ICE9IE5VTEwpOworCisgICAgICBpZiAoZGF0YVtpXS53YW50ICE9IE5VTEwpCisgICAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0ICh3YW50LCBkYXRhW2ldLndhbnQsIDApOworICAgICAgZWxzZQorICAgICAgICBtcHpfc2V0X3VpICh3YW50LCAwTCk7CisKKyAgICAgIGlmIChvcHRpb25fY2hlY2tfc3RhbmRhcmQgJiYgbXB6X2ZpdHNfc2xvbmdfcCAod2FudCkpCisgICAgICAgIHsKKyAgICAgICAgICBpc3RyaW5nc3RyZWFtICBpbnB1dCAoZGF0YVtpXS5pbnB1dCk7CisgICAgICAgICAgaW5wdXQuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOworICAgICAgICAgIGluaXRfdGVsbGcgPSBpbnB1dC50ZWxsZygpOworICAgICAgICAgIHdhbnRfc2kgPSBtcHpfZ2V0X3NpICh3YW50KTsKKworICAgICAgICAgIGlucHV0ID4+IGdvdF9zaTsKKyAgICAgICAgICBnb3Rfb2sgPSAhaW5wdXQuZmFpbCgpOworICAgICAgICAgIGdvdF9lb2YgPSBpbnB1dC5lb2YoKTsKKyAgICAgICAgICBpbnB1dC5jbGVhcigpOworICAgICAgICAgIGdvdF9wb3MgPSBpbnB1dC50ZWxsZygpIC0gaW5pdF90ZWxsZzsKKworICAgICAgICAgIGlmIChnb3Rfb2sgIT0gd2FudF9vaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgV1JPTkcgKCJzdGRjKysgb3BlcmF0b3I+PiB3cm9uZyBzdGF0dXMsIGNoZWNrX21weiIpOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfb2s6ICIgPDwgd2FudF9vayA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9vazogICIgPDwgZ290X29rIDw8ICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdhbnRfb2sgJiYgZ290X3NpICE9IHdhbnRfc2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3JvbmcgcmVzdWx0LCBjaGVja19tcHoiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICBnb3Rfc2k6ICAiIDw8IGdvdF9zaSA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfc2k6ICIgPDwgd2FudF9zaSA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICh3YW50X29rICYmIGdvdF9lb2YgIT0gd2FudF9lb2YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3JvbmcgRU9GIHN0YXRlLCBjaGVja19tcHoiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICBnb3RfZW9mOiAgIiA8PCBnb3RfZW9mIDw8ICJcbiI7CisgICAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudF9lb2Y6ICIgPDwgd2FudF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocHV0YmFja190ZWxsZ193b3JrcyAmJiBnb3RfcG9zICE9IHdhbnRfcG9zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBXUk9ORyAoInN0ZGMrKyBvcGVyYXRvcj4+IHdyb25nIHBvc2l0aW9uLCBjaGVja19tcHoiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICB3YW50X3BvczogIiA8PCB3YW50X3BvcyA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9wb3M6ICAiIDw8IGdvdF9wb3MgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gIGlucHV0IChkYXRhW2ldLmlucHV0KTsKKyAgICAgICAgaW5wdXQuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOworICAgICAgICBpbml0X3RlbGxnID0gaW5wdXQudGVsbGcoKTsKKworICAgICAgICBtcHpfc2V0X3VpIChnb3QsIDB4REVBRCk7CisgICAgICAgIGlucHV0ID4+IGdvdDsKKyAgICAgICAgZ290X29rID0gIWlucHV0LmZhaWwoKTsKKwlnb3RfZW9mID0gaW5wdXQuZW9mKCk7CisgICAgICAgIGlucHV0LmNsZWFyKCk7CisgICAgICAgIGdvdF9wb3MgPSBpbnB1dC50ZWxsZygpIC0gaW5pdF90ZWxsZzsKKworICAgICAgICBpZiAoZ290X29rICE9IHdhbnRfb2spCisgICAgICAgICAgeworICAgICAgICAgICAgV1JPTkcgKCJtcHogb3BlcmF0b3I+PiB3cm9uZyBzdGF0dXMiKTsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudF9vazogIiA8PCB3YW50X29rIDw8ICJcbiI7CisgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9vazogICIgPDwgZ290X29rIDw8ICJcbiI7CisgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICB9CisgICAgICAgIGlmICh3YW50X29rICYmIG1wel9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1weiBvcGVyYXRvcj4+IHdyb25nIHJlc3VsdCIpOworICAgICAgICAgICAgbXB6X3RyYWNlICgiICBnb3QgIiwgZ290KTsKKyAgICAgICAgICAgIG1wel90cmFjZSAoIiAgd2FudCIsIHdhbnQpOworICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgfQorICAgICAgICBpZiAod2FudF9vayAmJiBnb3RfZW9mICE9IHdhbnRfZW9mKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdST05HICgibXB6IG9wZXJhdG9yPj4gd3JvbmcgRU9GIHN0YXRlIik7CisgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfZW9mOiAiIDw8IHdhbnRfZW9mIDw8ICJcbiI7CisgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9lb2Y6ICAiIDw8IGdvdF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKHB1dGJhY2tfdGVsbGdfd29ya3MgJiYgZ290X3BvcyAhPSB3YW50X3BvcykKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1weiBvcGVyYXRvcj4+IHdyb25nIHBvc2l0aW9uIik7CisgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfcG9zOiAiIDw8IHdhbnRfcG9zIDw8ICJcbiI7CisgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9wb3M6ICAiIDw8IGdvdF9wb3MgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCit2b2lkCitjaGVja19tcHEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICAgICppbnB1dDsKKyAgICBpbnQgICAgICAgICAgICB3YW50X3BvczsKKyAgICBjb25zdCBjaGFyICAgICAqd2FudDsKKyAgICBpb3M6OmZtdGZsYWdzICBmbGFnczsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIjAiLCAgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMDAiLCAgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIweDAiLCAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorCisgICAgeyAiMTIzLzQ1NiIsICAgLTEsICIxMjMvNDU2IiwgaW9zOjpkZWMgfSwKKyAgICB7ICIwMTIzLzQ1NiIsICAtMSwgIjEyMy80NTYiLCBpb3M6OmRlYyB9LAorICAgIHsgIjEyMy8wNDU2IiwgIC0xLCAiMTIzLzQ1NiIsIGlvczo6ZGVjIH0sCisgICAgeyAiMDEyMy8wNDU2IiwgLTEsICIxMjMvNDU2IiwgaW9zOjpkZWMgfSwKKworICAgIHsgIjEyMy80NTYiLCAgIC0xLCAiODMvMzAyIiwgaW9zOjpvY3QgfSwKKyAgICB7ICIwMTIzLzQ1NiIsICAtMSwgIjgzLzMwMiIsIGlvczo6b2N0IH0sCisgICAgeyAiMTIzLzA0NTYiLCAgLTEsICI4My8zMDIiLCBpb3M6Om9jdCB9LAorICAgIHsgIjAxMjMvMDQ1NiIsIC0xLCAiODMvMzAyIiwgaW9zOjpvY3QgfSwKKworICAgIHsgImFiIiwgICAtMSwgIjE3MSIsICBpb3M6OmhleCB9LAorICAgIHsgImNkIiwgICAtMSwgIjIwNSIsICBpb3M6OmhleCB9LAorICAgIHsgImVmIiwgICAtMSwgIjIzOSIsICBpb3M6OmhleCB9LAorCisgICAgeyAiMC8wIiwgICAgIC0xLCAiMC8wIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICI1LzgiLCAgICAgLTEsICI1LzgiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjB4NS8weDgiLCAtMSwgIjUvOCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisKKyAgICB7ICIxMjMvNDU2IiwgICAtMSwgIjEyMy80NTYiLCAgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIxMjMvMDQ1NiIsICAtMSwgIjEyMy8zMDIiLCAgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIxMjMvMHg0NTYiLCAtMSwgIjEyMy8xMTEwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIxMjMvMFg0NTYiLCAtMSwgIjEyMy8xMTEwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKworICAgIHsgIjAxMjMvMTIzIiwgICAtMSwgIjgzLzEyMyIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMDEyMy8wMTIzIiwgIC0xLCAiODMvODMiLCAgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIwMTIzLzB4MTIzIiwgLTEsICI4My8yOTEiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjAxMjMvMFgxMjMiLCAtMSwgIjgzLzI5MSIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisKKyAgICB7ICIweDEyMy8xMjMiLCAgIC0xLCAiMjkxLzEyMyIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMFgxMjMvMDEyMyIsICAtMSwgIjI5MS84MyIsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjB4MTIzLzB4MTIzIiwgLTEsICIyOTEvMjkxIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKworICAgIHsgIiAxMjMiLCAgMCwgTlVMTCwgIChpb3M6OmZtdGZsYWdzKSAwIH0sICAgLy8gbm90IHdpdGhvdXQgc2tpcHdzCisgICAgeyAiIDEyMyIsIC0xLCAiMTIzIiwgaW9zOjpza2lwd3MgfSwKKworICAgIHsgIjEyMyAvNDU2IiwgICAgMywgIjEyMyIsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjEyMy8gNDU2IiwgICAgNCwgIE5VTEwsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjEyMy8iICAgICwgICAtMSwgIE5VTEwsICAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjEyMyAvNDU2IiwgICAgMywgIjEyMyIsICBpb3M6OnNraXB3cyB9LAorICAgIHsgIjEyMy8gNDU2IiwgICAgNCwgIE5VTEwsICBpb3M6OnNraXB3cyB9LAorICB9OworCisgIG1wcV90ICAgICAgZ290LCB3YW50OworICBib29sICAgICAgIGdvdF9vaywgd2FudF9vazsKKyAgYm9vbCAgICAgICBnb3RfZW9mLCB3YW50X2VvZjsKKyAgbG9uZyAgICAgICBnb3Rfc2ksIHdhbnRfc2k7CisgIHN0cmVhbXBvcyAgaW5pdF90ZWxsZywgZ290X3Bvcywgd2FudF9wb3M7CisKKyAgbXBxX2luaXQgKGdvdCk7CisgIG1wcV9pbml0ICh3YW50KTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBzdHJsZW4gKGRhdGFbaV0uaW5wdXQpOworICAgICAgd2FudF9wb3MgPSAoZGF0YVtpXS53YW50X3BvcyA9PSAtMQorICAgICAgICAgICAgICAgICAgPyBpbnB1dF9sZW5ndGggOiBkYXRhW2ldLndhbnRfcG9zKTsKKyAgICAgIHdhbnRfZW9mID0gKHdhbnRfcG9zID09IHN0cmVhbXBvcyhpbnB1dF9sZW5ndGgpKTsKKworICAgICAgd2FudF9vayA9IChkYXRhW2ldLndhbnQgIT0gTlVMTCk7CisKKyAgICAgIGlmIChkYXRhW2ldLndhbnQgIT0gTlVMTCkKKyAgICAgICAgbXBxX3NldF9zdHJfb3JfYWJvcnQgKHdhbnQsIGRhdGFbaV0ud2FudCwgMCk7CisgICAgICBlbHNlCisgICAgICAgIG1wcV9zZXRfdWkgKHdhbnQsIDBMLCAxTCk7CisKKyAgICAgIGlmIChvcHRpb25fY2hlY2tfc3RhbmRhcmQKKyAgICAgICAgICAmJiBtcHpfZml0c19zbG9uZ19wIChtcHFfbnVtcmVmKHdhbnQpKQorICAgICAgICAgICYmIG1wel9jbXBfdWkgKG1wcV9kZW5yZWYod2FudCksIDFMKSA9PSAwCisgICAgICAgICAgJiYgc3RyY2hyIChkYXRhW2ldLmlucHV0LCAnLycpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpc3RyaW5nc3RyZWFtICBpbnB1dCAoZGF0YVtpXS5pbnB1dCk7CisgICAgICAgICAgaW5wdXQuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOworICAgICAgICAgIGluaXRfdGVsbGcgPSBpbnB1dC50ZWxsZygpOworICAgICAgICAgIHdhbnRfc2kgPSBtcHpfZ2V0X3NpIChtcHFfbnVtcmVmKHdhbnQpKTsKKworICAgICAgICAgIGlucHV0ID4+IGdvdF9zaTsKKyAgICAgICAgICBnb3Rfb2sgPSAhaW5wdXQuZmFpbCgpOworICAgICAgICAgIGdvdF9lb2YgPSBpbnB1dC5lb2YoKTsKKyAgICAgICAgICBpbnB1dC5jbGVhcigpOworICAgICAgICAgIGdvdF9wb3MgPSBpbnB1dC50ZWxsZygpIC0gaW5pdF90ZWxsZzsKKworICAgICAgICAgIGlmIChnb3Rfb2sgIT0gd2FudF9vaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgV1JPTkcgKCJzdGRjKysgb3BlcmF0b3I+PiB3cm9uZyBzdGF0dXMsIGNoZWNrX21wcSIpOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfb2s6ICIgPDwgd2FudF9vayA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9vazogICIgPDwgZ290X29rIDw8ICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdhbnRfb2sgJiYgd2FudF9zaSAhPSBnb3Rfc2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3JvbmcgcmVzdWx0LCBjaGVja19tcHEiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICBnb3Rfc2k6ICAiIDw8IGdvdF9zaSA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfc2k6ICIgPDwgd2FudF9zaSA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICh3YW50X29rICYmIGdvdF9lb2YgIT0gd2FudF9lb2YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3JvbmcgRU9GIHN0YXRlLCBjaGVja19tcHEiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICBnb3RfZW9mOiAgIiA8PCBnb3RfZW9mIDw8ICJcbiI7CisgICAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudF9lb2Y6ICIgPDwgd2FudF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocHV0YmFja190ZWxsZ193b3JrcyAmJiBnb3RfcG9zICE9IHdhbnRfcG9zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBXUk9ORyAoInN0ZGMrKyBvcGVyYXRvcj4+IHdyb25nIHBvc2l0aW9uLCBjaGVja19tcHEiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICB3YW50X3BvczogIiA8PCB3YW50X3BvcyA8PCAiXG4iOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9wb3M6ICAiIDw8IGdvdF9wb3MgPDwgIlxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gIGlucHV0IChkYXRhW2ldLmlucHV0KTsKKyAgICAgICAgaW5wdXQuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOworICAgICAgICBpbml0X3RlbGxnID0gaW5wdXQudGVsbGcoKTsKKyAgICAgICAgbXBxX3NldF9zaSAoZ290LCAweERFQUQsIDB4QkVFRik7CisKKyAgICAgICAgaW5wdXQgPj4gZ290OworICAgICAgICBnb3Rfb2sgPSAhaW5wdXQuZmFpbCgpOworCWdvdF9lb2YgPSBpbnB1dC5lb2YoKTsKKyAgICAgICAgaW5wdXQuY2xlYXIoKTsKKyAgICAgICAgZ290X3BvcyA9IGlucHV0LnRlbGxnKCkgLSBpbml0X3RlbGxnOworCisgICAgICAgIGlmIChnb3Rfb2sgIT0gd2FudF9vaykKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1wcSBvcGVyYXRvcj4+IHdyb25nIHN0YXR1cyIpOworICAgICAgICAgICAgY291dCA8PCAiICB3YW50X29rOiAiIDw8IHdhbnRfb2sgPDwgIlxuIjsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgZ290X29rOiAgIiA8PCBnb3Rfb2sgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZG9uJ3QgdXNlIG1wcV9lcXVhbCwgc2luY2Ugd2UgYWxsb3cgbm9uLW5vcm1hbGl6ZWQgdmFsdWVzIHRvIGJlCisgICAgICAgIC8vIHJlYWQsIHdoaWNoIGNhbiB0cmlnZ2VyIEFTU0VSVHMgaW4gbXBxX2VxdWFsCisgICAgICAgIGlmICh3YW50X29rICYmIChtcHpfY21wIChtcHFfbnVtcmVmIChnb3QpLCBtcHFfbnVtcmVmKHdhbnQpKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtcHpfY21wIChtcHFfZGVucmVmIChnb3QpLCBtcHFfZGVucmVmKHdhbnQpKSAhPSAwKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1wcSBvcGVyYXRvcj4+IHdyb25nIHJlc3VsdCIpOworICAgICAgICAgICAgbXBxX3RyYWNlICgiICBnb3QgIiwgZ290KTsKKyAgICAgICAgICAgIG1wcV90cmFjZSAoIiAgd2FudCIsIHdhbnQpOworICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgfQorICAgICAgICBpZiAod2FudF9vayAmJiBnb3RfZW9mICE9IHdhbnRfZW9mKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdST05HICgibXBxIG9wZXJhdG9yPj4gd3JvbmcgRU9GIHN0YXRlIik7CisgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfZW9mOiAiIDw8IHdhbnRfZW9mIDw8ICJcbiI7CisgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9lb2Y6ICAiIDw8IGdvdF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKHB1dGJhY2tfdGVsbGdfd29ya3MgJiYgZ290X3BvcyAhPSB3YW50X3BvcykKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1wcSBvcGVyYXRvcj4+IHdyb25nIHBvc2l0aW9uIik7CisgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfcG9zOiAiIDw8IHdhbnRfcG9zIDw8ICJcbiI7CisgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9wb3M6ICAiIDw8IGdvdF9wb3MgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgbXBxX2NsZWFyIChnb3QpOworICBtcHFfY2xlYXIgKHdhbnQpOworfQorCisKK3ZvaWQKK2NoZWNrX21wZiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgICAgKmlucHV0OworICAgIGludCAgICAgICAgICAgIHdhbnRfcG9zOworICAgIGNvbnN0IGNoYXIgICAgICp3YW50OworICAgIGlvczo6Zm10ZmxhZ3MgIGZsYWdzOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICAgICAgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIrMCIsICAgICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi0wIiwgICAgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMC4wIiwgICAgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIwLiIsICAgICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi4wIiwgICAgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiKy4wIiwgICAgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICItLjAiLCAgICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIiswLjAwIiwgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiLTAuMDAwIiwgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIrMC4wMCIsICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi0wLjAwMCIsIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMC4wZTAiLCAgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIwLmUwIiwgICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi4wZTAiLCAgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMC4wZS0wIiwgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIwLmUtMCIsICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi4wZS0wIiwgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiMC4wZSswIiwgLTEsICIwIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIwLmUrMCIsICAtMSwgIjAiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi4wZSswIiwgIC0xLCAiMCIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisKKyAgICB7ICIxIiwgIC0xLCAgIjEiLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIisxIiwgLTEsICAiMSIsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiLTEiLCAtMSwgIi0xIiwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKworICAgIHsgIiAwIiwgIDAsICBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LCAgLy8gbm90IHdpdGhvdXQgc2tpcHdzCisgICAgeyAiIDAiLCAgLTEsICIwIiwgaW9zOjpza2lwd3MgfSwKKyAgICB7ICIgKzAiLCAtMSwgIjAiLCBpb3M6OnNraXB3cyB9LAorICAgIHsgIiAtMCIsIC0xLCAiMCIsIGlvczo6c2tpcHdzIH0sCisKKyAgICB7ICIrLTEyMyIsIDEsIE5VTEwsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgICAgeyAiLSsxMjMiLCAxLCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjFlKy0xMjMiLCAzLCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjFlLSsxMjMiLCAzLCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LAorCisgICAgeyAiZTEyMyIsICAgMCwgTlVMTCwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwgLy8gYXQgbGVhc3Qgb25lIG1hbnRpc3NhIGRpZ2l0CisgICAgeyAiLmUxMjMiLCAgMSwgTlVMTCwgKGlvczo6Zm10ZmxhZ3MpIDAgfSwKKyAgICB7ICIrLmUxMjMiLCAyLCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIi0uZTEyMyIsIDIsIE5VTEwsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisKKyAgICB7ICIxMjNlIiwgICA0LCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LCAvLyBhdCBsZWFzdCBvbmUgZXhwb25lbnQgZGlnaXQKKyAgICB7ICIxMjNlLSIsICA1LCBOVUxMLCAoaW9zOjpmbXRmbGFncykgMCB9LAorICAgIHsgIjEyM2UrIiwgIDUsIE5VTEwsIChpb3M6OmZtdGZsYWdzKSAwIH0sCisgIH07CisKKyAgbXBmX3QgICAgICBnb3QsIHdhbnQ7CisgIGJvb2wgICAgICAgZ290X29rLCB3YW50X29rOworICBib29sICAgICAgIGdvdF9lb2YsIHdhbnRfZW9mOworICBkb3VibGUgICAgIGdvdF9kLCB3YW50X2Q7CisgIHN0cmVhbXBvcyAgaW5pdF90ZWxsZywgZ290X3Bvcywgd2FudF9wb3M7CisKKyAgbXBmX2luaXQgKGdvdCk7CisgIG1wZl9pbml0ICh3YW50KTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBzdHJsZW4gKGRhdGFbaV0uaW5wdXQpOworICAgICAgd2FudF9wb3MgPSAoZGF0YVtpXS53YW50X3BvcyA9PSAtMQorICAgICAgICAgICAgICAgICAgPyBpbnB1dF9sZW5ndGggOiBkYXRhW2ldLndhbnRfcG9zKTsKKyAgICAgIHdhbnRfZW9mID0gKHdhbnRfcG9zID09IHN0cmVhbXBvcyhpbnB1dF9sZW5ndGgpKTsKKworICAgICAgd2FudF9vayA9IChkYXRhW2ldLndhbnQgIT0gTlVMTCk7CisKKyAgICAgIGlmIChkYXRhW2ldLndhbnQgIT0gTlVMTCkKKyAgICAgICAgbXBmX3NldF9zdHJfb3JfYWJvcnQgKHdhbnQsIGRhdGFbaV0ud2FudCwgMCk7CisgICAgICBlbHNlCisgICAgICAgIG1wZl9zZXRfdWkgKHdhbnQsIDBMKTsKKworICAgICAgd2FudF9kID0gbXBmX2dldF9kICh3YW50KTsKKyAgICAgIGlmIChvcHRpb25fY2hlY2tfc3RhbmRhcmQgJiYgbXBmX2NtcF9kICh3YW50LCB3YW50X2QpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpc3RyaW5nc3RyZWFtICBpbnB1dCAoZGF0YVtpXS5pbnB1dCk7CisgICAgICAgICAgaW5wdXQuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOworICAgICAgICAgIGluaXRfdGVsbGcgPSBpbnB1dC50ZWxsZygpOworCisgICAgICAgICAgaW5wdXQgPj4gZ290X2Q7CisgICAgICAgICAgZ290X29rID0gIWlucHV0LmZhaWwoKTsKKyAgICAgICAgICBnb3RfZW9mID0gaW5wdXQuZW9mKCk7CisgICAgICAgICAgaW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICBnb3RfcG9zID0gaW5wdXQudGVsbGcoKSAtIGluaXRfdGVsbGc7CisKKyAgICAgICAgICBpZiAoZ290X29rICE9IHdhbnRfb2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3Jvbmcgc3RhdHVzLCBjaGVja19tcGYiKTsKKyAgICAgICAgICAgICAgY291dCA8PCAiICB3YW50X29rOiAiIDw8IHdhbnRfb2sgPDwgIlxuIjsKKyAgICAgICAgICAgICAgY291dCA8PCAiICBnb3Rfb2s6ICAiIDw8IGdvdF9vayA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICh3YW50X29rICYmIHdhbnRfZCAhPSBnb3RfZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgV1JPTkcgKCJzdGRjKysgb3BlcmF0b3I+PiB3cm9uZyByZXN1bHQsIGNoZWNrX21wZiIpOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdDogICAiIDw8IGdvdF9kIDw8ICJcbiI7CisgICAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudDogICIgPDwgd2FudF9kIDw8ICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdhbnRfb2sgJiYgZ290X2VvZiAhPSB3YW50X2VvZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgV1JPTkcgKCJzdGRjKysgb3BlcmF0b3I+PiB3cm9uZyBFT0Ygc3RhdGUsIGNoZWNrX21wZiIpOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIGdvdF9lb2Y6ICAiIDw8IGdvdF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgICAgY291dCA8PCAiICB3YW50X2VvZjogIiA8PCB3YW50X2VvZiA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChwdXRiYWNrX3RlbGxnX3dvcmtzICYmIGdvdF9wb3MgIT0gd2FudF9wb3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFdST05HICgic3RkYysrIG9wZXJhdG9yPj4gd3JvbmcgcG9zaXRpb24sIGNoZWNrX21wZiIpOworICAgICAgICAgICAgICBjb3V0IDw8ICIgIHdhbnRfcG9zOiAiIDw8IHdhbnRfcG9zIDw8ICJcbiI7CisgICAgICAgICAgICAgIGNvdXQgPDwgIiAgZ290X3BvczogICIgPDwgZ290X3BvcyA8PCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSAgaW5wdXQgKGRhdGFbaV0uaW5wdXQpOworICAgICAgICBpbnB1dC5mbGFncyAoZGF0YVtpXS5mbGFncyk7CisgICAgICAgIGluaXRfdGVsbGcgPSBpbnB1dC50ZWxsZygpOworCisgICAgICAgIG1wZl9zZXRfdWkgKGdvdCwgMHhERUFEKTsKKyAgICAgICAgaW5wdXQgPj4gZ290OworICAgICAgICBnb3Rfb2sgPSAhaW5wdXQuZmFpbCgpOworCWdvdF9lb2YgPSBpbnB1dC5lb2YoKTsKKyAgICAgICAgaW5wdXQuY2xlYXIoKTsKKyAgICAgICAgZ290X3BvcyA9IGlucHV0LnRlbGxnKCkgLSBpbml0X3RlbGxnOworCisgICAgICAgIGlmIChnb3Rfb2sgIT0gd2FudF9vaykKKyAgICAgICAgICB7CisgICAgICAgICAgICBXUk9ORyAoIm1wZiBvcGVyYXRvcj4+IHdyb25nIHN0YXR1cyIpOworICAgICAgICAgICAgY291dCA8PCAiICB3YW50X29rOiAiIDw8IHdhbnRfb2sgPDwgIlxuIjsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgZ290X29rOiAgIiA8PCBnb3Rfb2sgPDwgIlxuIjsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgICAgaWYgKHdhbnRfb2sgJiYgbXBmX2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdST05HICgibXBmIG9wZXJhdG9yPj4gd3JvbmcgcmVzdWx0Iik7CisgICAgICAgICAgICBtcGZfdHJhY2UgKCIgIGdvdCAiLCBnb3QpOworICAgICAgICAgICAgbXBmX3RyYWNlICgiICB3YW50Iiwgd2FudCk7CisgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICB9CisgICAgICAgIGlmICh3YW50X29rICYmIGdvdF9lb2YgIT0gd2FudF9lb2YpCisgICAgICAgICAgeworICAgICAgICAgICAgV1JPTkcgKCJtcGYgb3BlcmF0b3I+PiB3cm9uZyBFT0Ygc3RhdGUiKTsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudF9lb2Y6ICIgPDwgd2FudF9lb2YgPDwgIlxuIjsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgZ290X2VvZjogICIgPDwgZ290X2VvZiA8PCAiXG4iOworICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgfQorICAgICAgICBpZiAocHV0YmFja190ZWxsZ193b3JrcyAmJiBnb3RfcG9zICE9IHdhbnRfcG9zKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFdST05HICgibXBmIG9wZXJhdG9yPj4gd3JvbmcgcG9zaXRpb24iKTsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgd2FudF9wb3M6ICIgPDwgd2FudF9wb3MgPDwgIlxuIjsKKyAgICAgICAgICAgIGNvdXQgPDwgIiAgZ290X3BvczogICIgPDwgZ290X3BvcyA8PCAiXG4iOworICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICBtcGZfY2xlYXIgKGdvdCk7CisgIG1wZl9jbGVhciAod2FudCk7Cit9CisKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItcyIpID09IDApCisgICAgb3B0aW9uX2NoZWNrX3N0YW5kYXJkID0gdHJ1ZTsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19wdXRiYWNrX3RlbGxnICgpOworICBjaGVja19tcHogKCk7CisgIGNoZWNrX21wcSAoKTsKKyAgY2hlY2tfbXBmICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1sb2NhbGUuY2MgYi90ZXN0cy9jeHgvdC1sb2NhbGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlOTVlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LWxvY2FsZS5jYwpAQCAtMCwwICsxLDE5NCBAQAorLyogVGVzdCBsb2NhbGUgc3VwcG9ydCBpbiBDKysgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK2V4dGVybiAiQyIgeworICBjaGFyIHBvaW50X3N0cmluZ1syXTsKK30KKworI2lmIEhBVkVfU1REX19MT0NBTEUKKy8vIExpa2Ugc3RkOjpudW1wdW5jdCwgYnV0IHdpdGggZGVjaW1hbF9wb2ludCBjb21pbmcgZnJvbSBwb2ludF9zdHJpbmdbXS4KK2NsYXNzIG15X251bXB1bmN0IDogcHVibGljIG51bXB1bmN0PGNoYXI+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IG15X251bXB1bmN0IChzaXplX3QgciA9IDApIDogbnVtcHVuY3Q8Y2hhcj4ocikgeyB9CisgcHJvdGVjdGVkOgorICBjaGFyIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdCB7IHJldHVybiBwb2ludF9zdHJpbmdbMF07IH0KK307CisjZW5kaWYKKwordm9pZAorc2V0X3BvaW50IChjaGFyIGMpCit7CisgIHBvaW50X3N0cmluZ1swXSA9IGM7CisKKyNpZiBIQVZFX1NURF9fTE9DQUxFCisgIGxvY2FsZSBsb2MgKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgbXlfbnVtcHVuY3QgKCkpOworICBsb2NhbGU6Omdsb2JhbCAobG9jKTsKKyNlbmRpZgorfQorCisKK3ZvaWQKK2NoZWNrX2lucHV0ICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqc3RyMTsKKyAgICBjb25zdCBjaGFyICAqc3RyMjsKKyAgICBkb3VibGUgICAgICB3YW50OworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIjEiLCIiLCAgIDEuMCB9LAorICAgIHsgIjEiLCIwIiwgIDEuMCB9LAorICAgIHsgIjEiLCIwMCIsIDEuMCB9LAorCisgICAgeyAiIiwiNSIsICAgIDAuNSB9LAorICAgIHsgIjAiLCI1IiwgICAwLjUgfSwKKyAgICB7ICIwMCIsIjUiLCAgMC41IH0sCisgICAgeyAiMDAiLCI1MCIsIDAuNSB9LAorCisgICAgeyAiMSIsIjUiLCAgICAxLjUgfSwKKyAgICB7ICIxIiwiNWUxIiwgMTUuMCB9LAorICB9OworCisgIHN0YXRpYyBjaGFyIHBvaW50W10gPSB7CisgICAgJy4nLCAnLCcsICd4JywgJ1x4RkYnCisgIH07CisKKyAgbXBmX3QgIGdvdDsKKyAgbXBmX2luaXQgKGdvdCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJvZiAocG9pbnQpOyBpKyspCisgICAgeworICAgICAgc2V0X3BvaW50IChwb2ludFtpXSk7CisKKyAgICAgIGZvciAoaW50IG5lZyA9IDA7IG5lZyA8PSAxOyBuZWcrKykKKyAgICAgICAgeworICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnVtYmVyb2YgKGRhdGEpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0cmluZyBzdHIgPSBzdHJpbmcoZGF0YVtqXS5zdHIxKStwb2ludFtpXStzdHJpbmcoZGF0YVtqXS5zdHIyKTsKKyAgICAgICAgICAgICAgaWYgKG5lZykKKyAgICAgICAgICAgICAgICBzdHIgPSAiLSIgKyBzdHI7CisKKyAgICAgICAgICAgICAgaXN0cmluZ3N0cmVhbSBpcyAoc3RyLmNfc3RyKCkpOworCisgICAgICAgICAgICAgIG1wZl9zZXRfdWkgKGdvdCwgMTIzKTsgICAvLyBkdW1teSBpbml0aWFsIHZhbHVlCisKKyAgICAgICAgICAgICAgaWYgKCEgKGlzID4+IGdvdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY291dCA8PCAiaXN0cmVhbSBtcGZfdCBvcGVyYXRvcj4+IGVycm9yXG4iOworICAgICAgICAgICAgICAgICAgY291dCA8PCAiICBwb2ludCAiIDw8IHBvaW50W2ldIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgICBjb3V0IDw8ICIgIHN0ciAgIFwiIiA8PCBzdHIgPDwgIlwiXG4iOworICAgICAgICAgICAgICAgICAgY291dCA8PCAiICBsb2NhbGVjb252IHBvaW50IFwiIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBHTVBfREVDSU1BTF9QT0lOVCA8PCAiXCJcbiI7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZG91YmxlIHdhbnQgPSBkYXRhW2pdLndhbnQ7CisgICAgICAgICAgICAgIGlmIChuZWcpCisgICAgICAgICAgICAgICAgd2FudCA9IC13YW50OworICAgICAgICAgICAgICBpZiAobXBmX2NtcF9kIChnb3QsIHdhbnQpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY291dCA8PCAiaXN0cmVhbSBtcGZfdCBvcGVyYXRvcj4+IHdyb25nXG4iOworICAgICAgICAgICAgICAgICAgY291dCA8PCAiICBwb2ludCAiIDw8IHBvaW50W2ldIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgICBjb3V0IDw8ICIgIHN0ciAgIFwiIiA8PCBzdHIgPDwgIlwiXG4iOworICAgICAgICAgICAgICAgICAgY291dCA8PCAiICBnb3QgICAiIDw8IGdvdCA8PCAiXG4iOworICAgICAgICAgICAgICAgICAgY291dCA8PCAiICB3YW50ICAiIDw8IHdhbnQgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIiAgbG9jYWxlY29udiBwb2ludCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgR01QX0RFQ0lNQUxfUE9JTlQgPDwgIlwiXG4iOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoZ290KTsKK30KKwordm9pZAorY2hlY2tfb3V0cHV0ICh2b2lkKQoreworICBzdGF0aWMgY2hhciBwb2ludFtdID0geworICAgICcuJywgJywnLCAneCcsICdceEZGJworICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYmVyb2YgKHBvaW50KTsgaSsrKQorICAgIHsKKyAgICAgIHNldF9wb2ludCAocG9pbnRbaV0pOworICAgICAgb3N0cmluZ3N0cmVhbSAgZ290OworCisgICAgICBtcGZfdCAgZjsKKyAgICAgIG1wZl9pbml0IChmKTsKKyAgICAgIG1wZl9zZXRfZCAoZiwgMS41KTsKKyAgICAgIGdvdCA8PCBmOworICAgICAgbXBmX2NsZWFyIChmKTsKKworICAgICAgc3RyaW5nICB3YW50ID0gc3RyaW5nKCIxIikgKyBwb2ludFtpXSArIHN0cmluZygiNSIpOworCisgICAgICBpZiAod2FudC5jb21wYXJlIChnb3Quc3RyKCkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBjb3V0IDw8ICJvc3RyZWFtIG1wZl90IG9wZXJhdG9yPDwgZG9lc24ndCByZXNwZWN0IGxvY2FsZVxuIjsKKyAgICAgICAgICBjb3V0IDw8ICIgIHBvaW50ICIgPDwgcG9pbnRbaV0gPDwgIlxuIjsKKyAgICAgICAgICBjb3V0IDw8ICIgIGdvdCAgIFwiIiA8PCBnb3Quc3RyKCkgPDwgIlwiXG4iOworICAgICAgICAgIGNvdXQgPDwgIiAgd2FudCAgXCIiIDw8IHdhbnQgICAgICA8PCAiXCJcbiI7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludAorcmVwbGFjZW1lbnRfd29ya3MgKHZvaWQpCit7CisgIHNldF9wb2ludCAoJ3gnKTsKKyAgbXBmX3QgIGY7CisgIG1wZl9pbml0IChmKTsKKyAgbXBmX3NldF9kIChmLCAxLjUpOworICBvc3RyaW5nc3RyZWFtIHM7CisgIHMgPDwgZjsKKyAgbXBmX2NsZWFyIChmKTsKKworICByZXR1cm4gKHMuc3RyKCkuY29tcGFyZSgiMXg1IikgPT0gMCk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKHJlcGxhY2VtZW50X3dvcmtzKCkpCisgICAgeworICAgICAgY2hlY2tfaW5wdXQgKCk7CisgICAgICBjaGVja19vdXRwdXQgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY291dCA8PCAiUmVwbGFjaW5nIGRlY2ltYWwgcG9pbnQgZGlkbid0IHdvcmssIHRlc3RzIHNraXBwZWRcbiI7CisgICAgfQorCisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1taXNjLmNjIGIvdGVzdHMvY3h4L3QtbWlzYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQzZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtbWlzYy5jYwpAQCAtMCwwICsxLDM5NyBAQAorLyogVGVzdCBtcCpfY2xhc3MgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIDxjbGltaXRzPiBmb3IgTE9OR19NSU4sIGJ1dCBpbnN0ZWFkIG91ciBvd24KKyAgIGRlZmluaXRpb25zIGluIGdtcC1pbXBsLmguICBJbiBnKysgMi45NS40IChkZWJpYW4gMy4wKSB1bmRlcgorICAgLW1jcHU9dWx0cmFzcGFyYywgbGltaXRzLmggc2VlcyBfX3NwYXJjX3Y5X18gZGVmaW5lZCBhbmQgYXNzdW1lcyB0aGF0CisgICBtZWFucyBsb25nIGlzIDY0LWJpdCBsb25nLCBidXQgaXQncyBvbmx5IDMyLWJpdHMsIGNhdXNpbmcgZmF0YWwgY29tcGlsZQorICAgZXJyb3JzLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiZ21weHguaCIKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKwordm9pZAorY2hlY2tfbXB6ICh2b2lkKQoreworICAvLyBtcHpfY2xhc3M6OmZpdHNfc2ludF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXB6X2NsYXNzICB6OworICAgIHogPSBJTlRfTUlOOyBmaXRzID0gei5maXRzX3NpbnRfcCgpOyBBU1NFUlRfQUxXQVlTIChmaXRzKTsKKyAgICB6LS07ICAgICAgICAgZml0cyA9IHouZml0c19zaW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgICB6ID0gSU5UX01BWDsgZml0cyA9IHouZml0c19zaW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgeisrOyAgICAgICAgIGZpdHMgPSB6LmZpdHNfc2ludF9wKCk7IEFTU0VSVF9BTFdBWVMgKCEgZml0cyk7CisgIH0KKworICAvLyBtcHpfY2xhc3M6OmZpdHNfdWludF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXB6X2NsYXNzICB6OworICAgIHogPSAwOyAgICAgICAgZml0cyA9IHouZml0c191aW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgei0tOyAgICAgICAgICBmaXRzID0gei5maXRzX3VpbnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIHogPSBVSU5UX01BWDsgZml0cyA9IHouZml0c191aW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgeisrOyAgICAgICAgICBmaXRzID0gei5maXRzX3VpbnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXB6X2NsYXNzOjpmaXRzX3Nsb25nX3AKKyAgeworICAgIGJvb2wgICAgICAgZml0czsKKyAgICBtcHpfY2xhc3MgIHo7CisgICAgeiA9IExPTkdfTUlOOyBmaXRzID0gei5maXRzX3Nsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgei0tOyAgICAgICAgICBmaXRzID0gei5maXRzX3Nsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgICB6ID0gTE9OR19NQVg7IGZpdHMgPSB6LmZpdHNfc2xvbmdfcCgpOyBBU1NFUlRfQUxXQVlTIChmaXRzKTsKKyAgICB6Kys7ICAgICAgICAgIGZpdHMgPSB6LmZpdHNfc2xvbmdfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXB6X2NsYXNzOjpmaXRzX3Vsb25nX3AKKyAgeworICAgIGJvb2wgICAgICAgZml0czsKKyAgICBtcHpfY2xhc3MgIHo7CisgICAgeiA9IDA7ICAgICAgICAgZml0cyA9IHouZml0c191bG9uZ19wKCk7IEFTU0VSVF9BTFdBWVMgKGZpdHMpOworICAgIHotLTsgICAgICAgICAgIGZpdHMgPSB6LmZpdHNfdWxvbmdfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIHogPSBVTE9OR19NQVg7IGZpdHMgPSB6LmZpdHNfdWxvbmdfcCgpOyBBU1NFUlRfQUxXQVlTIChmaXRzKTsKKyAgICB6Kys7ICAgICAgICAgICBmaXRzID0gei5maXRzX3Vsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgfQorCisgIC8vIG1wel9jbGFzczo6Zml0c19zc2hvcnRfcAorICB7CisgICAgYm9vbCAgICAgICBmaXRzOworICAgIG1wel9jbGFzcyAgejsKKyAgICB6ID0gU0hSVF9NSU47IGZpdHMgPSB6LmZpdHNfc3Nob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgei0tOyAgICAgICAgICBmaXRzID0gei5maXRzX3NzaG9ydF9wKCk7IEFTU0VSVF9BTFdBWVMgKCEgZml0cyk7CisgICAgeiA9IFNIUlRfTUFYOyBmaXRzID0gei5maXRzX3NzaG9ydF9wKCk7IEFTU0VSVF9BTFdBWVMgKGZpdHMpOworICAgIHorKzsgICAgICAgICAgZml0cyA9IHouZml0c19zc2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXB6X2NsYXNzOjpmaXRzX3VzaG9ydF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXB6X2NsYXNzICB6OworICAgIHogPSAwOyAgICAgICAgIGZpdHMgPSB6LmZpdHNfdXNob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgei0tOyAgICAgICAgICAgZml0cyA9IHouZml0c191c2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIHogPSBVU0hSVF9NQVg7IGZpdHMgPSB6LmZpdHNfdXNob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgeisrOyAgICAgICAgICAgZml0cyA9IHouZml0c191c2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXB6X2NsYXNzOjpnZXRfbXB6X3QKKyAgeworICAgIG1wel9jbGFzcyAgeigwKTsKKyAgICBtcHpfcHRyICAgIHAgPSB6LmdldF9tcHpfdCgpOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHAsIDApID09IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgIHooMCk7CisgICAgbXB6X3NyY3B0ciBwID0gei5nZXRfbXB6X3QoKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpIChwLCAwKSA9PSAwKTsKKyAgfQorCisgIC8vIG1wel9jbGFzczo6Z2V0X2QKKyAgLy8gbXB6X2NsYXNzOjpnZXRfc2kKKyAgLy8gbXB6X2NsYXNzOjpnZXRfdWkKKyAgeworICAgIG1wel9jbGFzcyAgeigxMjMpOworICAgIHsgZG91YmxlIGQgPSB6LmdldF9kKCk7ICBBU1NFUlRfQUxXQVlTIChkID09IDEyMy4wKTsgfQorICAgIHsgbG9uZyAgIGwgPSB6LmdldF9zaSgpOyBBU1NFUlRfQUxXQVlTIChsID09IDEyM0wpOyB9CisgICAgeyBsb25nICAgdSA9IHouZ2V0X3VpKCk7IEFTU0VSVF9BTFdBWVMgKHUgPT0gMTIzTCk7IH0KKyAgfQorICB7CisgICAgbXB6X2NsYXNzICB6KC0xMjMpOworICAgIHsgZG91YmxlIGQgPSB6LmdldF9kKCk7ICBBU1NFUlRfQUxXQVlTIChkID09IC0xMjMuMCk7IH0KKyAgICB7IGxvbmcgICBsID0gei5nZXRfc2koKTsgQVNTRVJUX0FMV0FZUyAobCA9PSAtMTIzTCk7IH0KKyAgfQorCisgIC8vIG1wel9jbGFzczo6Z2V0X3N0cgorICB7CisgICAgbXB6X2NsYXNzICB6KDEyMyk7CisgICAgc3RyaW5nICAgICBzOworICAgIHMgPSB6LmdldF9zdHIoKTsgQVNTRVJUX0FMV0FZUyAocyA9PSAiMTIzIik7CisgICAgcyA9IHouZ2V0X3N0cigxNik7IEFTU0VSVF9BTFdBWVMgKHMgPT0gIjdiIik7CisgICAgcyA9IHouZ2V0X3N0cigtMTYpOyBBU1NFUlRfQUxXQVlTIChzID09ICI3QiIpOworICB9CisKKyAgLy8gbXB6X2NsYXNzOjpzZXRfc3RyCisgIHsKKyAgICBtcHpfY2xhc3MgIHo7CisgICAgaW50ICAgICAgICByZXQ7CisgICAgcmV0ID0gei5zZXRfc3RyICgiMTIzIiwgMTApOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgeiA9PSAxMjMpOworICAgIHJldCA9IHouc2V0X3N0ciAoIjdiIiwgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHogPT0gMTIzKTsKKyAgICByZXQgPSB6LnNldF9zdHIgKCI3QiIsICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiB6ID09IDEyMyk7CisgICAgcmV0ID0gei5zZXRfc3RyICgiMHg3QiIsIDApOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgeiA9PSAxMjMpOworCisgICAgcmV0ID0gei5zZXRfc3RyIChzdHJpbmcoIjEyMyIpLCAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiB6ID09IDEyMyk7CisgICAgcmV0ID0gei5zZXRfc3RyIChzdHJpbmcoIjdiIiksICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiB6ID09IDEyMyk7CisgICAgcmV0ID0gei5zZXRfc3RyIChzdHJpbmcoIjdCIiksICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiB6ID09IDEyMyk7CisgICAgcmV0ID0gei5zZXRfc3RyIChzdHJpbmcoIjB4N0IiKSwgMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiB6ID09IDEyMyk7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBxICh2b2lkKQoreworICAvLyBtcHFfY2xhc3M6OmNhbm9uaWNhbGl6ZQorICB7CisgICAgbXBxX2NsYXNzICBxKDEyLDkpOworICAgIHEuY2Fub25pY2FsaXplKCk7CisgICAgQVNTRVJUX0FMV0FZUyAocS5nZXRfbnVtKCkgPT0gNCk7CisgICAgQVNTRVJUX0FMV0FZUyAocS5nZXRfZGVuKCkgPT0gMyk7CisgIH0KKworICAvLyBtcHFfY2xhc3M6OmdldF9kCisgIHsKKyAgICBtcHFfY2xhc3MgIHEoMTIzKTsKKyAgICB7IGRvdWJsZSBkID0gcS5nZXRfZCgpOyAgQVNTRVJUX0FMV0FZUyAoZCA9PSAxMjMuMCk7IH0KKyAgfQorICB7CisgICAgbXBxX2NsYXNzICBxKC0xMjMpOworICAgIHsgZG91YmxlIGQgPSBxLmdldF9kKCk7ICBBU1NFUlRfQUxXQVlTIChkID09IC0xMjMuMCk7IH0KKyAgfQorCisgIC8vIG1wcV9jbGFzczo6Z2V0X21wcV90CisgIHsKKyAgICBtcHFfY2xhc3MgIHEoMCk7CisgICAgbXBxX3B0ciAgICBwID0gcS5nZXRfbXBxX3QoKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHFfY21wX3VpIChwLCAwLCAxKSA9PSAwKTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzICBxKDApOworICAgIG1wcV9zcmNwdHIgcCA9IHEuZ2V0X21wcV90KCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBxX2NtcF91aSAocCwgMCwgMSkgPT0gMCk7CisgIH0KKworICAvLyBtcHFfY2xhc3M6OmdldF9udW0sIG1wcV9jbGFzczo6Z2V0X2RlbgorICB7CisgICAgY29uc3QgbXBxX2NsYXNzICBxKDQsNSk7CisgICAgbXB6X2NsYXNzICB6OworICAgIHogPSBxLmdldF9udW0oKTsgQVNTRVJUX0FMV0FZUyAoeiA9PSA0KTsKKyAgICB6ID0gcS5nZXRfZGVuKCk7IEFTU0VSVF9BTFdBWVMgKHogPT0gNSk7CisgIH0KKworICAvLyBtcHFfY2xhc3M6OmdldF9udW1fbXB6X3QsIG1wcV9jbGFzczo6Z2V0X2Rlbl9tcHpfdAorICB7CisgICAgbXBxX2NsYXNzICBxKDQsNSk7CisgICAgbXB6X3B0ciAgICBwOworICAgIHAgPSBxLmdldF9udW1fbXB6X3QoKTsgQVNTRVJUX0FMV0FZUyAobXB6X2NtcF91aSAocCwgNCkgPT0gMCk7CisgICAgcCA9IHEuZ2V0X2Rlbl9tcHpfdCgpOyBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpIChwLCA1KSA9PSAwKTsKKyAgfQorICB7CisgICAgY29uc3QgbXBxX2NsYXNzICBxKDQsNSk7CisgICAgbXB6X3NyY3B0ciBwOworICAgIHAgPSBxLmdldF9udW1fbXB6X3QoKTsgQVNTRVJUX0FMV0FZUyAobXB6X2NtcF91aSAocCwgNCkgPT0gMCk7CisgICAgcCA9IHEuZ2V0X2Rlbl9tcHpfdCgpOyBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpIChwLCA1KSA9PSAwKTsKKyAgfQorCisgIC8vIG1wcV9jbGFzczo6Z2V0X3N0cgorICB7CisgICAgbXBxX2NsYXNzICBxKDE3LDExKTsKKyAgICBzdHJpbmcgICAgIHM7CisgICAgcyA9IHEuZ2V0X3N0cigpOyAgICBBU1NFUlRfQUxXQVlTIChzID09ICIxNy8xMSIpOworICAgIHMgPSBxLmdldF9zdHIoMTApOyAgQVNTRVJUX0FMV0FZUyAocyA9PSAiMTcvMTEiKTsKKyAgICBzID0gcS5nZXRfc3RyKDE2KTsgIEFTU0VSVF9BTFdBWVMgKHMgPT0gIjExL2IiKTsKKyAgICBzID0gcS5nZXRfc3RyKC0xNik7IEFTU0VSVF9BTFdBWVMgKHMgPT0gIjExL0IiKTsKKyAgfQorCisgIC8vIG1wcV9jbGFzczo6c2V0X3N0cgorICB7CisgICAgbXBxX2NsYXNzICBxOworICAgIGludCAgICAgICAgcmV0OworICAgIHJldCA9IHEuc2V0X3N0ciAoIjEyMyIsIDEwKTsgICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKCI0LzUiLCAxMCk7ICAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBxID09IG1wcV9jbGFzcyg0LDUpKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKCI3YiIsICAxNik7ICAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBxID09IDEyMyk7CisgICAgcmV0ID0gcS5zZXRfc3RyICgiN0IiLCAgMTYpOyAgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgcSA9PSAxMjMpOworICAgIHJldCA9IHEuc2V0X3N0ciAoIjB4N0IiLCAwKTsgICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKCIweDEwLzE3IiwgMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBxID09IG1wcV9jbGFzcygxNiwxNykpOworCisgICAgcmV0ID0gcS5zZXRfc3RyIChzdHJpbmcoIjQvNSIpLCAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBxID09IG1wcV9jbGFzcyg0LDUpKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKHN0cmluZygiMTIzIiksIDEwKTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKHN0cmluZygiN2IiKSwgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKHN0cmluZygiN0IiKSwgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKHN0cmluZygiMHg3QiIpLCAwKTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gMTIzKTsKKyAgICByZXQgPSBxLnNldF9zdHIgKHN0cmluZygiMHgxMC8xNyIpLCAwKTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIHEgPT0gbXBxX2NsYXNzKDE2LDE3KSk7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBmICh2b2lkKQoreworICAvLyBtcGZfY2xhc3M6OmZpdHNfc2ludF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXBmX2NsYXNzICBmICgwLCAyKjgqc2l6ZW9mKGludCkpOworICAgIGYgPSBJTlRfTUlOOyBmaXRzID0gZi5maXRzX3NpbnRfcCgpOyBBU1NFUlRfQUxXQVlTIChmaXRzKTsKKyAgICBmLS07ICAgICAgICAgZml0cyA9IGYuZml0c19zaW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgICBmID0gSU5UX01BWDsgZml0cyA9IGYuZml0c19zaW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZisrOyAgICAgICAgIGZpdHMgPSBmLmZpdHNfc2ludF9wKCk7IEFTU0VSVF9BTFdBWVMgKCEgZml0cyk7CisgIH0KKworICAvLyBtcGZfY2xhc3M6OmZpdHNfdWludF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXBmX2NsYXNzICBmICgwLCAyKjgqc2l6ZW9mKGludCkpOworICAgIGYgPSAwOyAgICAgICAgZml0cyA9IGYuZml0c191aW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZi0tOyAgICAgICAgICBmaXRzID0gZi5maXRzX3VpbnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIGYgPSBVSU5UX01BWDsgZml0cyA9IGYuZml0c191aW50X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZisrOyAgICAgICAgICBmaXRzID0gZi5maXRzX3VpbnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXBmX2NsYXNzOjpmaXRzX3Nsb25nX3AKKyAgeworICAgIGJvb2wgICAgICAgZml0czsKKyAgICBtcGZfY2xhc3MgIGYgKDAsIDIqOCpzaXplb2YobG9uZykpOworICAgIGYgPSBMT05HX01JTjsgZml0cyA9IGYuZml0c19zbG9uZ19wKCk7IEFTU0VSVF9BTFdBWVMgKGZpdHMpOworICAgIGYtLTsgICAgICAgICAgZml0cyA9IGYuZml0c19zbG9uZ19wKCk7IEFTU0VSVF9BTFdBWVMgKCEgZml0cyk7CisgICAgZiA9IExPTkdfTUFYOyBmaXRzID0gZi5maXRzX3Nsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZisrOyAgICAgICAgICBmaXRzID0gZi5maXRzX3Nsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzczo6Zml0c191bG9uZ19wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXBmX2NsYXNzICBmICgwLCAyKjgqc2l6ZW9mKGxvbmcpKTsKKyAgICBmID0gMDsgICAgICAgICBmaXRzID0gZi5maXRzX3Vsb25nX3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZi0tOyAgICAgICAgICAgZml0cyA9IGYuZml0c191bG9uZ19wKCk7IEFTU0VSVF9BTFdBWVMgKCEgZml0cyk7CisgICAgZiA9IFVMT05HX01BWDsgZml0cyA9IGYuZml0c191bG9uZ19wKCk7IEFTU0VSVF9BTFdBWVMgKGZpdHMpOworICAgIGYrKzsgICAgICAgICAgIGZpdHMgPSBmLmZpdHNfdWxvbmdfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXBmX2NsYXNzOjpmaXRzX3NzaG9ydF9wCisgIHsKKyAgICBib29sICAgICAgIGZpdHM7CisgICAgbXBmX2NsYXNzICBmICgwLCAyKjgqc2l6ZW9mKHNob3J0KSk7CisgICAgZiA9IFNIUlRfTUlOOyBmaXRzID0gZi5maXRzX3NzaG9ydF9wKCk7IEFTU0VSVF9BTFdBWVMgKGZpdHMpOworICAgIGYtLTsgICAgICAgICAgZml0cyA9IGYuZml0c19zc2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIGYgPSBTSFJUX01BWDsgZml0cyA9IGYuZml0c19zc2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTIChmaXRzKTsKKyAgICBmKys7ICAgICAgICAgIGZpdHMgPSBmLmZpdHNfc3Nob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoISBmaXRzKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzczo6Zml0c191c2hvcnRfcAorICB7CisgICAgYm9vbCAgICAgICBmaXRzOworICAgIG1wZl9jbGFzcyAgZiAoMCwgMio4KnNpemVvZihzaG9ydCkpOworICAgIGYgPSAwOyAgICAgICAgIGZpdHMgPSBmLmZpdHNfdXNob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZi0tOyAgICAgICAgICAgZml0cyA9IGYuZml0c191c2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICAgIGYgPSBVU0hSVF9NQVg7IGZpdHMgPSBmLmZpdHNfdXNob3J0X3AoKTsgQVNTRVJUX0FMV0FZUyAoZml0cyk7CisgICAgZisrOyAgICAgICAgICAgZml0cyA9IGYuZml0c191c2hvcnRfcCgpOyBBU1NFUlRfQUxXQVlTICghIGZpdHMpOworICB9CisKKyAgLy8gbXBmX2NsYXNzOjpnZXRfZAorICAvLyBtcGZfY2xhc3M6OmdldF9zaQorICAvLyBtcGZfY2xhc3M6OmdldF91aQorICB7CisgICAgbXBmX2NsYXNzICBmKDEyMyk7CisgICAgeyBkb3VibGUgZCA9IGYuZ2V0X2QoKTsgIEFTU0VSVF9BTFdBWVMgKGQgPT0gMTIzLjApOyB9CisgICAgeyBsb25nICAgbCA9IGYuZ2V0X3NpKCk7IEFTU0VSVF9BTFdBWVMgKGwgPT0gMTIzTCk7IH0KKyAgICB7IGxvbmcgICB1ID0gZi5nZXRfdWkoKTsgQVNTRVJUX0FMV0FZUyAodSA9PSAxMjNMKTsgfQorICB9CisgIHsKKyAgICBtcGZfY2xhc3MgIGYoLTEyMyk7CisgICAgeyBkb3VibGUgZCA9IGYuZ2V0X2QoKTsgIEFTU0VSVF9BTFdBWVMgKGQgPT0gLTEyMy4wKTsgfQorICAgIHsgbG9uZyAgIGwgPSBmLmdldF9zaSgpOyBBU1NFUlRfQUxXQVlTIChsID09IC0xMjNMKTsgfQorICB9CisKKyAgLy8gbXBmX2NsYXNzOjpnZXRfcHJlYworICB7CisgICAgbXBmX2NsYXNzICBmOworICAgIEFTU0VSVF9BTFdBWVMgKGYuZ2V0X3ByZWMoKSA9PSBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzczo6Z2V0X3N0cgorICB7CisgICAgbXBmX2NsYXNzICBmKDEyMyk7CisgICAgc3RyaW5nICAgICBzOworICAgIG1wX2V4cF90ICAgZTsKKyAgICBzID0gZi5nZXRfc3RyKGUpOyAgICAgICAgQVNTRVJUX0FMV0FZUyAocyA9PSAiMTIzIiAmJiBlID09IDMpOworICAgIHMgPSBmLmdldF9zdHIoZSwgIDE2KTsgICBBU1NFUlRfQUxXQVlTIChzID09ICI3YiIgICYmIGUgPT0gMik7CisgICAgcyA9IGYuZ2V0X3N0cihlLCAtMTYpOyAgIEFTU0VSVF9BTFdBWVMgKHMgPT0gIjdCIiAgJiYgZSA9PSAyKTsKKyAgICBzID0gZi5nZXRfc3RyKGUsIDEwLCAyKTsgQVNTRVJUX0FMV0FZUyAocyA9PSAiMTIiICAmJiBlID09IDMpOworICAgIHMgPSBmLmdldF9zdHIoZSwgMTAsIDEpOyBBU1NFUlRfQUxXQVlTIChzID09ICIxIiAgICYmIGUgPT0gMyk7CisgIH0KKworICAvLyBtcGZfY2xhc3M6OnNldF9zdHIKKyAgeworICAgIG1wZl9jbGFzcyAgZjsKKyAgICBpbnQgICAgICAgIHJldDsKKyAgICByZXQgPSBmLnNldF9zdHIgKCIxMjMiLCAgICAgMTApOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgZiA9PSAxMjMpOworICAgIHJldCA9IGYuc2V0X3N0ciAoIjEyM2UxIiwgICAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDEyMzApOworICAgIHJldCA9IGYuc2V0X3N0ciAoIjEyMzBlLTEiLCAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDEyMyk7CisgICAgcmV0ID0gZi5zZXRfc3RyICgiN2IiLCAgICAgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIGYgPT0gMTIzKTsKKyAgICByZXQgPSBmLnNldF9zdHIgKCI3QiIsICAgICAgMTYpOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgZiA9PSAxMjMpOworICAgIHJldCA9IGYuc2V0X3N0ciAoIjdCQDEiLCAgICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDE5NjgpOworICAgIHJldCA9IGYuc2V0X3N0ciAoIjdCMEAtMSIsICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDEyMyk7CisKKyAgICByZXQgPSBmLnNldF9zdHIgKHN0cmluZygiMTIzIiksICAgICAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDEyMyk7CisgICAgcmV0ID0gZi5zZXRfc3RyIChzdHJpbmcoIjEyM2UxIiksICAgMTApOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgZiA9PSAxMjMwKTsKKyAgICByZXQgPSBmLnNldF9zdHIgKHN0cmluZygiMTIzMGUtMSIpLCAxMCk7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDEyMyk7CisgICAgcmV0ID0gZi5zZXRfc3RyIChzdHJpbmcoIjdiIiksICAgICAgMTYpOyAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDAgJiYgZiA9PSAxMjMpOworICAgIHJldCA9IGYuc2V0X3N0ciAoc3RyaW5nKCI3QiIpLCAgICAgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIGYgPT0gMTIzKTsKKyAgICByZXQgPSBmLnNldF9zdHIgKHN0cmluZygiN0JAMSIpLCAgICAxNik7ICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCAmJiBmID09IDE5NjgpOworICAgIHJldCA9IGYuc2V0X3N0ciAoc3RyaW5nKCI3QjBALTEiKSwgIDE2KTsgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwICYmIGYgPT0gMTIzKTsKKyAgfQorCisgIC8vIG1wZl9jbGFzczo6c2V0X3ByZWMKKyAgeworICAgIG1wZl9jbGFzcyAgZjsKKyAgICBmLnNldF9wcmVjICgyNTYpOworICAgIEFTU0VSVF9BTFdBWVMgKGYuZ2V0X3ByZWMgKCkgPj0gMjU2KTsKKyAgfQorCisgIC8vIG1wZl9jbGFzczo6c2V0X3ByZWNfcmF3CisgIHsKKyAgICBtcGZfY2xhc3MgIGYgKDAsIDEwMCAqIEdNUF9OVU1CX0JJVFMpOworICAgIGYuc2V0X3ByZWNfcmF3ICg1ICogR01QX05VTUJfQklUUyk7CisgICAgQVNTRVJUX0FMV0FZUyAoZi5nZXRfcHJlYyAoKSA+PSA1ICogR01QX05VTUJfQklUUyk7CisgICAgQVNTRVJUX0FMV0FZUyAoZi5nZXRfcHJlYyAoKSA8IDEwMCAqIEdNUF9OVU1CX0JJVFMpOworICAgIGYuc2V0X3ByZWNfcmF3ICgxMDAgKiBHTVBfTlVNQl9CSVRTKTsKKyAgfQorfQorCisvLyBzdGQ6Om51bWVyaWNfbGltaXRzCit2b2lkCitjaGVja19saW1pdHMgKHZvaWQpCit7CisgIC8vIENoZWNrIHRoYXQgdGhlIGNvbnRlbnQgaXMgbm90IHByaXZhdGUuCisgIEFTU0VSVF9BTFdBWVMgKCBzdGQ6Om51bWVyaWNfbGltaXRzPG1wel9jbGFzcz46OmlzX2ludGVnZXIpOworICBBU1NFUlRfQUxXQVlTICghc3RkOjpudW1lcmljX2xpbWl0czxtcGZfY2xhc3M+Ojppc19pbnRlZ2VyKTsKKworICAvLyBDaGVjayB0aGF0IHN5bWJvbHMgYXJlIGVtaXR0ZWQuCisgIEFTU0VSVF9BTFdBWVMgKCZzdGQ6Om51bWVyaWNfbGltaXRzPG1wel9jbGFzcz46OmlzX2ludGVnZXIKKwkgICAgICAhPSAmc3RkOjpudW1lcmljX2xpbWl0czxtcHFfY2xhc3M+Ojppc19pbnRlZ2VyKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIGNoZWNrX21weigpOworICBjaGVja19tcHEoKTsKKyAgY2hlY2tfbXBmKCk7CisgIGNoZWNrX2xpbWl0cygpOworCisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LW1peC5jYyBiL3Rlc3RzL2N4eC90LW1peC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY3MzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtbWl4LmNjCkBAIC0wLDAgKzEsODIgQEAKKy8qIFRlc3QgbGVnYWxpdHkgb2YgY29udmVyc2lvbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgbXAqX2NsYXNzCisKK0NvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworaW50IGZfeiAgKG1wel9jbGFzcyl7cmV0dXJuIDA7fQoraW50IGZfcSAgKG1wcV9jbGFzcyl7cmV0dXJuIDE7fQoraW50IGZfZiAgKG1wZl9jbGFzcyl7cmV0dXJuIDI7fQoraW50IGZfenEgKG1wel9jbGFzcyl7cmV0dXJuIDA7fQoraW50IGZfenEgKG1wcV9jbGFzcyl7cmV0dXJuIDE7fQoraW50IGZfemYgKG1wel9jbGFzcyl7cmV0dXJuIDA7fQoraW50IGZfemYgKG1wZl9jbGFzcyl7cmV0dXJuIDI7fQoraW50IGZfcWYgKG1wcV9jbGFzcyl7cmV0dXJuIDE7fQoraW50IGZfcWYgKG1wZl9jbGFzcyl7cmV0dXJuIDI7fQoraW50IGZfenFmKG1wel9jbGFzcyl7cmV0dXJuIDA7fQoraW50IGZfenFmKG1wcV9jbGFzcyl7cmV0dXJuIDE7fQoraW50IGZfenFmKG1wZl9jbGFzcyl7cmV0dXJuIDI7fQorCit2b2lkCitjaGVjayAodm9pZCkKK3sKKyAgbXB6X2NsYXNzIHo9NDI7CisgIG1wcV9jbGFzcyBxPTMzOworICBtcGZfY2xhc3MgZj0xODsKKworICBBU1NFUlRfQUxXQVlTKGZfeiAgKHopPT0wKTsgQVNTRVJUX0FMV0FZUyhmX3ogICgteik9PTApOworICBBU1NFUlRfQUxXQVlTKGZfcSAgKHopPT0xKTsgQVNTRVJUX0FMV0FZUyhmX3EgICgteik9PTEpOworICBBU1NFUlRfQUxXQVlTKGZfcSAgKHEpPT0xKTsgQVNTRVJUX0FMV0FZUyhmX3EgICgtcSk9PTEpOworICBBU1NFUlRfQUxXQVlTKGZfZiAgKHopPT0yKTsgQVNTRVJUX0FMV0FZUyhmX2YgICgteik9PTIpOworICBBU1NFUlRfQUxXQVlTKGZfZiAgKHEpPT0yKTsgQVNTRVJUX0FMV0FZUyhmX2YgICgtcSk9PTIpOworICBBU1NFUlRfQUxXQVlTKGZfZiAgKGYpPT0yKTsgQVNTRVJUX0FMV0FZUyhmX2YgICgtZik9PTIpOworICBBU1NFUlRfQUxXQVlTKGZfenEgKHopPT0wKTsKKyAgQVNTRVJUX0FMV0FZUyhmX3pxIChxKT09MSk7IEFTU0VSVF9BTFdBWVMoZl96cSAoLXEpPT0xKTsKKyAgQVNTRVJUX0FMV0FZUyhmX3pmICh6KT09MCk7CisgIEFTU0VSVF9BTFdBWVMoZl96ZiAoZik9PTIpOyBBU1NFUlRfQUxXQVlTKGZfemYgKC1mKT09Mik7CisgIEFTU0VSVF9BTFdBWVMoZl9xZiAocSk9PTEpOworICBBU1NFUlRfQUxXQVlTKGZfcWYgKGYpPT0yKTsgQVNTRVJUX0FMV0FZUyhmX3FmICgtZik9PTIpOworICBBU1NFUlRfQUxXQVlTKGZfenFmKHopPT0wKTsKKyAgQVNTRVJUX0FMV0FZUyhmX3pxZihxKT09MSk7CisgIEFTU0VSVF9BTFdBWVMoZl96cWYoZik9PTIpOyBBU1NFUlRfQUxXQVlTKGZfenFmKC1mKT09Mik7CisKKyAgQVNTRVJUX0FMV0FZUyhmX3pxZihtcHpfY2xhc3MoeikpPT0wKTsgQVNTRVJUX0FMV0FZUyhmX3pxZihtcHpfY2xhc3MoLXopKT09MCk7CisgIEFTU0VSVF9BTFdBWVMoZl96cWYobXB6X2NsYXNzKHEpKT09MCk7IEFTU0VSVF9BTFdBWVMoZl96cWYobXB6X2NsYXNzKC1xKSk9PTApOworICBBU1NFUlRfQUxXQVlTKGZfenFmKG1wel9jbGFzcyhmKSk9PTApOyBBU1NFUlRfQUxXQVlTKGZfenFmKG1wel9jbGFzcygtZikpPT0wKTsKKyAgQVNTRVJUX0FMV0FZUyhmX3pxZihtcHFfY2xhc3MoeikpPT0xKTsgQVNTRVJUX0FMV0FZUyhmX3pxZihtcHFfY2xhc3MoLXopKT09MSk7CisgIEFTU0VSVF9BTFdBWVMoZl96cWYobXBxX2NsYXNzKHEpKT09MSk7IEFTU0VSVF9BTFdBWVMoZl96cWYobXBxX2NsYXNzKC1xKSk9PTEpOworICBBU1NFUlRfQUxXQVlTKGZfenFmKG1wcV9jbGFzcyhmKSk9PTEpOyBBU1NFUlRfQUxXQVlTKGZfenFmKG1wcV9jbGFzcygtZikpPT0xKTsKKyAgQVNTRVJUX0FMV0FZUyhmX3pxZihtcGZfY2xhc3MoeikpPT0yKTsgQVNTRVJUX0FMV0FZUyhmX3pxZihtcGZfY2xhc3MoLXopKT09Mik7CisgIEFTU0VSVF9BTFdBWVMoZl96cWYobXBmX2NsYXNzKHEpKT09Mik7IEFTU0VSVF9BTFdBWVMoZl96cWYobXBmX2NsYXNzKC1xKSk9PTIpOworICBBU1NFUlRfQUxXQVlTKGZfenFmKG1wZl9jbGFzcyhmKSk9PTIpOyBBU1NFUlRfQUxXQVlTKGZfenFmKG1wZl9jbGFzcygtZikpPT0yKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIGNoZWNrKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3Qtb3BzLmNjIGIvdGVzdHMvY3h4L3Qtb3BzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzZiZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMuY2MKQEAgLTAsMCArMSw3NTMgQEAKKy8qIFRlc3QgbXAqX2NsYXNzIG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgImdtcHh4LmgiCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK3ZvaWQKK2NoZWNrX21weiAodm9pZCkKK3sKKyAgLy8gdW5hcnkgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMKKworICAvLyBvcGVyYXRvcisKKyAgeworICAgIG1wel9jbGFzcyBhKDEpOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSArYTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisKKyAgLy8gb3BlcmF0b3ItCisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKTsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gLWE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMik7CisgIH0KKworICAvLyBvcGVyYXRvcn4KKyAgeworICAgIG1wel9jbGFzcyBhKDMpOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSB+YTsgQVNTRVJUX0FMV0FZUyhiID09IC00KTsKKyAgfQorCisgIC8vIGFicworICB7CisgICAgbXB6X2NsYXNzIGEoLTEyMyk7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IGFicyhhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEyMyk7CisgICAgYSA8PD0gMzAwOworICAgIGIgPSBhYnMoYSk7IEFTU0VSVF9BTFdBWVMoYSArIGIgPT0gMCk7CisgIH0KKworICAvLyBzcXJ0CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyNSk7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IHNxcnQoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSA1KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMTI1KTsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gc3FydChhKTsgQVNTRVJUX0FMV0FZUyhiID09IDExKTsgLy8gcm91bmQgdG93YXJkIHplcm8KKyAgfQorCisgIC8vIHNnbgorICB7CisgICAgbXB6X2NsYXNzIGEoMTIzKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgwKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgtMTIzKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xKTsKKyAgfQorCisKKyAgLy8gYmluYXJ5IG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zCisKKyAgLy8gb3BlcmF0b3IrCisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSArIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAzKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMyk7CisgICAgc2lnbmVkIGludCBiID0gNDsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSArIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSA3KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoNSk7CisgICAgZG91YmxlIGIgPSA2LjA7CisgICAgbXB6X2NsYXNzIGM7CisgICAgYyA9IGIgKyBhOyBBU1NFUlRfQUxXQVlTKGMgPT0gMTEpOworICB9CisKKyAgLy8gb3BlcmF0b3ItCisgIHsKKyAgICBtcHpfY2xhc3MgYSgzKSwgYig2KTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAtIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMyk7CisgIH0KKworICAvLyBvcGVyYXRvcioKKyAgeworICAgIG1wel9jbGFzcyBhKC0yKSwgYig0KTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAqIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAtOCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpOworICAgIGxvbmcgYiA9IC00OworICAgIG1wel9jbGFzcyBjOworICAgIGMgPSBhICogYjsgQVNTRVJUX0FMV0FZUyhjID09IC04KTsKKyAgICBjID0gYiAqIGE7IEFTU0VSVF9BTFdBWVMoYyA9PSAtOCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKC0yKTsKKyAgICB1bnNpZ25lZCBsb25nIGIgPSA0OworICAgIG1wel9jbGFzcyBjOworICAgIGMgPSBhICogYjsgQVNTRVJUX0FMV0FZUyhjID09IC04KTsKKyAgICBjID0gYiAqIGE7IEFTU0VSVF9BTFdBWVMoYyA9PSAtOCk7CisgIH0KKworICAvLyBvcGVyYXRvci8gYW5kIG9wZXJhdG9yJQorICB7CisgICAgbXB6X2NsYXNzIGEoMTIpLCBiKDQpOworICAgIG1wel9jbGFzcyBjOworICAgIGMgPSBhIC8gYjsgQVNTRVJUX0FMV0FZUyhjID09IDMpOworICAgIGMgPSBhICUgYjsgQVNTRVJUX0FMV0FZUyhjID09IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSg3KSwgYig1KTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAvIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAxKTsKKyAgICBjID0gYSAlIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAyKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoLTEwKTsKKyAgICBzaWduZWQgaW50IGFpID0gLTEwOworICAgIG1wel9jbGFzcyBiKDMpOworICAgIHNpZ25lZCBpbnQgYmkgPSAzOworICAgIG1wel9jbGFzcyBjOworICAgIGMgPSBhIC8gYjsgIEFTU0VSVF9BTFdBWVMoYyA9PSAtMyk7CisgICAgYyA9IGEgJSBiOyAgQVNTRVJUX0FMV0FZUyhjID09IC0xKTsKKyAgICBjID0gYSAvIGJpOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTMpOworICAgIGMgPSBhICUgYmk7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMSk7CisgICAgYyA9IGFpIC8gYjsgQVNTRVJUX0FMV0FZUyhjID09IC0zKTsKKyAgICBjID0gYWkgJSBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTEpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgtMTApOworICAgIHNpZ25lZCBpbnQgYWkgPSAtMTA7CisgICAgbXB6X2NsYXNzIGIoLTMpOworICAgIHNpZ25lZCBpbnQgYmkgPSAtMzsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAvIGI7ICBBU1NFUlRfQUxXQVlTKGMgPT0gMyk7CisgICAgYyA9IGEgJSBiOyAgQVNTRVJUX0FMV0FZUyhjID09IC0xKTsKKyAgICBjID0gYSAvIGJpOyBBU1NFUlRfQUxXQVlTKGMgPT0gMyk7CisgICAgYyA9IGEgJSBiaTsgQVNTRVJUX0FMV0FZUyhjID09IC0xKTsKKyAgICBjID0gYWkgLyBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gMyk7CisgICAgYyA9IGFpICUgYjsgQVNTRVJUX0FMV0FZUyhjID09IC0xKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEgKExPTkdfTUlOKTsKKyAgICBzaWduZWQgbG9uZyBhaSA9IExPTkdfTUlOOworICAgIG1wel9jbGFzcyBiID0gLSBtcHpfY2xhc3MgKExPTkdfTUlOKTsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSAvIGI7ICBBU1NFUlRfQUxXQVlTKGMgPT0gLTEpOworICAgIGMgPSBhICUgYjsgIEFTU0VSVF9BTFdBWVMoYyA9PSAwKTsKKyAgICBjID0gYWkgLyBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTEpOworICAgIGMgPSBhaSAlIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAwKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yJgorICAvLyBvcGVyYXRvcnwKKyAgLy8gb3BlcmF0b3JeCisKKyAgLy8gb3BlcmF0b3I8PAorICB7CisgICAgbXB6X2NsYXNzIGEoMyk7CisgICAgdW5zaWduZWQgaW50IGIgPSA0OworICAgIG1wel9jbGFzcyBjOworICAgIGMgPSBhIDw8IGI7IEFTU0VSVF9BTFdBWVMoYyA9PSA0OCk7CisgIH0KKworICAvLyBvcGVyYXRvcj4+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjcpOworICAgIHVuc2lnbmVkIGludCBiID0gNDsKKyAgICBtcHpfY2xhc3MgYzsKKyAgICBjID0gYSA+PiBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gNyk7CisgIH0KKworICAvLyBvcGVyYXRvcj09CisgIC8vIG9wZXJhdG9yIT0KKyAgLy8gb3BlcmF0b3I8CisgIC8vIG9wZXJhdG9yPD0KKyAgLy8gb3BlcmF0b3I+CisgIC8vIG9wZXJhdG9yPj0KKworICAvLyBjbXAKKyAgeworICAgIG1wel9jbGFzcyBhKDEyMyksIGIoNDUpOworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjMpOworICAgIHVuc2lnbmVkIGxvbmcgYiA9IDQ1OworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjMpOworICAgIGxvbmcgYiA9IDQ1OworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxMjMpOworICAgIGRvdWJsZSBiID0gNDU7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKworCisgIC8vIHRlcm5hcnkgb3BlcmF0b3JzCisKKyAgLy8gbXB6X2FkZG11bAorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKyBiICogYzsgQVNTRVJUX0FMV0FZUyhkID09IDcpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDM7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKyBiICogYzsgQVNTRVJUX0FMV0FZUyhkID09IDcpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigzKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDI7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKyBjICogYjsgQVNTRVJUX0FMV0FZUyhkID09IDcpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBzaWduZWQgaW50IGMgPSAzOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICsgYiAqIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSA3KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMyk7CisgICAgc2lnbmVkIGludCBjID0gMjsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSArIGMgKiBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gNyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIGRvdWJsZSBjID0gMy4wOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICsgYiAqIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSA3KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMyk7CisgICAgZG91YmxlIGMgPSAyLjA7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKyBjICogYjsgQVNTRVJUX0FMV0FZUyhkID09IDcpOworICB9CisKKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYiArIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAxMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDQpOworICAgIHVuc2lnbmVkIGludCBjID0gMzsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAqIGMgKyBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gMTApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgzKSwgYig0KTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDI7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGMgKiBhICsgYjsgQVNTRVJUX0FMV0FZUyhkID09IDEwKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoNCk7CisgICAgc2lnbmVkIGludCBjID0gMzsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAqIGMgKyBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gMTApOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgzKSwgYig0KTsKKyAgICBzaWduZWQgaW50IGMgPSAyOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBjICogYSArIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAxMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDQpOworICAgIGRvdWJsZSBjID0gMy4wOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYyArIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAxMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDMpLCBiKDQpOworICAgIGRvdWJsZSBjID0gMi4wOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBjICogYSArIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAxMCk7CisgIH0KKworICAvLyBtcHpfc3VibXVsCisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAtIGIgKiBjOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDM7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgLSBiICogYzsgQVNTRVJUX0FMV0FZUyhkID09IC01KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMyk7CisgICAgdW5zaWduZWQgaW50IGMgPSAyOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhIC0gYyAqIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAtNSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHNpZ25lZCBpbnQgYyA9IDM7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgLSBiICogYzsgQVNTRVJUX0FMV0FZUyhkID09IC01KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMyk7CisgICAgc2lnbmVkIGludCBjID0gMjsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAtIGMgKiBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBkb3VibGUgYyA9IDMuMDsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAtIGIgKiBjOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigzKTsKKyAgICBkb3VibGUgYyA9IDIuMDsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAtIGMgKiBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTUpOworICB9CisKKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYiAtIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAyKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoNCk7CisgICAgdW5zaWduZWQgaW50IGMgPSAzOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYyAtIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAyKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMyksIGIoNCk7CisgICAgdW5zaWduZWQgaW50IGMgPSAyOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBjICogYSAtIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAyKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoNCk7CisgICAgc2lnbmVkIGludCBjID0gMzsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAqIGMgLSBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gMik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDMpLCBiKDQpOworICAgIHNpZ25lZCBpbnQgYyA9IDI7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGMgKiBhIC0gYjsgQVNTRVJUX0FMV0FZUyhkID09IDIpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYig0KTsKKyAgICBkb3VibGUgYyA9IDMuMDsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAqIGMgLSBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gMik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDMpLCBiKDQpOworICAgIGRvdWJsZSBjID0gMi4wOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBjICogYSAtIGI7IEFTU0VSVF9BTFdBWVMoZCA9PSAyKTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcHEgKHZvaWQpCit7CisgIC8vIHVuYXJ5IG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zCisKKyAgLy8gb3BlcmF0b3IrCisgIHsKKyAgICBtcHFfY2xhc3MgYSgxLCAyKTsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gK2E7IEFTU0VSVF9BTFdBWVMoYiA9PSAwLjUpOworICB9CisKKyAgLy8gb3BlcmF0b3ItCisgIHsKKyAgICBtcHFfY2xhc3MgYSgzLCA0KTsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gLWE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMC43NSk7CisgIH0KKworICAvLyBhYnMKKyAgeworICAgIG1wcV9jbGFzcyBhKC0xMjMpOworICAgIG1wcV9jbGFzcyBiOworICAgIGIgPSBhYnMoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gc2duCisgIHsKKyAgICBtcHFfY2xhc3MgYSgxMjMpOworICAgIGludCBiID0gc2duKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMSk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKDApOworICAgIGludCBiID0gc2duKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMCk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKC0xMjMpOworICAgIGludCBiID0gc2duKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEpOworICB9CisKKworICAvLyBiaW5hcnkgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMKKworICAvLyBvcGVyYXRvcisKKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDIpLCBiKDMsIDQpOworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBhICsgYjsgQVNTRVJUX0FMV0FZUyhjID09IDEuMjUpOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxLCAyKTsKKyAgICBzaWduZWQgaW50IGIgPSAyOworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBhICsgYjsgQVNTRVJUX0FMV0FZUyhjID09IDIuNSk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDIpOworICAgIGRvdWJsZSBiID0gMS41OworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBiICsgYTsgQVNTRVJUX0FMV0FZUyhjID09IDIpOworICB9CisKKyAgLy8gb3BlcmF0b3ItCisgIHsKKyAgICBtcHFfY2xhc3MgYSgxLCAyKSwgYigzLCA0KTsKKyAgICBtcHFfY2xhc3MgYzsKKyAgICBjID0gYSAtIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAtMC4yNSk7CisgIH0KKworICAvLyBvcGVyYXRvcioKKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDMpLCBiKDMsIDQpOworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBhICogYjsgQVNTRVJUX0FMV0FZUyhjID09IDAuMjUpOworICAgIGMgPSBiICogYjsgQVNTRVJUX0FMV0FZUyhjID09IDAuNTYyNSk7CisgIH0KKworICAvLyBvcGVyYXRvci8KKyAgeworICAgIG1wcV9jbGFzcyBhKDEsIDIpLCBiKDIsIDMpOworICAgIG1wcV9jbGFzcyBjOworICAgIGMgPSBhIC8gYjsgQVNTRVJUX0FMV0FZUyhjID09IDAuNzUpOworICB9CisgIHsKKyAgICBtcHFfY2xhc3Mgb25lID0gMTsKKyAgICBtcHFfY2xhc3MgeCgyLCA1KTsKKyAgICBBU1NFUlRfQUxXQVlTKDEgLyB4ID09IG9uZSAvIHgpOworICAgIEFTU0VSVF9BTFdBWVMoMXUgLyB4ID09IG9uZSAvIHgpOworICAgIHggPSAoLTEpIC8geDsKKyAgICBBU1NFUlRfQUxXQVlTKHggPT0gLTIuNSk7CisgICAgQVNTRVJUX0FMV0FZUygwIC8geCA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTKDB1IC8geCA9PSAwKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yPDwKKyAgLy8gb3BlcmF0b3I+PgorICAvLyBvcGVyYXRvcj09CisgIC8vIG9wZXJhdG9yIT0KKyAgLy8gb3BlcmF0b3I8CisgIC8vIG9wZXJhdG9yPD0KKyAgLy8gb3BlcmF0b3I+CisgIC8vIG9wZXJhdG9yPj0KKworICAvLyBjbXAKKyAgeworICAgIG1wcV9jbGFzcyBhKDEyMyksIGIoNDUpOworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxMjMpOworICAgIHVuc2lnbmVkIGxvbmcgYiA9IDQ1OworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxMjMpOworICAgIGxvbmcgYiA9IDQ1OworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxMjMpOworICAgIGRvdWJsZSBiID0gNDU7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKyAgeworICAgIG1wcV9jbGFzcyBhKDEyMyk7CisgICAgbXB6X2NsYXNzIGIoNDUpOworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9Cit9CisKK3ZvaWQKK2NoZWNrX21wZiAodm9pZCkKK3sKKyAgLy8gdW5hcnkgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMKKworICAvLyBvcGVyYXRvcisKKyAgeworICAgIG1wZl9jbGFzcyBhKDEpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSArYTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisKKyAgLy8gb3BlcmF0b3ItCisgIHsKKyAgICBtcGZfY2xhc3MgYSgyKTsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gLWE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMik7CisgIH0KKworICAvLyBhYnMKKyAgeworICAgIG1wZl9jbGFzcyBhKC0xMjMpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBhYnMoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxMjMpOworICB9CisKKyAgLy8gdHJ1bmMKKyAgeworICAgIG1wZl9jbGFzcyBhKDEuNSk7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IHRydW5jKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMSk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKC0xLjUpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSB0cnVuYyhhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xKTsKKyAgfQorCisgIC8vIGZsb29yCisgIHsKKyAgICBtcGZfY2xhc3MgYSgxLjkpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBmbG9vcihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgYSgtMS4xKTsKKyAgICBtcGZfY2xhc3MgYjsKKyAgICBiID0gZmxvb3IoYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMik7CisgIH0KKworICAvLyBjZWlsCisgIHsKKyAgICBtcGZfY2xhc3MgYSgxLjEpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBjZWlsKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMik7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKC0xLjkpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBjZWlsKGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTEpOworICB9CisKKyAgLy8gc3FydAorICB7CisgICAgbXBmX2NsYXNzIGEoMjUpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBzcXJ0KGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gNSk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDIuMjUpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSBzcXJ0KGEpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMS41KTsKKyAgfQorCisgIC8vIHNnbgorICB7CisgICAgbXBmX2NsYXNzIGEoMTIzKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgYSgwKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IDApOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgYSgtMTIzKTsKKyAgICBpbnQgYiA9IHNnbihhKTsgQVNTRVJUX0FMV0FZUyhiID09IC0xKTsKKyAgfQorCisKKyAgLy8gYmluYXJ5IG9wZXJhdG9ycyBhbmQgZnVuY3Rpb25zCisKKyAgLy8gb3BlcmF0b3IrCisgIHsKKyAgICBtcGZfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBtcGZfY2xhc3MgYzsKKyAgICBjID0gYSArIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAzKTsKKyAgfQorCisgIC8vIG9wZXJhdG9yLQorICB7CisgICAgbXBmX2NsYXNzIGEoMyksIGIoNCk7CisgICAgbXBmX2NsYXNzIGM7CisgICAgYyA9IGEgLSBiOyBBU1NFUlRfQUxXQVlTKGMgPT0gLTEpOworICB9CisKKyAgLy8gb3BlcmF0b3IqCisgIHsKKyAgICBtcGZfY2xhc3MgYSgyKSwgYig1KTsKKyAgICBtcGZfY2xhc3MgYzsKKyAgICBjID0gYSAqIGI7IEFTU0VSVF9BTFdBWVMoYyA9PSAxMCk7CisgIH0KKworICAvLyBvcGVyYXRvci8KKyAgeworICAgIG1wZl9jbGFzcyBhKDcpLCBiKDQpOworICAgIG1wZl9jbGFzcyBjOworICAgIGMgPSBhIC8gYjsgQVNTRVJUX0FMV0FZUyhjID09IDEuNzUpOworICB9CisKKyAgLy8gb3BlcmF0b3I8PAorICAvLyBvcGVyYXRvcj4+CisgIC8vIG9wZXJhdG9yPT0KKyAgLy8gb3BlcmF0b3IhPQorICAvLyBvcGVyYXRvcjwKKyAgLy8gb3BlcmF0b3I8PQorICAvLyBvcGVyYXRvcj4KKyAgLy8gb3BlcmF0b3I+PQorCisgIC8vIGh5cG90CisgIHsKKyAgICBtcGZfY2xhc3MgYSgzKSwgYig0KTsKKyAgICBtcGZfY2xhc3MgYzsKKyAgICBjID0gaHlwb3QoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA9PSA1KTsKKyAgfQorCisgIC8vIGNtcAorICB7CisgICAgbXBmX2NsYXNzIGEoMTIzKSwgYig0NSk7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgdW5zaWduZWQgbG9uZyBiID0gNDU7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgbG9uZyBiID0gNDU7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgZG91YmxlIGIgPSA0NTsKKyAgICBpbnQgYzsKKyAgICBjID0gY21wKGEsIGIpOyBBU1NFUlRfQUxXQVlTKGMgPiAwKTsKKyAgICBjID0gY21wKGIsIGEpOyBBU1NFUlRfQUxXQVlTKGMgPCAwKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGEoMTIzKTsKKyAgICBtcHpfY2xhc3MgYig0NSk7CisgICAgaW50IGM7CisgICAgYyA9IGNtcChhLCBiKTsgQVNTRVJUX0FMV0FZUyhjID4gMCk7CisgICAgYyA9IGNtcChiLCBhKTsgQVNTRVJUX0FMV0FZUyhjIDwgMCk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDEyMyk7CisgICAgbXBxX2NsYXNzIGIoNDUpOworICAgIGludCBjOworICAgIGMgPSBjbXAoYSwgYik7IEFTU0VSVF9BTFdBWVMoYyA+IDApOworICAgIGMgPSBjbXAoYiwgYSk7IEFTU0VSVF9BTFdBWVMoYyA8IDApOworICB9Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIGNoZWNrX21weigpOworICBjaGVja19tcHEoKTsKKyAgY2hlY2tfbXBmKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3Qtb3BzMi5oIGIvdGVzdHMvY3h4L3Qtb3BzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODk4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMyLmgKQEAgLTAsMCArMSw4MiBAQAorLyogVGVzdCBtcCpfY2xhc3Mgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMuCisKK0NvcHlyaWdodCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisjZGVmaW5lIENIRUNLMShUeXBlLGEsZnVuKSBcCisgIEFTU0VSVF9BTFdBWVMoZnVuKChUeXBlKShhKSk9PWZ1bihhKSkKKyNkZWZpbmUgQ0hFQ0soVHlwZTEsVHlwZTIsYSxiLG9wKSBcCisgIEFTU0VSVF9BTFdBWVMoKChUeXBlMSkoYSkgb3AgKFR5cGUyKShiKSk9PSgoYSkgb3AgKGIpKSkKKyNkZWZpbmUgQ0hFQ0tfRyhUeXBlLGEsYixvcCkgXAorICBDSEVDSyhUeXBlLFR5cGUsYSxiLG9wKQorI2RlZmluZSBDSEVDS19VSShUeXBlLGEsYixvcCkgXAorICBDSEVDSyhUeXBlLHVuc2lnbmVkIGxvbmcsYSxiLG9wKTsgXAorICBDSEVDSyh1bnNpZ25lZCBsb25nLFR5cGUsYSxiLG9wKQorI2RlZmluZSBDSEVDS19TSShUeXBlLGEsYixvcCkgXAorICBDSEVDSyhUeXBlLGxvbmcsYSxiLG9wKTsgXAorICBDSEVDSyhsb25nLFR5cGUsYSxiLG9wKQorI2RlZmluZSBDSEVDS19EKFR5cGUsYSxiLG9wKSBcCisgIENIRUNLKFR5cGUsZG91YmxlLGEsYixvcCk7IFwKKyAgQ0hFQ0soZG91YmxlLFR5cGUsYSxiLG9wKQorI2RlZmluZSBDSEVDS19NUFooVHlwZSxhLGIsb3ApIFwKKyAgQ0hFQ0soVHlwZSxtcHpfY2xhc3MsYSxiLG9wKTsgXAorICBDSEVDSyhtcHpfY2xhc3MsVHlwZSxhLGIsb3ApCisjZGVmaW5lIENIRUNLX01QUShUeXBlLGEsYixvcCkgXAorICBDSEVDSyhUeXBlLG1wcV9jbGFzcyxhLGIsb3ApOyBcCisgIENIRUNLKG1wcV9jbGFzcyxUeXBlLGEsYixvcCkKKyNkZWZpbmUgQ0hFQ0tfQUxMX1NJR05FRChUeXBlLGEsYixvcCkgXAorICBDSEVDS19HKFR5cGUsYSxiLG9wKTsgXAorICBDSEVDS19TSShUeXBlLGEsYixvcCk7IFwKKyAgQ0hFQ0tfRChUeXBlLGEsYixvcCkKKyNkZWZpbmUgQ0hFQ0tfQUxMX1NJR05TKFR5cGUsYSxiLG9wKSBcCisgIENIRUNLX0FMTF9TSUdORUQoVHlwZSxhLGIsb3ApOyBcCisgIENIRUNLX0FMTF9TSUdORUQoVHlwZSwtKGEpLGIsb3ApOyBcCisgIENIRUNLX0FMTF9TSUdORUQoVHlwZSxhLC0oYiksb3ApOyBcCisgIENIRUNLX0FMTF9TSUdORUQoVHlwZSwtKGEpLC0oYiksb3ApCisjZGVmaW5lIENIRUNLX0FMTChUeXBlLGEsYixvcCkgXAorICBDSEVDS19BTExfU0lHTkVEKFR5cGUsYSxiLG9wKTsgXAorICBDSEVDS19VSShUeXBlLGEsYixvcCkKKyNkZWZpbmUgQ0hFQ0tfQUxMX1NJR05FRF9DT01QQVJJU09OUyhUeXBlLGEsYikgXAorICBDSEVDS19BTExfU0lHTkVEKFR5cGUsYSxiLDwpOyBcCisgIENIRUNLX0FMTF9TSUdORUQoVHlwZSxhLGIsPik7IFwKKyAgQ0hFQ0tfQUxMX1NJR05FRChUeXBlLGEsYiw8PSk7IFwKKyAgQ0hFQ0tfQUxMX1NJR05FRChUeXBlLGEsYiw+PSk7IFwKKyAgQ0hFQ0tfQUxMX1NJR05FRChUeXBlLGEsYiw9PSk7IFwKKyAgQ0hFQ0tfQUxMX1NJR05FRChUeXBlLGEsYiwhPSkKKyNkZWZpbmUgQ0hFQ0tfQUxMX1NJR05TX0NPTVBBUklTT05TKFR5cGUsYSxiKSBcCisgIENIRUNLX0FMTF9TSUdOUyhUeXBlLGEsYiw8KTsgXAorICBDSEVDS19BTExfU0lHTlMoVHlwZSxhLGIsPik7IFwKKyAgQ0hFQ0tfQUxMX1NJR05TKFR5cGUsYSxiLDw9KTsgXAorICBDSEVDS19BTExfU0lHTlMoVHlwZSxhLGIsPj0pOyBcCisgIENIRUNLX0FMTF9TSUdOUyhUeXBlLGEsYiw9PSk7IFwKKyAgQ0hFQ0tfQUxMX1NJR05TKFR5cGUsYSxiLCE9KQorI2RlZmluZSBDSEVDS19BTExfQ09NUEFSSVNPTlMoVHlwZSxhLGIpIFwKKyAgQ0hFQ0tfQUxMKFR5cGUsYSxiLDwpOyBcCisgIENIRUNLX0FMTChUeXBlLGEsYiw+KTsgXAorICBDSEVDS19BTEwoVHlwZSxhLGIsPD0pOyBcCisgIENIRUNLX0FMTChUeXBlLGEsYiw+PSk7IFwKKyAgQ0hFQ0tfQUxMKFR5cGUsYSxiLD09KTsgXAorICBDSEVDS19BTEwoVHlwZSxhLGIsIT0pCmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1vcHMyZi5jYyBiL3Rlc3RzL2N4eC90LW9wczJmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzllMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMyZi5jYwpAQCAtMCwwICsxLDg3IEBACisvKiBUZXN0IG1wKl9jbGFzcyBvcGVyYXRvcnMgYW5kIGZ1bmN0aW9ucy4KKworQ29weXJpZ2h0IDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJ0LW9wczIuaCIKKwordm9pZCBjaGVja2YgKCl7CisgIEFTU0VSVF9BTFdBWVMoc3FydChtcGZfY2xhc3MoNykpPjIuNjQpOworICBBU1NFUlRfQUxXQVlTKHNxcnQobXBmX2NsYXNzKDcpKTwyLjY1KTsKKyAgQVNTRVJUX0FMV0FZUyhzcXJ0KG1wZl9jbGFzcygwKSk9PTApOworICAvLyBUT0RPOiBhZGQgc29tZSBjb25zaXN0ZW5jeSBjaGVja3MsIGFzIGRlc2NyaWJlZCBpbgorICAvLyBodHRwczovL2dtcGxpYi5vcmcvbGlzdC1hcmNoaXZlcy9nbXAtYnVncy8yMDEzLUZlYnJ1YXJ5LzAwMjk0MC5odG1sCisgIENIRUNLMShtcGZfY2xhc3MsMS45LHRydW5jKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcywxLjksZmxvb3IpOworICBDSEVDSzEobXBmX2NsYXNzLDEuOSxjZWlsKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcyw0LjMsdHJ1bmMpOworICBDSEVDSzEobXBmX2NsYXNzLDQuMyxmbG9vcik7CisgIENIRUNLMShtcGZfY2xhc3MsNC4zLGNlaWwpOworICBDSEVDSzEobXBmX2NsYXNzLC03LjEsdHJ1bmMpOworICBDSEVDSzEobXBmX2NsYXNzLC03LjEsZmxvb3IpOworICBDSEVDSzEobXBmX2NsYXNzLC03LjEsY2VpbCk7CisgIENIRUNLMShtcGZfY2xhc3MsLTIuOCx0cnVuYyk7CisgIENIRUNLMShtcGZfY2xhc3MsLTIuOCxmbG9vcik7CisgIENIRUNLMShtcGZfY2xhc3MsLTIuOCxjZWlsKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcywtMS41LHRydW5jKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcywtMS41LGZsb29yKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcywtMS41LGNlaWwpOworICBDSEVDSzEobXBmX2NsYXNzLDIuNSx0cnVuYyk7CisgIENIRUNLMShtcGZfY2xhc3MsMi41LGZsb29yKTsKKyAgQ0hFQ0sxKG1wZl9jbGFzcywyLjUsY2VpbCk7CisgIEFTU0VSVF9BTFdBWVMoaHlwb3QobXBmX2NsYXNzKC0zKSxtcGZfY2xhc3MoNCkpPjQuOSk7CisgIEFTU0VSVF9BTFdBWVMoaHlwb3QobXBmX2NsYXNzKC0zKSxtcGZfY2xhc3MoNCkpPDUuMSk7CisgIEFTU0VSVF9BTFdBWVMoaHlwb3QobXBmX2NsYXNzKC0zKSw0Lik+NC45KTsKKyAgQVNTRVJUX0FMV0FZUyhoeXBvdCgtMy4sbXBmX2NsYXNzKDQpKTw1LjEpOworICBBU1NFUlRfQUxXQVlTKGh5cG90KG1wZl9jbGFzcygtMyksNGwpPjQuOSk7CisgIEFTU0VSVF9BTFdBWVMoaHlwb3QoLTNsLG1wZl9jbGFzcyg0KSk8NS4xKTsKKyAgQVNTRVJUX0FMV0FZUyhoeXBvdChtcGZfY2xhc3MoLTMpLDR1bCk+NC45KTsKKyAgQVNTRVJUX0FMV0FZUyhoeXBvdCgzdWwsbXBmX2NsYXNzKDQpKTw1LjEpOworICBDSEVDSyhtcGZfY2xhc3MsbXBxX2NsYXNzLDEuNSwyLjI1LCspOworICBDSEVDSyhtcGZfY2xhc3MsbXBxX2NsYXNzLDEuNSwyLjI1LC0pOworICBDSEVDSyhtcGZfY2xhc3MsbXBxX2NsYXNzLDEuNSwtMi4yNSwqKTsKKyAgQ0hFQ0sobXBmX2NsYXNzLG1wcV9jbGFzcywxLjUsLTIsLyk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsLTUuNSwtMi4yNSwrKTsKKyAgQ0hFQ0tfTVBRKG1wZl9jbGFzcywtNS41LC0yLjI1LC0pOworICBDSEVDS19NUFEobXBmX2NsYXNzLC01LjUsLTIuMjUsKik7CisgIENIRUNLX01QUShtcGZfY2xhc3MsLTUuMjUsLTAuNSwvKTsKKyAgQ0hFQ0tfTVBRKG1wZl9jbGFzcyw1LC0yLDwpOworICBDSEVDS19NUFEobXBmX2NsYXNzLDUsLTIsPik7CisgIENIRUNLX01QUShtcGZfY2xhc3MsNSwtMiw8PSk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsNSwtMiw+PSk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsNSwtMiw9PSk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsNSwtMiwhPSk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsMCwwLDwpOworICBDSEVDS19NUFEobXBmX2NsYXNzLDAsMCw+KTsKKyAgQ0hFQ0tfTVBRKG1wZl9jbGFzcywwLDAsPD0pOworICBDSEVDS19NUFEobXBmX2NsYXNzLDAsMCw+PSk7CisgIENIRUNLX01QUShtcGZfY2xhc3MsMCwwLD09KTsKKyAgQ0hFQ0tfTVBRKG1wZl9jbGFzcywwLDAsIT0pOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0KCk7CisKKyAgLy8gRW5vdWdoIHByZWNpc2lvbiBmb3IgMSArIGRlbm9ybV9taW4KKyAgbXBmX3NldF9kZWZhdWx0X3ByZWMoREJMX01BTlRfRElHLURCTF9NSU5fRVhQKzQyKTsKKyAgY2hlY2tmKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3Qtb3BzMnFmLmNjIGIvdGVzdHMvY3h4L3Qtb3BzMnFmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTZmNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMycWYuY2MKQEAgLTAsMCArMSw4OSBAQAorLyogVGVzdCBtcCpfY2xhc3Mgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMuCisKK0NvcHlyaWdodCAyMDExLCAyMDEyLCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAidC1vcHMyLmgiCisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIGNoZWNrcWYgKCl7CisgIENIRUNLX0FMTChULDUuLDAsKyk7CisgIENIRUNLX0FMTChULDUuLDAsLSk7CisgIENIRUNLX0FMTChULDUuLDIsKyk7IENIRUNLX01QWihULDUuLDIsKyk7CisgIENIRUNLX0FMTChULDUuLDIsLSk7IENIRUNLX01QWihULDUuLDIsLSk7CisgIENIRUNLX0FMTChULDUuLDIsKik7IENIRUNLX01QWihULDUuLDIsKik7CisgIENIRUNLX0FMTChULDUuLDIsLyk7IENIRUNLX01QWihULDUuLDIsLyk7CisgIENIRUNLX0FMTChULDAuLDIsLyk7CisgIENIRUNLX0FMTF9TSUdOUyhULDExLiwzLCspOworICBDSEVDS19BTExfU0lHTlMoVCwxMS4sMywtKTsKKyAgQ0hFQ0tfQUxMX1NJR05TKFQsMTMuLDEsKyk7CisgIENIRUNLX0FMTF9TSUdOUyhULDEzLiwxLC0pOworICBDSEVDS19BTExfU0lHTlMoVCwxMS4sMywqKTsKKyAgQ0hFQ0tfQUxMX1NJR05TKFQsMTEuLDQsLyk7CisgIENIRUNLX1NJKFQsTE9OR19NSU4sMSwqKTsKKyAgQ0hFQ0tfU0koVCwwLDMsKik7CisgIENIRUNLX0FMTF9DT01QQVJJU09OUyhULDUuLDIpOworICBDSEVDS19BTExfU0lHTlNfQ09NUEFSSVNPTlMoVCwxMS4sMyk7CisgIENIRUNLX01QWihULDUsLTIsPCk7CisgIENIRUNLX01QWihULDUsLTIsPik7CisgIENIRUNLX01QWihULDUsLTIsPD0pOworICBDSEVDS19NUFooVCw1LC0yLD49KTsKKyAgQ0hFQ0tfTVBaKFQsNSwtMiw9PSk7CisgIENIRUNLX01QWihULDUsLTIsIT0pOworICBDSEVDS19NUFooVCwwLDAsPCk7CisgIENIRUNLX01QWihULDAsMCw+KTsKKyAgQ0hFQ0tfTVBaKFQsMCwwLDw9KTsKKyAgQ0hFQ0tfTVBaKFQsMCwwLD49KTsKKyAgQ0hFQ0tfTVBaKFQsMCwwLD09KTsKKyAgQ0hFQ0tfTVBaKFQsMCwwLCE9KTsKKyAgQVNTRVJUX0FMV0FZUyhUKDYpPDwyPT02Lio0KTsKKyAgQVNTRVJUX0FMV0FZUyhUKDYpPj4yPT02Li80KTsKKyAgQVNTRVJUX0FMV0FZUyhUKC0xMyk8PDI9PS0xMy4qNCk7CisgIEFTU0VSVF9BTFdBWVMoVCgtMTMpPj4yPT0tMTMuLzQpOworICBBU1NFUlRfQUxXQVlTKCsrVCg3KT09OCk7CisgIEFTU0VSVF9BTFdBWVMoKytUKC04KT09LTcpOworICBBU1NFUlRfQUxXQVlTKC0tVCg4KT09Nyk7CisgIEFTU0VSVF9BTFdBWVMoLS1UKC03KT09LTgpOworICBBU1NFUlRfQUxXQVlTKCtUKDcpPT03KTsKKyAgQVNTRVJUX0FMV0FZUygrVCgtOCk9PS04KTsKKyAgQVNTRVJUX0FMV0FZUygtVCg3KT09LTcpOworICBBU1NFUlRfQUxXQVlTKC1UKC04KT09OCk7CisgIEFTU0VSVF9BTFdBWVMoYWJzKFQoNykpPT03KTsKKyAgQVNTRVJUX0FMV0FZUyhhYnMoVCgtOCkpPT04KTsKKyAgQVNTRVJUX0FMV0FZUyhzZ24oVCgwKSk9PTApOworICBBU1NFUlRfQUxXQVlTKHNnbihUKDkpKT09MSk7CisgIEFTU0VSVF9BTFdBWVMoc2duKFQoLTE3KSk9PS0xKTsKKyAgQVNTRVJUX0FMV0FZUyhUKDEpK0RCTF9NQVg+Mik7CisgIEFTU0VSVF9BTFdBWVMoVCgxKStEQkxfTUlOPjEpOworICBBU1NFUlRfQUxXQVlTKFQoMSkrREJMX01JTjwxLjAwMSk7CisgIEFTU0VSVF9BTFdBWVMoVCgxKStzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRlbm9ybV9taW4oKT4xKTsKKyAgQVNTRVJUX0FMV0FZUyhUKDEpK3N0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGVub3JtX21pbigpPDEuMDAxKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIC8vIEVub3VnaCBwcmVjaXNpb24gZm9yIDEgKyBkZW5vcm1fbWluCisgIG1wZl9zZXRfZGVmYXVsdF9wcmVjKERCTF9NQU5UX0RJRy1EQkxfTUlOX0VYUCs0Mik7CisgIGNoZWNrcWY8bXBxX2NsYXNzPigpOworICBjaGVja3FmPG1wZl9jbGFzcz4oKTsKKworICB0ZXN0c19lbmQoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1vcHMyei5jYyBiL3Rlc3RzL2N4eC90LW9wczJ6LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Njk0YjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMyei5jYwpAQCAtMCwwICsxLDEyNiBAQAorLyogVGVzdCBtcCpfY2xhc3Mgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMuCisKK0NvcHlyaWdodCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAidC1vcHMyLmgiCisKK3ZvaWQgY2hlY2t6ICgpeworICBDSEVDS19BTEwobXB6X2NsYXNzLDUsMiwrKTsKKyAgQ0hFQ0tfQUxMKG1wel9jbGFzcyw1LDIsLSk7CisgIENIRUNLX0FMTChtcHpfY2xhc3MsNSwyLCopOworICBDSEVDS19BTEwobXB6X2NsYXNzLDUsMiwvKTsKKyAgQ0hFQ0tfQUxMKG1wel9jbGFzcyw1LDIsJSk7CisgIENIRUNLX0FMTF9DT01QQVJJU09OUyhtcHpfY2xhc3MsNSwyKTsKKyAgQ0hFQ0tfQUxMX1NJR05TKG1wel9jbGFzcywxMSwzLCspOworICBDSEVDS19BTExfU0lHTlMobXB6X2NsYXNzLDExLDMsLSk7CisgIENIRUNLX0FMTF9TSUdOUyhtcHpfY2xhc3MsMTEsMywqKTsKKyAgQ0hFQ0tfQUxMX1NJR05TKG1wel9jbGFzcywxMSwzLC8pOworICBDSEVDS19BTExfU0lHTlMobXB6X2NsYXNzLDExLDMsJSk7CisgIENIRUNLX0FMTF9TSUdOUyhtcHpfY2xhc3MsMTcsMiwqKTsKKyAgQ0hFQ0tfQUxMX1NJR05TKG1wel9jbGFzcywxNywyLC8pOworICBDSEVDS19BTExfU0lHTlMobXB6X2NsYXNzLDE3LDIsJSk7CisgIENIRUNLKHVuc2lnbmVkIGxvbmcsbXB6X2NsYXNzLDUsLTIsLyk7CisgIENIRUNLKHVuc2lnbmVkIGxvbmcsbXB6X2NsYXNzLDUsLTIsJSk7CisgIEFTU0VSVF9BTFdBWVMoN3VsL21wel9jbGFzcygxZTM1KT09MCk7CisgIEFTU0VSVF9BTFdBWVMoN3VsJW1wel9jbGFzcygxZTM1KT09Nyk7CisgIEFTU0VSVF9BTFdBWVMoN3VsL21wel9jbGFzcygtMWUzNSk9PTApOworICBBU1NFUlRfQUxXQVlTKDd1bCVtcHpfY2xhc3MoLTFlMzUpPT03KTsKKyAgQ0hFQ0tfQUxMX1NJR05TX0NPTVBBUklTT05TKG1wel9jbGFzcywxMSwzKTsKKyAgQ0hFQ0tfQUxMKG1wel9jbGFzcyw2LDMsJik7CisgIENIRUNLX0FMTChtcHpfY2xhc3MsNiwzLHwpOworICBDSEVDS19BTEwobXB6X2NsYXNzLDYsMyxeKTsKKyAgQ0hFQ0sobXB6X2NsYXNzLHVuc2lnbmVkIGxvbmcsNiwyLDw8KTsKKyAgQ0hFQ0sobXB6X2NsYXNzLHVuc2lnbmVkIGxvbmcsNiwyLD4+KTsKKyAgQVNTRVJUX0FMV0FZUygobXB6X2NsYXNzKC0xMyk8PCh1bnNpZ25lZCBsb25nKTIpID09ICgtMTMpKjQpOworICBDSEVDSyhtcHpfY2xhc3MsdW5zaWduZWQgbG9uZywtMTMsMiw+Pik7CisgIEFTU0VSVF9BTFdBWVMoKyttcHpfY2xhc3MoNyk9PTgpOworICBBU1NFUlRfQUxXQVlTKCsrbXB6X2NsYXNzKC04KT09LTcpOworICBBU1NFUlRfQUxXQVlTKC0tbXB6X2NsYXNzKDgpPT03KTsKKyAgQVNTRVJUX0FMV0FZUygtLW1wel9jbGFzcygtNyk9PS04KTsKKyAgQVNTRVJUX0FMV0FZUyh+bXB6X2NsYXNzKDcpPT0tOCk7CisgIEFTU0VSVF9BTFdBWVMofm1wel9jbGFzcygtOCk9PTcpOworICBBU1NFUlRfQUxXQVlTKCttcHpfY2xhc3MoNyk9PTcpOworICBBU1NFUlRfQUxXQVlTKCttcHpfY2xhc3MoLTgpPT0tOCk7CisgIEFTU0VSVF9BTFdBWVMoLW1wel9jbGFzcyg3KT09LTcpOworICBBU1NFUlRfQUxXQVlTKC1tcHpfY2xhc3MoLTgpPT04KTsKKyAgQVNTRVJUX0FMV0FZUyhhYnMobXB6X2NsYXNzKDcpKT09Nyk7CisgIEFTU0VSVF9BTFdBWVMoYWJzKG1wel9jbGFzcygtOCkpPT04KTsKKyAgQVNTRVJUX0FMV0FZUyhzcXJ0KG1wel9jbGFzcyg3KSk9PTIpOworICBBU1NFUlRfQUxXQVlTKHNxcnQobXB6X2NsYXNzKDApKT09MCk7CisgIEFTU0VSVF9BTFdBWVMoc2duKG1wel9jbGFzcygwKSk9PTApOworICBBU1NFUlRfQUxXQVlTKHNnbihtcHpfY2xhc3MoOSkpPT0xKTsKKyAgQVNTRVJUX0FMV0FZUyhzZ24obXB6X2NsYXNzKC0xNykpPT0tMSk7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzKDEpK0RCTF9NQVg+Mik7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzKDEpK0RCTF9NSU48Mik7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzKDEpK3N0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGVub3JtX21pbigpPDIpOworICBBU1NFUlRfQUxXQVlTKGdjZChtcHpfY2xhc3MoNiksbXB6X2NsYXNzKDgpKT09Mik7CisgIEFTU0VSVF9BTFdBWVMoZ2NkKC1tcHpfY2xhc3MoNiksbXB6X2NsYXNzKDgpKT09Mik7CisgIEFTU0VSVF9BTFdBWVMoZ2NkKC1tcHpfY2xhc3MoNiksLW1wel9jbGFzcyg4KSk9PTIpOworICBBU1NFUlRfQUxXQVlTKGdjZChtcHpfY2xhc3MoNiksOC5mKT09Mik7CisgIEFTU0VSVF9BTFdBWVMoZ2NkKC1tcHpfY2xhc3MoNiksc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oOCkpPT0yKTsKKyAgQVNTRVJUX0FMV0FZUyhnY2Qoc3RhdGljX2Nhc3Q8bG9uZz4oLTYpLG1wel9jbGFzcyg1KSszKT09Mik7CisgIEFTU0VSVF9BTFdBWVMobGNtKG1wel9jbGFzcyg2KSxtcHpfY2xhc3MoOCkpPT0yNCk7CisgIEFTU0VSVF9BTFdBWVMobGNtKC1tcHpfY2xhc3MoNiksbXB6X2NsYXNzKDgpKT09MjQpOworICBBU1NFUlRfQUxXQVlTKGxjbSgtbXB6X2NsYXNzKDYpLC1tcHpfY2xhc3MoOCkpPT0yNCk7CisgIEFTU0VSVF9BTFdBWVMobGNtKG1wel9jbGFzcyg2KSxzdGF0aWNfY2FzdDxzaG9ydD4oOCkpPT0yNCk7CisgIEFTU0VSVF9BTFdBWVMobGNtKC1tcHpfY2xhc3MoNiksc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oOCkpPT0yNCk7CisgIEFTU0VSVF9BTFdBWVMobGNtKC02LixtcHpfY2xhc3MoNSkrMyk9PTI0KTsKKyAgQVNTRVJUX0FMV0FZUyhmYWN0b3JpYWwobXB6X2NsYXNzKDMpKT09Nik7CisgIEFTU0VSVF9BTFdBWVMoZmFjdG9yaWFsKG1wel9jbGFzcyg1KS0xKT09MjQpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6ZmFjdG9yaWFsKG1wel9jbGFzcygzKSk9PTYpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6ZmFjdG9yaWFsKG1wel9jbGFzcygyKSoyKT09MjQpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6ZmFjdG9yaWFsKDMpPT02KTsKKyAgQVNTRVJUX0FMV0FZUyhtcHpfY2xhc3M6OmZhY3RvcmlhbCgzdWwpPT02KTsKKyAgQVNTRVJUX0FMV0FZUyhtcHpfY2xhc3M6OmZhY3RvcmlhbCgzLmYpPT02KTsKKyAgbXB6X2NsYXNzIHJldDsKKyAgdHJ5IHsgcmV0PWZhY3RvcmlhbCgtbXB6X2NsYXNzKDMpKTsgQVNTRVJUX0FMV0FZUygwKTsgfQorICBjYXRjaCAoc3RkOjpkb21haW5fZXJyb3ImKSB7fQorICB0cnkgeyByZXQ9bXB6X2NsYXNzOjpmYWN0b3JpYWwoLTIpOyBBU1NFUlRfQUxXQVlTKDApOyB9CisgIGNhdGNoIChzdGQ6OmRvbWFpbl9lcnJvciYpIHt9CisgIHRyeSB7IHJldD1mYWN0b3JpYWwobXB6X2NsYXNzKDEpPDwzMDApOyBBU1NFUlRfQUxXQVlTKDApOyB9CisgIGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYpIHt9CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzOjpwcmltb3JpYWwobXB6X2NsYXNzKDMpKT09Nik7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzOjpwcmltb3JpYWwobXB6X2NsYXNzKDIpKjIpPT02KTsKKyAgQVNTRVJUX0FMV0FZUyhtcHpfY2xhc3M6OnByaW1vcmlhbCgzKT09Nik7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzOjpwcmltb3JpYWwoM3VsKT09Nik7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzOjpwcmltb3JpYWwoMy5mKT09Nik7CisgIHRyeSB7IHJldD1wcmltb3JpYWwoLW1wel9jbGFzcygzKSk7IEFTU0VSVF9BTFdBWVMoMCk7IH0KKyAgY2F0Y2ggKHN0ZDo6ZG9tYWluX2Vycm9yJikge30KKyAgdHJ5IHsgcmV0PW1wel9jbGFzczo6cHJpbW9yaWFsKC01KTsgQVNTRVJUX0FMV0FZUygwKTsgfQorICBjYXRjaCAoc3RkOjpkb21haW5fZXJyb3ImKSB7fQorICB0cnkgeyByZXQ9cHJpbW9yaWFsKG1wel9jbGFzcygxKTw8MzAwKTsgQVNTRVJUX0FMV0FZUygwKTsgfQorICBjYXRjaCAoc3RkOjpiYWRfYWxsb2MmKSB7fQorICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6Zmlib25hY2NpKG1wel9jbGFzcyg2KSk9PTgpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6Zmlib25hY2NpKG1wel9jbGFzcygyKSoyKT09Myk7CisgIEFTU0VSVF9BTFdBWVMobXB6X2NsYXNzOjpmaWJvbmFjY2koMyk9PTIpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6Zmlib25hY2NpKDN1bCk9PTIpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6Zmlib25hY2NpKDMuZik9PTIpOworICBBU1NFUlRfQUxXQVlTKGZpYm9uYWNjaSgtbXB6X2NsYXNzKDYpKT09LTgpOworICBBU1NFUlRfQUxXQVlTKG1wel9jbGFzczo6Zmlib25hY2NpKC0zKT09Mik7CisgIHRyeSB7IHJldD1maWJvbmFjY2kobXB6X2NsYXNzKDEpPDwzMDApOyBBU1NFUlRfQUxXQVlTKDApOyB9CisgIGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYpIHt9Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQoKTsKKyAgY2hlY2t6KCk7CisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LW9wczMuY2MgYi90ZXN0cy9jeHgvdC1vcHMzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjQ5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vcHMzLmNjCkBAIC0wLDAgKzEsMTMyIEBACisvKiBUZXN0IG1wKl9jbGFzcyBhc3NpZ25tZW50IG9wZXJhdG9ycyAoKz0sIC09LCBldGMpCisKK0NvcHlyaWdodCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBGT1JfQUxMX1NJR05FRF9CVUlMVElOKEYpIFwKKwlGKHNpZ25lZCBjaGFyKSBcCisJRihzaWduZWQgc2hvcnQpIFwKKwlGKHNpZ25lZCBpbnQpIFwKKwlGKHNpZ25lZCBsb25nKSBcCisJRihmbG9hdCkgXAorCUYoZG91YmxlKQorCisjZGVmaW5lIEZPUl9BTExfQlVJTFRJTihGKSBcCisJRk9SX0FMTF9TSUdORURfQlVJTFRJTihGKSBcCisJRihjaGFyKSBcCisJRih1bnNpZ25lZCBjaGFyKSBcCisJRih1bnNpZ25lZCBzaG9ydCkgXAorCUYodW5zaWduZWQgaW50KSBcCisJRih1bnNpZ25lZCBsb25nKQorCisjZGVmaW5lIEZPUl9BTExfR01QWFgoRikgXAorCUYobXB6X2NsYXNzKSBcCisJRihtcHFfY2xhc3MpIFwKKwlGKG1wZl9jbGFzcykKKwordGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBVPiB2b2lkIGYoVCB0LCBVIHUpeworICBUIGE9dDsKKyAgQVNTRVJUX0FMV0FZUygoYSs9dSk9PSh0K3UpKTsgQVNTRVJUX0FMV0FZUyhhPT0odCt1KSk7CisgIEFTU0VSVF9BTFdBWVMoKGEtPXUpPT10KTsgQVNTRVJUX0FMV0FZUyhhPT10KTsKKyAgQVNTRVJUX0FMV0FZUygoYSo9dSk9PSh0KnUpKTsgQVNTRVJUX0FMV0FZUyhhPT0odCp1KSk7CisgIEFTU0VSVF9BTFdBWVMoKGEvPXUpPT10KTsgQVNTRVJUX0FMV0FZUyhhPT10KTsKKyAgQVNTRVJUX0FMV0FZUygoYTw8PTUpPT0odDw8NSkpOyBBU1NFUlRfQUxXQVlTKGE9PSh0PDw1KSk7CisgIEFTU0VSVF9BTFdBWVMoKGE+Pj01KT09dCk7IEFTU0VSVF9BTFdBWVMoYT09dCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsY2xhc3MgVT4gdm9pZCBnKFQgdCwgVSB1KXsKKyAgVCBhPXQ7CisgIEFTU0VSVF9BTFdBWVMoKGElPXUpPT0odCV1KSk7IEFTU0VSVF9BTFdBWVMoYT09KHQldSkpOworICBhPXQ7CisgIEFTU0VSVF9BTFdBWVMoKGEmPXUpPT0odCZ1KSk7IEFTU0VSVF9BTFdBWVMoYT09KHQmdSkpOworICBhPXQ7CisgIEFTU0VSVF9BTFdBWVMoKGF8PXUpPT0odHx1KSk7IEFTU0VSVF9BTFdBWVMoYT09KHR8dSkpOworICBhPXQ7CisgIEFTU0VSVF9BTFdBWVMoKGFePXUpPT0odF51KSk7IEFTU0VSVF9BTFdBWVMoYT09KHRedSkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGgoVCB0KXsKKyAgVCBhPXQ7CisgIEFTU0VSVF9BTFdBWVMoKGE8PD01KT09KHQ8PDUpKTsgQVNTRVJUX0FMV0FZUyhhPT0odDw8NSkpOworICBBU1NFUlRfQUxXQVlTKChhPj49NSk9PXQpOyBBU1NFUlRfQUxXQVlTKGE9PXQpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPiB2b2lkIGZmcyhUIHQsIFUgdSl7CisjZGVmaW5lIEYoVikgZih0LChWKXUpOworCUZPUl9BTExfU0lHTkVEX0JVSUxUSU4oRikKKwlGT1JfQUxMX0dNUFhYKEYpCisjdW5kZWYgRgorI2RlZmluZSBGKFYpIGYodCwtKFYpdSk7CisJRk9SX0FMTF9HTVBYWChGKQorI3VuZGVmIEYKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4gdm9pZCBmZihUIHQsIFUgdSl7CisjZGVmaW5lIEYoVikgZih0LChWKXUpOworCUZPUl9BTExfQlVJTFRJTihGKQorCUZPUl9BTExfR01QWFgoRikKKyN1bmRlZiBGCisjZGVmaW5lIEYoVikgZih0LC0oVil1KTsKKwlGT1JfQUxMX0dNUFhYKEYpCisjdW5kZWYgRgorfQorCit0ZW1wbGF0ZTxjbGFzcyBVPiB2b2lkIGdncyhtcHpfY2xhc3MgdCwgVSB1KXsKKyNkZWZpbmUgRihWKSBnKHQsKFYpdSk7CisJRk9SX0FMTF9TSUdORURfQlVJTFRJTihGKQorI3VuZGVmIEYKKwlnKHQsKG1wel9jbGFzcyl1KTsKKwlnKHQsLShtcHpfY2xhc3MpdSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFU+IHZvaWQgZ2cobXB6X2NsYXNzIHQsIFUgdSl7CisjZGVmaW5lIEYoVikgZyh0LChWKXUpOworCUZPUl9BTExfQlVJTFRJTihGKQorI3VuZGVmIEYKKwlnKHQsKG1wel9jbGFzcyl1KTsKKwlnKHQsLShtcHpfY2xhc3MpdSk7Cit9CisKK3ZvaWQgY2hlY2soKXsKKwltcHpfY2xhc3Mgej0xODsKKwltcHFfY2xhc3MgcSg3LDIpOworCW1wZl9jbGFzcyBkPTMuMzc1OworCWgoeik7IGgocSk7IGgoZCk7CisJZmYoeiwxMyk7IGZmKHEsMTMpOyBmZihkLDEzKTsKKwlmZnMoeiwtNDIpOyBmZnMocSwtNDIpOyBmZnMoZCwtNDIpOworCWdnKHosMzMpOyBnZ3MoeiwtMjIpOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQoKTsKKworICBjaGVjaygpOworCisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LW9zdHJlYW0uY2MgYi90ZXN0cy9jeHgvdC1vc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTBmNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jeHgvdC1vc3RyZWFtLmNjCkBAIC0wLDAgKzEsNDQ5IEBACisvKiBUZXN0IG9zdHJlYW0gZm9ybWF0dGVkIG91dHB1dC4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK2Jvb2wgb3B0aW9uX2NoZWNrX3N0YW5kYXJkID0gZmFsc2U7CisKKworI2RlZmluZSBDQUxMKGV4cHIpCQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBnb3QuZmxhZ3MgKGRhdGFbaV0uZmxhZ3MpOwkJCQkJCVwKKyAgICBnb3Qud2lkdGggKGRhdGFbaV0ud2lkdGgpOwkJCQkJCVwKKyAgICBnb3QucHJlY2lzaW9uIChkYXRhW2ldLnByZWNpc2lvbik7CQkJCQlcCisgICAgaWYgKGRhdGFbaV0uZmlsbCA9PSAnXDAnKQkJCQkJCVwKKyAgICAgIGdvdC5maWxsICgnICcpOwkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgZ290LmZpbGwgKGRhdGFbaV0uZmlsbCk7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgIGlmICghIChleHByKSkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwljb3V0IDw8ICJcImdvdFwiIG91dHB1dCBlcnJvclxuIjsJCQkJXAorCWFib3J0ICgpOwkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGlmIChnb3Qud2lkdGgoKSAhPSAwKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJY291dCA8PCAiXCJnb3RcIiB3aWR0aCBub3QgcmVzZXQgdG8gMFxuIjsJCQlcCisJYWJvcnQgKCk7CQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworI2RlZmluZSBEVU1QKCkJCQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBjb3V0IDw8ICIgIHdhbnQ6ICB8IiA8PCBkYXRhW2ldLndhbnQgPDwgInxcbiI7CQkJXAorICAgIGNvdXQgPDwgIiAgZ290OiAgIHwiIDw8IGdvdC5zdHIoKSA8PCAifFxuIjsJCQkJXAorICAgIGNvdXQgPDwgIiAgd2lkdGg6ICIgPDwgZGF0YVtpXS53aWR0aCA8PCAiXG4iOwkJCVwKKyAgICBjb3V0IDw8ICIgIHByZWM6ICAiIDw8IGdvdC5wcmVjaXNpb24oKSA8PCAiXG4iOwkJCVwKKyAgICBjb3V0IDw8ICIgIGZsYWdzOiAiIDw8IGhleCA8PCAodW5zaWduZWQgbG9uZykgZ290LmZsYWdzKCkgPDwgIlxuIjsJXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEFCT1JUKCkgXAorICBkbyB7ICAgICAgICAgIFwKKyAgICBEVU1QICgpOyAgICBcCisgICAgYWJvcnQgKCk7ICAgXAorICB9IHdoaWxlICgwKQorCit2b2lkCitjaGVja19tcHogKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICAgICp6OworICAgIGNvbnN0IGNoYXIgICAgICp3YW50OworICAgIGlvczo6Zm10ZmxhZ3MgIGZsYWdzOworICAgIGludCAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgIHByZWNpc2lvbjsKKyAgICBjaGFyICAgICAgICAgICBmaWxsOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICIwIiwgaW9zOjpkZWMgfSwKKworICAgIHsgIjAiLCAiMCIsIGlvczo6b2N0IH0sCisgICAgeyAiMCIsICIwIiwgaW9zOjpvY3QgfCBpb3M6OnNob3diYXNlIH0sCisKKyAgICB7ICIwIiwgIjAiLCBpb3M6OmhleCB9LAorICAgIHsgIjAiLCAiMHgwIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAiMCIsICIwWDAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgICAgeyAiMSIsICIqKioqMSIsIGlvczo6ZGVjLCA1LCAwLCAnKicgfSwKKworICAgIHsgIi0xIiwgIiAgIC0xIiwgIGlvczo6ZGVjIHwgaW9zOjpyaWdodCwgICAgNSB9LAorICAgIHsgIi0xIiwgIi0gICAxIiwgIGlvczo6ZGVjIHwgaW9zOjppbnRlcm5hbCwgNSB9LAorICAgIHsgIi0xIiwgIi0xICAgIiwgIGlvczo6ZGVjIHwgaW9zOjpsZWZ0LCAgICAgNSB9LAorCisgICAgeyAiMSIsICIgICAweDEiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnJpZ2h0LCAgICA2IH0sCisgICAgeyAiMSIsICIweCAgIDEiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OmludGVybmFsLCA2IH0sCisgICAgeyAiMSIsICIweDEgICAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OmxlZnQsICAgICA2IH0sCisKKyAgICB7ICIxIiwgIiAgICsweDEiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnNob3dwb3MgfCBpb3M6OnJpZ2h0LAorICAgICAgNyB9LAorICAgIHsgIjEiLCAiKzB4ICAgMSIsIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6c2hvd3BvcyB8IGlvczo6aW50ZXJuYWwsCisgICAgICA3IH0sCisgICAgeyAiMSIsICIrMHgxICAgIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIHwgaW9zOjpzaG93cG9zIHwgaW9zOjpsZWZ0LAorICAgICAgNyB9LAorCisgICAgeyAgIjEyMyIsICAgICI3YiIsIGlvczo6aGV4IH0sCisgICAgeyAgIjEyMyIsICAgICI3QiIsIGlvczo6aGV4IHwgaW9zOjp1cHBlcmNhc2UgfSwKKyAgICB7ICAiMTIzIiwgICIweDdiIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAgIjEyMyIsICAiMFg3QiIsIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6dXBwZXJjYXNlIH0sCisgICAgeyAiLTEyMyIsICItMHg3YiIsIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB9LAorICAgIHsgIi0xMjMiLCAiLTBYN0IiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgICAgeyAgIjEyMyIsICAgIjE3MyIsIGlvczo6b2N0IH0sCisgICAgeyAgIjEyMyIsICAgIjE3MyIsIGlvczo6b2N0IHwgaW9zOjp1cHBlcmNhc2UgfSwKKyAgICB7ICAiMTIzIiwgICIwMTczIiwgaW9zOjpvY3QgfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAgIjEyMyIsICAiMDE3MyIsIGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6dXBwZXJjYXNlIH0sCisgICAgeyAiLTEyMyIsICItMDE3MyIsIGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSB9LAorICAgIHsgIi0xMjMiLCAiLTAxNzMiLCBpb3M6Om9jdCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgIH07CisKKyAgc2l6ZV90ICBpOworICBtcHpfdCAgIHo7CisKKyAgbXB6X2luaXQgKHopOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoeiwgZGF0YVtpXS56LCAwKTsKKworICAgICAgaWYgKG9wdGlvbl9jaGVja19zdGFuZGFyZAorCSAgJiYgbXB6X2ZpdHNfc2xvbmdfcCAoeikKKworCSAgLy8gbm8gbmVnYXRpdmVzIG9yIHNob3dwb3MgaW4gaGV4IG9yIG9jdAorCSAgJiYgKCgoZGF0YVtpXS5mbGFncyAmIGlvczo6YmFzZWZpZWxkKSA9PSBpb3M6OmhleAorCSAgICAgICB8fCAoZGF0YVtpXS5mbGFncyAmIGlvczo6YmFzZWZpZWxkKSA9PSBpb3M6Om9jdCkKKwkgICAgICA/IChtcHpfc2duICh6KSA+PSAwCisJCSAmJiAhIChkYXRhW2ldLmZsYWdzICYgaW9zOjpzaG93cG9zKSkKKwkgICAgICA6IDEpCisJICApCisJeworCSAgb3N0cmluZ3N0cmVhbSAgZ290OworCSAgbG9uZyAgbiA9IG1wel9nZXRfc2kgKHopOworCSAgQ0FMTCAoZ290IDw8IG4pOworCSAgaWYgKGdvdC5zdHIoKS5jb21wYXJlIChkYXRhW2ldLndhbnQpICE9IDApCisJICAgIHsKKwkgICAgICBjb3V0IDw8ICJjaGVja19tcHogZGF0YVsiIDw8IGkKKwkJICAgPDwgIl0gZG9lc24ndCBtYXRjaCBzdGFuZGFyZCBvc3RyZWFtIG91dHB1dFxuIjsKKwkgICAgICBjb3V0IDw8ICIgIHo6ICAgICAiIDw8IGRhdGFbaV0ueiA8PCAiXG4iOworCSAgICAgIGNvdXQgPDwgIiAgbjogICAgICIgPDwgbiA8PCAiXG4iOworCSAgICAgIERVTVAgKCk7CisJICAgIH0KKwl9CisKKyAgICAgIHsKKwlvc3RyaW5nc3RyZWFtICBnb3Q7CisJQ0FMTCAoZ290IDw8IHopOworCWlmIChnb3Quc3RyKCkuY29tcGFyZSAoZGF0YVtpXS53YW50KSAhPSAwKQorCSAgeworCSAgICBjb3V0IDw8ICJtcHogb3BlcmF0b3I8PCB3cm9uZywgZGF0YVsiIDw8IGkgPDwgIl1cbiI7CisJICAgIGNvdXQgPDwgIiAgejogICAgICIgPDwgZGF0YVtpXS56IDw8ICJcbiI7CisJICAgIEFCT1JUICgpOworCSAgfQorICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKHopOworfQorCit2b2lkCitjaGVja19tcHEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICAgICpxOworICAgIGNvbnN0IGNoYXIgICAgICp3YW50OworICAgIGlvczo6Zm10ZmxhZ3MgIGZsYWdzOworICAgIGludCAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgIHByZWNpc2lvbjsKKyAgICBjaGFyICAgICAgICAgICBmaWxsOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICIwIiwgaW9zOjpkZWMgfSwKKyAgICB7ICIwIiwgIjAiLCBpb3M6OmhleCB9LAorICAgIHsgIjAiLCAiMHgwIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAiMCIsICIwWDAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgICAgeyAiNS84IiwgIjUvOCIsIGlvczo6ZGVjIH0sCisgICAgeyAiNS84IiwgIjBYNS8wWDgiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgICAgLy8gemVybyBkZW5vbWluYXRvciB3aXRoIHNob3diYXNlCisgICAgeyAiMC8wIiwgICAiICAgICAgIDAvMCIsIGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSwgMTAgfSwKKyAgICB7ICIwLzAiLCAgICIgICAgICAgMC8wIiwgaW9zOjpkZWMgfCBpb3M6OnNob3diYXNlLCAxMCB9LAorICAgIHsgIjAvMCIsICAgIiAgIDB4MC8weDAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UsIDEwIH0sCisgICAgeyAiMTIzLzAiLCAiICAgIDAxNzMvMCIsIGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSwgMTAgfSwKKyAgICB7ICIxMjMvMCIsICIgICAgIDEyMy8wIiwgaW9zOjpkZWMgfCBpb3M6OnNob3diYXNlLCAxMCB9LAorICAgIHsgIjEyMy8wIiwgIiAgMHg3Yi8weDAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UsIDEwIH0sCisgICAgeyAiMTIzLzAiLCAiICAwWDdCLzBYMCIsIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6dXBwZXJjYXNlLCAxMCB9LAorICAgIHsgIjAvMTIzIiwgIiAgICAwLzAxNzMiLCBpb3M6Om9jdCB8IGlvczo6c2hvd2Jhc2UsIDEwIH0sCisgICAgeyAiMC8xMjMiLCAiICAgICAwLzEyMyIsIGlvczo6ZGVjIHwgaW9zOjpzaG93YmFzZSwgMTAgfSwKKyAgICB7ICIwLzEyMyIsICIgIDB4MC8weDdiIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlLCAxMCB9LAorICAgIHsgIjAvMTIzIiwgIiAgMFgwLzBYN0IiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSwgMTAgfSwKKyAgfTsKKworICBzaXplX3QgIGk7CisgIG1wcV90ICAgcTsKKworICBtcHFfaW5pdCAocSk7CisKKyNkZWZpbmUgbXBxX2ludGVnZXJfcChxKSAgKG1wel9jbXBfdWkgKG1wcV9kZW5yZWYocSksIDFMKSA9PSAwKQorCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHFfc2V0X3N0cl9vcl9hYm9ydCAocSwgZGF0YVtpXS5xLCAwKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKG1wcV9udW1yZWYgKHEpKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKG1wcV9kZW5yZWYgKHEpKTsKKworICAgICAgaWYgKG9wdGlvbl9jaGVja19zdGFuZGFyZAorCSAgJiYgbXB6X2ZpdHNfc2xvbmdfcCAobXBxX251bXJlZihxKSkKKwkgICYmIG1wcV9pbnRlZ2VyX3AgKHEpKQorCXsKKwkgIG9zdHJpbmdzdHJlYW0gIGdvdDsKKwkgIGxvbmcgIG4gPSBtcHpfZ2V0X3NpIChtcHFfbnVtcmVmKHEpKTsKKwkgIENBTEwgKGdvdCA8PCBuKTsKKwkgIGlmIChnb3Quc3RyKCkuY29tcGFyZSAoZGF0YVtpXS53YW50KSAhPSAwKQorCSAgICB7CisJICAgICAgY291dCA8PCAiY2hlY2tfbXBxIGRhdGFbIiA8PCBpCisJCSAgIDw8ICJdIGRvZXNuJ3QgbWF0Y2ggc3RhbmRhcmQgb3N0cmVhbSBvdXRwdXRcbiI7CisJICAgICAgY291dCA8PCAiICBxOiAgICAgIiA8PCBkYXRhW2ldLnEgPDwgIlxuIjsKKwkgICAgICBjb3V0IDw8ICIgIG46ICAgICAiIDw8IG4gPDwgIlxuIjsKKwkgICAgICBEVU1QICgpOworCSAgICB9CisJfQorCisgICAgICB7CisJb3N0cmluZ3N0cmVhbSAgZ290OworCUNBTEwgKGdvdCA8PCBxKTsKKwlpZiAoZ290LnN0cigpLmNvbXBhcmUgKGRhdGFbaV0ud2FudCkgIT0gMCkKKwkgIHsKKwkgICAgY291dCA8PCAibXBxIG9wZXJhdG9yPDwgd3JvbmcsIGRhdGFbIiA8PCBpIDw8ICJdXG4iOworCSAgICBjb3V0IDw8ICIgIHE6ICAgICAiIDw8IGRhdGFbaV0ucSA8PCAiXG4iOworCSAgICBBQk9SVCAoKTsKKwkgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgbXBxX2NsZWFyIChxKTsKK30KKworCit2b2lkCitjaGVja19tcGYgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICAgICpmOworICAgIGNvbnN0IGNoYXIgICAgICp3YW50OworICAgIGlvczo6Zm10ZmxhZ3MgIGZsYWdzOworICAgIGludCAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgIHByZWNpc2lvbjsKKyAgICBjaGFyICAgICAgICAgICBmaWxsOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICIwIiwgICAgICAgICAgICBpb3M6OmRlYyB9LAorICAgIHsgIjAiLCAiKzAiLCAgICAgICAgICAgaW9zOjpkZWMgfCBpb3M6OnNob3dwb3MgfSwKKyAgICB7ICIwIiwgIjAuMDAwMDAiLCAgICAgIGlvczo6ZGVjIHwgaW9zOjpzaG93cG9pbnQgfSwKKyAgICB7ICIwIiwgIjAiLCAgICAgICAgICAgIGlvczo6ZGVjIHwgaW9zOjpmaXhlZCB9LAorICAgIHsgIjAiLCAiMC4iLCAgICAgICAgICAgaW9zOjpkZWMgfCBpb3M6OmZpeGVkIHwgaW9zOjpzaG93cG9pbnQgfSwKKyAgICB7ICIwIiwgIjAuMDAwMDAwZSswMCIsIGlvczo6ZGVjIHwgaW9zOjpzY2llbnRpZmljIH0sCisgICAgeyAiMCIsICIwLjAwMDAwMGUrMDAiLCBpb3M6OmRlYyB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd3BvaW50IH0sCisKKyAgICB7ICIwIiwgIjAiLCAgICAgICAgICBpb3M6OmRlYywgMCwgNCB9LAorICAgIHsgIjAiLCAiMC4wMDAiLCAgICAgIGlvczo6ZGVjIHwgaW9zOjpzaG93cG9pbnQsIDAsIDQgfSwKKyAgICB7ICIwIiwgIjAuMDAwMCIsICAgICBpb3M6OmRlYyB8IGlvczo6Zml4ZWQsIDAsIDQgfSwKKyAgICB7ICIwIiwgIjAuMDAwMCIsICAgICBpb3M6OmRlYyB8IGlvczo6Zml4ZWQgfCBpb3M6OnNob3dwb2ludCwgMCwgNCB9LAorICAgIHsgIjAiLCAiMC4wMDAwZSswMCIsIGlvczo6ZGVjIHwgaW9zOjpzY2llbnRpZmljLCAwLCA0IH0sCisgICAgeyAiMCIsICIwLjAwMDBlKzAwIiwgaW9zOjpkZWMgfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnNob3dwb2ludCwgMCwgNCB9LAorCisgICAgeyAiMSIsICIxIiwgICAgICAgaW9zOjpkZWMgfSwKKyAgICB7ICIxIiwgIisxIiwgICAgICBpb3M6OmRlYyB8IGlvczo6c2hvd3BvcyB9LAorICAgIHsgIjEiLCAiMS4wMDAwMCIsIGlvczo6ZGVjIHwgaW9zOjpzaG93cG9pbnQgfSwKKyAgICB7ICIxIiwgIjEiLCAgICAgICBpb3M6OmRlYyB8IGlvczo6Zml4ZWQgfSwKKyAgICB7ICIxIiwgIjEuIiwgICAgICBpb3M6OmRlYyB8IGlvczo6Zml4ZWQgfCBpb3M6OnNob3dwb2ludCB9LAorICAgIHsgIjEiLCAiMS4wMDAwMDBlKzAwIiwgICBpb3M6OmRlYyB8IGlvczo6c2NpZW50aWZpYyB9LAorICAgIHsgIjEiLCAiMS4wMDAwMDBlKzAwIiwgIGlvczo6ZGVjIHwgaW9zOjpzY2llbnRpZmljIHwgaW9zOjpzaG93cG9pbnQgfSwKKworICAgIHsgIjEiLCAiMSIsICAgICAgICAgIGlvczo6ZGVjLCAgICAgICAgICAgICAgICAgICAwLCA0IH0sCisgICAgeyAiMSIsICIxLjAwMCIsICAgICAgaW9zOjpkZWMgfCBpb3M6OnNob3dwb2ludCwgIDAsIDQgfSwKKyAgICB7ICIxIiwgIjEuMDAwMCIsICAgICBpb3M6OmRlYyB8IGlvczo6Zml4ZWQsICAgICAgMCwgNCB9LAorICAgIHsgIjEiLCAiMS4wMDAwIiwgICAgIGlvczo6ZGVjIHwgaW9zOjpmaXhlZCB8IGlvczo6c2hvd3BvaW50LCAwLCA0IH0sCisgICAgeyAiMSIsICIxLjAwMDBlKzAwIiwgaW9zOjpkZWMgfCBpb3M6OnNjaWVudGlmaWMsIDAsIDQgfSwKKyAgICB7ICIxIiwgIjEuMDAwMGUrMDAiLCBpb3M6OmRlYyB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd3BvaW50LCAwLCA0IH0sCisKKyAgICB7ICItMSIsICItMSIsICAgICAgICBpb3M6OmRlYyB8IGlvczo6c2hvd3BvcyB9LAorCisgICAgeyAiLTEiLCAiICAtMSIsICAgICAgaW9zOjpkZWMsIDQgfSwKKyAgICB7ICItMSIsICItICAxIiwgICAgICBpb3M6OmRlYyB8IGlvczo6aW50ZXJuYWwsIDQgfSwKKyAgICB7ICItMSIsICItMSAgIiwgICAgICBpb3M6OmRlYyB8IGlvczo6bGVmdCwgNCB9LAorCisgICAgeyAiLTEiLCAiICAtMHgxIiwgICAgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlLCA2IH0sCisgICAgeyAiLTEiLCAiLTB4ICAxIiwgICAgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIHwgaW9zOjppbnRlcm5hbCwgNiB9LAorICAgIHsgIi0xIiwgIi0weDEgICIsICAgIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6bGVmdCwgNiB9LAorCisgICAgeyAgICAiMSIsICIqKioqKioqKioxIiwgaW9zOjpkZWMsIDEwLCA0LCAnKicgfSwKKyAgICB7ICIxMjM0IiwgIioqKioqKjEyMzQiLCBpb3M6OmRlYywgMTAsIDQsICcqJyB9LAorICAgIHsgIjEyMzQiLCAiKioqKioxMjM0LiIsIGlvczo6ZGVjIHwgaW9zOjpzaG93cG9pbnQsIDEwLCA0LCAnKicgfSwKKworICAgIHsgIjEyMzQ1IiwgIjEuMjNlKzA0IiwgaW9zOjpkZWMsIDAsIDMgfSwKKworICAgIHsgIjEyMzQ1IiwgIjEyMzQ1LiIsIGlvczo6ZGVjIHwgaW9zOjpmaXhlZCB8IGlvczo6c2hvd3BvaW50IH0sCisKKyAgICB7ICIxLjk5OTk5OTkiLCAgICAiMiIsICAgICBpb3M6OmRlYywgMCwgMSB9LAorICAgIHsgIjEuMDAwOTk5OTk5OSIsICIxLjAwMSIsIGlvczo6ZGVjLCAwLCA0IH0sCisgICAgeyAiMS4wMDAxIiwgICAgICAgIjEiLCAgICAgaW9zOjpkZWMsIDAsIDQgfSwKKyAgICB7ICIxLjAwMDQiLCAgICAgICAiMSIsICAgICBpb3M6OmRlYywgMCwgNCB9LAorICAgIHsgIjEuMDAwNTU1IiwgICAgICIxLjAwMSIsIGlvczo6ZGVjLCAwLCA0IH0sCisKKyAgICB7ICIxLjAwMDIiLCAgICAgICAiMS4wMDAiLCBpb3M6OmRlYyB8IGlvczo6Zml4ZWQsIDAsIDMgfSwKKyAgICB7ICIxLjAwMDgiLCAgICAgICAiMS4wMDEiLCBpb3M6OmRlYyB8IGlvczo6Zml4ZWQsIDAsIDMgfSwKKworICAgIHsgIjAiLCAiMCIsIGlvczo6aGV4IH0sCisgICAgeyAiMCIsICIweDAiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfSwKKyAgICB7ICIwIiwgIjBYMCIsIGlvczo6aGV4IHwgaW9zOjpzaG93YmFzZSB8IGlvczo6dXBwZXJjYXNlIH0sCisgICAgeyAiMTIzIiwgICAiN2IiLCBpb3M6OmhleCB9LAorICAgIHsgIjEyMyIsICIweDdiIiwgaW9zOjpoZXggfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAiMTIzIiwgIjBYN0IiLCBpb3M6OmhleCB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgICAgeyAiMCIsICIwLjAwMEArMDAiLCBpb3M6OmhleCB8IGlvczo6c2NpZW50aWZpYywgMCwgMyB9LAorICAgIHsgIjI1NiIsICIxLjAwMEArMDIiLCBpb3M6OmhleCB8IGlvczo6c2NpZW50aWZpYywgMCwgMyB9LAorCisgICAgeyAiMTIzIiwgICAiNy5iQCswMSIsIGlvczo6aGV4IHwgaW9zOjpzY2llbnRpZmljLCAwLCAxIH0sCisgICAgeyAiMTIzIiwgICAiNy5CQCswMSIsIGlvczo6aGV4IHwgaW9zOjpzY2llbnRpZmljIHwgaW9zOjp1cHBlcmNhc2UsIDAsIDEgfSwKKyAgICB7ICIxMjMiLCAiMHg3LmJAKzAxIiwgaW9zOjpoZXggfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnNob3diYXNlLCAwLCAxIH0sCisgICAgeyAiMTIzIiwgIjBYNy5CQCswMSIsCisgICAgICBpb3M6OmhleCB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSwgMCwgMSB9LAorCisgICAgeyAiMTA5OTUxMTYyNzc3NiIsICIxLjBAKzEwIiwgaW9zOjpoZXggfCBpb3M6OnNjaWVudGlmaWMsIDAsIDEgfSwKKyAgICB7ICIxMDk5NTExNjI3Nzc2IiwgIjEuMEArMTAiLAorICAgICAgaW9zOjpoZXggfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnVwcGVyY2FzZSwgMCwgMSB9LAorCisgICAgeyAiMC4wNjI1IiwgIjEuMDBALTAxIiwgaW9zOjpoZXggfCBpb3M6OnNjaWVudGlmaWMsIDAsIDIgfSwKKworICAgIHsgIjAiLCAiMCIsIGlvczo6b2N0IH0sCisgICAgeyAiMTIzIiwgICIxNzMiLCBpb3M6Om9jdCB9LAorICAgIHsgIjEyMyIsICIwMTczIiwgaW9zOjpvY3QgfCBpb3M6OnNob3diYXNlIH0sCisKKyAgICAvLyBvY3RhbCBzaG93YmFzZSBzdXBwcmVzc2VkIGZvciAwCisgICAgeyAiMCIsICIwIiwgaW9zOjpvY3QgfCBpb3M6OnNob3diYXNlIH0sCisgICAgeyAiLjEyNSIsICAgICIwMC4xIiwgIGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSwgMCwgMSB9LAorICAgIHsgIi4wMTU2MjUiLCAiMDAuMDEiLCBpb3M6Om9jdCB8IGlvczo6c2hvd2Jhc2UsIDAsIDIgfSwKKyAgICB7ICIuMTI1IiwgICAgIjAwLjEiLCAgaW9zOjpmaXhlZCB8IGlvczo6b2N0IHwgaW9zOjpzaG93YmFzZSwgMCwgMSB9LAorICAgIHsgIi4wMTU2MjUiLCAiMC4wIiwgICBpb3M6OmZpeGVkIHwgaW9zOjpvY3QgfCBpb3M6OnNob3diYXNlLCAwLCAxIH0sCisgICAgeyAiLjAxNTYyNSIsICIwMC4wMSIsIGlvczo6Zml4ZWQgfCBpb3M6Om9jdCB8IGlvczo6c2hvd2Jhc2UsIDAsIDIgfSwKKworICAgIHsgICIwLjEyNSIsICAiMS4wMDAwMDBlLTAxIiwgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfSwKKyAgICB7ICAiMC4xMjUiLCAiKzEuMDAwMDAwZS0wMSIsIGlvczo6b2N0IHwgaW9zOjpzY2llbnRpZmljIHwgaW9zOjpzaG93cG9zIH0sCisgICAgeyAiLTAuMTI1IiwgIi0xLjAwMDAwMGUtMDEiLCBpb3M6Om9jdCB8IGlvczo6c2NpZW50aWZpYyB9LAorICAgIHsgIi0wLjEyNSIsICItMS4wMDAwMDBlLTAxIiwgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnNob3dwb3MgfSwKKworICAgIHsgIjAiLCAiMC4wMDBlKzAwIiwgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMsIDAsIDMgfSwKKyAgICB7ICIyNTYiLCAgIjQuMDAwZSswMiIsIGlvczo6b2N0IHwgaW9zOjpzY2llbnRpZmljLCAwLCAzIH0sCisgICAgeyAiMjU2IiwgIjA0LjAwMGUrMDIiLCBpb3M6Om9jdCB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd2Jhc2UsIDAsIDMgfSwKKyAgICB7ICIyNTYiLCAgIjQuMDAwRSswMiIsIGlvczo6b2N0IHwgaW9zOjpzY2llbnRpZmljIHwgaW9zOjp1cHBlcmNhc2UsIDAsIDMgfSwKKyAgICB7ICIyNTYiLCAiMDQuMDAwRSswMiIsCisgICAgICBpb3M6Om9jdCB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnVwcGVyY2FzZSwgMCwgMyB9LAorCisgICAgeyAiMTY3NzcyMTYiLCAgICAiMS4wMDAwMDBlKzA4IiwgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfSwKKyAgICB7ICIxNjc3NzIxNiIsICAgICIxLjAwMDAwMEUrMDgiLAorICAgICAgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnVwcGVyY2FzZSB9LAorICAgIHsgIjE2Nzc3MjE2IiwgICAiMDEuMDAwMDAwZSswOCIsCisgICAgICBpb3M6Om9jdCB8IGlvczo6c2NpZW50aWZpYyB8IGlvczo6c2hvd2Jhc2UgfSwKKyAgICB7ICIxNjc3NzIxNiIsICAgIjAxLjAwMDAwMEUrMDgiLAorICAgICAgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnNob3diYXNlIHwgaW9zOjp1cHBlcmNhc2UgfSwKKyAgICB7ICIxNjc3NzIxNiIsICAiKzAxLjAwMDAwMGUrMDgiLAorICAgICAgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMgfCBpb3M6OnNob3diYXNlIHwgaW9zOjpzaG93cG9zIH0sCisgICAgeyAiMTY3NzcyMTYiLCAgIiswMS4wMDAwMDBFKzA4IiwgaW9zOjpvY3QgfCBpb3M6OnNjaWVudGlmaWMKKyAgICAgIHwgaW9zOjpzaG93YmFzZSB8IGlvczo6c2hvd3BvcyB8IGlvczo6dXBwZXJjYXNlIH0sCisgICAgeyAiLTE2Nzc3MjE2IiwgIi0wMS4wMDAwMDBlKzA4IiwKKyAgICAgIGlvczo6b2N0IHwgaW9zOjpzY2llbnRpZmljIHwgaW9zOjpzaG93YmFzZSB8IGlvczo6c2hvd3BvcyB9LAorICAgIHsgIi0xNjc3NzIxNiIsICItMDEuMDAwMDAwRSswOCIsIGlvczo6b2N0IHwgaW9zOjpzY2llbnRpZmljCisgICAgICB8IGlvczo6c2hvd2Jhc2UgfCBpb3M6OnNob3dwb3MgfCBpb3M6OnVwcGVyY2FzZSB9LAorCisgIH07CisKKyAgc2l6ZV90ICBpOworICBtcGZfdCAgIGYsIGYyOworICBkb3VibGUgIGQ7CisKKyAgbXBmX2luaXQgKGYpOworICBtcGZfaW5pdCAoZjIpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcGZfc2V0X3N0cl9vcl9hYm9ydCAoZiwgZGF0YVtpXS5mLCAwKTsKKworICAgICAgZCA9IG1wZl9nZXRfZCAoZik7CisgICAgICBtcGZfc2V0X2QgKGYyLCBkKTsKKyAgICAgIGlmIChvcHRpb25fY2hlY2tfc3RhbmRhcmQgJiYgbXBmX2NtcCAoZiwgZjIpID09IDAKKwkgICYmICEgKGRhdGFbaV0uZmxhZ3MgJiAoaW9zOjpoZXggfCBpb3M6Om9jdCB8IGlvczo6c2hvd2Jhc2UpKSkKKwl7CisJICBvc3RyaW5nc3RyZWFtICBnb3Q7CisJICBDQUxMIChnb3QgPDwgZCk7CisJICBpZiAoZ290LnN0cigpLmNvbXBhcmUgKGRhdGFbaV0ud2FudCkgIT0gMCkKKwkgICAgeworCSAgICAgIGNvdXQgPDwgImNoZWNrX21wZiBkYXRhWyIgPDwgaQorCQkgICA8PCAiXSBkb2Vzbid0IG1hdGNoIHN0YW5kYXJkIG9zdHJlYW0gb3V0cHV0XG4iOworCSAgICAgIGNvdXQgPDwgIiAgZjogICAgICIgPDwgZGF0YVtpXS5mIDw8ICJcbiI7CisJICAgICAgY291dCA8PCAiICBkOiAgICAgIiA8PCBkIDw8ICJcbiI7CisJICAgICAgRFVNUCAoKTsKKwkgICAgfQorCX0KKworICAgICAgeworCW9zdHJpbmdzdHJlYW0gIGdvdDsKKwlDQUxMIChnb3QgPDwgZik7CisJaWYgKGdvdC5zdHIoKS5jb21wYXJlIChkYXRhW2ldLndhbnQpICE9IDApCisJICB7CisJICAgIGNvdXQgPDwgIm1wZiBvcGVyYXRvcjw8IHdyb25nLCBkYXRhWyIgPDwgaSA8PCAiXVxuIjsKKwkgICAgY291dCA8PCAiICBmOiAgICAgIiA8PCBkYXRhW2ldLmYgPDwgIlxuIjsKKwkgICAgQUJPUlQgKCk7CisJICB9CisgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoZik7CisgIG1wZl9jbGVhciAoZjIpOworfQorCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpZiAoYXJnYyA+IDEgJiYgc3RyY21wIChhcmd2WzFdLCAiLXMiKSA9PSAwKQorICAgIG9wdGlvbl9jaGVja19zdGFuZGFyZCA9IHRydWU7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfbXB6ICgpOworICBjaGVja19tcHEgKCk7CisgIGNoZWNrX21wZiAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3QtcHJlYy5jYyBiL3Rlc3RzL2N4eC90LXByZWMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmY2E3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LXByZWMuY2MKQEAgLTAsMCArMSwyMTYgQEAKKy8qIFRlc3QgcHJlY2lzaW9uIG9mIG1wZl9jbGFzcyBleHByZXNzaW9ucy4KKworQ29weXJpZ2h0IDIwMDEtMjAwMywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCitjb25zdCBpbnQKK3NtYWxsX3ByZWMgPSA2NCwgbWVkaXVtX3ByZWMgPSAxMjgsIGxhcmdlX3ByZWMgPSAxOTIsIHZlcnlfbGFyZ2VfcHJlYyA9IDI1NjsKKworI2RlZmluZSBBU1NFUlRfQUxXQVlTX1BSRUMoYSwgcywgcHJlYykgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtcGZfc3JjcHRyIF9hID0gYS5nZXRfbXBmX3QoKTsgICAgICAgXAorICBtcGZfY2xhc3MgX2IocywgcHJlYyk7ICAgICAgICAgICAgICAgXAorICBtcGZfc3JjcHRyIF9jID0gX2IuZ2V0X21wZl90KCk7ICAgICAgXAorICBBU1NFUlRfQUxXQVlTKG1wZl9lcShfYSwgX2MsIHByZWMpKTsgXAorfQorCisKKwordm9pZAorY2hlY2tfbXBmICh2b2lkKQoreworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyhtZWRpdW1fcHJlYyk7CisKKyAgLy8gc2ltcGxlIGV4cHJlc3Npb25zCisgIHsKKyAgICBtcGZfY2xhc3MgZigzLjAsIHNtYWxsX3ByZWMpOworICAgIG1wZl9jbGFzcyBnKDEgLyBmLCB2ZXJ5X2xhcmdlX3ByZWMpOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICIwLjMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIgorICAgICAgICIgICAgIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMyIsIHZlcnlfbGFyZ2VfcHJlYyk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBmKDkuMCwgbWVkaXVtX3ByZWMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gMSAvIGY7CisgICAgQVNTRVJUX0FMV0FZU19QUkVDCisgICAgICAoZywgIjAuMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEiCisgICAgICAgIiAgICAgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExMTEgMTExIiwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGYoMTUuMCwgbGFyZ2VfcHJlYyk7CisgICAgbXBmX2NsYXNzIGcoMC4wLCB2ZXJ5X2xhcmdlX3ByZWMpOworICAgIGcgPSAxIC8gZjsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChnLCAiMC4wNjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiIKKyAgICAgICAiICAgICA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjciLCB2ZXJ5X2xhcmdlX3ByZWMpOworICB9CisKKyAgLy8gY29tcG91bmQgZXhwcmVzc2lvbnMKKyAgeworICAgIG1wZl9jbGFzcyBmKDMuMCwgc21hbGxfcHJlYyk7CisgICAgbXBmX2NsYXNzIGcoLSgtKC0xIC8gZikpLCB2ZXJ5X2xhcmdlX3ByZWMpOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICItMC4zMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyIKKyAgICAgICAiICAgICAgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzIiwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGYoMy4wLCBzbWFsbF9wcmVjKSwgZyg5LjAsIG1lZGl1bV9wcmVjKTsKKyAgICBtcGZfY2xhc3MgaCgwLjAsIHZlcnlfbGFyZ2VfcHJlYyk7CisgICAgaCA9IDEvZiArIDEvZzsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChoLCAiMC40NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCIKKyAgICAgICAiICAgICA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQ0NCA0NDQiLCB2ZXJ5X2xhcmdlX3ByZWMpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgZigzLjAsIHNtYWxsX3ByZWMpLCBnKDkuMCwgbWVkaXVtX3ByZWMpLCBoKDE1LjAsIGxhcmdlX3ByZWMpOworICAgIG1wZl9jbGFzcyBpKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBpID0gZiAvIGcgKyBoOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGksICIxNS4zMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyIKKyAgICAgICAiICAgICAgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMyIsIHZlcnlfbGFyZ2VfcHJlYyk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBmKDMuMCwgc21hbGxfcHJlYyk7CisgICAgbXBmX2NsYXNzIGcoLSgxICsgZikgLyAzLCB2ZXJ5X2xhcmdlX3ByZWMpOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICItMS4zMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyIKKyAgICAgICAiICAgICAgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMiLCB2ZXJ5X2xhcmdlX3ByZWMpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgZig5LjAsIG1lZGl1bV9wcmVjKTsKKyAgICBtcGZfY2xhc3MgZygwLjAsIHZlcnlfbGFyZ2VfcHJlYyk7CisgICAgZyA9IHNxcnQoMSAvIGYpOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICIwLjMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIgorICAgICAgICIgICAgIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIDMzMyIsIHZlcnlfbGFyZ2VfcHJlYyk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBmKDE1LjAsIGxhcmdlX3ByZWMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gaHlwb3QoMSArIDUgLyBmLCAxLjApOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICIxLjY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IgorICAgICAgICIgICAgIDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY3IiwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgfQorCisgIC8vIGNvbXBvdW5kIGFzc2lnbm1lbnRzCisgIHsKKyAgICBtcGZfY2xhc3MgZigzLjAsIHNtYWxsX3ByZWMpLCBnKDkuMCwgbWVkaXVtX3ByZWMpOworICAgIG1wZl9jbGFzcyBoKDEuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBoIC09IGYgLyBnOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGgsICIwLjY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IgorICAgICAgICIgICAgIDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NyIsIHZlcnlfbGFyZ2VfcHJlYyk7CisgIH0KKworICAvLyBjb25zdHJ1Y3Rpb24gZnJvbSBleHByZXNzaW9ucworICB7CisgICAgbXBmX2NsYXNzIGYoMy4wLCBzbWFsbF9wcmVjKTsKKyAgICBtcGZfY2xhc3MgZygwLjAsIHZlcnlfbGFyZ2VfcHJlYyk7CisgICAgZyA9IG1wZl9jbGFzcygxIC8gZik7CisgICAgQVNTRVJUX0FMV0FZU19QUkVDKGcsICIwLjMzMzMzIDMzMzMzIDMzMzMzIDMzMzMzIiwgc21hbGxfcHJlYyk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBmKDkuMCwgbWVkaXVtX3ByZWMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gbXBmX2NsYXNzKDEgLyBmKTsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChnLCAiMC4xMTExMSAxMTExMSAxMTExMSAxMTExMSAxMTExMSAxMTExMSAxMTExMSAxMTExIiwgbWVkaXVtX3ByZWMpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgZigxNS4wLCBsYXJnZV9wcmVjKTsKKyAgICBtcGZfY2xhc3MgZygwLjAsIHZlcnlfbGFyZ2VfcHJlYyk7CisgICAgZyA9IG1wZl9jbGFzcygxIC8gZik7CisgICAgQVNTRVJUX0FMV0FZU19QUkVDCisgICAgICAoZywgIjAuMDY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYgNjY2NjYiCisgICAgICAgIiAgICAgNjY2NjYgNjY2NyIsIGxhcmdlX3ByZWMpOworICB9CisKKyAgeworICAgIG1wZl9jbGFzcyBmKDMuMCwgc21hbGxfcHJlYyksIGcoOS4wLCBtZWRpdW1fcHJlYyk7CisgICAgbXBmX2NsYXNzIGgoMC4wLCB2ZXJ5X2xhcmdlX3ByZWMpOworICAgIGggPSBtcGZfY2xhc3MoZiAvIGcgKyAxLCBsYXJnZV9wcmVjKTsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChoLCAiMS4zMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyAzMzMzMyIKKyAgICAgICAiICAgICAzMzMzMyAzMzMiLAorICAgICAgIGxhcmdlX3ByZWMpOworICB9CisKKyAgLy8gbWl4ZWQgbXBmL21wcSBleHByZXNzaW9ucworICB7CisgICAgbXBmX2NsYXNzIGYoMy4wLCBzbWFsbF9wcmVjKTsKKyAgICBtcHFfY2xhc3MgcSgxLCAzKTsKKyAgICBtcGZfY2xhc3MgZygwLjAsIHZlcnlfbGFyZ2VfcHJlYyk7CisgICAgZyA9IGYgLSBxOworICAgIEFTU0VSVF9BTFdBWVNfUFJFQworICAgICAgKGcsICIyLjY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IgorICAgICAgICIgICAgIDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY2NjY2IDY3IiwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgfQorCisgIHsKKyAgICBtcGZfY2xhc3MgZigzLjAsIHNtYWxsX3ByZWMpOworICAgIG1wcV9jbGFzcyBxKDEsIDMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gbXBmX2NsYXNzKGYgLSBxLCBsYXJnZV9wcmVjKTsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChnLCAiMi42NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiIKKyAgICAgICAiICAgICA2NjY2NiA2NjciLAorICAgICAgIGxhcmdlX3ByZWMpOworICB9CisgIHsKKyAgICBtcGZfY2xhc3MgZigzLjAsIHNtYWxsX3ByZWMpOworICAgIG1wcV9jbGFzcyBxKDEsIDMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gbXBmX2NsYXNzKGYgLSBxKTsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChnLCAiMi42NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjY2NiA2NjciLCBtZWRpdW1fcHJlYyk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBmKDE1LjAsIGxhcmdlX3ByZWMpOworICAgIG1wcV9jbGFzcyBxKDEsIDMpOworICAgIG1wZl9jbGFzcyBnKDAuMCwgdmVyeV9sYXJnZV9wcmVjKTsKKyAgICBnID0gbXBmX2NsYXNzKGYgKyBxKTsKKyAgICBBU1NFUlRfQUxXQVlTX1BSRUMKKyAgICAgIChnLCAiMTUuMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMgMzMzMzMiCisgICAgICAgIiAgICAgIDMzMzMzIDMzIiwKKyAgICAgICBsYXJnZV9wcmVjKTsKKyAgfQorfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQoKTsKKworICBjaGVja19tcGYoKTsKKworICB0ZXN0c19lbmQoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jeHgvdC1yYW5kLmNjIGIvdGVzdHMvY3h4L3QtcmFuZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM2ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY3h4L3QtcmFuZC5jYwpAQCAtMCwwICsxLDE0OCBAQAorLyogVGVzdCBnbXBfcmFuZGNsYXNzLgorCitDb3B5cmlnaHQgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcHh4LmgiCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKy8qIGFsbCBmbGF2b3VycyBvZiBpbml0aWFsaXphdGlvbiAqLwordm9pZAorY2hlY2tfcmFuZGluaXQgKHZvaWQpCit7CisgIHsKKyAgICBnbXBfcmFuZGNsYXNzIHIoZ21wX3JhbmRpbml0X2RlZmF1bHQpOworICB9CisKKyAgeworICAgIG1wel9jbGFzcyBhKDApOworICAgIHVuc2lnbmVkIGxvbmcgYyA9IDAsIG0yZXhwID0gODsKKyAgICBnbXBfcmFuZGNsYXNzIHIoZ21wX3JhbmRpbml0X2xjXzJleHAsIGEsIGMsIG0yZXhwKTsKKyAgfQorCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIG0yZXhwID0gNjQ7CisgICAgZ21wX3JhbmRjbGFzcyByKGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUsIG0yZXhwKTsKKyAgfQorCisgIC8qIGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUsIHdpdGggZXhjZXNzaXZlIHNpemUgKi8KKyAgeworICAgIHRyeSB7CisgICAgICB1bnNpZ25lZCBsb25nIG0yZXhwID0gVUxPTkdfTUFYOworICAgICAgZ21wX3JhbmRjbGFzcyByKGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUsIG0yZXhwKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKDApOyAgLyogc2hvdWxkIG5vdCBiZSByZWFjaGVkICovCisgICAgfSBjYXRjaCAobGVuZ3RoX2Vycm9yJikgeworICAgIH0KKyAgfQorCisgIHsKKyAgICBnbXBfcmFuZGNsYXNzIHIoZ21wX3JhbmRpbml0X210KTsKKyAgfQorCisgIC8qIG9ic29sZXRlLCBidXQgc3RpbGwgYXZhaWxhYmxlICovCisgIHsKKyAgICBnbXBfcmFuZGFsZ190IGFsZyA9IEdNUF9SQU5EX0FMR19MQzsKKyAgICB1bnNpZ25lZCBsb25nIG0yZXhwID0gNjQ7CisgICAgZ21wX3JhbmRjbGFzcyByKGFsZywgbTJleHApOworICB9CisgIHsKKyAgICBnbXBfcmFuZGFsZ190IGFsZyA9IEdNUF9SQU5EX0FMR19ERUZBVUxUOworICAgIHVuc2lnbmVkIGxvbmcgbTJleHAgPSA2NDsKKyAgICBnbXBfcmFuZGNsYXNzIHIoYWxnLCBtMmV4cCk7CisgIH0KKyAgeworICAgIGdtcF9yYW5kYWxnX3QgYWxnID0gKGdtcF9yYW5kYWxnX3QpIDA7CisgICAgdW5zaWduZWQgbG9uZyBtMmV4cCA9IDY0OworICAgIGdtcF9yYW5kY2xhc3MgcihhbGcsIG0yZXhwKTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcHogKHZvaWQpCit7CisgIHsKKyAgICBnbXBfcmFuZGNsYXNzIHIoZ21wX3JhbmRpbml0X2RlZmF1bHQpOworICAgIG1wel9jbGFzcyBhKDEyMyk7CisgICAgdW5zaWduZWQgaW50IGIgPSAyNTY7CisgICAgbXB6X2NsYXNzIGM7CisgICAgci5zZWVkKGEpOworICAgIGMgPSByLmdldF96X2JpdHMoYik7CisgIH0KKyAgeworICAgIGdtcF9yYW5kY2xhc3MgcihnbXBfcmFuZGluaXRfZGVmYXVsdCk7CisgICAgbXB6X2NsYXNzIGEoMjU2KTsKKyAgICB1bnNpZ25lZCBsb25nIGIgPSAxMjM7CisgICAgbXB6X2NsYXNzIGM7CisgICAgci5zZWVkKGIpOworICAgIGMgPSByLmdldF96X2JpdHMoYSk7CisgIH0KKyAgeworICAgIGdtcF9yYW5kY2xhc3MgcihnbXBfcmFuZGluaXRfZGVmYXVsdCk7CisgICAgbXB6X2NsYXNzIGEoMTIzKSwgYigyNTYpOworICAgIG1wel9jbGFzcyBjOworICAgIHIuc2VlZChhKTsKKyAgICBjID0gci5nZXRfel9yYW5nZShiKTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcGYgKHZvaWQpCit7CisgIHsKKyAgICBnbXBfcmFuZGNsYXNzIHIoZ21wX3JhbmRpbml0X2RlZmF1bHQpOworICAgIG1wel9jbGFzcyBhKDEyMyk7CisgICAgci5zZWVkKGEpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSByLmdldF9mKCk7CisgICAgbXBmX2NsYXNzIGMoci5nZXRfZigpKTsKKyAgICBBU1NFUlRfQUxXQVlTIChjLmdldF9wcmVjKCkgPT0gbXBmX2dldF9kZWZhdWx0X3ByZWMoKSk7CisgICAgbXBmX2NsYXNzIGQoci5nZXRfZigpLDIxMik7CisgICAgQVNTRVJUX0FMV0FZUyAoZC5nZXRfcHJlYygpID49IDIxMik7CisgIH0KKyAgeworICAgIGdtcF9yYW5kY2xhc3MgcihnbXBfcmFuZGluaXRfZGVmYXVsdCk7CisgICAgaW50IGEgPSAxMjMsIGIgPSAxOTg7CisgICAgci5zZWVkKGEpOworICAgIG1wZl9jbGFzcyBjOworICAgIGMgPSByLmdldF9mKGIpOworICAgIEFTU0VSVF9BTFdBWVMgKGMuZ2V0X3ByZWMoKSA9PSBtcGZfZ2V0X2RlZmF1bHRfcHJlYygpKTsKKyAgICBtcGZfY2xhc3MgZChyLmdldF9mKGIpKTsKKyAgICBBU1NFUlRfQUxXQVlTIChkLmdldF9wcmVjKCkgPj0gMTk4KTsKKyAgICBtcGZfY2xhc3MgZShyLmdldF9mKGIpLXIuZ2V0X2YoKSk7CisgICAgQVNTRVJUX0FMV0FZUyAoZS5nZXRfcHJlYygpID49IDE5OCk7CisgICAgbXBmX2NsYXNzIGYoci5nZXRfZig2MCksMzAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChmLmdldF9wcmVjKCkgPj0gMzAwKTsKKyAgfQorfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQoKTsKKworICBjaGVja19yYW5kaW5pdCgpOworICBjaGVja19tcHooKTsKKyAgY2hlY2tfbXBmKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY3h4L3QtdGVybmFyeS5jYyBiL3Rlc3RzL2N4eC90LXRlcm5hcnkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwODdmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LXRlcm5hcnkuY2MKQEAgLTAsMCArMSw3MzQgQEAKKy8qIFRlc3QgbXAqX2NsYXNzIHRlcm5hcnkgZXhwcmVzc2lvbnMuCisKK0NvcHlyaWdodCAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiZ21weHguaCIKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworLyogVGhlIHZhcmlvdXMgdGVzdCBjYXNlcyBhcmUgYnJva2VuIHVwIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zIHRvIGtlZXAgZG93bgorICAgY29tcGlsZXIgbWVtb3J5IHVzZS4gIFRoZXkncmUgc3RhdGljIHNvIHRoYXQgYW55IG1pc3Rha2VubHkgb21pdHRlZCBmcm9tCisgICBtYWluKCkgd2lsbCBwcm92b2tlIHdhcm5pbmdzICh1bmRlciBnY2MgLVdhbGwgYXQgbGVhc3QpLiAgKi8KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8xICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZTxjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXB6X2NsYXNzLCBfX2dtcF9leHByCisgIC8vIDxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXB6X2NsYXNzLCBtcHpfY2xhc3MsIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSArIGIgKiBjOyBBU1NFUlRfQUxXQVlTKGQgPT0gNyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpLCBjKDMpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhIC0gYiAqIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAtNSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8yICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPG1wel9jbGFzcywgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPG1wel9jbGFzcywgVCwgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHNpZ25lZCBpbnQgYyA9IDM7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKyBiICogYzsgQVNTRVJUX0FMV0FZUyhkID09IDcpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBzaWduZWQgaW50IGMgPSAzOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhIC0gYiAqIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAtNSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8zICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPG1wel9jbGFzcywgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPFQsIG1wel9jbGFzcywgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHVuc2lnbmVkIGludCBjID0gMzsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSArIGMgKiBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gNyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHVuc2lnbmVkIGludCBjID0gMzsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAtIGMgKiBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gLTUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfNCAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIF9fZ21wX2V4cHIKKyAgLy8gPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBPcDE+ID4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgZG91YmxlIGQgPSA0LjA7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGEgKyBiICogKGMgKyBkKTsgQVNTRVJUX0FMV0FZUyhlID09IDE1KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgZG91YmxlIGQgPSA0LjA7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGEgLSBiICogKGMgKyBkKTsgQVNTRVJUX0FMV0FZUyhlID09IC0xMyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel81ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPG1wel9jbGFzcywgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBtcHpfY2xhc3MsIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICBzaWduZWQgaW50IGQgPSA0OworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSBhICsgKGIgLSBkKSAqIGM7IEFTU0VSVF9BTFdBWVMoZSA9PSAtNSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpLCBjKDMpOworICAgIHNpZ25lZCBpbnQgZCA9IDQ7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGEgLSAoYiAtIGQpICogYzsgQVNTRVJUX0FMV0FZUyhlID09IDcpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfNiAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIF9fZ21wX2V4cHIKKyAgLy8gPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBUPiwgVSwgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHVuc2lnbmVkIGludCBjID0gMywgZCA9IDQ7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGEgKyAoYiArIGMpICogZDsgQVNTRVJUX0FMV0FZUyhlID09IDIxKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMik7CisgICAgdW5zaWduZWQgaW50IGMgPSAzLCBkID0gNDsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYSAtIChiICsgYykgKiBkOyBBU1NFUlRfQUxXQVlTKGUgPT0gLTE5KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzcgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXB6X2NsYXNzLCBfX2dtcF9leHByCisgIC8vIDxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8VCwgX19nbXBfZXhwcjxtcHpfdCwgVT4sIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBkb3VibGUgYyA9IDMuMCwgZCA9IDQuMDsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYSArIGMgKiAoYiArIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gMTkpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBkb3VibGUgYyA9IDMuMCwgZCA9IDQuMDsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYSAtIGMgKiAoYiArIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gLTE3KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzggKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXB6X2NsYXNzLCBfX2dtcF9leHByCisgIC8vIDxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgVD4sIF9fZ21wX2V4cHI8bXB6X3QsIFU+LAorICAvLyBPcDE+ID4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgc2lnbmVkIGludCBkID0gNCwgZSA9IDU7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IGEgKyAoYiAtIGQpICogKGMgKyBlKTsgQVNTRVJUX0FMV0FZUyhmID09IC0xNSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpLCBjKDMpOworICAgIHNpZ25lZCBpbnQgZCA9IDQsIGUgPSA1OworICAgIG1wel9jbGFzcyBmOworICAgIGYgPSBhIC0gKGIgLSBkKSAqIChjICsgZSk7IEFTU0VSVF9BTFdBWVMoZiA9PSAxNyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel85ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LAorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIG1wel9jbGFzcywgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpLCBjKDMpOworICAgIHVuc2lnbmVkIGludCBkID0gNDsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gKGEgKyBkKSArIGIgKiBjOyBBU1NFUlRfQUxXQVlTKGUgPT0gMTEpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICB1bnNpZ25lZCBpbnQgZCA9IDQ7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IChhICsgZCkgLSBiICogYzsgQVNTRVJUX0FMV0FZUyhlID09IC0xKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzEwICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LAorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIFUsIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBkb3VibGUgYyA9IDMuMCwgZCA9IDQuMDsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gKGEgLSBjKSArIGIgKiBkOyBBU1NFUlRfQUxXQVlTKGUgPT0gNik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIGRvdWJsZSBjID0gMy4wLCBkID0gNC4wOworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSAoYSAtIGMpIC0gYiAqIGQ7IEFTU0VSVF9BTFdBWVMoZSA9PSAtMTApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMTEgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgVD4sCisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPFUsIG1wel9jbGFzcywgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHNpZ25lZCBpbnQgYyA9IDMsIGQgPSA0OworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSAoYSAtIGMpICsgZCAqIGI7IEFTU0VSVF9BTFdBWVMoZSA9PSA2KTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMik7CisgICAgc2lnbmVkIGludCBjID0gMywgZCA9IDQ7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IChhIC0gYykgLSBkICogYjsgQVNTRVJUX0FMV0FZUyhlID09IC0xMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8xMiAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBUPiwgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPG1wel9jbGFzcywgX19nbXBfZXhwcjxtcHpfdCwgVT4sIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICB1bnNpZ25lZCBpbnQgZCA9IDQsIGUgPSA1OworICAgIG1wel9jbGFzcyBmOworICAgIGYgPSAoYSArIGQpICsgYiAqIChjIC0gZSk7IEFTU0VSVF9BTFdBWVMoZiA9PSAxKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgdW5zaWduZWQgaW50IGQgPSA0LCBlID0gNTsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgKyBkKSAtIGIgKiAoYyAtIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gOSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8xMyAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBUPiwgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFU+LCBtcHpfY2xhc3MsIE9wMT4gPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICBkb3VibGUgZCA9IDQuMCwgZSA9IDUuMDsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgLSBkKSArIChiICsgZSkgKiBjOyBBU1NFUlRfQUxXQVlTKGYgPT0gMTgpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKSwgYygzKTsKKyAgICBkb3VibGUgZCA9IDQuMCwgZSA9IDUuMDsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgLSBkKSAtIChiICsgZSkgKiBjOyBBU1NFUlRfQUxXQVlTKGYgPT0gLTI0KTsKKyAgfQorCit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMTQgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgVD4sIF9fZ21wX2V4cHIKKyAgLy8gPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBVPiwgViwgT3AxPiA+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHNpZ25lZCBpbnQgYyA9IDMsIGQgPSA0LCBlID0gNTsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgKyBjKSArIChiICsgZCkgKiBlOyBBU1NFUlRfQUxXQVlTKGYgPT0gMzQpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKSwgYigyKTsKKyAgICBzaWduZWQgaW50IGMgPSAzLCBkID0gNCwgZSA9IDU7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IChhICsgYykgLSAoYiArIGQpICogZTsgQVNTRVJUX0FMV0FZUyhmID09IC0yNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8xNSAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIFYsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBUPiwgX19nbXBfZXhwcgorICAvLyA8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPFUsIF9fZ21wX2V4cHI8bXB6X3QsIFY+LCBPcDE+ID4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMik7CisgICAgdW5zaWduZWQgaW50IGMgPSAzLCBkID0gNCwgZSA9IDU7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IChhIC0gYykgKyBkICogKGIgLSBlKTsgQVNTRVJUX0FMV0FZUyhmID09IC0xNCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpOworICAgIHVuc2lnbmVkIGludCBjID0gMywgZCA9IDQsIGUgPSA1OworICAgIG1wel9jbGFzcyBmOworICAgIGYgPSAoYSAtIGMpIC0gZCAqIChiIC0gZSk7IEFTU0VSVF9BTFdBWVMoZiA9PSAxMCk7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzE2ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBfX2dtcF9leHByCisgIC8vIDxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgVT4sIF9fZ21wX2V4cHI8bXB6X3QsIFY+LAorICAvLyBPcDE+ID4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSksIGIoMiksIGMoMyk7CisgICAgZG91YmxlIGQgPSA0LjAsIGUgPSA1LjAsIGYgPSA2LjA7CisgICAgbXB6X2NsYXNzIGc7CisgICAgZyA9IChhICsgZCkgKyAoYiAtIGUpICogKGMgKyBmKTsgQVNTRVJUX0FMV0FZUyhnID09IC0yMik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDEpLCBiKDIpLCBjKDMpOworICAgIGRvdWJsZSBkID0gNC4wLCBlID0gNS4wLCBmID0gNi4wOworICAgIG1wel9jbGFzcyBnOworICAgIGcgPSAoYSArIGQpIC0gKGIgLSBlKSAqIChjICsgZik7IEFTU0VSVF9BTFdBWVMoZyA9PSAzMik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8xNyAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByCisgIC8vIDxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8bXB6X2NsYXNzLCBtcHpfY2xhc3MsIE9wMT4gPiwgbXB6X2NsYXNzLCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYiArIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAxMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIG1wel9jbGFzcyBkOworICAgIGQgPSBhICogYiAtIGM7IEFTU0VSVF9BTFdBWVMoZCA9PSAyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzE4ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHIKKyAgLy8gPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxtcHpfY2xhc3MsIFQsIE9wMT4gPiwgbXB6X2NsYXNzLCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIHNpZ25lZCBpbnQgYyA9IDQ7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGEgKiBjICsgYjsgQVNTRVJUX0FMV0FZUyhkID09IDExKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyk7CisgICAgc2lnbmVkIGludCBjID0gNDsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYSAqIGMgLSBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gNSk7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzE5ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHIKKyAgLy8gPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxULCBtcHpfY2xhc3MsIE9wMT4gPiwgbXB6X2NsYXNzLCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIHVuc2lnbmVkIGludCBjID0gNDsKKyAgICBtcHpfY2xhc3MgZDsKKyAgICBkID0gYyAqIGEgKyBiOyBBU1NFUlRfQUxXQVlTKGQgPT0gMTEpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDQ7CisgICAgbXB6X2NsYXNzIGQ7CisgICAgZCA9IGMgKiBhIC0gYjsgQVNTRVJUX0FMV0FZUyhkID09IDUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMjAgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPG1wel9jbGFzcywgX19nbXBfZXhwcjxtcHpfdCwgVD4sIE9wMT4gPiwgbXB6X2NsYXNzLCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIGRvdWJsZSBkID0gNS4wOworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSBhICogKGIgKyBkKSArIGM7IEFTU0VSVF9BTFdBWVMoZSA9PSAyMCk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIGRvdWJsZSBkID0gNS4wOworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSBhICogKGIgKyBkKSAtIGM7IEFTU0VSVF9BTFdBWVMoZSA9PSAxMik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8yMSAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcgorICAvLyA8X19nbXBfZXhwcjxtcHpfdCwgVD4sIG1wel9jbGFzcywgT3AxPiA+LCBtcHpfY2xhc3MsIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyksIGMoNCk7CisgICAgc2lnbmVkIGludCBkID0gNTsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gKGEgLSBkKSAqIGIgKyBjOyBBU1NFUlRfQUxXQVlTKGUgPT0gLTUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKSwgYyg0KTsKKyAgICBzaWduZWQgaW50IGQgPSA1OworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSAoYSAtIGQpICogYiAtIGM7IEFTU0VSVF9BTFdBWVMoZSA9PSAtMTMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMjIgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBVLCBPcDE+ID4sIG1wel9jbGFzcywgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDQsIGQgPSA1OworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSAoYSArIGMpICogZCArIGI7IEFTU0VSVF9BTFdBWVMoZSA9PSAzMyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIHVuc2lnbmVkIGludCBjID0gNCwgZCA9IDU7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IChhICsgYykgKiBkIC0gYjsgQVNTRVJUX0FMV0FZUyhlID09IDI3KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzIzICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByCisgIC8vIDxULCBfX2dtcF9leHByPG1wel90LCBVPiwgT3AxPiA+LCBtcHpfY2xhc3MsIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyk7CisgICAgZG91YmxlIGMgPSA0LjAsIGQgPSA1LjA7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGMgKiAoYSArIGQpICsgYjsgQVNTRVJUX0FMV0FZUyhlID09IDMxKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyk7CisgICAgZG91YmxlIGMgPSA0LjAsIGQgPSA1LjA7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGMgKiAoYSArIGQpIC0gYjsgQVNTRVJUX0FMV0FZUyhlID09IDI1KTsKKyAgfQorCit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMjQgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBfX2dtcF9leHByPG1wel90LCBVPiwgT3AxPiA+LCBtcHpfY2xhc3MsIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyksIGMoNCk7CisgICAgc2lnbmVkIGludCBkID0gNSwgZSA9IDY7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IChhIC0gZCkgKiAoYiArIGUpICsgYzsgQVNTRVJUX0FMV0FZUyhmID09IC0yMyk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIHNpZ25lZCBpbnQgZCA9IDUsIGUgPSA2OworICAgIG1wel9jbGFzcyBmOworICAgIGYgPSAoYSAtIGQpICogKGIgKyBlKSAtIGM7IEFTU0VSVF9BTFdBWVMoZiA9PSAtMzEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMjUgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPG1wel9jbGFzcywgbXB6X2NsYXNzLCBPcDE+ID4sIF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIHVuc2lnbmVkIGludCBkID0gNTsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYSAqIGIgKyAoYyAtIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gNSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIHVuc2lnbmVkIGludCBkID0gNTsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYSAqIGIgLSAoYyAtIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gNyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8yNiAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcgorICAvLyA8bXB6X2NsYXNzLCBULCBPcDE+ID4sIF9fZ21wX2V4cHI8bXB6X3QsIFU+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIGRvdWJsZSBjID0gNC4wLCBkID0gNS4wOworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSBhICogYyArIChiICsgZCk7IEFTU0VSVF9BTFdBWVMoZSA9PSAxNik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIGRvdWJsZSBjID0gNC4wLCBkID0gNS4wOworICAgIG1wel9jbGFzcyBlOworICAgIGUgPSBhICogYyAtIChiICsgZCk7IEFTU0VSVF9BTFdBWVMoZSA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzI3ICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByCisgIC8vIDxULCBtcHpfY2xhc3MsIE9wMT4gPiwgX19nbXBfZXhwcjxtcHpfdCwgVT4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyk7CisgICAgc2lnbmVkIGludCBjID0gNCwgZCA9IDU7CisgICAgbXB6X2NsYXNzIGU7CisgICAgZSA9IGMgKiBhICsgKGIgLSBkKTsgQVNTRVJUX0FMV0FZUyhlID09IDYpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICBzaWduZWQgaW50IGMgPSA0LCBkID0gNTsKKyAgICBtcHpfY2xhc3MgZTsKKyAgICBlID0gYyAqIGEgLSAoYiAtIGQpOyBBU1NFUlRfQUxXQVlTKGUgPT0gMTApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMjggKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPG1wel9jbGFzcywgX19nbXBfZXhwcjxtcHpfdCwgVD4sIE9wMT4gPiwgX19nbXBfZXhwcjxtcHpfdCwgVT4sIE9wMj4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyksIGMoNCk7CisgICAgdW5zaWduZWQgaW50IGQgPSA1LCBlID0gNjsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gYSAqIChiIC0gZCkgKyAoYyArIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gNik7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpLCBjKDQpOworICAgIHVuc2lnbmVkIGludCBkID0gNSwgZSA9IDY7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IGEgKiAoYiAtIGQpIC0gKGMgKyBlKTsgQVNTRVJUX0FMV0FZUyhmID09IC0xNCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX21wel8yOSAodm9pZCkKK3sKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wMSwgY2xhc3MgT3AyPgorICAvLyBfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcjxfX2dtcF9leHByPG1wel90LCBfX2dtcF9iaW5hcnlfZXhwcgorICAvLyA8X19nbXBfZXhwcjxtcHpfdCwgVD4sIG1wel9jbGFzcywgT3AxPiA+LCBfX2dtcF9leHByPG1wel90LCBVPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKSwgYyg0KTsKKyAgICBkb3VibGUgZCA9IDUuMCwgZSA9IDYuMDsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgKyBkKSAqIGIgKyAoYyAtIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gMTkpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKSwgYyg0KTsKKyAgICBkb3VibGUgZCA9IDUuMCwgZSA9IDYuMDsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgKyBkKSAqIGIgLSAoYyAtIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gMjMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMzAgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBVLCBPcDE+ID4sIF9fZ21wX2V4cHI8bXB6X3QsIFY+LCBPcDI+ID4KKyAgeworICAgIG1wel9jbGFzcyBhKDIpLCBiKDMpOworICAgIHNpZ25lZCBpbnQgYyA9IDQsIGQgPSA1LCBlID0gNjsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gKGEgKyBjKSAqIGQgKyAoYiArIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gMzkpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICBzaWduZWQgaW50IGMgPSA0LCBkID0gNSwgZSA9IDY7CisgICAgbXB6X2NsYXNzIGY7CisgICAgZiA9IChhICsgYykgKiBkIC0gKGIgKyBlKTsgQVNTRVJUX0FMV0FZUyhmID09IDIxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2tfbXB6XzMxICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgT3AxLCBjbGFzcyBPcDI+CisgIC8vIF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByPF9fZ21wX2V4cHI8bXB6X3QsIF9fZ21wX2JpbmFyeV9leHByCisgIC8vIDxULCBfX2dtcF9leHByPG1wel90LCBVPiwgT3AxPiA+LCBfX2dtcF9leHByPG1wel90LCBWPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDQsIGQgPSA1LCBlID0gNjsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gYyAqIChhICsgZCkgKyAoYiAtIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gMjUpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKTsKKyAgICB1bnNpZ25lZCBpbnQgYyA9IDQsIGQgPSA1LCBlID0gNjsKKyAgICBtcHpfY2xhc3MgZjsKKyAgICBmID0gYyAqIChhICsgZCkgLSAoYiAtIGUpOyBBU1NFUlRfQUxXQVlTKGYgPT0gMzEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19tcHpfMzIgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBPcDEsIGNsYXNzIE9wMj4KKyAgLy8gX19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHI8X19nbXBfZXhwcjxtcHpfdCwgX19nbXBfYmluYXJ5X2V4cHIKKyAgLy8gPF9fZ21wX2V4cHI8bXB6X3QsIFQ+LCBfX2dtcF9leHByPG1wel90LCBVPiwgT3AxPiA+LAorICAvLyBfX2dtcF9leHByPG1wel90LCBWPiwgT3AyPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgyKSwgYigzKSwgYyg0KTsKKyAgICBkb3VibGUgZCA9IDUuMCwgZSA9IDYuMCwgZiA9IDcuMDsKKyAgICBtcHpfY2xhc3MgZzsKKyAgICBnID0gKGEgKyBkKSAqIChiIC0gZSkgKyAoYyArIGYpOyBBU1NFUlRfQUxXQVlTKGcgPT0gLTEwKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMiksIGIoMyksIGMoNCk7CisgICAgZG91YmxlIGQgPSA1LjAsIGUgPSA2LjAsIGYgPSA3LjA7CisgICAgbXB6X2NsYXNzIGc7CisgICAgZyA9IChhICsgZCkgKiAoYiAtIGUpIC0gKGMgKyBmKTsgQVNTRVJUX0FMV0FZUyhnID09IC0zMik7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBxICh2b2lkKQoreworICAvLyBjdXJyZW50bHkgdGhlcmUncyBubyB0ZXJuYXJ5IG1wcSBvcGVyYXRpb24KK30KKwordm9pZAorY2hlY2tfbXBmICh2b2lkKQoreworICAvLyBjdXJyZW50bHkgdGhlcmUncyBubyB0ZXJuYXJ5IG1wZiBvcGVyYXRpb24KK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0KCk7CisKKyAgY2hlY2tfbXB6XzEgKCk7CisgIGNoZWNrX21wel8yICgpOworICBjaGVja19tcHpfMyAoKTsKKyAgY2hlY2tfbXB6XzQgKCk7CisgIGNoZWNrX21wel81ICgpOworICBjaGVja19tcHpfNiAoKTsKKyAgY2hlY2tfbXB6XzcgKCk7CisgIGNoZWNrX21wel84ICgpOworICBjaGVja19tcHpfOSAoKTsKKyAgY2hlY2tfbXB6XzEwICgpOworICBjaGVja19tcHpfMTEgKCk7CisgIGNoZWNrX21wel8xMiAoKTsKKyAgY2hlY2tfbXB6XzEzICgpOworICBjaGVja19tcHpfMTQgKCk7CisgIGNoZWNrX21wel8xNSAoKTsKKyAgY2hlY2tfbXB6XzE2ICgpOworICBjaGVja19tcHpfMTcgKCk7CisgIGNoZWNrX21wel8xOCAoKTsKKyAgY2hlY2tfbXB6XzE5ICgpOworICBjaGVja19tcHpfMjAgKCk7CisgIGNoZWNrX21wel8yMSAoKTsKKyAgY2hlY2tfbXB6XzIyICgpOworICBjaGVja19tcHpfMjMgKCk7CisgIGNoZWNrX21wel8yNCAoKTsKKyAgY2hlY2tfbXB6XzI1ICgpOworICBjaGVja19tcHpfMjYgKCk7CisgIGNoZWNrX21wel8yNyAoKTsKKyAgY2hlY2tfbXB6XzI4ICgpOworICBjaGVja19tcHpfMjkgKCk7CisgIGNoZWNrX21wel8zMCAoKTsKKyAgY2hlY2tfbXB6XzMxICgpOworICBjaGVja19tcHpfMzIgKCk7CisKKyAgY2hlY2tfbXBxKCk7CisgIGNoZWNrX21wZigpOworCisgIHRlc3RzX2VuZCgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2N4eC90LXVuYXJ5LmNjIGIvdGVzdHMvY3h4L3QtdW5hcnkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkOGJmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2N4eC90LXVuYXJ5LmNjCkBAIC0wLDAgKzEsMTMyIEBACisvKiBUZXN0IG1wKl9jbGFzcyB1bmFyeSBleHByZXNzaW9ucy4KKworQ29weXJpZ2h0IDIwMDEtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJnbXB4eC5oIgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCit2b2lkCitjaGVja19tcHogKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF91bmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcHpfY2xhc3MgYSgxKTsKKyAgICBtcHpfY2xhc3MgYigrYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxKTsKKyAgfQorICB7CisgICAgbXB6X2NsYXNzIGEoMik7CisgICAgbXB6X2NsYXNzIGI7CisgICAgYiA9IC1hOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTIpOworICB9CisgIHsKKyAgICBtcHpfY2xhc3MgYSgzKTsKKyAgICBtcHpfY2xhc3MgYjsKKyAgICBiID0gfmE7IEFTU0VSVF9BTFdBWVMoYiA9PSAtNCk7CisgIH0KKworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFU+LCBPcD4gPgorICB7CisgICAgbXB6X2NsYXNzIGEoMSk7CisgICAgbXB6X2NsYXNzIGIoLSgtYSkpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMSk7CisgIH0KKyAgeworICAgIG1wel9jbGFzcyBhKDIpOworICAgIG1wel9jbGFzcyBiOworICAgIGIgPSAtKC0oLWEpKTsgQVNTRVJUX0FMV0FZUyhiID09IC0yKTsKKyAgfQorfQorCit2b2lkCitjaGVja19tcHEgKHZvaWQpCit7CisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF91bmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVD4sIE9wPiA+CisgIHsKKyAgICBtcHFfY2xhc3MgYSgxKTsKKyAgICBtcHFfY2xhc3MgYigrYSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxKTsKKyAgfQorICB7CisgICAgbXBxX2NsYXNzIGEoMik7CisgICAgbXBxX2NsYXNzIGI7CisgICAgYiA9IC1hOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTIpOworICB9CisKKyAgLy8gdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIE9wPgorICAvLyBfX2dtcF9leHByPFQsIF9fZ21wX3VuYXJ5X2V4cHI8X19nbXBfZXhwcjxULCBVPiwgT3A+ID4KKyAgeworICAgIG1wcV9jbGFzcyBhKDEpOworICAgIG1wcV9jbGFzcyBiKC0oLWEpKTsgQVNTRVJUX0FMV0FZUyhiID09IDEpOworICB9CisgIHsKKyAgICBtcHFfY2xhc3MgYSgyKTsKKyAgICBtcHFfY2xhc3MgYjsKKyAgICBiID0gLSgtKC1hKSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAtMik7CisgIH0KK30KKwordm9pZAorY2hlY2tfbXBmICh2b2lkKQoreworICAvLyB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgT3A+CisgIC8vIF9fZ21wX2V4cHI8VCwgX19nbXBfdW5hcnlfZXhwcjxfX2dtcF9leHByPFQsIFQ+LCBPcD4gPgorICB7CisgICAgbXBmX2NsYXNzIGEoMSk7CisgICAgbXBmX2NsYXNzIGIoK2EpOyBBU1NFUlRfQUxXQVlTKGIgPT0gMSk7CisgIH0KKyAgeworICAgIG1wZl9jbGFzcyBhKDIpOworICAgIG1wZl9jbGFzcyBiOworICAgIGIgPSAtYTsgQVNTRVJUX0FMV0FZUyhiID09IC0yKTsKKyAgfQorCisgIC8vIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBPcD4KKyAgLy8gX19nbXBfZXhwcjxULCBfX2dtcF91bmFyeV9leHByPF9fZ21wX2V4cHI8VCwgVT4sIE9wPiA+CisgIHsKKyAgICBtcGZfY2xhc3MgYSgxKTsKKyAgICBtcGZfY2xhc3MgYigtKC1hKSk7IEFTU0VSVF9BTFdBWVMoYiA9PSAxKTsKKyAgfQorICB7CisgICAgbXBmX2NsYXNzIGEoMik7CisgICAgbXBmX2NsYXNzIGI7CisgICAgYiA9IC0oLSgtYSkpOyBBU1NFUlRfQUxXQVlTKGIgPT0gLTIpOworICB9Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCgpOworCisgIGNoZWNrX21weigpOworICBjaGVja19tcHEoKTsKKyAgY2hlY2tfbXBmKCk7CisKKyAgdGVzdHNfZW5kKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGV2ZWwvZ2VuLXRlc3QtbG9uZ2xvbmdfaC5jIGIvdGVzdHMvZGV2ZWwvZ2VuLXRlc3QtbG9uZ2xvbmdfaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWMzZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kZXZlbC9nZW4tdGVzdC1sb25nbG9uZ19oLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCitDb3B5cmlnaHQgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtcF9saW1iX3Q7IC8qIG5lYXQgKi8KKwordm9pZAorb25lIChjb25zdCBjaGFyICpvcCwgc2l6ZV90IGluZCwgbXBfbGltYl90IG0wLCBtcF9saW1iX3QgczApCit7CisgIHByaW50ZiAoInN0YXRpYyB2b2lkIGYlenUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXsiLCBpbmQpOworICBwcmludGYgKCJtcF9saW1iX3QgcjEscjA7Iik7CisgIHByaW50ZiAoIiVzKHIxLHIwLDAsJWxkLDAsJWxkKTsiLCBvcCwgKGxvbmcpIG0wLCAobG9uZykgczApOworICBwcmludGYgKCIqcjFwPXIxOypyMHA9cjA7Iik7CisgIHByaW50ZiAoIn1cbiIpOworfQorCittcF9saW1iX3Qgb3BzWzEwMDBdOworCitlbnVtIHdoYXRfdCB7QURELCBTVUJ9OworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc2l6ZV90IG5fb3BlcmFuZHMgPSAwOworICBzaXplX3Qgbl9mdW5jdGlvbnMgPSAwOworICBjb25zdCBjaGFyICpvcDsKKyAgZW51bSB3aGF0X3Qgd2hhdDsKKworICBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcCAoYXJndlsxXSwgImFkZCIpID09IDApCisgICAgeworICAgICAgb3AgPSAiYWRkX3NzYWFhYSI7CisgICAgICB3aGF0ID0gQUREOworICAgIH0KKyAgZWxzZSBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcCAoYXJndlsxXSwgInN1YiIpID09IDApCisgICAgeworICAgICAgb3AgPSAic3ViX2RkbW1zcyI7CisgICAgICB3aGF0ID0gU1VCOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIndoYXQgZG8geXVvIHdhbnQgbWUgdG8gZG8/XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgb3BzW25fb3BlcmFuZHMrK10gPSAxIDw8IGk7CisgICAgICBvcHNbbl9vcGVyYW5kcysrXSA9IC0oMSA8PCBpKTsKKyAgICAgIG9wc1tuX29wZXJhbmRzKytdID0gKDEgPDwgaSkgLSAxOworICAgICAgb3BzW25fb3BlcmFuZHMrK10gPSAtKDEgPDwgaSkgLSAxOworICAgIH0KKworICBwcmludGYgKCIjaW5jbHVkZSA8c3RkbGliLmg+XG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJnbXAtaW1wbC5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcImxvbmdsb25nLmhcIlxuIik7CisKKyAgLyogUHJpbnQgb3V0IG9wc1tdIGRlZmluaXRpb24uICAqLworICBwcmludGYgKCJzdGF0aWMgY29uc3QgaW50IG9wc1slenVdID0ge1xuIiwgbl9vcGVyYW5kcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbl9vcGVyYW5kczsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVsZCwiLCAobG9uZykgb3BzW2ldKTsKKyAgICAgIGlmICgoaSArIDEpICUgNCA9PSAwKQorCXB1dHMgKCIiKTsKKyAgICB9CisgIHByaW50ZiAoIn07XG4iKTsKKworICAvKiBHZW5lcmF0ZSBmdW5jdGlvbnMgYW5kIHByaW50IHRoZW0uICAqLworICBmb3IgKGludCBpID0gMDsgaSA8IG5fb3BlcmFuZHM7IGkrKykKKyAgICB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5fb3BlcmFuZHM7IGorKykKKwl7CisJICBvbmUgKG9wLCBuX2Z1bmN0aW9ucysrLCBvcHNbaV0sIG9wc1tqXSk7CisJfQorICAgIH0KKworICAvKiBQcmludCBvdXQgZnVuY3Rpb24gcG9pbnRlciB0YWJsZS4gICovCisgIHByaW50ZiAoInR5cGVkZWYgdm9pZCAoKmZ1bmNfdCkgKG1wX2xpbWJfdCosIG1wX2xpbWJfdCopO1xuIik7CisgIHByaW50ZiAoInN0YXRpYyBjb25zdCBmdW5jX3QgZnVuY3NbJXp1XSA9IHtcbiIsIG5fZnVuY3Rpb25zKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuX2Z1bmN0aW9uczsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoImYlenUsIiwgaSk7CisgICAgICBpZiAoKGkgKyAxKSAlIDE2ID09IDApCisJcHV0cyAoIiIpOworICAgIH0KKyAgcHJpbnRmICgifTtcbiIpOworCisgIC8qIFByaW50IG91dCB0YWJsZSBvZiByZWZlcmVuY2UgcmVzdWx0cy4gICovCisgIHByaW50ZiAoInN0YXRpYyBjb25zdCBpbnQgcmVmWyV6dV1bMl0gPSB7XG4iLCBuX2Z1bmN0aW9ucyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbl9vcGVyYW5kczsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbl9vcGVyYW5kczsgaisrKQorCXsKKwkgIGlmICh3aGF0ID09IEFERCkKKwkgICAgcHJpbnRmICgieyU2bGQsJTJsZH0sIiwgKGxvbmcpICggb3BzW2ldICsgb3BzW2pdKSwgKGxvbmcpICgobXBfbGltYl90KSAoKG9wc1tpXSArIG9wc1tqXSkgPCBvcHNbaV0pKSk7CisJICBlbHNlICAgICAvKiBTVUIgKi8KKwkgICAgcHJpbnRmICgieyU2bGQsJTJsZH0sIiwgKGxvbmcpICggb3BzW2ldIC0gb3BzW2pdKSwgKGxvbmcpICgtKG1wX2xpbWJfdCkgKG9wc1tpXSA8IG9wc1tqXSkpKTsKKwkgIGlmICgoaSAqIG5fb3BlcmFuZHMgKyBqKSAlIDggPT0gMCkKKwkgICAgcHV0cyAoIiIpOworCX0KKyAgICB9CisgIHByaW50ZiAoIn07XG4iKTsKKworICBwcmludGYgKCJpbnQgbWFpbiAoKVxue1xuIik7CisgIHByaW50ZiAoIiAgbXBfbGltYl90IHIxLCByMDtcbiIpOworICBwcmludGYgKCIgIGludCBlcnIgPSAwO1xuIik7CisgIHByaW50ZiAoIiAgc2l6ZV90IGluZCA9IDA7XG4iKTsKKyAgcHJpbnRmICgiICBmb3IgKHNpemVfdCBpID0gMDsgaSA8ICV6dTsgaSsrKVxuIiwgbl9mdW5jdGlvbnMpOworICBwcmludGYgKCIgICAge1xuIik7CisgIHByaW50ZiAoIiAgICAgIGludCBpaSA9IGkgLyAlenUsIGpqID0gaSAlJSAlenU7XG4iLCBuX29wZXJhbmRzLCBuX29wZXJhbmRzKTsKKyAgcHJpbnRmICgiICAgICAgZnVuY3NbaV0oJnIxLCAmcjApO1xuIik7CisgIHByaW50ZiAoIiAgICAgIGlmIChyMCAhPSAobXBfbGltYl9zaWduZWRfdCkgcmVmW2luZF1bMF0gfHwgcjEgIT0gKG1wX2xpbWJfc2lnbmVkX3QpIHJlZltpbmRdWzFdKSB7XG4iKTsKKyAgcHJpbnRmICgiICAgICAgICAgcHJpbnRmIChcImVycm9yIGZvciBmJSV6dSglJWQsJSVkKTogd2FudCAoJSVkLCUlZCkgZ290ICglJWQsJSVkKVxcblwiLCBpLCAoaW50KSBvcHNbaWldLCAoaW50KSBvcHNbampdLCByZWZbaW5kXVsxXSwgcmVmW2luZF1bMF0sIChpbnQpIHIxLCAoaW50KSByMCk7XG4iKTsKKyAgcHJpbnRmICgiICAgICAgICAgZXJyKys7XG4iKTsKKyAgcHJpbnRmICgiICAgICAgIH1cbiIpOworICBwcmludGYgKCIgICAgICBpbmQrKztcbiIpOworICBwcmludGYgKCIgICAgfVxuIik7CisKKyAgcHJpbnRmICgiICByZXR1cm4gZXJyICE9IDA7XG4iKTsKKyAgcHJpbnRmICgifVxuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGV2ZWwvcHJpbWVzLmMgYi90ZXN0cy9kZXZlbC9wcmltZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU4OTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGV2ZWwvcHJpbWVzLmMKQEAgLTAsMCArMSw0MjQgQEAKKy8qCitDb3B5cmlnaHQgMjAxOC0yMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBVc2FnZToKKworICAgLi9wcmltZXMgW3B8Y10gW24wXSA8bk1heD4KKworICAgICBDaGVja3MgbXB6X3Byb2JhYl9wcmltZV9wKG4sIHIpIGV4aGF1c3RpdmVseSwgc3RhcnRpbmcgZnJvbSBuPW4wCisgICAgIHVwIHRvIG5NYXguCisgICAgIElmIG4wICogbjAgPiBuTWF4LCB0aGUgaW50ZXJ2YWxsIGlzIHNpZXZlZCBwaWVjZXdpc2UsIGVsc2UgdGhlCisgICAgIGZ1bGwgaW50ZXJ2YWxsIFswLi5uTWF4XSBpcyBzaWV2ZWQgYXQgb25jZS4KKyAgICAgV2l0aCB0aGUgcGFyYW1ldGVyICJwIiAob3Igbm90aGluZyksIHRlc3RzIGFsbCBudW1iZXJzLiBXaXRoICJjIgorICAgICBvbmx5IGNvbXBvc2l0ZXMgYXJlIHRlc3RlZC4KKworICAgLi9wcmltZXMgbnxOIFtuMF0gPG5NYXg+CisKKyAgICAgQ2hlY2tzIG1wel9uZXh0cHJpbWUoKSBleGhhdXN0aXZlbHksIHN0YXJ0aW5nIGZyb20gbj1uMCB1cCB0bworICAgICBuTWF4LiBXaXRoICJuIiwgb25seSB0aGUgc2VxdWVuY2Ugb2YgcHJpbWVzIGlzIGNoZWNrZWQsIHdpdGggIk4iCisgICAgIHRoZSBmdW5jdGlvbiBpcyB0ZXN0ZWQgb24gZXZlcnkgbnVtYmVyIGluIHRoZSBpbnRlcnZhbC4KKworICAgICBXQVJOSU5HOiBUaGUgZnVsbCBpbnRlcnZhbGwgWzAuLm5NYXhdIGlzIHNpZXZlZCBhdCBvbmNlLCBldmVuIGlmCisgICAgIG9ubHkgYSBwaWVjZSBpcyBuZWVkZWQuIFRoaXMgbWF5IHJlcXVpcmUgYSBsb3Qgb2YgbWVtb3J5IQorCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisjZGVmaW5lIFNUT1AoeCkgcmV0dXJuICh4KQorLyogI2RlZmluZSBTVE9QKHgpIHggKi8KKyNkZWZpbmUgUkVQUyAxMAorLyogI2RlZmluZSBUUkFDRSh4LG4pIGlmICgobik+MSkge3g7fSAqLworI2RlZmluZSBUUkFDRSh4LG4pCisKKy8qIFRoZSBmdWxsIHByaW1lc2lldmUuYyBpcyBpbmNsdWRlZCwganVzdCBmb3IgYmxvY2tfcmVzaWV2ZSwgdGhhdAorICAgaXMgbm90IGV4cG9ydGVkIC4uLiAqLworI3VuZGVmIGdtcF9wcmltZXNpZXZlCisjaW5jbHVkZSAiLi4vLi4vcHJpbWVzaWV2ZS5jIgorCisjaWZuZGVmIEJMT0NLX1NJWkUKKyNkZWZpbmUgQkxPQ0tfU0laRSAyMDQ4CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gc2lldmU6IHNpZXZpbmcgZnVuY3Rpb25zIGFuZCB0b29scyBmb3IgcHJpbWVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbXBfc2l6ZV90CitwcmltZXNpZXZlX3NpemUgKG1wX2xpbWJfdCBuKSB7IHJldHVybiBuX2Z0b19iaXQobikgLyBHTVBfTElNQl9CSVRTICsgMTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNlY3Rpb24gbWFjcm9zOiBjb21tb24gbWFjcm9zLCBmb3Igc3dpbmcvZmFjL2JpbiAoJnNpZXZlKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTE9PUF9PTl9TSUVWRV9DT05USU5VRShwcmltZSxlbmQpCQkJXAorICAgIF9fbWF4X2kgPSAoZW5kKTsJCQkJCQlcCisJCQkJCQkJCVwKKyAgICBkbyB7CQkJCQkJCVwKKyAgICAgICsrX19pOwkJCQkJCQlcCisgICAgICBpZiAoKCpfX3NpZXZlICYgX19tYXNrKSA9PSAwKQkJCQlcCisJewkJCQkJCQlcCisJICBtcF9saW1iX3QgcHJpbWU7CQkJCQlcCisJICBwcmltZSA9IGlkX3RvX24oX19pKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfQkVHSU4ocHJpbWUsc3RhcnQsZW5kLG9mZixzaWV2ZSkJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIG1wX2xpbWJfdCBfX21hc2ssICpfX3NpZXZlLCBfX21heF9pLCBfX2k7CQkJXAorCQkJCQkJCQlcCisgICAgX19pID0gKHN0YXJ0KS0ob2ZmKTsJCQkJCVwKKyAgICBfX3NpZXZlID0gKHNpZXZlKSArIF9faSAvIEdNUF9MSU1CX0JJVFM7CQkJXAorICAgIF9fbWFzayA9IENOU1RfTElNQigxKSA8PCAoX19pICUgR01QX0xJTUJfQklUUyk7CQlcCisgICAgX19pICs9IChvZmYpOwkJCQkJCVwKKwkJCQkJCQkJXAorICAgIExPT1BfT05fU0lFVkVfQ09OVElOVUUocHJpbWUsZW5kKQorCisjZGVmaW5lIExPT1BfT05fU0lFVkVfU1RPUAkJCQkJXAorCX0JCQkJCQkJXAorICAgICAgX19tYXNrID0gX19tYXNrIDw8IDEgfCBfX21hc2sgPj4gKEdNUF9MSU1CX0JJVFMtMSk7CVwKKyAgICAgIF9fc2lldmUgKz0gX19tYXNrICYgMTsJCQkJCVwKKyAgICB9ICB3aGlsZSAoX19pIDw9IF9fbWF4X2kpCisKKyNkZWZpbmUgTE9PUF9PTl9TSUVWRV9FTkQJCQkJCVwKKyAgICBMT09QX09OX1NJRVZFX1NUT1A7CQkJCQkJXAorICB9IHdoaWxlICgwKQorCittcHpfdCBnOworCitpbnQgc29tZXRoaW5nX3dyb25nIChtcHpfdCBlciwgaW50IGV4cCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAidmFsdWUgPSAlbHUgLCBleHBlY3RlZCA9ICVpXG4iLCBtcHpfZ2V0X3VpIChlciksIGV4cCk7CisgIHJldHVybiAtMTsKK30KKworaW50CitjaGVja19wcHJpbWUgKHVuc2lnbmVkIGxvbmcgYmVnaW4sIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgY29tcG9zaXRlcykKK3sKKyAgYmVnaW4gPSAoYmVnaW4gLyA2VSkgKiA2VTsKKyAgZm9yICg7KGJlZ2luIDwgMikgJiAoYmVnaW4gPD0gZW5kKTsgKytiZWdpbikKKyAgICB7CisgICAgICAqKGctPl9tcF9kKSA9IGJlZ2luOworICAgICAgVFJBQ0UocHJpbnRmICgiLSVsaSAiLCBiZWdpbiksMSk7CisgICAgICBpZiAobXB6X3Byb2JhYl9wcmltZV9wIChnLCBSRVBTKSkKKwlTVE9QIChzb21ldGhpbmdfd3JvbmcgKGcsIDApKTsKKyAgICB9CisgIGZvciAoOyhiZWdpbiA8IDQpICYgKGJlZ2luIDw9IGVuZCk7ICsrYmVnaW4pCisgICAgeworICAgICAgKihnLT5fbXBfZCkgPSBiZWdpbjsKKyAgICAgIFRSQUNFKHByaW50ZiAoIislbGkgIiwgYmVnaW4pLDIpOworICAgICAgaWYgKCFjb21wb3NpdGVzICYmICFtcHpfcHJvYmFiX3ByaW1lX3AgKGcsIFJFUFMpKQorCVNUT1AgKHNvbWV0aGluZ193cm9uZyAoZywgMSkpOworICAgIH0KKyAgaWYgKGVuZCA+IDQpIHsKKyAgICBpZiAoKGVuZCA+IDEwMDAwKSAmJiAoYmVnaW4gPiBlbmQgLyBiZWdpbikpCisgICAgICB7CisJbXBfbGltYl90ICpzaWV2ZSwgKnByaW1lczsKKwltcF9zaXplX3Qgc2l6ZV9zLCBzaXplX3AsIG9mZjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCisJbXB6X3NldF91aSAoZywgZW5kKTsKKwltcHpfc3FydCAoZywgZyk7CisJc3RhcnQgPSBtcHpfZ2V0X3VpIChnKSArIEdNUF9MSU1CX0JJVFM7CisJc2l6ZV9wID0gcHJpbWVzaWV2ZV9zaXplIChzdGFydCk7CisKKwlwcmltZXMgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChzaXplX3ApOworCWdtcF9wcmltZXNpZXZlIChwcmltZXMsIHN0YXJ0KTsKKworCXNpemVfcyA9IEJMT0NLX1NJWkUgKiAyOworCXNpZXZlID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2l6ZV9zKTsKKwlvZmYgPSBuX2N0b19iaXQoYmVnaW4pOworCisJZG8geworCSAgVFJBQ0UgKHByaW50ZiAoIm9mZiA9JWxpXG4iLCBvZmYpLDMpOworCSAgYmxvY2tfcmVzaWV2ZSAoc2lldmUsIEJMT0NLX1NJWkUsIG9mZiwgcHJpbWVzKTsKKwkgIFRSQUNFIChwcmludGYgKCJMT09QID0lbGkgLSAlbGlcbiIsIGlkX3RvX24gKG9mZisxKSwgaWRfdG9fbiAob2ZmICsgQkxPQ0tfU0laRSAqIEdNUF9MSU1CX0JJVFMpKSwzKTsKKwkgIExPT1BfT05fU0lFVkVfQkVHSU4gKHByaW1lLCBvZmYsIG9mZiArIEJMT0NLX1NJWkUgKiBHTVBfTElNQl9CSVRTIC0gMSwKKwkJCSAgICAgICBvZmYsIHNpZXZlKTsKKworCSAgZG8geworCSAgICAqKGctPl9tcF9kKSA9IGJlZ2luOworCSAgICBUUkFDRShwcmludGYgKCItJWxpICIsIGJlZ2luKSwxKTsKKwkgICAgaWYgKG1wel9wcm9iYWJfcHJpbWVfcCAoZywgUkVQUykpCisJICAgICAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAwKSk7CisJICAgIGlmICgoYmVnaW4gJiAweGZmKSA9PSAwKQorCSAgICAgIHsKKwkJc3Bpbm5lcigpOworCQlpZiAoKGJlZ2luICYgMHhmZmZmZmZmKSA9PSAwKQorCQkgIHByaW50ZiAoIiVsaSAoMHglbHgpXG4iLCBiZWdpbiwgYmVnaW4pOworCSAgICAgIH0KKwkgIH0gd2hpbGUgKCsrYmVnaW4gPCBwcmltZSk7CisKKwkgICooZy0+X21wX2QpID0gYmVnaW47CisJICBUUkFDRShwcmludGYgKCIrJWxpICIsIGJlZ2luKSwyKTsKKwkgIGlmICghY29tcG9zaXRlcyAmJiAhIG1wel9wcm9iYWJfcHJpbWVfcCAoZywgUkVQUykpCisJICAgIFNUT1AgKHNvbWV0aGluZ193cm9uZyAoZywgMSkpOworCSAgKytiZWdpbjsKKworCSAgTE9PUF9PTl9TSUVWRV9FTkQ7CisJICBvZmYgKz0gQkxPQ0tfU0laRSAqIEdNUF9MSU1CX0JJVFM7CisJfSB3aGlsZSAoYmVnaW4gPCBlbmQpOworCisJX19HTVBfRlJFRV9GVU5DX0xJTUJTIChzaWV2ZSwgc2l6ZV9zKTsKKwlfX0dNUF9GUkVFX0ZVTkNfTElNQlMgKHByaW1lcywgc2l6ZV9wKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJbXBfbGltYl90ICpzaWV2ZTsKKwltcF9zaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCisJc2l6ZSA9IHByaW1lc2lldmVfc2l6ZSAoZW5kKTsKKworCXNpZXZlID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2l6ZSk7CisJZ21wX3ByaW1lc2lldmUgKHNpZXZlLCBlbmQpOworCXN0YXJ0ID0gTUFYIChiZWdpbiwgNSkgfCAxOworCUxPT1BfT05fU0lFVkVfQkVHSU4gKHByaW1lLCBuX2N0b19iaXQoc3RhcnQpLAorCQkJICAgICBuX2Z0b19iaXQgKGVuZCksIDAsIHNpZXZlKTsKKworCWRvIHsKKwkgICooZy0+X21wX2QpID0gYmVnaW47CisJICBUUkFDRShwcmludGYgKCItJWxpICIsIGJlZ2luKSwxKTsKKwkgIGlmIChtcHpfcHJvYmFiX3ByaW1lX3AgKGcsIFJFUFMpKQorCSAgICBTVE9QIChzb21ldGhpbmdfd3JvbmcgKGcsIDApKTsKKwkgIGlmICgoYmVnaW4gJiAweGZmKSA9PSAwKQorCSAgICB7CisJICAgICAgc3Bpbm5lcigpOworCSAgICAgIGlmICgoYmVnaW4gJiAweGZmZmZmZmYpID09IDApCisJCXByaW50ZiAoIiVsaSAoMHglbHgpXG4iLCBiZWdpbiwgYmVnaW4pOworCSAgICB9CisJfSB3aGlsZSAoKytiZWdpbiA8IHByaW1lKTsKKworCSooZy0+X21wX2QpID0gYmVnaW47CisJVFJBQ0UocHJpbnRmICgiKyVsaSAiLCBiZWdpbiksMik7CisJaWYgKCFjb21wb3NpdGVzICYmICEgbXB6X3Byb2JhYl9wcmltZV9wIChnLCBSRVBTKSkKKwkgIFNUT1AgKHNvbWV0aGluZ193cm9uZyAoZywgMSkpOworCSsrYmVnaW47CisKKwlMT09QX09OX1NJRVZFX0VORDsKKworCV9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoc2lldmUsIHNpemUpOworICAgICAgfQorICB9CisKKyAgZm9yICg7YmVnaW4gPCBlbmQ7ICsrYmVnaW4pCisgICAgeworICAgICAgKihnLT5fbXBfZCkgPSBiZWdpbjsKKyAgICAgIFRSQUNFKHByaW50ZiAoIi0lbGkgIiwgYmVnaW4pLDEpOworICAgICAgaWYgKG1wel9wcm9iYWJfcHJpbWVfcCAoZywgUkVQUykpCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAwKSk7CisgICAgfQorCisgIGdtcF9wcmludGYgKCIlWmRcbiIsIGcpOworICByZXR1cm4gMDsKK30KKworaW50CitjaGVja19ucHJpbWUgKHVuc2lnbmVkIGxvbmcgYmVnaW4sIHVuc2lnbmVkIGxvbmcgZW5kKQoreworICBpZiAoYmVnaW4gPCAyKQorICAgIHsKKyAgICAgICooZy0+X21wX2QpID0gYmVnaW47CisgICAgICBnLT5fbXBfc2l6ZSA9IGJlZ2luOworICAgICAgVFJBQ0UocHJpbnRmICgiJWxpICIsIGJlZ2luKSwxKTsKKyAgICAgIG1wel9uZXh0cHJpbWUgKGcsIGcpOworICAgICAgaWYgKG1wel9jbXBfdWkgKGcsIDIpICE9IDApCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAyKSk7CisgICAgICBiZWdpbiA9IG1wel9nZXRfdWkgKGcpOworICAgIH0KKyAgaWYgKGJlZ2luIDwgMykKKyAgICB7CisgICAgICAqKGctPl9tcF9kKSA9IGJlZ2luOworICAgICAgVFJBQ0UocHJpbnRmICgiJWxpICIsIGJlZ2luKSwxKTsKKyAgICAgIG1wel9uZXh0cHJpbWUgKGcsIGcpOworICAgICAgaWYgKG1wel9jbXBfdWkgKGcsIDMpICE9IDApCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAzKSk7CisgICAgICBiZWdpbiA9IG1wel9nZXRfdWkgKGcpOworICAgIH0KKyAgaWYgKGVuZCA+IDQpCisgICAgICB7CisJbXBfbGltYl90ICpzaWV2ZTsKKwltcF9zaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCisJc2l6ZSA9IHByaW1lc2lldmVfc2l6ZSAoZW5kKTsKKworCXNpZXZlID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2l6ZSk7CisJZ21wX3ByaW1lc2lldmUgKHNpZXZlLCBlbmQpOworCXN0YXJ0ID0gTUFYIChiZWdpbiwgNSkgfCAxOworCSooZy0+X21wX2QpID0gYmVnaW47CisJTE9PUF9PTl9TSUVWRV9CRUdJTiAocHJpbWUsIG5fY3RvX2JpdChzdGFydCksCisJCQkgICAgIG5fZnRvX2JpdCAoZW5kKSwgMCwgc2lldmUpOworCisJbXB6X25leHRwcmltZSAoZywgZyk7CisJaWYgKG1wel9jbXBfdWkgKGcsIHByaW1lKSAhPSAwKQorCSAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCBwcmltZSkpOworCisJaWYgKHByaW1lIC0gc3RhcnQgPiAyMDApCisJICB7CisJICAgIHN0YXJ0ID0gcHJpbWU7CisJICAgIHNwaW5uZXIoKTsKKwkgICAgaWYgKHByaW1lIC0gYmVnaW4gPiAweGZmZmZmZmYpCisJICAgICAgeworCQliZWdpbiA9IHByaW1lOworCQlwcmludGYgKCIlbGkgKDB4JWx4KVxuIiwgYmVnaW4sIGJlZ2luKTsKKwkgICAgICB9CisJICB9CisKKwlMT09QX09OX1NJRVZFX0VORDsKKworCV9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoc2lldmUsIHNpemUpOworICAgICAgfQorCisgIGlmIChtcHpfY21wX3VpIChnLCBlbmQpIDwgMCkKKyAgICB7CisgICAgICBtcHpfbmV4dHByaW1lIChnLCBnKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChnLCBlbmQpIDw9IDApCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAtMSkpOworICAgIH0KKworICBnbXBfcHJpbnRmICgiJVpkXG4iLCBnKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY2hlY2tfTnByaW1lICh1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyAgbXB6X3Qgb3A7CisgIG1wel9pbml0X3NldF91aSAob3AsIGVuZCk7CisKKyAgZm9yICg7YmVnaW4gPCAyOyArK2JlZ2luKQorICAgIHsKKyAgICAgICoob3AtPl9tcF9kKSA9IGJlZ2luOworICAgICAgb3AtPl9tcF9zaXplID0gYmVnaW47CisgICAgICBUUkFDRShwcmludGYgKCIlbGkgIiwgYmVnaW4pLDEpOworICAgICAgbXB6X25leHRwcmltZSAoZywgb3ApOworICAgICAgaWYgKG1wel9jbXBfdWkgKGcsIDIpICE9IDApCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAyKSk7CisgICAgfQorICBpZiAoYmVnaW4gPCAzKQorICAgIHsKKyAgICAgICoob3AtPl9tcF9kKSA9IGJlZ2luOworICAgICAgVFJBQ0UocHJpbnRmICgiJWxpICIsIGJlZ2luKSwxKTsKKyAgICAgIG1wel9uZXh0cHJpbWUgKGcsIG9wKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChnLCAzKSAhPSAwKQorCVNUT1AgKHNvbWV0aGluZ193cm9uZyAoZywgMykpOworICAgICAgYmVnaW4gPSAzOworICAgIH0KKyAgaWYgKGVuZCA+IDQpCisgICAgICB7CisJbXBfbGltYl90ICpzaWV2ZTsKKwltcF9zaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgb3BsOworCisJc2l6ZSA9IHByaW1lc2lldmVfc2l6ZSAoZW5kKTsKKworCXNpZXZlID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2l6ZSk7CisJZ21wX3ByaW1lc2lldmUgKHNpZXZlLCBlbmQpOworCXN0YXJ0ID0gTUFYIChiZWdpbiwgNSkgfCAxOworCW9wbCA9IGJlZ2luOworCUxPT1BfT05fU0lFVkVfQkVHSU4gKHByaW1lLCBuX2N0b19iaXQoc3RhcnQpLAorCQkJICAgICBuX2Z0b19iaXQgKGVuZCksIDAsIHNpZXZlKTsKKworCWRvIHsKKwkgICoob3AtPl9tcF9kKSA9IG9wbDsKKwkgIG1wel9uZXh0cHJpbWUgKGcsIG9wKTsKKwkgIGlmIChtcHpfY21wX3VpIChnLCBwcmltZSkgIT0gMCkKKwkgICAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCBwcmltZSkpOworCSAgKytvcGw7CisJfSB3aGlsZSAob3BsIDwgcHJpbWUpOworCisJaWYgKHByaW1lIC0gc3RhcnQgPiAyMDApCisJICB7CisJICAgIHN0YXJ0ID0gcHJpbWU7CisJICAgIHNwaW5uZXIoKTsKKwkgICAgaWYgKHByaW1lIC0gYmVnaW4gPiAweGZmZmZmZmYpCisJICAgICAgeworCQliZWdpbiA9IHByaW1lOworCQlwcmludGYgKCIlbGkgKDB4JWx4KVxuIiwgYmVnaW4sIGJlZ2luKTsKKwkgICAgICB9CisJICB9CisKKwlMT09QX09OX1NJRVZFX0VORDsKKworCV9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoc2lldmUsIHNpemUpOworICAgICAgfQorCisgIGlmIChtcHpfY21wX3VpIChnLCBlbmQpIDwgMCkKKyAgICB7CisgICAgICBtcHpfbmV4dHByaW1lIChnLCBnKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChnLCBlbmQpIDw9IDApCisJU1RPUCAoc29tZXRoaW5nX3dyb25nIChnLCAtMSkpOworICAgIH0KKworICBnbXBfcHJpbnRmICgiJVpkXG4iLCBnKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgcmV0LCBtb2RlID0gMDsKKyAgdW5zaWduZWQgbG9uZyBiZWdpbiA9IDAsIGVuZCA9IDA7CisKKyAgZm9yICg7YXJnYyA+IDE7LS1hcmdjLCsrYXJndikKKyAgICBzd2l0Y2ggKCphcmd2WzFdKSB7CisgICAgY2FzZSAncCc6CisgICAgICBtb2RlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgbW9kZSA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlICduJzoKKyAgICAgIG1vZGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTic6CisgICAgICBtb2RlID0gMzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBiZWdpbiA9IGVuZDsKKyAgICAgIGVuZCA9IGF0b2wgKGFyZ3ZbMV0pOworICAgIH0KKworICBpZiAoYmVnaW4gPj0gZW5kKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiBwcmltZXMgW058bnxwfGNdIFtuMF0gPG5NYXg+XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBtcHpfaW5pdF9zZXRfdWkgKGcsIFVMT05HX01BWCk7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgIGNhc2UgMToKKyAgICByZXQgPSBjaGVja19ucHJpbWUgKGJlZ2luLCBlbmQpOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgcmV0ID0gY2hlY2tfTnByaW1lIChiZWdpbiwgZW5kKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXQgPSBjaGVja19wcHJpbWUgKGJlZ2luLCBlbmQsIG1vZGUpOworICB9CisKKyAgbXB6X2NsZWFyIChnKTsKKworICBpZiAocmV0ID09IDApCisgICAgcHJpbnRmICgiUHJpbWUgdGVzdHMgY2hlY2tlZCBpbiBbJWx1IC0gJWx1XSBbMHglbHggLSAweCVseF0uXG4iLCBiZWdpbiwgZW5kLCBiZWdpbiwgZW5kKTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RldmVsL3NxcnRyZW1fMV8yLmMgYi90ZXN0cy9kZXZlbC9zcXJ0cmVtXzFfMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTExOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kZXZlbC9zcXJ0cmVtXzFfMi5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorQ29weXJpZ2h0IDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIFVzYWdlOgorCisgICAuL3NxcnRyZW1fMV8yIHgKKworICAgICBDaGVja3MgbXBuX3NxcnRyZW0oKSBleGhhdXN0aXZlbHksIHN0YXJ0aW5nIGZyb20gMCwgaW5jcmVtZW50aW5nCisgICAgIHRoZSBvcGVyYW5kIGJ5IGEgc2luZ2xlIHVuaXQsIHVudGlsIGFsbCB2YWx1ZXMgaGFuZGxlZCBieQorICAgICBtcG5fc3FydHJlbXsxLDJ9IGFyZSB0ZXN0ZWQuIFNMT1cuCisKKyAgIC4vc3FydHJlbV8xXzIgcyAxCisKKyAgICAgQ2hlY2tzIHNvbWUgc3BlY2lhbCBjYXNlcyBmb3IgbXBuX3NxcnRyZW0oKS4gSS5lLiB2YWx1ZXMgb2YgdGhlIGZvcm0KKyAgICAgMl5rKmkgYW5kIDJeayooaSsxKS0xLCB3aXRoIGs9Ml5uIGFuZCAwPGk8Ml5rLCB1bnRpbCBhbGwgc3VjaCB2YWx1ZXMsCisgICAgIGhhbmRsZWQgYnkgbXBuX3NxcnRyZW17MSwyfSwgYXJlIHRlc3RlZC4KKyAgICAgQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgdGhlIHRlc3Qgb2YgdmFsdWVzIHRoYXQgZml0cyBpbiBvbmUgbGltYi4KKyAgICAgTGVzcyBzbG93IHRoYW4gdGhlIGV4aGF1c3RpdmUgdGVzdC4KKworICAgLi9zcXJ0cmVtXzFfMiBjCisKKyAgICAgQ2hlY2tzIGFsbCBjb3JuZXIgY2FzZXMgZm9yIG1wbl9zcXJ0cmVtKCkuIEkuZS4gdmFsdWVzIG9mIHRoZSBmb3JtCisgICAgIGkqaSBhbmQgKGkrMSkqKGkrMSktMSwgZm9yIGVhY2ggdmFsdWUgb2YgaSwgdW50aWwgYWxsIHN1Y2ggdmFsdWVzLAorICAgICBoYW5kbGVkIGJ5IG1wbl9zcXJ0cmVtezEsMn0sIGFyZSB0ZXN0ZWQuCisgICAgIFNsaWdodGx5IGZhc3RlciB0aGFuIHRoZSBzcGVjaWFsIGNhc2VzIHRlc3QuCisKKyAgIEZvciBsYXJnZXIgdmFsdWVzLCB1c2UKKyAgIC4vdHJ5IG1wbl9zcXJ0cmVtCisKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKyNkZWZpbmUgU1RPUCh4KSByZXR1cm4gKHgpCisvKiAjZGVmaW5lIFNUT1AoeCkgeCAqLworI2RlZmluZSBTUElOTkVSKHYpCQkJCQlcCisgIGRvIHsJCQkJCQkJXAorICAgIE1QTl9TSVpFSU5CQVNFXzJFWFAgKHNwaW5uZXJfY291bnQsIHEsIHYsIDEpOwlcCisgICAgLS1zcGlubmVyX2NvdW50OwkJCQkJXAorICAgIHNwaW5uZXIoKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKK2ludCBzb21ldGhpbmdfd3JvbmcgKG1wX2xpbWJfdCBlciwgbXBfbGltYl90IGVjLCBtcF9saW1iX3QgZXMpCit7CisgIGZwcmludGYgKHN0ZGVyciwgInJvb3QgPSAlbHUgLCByZW0gPSB7JWx1ICwgJWx1fVxuIiwgKGxvbmcgdW5zaWduZWQpIGVzLChsb25nIHVuc2lnbmVkKSBlYywobG9uZyB1bnNpZ25lZCkgZXIpOworICByZXR1cm4gLTE7Cit9CisKK2ludAorY2hlY2tfYWxsX3ZhbHVlcyAoaW50IGp1c3RvbmUsIGludCBxdWljaykKK3sKKyAgbXBfbGltYl90IGVzLCBtZXIsIGVyLCBzWzFdLCByWzJdLCBxWzJdOworICBtcF9zaXplX3QgeDsKKyAgdW5zaWduZWQgYml0czsKKworICBlcz0xOworICBpZiAocXVpY2spIHsKKyAgICBwcmludGYgKCJRdWljaywgc2tpcHBpbmcgc29tZS4uLiAoJXUpXG4iLCBHTVBfTlVNQl9CSVRTIC0gMik7CisgICAgZXMgPDw9IEdNUF9OVU1CX0JJVFMgLyAyIC0gMTsKKyAgfQorICBlcj0wOworICBtZXI9IGVzIDw8IDE7CisgICpxID0gZXMgKiBlczsKKyAgcHJpbnRmICgiQWxsIHZhbHVlcyB0ZXN0ZWQsIHVwIHRvIGJpdHM6XG4iKTsKKyAgZG8geworICAgIHggPSBtcG5fc3FydHJlbSAocywgciwgcSwgMSk7CisgICAgaWYgKFVOTElLRUxZICh4ICE9IChlciAhPSAwKSkgfHwgVU5MSUtFTFkgKCpzICE9IGVzKQorCXx8IFVOTElLRUxZICgoeCA9PSAxKSAmJiAoZXIgIT0gKnIpKSkKKyAgICAgIFNUT1AgKHNvbWV0aGluZ193cm9uZyAoZXIsIDAsIGVzKSk7CisKKyAgICBpZiAoVU5MSUtFTFkgKGVyID09IG1lcikpIHsKKyAgICAgICsrZXM7CisgICAgICBpZiAoVU5MSUtFTFkgKChlcyAmIDB4ZmYpID09IDApKQorCVNQSU5ORVIoMSk7CisgICAgICBtZXIgKz0yOyAvKiBtZXIgPSBlcyAqIDIgKi8KKyAgICAgIGVyID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICsrZXI7CisgICAgKysqcTsKKyAgfSB3aGlsZSAoKnEgIT0gMCk7CisgIHFbMV0gPSAxOworICBTUElOTkVSKDIpOworICBwcmludGYgKCJcblZhbHVlcyBvZiBhIHNpbmdsZSBsaW1iLCB0ZXN0ZWQuXG4iKTsKKyAgaWYgKGp1c3RvbmUpIHJldHVybiAwOworICBwcmludGYgKCJBbGwgdmFsdWVzIHRlc3RlZCwgdXAgdG8gYml0czpcbiIpOworICBkbyB7CisgICAgeCA9IG1wbl9zcXJ0cmVtIChzLCByLCBxLCAyKTsKKyAgICBpZiAoVU5MSUtFTFkgKHggIT0gKGVyICE9IDApKSB8fCBVTkxJS0VMWSAoKnMgIT0gZXMpCisJfHwgVU5MSUtFTFkgKCh4ID09IDEpICYmIChlciAhPSAqcikpKQorICAgICAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChlciwgMCwgZXMpKTsKKworICAgIGlmIChVTkxJS0VMWSAoZXIgPT0gbWVyKSkgeworICAgICAgKytlczsKKyAgICAgIGlmIChVTkxJS0VMWSAoKGVzICYgMHg3ZikgPT0gMCkpCisJU1BJTk5FUigyKTsKKyAgICAgIG1lciArPTI7IC8qIG1lciA9IGVzICogMiAqLworICAgICAgaWYgKFVOTElLRUxZIChtZXIgPT0gMCkpCisJYnJlYWs7CisgICAgICBlciA9IDA7CisgICAgfSBlbHNlCisgICAgICArK2VyOworICAgIHFbMV0gKz0gKCsrKnEgPT0gMCk7CisgIH0gd2hpbGUgKDEpOworICBTUElOTkVSKDIpOworICBwcmludGYgKCJcblZhbHVlcyB3aXRoIGF0IG1vc3QgYSBsaW1iIGZvciByZW1pbmRlciwgdGVzdGVkLlxuIik7CisgIHByaW50ZiAoIlRlc3RpbmcgbW9yZSB2YWx1ZXMgbm90IHN1cHBvcnRlZCwgamV0LlxuIik7CisgIHJldHVybiAwOworfQorCittcF9saW1iX3QKK3VwZCAobXBfbGltYl90ICpzLCBtcF9saW1iX3QgaykKK3sKKyAgbXBfbGltYl90IF9zID0gKnM7CisKKyAgd2hpbGUgKGsgPiBfcyAqIDIpCisgICAgeworICAgICAgayAtPSBfcyAqIDIgKyAxOworICAgICAgKytfczsKKyAgICB9CisgICpzID0gX3M7CisgIHJldHVybiBrOworfQorCittcF9saW1iX3QKK3VwZDEgKG1wX2xpbWJfdCAqcywgbXBfbGltYl90IGspCit7CisgIG1wX2xpbWJfdCBfcyA9ICpzOworCisgIGlmIChMSUtFTFkgKGsgPCBfcyAqIDIpKSByZXR1cm4gayArIDE7CisgICpzID0gX3MgKyAxOworICByZXR1cm4gayAtIF9zICogMjsKK30KKworaW50CitjaGVja19zb21lX3ZhbHVlcyAoaW50IGp1c3RvbmUsIGludCBxdWljaykKK3sKKyAgbXBfbGltYl90IGVzLCBoZXIsIGVyLCBrLCBzWzFdLCByWzJdLCBxWzJdOworICBtcF9zaXplX3QgeDsKKyAgdW5zaWduZWQgYml0czsKKworICBlcyA9IDEgPDwgMTsKKyAgaWYgKHF1aWNrKSB7CisgICAgZXMgPDw9IEdNUF9OVU1CX0JJVFMgLyA0IC0gMTsKKyAgICBwcmludGYgKCJRdWljaywgc2tpcHBpbmcgc29tZS4uLiAoJXUpXG4iLCBHTVBfTlVNQl9CSVRTIC8gMik7CisgIH0KKyAgZXIgPSAwOworICAqcSA9IGVzICogZXM7CisgIHByaW50ZiAoIkhpZ2gtaGFsZiB2YWx1ZXMgdGVzdGVkLCB1cCB0byBiaXRzOlxuIik7CisgIGRvIHsKKyAgICBrICA9ICpxIC0gMTsKKyAgICBkbyB7CisgICAgICB4ID0gbXBuX3NxcnRyZW0gKHMsIHIsIHEsIDEpOworICAgICAgaWYgKFVOTElLRUxZICh4ICE9IChlciAhPSAwKSkgfHwgVU5MSUtFTFkgKCpzICE9IGVzKQorCSAgfHwgVU5MSUtFTFkgKCh4ID09IDEpICYmIChlciAhPSAqcikpKQorCVNUT1AgKHNvbWV0aGluZ193cm9uZyAoZXIsIDAsIGVzKSk7CisKKyAgICAgIGlmIChVTkxJS0VMWSAoKGVzICYgMHhmZmZmKSA9PSAwKSkKKwlTUElOTkVSKDEpOworICAgICAgaWYgKCgqcSAmIGspID09IDApIHsKKwkqcSB8PSBrOworCWVyID0gdXBkICgmZXMsIGsgKyBlcik7CisgICAgICB9IGVsc2UgeworCSsrKnE7CisJZXIgPSB1cGQxICgmZXMsIGVyKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlcyAmIGspOworICB9IHdoaWxlICgqcSAhPSAwKTsKKyAgcVsxXSA9IDE7CisgIFNQSU5ORVIoMik7CisgIHByaW50ZiAoIlxuVmFsdWVzIG9mIGEgc2luZ2xlIGxpbWIsIHRlc3RlZC5cbiIpOworICBpZiAoanVzdG9uZSkgcmV0dXJuIDA7CisgIGlmIChxdWljaykgeworICAgIGVzIDw8PSBHTVBfTlVNQl9CSVRTIC8gMiAtIDE7CisgICAgcVsxXSA8PD0gR01QX05VTUJfQklUUyAtIDI7CisgICAgcHJpbnRmICgiUXVpY2ssIHNraXBwaW5nIHNvbWUuLi4gKCV1KVxuIiwgR01QX05VTUJfQklUUyAtIDIpOworICB9CisgIHByaW50ZiAoIkhpZ2gtaGFsZiB2YWx1ZXMgdGVzdGVkLCB1cCB0byBiaXRzOlxuIik7CisgIGRvIHsKKyAgICB4ID0gbXBuX3NxcnRyZW0gKHMsIHIsIHEsIDIpOworICAgIGlmIChVTkxJS0VMWSAoeCAhPSAoZXIgIT0gMCkpIHx8IFVOTElLRUxZICgqcyAhPSBlcykKKwl8fCBVTkxJS0VMWSAoKHggPT0gMSkgJiYgKGVyICE9ICpyKSkpCisgICAgICBTVE9QIChzb21ldGhpbmdfd3JvbmcgKGVyLCAwLCBlcykpOworCisgICAgaWYgKCpxID09IDApIHsKKyAgICAgICpxID0gR01QX05VTUJfTUFYOworICAgICAgaWYgKFVOTElLRUxZICgoZXMgJiAweGZmZmYpID09IDApKSB7CisJaWYgKFVOTElLRUxZIChlcyA9PSBHTVBfTlVNQl9ISUdIQklUKSkKKwkgIGJyZWFrOworCVNQSU5ORVIoMik7CisgICAgICB9CisgICAgICAvKiBlciA9IGVyICsgR01QX05VTUJfTUFYIC0gMSAtIGVzKjIgLy8gcG9zdHBvbmVkICovCisgICAgICArK2VzOworICAgICAgLyogZXIgPSBlciArIEdNUF9OVU1CX01BWCAtIDEgLSAyKihlcy0xKSA9CisgICAgICAgICAgICA9IGVyICsoR01QX05VTUJfTUFYICsgMSktIDIqIGVzID0gZXIgLSAyKmVzICovCisgICAgICBlciA9IHVwZCAoJmVzLCBlciAtIDIgKiBlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICpxID0gMDsKKyAgICAgICsrcVsxXTsKKyAgICAgIGVyID0gdXBkMSAoJmVzLCBlcik7CisgICAgfQorICB9IHdoaWxlICgxKTsKKyAgU1BJTk5FUigyKTsKKyAgcHJpbnRmICgiXG5WYWx1ZXMgd2l0aCBhdCBtb3N0IGEgbGltYiBmb3IgcmVtaW5kZXIsIHRlc3RlZC5cbiIpOworICBlciA9IEdNUF9OVU1CX01BWDsgaGVyID0gMDsKKworICBwcmludGYgKCJIaWdoLWhhbGYgdmFsdWVzIHRlc3RlZCwgdXAgdG8gYml0czpcbiIpOworICBkbyB7CisgICAgeCA9IG1wbl9zcXJ0cmVtIChzLCByLCBxLCAyKTsKKyAgICBpZiAoVU5MSUtFTFkgKHggIT0gKGhlcj8yOihlciAhPSAwKSkpIHx8IFVOTElLRUxZICgqcyAhPSBlcykKKwl8fCBVTkxJS0VMWSAoKHggIT0gMCkgJiYgKChlciAhPSAqcikgfHwgKCh4ID09IDIpICYmIChyWzFdICE9IDEpKSkpKQorICAgICAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChlciwgaGVyLCBlcykpOworCisgICAgaWYgKCpxID09IDApIHsKKyAgICAgICpxID0gR01QX05VTUJfTUFYOworICAgICAgaWYgKFVOTElLRUxZICgoZXMgJiAweGZmZmYpID09IDApKSB7CisJU1BJTk5FUigyKTsKKyAgICAgIH0KKyAgICAgIGlmIChoZXIpIHsKKwkrK2VzOworCWhlciA9IDA7CisJZXIgPSBlciAtIDIgKiBlczsKKyAgICAgIH0gZWxzZSB7CisJaGVyID0gLS1lciAhPSBHTVBfTlVNQl9NQVg7CisJaWYgKGhlciAmIChlciA+IGVzICogMikpIHsKKwkgIGVyIC09IGVzICogMiArIDE7CisJICBoZXIgPSAwOworCSAgKytlczsKKwl9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpxID0gMDsKKyAgICAgIGlmICgrK3FbMV0gPT0gMCkgYnJlYWs7CisgICAgICBpZiAoKGhlciA9PSAwKSB8IChlciA8IGVzICogMikpIHsKKwloZXIgKz0gKytlciA9PSAwOworICAgICAgfQllbHNlIHsKKwkgIGVyIC09IGVzICogMjsKKwkgIGhlciA9IDA7CisJICArK2VzOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoMSk7CisgIHByaW50ZiAoInwgJXVcblZhbHVlcyBvZiBhdCBtb3N0IHR3byBsaW1icywgdGVzdGVkLlxuIiwgR01QX05VTUJfQklUUyoyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY2hlY2tfY29ybmVyX2Nhc2VzIChpbnQganVzdG9uZSwgaW50IHF1aWNrKQoreworICBtcF9saW1iX3QgZXMsIGVyLCBzWzFdLCByWzJdLCBxWzJdOworICBtcF9zaXplX3QgeDsKKyAgdW5zaWduZWQgYml0czsKKworICBlcyA9IDE7CisgIGlmIChxdWljaykgeworICAgIGVzIDw8PSBHTVBfTlVNQl9CSVRTIC8gMiAtIDE7CisgICAgcHJpbnRmICgiUXVpY2ssIHNraXBwaW5nIHNvbWUuLi4gKCV1KVxuIiwgR01QX05VTUJfQklUUyAtIDIpOworICB9CisgIGVyID0gMDsKKyAgKnEgPSBlcyplczsKKyAgcHJpbnRmICgiQ29ybmVyIGNhc2VzIHRlc3RlZCwgdXAgdG8gYml0czpcbiIpOworICBkbyB7CisgICAgeCA9IG1wbl9zcXJ0cmVtIChzLCByLCBxLCAxKTsKKyAgICBpZiAoVU5MSUtFTFkgKHggIT0gKGVyICE9IDApKSB8fCBVTkxJS0VMWSAoKnMgIT0gZXMpCisJfHwgVU5MSUtFTFkgKCh4ID09IDEpICYmIChlciAhPSAqcikpKQorICAgICAgU1RPUCAoc29tZXRoaW5nX3dyb25nIChlciwgMCwgZXMpKTsKKworICAgIGlmIChlciAhPSAwKSB7CisgICAgICArK2VzOworICAgICAgaWYgKFVOTElLRUxZICgoZXMgJiAweGZmZmYpID09IDApKQorCVNQSU5ORVIoMSk7CisgICAgICBlciA9IDA7CisgICAgICArKypxOworICAgIH0gZWxzZSB7CisgICAgICBlciA9IGVzICogMjsKKyAgICAgICpxICs9IGVyOworICAgIH0KKyAgfSB3aGlsZSAoKnEgIT0gMCk7CisgIHFbMV0gPSAxOworICBTUElOTkVSKDIpOworICBwcmludGYgKCJcblZhbHVlcyBvZiBhIHNpbmdsZSBsaW1iLCB0ZXN0ZWQuXG4iKTsKKyAgaWYgKGp1c3RvbmUpIHJldHVybiAwOworICBpZiAocXVpY2spIHsKKyAgICBlcyA8PD0gR01QX05VTUJfQklUUyAvIDIgLSAxOworICAgIHFbMV0gPDw9IEdNUF9OVU1CX0JJVFMgLSAyOworICAgIHByaW50ZiAoIlF1aWNrLCBza2lwcGluZyBzb21lLi4uICgldSlcbiIsIEdNUF9OVU1CX0JJVFMgLSAyKTsKKyAgICAtLWVzOworICAgIC0tcVsxXTsKKyAgICBxWzBdIC09IGVzKjIrMTsKKyAgfQorICBwcmludGYgKCJDb3JuZXIgY2FzZXMgdGVzdGVkLCB1cCB0byBiaXRzOlxuIik7CisgIGRvIHsKKyAgICB4ID0gbXBuX3NxcnRyZW0gKHMsIHIsIHEsIDIpOworICAgIGlmIChVTkxJS0VMWSAoeCAhPSAoZXIgIT0gMCkpIHx8IFVOTElLRUxZICgqcyAhPSBlcykKKwl8fCBVTkxJS0VMWSAoKHggPT0gMSkgJiYgKGVyICE9ICpyKSkpCisgICAgICBTVE9QIChzb21ldGhpbmdfd3JvbmcgKGVyLCAwLCBlcykpOworCisgICAgaWYgKGVyICE9IDApIHsKKyAgICAgICsrZXM7CisgICAgICBpZiAoVU5MSUtFTFkgKChlcyAmIDB4ZmYpID09IDApKQorCVNQSU5ORVIoMik7CisgICAgICBlciA9IDA7CisgICAgICBxWzFdICs9ICgrKypxID09IDApOworICAgICAgaWYgKFVOTElLRUxZIChlcyA9PSBHTVBfTlVNQl9ISUdIQklUKSkKKwlicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgZXIgPSBlcyAqIDI7CisgICAgICBhZGRfc3NhYWFhIChxWzFdLCAqcSwgcVsxXSwgKnEsIDAsIGVyKTsKKyAgICB9CisgIH0gd2hpbGUgKDEpOworICBTUElOTkVSKDIpOworICBwcmludGYgKCJcblZhbHVlcyB3aXRoIGF0IG1vc3QgYSBsaW1iIGZvciByZW1pbmRlciwgdGVzdGVkLlxuQ29ybmVyIGNhc2VzIHRlc3RlZCwgdXAgdG8gYml0czpcbiIpOworICB4ID0gbXBuX3NxcnRyZW0gKHMsIHIsIHEsIDIpOworICBpZiAoKCpzICE9IGVzKSB8fCAoeCAhPSAwKSkKKyAgICBTVE9QIChzb21ldGhpbmdfd3JvbmcgKDAsIDAsIGVzKSk7CisgIHFbMV0gKz0gMTsKKyAgeCA9IG1wbl9zcXJ0cmVtIChzLCByLCBxLCAyKTsKKyAgaWYgKCgqcyAhPSBlcykgfHwgKHggIT0gMikgfHwgKCpyICE9IDApIHx8IChyWzFdICE9IDEpKQorICAgIFNUT1AgKHNvbWV0aGluZ193cm9uZyAoMCwgMSwgZXMpKTsKKyAgKytlczsKKyAgcVsxXSArPSAoKysqcSA9PSAwKTsKKyAgZG8geworICAgIHggPSBtcG5fc3FydHJlbSAocywgciwgcSwgMik7CisgICAgaWYgKFVOTElLRUxZICh4ICE9IChlciAhPSAwKSAqIDIpIHx8IFVOTElLRUxZICgqcyAhPSBlcykKKwl8fCBVTkxJS0VMWSAoKHggPT0gMikgJiYgKChlciAhPSAqcikgfHwgKHJbMV0gIT0gMSkpKSkKKyAgICAgIFNUT1AgKHNvbWV0aGluZ193cm9uZyAoZXIsIGVyICE9IDAsIGVzKSk7CisKKyAgICBpZiAoZXIgIT0gMCkgeworICAgICAgKytlczsKKyAgICAgIGlmIChVTkxJS0VMWSAoZXMgPT0gMCkpCisJYnJlYWs7CisgICAgICBpZiAoVU5MSUtFTFkgKChlcyAmIDB4ZmYpID09IDApKQorCVNQSU5ORVIoMik7CisgICAgICBlciA9IDA7CisgICAgICBxWzFdICs9ICgrKypxID09IDApOworICAgIH0gZWxzZSB7CisgICAgICBlciA9IGVzICogMjsKKyAgICAgIGFkZF9zc2FhYWEgKHFbMV0sICpxLCBxWzFdLCAqcSwgMSwgZXIpOworICAgIH0KKyAgfSB3aGlsZSAoMSk7CisgIHByaW50ZiAoInwgJXVcblZhbHVlcyBvZiBhdCBtb3N0IHR3byBsaW1icywgdGVzdGVkLlxuIiwgR01QX05VTUJfQklUUyoyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgbW9kZSA9IDA7CisgIGludCBqdXN0b25lID0gMDsKKyAgaW50IHF1aWNrID0gMDsKKworICBmb3IgKDthcmdjID4gMTstLWFyZ2MsKythcmd2KQorICAgIHN3aXRjaCAoKmFyZ3ZbMV0pIHsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAidXNhZ2U6IHNxcnRyZW1fMV8yIFt4fGN8c10gWzF8Ml0gW3FdXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIGNhc2UgJ3gnOgorICAgICAgbW9kZSA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICAgIG1vZGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgICBtb2RlID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3EnOgorICAgICAgcXVpY2sgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnMSc6CisgICAgICBqdXN0b25lID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzInOgorICAgICAganVzdG9uZSA9IDA7CisgICAgfQorCisgIHN3aXRjaCAobW9kZSkgeworICBkZWZhdWx0OgorICAgIHJldHVybiBjaGVja19hbGxfdmFsdWVzIChqdXN0b25lLCBxdWljayk7CisgIGNhc2UgMToKKyAgICByZXR1cm4gY2hlY2tfY29ybmVyX2Nhc2VzIChqdXN0b25lLCBxdWljayk7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gY2hlY2tfc29tZV92YWx1ZXMgKGp1c3RvbmUsIHF1aWNrKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGV2ZWwvdGVzdC1hZGRfc3NhYWFhLmMgYi90ZXN0cy9kZXZlbC90ZXN0LWFkZF9zc2FhYWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcxNGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGV2ZWwvdGVzdC1hZGRfc3NhYWFhLmMKQEAgLTAsMCArMSw0OTA4IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCitzdGF0aWMgY29uc3QgaW50IG9wc1s2NF0gPSB7CisxLC0xLDAsLTIsCisyLC0yLDEsLTMsCis0LC00LDMsLTUsCis4LC04LDcsLTksCisxNiwtMTYsMTUsLTE3LAorMzIsLTMyLDMxLC0zMywKKzY0LC02NCw2MywtNjUsCisxMjgsLTEyOCwxMjcsLTEyOSwKKzI1NiwtMjU2LDI1NSwtMjU3LAorNTEyLC01MTIsNTExLC01MTMsCisxMDI0LC0xMDI0LDEwMjMsLTEwMjUsCisyMDQ4LC0yMDQ4LDIwNDcsLTIwNDksCis0MDk2LC00MDk2LDQwOTUsLTQwOTcsCis4MTkyLC04MTkyLDgxOTEsLTgxOTMsCisxNjM4NCwtMTYzODQsMTYzODMsLTE2Mzg1LAorMzI3NjgsLTMyNzY4LDMyNzY3LC0zMjc2OSwKK307CitzdGF0aWMgdm9pZCBmMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDAsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwwLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsOCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDcsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtOSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC05LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTksMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMxLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzEsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2NCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDY0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw2MywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDYzLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNjMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTY1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC02NSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNjUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyOCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEyNywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMjcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTI3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMjksMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTI5LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEyOSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjExNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjExNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU2LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTYsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjU1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDI1NSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyNTUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTI1NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yNTcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjU3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTIsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTEyLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw1MTEsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNTExLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDUxMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNTEzLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTUxMywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC01MTMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjQsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDI0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI0LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjQsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTAyMywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDEwMjMsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxMDIzLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTAyNSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xMDI1LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTEwMjUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMjA0NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDIwNDcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwyMDQ3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMjA0OSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0yMDQ5LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTIwNDksMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTYsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk2LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk2LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTYsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsNDA5NSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDQwOTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw0MDk1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtNDA5NywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC00MDk3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTQwOTcsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkyLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsODE5MSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDgxOTEsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCw4MTkxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtODE5MywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC04MTkzLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTgxOTMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2Mzg0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODQsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4NCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMTYzODMsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwxNjM4MywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDE2MzgzLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0xNjM4NSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMTYzODUsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTE2Mzg1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLDMyNzY3LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsMzI3NjcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwzMjc2NywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO2FkZF9zc2FhYWEocjEscjAsMCwtMzI3NjksMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDthZGRfc3NhYWFhKHIxLHIwLDAsLTMyNzY5LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7YWRkX3NzYWFhYShyMSxyMCwwLC0zMjc2OSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3R5cGVkZWYgdm9pZCAoKmZ1bmNfdCkgKG1wX2xpbWJfdCosIG1wX2xpbWJfdCopOworc3RhdGljIGNvbnN0IGZ1bmNfdCBmdW5jc1s0MDk2XSA9IHsKK2YwLGYxLGYyLGYzLGY0LGY1LGY2LGY3LGY4LGY5LGYxMCxmMTEsZjEyLGYxMyxmMTQsZjE1LAorZjE2LGYxNyxmMTgsZjE5LGYyMCxmMjEsZjIyLGYyMyxmMjQsZjI1LGYyNixmMjcsZjI4LGYyOSxmMzAsZjMxLAorZjMyLGYzMyxmMzQsZjM1LGYzNixmMzcsZjM4LGYzOSxmNDAsZjQxLGY0MixmNDMsZjQ0LGY0NSxmNDYsZjQ3LAorZjQ4LGY0OSxmNTAsZjUxLGY1MixmNTMsZjU0LGY1NSxmNTYsZjU3LGY1OCxmNTksZjYwLGY2MSxmNjIsZjYzLAorZjY0LGY2NSxmNjYsZjY3LGY2OCxmNjksZjcwLGY3MSxmNzIsZjczLGY3NCxmNzUsZjc2LGY3NyxmNzgsZjc5LAorZjgwLGY4MSxmODIsZjgzLGY4NCxmODUsZjg2LGY4NyxmODgsZjg5LGY5MCxmOTEsZjkyLGY5MyxmOTQsZjk1LAorZjk2LGY5NyxmOTgsZjk5LGYxMDAsZjEwMSxmMTAyLGYxMDMsZjEwNCxmMTA1LGYxMDYsZjEwNyxmMTA4LGYxMDksZjExMCxmMTExLAorZjExMixmMTEzLGYxMTQsZjExNSxmMTE2LGYxMTcsZjExOCxmMTE5LGYxMjAsZjEyMSxmMTIyLGYxMjMsZjEyNCxmMTI1LGYxMjYsZjEyNywKK2YxMjgsZjEyOSxmMTMwLGYxMzEsZjEzMixmMTMzLGYxMzQsZjEzNSxmMTM2LGYxMzcsZjEzOCxmMTM5LGYxNDAsZjE0MSxmMTQyLGYxNDMsCitmMTQ0LGYxNDUsZjE0NixmMTQ3LGYxNDgsZjE0OSxmMTUwLGYxNTEsZjE1MixmMTUzLGYxNTQsZjE1NSxmMTU2LGYxNTcsZjE1OCxmMTU5LAorZjE2MCxmMTYxLGYxNjIsZjE2MyxmMTY0LGYxNjUsZjE2NixmMTY3LGYxNjgsZjE2OSxmMTcwLGYxNzEsZjE3MixmMTczLGYxNzQsZjE3NSwKK2YxNzYsZjE3NyxmMTc4LGYxNzksZjE4MCxmMTgxLGYxODIsZjE4MyxmMTg0LGYxODUsZjE4NixmMTg3LGYxODgsZjE4OSxmMTkwLGYxOTEsCitmMTkyLGYxOTMsZjE5NCxmMTk1LGYxOTYsZjE5NyxmMTk4LGYxOTksZjIwMCxmMjAxLGYyMDIsZjIwMyxmMjA0LGYyMDUsZjIwNixmMjA3LAorZjIwOCxmMjA5LGYyMTAsZjIxMSxmMjEyLGYyMTMsZjIxNCxmMjE1LGYyMTYsZjIxNyxmMjE4LGYyMTksZjIyMCxmMjIxLGYyMjIsZjIyMywKK2YyMjQsZjIyNSxmMjI2LGYyMjcsZjIyOCxmMjI5LGYyMzAsZjIzMSxmMjMyLGYyMzMsZjIzNCxmMjM1LGYyMzYsZjIzNyxmMjM4LGYyMzksCitmMjQwLGYyNDEsZjI0MixmMjQzLGYyNDQsZjI0NSxmMjQ2LGYyNDcsZjI0OCxmMjQ5LGYyNTAsZjI1MSxmMjUyLGYyNTMsZjI1NCxmMjU1LAorZjI1NixmMjU3LGYyNTgsZjI1OSxmMjYwLGYyNjEsZjI2MixmMjYzLGYyNjQsZjI2NSxmMjY2LGYyNjcsZjI2OCxmMjY5LGYyNzAsZjI3MSwKK2YyNzIsZjI3MyxmMjc0LGYyNzUsZjI3NixmMjc3LGYyNzgsZjI3OSxmMjgwLGYyODEsZjI4MixmMjgzLGYyODQsZjI4NSxmMjg2LGYyODcsCitmMjg4LGYyODksZjI5MCxmMjkxLGYyOTIsZjI5MyxmMjk0LGYyOTUsZjI5NixmMjk3LGYyOTgsZjI5OSxmMzAwLGYzMDEsZjMwMixmMzAzLAorZjMwNCxmMzA1LGYzMDYsZjMwNyxmMzA4LGYzMDksZjMxMCxmMzExLGYzMTIsZjMxMyxmMzE0LGYzMTUsZjMxNixmMzE3LGYzMTgsZjMxOSwKK2YzMjAsZjMyMSxmMzIyLGYzMjMsZjMyNCxmMzI1LGYzMjYsZjMyNyxmMzI4LGYzMjksZjMzMCxmMzMxLGYzMzIsZjMzMyxmMzM0LGYzMzUsCitmMzM2LGYzMzcsZjMzOCxmMzM5LGYzNDAsZjM0MSxmMzQyLGYzNDMsZjM0NCxmMzQ1LGYzNDYsZjM0NyxmMzQ4LGYzNDksZjM1MCxmMzUxLAorZjM1MixmMzUzLGYzNTQsZjM1NSxmMzU2LGYzNTcsZjM1OCxmMzU5LGYzNjAsZjM2MSxmMzYyLGYzNjMsZjM2NCxmMzY1LGYzNjYsZjM2NywKK2YzNjgsZjM2OSxmMzcwLGYzNzEsZjM3MixmMzczLGYzNzQsZjM3NSxmMzc2LGYzNzcsZjM3OCxmMzc5LGYzODAsZjM4MSxmMzgyLGYzODMsCitmMzg0LGYzODUsZjM4NixmMzg3LGYzODgsZjM4OSxmMzkwLGYzOTEsZjM5MixmMzkzLGYzOTQsZjM5NSxmMzk2LGYzOTcsZjM5OCxmMzk5LAorZjQwMCxmNDAxLGY0MDIsZjQwMyxmNDA0LGY0MDUsZjQwNixmNDA3LGY0MDgsZjQwOSxmNDEwLGY0MTEsZjQxMixmNDEzLGY0MTQsZjQxNSwKK2Y0MTYsZjQxNyxmNDE4LGY0MTksZjQyMCxmNDIxLGY0MjIsZjQyMyxmNDI0LGY0MjUsZjQyNixmNDI3LGY0MjgsZjQyOSxmNDMwLGY0MzEsCitmNDMyLGY0MzMsZjQzNCxmNDM1LGY0MzYsZjQzNyxmNDM4LGY0MzksZjQ0MCxmNDQxLGY0NDIsZjQ0MyxmNDQ0LGY0NDUsZjQ0NixmNDQ3LAorZjQ0OCxmNDQ5LGY0NTAsZjQ1MSxmNDUyLGY0NTMsZjQ1NCxmNDU1LGY0NTYsZjQ1NyxmNDU4LGY0NTksZjQ2MCxmNDYxLGY0NjIsZjQ2MywKK2Y0NjQsZjQ2NSxmNDY2LGY0NjcsZjQ2OCxmNDY5LGY0NzAsZjQ3MSxmNDcyLGY0NzMsZjQ3NCxmNDc1LGY0NzYsZjQ3NyxmNDc4LGY0NzksCitmNDgwLGY0ODEsZjQ4MixmNDgzLGY0ODQsZjQ4NSxmNDg2LGY0ODcsZjQ4OCxmNDg5LGY0OTAsZjQ5MSxmNDkyLGY0OTMsZjQ5NCxmNDk1LAorZjQ5NixmNDk3LGY0OTgsZjQ5OSxmNTAwLGY1MDEsZjUwMixmNTAzLGY1MDQsZjUwNSxmNTA2LGY1MDcsZjUwOCxmNTA5LGY1MTAsZjUxMSwKK2Y1MTIsZjUxMyxmNTE0LGY1MTUsZjUxNixmNTE3LGY1MTgsZjUxOSxmNTIwLGY1MjEsZjUyMixmNTIzLGY1MjQsZjUyNSxmNTI2LGY1MjcsCitmNTI4LGY1MjksZjUzMCxmNTMxLGY1MzIsZjUzMyxmNTM0LGY1MzUsZjUzNixmNTM3LGY1MzgsZjUzOSxmNTQwLGY1NDEsZjU0MixmNTQzLAorZjU0NCxmNTQ1LGY1NDYsZjU0NyxmNTQ4LGY1NDksZjU1MCxmNTUxLGY1NTIsZjU1MyxmNTU0LGY1NTUsZjU1NixmNTU3LGY1NTgsZjU1OSwKK2Y1NjAsZjU2MSxmNTYyLGY1NjMsZjU2NCxmNTY1LGY1NjYsZjU2NyxmNTY4LGY1NjksZjU3MCxmNTcxLGY1NzIsZjU3MyxmNTc0LGY1NzUsCitmNTc2LGY1NzcsZjU3OCxmNTc5LGY1ODAsZjU4MSxmNTgyLGY1ODMsZjU4NCxmNTg1LGY1ODYsZjU4NyxmNTg4LGY1ODksZjU5MCxmNTkxLAorZjU5MixmNTkzLGY1OTQsZjU5NSxmNTk2LGY1OTcsZjU5OCxmNTk5LGY2MDAsZjYwMSxmNjAyLGY2MDMsZjYwNCxmNjA1LGY2MDYsZjYwNywKK2Y2MDgsZjYwOSxmNjEwLGY2MTEsZjYxMixmNjEzLGY2MTQsZjYxNSxmNjE2LGY2MTcsZjYxOCxmNjE5LGY2MjAsZjYyMSxmNjIyLGY2MjMsCitmNjI0LGY2MjUsZjYyNixmNjI3LGY2MjgsZjYyOSxmNjMwLGY2MzEsZjYzMixmNjMzLGY2MzQsZjYzNSxmNjM2LGY2MzcsZjYzOCxmNjM5LAorZjY0MCxmNjQxLGY2NDIsZjY0MyxmNjQ0LGY2NDUsZjY0NixmNjQ3LGY2NDgsZjY0OSxmNjUwLGY2NTEsZjY1MixmNjUzLGY2NTQsZjY1NSwKK2Y2NTYsZjY1NyxmNjU4LGY2NTksZjY2MCxmNjYxLGY2NjIsZjY2MyxmNjY0LGY2NjUsZjY2NixmNjY3LGY2NjgsZjY2OSxmNjcwLGY2NzEsCitmNjcyLGY2NzMsZjY3NCxmNjc1LGY2NzYsZjY3NyxmNjc4LGY2NzksZjY4MCxmNjgxLGY2ODIsZjY4MyxmNjg0LGY2ODUsZjY4NixmNjg3LAorZjY4OCxmNjg5LGY2OTAsZjY5MSxmNjkyLGY2OTMsZjY5NCxmNjk1LGY2OTYsZjY5NyxmNjk4LGY2OTksZjcwMCxmNzAxLGY3MDIsZjcwMywKK2Y3MDQsZjcwNSxmNzA2LGY3MDcsZjcwOCxmNzA5LGY3MTAsZjcxMSxmNzEyLGY3MTMsZjcxNCxmNzE1LGY3MTYsZjcxNyxmNzE4LGY3MTksCitmNzIwLGY3MjEsZjcyMixmNzIzLGY3MjQsZjcyNSxmNzI2LGY3MjcsZjcyOCxmNzI5LGY3MzAsZjczMSxmNzMyLGY3MzMsZjczNCxmNzM1LAorZjczNixmNzM3LGY3MzgsZjczOSxmNzQwLGY3NDEsZjc0MixmNzQzLGY3NDQsZjc0NSxmNzQ2LGY3NDcsZjc0OCxmNzQ5LGY3NTAsZjc1MSwKK2Y3NTIsZjc1MyxmNzU0LGY3NTUsZjc1NixmNzU3LGY3NTgsZjc1OSxmNzYwLGY3NjEsZjc2MixmNzYzLGY3NjQsZjc2NSxmNzY2LGY3NjcsCitmNzY4LGY3NjksZjc3MCxmNzcxLGY3NzIsZjc3MyxmNzc0LGY3NzUsZjc3NixmNzc3LGY3NzgsZjc3OSxmNzgwLGY3ODEsZjc4MixmNzgzLAorZjc4NCxmNzg1LGY3ODYsZjc4NyxmNzg4LGY3ODksZjc5MCxmNzkxLGY3OTIsZjc5MyxmNzk0LGY3OTUsZjc5NixmNzk3LGY3OTgsZjc5OSwKK2Y4MDAsZjgwMSxmODAyLGY4MDMsZjgwNCxmODA1LGY4MDYsZjgwNyxmODA4LGY4MDksZjgxMCxmODExLGY4MTIsZjgxMyxmODE0LGY4MTUsCitmODE2LGY4MTcsZjgxOCxmODE5LGY4MjAsZjgyMSxmODIyLGY4MjMsZjgyNCxmODI1LGY4MjYsZjgyNyxmODI4LGY4MjksZjgzMCxmODMxLAorZjgzMixmODMzLGY4MzQsZjgzNSxmODM2LGY4MzcsZjgzOCxmODM5LGY4NDAsZjg0MSxmODQyLGY4NDMsZjg0NCxmODQ1LGY4NDYsZjg0NywKK2Y4NDgsZjg0OSxmODUwLGY4NTEsZjg1MixmODUzLGY4NTQsZjg1NSxmODU2LGY4NTcsZjg1OCxmODU5LGY4NjAsZjg2MSxmODYyLGY4NjMsCitmODY0LGY4NjUsZjg2NixmODY3LGY4NjgsZjg2OSxmODcwLGY4NzEsZjg3MixmODczLGY4NzQsZjg3NSxmODc2LGY4NzcsZjg3OCxmODc5LAorZjg4MCxmODgxLGY4ODIsZjg4MyxmODg0LGY4ODUsZjg4NixmODg3LGY4ODgsZjg4OSxmODkwLGY4OTEsZjg5MixmODkzLGY4OTQsZjg5NSwKK2Y4OTYsZjg5NyxmODk4LGY4OTksZjkwMCxmOTAxLGY5MDIsZjkwMyxmOTA0LGY5MDUsZjkwNixmOTA3LGY5MDgsZjkwOSxmOTEwLGY5MTEsCitmOTEyLGY5MTMsZjkxNCxmOTE1LGY5MTYsZjkxNyxmOTE4LGY5MTksZjkyMCxmOTIxLGY5MjIsZjkyMyxmOTI0LGY5MjUsZjkyNixmOTI3LAorZjkyOCxmOTI5LGY5MzAsZjkzMSxmOTMyLGY5MzMsZjkzNCxmOTM1LGY5MzYsZjkzNyxmOTM4LGY5MzksZjk0MCxmOTQxLGY5NDIsZjk0MywKK2Y5NDQsZjk0NSxmOTQ2LGY5NDcsZjk0OCxmOTQ5LGY5NTAsZjk1MSxmOTUyLGY5NTMsZjk1NCxmOTU1LGY5NTYsZjk1NyxmOTU4LGY5NTksCitmOTYwLGY5NjEsZjk2MixmOTYzLGY5NjQsZjk2NSxmOTY2LGY5NjcsZjk2OCxmOTY5LGY5NzAsZjk3MSxmOTcyLGY5NzMsZjk3NCxmOTc1LAorZjk3NixmOTc3LGY5NzgsZjk3OSxmOTgwLGY5ODEsZjk4MixmOTgzLGY5ODQsZjk4NSxmOTg2LGY5ODcsZjk4OCxmOTg5LGY5OTAsZjk5MSwKK2Y5OTIsZjk5MyxmOTk0LGY5OTUsZjk5NixmOTk3LGY5OTgsZjk5OSxmMTAwMCxmMTAwMSxmMTAwMixmMTAwMyxmMTAwNCxmMTAwNSxmMTAwNixmMTAwNywKK2YxMDA4LGYxMDA5LGYxMDEwLGYxMDExLGYxMDEyLGYxMDEzLGYxMDE0LGYxMDE1LGYxMDE2LGYxMDE3LGYxMDE4LGYxMDE5LGYxMDIwLGYxMDIxLGYxMDIyLGYxMDIzLAorZjEwMjQsZjEwMjUsZjEwMjYsZjEwMjcsZjEwMjgsZjEwMjksZjEwMzAsZjEwMzEsZjEwMzIsZjEwMzMsZjEwMzQsZjEwMzUsZjEwMzYsZjEwMzcsZjEwMzgsZjEwMzksCitmMTA0MCxmMTA0MSxmMTA0MixmMTA0MyxmMTA0NCxmMTA0NSxmMTA0NixmMTA0NyxmMTA0OCxmMTA0OSxmMTA1MCxmMTA1MSxmMTA1MixmMTA1MyxmMTA1NCxmMTA1NSwKK2YxMDU2LGYxMDU3LGYxMDU4LGYxMDU5LGYxMDYwLGYxMDYxLGYxMDYyLGYxMDYzLGYxMDY0LGYxMDY1LGYxMDY2LGYxMDY3LGYxMDY4LGYxMDY5LGYxMDcwLGYxMDcxLAorZjEwNzIsZjEwNzMsZjEwNzQsZjEwNzUsZjEwNzYsZjEwNzcsZjEwNzgsZjEwNzksZjEwODAsZjEwODEsZjEwODIsZjEwODMsZjEwODQsZjEwODUsZjEwODYsZjEwODcsCitmMTA4OCxmMTA4OSxmMTA5MCxmMTA5MSxmMTA5MixmMTA5MyxmMTA5NCxmMTA5NSxmMTA5NixmMTA5NyxmMTA5OCxmMTA5OSxmMTEwMCxmMTEwMSxmMTEwMixmMTEwMywKK2YxMTA0LGYxMTA1LGYxMTA2LGYxMTA3LGYxMTA4LGYxMTA5LGYxMTEwLGYxMTExLGYxMTEyLGYxMTEzLGYxMTE0LGYxMTE1LGYxMTE2LGYxMTE3LGYxMTE4LGYxMTE5LAorZjExMjAsZjExMjEsZjExMjIsZjExMjMsZjExMjQsZjExMjUsZjExMjYsZjExMjcsZjExMjgsZjExMjksZjExMzAsZjExMzEsZjExMzIsZjExMzMsZjExMzQsZjExMzUsCitmMTEzNixmMTEzNyxmMTEzOCxmMTEzOSxmMTE0MCxmMTE0MSxmMTE0MixmMTE0MyxmMTE0NCxmMTE0NSxmMTE0NixmMTE0NyxmMTE0OCxmMTE0OSxmMTE1MCxmMTE1MSwKK2YxMTUyLGYxMTUzLGYxMTU0LGYxMTU1LGYxMTU2LGYxMTU3LGYxMTU4LGYxMTU5LGYxMTYwLGYxMTYxLGYxMTYyLGYxMTYzLGYxMTY0LGYxMTY1LGYxMTY2LGYxMTY3LAorZjExNjgsZjExNjksZjExNzAsZjExNzEsZjExNzIsZjExNzMsZjExNzQsZjExNzUsZjExNzYsZjExNzcsZjExNzgsZjExNzksZjExODAsZjExODEsZjExODIsZjExODMsCitmMTE4NCxmMTE4NSxmMTE4NixmMTE4NyxmMTE4OCxmMTE4OSxmMTE5MCxmMTE5MSxmMTE5MixmMTE5MyxmMTE5NCxmMTE5NSxmMTE5NixmMTE5NyxmMTE5OCxmMTE5OSwKK2YxMjAwLGYxMjAxLGYxMjAyLGYxMjAzLGYxMjA0LGYxMjA1LGYxMjA2LGYxMjA3LGYxMjA4LGYxMjA5LGYxMjEwLGYxMjExLGYxMjEyLGYxMjEzLGYxMjE0LGYxMjE1LAorZjEyMTYsZjEyMTcsZjEyMTgsZjEyMTksZjEyMjAsZjEyMjEsZjEyMjIsZjEyMjMsZjEyMjQsZjEyMjUsZjEyMjYsZjEyMjcsZjEyMjgsZjEyMjksZjEyMzAsZjEyMzEsCitmMTIzMixmMTIzMyxmMTIzNCxmMTIzNSxmMTIzNixmMTIzNyxmMTIzOCxmMTIzOSxmMTI0MCxmMTI0MSxmMTI0MixmMTI0MyxmMTI0NCxmMTI0NSxmMTI0NixmMTI0NywKK2YxMjQ4LGYxMjQ5LGYxMjUwLGYxMjUxLGYxMjUyLGYxMjUzLGYxMjU0LGYxMjU1LGYxMjU2LGYxMjU3LGYxMjU4LGYxMjU5LGYxMjYwLGYxMjYxLGYxMjYyLGYxMjYzLAorZjEyNjQsZjEyNjUsZjEyNjYsZjEyNjcsZjEyNjgsZjEyNjksZjEyNzAsZjEyNzEsZjEyNzIsZjEyNzMsZjEyNzQsZjEyNzUsZjEyNzYsZjEyNzcsZjEyNzgsZjEyNzksCitmMTI4MCxmMTI4MSxmMTI4MixmMTI4MyxmMTI4NCxmMTI4NSxmMTI4NixmMTI4NyxmMTI4OCxmMTI4OSxmMTI5MCxmMTI5MSxmMTI5MixmMTI5MyxmMTI5NCxmMTI5NSwKK2YxMjk2LGYxMjk3LGYxMjk4LGYxMjk5LGYxMzAwLGYxMzAxLGYxMzAyLGYxMzAzLGYxMzA0LGYxMzA1LGYxMzA2LGYxMzA3LGYxMzA4LGYxMzA5LGYxMzEwLGYxMzExLAorZjEzMTIsZjEzMTMsZjEzMTQsZjEzMTUsZjEzMTYsZjEzMTcsZjEzMTgsZjEzMTksZjEzMjAsZjEzMjEsZjEzMjIsZjEzMjMsZjEzMjQsZjEzMjUsZjEzMjYsZjEzMjcsCitmMTMyOCxmMTMyOSxmMTMzMCxmMTMzMSxmMTMzMixmMTMzMyxmMTMzNCxmMTMzNSxmMTMzNixmMTMzNyxmMTMzOCxmMTMzOSxmMTM0MCxmMTM0MSxmMTM0MixmMTM0MywKK2YxMzQ0LGYxMzQ1LGYxMzQ2LGYxMzQ3LGYxMzQ4LGYxMzQ5LGYxMzUwLGYxMzUxLGYxMzUyLGYxMzUzLGYxMzU0LGYxMzU1LGYxMzU2LGYxMzU3LGYxMzU4LGYxMzU5LAorZjEzNjAsZjEzNjEsZjEzNjIsZjEzNjMsZjEzNjQsZjEzNjUsZjEzNjYsZjEzNjcsZjEzNjgsZjEzNjksZjEzNzAsZjEzNzEsZjEzNzIsZjEzNzMsZjEzNzQsZjEzNzUsCitmMTM3NixmMTM3NyxmMTM3OCxmMTM3OSxmMTM4MCxmMTM4MSxmMTM4MixmMTM4MyxmMTM4NCxmMTM4NSxmMTM4NixmMTM4NyxmMTM4OCxmMTM4OSxmMTM5MCxmMTM5MSwKK2YxMzkyLGYxMzkzLGYxMzk0LGYxMzk1LGYxMzk2LGYxMzk3LGYxMzk4LGYxMzk5LGYxNDAwLGYxNDAxLGYxNDAyLGYxNDAzLGYxNDA0LGYxNDA1LGYxNDA2LGYxNDA3LAorZjE0MDgsZjE0MDksZjE0MTAsZjE0MTEsZjE0MTIsZjE0MTMsZjE0MTQsZjE0MTUsZjE0MTYsZjE0MTcsZjE0MTgsZjE0MTksZjE0MjAsZjE0MjEsZjE0MjIsZjE0MjMsCitmMTQyNCxmMTQyNSxmMTQyNixmMTQyNyxmMTQyOCxmMTQyOSxmMTQzMCxmMTQzMSxmMTQzMixmMTQzMyxmMTQzNCxmMTQzNSxmMTQzNixmMTQzNyxmMTQzOCxmMTQzOSwKK2YxNDQwLGYxNDQxLGYxNDQyLGYxNDQzLGYxNDQ0LGYxNDQ1LGYxNDQ2LGYxNDQ3LGYxNDQ4LGYxNDQ5LGYxNDUwLGYxNDUxLGYxNDUyLGYxNDUzLGYxNDU0LGYxNDU1LAorZjE0NTYsZjE0NTcsZjE0NTgsZjE0NTksZjE0NjAsZjE0NjEsZjE0NjIsZjE0NjMsZjE0NjQsZjE0NjUsZjE0NjYsZjE0NjcsZjE0NjgsZjE0NjksZjE0NzAsZjE0NzEsCitmMTQ3MixmMTQ3MyxmMTQ3NCxmMTQ3NSxmMTQ3NixmMTQ3NyxmMTQ3OCxmMTQ3OSxmMTQ4MCxmMTQ4MSxmMTQ4MixmMTQ4MyxmMTQ4NCxmMTQ4NSxmMTQ4NixmMTQ4NywKK2YxNDg4LGYxNDg5LGYxNDkwLGYxNDkxLGYxNDkyLGYxNDkzLGYxNDk0LGYxNDk1LGYxNDk2LGYxNDk3LGYxNDk4LGYxNDk5LGYxNTAwLGYxNTAxLGYxNTAyLGYxNTAzLAorZjE1MDQsZjE1MDUsZjE1MDYsZjE1MDcsZjE1MDgsZjE1MDksZjE1MTAsZjE1MTEsZjE1MTIsZjE1MTMsZjE1MTQsZjE1MTUsZjE1MTYsZjE1MTcsZjE1MTgsZjE1MTksCitmMTUyMCxmMTUyMSxmMTUyMixmMTUyMyxmMTUyNCxmMTUyNSxmMTUyNixmMTUyNyxmMTUyOCxmMTUyOSxmMTUzMCxmMTUzMSxmMTUzMixmMTUzMyxmMTUzNCxmMTUzNSwKK2YxNTM2LGYxNTM3LGYxNTM4LGYxNTM5LGYxNTQwLGYxNTQxLGYxNTQyLGYxNTQzLGYxNTQ0LGYxNTQ1LGYxNTQ2LGYxNTQ3LGYxNTQ4LGYxNTQ5LGYxNTUwLGYxNTUxLAorZjE1NTIsZjE1NTMsZjE1NTQsZjE1NTUsZjE1NTYsZjE1NTcsZjE1NTgsZjE1NTksZjE1NjAsZjE1NjEsZjE1NjIsZjE1NjMsZjE1NjQsZjE1NjUsZjE1NjYsZjE1NjcsCitmMTU2OCxmMTU2OSxmMTU3MCxmMTU3MSxmMTU3MixmMTU3MyxmMTU3NCxmMTU3NSxmMTU3NixmMTU3NyxmMTU3OCxmMTU3OSxmMTU4MCxmMTU4MSxmMTU4MixmMTU4MywKK2YxNTg0LGYxNTg1LGYxNTg2LGYxNTg3LGYxNTg4LGYxNTg5LGYxNTkwLGYxNTkxLGYxNTkyLGYxNTkzLGYxNTk0LGYxNTk1LGYxNTk2LGYxNTk3LGYxNTk4LGYxNTk5LAorZjE2MDAsZjE2MDEsZjE2MDIsZjE2MDMsZjE2MDQsZjE2MDUsZjE2MDYsZjE2MDcsZjE2MDgsZjE2MDksZjE2MTAsZjE2MTEsZjE2MTIsZjE2MTMsZjE2MTQsZjE2MTUsCitmMTYxNixmMTYxNyxmMTYxOCxmMTYxOSxmMTYyMCxmMTYyMSxmMTYyMixmMTYyMyxmMTYyNCxmMTYyNSxmMTYyNixmMTYyNyxmMTYyOCxmMTYyOSxmMTYzMCxmMTYzMSwKK2YxNjMyLGYxNjMzLGYxNjM0LGYxNjM1LGYxNjM2LGYxNjM3LGYxNjM4LGYxNjM5LGYxNjQwLGYxNjQxLGYxNjQyLGYxNjQzLGYxNjQ0LGYxNjQ1LGYxNjQ2LGYxNjQ3LAorZjE2NDgsZjE2NDksZjE2NTAsZjE2NTEsZjE2NTIsZjE2NTMsZjE2NTQsZjE2NTUsZjE2NTYsZjE2NTcsZjE2NTgsZjE2NTksZjE2NjAsZjE2NjEsZjE2NjIsZjE2NjMsCitmMTY2NCxmMTY2NSxmMTY2NixmMTY2NyxmMTY2OCxmMTY2OSxmMTY3MCxmMTY3MSxmMTY3MixmMTY3MyxmMTY3NCxmMTY3NSxmMTY3NixmMTY3NyxmMTY3OCxmMTY3OSwKK2YxNjgwLGYxNjgxLGYxNjgyLGYxNjgzLGYxNjg0LGYxNjg1LGYxNjg2LGYxNjg3LGYxNjg4LGYxNjg5LGYxNjkwLGYxNjkxLGYxNjkyLGYxNjkzLGYxNjk0LGYxNjk1LAorZjE2OTYsZjE2OTcsZjE2OTgsZjE2OTksZjE3MDAsZjE3MDEsZjE3MDIsZjE3MDMsZjE3MDQsZjE3MDUsZjE3MDYsZjE3MDcsZjE3MDgsZjE3MDksZjE3MTAsZjE3MTEsCitmMTcxMixmMTcxMyxmMTcxNCxmMTcxNSxmMTcxNixmMTcxNyxmMTcxOCxmMTcxOSxmMTcyMCxmMTcyMSxmMTcyMixmMTcyMyxmMTcyNCxmMTcyNSxmMTcyNixmMTcyNywKK2YxNzI4LGYxNzI5LGYxNzMwLGYxNzMxLGYxNzMyLGYxNzMzLGYxNzM0LGYxNzM1LGYxNzM2LGYxNzM3LGYxNzM4LGYxNzM5LGYxNzQwLGYxNzQxLGYxNzQyLGYxNzQzLAorZjE3NDQsZjE3NDUsZjE3NDYsZjE3NDcsZjE3NDgsZjE3NDksZjE3NTAsZjE3NTEsZjE3NTIsZjE3NTMsZjE3NTQsZjE3NTUsZjE3NTYsZjE3NTcsZjE3NTgsZjE3NTksCitmMTc2MCxmMTc2MSxmMTc2MixmMTc2MyxmMTc2NCxmMTc2NSxmMTc2NixmMTc2NyxmMTc2OCxmMTc2OSxmMTc3MCxmMTc3MSxmMTc3MixmMTc3MyxmMTc3NCxmMTc3NSwKK2YxNzc2LGYxNzc3LGYxNzc4LGYxNzc5LGYxNzgwLGYxNzgxLGYxNzgyLGYxNzgzLGYxNzg0LGYxNzg1LGYxNzg2LGYxNzg3LGYxNzg4LGYxNzg5LGYxNzkwLGYxNzkxLAorZjE3OTIsZjE3OTMsZjE3OTQsZjE3OTUsZjE3OTYsZjE3OTcsZjE3OTgsZjE3OTksZjE4MDAsZjE4MDEsZjE4MDIsZjE4MDMsZjE4MDQsZjE4MDUsZjE4MDYsZjE4MDcsCitmMTgwOCxmMTgwOSxmMTgxMCxmMTgxMSxmMTgxMixmMTgxMyxmMTgxNCxmMTgxNSxmMTgxNixmMTgxNyxmMTgxOCxmMTgxOSxmMTgyMCxmMTgyMSxmMTgyMixmMTgyMywKK2YxODI0LGYxODI1LGYxODI2LGYxODI3LGYxODI4LGYxODI5LGYxODMwLGYxODMxLGYxODMyLGYxODMzLGYxODM0LGYxODM1LGYxODM2LGYxODM3LGYxODM4LGYxODM5LAorZjE4NDAsZjE4NDEsZjE4NDIsZjE4NDMsZjE4NDQsZjE4NDUsZjE4NDYsZjE4NDcsZjE4NDgsZjE4NDksZjE4NTAsZjE4NTEsZjE4NTIsZjE4NTMsZjE4NTQsZjE4NTUsCitmMTg1NixmMTg1NyxmMTg1OCxmMTg1OSxmMTg2MCxmMTg2MSxmMTg2MixmMTg2MyxmMTg2NCxmMTg2NSxmMTg2NixmMTg2NyxmMTg2OCxmMTg2OSxmMTg3MCxmMTg3MSwKK2YxODcyLGYxODczLGYxODc0LGYxODc1LGYxODc2LGYxODc3LGYxODc4LGYxODc5LGYxODgwLGYxODgxLGYxODgyLGYxODgzLGYxODg0LGYxODg1LGYxODg2LGYxODg3LAorZjE4ODgsZjE4ODksZjE4OTAsZjE4OTEsZjE4OTIsZjE4OTMsZjE4OTQsZjE4OTUsZjE4OTYsZjE4OTcsZjE4OTgsZjE4OTksZjE5MDAsZjE5MDEsZjE5MDIsZjE5MDMsCitmMTkwNCxmMTkwNSxmMTkwNixmMTkwNyxmMTkwOCxmMTkwOSxmMTkxMCxmMTkxMSxmMTkxMixmMTkxMyxmMTkxNCxmMTkxNSxmMTkxNixmMTkxNyxmMTkxOCxmMTkxOSwKK2YxOTIwLGYxOTIxLGYxOTIyLGYxOTIzLGYxOTI0LGYxOTI1LGYxOTI2LGYxOTI3LGYxOTI4LGYxOTI5LGYxOTMwLGYxOTMxLGYxOTMyLGYxOTMzLGYxOTM0LGYxOTM1LAorZjE5MzYsZjE5MzcsZjE5MzgsZjE5MzksZjE5NDAsZjE5NDEsZjE5NDIsZjE5NDMsZjE5NDQsZjE5NDUsZjE5NDYsZjE5NDcsZjE5NDgsZjE5NDksZjE5NTAsZjE5NTEsCitmMTk1MixmMTk1MyxmMTk1NCxmMTk1NSxmMTk1NixmMTk1NyxmMTk1OCxmMTk1OSxmMTk2MCxmMTk2MSxmMTk2MixmMTk2MyxmMTk2NCxmMTk2NSxmMTk2NixmMTk2NywKK2YxOTY4LGYxOTY5LGYxOTcwLGYxOTcxLGYxOTcyLGYxOTczLGYxOTc0LGYxOTc1LGYxOTc2LGYxOTc3LGYxOTc4LGYxOTc5LGYxOTgwLGYxOTgxLGYxOTgyLGYxOTgzLAorZjE5ODQsZjE5ODUsZjE5ODYsZjE5ODcsZjE5ODgsZjE5ODksZjE5OTAsZjE5OTEsZjE5OTIsZjE5OTMsZjE5OTQsZjE5OTUsZjE5OTYsZjE5OTcsZjE5OTgsZjE5OTksCitmMjAwMCxmMjAwMSxmMjAwMixmMjAwMyxmMjAwNCxmMjAwNSxmMjAwNixmMjAwNyxmMjAwOCxmMjAwOSxmMjAxMCxmMjAxMSxmMjAxMixmMjAxMyxmMjAxNCxmMjAxNSwKK2YyMDE2LGYyMDE3LGYyMDE4LGYyMDE5LGYyMDIwLGYyMDIxLGYyMDIyLGYyMDIzLGYyMDI0LGYyMDI1LGYyMDI2LGYyMDI3LGYyMDI4LGYyMDI5LGYyMDMwLGYyMDMxLAorZjIwMzIsZjIwMzMsZjIwMzQsZjIwMzUsZjIwMzYsZjIwMzcsZjIwMzgsZjIwMzksZjIwNDAsZjIwNDEsZjIwNDIsZjIwNDMsZjIwNDQsZjIwNDUsZjIwNDYsZjIwNDcsCitmMjA0OCxmMjA0OSxmMjA1MCxmMjA1MSxmMjA1MixmMjA1MyxmMjA1NCxmMjA1NSxmMjA1NixmMjA1NyxmMjA1OCxmMjA1OSxmMjA2MCxmMjA2MSxmMjA2MixmMjA2MywKK2YyMDY0LGYyMDY1LGYyMDY2LGYyMDY3LGYyMDY4LGYyMDY5LGYyMDcwLGYyMDcxLGYyMDcyLGYyMDczLGYyMDc0LGYyMDc1LGYyMDc2LGYyMDc3LGYyMDc4LGYyMDc5LAorZjIwODAsZjIwODEsZjIwODIsZjIwODMsZjIwODQsZjIwODUsZjIwODYsZjIwODcsZjIwODgsZjIwODksZjIwOTAsZjIwOTEsZjIwOTIsZjIwOTMsZjIwOTQsZjIwOTUsCitmMjA5NixmMjA5NyxmMjA5OCxmMjA5OSxmMjEwMCxmMjEwMSxmMjEwMixmMjEwMyxmMjEwNCxmMjEwNSxmMjEwNixmMjEwNyxmMjEwOCxmMjEwOSxmMjExMCxmMjExMSwKK2YyMTEyLGYyMTEzLGYyMTE0LGYyMTE1LGYyMTE2LGYyMTE3LGYyMTE4LGYyMTE5LGYyMTIwLGYyMTIxLGYyMTIyLGYyMTIzLGYyMTI0LGYyMTI1LGYyMTI2LGYyMTI3LAorZjIxMjgsZjIxMjksZjIxMzAsZjIxMzEsZjIxMzIsZjIxMzMsZjIxMzQsZjIxMzUsZjIxMzYsZjIxMzcsZjIxMzgsZjIxMzksZjIxNDAsZjIxNDEsZjIxNDIsZjIxNDMsCitmMjE0NCxmMjE0NSxmMjE0NixmMjE0NyxmMjE0OCxmMjE0OSxmMjE1MCxmMjE1MSxmMjE1MixmMjE1MyxmMjE1NCxmMjE1NSxmMjE1NixmMjE1NyxmMjE1OCxmMjE1OSwKK2YyMTYwLGYyMTYxLGYyMTYyLGYyMTYzLGYyMTY0LGYyMTY1LGYyMTY2LGYyMTY3LGYyMTY4LGYyMTY5LGYyMTcwLGYyMTcxLGYyMTcyLGYyMTczLGYyMTc0LGYyMTc1LAorZjIxNzYsZjIxNzcsZjIxNzgsZjIxNzksZjIxODAsZjIxODEsZjIxODIsZjIxODMsZjIxODQsZjIxODUsZjIxODYsZjIxODcsZjIxODgsZjIxODksZjIxOTAsZjIxOTEsCitmMjE5MixmMjE5MyxmMjE5NCxmMjE5NSxmMjE5NixmMjE5NyxmMjE5OCxmMjE5OSxmMjIwMCxmMjIwMSxmMjIwMixmMjIwMyxmMjIwNCxmMjIwNSxmMjIwNixmMjIwNywKK2YyMjA4LGYyMjA5LGYyMjEwLGYyMjExLGYyMjEyLGYyMjEzLGYyMjE0LGYyMjE1LGYyMjE2LGYyMjE3LGYyMjE4LGYyMjE5LGYyMjIwLGYyMjIxLGYyMjIyLGYyMjIzLAorZjIyMjQsZjIyMjUsZjIyMjYsZjIyMjcsZjIyMjgsZjIyMjksZjIyMzAsZjIyMzEsZjIyMzIsZjIyMzMsZjIyMzQsZjIyMzUsZjIyMzYsZjIyMzcsZjIyMzgsZjIyMzksCitmMjI0MCxmMjI0MSxmMjI0MixmMjI0MyxmMjI0NCxmMjI0NSxmMjI0NixmMjI0NyxmMjI0OCxmMjI0OSxmMjI1MCxmMjI1MSxmMjI1MixmMjI1MyxmMjI1NCxmMjI1NSwKK2YyMjU2LGYyMjU3LGYyMjU4LGYyMjU5LGYyMjYwLGYyMjYxLGYyMjYyLGYyMjYzLGYyMjY0LGYyMjY1LGYyMjY2LGYyMjY3LGYyMjY4LGYyMjY5LGYyMjcwLGYyMjcxLAorZjIyNzIsZjIyNzMsZjIyNzQsZjIyNzUsZjIyNzYsZjIyNzcsZjIyNzgsZjIyNzksZjIyODAsZjIyODEsZjIyODIsZjIyODMsZjIyODQsZjIyODUsZjIyODYsZjIyODcsCitmMjI4OCxmMjI4OSxmMjI5MCxmMjI5MSxmMjI5MixmMjI5MyxmMjI5NCxmMjI5NSxmMjI5NixmMjI5NyxmMjI5OCxmMjI5OSxmMjMwMCxmMjMwMSxmMjMwMixmMjMwMywKK2YyMzA0LGYyMzA1LGYyMzA2LGYyMzA3LGYyMzA4LGYyMzA5LGYyMzEwLGYyMzExLGYyMzEyLGYyMzEzLGYyMzE0LGYyMzE1LGYyMzE2LGYyMzE3LGYyMzE4LGYyMzE5LAorZjIzMjAsZjIzMjEsZjIzMjIsZjIzMjMsZjIzMjQsZjIzMjUsZjIzMjYsZjIzMjcsZjIzMjgsZjIzMjksZjIzMzAsZjIzMzEsZjIzMzIsZjIzMzMsZjIzMzQsZjIzMzUsCitmMjMzNixmMjMzNyxmMjMzOCxmMjMzOSxmMjM0MCxmMjM0MSxmMjM0MixmMjM0MyxmMjM0NCxmMjM0NSxmMjM0NixmMjM0NyxmMjM0OCxmMjM0OSxmMjM1MCxmMjM1MSwKK2YyMzUyLGYyMzUzLGYyMzU0LGYyMzU1LGYyMzU2LGYyMzU3LGYyMzU4LGYyMzU5LGYyMzYwLGYyMzYxLGYyMzYyLGYyMzYzLGYyMzY0LGYyMzY1LGYyMzY2LGYyMzY3LAorZjIzNjgsZjIzNjksZjIzNzAsZjIzNzEsZjIzNzIsZjIzNzMsZjIzNzQsZjIzNzUsZjIzNzYsZjIzNzcsZjIzNzgsZjIzNzksZjIzODAsZjIzODEsZjIzODIsZjIzODMsCitmMjM4NCxmMjM4NSxmMjM4NixmMjM4NyxmMjM4OCxmMjM4OSxmMjM5MCxmMjM5MSxmMjM5MixmMjM5MyxmMjM5NCxmMjM5NSxmMjM5NixmMjM5NyxmMjM5OCxmMjM5OSwKK2YyNDAwLGYyNDAxLGYyNDAyLGYyNDAzLGYyNDA0LGYyNDA1LGYyNDA2LGYyNDA3LGYyNDA4LGYyNDA5LGYyNDEwLGYyNDExLGYyNDEyLGYyNDEzLGYyNDE0LGYyNDE1LAorZjI0MTYsZjI0MTcsZjI0MTgsZjI0MTksZjI0MjAsZjI0MjEsZjI0MjIsZjI0MjMsZjI0MjQsZjI0MjUsZjI0MjYsZjI0MjcsZjI0MjgsZjI0MjksZjI0MzAsZjI0MzEsCitmMjQzMixmMjQzMyxmMjQzNCxmMjQzNSxmMjQzNixmMjQzNyxmMjQzOCxmMjQzOSxmMjQ0MCxmMjQ0MSxmMjQ0MixmMjQ0MyxmMjQ0NCxmMjQ0NSxmMjQ0NixmMjQ0NywKK2YyNDQ4LGYyNDQ5LGYyNDUwLGYyNDUxLGYyNDUyLGYyNDUzLGYyNDU0LGYyNDU1LGYyNDU2LGYyNDU3LGYyNDU4LGYyNDU5LGYyNDYwLGYyNDYxLGYyNDYyLGYyNDYzLAorZjI0NjQsZjI0NjUsZjI0NjYsZjI0NjcsZjI0NjgsZjI0NjksZjI0NzAsZjI0NzEsZjI0NzIsZjI0NzMsZjI0NzQsZjI0NzUsZjI0NzYsZjI0NzcsZjI0NzgsZjI0NzksCitmMjQ4MCxmMjQ4MSxmMjQ4MixmMjQ4MyxmMjQ4NCxmMjQ4NSxmMjQ4NixmMjQ4NyxmMjQ4OCxmMjQ4OSxmMjQ5MCxmMjQ5MSxmMjQ5MixmMjQ5MyxmMjQ5NCxmMjQ5NSwKK2YyNDk2LGYyNDk3LGYyNDk4LGYyNDk5LGYyNTAwLGYyNTAxLGYyNTAyLGYyNTAzLGYyNTA0LGYyNTA1LGYyNTA2LGYyNTA3LGYyNTA4LGYyNTA5LGYyNTEwLGYyNTExLAorZjI1MTIsZjI1MTMsZjI1MTQsZjI1MTUsZjI1MTYsZjI1MTcsZjI1MTgsZjI1MTksZjI1MjAsZjI1MjEsZjI1MjIsZjI1MjMsZjI1MjQsZjI1MjUsZjI1MjYsZjI1MjcsCitmMjUyOCxmMjUyOSxmMjUzMCxmMjUzMSxmMjUzMixmMjUzMyxmMjUzNCxmMjUzNSxmMjUzNixmMjUzNyxmMjUzOCxmMjUzOSxmMjU0MCxmMjU0MSxmMjU0MixmMjU0MywKK2YyNTQ0LGYyNTQ1LGYyNTQ2LGYyNTQ3LGYyNTQ4LGYyNTQ5LGYyNTUwLGYyNTUxLGYyNTUyLGYyNTUzLGYyNTU0LGYyNTU1LGYyNTU2LGYyNTU3LGYyNTU4LGYyNTU5LAorZjI1NjAsZjI1NjEsZjI1NjIsZjI1NjMsZjI1NjQsZjI1NjUsZjI1NjYsZjI1NjcsZjI1NjgsZjI1NjksZjI1NzAsZjI1NzEsZjI1NzIsZjI1NzMsZjI1NzQsZjI1NzUsCitmMjU3NixmMjU3NyxmMjU3OCxmMjU3OSxmMjU4MCxmMjU4MSxmMjU4MixmMjU4MyxmMjU4NCxmMjU4NSxmMjU4NixmMjU4NyxmMjU4OCxmMjU4OSxmMjU5MCxmMjU5MSwKK2YyNTkyLGYyNTkzLGYyNTk0LGYyNTk1LGYyNTk2LGYyNTk3LGYyNTk4LGYyNTk5LGYyNjAwLGYyNjAxLGYyNjAyLGYyNjAzLGYyNjA0LGYyNjA1LGYyNjA2LGYyNjA3LAorZjI2MDgsZjI2MDksZjI2MTAsZjI2MTEsZjI2MTIsZjI2MTMsZjI2MTQsZjI2MTUsZjI2MTYsZjI2MTcsZjI2MTgsZjI2MTksZjI2MjAsZjI2MjEsZjI2MjIsZjI2MjMsCitmMjYyNCxmMjYyNSxmMjYyNixmMjYyNyxmMjYyOCxmMjYyOSxmMjYzMCxmMjYzMSxmMjYzMixmMjYzMyxmMjYzNCxmMjYzNSxmMjYzNixmMjYzNyxmMjYzOCxmMjYzOSwKK2YyNjQwLGYyNjQxLGYyNjQyLGYyNjQzLGYyNjQ0LGYyNjQ1LGYyNjQ2LGYyNjQ3LGYyNjQ4LGYyNjQ5LGYyNjUwLGYyNjUxLGYyNjUyLGYyNjUzLGYyNjU0LGYyNjU1LAorZjI2NTYsZjI2NTcsZjI2NTgsZjI2NTksZjI2NjAsZjI2NjEsZjI2NjIsZjI2NjMsZjI2NjQsZjI2NjUsZjI2NjYsZjI2NjcsZjI2NjgsZjI2NjksZjI2NzAsZjI2NzEsCitmMjY3MixmMjY3MyxmMjY3NCxmMjY3NSxmMjY3NixmMjY3NyxmMjY3OCxmMjY3OSxmMjY4MCxmMjY4MSxmMjY4MixmMjY4MyxmMjY4NCxmMjY4NSxmMjY4NixmMjY4NywKK2YyNjg4LGYyNjg5LGYyNjkwLGYyNjkxLGYyNjkyLGYyNjkzLGYyNjk0LGYyNjk1LGYyNjk2LGYyNjk3LGYyNjk4LGYyNjk5LGYyNzAwLGYyNzAxLGYyNzAyLGYyNzAzLAorZjI3MDQsZjI3MDUsZjI3MDYsZjI3MDcsZjI3MDgsZjI3MDksZjI3MTAsZjI3MTEsZjI3MTIsZjI3MTMsZjI3MTQsZjI3MTUsZjI3MTYsZjI3MTcsZjI3MTgsZjI3MTksCitmMjcyMCxmMjcyMSxmMjcyMixmMjcyMyxmMjcyNCxmMjcyNSxmMjcyNixmMjcyNyxmMjcyOCxmMjcyOSxmMjczMCxmMjczMSxmMjczMixmMjczMyxmMjczNCxmMjczNSwKK2YyNzM2LGYyNzM3LGYyNzM4LGYyNzM5LGYyNzQwLGYyNzQxLGYyNzQyLGYyNzQzLGYyNzQ0LGYyNzQ1LGYyNzQ2LGYyNzQ3LGYyNzQ4LGYyNzQ5LGYyNzUwLGYyNzUxLAorZjI3NTIsZjI3NTMsZjI3NTQsZjI3NTUsZjI3NTYsZjI3NTcsZjI3NTgsZjI3NTksZjI3NjAsZjI3NjEsZjI3NjIsZjI3NjMsZjI3NjQsZjI3NjUsZjI3NjYsZjI3NjcsCitmMjc2OCxmMjc2OSxmMjc3MCxmMjc3MSxmMjc3MixmMjc3MyxmMjc3NCxmMjc3NSxmMjc3NixmMjc3NyxmMjc3OCxmMjc3OSxmMjc4MCxmMjc4MSxmMjc4MixmMjc4MywKK2YyNzg0LGYyNzg1LGYyNzg2LGYyNzg3LGYyNzg4LGYyNzg5LGYyNzkwLGYyNzkxLGYyNzkyLGYyNzkzLGYyNzk0LGYyNzk1LGYyNzk2LGYyNzk3LGYyNzk4LGYyNzk5LAorZjI4MDAsZjI4MDEsZjI4MDIsZjI4MDMsZjI4MDQsZjI4MDUsZjI4MDYsZjI4MDcsZjI4MDgsZjI4MDksZjI4MTAsZjI4MTEsZjI4MTIsZjI4MTMsZjI4MTQsZjI4MTUsCitmMjgxNixmMjgxNyxmMjgxOCxmMjgxOSxmMjgyMCxmMjgyMSxmMjgyMixmMjgyMyxmMjgyNCxmMjgyNSxmMjgyNixmMjgyNyxmMjgyOCxmMjgyOSxmMjgzMCxmMjgzMSwKK2YyODMyLGYyODMzLGYyODM0LGYyODM1LGYyODM2LGYyODM3LGYyODM4LGYyODM5LGYyODQwLGYyODQxLGYyODQyLGYyODQzLGYyODQ0LGYyODQ1LGYyODQ2LGYyODQ3LAorZjI4NDgsZjI4NDksZjI4NTAsZjI4NTEsZjI4NTIsZjI4NTMsZjI4NTQsZjI4NTUsZjI4NTYsZjI4NTcsZjI4NTgsZjI4NTksZjI4NjAsZjI4NjEsZjI4NjIsZjI4NjMsCitmMjg2NCxmMjg2NSxmMjg2NixmMjg2NyxmMjg2OCxmMjg2OSxmMjg3MCxmMjg3MSxmMjg3MixmMjg3MyxmMjg3NCxmMjg3NSxmMjg3NixmMjg3NyxmMjg3OCxmMjg3OSwKK2YyODgwLGYyODgxLGYyODgyLGYyODgzLGYyODg0LGYyODg1LGYyODg2LGYyODg3LGYyODg4LGYyODg5LGYyODkwLGYyODkxLGYyODkyLGYyODkzLGYyODk0LGYyODk1LAorZjI4OTYsZjI4OTcsZjI4OTgsZjI4OTksZjI5MDAsZjI5MDEsZjI5MDIsZjI5MDMsZjI5MDQsZjI5MDUsZjI5MDYsZjI5MDcsZjI5MDgsZjI5MDksZjI5MTAsZjI5MTEsCitmMjkxMixmMjkxMyxmMjkxNCxmMjkxNSxmMjkxNixmMjkxNyxmMjkxOCxmMjkxOSxmMjkyMCxmMjkyMSxmMjkyMixmMjkyMyxmMjkyNCxmMjkyNSxmMjkyNixmMjkyNywKK2YyOTI4LGYyOTI5LGYyOTMwLGYyOTMxLGYyOTMyLGYyOTMzLGYyOTM0LGYyOTM1LGYyOTM2LGYyOTM3LGYyOTM4LGYyOTM5LGYyOTQwLGYyOTQxLGYyOTQyLGYyOTQzLAorZjI5NDQsZjI5NDUsZjI5NDYsZjI5NDcsZjI5NDgsZjI5NDksZjI5NTAsZjI5NTEsZjI5NTIsZjI5NTMsZjI5NTQsZjI5NTUsZjI5NTYsZjI5NTcsZjI5NTgsZjI5NTksCitmMjk2MCxmMjk2MSxmMjk2MixmMjk2MyxmMjk2NCxmMjk2NSxmMjk2NixmMjk2NyxmMjk2OCxmMjk2OSxmMjk3MCxmMjk3MSxmMjk3MixmMjk3MyxmMjk3NCxmMjk3NSwKK2YyOTc2LGYyOTc3LGYyOTc4LGYyOTc5LGYyOTgwLGYyOTgxLGYyOTgyLGYyOTgzLGYyOTg0LGYyOTg1LGYyOTg2LGYyOTg3LGYyOTg4LGYyOTg5LGYyOTkwLGYyOTkxLAorZjI5OTIsZjI5OTMsZjI5OTQsZjI5OTUsZjI5OTYsZjI5OTcsZjI5OTgsZjI5OTksZjMwMDAsZjMwMDEsZjMwMDIsZjMwMDMsZjMwMDQsZjMwMDUsZjMwMDYsZjMwMDcsCitmMzAwOCxmMzAwOSxmMzAxMCxmMzAxMSxmMzAxMixmMzAxMyxmMzAxNCxmMzAxNSxmMzAxNixmMzAxNyxmMzAxOCxmMzAxOSxmMzAyMCxmMzAyMSxmMzAyMixmMzAyMywKK2YzMDI0LGYzMDI1LGYzMDI2LGYzMDI3LGYzMDI4LGYzMDI5LGYzMDMwLGYzMDMxLGYzMDMyLGYzMDMzLGYzMDM0LGYzMDM1LGYzMDM2LGYzMDM3LGYzMDM4LGYzMDM5LAorZjMwNDAsZjMwNDEsZjMwNDIsZjMwNDMsZjMwNDQsZjMwNDUsZjMwNDYsZjMwNDcsZjMwNDgsZjMwNDksZjMwNTAsZjMwNTEsZjMwNTIsZjMwNTMsZjMwNTQsZjMwNTUsCitmMzA1NixmMzA1NyxmMzA1OCxmMzA1OSxmMzA2MCxmMzA2MSxmMzA2MixmMzA2MyxmMzA2NCxmMzA2NSxmMzA2NixmMzA2NyxmMzA2OCxmMzA2OSxmMzA3MCxmMzA3MSwKK2YzMDcyLGYzMDczLGYzMDc0LGYzMDc1LGYzMDc2LGYzMDc3LGYzMDc4LGYzMDc5LGYzMDgwLGYzMDgxLGYzMDgyLGYzMDgzLGYzMDg0LGYzMDg1LGYzMDg2LGYzMDg3LAorZjMwODgsZjMwODksZjMwOTAsZjMwOTEsZjMwOTIsZjMwOTMsZjMwOTQsZjMwOTUsZjMwOTYsZjMwOTcsZjMwOTgsZjMwOTksZjMxMDAsZjMxMDEsZjMxMDIsZjMxMDMsCitmMzEwNCxmMzEwNSxmMzEwNixmMzEwNyxmMzEwOCxmMzEwOSxmMzExMCxmMzExMSxmMzExMixmMzExMyxmMzExNCxmMzExNSxmMzExNixmMzExNyxmMzExOCxmMzExOSwKK2YzMTIwLGYzMTIxLGYzMTIyLGYzMTIzLGYzMTI0LGYzMTI1LGYzMTI2LGYzMTI3LGYzMTI4LGYzMTI5LGYzMTMwLGYzMTMxLGYzMTMyLGYzMTMzLGYzMTM0LGYzMTM1LAorZjMxMzYsZjMxMzcsZjMxMzgsZjMxMzksZjMxNDAsZjMxNDEsZjMxNDIsZjMxNDMsZjMxNDQsZjMxNDUsZjMxNDYsZjMxNDcsZjMxNDgsZjMxNDksZjMxNTAsZjMxNTEsCitmMzE1MixmMzE1MyxmMzE1NCxmMzE1NSxmMzE1NixmMzE1NyxmMzE1OCxmMzE1OSxmMzE2MCxmMzE2MSxmMzE2MixmMzE2MyxmMzE2NCxmMzE2NSxmMzE2NixmMzE2NywKK2YzMTY4LGYzMTY5LGYzMTcwLGYzMTcxLGYzMTcyLGYzMTczLGYzMTc0LGYzMTc1LGYzMTc2LGYzMTc3LGYzMTc4LGYzMTc5LGYzMTgwLGYzMTgxLGYzMTgyLGYzMTgzLAorZjMxODQsZjMxODUsZjMxODYsZjMxODcsZjMxODgsZjMxODksZjMxOTAsZjMxOTEsZjMxOTIsZjMxOTMsZjMxOTQsZjMxOTUsZjMxOTYsZjMxOTcsZjMxOTgsZjMxOTksCitmMzIwMCxmMzIwMSxmMzIwMixmMzIwMyxmMzIwNCxmMzIwNSxmMzIwNixmMzIwNyxmMzIwOCxmMzIwOSxmMzIxMCxmMzIxMSxmMzIxMixmMzIxMyxmMzIxNCxmMzIxNSwKK2YzMjE2LGYzMjE3LGYzMjE4LGYzMjE5LGYzMjIwLGYzMjIxLGYzMjIyLGYzMjIzLGYzMjI0LGYzMjI1LGYzMjI2LGYzMjI3LGYzMjI4LGYzMjI5LGYzMjMwLGYzMjMxLAorZjMyMzIsZjMyMzMsZjMyMzQsZjMyMzUsZjMyMzYsZjMyMzcsZjMyMzgsZjMyMzksZjMyNDAsZjMyNDEsZjMyNDIsZjMyNDMsZjMyNDQsZjMyNDUsZjMyNDYsZjMyNDcsCitmMzI0OCxmMzI0OSxmMzI1MCxmMzI1MSxmMzI1MixmMzI1MyxmMzI1NCxmMzI1NSxmMzI1NixmMzI1NyxmMzI1OCxmMzI1OSxmMzI2MCxmMzI2MSxmMzI2MixmMzI2MywKK2YzMjY0LGYzMjY1LGYzMjY2LGYzMjY3LGYzMjY4LGYzMjY5LGYzMjcwLGYzMjcxLGYzMjcyLGYzMjczLGYzMjc0LGYzMjc1LGYzMjc2LGYzMjc3LGYzMjc4LGYzMjc5LAorZjMyODAsZjMyODEsZjMyODIsZjMyODMsZjMyODQsZjMyODUsZjMyODYsZjMyODcsZjMyODgsZjMyODksZjMyOTAsZjMyOTEsZjMyOTIsZjMyOTMsZjMyOTQsZjMyOTUsCitmMzI5NixmMzI5NyxmMzI5OCxmMzI5OSxmMzMwMCxmMzMwMSxmMzMwMixmMzMwMyxmMzMwNCxmMzMwNSxmMzMwNixmMzMwNyxmMzMwOCxmMzMwOSxmMzMxMCxmMzMxMSwKK2YzMzEyLGYzMzEzLGYzMzE0LGYzMzE1LGYzMzE2LGYzMzE3LGYzMzE4LGYzMzE5LGYzMzIwLGYzMzIxLGYzMzIyLGYzMzIzLGYzMzI0LGYzMzI1LGYzMzI2LGYzMzI3LAorZjMzMjgsZjMzMjksZjMzMzAsZjMzMzEsZjMzMzIsZjMzMzMsZjMzMzQsZjMzMzUsZjMzMzYsZjMzMzcsZjMzMzgsZjMzMzksZjMzNDAsZjMzNDEsZjMzNDIsZjMzNDMsCitmMzM0NCxmMzM0NSxmMzM0NixmMzM0NyxmMzM0OCxmMzM0OSxmMzM1MCxmMzM1MSxmMzM1MixmMzM1MyxmMzM1NCxmMzM1NSxmMzM1NixmMzM1NyxmMzM1OCxmMzM1OSwKK2YzMzYwLGYzMzYxLGYzMzYyLGYzMzYzLGYzMzY0LGYzMzY1LGYzMzY2LGYzMzY3LGYzMzY4LGYzMzY5LGYzMzcwLGYzMzcxLGYzMzcyLGYzMzczLGYzMzc0LGYzMzc1LAorZjMzNzYsZjMzNzcsZjMzNzgsZjMzNzksZjMzODAsZjMzODEsZjMzODIsZjMzODMsZjMzODQsZjMzODUsZjMzODYsZjMzODcsZjMzODgsZjMzODksZjMzOTAsZjMzOTEsCitmMzM5MixmMzM5MyxmMzM5NCxmMzM5NSxmMzM5NixmMzM5NyxmMzM5OCxmMzM5OSxmMzQwMCxmMzQwMSxmMzQwMixmMzQwMyxmMzQwNCxmMzQwNSxmMzQwNixmMzQwNywKK2YzNDA4LGYzNDA5LGYzNDEwLGYzNDExLGYzNDEyLGYzNDEzLGYzNDE0LGYzNDE1LGYzNDE2LGYzNDE3LGYzNDE4LGYzNDE5LGYzNDIwLGYzNDIxLGYzNDIyLGYzNDIzLAorZjM0MjQsZjM0MjUsZjM0MjYsZjM0MjcsZjM0MjgsZjM0MjksZjM0MzAsZjM0MzEsZjM0MzIsZjM0MzMsZjM0MzQsZjM0MzUsZjM0MzYsZjM0MzcsZjM0MzgsZjM0MzksCitmMzQ0MCxmMzQ0MSxmMzQ0MixmMzQ0MyxmMzQ0NCxmMzQ0NSxmMzQ0NixmMzQ0NyxmMzQ0OCxmMzQ0OSxmMzQ1MCxmMzQ1MSxmMzQ1MixmMzQ1MyxmMzQ1NCxmMzQ1NSwKK2YzNDU2LGYzNDU3LGYzNDU4LGYzNDU5LGYzNDYwLGYzNDYxLGYzNDYyLGYzNDYzLGYzNDY0LGYzNDY1LGYzNDY2LGYzNDY3LGYzNDY4LGYzNDY5LGYzNDcwLGYzNDcxLAorZjM0NzIsZjM0NzMsZjM0NzQsZjM0NzUsZjM0NzYsZjM0NzcsZjM0NzgsZjM0NzksZjM0ODAsZjM0ODEsZjM0ODIsZjM0ODMsZjM0ODQsZjM0ODUsZjM0ODYsZjM0ODcsCitmMzQ4OCxmMzQ4OSxmMzQ5MCxmMzQ5MSxmMzQ5MixmMzQ5MyxmMzQ5NCxmMzQ5NSxmMzQ5NixmMzQ5NyxmMzQ5OCxmMzQ5OSxmMzUwMCxmMzUwMSxmMzUwMixmMzUwMywKK2YzNTA0LGYzNTA1LGYzNTA2LGYzNTA3LGYzNTA4LGYzNTA5LGYzNTEwLGYzNTExLGYzNTEyLGYzNTEzLGYzNTE0LGYzNTE1LGYzNTE2LGYzNTE3LGYzNTE4LGYzNTE5LAorZjM1MjAsZjM1MjEsZjM1MjIsZjM1MjMsZjM1MjQsZjM1MjUsZjM1MjYsZjM1MjcsZjM1MjgsZjM1MjksZjM1MzAsZjM1MzEsZjM1MzIsZjM1MzMsZjM1MzQsZjM1MzUsCitmMzUzNixmMzUzNyxmMzUzOCxmMzUzOSxmMzU0MCxmMzU0MSxmMzU0MixmMzU0MyxmMzU0NCxmMzU0NSxmMzU0NixmMzU0NyxmMzU0OCxmMzU0OSxmMzU1MCxmMzU1MSwKK2YzNTUyLGYzNTUzLGYzNTU0LGYzNTU1LGYzNTU2LGYzNTU3LGYzNTU4LGYzNTU5LGYzNTYwLGYzNTYxLGYzNTYyLGYzNTYzLGYzNTY0LGYzNTY1LGYzNTY2LGYzNTY3LAorZjM1NjgsZjM1NjksZjM1NzAsZjM1NzEsZjM1NzIsZjM1NzMsZjM1NzQsZjM1NzUsZjM1NzYsZjM1NzcsZjM1NzgsZjM1NzksZjM1ODAsZjM1ODEsZjM1ODIsZjM1ODMsCitmMzU4NCxmMzU4NSxmMzU4NixmMzU4NyxmMzU4OCxmMzU4OSxmMzU5MCxmMzU5MSxmMzU5MixmMzU5MyxmMzU5NCxmMzU5NSxmMzU5NixmMzU5NyxmMzU5OCxmMzU5OSwKK2YzNjAwLGYzNjAxLGYzNjAyLGYzNjAzLGYzNjA0LGYzNjA1LGYzNjA2LGYzNjA3LGYzNjA4LGYzNjA5LGYzNjEwLGYzNjExLGYzNjEyLGYzNjEzLGYzNjE0LGYzNjE1LAorZjM2MTYsZjM2MTcsZjM2MTgsZjM2MTksZjM2MjAsZjM2MjEsZjM2MjIsZjM2MjMsZjM2MjQsZjM2MjUsZjM2MjYsZjM2MjcsZjM2MjgsZjM2MjksZjM2MzAsZjM2MzEsCitmMzYzMixmMzYzMyxmMzYzNCxmMzYzNSxmMzYzNixmMzYzNyxmMzYzOCxmMzYzOSxmMzY0MCxmMzY0MSxmMzY0MixmMzY0MyxmMzY0NCxmMzY0NSxmMzY0NixmMzY0NywKK2YzNjQ4LGYzNjQ5LGYzNjUwLGYzNjUxLGYzNjUyLGYzNjUzLGYzNjU0LGYzNjU1LGYzNjU2LGYzNjU3LGYzNjU4LGYzNjU5LGYzNjYwLGYzNjYxLGYzNjYyLGYzNjYzLAorZjM2NjQsZjM2NjUsZjM2NjYsZjM2NjcsZjM2NjgsZjM2NjksZjM2NzAsZjM2NzEsZjM2NzIsZjM2NzMsZjM2NzQsZjM2NzUsZjM2NzYsZjM2NzcsZjM2NzgsZjM2NzksCitmMzY4MCxmMzY4MSxmMzY4MixmMzY4MyxmMzY4NCxmMzY4NSxmMzY4NixmMzY4NyxmMzY4OCxmMzY4OSxmMzY5MCxmMzY5MSxmMzY5MixmMzY5MyxmMzY5NCxmMzY5NSwKK2YzNjk2LGYzNjk3LGYzNjk4LGYzNjk5LGYzNzAwLGYzNzAxLGYzNzAyLGYzNzAzLGYzNzA0LGYzNzA1LGYzNzA2LGYzNzA3LGYzNzA4LGYzNzA5LGYzNzEwLGYzNzExLAorZjM3MTIsZjM3MTMsZjM3MTQsZjM3MTUsZjM3MTYsZjM3MTcsZjM3MTgsZjM3MTksZjM3MjAsZjM3MjEsZjM3MjIsZjM3MjMsZjM3MjQsZjM3MjUsZjM3MjYsZjM3MjcsCitmMzcyOCxmMzcyOSxmMzczMCxmMzczMSxmMzczMixmMzczMyxmMzczNCxmMzczNSxmMzczNixmMzczNyxmMzczOCxmMzczOSxmMzc0MCxmMzc0MSxmMzc0MixmMzc0MywKK2YzNzQ0LGYzNzQ1LGYzNzQ2LGYzNzQ3LGYzNzQ4LGYzNzQ5LGYzNzUwLGYzNzUxLGYzNzUyLGYzNzUzLGYzNzU0LGYzNzU1LGYzNzU2LGYzNzU3LGYzNzU4LGYzNzU5LAorZjM3NjAsZjM3NjEsZjM3NjIsZjM3NjMsZjM3NjQsZjM3NjUsZjM3NjYsZjM3NjcsZjM3NjgsZjM3NjksZjM3NzAsZjM3NzEsZjM3NzIsZjM3NzMsZjM3NzQsZjM3NzUsCitmMzc3NixmMzc3NyxmMzc3OCxmMzc3OSxmMzc4MCxmMzc4MSxmMzc4MixmMzc4MyxmMzc4NCxmMzc4NSxmMzc4NixmMzc4NyxmMzc4OCxmMzc4OSxmMzc5MCxmMzc5MSwKK2YzNzkyLGYzNzkzLGYzNzk0LGYzNzk1LGYzNzk2LGYzNzk3LGYzNzk4LGYzNzk5LGYzODAwLGYzODAxLGYzODAyLGYzODAzLGYzODA0LGYzODA1LGYzODA2LGYzODA3LAorZjM4MDgsZjM4MDksZjM4MTAsZjM4MTEsZjM4MTIsZjM4MTMsZjM4MTQsZjM4MTUsZjM4MTYsZjM4MTcsZjM4MTgsZjM4MTksZjM4MjAsZjM4MjEsZjM4MjIsZjM4MjMsCitmMzgyNCxmMzgyNSxmMzgyNixmMzgyNyxmMzgyOCxmMzgyOSxmMzgzMCxmMzgzMSxmMzgzMixmMzgzMyxmMzgzNCxmMzgzNSxmMzgzNixmMzgzNyxmMzgzOCxmMzgzOSwKK2YzODQwLGYzODQxLGYzODQyLGYzODQzLGYzODQ0LGYzODQ1LGYzODQ2LGYzODQ3LGYzODQ4LGYzODQ5LGYzODUwLGYzODUxLGYzODUyLGYzODUzLGYzODU0LGYzODU1LAorZjM4NTYsZjM4NTcsZjM4NTgsZjM4NTksZjM4NjAsZjM4NjEsZjM4NjIsZjM4NjMsZjM4NjQsZjM4NjUsZjM4NjYsZjM4NjcsZjM4NjgsZjM4NjksZjM4NzAsZjM4NzEsCitmMzg3MixmMzg3MyxmMzg3NCxmMzg3NSxmMzg3NixmMzg3NyxmMzg3OCxmMzg3OSxmMzg4MCxmMzg4MSxmMzg4MixmMzg4MyxmMzg4NCxmMzg4NSxmMzg4NixmMzg4NywKK2YzODg4LGYzODg5LGYzODkwLGYzODkxLGYzODkyLGYzODkzLGYzODk0LGYzODk1LGYzODk2LGYzODk3LGYzODk4LGYzODk5LGYzOTAwLGYzOTAxLGYzOTAyLGYzOTAzLAorZjM5MDQsZjM5MDUsZjM5MDYsZjM5MDcsZjM5MDgsZjM5MDksZjM5MTAsZjM5MTEsZjM5MTIsZjM5MTMsZjM5MTQsZjM5MTUsZjM5MTYsZjM5MTcsZjM5MTgsZjM5MTksCitmMzkyMCxmMzkyMSxmMzkyMixmMzkyMyxmMzkyNCxmMzkyNSxmMzkyNixmMzkyNyxmMzkyOCxmMzkyOSxmMzkzMCxmMzkzMSxmMzkzMixmMzkzMyxmMzkzNCxmMzkzNSwKK2YzOTM2LGYzOTM3LGYzOTM4LGYzOTM5LGYzOTQwLGYzOTQxLGYzOTQyLGYzOTQzLGYzOTQ0LGYzOTQ1LGYzOTQ2LGYzOTQ3LGYzOTQ4LGYzOTQ5LGYzOTUwLGYzOTUxLAorZjM5NTIsZjM5NTMsZjM5NTQsZjM5NTUsZjM5NTYsZjM5NTcsZjM5NTgsZjM5NTksZjM5NjAsZjM5NjEsZjM5NjIsZjM5NjMsZjM5NjQsZjM5NjUsZjM5NjYsZjM5NjcsCitmMzk2OCxmMzk2OSxmMzk3MCxmMzk3MSxmMzk3MixmMzk3MyxmMzk3NCxmMzk3NSxmMzk3NixmMzk3NyxmMzk3OCxmMzk3OSxmMzk4MCxmMzk4MSxmMzk4MixmMzk4MywKK2YzOTg0LGYzOTg1LGYzOTg2LGYzOTg3LGYzOTg4LGYzOTg5LGYzOTkwLGYzOTkxLGYzOTkyLGYzOTkzLGYzOTk0LGYzOTk1LGYzOTk2LGYzOTk3LGYzOTk4LGYzOTk5LAorZjQwMDAsZjQwMDEsZjQwMDIsZjQwMDMsZjQwMDQsZjQwMDUsZjQwMDYsZjQwMDcsZjQwMDgsZjQwMDksZjQwMTAsZjQwMTEsZjQwMTIsZjQwMTMsZjQwMTQsZjQwMTUsCitmNDAxNixmNDAxNyxmNDAxOCxmNDAxOSxmNDAyMCxmNDAyMSxmNDAyMixmNDAyMyxmNDAyNCxmNDAyNSxmNDAyNixmNDAyNyxmNDAyOCxmNDAyOSxmNDAzMCxmNDAzMSwKK2Y0MDMyLGY0MDMzLGY0MDM0LGY0MDM1LGY0MDM2LGY0MDM3LGY0MDM4LGY0MDM5LGY0MDQwLGY0MDQxLGY0MDQyLGY0MDQzLGY0MDQ0LGY0MDQ1LGY0MDQ2LGY0MDQ3LAorZjQwNDgsZjQwNDksZjQwNTAsZjQwNTEsZjQwNTIsZjQwNTMsZjQwNTQsZjQwNTUsZjQwNTYsZjQwNTcsZjQwNTgsZjQwNTksZjQwNjAsZjQwNjEsZjQwNjIsZjQwNjMsCitmNDA2NCxmNDA2NSxmNDA2NixmNDA2NyxmNDA2OCxmNDA2OSxmNDA3MCxmNDA3MSxmNDA3MixmNDA3MyxmNDA3NCxmNDA3NSxmNDA3NixmNDA3NyxmNDA3OCxmNDA3OSwKK2Y0MDgwLGY0MDgxLGY0MDgyLGY0MDgzLGY0MDg0LGY0MDg1LGY0MDg2LGY0MDg3LGY0MDg4LGY0MDg5LGY0MDkwLGY0MDkxLGY0MDkyLGY0MDkzLGY0MDk0LGY0MDk1LAorfTsKK3N0YXRpYyBjb25zdCBpbnQgcmVmWzQwOTZdWzJdID0geworeyAgICAgMiwgMH0sCit7ICAgICAwLCAxfSx7ICAgICAxLCAwfSx7ICAgIC0xLCAwfSx7ICAgICAzLCAwfSx7ICAgIC0xLCAwfSx7ICAgICAyLCAwfSx7ICAgIC0yLCAwfSx7ICAgICA1LCAwfSwKK3sgICAgLTMsIDB9LHsgICAgIDQsIDB9LHsgICAgLTQsIDB9LHsgICAgIDksIDB9LHsgICAgLTcsIDB9LHsgICAgIDgsIDB9LHsgICAgLTgsIDB9LHsgICAgMTcsIDB9LAoreyAgIC0xNSwgMH0seyAgICAxNiwgMH0seyAgIC0xNiwgMH0seyAgICAzMywgMH0seyAgIC0zMSwgMH0seyAgICAzMiwgMH0seyAgIC0zMiwgMH0seyAgICA2NSwgMH0sCit7ICAgLTYzLCAwfSx7ICAgIDY0LCAwfSx7ICAgLTY0LCAwfSx7ICAgMTI5LCAwfSx7ICAtMTI3LCAwfSx7ICAgMTI4LCAwfSx7ICAtMTI4LCAwfSx7ICAgMjU3LCAwfSwKK3sgIC0yNTUsIDB9LHsgICAyNTYsIDB9LHsgIC0yNTYsIDB9LHsgICA1MTMsIDB9LHsgIC01MTEsIDB9LHsgICA1MTIsIDB9LHsgIC01MTIsIDB9LHsgIDEwMjUsIDB9LAoreyAtMTAyMywgMH0seyAgMTAyNCwgMH0seyAtMTAyNCwgMH0seyAgMjA0OSwgMH0seyAtMjA0NywgMH0seyAgMjA0OCwgMH0seyAtMjA0OCwgMH0seyAgNDA5NywgMH0sCit7IC00MDk1LCAwfSx7ICA0MDk2LCAwfSx7IC00MDk2LCAwfSx7ICA4MTkzLCAwfSx7IC04MTkxLCAwfSx7ICA4MTkyLCAwfSx7IC04MTkyLCAwfSx7IDE2Mzg1LCAwfSwKK3stMTYzODMsIDB9LHsgMTYzODQsIDB9LHstMTYzODQsIDB9LHsgMzI3NjksIDB9LHstMzI3NjcsIDB9LHsgMzI3NjgsIDB9LHstMzI3NjgsIDB9LHsgICAgIDAsIDF9LAoreyAgICAtMiwgMX0seyAgICAtMSwgMH0seyAgICAtMywgMX0seyAgICAgMSwgMX0seyAgICAtMywgMX0seyAgICAgMCwgMX0seyAgICAtNCwgMX0seyAgICAgMywgMX0sCit7ICAgIC01LCAxfSx7ICAgICAyLCAxfSx7ICAgIC02LCAxfSx7ICAgICA3LCAxfSx7ICAgIC05LCAxfSx7ICAgICA2LCAxfSx7ICAgLTEwLCAxfSx7ICAgIDE1LCAxfSwKK3sgICAtMTcsIDF9LHsgICAgMTQsIDF9LHsgICAtMTgsIDF9LHsgICAgMzEsIDF9LHsgICAtMzMsIDF9LHsgICAgMzAsIDF9LHsgICAtMzQsIDF9LHsgICAgNjMsIDF9LAoreyAgIC02NSwgMX0seyAgICA2MiwgMX0seyAgIC02NiwgMX0seyAgIDEyNywgMX0seyAgLTEyOSwgMX0seyAgIDEyNiwgMX0seyAgLTEzMCwgMX0seyAgIDI1NSwgMX0sCit7ICAtMjU3LCAxfSx7ICAgMjU0LCAxfSx7ICAtMjU4LCAxfSx7ICAgNTExLCAxfSx7ICAtNTEzLCAxfSx7ICAgNTEwLCAxfSx7ICAtNTE0LCAxfSx7ICAxMDIzLCAxfSwKK3sgLTEwMjUsIDF9LHsgIDEwMjIsIDF9LHsgLTEwMjYsIDF9LHsgIDIwNDcsIDF9LHsgLTIwNDksIDF9LHsgIDIwNDYsIDF9LHsgLTIwNTAsIDF9LHsgIDQwOTUsIDF9LAoreyAtNDA5NywgMX0seyAgNDA5NCwgMX0seyAtNDA5OCwgMX0seyAgODE5MSwgMX0seyAtODE5MywgMX0seyAgODE5MCwgMX0seyAtODE5NCwgMX0seyAxNjM4MywgMX0sCit7LTE2Mzg1LCAxfSx7IDE2MzgyLCAxfSx7LTE2Mzg2LCAxfSx7IDMyNzY3LCAxfSx7LTMyNzY5LCAxfSx7IDMyNzY2LCAxfSx7LTMyNzcwLCAxfSx7ICAgICAxLCAwfSwKK3sgICAgLTEsIDB9LHsgICAgIDAsIDB9LHsgICAgLTIsIDB9LHsgICAgIDIsIDB9LHsgICAgLTIsIDB9LHsgICAgIDEsIDB9LHsgICAgLTMsIDB9LHsgICAgIDQsIDB9LAoreyAgICAtNCwgMH0seyAgICAgMywgMH0seyAgICAtNSwgMH0seyAgICAgOCwgMH0seyAgICAtOCwgMH0seyAgICAgNywgMH0seyAgICAtOSwgMH0seyAgICAxNiwgMH0sCit7ICAgLTE2LCAwfSx7ICAgIDE1LCAwfSx7ICAgLTE3LCAwfSx7ICAgIDMyLCAwfSx7ICAgLTMyLCAwfSx7ICAgIDMxLCAwfSx7ICAgLTMzLCAwfSx7ICAgIDY0LCAwfSwKK3sgICAtNjQsIDB9LHsgICAgNjMsIDB9LHsgICAtNjUsIDB9LHsgICAxMjgsIDB9LHsgIC0xMjgsIDB9LHsgICAxMjcsIDB9LHsgIC0xMjksIDB9LHsgICAyNTYsIDB9LAoreyAgLTI1NiwgMH0seyAgIDI1NSwgMH0seyAgLTI1NywgMH0seyAgIDUxMiwgMH0seyAgLTUxMiwgMH0seyAgIDUxMSwgMH0seyAgLTUxMywgMH0seyAgMTAyNCwgMH0sCit7IC0xMDI0LCAwfSx7ICAxMDIzLCAwfSx7IC0xMDI1LCAwfSx7ICAyMDQ4LCAwfSx7IC0yMDQ4LCAwfSx7ICAyMDQ3LCAwfSx7IC0yMDQ5LCAwfSx7ICA0MDk2LCAwfSwKK3sgLTQwOTYsIDB9LHsgIDQwOTUsIDB9LHsgLTQwOTcsIDB9LHsgIDgxOTIsIDB9LHsgLTgxOTIsIDB9LHsgIDgxOTEsIDB9LHsgLTgxOTMsIDB9LHsgMTYzODQsIDB9LAorey0xNjM4NCwgMH0seyAxNjM4MywgMH0sey0xNjM4NSwgMH0seyAzMjc2OCwgMH0sey0zMjc2OCwgMH0seyAzMjc2NywgMH0sey0zMjc2OSwgMH0seyAgICAtMSwgMH0sCit7ICAgIC0zLCAxfSx7ICAgIC0yLCAwfSx7ICAgIC00LCAxfSx7ICAgICAwLCAxfSx7ICAgIC00LCAxfSx7ICAgIC0xLCAwfSx7ICAgIC01LCAxfSx7ICAgICAyLCAxfSwKK3sgICAgLTYsIDF9LHsgICAgIDEsIDF9LHsgICAgLTcsIDF9LHsgICAgIDYsIDF9LHsgICAtMTAsIDF9LHsgICAgIDUsIDF9LHsgICAtMTEsIDF9LHsgICAgMTQsIDF9LAoreyAgIC0xOCwgMX0seyAgICAxMywgMX0seyAgIC0xOSwgMX0seyAgICAzMCwgMX0seyAgIC0zNCwgMX0seyAgICAyOSwgMX0seyAgIC0zNSwgMX0seyAgICA2MiwgMX0sCit7ICAgLTY2LCAxfSx7ICAgIDYxLCAxfSx7ICAgLTY3LCAxfSx7ICAgMTI2LCAxfSx7ICAtMTMwLCAxfSx7ICAgMTI1LCAxfSx7ICAtMTMxLCAxfSx7ICAgMjU0LCAxfSwKK3sgIC0yNTgsIDF9LHsgICAyNTMsIDF9LHsgIC0yNTksIDF9LHsgICA1MTAsIDF9LHsgIC01MTQsIDF9LHsgICA1MDksIDF9LHsgIC01MTUsIDF9LHsgIDEwMjIsIDF9LAoreyAtMTAyNiwgMX0seyAgMTAyMSwgMX0seyAtMTAyNywgMX0seyAgMjA0NiwgMX0seyAtMjA1MCwgMX0seyAgMjA0NSwgMX0seyAtMjA1MSwgMX0seyAgNDA5NCwgMX0sCit7IC00MDk4LCAxfSx7ICA0MDkzLCAxfSx7IC00MDk5LCAxfSx7ICA4MTkwLCAxfSx7IC04MTk0LCAxfSx7ICA4MTg5LCAxfSx7IC04MTk1LCAxfSx7IDE2MzgyLCAxfSwKK3stMTYzODYsIDF9LHsgMTYzODEsIDF9LHstMTYzODcsIDF9LHsgMzI3NjYsIDF9LHstMzI3NzAsIDF9LHsgMzI3NjUsIDF9LHstMzI3NzEsIDF9LHsgICAgIDMsIDB9LAoreyAgICAgMSwgMX0seyAgICAgMiwgMH0seyAgICAgMCwgMX0seyAgICAgNCwgMH0seyAgICAgMCwgMX0seyAgICAgMywgMH0seyAgICAtMSwgMH0seyAgICAgNiwgMH0sCit7ICAgIC0yLCAwfSx7ICAgICA1LCAwfSx7ICAgIC0zLCAwfSx7ICAgIDEwLCAwfSx7ICAgIC02LCAwfSx7ICAgICA5LCAwfSx7ICAgIC03LCAwfSx7ICAgIDE4LCAwfSwKK3sgICAtMTQsIDB9LHsgICAgMTcsIDB9LHsgICAtMTUsIDB9LHsgICAgMzQsIDB9LHsgICAtMzAsIDB9LHsgICAgMzMsIDB9LHsgICAtMzEsIDB9LHsgICAgNjYsIDB9LAoreyAgIC02MiwgMH0seyAgICA2NSwgMH0seyAgIC02MywgMH0seyAgIDEzMCwgMH0seyAgLTEyNiwgMH0seyAgIDEyOSwgMH0seyAgLTEyNywgMH0seyAgIDI1OCwgMH0sCit7ICAtMjU0LCAwfSx7ICAgMjU3LCAwfSx7ICAtMjU1LCAwfSx7ICAgNTE0LCAwfSx7ICAtNTEwLCAwfSx7ICAgNTEzLCAwfSx7ICAtNTExLCAwfSx7ICAxMDI2LCAwfSwKK3sgLTEwMjIsIDB9LHsgIDEwMjUsIDB9LHsgLTEwMjMsIDB9LHsgIDIwNTAsIDB9LHsgLTIwNDYsIDB9LHsgIDIwNDksIDB9LHsgLTIwNDcsIDB9LHsgIDQwOTgsIDB9LAoreyAtNDA5NCwgMH0seyAgNDA5NywgMH0seyAtNDA5NSwgMH0seyAgODE5NCwgMH0seyAtODE5MCwgMH0seyAgODE5MywgMH0seyAtODE5MSwgMH0seyAxNjM4NiwgMH0sCit7LTE2MzgyLCAwfSx7IDE2Mzg1LCAwfSx7LTE2MzgzLCAwfSx7IDMyNzcwLCAwfSx7LTMyNzY2LCAwfSx7IDMyNzY5LCAwfSx7LTMyNzY3LCAwfSx7ICAgIC0xLCAwfSwKK3sgICAgLTMsIDF9LHsgICAgLTIsIDB9LHsgICAgLTQsIDF9LHsgICAgIDAsIDF9LHsgICAgLTQsIDF9LHsgICAgLTEsIDB9LHsgICAgLTUsIDF9LHsgICAgIDIsIDF9LAoreyAgICAtNiwgMX0seyAgICAgMSwgMX0seyAgICAtNywgMX0seyAgICAgNiwgMX0seyAgIC0xMCwgMX0seyAgICAgNSwgMX0seyAgIC0xMSwgMX0seyAgICAxNCwgMX0sCit7ICAgLTE4LCAxfSx7ICAgIDEzLCAxfSx7ICAgLTE5LCAxfSx7ICAgIDMwLCAxfSx7ICAgLTM0LCAxfSx7ICAgIDI5LCAxfSx7ICAgLTM1LCAxfSx7ICAgIDYyLCAxfSwKK3sgICAtNjYsIDF9LHsgICAgNjEsIDF9LHsgICAtNjcsIDF9LHsgICAxMjYsIDF9LHsgIC0xMzAsIDF9LHsgICAxMjUsIDF9LHsgIC0xMzEsIDF9LHsgICAyNTQsIDF9LAoreyAgLTI1OCwgMX0seyAgIDI1MywgMX0seyAgLTI1OSwgMX0seyAgIDUxMCwgMX0seyAgLTUxNCwgMX0seyAgIDUwOSwgMX0seyAgLTUxNSwgMX0seyAgMTAyMiwgMX0sCit7IC0xMDI2LCAxfSx7ICAxMDIxLCAxfSx7IC0xMDI3LCAxfSx7ICAyMDQ2LCAxfSx7IC0yMDUwLCAxfSx7ICAyMDQ1LCAxfSx7IC0yMDUxLCAxfSx7ICA0MDk0LCAxfSwKK3sgLTQwOTgsIDF9LHsgIDQwOTMsIDF9LHsgLTQwOTksIDF9LHsgIDgxOTAsIDF9LHsgLTgxOTQsIDF9LHsgIDgxODksIDF9LHsgLTgxOTUsIDF9LHsgMTYzODIsIDF9LAorey0xNjM4NiwgMX0seyAxNjM4MSwgMX0sey0xNjM4NywgMX0seyAzMjc2NiwgMX0sey0zMjc3MCwgMX0seyAzMjc2NSwgMX0sey0zMjc3MSwgMX0seyAgICAgMiwgMH0sCit7ICAgICAwLCAxfSx7ICAgICAxLCAwfSx7ICAgIC0xLCAwfSx7ICAgICAzLCAwfSx7ICAgIC0xLCAwfSx7ICAgICAyLCAwfSx7ICAgIC0yLCAwfSx7ICAgICA1LCAwfSwKK3sgICAgLTMsIDB9LHsgICAgIDQsIDB9LHsgICAgLTQsIDB9LHsgICAgIDksIDB9LHsgICAgLTcsIDB9LHsgICAgIDgsIDB9LHsgICAgLTgsIDB9LHsgICAgMTcsIDB9LAoreyAgIC0xNSwgMH0seyAgICAxNiwgMH0seyAgIC0xNiwgMH0seyAgICAzMywgMH0seyAgIC0zMSwgMH0seyAgICAzMiwgMH0seyAgIC0zMiwgMH0seyAgICA2NSwgMH0sCit7ICAgLTYzLCAwfSx7ICAgIDY0LCAwfSx7ICAgLTY0LCAwfSx7ICAgMTI5LCAwfSx7ICAtMTI3LCAwfSx7ICAgMTI4LCAwfSx7ICAtMTI4LCAwfSx7ICAgMjU3LCAwfSwKK3sgIC0yNTUsIDB9LHsgICAyNTYsIDB9LHsgIC0yNTYsIDB9LHsgICA1MTMsIDB9LHsgIC01MTEsIDB9LHsgICA1MTIsIDB9LHsgIC01MTIsIDB9LHsgIDEwMjUsIDB9LAoreyAtMTAyMywgMH0seyAgMTAyNCwgMH0seyAtMTAyNCwgMH0seyAgMjA0OSwgMH0seyAtMjA0NywgMH0seyAgMjA0OCwgMH0seyAtMjA0OCwgMH0seyAgNDA5NywgMH0sCit7IC00MDk1LCAwfSx7ICA0MDk2LCAwfSx7IC00MDk2LCAwfSx7ICA4MTkzLCAwfSx7IC04MTkxLCAwfSx7ICA4MTkyLCAwfSx7IC04MTkyLCAwfSx7IDE2Mzg1LCAwfSwKK3stMTYzODMsIDB9LHsgMTYzODQsIDB9LHstMTYzODQsIDB9LHsgMzI3NjksIDB9LHstMzI3NjcsIDB9LHsgMzI3NjgsIDB9LHstMzI3NjgsIDB9LHsgICAgLTIsIDB9LAoreyAgICAtNCwgMX0seyAgICAtMywgMH0seyAgICAtNSwgMX0seyAgICAtMSwgMH0seyAgICAtNSwgMX0seyAgICAtMiwgMH0seyAgICAtNiwgMX0seyAgICAgMSwgMX0sCit7ICAgIC03LCAxfSx7ICAgICAwLCAxfSx7ICAgIC04LCAxfSx7ICAgICA1LCAxfSx7ICAgLTExLCAxfSx7ICAgICA0LCAxfSx7ICAgLTEyLCAxfSx7ICAgIDEzLCAxfSwKK3sgICAtMTksIDF9LHsgICAgMTIsIDF9LHsgICAtMjAsIDF9LHsgICAgMjksIDF9LHsgICAtMzUsIDF9LHsgICAgMjgsIDF9LHsgICAtMzYsIDF9LHsgICAgNjEsIDF9LAoreyAgIC02NywgMX0seyAgICA2MCwgMX0seyAgIC02OCwgMX0seyAgIDEyNSwgMX0seyAgLTEzMSwgMX0seyAgIDEyNCwgMX0seyAgLTEzMiwgMX0seyAgIDI1MywgMX0sCit7ICAtMjU5LCAxfSx7ICAgMjUyLCAxfSx7ICAtMjYwLCAxfSx7ICAgNTA5LCAxfSx7ICAtNTE1LCAxfSx7ICAgNTA4LCAxfSx7ICAtNTE2LCAxfSx7ICAxMDIxLCAxfSwKK3sgLTEwMjcsIDF9LHsgIDEwMjAsIDF9LHsgLTEwMjgsIDF9LHsgIDIwNDUsIDF9LHsgLTIwNTEsIDF9LHsgIDIwNDQsIDF9LHsgLTIwNTIsIDF9LHsgIDQwOTMsIDF9LAoreyAtNDA5OSwgMX0seyAgNDA5MiwgMX0seyAtNDEwMCwgMX0seyAgODE4OSwgMX0seyAtODE5NSwgMX0seyAgODE4OCwgMX0seyAtODE5NiwgMX0seyAxNjM4MSwgMX0sCit7LTE2Mzg3LCAxfSx7IDE2MzgwLCAxfSx7LTE2Mzg4LCAxfSx7IDMyNzY1LCAxfSx7LTMyNzcxLCAxfSx7IDMyNzY0LCAxfSx7LTMyNzcyLCAxfSx7ICAgICA1LCAwfSwKK3sgICAgIDMsIDF9LHsgICAgIDQsIDB9LHsgICAgIDIsIDF9LHsgICAgIDYsIDB9LHsgICAgIDIsIDF9LHsgICAgIDUsIDB9LHsgICAgIDEsIDF9LHsgICAgIDgsIDB9LAoreyAgICAgMCwgMX0seyAgICAgNywgMH0seyAgICAtMSwgMH0seyAgICAxMiwgMH0seyAgICAtNCwgMH0seyAgICAxMSwgMH0seyAgICAtNSwgMH0seyAgICAyMCwgMH0sCit7ICAgLTEyLCAwfSx7ICAgIDE5LCAwfSx7ICAgLTEzLCAwfSx7ICAgIDM2LCAwfSx7ICAgLTI4LCAwfSx7ICAgIDM1LCAwfSx7ICAgLTI5LCAwfSx7ICAgIDY4LCAwfSwKK3sgICAtNjAsIDB9LHsgICAgNjcsIDB9LHsgICAtNjEsIDB9LHsgICAxMzIsIDB9LHsgIC0xMjQsIDB9LHsgICAxMzEsIDB9LHsgIC0xMjUsIDB9LHsgICAyNjAsIDB9LAoreyAgLTI1MiwgMH0seyAgIDI1OSwgMH0seyAgLTI1MywgMH0seyAgIDUxNiwgMH0seyAgLTUwOCwgMH0seyAgIDUxNSwgMH0seyAgLTUwOSwgMH0seyAgMTAyOCwgMH0sCit7IC0xMDIwLCAwfSx7ICAxMDI3LCAwfSx7IC0xMDIxLCAwfSx7ICAyMDUyLCAwfSx7IC0yMDQ0LCAwfSx7ICAyMDUxLCAwfSx7IC0yMDQ1LCAwfSx7ICA0MTAwLCAwfSwKK3sgLTQwOTIsIDB9LHsgIDQwOTksIDB9LHsgLTQwOTMsIDB9LHsgIDgxOTYsIDB9LHsgLTgxODgsIDB9LHsgIDgxOTUsIDB9LHsgLTgxODksIDB9LHsgMTYzODgsIDB9LAorey0xNjM4MCwgMH0seyAxNjM4NywgMH0sey0xNjM4MSwgMH0seyAzMjc3MiwgMH0sey0zMjc2NCwgMH0seyAzMjc3MSwgMH0sey0zMjc2NSwgMH0seyAgICAtMywgMH0sCit7ICAgIC01LCAxfSx7ICAgIC00LCAwfSx7ICAgIC02LCAxfSx7ICAgIC0yLCAwfSx7ICAgIC02LCAxfSx7ICAgIC0zLCAwfSx7ICAgIC03LCAxfSx7ICAgICAwLCAxfSwKK3sgICAgLTgsIDF9LHsgICAgLTEsIDB9LHsgICAgLTksIDF9LHsgICAgIDQsIDF9LHsgICAtMTIsIDF9LHsgICAgIDMsIDF9LHsgICAtMTMsIDF9LHsgICAgMTIsIDF9LAoreyAgIC0yMCwgMX0seyAgICAxMSwgMX0seyAgIC0yMSwgMX0seyAgICAyOCwgMX0seyAgIC0zNiwgMX0seyAgICAyNywgMX0seyAgIC0zNywgMX0seyAgICA2MCwgMX0sCit7ICAgLTY4LCAxfSx7ICAgIDU5LCAxfSx7ICAgLTY5LCAxfSx7ICAgMTI0LCAxfSx7ICAtMTMyLCAxfSx7ICAgMTIzLCAxfSx7ICAtMTMzLCAxfSx7ICAgMjUyLCAxfSwKK3sgIC0yNjAsIDF9LHsgICAyNTEsIDF9LHsgIC0yNjEsIDF9LHsgICA1MDgsIDF9LHsgIC01MTYsIDF9LHsgICA1MDcsIDF9LHsgIC01MTcsIDF9LHsgIDEwMjAsIDF9LAoreyAtMTAyOCwgMX0seyAgMTAxOSwgMX0seyAtMTAyOSwgMX0seyAgMjA0NCwgMX0seyAtMjA1MiwgMX0seyAgMjA0MywgMX0seyAtMjA1MywgMX0seyAgNDA5MiwgMX0sCit7IC00MTAwLCAxfSx7ICA0MDkxLCAxfSx7IC00MTAxLCAxfSx7ICA4MTg4LCAxfSx7IC04MTk2LCAxfSx7ICA4MTg3LCAxfSx7IC04MTk3LCAxfSx7IDE2MzgwLCAxfSwKK3stMTYzODgsIDF9LHsgMTYzNzksIDF9LHstMTYzODksIDF9LHsgMzI3NjQsIDF9LHstMzI3NzIsIDF9LHsgMzI3NjMsIDF9LHstMzI3NzMsIDF9LHsgICAgIDQsIDB9LAoreyAgICAgMiwgMX0seyAgICAgMywgMH0seyAgICAgMSwgMX0seyAgICAgNSwgMH0seyAgICAgMSwgMX0seyAgICAgNCwgMH0seyAgICAgMCwgMX0seyAgICAgNywgMH0sCit7ICAgIC0xLCAwfSx7ICAgICA2LCAwfSx7ICAgIC0yLCAwfSx7ICAgIDExLCAwfSx7ICAgIC01LCAwfSx7ICAgIDEwLCAwfSx7ICAgIC02LCAwfSx7ICAgIDE5LCAwfSwKK3sgICAtMTMsIDB9LHsgICAgMTgsIDB9LHsgICAtMTQsIDB9LHsgICAgMzUsIDB9LHsgICAtMjksIDB9LHsgICAgMzQsIDB9LHsgICAtMzAsIDB9LHsgICAgNjcsIDB9LAoreyAgIC02MSwgMH0seyAgICA2NiwgMH0seyAgIC02MiwgMH0seyAgIDEzMSwgMH0seyAgLTEyNSwgMH0seyAgIDEzMCwgMH0seyAgLTEyNiwgMH0seyAgIDI1OSwgMH0sCit7ICAtMjUzLCAwfSx7ICAgMjU4LCAwfSx7ICAtMjU0LCAwfSx7ICAgNTE1LCAwfSx7ICAtNTA5LCAwfSx7ICAgNTE0LCAwfSx7ICAtNTEwLCAwfSx7ICAxMDI3LCAwfSwKK3sgLTEwMjEsIDB9LHsgIDEwMjYsIDB9LHsgLTEwMjIsIDB9LHsgIDIwNTEsIDB9LHsgLTIwNDUsIDB9LHsgIDIwNTAsIDB9LHsgLTIwNDYsIDB9LHsgIDQwOTksIDB9LAoreyAtNDA5MywgMH0seyAgNDA5OCwgMH0seyAtNDA5NCwgMH0seyAgODE5NSwgMH0seyAtODE4OSwgMH0seyAgODE5NCwgMH0seyAtODE5MCwgMH0seyAxNjM4NywgMH0sCit7LTE2MzgxLCAwfSx7IDE2Mzg2LCAwfSx7LTE2MzgyLCAwfSx7IDMyNzcxLCAwfSx7LTMyNzY1LCAwfSx7IDMyNzcwLCAwfSx7LTMyNzY2LCAwfSx7ICAgIC00LCAwfSwKK3sgICAgLTYsIDF9LHsgICAgLTUsIDB9LHsgICAgLTcsIDF9LHsgICAgLTMsIDB9LHsgICAgLTcsIDF9LHsgICAgLTQsIDB9LHsgICAgLTgsIDF9LHsgICAgLTEsIDB9LAoreyAgICAtOSwgMX0seyAgICAtMiwgMH0seyAgIC0xMCwgMX0seyAgICAgMywgMX0seyAgIC0xMywgMX0seyAgICAgMiwgMX0seyAgIC0xNCwgMX0seyAgICAxMSwgMX0sCit7ICAgLTIxLCAxfSx7ICAgIDEwLCAxfSx7ICAgLTIyLCAxfSx7ICAgIDI3LCAxfSx7ICAgLTM3LCAxfSx7ICAgIDI2LCAxfSx7ICAgLTM4LCAxfSx7ICAgIDU5LCAxfSwKK3sgICAtNjksIDF9LHsgICAgNTgsIDF9LHsgICAtNzAsIDF9LHsgICAxMjMsIDF9LHsgIC0xMzMsIDF9LHsgICAxMjIsIDF9LHsgIC0xMzQsIDF9LHsgICAyNTEsIDF9LAoreyAgLTI2MSwgMX0seyAgIDI1MCwgMX0seyAgLTI2MiwgMX0seyAgIDUwNywgMX0seyAgLTUxNywgMX0seyAgIDUwNiwgMX0seyAgLTUxOCwgMX0seyAgMTAxOSwgMX0sCit7IC0xMDI5LCAxfSx7ICAxMDE4LCAxfSx7IC0xMDMwLCAxfSx7ICAyMDQzLCAxfSx7IC0yMDUzLCAxfSx7ICAyMDQyLCAxfSx7IC0yMDU0LCAxfSx7ICA0MDkxLCAxfSwKK3sgLTQxMDEsIDF9LHsgIDQwOTAsIDF9LHsgLTQxMDIsIDF9LHsgIDgxODcsIDF9LHsgLTgxOTcsIDF9LHsgIDgxODYsIDF9LHsgLTgxOTgsIDF9LHsgMTYzNzksIDF9LAorey0xNjM4OSwgMX0seyAxNjM3OCwgMX0sey0xNjM5MCwgMX0seyAzMjc2MywgMX0sey0zMjc3MywgMX0seyAzMjc2MiwgMX0sey0zMjc3NCwgMX0seyAgICAgOSwgMH0sCit7ICAgICA3LCAxfSx7ICAgICA4LCAwfSx7ICAgICA2LCAxfSx7ICAgIDEwLCAwfSx7ICAgICA2LCAxfSx7ICAgICA5LCAwfSx7ICAgICA1LCAxfSx7ICAgIDEyLCAwfSwKK3sgICAgIDQsIDF9LHsgICAgMTEsIDB9LHsgICAgIDMsIDF9LHsgICAgMTYsIDB9LHsgICAgIDAsIDF9LHsgICAgMTUsIDB9LHsgICAgLTEsIDB9LHsgICAgMjQsIDB9LAoreyAgICAtOCwgMH0seyAgICAyMywgMH0seyAgICAtOSwgMH0seyAgICA0MCwgMH0seyAgIC0yNCwgMH0seyAgICAzOSwgMH0seyAgIC0yNSwgMH0seyAgICA3MiwgMH0sCit7ICAgLTU2LCAwfSx7ICAgIDcxLCAwfSx7ICAgLTU3LCAwfSx7ICAgMTM2LCAwfSx7ICAtMTIwLCAwfSx7ICAgMTM1LCAwfSx7ICAtMTIxLCAwfSx7ICAgMjY0LCAwfSwKK3sgIC0yNDgsIDB9LHsgICAyNjMsIDB9LHsgIC0yNDksIDB9LHsgICA1MjAsIDB9LHsgIC01MDQsIDB9LHsgICA1MTksIDB9LHsgIC01MDUsIDB9LHsgIDEwMzIsIDB9LAoreyAtMTAxNiwgMH0seyAgMTAzMSwgMH0seyAtMTAxNywgMH0seyAgMjA1NiwgMH0seyAtMjA0MCwgMH0seyAgMjA1NSwgMH0seyAtMjA0MSwgMH0seyAgNDEwNCwgMH0sCit7IC00MDg4LCAwfSx7ICA0MTAzLCAwfSx7IC00MDg5LCAwfSx7ICA4MjAwLCAwfSx7IC04MTg0LCAwfSx7ICA4MTk5LCAwfSx7IC04MTg1LCAwfSx7IDE2MzkyLCAwfSwKK3stMTYzNzYsIDB9LHsgMTYzOTEsIDB9LHstMTYzNzcsIDB9LHsgMzI3NzYsIDB9LHstMzI3NjAsIDB9LHsgMzI3NzUsIDB9LHstMzI3NjEsIDB9LHsgICAgLTcsIDB9LAoreyAgICAtOSwgMX0seyAgICAtOCwgMH0seyAgIC0xMCwgMX0seyAgICAtNiwgMH0seyAgIC0xMCwgMX0seyAgICAtNywgMH0seyAgIC0xMSwgMX0seyAgICAtNCwgMH0sCit7ICAgLTEyLCAxfSx7ICAgIC01LCAwfSx7ICAgLTEzLCAxfSx7ICAgICAwLCAxfSx7ICAgLTE2LCAxfSx7ICAgIC0xLCAwfSx7ICAgLTE3LCAxfSx7ICAgICA4LCAxfSwKK3sgICAtMjQsIDF9LHsgICAgIDcsIDF9LHsgICAtMjUsIDF9LHsgICAgMjQsIDF9LHsgICAtNDAsIDF9LHsgICAgMjMsIDF9LHsgICAtNDEsIDF9LHsgICAgNTYsIDF9LAoreyAgIC03MiwgMX0seyAgICA1NSwgMX0seyAgIC03MywgMX0seyAgIDEyMCwgMX0seyAgLTEzNiwgMX0seyAgIDExOSwgMX0seyAgLTEzNywgMX0seyAgIDI0OCwgMX0sCit7ICAtMjY0LCAxfSx7ICAgMjQ3LCAxfSx7ICAtMjY1LCAxfSx7ICAgNTA0LCAxfSx7ICAtNTIwLCAxfSx7ICAgNTAzLCAxfSx7ICAtNTIxLCAxfSx7ICAxMDE2LCAxfSwKK3sgLTEwMzIsIDF9LHsgIDEwMTUsIDF9LHsgLTEwMzMsIDF9LHsgIDIwNDAsIDF9LHsgLTIwNTYsIDF9LHsgIDIwMzksIDF9LHsgLTIwNTcsIDF9LHsgIDQwODgsIDF9LAoreyAtNDEwNCwgMX0seyAgNDA4NywgMX0seyAtNDEwNSwgMX0seyAgODE4NCwgMX0seyAtODIwMCwgMX0seyAgODE4MywgMX0seyAtODIwMSwgMX0seyAxNjM3NiwgMX0sCit7LTE2MzkyLCAxfSx7IDE2Mzc1LCAxfSx7LTE2MzkzLCAxfSx7IDMyNzYwLCAxfSx7LTMyNzc2LCAxfSx7IDMyNzU5LCAxfSx7LTMyNzc3LCAxfSx7ICAgICA4LCAwfSwKK3sgICAgIDYsIDF9LHsgICAgIDcsIDB9LHsgICAgIDUsIDF9LHsgICAgIDksIDB9LHsgICAgIDUsIDF9LHsgICAgIDgsIDB9LHsgICAgIDQsIDF9LHsgICAgMTEsIDB9LAoreyAgICAgMywgMX0seyAgICAxMCwgMH0seyAgICAgMiwgMX0seyAgICAxNSwgMH0seyAgICAtMSwgMH0seyAgICAxNCwgMH0seyAgICAtMiwgMH0seyAgICAyMywgMH0sCit7ICAgIC05LCAwfSx7ICAgIDIyLCAwfSx7ICAgLTEwLCAwfSx7ICAgIDM5LCAwfSx7ICAgLTI1LCAwfSx7ICAgIDM4LCAwfSx7ICAgLTI2LCAwfSx7ICAgIDcxLCAwfSwKK3sgICAtNTcsIDB9LHsgICAgNzAsIDB9LHsgICAtNTgsIDB9LHsgICAxMzUsIDB9LHsgIC0xMjEsIDB9LHsgICAxMzQsIDB9LHsgIC0xMjIsIDB9LHsgICAyNjMsIDB9LAoreyAgLTI0OSwgMH0seyAgIDI2MiwgMH0seyAgLTI1MCwgMH0seyAgIDUxOSwgMH0seyAgLTUwNSwgMH0seyAgIDUxOCwgMH0seyAgLTUwNiwgMH0seyAgMTAzMSwgMH0sCit7IC0xMDE3LCAwfSx7ICAxMDMwLCAwfSx7IC0xMDE4LCAwfSx7ICAyMDU1LCAwfSx7IC0yMDQxLCAwfSx7ICAyMDU0LCAwfSx7IC0yMDQyLCAwfSx7ICA0MTAzLCAwfSwKK3sgLTQwODksIDB9LHsgIDQxMDIsIDB9LHsgLTQwOTAsIDB9LHsgIDgxOTksIDB9LHsgLTgxODUsIDB9LHsgIDgxOTgsIDB9LHsgLTgxODYsIDB9LHsgMTYzOTEsIDB9LAorey0xNjM3NywgMH0seyAxNjM5MCwgMH0sey0xNjM3OCwgMH0seyAzMjc3NSwgMH0sey0zMjc2MSwgMH0seyAzMjc3NCwgMH0sey0zMjc2MiwgMH0seyAgICAtOCwgMH0sCit7ICAgLTEwLCAxfSx7ICAgIC05LCAwfSx7ICAgLTExLCAxfSx7ICAgIC03LCAwfSx7ICAgLTExLCAxfSx7ICAgIC04LCAwfSx7ICAgLTEyLCAxfSx7ICAgIC01LCAwfSwKK3sgICAtMTMsIDF9LHsgICAgLTYsIDB9LHsgICAtMTQsIDF9LHsgICAgLTEsIDB9LHsgICAtMTcsIDF9LHsgICAgLTIsIDB9LHsgICAtMTgsIDF9LHsgICAgIDcsIDF9LAoreyAgIC0yNSwgMX0seyAgICAgNiwgMX0seyAgIC0yNiwgMX0seyAgICAyMywgMX0seyAgIC00MSwgMX0seyAgICAyMiwgMX0seyAgIC00MiwgMX0seyAgICA1NSwgMX0sCit7ICAgLTczLCAxfSx7ICAgIDU0LCAxfSx7ICAgLTc0LCAxfSx7ICAgMTE5LCAxfSx7ICAtMTM3LCAxfSx7ICAgMTE4LCAxfSx7ICAtMTM4LCAxfSx7ICAgMjQ3LCAxfSwKK3sgIC0yNjUsIDF9LHsgICAyNDYsIDF9LHsgIC0yNjYsIDF9LHsgICA1MDMsIDF9LHsgIC01MjEsIDF9LHsgICA1MDIsIDF9LHsgIC01MjIsIDF9LHsgIDEwMTUsIDF9LAoreyAtMTAzMywgMX0seyAgMTAxNCwgMX0seyAtMTAzNCwgMX0seyAgMjAzOSwgMX0seyAtMjA1NywgMX0seyAgMjAzOCwgMX0seyAtMjA1OCwgMX0seyAgNDA4NywgMX0sCit7IC00MTA1LCAxfSx7ICA0MDg2LCAxfSx7IC00MTA2LCAxfSx7ICA4MTgzLCAxfSx7IC04MjAxLCAxfSx7ICA4MTgyLCAxfSx7IC04MjAyLCAxfSx7IDE2Mzc1LCAxfSwKK3stMTYzOTMsIDF9LHsgMTYzNzQsIDF9LHstMTYzOTQsIDF9LHsgMzI3NTksIDF9LHstMzI3NzcsIDF9LHsgMzI3NTgsIDF9LHstMzI3NzgsIDF9LHsgICAgMTcsIDB9LAoreyAgICAxNSwgMX0seyAgICAxNiwgMH0seyAgICAxNCwgMX0seyAgICAxOCwgMH0seyAgICAxNCwgMX0seyAgICAxNywgMH0seyAgICAxMywgMX0seyAgICAyMCwgMH0sCit7ICAgIDEyLCAxfSx7ICAgIDE5LCAwfSx7ICAgIDExLCAxfSx7ICAgIDI0LCAwfSx7ICAgICA4LCAxfSx7ICAgIDIzLCAwfSx7ICAgICA3LCAxfSx7ICAgIDMyLCAwfSwKK3sgICAgIDAsIDF9LHsgICAgMzEsIDB9LHsgICAgLTEsIDB9LHsgICAgNDgsIDB9LHsgICAtMTYsIDB9LHsgICAgNDcsIDB9LHsgICAtMTcsIDB9LHsgICAgODAsIDB9LAoreyAgIC00OCwgMH0seyAgICA3OSwgMH0seyAgIC00OSwgMH0seyAgIDE0NCwgMH0seyAgLTExMiwgMH0seyAgIDE0MywgMH0seyAgLTExMywgMH0seyAgIDI3MiwgMH0sCit7ICAtMjQwLCAwfSx7ICAgMjcxLCAwfSx7ICAtMjQxLCAwfSx7ICAgNTI4LCAwfSx7ICAtNDk2LCAwfSx7ICAgNTI3LCAwfSx7ICAtNDk3LCAwfSx7ICAxMDQwLCAwfSwKK3sgLTEwMDgsIDB9LHsgIDEwMzksIDB9LHsgLTEwMDksIDB9LHsgIDIwNjQsIDB9LHsgLTIwMzIsIDB9LHsgIDIwNjMsIDB9LHsgLTIwMzMsIDB9LHsgIDQxMTIsIDB9LAoreyAtNDA4MCwgMH0seyAgNDExMSwgMH0seyAtNDA4MSwgMH0seyAgODIwOCwgMH0seyAtODE3NiwgMH0seyAgODIwNywgMH0seyAtODE3NywgMH0seyAxNjQwMCwgMH0sCit7LTE2MzY4LCAwfSx7IDE2Mzk5LCAwfSx7LTE2MzY5LCAwfSx7IDMyNzg0LCAwfSx7LTMyNzUyLCAwfSx7IDMyNzgzLCAwfSx7LTMyNzUzLCAwfSx7ICAgLTE1LCAwfSwKK3sgICAtMTcsIDF9LHsgICAtMTYsIDB9LHsgICAtMTgsIDF9LHsgICAtMTQsIDB9LHsgICAtMTgsIDF9LHsgICAtMTUsIDB9LHsgICAtMTksIDF9LHsgICAtMTIsIDB9LAoreyAgIC0yMCwgMX0seyAgIC0xMywgMH0seyAgIC0yMSwgMX0seyAgICAtOCwgMH0seyAgIC0yNCwgMX0seyAgICAtOSwgMH0seyAgIC0yNSwgMX0seyAgICAgMCwgMX0sCit7ICAgLTMyLCAxfSx7ICAgIC0xLCAwfSx7ICAgLTMzLCAxfSx7ICAgIDE2LCAxfSx7ICAgLTQ4LCAxfSx7ICAgIDE1LCAxfSx7ICAgLTQ5LCAxfSx7ICAgIDQ4LCAxfSwKK3sgICAtODAsIDF9LHsgICAgNDcsIDF9LHsgICAtODEsIDF9LHsgICAxMTIsIDF9LHsgIC0xNDQsIDF9LHsgICAxMTEsIDF9LHsgIC0xNDUsIDF9LHsgICAyNDAsIDF9LAoreyAgLTI3MiwgMX0seyAgIDIzOSwgMX0seyAgLTI3MywgMX0seyAgIDQ5NiwgMX0seyAgLTUyOCwgMX0seyAgIDQ5NSwgMX0seyAgLTUyOSwgMX0seyAgMTAwOCwgMX0sCit7IC0xMDQwLCAxfSx7ICAxMDA3LCAxfSx7IC0xMDQxLCAxfSx7ICAyMDMyLCAxfSx7IC0yMDY0LCAxfSx7ICAyMDMxLCAxfSx7IC0yMDY1LCAxfSx7ICA0MDgwLCAxfSwKK3sgLTQxMTIsIDF9LHsgIDQwNzksIDF9LHsgLTQxMTMsIDF9LHsgIDgxNzYsIDF9LHsgLTgyMDgsIDF9LHsgIDgxNzUsIDF9LHsgLTgyMDksIDF9LHsgMTYzNjgsIDF9LAorey0xNjQwMCwgMX0seyAxNjM2NywgMX0sey0xNjQwMSwgMX0seyAzMjc1MiwgMX0sey0zMjc4NCwgMX0seyAzMjc1MSwgMX0sey0zMjc4NSwgMX0seyAgICAxNiwgMH0sCit7ICAgIDE0LCAxfSx7ICAgIDE1LCAwfSx7ICAgIDEzLCAxfSx7ICAgIDE3LCAwfSx7ICAgIDEzLCAxfSx7ICAgIDE2LCAwfSx7ICAgIDEyLCAxfSx7ICAgIDE5LCAwfSwKK3sgICAgMTEsIDF9LHsgICAgMTgsIDB9LHsgICAgMTAsIDF9LHsgICAgMjMsIDB9LHsgICAgIDcsIDF9LHsgICAgMjIsIDB9LHsgICAgIDYsIDF9LHsgICAgMzEsIDB9LAoreyAgICAtMSwgMH0seyAgICAzMCwgMH0seyAgICAtMiwgMH0seyAgICA0NywgMH0seyAgIC0xNywgMH0seyAgICA0NiwgMH0seyAgIC0xOCwgMH0seyAgICA3OSwgMH0sCit7ICAgLTQ5LCAwfSx7ICAgIDc4LCAwfSx7ICAgLTUwLCAwfSx7ICAgMTQzLCAwfSx7ICAtMTEzLCAwfSx7ICAgMTQyLCAwfSx7ICAtMTE0LCAwfSx7ICAgMjcxLCAwfSwKK3sgIC0yNDEsIDB9LHsgICAyNzAsIDB9LHsgIC0yNDIsIDB9LHsgICA1MjcsIDB9LHsgIC00OTcsIDB9LHsgICA1MjYsIDB9LHsgIC00OTgsIDB9LHsgIDEwMzksIDB9LAoreyAtMTAwOSwgMH0seyAgMTAzOCwgMH0seyAtMTAxMCwgMH0seyAgMjA2MywgMH0seyAtMjAzMywgMH0seyAgMjA2MiwgMH0seyAtMjAzNCwgMH0seyAgNDExMSwgMH0sCit7IC00MDgxLCAwfSx7ICA0MTEwLCAwfSx7IC00MDgyLCAwfSx7ICA4MjA3LCAwfSx7IC04MTc3LCAwfSx7ICA4MjA2LCAwfSx7IC04MTc4LCAwfSx7IDE2Mzk5LCAwfSwKK3stMTYzNjksIDB9LHsgMTYzOTgsIDB9LHstMTYzNzAsIDB9LHsgMzI3ODMsIDB9LHstMzI3NTMsIDB9LHsgMzI3ODIsIDB9LHstMzI3NTQsIDB9LHsgICAtMTYsIDB9LAoreyAgIC0xOCwgMX0seyAgIC0xNywgMH0seyAgIC0xOSwgMX0seyAgIC0xNSwgMH0seyAgIC0xOSwgMX0seyAgIC0xNiwgMH0seyAgIC0yMCwgMX0seyAgIC0xMywgMH0sCit7ICAgLTIxLCAxfSx7ICAgLTE0LCAwfSx7ICAgLTIyLCAxfSx7ICAgIC05LCAwfSx7ICAgLTI1LCAxfSx7ICAgLTEwLCAwfSx7ICAgLTI2LCAxfSx7ICAgIC0xLCAwfSwKK3sgICAtMzMsIDF9LHsgICAgLTIsIDB9LHsgICAtMzQsIDF9LHsgICAgMTUsIDF9LHsgICAtNDksIDF9LHsgICAgMTQsIDF9LHsgICAtNTAsIDF9LHsgICAgNDcsIDF9LAoreyAgIC04MSwgMX0seyAgICA0NiwgMX0seyAgIC04MiwgMX0seyAgIDExMSwgMX0seyAgLTE0NSwgMX0seyAgIDExMCwgMX0seyAgLTE0NiwgMX0seyAgIDIzOSwgMX0sCit7ICAtMjczLCAxfSx7ICAgMjM4LCAxfSx7ICAtMjc0LCAxfSx7ICAgNDk1LCAxfSx7ICAtNTI5LCAxfSx7ICAgNDk0LCAxfSx7ICAtNTMwLCAxfSx7ICAxMDA3LCAxfSwKK3sgLTEwNDEsIDF9LHsgIDEwMDYsIDF9LHsgLTEwNDIsIDF9LHsgIDIwMzEsIDF9LHsgLTIwNjUsIDF9LHsgIDIwMzAsIDF9LHsgLTIwNjYsIDF9LHsgIDQwNzksIDF9LAoreyAtNDExMywgMX0seyAgNDA3OCwgMX0seyAtNDExNCwgMX0seyAgODE3NSwgMX0seyAtODIwOSwgMX0seyAgODE3NCwgMX0seyAtODIxMCwgMX0seyAxNjM2NywgMX0sCit7LTE2NDAxLCAxfSx7IDE2MzY2LCAxfSx7LTE2NDAyLCAxfSx7IDMyNzUxLCAxfSx7LTMyNzg1LCAxfSx7IDMyNzUwLCAxfSx7LTMyNzg2LCAxfSx7ICAgIDMzLCAwfSwKK3sgICAgMzEsIDF9LHsgICAgMzIsIDB9LHsgICAgMzAsIDF9LHsgICAgMzQsIDB9LHsgICAgMzAsIDF9LHsgICAgMzMsIDB9LHsgICAgMjksIDF9LHsgICAgMzYsIDB9LAoreyAgICAyOCwgMX0seyAgICAzNSwgMH0seyAgICAyNywgMX0seyAgICA0MCwgMH0seyAgICAyNCwgMX0seyAgICAzOSwgMH0seyAgICAyMywgMX0seyAgICA0OCwgMH0sCit7ICAgIDE2LCAxfSx7ICAgIDQ3LCAwfSx7ICAgIDE1LCAxfSx7ICAgIDY0LCAwfSx7ICAgICAwLCAxfSx7ICAgIDYzLCAwfSx7ICAgIC0xLCAwfSx7ICAgIDk2LCAwfSwKK3sgICAtMzIsIDB9LHsgICAgOTUsIDB9LHsgICAtMzMsIDB9LHsgICAxNjAsIDB9LHsgICAtOTYsIDB9LHsgICAxNTksIDB9LHsgICAtOTcsIDB9LHsgICAyODgsIDB9LAoreyAgLTIyNCwgMH0seyAgIDI4NywgMH0seyAgLTIyNSwgMH0seyAgIDU0NCwgMH0seyAgLTQ4MCwgMH0seyAgIDU0MywgMH0seyAgLTQ4MSwgMH0seyAgMTA1NiwgMH0sCit7ICAtOTkyLCAwfSx7ICAxMDU1LCAwfSx7ICAtOTkzLCAwfSx7ICAyMDgwLCAwfSx7IC0yMDE2LCAwfSx7ICAyMDc5LCAwfSx7IC0yMDE3LCAwfSx7ICA0MTI4LCAwfSwKK3sgLTQwNjQsIDB9LHsgIDQxMjcsIDB9LHsgLTQwNjUsIDB9LHsgIDgyMjQsIDB9LHsgLTgxNjAsIDB9LHsgIDgyMjMsIDB9LHsgLTgxNjEsIDB9LHsgMTY0MTYsIDB9LAorey0xNjM1MiwgMH0seyAxNjQxNSwgMH0sey0xNjM1MywgMH0seyAzMjgwMCwgMH0sey0zMjczNiwgMH0seyAzMjc5OSwgMH0sey0zMjczNywgMH0seyAgIC0zMSwgMH0sCit7ICAgLTMzLCAxfSx7ICAgLTMyLCAwfSx7ICAgLTM0LCAxfSx7ICAgLTMwLCAwfSx7ICAgLTM0LCAxfSx7ICAgLTMxLCAwfSx7ICAgLTM1LCAxfSx7ICAgLTI4LCAwfSwKK3sgICAtMzYsIDF9LHsgICAtMjksIDB9LHsgICAtMzcsIDF9LHsgICAtMjQsIDB9LHsgICAtNDAsIDF9LHsgICAtMjUsIDB9LHsgICAtNDEsIDF9LHsgICAtMTYsIDB9LAoreyAgIC00OCwgMX0seyAgIC0xNywgMH0seyAgIC00OSwgMX0seyAgICAgMCwgMX0seyAgIC02NCwgMX0seyAgICAtMSwgMH0seyAgIC02NSwgMX0seyAgICAzMiwgMX0sCit7ICAgLTk2LCAxfSx7ICAgIDMxLCAxfSx7ICAgLTk3LCAxfSx7ICAgIDk2LCAxfSx7ICAtMTYwLCAxfSx7ICAgIDk1LCAxfSx7ICAtMTYxLCAxfSx7ICAgMjI0LCAxfSwKK3sgIC0yODgsIDF9LHsgICAyMjMsIDF9LHsgIC0yODksIDF9LHsgICA0ODAsIDF9LHsgIC01NDQsIDF9LHsgICA0NzksIDF9LHsgIC01NDUsIDF9LHsgICA5OTIsIDF9LAoreyAtMTA1NiwgMX0seyAgIDk5MSwgMX0seyAtMTA1NywgMX0seyAgMjAxNiwgMX0seyAtMjA4MCwgMX0seyAgMjAxNSwgMX0seyAtMjA4MSwgMX0seyAgNDA2NCwgMX0sCit7IC00MTI4LCAxfSx7ICA0MDYzLCAxfSx7IC00MTI5LCAxfSx7ICA4MTYwLCAxfSx7IC04MjI0LCAxfSx7ICA4MTU5LCAxfSx7IC04MjI1LCAxfSx7IDE2MzUyLCAxfSwKK3stMTY0MTYsIDF9LHsgMTYzNTEsIDF9LHstMTY0MTcsIDF9LHsgMzI3MzYsIDF9LHstMzI4MDAsIDF9LHsgMzI3MzUsIDF9LHstMzI4MDEsIDF9LHsgICAgMzIsIDB9LAoreyAgICAzMCwgMX0seyAgICAzMSwgMH0seyAgICAyOSwgMX0seyAgICAzMywgMH0seyAgICAyOSwgMX0seyAgICAzMiwgMH0seyAgICAyOCwgMX0seyAgICAzNSwgMH0sCit7ICAgIDI3LCAxfSx7ICAgIDM0LCAwfSx7ICAgIDI2LCAxfSx7ICAgIDM5LCAwfSx7ICAgIDIzLCAxfSx7ICAgIDM4LCAwfSx7ICAgIDIyLCAxfSx7ICAgIDQ3LCAwfSwKK3sgICAgMTUsIDF9LHsgICAgNDYsIDB9LHsgICAgMTQsIDF9LHsgICAgNjMsIDB9LHsgICAgLTEsIDB9LHsgICAgNjIsIDB9LHsgICAgLTIsIDB9LHsgICAgOTUsIDB9LAoreyAgIC0zMywgMH0seyAgICA5NCwgMH0seyAgIC0zNCwgMH0seyAgIDE1OSwgMH0seyAgIC05NywgMH0seyAgIDE1OCwgMH0seyAgIC05OCwgMH0seyAgIDI4NywgMH0sCit7ICAtMjI1LCAwfSx7ICAgMjg2LCAwfSx7ICAtMjI2LCAwfSx7ICAgNTQzLCAwfSx7ICAtNDgxLCAwfSx7ICAgNTQyLCAwfSx7ICAtNDgyLCAwfSx7ICAxMDU1LCAwfSwKK3sgIC05OTMsIDB9LHsgIDEwNTQsIDB9LHsgIC05OTQsIDB9LHsgIDIwNzksIDB9LHsgLTIwMTcsIDB9LHsgIDIwNzgsIDB9LHsgLTIwMTgsIDB9LHsgIDQxMjcsIDB9LAoreyAtNDA2NSwgMH0seyAgNDEyNiwgMH0seyAtNDA2NiwgMH0seyAgODIyMywgMH0seyAtODE2MSwgMH0seyAgODIyMiwgMH0seyAtODE2MiwgMH0seyAxNjQxNSwgMH0sCit7LTE2MzUzLCAwfSx7IDE2NDE0LCAwfSx7LTE2MzU0LCAwfSx7IDMyNzk5LCAwfSx7LTMyNzM3LCAwfSx7IDMyNzk4LCAwfSx7LTMyNzM4LCAwfSx7ICAgLTMyLCAwfSwKK3sgICAtMzQsIDF9LHsgICAtMzMsIDB9LHsgICAtMzUsIDF9LHsgICAtMzEsIDB9LHsgICAtMzUsIDF9LHsgICAtMzIsIDB9LHsgICAtMzYsIDF9LHsgICAtMjksIDB9LAoreyAgIC0zNywgMX0seyAgIC0zMCwgMH0seyAgIC0zOCwgMX0seyAgIC0yNSwgMH0seyAgIC00MSwgMX0seyAgIC0yNiwgMH0seyAgIC00MiwgMX0seyAgIC0xNywgMH0sCit7ICAgLTQ5LCAxfSx7ICAgLTE4LCAwfSx7ICAgLTUwLCAxfSx7ICAgIC0xLCAwfSx7ICAgLTY1LCAxfSx7ICAgIC0yLCAwfSx7ICAgLTY2LCAxfSx7ICAgIDMxLCAxfSwKK3sgICAtOTcsIDF9LHsgICAgMzAsIDF9LHsgICAtOTgsIDF9LHsgICAgOTUsIDF9LHsgIC0xNjEsIDF9LHsgICAgOTQsIDF9LHsgIC0xNjIsIDF9LHsgICAyMjMsIDF9LAoreyAgLTI4OSwgMX0seyAgIDIyMiwgMX0seyAgLTI5MCwgMX0seyAgIDQ3OSwgMX0seyAgLTU0NSwgMX0seyAgIDQ3OCwgMX0seyAgLTU0NiwgMX0seyAgIDk5MSwgMX0sCit7IC0xMDU3LCAxfSx7ICAgOTkwLCAxfSx7IC0xMDU4LCAxfSx7ICAyMDE1LCAxfSx7IC0yMDgxLCAxfSx7ICAyMDE0LCAxfSx7IC0yMDgyLCAxfSx7ICA0MDYzLCAxfSwKK3sgLTQxMjksIDF9LHsgIDQwNjIsIDF9LHsgLTQxMzAsIDF9LHsgIDgxNTksIDF9LHsgLTgyMjUsIDF9LHsgIDgxNTgsIDF9LHsgLTgyMjYsIDF9LHsgMTYzNTEsIDF9LAorey0xNjQxNywgMX0seyAxNjM1MCwgMX0sey0xNjQxOCwgMX0seyAzMjczNSwgMX0sey0zMjgwMSwgMX0seyAzMjczNCwgMX0sey0zMjgwMiwgMX0seyAgICA2NSwgMH0sCit7ICAgIDYzLCAxfSx7ICAgIDY0LCAwfSx7ICAgIDYyLCAxfSx7ICAgIDY2LCAwfSx7ICAgIDYyLCAxfSx7ICAgIDY1LCAwfSx7ICAgIDYxLCAxfSx7ICAgIDY4LCAwfSwKK3sgICAgNjAsIDF9LHsgICAgNjcsIDB9LHsgICAgNTksIDF9LHsgICAgNzIsIDB9LHsgICAgNTYsIDF9LHsgICAgNzEsIDB9LHsgICAgNTUsIDF9LHsgICAgODAsIDB9LAoreyAgICA0OCwgMX0seyAgICA3OSwgMH0seyAgICA0NywgMX0seyAgICA5NiwgMH0seyAgICAzMiwgMX0seyAgICA5NSwgMH0seyAgICAzMSwgMX0seyAgIDEyOCwgMH0sCit7ICAgICAwLCAxfSx7ICAgMTI3LCAwfSx7ICAgIC0xLCAwfSx7ICAgMTkyLCAwfSx7ICAgLTY0LCAwfSx7ICAgMTkxLCAwfSx7ICAgLTY1LCAwfSx7ICAgMzIwLCAwfSwKK3sgIC0xOTIsIDB9LHsgICAzMTksIDB9LHsgIC0xOTMsIDB9LHsgICA1NzYsIDB9LHsgIC00NDgsIDB9LHsgICA1NzUsIDB9LHsgIC00NDksIDB9LHsgIDEwODgsIDB9LAoreyAgLTk2MCwgMH0seyAgMTA4NywgMH0seyAgLTk2MSwgMH0seyAgMjExMiwgMH0seyAtMTk4NCwgMH0seyAgMjExMSwgMH0seyAtMTk4NSwgMH0seyAgNDE2MCwgMH0sCit7IC00MDMyLCAwfSx7ICA0MTU5LCAwfSx7IC00MDMzLCAwfSx7ICA4MjU2LCAwfSx7IC04MTI4LCAwfSx7ICA4MjU1LCAwfSx7IC04MTI5LCAwfSx7IDE2NDQ4LCAwfSwKK3stMTYzMjAsIDB9LHsgMTY0NDcsIDB9LHstMTYzMjEsIDB9LHsgMzI4MzIsIDB9LHstMzI3MDQsIDB9LHsgMzI4MzEsIDB9LHstMzI3MDUsIDB9LHsgICAtNjMsIDB9LAoreyAgIC02NSwgMX0seyAgIC02NCwgMH0seyAgIC02NiwgMX0seyAgIC02MiwgMH0seyAgIC02NiwgMX0seyAgIC02MywgMH0seyAgIC02NywgMX0seyAgIC02MCwgMH0sCit7ICAgLTY4LCAxfSx7ICAgLTYxLCAwfSx7ICAgLTY5LCAxfSx7ICAgLTU2LCAwfSx7ICAgLTcyLCAxfSx7ICAgLTU3LCAwfSx7ICAgLTczLCAxfSx7ICAgLTQ4LCAwfSwKK3sgICAtODAsIDF9LHsgICAtNDksIDB9LHsgICAtODEsIDF9LHsgICAtMzIsIDB9LHsgICAtOTYsIDF9LHsgICAtMzMsIDB9LHsgICAtOTcsIDF9LHsgICAgIDAsIDF9LAoreyAgLTEyOCwgMX0seyAgICAtMSwgMH0seyAgLTEyOSwgMX0seyAgICA2NCwgMX0seyAgLTE5MiwgMX0seyAgICA2MywgMX0seyAgLTE5MywgMX0seyAgIDE5MiwgMX0sCit7ICAtMzIwLCAxfSx7ICAgMTkxLCAxfSx7ICAtMzIxLCAxfSx7ICAgNDQ4LCAxfSx7ICAtNTc2LCAxfSx7ICAgNDQ3LCAxfSx7ICAtNTc3LCAxfSx7ICAgOTYwLCAxfSwKK3sgLTEwODgsIDF9LHsgICA5NTksIDF9LHsgLTEwODksIDF9LHsgIDE5ODQsIDF9LHsgLTIxMTIsIDF9LHsgIDE5ODMsIDF9LHsgLTIxMTMsIDF9LHsgIDQwMzIsIDF9LAoreyAtNDE2MCwgMX0seyAgNDAzMSwgMX0seyAtNDE2MSwgMX0seyAgODEyOCwgMX0seyAtODI1NiwgMX0seyAgODEyNywgMX0seyAtODI1NywgMX0seyAxNjMyMCwgMX0sCit7LTE2NDQ4LCAxfSx7IDE2MzE5LCAxfSx7LTE2NDQ5LCAxfSx7IDMyNzA0LCAxfSx7LTMyODMyLCAxfSx7IDMyNzAzLCAxfSx7LTMyODMzLCAxfSx7ICAgIDY0LCAwfSwKK3sgICAgNjIsIDF9LHsgICAgNjMsIDB9LHsgICAgNjEsIDF9LHsgICAgNjUsIDB9LHsgICAgNjEsIDF9LHsgICAgNjQsIDB9LHsgICAgNjAsIDF9LHsgICAgNjcsIDB9LAoreyAgICA1OSwgMX0seyAgICA2NiwgMH0seyAgICA1OCwgMX0seyAgICA3MSwgMH0seyAgICA1NSwgMX0seyAgICA3MCwgMH0seyAgICA1NCwgMX0seyAgICA3OSwgMH0sCit7ICAgIDQ3LCAxfSx7ICAgIDc4LCAwfSx7ICAgIDQ2LCAxfSx7ICAgIDk1LCAwfSx7ICAgIDMxLCAxfSx7ICAgIDk0LCAwfSx7ICAgIDMwLCAxfSx7ICAgMTI3LCAwfSwKK3sgICAgLTEsIDB9LHsgICAxMjYsIDB9LHsgICAgLTIsIDB9LHsgICAxOTEsIDB9LHsgICAtNjUsIDB9LHsgICAxOTAsIDB9LHsgICAtNjYsIDB9LHsgICAzMTksIDB9LAoreyAgLTE5MywgMH0seyAgIDMxOCwgMH0seyAgLTE5NCwgMH0seyAgIDU3NSwgMH0seyAgLTQ0OSwgMH0seyAgIDU3NCwgMH0seyAgLTQ1MCwgMH0seyAgMTA4NywgMH0sCit7ICAtOTYxLCAwfSx7ICAxMDg2LCAwfSx7ICAtOTYyLCAwfSx7ICAyMTExLCAwfSx7IC0xOTg1LCAwfSx7ICAyMTEwLCAwfSx7IC0xOTg2LCAwfSx7ICA0MTU5LCAwfSwKK3sgLTQwMzMsIDB9LHsgIDQxNTgsIDB9LHsgLTQwMzQsIDB9LHsgIDgyNTUsIDB9LHsgLTgxMjksIDB9LHsgIDgyNTQsIDB9LHsgLTgxMzAsIDB9LHsgMTY0NDcsIDB9LAorey0xNjMyMSwgMH0seyAxNjQ0NiwgMH0sey0xNjMyMiwgMH0seyAzMjgzMSwgMH0sey0zMjcwNSwgMH0seyAzMjgzMCwgMH0sey0zMjcwNiwgMH0seyAgIC02NCwgMH0sCit7ICAgLTY2LCAxfSx7ICAgLTY1LCAwfSx7ICAgLTY3LCAxfSx7ICAgLTYzLCAwfSx7ICAgLTY3LCAxfSx7ICAgLTY0LCAwfSx7ICAgLTY4LCAxfSx7ICAgLTYxLCAwfSwKK3sgICAtNjksIDF9LHsgICAtNjIsIDB9LHsgICAtNzAsIDF9LHsgICAtNTcsIDB9LHsgICAtNzMsIDF9LHsgICAtNTgsIDB9LHsgICAtNzQsIDF9LHsgICAtNDksIDB9LAoreyAgIC04MSwgMX0seyAgIC01MCwgMH0seyAgIC04MiwgMX0seyAgIC0zMywgMH0seyAgIC05NywgMX0seyAgIC0zNCwgMH0seyAgIC05OCwgMX0seyAgICAtMSwgMH0sCit7ICAtMTI5LCAxfSx7ICAgIC0yLCAwfSx7ICAtMTMwLCAxfSx7ICAgIDYzLCAxfSx7ICAtMTkzLCAxfSx7ICAgIDYyLCAxfSx7ICAtMTk0LCAxfSx7ICAgMTkxLCAxfSwKK3sgIC0zMjEsIDF9LHsgICAxOTAsIDF9LHsgIC0zMjIsIDF9LHsgICA0NDcsIDF9LHsgIC01NzcsIDF9LHsgICA0NDYsIDF9LHsgIC01NzgsIDF9LHsgICA5NTksIDF9LAoreyAtMTA4OSwgMX0seyAgIDk1OCwgMX0seyAtMTA5MCwgMX0seyAgMTk4MywgMX0seyAtMjExMywgMX0seyAgMTk4MiwgMX0seyAtMjExNCwgMX0seyAgNDAzMSwgMX0sCit7IC00MTYxLCAxfSx7ICA0MDMwLCAxfSx7IC00MTYyLCAxfSx7ICA4MTI3LCAxfSx7IC04MjU3LCAxfSx7ICA4MTI2LCAxfSx7IC04MjU4LCAxfSx7IDE2MzE5LCAxfSwKK3stMTY0NDksIDF9LHsgMTYzMTgsIDF9LHstMTY0NTAsIDF9LHsgMzI3MDMsIDF9LHstMzI4MzMsIDF9LHsgMzI3MDIsIDF9LHstMzI4MzQsIDF9LHsgICAxMjksIDB9LAoreyAgIDEyNywgMX0seyAgIDEyOCwgMH0seyAgIDEyNiwgMX0seyAgIDEzMCwgMH0seyAgIDEyNiwgMX0seyAgIDEyOSwgMH0seyAgIDEyNSwgMX0seyAgIDEzMiwgMH0sCit7ICAgMTI0LCAxfSx7ICAgMTMxLCAwfSx7ICAgMTIzLCAxfSx7ICAgMTM2LCAwfSx7ICAgMTIwLCAxfSx7ICAgMTM1LCAwfSx7ICAgMTE5LCAxfSx7ICAgMTQ0LCAwfSwKK3sgICAxMTIsIDF9LHsgICAxNDMsIDB9LHsgICAxMTEsIDF9LHsgICAxNjAsIDB9LHsgICAgOTYsIDF9LHsgICAxNTksIDB9LHsgICAgOTUsIDF9LHsgICAxOTIsIDB9LAoreyAgICA2NCwgMX0seyAgIDE5MSwgMH0seyAgICA2MywgMX0seyAgIDI1NiwgMH0seyAgICAgMCwgMX0seyAgIDI1NSwgMH0seyAgICAtMSwgMH0seyAgIDM4NCwgMH0sCit7ICAtMTI4LCAwfSx7ICAgMzgzLCAwfSx7ICAtMTI5LCAwfSx7ICAgNjQwLCAwfSx7ICAtMzg0LCAwfSx7ICAgNjM5LCAwfSx7ICAtMzg1LCAwfSx7ICAxMTUyLCAwfSwKK3sgIC04OTYsIDB9LHsgIDExNTEsIDB9LHsgIC04OTcsIDB9LHsgIDIxNzYsIDB9LHsgLTE5MjAsIDB9LHsgIDIxNzUsIDB9LHsgLTE5MjEsIDB9LHsgIDQyMjQsIDB9LAoreyAtMzk2OCwgMH0seyAgNDIyMywgMH0seyAtMzk2OSwgMH0seyAgODMyMCwgMH0seyAtODA2NCwgMH0seyAgODMxOSwgMH0seyAtODA2NSwgMH0seyAxNjUxMiwgMH0sCit7LTE2MjU2LCAwfSx7IDE2NTExLCAwfSx7LTE2MjU3LCAwfSx7IDMyODk2LCAwfSx7LTMyNjQwLCAwfSx7IDMyODk1LCAwfSx7LTMyNjQxLCAwfSx7ICAtMTI3LCAwfSwKK3sgIC0xMjksIDF9LHsgIC0xMjgsIDB9LHsgIC0xMzAsIDF9LHsgIC0xMjYsIDB9LHsgIC0xMzAsIDF9LHsgIC0xMjcsIDB9LHsgIC0xMzEsIDF9LHsgIC0xMjQsIDB9LAoreyAgLTEzMiwgMX0seyAgLTEyNSwgMH0seyAgLTEzMywgMX0seyAgLTEyMCwgMH0seyAgLTEzNiwgMX0seyAgLTEyMSwgMH0seyAgLTEzNywgMX0seyAgLTExMiwgMH0sCit7ICAtMTQ0LCAxfSx7ICAtMTEzLCAwfSx7ICAtMTQ1LCAxfSx7ICAgLTk2LCAwfSx7ICAtMTYwLCAxfSx7ICAgLTk3LCAwfSx7ICAtMTYxLCAxfSx7ICAgLTY0LCAwfSwKK3sgIC0xOTIsIDF9LHsgICAtNjUsIDB9LHsgIC0xOTMsIDF9LHsgICAgIDAsIDF9LHsgIC0yNTYsIDF9LHsgICAgLTEsIDB9LHsgIC0yNTcsIDF9LHsgICAxMjgsIDF9LAoreyAgLTM4NCwgMX0seyAgIDEyNywgMX0seyAgLTM4NSwgMX0seyAgIDM4NCwgMX0seyAgLTY0MCwgMX0seyAgIDM4MywgMX0seyAgLTY0MSwgMX0seyAgIDg5NiwgMX0sCit7IC0xMTUyLCAxfSx7ICAgODk1LCAxfSx7IC0xMTUzLCAxfSx7ICAxOTIwLCAxfSx7IC0yMTc2LCAxfSx7ICAxOTE5LCAxfSx7IC0yMTc3LCAxfSx7ICAzOTY4LCAxfSwKK3sgLTQyMjQsIDF9LHsgIDM5NjcsIDF9LHsgLTQyMjUsIDF9LHsgIDgwNjQsIDF9LHsgLTgzMjAsIDF9LHsgIDgwNjMsIDF9LHsgLTgzMjEsIDF9LHsgMTYyNTYsIDF9LAorey0xNjUxMiwgMX0seyAxNjI1NSwgMX0sey0xNjUxMywgMX0seyAzMjY0MCwgMX0sey0zMjg5NiwgMX0seyAzMjYzOSwgMX0sey0zMjg5NywgMX0seyAgIDEyOCwgMH0sCit7ICAgMTI2LCAxfSx7ICAgMTI3LCAwfSx7ICAgMTI1LCAxfSx7ICAgMTI5LCAwfSx7ICAgMTI1LCAxfSx7ICAgMTI4LCAwfSx7ICAgMTI0LCAxfSx7ICAgMTMxLCAwfSwKK3sgICAxMjMsIDF9LHsgICAxMzAsIDB9LHsgICAxMjIsIDF9LHsgICAxMzUsIDB9LHsgICAxMTksIDF9LHsgICAxMzQsIDB9LHsgICAxMTgsIDF9LHsgICAxNDMsIDB9LAoreyAgIDExMSwgMX0seyAgIDE0MiwgMH0seyAgIDExMCwgMX0seyAgIDE1OSwgMH0seyAgICA5NSwgMX0seyAgIDE1OCwgMH0seyAgICA5NCwgMX0seyAgIDE5MSwgMH0sCit7ICAgIDYzLCAxfSx7ICAgMTkwLCAwfSx7ICAgIDYyLCAxfSx7ICAgMjU1LCAwfSx7ICAgIC0xLCAwfSx7ICAgMjU0LCAwfSx7ICAgIC0yLCAwfSx7ICAgMzgzLCAwfSwKK3sgIC0xMjksIDB9LHsgICAzODIsIDB9LHsgIC0xMzAsIDB9LHsgICA2MzksIDB9LHsgIC0zODUsIDB9LHsgICA2MzgsIDB9LHsgIC0zODYsIDB9LHsgIDExNTEsIDB9LAoreyAgLTg5NywgMH0seyAgMTE1MCwgMH0seyAgLTg5OCwgMH0seyAgMjE3NSwgMH0seyAtMTkyMSwgMH0seyAgMjE3NCwgMH0seyAtMTkyMiwgMH0seyAgNDIyMywgMH0sCit7IC0zOTY5LCAwfSx7ICA0MjIyLCAwfSx7IC0zOTcwLCAwfSx7ICA4MzE5LCAwfSx7IC04MDY1LCAwfSx7ICA4MzE4LCAwfSx7IC04MDY2LCAwfSx7IDE2NTExLCAwfSwKK3stMTYyNTcsIDB9LHsgMTY1MTAsIDB9LHstMTYyNTgsIDB9LHsgMzI4OTUsIDB9LHstMzI2NDEsIDB9LHsgMzI4OTQsIDB9LHstMzI2NDIsIDB9LHsgIC0xMjgsIDB9LAoreyAgLTEzMCwgMX0seyAgLTEyOSwgMH0seyAgLTEzMSwgMX0seyAgLTEyNywgMH0seyAgLTEzMSwgMX0seyAgLTEyOCwgMH0seyAgLTEzMiwgMX0seyAgLTEyNSwgMH0sCit7ICAtMTMzLCAxfSx7ICAtMTI2LCAwfSx7ICAtMTM0LCAxfSx7ICAtMTIxLCAwfSx7ICAtMTM3LCAxfSx7ICAtMTIyLCAwfSx7ICAtMTM4LCAxfSx7ICAtMTEzLCAwfSwKK3sgIC0xNDUsIDF9LHsgIC0xMTQsIDB9LHsgIC0xNDYsIDF9LHsgICAtOTcsIDB9LHsgIC0xNjEsIDF9LHsgICAtOTgsIDB9LHsgIC0xNjIsIDF9LHsgICAtNjUsIDB9LAoreyAgLTE5MywgMX0seyAgIC02NiwgMH0seyAgLTE5NCwgMX0seyAgICAtMSwgMH0seyAgLTI1NywgMX0seyAgICAtMiwgMH0seyAgLTI1OCwgMX0seyAgIDEyNywgMX0sCit7ICAtMzg1LCAxfSx7ICAgMTI2LCAxfSx7ICAtMzg2LCAxfSx7ICAgMzgzLCAxfSx7ICAtNjQxLCAxfSx7ICAgMzgyLCAxfSx7ICAtNjQyLCAxfSx7ICAgODk1LCAxfSwKK3sgLTExNTMsIDF9LHsgICA4OTQsIDF9LHsgLTExNTQsIDF9LHsgIDE5MTksIDF9LHsgLTIxNzcsIDF9LHsgIDE5MTgsIDF9LHsgLTIxNzgsIDF9LHsgIDM5NjcsIDF9LAoreyAtNDIyNSwgMX0seyAgMzk2NiwgMX0seyAtNDIyNiwgMX0seyAgODA2MywgMX0seyAtODMyMSwgMX0seyAgODA2MiwgMX0seyAtODMyMiwgMX0seyAxNjI1NSwgMX0sCit7LTE2NTEzLCAxfSx7IDE2MjU0LCAxfSx7LTE2NTE0LCAxfSx7IDMyNjM5LCAxfSx7LTMyODk3LCAxfSx7IDMyNjM4LCAxfSx7LTMyODk4LCAxfSx7ICAgMjU3LCAwfSwKK3sgICAyNTUsIDF9LHsgICAyNTYsIDB9LHsgICAyNTQsIDF9LHsgICAyNTgsIDB9LHsgICAyNTQsIDF9LHsgICAyNTcsIDB9LHsgICAyNTMsIDF9LHsgICAyNjAsIDB9LAoreyAgIDI1MiwgMX0seyAgIDI1OSwgMH0seyAgIDI1MSwgMX0seyAgIDI2NCwgMH0seyAgIDI0OCwgMX0seyAgIDI2MywgMH0seyAgIDI0NywgMX0seyAgIDI3MiwgMH0sCit7ICAgMjQwLCAxfSx7ICAgMjcxLCAwfSx7ICAgMjM5LCAxfSx7ICAgMjg4LCAwfSx7ICAgMjI0LCAxfSx7ICAgMjg3LCAwfSx7ICAgMjIzLCAxfSx7ICAgMzIwLCAwfSwKK3sgICAxOTIsIDF9LHsgICAzMTksIDB9LHsgICAxOTEsIDF9LHsgICAzODQsIDB9LHsgICAxMjgsIDF9LHsgICAzODMsIDB9LHsgICAxMjcsIDF9LHsgICA1MTIsIDB9LAoreyAgICAgMCwgMX0seyAgIDUxMSwgMH0seyAgICAtMSwgMH0seyAgIDc2OCwgMH0seyAgLTI1NiwgMH0seyAgIDc2NywgMH0seyAgLTI1NywgMH0seyAgMTI4MCwgMH0sCit7ICAtNzY4LCAwfSx7ICAxMjc5LCAwfSx7ICAtNzY5LCAwfSx7ICAyMzA0LCAwfSx7IC0xNzkyLCAwfSx7ICAyMzAzLCAwfSx7IC0xNzkzLCAwfSx7ICA0MzUyLCAwfSwKK3sgLTM4NDAsIDB9LHsgIDQzNTEsIDB9LHsgLTM4NDEsIDB9LHsgIDg0NDgsIDB9LHsgLTc5MzYsIDB9LHsgIDg0NDcsIDB9LHsgLTc5MzcsIDB9LHsgMTY2NDAsIDB9LAorey0xNjEyOCwgMH0seyAxNjYzOSwgMH0sey0xNjEyOSwgMH0seyAzMzAyNCwgMH0sey0zMjUxMiwgMH0seyAzMzAyMywgMH0sey0zMjUxMywgMH0seyAgLTI1NSwgMH0sCit7ICAtMjU3LCAxfSx7ICAtMjU2LCAwfSx7ICAtMjU4LCAxfSx7ICAtMjU0LCAwfSx7ICAtMjU4LCAxfSx7ICAtMjU1LCAwfSx7ICAtMjU5LCAxfSx7ICAtMjUyLCAwfSwKK3sgIC0yNjAsIDF9LHsgIC0yNTMsIDB9LHsgIC0yNjEsIDF9LHsgIC0yNDgsIDB9LHsgIC0yNjQsIDF9LHsgIC0yNDksIDB9LHsgIC0yNjUsIDF9LHsgIC0yNDAsIDB9LAoreyAgLTI3MiwgMX0seyAgLTI0MSwgMH0seyAgLTI3MywgMX0seyAgLTIyNCwgMH0seyAgLTI4OCwgMX0seyAgLTIyNSwgMH0seyAgLTI4OSwgMX0seyAgLTE5MiwgMH0sCit7ICAtMzIwLCAxfSx7ICAtMTkzLCAwfSx7ICAtMzIxLCAxfSx7ICAtMTI4LCAwfSx7ICAtMzg0LCAxfSx7ICAtMTI5LCAwfSx7ICAtMzg1LCAxfSx7ICAgICAwLCAxfSwKK3sgIC01MTIsIDF9LHsgICAgLTEsIDB9LHsgIC01MTMsIDF9LHsgICAyNTYsIDF9LHsgIC03NjgsIDF9LHsgICAyNTUsIDF9LHsgIC03NjksIDF9LHsgICA3NjgsIDF9LAoreyAtMTI4MCwgMX0seyAgIDc2NywgMX0seyAtMTI4MSwgMX0seyAgMTc5MiwgMX0seyAtMjMwNCwgMX0seyAgMTc5MSwgMX0seyAtMjMwNSwgMX0seyAgMzg0MCwgMX0sCit7IC00MzUyLCAxfSx7ICAzODM5LCAxfSx7IC00MzUzLCAxfSx7ICA3OTM2LCAxfSx7IC04NDQ4LCAxfSx7ICA3OTM1LCAxfSx7IC04NDQ5LCAxfSx7IDE2MTI4LCAxfSwKK3stMTY2NDAsIDF9LHsgMTYxMjcsIDF9LHstMTY2NDEsIDF9LHsgMzI1MTIsIDF9LHstMzMwMjQsIDF9LHsgMzI1MTEsIDF9LHstMzMwMjUsIDF9LHsgICAyNTYsIDB9LAoreyAgIDI1NCwgMX0seyAgIDI1NSwgMH0seyAgIDI1MywgMX0seyAgIDI1NywgMH0seyAgIDI1MywgMX0seyAgIDI1NiwgMH0seyAgIDI1MiwgMX0seyAgIDI1OSwgMH0sCit7ICAgMjUxLCAxfSx7ICAgMjU4LCAwfSx7ICAgMjUwLCAxfSx7ICAgMjYzLCAwfSx7ICAgMjQ3LCAxfSx7ICAgMjYyLCAwfSx7ICAgMjQ2LCAxfSx7ICAgMjcxLCAwfSwKK3sgICAyMzksIDF9LHsgICAyNzAsIDB9LHsgICAyMzgsIDF9LHsgICAyODcsIDB9LHsgICAyMjMsIDF9LHsgICAyODYsIDB9LHsgICAyMjIsIDF9LHsgICAzMTksIDB9LAoreyAgIDE5MSwgMX0seyAgIDMxOCwgMH0seyAgIDE5MCwgMX0seyAgIDM4MywgMH0seyAgIDEyNywgMX0seyAgIDM4MiwgMH0seyAgIDEyNiwgMX0seyAgIDUxMSwgMH0sCit7ICAgIC0xLCAwfSx7ICAgNTEwLCAwfSx7ICAgIC0yLCAwfSx7ICAgNzY3LCAwfSx7ICAtMjU3LCAwfSx7ICAgNzY2LCAwfSx7ICAtMjU4LCAwfSx7ICAxMjc5LCAwfSwKK3sgIC03NjksIDB9LHsgIDEyNzgsIDB9LHsgIC03NzAsIDB9LHsgIDIzMDMsIDB9LHsgLTE3OTMsIDB9LHsgIDIzMDIsIDB9LHsgLTE3OTQsIDB9LHsgIDQzNTEsIDB9LAoreyAtMzg0MSwgMH0seyAgNDM1MCwgMH0seyAtMzg0MiwgMH0seyAgODQ0NywgMH0seyAtNzkzNywgMH0seyAgODQ0NiwgMH0seyAtNzkzOCwgMH0seyAxNjYzOSwgMH0sCit7LTE2MTI5LCAwfSx7IDE2NjM4LCAwfSx7LTE2MTMwLCAwfSx7IDMzMDIzLCAwfSx7LTMyNTEzLCAwfSx7IDMzMDIyLCAwfSx7LTMyNTE0LCAwfSx7ICAtMjU2LCAwfSwKK3sgIC0yNTgsIDF9LHsgIC0yNTcsIDB9LHsgIC0yNTksIDF9LHsgIC0yNTUsIDB9LHsgIC0yNTksIDF9LHsgIC0yNTYsIDB9LHsgIC0yNjAsIDF9LHsgIC0yNTMsIDB9LAoreyAgLTI2MSwgMX0seyAgLTI1NCwgMH0seyAgLTI2MiwgMX0seyAgLTI0OSwgMH0seyAgLTI2NSwgMX0seyAgLTI1MCwgMH0seyAgLTI2NiwgMX0seyAgLTI0MSwgMH0sCit7ICAtMjczLCAxfSx7ICAtMjQyLCAwfSx7ICAtMjc0LCAxfSx7ICAtMjI1LCAwfSx7ICAtMjg5LCAxfSx7ICAtMjI2LCAwfSx7ICAtMjkwLCAxfSx7ICAtMTkzLCAwfSwKK3sgIC0zMjEsIDF9LHsgIC0xOTQsIDB9LHsgIC0zMjIsIDF9LHsgIC0xMjksIDB9LHsgIC0zODUsIDF9LHsgIC0xMzAsIDB9LHsgIC0zODYsIDF9LHsgICAgLTEsIDB9LAoreyAgLTUxMywgMX0seyAgICAtMiwgMH0seyAgLTUxNCwgMX0seyAgIDI1NSwgMX0seyAgLTc2OSwgMX0seyAgIDI1NCwgMX0seyAgLTc3MCwgMX0seyAgIDc2NywgMX0sCit7IC0xMjgxLCAxfSx7ICAgNzY2LCAxfSx7IC0xMjgyLCAxfSx7ICAxNzkxLCAxfSx7IC0yMzA1LCAxfSx7ICAxNzkwLCAxfSx7IC0yMzA2LCAxfSx7ICAzODM5LCAxfSwKK3sgLTQzNTMsIDF9LHsgIDM4MzgsIDF9LHsgLTQzNTQsIDF9LHsgIDc5MzUsIDF9LHsgLTg0NDksIDF9LHsgIDc5MzQsIDF9LHsgLTg0NTAsIDF9LHsgMTYxMjcsIDF9LAorey0xNjY0MSwgMX0seyAxNjEyNiwgMX0sey0xNjY0MiwgMX0seyAzMjUxMSwgMX0sey0zMzAyNSwgMX0seyAzMjUxMCwgMX0sey0zMzAyNiwgMX0seyAgIDUxMywgMH0sCit7ICAgNTExLCAxfSx7ICAgNTEyLCAwfSx7ICAgNTEwLCAxfSx7ICAgNTE0LCAwfSx7ICAgNTEwLCAxfSx7ICAgNTEzLCAwfSx7ICAgNTA5LCAxfSx7ICAgNTE2LCAwfSwKK3sgICA1MDgsIDF9LHsgICA1MTUsIDB9LHsgICA1MDcsIDF9LHsgICA1MjAsIDB9LHsgICA1MDQsIDF9LHsgICA1MTksIDB9LHsgICA1MDMsIDF9LHsgICA1MjgsIDB9LAoreyAgIDQ5NiwgMX0seyAgIDUyNywgMH0seyAgIDQ5NSwgMX0seyAgIDU0NCwgMH0seyAgIDQ4MCwgMX0seyAgIDU0MywgMH0seyAgIDQ3OSwgMX0seyAgIDU3NiwgMH0sCit7ICAgNDQ4LCAxfSx7ICAgNTc1LCAwfSx7ICAgNDQ3LCAxfSx7ICAgNjQwLCAwfSx7ICAgMzg0LCAxfSx7ICAgNjM5LCAwfSx7ICAgMzgzLCAxfSx7ICAgNzY4LCAwfSwKK3sgICAyNTYsIDF9LHsgICA3NjcsIDB9LHsgICAyNTUsIDF9LHsgIDEwMjQsIDB9LHsgICAgIDAsIDF9LHsgIDEwMjMsIDB9LHsgICAgLTEsIDB9LHsgIDE1MzYsIDB9LAoreyAgLTUxMiwgMH0seyAgMTUzNSwgMH0seyAgLTUxMywgMH0seyAgMjU2MCwgMH0seyAtMTUzNiwgMH0seyAgMjU1OSwgMH0seyAtMTUzNywgMH0seyAgNDYwOCwgMH0sCit7IC0zNTg0LCAwfSx7ICA0NjA3LCAwfSx7IC0zNTg1LCAwfSx7ICA4NzA0LCAwfSx7IC03NjgwLCAwfSx7ICA4NzAzLCAwfSx7IC03NjgxLCAwfSx7IDE2ODk2LCAwfSwKK3stMTU4NzIsIDB9LHsgMTY4OTUsIDB9LHstMTU4NzMsIDB9LHsgMzMyODAsIDB9LHstMzIyNTYsIDB9LHsgMzMyNzksIDB9LHstMzIyNTcsIDB9LHsgIC01MTEsIDB9LAoreyAgLTUxMywgMX0seyAgLTUxMiwgMH0seyAgLTUxNCwgMX0seyAgLTUxMCwgMH0seyAgLTUxNCwgMX0seyAgLTUxMSwgMH0seyAgLTUxNSwgMX0seyAgLTUwOCwgMH0sCit7ICAtNTE2LCAxfSx7ICAtNTA5LCAwfSx7ICAtNTE3LCAxfSx7ICAtNTA0LCAwfSx7ICAtNTIwLCAxfSx7ICAtNTA1LCAwfSx7ICAtNTIxLCAxfSx7ICAtNDk2LCAwfSwKK3sgIC01MjgsIDF9LHsgIC00OTcsIDB9LHsgIC01MjksIDF9LHsgIC00ODAsIDB9LHsgIC01NDQsIDF9LHsgIC00ODEsIDB9LHsgIC01NDUsIDF9LHsgIC00NDgsIDB9LAoreyAgLTU3NiwgMX0seyAgLTQ0OSwgMH0seyAgLTU3NywgMX0seyAgLTM4NCwgMH0seyAgLTY0MCwgMX0seyAgLTM4NSwgMH0seyAgLTY0MSwgMX0seyAgLTI1NiwgMH0sCit7ICAtNzY4LCAxfSx7ICAtMjU3LCAwfSx7ICAtNzY5LCAxfSx7ICAgICAwLCAxfSx7IC0xMDI0LCAxfSx7ICAgIC0xLCAwfSx7IC0xMDI1LCAxfSx7ICAgNTEyLCAxfSwKK3sgLTE1MzYsIDF9LHsgICA1MTEsIDF9LHsgLTE1MzcsIDF9LHsgIDE1MzYsIDF9LHsgLTI1NjAsIDF9LHsgIDE1MzUsIDF9LHsgLTI1NjEsIDF9LHsgIDM1ODQsIDF9LAoreyAtNDYwOCwgMX0seyAgMzU4MywgMX0seyAtNDYwOSwgMX0seyAgNzY4MCwgMX0seyAtODcwNCwgMX0seyAgNzY3OSwgMX0seyAtODcwNSwgMX0seyAxNTg3MiwgMX0sCit7LTE2ODk2LCAxfSx7IDE1ODcxLCAxfSx7LTE2ODk3LCAxfSx7IDMyMjU2LCAxfSx7LTMzMjgwLCAxfSx7IDMyMjU1LCAxfSx7LTMzMjgxLCAxfSx7ICAgNTEyLCAwfSwKK3sgICA1MTAsIDF9LHsgICA1MTEsIDB9LHsgICA1MDksIDF9LHsgICA1MTMsIDB9LHsgICA1MDksIDF9LHsgICA1MTIsIDB9LHsgICA1MDgsIDF9LHsgICA1MTUsIDB9LAoreyAgIDUwNywgMX0seyAgIDUxNCwgMH0seyAgIDUwNiwgMX0seyAgIDUxOSwgMH0seyAgIDUwMywgMX0seyAgIDUxOCwgMH0seyAgIDUwMiwgMX0seyAgIDUyNywgMH0sCit7ICAgNDk1LCAxfSx7ICAgNTI2LCAwfSx7ICAgNDk0LCAxfSx7ICAgNTQzLCAwfSx7ICAgNDc5LCAxfSx7ICAgNTQyLCAwfSx7ICAgNDc4LCAxfSx7ICAgNTc1LCAwfSwKK3sgICA0NDcsIDF9LHsgICA1NzQsIDB9LHsgICA0NDYsIDF9LHsgICA2MzksIDB9LHsgICAzODMsIDF9LHsgICA2MzgsIDB9LHsgICAzODIsIDF9LHsgICA3NjcsIDB9LAoreyAgIDI1NSwgMX0seyAgIDc2NiwgMH0seyAgIDI1NCwgMX0seyAgMTAyMywgMH0seyAgICAtMSwgMH0seyAgMTAyMiwgMH0seyAgICAtMiwgMH0seyAgMTUzNSwgMH0sCit7ICAtNTEzLCAwfSx7ICAxNTM0LCAwfSx7ICAtNTE0LCAwfSx7ICAyNTU5LCAwfSx7IC0xNTM3LCAwfSx7ICAyNTU4LCAwfSx7IC0xNTM4LCAwfSx7ICA0NjA3LCAwfSwKK3sgLTM1ODUsIDB9LHsgIDQ2MDYsIDB9LHsgLTM1ODYsIDB9LHsgIDg3MDMsIDB9LHsgLTc2ODEsIDB9LHsgIDg3MDIsIDB9LHsgLTc2ODIsIDB9LHsgMTY4OTUsIDB9LAorey0xNTg3MywgMH0seyAxNjg5NCwgMH0sey0xNTg3NCwgMH0seyAzMzI3OSwgMH0sey0zMjI1NywgMH0seyAzMzI3OCwgMH0sey0zMjI1OCwgMH0seyAgLTUxMiwgMH0sCit7ICAtNTE0LCAxfSx7ICAtNTEzLCAwfSx7ICAtNTE1LCAxfSx7ICAtNTExLCAwfSx7ICAtNTE1LCAxfSx7ICAtNTEyLCAwfSx7ICAtNTE2LCAxfSx7ICAtNTA5LCAwfSwKK3sgIC01MTcsIDF9LHsgIC01MTAsIDB9LHsgIC01MTgsIDF9LHsgIC01MDUsIDB9LHsgIC01MjEsIDF9LHsgIC01MDYsIDB9LHsgIC01MjIsIDF9LHsgIC00OTcsIDB9LAoreyAgLTUyOSwgMX0seyAgLTQ5OCwgMH0seyAgLTUzMCwgMX0seyAgLTQ4MSwgMH0seyAgLTU0NSwgMX0seyAgLTQ4MiwgMH0seyAgLTU0NiwgMX0seyAgLTQ0OSwgMH0sCit7ICAtNTc3LCAxfSx7ICAtNDUwLCAwfSx7ICAtNTc4LCAxfSx7ICAtMzg1LCAwfSx7ICAtNjQxLCAxfSx7ICAtMzg2LCAwfSx7ICAtNjQyLCAxfSx7ICAtMjU3LCAwfSwKK3sgIC03NjksIDF9LHsgIC0yNTgsIDB9LHsgIC03NzAsIDF9LHsgICAgLTEsIDB9LHsgLTEwMjUsIDF9LHsgICAgLTIsIDB9LHsgLTEwMjYsIDF9LHsgICA1MTEsIDF9LAoreyAtMTUzNywgMX0seyAgIDUxMCwgMX0seyAtMTUzOCwgMX0seyAgMTUzNSwgMX0seyAtMjU2MSwgMX0seyAgMTUzNCwgMX0seyAtMjU2MiwgMX0seyAgMzU4MywgMX0sCit7IC00NjA5LCAxfSx7ICAzNTgyLCAxfSx7IC00NjEwLCAxfSx7ICA3Njc5LCAxfSx7IC04NzA1LCAxfSx7ICA3Njc4LCAxfSx7IC04NzA2LCAxfSx7IDE1ODcxLCAxfSwKK3stMTY4OTcsIDF9LHsgMTU4NzAsIDF9LHstMTY4OTgsIDF9LHsgMzIyNTUsIDF9LHstMzMyODEsIDF9LHsgMzIyNTQsIDF9LHstMzMyODIsIDF9LHsgIDEwMjUsIDB9LAoreyAgMTAyMywgMX0seyAgMTAyNCwgMH0seyAgMTAyMiwgMX0seyAgMTAyNiwgMH0seyAgMTAyMiwgMX0seyAgMTAyNSwgMH0seyAgMTAyMSwgMX0seyAgMTAyOCwgMH0sCit7ICAxMDIwLCAxfSx7ICAxMDI3LCAwfSx7ICAxMDE5LCAxfSx7ICAxMDMyLCAwfSx7ICAxMDE2LCAxfSx7ICAxMDMxLCAwfSx7ICAxMDE1LCAxfSx7ICAxMDQwLCAwfSwKK3sgIDEwMDgsIDF9LHsgIDEwMzksIDB9LHsgIDEwMDcsIDF9LHsgIDEwNTYsIDB9LHsgICA5OTIsIDF9LHsgIDEwNTUsIDB9LHsgICA5OTEsIDF9LHsgIDEwODgsIDB9LAoreyAgIDk2MCwgMX0seyAgMTA4NywgMH0seyAgIDk1OSwgMX0seyAgMTE1MiwgMH0seyAgIDg5NiwgMX0seyAgMTE1MSwgMH0seyAgIDg5NSwgMX0seyAgMTI4MCwgMH0sCit7ICAgNzY4LCAxfSx7ICAxMjc5LCAwfSx7ICAgNzY3LCAxfSx7ICAxNTM2LCAwfSx7ICAgNTEyLCAxfSx7ICAxNTM1LCAwfSx7ICAgNTExLCAxfSx7ICAyMDQ4LCAwfSwKK3sgICAgIDAsIDF9LHsgIDIwNDcsIDB9LHsgICAgLTEsIDB9LHsgIDMwNzIsIDB9LHsgLTEwMjQsIDB9LHsgIDMwNzEsIDB9LHsgLTEwMjUsIDB9LHsgIDUxMjAsIDB9LAoreyAtMzA3MiwgMH0seyAgNTExOSwgMH0seyAtMzA3MywgMH0seyAgOTIxNiwgMH0seyAtNzE2OCwgMH0seyAgOTIxNSwgMH0seyAtNzE2OSwgMH0seyAxNzQwOCwgMH0sCit7LTE1MzYwLCAwfSx7IDE3NDA3LCAwfSx7LTE1MzYxLCAwfSx7IDMzNzkyLCAwfSx7LTMxNzQ0LCAwfSx7IDMzNzkxLCAwfSx7LTMxNzQ1LCAwfSx7IC0xMDIzLCAwfSwKK3sgLTEwMjUsIDF9LHsgLTEwMjQsIDB9LHsgLTEwMjYsIDF9LHsgLTEwMjIsIDB9LHsgLTEwMjYsIDF9LHsgLTEwMjMsIDB9LHsgLTEwMjcsIDF9LHsgLTEwMjAsIDB9LAoreyAtMTAyOCwgMX0seyAtMTAyMSwgMH0seyAtMTAyOSwgMX0seyAtMTAxNiwgMH0seyAtMTAzMiwgMX0seyAtMTAxNywgMH0seyAtMTAzMywgMX0seyAtMTAwOCwgMH0sCit7IC0xMDQwLCAxfSx7IC0xMDA5LCAwfSx7IC0xMDQxLCAxfSx7ICAtOTkyLCAwfSx7IC0xMDU2LCAxfSx7ICAtOTkzLCAwfSx7IC0xMDU3LCAxfSx7ICAtOTYwLCAwfSwKK3sgLTEwODgsIDF9LHsgIC05NjEsIDB9LHsgLTEwODksIDF9LHsgIC04OTYsIDB9LHsgLTExNTIsIDF9LHsgIC04OTcsIDB9LHsgLTExNTMsIDF9LHsgIC03NjgsIDB9LAoreyAtMTI4MCwgMX0seyAgLTc2OSwgMH0seyAtMTI4MSwgMX0seyAgLTUxMiwgMH0seyAtMTUzNiwgMX0seyAgLTUxMywgMH0seyAtMTUzNywgMX0seyAgICAgMCwgMX0sCit7IC0yMDQ4LCAxfSx7ICAgIC0xLCAwfSx7IC0yMDQ5LCAxfSx7ICAxMDI0LCAxfSx7IC0zMDcyLCAxfSx7ICAxMDIzLCAxfSx7IC0zMDczLCAxfSx7ICAzMDcyLCAxfSwKK3sgLTUxMjAsIDF9LHsgIDMwNzEsIDF9LHsgLTUxMjEsIDF9LHsgIDcxNjgsIDF9LHsgLTkyMTYsIDF9LHsgIDcxNjcsIDF9LHsgLTkyMTcsIDF9LHsgMTUzNjAsIDF9LAorey0xNzQwOCwgMX0seyAxNTM1OSwgMX0sey0xNzQwOSwgMX0seyAzMTc0NCwgMX0sey0zMzc5MiwgMX0seyAzMTc0MywgMX0sey0zMzc5MywgMX0seyAgMTAyNCwgMH0sCit7ICAxMDIyLCAxfSx7ICAxMDIzLCAwfSx7ICAxMDIxLCAxfSx7ICAxMDI1LCAwfSx7ICAxMDIxLCAxfSx7ICAxMDI0LCAwfSx7ICAxMDIwLCAxfSx7ICAxMDI3LCAwfSwKK3sgIDEwMTksIDF9LHsgIDEwMjYsIDB9LHsgIDEwMTgsIDF9LHsgIDEwMzEsIDB9LHsgIDEwMTUsIDF9LHsgIDEwMzAsIDB9LHsgIDEwMTQsIDF9LHsgIDEwMzksIDB9LAoreyAgMTAwNywgMX0seyAgMTAzOCwgMH0seyAgMTAwNiwgMX0seyAgMTA1NSwgMH0seyAgIDk5MSwgMX0seyAgMTA1NCwgMH0seyAgIDk5MCwgMX0seyAgMTA4NywgMH0sCit7ICAgOTU5LCAxfSx7ICAxMDg2LCAwfSx7ICAgOTU4LCAxfSx7ICAxMTUxLCAwfSx7ICAgODk1LCAxfSx7ICAxMTUwLCAwfSx7ICAgODk0LCAxfSx7ICAxMjc5LCAwfSwKK3sgICA3NjcsIDF9LHsgIDEyNzgsIDB9LHsgICA3NjYsIDF9LHsgIDE1MzUsIDB9LHsgICA1MTEsIDF9LHsgIDE1MzQsIDB9LHsgICA1MTAsIDF9LHsgIDIwNDcsIDB9LAoreyAgICAtMSwgMH0seyAgMjA0NiwgMH0seyAgICAtMiwgMH0seyAgMzA3MSwgMH0seyAtMTAyNSwgMH0seyAgMzA3MCwgMH0seyAtMTAyNiwgMH0seyAgNTExOSwgMH0sCit7IC0zMDczLCAwfSx7ICA1MTE4LCAwfSx7IC0zMDc0LCAwfSx7ICA5MjE1LCAwfSx7IC03MTY5LCAwfSx7ICA5MjE0LCAwfSx7IC03MTcwLCAwfSx7IDE3NDA3LCAwfSwKK3stMTUzNjEsIDB9LHsgMTc0MDYsIDB9LHstMTUzNjIsIDB9LHsgMzM3OTEsIDB9LHstMzE3NDUsIDB9LHsgMzM3OTAsIDB9LHstMzE3NDYsIDB9LHsgLTEwMjQsIDB9LAoreyAtMTAyNiwgMX0seyAtMTAyNSwgMH0seyAtMTAyNywgMX0seyAtMTAyMywgMH0seyAtMTAyNywgMX0seyAtMTAyNCwgMH0seyAtMTAyOCwgMX0seyAtMTAyMSwgMH0sCit7IC0xMDI5LCAxfSx7IC0xMDIyLCAwfSx7IC0xMDMwLCAxfSx7IC0xMDE3LCAwfSx7IC0xMDMzLCAxfSx7IC0xMDE4LCAwfSx7IC0xMDM0LCAxfSx7IC0xMDA5LCAwfSwKK3sgLTEwNDEsIDF9LHsgLTEwMTAsIDB9LHsgLTEwNDIsIDF9LHsgIC05OTMsIDB9LHsgLTEwNTcsIDF9LHsgIC05OTQsIDB9LHsgLTEwNTgsIDF9LHsgIC05NjEsIDB9LAoreyAtMTA4OSwgMX0seyAgLTk2MiwgMH0seyAtMTA5MCwgMX0seyAgLTg5NywgMH0seyAtMTE1MywgMX0seyAgLTg5OCwgMH0seyAtMTE1NCwgMX0seyAgLTc2OSwgMH0sCit7IC0xMjgxLCAxfSx7ICAtNzcwLCAwfSx7IC0xMjgyLCAxfSx7ICAtNTEzLCAwfSx7IC0xNTM3LCAxfSx7ICAtNTE0LCAwfSx7IC0xNTM4LCAxfSx7ICAgIC0xLCAwfSwKK3sgLTIwNDksIDF9LHsgICAgLTIsIDB9LHsgLTIwNTAsIDF9LHsgIDEwMjMsIDF9LHsgLTMwNzMsIDF9LHsgIDEwMjIsIDF9LHsgLTMwNzQsIDF9LHsgIDMwNzEsIDF9LAoreyAtNTEyMSwgMX0seyAgMzA3MCwgMX0seyAtNTEyMiwgMX0seyAgNzE2NywgMX0seyAtOTIxNywgMX0seyAgNzE2NiwgMX0seyAtOTIxOCwgMX0seyAxNTM1OSwgMX0sCit7LTE3NDA5LCAxfSx7IDE1MzU4LCAxfSx7LTE3NDEwLCAxfSx7IDMxNzQzLCAxfSx7LTMzNzkzLCAxfSx7IDMxNzQyLCAxfSx7LTMzNzk0LCAxfSx7ICAyMDQ5LCAwfSwKK3sgIDIwNDcsIDF9LHsgIDIwNDgsIDB9LHsgIDIwNDYsIDF9LHsgIDIwNTAsIDB9LHsgIDIwNDYsIDF9LHsgIDIwNDksIDB9LHsgIDIwNDUsIDF9LHsgIDIwNTIsIDB9LAoreyAgMjA0NCwgMX0seyAgMjA1MSwgMH0seyAgMjA0MywgMX0seyAgMjA1NiwgMH0seyAgMjA0MCwgMX0seyAgMjA1NSwgMH0seyAgMjAzOSwgMX0seyAgMjA2NCwgMH0sCit7ICAyMDMyLCAxfSx7ICAyMDYzLCAwfSx7ICAyMDMxLCAxfSx7ICAyMDgwLCAwfSx7ICAyMDE2LCAxfSx7ICAyMDc5LCAwfSx7ICAyMDE1LCAxfSx7ICAyMTEyLCAwfSwKK3sgIDE5ODQsIDF9LHsgIDIxMTEsIDB9LHsgIDE5ODMsIDF9LHsgIDIxNzYsIDB9LHsgIDE5MjAsIDF9LHsgIDIxNzUsIDB9LHsgIDE5MTksIDF9LHsgIDIzMDQsIDB9LAoreyAgMTc5MiwgMX0seyAgMjMwMywgMH0seyAgMTc5MSwgMX0seyAgMjU2MCwgMH0seyAgMTUzNiwgMX0seyAgMjU1OSwgMH0seyAgMTUzNSwgMX0seyAgMzA3MiwgMH0sCit7ICAxMDI0LCAxfSx7ICAzMDcxLCAwfSx7ICAxMDIzLCAxfSx7ICA0MDk2LCAwfSx7ICAgICAwLCAxfSx7ICA0MDk1LCAwfSx7ICAgIC0xLCAwfSx7ICA2MTQ0LCAwfSwKK3sgLTIwNDgsIDB9LHsgIDYxNDMsIDB9LHsgLTIwNDksIDB9LHsgMTAyNDAsIDB9LHsgLTYxNDQsIDB9LHsgMTAyMzksIDB9LHsgLTYxNDUsIDB9LHsgMTg0MzIsIDB9LAorey0xNDMzNiwgMH0seyAxODQzMSwgMH0sey0xNDMzNywgMH0seyAzNDgxNiwgMH0sey0zMDcyMCwgMH0seyAzNDgxNSwgMH0sey0zMDcyMSwgMH0seyAtMjA0NywgMH0sCit7IC0yMDQ5LCAxfSx7IC0yMDQ4LCAwfSx7IC0yMDUwLCAxfSx7IC0yMDQ2LCAwfSx7IC0yMDUwLCAxfSx7IC0yMDQ3LCAwfSx7IC0yMDUxLCAxfSx7IC0yMDQ0LCAwfSwKK3sgLTIwNTIsIDF9LHsgLTIwNDUsIDB9LHsgLTIwNTMsIDF9LHsgLTIwNDAsIDB9LHsgLTIwNTYsIDF9LHsgLTIwNDEsIDB9LHsgLTIwNTcsIDF9LHsgLTIwMzIsIDB9LAoreyAtMjA2NCwgMX0seyAtMjAzMywgMH0seyAtMjA2NSwgMX0seyAtMjAxNiwgMH0seyAtMjA4MCwgMX0seyAtMjAxNywgMH0seyAtMjA4MSwgMX0seyAtMTk4NCwgMH0sCit7IC0yMTEyLCAxfSx7IC0xOTg1LCAwfSx7IC0yMTEzLCAxfSx7IC0xOTIwLCAwfSx7IC0yMTc2LCAxfSx7IC0xOTIxLCAwfSx7IC0yMTc3LCAxfSx7IC0xNzkyLCAwfSwKK3sgLTIzMDQsIDF9LHsgLTE3OTMsIDB9LHsgLTIzMDUsIDF9LHsgLTE1MzYsIDB9LHsgLTI1NjAsIDF9LHsgLTE1MzcsIDB9LHsgLTI1NjEsIDF9LHsgLTEwMjQsIDB9LAoreyAtMzA3MiwgMX0seyAtMTAyNSwgMH0seyAtMzA3MywgMX0seyAgICAgMCwgMX0seyAtNDA5NiwgMX0seyAgICAtMSwgMH0seyAtNDA5NywgMX0seyAgMjA0OCwgMX0sCit7IC02MTQ0LCAxfSx7ICAyMDQ3LCAxfSx7IC02MTQ1LCAxfSx7ICA2MTQ0LCAxfSx7LTEwMjQwLCAxfSx7ICA2MTQzLCAxfSx7LTEwMjQxLCAxfSx7IDE0MzM2LCAxfSwKK3stMTg0MzIsIDF9LHsgMTQzMzUsIDF9LHstMTg0MzMsIDF9LHsgMzA3MjAsIDF9LHstMzQ4MTYsIDF9LHsgMzA3MTksIDF9LHstMzQ4MTcsIDF9LHsgIDIwNDgsIDB9LAoreyAgMjA0NiwgMX0seyAgMjA0NywgMH0seyAgMjA0NSwgMX0seyAgMjA0OSwgMH0seyAgMjA0NSwgMX0seyAgMjA0OCwgMH0seyAgMjA0NCwgMX0seyAgMjA1MSwgMH0sCit7ICAyMDQzLCAxfSx7ICAyMDUwLCAwfSx7ICAyMDQyLCAxfSx7ICAyMDU1LCAwfSx7ICAyMDM5LCAxfSx7ICAyMDU0LCAwfSx7ICAyMDM4LCAxfSx7ICAyMDYzLCAwfSwKK3sgIDIwMzEsIDF9LHsgIDIwNjIsIDB9LHsgIDIwMzAsIDF9LHsgIDIwNzksIDB9LHsgIDIwMTUsIDF9LHsgIDIwNzgsIDB9LHsgIDIwMTQsIDF9LHsgIDIxMTEsIDB9LAoreyAgMTk4MywgMX0seyAgMjExMCwgMH0seyAgMTk4MiwgMX0seyAgMjE3NSwgMH0seyAgMTkxOSwgMX0seyAgMjE3NCwgMH0seyAgMTkxOCwgMX0seyAgMjMwMywgMH0sCit7ICAxNzkxLCAxfSx7ICAyMzAyLCAwfSx7ICAxNzkwLCAxfSx7ICAyNTU5LCAwfSx7ICAxNTM1LCAxfSx7ICAyNTU4LCAwfSx7ICAxNTM0LCAxfSx7ICAzMDcxLCAwfSwKK3sgIDEwMjMsIDF9LHsgIDMwNzAsIDB9LHsgIDEwMjIsIDF9LHsgIDQwOTUsIDB9LHsgICAgLTEsIDB9LHsgIDQwOTQsIDB9LHsgICAgLTIsIDB9LHsgIDYxNDMsIDB9LAoreyAtMjA0OSwgMH0seyAgNjE0MiwgMH0seyAtMjA1MCwgMH0seyAxMDIzOSwgMH0seyAtNjE0NSwgMH0seyAxMDIzOCwgMH0seyAtNjE0NiwgMH0seyAxODQzMSwgMH0sCit7LTE0MzM3LCAwfSx7IDE4NDMwLCAwfSx7LTE0MzM4LCAwfSx7IDM0ODE1LCAwfSx7LTMwNzIxLCAwfSx7IDM0ODE0LCAwfSx7LTMwNzIyLCAwfSx7IC0yMDQ4LCAwfSwKK3sgLTIwNTAsIDF9LHsgLTIwNDksIDB9LHsgLTIwNTEsIDF9LHsgLTIwNDcsIDB9LHsgLTIwNTEsIDF9LHsgLTIwNDgsIDB9LHsgLTIwNTIsIDF9LHsgLTIwNDUsIDB9LAoreyAtMjA1MywgMX0seyAtMjA0NiwgMH0seyAtMjA1NCwgMX0seyAtMjA0MSwgMH0seyAtMjA1NywgMX0seyAtMjA0MiwgMH0seyAtMjA1OCwgMX0seyAtMjAzMywgMH0sCit7IC0yMDY1LCAxfSx7IC0yMDM0LCAwfSx7IC0yMDY2LCAxfSx7IC0yMDE3LCAwfSx7IC0yMDgxLCAxfSx7IC0yMDE4LCAwfSx7IC0yMDgyLCAxfSx7IC0xOTg1LCAwfSwKK3sgLTIxMTMsIDF9LHsgLTE5ODYsIDB9LHsgLTIxMTQsIDF9LHsgLTE5MjEsIDB9LHsgLTIxNzcsIDF9LHsgLTE5MjIsIDB9LHsgLTIxNzgsIDF9LHsgLTE3OTMsIDB9LAoreyAtMjMwNSwgMX0seyAtMTc5NCwgMH0seyAtMjMwNiwgMX0seyAtMTUzNywgMH0seyAtMjU2MSwgMX0seyAtMTUzOCwgMH0seyAtMjU2MiwgMX0seyAtMTAyNSwgMH0sCit7IC0zMDczLCAxfSx7IC0xMDI2LCAwfSx7IC0zMDc0LCAxfSx7ICAgIC0xLCAwfSx7IC00MDk3LCAxfSx7ICAgIC0yLCAwfSx7IC00MDk4LCAxfSx7ICAyMDQ3LCAxfSwKK3sgLTYxNDUsIDF9LHsgIDIwNDYsIDF9LHsgLTYxNDYsIDF9LHsgIDYxNDMsIDF9LHstMTAyNDEsIDF9LHsgIDYxNDIsIDF9LHstMTAyNDIsIDF9LHsgMTQzMzUsIDF9LAorey0xODQzMywgMX0seyAxNDMzNCwgMX0sey0xODQzNCwgMX0seyAzMDcxOSwgMX0sey0zNDgxNywgMX0seyAzMDcxOCwgMX0sey0zNDgxOCwgMX0seyAgNDA5NywgMH0sCit7ICA0MDk1LCAxfSx7ICA0MDk2LCAwfSx7ICA0MDk0LCAxfSx7ICA0MDk4LCAwfSx7ICA0MDk0LCAxfSx7ICA0MDk3LCAwfSx7ICA0MDkzLCAxfSx7ICA0MTAwLCAwfSwKK3sgIDQwOTIsIDF9LHsgIDQwOTksIDB9LHsgIDQwOTEsIDF9LHsgIDQxMDQsIDB9LHsgIDQwODgsIDF9LHsgIDQxMDMsIDB9LHsgIDQwODcsIDF9LHsgIDQxMTIsIDB9LAoreyAgNDA4MCwgMX0seyAgNDExMSwgMH0seyAgNDA3OSwgMX0seyAgNDEyOCwgMH0seyAgNDA2NCwgMX0seyAgNDEyNywgMH0seyAgNDA2MywgMX0seyAgNDE2MCwgMH0sCit7ICA0MDMyLCAxfSx7ICA0MTU5LCAwfSx7ICA0MDMxLCAxfSx7ICA0MjI0LCAwfSx7ICAzOTY4LCAxfSx7ICA0MjIzLCAwfSx7ICAzOTY3LCAxfSx7ICA0MzUyLCAwfSwKK3sgIDM4NDAsIDF9LHsgIDQzNTEsIDB9LHsgIDM4MzksIDF9LHsgIDQ2MDgsIDB9LHsgIDM1ODQsIDF9LHsgIDQ2MDcsIDB9LHsgIDM1ODMsIDF9LHsgIDUxMjAsIDB9LAoreyAgMzA3MiwgMX0seyAgNTExOSwgMH0seyAgMzA3MSwgMX0seyAgNjE0NCwgMH0seyAgMjA0OCwgMX0seyAgNjE0MywgMH0seyAgMjA0NywgMX0seyAgODE5MiwgMH0sCit7ICAgICAwLCAxfSx7ICA4MTkxLCAwfSx7ICAgIC0xLCAwfSx7IDEyMjg4LCAwfSx7IC00MDk2LCAwfSx7IDEyMjg3LCAwfSx7IC00MDk3LCAwfSx7IDIwNDgwLCAwfSwKK3stMTIyODgsIDB9LHsgMjA0NzksIDB9LHstMTIyODksIDB9LHsgMzY4NjQsIDB9LHstMjg2NzIsIDB9LHsgMzY4NjMsIDB9LHstMjg2NzMsIDB9LHsgLTQwOTUsIDB9LAoreyAtNDA5NywgMX0seyAtNDA5NiwgMH0seyAtNDA5OCwgMX0seyAtNDA5NCwgMH0seyAtNDA5OCwgMX0seyAtNDA5NSwgMH0seyAtNDA5OSwgMX0seyAtNDA5MiwgMH0sCit7IC00MTAwLCAxfSx7IC00MDkzLCAwfSx7IC00MTAxLCAxfSx7IC00MDg4LCAwfSx7IC00MTA0LCAxfSx7IC00MDg5LCAwfSx7IC00MTA1LCAxfSx7IC00MDgwLCAwfSwKK3sgLTQxMTIsIDF9LHsgLTQwODEsIDB9LHsgLTQxMTMsIDF9LHsgLTQwNjQsIDB9LHsgLTQxMjgsIDF9LHsgLTQwNjUsIDB9LHsgLTQxMjksIDF9LHsgLTQwMzIsIDB9LAoreyAtNDE2MCwgMX0seyAtNDAzMywgMH0seyAtNDE2MSwgMX0seyAtMzk2OCwgMH0seyAtNDIyNCwgMX0seyAtMzk2OSwgMH0seyAtNDIyNSwgMX0seyAtMzg0MCwgMH0sCit7IC00MzUyLCAxfSx7IC0zODQxLCAwfSx7IC00MzUzLCAxfSx7IC0zNTg0LCAwfSx7IC00NjA4LCAxfSx7IC0zNTg1LCAwfSx7IC00NjA5LCAxfSx7IC0zMDcyLCAwfSwKK3sgLTUxMjAsIDF9LHsgLTMwNzMsIDB9LHsgLTUxMjEsIDF9LHsgLTIwNDgsIDB9LHsgLTYxNDQsIDF9LHsgLTIwNDksIDB9LHsgLTYxNDUsIDF9LHsgICAgIDAsIDF9LAoreyAtODE5MiwgMX0seyAgICAtMSwgMH0seyAtODE5MywgMX0seyAgNDA5NiwgMX0sey0xMjI4OCwgMX0seyAgNDA5NSwgMX0sey0xMjI4OSwgMX0seyAxMjI4OCwgMX0sCit7LTIwNDgwLCAxfSx7IDEyMjg3LCAxfSx7LTIwNDgxLCAxfSx7IDI4NjcyLCAxfSx7LTM2ODY0LCAxfSx7IDI4NjcxLCAxfSx7LTM2ODY1LCAxfSx7ICA0MDk2LCAwfSwKK3sgIDQwOTQsIDF9LHsgIDQwOTUsIDB9LHsgIDQwOTMsIDF9LHsgIDQwOTcsIDB9LHsgIDQwOTMsIDF9LHsgIDQwOTYsIDB9LHsgIDQwOTIsIDF9LHsgIDQwOTksIDB9LAoreyAgNDA5MSwgMX0seyAgNDA5OCwgMH0seyAgNDA5MCwgMX0seyAgNDEwMywgMH0seyAgNDA4NywgMX0seyAgNDEwMiwgMH0seyAgNDA4NiwgMX0seyAgNDExMSwgMH0sCit7ICA0MDc5LCAxfSx7ICA0MTEwLCAwfSx7ICA0MDc4LCAxfSx7ICA0MTI3LCAwfSx7ICA0MDYzLCAxfSx7ICA0MTI2LCAwfSx7ICA0MDYyLCAxfSx7ICA0MTU5LCAwfSwKK3sgIDQwMzEsIDF9LHsgIDQxNTgsIDB9LHsgIDQwMzAsIDF9LHsgIDQyMjMsIDB9LHsgIDM5NjcsIDF9LHsgIDQyMjIsIDB9LHsgIDM5NjYsIDF9LHsgIDQzNTEsIDB9LAoreyAgMzgzOSwgMX0seyAgNDM1MCwgMH0seyAgMzgzOCwgMX0seyAgNDYwNywgMH0seyAgMzU4MywgMX0seyAgNDYwNiwgMH0seyAgMzU4MiwgMX0seyAgNTExOSwgMH0sCit7ICAzMDcxLCAxfSx7ICA1MTE4LCAwfSx7ICAzMDcwLCAxfSx7ICA2MTQzLCAwfSx7ICAyMDQ3LCAxfSx7ICA2MTQyLCAwfSx7ICAyMDQ2LCAxfSx7ICA4MTkxLCAwfSwKK3sgICAgLTEsIDB9LHsgIDgxOTAsIDB9LHsgICAgLTIsIDB9LHsgMTIyODcsIDB9LHsgLTQwOTcsIDB9LHsgMTIyODYsIDB9LHsgLTQwOTgsIDB9LHsgMjA0NzksIDB9LAorey0xMjI4OSwgMH0seyAyMDQ3OCwgMH0sey0xMjI5MCwgMH0seyAzNjg2MywgMH0sey0yODY3MywgMH0seyAzNjg2MiwgMH0sey0yODY3NCwgMH0seyAtNDA5NiwgMH0sCit7IC00MDk4LCAxfSx7IC00MDk3LCAwfSx7IC00MDk5LCAxfSx7IC00MDk1LCAwfSx7IC00MDk5LCAxfSx7IC00MDk2LCAwfSx7IC00MTAwLCAxfSx7IC00MDkzLCAwfSwKK3sgLTQxMDEsIDF9LHsgLTQwOTQsIDB9LHsgLTQxMDIsIDF9LHsgLTQwODksIDB9LHsgLTQxMDUsIDF9LHsgLTQwOTAsIDB9LHsgLTQxMDYsIDF9LHsgLTQwODEsIDB9LAoreyAtNDExMywgMX0seyAtNDA4MiwgMH0seyAtNDExNCwgMX0seyAtNDA2NSwgMH0seyAtNDEyOSwgMX0seyAtNDA2NiwgMH0seyAtNDEzMCwgMX0seyAtNDAzMywgMH0sCit7IC00MTYxLCAxfSx7IC00MDM0LCAwfSx7IC00MTYyLCAxfSx7IC0zOTY5LCAwfSx7IC00MjI1LCAxfSx7IC0zOTcwLCAwfSx7IC00MjI2LCAxfSx7IC0zODQxLCAwfSwKK3sgLTQzNTMsIDF9LHsgLTM4NDIsIDB9LHsgLTQzNTQsIDF9LHsgLTM1ODUsIDB9LHsgLTQ2MDksIDF9LHsgLTM1ODYsIDB9LHsgLTQ2MTAsIDF9LHsgLTMwNzMsIDB9LAoreyAtNTEyMSwgMX0seyAtMzA3NCwgMH0seyAtNTEyMiwgMX0seyAtMjA0OSwgMH0seyAtNjE0NSwgMX0seyAtMjA1MCwgMH0seyAtNjE0NiwgMX0seyAgICAtMSwgMH0sCit7IC04MTkzLCAxfSx7ICAgIC0yLCAwfSx7IC04MTk0LCAxfSx7ICA0MDk1LCAxfSx7LTEyMjg5LCAxfSx7ICA0MDk0LCAxfSx7LTEyMjkwLCAxfSx7IDEyMjg3LCAxfSwKK3stMjA0ODEsIDF9LHsgMTIyODYsIDF9LHstMjA0ODIsIDF9LHsgMjg2NzEsIDF9LHstMzY4NjUsIDF9LHsgMjg2NzAsIDF9LHstMzY4NjYsIDF9LHsgIDgxOTMsIDB9LAoreyAgODE5MSwgMX0seyAgODE5MiwgMH0seyAgODE5MCwgMX0seyAgODE5NCwgMH0seyAgODE5MCwgMX0seyAgODE5MywgMH0seyAgODE4OSwgMX0seyAgODE5NiwgMH0sCit7ICA4MTg4LCAxfSx7ICA4MTk1LCAwfSx7ICA4MTg3LCAxfSx7ICA4MjAwLCAwfSx7ICA4MTg0LCAxfSx7ICA4MTk5LCAwfSx7ICA4MTgzLCAxfSx7ICA4MjA4LCAwfSwKK3sgIDgxNzYsIDF9LHsgIDgyMDcsIDB9LHsgIDgxNzUsIDF9LHsgIDgyMjQsIDB9LHsgIDgxNjAsIDF9LHsgIDgyMjMsIDB9LHsgIDgxNTksIDF9LHsgIDgyNTYsIDB9LAoreyAgODEyOCwgMX0seyAgODI1NSwgMH0seyAgODEyNywgMX0seyAgODMyMCwgMH0seyAgODA2NCwgMX0seyAgODMxOSwgMH0seyAgODA2MywgMX0seyAgODQ0OCwgMH0sCit7ICA3OTM2LCAxfSx7ICA4NDQ3LCAwfSx7ICA3OTM1LCAxfSx7ICA4NzA0LCAwfSx7ICA3NjgwLCAxfSx7ICA4NzAzLCAwfSx7ICA3Njc5LCAxfSx7ICA5MjE2LCAwfSwKK3sgIDcxNjgsIDF9LHsgIDkyMTUsIDB9LHsgIDcxNjcsIDF9LHsgMTAyNDAsIDB9LHsgIDYxNDQsIDF9LHsgMTAyMzksIDB9LHsgIDYxNDMsIDF9LHsgMTIyODgsIDB9LAoreyAgNDA5NiwgMX0seyAxMjI4NywgMH0seyAgNDA5NSwgMX0seyAxNjM4NCwgMH0seyAgICAgMCwgMX0seyAxNjM4MywgMH0seyAgICAtMSwgMH0seyAyNDU3NiwgMH0sCit7IC04MTkyLCAwfSx7IDI0NTc1LCAwfSx7IC04MTkzLCAwfSx7IDQwOTYwLCAwfSx7LTI0NTc2LCAwfSx7IDQwOTU5LCAwfSx7LTI0NTc3LCAwfSx7IC04MTkxLCAwfSwKK3sgLTgxOTMsIDF9LHsgLTgxOTIsIDB9LHsgLTgxOTQsIDF9LHsgLTgxOTAsIDB9LHsgLTgxOTQsIDF9LHsgLTgxOTEsIDB9LHsgLTgxOTUsIDF9LHsgLTgxODgsIDB9LAoreyAtODE5NiwgMX0seyAtODE4OSwgMH0seyAtODE5NywgMX0seyAtODE4NCwgMH0seyAtODIwMCwgMX0seyAtODE4NSwgMH0seyAtODIwMSwgMX0seyAtODE3NiwgMH0sCit7IC04MjA4LCAxfSx7IC04MTc3LCAwfSx7IC04MjA5LCAxfSx7IC04MTYwLCAwfSx7IC04MjI0LCAxfSx7IC04MTYxLCAwfSx7IC04MjI1LCAxfSx7IC04MTI4LCAwfSwKK3sgLTgyNTYsIDF9LHsgLTgxMjksIDB9LHsgLTgyNTcsIDF9LHsgLTgwNjQsIDB9LHsgLTgzMjAsIDF9LHsgLTgwNjUsIDB9LHsgLTgzMjEsIDF9LHsgLTc5MzYsIDB9LAoreyAtODQ0OCwgMX0seyAtNzkzNywgMH0seyAtODQ0OSwgMX0seyAtNzY4MCwgMH0seyAtODcwNCwgMX0seyAtNzY4MSwgMH0seyAtODcwNSwgMX0seyAtNzE2OCwgMH0sCit7IC05MjE2LCAxfSx7IC03MTY5LCAwfSx7IC05MjE3LCAxfSx7IC02MTQ0LCAwfSx7LTEwMjQwLCAxfSx7IC02MTQ1LCAwfSx7LTEwMjQxLCAxfSx7IC00MDk2LCAwfSwKK3stMTIyODgsIDF9LHsgLTQwOTcsIDB9LHstMTIyODksIDF9LHsgICAgIDAsIDF9LHstMTYzODQsIDF9LHsgICAgLTEsIDB9LHstMTYzODUsIDF9LHsgIDgxOTIsIDF9LAorey0yNDU3NiwgMX0seyAgODE5MSwgMX0sey0yNDU3NywgMX0seyAyNDU3NiwgMX0sey00MDk2MCwgMX0seyAyNDU3NSwgMX0sey00MDk2MSwgMX0seyAgODE5MiwgMH0sCit7ICA4MTkwLCAxfSx7ICA4MTkxLCAwfSx7ICA4MTg5LCAxfSx7ICA4MTkzLCAwfSx7ICA4MTg5LCAxfSx7ICA4MTkyLCAwfSx7ICA4MTg4LCAxfSx7ICA4MTk1LCAwfSwKK3sgIDgxODcsIDF9LHsgIDgxOTQsIDB9LHsgIDgxODYsIDF9LHsgIDgxOTksIDB9LHsgIDgxODMsIDF9LHsgIDgxOTgsIDB9LHsgIDgxODIsIDF9LHsgIDgyMDcsIDB9LAoreyAgODE3NSwgMX0seyAgODIwNiwgMH0seyAgODE3NCwgMX0seyAgODIyMywgMH0seyAgODE1OSwgMX0seyAgODIyMiwgMH0seyAgODE1OCwgMX0seyAgODI1NSwgMH0sCit7ICA4MTI3LCAxfSx7ICA4MjU0LCAwfSx7ICA4MTI2LCAxfSx7ICA4MzE5LCAwfSx7ICA4MDYzLCAxfSx7ICA4MzE4LCAwfSx7ICA4MDYyLCAxfSx7ICA4NDQ3LCAwfSwKK3sgIDc5MzUsIDF9LHsgIDg0NDYsIDB9LHsgIDc5MzQsIDF9LHsgIDg3MDMsIDB9LHsgIDc2NzksIDF9LHsgIDg3MDIsIDB9LHsgIDc2NzgsIDF9LHsgIDkyMTUsIDB9LAoreyAgNzE2NywgMX0seyAgOTIxNCwgMH0seyAgNzE2NiwgMX0seyAxMDIzOSwgMH0seyAgNjE0MywgMX0seyAxMDIzOCwgMH0seyAgNjE0MiwgMX0seyAxMjI4NywgMH0sCit7ICA0MDk1LCAxfSx7IDEyMjg2LCAwfSx7ICA0MDk0LCAxfSx7IDE2MzgzLCAwfSx7ICAgIC0xLCAwfSx7IDE2MzgyLCAwfSx7ICAgIC0yLCAwfSx7IDI0NTc1LCAwfSwKK3sgLTgxOTMsIDB9LHsgMjQ1NzQsIDB9LHsgLTgxOTQsIDB9LHsgNDA5NTksIDB9LHstMjQ1NzcsIDB9LHsgNDA5NTgsIDB9LHstMjQ1NzgsIDB9LHsgLTgxOTIsIDB9LAoreyAtODE5NCwgMX0seyAtODE5MywgMH0seyAtODE5NSwgMX0seyAtODE5MSwgMH0seyAtODE5NSwgMX0seyAtODE5MiwgMH0seyAtODE5NiwgMX0seyAtODE4OSwgMH0sCit7IC04MTk3LCAxfSx7IC04MTkwLCAwfSx7IC04MTk4LCAxfSx7IC04MTg1LCAwfSx7IC04MjAxLCAxfSx7IC04MTg2LCAwfSx7IC04MjAyLCAxfSx7IC04MTc3LCAwfSwKK3sgLTgyMDksIDF9LHsgLTgxNzgsIDB9LHsgLTgyMTAsIDF9LHsgLTgxNjEsIDB9LHsgLTgyMjUsIDF9LHsgLTgxNjIsIDB9LHsgLTgyMjYsIDF9LHsgLTgxMjksIDB9LAoreyAtODI1NywgMX0seyAtODEzMCwgMH0seyAtODI1OCwgMX0seyAtODA2NSwgMH0seyAtODMyMSwgMX0seyAtODA2NiwgMH0seyAtODMyMiwgMX0seyAtNzkzNywgMH0sCit7IC04NDQ5LCAxfSx7IC03OTM4LCAwfSx7IC04NDUwLCAxfSx7IC03NjgxLCAwfSx7IC04NzA1LCAxfSx7IC03NjgyLCAwfSx7IC04NzA2LCAxfSx7IC03MTY5LCAwfSwKK3sgLTkyMTcsIDF9LHsgLTcxNzAsIDB9LHsgLTkyMTgsIDF9LHsgLTYxNDUsIDB9LHstMTAyNDEsIDF9LHsgLTYxNDYsIDB9LHstMTAyNDIsIDF9LHsgLTQwOTcsIDB9LAorey0xMjI4OSwgMX0seyAtNDA5OCwgMH0sey0xMjI5MCwgMX0seyAgICAtMSwgMH0sey0xNjM4NSwgMX0seyAgICAtMiwgMH0sey0xNjM4NiwgMX0seyAgODE5MSwgMX0sCit7LTI0NTc3LCAxfSx7ICA4MTkwLCAxfSx7LTI0NTc4LCAxfSx7IDI0NTc1LCAxfSx7LTQwOTYxLCAxfSx7IDI0NTc0LCAxfSx7LTQwOTYyLCAxfSx7IDE2Mzg1LCAwfSwKK3sgMTYzODMsIDF9LHsgMTYzODQsIDB9LHsgMTYzODIsIDF9LHsgMTYzODYsIDB9LHsgMTYzODIsIDF9LHsgMTYzODUsIDB9LHsgMTYzODEsIDF9LHsgMTYzODgsIDB9LAoreyAxNjM4MCwgMX0seyAxNjM4NywgMH0seyAxNjM3OSwgMX0seyAxNjM5MiwgMH0seyAxNjM3NiwgMX0seyAxNjM5MSwgMH0seyAxNjM3NSwgMX0seyAxNjQwMCwgMH0sCit7IDE2MzY4LCAxfSx7IDE2Mzk5LCAwfSx7IDE2MzY3LCAxfSx7IDE2NDE2LCAwfSx7IDE2MzUyLCAxfSx7IDE2NDE1LCAwfSx7IDE2MzUxLCAxfSx7IDE2NDQ4LCAwfSwKK3sgMTYzMjAsIDF9LHsgMTY0NDcsIDB9LHsgMTYzMTksIDF9LHsgMTY1MTIsIDB9LHsgMTYyNTYsIDF9LHsgMTY1MTEsIDB9LHsgMTYyNTUsIDF9LHsgMTY2NDAsIDB9LAoreyAxNjEyOCwgMX0seyAxNjYzOSwgMH0seyAxNjEyNywgMX0seyAxNjg5NiwgMH0seyAxNTg3MiwgMX0seyAxNjg5NSwgMH0seyAxNTg3MSwgMX0seyAxNzQwOCwgMH0sCit7IDE1MzYwLCAxfSx7IDE3NDA3LCAwfSx7IDE1MzU5LCAxfSx7IDE4NDMyLCAwfSx7IDE0MzM2LCAxfSx7IDE4NDMxLCAwfSx7IDE0MzM1LCAxfSx7IDIwNDgwLCAwfSwKK3sgMTIyODgsIDF9LHsgMjA0NzksIDB9LHsgMTIyODcsIDF9LHsgMjQ1NzYsIDB9LHsgIDgxOTIsIDF9LHsgMjQ1NzUsIDB9LHsgIDgxOTEsIDF9LHsgMzI3NjgsIDB9LAoreyAgICAgMCwgMX0seyAzMjc2NywgMH0seyAgICAtMSwgMH0seyA0OTE1MiwgMH0sey0xNjM4NCwgMH0seyA0OTE1MSwgMH0sey0xNjM4NSwgMH0sey0xNjM4MywgMH0sCit7LTE2Mzg1LCAxfSx7LTE2Mzg0LCAwfSx7LTE2Mzg2LCAxfSx7LTE2MzgyLCAwfSx7LTE2Mzg2LCAxfSx7LTE2MzgzLCAwfSx7LTE2Mzg3LCAxfSx7LTE2MzgwLCAwfSwKK3stMTYzODgsIDF9LHstMTYzODEsIDB9LHstMTYzODksIDF9LHstMTYzNzYsIDB9LHstMTYzOTIsIDF9LHstMTYzNzcsIDB9LHstMTYzOTMsIDF9LHstMTYzNjgsIDB9LAorey0xNjQwMCwgMX0sey0xNjM2OSwgMH0sey0xNjQwMSwgMX0sey0xNjM1MiwgMH0sey0xNjQxNiwgMX0sey0xNjM1MywgMH0sey0xNjQxNywgMX0sey0xNjMyMCwgMH0sCit7LTE2NDQ4LCAxfSx7LTE2MzIxLCAwfSx7LTE2NDQ5LCAxfSx7LTE2MjU2LCAwfSx7LTE2NTEyLCAxfSx7LTE2MjU3LCAwfSx7LTE2NTEzLCAxfSx7LTE2MTI4LCAwfSwKK3stMTY2NDAsIDF9LHstMTYxMjksIDB9LHstMTY2NDEsIDF9LHstMTU4NzIsIDB9LHstMTY4OTYsIDF9LHstMTU4NzMsIDB9LHstMTY4OTcsIDF9LHstMTUzNjAsIDB9LAorey0xNzQwOCwgMX0sey0xNTM2MSwgMH0sey0xNzQwOSwgMX0sey0xNDMzNiwgMH0sey0xODQzMiwgMX0sey0xNDMzNywgMH0sey0xODQzMywgMX0sey0xMjI4OCwgMH0sCit7LTIwNDgwLCAxfSx7LTEyMjg5LCAwfSx7LTIwNDgxLCAxfSx7IC04MTkyLCAwfSx7LTI0NTc2LCAxfSx7IC04MTkzLCAwfSx7LTI0NTc3LCAxfSx7ICAgICAwLCAxfSwKK3stMzI3NjgsIDF9LHsgICAgLTEsIDB9LHstMzI3NjksIDF9LHsgMTYzODQsIDF9LHstNDkxNTIsIDF9LHsgMTYzODMsIDF9LHstNDkxNTMsIDF9LHsgMTYzODQsIDB9LAoreyAxNjM4MiwgMX0seyAxNjM4MywgMH0seyAxNjM4MSwgMX0seyAxNjM4NSwgMH0seyAxNjM4MSwgMX0seyAxNjM4NCwgMH0seyAxNjM4MCwgMX0seyAxNjM4NywgMH0sCit7IDE2Mzc5LCAxfSx7IDE2Mzg2LCAwfSx7IDE2Mzc4LCAxfSx7IDE2MzkxLCAwfSx7IDE2Mzc1LCAxfSx7IDE2MzkwLCAwfSx7IDE2Mzc0LCAxfSx7IDE2Mzk5LCAwfSwKK3sgMTYzNjcsIDF9LHsgMTYzOTgsIDB9LHsgMTYzNjYsIDF9LHsgMTY0MTUsIDB9LHsgMTYzNTEsIDF9LHsgMTY0MTQsIDB9LHsgMTYzNTAsIDF9LHsgMTY0NDcsIDB9LAoreyAxNjMxOSwgMX0seyAxNjQ0NiwgMH0seyAxNjMxOCwgMX0seyAxNjUxMSwgMH0seyAxNjI1NSwgMX0seyAxNjUxMCwgMH0seyAxNjI1NCwgMX0seyAxNjYzOSwgMH0sCit7IDE2MTI3LCAxfSx7IDE2NjM4LCAwfSx7IDE2MTI2LCAxfSx7IDE2ODk1LCAwfSx7IDE1ODcxLCAxfSx7IDE2ODk0LCAwfSx7IDE1ODcwLCAxfSx7IDE3NDA3LCAwfSwKK3sgMTUzNTksIDF9LHsgMTc0MDYsIDB9LHsgMTUzNTgsIDF9LHsgMTg0MzEsIDB9LHsgMTQzMzUsIDF9LHsgMTg0MzAsIDB9LHsgMTQzMzQsIDF9LHsgMjA0NzksIDB9LAoreyAxMjI4NywgMX0seyAyMDQ3OCwgMH0seyAxMjI4NiwgMX0seyAyNDU3NSwgMH0seyAgODE5MSwgMX0seyAyNDU3NCwgMH0seyAgODE5MCwgMX0seyAzMjc2NywgMH0sCit7ICAgIC0xLCAwfSx7IDMyNzY2LCAwfSx7ICAgIC0yLCAwfSx7IDQ5MTUxLCAwfSx7LTE2Mzg1LCAwfSx7IDQ5MTUwLCAwfSx7LTE2Mzg2LCAwfSx7LTE2Mzg0LCAwfSwKK3stMTYzODYsIDF9LHstMTYzODUsIDB9LHstMTYzODcsIDF9LHstMTYzODMsIDB9LHstMTYzODcsIDF9LHstMTYzODQsIDB9LHstMTYzODgsIDF9LHstMTYzODEsIDB9LAorey0xNjM4OSwgMX0sey0xNjM4MiwgMH0sey0xNjM5MCwgMX0sey0xNjM3NywgMH0sey0xNjM5MywgMX0sey0xNjM3OCwgMH0sey0xNjM5NCwgMX0sey0xNjM2OSwgMH0sCit7LTE2NDAxLCAxfSx7LTE2MzcwLCAwfSx7LTE2NDAyLCAxfSx7LTE2MzUzLCAwfSx7LTE2NDE3LCAxfSx7LTE2MzU0LCAwfSx7LTE2NDE4LCAxfSx7LTE2MzIxLCAwfSwKK3stMTY0NDksIDF9LHstMTYzMjIsIDB9LHstMTY0NTAsIDF9LHstMTYyNTcsIDB9LHstMTY1MTMsIDF9LHstMTYyNTgsIDB9LHstMTY1MTQsIDF9LHstMTYxMjksIDB9LAorey0xNjY0MSwgMX0sey0xNjEzMCwgMH0sey0xNjY0MiwgMX0sey0xNTg3MywgMH0sey0xNjg5NywgMX0sey0xNTg3NCwgMH0sey0xNjg5OCwgMX0sey0xNTM2MSwgMH0sCit7LTE3NDA5LCAxfSx7LTE1MzYyLCAwfSx7LTE3NDEwLCAxfSx7LTE0MzM3LCAwfSx7LTE4NDMzLCAxfSx7LTE0MzM4LCAwfSx7LTE4NDM0LCAxfSx7LTEyMjg5LCAwfSwKK3stMjA0ODEsIDF9LHstMTIyOTAsIDB9LHstMjA0ODIsIDF9LHsgLTgxOTMsIDB9LHstMjQ1NzcsIDF9LHsgLTgxOTQsIDB9LHstMjQ1NzgsIDF9LHsgICAgLTEsIDB9LAorey0zMjc2OSwgMX0seyAgICAtMiwgMH0sey0zMjc3MCwgMX0seyAxNjM4MywgMX0sey00OTE1MywgMX0seyAxNjM4MiwgMX0sey00OTE1NCwgMX0seyAzMjc2OSwgMH0sCit7IDMyNzY3LCAxfSx7IDMyNzY4LCAwfSx7IDMyNzY2LCAxfSx7IDMyNzcwLCAwfSx7IDMyNzY2LCAxfSx7IDMyNzY5LCAwfSx7IDMyNzY1LCAxfSx7IDMyNzcyLCAwfSwKK3sgMzI3NjQsIDF9LHsgMzI3NzEsIDB9LHsgMzI3NjMsIDF9LHsgMzI3NzYsIDB9LHsgMzI3NjAsIDF9LHsgMzI3NzUsIDB9LHsgMzI3NTksIDF9LHsgMzI3ODQsIDB9LAoreyAzMjc1MiwgMX0seyAzMjc4MywgMH0seyAzMjc1MSwgMX0seyAzMjgwMCwgMH0seyAzMjczNiwgMX0seyAzMjc5OSwgMH0seyAzMjczNSwgMX0seyAzMjgzMiwgMH0sCit7IDMyNzA0LCAxfSx7IDMyODMxLCAwfSx7IDMyNzAzLCAxfSx7IDMyODk2LCAwfSx7IDMyNjQwLCAxfSx7IDMyODk1LCAwfSx7IDMyNjM5LCAxfSx7IDMzMDI0LCAwfSwKK3sgMzI1MTIsIDF9LHsgMzMwMjMsIDB9LHsgMzI1MTEsIDF9LHsgMzMyODAsIDB9LHsgMzIyNTYsIDF9LHsgMzMyNzksIDB9LHsgMzIyNTUsIDF9LHsgMzM3OTIsIDB9LAoreyAzMTc0NCwgMX0seyAzMzc5MSwgMH0seyAzMTc0MywgMX0seyAzNDgxNiwgMH0seyAzMDcyMCwgMX0seyAzNDgxNSwgMH0seyAzMDcxOSwgMX0seyAzNjg2NCwgMH0sCit7IDI4NjcyLCAxfSx7IDM2ODYzLCAwfSx7IDI4NjcxLCAxfSx7IDQwOTYwLCAwfSx7IDI0NTc2LCAxfSx7IDQwOTU5LCAwfSx7IDI0NTc1LCAxfSx7IDQ5MTUyLCAwfSwKK3sgMTYzODQsIDF9LHsgNDkxNTEsIDB9LHsgMTYzODMsIDF9LHsgNjU1MzYsIDB9LHsgICAgIDAsIDF9LHsgNjU1MzUsIDB9LHsgICAgLTEsIDB9LHstMzI3NjcsIDB9LAorey0zMjc2OSwgMX0sey0zMjc2OCwgMH0sey0zMjc3MCwgMX0sey0zMjc2NiwgMH0sey0zMjc3MCwgMX0sey0zMjc2NywgMH0sey0zMjc3MSwgMX0sey0zMjc2NCwgMH0sCit7LTMyNzcyLCAxfSx7LTMyNzY1LCAwfSx7LTMyNzczLCAxfSx7LTMyNzYwLCAwfSx7LTMyNzc2LCAxfSx7LTMyNzYxLCAwfSx7LTMyNzc3LCAxfSx7LTMyNzUyLCAwfSwKK3stMzI3ODQsIDF9LHstMzI3NTMsIDB9LHstMzI3ODUsIDF9LHstMzI3MzYsIDB9LHstMzI4MDAsIDF9LHstMzI3MzcsIDB9LHstMzI4MDEsIDF9LHstMzI3MDQsIDB9LAorey0zMjgzMiwgMX0sey0zMjcwNSwgMH0sey0zMjgzMywgMX0sey0zMjY0MCwgMH0sey0zMjg5NiwgMX0sey0zMjY0MSwgMH0sey0zMjg5NywgMX0sey0zMjUxMiwgMH0sCit7LTMzMDI0LCAxfSx7LTMyNTEzLCAwfSx7LTMzMDI1LCAxfSx7LTMyMjU2LCAwfSx7LTMzMjgwLCAxfSx7LTMyMjU3LCAwfSx7LTMzMjgxLCAxfSx7LTMxNzQ0LCAwfSwKK3stMzM3OTIsIDF9LHstMzE3NDUsIDB9LHstMzM3OTMsIDF9LHstMzA3MjAsIDB9LHstMzQ4MTYsIDF9LHstMzA3MjEsIDB9LHstMzQ4MTcsIDF9LHstMjg2NzIsIDB9LAorey0zNjg2NCwgMX0sey0yODY3MywgMH0sey0zNjg2NSwgMX0sey0yNDU3NiwgMH0sey00MDk2MCwgMX0sey0yNDU3NywgMH0sey00MDk2MSwgMX0sey0xNjM4NCwgMH0sCit7LTQ5MTUyLCAxfSx7LTE2Mzg1LCAwfSx7LTQ5MTUzLCAxfSx7ICAgICAwLCAxfSx7LTY1NTM2LCAxfSx7ICAgIC0xLCAwfSx7LTY1NTM3LCAxfSx7IDMyNzY4LCAwfSwKK3sgMzI3NjYsIDF9LHsgMzI3NjcsIDB9LHsgMzI3NjUsIDF9LHsgMzI3NjksIDB9LHsgMzI3NjUsIDF9LHsgMzI3NjgsIDB9LHsgMzI3NjQsIDF9LHsgMzI3NzEsIDB9LAoreyAzMjc2MywgMX0seyAzMjc3MCwgMH0seyAzMjc2MiwgMX0seyAzMjc3NSwgMH0seyAzMjc1OSwgMX0seyAzMjc3NCwgMH0seyAzMjc1OCwgMX0seyAzMjc4MywgMH0sCit7IDMyNzUxLCAxfSx7IDMyNzgyLCAwfSx7IDMyNzUwLCAxfSx7IDMyNzk5LCAwfSx7IDMyNzM1LCAxfSx7IDMyNzk4LCAwfSx7IDMyNzM0LCAxfSx7IDMyODMxLCAwfSwKK3sgMzI3MDMsIDF9LHsgMzI4MzAsIDB9LHsgMzI3MDIsIDF9LHsgMzI4OTUsIDB9LHsgMzI2MzksIDF9LHsgMzI4OTQsIDB9LHsgMzI2MzgsIDF9LHsgMzMwMjMsIDB9LAoreyAzMjUxMSwgMX0seyAzMzAyMiwgMH0seyAzMjUxMCwgMX0seyAzMzI3OSwgMH0seyAzMjI1NSwgMX0seyAzMzI3OCwgMH0seyAzMjI1NCwgMX0seyAzMzc5MSwgMH0sCit7IDMxNzQzLCAxfSx7IDMzNzkwLCAwfSx7IDMxNzQyLCAxfSx7IDM0ODE1LCAwfSx7IDMwNzE5LCAxfSx7IDM0ODE0LCAwfSx7IDMwNzE4LCAxfSx7IDM2ODYzLCAwfSwKK3sgMjg2NzEsIDF9LHsgMzY4NjIsIDB9LHsgMjg2NzAsIDF9LHsgNDA5NTksIDB9LHsgMjQ1NzUsIDF9LHsgNDA5NTgsIDB9LHsgMjQ1NzQsIDF9LHsgNDkxNTEsIDB9LAoreyAxNjM4MywgMX0seyA0OTE1MCwgMH0seyAxNjM4MiwgMX0seyA2NTUzNSwgMH0seyAgICAtMSwgMH0seyA2NTUzNCwgMH0seyAgICAtMiwgMH0sey0zMjc2OCwgMH0sCit7LTMyNzcwLCAxfSx7LTMyNzY5LCAwfSx7LTMyNzcxLCAxfSx7LTMyNzY3LCAwfSx7LTMyNzcxLCAxfSx7LTMyNzY4LCAwfSx7LTMyNzcyLCAxfSx7LTMyNzY1LCAwfSwKK3stMzI3NzMsIDF9LHstMzI3NjYsIDB9LHstMzI3NzQsIDF9LHstMzI3NjEsIDB9LHstMzI3NzcsIDF9LHstMzI3NjIsIDB9LHstMzI3NzgsIDF9LHstMzI3NTMsIDB9LAorey0zMjc4NSwgMX0sey0zMjc1NCwgMH0sey0zMjc4NiwgMX0sey0zMjczNywgMH0sey0zMjgwMSwgMX0sey0zMjczOCwgMH0sey0zMjgwMiwgMX0sey0zMjcwNSwgMH0sCit7LTMyODMzLCAxfSx7LTMyNzA2LCAwfSx7LTMyODM0LCAxfSx7LTMyNjQxLCAwfSx7LTMyODk3LCAxfSx7LTMyNjQyLCAwfSx7LTMyODk4LCAxfSx7LTMyNTEzLCAwfSwKK3stMzMwMjUsIDF9LHstMzI1MTQsIDB9LHstMzMwMjYsIDF9LHstMzIyNTcsIDB9LHstMzMyODEsIDF9LHstMzIyNTgsIDB9LHstMzMyODIsIDF9LHstMzE3NDUsIDB9LAorey0zMzc5MywgMX0sey0zMTc0NiwgMH0sey0zMzc5NCwgMX0sey0zMDcyMSwgMH0sey0zNDgxNywgMX0sey0zMDcyMiwgMH0sey0zNDgxOCwgMX0sey0yODY3MywgMH0sCit7LTM2ODY1LCAxfSx7LTI4Njc0LCAwfSx7LTM2ODY2LCAxfSx7LTI0NTc3LCAwfSx7LTQwOTYxLCAxfSx7LTI0NTc4LCAwfSx7LTQwOTYyLCAxfSx7LTE2Mzg1LCAwfSwKK3stNDkxNTMsIDF9LHstMTYzODYsIDB9LHstNDkxNTQsIDF9LHsgICAgLTEsIDB9LHstNjU1MzcsIDF9LHsgICAgLTIsIDB9LHstNjU1MzgsIDF9LH07CitpbnQgbWFpbiAoKQoreworICBtcF9saW1iX3QgcjEsIHIwOworICBpbnQgZXJyID0gMDsKKyAgc2l6ZV90IGluZCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQorICAgIHsKKyAgICAgIGludCBpaSA9IGkgLyA2NCwgamogPSBpICUgNjQ7CisgICAgICBmdW5jc1tpXSgmcjEsICZyMCk7CisgICAgICBpZiAocjAgIT0gKG1wX2xpbWJfc2lnbmVkX3QpIHJlZltpbmRdWzBdIHx8IHIxICE9IChtcF9saW1iX3NpZ25lZF90KSByZWZbaW5kXVsxXSkgeworICAgICAgICAgcHJpbnRmICgiZXJyb3IgZm9yIGYlenUoJWQsJWQpOiB3YW50ICglZCwlZCkgZ290ICglZCwlZClcbiIsIGksIChpbnQpIG9wc1tpaV0sIChpbnQpIG9wc1tqal0sIHJlZltpbmRdWzFdLCByZWZbaW5kXVswXSwgKGludCkgcjEsIChpbnQpIHIwKTsKKyAgICAgICAgIGVycisrOworICAgICAgIH0KKyAgICAgIGluZCsrOworICAgIH0KKyAgcmV0dXJuIGVyciAhPSAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGV2ZWwvdGVzdC1zdWJfZGRtbXNzLmMgYi90ZXN0cy9kZXZlbC90ZXN0LXN1Yl9kZG1tc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2VlY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGV2ZWwvdGVzdC1zdWJfZGRtbXNzLmMKQEAgLTAsMCArMSw0OTA4IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCitzdGF0aWMgY29uc3QgaW50IG9wc1s2NF0gPSB7CisxLC0xLDAsLTIsCisyLC0yLDEsLTMsCis0LC00LDMsLTUsCis4LC04LDcsLTksCisxNiwtMTYsMTUsLTE3LAorMzIsLTMyLDMxLC0zMywKKzY0LC02NCw2MywtNjUsCisxMjgsLTEyOCwxMjcsLTEyOSwKKzI1NiwtMjU2LDI1NSwtMjU3LAorNTEyLC01MTIsNTExLC01MTMsCisxMDI0LC0xMDI0LDEwMjMsLTEwMjUsCisyMDQ4LC0yMDQ4LDIwNDcsLTIwNDksCis0MDk2LC00MDk2LDQwOTUsLTQwOTcsCis4MTkyLC04MTkyLDgxOTEsLTgxOTMsCisxNjM4NCwtMTYzODQsMTYzODMsLTE2Mzg1LAorMzI3NjgsLTMyNzY4LDMyNzY3LC0zMjc2OSwKK307CitzdGF0aWMgdm9pZCBmMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDAsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwwLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQ5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjYzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjY5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjczOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjc5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY3OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsOCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjkzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDcsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmOTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY5OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjk5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtOSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC05LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTksMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTAzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEwOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTA5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMDk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTExOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTEzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjExOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTE5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTIzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEyOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTI5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTMzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjEzOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTM5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxMzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMxLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzEsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTQ5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE0OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNDk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTUzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2NCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDY0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTYzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTY5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE2OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw2MywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDYzLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNjMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTcyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTczOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTY1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC02NSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNjUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTc5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyOCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxODk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTg5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTkzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEyNywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMjcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTI3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMTk5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjE5OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYxOTk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjAzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMjksMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTI5LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEyOSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIwOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjA5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjExNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjExNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjEyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU2LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NiwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTYsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjE5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIxOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjIzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjU1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDI1NSwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyNTUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjI5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTI1NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIyOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yNTcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjU3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjMzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTIsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTEyLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjM5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyMzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjIzOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTIsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDMwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMiwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw1MTEsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNTExLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI0OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDUxMSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNDk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjQ5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjUzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNTEzLDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTUxMywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC01MTMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI1OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNTk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjYxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjQsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDI0LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI0LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjQsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjY5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNjk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjcyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjczNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTAyMywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDEwMjMsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxMDIzLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjc5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI3OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTAyNSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xMDI1LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTEwMjUsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4NzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ4LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjkzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjI5OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYyOTk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMjk5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMjA0NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDIwNDcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwyMDQ3LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzAzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMjA0OSwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0yMDQ5LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTIwNDksMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDg4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMDk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzA5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzExNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzEyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTYsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk2LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxMzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMTk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMxOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk2LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzE5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTYsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzIzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsNDA5NSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDQwOTUsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw0MDk1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjk0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzI5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMyOTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtNDA5NywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC00MDk3LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTQwOTcsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzMzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzMzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzNzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzM4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTIsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkyLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjMzOTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzMzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MiwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkyLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTIsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ2OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDcyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDc4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDgyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDg0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM0OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNDk3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzQ5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTAzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTA5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsODE5MSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTEzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDgxOTEsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTE5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCw4MTkxLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUzNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzUzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU0NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTUwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTU3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTYzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNTgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtODE5MywwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC04MTkzLDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTgxOTMsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1ODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzU5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM1OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYwNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYyOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzYzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2MzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2Mzg0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODQsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4NCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjY5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjc1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY4OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNjk2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM2OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzY5OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzAyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODQsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg0LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NCwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzcyNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzM0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzczOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQ2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc1OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzYyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc2NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzY4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMTYzODMsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwxNjM4MywwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDE2MzgzLDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3NzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsMTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzc5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM3OTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC0zMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzk4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzNzk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MDMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC02NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwxMjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwNyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODA4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCw1MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODE0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTUxMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODE2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDEwMjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgxOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODIxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgyNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODI3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtNDA5Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDgxOTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4MzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0xNjM4NSwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODM2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwzMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMTYzODUsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzgzOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTE2Mzg1LDAsLTMyNzY5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODQ5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODUxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC01KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODU1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLDMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtMzMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODY1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLDYzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsLTEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODcxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwyNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsLTI1Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODc2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODc3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCw1MTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg3OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODgzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMjA0OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0yMDQ5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODg5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsNDA5NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODkzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC04MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODk1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM4OTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzg5OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzODk5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLC0xNjM4NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY4LDAsMzI3NjcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTA1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC0yKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MDgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkwOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTExKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTEyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC00KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTE3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTE4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC05KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTIyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwxNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTIzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkyNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTMyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDMxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTI4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCw2NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTI5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtNjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzkzMShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTY1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDEyOCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTMzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDEyNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMTI5KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5MzgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDI1NSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTM5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtNTEzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk0NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk0NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsMTAyMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQ3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMTAyNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTQ4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC0yMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDIwNDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtNDA5Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTU0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC00MDk3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk1OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsODE5MSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtODE5Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTYwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTYxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMTYzODQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsMTYzODMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY4LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLDMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OCwwLC0zMjc2OCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTY2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTY3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjgsMCwtMzI3NjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwwKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5NzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC0xNik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTE3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5ODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk4OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwzMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC0zMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGYzOTkyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsNjMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmMzk5NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwtMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjM5OTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTEyOSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLDI1Nik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDAxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwyNTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwMyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwtMjU3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTUxMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDA2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLDUxMSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDA3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAwOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxMDI0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMDkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTEwMjQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTEwMjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwyMDQ4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwyMDQ3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTIwNDkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTQwOTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAxOChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw0MDk1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMTkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw4MTkyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTgxOTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyMihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTgxOTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyNChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwxNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDI1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDI2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLDE2MzgzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsLTE2Mzg1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMjgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLDMyNzY3LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAyOShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwtMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzMChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsMzI3NjcsMCwzMjc2Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDMxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwzMjc2NywwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDMyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDApOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzNShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDAzNihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDM3KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDM4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwMzkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0zKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0MShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTQpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDQzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtNSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDQ0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCw4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC04KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNDYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA0OShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTE2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTAobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDE1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xNyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDUyKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwzMik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDUzKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtMzIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA1NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMzEpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA1NShtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTMzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDY0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNTcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC02NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDU4KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCw2Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDU5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtNjUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMTI4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xMjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMTI3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjMobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xMjkpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMjU2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0yNTYpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2NihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMjU1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0yNTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA2OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsNTEyKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNjkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC01MTIpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3MChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsNTExKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC01MTMpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDczKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtMTAyNCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDc0KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwxMDIzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xMDI1KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwNzYobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3NyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTIwNDgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA3OChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMjA0Nyk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDc5KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtMjA0OSk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDgwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCw0MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODEobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC00MDk2KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODIobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDQwOTUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTQwOTcpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA4NChtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDg1KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtODE5Mik7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDg2KG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCw4MTkxKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODcobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC04MTkzKTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODgobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDE2Mzg0KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwODkobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0xNjM4NCk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDkwKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwxNjM4Myk7KnIxcD1yMTsqcjBwPXIwO30KK3N0YXRpYyB2b2lkIGY0MDkxKG1wX2xpbWJfdCpyMXAsbXBfbGltYl90KnIwcCl7bXBfbGltYl90IHIxLHIwO3N1Yl9kZG1tc3MocjEscjAsMCwtMzI3NjksMCwtMTYzODUpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5MihtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsMzI3NjgpOypyMXA9cjE7KnIwcD1yMDt9CitzdGF0aWMgdm9pZCBmNDA5MyhtcF9saW1iX3QqcjFwLG1wX2xpbWJfdCpyMHApe21wX2xpbWJfdCByMSxyMDtzdWJfZGRtbXNzKHIxLHIwLDAsLTMyNzY5LDAsLTMyNzY4KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwOTQobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLDMyNzY3KTsqcjFwPXIxOypyMHA9cjA7fQorc3RhdGljIHZvaWQgZjQwOTUobXBfbGltYl90KnIxcCxtcF9saW1iX3QqcjBwKXttcF9saW1iX3QgcjEscjA7c3ViX2RkbW1zcyhyMSxyMCwwLC0zMjc2OSwwLC0zMjc2OSk7KnIxcD1yMTsqcjBwPXIwO30KK3R5cGVkZWYgdm9pZCAoKmZ1bmNfdCkgKG1wX2xpbWJfdCosIG1wX2xpbWJfdCopOworc3RhdGljIGNvbnN0IGZ1bmNfdCBmdW5jc1s0MDk2XSA9IHsKK2YwLGYxLGYyLGYzLGY0LGY1LGY2LGY3LGY4LGY5LGYxMCxmMTEsZjEyLGYxMyxmMTQsZjE1LAorZjE2LGYxNyxmMTgsZjE5LGYyMCxmMjEsZjIyLGYyMyxmMjQsZjI1LGYyNixmMjcsZjI4LGYyOSxmMzAsZjMxLAorZjMyLGYzMyxmMzQsZjM1LGYzNixmMzcsZjM4LGYzOSxmNDAsZjQxLGY0MixmNDMsZjQ0LGY0NSxmNDYsZjQ3LAorZjQ4LGY0OSxmNTAsZjUxLGY1MixmNTMsZjU0LGY1NSxmNTYsZjU3LGY1OCxmNTksZjYwLGY2MSxmNjIsZjYzLAorZjY0LGY2NSxmNjYsZjY3LGY2OCxmNjksZjcwLGY3MSxmNzIsZjczLGY3NCxmNzUsZjc2LGY3NyxmNzgsZjc5LAorZjgwLGY4MSxmODIsZjgzLGY4NCxmODUsZjg2LGY4NyxmODgsZjg5LGY5MCxmOTEsZjkyLGY5MyxmOTQsZjk1LAorZjk2LGY5NyxmOTgsZjk5LGYxMDAsZjEwMSxmMTAyLGYxMDMsZjEwNCxmMTA1LGYxMDYsZjEwNyxmMTA4LGYxMDksZjExMCxmMTExLAorZjExMixmMTEzLGYxMTQsZjExNSxmMTE2LGYxMTcsZjExOCxmMTE5LGYxMjAsZjEyMSxmMTIyLGYxMjMsZjEyNCxmMTI1LGYxMjYsZjEyNywKK2YxMjgsZjEyOSxmMTMwLGYxMzEsZjEzMixmMTMzLGYxMzQsZjEzNSxmMTM2LGYxMzcsZjEzOCxmMTM5LGYxNDAsZjE0MSxmMTQyLGYxNDMsCitmMTQ0LGYxNDUsZjE0NixmMTQ3LGYxNDgsZjE0OSxmMTUwLGYxNTEsZjE1MixmMTUzLGYxNTQsZjE1NSxmMTU2LGYxNTcsZjE1OCxmMTU5LAorZjE2MCxmMTYxLGYxNjIsZjE2MyxmMTY0LGYxNjUsZjE2NixmMTY3LGYxNjgsZjE2OSxmMTcwLGYxNzEsZjE3MixmMTczLGYxNzQsZjE3NSwKK2YxNzYsZjE3NyxmMTc4LGYxNzksZjE4MCxmMTgxLGYxODIsZjE4MyxmMTg0LGYxODUsZjE4NixmMTg3LGYxODgsZjE4OSxmMTkwLGYxOTEsCitmMTkyLGYxOTMsZjE5NCxmMTk1LGYxOTYsZjE5NyxmMTk4LGYxOTksZjIwMCxmMjAxLGYyMDIsZjIwMyxmMjA0LGYyMDUsZjIwNixmMjA3LAorZjIwOCxmMjA5LGYyMTAsZjIxMSxmMjEyLGYyMTMsZjIxNCxmMjE1LGYyMTYsZjIxNyxmMjE4LGYyMTksZjIyMCxmMjIxLGYyMjIsZjIyMywKK2YyMjQsZjIyNSxmMjI2LGYyMjcsZjIyOCxmMjI5LGYyMzAsZjIzMSxmMjMyLGYyMzMsZjIzNCxmMjM1LGYyMzYsZjIzNyxmMjM4LGYyMzksCitmMjQwLGYyNDEsZjI0MixmMjQzLGYyNDQsZjI0NSxmMjQ2LGYyNDcsZjI0OCxmMjQ5LGYyNTAsZjI1MSxmMjUyLGYyNTMsZjI1NCxmMjU1LAorZjI1NixmMjU3LGYyNTgsZjI1OSxmMjYwLGYyNjEsZjI2MixmMjYzLGYyNjQsZjI2NSxmMjY2LGYyNjcsZjI2OCxmMjY5LGYyNzAsZjI3MSwKK2YyNzIsZjI3MyxmMjc0LGYyNzUsZjI3NixmMjc3LGYyNzgsZjI3OSxmMjgwLGYyODEsZjI4MixmMjgzLGYyODQsZjI4NSxmMjg2LGYyODcsCitmMjg4LGYyODksZjI5MCxmMjkxLGYyOTIsZjI5MyxmMjk0LGYyOTUsZjI5NixmMjk3LGYyOTgsZjI5OSxmMzAwLGYzMDEsZjMwMixmMzAzLAorZjMwNCxmMzA1LGYzMDYsZjMwNyxmMzA4LGYzMDksZjMxMCxmMzExLGYzMTIsZjMxMyxmMzE0LGYzMTUsZjMxNixmMzE3LGYzMTgsZjMxOSwKK2YzMjAsZjMyMSxmMzIyLGYzMjMsZjMyNCxmMzI1LGYzMjYsZjMyNyxmMzI4LGYzMjksZjMzMCxmMzMxLGYzMzIsZjMzMyxmMzM0LGYzMzUsCitmMzM2LGYzMzcsZjMzOCxmMzM5LGYzNDAsZjM0MSxmMzQyLGYzNDMsZjM0NCxmMzQ1LGYzNDYsZjM0NyxmMzQ4LGYzNDksZjM1MCxmMzUxLAorZjM1MixmMzUzLGYzNTQsZjM1NSxmMzU2LGYzNTcsZjM1OCxmMzU5LGYzNjAsZjM2MSxmMzYyLGYzNjMsZjM2NCxmMzY1LGYzNjYsZjM2NywKK2YzNjgsZjM2OSxmMzcwLGYzNzEsZjM3MixmMzczLGYzNzQsZjM3NSxmMzc2LGYzNzcsZjM3OCxmMzc5LGYzODAsZjM4MSxmMzgyLGYzODMsCitmMzg0LGYzODUsZjM4NixmMzg3LGYzODgsZjM4OSxmMzkwLGYzOTEsZjM5MixmMzkzLGYzOTQsZjM5NSxmMzk2LGYzOTcsZjM5OCxmMzk5LAorZjQwMCxmNDAxLGY0MDIsZjQwMyxmNDA0LGY0MDUsZjQwNixmNDA3LGY0MDgsZjQwOSxmNDEwLGY0MTEsZjQxMixmNDEzLGY0MTQsZjQxNSwKK2Y0MTYsZjQxNyxmNDE4LGY0MTksZjQyMCxmNDIxLGY0MjIsZjQyMyxmNDI0LGY0MjUsZjQyNixmNDI3LGY0MjgsZjQyOSxmNDMwLGY0MzEsCitmNDMyLGY0MzMsZjQzNCxmNDM1LGY0MzYsZjQzNyxmNDM4LGY0MzksZjQ0MCxmNDQxLGY0NDIsZjQ0MyxmNDQ0LGY0NDUsZjQ0NixmNDQ3LAorZjQ0OCxmNDQ5LGY0NTAsZjQ1MSxmNDUyLGY0NTMsZjQ1NCxmNDU1LGY0NTYsZjQ1NyxmNDU4LGY0NTksZjQ2MCxmNDYxLGY0NjIsZjQ2MywKK2Y0NjQsZjQ2NSxmNDY2LGY0NjcsZjQ2OCxmNDY5LGY0NzAsZjQ3MSxmNDcyLGY0NzMsZjQ3NCxmNDc1LGY0NzYsZjQ3NyxmNDc4LGY0NzksCitmNDgwLGY0ODEsZjQ4MixmNDgzLGY0ODQsZjQ4NSxmNDg2LGY0ODcsZjQ4OCxmNDg5LGY0OTAsZjQ5MSxmNDkyLGY0OTMsZjQ5NCxmNDk1LAorZjQ5NixmNDk3LGY0OTgsZjQ5OSxmNTAwLGY1MDEsZjUwMixmNTAzLGY1MDQsZjUwNSxmNTA2LGY1MDcsZjUwOCxmNTA5LGY1MTAsZjUxMSwKK2Y1MTIsZjUxMyxmNTE0LGY1MTUsZjUxNixmNTE3LGY1MTgsZjUxOSxmNTIwLGY1MjEsZjUyMixmNTIzLGY1MjQsZjUyNSxmNTI2LGY1MjcsCitmNTI4LGY1MjksZjUzMCxmNTMxLGY1MzIsZjUzMyxmNTM0LGY1MzUsZjUzNixmNTM3LGY1MzgsZjUzOSxmNTQwLGY1NDEsZjU0MixmNTQzLAorZjU0NCxmNTQ1LGY1NDYsZjU0NyxmNTQ4LGY1NDksZjU1MCxmNTUxLGY1NTIsZjU1MyxmNTU0LGY1NTUsZjU1NixmNTU3LGY1NTgsZjU1OSwKK2Y1NjAsZjU2MSxmNTYyLGY1NjMsZjU2NCxmNTY1LGY1NjYsZjU2NyxmNTY4LGY1NjksZjU3MCxmNTcxLGY1NzIsZjU3MyxmNTc0LGY1NzUsCitmNTc2LGY1NzcsZjU3OCxmNTc5LGY1ODAsZjU4MSxmNTgyLGY1ODMsZjU4NCxmNTg1LGY1ODYsZjU4NyxmNTg4LGY1ODksZjU5MCxmNTkxLAorZjU5MixmNTkzLGY1OTQsZjU5NSxmNTk2LGY1OTcsZjU5OCxmNTk5LGY2MDAsZjYwMSxmNjAyLGY2MDMsZjYwNCxmNjA1LGY2MDYsZjYwNywKK2Y2MDgsZjYwOSxmNjEwLGY2MTEsZjYxMixmNjEzLGY2MTQsZjYxNSxmNjE2LGY2MTcsZjYxOCxmNjE5LGY2MjAsZjYyMSxmNjIyLGY2MjMsCitmNjI0LGY2MjUsZjYyNixmNjI3LGY2MjgsZjYyOSxmNjMwLGY2MzEsZjYzMixmNjMzLGY2MzQsZjYzNSxmNjM2LGY2MzcsZjYzOCxmNjM5LAorZjY0MCxmNjQxLGY2NDIsZjY0MyxmNjQ0LGY2NDUsZjY0NixmNjQ3LGY2NDgsZjY0OSxmNjUwLGY2NTEsZjY1MixmNjUzLGY2NTQsZjY1NSwKK2Y2NTYsZjY1NyxmNjU4LGY2NTksZjY2MCxmNjYxLGY2NjIsZjY2MyxmNjY0LGY2NjUsZjY2NixmNjY3LGY2NjgsZjY2OSxmNjcwLGY2NzEsCitmNjcyLGY2NzMsZjY3NCxmNjc1LGY2NzYsZjY3NyxmNjc4LGY2NzksZjY4MCxmNjgxLGY2ODIsZjY4MyxmNjg0LGY2ODUsZjY4NixmNjg3LAorZjY4OCxmNjg5LGY2OTAsZjY5MSxmNjkyLGY2OTMsZjY5NCxmNjk1LGY2OTYsZjY5NyxmNjk4LGY2OTksZjcwMCxmNzAxLGY3MDIsZjcwMywKK2Y3MDQsZjcwNSxmNzA2LGY3MDcsZjcwOCxmNzA5LGY3MTAsZjcxMSxmNzEyLGY3MTMsZjcxNCxmNzE1LGY3MTYsZjcxNyxmNzE4LGY3MTksCitmNzIwLGY3MjEsZjcyMixmNzIzLGY3MjQsZjcyNSxmNzI2LGY3MjcsZjcyOCxmNzI5LGY3MzAsZjczMSxmNzMyLGY3MzMsZjczNCxmNzM1LAorZjczNixmNzM3LGY3MzgsZjczOSxmNzQwLGY3NDEsZjc0MixmNzQzLGY3NDQsZjc0NSxmNzQ2LGY3NDcsZjc0OCxmNzQ5LGY3NTAsZjc1MSwKK2Y3NTIsZjc1MyxmNzU0LGY3NTUsZjc1NixmNzU3LGY3NTgsZjc1OSxmNzYwLGY3NjEsZjc2MixmNzYzLGY3NjQsZjc2NSxmNzY2LGY3NjcsCitmNzY4LGY3NjksZjc3MCxmNzcxLGY3NzIsZjc3MyxmNzc0LGY3NzUsZjc3NixmNzc3LGY3NzgsZjc3OSxmNzgwLGY3ODEsZjc4MixmNzgzLAorZjc4NCxmNzg1LGY3ODYsZjc4NyxmNzg4LGY3ODksZjc5MCxmNzkxLGY3OTIsZjc5MyxmNzk0LGY3OTUsZjc5NixmNzk3LGY3OTgsZjc5OSwKK2Y4MDAsZjgwMSxmODAyLGY4MDMsZjgwNCxmODA1LGY4MDYsZjgwNyxmODA4LGY4MDksZjgxMCxmODExLGY4MTIsZjgxMyxmODE0LGY4MTUsCitmODE2LGY4MTcsZjgxOCxmODE5LGY4MjAsZjgyMSxmODIyLGY4MjMsZjgyNCxmODI1LGY4MjYsZjgyNyxmODI4LGY4MjksZjgzMCxmODMxLAorZjgzMixmODMzLGY4MzQsZjgzNSxmODM2LGY4MzcsZjgzOCxmODM5LGY4NDAsZjg0MSxmODQyLGY4NDMsZjg0NCxmODQ1LGY4NDYsZjg0NywKK2Y4NDgsZjg0OSxmODUwLGY4NTEsZjg1MixmODUzLGY4NTQsZjg1NSxmODU2LGY4NTcsZjg1OCxmODU5LGY4NjAsZjg2MSxmODYyLGY4NjMsCitmODY0LGY4NjUsZjg2NixmODY3LGY4NjgsZjg2OSxmODcwLGY4NzEsZjg3MixmODczLGY4NzQsZjg3NSxmODc2LGY4NzcsZjg3OCxmODc5LAorZjg4MCxmODgxLGY4ODIsZjg4MyxmODg0LGY4ODUsZjg4NixmODg3LGY4ODgsZjg4OSxmODkwLGY4OTEsZjg5MixmODkzLGY4OTQsZjg5NSwKK2Y4OTYsZjg5NyxmODk4LGY4OTksZjkwMCxmOTAxLGY5MDIsZjkwMyxmOTA0LGY5MDUsZjkwNixmOTA3LGY5MDgsZjkwOSxmOTEwLGY5MTEsCitmOTEyLGY5MTMsZjkxNCxmOTE1LGY5MTYsZjkxNyxmOTE4LGY5MTksZjkyMCxmOTIxLGY5MjIsZjkyMyxmOTI0LGY5MjUsZjkyNixmOTI3LAorZjkyOCxmOTI5LGY5MzAsZjkzMSxmOTMyLGY5MzMsZjkzNCxmOTM1LGY5MzYsZjkzNyxmOTM4LGY5MzksZjk0MCxmOTQxLGY5NDIsZjk0MywKK2Y5NDQsZjk0NSxmOTQ2LGY5NDcsZjk0OCxmOTQ5LGY5NTAsZjk1MSxmOTUyLGY5NTMsZjk1NCxmOTU1LGY5NTYsZjk1NyxmOTU4LGY5NTksCitmOTYwLGY5NjEsZjk2MixmOTYzLGY5NjQsZjk2NSxmOTY2LGY5NjcsZjk2OCxmOTY5LGY5NzAsZjk3MSxmOTcyLGY5NzMsZjk3NCxmOTc1LAorZjk3NixmOTc3LGY5NzgsZjk3OSxmOTgwLGY5ODEsZjk4MixmOTgzLGY5ODQsZjk4NSxmOTg2LGY5ODcsZjk4OCxmOTg5LGY5OTAsZjk5MSwKK2Y5OTIsZjk5MyxmOTk0LGY5OTUsZjk5NixmOTk3LGY5OTgsZjk5OSxmMTAwMCxmMTAwMSxmMTAwMixmMTAwMyxmMTAwNCxmMTAwNSxmMTAwNixmMTAwNywKK2YxMDA4LGYxMDA5LGYxMDEwLGYxMDExLGYxMDEyLGYxMDEzLGYxMDE0LGYxMDE1LGYxMDE2LGYxMDE3LGYxMDE4LGYxMDE5LGYxMDIwLGYxMDIxLGYxMDIyLGYxMDIzLAorZjEwMjQsZjEwMjUsZjEwMjYsZjEwMjcsZjEwMjgsZjEwMjksZjEwMzAsZjEwMzEsZjEwMzIsZjEwMzMsZjEwMzQsZjEwMzUsZjEwMzYsZjEwMzcsZjEwMzgsZjEwMzksCitmMTA0MCxmMTA0MSxmMTA0MixmMTA0MyxmMTA0NCxmMTA0NSxmMTA0NixmMTA0NyxmMTA0OCxmMTA0OSxmMTA1MCxmMTA1MSxmMTA1MixmMTA1MyxmMTA1NCxmMTA1NSwKK2YxMDU2LGYxMDU3LGYxMDU4LGYxMDU5LGYxMDYwLGYxMDYxLGYxMDYyLGYxMDYzLGYxMDY0LGYxMDY1LGYxMDY2LGYxMDY3LGYxMDY4LGYxMDY5LGYxMDcwLGYxMDcxLAorZjEwNzIsZjEwNzMsZjEwNzQsZjEwNzUsZjEwNzYsZjEwNzcsZjEwNzgsZjEwNzksZjEwODAsZjEwODEsZjEwODIsZjEwODMsZjEwODQsZjEwODUsZjEwODYsZjEwODcsCitmMTA4OCxmMTA4OSxmMTA5MCxmMTA5MSxmMTA5MixmMTA5MyxmMTA5NCxmMTA5NSxmMTA5NixmMTA5NyxmMTA5OCxmMTA5OSxmMTEwMCxmMTEwMSxmMTEwMixmMTEwMywKK2YxMTA0LGYxMTA1LGYxMTA2LGYxMTA3LGYxMTA4LGYxMTA5LGYxMTEwLGYxMTExLGYxMTEyLGYxMTEzLGYxMTE0LGYxMTE1LGYxMTE2LGYxMTE3LGYxMTE4LGYxMTE5LAorZjExMjAsZjExMjEsZjExMjIsZjExMjMsZjExMjQsZjExMjUsZjExMjYsZjExMjcsZjExMjgsZjExMjksZjExMzAsZjExMzEsZjExMzIsZjExMzMsZjExMzQsZjExMzUsCitmMTEzNixmMTEzNyxmMTEzOCxmMTEzOSxmMTE0MCxmMTE0MSxmMTE0MixmMTE0MyxmMTE0NCxmMTE0NSxmMTE0NixmMTE0NyxmMTE0OCxmMTE0OSxmMTE1MCxmMTE1MSwKK2YxMTUyLGYxMTUzLGYxMTU0LGYxMTU1LGYxMTU2LGYxMTU3LGYxMTU4LGYxMTU5LGYxMTYwLGYxMTYxLGYxMTYyLGYxMTYzLGYxMTY0LGYxMTY1LGYxMTY2LGYxMTY3LAorZjExNjgsZjExNjksZjExNzAsZjExNzEsZjExNzIsZjExNzMsZjExNzQsZjExNzUsZjExNzYsZjExNzcsZjExNzgsZjExNzksZjExODAsZjExODEsZjExODIsZjExODMsCitmMTE4NCxmMTE4NSxmMTE4NixmMTE4NyxmMTE4OCxmMTE4OSxmMTE5MCxmMTE5MSxmMTE5MixmMTE5MyxmMTE5NCxmMTE5NSxmMTE5NixmMTE5NyxmMTE5OCxmMTE5OSwKK2YxMjAwLGYxMjAxLGYxMjAyLGYxMjAzLGYxMjA0LGYxMjA1LGYxMjA2LGYxMjA3LGYxMjA4LGYxMjA5LGYxMjEwLGYxMjExLGYxMjEyLGYxMjEzLGYxMjE0LGYxMjE1LAorZjEyMTYsZjEyMTcsZjEyMTgsZjEyMTksZjEyMjAsZjEyMjEsZjEyMjIsZjEyMjMsZjEyMjQsZjEyMjUsZjEyMjYsZjEyMjcsZjEyMjgsZjEyMjksZjEyMzAsZjEyMzEsCitmMTIzMixmMTIzMyxmMTIzNCxmMTIzNSxmMTIzNixmMTIzNyxmMTIzOCxmMTIzOSxmMTI0MCxmMTI0MSxmMTI0MixmMTI0MyxmMTI0NCxmMTI0NSxmMTI0NixmMTI0NywKK2YxMjQ4LGYxMjQ5LGYxMjUwLGYxMjUxLGYxMjUyLGYxMjUzLGYxMjU0LGYxMjU1LGYxMjU2LGYxMjU3LGYxMjU4LGYxMjU5LGYxMjYwLGYxMjYxLGYxMjYyLGYxMjYzLAorZjEyNjQsZjEyNjUsZjEyNjYsZjEyNjcsZjEyNjgsZjEyNjksZjEyNzAsZjEyNzEsZjEyNzIsZjEyNzMsZjEyNzQsZjEyNzUsZjEyNzYsZjEyNzcsZjEyNzgsZjEyNzksCitmMTI4MCxmMTI4MSxmMTI4MixmMTI4MyxmMTI4NCxmMTI4NSxmMTI4NixmMTI4NyxmMTI4OCxmMTI4OSxmMTI5MCxmMTI5MSxmMTI5MixmMTI5MyxmMTI5NCxmMTI5NSwKK2YxMjk2LGYxMjk3LGYxMjk4LGYxMjk5LGYxMzAwLGYxMzAxLGYxMzAyLGYxMzAzLGYxMzA0LGYxMzA1LGYxMzA2LGYxMzA3LGYxMzA4LGYxMzA5LGYxMzEwLGYxMzExLAorZjEzMTIsZjEzMTMsZjEzMTQsZjEzMTUsZjEzMTYsZjEzMTcsZjEzMTgsZjEzMTksZjEzMjAsZjEzMjEsZjEzMjIsZjEzMjMsZjEzMjQsZjEzMjUsZjEzMjYsZjEzMjcsCitmMTMyOCxmMTMyOSxmMTMzMCxmMTMzMSxmMTMzMixmMTMzMyxmMTMzNCxmMTMzNSxmMTMzNixmMTMzNyxmMTMzOCxmMTMzOSxmMTM0MCxmMTM0MSxmMTM0MixmMTM0MywKK2YxMzQ0LGYxMzQ1LGYxMzQ2LGYxMzQ3LGYxMzQ4LGYxMzQ5LGYxMzUwLGYxMzUxLGYxMzUyLGYxMzUzLGYxMzU0LGYxMzU1LGYxMzU2LGYxMzU3LGYxMzU4LGYxMzU5LAorZjEzNjAsZjEzNjEsZjEzNjIsZjEzNjMsZjEzNjQsZjEzNjUsZjEzNjYsZjEzNjcsZjEzNjgsZjEzNjksZjEzNzAsZjEzNzEsZjEzNzIsZjEzNzMsZjEzNzQsZjEzNzUsCitmMTM3NixmMTM3NyxmMTM3OCxmMTM3OSxmMTM4MCxmMTM4MSxmMTM4MixmMTM4MyxmMTM4NCxmMTM4NSxmMTM4NixmMTM4NyxmMTM4OCxmMTM4OSxmMTM5MCxmMTM5MSwKK2YxMzkyLGYxMzkzLGYxMzk0LGYxMzk1LGYxMzk2LGYxMzk3LGYxMzk4LGYxMzk5LGYxNDAwLGYxNDAxLGYxNDAyLGYxNDAzLGYxNDA0LGYxNDA1LGYxNDA2LGYxNDA3LAorZjE0MDgsZjE0MDksZjE0MTAsZjE0MTEsZjE0MTIsZjE0MTMsZjE0MTQsZjE0MTUsZjE0MTYsZjE0MTcsZjE0MTgsZjE0MTksZjE0MjAsZjE0MjEsZjE0MjIsZjE0MjMsCitmMTQyNCxmMTQyNSxmMTQyNixmMTQyNyxmMTQyOCxmMTQyOSxmMTQzMCxmMTQzMSxmMTQzMixmMTQzMyxmMTQzNCxmMTQzNSxmMTQzNixmMTQzNyxmMTQzOCxmMTQzOSwKK2YxNDQwLGYxNDQxLGYxNDQyLGYxNDQzLGYxNDQ0LGYxNDQ1LGYxNDQ2LGYxNDQ3LGYxNDQ4LGYxNDQ5LGYxNDUwLGYxNDUxLGYxNDUyLGYxNDUzLGYxNDU0LGYxNDU1LAorZjE0NTYsZjE0NTcsZjE0NTgsZjE0NTksZjE0NjAsZjE0NjEsZjE0NjIsZjE0NjMsZjE0NjQsZjE0NjUsZjE0NjYsZjE0NjcsZjE0NjgsZjE0NjksZjE0NzAsZjE0NzEsCitmMTQ3MixmMTQ3MyxmMTQ3NCxmMTQ3NSxmMTQ3NixmMTQ3NyxmMTQ3OCxmMTQ3OSxmMTQ4MCxmMTQ4MSxmMTQ4MixmMTQ4MyxmMTQ4NCxmMTQ4NSxmMTQ4NixmMTQ4NywKK2YxNDg4LGYxNDg5LGYxNDkwLGYxNDkxLGYxNDkyLGYxNDkzLGYxNDk0LGYxNDk1LGYxNDk2LGYxNDk3LGYxNDk4LGYxNDk5LGYxNTAwLGYxNTAxLGYxNTAyLGYxNTAzLAorZjE1MDQsZjE1MDUsZjE1MDYsZjE1MDcsZjE1MDgsZjE1MDksZjE1MTAsZjE1MTEsZjE1MTIsZjE1MTMsZjE1MTQsZjE1MTUsZjE1MTYsZjE1MTcsZjE1MTgsZjE1MTksCitmMTUyMCxmMTUyMSxmMTUyMixmMTUyMyxmMTUyNCxmMTUyNSxmMTUyNixmMTUyNyxmMTUyOCxmMTUyOSxmMTUzMCxmMTUzMSxmMTUzMixmMTUzMyxmMTUzNCxmMTUzNSwKK2YxNTM2LGYxNTM3LGYxNTM4LGYxNTM5LGYxNTQwLGYxNTQxLGYxNTQyLGYxNTQzLGYxNTQ0LGYxNTQ1LGYxNTQ2LGYxNTQ3LGYxNTQ4LGYxNTQ5LGYxNTUwLGYxNTUxLAorZjE1NTIsZjE1NTMsZjE1NTQsZjE1NTUsZjE1NTYsZjE1NTcsZjE1NTgsZjE1NTksZjE1NjAsZjE1NjEsZjE1NjIsZjE1NjMsZjE1NjQsZjE1NjUsZjE1NjYsZjE1NjcsCitmMTU2OCxmMTU2OSxmMTU3MCxmMTU3MSxmMTU3MixmMTU3MyxmMTU3NCxmMTU3NSxmMTU3NixmMTU3NyxmMTU3OCxmMTU3OSxmMTU4MCxmMTU4MSxmMTU4MixmMTU4MywKK2YxNTg0LGYxNTg1LGYxNTg2LGYxNTg3LGYxNTg4LGYxNTg5LGYxNTkwLGYxNTkxLGYxNTkyLGYxNTkzLGYxNTk0LGYxNTk1LGYxNTk2LGYxNTk3LGYxNTk4LGYxNTk5LAorZjE2MDAsZjE2MDEsZjE2MDIsZjE2MDMsZjE2MDQsZjE2MDUsZjE2MDYsZjE2MDcsZjE2MDgsZjE2MDksZjE2MTAsZjE2MTEsZjE2MTIsZjE2MTMsZjE2MTQsZjE2MTUsCitmMTYxNixmMTYxNyxmMTYxOCxmMTYxOSxmMTYyMCxmMTYyMSxmMTYyMixmMTYyMyxmMTYyNCxmMTYyNSxmMTYyNixmMTYyNyxmMTYyOCxmMTYyOSxmMTYzMCxmMTYzMSwKK2YxNjMyLGYxNjMzLGYxNjM0LGYxNjM1LGYxNjM2LGYxNjM3LGYxNjM4LGYxNjM5LGYxNjQwLGYxNjQxLGYxNjQyLGYxNjQzLGYxNjQ0LGYxNjQ1LGYxNjQ2LGYxNjQ3LAorZjE2NDgsZjE2NDksZjE2NTAsZjE2NTEsZjE2NTIsZjE2NTMsZjE2NTQsZjE2NTUsZjE2NTYsZjE2NTcsZjE2NTgsZjE2NTksZjE2NjAsZjE2NjEsZjE2NjIsZjE2NjMsCitmMTY2NCxmMTY2NSxmMTY2NixmMTY2NyxmMTY2OCxmMTY2OSxmMTY3MCxmMTY3MSxmMTY3MixmMTY3MyxmMTY3NCxmMTY3NSxmMTY3NixmMTY3NyxmMTY3OCxmMTY3OSwKK2YxNjgwLGYxNjgxLGYxNjgyLGYxNjgzLGYxNjg0LGYxNjg1LGYxNjg2LGYxNjg3LGYxNjg4LGYxNjg5LGYxNjkwLGYxNjkxLGYxNjkyLGYxNjkzLGYxNjk0LGYxNjk1LAorZjE2OTYsZjE2OTcsZjE2OTgsZjE2OTksZjE3MDAsZjE3MDEsZjE3MDIsZjE3MDMsZjE3MDQsZjE3MDUsZjE3MDYsZjE3MDcsZjE3MDgsZjE3MDksZjE3MTAsZjE3MTEsCitmMTcxMixmMTcxMyxmMTcxNCxmMTcxNSxmMTcxNixmMTcxNyxmMTcxOCxmMTcxOSxmMTcyMCxmMTcyMSxmMTcyMixmMTcyMyxmMTcyNCxmMTcyNSxmMTcyNixmMTcyNywKK2YxNzI4LGYxNzI5LGYxNzMwLGYxNzMxLGYxNzMyLGYxNzMzLGYxNzM0LGYxNzM1LGYxNzM2LGYxNzM3LGYxNzM4LGYxNzM5LGYxNzQwLGYxNzQxLGYxNzQyLGYxNzQzLAorZjE3NDQsZjE3NDUsZjE3NDYsZjE3NDcsZjE3NDgsZjE3NDksZjE3NTAsZjE3NTEsZjE3NTIsZjE3NTMsZjE3NTQsZjE3NTUsZjE3NTYsZjE3NTcsZjE3NTgsZjE3NTksCitmMTc2MCxmMTc2MSxmMTc2MixmMTc2MyxmMTc2NCxmMTc2NSxmMTc2NixmMTc2NyxmMTc2OCxmMTc2OSxmMTc3MCxmMTc3MSxmMTc3MixmMTc3MyxmMTc3NCxmMTc3NSwKK2YxNzc2LGYxNzc3LGYxNzc4LGYxNzc5LGYxNzgwLGYxNzgxLGYxNzgyLGYxNzgzLGYxNzg0LGYxNzg1LGYxNzg2LGYxNzg3LGYxNzg4LGYxNzg5LGYxNzkwLGYxNzkxLAorZjE3OTIsZjE3OTMsZjE3OTQsZjE3OTUsZjE3OTYsZjE3OTcsZjE3OTgsZjE3OTksZjE4MDAsZjE4MDEsZjE4MDIsZjE4MDMsZjE4MDQsZjE4MDUsZjE4MDYsZjE4MDcsCitmMTgwOCxmMTgwOSxmMTgxMCxmMTgxMSxmMTgxMixmMTgxMyxmMTgxNCxmMTgxNSxmMTgxNixmMTgxNyxmMTgxOCxmMTgxOSxmMTgyMCxmMTgyMSxmMTgyMixmMTgyMywKK2YxODI0LGYxODI1LGYxODI2LGYxODI3LGYxODI4LGYxODI5LGYxODMwLGYxODMxLGYxODMyLGYxODMzLGYxODM0LGYxODM1LGYxODM2LGYxODM3LGYxODM4LGYxODM5LAorZjE4NDAsZjE4NDEsZjE4NDIsZjE4NDMsZjE4NDQsZjE4NDUsZjE4NDYsZjE4NDcsZjE4NDgsZjE4NDksZjE4NTAsZjE4NTEsZjE4NTIsZjE4NTMsZjE4NTQsZjE4NTUsCitmMTg1NixmMTg1NyxmMTg1OCxmMTg1OSxmMTg2MCxmMTg2MSxmMTg2MixmMTg2MyxmMTg2NCxmMTg2NSxmMTg2NixmMTg2NyxmMTg2OCxmMTg2OSxmMTg3MCxmMTg3MSwKK2YxODcyLGYxODczLGYxODc0LGYxODc1LGYxODc2LGYxODc3LGYxODc4LGYxODc5LGYxODgwLGYxODgxLGYxODgyLGYxODgzLGYxODg0LGYxODg1LGYxODg2LGYxODg3LAorZjE4ODgsZjE4ODksZjE4OTAsZjE4OTEsZjE4OTIsZjE4OTMsZjE4OTQsZjE4OTUsZjE4OTYsZjE4OTcsZjE4OTgsZjE4OTksZjE5MDAsZjE5MDEsZjE5MDIsZjE5MDMsCitmMTkwNCxmMTkwNSxmMTkwNixmMTkwNyxmMTkwOCxmMTkwOSxmMTkxMCxmMTkxMSxmMTkxMixmMTkxMyxmMTkxNCxmMTkxNSxmMTkxNixmMTkxNyxmMTkxOCxmMTkxOSwKK2YxOTIwLGYxOTIxLGYxOTIyLGYxOTIzLGYxOTI0LGYxOTI1LGYxOTI2LGYxOTI3LGYxOTI4LGYxOTI5LGYxOTMwLGYxOTMxLGYxOTMyLGYxOTMzLGYxOTM0LGYxOTM1LAorZjE5MzYsZjE5MzcsZjE5MzgsZjE5MzksZjE5NDAsZjE5NDEsZjE5NDIsZjE5NDMsZjE5NDQsZjE5NDUsZjE5NDYsZjE5NDcsZjE5NDgsZjE5NDksZjE5NTAsZjE5NTEsCitmMTk1MixmMTk1MyxmMTk1NCxmMTk1NSxmMTk1NixmMTk1NyxmMTk1OCxmMTk1OSxmMTk2MCxmMTk2MSxmMTk2MixmMTk2MyxmMTk2NCxmMTk2NSxmMTk2NixmMTk2NywKK2YxOTY4LGYxOTY5LGYxOTcwLGYxOTcxLGYxOTcyLGYxOTczLGYxOTc0LGYxOTc1LGYxOTc2LGYxOTc3LGYxOTc4LGYxOTc5LGYxOTgwLGYxOTgxLGYxOTgyLGYxOTgzLAorZjE5ODQsZjE5ODUsZjE5ODYsZjE5ODcsZjE5ODgsZjE5ODksZjE5OTAsZjE5OTEsZjE5OTIsZjE5OTMsZjE5OTQsZjE5OTUsZjE5OTYsZjE5OTcsZjE5OTgsZjE5OTksCitmMjAwMCxmMjAwMSxmMjAwMixmMjAwMyxmMjAwNCxmMjAwNSxmMjAwNixmMjAwNyxmMjAwOCxmMjAwOSxmMjAxMCxmMjAxMSxmMjAxMixmMjAxMyxmMjAxNCxmMjAxNSwKK2YyMDE2LGYyMDE3LGYyMDE4LGYyMDE5LGYyMDIwLGYyMDIxLGYyMDIyLGYyMDIzLGYyMDI0LGYyMDI1LGYyMDI2LGYyMDI3LGYyMDI4LGYyMDI5LGYyMDMwLGYyMDMxLAorZjIwMzIsZjIwMzMsZjIwMzQsZjIwMzUsZjIwMzYsZjIwMzcsZjIwMzgsZjIwMzksZjIwNDAsZjIwNDEsZjIwNDIsZjIwNDMsZjIwNDQsZjIwNDUsZjIwNDYsZjIwNDcsCitmMjA0OCxmMjA0OSxmMjA1MCxmMjA1MSxmMjA1MixmMjA1MyxmMjA1NCxmMjA1NSxmMjA1NixmMjA1NyxmMjA1OCxmMjA1OSxmMjA2MCxmMjA2MSxmMjA2MixmMjA2MywKK2YyMDY0LGYyMDY1LGYyMDY2LGYyMDY3LGYyMDY4LGYyMDY5LGYyMDcwLGYyMDcxLGYyMDcyLGYyMDczLGYyMDc0LGYyMDc1LGYyMDc2LGYyMDc3LGYyMDc4LGYyMDc5LAorZjIwODAsZjIwODEsZjIwODIsZjIwODMsZjIwODQsZjIwODUsZjIwODYsZjIwODcsZjIwODgsZjIwODksZjIwOTAsZjIwOTEsZjIwOTIsZjIwOTMsZjIwOTQsZjIwOTUsCitmMjA5NixmMjA5NyxmMjA5OCxmMjA5OSxmMjEwMCxmMjEwMSxmMjEwMixmMjEwMyxmMjEwNCxmMjEwNSxmMjEwNixmMjEwNyxmMjEwOCxmMjEwOSxmMjExMCxmMjExMSwKK2YyMTEyLGYyMTEzLGYyMTE0LGYyMTE1LGYyMTE2LGYyMTE3LGYyMTE4LGYyMTE5LGYyMTIwLGYyMTIxLGYyMTIyLGYyMTIzLGYyMTI0LGYyMTI1LGYyMTI2LGYyMTI3LAorZjIxMjgsZjIxMjksZjIxMzAsZjIxMzEsZjIxMzIsZjIxMzMsZjIxMzQsZjIxMzUsZjIxMzYsZjIxMzcsZjIxMzgsZjIxMzksZjIxNDAsZjIxNDEsZjIxNDIsZjIxNDMsCitmMjE0NCxmMjE0NSxmMjE0NixmMjE0NyxmMjE0OCxmMjE0OSxmMjE1MCxmMjE1MSxmMjE1MixmMjE1MyxmMjE1NCxmMjE1NSxmMjE1NixmMjE1NyxmMjE1OCxmMjE1OSwKK2YyMTYwLGYyMTYxLGYyMTYyLGYyMTYzLGYyMTY0LGYyMTY1LGYyMTY2LGYyMTY3LGYyMTY4LGYyMTY5LGYyMTcwLGYyMTcxLGYyMTcyLGYyMTczLGYyMTc0LGYyMTc1LAorZjIxNzYsZjIxNzcsZjIxNzgsZjIxNzksZjIxODAsZjIxODEsZjIxODIsZjIxODMsZjIxODQsZjIxODUsZjIxODYsZjIxODcsZjIxODgsZjIxODksZjIxOTAsZjIxOTEsCitmMjE5MixmMjE5MyxmMjE5NCxmMjE5NSxmMjE5NixmMjE5NyxmMjE5OCxmMjE5OSxmMjIwMCxmMjIwMSxmMjIwMixmMjIwMyxmMjIwNCxmMjIwNSxmMjIwNixmMjIwNywKK2YyMjA4LGYyMjA5LGYyMjEwLGYyMjExLGYyMjEyLGYyMjEzLGYyMjE0LGYyMjE1LGYyMjE2LGYyMjE3LGYyMjE4LGYyMjE5LGYyMjIwLGYyMjIxLGYyMjIyLGYyMjIzLAorZjIyMjQsZjIyMjUsZjIyMjYsZjIyMjcsZjIyMjgsZjIyMjksZjIyMzAsZjIyMzEsZjIyMzIsZjIyMzMsZjIyMzQsZjIyMzUsZjIyMzYsZjIyMzcsZjIyMzgsZjIyMzksCitmMjI0MCxmMjI0MSxmMjI0MixmMjI0MyxmMjI0NCxmMjI0NSxmMjI0NixmMjI0NyxmMjI0OCxmMjI0OSxmMjI1MCxmMjI1MSxmMjI1MixmMjI1MyxmMjI1NCxmMjI1NSwKK2YyMjU2LGYyMjU3LGYyMjU4LGYyMjU5LGYyMjYwLGYyMjYxLGYyMjYyLGYyMjYzLGYyMjY0LGYyMjY1LGYyMjY2LGYyMjY3LGYyMjY4LGYyMjY5LGYyMjcwLGYyMjcxLAorZjIyNzIsZjIyNzMsZjIyNzQsZjIyNzUsZjIyNzYsZjIyNzcsZjIyNzgsZjIyNzksZjIyODAsZjIyODEsZjIyODIsZjIyODMsZjIyODQsZjIyODUsZjIyODYsZjIyODcsCitmMjI4OCxmMjI4OSxmMjI5MCxmMjI5MSxmMjI5MixmMjI5MyxmMjI5NCxmMjI5NSxmMjI5NixmMjI5NyxmMjI5OCxmMjI5OSxmMjMwMCxmMjMwMSxmMjMwMixmMjMwMywKK2YyMzA0LGYyMzA1LGYyMzA2LGYyMzA3LGYyMzA4LGYyMzA5LGYyMzEwLGYyMzExLGYyMzEyLGYyMzEzLGYyMzE0LGYyMzE1LGYyMzE2LGYyMzE3LGYyMzE4LGYyMzE5LAorZjIzMjAsZjIzMjEsZjIzMjIsZjIzMjMsZjIzMjQsZjIzMjUsZjIzMjYsZjIzMjcsZjIzMjgsZjIzMjksZjIzMzAsZjIzMzEsZjIzMzIsZjIzMzMsZjIzMzQsZjIzMzUsCitmMjMzNixmMjMzNyxmMjMzOCxmMjMzOSxmMjM0MCxmMjM0MSxmMjM0MixmMjM0MyxmMjM0NCxmMjM0NSxmMjM0NixmMjM0NyxmMjM0OCxmMjM0OSxmMjM1MCxmMjM1MSwKK2YyMzUyLGYyMzUzLGYyMzU0LGYyMzU1LGYyMzU2LGYyMzU3LGYyMzU4LGYyMzU5LGYyMzYwLGYyMzYxLGYyMzYyLGYyMzYzLGYyMzY0LGYyMzY1LGYyMzY2LGYyMzY3LAorZjIzNjgsZjIzNjksZjIzNzAsZjIzNzEsZjIzNzIsZjIzNzMsZjIzNzQsZjIzNzUsZjIzNzYsZjIzNzcsZjIzNzgsZjIzNzksZjIzODAsZjIzODEsZjIzODIsZjIzODMsCitmMjM4NCxmMjM4NSxmMjM4NixmMjM4NyxmMjM4OCxmMjM4OSxmMjM5MCxmMjM5MSxmMjM5MixmMjM5MyxmMjM5NCxmMjM5NSxmMjM5NixmMjM5NyxmMjM5OCxmMjM5OSwKK2YyNDAwLGYyNDAxLGYyNDAyLGYyNDAzLGYyNDA0LGYyNDA1LGYyNDA2LGYyNDA3LGYyNDA4LGYyNDA5LGYyNDEwLGYyNDExLGYyNDEyLGYyNDEzLGYyNDE0LGYyNDE1LAorZjI0MTYsZjI0MTcsZjI0MTgsZjI0MTksZjI0MjAsZjI0MjEsZjI0MjIsZjI0MjMsZjI0MjQsZjI0MjUsZjI0MjYsZjI0MjcsZjI0MjgsZjI0MjksZjI0MzAsZjI0MzEsCitmMjQzMixmMjQzMyxmMjQzNCxmMjQzNSxmMjQzNixmMjQzNyxmMjQzOCxmMjQzOSxmMjQ0MCxmMjQ0MSxmMjQ0MixmMjQ0MyxmMjQ0NCxmMjQ0NSxmMjQ0NixmMjQ0NywKK2YyNDQ4LGYyNDQ5LGYyNDUwLGYyNDUxLGYyNDUyLGYyNDUzLGYyNDU0LGYyNDU1LGYyNDU2LGYyNDU3LGYyNDU4LGYyNDU5LGYyNDYwLGYyNDYxLGYyNDYyLGYyNDYzLAorZjI0NjQsZjI0NjUsZjI0NjYsZjI0NjcsZjI0NjgsZjI0NjksZjI0NzAsZjI0NzEsZjI0NzIsZjI0NzMsZjI0NzQsZjI0NzUsZjI0NzYsZjI0NzcsZjI0NzgsZjI0NzksCitmMjQ4MCxmMjQ4MSxmMjQ4MixmMjQ4MyxmMjQ4NCxmMjQ4NSxmMjQ4NixmMjQ4NyxmMjQ4OCxmMjQ4OSxmMjQ5MCxmMjQ5MSxmMjQ5MixmMjQ5MyxmMjQ5NCxmMjQ5NSwKK2YyNDk2LGYyNDk3LGYyNDk4LGYyNDk5LGYyNTAwLGYyNTAxLGYyNTAyLGYyNTAzLGYyNTA0LGYyNTA1LGYyNTA2LGYyNTA3LGYyNTA4LGYyNTA5LGYyNTEwLGYyNTExLAorZjI1MTIsZjI1MTMsZjI1MTQsZjI1MTUsZjI1MTYsZjI1MTcsZjI1MTgsZjI1MTksZjI1MjAsZjI1MjEsZjI1MjIsZjI1MjMsZjI1MjQsZjI1MjUsZjI1MjYsZjI1MjcsCitmMjUyOCxmMjUyOSxmMjUzMCxmMjUzMSxmMjUzMixmMjUzMyxmMjUzNCxmMjUzNSxmMjUzNixmMjUzNyxmMjUzOCxmMjUzOSxmMjU0MCxmMjU0MSxmMjU0MixmMjU0MywKK2YyNTQ0LGYyNTQ1LGYyNTQ2LGYyNTQ3LGYyNTQ4LGYyNTQ5LGYyNTUwLGYyNTUxLGYyNTUyLGYyNTUzLGYyNTU0LGYyNTU1LGYyNTU2LGYyNTU3LGYyNTU4LGYyNTU5LAorZjI1NjAsZjI1NjEsZjI1NjIsZjI1NjMsZjI1NjQsZjI1NjUsZjI1NjYsZjI1NjcsZjI1NjgsZjI1NjksZjI1NzAsZjI1NzEsZjI1NzIsZjI1NzMsZjI1NzQsZjI1NzUsCitmMjU3NixmMjU3NyxmMjU3OCxmMjU3OSxmMjU4MCxmMjU4MSxmMjU4MixmMjU4MyxmMjU4NCxmMjU4NSxmMjU4NixmMjU4NyxmMjU4OCxmMjU4OSxmMjU5MCxmMjU5MSwKK2YyNTkyLGYyNTkzLGYyNTk0LGYyNTk1LGYyNTk2LGYyNTk3LGYyNTk4LGYyNTk5LGYyNjAwLGYyNjAxLGYyNjAyLGYyNjAzLGYyNjA0LGYyNjA1LGYyNjA2LGYyNjA3LAorZjI2MDgsZjI2MDksZjI2MTAsZjI2MTEsZjI2MTIsZjI2MTMsZjI2MTQsZjI2MTUsZjI2MTYsZjI2MTcsZjI2MTgsZjI2MTksZjI2MjAsZjI2MjEsZjI2MjIsZjI2MjMsCitmMjYyNCxmMjYyNSxmMjYyNixmMjYyNyxmMjYyOCxmMjYyOSxmMjYzMCxmMjYzMSxmMjYzMixmMjYzMyxmMjYzNCxmMjYzNSxmMjYzNixmMjYzNyxmMjYzOCxmMjYzOSwKK2YyNjQwLGYyNjQxLGYyNjQyLGYyNjQzLGYyNjQ0LGYyNjQ1LGYyNjQ2LGYyNjQ3LGYyNjQ4LGYyNjQ5LGYyNjUwLGYyNjUxLGYyNjUyLGYyNjUzLGYyNjU0LGYyNjU1LAorZjI2NTYsZjI2NTcsZjI2NTgsZjI2NTksZjI2NjAsZjI2NjEsZjI2NjIsZjI2NjMsZjI2NjQsZjI2NjUsZjI2NjYsZjI2NjcsZjI2NjgsZjI2NjksZjI2NzAsZjI2NzEsCitmMjY3MixmMjY3MyxmMjY3NCxmMjY3NSxmMjY3NixmMjY3NyxmMjY3OCxmMjY3OSxmMjY4MCxmMjY4MSxmMjY4MixmMjY4MyxmMjY4NCxmMjY4NSxmMjY4NixmMjY4NywKK2YyNjg4LGYyNjg5LGYyNjkwLGYyNjkxLGYyNjkyLGYyNjkzLGYyNjk0LGYyNjk1LGYyNjk2LGYyNjk3LGYyNjk4LGYyNjk5LGYyNzAwLGYyNzAxLGYyNzAyLGYyNzAzLAorZjI3MDQsZjI3MDUsZjI3MDYsZjI3MDcsZjI3MDgsZjI3MDksZjI3MTAsZjI3MTEsZjI3MTIsZjI3MTMsZjI3MTQsZjI3MTUsZjI3MTYsZjI3MTcsZjI3MTgsZjI3MTksCitmMjcyMCxmMjcyMSxmMjcyMixmMjcyMyxmMjcyNCxmMjcyNSxmMjcyNixmMjcyNyxmMjcyOCxmMjcyOSxmMjczMCxmMjczMSxmMjczMixmMjczMyxmMjczNCxmMjczNSwKK2YyNzM2LGYyNzM3LGYyNzM4LGYyNzM5LGYyNzQwLGYyNzQxLGYyNzQyLGYyNzQzLGYyNzQ0LGYyNzQ1LGYyNzQ2LGYyNzQ3LGYyNzQ4LGYyNzQ5LGYyNzUwLGYyNzUxLAorZjI3NTIsZjI3NTMsZjI3NTQsZjI3NTUsZjI3NTYsZjI3NTcsZjI3NTgsZjI3NTksZjI3NjAsZjI3NjEsZjI3NjIsZjI3NjMsZjI3NjQsZjI3NjUsZjI3NjYsZjI3NjcsCitmMjc2OCxmMjc2OSxmMjc3MCxmMjc3MSxmMjc3MixmMjc3MyxmMjc3NCxmMjc3NSxmMjc3NixmMjc3NyxmMjc3OCxmMjc3OSxmMjc4MCxmMjc4MSxmMjc4MixmMjc4MywKK2YyNzg0LGYyNzg1LGYyNzg2LGYyNzg3LGYyNzg4LGYyNzg5LGYyNzkwLGYyNzkxLGYyNzkyLGYyNzkzLGYyNzk0LGYyNzk1LGYyNzk2LGYyNzk3LGYyNzk4LGYyNzk5LAorZjI4MDAsZjI4MDEsZjI4MDIsZjI4MDMsZjI4MDQsZjI4MDUsZjI4MDYsZjI4MDcsZjI4MDgsZjI4MDksZjI4MTAsZjI4MTEsZjI4MTIsZjI4MTMsZjI4MTQsZjI4MTUsCitmMjgxNixmMjgxNyxmMjgxOCxmMjgxOSxmMjgyMCxmMjgyMSxmMjgyMixmMjgyMyxmMjgyNCxmMjgyNSxmMjgyNixmMjgyNyxmMjgyOCxmMjgyOSxmMjgzMCxmMjgzMSwKK2YyODMyLGYyODMzLGYyODM0LGYyODM1LGYyODM2LGYyODM3LGYyODM4LGYyODM5LGYyODQwLGYyODQxLGYyODQyLGYyODQzLGYyODQ0LGYyODQ1LGYyODQ2LGYyODQ3LAorZjI4NDgsZjI4NDksZjI4NTAsZjI4NTEsZjI4NTIsZjI4NTMsZjI4NTQsZjI4NTUsZjI4NTYsZjI4NTcsZjI4NTgsZjI4NTksZjI4NjAsZjI4NjEsZjI4NjIsZjI4NjMsCitmMjg2NCxmMjg2NSxmMjg2NixmMjg2NyxmMjg2OCxmMjg2OSxmMjg3MCxmMjg3MSxmMjg3MixmMjg3MyxmMjg3NCxmMjg3NSxmMjg3NixmMjg3NyxmMjg3OCxmMjg3OSwKK2YyODgwLGYyODgxLGYyODgyLGYyODgzLGYyODg0LGYyODg1LGYyODg2LGYyODg3LGYyODg4LGYyODg5LGYyODkwLGYyODkxLGYyODkyLGYyODkzLGYyODk0LGYyODk1LAorZjI4OTYsZjI4OTcsZjI4OTgsZjI4OTksZjI5MDAsZjI5MDEsZjI5MDIsZjI5MDMsZjI5MDQsZjI5MDUsZjI5MDYsZjI5MDcsZjI5MDgsZjI5MDksZjI5MTAsZjI5MTEsCitmMjkxMixmMjkxMyxmMjkxNCxmMjkxNSxmMjkxNixmMjkxNyxmMjkxOCxmMjkxOSxmMjkyMCxmMjkyMSxmMjkyMixmMjkyMyxmMjkyNCxmMjkyNSxmMjkyNixmMjkyNywKK2YyOTI4LGYyOTI5LGYyOTMwLGYyOTMxLGYyOTMyLGYyOTMzLGYyOTM0LGYyOTM1LGYyOTM2LGYyOTM3LGYyOTM4LGYyOTM5LGYyOTQwLGYyOTQxLGYyOTQyLGYyOTQzLAorZjI5NDQsZjI5NDUsZjI5NDYsZjI5NDcsZjI5NDgsZjI5NDksZjI5NTAsZjI5NTEsZjI5NTIsZjI5NTMsZjI5NTQsZjI5NTUsZjI5NTYsZjI5NTcsZjI5NTgsZjI5NTksCitmMjk2MCxmMjk2MSxmMjk2MixmMjk2MyxmMjk2NCxmMjk2NSxmMjk2NixmMjk2NyxmMjk2OCxmMjk2OSxmMjk3MCxmMjk3MSxmMjk3MixmMjk3MyxmMjk3NCxmMjk3NSwKK2YyOTc2LGYyOTc3LGYyOTc4LGYyOTc5LGYyOTgwLGYyOTgxLGYyOTgyLGYyOTgzLGYyOTg0LGYyOTg1LGYyOTg2LGYyOTg3LGYyOTg4LGYyOTg5LGYyOTkwLGYyOTkxLAorZjI5OTIsZjI5OTMsZjI5OTQsZjI5OTUsZjI5OTYsZjI5OTcsZjI5OTgsZjI5OTksZjMwMDAsZjMwMDEsZjMwMDIsZjMwMDMsZjMwMDQsZjMwMDUsZjMwMDYsZjMwMDcsCitmMzAwOCxmMzAwOSxmMzAxMCxmMzAxMSxmMzAxMixmMzAxMyxmMzAxNCxmMzAxNSxmMzAxNixmMzAxNyxmMzAxOCxmMzAxOSxmMzAyMCxmMzAyMSxmMzAyMixmMzAyMywKK2YzMDI0LGYzMDI1LGYzMDI2LGYzMDI3LGYzMDI4LGYzMDI5LGYzMDMwLGYzMDMxLGYzMDMyLGYzMDMzLGYzMDM0LGYzMDM1LGYzMDM2LGYzMDM3LGYzMDM4LGYzMDM5LAorZjMwNDAsZjMwNDEsZjMwNDIsZjMwNDMsZjMwNDQsZjMwNDUsZjMwNDYsZjMwNDcsZjMwNDgsZjMwNDksZjMwNTAsZjMwNTEsZjMwNTIsZjMwNTMsZjMwNTQsZjMwNTUsCitmMzA1NixmMzA1NyxmMzA1OCxmMzA1OSxmMzA2MCxmMzA2MSxmMzA2MixmMzA2MyxmMzA2NCxmMzA2NSxmMzA2NixmMzA2NyxmMzA2OCxmMzA2OSxmMzA3MCxmMzA3MSwKK2YzMDcyLGYzMDczLGYzMDc0LGYzMDc1LGYzMDc2LGYzMDc3LGYzMDc4LGYzMDc5LGYzMDgwLGYzMDgxLGYzMDgyLGYzMDgzLGYzMDg0LGYzMDg1LGYzMDg2LGYzMDg3LAorZjMwODgsZjMwODksZjMwOTAsZjMwOTEsZjMwOTIsZjMwOTMsZjMwOTQsZjMwOTUsZjMwOTYsZjMwOTcsZjMwOTgsZjMwOTksZjMxMDAsZjMxMDEsZjMxMDIsZjMxMDMsCitmMzEwNCxmMzEwNSxmMzEwNixmMzEwNyxmMzEwOCxmMzEwOSxmMzExMCxmMzExMSxmMzExMixmMzExMyxmMzExNCxmMzExNSxmMzExNixmMzExNyxmMzExOCxmMzExOSwKK2YzMTIwLGYzMTIxLGYzMTIyLGYzMTIzLGYzMTI0LGYzMTI1LGYzMTI2LGYzMTI3LGYzMTI4LGYzMTI5LGYzMTMwLGYzMTMxLGYzMTMyLGYzMTMzLGYzMTM0LGYzMTM1LAorZjMxMzYsZjMxMzcsZjMxMzgsZjMxMzksZjMxNDAsZjMxNDEsZjMxNDIsZjMxNDMsZjMxNDQsZjMxNDUsZjMxNDYsZjMxNDcsZjMxNDgsZjMxNDksZjMxNTAsZjMxNTEsCitmMzE1MixmMzE1MyxmMzE1NCxmMzE1NSxmMzE1NixmMzE1NyxmMzE1OCxmMzE1OSxmMzE2MCxmMzE2MSxmMzE2MixmMzE2MyxmMzE2NCxmMzE2NSxmMzE2NixmMzE2NywKK2YzMTY4LGYzMTY5LGYzMTcwLGYzMTcxLGYzMTcyLGYzMTczLGYzMTc0LGYzMTc1LGYzMTc2LGYzMTc3LGYzMTc4LGYzMTc5LGYzMTgwLGYzMTgxLGYzMTgyLGYzMTgzLAorZjMxODQsZjMxODUsZjMxODYsZjMxODcsZjMxODgsZjMxODksZjMxOTAsZjMxOTEsZjMxOTIsZjMxOTMsZjMxOTQsZjMxOTUsZjMxOTYsZjMxOTcsZjMxOTgsZjMxOTksCitmMzIwMCxmMzIwMSxmMzIwMixmMzIwMyxmMzIwNCxmMzIwNSxmMzIwNixmMzIwNyxmMzIwOCxmMzIwOSxmMzIxMCxmMzIxMSxmMzIxMixmMzIxMyxmMzIxNCxmMzIxNSwKK2YzMjE2LGYzMjE3LGYzMjE4LGYzMjE5LGYzMjIwLGYzMjIxLGYzMjIyLGYzMjIzLGYzMjI0LGYzMjI1LGYzMjI2LGYzMjI3LGYzMjI4LGYzMjI5LGYzMjMwLGYzMjMxLAorZjMyMzIsZjMyMzMsZjMyMzQsZjMyMzUsZjMyMzYsZjMyMzcsZjMyMzgsZjMyMzksZjMyNDAsZjMyNDEsZjMyNDIsZjMyNDMsZjMyNDQsZjMyNDUsZjMyNDYsZjMyNDcsCitmMzI0OCxmMzI0OSxmMzI1MCxmMzI1MSxmMzI1MixmMzI1MyxmMzI1NCxmMzI1NSxmMzI1NixmMzI1NyxmMzI1OCxmMzI1OSxmMzI2MCxmMzI2MSxmMzI2MixmMzI2MywKK2YzMjY0LGYzMjY1LGYzMjY2LGYzMjY3LGYzMjY4LGYzMjY5LGYzMjcwLGYzMjcxLGYzMjcyLGYzMjczLGYzMjc0LGYzMjc1LGYzMjc2LGYzMjc3LGYzMjc4LGYzMjc5LAorZjMyODAsZjMyODEsZjMyODIsZjMyODMsZjMyODQsZjMyODUsZjMyODYsZjMyODcsZjMyODgsZjMyODksZjMyOTAsZjMyOTEsZjMyOTIsZjMyOTMsZjMyOTQsZjMyOTUsCitmMzI5NixmMzI5NyxmMzI5OCxmMzI5OSxmMzMwMCxmMzMwMSxmMzMwMixmMzMwMyxmMzMwNCxmMzMwNSxmMzMwNixmMzMwNyxmMzMwOCxmMzMwOSxmMzMxMCxmMzMxMSwKK2YzMzEyLGYzMzEzLGYzMzE0LGYzMzE1LGYzMzE2LGYzMzE3LGYzMzE4LGYzMzE5LGYzMzIwLGYzMzIxLGYzMzIyLGYzMzIzLGYzMzI0LGYzMzI1LGYzMzI2LGYzMzI3LAorZjMzMjgsZjMzMjksZjMzMzAsZjMzMzEsZjMzMzIsZjMzMzMsZjMzMzQsZjMzMzUsZjMzMzYsZjMzMzcsZjMzMzgsZjMzMzksZjMzNDAsZjMzNDEsZjMzNDIsZjMzNDMsCitmMzM0NCxmMzM0NSxmMzM0NixmMzM0NyxmMzM0OCxmMzM0OSxmMzM1MCxmMzM1MSxmMzM1MixmMzM1MyxmMzM1NCxmMzM1NSxmMzM1NixmMzM1NyxmMzM1OCxmMzM1OSwKK2YzMzYwLGYzMzYxLGYzMzYyLGYzMzYzLGYzMzY0LGYzMzY1LGYzMzY2LGYzMzY3LGYzMzY4LGYzMzY5LGYzMzcwLGYzMzcxLGYzMzcyLGYzMzczLGYzMzc0LGYzMzc1LAorZjMzNzYsZjMzNzcsZjMzNzgsZjMzNzksZjMzODAsZjMzODEsZjMzODIsZjMzODMsZjMzODQsZjMzODUsZjMzODYsZjMzODcsZjMzODgsZjMzODksZjMzOTAsZjMzOTEsCitmMzM5MixmMzM5MyxmMzM5NCxmMzM5NSxmMzM5NixmMzM5NyxmMzM5OCxmMzM5OSxmMzQwMCxmMzQwMSxmMzQwMixmMzQwMyxmMzQwNCxmMzQwNSxmMzQwNixmMzQwNywKK2YzNDA4LGYzNDA5LGYzNDEwLGYzNDExLGYzNDEyLGYzNDEzLGYzNDE0LGYzNDE1LGYzNDE2LGYzNDE3LGYzNDE4LGYzNDE5LGYzNDIwLGYzNDIxLGYzNDIyLGYzNDIzLAorZjM0MjQsZjM0MjUsZjM0MjYsZjM0MjcsZjM0MjgsZjM0MjksZjM0MzAsZjM0MzEsZjM0MzIsZjM0MzMsZjM0MzQsZjM0MzUsZjM0MzYsZjM0MzcsZjM0MzgsZjM0MzksCitmMzQ0MCxmMzQ0MSxmMzQ0MixmMzQ0MyxmMzQ0NCxmMzQ0NSxmMzQ0NixmMzQ0NyxmMzQ0OCxmMzQ0OSxmMzQ1MCxmMzQ1MSxmMzQ1MixmMzQ1MyxmMzQ1NCxmMzQ1NSwKK2YzNDU2LGYzNDU3LGYzNDU4LGYzNDU5LGYzNDYwLGYzNDYxLGYzNDYyLGYzNDYzLGYzNDY0LGYzNDY1LGYzNDY2LGYzNDY3LGYzNDY4LGYzNDY5LGYzNDcwLGYzNDcxLAorZjM0NzIsZjM0NzMsZjM0NzQsZjM0NzUsZjM0NzYsZjM0NzcsZjM0NzgsZjM0NzksZjM0ODAsZjM0ODEsZjM0ODIsZjM0ODMsZjM0ODQsZjM0ODUsZjM0ODYsZjM0ODcsCitmMzQ4OCxmMzQ4OSxmMzQ5MCxmMzQ5MSxmMzQ5MixmMzQ5MyxmMzQ5NCxmMzQ5NSxmMzQ5NixmMzQ5NyxmMzQ5OCxmMzQ5OSxmMzUwMCxmMzUwMSxmMzUwMixmMzUwMywKK2YzNTA0LGYzNTA1LGYzNTA2LGYzNTA3LGYzNTA4LGYzNTA5LGYzNTEwLGYzNTExLGYzNTEyLGYzNTEzLGYzNTE0LGYzNTE1LGYzNTE2LGYzNTE3LGYzNTE4LGYzNTE5LAorZjM1MjAsZjM1MjEsZjM1MjIsZjM1MjMsZjM1MjQsZjM1MjUsZjM1MjYsZjM1MjcsZjM1MjgsZjM1MjksZjM1MzAsZjM1MzEsZjM1MzIsZjM1MzMsZjM1MzQsZjM1MzUsCitmMzUzNixmMzUzNyxmMzUzOCxmMzUzOSxmMzU0MCxmMzU0MSxmMzU0MixmMzU0MyxmMzU0NCxmMzU0NSxmMzU0NixmMzU0NyxmMzU0OCxmMzU0OSxmMzU1MCxmMzU1MSwKK2YzNTUyLGYzNTUzLGYzNTU0LGYzNTU1LGYzNTU2LGYzNTU3LGYzNTU4LGYzNTU5LGYzNTYwLGYzNTYxLGYzNTYyLGYzNTYzLGYzNTY0LGYzNTY1LGYzNTY2LGYzNTY3LAorZjM1NjgsZjM1NjksZjM1NzAsZjM1NzEsZjM1NzIsZjM1NzMsZjM1NzQsZjM1NzUsZjM1NzYsZjM1NzcsZjM1NzgsZjM1NzksZjM1ODAsZjM1ODEsZjM1ODIsZjM1ODMsCitmMzU4NCxmMzU4NSxmMzU4NixmMzU4NyxmMzU4OCxmMzU4OSxmMzU5MCxmMzU5MSxmMzU5MixmMzU5MyxmMzU5NCxmMzU5NSxmMzU5NixmMzU5NyxmMzU5OCxmMzU5OSwKK2YzNjAwLGYzNjAxLGYzNjAyLGYzNjAzLGYzNjA0LGYzNjA1LGYzNjA2LGYzNjA3LGYzNjA4LGYzNjA5LGYzNjEwLGYzNjExLGYzNjEyLGYzNjEzLGYzNjE0LGYzNjE1LAorZjM2MTYsZjM2MTcsZjM2MTgsZjM2MTksZjM2MjAsZjM2MjEsZjM2MjIsZjM2MjMsZjM2MjQsZjM2MjUsZjM2MjYsZjM2MjcsZjM2MjgsZjM2MjksZjM2MzAsZjM2MzEsCitmMzYzMixmMzYzMyxmMzYzNCxmMzYzNSxmMzYzNixmMzYzNyxmMzYzOCxmMzYzOSxmMzY0MCxmMzY0MSxmMzY0MixmMzY0MyxmMzY0NCxmMzY0NSxmMzY0NixmMzY0NywKK2YzNjQ4LGYzNjQ5LGYzNjUwLGYzNjUxLGYzNjUyLGYzNjUzLGYzNjU0LGYzNjU1LGYzNjU2LGYzNjU3LGYzNjU4LGYzNjU5LGYzNjYwLGYzNjYxLGYzNjYyLGYzNjYzLAorZjM2NjQsZjM2NjUsZjM2NjYsZjM2NjcsZjM2NjgsZjM2NjksZjM2NzAsZjM2NzEsZjM2NzIsZjM2NzMsZjM2NzQsZjM2NzUsZjM2NzYsZjM2NzcsZjM2NzgsZjM2NzksCitmMzY4MCxmMzY4MSxmMzY4MixmMzY4MyxmMzY4NCxmMzY4NSxmMzY4NixmMzY4NyxmMzY4OCxmMzY4OSxmMzY5MCxmMzY5MSxmMzY5MixmMzY5MyxmMzY5NCxmMzY5NSwKK2YzNjk2LGYzNjk3LGYzNjk4LGYzNjk5LGYzNzAwLGYzNzAxLGYzNzAyLGYzNzAzLGYzNzA0LGYzNzA1LGYzNzA2LGYzNzA3LGYzNzA4LGYzNzA5LGYzNzEwLGYzNzExLAorZjM3MTIsZjM3MTMsZjM3MTQsZjM3MTUsZjM3MTYsZjM3MTcsZjM3MTgsZjM3MTksZjM3MjAsZjM3MjEsZjM3MjIsZjM3MjMsZjM3MjQsZjM3MjUsZjM3MjYsZjM3MjcsCitmMzcyOCxmMzcyOSxmMzczMCxmMzczMSxmMzczMixmMzczMyxmMzczNCxmMzczNSxmMzczNixmMzczNyxmMzczOCxmMzczOSxmMzc0MCxmMzc0MSxmMzc0MixmMzc0MywKK2YzNzQ0LGYzNzQ1LGYzNzQ2LGYzNzQ3LGYzNzQ4LGYzNzQ5LGYzNzUwLGYzNzUxLGYzNzUyLGYzNzUzLGYzNzU0LGYzNzU1LGYzNzU2LGYzNzU3LGYzNzU4LGYzNzU5LAorZjM3NjAsZjM3NjEsZjM3NjIsZjM3NjMsZjM3NjQsZjM3NjUsZjM3NjYsZjM3NjcsZjM3NjgsZjM3NjksZjM3NzAsZjM3NzEsZjM3NzIsZjM3NzMsZjM3NzQsZjM3NzUsCitmMzc3NixmMzc3NyxmMzc3OCxmMzc3OSxmMzc4MCxmMzc4MSxmMzc4MixmMzc4MyxmMzc4NCxmMzc4NSxmMzc4NixmMzc4NyxmMzc4OCxmMzc4OSxmMzc5MCxmMzc5MSwKK2YzNzkyLGYzNzkzLGYzNzk0LGYzNzk1LGYzNzk2LGYzNzk3LGYzNzk4LGYzNzk5LGYzODAwLGYzODAxLGYzODAyLGYzODAzLGYzODA0LGYzODA1LGYzODA2LGYzODA3LAorZjM4MDgsZjM4MDksZjM4MTAsZjM4MTEsZjM4MTIsZjM4MTMsZjM4MTQsZjM4MTUsZjM4MTYsZjM4MTcsZjM4MTgsZjM4MTksZjM4MjAsZjM4MjEsZjM4MjIsZjM4MjMsCitmMzgyNCxmMzgyNSxmMzgyNixmMzgyNyxmMzgyOCxmMzgyOSxmMzgzMCxmMzgzMSxmMzgzMixmMzgzMyxmMzgzNCxmMzgzNSxmMzgzNixmMzgzNyxmMzgzOCxmMzgzOSwKK2YzODQwLGYzODQxLGYzODQyLGYzODQzLGYzODQ0LGYzODQ1LGYzODQ2LGYzODQ3LGYzODQ4LGYzODQ5LGYzODUwLGYzODUxLGYzODUyLGYzODUzLGYzODU0LGYzODU1LAorZjM4NTYsZjM4NTcsZjM4NTgsZjM4NTksZjM4NjAsZjM4NjEsZjM4NjIsZjM4NjMsZjM4NjQsZjM4NjUsZjM4NjYsZjM4NjcsZjM4NjgsZjM4NjksZjM4NzAsZjM4NzEsCitmMzg3MixmMzg3MyxmMzg3NCxmMzg3NSxmMzg3NixmMzg3NyxmMzg3OCxmMzg3OSxmMzg4MCxmMzg4MSxmMzg4MixmMzg4MyxmMzg4NCxmMzg4NSxmMzg4NixmMzg4NywKK2YzODg4LGYzODg5LGYzODkwLGYzODkxLGYzODkyLGYzODkzLGYzODk0LGYzODk1LGYzODk2LGYzODk3LGYzODk4LGYzODk5LGYzOTAwLGYzOTAxLGYzOTAyLGYzOTAzLAorZjM5MDQsZjM5MDUsZjM5MDYsZjM5MDcsZjM5MDgsZjM5MDksZjM5MTAsZjM5MTEsZjM5MTIsZjM5MTMsZjM5MTQsZjM5MTUsZjM5MTYsZjM5MTcsZjM5MTgsZjM5MTksCitmMzkyMCxmMzkyMSxmMzkyMixmMzkyMyxmMzkyNCxmMzkyNSxmMzkyNixmMzkyNyxmMzkyOCxmMzkyOSxmMzkzMCxmMzkzMSxmMzkzMixmMzkzMyxmMzkzNCxmMzkzNSwKK2YzOTM2LGYzOTM3LGYzOTM4LGYzOTM5LGYzOTQwLGYzOTQxLGYzOTQyLGYzOTQzLGYzOTQ0LGYzOTQ1LGYzOTQ2LGYzOTQ3LGYzOTQ4LGYzOTQ5LGYzOTUwLGYzOTUxLAorZjM5NTIsZjM5NTMsZjM5NTQsZjM5NTUsZjM5NTYsZjM5NTcsZjM5NTgsZjM5NTksZjM5NjAsZjM5NjEsZjM5NjIsZjM5NjMsZjM5NjQsZjM5NjUsZjM5NjYsZjM5NjcsCitmMzk2OCxmMzk2OSxmMzk3MCxmMzk3MSxmMzk3MixmMzk3MyxmMzk3NCxmMzk3NSxmMzk3NixmMzk3NyxmMzk3OCxmMzk3OSxmMzk4MCxmMzk4MSxmMzk4MixmMzk4MywKK2YzOTg0LGYzOTg1LGYzOTg2LGYzOTg3LGYzOTg4LGYzOTg5LGYzOTkwLGYzOTkxLGYzOTkyLGYzOTkzLGYzOTk0LGYzOTk1LGYzOTk2LGYzOTk3LGYzOTk4LGYzOTk5LAorZjQwMDAsZjQwMDEsZjQwMDIsZjQwMDMsZjQwMDQsZjQwMDUsZjQwMDYsZjQwMDcsZjQwMDgsZjQwMDksZjQwMTAsZjQwMTEsZjQwMTIsZjQwMTMsZjQwMTQsZjQwMTUsCitmNDAxNixmNDAxNyxmNDAxOCxmNDAxOSxmNDAyMCxmNDAyMSxmNDAyMixmNDAyMyxmNDAyNCxmNDAyNSxmNDAyNixmNDAyNyxmNDAyOCxmNDAyOSxmNDAzMCxmNDAzMSwKK2Y0MDMyLGY0MDMzLGY0MDM0LGY0MDM1LGY0MDM2LGY0MDM3LGY0MDM4LGY0MDM5LGY0MDQwLGY0MDQxLGY0MDQyLGY0MDQzLGY0MDQ0LGY0MDQ1LGY0MDQ2LGY0MDQ3LAorZjQwNDgsZjQwNDksZjQwNTAsZjQwNTEsZjQwNTIsZjQwNTMsZjQwNTQsZjQwNTUsZjQwNTYsZjQwNTcsZjQwNTgsZjQwNTksZjQwNjAsZjQwNjEsZjQwNjIsZjQwNjMsCitmNDA2NCxmNDA2NSxmNDA2NixmNDA2NyxmNDA2OCxmNDA2OSxmNDA3MCxmNDA3MSxmNDA3MixmNDA3MyxmNDA3NCxmNDA3NSxmNDA3NixmNDA3NyxmNDA3OCxmNDA3OSwKK2Y0MDgwLGY0MDgxLGY0MDgyLGY0MDgzLGY0MDg0LGY0MDg1LGY0MDg2LGY0MDg3LGY0MDg4LGY0MDg5LGY0MDkwLGY0MDkxLGY0MDkyLGY0MDkzLGY0MDk0LGY0MDk1LAorfTsKK3N0YXRpYyBjb25zdCBpbnQgcmVmWzQwOTZdWzJdID0geworeyAgICAgMCwgMH0sCit7ICAgICAyLC0xfSx7ICAgICAxLCAwfSx7ICAgICAzLC0xfSx7ICAgIC0xLC0xfSx7ICAgICAzLC0xfSx7ICAgICAwLCAwfSx7ICAgICA0LC0xfSx7ICAgIC0zLC0xfSwKK3sgICAgIDUsLTF9LHsgICAgLTIsLTF9LHsgICAgIDYsLTF9LHsgICAgLTcsLTF9LHsgICAgIDksLTF9LHsgICAgLTYsLTF9LHsgICAgMTAsLTF9LHsgICAtMTUsLTF9LAoreyAgICAxNywtMX0seyAgIC0xNCwtMX0seyAgICAxOCwtMX0seyAgIC0zMSwtMX0seyAgICAzMywtMX0seyAgIC0zMCwtMX0seyAgICAzNCwtMX0seyAgIC02MywtMX0sCit7ICAgIDY1LC0xfSx7ICAgLTYyLC0xfSx7ICAgIDY2LC0xfSx7ICAtMTI3LC0xfSx7ICAgMTI5LC0xfSx7ICAtMTI2LC0xfSx7ICAgMTMwLC0xfSx7ICAtMjU1LC0xfSwKK3sgICAyNTcsLTF9LHsgIC0yNTQsLTF9LHsgICAyNTgsLTF9LHsgIC01MTEsLTF9LHsgICA1MTMsLTF9LHsgIC01MTAsLTF9LHsgICA1MTQsLTF9LHsgLTEwMjMsLTF9LAoreyAgMTAyNSwtMX0seyAtMTAyMiwtMX0seyAgMTAyNiwtMX0seyAtMjA0NywtMX0seyAgMjA0OSwtMX0seyAtMjA0NiwtMX0seyAgMjA1MCwtMX0seyAtNDA5NSwtMX0sCit7ICA0MDk3LC0xfSx7IC00MDk0LC0xfSx7ICA0MDk4LC0xfSx7IC04MTkxLC0xfSx7ICA4MTkzLC0xfSx7IC04MTkwLC0xfSx7ICA4MTk0LC0xfSx7LTE2MzgzLC0xfSwKK3sgMTYzODUsLTF9LHstMTYzODIsLTF9LHsgMTYzODYsLTF9LHstMzI3NjcsLTF9LHsgMzI3NjksLTF9LHstMzI3NjYsLTF9LHsgMzI3NzAsLTF9LHsgICAgLTIsIDB9LAoreyAgICAgMCwgMH0seyAgICAtMSwgMH0seyAgICAgMSwgMH0seyAgICAtMywgMH0seyAgICAgMSwgMH0seyAgICAtMiwgMH0seyAgICAgMiwgMH0seyAgICAtNSwgMH0sCit7ICAgICAzLCAwfSx7ICAgIC00LCAwfSx7ICAgICA0LCAwfSx7ICAgIC05LCAwfSx7ICAgICA3LCAwfSx7ICAgIC04LCAwfSx7ICAgICA4LCAwfSx7ICAgLTE3LCAwfSwKK3sgICAgMTUsIDB9LHsgICAtMTYsIDB9LHsgICAgMTYsIDB9LHsgICAtMzMsIDB9LHsgICAgMzEsIDB9LHsgICAtMzIsIDB9LHsgICAgMzIsIDB9LHsgICAtNjUsIDB9LAoreyAgICA2MywgMH0seyAgIC02NCwgMH0seyAgICA2NCwgMH0seyAgLTEyOSwgMH0seyAgIDEyNywgMH0seyAgLTEyOCwgMH0seyAgIDEyOCwgMH0seyAgLTI1NywgMH0sCit7ICAgMjU1LCAwfSx7ICAtMjU2LCAwfSx7ICAgMjU2LCAwfSx7ICAtNTEzLCAwfSx7ICAgNTExLCAwfSx7ICAtNTEyLCAwfSx7ICAgNTEyLCAwfSx7IC0xMDI1LCAwfSwKK3sgIDEwMjMsIDB9LHsgLTEwMjQsIDB9LHsgIDEwMjQsIDB9LHsgLTIwNDksIDB9LHsgIDIwNDcsIDB9LHsgLTIwNDgsIDB9LHsgIDIwNDgsIDB9LHsgLTQwOTcsIDB9LAoreyAgNDA5NSwgMH0seyAtNDA5NiwgMH0seyAgNDA5NiwgMH0seyAtODE5MywgMH0seyAgODE5MSwgMH0seyAtODE5MiwgMH0seyAgODE5MiwgMH0sey0xNjM4NSwgMH0sCit7IDE2MzgzLCAwfSx7LTE2Mzg0LCAwfSx7IDE2Mzg0LCAwfSx7LTMyNzY5LCAwfSx7IDMyNzY3LCAwfSx7LTMyNzY4LCAwfSx7IDMyNzY4LCAwfSx7ICAgIC0xLC0xfSwKK3sgICAgIDEsLTF9LHsgICAgIDAsIDB9LHsgICAgIDIsLTF9LHsgICAgLTIsLTF9LHsgICAgIDIsLTF9LHsgICAgLTEsLTF9LHsgICAgIDMsLTF9LHsgICAgLTQsLTF9LAoreyAgICAgNCwtMX0seyAgICAtMywtMX0seyAgICAgNSwtMX0seyAgICAtOCwtMX0seyAgICAgOCwtMX0seyAgICAtNywtMX0seyAgICAgOSwtMX0seyAgIC0xNiwtMX0sCit7ICAgIDE2LC0xfSx7ICAgLTE1LC0xfSx7ICAgIDE3LC0xfSx7ICAgLTMyLC0xfSx7ICAgIDMyLC0xfSx7ICAgLTMxLC0xfSx7ICAgIDMzLC0xfSx7ICAgLTY0LC0xfSwKK3sgICAgNjQsLTF9LHsgICAtNjMsLTF9LHsgICAgNjUsLTF9LHsgIC0xMjgsLTF9LHsgICAxMjgsLTF9LHsgIC0xMjcsLTF9LHsgICAxMjksLTF9LHsgIC0yNTYsLTF9LAoreyAgIDI1NiwtMX0seyAgLTI1NSwtMX0seyAgIDI1NywtMX0seyAgLTUxMiwtMX0seyAgIDUxMiwtMX0seyAgLTUxMSwtMX0seyAgIDUxMywtMX0seyAtMTAyNCwtMX0sCit7ICAxMDI0LC0xfSx7IC0xMDIzLC0xfSx7ICAxMDI1LC0xfSx7IC0yMDQ4LC0xfSx7ICAyMDQ4LC0xfSx7IC0yMDQ3LC0xfSx7ICAyMDQ5LC0xfSx7IC00MDk2LC0xfSwKK3sgIDQwOTYsLTF9LHsgLTQwOTUsLTF9LHsgIDQwOTcsLTF9LHsgLTgxOTIsLTF9LHsgIDgxOTIsLTF9LHsgLTgxOTEsLTF9LHsgIDgxOTMsLTF9LHstMTYzODQsLTF9LAoreyAxNjM4NCwtMX0sey0xNjM4MywtMX0seyAxNjM4NSwtMX0sey0zMjc2OCwtMX0seyAzMjc2OCwtMX0sey0zMjc2NywtMX0seyAzMjc2OSwtMX0seyAgICAtMywgMH0sCit7ICAgIC0xLC0xfSx7ICAgIC0yLCAwfSx7ICAgICAwLCAwfSx7ICAgIC00LCAwfSx7ICAgICAwLCAwfSx7ICAgIC0zLCAwfSx7ICAgICAxLCAwfSx7ICAgIC02LCAwfSwKK3sgICAgIDIsIDB9LHsgICAgLTUsIDB9LHsgICAgIDMsIDB9LHsgICAtMTAsIDB9LHsgICAgIDYsIDB9LHsgICAgLTksIDB9LHsgICAgIDcsIDB9LHsgICAtMTgsIDB9LAoreyAgICAxNCwgMH0seyAgIC0xNywgMH0seyAgICAxNSwgMH0seyAgIC0zNCwgMH0seyAgICAzMCwgMH0seyAgIC0zMywgMH0seyAgICAzMSwgMH0seyAgIC02NiwgMH0sCit7ICAgIDYyLCAwfSx7ICAgLTY1LCAwfSx7ICAgIDYzLCAwfSx7ICAtMTMwLCAwfSx7ICAgMTI2LCAwfSx7ICAtMTI5LCAwfSx7ICAgMTI3LCAwfSx7ICAtMjU4LCAwfSwKK3sgICAyNTQsIDB9LHsgIC0yNTcsIDB9LHsgICAyNTUsIDB9LHsgIC01MTQsIDB9LHsgICA1MTAsIDB9LHsgIC01MTMsIDB9LHsgICA1MTEsIDB9LHsgLTEwMjYsIDB9LAoreyAgMTAyMiwgMH0seyAtMTAyNSwgMH0seyAgMTAyMywgMH0seyAtMjA1MCwgMH0seyAgMjA0NiwgMH0seyAtMjA0OSwgMH0seyAgMjA0NywgMH0seyAtNDA5OCwgMH0sCit7ICA0MDk0LCAwfSx7IC00MDk3LCAwfSx7ICA0MDk1LCAwfSx7IC04MTk0LCAwfSx7ICA4MTkwLCAwfSx7IC04MTkzLCAwfSx7ICA4MTkxLCAwfSx7LTE2Mzg2LCAwfSwKK3sgMTYzODIsIDB9LHstMTYzODUsIDB9LHsgMTYzODMsIDB9LHstMzI3NzAsIDB9LHsgMzI3NjYsIDB9LHstMzI3NjksIDB9LHsgMzI3NjcsIDB9LHsgICAgIDEsIDB9LAoreyAgICAgMywtMX0seyAgICAgMiwgMH0seyAgICAgNCwtMX0seyAgICAgMCwgMH0seyAgICAgNCwtMX0seyAgICAgMSwgMH0seyAgICAgNSwtMX0seyAgICAtMiwtMX0sCit7ICAgICA2LC0xfSx7ICAgIC0xLC0xfSx7ICAgICA3LC0xfSx7ICAgIC02LC0xfSx7ICAgIDEwLC0xfSx7ICAgIC01LC0xfSx7ICAgIDExLC0xfSx7ICAgLTE0LC0xfSwKK3sgICAgMTgsLTF9LHsgICAtMTMsLTF9LHsgICAgMTksLTF9LHsgICAtMzAsLTF9LHsgICAgMzQsLTF9LHsgICAtMjksLTF9LHsgICAgMzUsLTF9LHsgICAtNjIsLTF9LAoreyAgICA2NiwtMX0seyAgIC02MSwtMX0seyAgICA2NywtMX0seyAgLTEyNiwtMX0seyAgIDEzMCwtMX0seyAgLTEyNSwtMX0seyAgIDEzMSwtMX0seyAgLTI1NCwtMX0sCit7ICAgMjU4LC0xfSx7ICAtMjUzLC0xfSx7ICAgMjU5LC0xfSx7ICAtNTEwLC0xfSx7ICAgNTE0LC0xfSx7ICAtNTA5LC0xfSx7ICAgNTE1LC0xfSx7IC0xMDIyLC0xfSwKK3sgIDEwMjYsLTF9LHsgLTEwMjEsLTF9LHsgIDEwMjcsLTF9LHsgLTIwNDYsLTF9LHsgIDIwNTAsLTF9LHsgLTIwNDUsLTF9LHsgIDIwNTEsLTF9LHsgLTQwOTQsLTF9LAoreyAgNDA5OCwtMX0seyAtNDA5MywtMX0seyAgNDA5OSwtMX0seyAtODE5MCwtMX0seyAgODE5NCwtMX0seyAtODE4OSwtMX0seyAgODE5NSwtMX0sey0xNjM4MiwtMX0sCit7IDE2Mzg2LC0xfSx7LTE2MzgxLC0xfSx7IDE2Mzg3LC0xfSx7LTMyNzY2LC0xfSx7IDMyNzcwLC0xfSx7LTMyNzY1LC0xfSx7IDMyNzcxLC0xfSx7ICAgIC0zLCAwfSwKK3sgICAgLTEsLTF9LHsgICAgLTIsIDB9LHsgICAgIDAsIDB9LHsgICAgLTQsIDB9LHsgICAgIDAsIDB9LHsgICAgLTMsIDB9LHsgICAgIDEsIDB9LHsgICAgLTYsIDB9LAoreyAgICAgMiwgMH0seyAgICAtNSwgMH0seyAgICAgMywgMH0seyAgIC0xMCwgMH0seyAgICAgNiwgMH0seyAgICAtOSwgMH0seyAgICAgNywgMH0seyAgIC0xOCwgMH0sCit7ICAgIDE0LCAwfSx7ICAgLTE3LCAwfSx7ICAgIDE1LCAwfSx7ICAgLTM0LCAwfSx7ICAgIDMwLCAwfSx7ICAgLTMzLCAwfSx7ICAgIDMxLCAwfSx7ICAgLTY2LCAwfSwKK3sgICAgNjIsIDB9LHsgICAtNjUsIDB9LHsgICAgNjMsIDB9LHsgIC0xMzAsIDB9LHsgICAxMjYsIDB9LHsgIC0xMjksIDB9LHsgICAxMjcsIDB9LHsgIC0yNTgsIDB9LAoreyAgIDI1NCwgMH0seyAgLTI1NywgMH0seyAgIDI1NSwgMH0seyAgLTUxNCwgMH0seyAgIDUxMCwgMH0seyAgLTUxMywgMH0seyAgIDUxMSwgMH0seyAtMTAyNiwgMH0sCit7ICAxMDIyLCAwfSx7IC0xMDI1LCAwfSx7ICAxMDIzLCAwfSx7IC0yMDUwLCAwfSx7ICAyMDQ2LCAwfSx7IC0yMDQ5LCAwfSx7ICAyMDQ3LCAwfSx7IC00MDk4LCAwfSwKK3sgIDQwOTQsIDB9LHsgLTQwOTcsIDB9LHsgIDQwOTUsIDB9LHsgLTgxOTQsIDB9LHsgIDgxOTAsIDB9LHsgLTgxOTMsIDB9LHsgIDgxOTEsIDB9LHstMTYzODYsIDB9LAoreyAxNjM4MiwgMH0sey0xNjM4NSwgMH0seyAxNjM4MywgMH0sey0zMjc3MCwgMH0seyAzMjc2NiwgMH0sey0zMjc2OSwgMH0seyAzMjc2NywgMH0seyAgICAgMCwgMH0sCit7ICAgICAyLC0xfSx7ICAgICAxLCAwfSx7ICAgICAzLC0xfSx7ICAgIC0xLC0xfSx7ICAgICAzLC0xfSx7ICAgICAwLCAwfSx7ICAgICA0LC0xfSx7ICAgIC0zLC0xfSwKK3sgICAgIDUsLTF9LHsgICAgLTIsLTF9LHsgICAgIDYsLTF9LHsgICAgLTcsLTF9LHsgICAgIDksLTF9LHsgICAgLTYsLTF9LHsgICAgMTAsLTF9LHsgICAtMTUsLTF9LAoreyAgICAxNywtMX0seyAgIC0xNCwtMX0seyAgICAxOCwtMX0seyAgIC0zMSwtMX0seyAgICAzMywtMX0seyAgIC0zMCwtMX0seyAgICAzNCwtMX0seyAgIC02MywtMX0sCit7ICAgIDY1LC0xfSx7ICAgLTYyLC0xfSx7ICAgIDY2LC0xfSx7ICAtMTI3LC0xfSx7ICAgMTI5LC0xfSx7ICAtMTI2LC0xfSx7ICAgMTMwLC0xfSx7ICAtMjU1LC0xfSwKK3sgICAyNTcsLTF9LHsgIC0yNTQsLTF9LHsgICAyNTgsLTF9LHsgIC01MTEsLTF9LHsgICA1MTMsLTF9LHsgIC01MTAsLTF9LHsgICA1MTQsLTF9LHsgLTEwMjMsLTF9LAoreyAgMTAyNSwtMX0seyAtMTAyMiwtMX0seyAgMTAyNiwtMX0seyAtMjA0NywtMX0seyAgMjA0OSwtMX0seyAtMjA0NiwtMX0seyAgMjA1MCwtMX0seyAtNDA5NSwtMX0sCit7ICA0MDk3LC0xfSx7IC00MDk0LC0xfSx7ICA0MDk4LC0xfSx7IC04MTkxLC0xfSx7ICA4MTkzLC0xfSx7IC04MTkwLC0xfSx7ICA4MTk0LC0xfSx7LTE2MzgzLC0xfSwKK3sgMTYzODUsLTF9LHstMTYzODIsLTF9LHsgMTYzODYsLTF9LHstMzI3NjcsLTF9LHsgMzI3NjksLTF9LHstMzI3NjYsLTF9LHsgMzI3NzAsLTF9LHsgICAgLTQsIDB9LAoreyAgICAtMiwtMX0seyAgICAtMywgMH0seyAgICAtMSwtMX0seyAgICAtNSwgMH0seyAgICAtMSwtMX0seyAgICAtNCwgMH0seyAgICAgMCwgMH0seyAgICAtNywgMH0sCit7ICAgICAxLCAwfSx7ICAgIC02LCAwfSx7ICAgICAyLCAwfSx7ICAgLTExLCAwfSx7ICAgICA1LCAwfSx7ICAgLTEwLCAwfSx7ICAgICA2LCAwfSx7ICAgLTE5LCAwfSwKK3sgICAgMTMsIDB9LHsgICAtMTgsIDB9LHsgICAgMTQsIDB9LHsgICAtMzUsIDB9LHsgICAgMjksIDB9LHsgICAtMzQsIDB9LHsgICAgMzAsIDB9LHsgICAtNjcsIDB9LAoreyAgICA2MSwgMH0seyAgIC02NiwgMH0seyAgICA2MiwgMH0seyAgLTEzMSwgMH0seyAgIDEyNSwgMH0seyAgLTEzMCwgMH0seyAgIDEyNiwgMH0seyAgLTI1OSwgMH0sCit7ICAgMjUzLCAwfSx7ICAtMjU4LCAwfSx7ICAgMjU0LCAwfSx7ICAtNTE1LCAwfSx7ICAgNTA5LCAwfSx7ICAtNTE0LCAwfSx7ICAgNTEwLCAwfSx7IC0xMDI3LCAwfSwKK3sgIDEwMjEsIDB9LHsgLTEwMjYsIDB9LHsgIDEwMjIsIDB9LHsgLTIwNTEsIDB9LHsgIDIwNDUsIDB9LHsgLTIwNTAsIDB9LHsgIDIwNDYsIDB9LHsgLTQwOTksIDB9LAoreyAgNDA5MywgMH0seyAtNDA5OCwgMH0seyAgNDA5NCwgMH0seyAtODE5NSwgMH0seyAgODE4OSwgMH0seyAtODE5NCwgMH0seyAgODE5MCwgMH0sey0xNjM4NywgMH0sCit7IDE2MzgxLCAwfSx7LTE2Mzg2LCAwfSx7IDE2MzgyLCAwfSx7LTMyNzcxLCAwfSx7IDMyNzY1LCAwfSx7LTMyNzcwLCAwfSx7IDMyNzY2LCAwfSx7ICAgICAzLCAwfSwKK3sgICAgIDUsLTF9LHsgICAgIDQsIDB9LHsgICAgIDYsLTF9LHsgICAgIDIsIDB9LHsgICAgIDYsLTF9LHsgICAgIDMsIDB9LHsgICAgIDcsLTF9LHsgICAgIDAsIDB9LAoreyAgICAgOCwtMX0seyAgICAgMSwgMH0seyAgICAgOSwtMX0seyAgICAtNCwtMX0seyAgICAxMiwtMX0seyAgICAtMywtMX0seyAgICAxMywtMX0seyAgIC0xMiwtMX0sCit7ICAgIDIwLC0xfSx7ICAgLTExLC0xfSx7ICAgIDIxLC0xfSx7ICAgLTI4LC0xfSx7ICAgIDM2LC0xfSx7ICAgLTI3LC0xfSx7ICAgIDM3LC0xfSx7ICAgLTYwLC0xfSwKK3sgICAgNjgsLTF9LHsgICAtNTksLTF9LHsgICAgNjksLTF9LHsgIC0xMjQsLTF9LHsgICAxMzIsLTF9LHsgIC0xMjMsLTF9LHsgICAxMzMsLTF9LHsgIC0yNTIsLTF9LAoreyAgIDI2MCwtMX0seyAgLTI1MSwtMX0seyAgIDI2MSwtMX0seyAgLTUwOCwtMX0seyAgIDUxNiwtMX0seyAgLTUwNywtMX0seyAgIDUxNywtMX0seyAtMTAyMCwtMX0sCit7ICAxMDI4LC0xfSx7IC0xMDE5LC0xfSx7ICAxMDI5LC0xfSx7IC0yMDQ0LC0xfSx7ICAyMDUyLC0xfSx7IC0yMDQzLC0xfSx7ICAyMDUzLC0xfSx7IC00MDkyLC0xfSwKK3sgIDQxMDAsLTF9LHsgLTQwOTEsLTF9LHsgIDQxMDEsLTF9LHsgLTgxODgsLTF9LHsgIDgxOTYsLTF9LHsgLTgxODcsLTF9LHsgIDgxOTcsLTF9LHstMTYzODAsLTF9LAoreyAxNjM4OCwtMX0sey0xNjM3OSwtMX0seyAxNjM4OSwtMX0sey0zMjc2NCwtMX0seyAzMjc3MiwtMX0sey0zMjc2MywtMX0seyAzMjc3MywtMX0seyAgICAtNSwgMH0sCit7ICAgIC0zLC0xfSx7ICAgIC00LCAwfSx7ICAgIC0yLC0xfSx7ICAgIC02LCAwfSx7ICAgIC0yLC0xfSx7ICAgIC01LCAwfSx7ICAgIC0xLC0xfSx7ICAgIC04LCAwfSwKK3sgICAgIDAsIDB9LHsgICAgLTcsIDB9LHsgICAgIDEsIDB9LHsgICAtMTIsIDB9LHsgICAgIDQsIDB9LHsgICAtMTEsIDB9LHsgICAgIDUsIDB9LHsgICAtMjAsIDB9LAoreyAgICAxMiwgMH0seyAgIC0xOSwgMH0seyAgICAxMywgMH0seyAgIC0zNiwgMH0seyAgICAyOCwgMH0seyAgIC0zNSwgMH0seyAgICAyOSwgMH0seyAgIC02OCwgMH0sCit7ICAgIDYwLCAwfSx7ICAgLTY3LCAwfSx7ICAgIDYxLCAwfSx7ICAtMTMyLCAwfSx7ICAgMTI0LCAwfSx7ICAtMTMxLCAwfSx7ICAgMTI1LCAwfSx7ICAtMjYwLCAwfSwKK3sgICAyNTIsIDB9LHsgIC0yNTksIDB9LHsgICAyNTMsIDB9LHsgIC01MTYsIDB9LHsgICA1MDgsIDB9LHsgIC01MTUsIDB9LHsgICA1MDksIDB9LHsgLTEwMjgsIDB9LAoreyAgMTAyMCwgMH0seyAtMTAyNywgMH0seyAgMTAyMSwgMH0seyAtMjA1MiwgMH0seyAgMjA0NCwgMH0seyAtMjA1MSwgMH0seyAgMjA0NSwgMH0seyAtNDEwMCwgMH0sCit7ICA0MDkyLCAwfSx7IC00MDk5LCAwfSx7ICA0MDkzLCAwfSx7IC04MTk2LCAwfSx7ICA4MTg4LCAwfSx7IC04MTk1LCAwfSx7ICA4MTg5LCAwfSx7LTE2Mzg4LCAwfSwKK3sgMTYzODAsIDB9LHstMTYzODcsIDB9LHsgMTYzODEsIDB9LHstMzI3NzIsIDB9LHsgMzI3NjQsIDB9LHstMzI3NzEsIDB9LHsgMzI3NjUsIDB9LHsgICAgIDIsIDB9LAoreyAgICAgNCwtMX0seyAgICAgMywgMH0seyAgICAgNSwtMX0seyAgICAgMSwgMH0seyAgICAgNSwtMX0seyAgICAgMiwgMH0seyAgICAgNiwtMX0seyAgICAtMSwtMX0sCit7ICAgICA3LC0xfSx7ICAgICAwLCAwfSx7ICAgICA4LC0xfSx7ICAgIC01LC0xfSx7ICAgIDExLC0xfSx7ICAgIC00LC0xfSx7ICAgIDEyLC0xfSx7ICAgLTEzLC0xfSwKK3sgICAgMTksLTF9LHsgICAtMTIsLTF9LHsgICAgMjAsLTF9LHsgICAtMjksLTF9LHsgICAgMzUsLTF9LHsgICAtMjgsLTF9LHsgICAgMzYsLTF9LHsgICAtNjEsLTF9LAoreyAgICA2NywtMX0seyAgIC02MCwtMX0seyAgICA2OCwtMX0seyAgLTEyNSwtMX0seyAgIDEzMSwtMX0seyAgLTEyNCwtMX0seyAgIDEzMiwtMX0seyAgLTI1MywtMX0sCit7ICAgMjU5LC0xfSx7ICAtMjUyLC0xfSx7ICAgMjYwLC0xfSx7ICAtNTA5LC0xfSx7ICAgNTE1LC0xfSx7ICAtNTA4LC0xfSx7ICAgNTE2LC0xfSx7IC0xMDIxLC0xfSwKK3sgIDEwMjcsLTF9LHsgLTEwMjAsLTF9LHsgIDEwMjgsLTF9LHsgLTIwNDUsLTF9LHsgIDIwNTEsLTF9LHsgLTIwNDQsLTF9LHsgIDIwNTIsLTF9LHsgLTQwOTMsLTF9LAoreyAgNDA5OSwtMX0seyAtNDA5MiwtMX0seyAgNDEwMCwtMX0seyAtODE4OSwtMX0seyAgODE5NSwtMX0seyAtODE4OCwtMX0seyAgODE5NiwtMX0sey0xNjM4MSwtMX0sCit7IDE2Mzg3LC0xfSx7LTE2MzgwLC0xfSx7IDE2Mzg4LC0xfSx7LTMyNzY1LC0xfSx7IDMyNzcxLC0xfSx7LTMyNzY0LC0xfSx7IDMyNzcyLC0xfSx7ICAgIC02LCAwfSwKK3sgICAgLTQsLTF9LHsgICAgLTUsIDB9LHsgICAgLTMsLTF9LHsgICAgLTcsIDB9LHsgICAgLTMsLTF9LHsgICAgLTYsIDB9LHsgICAgLTIsLTF9LHsgICAgLTksIDB9LAoreyAgICAtMSwtMX0seyAgICAtOCwgMH0seyAgICAgMCwgMH0seyAgIC0xMywgMH0seyAgICAgMywgMH0seyAgIC0xMiwgMH0seyAgICAgNCwgMH0seyAgIC0yMSwgMH0sCit7ICAgIDExLCAwfSx7ICAgLTIwLCAwfSx7ICAgIDEyLCAwfSx7ICAgLTM3LCAwfSx7ICAgIDI3LCAwfSx7ICAgLTM2LCAwfSx7ICAgIDI4LCAwfSx7ICAgLTY5LCAwfSwKK3sgICAgNTksIDB9LHsgICAtNjgsIDB9LHsgICAgNjAsIDB9LHsgIC0xMzMsIDB9LHsgICAxMjMsIDB9LHsgIC0xMzIsIDB9LHsgICAxMjQsIDB9LHsgIC0yNjEsIDB9LAoreyAgIDI1MSwgMH0seyAgLTI2MCwgMH0seyAgIDI1MiwgMH0seyAgLTUxNywgMH0seyAgIDUwNywgMH0seyAgLTUxNiwgMH0seyAgIDUwOCwgMH0seyAtMTAyOSwgMH0sCit7ICAxMDE5LCAwfSx7IC0xMDI4LCAwfSx7ICAxMDIwLCAwfSx7IC0yMDUzLCAwfSx7ICAyMDQzLCAwfSx7IC0yMDUyLCAwfSx7ICAyMDQ0LCAwfSx7IC00MTAxLCAwfSwKK3sgIDQwOTEsIDB9LHsgLTQxMDAsIDB9LHsgIDQwOTIsIDB9LHsgLTgxOTcsIDB9LHsgIDgxODcsIDB9LHsgLTgxOTYsIDB9LHsgIDgxODgsIDB9LHstMTYzODksIDB9LAoreyAxNjM3OSwgMH0sey0xNjM4OCwgMH0seyAxNjM4MCwgMH0sey0zMjc3MywgMH0seyAzMjc2MywgMH0sey0zMjc3MiwgMH0seyAzMjc2NCwgMH0seyAgICAgNywgMH0sCit7ICAgICA5LC0xfSx7ICAgICA4LCAwfSx7ICAgIDEwLC0xfSx7ICAgICA2LCAwfSx7ICAgIDEwLC0xfSx7ICAgICA3LCAwfSx7ICAgIDExLC0xfSx7ICAgICA0LCAwfSwKK3sgICAgMTIsLTF9LHsgICAgIDUsIDB9LHsgICAgMTMsLTF9LHsgICAgIDAsIDB9LHsgICAgMTYsLTF9LHsgICAgIDEsIDB9LHsgICAgMTcsLTF9LHsgICAgLTgsLTF9LAoreyAgICAyNCwtMX0seyAgICAtNywtMX0seyAgICAyNSwtMX0seyAgIC0yNCwtMX0seyAgICA0MCwtMX0seyAgIC0yMywtMX0seyAgICA0MSwtMX0seyAgIC01NiwtMX0sCit7ICAgIDcyLC0xfSx7ICAgLTU1LC0xfSx7ICAgIDczLC0xfSx7ICAtMTIwLC0xfSx7ICAgMTM2LC0xfSx7ICAtMTE5LC0xfSx7ICAgMTM3LC0xfSx7ICAtMjQ4LC0xfSwKK3sgICAyNjQsLTF9LHsgIC0yNDcsLTF9LHsgICAyNjUsLTF9LHsgIC01MDQsLTF9LHsgICA1MjAsLTF9LHsgIC01MDMsLTF9LHsgICA1MjEsLTF9LHsgLTEwMTYsLTF9LAoreyAgMTAzMiwtMX0seyAtMTAxNSwtMX0seyAgMTAzMywtMX0seyAtMjA0MCwtMX0seyAgMjA1NiwtMX0seyAtMjAzOSwtMX0seyAgMjA1NywtMX0seyAtNDA4OCwtMX0sCit7ICA0MTA0LC0xfSx7IC00MDg3LC0xfSx7ICA0MTA1LC0xfSx7IC04MTg0LC0xfSx7ICA4MjAwLC0xfSx7IC04MTgzLC0xfSx7ICA4MjAxLC0xfSx7LTE2Mzc2LC0xfSwKK3sgMTYzOTIsLTF9LHstMTYzNzUsLTF9LHsgMTYzOTMsLTF9LHstMzI3NjAsLTF9LHsgMzI3NzYsLTF9LHstMzI3NTksLTF9LHsgMzI3NzcsLTF9LHsgICAgLTksIDB9LAoreyAgICAtNywtMX0seyAgICAtOCwgMH0seyAgICAtNiwtMX0seyAgIC0xMCwgMH0seyAgICAtNiwtMX0seyAgICAtOSwgMH0seyAgICAtNSwtMX0seyAgIC0xMiwgMH0sCit7ICAgIC00LC0xfSx7ICAgLTExLCAwfSx7ICAgIC0zLC0xfSx7ICAgLTE2LCAwfSx7ICAgICAwLCAwfSx7ICAgLTE1LCAwfSx7ICAgICAxLCAwfSx7ICAgLTI0LCAwfSwKK3sgICAgIDgsIDB9LHsgICAtMjMsIDB9LHsgICAgIDksIDB9LHsgICAtNDAsIDB9LHsgICAgMjQsIDB9LHsgICAtMzksIDB9LHsgICAgMjUsIDB9LHsgICAtNzIsIDB9LAoreyAgICA1NiwgMH0seyAgIC03MSwgMH0seyAgICA1NywgMH0seyAgLTEzNiwgMH0seyAgIDEyMCwgMH0seyAgLTEzNSwgMH0seyAgIDEyMSwgMH0seyAgLTI2NCwgMH0sCit7ICAgMjQ4LCAwfSx7ICAtMjYzLCAwfSx7ICAgMjQ5LCAwfSx7ICAtNTIwLCAwfSx7ICAgNTA0LCAwfSx7ICAtNTE5LCAwfSx7ICAgNTA1LCAwfSx7IC0xMDMyLCAwfSwKK3sgIDEwMTYsIDB9LHsgLTEwMzEsIDB9LHsgIDEwMTcsIDB9LHsgLTIwNTYsIDB9LHsgIDIwNDAsIDB9LHsgLTIwNTUsIDB9LHsgIDIwNDEsIDB9LHsgLTQxMDQsIDB9LAoreyAgNDA4OCwgMH0seyAtNDEwMywgMH0seyAgNDA4OSwgMH0seyAtODIwMCwgMH0seyAgODE4NCwgMH0seyAtODE5OSwgMH0seyAgODE4NSwgMH0sey0xNjM5MiwgMH0sCit7IDE2Mzc2LCAwfSx7LTE2MzkxLCAwfSx7IDE2Mzc3LCAwfSx7LTMyNzc2LCAwfSx7IDMyNzYwLCAwfSx7LTMyNzc1LCAwfSx7IDMyNzYxLCAwfSx7ICAgICA2LCAwfSwKK3sgICAgIDgsLTF9LHsgICAgIDcsIDB9LHsgICAgIDksLTF9LHsgICAgIDUsIDB9LHsgICAgIDksLTF9LHsgICAgIDYsIDB9LHsgICAgMTAsLTF9LHsgICAgIDMsIDB9LAoreyAgICAxMSwtMX0seyAgICAgNCwgMH0seyAgICAxMiwtMX0seyAgICAtMSwtMX0seyAgICAxNSwtMX0seyAgICAgMCwgMH0seyAgICAxNiwtMX0seyAgICAtOSwtMX0sCit7ICAgIDIzLC0xfSx7ICAgIC04LC0xfSx7ICAgIDI0LC0xfSx7ICAgLTI1LC0xfSx7ICAgIDM5LC0xfSx7ICAgLTI0LC0xfSx7ICAgIDQwLC0xfSx7ICAgLTU3LC0xfSwKK3sgICAgNzEsLTF9LHsgICAtNTYsLTF9LHsgICAgNzIsLTF9LHsgIC0xMjEsLTF9LHsgICAxMzUsLTF9LHsgIC0xMjAsLTF9LHsgICAxMzYsLTF9LHsgIC0yNDksLTF9LAoreyAgIDI2MywtMX0seyAgLTI0OCwtMX0seyAgIDI2NCwtMX0seyAgLTUwNSwtMX0seyAgIDUxOSwtMX0seyAgLTUwNCwtMX0seyAgIDUyMCwtMX0seyAtMTAxNywtMX0sCit7ICAxMDMxLC0xfSx7IC0xMDE2LC0xfSx7ICAxMDMyLC0xfSx7IC0yMDQxLC0xfSx7ICAyMDU1LC0xfSx7IC0yMDQwLC0xfSx7ICAyMDU2LC0xfSx7IC00MDg5LC0xfSwKK3sgIDQxMDMsLTF9LHsgLTQwODgsLTF9LHsgIDQxMDQsLTF9LHsgLTgxODUsLTF9LHsgIDgxOTksLTF9LHsgLTgxODQsLTF9LHsgIDgyMDAsLTF9LHstMTYzNzcsLTF9LAoreyAxNjM5MSwtMX0sey0xNjM3NiwtMX0seyAxNjM5MiwtMX0sey0zMjc2MSwtMX0seyAzMjc3NSwtMX0sey0zMjc2MCwtMX0seyAzMjc3NiwtMX0seyAgIC0xMCwgMH0sCit7ICAgIC04LC0xfSx7ICAgIC05LCAwfSx7ICAgIC03LC0xfSx7ICAgLTExLCAwfSx7ICAgIC03LC0xfSx7ICAgLTEwLCAwfSx7ICAgIC02LC0xfSx7ICAgLTEzLCAwfSwKK3sgICAgLTUsLTF9LHsgICAtMTIsIDB9LHsgICAgLTQsLTF9LHsgICAtMTcsIDB9LHsgICAgLTEsLTF9LHsgICAtMTYsIDB9LHsgICAgIDAsIDB9LHsgICAtMjUsIDB9LAoreyAgICAgNywgMH0seyAgIC0yNCwgMH0seyAgICAgOCwgMH0seyAgIC00MSwgMH0seyAgICAyMywgMH0seyAgIC00MCwgMH0seyAgICAyNCwgMH0seyAgIC03MywgMH0sCit7ICAgIDU1LCAwfSx7ICAgLTcyLCAwfSx7ICAgIDU2LCAwfSx7ICAtMTM3LCAwfSx7ICAgMTE5LCAwfSx7ICAtMTM2LCAwfSx7ICAgMTIwLCAwfSx7ICAtMjY1LCAwfSwKK3sgICAyNDcsIDB9LHsgIC0yNjQsIDB9LHsgICAyNDgsIDB9LHsgIC01MjEsIDB9LHsgICA1MDMsIDB9LHsgIC01MjAsIDB9LHsgICA1MDQsIDB9LHsgLTEwMzMsIDB9LAoreyAgMTAxNSwgMH0seyAtMTAzMiwgMH0seyAgMTAxNiwgMH0seyAtMjA1NywgMH0seyAgMjAzOSwgMH0seyAtMjA1NiwgMH0seyAgMjA0MCwgMH0seyAtNDEwNSwgMH0sCit7ICA0MDg3LCAwfSx7IC00MTA0LCAwfSx7ICA0MDg4LCAwfSx7IC04MjAxLCAwfSx7ICA4MTgzLCAwfSx7IC04MjAwLCAwfSx7ICA4MTg0LCAwfSx7LTE2MzkzLCAwfSwKK3sgMTYzNzUsIDB9LHstMTYzOTIsIDB9LHsgMTYzNzYsIDB9LHstMzI3NzcsIDB9LHsgMzI3NTksIDB9LHstMzI3NzYsIDB9LHsgMzI3NjAsIDB9LHsgICAgMTUsIDB9LAoreyAgICAxNywtMX0seyAgICAxNiwgMH0seyAgICAxOCwtMX0seyAgICAxNCwgMH0seyAgICAxOCwtMX0seyAgICAxNSwgMH0seyAgICAxOSwtMX0seyAgICAxMiwgMH0sCit7ICAgIDIwLC0xfSx7ICAgIDEzLCAwfSx7ICAgIDIxLC0xfSx7ICAgICA4LCAwfSx7ICAgIDI0LC0xfSx7ICAgICA5LCAwfSx7ICAgIDI1LC0xfSx7ICAgICAwLCAwfSwKK3sgICAgMzIsLTF9LHsgICAgIDEsIDB9LHsgICAgMzMsLTF9LHsgICAtMTYsLTF9LHsgICAgNDgsLTF9LHsgICAtMTUsLTF9LHsgICAgNDksLTF9LHsgICAtNDgsLTF9LAoreyAgICA4MCwtMX0seyAgIC00NywtMX0seyAgICA4MSwtMX0seyAgLTExMiwtMX0seyAgIDE0NCwtMX0seyAgLTExMSwtMX0seyAgIDE0NSwtMX0seyAgLTI0MCwtMX0sCit7ICAgMjcyLC0xfSx7ICAtMjM5LC0xfSx7ICAgMjczLC0xfSx7ICAtNDk2LC0xfSx7ICAgNTI4LC0xfSx7ICAtNDk1LC0xfSx7ICAgNTI5LC0xfSx7IC0xMDA4LC0xfSwKK3sgIDEwNDAsLTF9LHsgLTEwMDcsLTF9LHsgIDEwNDEsLTF9LHsgLTIwMzIsLTF9LHsgIDIwNjQsLTF9LHsgLTIwMzEsLTF9LHsgIDIwNjUsLTF9LHsgLTQwODAsLTF9LAoreyAgNDExMiwtMX0seyAtNDA3OSwtMX0seyAgNDExMywtMX0seyAtODE3NiwtMX0seyAgODIwOCwtMX0seyAtODE3NSwtMX0seyAgODIwOSwtMX0sey0xNjM2OCwtMX0sCit7IDE2NDAwLC0xfSx7LTE2MzY3LC0xfSx7IDE2NDAxLC0xfSx7LTMyNzUyLC0xfSx7IDMyNzg0LC0xfSx7LTMyNzUxLC0xfSx7IDMyNzg1LC0xfSx7ICAgLTE3LCAwfSwKK3sgICAtMTUsLTF9LHsgICAtMTYsIDB9LHsgICAtMTQsLTF9LHsgICAtMTgsIDB9LHsgICAtMTQsLTF9LHsgICAtMTcsIDB9LHsgICAtMTMsLTF9LHsgICAtMjAsIDB9LAoreyAgIC0xMiwtMX0seyAgIC0xOSwgMH0seyAgIC0xMSwtMX0seyAgIC0yNCwgMH0seyAgICAtOCwtMX0seyAgIC0yMywgMH0seyAgICAtNywtMX0seyAgIC0zMiwgMH0sCit7ICAgICAwLCAwfSx7ICAgLTMxLCAwfSx7ICAgICAxLCAwfSx7ICAgLTQ4LCAwfSx7ICAgIDE2LCAwfSx7ICAgLTQ3LCAwfSx7ICAgIDE3LCAwfSx7ICAgLTgwLCAwfSwKK3sgICAgNDgsIDB9LHsgICAtNzksIDB9LHsgICAgNDksIDB9LHsgIC0xNDQsIDB9LHsgICAxMTIsIDB9LHsgIC0xNDMsIDB9LHsgICAxMTMsIDB9LHsgIC0yNzIsIDB9LAoreyAgIDI0MCwgMH0seyAgLTI3MSwgMH0seyAgIDI0MSwgMH0seyAgLTUyOCwgMH0seyAgIDQ5NiwgMH0seyAgLTUyNywgMH0seyAgIDQ5NywgMH0seyAtMTA0MCwgMH0sCit7ICAxMDA4LCAwfSx7IC0xMDM5LCAwfSx7ICAxMDA5LCAwfSx7IC0yMDY0LCAwfSx7ICAyMDMyLCAwfSx7IC0yMDYzLCAwfSx7ICAyMDMzLCAwfSx7IC00MTEyLCAwfSwKK3sgIDQwODAsIDB9LHsgLTQxMTEsIDB9LHsgIDQwODEsIDB9LHsgLTgyMDgsIDB9LHsgIDgxNzYsIDB9LHsgLTgyMDcsIDB9LHsgIDgxNzcsIDB9LHstMTY0MDAsIDB9LAoreyAxNjM2OCwgMH0sey0xNjM5OSwgMH0seyAxNjM2OSwgMH0sey0zMjc4NCwgMH0seyAzMjc1MiwgMH0sey0zMjc4MywgMH0seyAzMjc1MywgMH0seyAgICAxNCwgMH0sCit7ICAgIDE2LC0xfSx7ICAgIDE1LCAwfSx7ICAgIDE3LC0xfSx7ICAgIDEzLCAwfSx7ICAgIDE3LC0xfSx7ICAgIDE0LCAwfSx7ICAgIDE4LC0xfSx7ICAgIDExLCAwfSwKK3sgICAgMTksLTF9LHsgICAgMTIsIDB9LHsgICAgMjAsLTF9LHsgICAgIDcsIDB9LHsgICAgMjMsLTF9LHsgICAgIDgsIDB9LHsgICAgMjQsLTF9LHsgICAgLTEsLTF9LAoreyAgICAzMSwtMX0seyAgICAgMCwgMH0seyAgICAzMiwtMX0seyAgIC0xNywtMX0seyAgICA0NywtMX0seyAgIC0xNiwtMX0seyAgICA0OCwtMX0seyAgIC00OSwtMX0sCit7ICAgIDc5LC0xfSx7ICAgLTQ4LC0xfSx7ICAgIDgwLC0xfSx7ICAtMTEzLC0xfSx7ICAgMTQzLC0xfSx7ICAtMTEyLC0xfSx7ICAgMTQ0LC0xfSx7ICAtMjQxLC0xfSwKK3sgICAyNzEsLTF9LHsgIC0yNDAsLTF9LHsgICAyNzIsLTF9LHsgIC00OTcsLTF9LHsgICA1MjcsLTF9LHsgIC00OTYsLTF9LHsgICA1MjgsLTF9LHsgLTEwMDksLTF9LAoreyAgMTAzOSwtMX0seyAtMTAwOCwtMX0seyAgMTA0MCwtMX0seyAtMjAzMywtMX0seyAgMjA2MywtMX0seyAtMjAzMiwtMX0seyAgMjA2NCwtMX0seyAtNDA4MSwtMX0sCit7ICA0MTExLC0xfSx7IC00MDgwLC0xfSx7ICA0MTEyLC0xfSx7IC04MTc3LC0xfSx7ICA4MjA3LC0xfSx7IC04MTc2LC0xfSx7ICA4MjA4LC0xfSx7LTE2MzY5LC0xfSwKK3sgMTYzOTksLTF9LHstMTYzNjgsLTF9LHsgMTY0MDAsLTF9LHstMzI3NTMsLTF9LHsgMzI3ODMsLTF9LHstMzI3NTIsLTF9LHsgMzI3ODQsLTF9LHsgICAtMTgsIDB9LAoreyAgIC0xNiwtMX0seyAgIC0xNywgMH0seyAgIC0xNSwtMX0seyAgIC0xOSwgMH0seyAgIC0xNSwtMX0seyAgIC0xOCwgMH0seyAgIC0xNCwtMX0seyAgIC0yMSwgMH0sCit7ICAgLTEzLC0xfSx7ICAgLTIwLCAwfSx7ICAgLTEyLC0xfSx7ICAgLTI1LCAwfSx7ICAgIC05LC0xfSx7ICAgLTI0LCAwfSx7ICAgIC04LC0xfSx7ICAgLTMzLCAwfSwKK3sgICAgLTEsLTF9LHsgICAtMzIsIDB9LHsgICAgIDAsIDB9LHsgICAtNDksIDB9LHsgICAgMTUsIDB9LHsgICAtNDgsIDB9LHsgICAgMTYsIDB9LHsgICAtODEsIDB9LAoreyAgICA0NywgMH0seyAgIC04MCwgMH0seyAgICA0OCwgMH0seyAgLTE0NSwgMH0seyAgIDExMSwgMH0seyAgLTE0NCwgMH0seyAgIDExMiwgMH0seyAgLTI3MywgMH0sCit7ICAgMjM5LCAwfSx7ICAtMjcyLCAwfSx7ICAgMjQwLCAwfSx7ICAtNTI5LCAwfSx7ICAgNDk1LCAwfSx7ICAtNTI4LCAwfSx7ICAgNDk2LCAwfSx7IC0xMDQxLCAwfSwKK3sgIDEwMDcsIDB9LHsgLTEwNDAsIDB9LHsgIDEwMDgsIDB9LHsgLTIwNjUsIDB9LHsgIDIwMzEsIDB9LHsgLTIwNjQsIDB9LHsgIDIwMzIsIDB9LHsgLTQxMTMsIDB9LAoreyAgNDA3OSwgMH0seyAtNDExMiwgMH0seyAgNDA4MCwgMH0seyAtODIwOSwgMH0seyAgODE3NSwgMH0seyAtODIwOCwgMH0seyAgODE3NiwgMH0sey0xNjQwMSwgMH0sCit7IDE2MzY3LCAwfSx7LTE2NDAwLCAwfSx7IDE2MzY4LCAwfSx7LTMyNzg1LCAwfSx7IDMyNzUxLCAwfSx7LTMyNzg0LCAwfSx7IDMyNzUyLCAwfSx7ICAgIDMxLCAwfSwKK3sgICAgMzMsLTF9LHsgICAgMzIsIDB9LHsgICAgMzQsLTF9LHsgICAgMzAsIDB9LHsgICAgMzQsLTF9LHsgICAgMzEsIDB9LHsgICAgMzUsLTF9LHsgICAgMjgsIDB9LAoreyAgICAzNiwtMX0seyAgICAyOSwgMH0seyAgICAzNywtMX0seyAgICAyNCwgMH0seyAgICA0MCwtMX0seyAgICAyNSwgMH0seyAgICA0MSwtMX0seyAgICAxNiwgMH0sCit7ICAgIDQ4LC0xfSx7ICAgIDE3LCAwfSx7ICAgIDQ5LC0xfSx7ICAgICAwLCAwfSx7ICAgIDY0LC0xfSx7ICAgICAxLCAwfSx7ICAgIDY1LC0xfSx7ICAgLTMyLC0xfSwKK3sgICAgOTYsLTF9LHsgICAtMzEsLTF9LHsgICAgOTcsLTF9LHsgICAtOTYsLTF9LHsgICAxNjAsLTF9LHsgICAtOTUsLTF9LHsgICAxNjEsLTF9LHsgIC0yMjQsLTF9LAoreyAgIDI4OCwtMX0seyAgLTIyMywtMX0seyAgIDI4OSwtMX0seyAgLTQ4MCwtMX0seyAgIDU0NCwtMX0seyAgLTQ3OSwtMX0seyAgIDU0NSwtMX0seyAgLTk5MiwtMX0sCit7ICAxMDU2LC0xfSx7ICAtOTkxLC0xfSx7ICAxMDU3LC0xfSx7IC0yMDE2LC0xfSx7ICAyMDgwLC0xfSx7IC0yMDE1LC0xfSx7ICAyMDgxLC0xfSx7IC00MDY0LC0xfSwKK3sgIDQxMjgsLTF9LHsgLTQwNjMsLTF9LHsgIDQxMjksLTF9LHsgLTgxNjAsLTF9LHsgIDgyMjQsLTF9LHsgLTgxNTksLTF9LHsgIDgyMjUsLTF9LHstMTYzNTIsLTF9LAoreyAxNjQxNiwtMX0sey0xNjM1MSwtMX0seyAxNjQxNywtMX0sey0zMjczNiwtMX0seyAzMjgwMCwtMX0sey0zMjczNSwtMX0seyAzMjgwMSwtMX0seyAgIC0zMywgMH0sCit7ICAgLTMxLC0xfSx7ICAgLTMyLCAwfSx7ICAgLTMwLC0xfSx7ICAgLTM0LCAwfSx7ICAgLTMwLC0xfSx7ICAgLTMzLCAwfSx7ICAgLTI5LC0xfSx7ICAgLTM2LCAwfSwKK3sgICAtMjgsLTF9LHsgICAtMzUsIDB9LHsgICAtMjcsLTF9LHsgICAtNDAsIDB9LHsgICAtMjQsLTF9LHsgICAtMzksIDB9LHsgICAtMjMsLTF9LHsgICAtNDgsIDB9LAoreyAgIC0xNiwtMX0seyAgIC00NywgMH0seyAgIC0xNSwtMX0seyAgIC02NCwgMH0seyAgICAgMCwgMH0seyAgIC02MywgMH0seyAgICAgMSwgMH0seyAgIC05NiwgMH0sCit7ICAgIDMyLCAwfSx7ICAgLTk1LCAwfSx7ICAgIDMzLCAwfSx7ICAtMTYwLCAwfSx7ICAgIDk2LCAwfSx7ICAtMTU5LCAwfSx7ICAgIDk3LCAwfSx7ICAtMjg4LCAwfSwKK3sgICAyMjQsIDB9LHsgIC0yODcsIDB9LHsgICAyMjUsIDB9LHsgIC01NDQsIDB9LHsgICA0ODAsIDB9LHsgIC01NDMsIDB9LHsgICA0ODEsIDB9LHsgLTEwNTYsIDB9LAoreyAgIDk5MiwgMH0seyAtMTA1NSwgMH0seyAgIDk5MywgMH0seyAtMjA4MCwgMH0seyAgMjAxNiwgMH0seyAtMjA3OSwgMH0seyAgMjAxNywgMH0seyAtNDEyOCwgMH0sCit7ICA0MDY0LCAwfSx7IC00MTI3LCAwfSx7ICA0MDY1LCAwfSx7IC04MjI0LCAwfSx7ICA4MTYwLCAwfSx7IC04MjIzLCAwfSx7ICA4MTYxLCAwfSx7LTE2NDE2LCAwfSwKK3sgMTYzNTIsIDB9LHstMTY0MTUsIDB9LHsgMTYzNTMsIDB9LHstMzI4MDAsIDB9LHsgMzI3MzYsIDB9LHstMzI3OTksIDB9LHsgMzI3MzcsIDB9LHsgICAgMzAsIDB9LAoreyAgICAzMiwtMX0seyAgICAzMSwgMH0seyAgICAzMywtMX0seyAgICAyOSwgMH0seyAgICAzMywtMX0seyAgICAzMCwgMH0seyAgICAzNCwtMX0seyAgICAyNywgMH0sCit7ICAgIDM1LC0xfSx7ICAgIDI4LCAwfSx7ICAgIDM2LC0xfSx7ICAgIDIzLCAwfSx7ICAgIDM5LC0xfSx7ICAgIDI0LCAwfSx7ICAgIDQwLC0xfSx7ICAgIDE1LCAwfSwKK3sgICAgNDcsLTF9LHsgICAgMTYsIDB9LHsgICAgNDgsLTF9LHsgICAgLTEsLTF9LHsgICAgNjMsLTF9LHsgICAgIDAsIDB9LHsgICAgNjQsLTF9LHsgICAtMzMsLTF9LAoreyAgICA5NSwtMX0seyAgIC0zMiwtMX0seyAgICA5NiwtMX0seyAgIC05NywtMX0seyAgIDE1OSwtMX0seyAgIC05NiwtMX0seyAgIDE2MCwtMX0seyAgLTIyNSwtMX0sCit7ICAgMjg3LC0xfSx7ICAtMjI0LC0xfSx7ICAgMjg4LC0xfSx7ICAtNDgxLC0xfSx7ICAgNTQzLC0xfSx7ICAtNDgwLC0xfSx7ICAgNTQ0LC0xfSx7ICAtOTkzLC0xfSwKK3sgIDEwNTUsLTF9LHsgIC05OTIsLTF9LHsgIDEwNTYsLTF9LHsgLTIwMTcsLTF9LHsgIDIwNzksLTF9LHsgLTIwMTYsLTF9LHsgIDIwODAsLTF9LHsgLTQwNjUsLTF9LAoreyAgNDEyNywtMX0seyAtNDA2NCwtMX0seyAgNDEyOCwtMX0seyAtODE2MSwtMX0seyAgODIyMywtMX0seyAtODE2MCwtMX0seyAgODIyNCwtMX0sey0xNjM1MywtMX0sCit7IDE2NDE1LC0xfSx7LTE2MzUyLC0xfSx7IDE2NDE2LC0xfSx7LTMyNzM3LC0xfSx7IDMyNzk5LC0xfSx7LTMyNzM2LC0xfSx7IDMyODAwLC0xfSx7ICAgLTM0LCAwfSwKK3sgICAtMzIsLTF9LHsgICAtMzMsIDB9LHsgICAtMzEsLTF9LHsgICAtMzUsIDB9LHsgICAtMzEsLTF9LHsgICAtMzQsIDB9LHsgICAtMzAsLTF9LHsgICAtMzcsIDB9LAoreyAgIC0yOSwtMX0seyAgIC0zNiwgMH0seyAgIC0yOCwtMX0seyAgIC00MSwgMH0seyAgIC0yNSwtMX0seyAgIC00MCwgMH0seyAgIC0yNCwtMX0seyAgIC00OSwgMH0sCit7ICAgLTE3LC0xfSx7ICAgLTQ4LCAwfSx7ICAgLTE2LC0xfSx7ICAgLTY1LCAwfSx7ICAgIC0xLC0xfSx7ICAgLTY0LCAwfSx7ICAgICAwLCAwfSx7ICAgLTk3LCAwfSwKK3sgICAgMzEsIDB9LHsgICAtOTYsIDB9LHsgICAgMzIsIDB9LHsgIC0xNjEsIDB9LHsgICAgOTUsIDB9LHsgIC0xNjAsIDB9LHsgICAgOTYsIDB9LHsgIC0yODksIDB9LAoreyAgIDIyMywgMH0seyAgLTI4OCwgMH0seyAgIDIyNCwgMH0seyAgLTU0NSwgMH0seyAgIDQ3OSwgMH0seyAgLTU0NCwgMH0seyAgIDQ4MCwgMH0seyAtMTA1NywgMH0sCit7ICAgOTkxLCAwfSx7IC0xMDU2LCAwfSx7ICAgOTkyLCAwfSx7IC0yMDgxLCAwfSx7ICAyMDE1LCAwfSx7IC0yMDgwLCAwfSx7ICAyMDE2LCAwfSx7IC00MTI5LCAwfSwKK3sgIDQwNjMsIDB9LHsgLTQxMjgsIDB9LHsgIDQwNjQsIDB9LHsgLTgyMjUsIDB9LHsgIDgxNTksIDB9LHsgLTgyMjQsIDB9LHsgIDgxNjAsIDB9LHstMTY0MTcsIDB9LAoreyAxNjM1MSwgMH0sey0xNjQxNiwgMH0seyAxNjM1MiwgMH0sey0zMjgwMSwgMH0seyAzMjczNSwgMH0sey0zMjgwMCwgMH0seyAzMjczNiwgMH0seyAgICA2MywgMH0sCit7ICAgIDY1LC0xfSx7ICAgIDY0LCAwfSx7ICAgIDY2LC0xfSx7ICAgIDYyLCAwfSx7ICAgIDY2LC0xfSx7ICAgIDYzLCAwfSx7ICAgIDY3LC0xfSx7ICAgIDYwLCAwfSwKK3sgICAgNjgsLTF9LHsgICAgNjEsIDB9LHsgICAgNjksLTF9LHsgICAgNTYsIDB9LHsgICAgNzIsLTF9LHsgICAgNTcsIDB9LHsgICAgNzMsLTF9LHsgICAgNDgsIDB9LAoreyAgICA4MCwtMX0seyAgICA0OSwgMH0seyAgICA4MSwtMX0seyAgICAzMiwgMH0seyAgICA5NiwtMX0seyAgICAzMywgMH0seyAgICA5NywtMX0seyAgICAgMCwgMH0sCit7ICAgMTI4LC0xfSx7ICAgICAxLCAwfSx7ICAgMTI5LC0xfSx7ICAgLTY0LC0xfSx7ICAgMTkyLC0xfSx7ICAgLTYzLC0xfSx7ICAgMTkzLC0xfSx7ICAtMTkyLC0xfSwKK3sgICAzMjAsLTF9LHsgIC0xOTEsLTF9LHsgICAzMjEsLTF9LHsgIC00NDgsLTF9LHsgICA1NzYsLTF9LHsgIC00NDcsLTF9LHsgICA1NzcsLTF9LHsgIC05NjAsLTF9LAoreyAgMTA4OCwtMX0seyAgLTk1OSwtMX0seyAgMTA4OSwtMX0seyAtMTk4NCwtMX0seyAgMjExMiwtMX0seyAtMTk4MywtMX0seyAgMjExMywtMX0seyAtNDAzMiwtMX0sCit7ICA0MTYwLC0xfSx7IC00MDMxLC0xfSx7ICA0MTYxLC0xfSx7IC04MTI4LC0xfSx7ICA4MjU2LC0xfSx7IC04MTI3LC0xfSx7ICA4MjU3LC0xfSx7LTE2MzIwLC0xfSwKK3sgMTY0NDgsLTF9LHstMTYzMTksLTF9LHsgMTY0NDksLTF9LHstMzI3MDQsLTF9LHsgMzI4MzIsLTF9LHstMzI3MDMsLTF9LHsgMzI4MzMsLTF9LHsgICAtNjUsIDB9LAoreyAgIC02MywtMX0seyAgIC02NCwgMH0seyAgIC02MiwtMX0seyAgIC02NiwgMH0seyAgIC02MiwtMX0seyAgIC02NSwgMH0seyAgIC02MSwtMX0seyAgIC02OCwgMH0sCit7ICAgLTYwLC0xfSx7ICAgLTY3LCAwfSx7ICAgLTU5LC0xfSx7ICAgLTcyLCAwfSx7ICAgLTU2LC0xfSx7ICAgLTcxLCAwfSx7ICAgLTU1LC0xfSx7ICAgLTgwLCAwfSwKK3sgICAtNDgsLTF9LHsgICAtNzksIDB9LHsgICAtNDcsLTF9LHsgICAtOTYsIDB9LHsgICAtMzIsLTF9LHsgICAtOTUsIDB9LHsgICAtMzEsLTF9LHsgIC0xMjgsIDB9LAoreyAgICAgMCwgMH0seyAgLTEyNywgMH0seyAgICAgMSwgMH0seyAgLTE5MiwgMH0seyAgICA2NCwgMH0seyAgLTE5MSwgMH0seyAgICA2NSwgMH0seyAgLTMyMCwgMH0sCit7ICAgMTkyLCAwfSx7ICAtMzE5LCAwfSx7ICAgMTkzLCAwfSx7ICAtNTc2LCAwfSx7ICAgNDQ4LCAwfSx7ICAtNTc1LCAwfSx7ICAgNDQ5LCAwfSx7IC0xMDg4LCAwfSwKK3sgICA5NjAsIDB9LHsgLTEwODcsIDB9LHsgICA5NjEsIDB9LHsgLTIxMTIsIDB9LHsgIDE5ODQsIDB9LHsgLTIxMTEsIDB9LHsgIDE5ODUsIDB9LHsgLTQxNjAsIDB9LAoreyAgNDAzMiwgMH0seyAtNDE1OSwgMH0seyAgNDAzMywgMH0seyAtODI1NiwgMH0seyAgODEyOCwgMH0seyAtODI1NSwgMH0seyAgODEyOSwgMH0sey0xNjQ0OCwgMH0sCit7IDE2MzIwLCAwfSx7LTE2NDQ3LCAwfSx7IDE2MzIxLCAwfSx7LTMyODMyLCAwfSx7IDMyNzA0LCAwfSx7LTMyODMxLCAwfSx7IDMyNzA1LCAwfSx7ICAgIDYyLCAwfSwKK3sgICAgNjQsLTF9LHsgICAgNjMsIDB9LHsgICAgNjUsLTF9LHsgICAgNjEsIDB9LHsgICAgNjUsLTF9LHsgICAgNjIsIDB9LHsgICAgNjYsLTF9LHsgICAgNTksIDB9LAoreyAgICA2NywtMX0seyAgICA2MCwgMH0seyAgICA2OCwtMX0seyAgICA1NSwgMH0seyAgICA3MSwtMX0seyAgICA1NiwgMH0seyAgICA3MiwtMX0seyAgICA0NywgMH0sCit7ICAgIDc5LC0xfSx7ICAgIDQ4LCAwfSx7ICAgIDgwLC0xfSx7ICAgIDMxLCAwfSx7ICAgIDk1LC0xfSx7ICAgIDMyLCAwfSx7ICAgIDk2LC0xfSx7ICAgIC0xLC0xfSwKK3sgICAxMjcsLTF9LHsgICAgIDAsIDB9LHsgICAxMjgsLTF9LHsgICAtNjUsLTF9LHsgICAxOTEsLTF9LHsgICAtNjQsLTF9LHsgICAxOTIsLTF9LHsgIC0xOTMsLTF9LAoreyAgIDMxOSwtMX0seyAgLTE5MiwtMX0seyAgIDMyMCwtMX0seyAgLTQ0OSwtMX0seyAgIDU3NSwtMX0seyAgLTQ0OCwtMX0seyAgIDU3NiwtMX0seyAgLTk2MSwtMX0sCit7ICAxMDg3LC0xfSx7ICAtOTYwLC0xfSx7ICAxMDg4LC0xfSx7IC0xOTg1LC0xfSx7ICAyMTExLC0xfSx7IC0xOTg0LC0xfSx7ICAyMTEyLC0xfSx7IC00MDMzLC0xfSwKK3sgIDQxNTksLTF9LHsgLTQwMzIsLTF9LHsgIDQxNjAsLTF9LHsgLTgxMjksLTF9LHsgIDgyNTUsLTF9LHsgLTgxMjgsLTF9LHsgIDgyNTYsLTF9LHstMTYzMjEsLTF9LAoreyAxNjQ0NywtMX0sey0xNjMyMCwtMX0seyAxNjQ0OCwtMX0sey0zMjcwNSwtMX0seyAzMjgzMSwtMX0sey0zMjcwNCwtMX0seyAzMjgzMiwtMX0seyAgIC02NiwgMH0sCit7ICAgLTY0LC0xfSx7ICAgLTY1LCAwfSx7ICAgLTYzLC0xfSx7ICAgLTY3LCAwfSx7ICAgLTYzLC0xfSx7ICAgLTY2LCAwfSx7ICAgLTYyLC0xfSx7ICAgLTY5LCAwfSwKK3sgICAtNjEsLTF9LHsgICAtNjgsIDB9LHsgICAtNjAsLTF9LHsgICAtNzMsIDB9LHsgICAtNTcsLTF9LHsgICAtNzIsIDB9LHsgICAtNTYsLTF9LHsgICAtODEsIDB9LAoreyAgIC00OSwtMX0seyAgIC04MCwgMH0seyAgIC00OCwtMX0seyAgIC05NywgMH0seyAgIC0zMywtMX0seyAgIC05NiwgMH0seyAgIC0zMiwtMX0seyAgLTEyOSwgMH0sCit7ICAgIC0xLC0xfSx7ICAtMTI4LCAwfSx7ICAgICAwLCAwfSx7ICAtMTkzLCAwfSx7ICAgIDYzLCAwfSx7ICAtMTkyLCAwfSx7ICAgIDY0LCAwfSx7ICAtMzIxLCAwfSwKK3sgICAxOTEsIDB9LHsgIC0zMjAsIDB9LHsgICAxOTIsIDB9LHsgIC01NzcsIDB9LHsgICA0NDcsIDB9LHsgIC01NzYsIDB9LHsgICA0NDgsIDB9LHsgLTEwODksIDB9LAoreyAgIDk1OSwgMH0seyAtMTA4OCwgMH0seyAgIDk2MCwgMH0seyAtMjExMywgMH0seyAgMTk4MywgMH0seyAtMjExMiwgMH0seyAgMTk4NCwgMH0seyAtNDE2MSwgMH0sCit7ICA0MDMxLCAwfSx7IC00MTYwLCAwfSx7ICA0MDMyLCAwfSx7IC04MjU3LCAwfSx7ICA4MTI3LCAwfSx7IC04MjU2LCAwfSx7ICA4MTI4LCAwfSx7LTE2NDQ5LCAwfSwKK3sgMTYzMTksIDB9LHstMTY0NDgsIDB9LHsgMTYzMjAsIDB9LHstMzI4MzMsIDB9LHsgMzI3MDMsIDB9LHstMzI4MzIsIDB9LHsgMzI3MDQsIDB9LHsgICAxMjcsIDB9LAoreyAgIDEyOSwtMX0seyAgIDEyOCwgMH0seyAgIDEzMCwtMX0seyAgIDEyNiwgMH0seyAgIDEzMCwtMX0seyAgIDEyNywgMH0seyAgIDEzMSwtMX0seyAgIDEyNCwgMH0sCit7ICAgMTMyLC0xfSx7ICAgMTI1LCAwfSx7ICAgMTMzLC0xfSx7ICAgMTIwLCAwfSx7ICAgMTM2LC0xfSx7ICAgMTIxLCAwfSx7ICAgMTM3LC0xfSx7ICAgMTEyLCAwfSwKK3sgICAxNDQsLTF9LHsgICAxMTMsIDB9LHsgICAxNDUsLTF9LHsgICAgOTYsIDB9LHsgICAxNjAsLTF9LHsgICAgOTcsIDB9LHsgICAxNjEsLTF9LHsgICAgNjQsIDB9LAoreyAgIDE5MiwtMX0seyAgICA2NSwgMH0seyAgIDE5MywtMX0seyAgICAgMCwgMH0seyAgIDI1NiwtMX0seyAgICAgMSwgMH0seyAgIDI1NywtMX0seyAgLTEyOCwtMX0sCit7ICAgMzg0LC0xfSx7ICAtMTI3LC0xfSx7ICAgMzg1LC0xfSx7ICAtMzg0LC0xfSx7ICAgNjQwLC0xfSx7ICAtMzgzLC0xfSx7ICAgNjQxLC0xfSx7ICAtODk2LC0xfSwKK3sgIDExNTIsLTF9LHsgIC04OTUsLTF9LHsgIDExNTMsLTF9LHsgLTE5MjAsLTF9LHsgIDIxNzYsLTF9LHsgLTE5MTksLTF9LHsgIDIxNzcsLTF9LHsgLTM5NjgsLTF9LAoreyAgNDIyNCwtMX0seyAtMzk2NywtMX0seyAgNDIyNSwtMX0seyAtODA2NCwtMX0seyAgODMyMCwtMX0seyAtODA2MywtMX0seyAgODMyMSwtMX0sey0xNjI1NiwtMX0sCit7IDE2NTEyLC0xfSx7LTE2MjU1LC0xfSx7IDE2NTEzLC0xfSx7LTMyNjQwLC0xfSx7IDMyODk2LC0xfSx7LTMyNjM5LC0xfSx7IDMyODk3LC0xfSx7ICAtMTI5LCAwfSwKK3sgIC0xMjcsLTF9LHsgIC0xMjgsIDB9LHsgIC0xMjYsLTF9LHsgIC0xMzAsIDB9LHsgIC0xMjYsLTF9LHsgIC0xMjksIDB9LHsgIC0xMjUsLTF9LHsgIC0xMzIsIDB9LAoreyAgLTEyNCwtMX0seyAgLTEzMSwgMH0seyAgLTEyMywtMX0seyAgLTEzNiwgMH0seyAgLTEyMCwtMX0seyAgLTEzNSwgMH0seyAgLTExOSwtMX0seyAgLTE0NCwgMH0sCit7ICAtMTEyLC0xfSx7ICAtMTQzLCAwfSx7ICAtMTExLC0xfSx7ICAtMTYwLCAwfSx7ICAgLTk2LC0xfSx7ICAtMTU5LCAwfSx7ICAgLTk1LC0xfSx7ICAtMTkyLCAwfSwKK3sgICAtNjQsLTF9LHsgIC0xOTEsIDB9LHsgICAtNjMsLTF9LHsgIC0yNTYsIDB9LHsgICAgIDAsIDB9LHsgIC0yNTUsIDB9LHsgICAgIDEsIDB9LHsgIC0zODQsIDB9LAoreyAgIDEyOCwgMH0seyAgLTM4MywgMH0seyAgIDEyOSwgMH0seyAgLTY0MCwgMH0seyAgIDM4NCwgMH0seyAgLTYzOSwgMH0seyAgIDM4NSwgMH0seyAtMTE1MiwgMH0sCit7ICAgODk2LCAwfSx7IC0xMTUxLCAwfSx7ICAgODk3LCAwfSx7IC0yMTc2LCAwfSx7ICAxOTIwLCAwfSx7IC0yMTc1LCAwfSx7ICAxOTIxLCAwfSx7IC00MjI0LCAwfSwKK3sgIDM5NjgsIDB9LHsgLTQyMjMsIDB9LHsgIDM5NjksIDB9LHsgLTgzMjAsIDB9LHsgIDgwNjQsIDB9LHsgLTgzMTksIDB9LHsgIDgwNjUsIDB9LHstMTY1MTIsIDB9LAoreyAxNjI1NiwgMH0sey0xNjUxMSwgMH0seyAxNjI1NywgMH0sey0zMjg5NiwgMH0seyAzMjY0MCwgMH0sey0zMjg5NSwgMH0seyAzMjY0MSwgMH0seyAgIDEyNiwgMH0sCit7ICAgMTI4LC0xfSx7ICAgMTI3LCAwfSx7ICAgMTI5LC0xfSx7ICAgMTI1LCAwfSx7ICAgMTI5LC0xfSx7ICAgMTI2LCAwfSx7ICAgMTMwLC0xfSx7ICAgMTIzLCAwfSwKK3sgICAxMzEsLTF9LHsgICAxMjQsIDB9LHsgICAxMzIsLTF9LHsgICAxMTksIDB9LHsgICAxMzUsLTF9LHsgICAxMjAsIDB9LHsgICAxMzYsLTF9LHsgICAxMTEsIDB9LAoreyAgIDE0MywtMX0seyAgIDExMiwgMH0seyAgIDE0NCwtMX0seyAgICA5NSwgMH0seyAgIDE1OSwtMX0seyAgICA5NiwgMH0seyAgIDE2MCwtMX0seyAgICA2MywgMH0sCit7ICAgMTkxLC0xfSx7ICAgIDY0LCAwfSx7ICAgMTkyLC0xfSx7ICAgIC0xLC0xfSx7ICAgMjU1LC0xfSx7ICAgICAwLCAwfSx7ICAgMjU2LC0xfSx7ICAtMTI5LC0xfSwKK3sgICAzODMsLTF9LHsgIC0xMjgsLTF9LHsgICAzODQsLTF9LHsgIC0zODUsLTF9LHsgICA2MzksLTF9LHsgIC0zODQsLTF9LHsgICA2NDAsLTF9LHsgIC04OTcsLTF9LAoreyAgMTE1MSwtMX0seyAgLTg5NiwtMX0seyAgMTE1MiwtMX0seyAtMTkyMSwtMX0seyAgMjE3NSwtMX0seyAtMTkyMCwtMX0seyAgMjE3NiwtMX0seyAtMzk2OSwtMX0sCit7ICA0MjIzLC0xfSx7IC0zOTY4LC0xfSx7ICA0MjI0LC0xfSx7IC04MDY1LC0xfSx7ICA4MzE5LC0xfSx7IC04MDY0LC0xfSx7ICA4MzIwLC0xfSx7LTE2MjU3LC0xfSwKK3sgMTY1MTEsLTF9LHstMTYyNTYsLTF9LHsgMTY1MTIsLTF9LHstMzI2NDEsLTF9LHsgMzI4OTUsLTF9LHstMzI2NDAsLTF9LHsgMzI4OTYsLTF9LHsgIC0xMzAsIDB9LAoreyAgLTEyOCwtMX0seyAgLTEyOSwgMH0seyAgLTEyNywtMX0seyAgLTEzMSwgMH0seyAgLTEyNywtMX0seyAgLTEzMCwgMH0seyAgLTEyNiwtMX0seyAgLTEzMywgMH0sCit7ICAtMTI1LC0xfSx7ICAtMTMyLCAwfSx7ICAtMTI0LC0xfSx7ICAtMTM3LCAwfSx7ICAtMTIxLC0xfSx7ICAtMTM2LCAwfSx7ICAtMTIwLC0xfSx7ICAtMTQ1LCAwfSwKK3sgIC0xMTMsLTF9LHsgIC0xNDQsIDB9LHsgIC0xMTIsLTF9LHsgIC0xNjEsIDB9LHsgICAtOTcsLTF9LHsgIC0xNjAsIDB9LHsgICAtOTYsLTF9LHsgIC0xOTMsIDB9LAoreyAgIC02NSwtMX0seyAgLTE5MiwgMH0seyAgIC02NCwtMX0seyAgLTI1NywgMH0seyAgICAtMSwtMX0seyAgLTI1NiwgMH0seyAgICAgMCwgMH0seyAgLTM4NSwgMH0sCit7ICAgMTI3LCAwfSx7ICAtMzg0LCAwfSx7ICAgMTI4LCAwfSx7ICAtNjQxLCAwfSx7ICAgMzgzLCAwfSx7ICAtNjQwLCAwfSx7ICAgMzg0LCAwfSx7IC0xMTUzLCAwfSwKK3sgICA4OTUsIDB9LHsgLTExNTIsIDB9LHsgICA4OTYsIDB9LHsgLTIxNzcsIDB9LHsgIDE5MTksIDB9LHsgLTIxNzYsIDB9LHsgIDE5MjAsIDB9LHsgLTQyMjUsIDB9LAoreyAgMzk2NywgMH0seyAtNDIyNCwgMH0seyAgMzk2OCwgMH0seyAtODMyMSwgMH0seyAgODA2MywgMH0seyAtODMyMCwgMH0seyAgODA2NCwgMH0sey0xNjUxMywgMH0sCit7IDE2MjU1LCAwfSx7LTE2NTEyLCAwfSx7IDE2MjU2LCAwfSx7LTMyODk3LCAwfSx7IDMyNjM5LCAwfSx7LTMyODk2LCAwfSx7IDMyNjQwLCAwfSx7ICAgMjU1LCAwfSwKK3sgICAyNTcsLTF9LHsgICAyNTYsIDB9LHsgICAyNTgsLTF9LHsgICAyNTQsIDB9LHsgICAyNTgsLTF9LHsgICAyNTUsIDB9LHsgICAyNTksLTF9LHsgICAyNTIsIDB9LAoreyAgIDI2MCwtMX0seyAgIDI1MywgMH0seyAgIDI2MSwtMX0seyAgIDI0OCwgMH0seyAgIDI2NCwtMX0seyAgIDI0OSwgMH0seyAgIDI2NSwtMX0seyAgIDI0MCwgMH0sCit7ICAgMjcyLC0xfSx7ICAgMjQxLCAwfSx7ICAgMjczLC0xfSx7ICAgMjI0LCAwfSx7ICAgMjg4LC0xfSx7ICAgMjI1LCAwfSx7ICAgMjg5LC0xfSx7ICAgMTkyLCAwfSwKK3sgICAzMjAsLTF9LHsgICAxOTMsIDB9LHsgICAzMjEsLTF9LHsgICAxMjgsIDB9LHsgICAzODQsLTF9LHsgICAxMjksIDB9LHsgICAzODUsLTF9LHsgICAgIDAsIDB9LAoreyAgIDUxMiwtMX0seyAgICAgMSwgMH0seyAgIDUxMywtMX0seyAgLTI1NiwtMX0seyAgIDc2OCwtMX0seyAgLTI1NSwtMX0seyAgIDc2OSwtMX0seyAgLTc2OCwtMX0sCit7ICAxMjgwLC0xfSx7ICAtNzY3LC0xfSx7ICAxMjgxLC0xfSx7IC0xNzkyLC0xfSx7ICAyMzA0LC0xfSx7IC0xNzkxLC0xfSx7ICAyMzA1LC0xfSx7IC0zODQwLC0xfSwKK3sgIDQzNTIsLTF9LHsgLTM4MzksLTF9LHsgIDQzNTMsLTF9LHsgLTc5MzYsLTF9LHsgIDg0NDgsLTF9LHsgLTc5MzUsLTF9LHsgIDg0NDksLTF9LHstMTYxMjgsLTF9LAoreyAxNjY0MCwtMX0sey0xNjEyNywtMX0seyAxNjY0MSwtMX0sey0zMjUxMiwtMX0seyAzMzAyNCwtMX0sey0zMjUxMSwtMX0seyAzMzAyNSwtMX0seyAgLTI1NywgMH0sCit7ICAtMjU1LC0xfSx7ICAtMjU2LCAwfSx7ICAtMjU0LC0xfSx7ICAtMjU4LCAwfSx7ICAtMjU0LC0xfSx7ICAtMjU3LCAwfSx7ICAtMjUzLC0xfSx7ICAtMjYwLCAwfSwKK3sgIC0yNTIsLTF9LHsgIC0yNTksIDB9LHsgIC0yNTEsLTF9LHsgIC0yNjQsIDB9LHsgIC0yNDgsLTF9LHsgIC0yNjMsIDB9LHsgIC0yNDcsLTF9LHsgIC0yNzIsIDB9LAoreyAgLTI0MCwtMX0seyAgLTI3MSwgMH0seyAgLTIzOSwtMX0seyAgLTI4OCwgMH0seyAgLTIyNCwtMX0seyAgLTI4NywgMH0seyAgLTIyMywtMX0seyAgLTMyMCwgMH0sCit7ICAtMTkyLC0xfSx7ICAtMzE5LCAwfSx7ICAtMTkxLC0xfSx7ICAtMzg0LCAwfSx7ICAtMTI4LC0xfSx7ICAtMzgzLCAwfSx7ICAtMTI3LC0xfSx7ICAtNTEyLCAwfSwKK3sgICAgIDAsIDB9LHsgIC01MTEsIDB9LHsgICAgIDEsIDB9LHsgIC03NjgsIDB9LHsgICAyNTYsIDB9LHsgIC03NjcsIDB9LHsgICAyNTcsIDB9LHsgLTEyODAsIDB9LAoreyAgIDc2OCwgMH0seyAtMTI3OSwgMH0seyAgIDc2OSwgMH0seyAtMjMwNCwgMH0seyAgMTc5MiwgMH0seyAtMjMwMywgMH0seyAgMTc5MywgMH0seyAtNDM1MiwgMH0sCit7ICAzODQwLCAwfSx7IC00MzUxLCAwfSx7ICAzODQxLCAwfSx7IC04NDQ4LCAwfSx7ICA3OTM2LCAwfSx7IC04NDQ3LCAwfSx7ICA3OTM3LCAwfSx7LTE2NjQwLCAwfSwKK3sgMTYxMjgsIDB9LHstMTY2MzksIDB9LHsgMTYxMjksIDB9LHstMzMwMjQsIDB9LHsgMzI1MTIsIDB9LHstMzMwMjMsIDB9LHsgMzI1MTMsIDB9LHsgICAyNTQsIDB9LAoreyAgIDI1NiwtMX0seyAgIDI1NSwgMH0seyAgIDI1NywtMX0seyAgIDI1MywgMH0seyAgIDI1NywtMX0seyAgIDI1NCwgMH0seyAgIDI1OCwtMX0seyAgIDI1MSwgMH0sCit7ICAgMjU5LC0xfSx7ICAgMjUyLCAwfSx7ICAgMjYwLC0xfSx7ICAgMjQ3LCAwfSx7ICAgMjYzLC0xfSx7ICAgMjQ4LCAwfSx7ICAgMjY0LC0xfSx7ICAgMjM5LCAwfSwKK3sgICAyNzEsLTF9LHsgICAyNDAsIDB9LHsgICAyNzIsLTF9LHsgICAyMjMsIDB9LHsgICAyODcsLTF9LHsgICAyMjQsIDB9LHsgICAyODgsLTF9LHsgICAxOTEsIDB9LAoreyAgIDMxOSwtMX0seyAgIDE5MiwgMH0seyAgIDMyMCwtMX0seyAgIDEyNywgMH0seyAgIDM4MywtMX0seyAgIDEyOCwgMH0seyAgIDM4NCwtMX0seyAgICAtMSwtMX0sCit7ICAgNTExLC0xfSx7ICAgICAwLCAwfSx7ICAgNTEyLC0xfSx7ICAtMjU3LC0xfSx7ICAgNzY3LC0xfSx7ICAtMjU2LC0xfSx7ICAgNzY4LC0xfSx7ICAtNzY5LC0xfSwKK3sgIDEyNzksLTF9LHsgIC03NjgsLTF9LHsgIDEyODAsLTF9LHsgLTE3OTMsLTF9LHsgIDIzMDMsLTF9LHsgLTE3OTIsLTF9LHsgIDIzMDQsLTF9LHsgLTM4NDEsLTF9LAoreyAgNDM1MSwtMX0seyAtMzg0MCwtMX0seyAgNDM1MiwtMX0seyAtNzkzNywtMX0seyAgODQ0NywtMX0seyAtNzkzNiwtMX0seyAgODQ0OCwtMX0sey0xNjEyOSwtMX0sCit7IDE2NjM5LC0xfSx7LTE2MTI4LC0xfSx7IDE2NjQwLC0xfSx7LTMyNTEzLC0xfSx7IDMzMDIzLC0xfSx7LTMyNTEyLC0xfSx7IDMzMDI0LC0xfSx7ICAtMjU4LCAwfSwKK3sgIC0yNTYsLTF9LHsgIC0yNTcsIDB9LHsgIC0yNTUsLTF9LHsgIC0yNTksIDB9LHsgIC0yNTUsLTF9LHsgIC0yNTgsIDB9LHsgIC0yNTQsLTF9LHsgIC0yNjEsIDB9LAoreyAgLTI1MywtMX0seyAgLTI2MCwgMH0seyAgLTI1MiwtMX0seyAgLTI2NSwgMH0seyAgLTI0OSwtMX0seyAgLTI2NCwgMH0seyAgLTI0OCwtMX0seyAgLTI3MywgMH0sCit7ICAtMjQxLC0xfSx7ICAtMjcyLCAwfSx7ICAtMjQwLC0xfSx7ICAtMjg5LCAwfSx7ICAtMjI1LC0xfSx7ICAtMjg4LCAwfSx7ICAtMjI0LC0xfSx7ICAtMzIxLCAwfSwKK3sgIC0xOTMsLTF9LHsgIC0zMjAsIDB9LHsgIC0xOTIsLTF9LHsgIC0zODUsIDB9LHsgIC0xMjksLTF9LHsgIC0zODQsIDB9LHsgIC0xMjgsLTF9LHsgIC01MTMsIDB9LAoreyAgICAtMSwtMX0seyAgLTUxMiwgMH0seyAgICAgMCwgMH0seyAgLTc2OSwgMH0seyAgIDI1NSwgMH0seyAgLTc2OCwgMH0seyAgIDI1NiwgMH0seyAtMTI4MSwgMH0sCit7ICAgNzY3LCAwfSx7IC0xMjgwLCAwfSx7ICAgNzY4LCAwfSx7IC0yMzA1LCAwfSx7ICAxNzkxLCAwfSx7IC0yMzA0LCAwfSx7ICAxNzkyLCAwfSx7IC00MzUzLCAwfSwKK3sgIDM4MzksIDB9LHsgLTQzNTIsIDB9LHsgIDM4NDAsIDB9LHsgLTg0NDksIDB9LHsgIDc5MzUsIDB9LHsgLTg0NDgsIDB9LHsgIDc5MzYsIDB9LHstMTY2NDEsIDB9LAoreyAxNjEyNywgMH0sey0xNjY0MCwgMH0seyAxNjEyOCwgMH0sey0zMzAyNSwgMH0seyAzMjUxMSwgMH0sey0zMzAyNCwgMH0seyAzMjUxMiwgMH0seyAgIDUxMSwgMH0sCit7ICAgNTEzLC0xfSx7ICAgNTEyLCAwfSx7ICAgNTE0LC0xfSx7ICAgNTEwLCAwfSx7ICAgNTE0LC0xfSx7ICAgNTExLCAwfSx7ICAgNTE1LC0xfSx7ICAgNTA4LCAwfSwKK3sgICA1MTYsLTF9LHsgICA1MDksIDB9LHsgICA1MTcsLTF9LHsgICA1MDQsIDB9LHsgICA1MjAsLTF9LHsgICA1MDUsIDB9LHsgICA1MjEsLTF9LHsgICA0OTYsIDB9LAoreyAgIDUyOCwtMX0seyAgIDQ5NywgMH0seyAgIDUyOSwtMX0seyAgIDQ4MCwgMH0seyAgIDU0NCwtMX0seyAgIDQ4MSwgMH0seyAgIDU0NSwtMX0seyAgIDQ0OCwgMH0sCit7ICAgNTc2LC0xfSx7ICAgNDQ5LCAwfSx7ICAgNTc3LC0xfSx7ICAgMzg0LCAwfSx7ICAgNjQwLC0xfSx7ICAgMzg1LCAwfSx7ICAgNjQxLC0xfSx7ICAgMjU2LCAwfSwKK3sgICA3NjgsLTF9LHsgICAyNTcsIDB9LHsgICA3NjksLTF9LHsgICAgIDAsIDB9LHsgIDEwMjQsLTF9LHsgICAgIDEsIDB9LHsgIDEwMjUsLTF9LHsgIC01MTIsLTF9LAoreyAgMTUzNiwtMX0seyAgLTUxMSwtMX0seyAgMTUzNywtMX0seyAtMTUzNiwtMX0seyAgMjU2MCwtMX0seyAtMTUzNSwtMX0seyAgMjU2MSwtMX0seyAtMzU4NCwtMX0sCit7ICA0NjA4LC0xfSx7IC0zNTgzLC0xfSx7ICA0NjA5LC0xfSx7IC03NjgwLC0xfSx7ICA4NzA0LC0xfSx7IC03Njc5LC0xfSx7ICA4NzA1LC0xfSx7LTE1ODcyLC0xfSwKK3sgMTY4OTYsLTF9LHstMTU4NzEsLTF9LHsgMTY4OTcsLTF9LHstMzIyNTYsLTF9LHsgMzMyODAsLTF9LHstMzIyNTUsLTF9LHsgMzMyODEsLTF9LHsgIC01MTMsIDB9LAoreyAgLTUxMSwtMX0seyAgLTUxMiwgMH0seyAgLTUxMCwtMX0seyAgLTUxNCwgMH0seyAgLTUxMCwtMX0seyAgLTUxMywgMH0seyAgLTUwOSwtMX0seyAgLTUxNiwgMH0sCit7ICAtNTA4LC0xfSx7ICAtNTE1LCAwfSx7ICAtNTA3LC0xfSx7ICAtNTIwLCAwfSx7ICAtNTA0LC0xfSx7ICAtNTE5LCAwfSx7ICAtNTAzLC0xfSx7ICAtNTI4LCAwfSwKK3sgIC00OTYsLTF9LHsgIC01MjcsIDB9LHsgIC00OTUsLTF9LHsgIC01NDQsIDB9LHsgIC00ODAsLTF9LHsgIC01NDMsIDB9LHsgIC00NzksLTF9LHsgIC01NzYsIDB9LAoreyAgLTQ0OCwtMX0seyAgLTU3NSwgMH0seyAgLTQ0NywtMX0seyAgLTY0MCwgMH0seyAgLTM4NCwtMX0seyAgLTYzOSwgMH0seyAgLTM4MywtMX0seyAgLTc2OCwgMH0sCit7ICAtMjU2LC0xfSx7ICAtNzY3LCAwfSx7ICAtMjU1LC0xfSx7IC0xMDI0LCAwfSx7ICAgICAwLCAwfSx7IC0xMDIzLCAwfSx7ICAgICAxLCAwfSx7IC0xNTM2LCAwfSwKK3sgICA1MTIsIDB9LHsgLTE1MzUsIDB9LHsgICA1MTMsIDB9LHsgLTI1NjAsIDB9LHsgIDE1MzYsIDB9LHsgLTI1NTksIDB9LHsgIDE1MzcsIDB9LHsgLTQ2MDgsIDB9LAoreyAgMzU4NCwgMH0seyAtNDYwNywgMH0seyAgMzU4NSwgMH0seyAtODcwNCwgMH0seyAgNzY4MCwgMH0seyAtODcwMywgMH0seyAgNzY4MSwgMH0sey0xNjg5NiwgMH0sCit7IDE1ODcyLCAwfSx7LTE2ODk1LCAwfSx7IDE1ODczLCAwfSx7LTMzMjgwLCAwfSx7IDMyMjU2LCAwfSx7LTMzMjc5LCAwfSx7IDMyMjU3LCAwfSx7ICAgNTEwLCAwfSwKK3sgICA1MTIsLTF9LHsgICA1MTEsIDB9LHsgICA1MTMsLTF9LHsgICA1MDksIDB9LHsgICA1MTMsLTF9LHsgICA1MTAsIDB9LHsgICA1MTQsLTF9LHsgICA1MDcsIDB9LAoreyAgIDUxNSwtMX0seyAgIDUwOCwgMH0seyAgIDUxNiwtMX0seyAgIDUwMywgMH0seyAgIDUxOSwtMX0seyAgIDUwNCwgMH0seyAgIDUyMCwtMX0seyAgIDQ5NSwgMH0sCit7ICAgNTI3LC0xfSx7ICAgNDk2LCAwfSx7ICAgNTI4LC0xfSx7ICAgNDc5LCAwfSx7ICAgNTQzLC0xfSx7ICAgNDgwLCAwfSx7ICAgNTQ0LC0xfSx7ICAgNDQ3LCAwfSwKK3sgICA1NzUsLTF9LHsgICA0NDgsIDB9LHsgICA1NzYsLTF9LHsgICAzODMsIDB9LHsgICA2MzksLTF9LHsgICAzODQsIDB9LHsgICA2NDAsLTF9LHsgICAyNTUsIDB9LAoreyAgIDc2NywtMX0seyAgIDI1NiwgMH0seyAgIDc2OCwtMX0seyAgICAtMSwtMX0seyAgMTAyMywtMX0seyAgICAgMCwgMH0seyAgMTAyNCwtMX0seyAgLTUxMywtMX0sCit7ICAxNTM1LC0xfSx7ICAtNTEyLC0xfSx7ICAxNTM2LC0xfSx7IC0xNTM3LC0xfSx7ICAyNTU5LC0xfSx7IC0xNTM2LC0xfSx7ICAyNTYwLC0xfSx7IC0zNTg1LC0xfSwKK3sgIDQ2MDcsLTF9LHsgLTM1ODQsLTF9LHsgIDQ2MDgsLTF9LHsgLTc2ODEsLTF9LHsgIDg3MDMsLTF9LHsgLTc2ODAsLTF9LHsgIDg3MDQsLTF9LHstMTU4NzMsLTF9LAoreyAxNjg5NSwtMX0sey0xNTg3MiwtMX0seyAxNjg5NiwtMX0sey0zMjI1NywtMX0seyAzMzI3OSwtMX0sey0zMjI1NiwtMX0seyAzMzI4MCwtMX0seyAgLTUxNCwgMH0sCit7ICAtNTEyLC0xfSx7ICAtNTEzLCAwfSx7ICAtNTExLC0xfSx7ICAtNTE1LCAwfSx7ICAtNTExLC0xfSx7ICAtNTE0LCAwfSx7ICAtNTEwLC0xfSx7ICAtNTE3LCAwfSwKK3sgIC01MDksLTF9LHsgIC01MTYsIDB9LHsgIC01MDgsLTF9LHsgIC01MjEsIDB9LHsgIC01MDUsLTF9LHsgIC01MjAsIDB9LHsgIC01MDQsLTF9LHsgIC01MjksIDB9LAoreyAgLTQ5NywtMX0seyAgLTUyOCwgMH0seyAgLTQ5NiwtMX0seyAgLTU0NSwgMH0seyAgLTQ4MSwtMX0seyAgLTU0NCwgMH0seyAgLTQ4MCwtMX0seyAgLTU3NywgMH0sCit7ICAtNDQ5LC0xfSx7ICAtNTc2LCAwfSx7ICAtNDQ4LC0xfSx7ICAtNjQxLCAwfSx7ICAtMzg1LC0xfSx7ICAtNjQwLCAwfSx7ICAtMzg0LC0xfSx7ICAtNzY5LCAwfSwKK3sgIC0yNTcsLTF9LHsgIC03NjgsIDB9LHsgIC0yNTYsLTF9LHsgLTEwMjUsIDB9LHsgICAgLTEsLTF9LHsgLTEwMjQsIDB9LHsgICAgIDAsIDB9LHsgLTE1MzcsIDB9LAoreyAgIDUxMSwgMH0seyAtMTUzNiwgMH0seyAgIDUxMiwgMH0seyAtMjU2MSwgMH0seyAgMTUzNSwgMH0seyAtMjU2MCwgMH0seyAgMTUzNiwgMH0seyAtNDYwOSwgMH0sCit7ICAzNTgzLCAwfSx7IC00NjA4LCAwfSx7ICAzNTg0LCAwfSx7IC04NzA1LCAwfSx7ICA3Njc5LCAwfSx7IC04NzA0LCAwfSx7ICA3NjgwLCAwfSx7LTE2ODk3LCAwfSwKK3sgMTU4NzEsIDB9LHstMTY4OTYsIDB9LHsgMTU4NzIsIDB9LHstMzMyODEsIDB9LHsgMzIyNTUsIDB9LHstMzMyODAsIDB9LHsgMzIyNTYsIDB9LHsgIDEwMjMsIDB9LAoreyAgMTAyNSwtMX0seyAgMTAyNCwgMH0seyAgMTAyNiwtMX0seyAgMTAyMiwgMH0seyAgMTAyNiwtMX0seyAgMTAyMywgMH0seyAgMTAyNywtMX0seyAgMTAyMCwgMH0sCit7ICAxMDI4LC0xfSx7ICAxMDIxLCAwfSx7ICAxMDI5LC0xfSx7ICAxMDE2LCAwfSx7ICAxMDMyLC0xfSx7ICAxMDE3LCAwfSx7ICAxMDMzLC0xfSx7ICAxMDA4LCAwfSwKK3sgIDEwNDAsLTF9LHsgIDEwMDksIDB9LHsgIDEwNDEsLTF9LHsgICA5OTIsIDB9LHsgIDEwNTYsLTF9LHsgICA5OTMsIDB9LHsgIDEwNTcsLTF9LHsgICA5NjAsIDB9LAoreyAgMTA4OCwtMX0seyAgIDk2MSwgMH0seyAgMTA4OSwtMX0seyAgIDg5NiwgMH0seyAgMTE1MiwtMX0seyAgIDg5NywgMH0seyAgMTE1MywtMX0seyAgIDc2OCwgMH0sCit7ICAxMjgwLC0xfSx7ICAgNzY5LCAwfSx7ICAxMjgxLC0xfSx7ICAgNTEyLCAwfSx7ICAxNTM2LC0xfSx7ICAgNTEzLCAwfSx7ICAxNTM3LC0xfSx7ICAgICAwLCAwfSwKK3sgIDIwNDgsLTF9LHsgICAgIDEsIDB9LHsgIDIwNDksLTF9LHsgLTEwMjQsLTF9LHsgIDMwNzIsLTF9LHsgLTEwMjMsLTF9LHsgIDMwNzMsLTF9LHsgLTMwNzIsLTF9LAoreyAgNTEyMCwtMX0seyAtMzA3MSwtMX0seyAgNTEyMSwtMX0seyAtNzE2OCwtMX0seyAgOTIxNiwtMX0seyAtNzE2NywtMX0seyAgOTIxNywtMX0sey0xNTM2MCwtMX0sCit7IDE3NDA4LC0xfSx7LTE1MzU5LC0xfSx7IDE3NDA5LC0xfSx7LTMxNzQ0LC0xfSx7IDMzNzkyLC0xfSx7LTMxNzQzLC0xfSx7IDMzNzkzLC0xfSx7IC0xMDI1LCAwfSwKK3sgLTEwMjMsLTF9LHsgLTEwMjQsIDB9LHsgLTEwMjIsLTF9LHsgLTEwMjYsIDB9LHsgLTEwMjIsLTF9LHsgLTEwMjUsIDB9LHsgLTEwMjEsLTF9LHsgLTEwMjgsIDB9LAoreyAtMTAyMCwtMX0seyAtMTAyNywgMH0seyAtMTAxOSwtMX0seyAtMTAzMiwgMH0seyAtMTAxNiwtMX0seyAtMTAzMSwgMH0seyAtMTAxNSwtMX0seyAtMTA0MCwgMH0sCit7IC0xMDA4LC0xfSx7IC0xMDM5LCAwfSx7IC0xMDA3LC0xfSx7IC0xMDU2LCAwfSx7ICAtOTkyLC0xfSx7IC0xMDU1LCAwfSx7ICAtOTkxLC0xfSx7IC0xMDg4LCAwfSwKK3sgIC05NjAsLTF9LHsgLTEwODcsIDB9LHsgIC05NTksLTF9LHsgLTExNTIsIDB9LHsgIC04OTYsLTF9LHsgLTExNTEsIDB9LHsgIC04OTUsLTF9LHsgLTEyODAsIDB9LAoreyAgLTc2OCwtMX0seyAtMTI3OSwgMH0seyAgLTc2NywtMX0seyAtMTUzNiwgMH0seyAgLTUxMiwtMX0seyAtMTUzNSwgMH0seyAgLTUxMSwtMX0seyAtMjA0OCwgMH0sCit7ICAgICAwLCAwfSx7IC0yMDQ3LCAwfSx7ICAgICAxLCAwfSx7IC0zMDcyLCAwfSx7ICAxMDI0LCAwfSx7IC0zMDcxLCAwfSx7ICAxMDI1LCAwfSx7IC01MTIwLCAwfSwKK3sgIDMwNzIsIDB9LHsgLTUxMTksIDB9LHsgIDMwNzMsIDB9LHsgLTkyMTYsIDB9LHsgIDcxNjgsIDB9LHsgLTkyMTUsIDB9LHsgIDcxNjksIDB9LHstMTc0MDgsIDB9LAoreyAxNTM2MCwgMH0sey0xNzQwNywgMH0seyAxNTM2MSwgMH0sey0zMzc5MiwgMH0seyAzMTc0NCwgMH0sey0zMzc5MSwgMH0seyAzMTc0NSwgMH0seyAgMTAyMiwgMH0sCit7ICAxMDI0LC0xfSx7ICAxMDIzLCAwfSx7ICAxMDI1LC0xfSx7ICAxMDIxLCAwfSx7ICAxMDI1LC0xfSx7ICAxMDIyLCAwfSx7ICAxMDI2LC0xfSx7ICAxMDE5LCAwfSwKK3sgIDEwMjcsLTF9LHsgIDEwMjAsIDB9LHsgIDEwMjgsLTF9LHsgIDEwMTUsIDB9LHsgIDEwMzEsLTF9LHsgIDEwMTYsIDB9LHsgIDEwMzIsLTF9LHsgIDEwMDcsIDB9LAoreyAgMTAzOSwtMX0seyAgMTAwOCwgMH0seyAgMTA0MCwtMX0seyAgIDk5MSwgMH0seyAgMTA1NSwtMX0seyAgIDk5MiwgMH0seyAgMTA1NiwtMX0seyAgIDk1OSwgMH0sCit7ICAxMDg3LC0xfSx7ICAgOTYwLCAwfSx7ICAxMDg4LC0xfSx7ICAgODk1LCAwfSx7ICAxMTUxLC0xfSx7ICAgODk2LCAwfSx7ICAxMTUyLC0xfSx7ICAgNzY3LCAwfSwKK3sgIDEyNzksLTF9LHsgICA3NjgsIDB9LHsgIDEyODAsLTF9LHsgICA1MTEsIDB9LHsgIDE1MzUsLTF9LHsgICA1MTIsIDB9LHsgIDE1MzYsLTF9LHsgICAgLTEsLTF9LAoreyAgMjA0NywtMX0seyAgICAgMCwgMH0seyAgMjA0OCwtMX0seyAtMTAyNSwtMX0seyAgMzA3MSwtMX0seyAtMTAyNCwtMX0seyAgMzA3MiwtMX0seyAtMzA3MywtMX0sCit7ICA1MTE5LC0xfSx7IC0zMDcyLC0xfSx7ICA1MTIwLC0xfSx7IC03MTY5LC0xfSx7ICA5MjE1LC0xfSx7IC03MTY4LC0xfSx7ICA5MjE2LC0xfSx7LTE1MzYxLC0xfSwKK3sgMTc0MDcsLTF9LHstMTUzNjAsLTF9LHsgMTc0MDgsLTF9LHstMzE3NDUsLTF9LHsgMzM3OTEsLTF9LHstMzE3NDQsLTF9LHsgMzM3OTIsLTF9LHsgLTEwMjYsIDB9LAoreyAtMTAyNCwtMX0seyAtMTAyNSwgMH0seyAtMTAyMywtMX0seyAtMTAyNywgMH0seyAtMTAyMywtMX0seyAtMTAyNiwgMH0seyAtMTAyMiwtMX0seyAtMTAyOSwgMH0sCit7IC0xMDIxLC0xfSx7IC0xMDI4LCAwfSx7IC0xMDIwLC0xfSx7IC0xMDMzLCAwfSx7IC0xMDE3LC0xfSx7IC0xMDMyLCAwfSx7IC0xMDE2LC0xfSx7IC0xMDQxLCAwfSwKK3sgLTEwMDksLTF9LHsgLTEwNDAsIDB9LHsgLTEwMDgsLTF9LHsgLTEwNTcsIDB9LHsgIC05OTMsLTF9LHsgLTEwNTYsIDB9LHsgIC05OTIsLTF9LHsgLTEwODksIDB9LAoreyAgLTk2MSwtMX0seyAtMTA4OCwgMH0seyAgLTk2MCwtMX0seyAtMTE1MywgMH0seyAgLTg5NywtMX0seyAtMTE1MiwgMH0seyAgLTg5NiwtMX0seyAtMTI4MSwgMH0sCit7ICAtNzY5LC0xfSx7IC0xMjgwLCAwfSx7ICAtNzY4LC0xfSx7IC0xNTM3LCAwfSx7ICAtNTEzLC0xfSx7IC0xNTM2LCAwfSx7ICAtNTEyLC0xfSx7IC0yMDQ5LCAwfSwKK3sgICAgLTEsLTF9LHsgLTIwNDgsIDB9LHsgICAgIDAsIDB9LHsgLTMwNzMsIDB9LHsgIDEwMjMsIDB9LHsgLTMwNzIsIDB9LHsgIDEwMjQsIDB9LHsgLTUxMjEsIDB9LAoreyAgMzA3MSwgMH0seyAtNTEyMCwgMH0seyAgMzA3MiwgMH0seyAtOTIxNywgMH0seyAgNzE2NywgMH0seyAtOTIxNiwgMH0seyAgNzE2OCwgMH0sey0xNzQwOSwgMH0sCit7IDE1MzU5LCAwfSx7LTE3NDA4LCAwfSx7IDE1MzYwLCAwfSx7LTMzNzkzLCAwfSx7IDMxNzQzLCAwfSx7LTMzNzkyLCAwfSx7IDMxNzQ0LCAwfSx7ICAyMDQ3LCAwfSwKK3sgIDIwNDksLTF9LHsgIDIwNDgsIDB9LHsgIDIwNTAsLTF9LHsgIDIwNDYsIDB9LHsgIDIwNTAsLTF9LHsgIDIwNDcsIDB9LHsgIDIwNTEsLTF9LHsgIDIwNDQsIDB9LAoreyAgMjA1MiwtMX0seyAgMjA0NSwgMH0seyAgMjA1MywtMX0seyAgMjA0MCwgMH0seyAgMjA1NiwtMX0seyAgMjA0MSwgMH0seyAgMjA1NywtMX0seyAgMjAzMiwgMH0sCit7ICAyMDY0LC0xfSx7ICAyMDMzLCAwfSx7ICAyMDY1LC0xfSx7ICAyMDE2LCAwfSx7ICAyMDgwLC0xfSx7ICAyMDE3LCAwfSx7ICAyMDgxLC0xfSx7ICAxOTg0LCAwfSwKK3sgIDIxMTIsLTF9LHsgIDE5ODUsIDB9LHsgIDIxMTMsLTF9LHsgIDE5MjAsIDB9LHsgIDIxNzYsLTF9LHsgIDE5MjEsIDB9LHsgIDIxNzcsLTF9LHsgIDE3OTIsIDB9LAoreyAgMjMwNCwtMX0seyAgMTc5MywgMH0seyAgMjMwNSwtMX0seyAgMTUzNiwgMH0seyAgMjU2MCwtMX0seyAgMTUzNywgMH0seyAgMjU2MSwtMX0seyAgMTAyNCwgMH0sCit7ICAzMDcyLC0xfSx7ICAxMDI1LCAwfSx7ICAzMDczLC0xfSx7ICAgICAwLCAwfSx7ICA0MDk2LC0xfSx7ICAgICAxLCAwfSx7ICA0MDk3LC0xfSx7IC0yMDQ4LC0xfSwKK3sgIDYxNDQsLTF9LHsgLTIwNDcsLTF9LHsgIDYxNDUsLTF9LHsgLTYxNDQsLTF9LHsgMTAyNDAsLTF9LHsgLTYxNDMsLTF9LHsgMTAyNDEsLTF9LHstMTQzMzYsLTF9LAoreyAxODQzMiwtMX0sey0xNDMzNSwtMX0seyAxODQzMywtMX0sey0zMDcyMCwtMX0seyAzNDgxNiwtMX0sey0zMDcxOSwtMX0seyAzNDgxNywtMX0seyAtMjA0OSwgMH0sCit7IC0yMDQ3LC0xfSx7IC0yMDQ4LCAwfSx7IC0yMDQ2LC0xfSx7IC0yMDUwLCAwfSx7IC0yMDQ2LC0xfSx7IC0yMDQ5LCAwfSx7IC0yMDQ1LC0xfSx7IC0yMDUyLCAwfSwKK3sgLTIwNDQsLTF9LHsgLTIwNTEsIDB9LHsgLTIwNDMsLTF9LHsgLTIwNTYsIDB9LHsgLTIwNDAsLTF9LHsgLTIwNTUsIDB9LHsgLTIwMzksLTF9LHsgLTIwNjQsIDB9LAoreyAtMjAzMiwtMX0seyAtMjA2MywgMH0seyAtMjAzMSwtMX0seyAtMjA4MCwgMH0seyAtMjAxNiwtMX0seyAtMjA3OSwgMH0seyAtMjAxNSwtMX0seyAtMjExMiwgMH0sCit7IC0xOTg0LC0xfSx7IC0yMTExLCAwfSx7IC0xOTgzLC0xfSx7IC0yMTc2LCAwfSx7IC0xOTIwLC0xfSx7IC0yMTc1LCAwfSx7IC0xOTE5LC0xfSx7IC0yMzA0LCAwfSwKK3sgLTE3OTIsLTF9LHsgLTIzMDMsIDB9LHsgLTE3OTEsLTF9LHsgLTI1NjAsIDB9LHsgLTE1MzYsLTF9LHsgLTI1NTksIDB9LHsgLTE1MzUsLTF9LHsgLTMwNzIsIDB9LAoreyAtMTAyNCwtMX0seyAtMzA3MSwgMH0seyAtMTAyMywtMX0seyAtNDA5NiwgMH0seyAgICAgMCwgMH0seyAtNDA5NSwgMH0seyAgICAgMSwgMH0seyAtNjE0NCwgMH0sCit7ICAyMDQ4LCAwfSx7IC02MTQzLCAwfSx7ICAyMDQ5LCAwfSx7LTEwMjQwLCAwfSx7ICA2MTQ0LCAwfSx7LTEwMjM5LCAwfSx7ICA2MTQ1LCAwfSx7LTE4NDMyLCAwfSwKK3sgMTQzMzYsIDB9LHstMTg0MzEsIDB9LHsgMTQzMzcsIDB9LHstMzQ4MTYsIDB9LHsgMzA3MjAsIDB9LHstMzQ4MTUsIDB9LHsgMzA3MjEsIDB9LHsgIDIwNDYsIDB9LAoreyAgMjA0OCwtMX0seyAgMjA0NywgMH0seyAgMjA0OSwtMX0seyAgMjA0NSwgMH0seyAgMjA0OSwtMX0seyAgMjA0NiwgMH0seyAgMjA1MCwtMX0seyAgMjA0MywgMH0sCit7ICAyMDUxLC0xfSx7ICAyMDQ0LCAwfSx7ICAyMDUyLC0xfSx7ICAyMDM5LCAwfSx7ICAyMDU1LC0xfSx7ICAyMDQwLCAwfSx7ICAyMDU2LC0xfSx7ICAyMDMxLCAwfSwKK3sgIDIwNjMsLTF9LHsgIDIwMzIsIDB9LHsgIDIwNjQsLTF9LHsgIDIwMTUsIDB9LHsgIDIwNzksLTF9LHsgIDIwMTYsIDB9LHsgIDIwODAsLTF9LHsgIDE5ODMsIDB9LAoreyAgMjExMSwtMX0seyAgMTk4NCwgMH0seyAgMjExMiwtMX0seyAgMTkxOSwgMH0seyAgMjE3NSwtMX0seyAgMTkyMCwgMH0seyAgMjE3NiwtMX0seyAgMTc5MSwgMH0sCit7ICAyMzAzLC0xfSx7ICAxNzkyLCAwfSx7ICAyMzA0LC0xfSx7ICAxNTM1LCAwfSx7ICAyNTU5LC0xfSx7ICAxNTM2LCAwfSx7ICAyNTYwLC0xfSx7ICAxMDIzLCAwfSwKK3sgIDMwNzEsLTF9LHsgIDEwMjQsIDB9LHsgIDMwNzIsLTF9LHsgICAgLTEsLTF9LHsgIDQwOTUsLTF9LHsgICAgIDAsIDB9LHsgIDQwOTYsLTF9LHsgLTIwNDksLTF9LAoreyAgNjE0MywtMX0seyAtMjA0OCwtMX0seyAgNjE0NCwtMX0seyAtNjE0NSwtMX0seyAxMDIzOSwtMX0seyAtNjE0NCwtMX0seyAxMDI0MCwtMX0sey0xNDMzNywtMX0sCit7IDE4NDMxLC0xfSx7LTE0MzM2LC0xfSx7IDE4NDMyLC0xfSx7LTMwNzIxLC0xfSx7IDM0ODE1LC0xfSx7LTMwNzIwLC0xfSx7IDM0ODE2LC0xfSx7IC0yMDUwLCAwfSwKK3sgLTIwNDgsLTF9LHsgLTIwNDksIDB9LHsgLTIwNDcsLTF9LHsgLTIwNTEsIDB9LHsgLTIwNDcsLTF9LHsgLTIwNTAsIDB9LHsgLTIwNDYsLTF9LHsgLTIwNTMsIDB9LAoreyAtMjA0NSwtMX0seyAtMjA1MiwgMH0seyAtMjA0NCwtMX0seyAtMjA1NywgMH0seyAtMjA0MSwtMX0seyAtMjA1NiwgMH0seyAtMjA0MCwtMX0seyAtMjA2NSwgMH0sCit7IC0yMDMzLC0xfSx7IC0yMDY0LCAwfSx7IC0yMDMyLC0xfSx7IC0yMDgxLCAwfSx7IC0yMDE3LC0xfSx7IC0yMDgwLCAwfSx7IC0yMDE2LC0xfSx7IC0yMTEzLCAwfSwKK3sgLTE5ODUsLTF9LHsgLTIxMTIsIDB9LHsgLTE5ODQsLTF9LHsgLTIxNzcsIDB9LHsgLTE5MjEsLTF9LHsgLTIxNzYsIDB9LHsgLTE5MjAsLTF9LHsgLTIzMDUsIDB9LAoreyAtMTc5MywtMX0seyAtMjMwNCwgMH0seyAtMTc5MiwtMX0seyAtMjU2MSwgMH0seyAtMTUzNywtMX0seyAtMjU2MCwgMH0seyAtMTUzNiwtMX0seyAtMzA3MywgMH0sCit7IC0xMDI1LC0xfSx7IC0zMDcyLCAwfSx7IC0xMDI0LC0xfSx7IC00MDk3LCAwfSx7ICAgIC0xLC0xfSx7IC00MDk2LCAwfSx7ICAgICAwLCAwfSx7IC02MTQ1LCAwfSwKK3sgIDIwNDcsIDB9LHsgLTYxNDQsIDB9LHsgIDIwNDgsIDB9LHstMTAyNDEsIDB9LHsgIDYxNDMsIDB9LHstMTAyNDAsIDB9LHsgIDYxNDQsIDB9LHstMTg0MzMsIDB9LAoreyAxNDMzNSwgMH0sey0xODQzMiwgMH0seyAxNDMzNiwgMH0sey0zNDgxNywgMH0seyAzMDcxOSwgMH0sey0zNDgxNiwgMH0seyAzMDcyMCwgMH0seyAgNDA5NSwgMH0sCit7ICA0MDk3LC0xfSx7ICA0MDk2LCAwfSx7ICA0MDk4LC0xfSx7ICA0MDk0LCAwfSx7ICA0MDk4LC0xfSx7ICA0MDk1LCAwfSx7ICA0MDk5LC0xfSx7ICA0MDkyLCAwfSwKK3sgIDQxMDAsLTF9LHsgIDQwOTMsIDB9LHsgIDQxMDEsLTF9LHsgIDQwODgsIDB9LHsgIDQxMDQsLTF9LHsgIDQwODksIDB9LHsgIDQxMDUsLTF9LHsgIDQwODAsIDB9LAoreyAgNDExMiwtMX0seyAgNDA4MSwgMH0seyAgNDExMywtMX0seyAgNDA2NCwgMH0seyAgNDEyOCwtMX0seyAgNDA2NSwgMH0seyAgNDEyOSwtMX0seyAgNDAzMiwgMH0sCit7ICA0MTYwLC0xfSx7ICA0MDMzLCAwfSx7ICA0MTYxLC0xfSx7ICAzOTY4LCAwfSx7ICA0MjI0LC0xfSx7ICAzOTY5LCAwfSx7ICA0MjI1LC0xfSx7ICAzODQwLCAwfSwKK3sgIDQzNTIsLTF9LHsgIDM4NDEsIDB9LHsgIDQzNTMsLTF9LHsgIDM1ODQsIDB9LHsgIDQ2MDgsLTF9LHsgIDM1ODUsIDB9LHsgIDQ2MDksLTF9LHsgIDMwNzIsIDB9LAoreyAgNTEyMCwtMX0seyAgMzA3MywgMH0seyAgNTEyMSwtMX0seyAgMjA0OCwgMH0seyAgNjE0NCwtMX0seyAgMjA0OSwgMH0seyAgNjE0NSwtMX0seyAgICAgMCwgMH0sCit7ICA4MTkyLC0xfSx7ICAgICAxLCAwfSx7ICA4MTkzLC0xfSx7IC00MDk2LC0xfSx7IDEyMjg4LC0xfSx7IC00MDk1LC0xfSx7IDEyMjg5LC0xfSx7LTEyMjg4LC0xfSwKK3sgMjA0ODAsLTF9LHstMTIyODcsLTF9LHsgMjA0ODEsLTF9LHstMjg2NzIsLTF9LHsgMzY4NjQsLTF9LHstMjg2NzEsLTF9LHsgMzY4NjUsLTF9LHsgLTQwOTcsIDB9LAoreyAtNDA5NSwtMX0seyAtNDA5NiwgMH0seyAtNDA5NCwtMX0seyAtNDA5OCwgMH0seyAtNDA5NCwtMX0seyAtNDA5NywgMH0seyAtNDA5MywtMX0seyAtNDEwMCwgMH0sCit7IC00MDkyLC0xfSx7IC00MDk5LCAwfSx7IC00MDkxLC0xfSx7IC00MTA0LCAwfSx7IC00MDg4LC0xfSx7IC00MTAzLCAwfSx7IC00MDg3LC0xfSx7IC00MTEyLCAwfSwKK3sgLTQwODAsLTF9LHsgLTQxMTEsIDB9LHsgLTQwNzksLTF9LHsgLTQxMjgsIDB9LHsgLTQwNjQsLTF9LHsgLTQxMjcsIDB9LHsgLTQwNjMsLTF9LHsgLTQxNjAsIDB9LAoreyAtNDAzMiwtMX0seyAtNDE1OSwgMH0seyAtNDAzMSwtMX0seyAtNDIyNCwgMH0seyAtMzk2OCwtMX0seyAtNDIyMywgMH0seyAtMzk2NywtMX0seyAtNDM1MiwgMH0sCit7IC0zODQwLC0xfSx7IC00MzUxLCAwfSx7IC0zODM5LC0xfSx7IC00NjA4LCAwfSx7IC0zNTg0LC0xfSx7IC00NjA3LCAwfSx7IC0zNTgzLC0xfSx7IC01MTIwLCAwfSwKK3sgLTMwNzIsLTF9LHsgLTUxMTksIDB9LHsgLTMwNzEsLTF9LHsgLTYxNDQsIDB9LHsgLTIwNDgsLTF9LHsgLTYxNDMsIDB9LHsgLTIwNDcsLTF9LHsgLTgxOTIsIDB9LAoreyAgICAgMCwgMH0seyAtODE5MSwgMH0seyAgICAgMSwgMH0sey0xMjI4OCwgMH0seyAgNDA5NiwgMH0sey0xMjI4NywgMH0seyAgNDA5NywgMH0sey0yMDQ4MCwgMH0sCit7IDEyMjg4LCAwfSx7LTIwNDc5LCAwfSx7IDEyMjg5LCAwfSx7LTM2ODY0LCAwfSx7IDI4NjcyLCAwfSx7LTM2ODYzLCAwfSx7IDI4NjczLCAwfSx7ICA0MDk0LCAwfSwKK3sgIDQwOTYsLTF9LHsgIDQwOTUsIDB9LHsgIDQwOTcsLTF9LHsgIDQwOTMsIDB9LHsgIDQwOTcsLTF9LHsgIDQwOTQsIDB9LHsgIDQwOTgsLTF9LHsgIDQwOTEsIDB9LAoreyAgNDA5OSwtMX0seyAgNDA5MiwgMH0seyAgNDEwMCwtMX0seyAgNDA4NywgMH0seyAgNDEwMywtMX0seyAgNDA4OCwgMH0seyAgNDEwNCwtMX0seyAgNDA3OSwgMH0sCit7ICA0MTExLC0xfSx7ICA0MDgwLCAwfSx7ICA0MTEyLC0xfSx7ICA0MDYzLCAwfSx7ICA0MTI3LC0xfSx7ICA0MDY0LCAwfSx7ICA0MTI4LC0xfSx7ICA0MDMxLCAwfSwKK3sgIDQxNTksLTF9LHsgIDQwMzIsIDB9LHsgIDQxNjAsLTF9LHsgIDM5NjcsIDB9LHsgIDQyMjMsLTF9LHsgIDM5NjgsIDB9LHsgIDQyMjQsLTF9LHsgIDM4MzksIDB9LAoreyAgNDM1MSwtMX0seyAgMzg0MCwgMH0seyAgNDM1MiwtMX0seyAgMzU4MywgMH0seyAgNDYwNywtMX0seyAgMzU4NCwgMH0seyAgNDYwOCwtMX0seyAgMzA3MSwgMH0sCit7ICA1MTE5LC0xfSx7ICAzMDcyLCAwfSx7ICA1MTIwLC0xfSx7ICAyMDQ3LCAwfSx7ICA2MTQzLC0xfSx7ICAyMDQ4LCAwfSx7ICA2MTQ0LC0xfSx7ICAgIC0xLC0xfSwKK3sgIDgxOTEsLTF9LHsgICAgIDAsIDB9LHsgIDgxOTIsLTF9LHsgLTQwOTcsLTF9LHsgMTIyODcsLTF9LHsgLTQwOTYsLTF9LHsgMTIyODgsLTF9LHstMTIyODksLTF9LAoreyAyMDQ3OSwtMX0sey0xMjI4OCwtMX0seyAyMDQ4MCwtMX0sey0yODY3MywtMX0seyAzNjg2MywtMX0sey0yODY3MiwtMX0seyAzNjg2NCwtMX0seyAtNDA5OCwgMH0sCit7IC00MDk2LC0xfSx7IC00MDk3LCAwfSx7IC00MDk1LC0xfSx7IC00MDk5LCAwfSx7IC00MDk1LC0xfSx7IC00MDk4LCAwfSx7IC00MDk0LC0xfSx7IC00MTAxLCAwfSwKK3sgLTQwOTMsLTF9LHsgLTQxMDAsIDB9LHsgLTQwOTIsLTF9LHsgLTQxMDUsIDB9LHsgLTQwODksLTF9LHsgLTQxMDQsIDB9LHsgLTQwODgsLTF9LHsgLTQxMTMsIDB9LAoreyAtNDA4MSwtMX0seyAtNDExMiwgMH0seyAtNDA4MCwtMX0seyAtNDEyOSwgMH0seyAtNDA2NSwtMX0seyAtNDEyOCwgMH0seyAtNDA2NCwtMX0seyAtNDE2MSwgMH0sCit7IC00MDMzLC0xfSx7IC00MTYwLCAwfSx7IC00MDMyLC0xfSx7IC00MjI1LCAwfSx7IC0zOTY5LC0xfSx7IC00MjI0LCAwfSx7IC0zOTY4LC0xfSx7IC00MzUzLCAwfSwKK3sgLTM4NDEsLTF9LHsgLTQzNTIsIDB9LHsgLTM4NDAsLTF9LHsgLTQ2MDksIDB9LHsgLTM1ODUsLTF9LHsgLTQ2MDgsIDB9LHsgLTM1ODQsLTF9LHsgLTUxMjEsIDB9LAoreyAtMzA3MywtMX0seyAtNTEyMCwgMH0seyAtMzA3MiwtMX0seyAtNjE0NSwgMH0seyAtMjA0OSwtMX0seyAtNjE0NCwgMH0seyAtMjA0OCwtMX0seyAtODE5MywgMH0sCit7ICAgIC0xLC0xfSx7IC04MTkyLCAwfSx7ICAgICAwLCAwfSx7LTEyMjg5LCAwfSx7ICA0MDk1LCAwfSx7LTEyMjg4LCAwfSx7ICA0MDk2LCAwfSx7LTIwNDgxLCAwfSwKK3sgMTIyODcsIDB9LHstMjA0ODAsIDB9LHsgMTIyODgsIDB9LHstMzY4NjUsIDB9LHsgMjg2NzEsIDB9LHstMzY4NjQsIDB9LHsgMjg2NzIsIDB9LHsgIDgxOTEsIDB9LAoreyAgODE5MywtMX0seyAgODE5MiwgMH0seyAgODE5NCwtMX0seyAgODE5MCwgMH0seyAgODE5NCwtMX0seyAgODE5MSwgMH0seyAgODE5NSwtMX0seyAgODE4OCwgMH0sCit7ICA4MTk2LC0xfSx7ICA4MTg5LCAwfSx7ICA4MTk3LC0xfSx7ICA4MTg0LCAwfSx7ICA4MjAwLC0xfSx7ICA4MTg1LCAwfSx7ICA4MjAxLC0xfSx7ICA4MTc2LCAwfSwKK3sgIDgyMDgsLTF9LHsgIDgxNzcsIDB9LHsgIDgyMDksLTF9LHsgIDgxNjAsIDB9LHsgIDgyMjQsLTF9LHsgIDgxNjEsIDB9LHsgIDgyMjUsLTF9LHsgIDgxMjgsIDB9LAoreyAgODI1NiwtMX0seyAgODEyOSwgMH0seyAgODI1NywtMX0seyAgODA2NCwgMH0seyAgODMyMCwtMX0seyAgODA2NSwgMH0seyAgODMyMSwtMX0seyAgNzkzNiwgMH0sCit7ICA4NDQ4LC0xfSx7ICA3OTM3LCAwfSx7ICA4NDQ5LC0xfSx7ICA3NjgwLCAwfSx7ICA4NzA0LC0xfSx7ICA3NjgxLCAwfSx7ICA4NzA1LC0xfSx7ICA3MTY4LCAwfSwKK3sgIDkyMTYsLTF9LHsgIDcxNjksIDB9LHsgIDkyMTcsLTF9LHsgIDYxNDQsIDB9LHsgMTAyNDAsLTF9LHsgIDYxNDUsIDB9LHsgMTAyNDEsLTF9LHsgIDQwOTYsIDB9LAoreyAxMjI4OCwtMX0seyAgNDA5NywgMH0seyAxMjI4OSwtMX0seyAgICAgMCwgMH0seyAxNjM4NCwtMX0seyAgICAgMSwgMH0seyAxNjM4NSwtMX0seyAtODE5MiwtMX0sCit7IDI0NTc2LC0xfSx7IC04MTkxLC0xfSx7IDI0NTc3LC0xfSx7LTI0NTc2LC0xfSx7IDQwOTYwLC0xfSx7LTI0NTc1LC0xfSx7IDQwOTYxLC0xfSx7IC04MTkzLCAwfSwKK3sgLTgxOTEsLTF9LHsgLTgxOTIsIDB9LHsgLTgxOTAsLTF9LHsgLTgxOTQsIDB9LHsgLTgxOTAsLTF9LHsgLTgxOTMsIDB9LHsgLTgxODksLTF9LHsgLTgxOTYsIDB9LAoreyAtODE4OCwtMX0seyAtODE5NSwgMH0seyAtODE4NywtMX0seyAtODIwMCwgMH0seyAtODE4NCwtMX0seyAtODE5OSwgMH0seyAtODE4MywtMX0seyAtODIwOCwgMH0sCit7IC04MTc2LC0xfSx7IC04MjA3LCAwfSx7IC04MTc1LC0xfSx7IC04MjI0LCAwfSx7IC04MTYwLC0xfSx7IC04MjIzLCAwfSx7IC04MTU5LC0xfSx7IC04MjU2LCAwfSwKK3sgLTgxMjgsLTF9LHsgLTgyNTUsIDB9LHsgLTgxMjcsLTF9LHsgLTgzMjAsIDB9LHsgLTgwNjQsLTF9LHsgLTgzMTksIDB9LHsgLTgwNjMsLTF9LHsgLTg0NDgsIDB9LAoreyAtNzkzNiwtMX0seyAtODQ0NywgMH0seyAtNzkzNSwtMX0seyAtODcwNCwgMH0seyAtNzY4MCwtMX0seyAtODcwMywgMH0seyAtNzY3OSwtMX0seyAtOTIxNiwgMH0sCit7IC03MTY4LC0xfSx7IC05MjE1LCAwfSx7IC03MTY3LC0xfSx7LTEwMjQwLCAwfSx7IC02MTQ0LC0xfSx7LTEwMjM5LCAwfSx7IC02MTQzLC0xfSx7LTEyMjg4LCAwfSwKK3sgLTQwOTYsLTF9LHstMTIyODcsIDB9LHsgLTQwOTUsLTF9LHstMTYzODQsIDB9LHsgICAgIDAsIDB9LHstMTYzODMsIDB9LHsgICAgIDEsIDB9LHstMjQ1NzYsIDB9LAoreyAgODE5MiwgMH0sey0yNDU3NSwgMH0seyAgODE5MywgMH0sey00MDk2MCwgMH0seyAyNDU3NiwgMH0sey00MDk1OSwgMH0seyAyNDU3NywgMH0seyAgODE5MCwgMH0sCit7ICA4MTkyLC0xfSx7ICA4MTkxLCAwfSx7ICA4MTkzLC0xfSx7ICA4MTg5LCAwfSx7ICA4MTkzLC0xfSx7ICA4MTkwLCAwfSx7ICA4MTk0LC0xfSx7ICA4MTg3LCAwfSwKK3sgIDgxOTUsLTF9LHsgIDgxODgsIDB9LHsgIDgxOTYsLTF9LHsgIDgxODMsIDB9LHsgIDgxOTksLTF9LHsgIDgxODQsIDB9LHsgIDgyMDAsLTF9LHsgIDgxNzUsIDB9LAoreyAgODIwNywtMX0seyAgODE3NiwgMH0seyAgODIwOCwtMX0seyAgODE1OSwgMH0seyAgODIyMywtMX0seyAgODE2MCwgMH0seyAgODIyNCwtMX0seyAgODEyNywgMH0sCit7ICA4MjU1LC0xfSx7ICA4MTI4LCAwfSx7ICA4MjU2LC0xfSx7ICA4MDYzLCAwfSx7ICA4MzE5LC0xfSx7ICA4MDY0LCAwfSx7ICA4MzIwLC0xfSx7ICA3OTM1LCAwfSwKK3sgIDg0NDcsLTF9LHsgIDc5MzYsIDB9LHsgIDg0NDgsLTF9LHsgIDc2NzksIDB9LHsgIDg3MDMsLTF9LHsgIDc2ODAsIDB9LHsgIDg3MDQsLTF9LHsgIDcxNjcsIDB9LAoreyAgOTIxNSwtMX0seyAgNzE2OCwgMH0seyAgOTIxNiwtMX0seyAgNjE0MywgMH0seyAxMDIzOSwtMX0seyAgNjE0NCwgMH0seyAxMDI0MCwtMX0seyAgNDA5NSwgMH0sCit7IDEyMjg3LC0xfSx7ICA0MDk2LCAwfSx7IDEyMjg4LC0xfSx7ICAgIC0xLC0xfSx7IDE2MzgzLC0xfSx7ICAgICAwLCAwfSx7IDE2Mzg0LC0xfSx7IC04MTkzLC0xfSwKK3sgMjQ1NzUsLTF9LHsgLTgxOTIsLTF9LHsgMjQ1NzYsLTF9LHstMjQ1NzcsLTF9LHsgNDA5NTksLTF9LHstMjQ1NzYsLTF9LHsgNDA5NjAsLTF9LHsgLTgxOTQsIDB9LAoreyAtODE5MiwtMX0seyAtODE5MywgMH0seyAtODE5MSwtMX0seyAtODE5NSwgMH0seyAtODE5MSwtMX0seyAtODE5NCwgMH0seyAtODE5MCwtMX0seyAtODE5NywgMH0sCit7IC04MTg5LC0xfSx7IC04MTk2LCAwfSx7IC04MTg4LC0xfSx7IC04MjAxLCAwfSx7IC04MTg1LC0xfSx7IC04MjAwLCAwfSx7IC04MTg0LC0xfSx7IC04MjA5LCAwfSwKK3sgLTgxNzcsLTF9LHsgLTgyMDgsIDB9LHsgLTgxNzYsLTF9LHsgLTgyMjUsIDB9LHsgLTgxNjEsLTF9LHsgLTgyMjQsIDB9LHsgLTgxNjAsLTF9LHsgLTgyNTcsIDB9LAoreyAtODEyOSwtMX0seyAtODI1NiwgMH0seyAtODEyOCwtMX0seyAtODMyMSwgMH0seyAtODA2NSwtMX0seyAtODMyMCwgMH0seyAtODA2NCwtMX0seyAtODQ0OSwgMH0sCit7IC03OTM3LC0xfSx7IC04NDQ4LCAwfSx7IC03OTM2LC0xfSx7IC04NzA1LCAwfSx7IC03NjgxLC0xfSx7IC04NzA0LCAwfSx7IC03NjgwLC0xfSx7IC05MjE3LCAwfSwKK3sgLTcxNjksLTF9LHsgLTkyMTYsIDB9LHsgLTcxNjgsLTF9LHstMTAyNDEsIDB9LHsgLTYxNDUsLTF9LHstMTAyNDAsIDB9LHsgLTYxNDQsLTF9LHstMTIyODksIDB9LAoreyAtNDA5NywtMX0sey0xMjI4OCwgMH0seyAtNDA5NiwtMX0sey0xNjM4NSwgMH0seyAgICAtMSwtMX0sey0xNjM4NCwgMH0seyAgICAgMCwgMH0sey0yNDU3NywgMH0sCit7ICA4MTkxLCAwfSx7LTI0NTc2LCAwfSx7ICA4MTkyLCAwfSx7LTQwOTYxLCAwfSx7IDI0NTc1LCAwfSx7LTQwOTYwLCAwfSx7IDI0NTc2LCAwfSx7IDE2MzgzLCAwfSwKK3sgMTYzODUsLTF9LHsgMTYzODQsIDB9LHsgMTYzODYsLTF9LHsgMTYzODIsIDB9LHsgMTYzODYsLTF9LHsgMTYzODMsIDB9LHsgMTYzODcsLTF9LHsgMTYzODAsIDB9LAoreyAxNjM4OCwtMX0seyAxNjM4MSwgMH0seyAxNjM4OSwtMX0seyAxNjM3NiwgMH0seyAxNjM5MiwtMX0seyAxNjM3NywgMH0seyAxNjM5MywtMX0seyAxNjM2OCwgMH0sCit7IDE2NDAwLC0xfSx7IDE2MzY5LCAwfSx7IDE2NDAxLC0xfSx7IDE2MzUyLCAwfSx7IDE2NDE2LC0xfSx7IDE2MzUzLCAwfSx7IDE2NDE3LC0xfSx7IDE2MzIwLCAwfSwKK3sgMTY0NDgsLTF9LHsgMTYzMjEsIDB9LHsgMTY0NDksLTF9LHsgMTYyNTYsIDB9LHsgMTY1MTIsLTF9LHsgMTYyNTcsIDB9LHsgMTY1MTMsLTF9LHsgMTYxMjgsIDB9LAoreyAxNjY0MCwtMX0seyAxNjEyOSwgMH0seyAxNjY0MSwtMX0seyAxNTg3MiwgMH0seyAxNjg5NiwtMX0seyAxNTg3MywgMH0seyAxNjg5NywtMX0seyAxNTM2MCwgMH0sCit7IDE3NDA4LC0xfSx7IDE1MzYxLCAwfSx7IDE3NDA5LC0xfSx7IDE0MzM2LCAwfSx7IDE4NDMyLC0xfSx7IDE0MzM3LCAwfSx7IDE4NDMzLC0xfSx7IDEyMjg4LCAwfSwKK3sgMjA0ODAsLTF9LHsgMTIyODksIDB9LHsgMjA0ODEsLTF9LHsgIDgxOTIsIDB9LHsgMjQ1NzYsLTF9LHsgIDgxOTMsIDB9LHsgMjQ1NzcsLTF9LHsgICAgIDAsIDB9LAoreyAzMjc2OCwtMX0seyAgICAgMSwgMH0seyAzMjc2OSwtMX0sey0xNjM4NCwtMX0seyA0OTE1MiwtMX0sey0xNjM4MywtMX0seyA0OTE1MywtMX0sey0xNjM4NSwgMH0sCit7LTE2MzgzLC0xfSx7LTE2Mzg0LCAwfSx7LTE2MzgyLC0xfSx7LTE2Mzg2LCAwfSx7LTE2MzgyLC0xfSx7LTE2Mzg1LCAwfSx7LTE2MzgxLC0xfSx7LTE2Mzg4LCAwfSwKK3stMTYzODAsLTF9LHstMTYzODcsIDB9LHstMTYzNzksLTF9LHstMTYzOTIsIDB9LHstMTYzNzYsLTF9LHstMTYzOTEsIDB9LHstMTYzNzUsLTF9LHstMTY0MDAsIDB9LAorey0xNjM2OCwtMX0sey0xNjM5OSwgMH0sey0xNjM2NywtMX0sey0xNjQxNiwgMH0sey0xNjM1MiwtMX0sey0xNjQxNSwgMH0sey0xNjM1MSwtMX0sey0xNjQ0OCwgMH0sCit7LTE2MzIwLC0xfSx7LTE2NDQ3LCAwfSx7LTE2MzE5LC0xfSx7LTE2NTEyLCAwfSx7LTE2MjU2LC0xfSx7LTE2NTExLCAwfSx7LTE2MjU1LC0xfSx7LTE2NjQwLCAwfSwKK3stMTYxMjgsLTF9LHstMTY2MzksIDB9LHstMTYxMjcsLTF9LHstMTY4OTYsIDB9LHstMTU4NzIsLTF9LHstMTY4OTUsIDB9LHstMTU4NzEsLTF9LHstMTc0MDgsIDB9LAorey0xNTM2MCwtMX0sey0xNzQwNywgMH0sey0xNTM1OSwtMX0sey0xODQzMiwgMH0sey0xNDMzNiwtMX0sey0xODQzMSwgMH0sey0xNDMzNSwtMX0sey0yMDQ4MCwgMH0sCit7LTEyMjg4LC0xfSx7LTIwNDc5LCAwfSx7LTEyMjg3LC0xfSx7LTI0NTc2LCAwfSx7IC04MTkyLC0xfSx7LTI0NTc1LCAwfSx7IC04MTkxLC0xfSx7LTMyNzY4LCAwfSwKK3sgICAgIDAsIDB9LHstMzI3NjcsIDB9LHsgICAgIDEsIDB9LHstNDkxNTIsIDB9LHsgMTYzODQsIDB9LHstNDkxNTEsIDB9LHsgMTYzODUsIDB9LHsgMTYzODIsIDB9LAoreyAxNjM4NCwtMX0seyAxNjM4MywgMH0seyAxNjM4NSwtMX0seyAxNjM4MSwgMH0seyAxNjM4NSwtMX0seyAxNjM4MiwgMH0seyAxNjM4NiwtMX0seyAxNjM3OSwgMH0sCit7IDE2Mzg3LC0xfSx7IDE2MzgwLCAwfSx7IDE2Mzg4LC0xfSx7IDE2Mzc1LCAwfSx7IDE2MzkxLC0xfSx7IDE2Mzc2LCAwfSx7IDE2MzkyLC0xfSx7IDE2MzY3LCAwfSwKK3sgMTYzOTksLTF9LHsgMTYzNjgsIDB9LHsgMTY0MDAsLTF9LHsgMTYzNTEsIDB9LHsgMTY0MTUsLTF9LHsgMTYzNTIsIDB9LHsgMTY0MTYsLTF9LHsgMTYzMTksIDB9LAoreyAxNjQ0NywtMX0seyAxNjMyMCwgMH0seyAxNjQ0OCwtMX0seyAxNjI1NSwgMH0seyAxNjUxMSwtMX0seyAxNjI1NiwgMH0seyAxNjUxMiwtMX0seyAxNjEyNywgMH0sCit7IDE2NjM5LC0xfSx7IDE2MTI4LCAwfSx7IDE2NjQwLC0xfSx7IDE1ODcxLCAwfSx7IDE2ODk1LC0xfSx7IDE1ODcyLCAwfSx7IDE2ODk2LC0xfSx7IDE1MzU5LCAwfSwKK3sgMTc0MDcsLTF9LHsgMTUzNjAsIDB9LHsgMTc0MDgsLTF9LHsgMTQzMzUsIDB9LHsgMTg0MzEsLTF9LHsgMTQzMzYsIDB9LHsgMTg0MzIsLTF9LHsgMTIyODcsIDB9LAoreyAyMDQ3OSwtMX0seyAxMjI4OCwgMH0seyAyMDQ4MCwtMX0seyAgODE5MSwgMH0seyAyNDU3NSwtMX0seyAgODE5MiwgMH0seyAyNDU3NiwtMX0seyAgICAtMSwtMX0sCit7IDMyNzY3LC0xfSx7ICAgICAwLCAwfSx7IDMyNzY4LC0xfSx7LTE2Mzg1LC0xfSx7IDQ5MTUxLC0xfSx7LTE2Mzg0LC0xfSx7IDQ5MTUyLC0xfSx7LTE2Mzg2LCAwfSwKK3stMTYzODQsLTF9LHstMTYzODUsIDB9LHstMTYzODMsLTF9LHstMTYzODcsIDB9LHstMTYzODMsLTF9LHstMTYzODYsIDB9LHstMTYzODIsLTF9LHstMTYzODksIDB9LAorey0xNjM4MSwtMX0sey0xNjM4OCwgMH0sey0xNjM4MCwtMX0sey0xNjM5MywgMH0sey0xNjM3NywtMX0sey0xNjM5MiwgMH0sey0xNjM3NiwtMX0sey0xNjQwMSwgMH0sCit7LTE2MzY5LC0xfSx7LTE2NDAwLCAwfSx7LTE2MzY4LC0xfSx7LTE2NDE3LCAwfSx7LTE2MzUzLC0xfSx7LTE2NDE2LCAwfSx7LTE2MzUyLC0xfSx7LTE2NDQ5LCAwfSwKK3stMTYzMjEsLTF9LHstMTY0NDgsIDB9LHstMTYzMjAsLTF9LHstMTY1MTMsIDB9LHstMTYyNTcsLTF9LHstMTY1MTIsIDB9LHstMTYyNTYsLTF9LHstMTY2NDEsIDB9LAorey0xNjEyOSwtMX0sey0xNjY0MCwgMH0sey0xNjEyOCwtMX0sey0xNjg5NywgMH0sey0xNTg3MywtMX0sey0xNjg5NiwgMH0sey0xNTg3MiwtMX0sey0xNzQwOSwgMH0sCit7LTE1MzYxLC0xfSx7LTE3NDA4LCAwfSx7LTE1MzYwLC0xfSx7LTE4NDMzLCAwfSx7LTE0MzM3LC0xfSx7LTE4NDMyLCAwfSx7LTE0MzM2LC0xfSx7LTIwNDgxLCAwfSwKK3stMTIyODksLTF9LHstMjA0ODAsIDB9LHstMTIyODgsLTF9LHstMjQ1NzcsIDB9LHsgLTgxOTMsLTF9LHstMjQ1NzYsIDB9LHsgLTgxOTIsLTF9LHstMzI3NjksIDB9LAoreyAgICAtMSwtMX0sey0zMjc2OCwgMH0seyAgICAgMCwgMH0sey00OTE1MywgMH0seyAxNjM4MywgMH0sey00OTE1MiwgMH0seyAxNjM4NCwgMH0seyAzMjc2NywgMH0sCit7IDMyNzY5LC0xfSx7IDMyNzY4LCAwfSx7IDMyNzcwLC0xfSx7IDMyNzY2LCAwfSx7IDMyNzcwLC0xfSx7IDMyNzY3LCAwfSx7IDMyNzcxLC0xfSx7IDMyNzY0LCAwfSwKK3sgMzI3NzIsLTF9LHsgMzI3NjUsIDB9LHsgMzI3NzMsLTF9LHsgMzI3NjAsIDB9LHsgMzI3NzYsLTF9LHsgMzI3NjEsIDB9LHsgMzI3NzcsLTF9LHsgMzI3NTIsIDB9LAoreyAzMjc4NCwtMX0seyAzMjc1MywgMH0seyAzMjc4NSwtMX0seyAzMjczNiwgMH0seyAzMjgwMCwtMX0seyAzMjczNywgMH0seyAzMjgwMSwtMX0seyAzMjcwNCwgMH0sCit7IDMyODMyLC0xfSx7IDMyNzA1LCAwfSx7IDMyODMzLC0xfSx7IDMyNjQwLCAwfSx7IDMyODk2LC0xfSx7IDMyNjQxLCAwfSx7IDMyODk3LC0xfSx7IDMyNTEyLCAwfSwKK3sgMzMwMjQsLTF9LHsgMzI1MTMsIDB9LHsgMzMwMjUsLTF9LHsgMzIyNTYsIDB9LHsgMzMyODAsLTF9LHsgMzIyNTcsIDB9LHsgMzMyODEsLTF9LHsgMzE3NDQsIDB9LAoreyAzMzc5MiwtMX0seyAzMTc0NSwgMH0seyAzMzc5MywtMX0seyAzMDcyMCwgMH0seyAzNDgxNiwtMX0seyAzMDcyMSwgMH0seyAzNDgxNywtMX0seyAyODY3MiwgMH0sCit7IDM2ODY0LC0xfSx7IDI4NjczLCAwfSx7IDM2ODY1LC0xfSx7IDI0NTc2LCAwfSx7IDQwOTYwLC0xfSx7IDI0NTc3LCAwfSx7IDQwOTYxLC0xfSx7IDE2Mzg0LCAwfSwKK3sgNDkxNTIsLTF9LHsgMTYzODUsIDB9LHsgNDkxNTMsLTF9LHsgICAgIDAsIDB9LHsgNjU1MzYsLTF9LHsgICAgIDEsIDB9LHsgNjU1MzcsLTF9LHstMzI3NjksIDB9LAorey0zMjc2NywtMX0sey0zMjc2OCwgMH0sey0zMjc2NiwtMX0sey0zMjc3MCwgMH0sey0zMjc2NiwtMX0sey0zMjc2OSwgMH0sey0zMjc2NSwtMX0sey0zMjc3MiwgMH0sCit7LTMyNzY0LC0xfSx7LTMyNzcxLCAwfSx7LTMyNzYzLC0xfSx7LTMyNzc2LCAwfSx7LTMyNzYwLC0xfSx7LTMyNzc1LCAwfSx7LTMyNzU5LC0xfSx7LTMyNzg0LCAwfSwKK3stMzI3NTIsLTF9LHstMzI3ODMsIDB9LHstMzI3NTEsLTF9LHstMzI4MDAsIDB9LHstMzI3MzYsLTF9LHstMzI3OTksIDB9LHstMzI3MzUsLTF9LHstMzI4MzIsIDB9LAorey0zMjcwNCwtMX0sey0zMjgzMSwgMH0sey0zMjcwMywtMX0sey0zMjg5NiwgMH0sey0zMjY0MCwtMX0sey0zMjg5NSwgMH0sey0zMjYzOSwtMX0sey0zMzAyNCwgMH0sCit7LTMyNTEyLC0xfSx7LTMzMDIzLCAwfSx7LTMyNTExLC0xfSx7LTMzMjgwLCAwfSx7LTMyMjU2LC0xfSx7LTMzMjc5LCAwfSx7LTMyMjU1LC0xfSx7LTMzNzkyLCAwfSwKK3stMzE3NDQsLTF9LHstMzM3OTEsIDB9LHstMzE3NDMsLTF9LHstMzQ4MTYsIDB9LHstMzA3MjAsLTF9LHstMzQ4MTUsIDB9LHstMzA3MTksLTF9LHstMzY4NjQsIDB9LAorey0yODY3MiwtMX0sey0zNjg2MywgMH0sey0yODY3MSwtMX0sey00MDk2MCwgMH0sey0yNDU3NiwtMX0sey00MDk1OSwgMH0sey0yNDU3NSwtMX0sey00OTE1MiwgMH0sCit7LTE2Mzg0LC0xfSx7LTQ5MTUxLCAwfSx7LTE2MzgzLC0xfSx7LTY1NTM2LCAwfSx7ICAgICAwLCAwfSx7LTY1NTM1LCAwfSx7ICAgICAxLCAwfSx7IDMyNzY2LCAwfSwKK3sgMzI3NjgsLTF9LHsgMzI3NjcsIDB9LHsgMzI3NjksLTF9LHsgMzI3NjUsIDB9LHsgMzI3NjksLTF9LHsgMzI3NjYsIDB9LHsgMzI3NzAsLTF9LHsgMzI3NjMsIDB9LAoreyAzMjc3MSwtMX0seyAzMjc2NCwgMH0seyAzMjc3MiwtMX0seyAzMjc1OSwgMH0seyAzMjc3NSwtMX0seyAzMjc2MCwgMH0seyAzMjc3NiwtMX0seyAzMjc1MSwgMH0sCit7IDMyNzgzLC0xfSx7IDMyNzUyLCAwfSx7IDMyNzg0LC0xfSx7IDMyNzM1LCAwfSx7IDMyNzk5LC0xfSx7IDMyNzM2LCAwfSx7IDMyODAwLC0xfSx7IDMyNzAzLCAwfSwKK3sgMzI4MzEsLTF9LHsgMzI3MDQsIDB9LHsgMzI4MzIsLTF9LHsgMzI2MzksIDB9LHsgMzI4OTUsLTF9LHsgMzI2NDAsIDB9LHsgMzI4OTYsLTF9LHsgMzI1MTEsIDB9LAoreyAzMzAyMywtMX0seyAzMjUxMiwgMH0seyAzMzAyNCwtMX0seyAzMjI1NSwgMH0seyAzMzI3OSwtMX0seyAzMjI1NiwgMH0seyAzMzI4MCwtMX0seyAzMTc0MywgMH0sCit7IDMzNzkxLC0xfSx7IDMxNzQ0LCAwfSx7IDMzNzkyLC0xfSx7IDMwNzE5LCAwfSx7IDM0ODE1LC0xfSx7IDMwNzIwLCAwfSx7IDM0ODE2LC0xfSx7IDI4NjcxLCAwfSwKK3sgMzY4NjMsLTF9LHsgMjg2NzIsIDB9LHsgMzY4NjQsLTF9LHsgMjQ1NzUsIDB9LHsgNDA5NTksLTF9LHsgMjQ1NzYsIDB9LHsgNDA5NjAsLTF9LHsgMTYzODMsIDB9LAoreyA0OTE1MSwtMX0seyAxNjM4NCwgMH0seyA0OTE1MiwtMX0seyAgICAtMSwtMX0seyA2NTUzNSwtMX0seyAgICAgMCwgMH0seyA2NTUzNiwtMX0sey0zMjc3MCwgMH0sCit7LTMyNzY4LC0xfSx7LTMyNzY5LCAwfSx7LTMyNzY3LC0xfSx7LTMyNzcxLCAwfSx7LTMyNzY3LC0xfSx7LTMyNzcwLCAwfSx7LTMyNzY2LC0xfSx7LTMyNzczLCAwfSwKK3stMzI3NjUsLTF9LHstMzI3NzIsIDB9LHstMzI3NjQsLTF9LHstMzI3NzcsIDB9LHstMzI3NjEsLTF9LHstMzI3NzYsIDB9LHstMzI3NjAsLTF9LHstMzI3ODUsIDB9LAorey0zMjc1MywtMX0sey0zMjc4NCwgMH0sey0zMjc1MiwtMX0sey0zMjgwMSwgMH0sey0zMjczNywtMX0sey0zMjgwMCwgMH0sey0zMjczNiwtMX0sey0zMjgzMywgMH0sCit7LTMyNzA1LC0xfSx7LTMyODMyLCAwfSx7LTMyNzA0LC0xfSx7LTMyODk3LCAwfSx7LTMyNjQxLC0xfSx7LTMyODk2LCAwfSx7LTMyNjQwLC0xfSx7LTMzMDI1LCAwfSwKK3stMzI1MTMsLTF9LHstMzMwMjQsIDB9LHstMzI1MTIsLTF9LHstMzMyODEsIDB9LHstMzIyNTcsLTF9LHstMzMyODAsIDB9LHstMzIyNTYsLTF9LHstMzM3OTMsIDB9LAorey0zMTc0NSwtMX0sey0zMzc5MiwgMH0sey0zMTc0NCwtMX0sey0zNDgxNywgMH0sey0zMDcyMSwtMX0sey0zNDgxNiwgMH0sey0zMDcyMCwtMX0sey0zNjg2NSwgMH0sCit7LTI4NjczLC0xfSx7LTM2ODY0LCAwfSx7LTI4NjcyLC0xfSx7LTQwOTYxLCAwfSx7LTI0NTc3LC0xfSx7LTQwOTYwLCAwfSx7LTI0NTc2LC0xfSx7LTQ5MTUzLCAwfSwKK3stMTYzODUsLTF9LHstNDkxNTIsIDB9LHstMTYzODQsLTF9LHstNjU1MzcsIDB9LHsgICAgLTEsLTF9LHstNjU1MzYsIDB9LHsgICAgIDAsIDB9LH07CitpbnQgbWFpbiAoKQoreworICBtcF9saW1iX3QgcjEsIHIwOworICBpbnQgZXJyID0gMDsKKyAgc2l6ZV90IGluZCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQorICAgIHsKKyAgICAgIGludCBpaSA9IGkgLyA2NCwgamogPSBpICUgNjQ7CisgICAgICBmdW5jc1tpXSgmcjEsICZyMCk7CisgICAgICBpZiAocjAgIT0gKG1wX2xpbWJfc2lnbmVkX3QpIHJlZltpbmRdWzBdIHx8IHIxICE9IChtcF9saW1iX3NpZ25lZF90KSByZWZbaW5kXVsxXSkgeworICAgICAgICAgcHJpbnRmICgiZXJyb3IgZm9yIGYlenUoJWQsJWQpOiB3YW50ICglZCwlZCkgZ290ICglZCwlZClcbiIsIGksIChpbnQpIG9wc1tpaV0sIChpbnQpIG9wc1tqal0sIHJlZltpbmRdWzFdLCByZWZbaW5kXVswXSwgKGludCkgcjEsIChpbnQpIHIwKTsKKyAgICAgICAgIGVycisrOworICAgICAgIH0KKyAgICAgIGluZCsrOworICAgIH0KKyAgcmV0dXJuIGVyciAhPSAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGV2ZWwvdHJ5LmMgYi90ZXN0cy9kZXZlbC90cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGY0YTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGV2ZWwvdHJ5LmMKQEAgLTAsMCArMSwzNjU4IEBACisvKiBSdW4gc29tZSB0ZXN0cyBvbiB2YXJpb3VzIG1wbiByb3V0aW5lcy4KKworICAgVEhJUyBJUyBBIFRFU1QgUFJPR1JBTSBVU0VEIE9OTFkgRk9SIERFVkVMT1BNRU5ULiAgSVQnUyBBTE1PU1QgQ0VSVEFJTiBUTworICAgQkUgU1VCSkVDVCBUTyBJTkNPTVBBVElCTEUgQ0hBTkdFUyBJTiBGVVRVUkUgVkVSU0lPTlMgT0YgR01QLgorCitDb3B5cmlnaHQgMjAwMC0yMDA2LCAyMDA4LCAyMDA5LCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIFVzYWdlOiB0cnkgW29wdGlvbnNdIDxmdW5jdGlvbj4uLi4KKworICAgRm9yIGV4YW1wbGUsICIuL3RyeSBtcG5fYWRkX24iIHRvIHJ1biB0ZXN0cyBvZiB0aGF0IGZ1bmN0aW9uLgorCisgICBDb21iaW5hdGlvbnMgb2YgYWxpZ25tZW50cyBhbmQgb3ZlcmxhcHMgYXJlIHRlc3RlZCwgd2l0aCByZWR6b25lcyBhYm92ZQorICAgb3IgYmVsb3cgdGhlIGRlc3RpbmF0aW9ucywgYW5kIHdpdGggdGhlIHNvdXJjZXMgd3JpdGUtcHJvdGVjdGVkLgorCisgICBUaGUgbnVtYmVyIG9mIHRlc3RzIHBlcmZvcm1lZCBiZWNvbWVzIHJpZGljdWxvdXNseSBsYXJnZSB3aXRoIGFsbCB0aGUKKyAgIGNvbWJpbmF0aW9ucywgYW5kIGZvciB0aGF0IHJlYXNvbiB0aGlzIGNhbid0IGJlIGEgcGFydCBvZiBhICJtYWtlIGNoZWNrIiwKKyAgIGl0J3MgbWVhbnQgb25seSBmb3IgZGV2ZWxvcG1lbnQuICBUaGUgY29kZSBpc24ndCB2ZXJ5IHByZXR0eSBlaXRoZXIuCisKKyAgIER1cmluZyBkZXZlbG9wbWVudCBpdCBjYW4gaGVscCB0byBkaXNhYmxlIHRoZSByZWR6b25lcywgc2luY2Ugc2VlaW5nIHRoZQorICAgcmVzdCBvZiB0aGUgZGVzdGluYXRpb24gd3JpdHRlbiBjYW4gc2hvdyB3aGVyZSB0aGUgd3JvbmcgcGFydCBpcywgb3IgaWYKKyAgIHRoZSBkc3QgcG9pbnRlcnMgYXJlIG9mZiBieSAxIG9yIHdoYXRldmVyLiAgVGhlIG1hZ2ljIERFQURWQUwgaW5pdGlhbAorICAgZmlsbCAoc2VlIGJlbG93KSB3aWxsIHNob3cgbG9jYXRpb25zIG5ldmVyIHdyaXR0ZW4uCisKKyAgIFRoZSAtcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gdGVzdCBvbmx5IGNlcnRhaW4gc2l6ZSBvcGVyYW5kcywgd2hpY2ggaXMKKyAgIHVzZWZ1bCBpZiBzb21lIG5ldyBjb2RlIGRvZXNuJ3QgeWV0IHN1cHBvcnQgc2F5IHNpemVzIGxlc3MgdGhhbiB0aGUKKyAgIHVucm9sbGluZywgb3Igd2hhdGV2ZXIuCisKKyAgIFdoZW4gYSBwcm9ibGVtIG9jY3VycyBpdCdsbCBvZiBjb3Vyc2UgYmUgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgcHJvZ3JhbQorICAgdW5kZXIgZ2RiIHRvIGZpbmQgb3V0IHF1aXRlIHdoZXJlLCBob3cgYW5kIHdoeSBpdCdzIGdvaW5nIHdyb25nLiAgRGlzYWJsZQorICAgdGhlIHNwaW5uZXIgd2l0aCB0aGUgLVcgb3B0aW9uIHdoZW4gZG9pbmcgdGhpcywgb3Igc2luZ2xlIHN0ZXBwaW5nIHdvbid0CisgICB3b3JrLiAgVXNpbmcgdGhlICItMSIgb3B0aW9uIHRvIHJ1biB3aXRoIHNpbXBsZSBkYXRhIGNhbiBiZSB1c2VmdWwuCisKKyAgIE5ldyBmdW5jdGlvbnMgdG8gdGVzdCBjYW4gYmUgYWRkZWQgaW4gdHJ5X2FycmF5W10uICBJZiBhIG5ldyBUWVBFIGlzCisgICByZXF1aXJlZCB0aGVuIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgY29uc3RhbnRzLCBzZXQgdXAgaXRzIHBhcmFtZXRlcnMgaW4KKyAgIHBhcmFtX2luaXQoKSwgYW5kIGFkZCBpdCB0byB0aGUgY2FsbCgpIGZ1bmN0aW9uLiAgRXh0cmEgcGFyYW1ldGVyIGZpZWxkcworICAgY2FuIGJlIGFkZGVkIGlmIG5lY2Vzc2FyeSwgb3IgZnVydGhlciBpbnRlcnByZXRhdGlvbnMgZ2l2ZW4gdG8gZXhpc3RpbmcKKyAgIGZpZWxkcy4KKworCisgICBQb3J0YWJpbGl0eToKKworICAgVGhpcyBwcm9ncmFtIGlzIG5vdCBkZXNpZ25lZCBmb3IgdXNlIG9uIENyYXkgdmVjdG9yIHN5c3RlbXMgdW5kZXIgVW5pY29zLAorICAgaXQgd2lsbCBmYWlsIHRvIGNvbXBpbGUgZHVlIHRvIG1pc3NpbmcgX1NDX1BBR0VfU0laRS4gIFRob3NlIHN5c3RlbXMKKyAgIGRvbid0IHJlYWxseSBoYXZlIHBhZ2VzIG9yIG1wcm90ZWN0LiAgV2UgY291bGQgYXJyYW5nZSB0byBydW4gdGhlIHRlc3RzCisgICB3aXRob3V0IHRoZSByZWR6b25lcywgYnV0IHdlIGhhdmVuJ3QgYm90aGVyZWQgY3VycmVudGx5LgorCisKKyAgIEVuaGFuY2VtZW50czoKKworICAgdW11bF9wcG1tIHN1cHBvcnQgaXMgbm90IHZlcnkgZ29vZCwgbG90cyBvZiBzb3VyY2UgZGF0YSBpcyBnZW5lcmF0ZWQKKyAgIHdoZXJlYXMgb25seSB0d28gbGltYnMgYXJlIG5lZWRlZC4KKworICAgTWFrZSBhIGxpdHRsZSBzY2hlbWUgZm9yIGludGVycHJldGluZyB0aGUgIlNJWkUiIHNlbGVjdGlvbnMgdW5pZm9ybWx5LgorCisgICBNYWtlIHRyLT5zaXplPT1TSVpFXzIgd29yaywgZm9yIHRoZSBiZW5lZml0IG9mIGZpbmRfYSB3aGljaCB3YW50cyBqdXN0IDIKKyAgIHNvdXJjZSBsaW1icy4gIFBvc3NpYmx5IGluY3JlYXNlIHRoZSBkZWZhdWx0IHJlcGV0aXRpb25zIGluIHRoYXQgY2FzZS4KKworICAgQXV0b21hdGljYWxseSBkZXRlY3QgZ2RiIGFuZCBkaXNhYmxlIHRoZSBzcGlubmVyICh1c2UgLVcgZm9yIG5vdykuCisKKyAgIE1ha2UgYSB3YXkgdG8gcmUtcnVuIGEgZmFpbGluZyBjYXNlIGluIHRoZSBkZWJ1Z2dlci4gIEhhdmUgYW4gb3B0aW9uIHRvCisgICBzbmFwc2hvdCBlYWNoIHRlc3QgY2FzZSBiZWZvcmUgaXQncyBydW4gc28gdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGlmIGEKKyAgIHNlZ3Ygb2NjdXJzLiAgKFRoaXMgc2hvdWxkIGJlIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgY3VycmVudCBwcmludF9hbGwoKQorICAgaW4gdGhlIHNpZ25hbCBoYW5kbGVyLikKKworICAgV2hlbiBhbGlnbm1lbnQgbWVhbnMgYSBkc3QgaXNuJ3QgaGFyZCBhZ2FpbnN0IHRoZSByZWR6b25lLCBjaGVjayB0aGUKKyAgIHNwYWNlIGluIGJldHdlZW4gcmVtYWlucyB1bmNoYW5nZWQuCisKKyAgIFdoZW4gYSBzb3VyY2Ugb3ZlcmxhcHMgYSBkZXN0aW5hdGlvbiwgZG9uJ3QgcnVuIGJvdGggc1tpXS5oaWdoIDAgYW5kIDEsCisgICBhcyBzW2ldLmhpZ2ggaGFzIG5vIGVmZmVjdC4gIE1heWJlIGVuY29kZSBzW2ldLmhpZ2ggaW50byBvdmVybGFwLT5zW2ldLgorCisgICBXaGVuIHBhcnRpYWwgb3ZlcmxhcHMgYXJlbid0IGRvbmUsIGRvbid0IGxvb3Agb3ZlciBzb3VyY2UgYWxpZ25tZW50cworICAgZHVyaW5nIG92ZXJsYXBzLgorCisgICBUcnkgdG8gbWFrZSB0aGUgbG9vcGluZyBjb2RlIGEgYml0IGxlc3MgaG9ycmlibGUuICBSaWdodCBub3cgaXQncyBwcmV0dHkKKyAgIGhhcmQgdG8gc2VlIHdoYXQgaXRlcmF0aW9ucyBhcmUgYWN0dWFsbHkgZG9uZS4KKworICAgUGVyaGFwcyBzcGVjaWZpYyBzZXR1cHMgYW5kIGxvb3BzIGZvciBlYWNoIHN0eWxlIG9mIGZ1bmN0aW9uIHVuZGVyIHRlc3QKKyAgIHdvdWxkIGJlIGNsZWFyZXIgdGhhbiBhIHBhcmFtZXRlcml6ZWQgZ2VuZXJhbCBsb29wLiAgVGhlcmUncyBsb3RzIG9mCisgICBzdHVmZiBjb21tb24gdG8gYWxsIGZ1bmN0aW9ucywgYnV0IHRoZSBleGNlcHRpb25zIGdldCBtZXNzeS4KKworICAgV2hlbiB0aGVyZSdzIG5vIG92ZXJsYXAsIHJ1biB3aXRoIGJvdGggc3JjPmRzdCBhbmQgc3JjPGRzdC4gIEEgc3VidGxlCisgICBjYWxsaW5nLWNvbnZlbnRpb25zIHZpb2xhdGlvbiBvY2N1cnJlZCBpbiBhIFA2IGNvcHkgd2hpY2ggZGVwZW5kZWQgb24gdGhlCisgICByZWxhdGl2ZSBsb2NhdGlvbiBvZiBzcmMgYW5kIGRzdC4KKworICAgbXVsdGlwbGllcl9OIGlzIG1vcmUgb3IgbGVzcyBhIHRoaXJkIHNvdXJjZSByZWdpb24gZm9yIHRoZSBhZGRtdWxfTgorICAgcm91dGluZXMsIGFuZCBjb3VsZCBiZSBkb25lIHdpdGggdGhlIHJlZHpvbmVkIHJlZ2lvbiBzY2hlbWUuCisKKyovCisKKworLyogYWx3YXlzIGRvIGFzc2VydGlvbiBjaGVja2luZyAqLworI2RlZmluZSBXQU5UX0FTU0VSVCAxCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmIEhBVkVfU1lTX01NQU5fSAorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKyNpZiAhSEFWRV9ERUNMX09QVEFSRworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK2V4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnI7CisjZW5kaWYKKworI2lmICEgSEFWRV9ERUNMX1NZU19ORVJSCitleHRlcm4gaW50IHN5c19uZXJyOworI2VuZGlmCisKKyNpZiAhIEhBVkVfREVDTF9TWVNfRVJSTElTVAorZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107CisjZW5kaWYKKworI2lmICEgSEFWRV9TVFJFUlJPUgorY2hhciAqCitzdHJlcnJvciAoaW50IG4pCit7CisgIGlmIChuIDwgMCB8fCBuID49IHN5c19uZXJyKQorICAgIHJldHVybiAiZXJybm8gb3V0IG9mIHJhbmdlIjsKKyAgZWxzZQorICAgIHJldHVybiBzeXNfZXJybGlzdFtuXTsKK30KKyNlbmRpZgorCisvKiBSdW1vdXIgaGFzIGl0IHNvbWUgc3lzdGVtcyBsYWNrIGEgZGVmaW5lIG9mIFBST1RfTk9ORS4gKi8KKyNpZm5kZWYgUFJPVF9OT05FCisjZGVmaW5lIFBST1RfTk9ORSAgIDAKKyNlbmRpZgorCisvKiBEdW1teSBkZWZpbmVzIGZvciB3aGVuIG1wcm90ZWN0IGRvZXNuJ3QgZXhpc3QuICovCisjaWZuZGVmIFBST1RfUkVBRAorI2RlZmluZSBQUk9UX1JFQUQgICAwCisjZW5kaWYKKyNpZm5kZWYgUFJPVF9XUklURQorI2RlZmluZSBQUk9UX1dSSVRFICAwCisjZW5kaWYKKworLyogX1NDX1BBR0VTSVpFIGlzIHN0YW5kYXJkLCBidXQgaHB1eCA5IGFuZCBwb3NzaWJseSBvdGhlciBzeXN0ZW1zIGhhdmUKKyAgIF9TQ19QQUdFX1NJWkUgaW5zdGVhZC4gKi8KKyNpZiBkZWZpbmVkIChfU0NfUEFHRV9TSVpFKSAmJiAhIGRlZmluZWQgKF9TQ19QQUdFU0laRSkKKyNkZWZpbmUgX1NDX1BBR0VTSVpFICBfU0NfUEFHRV9TSVpFCisjZW5kaWYKKworCisjaWZkZWYgRVhUUkFfUFJPVE9TCitFWFRSQV9QUk9UT1MKKyNlbmRpZgorI2lmZGVmIEVYVFJBX1BST1RPUzIKK0VYVFJBX1BST1RPUzIKKyNlbmRpZgorCisKKyNkZWZpbmUgREVGQVVMVF9SRVBFVElUSU9OUyAgMTAKKworaW50ICBvcHRpb25fcmVwZXRpdGlvbnMgPSBERUZBVUxUX1JFUEVUSVRJT05TOworaW50ICBvcHRpb25fc3Bpbm5lciA9IDE7CitpbnQgIG9wdGlvbl9yZWR6b25lcyA9IDE7CitpbnQgIG9wdGlvbl9maXJzdHNpemUgPSAwOworaW50ICBvcHRpb25fbGFzdHNpemUgPSA1MDA7CitpbnQgIG9wdGlvbl9maXJzdHNpemUyID0gMDsKKworI2RlZmluZSBBTElHTk1FTlRTICAgICAgICAgIDQKKyNkZWZpbmUgT1ZFUkxBUFMgICAgICAgICAgICA0CisjZGVmaW5lIENBUlJZX1JBTkRPTVMgICAgICAgNQorI2RlZmluZSBNVUxUSVBMSUVSX1JBTkRPTVMgIDUKKyNkZWZpbmUgRElWSVNPUl9SQU5ET01TICAgICA1CisjZGVmaW5lIEZSQUNUSU9OX0NPVU5UICAgICAgNAorCitpbnQgIG9wdGlvbl9wcmludCA9IDA7CisKKyNkZWZpbmUgREFUQV9UUkFORCAgMAorI2RlZmluZSBEQVRBX1pFUk9TICAxCisjZGVmaW5lIERBVEFfU0VRICAgIDIKKyNkZWZpbmUgREFUQV9GRlMgICAgMworI2RlZmluZSBEQVRBXzJGRCAgICA0CitpbnQgIG9wdGlvbl9kYXRhID0gREFUQV9UUkFORDsKKworCittcF9zaXplX3QgIHBhZ2VzaXplOworI2RlZmluZSBQQUdFU0laRV9MSU1CUyAgKHBhZ2VzaXplIC8gR01QX0xJTUJfQllURVMpCisKKy8qIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFJFRFpPTkVfQllURVMgICAocGFnZXNpemUgKiAxNikKKyNkZWZpbmUgUkVEWk9ORV9MSU1CUyAgIChSRURaT05FX0JZVEVTIC8gR01QX0xJTUJfQllURVMpCisKKworI2RlZmluZSBNQVgzKHgseSx6KSAgIChNQVggKHgsIE1BWCAoeSwgeikpKQorCisjaWYgR01QX0xJTUJfQklUUyA9PSAzMgorI2RlZmluZSBERUFEVkFMICBDTlNUX0xJTUIoMHhERUFEQkVFRikKKyNlbHNlCisjZGVmaW5lIERFQURWQUwgIENOU1RfTElNQigweERFQURCRUVGQkFERENBRkUpCisjZW5kaWYKKworCitzdHJ1Y3QgcmVnaW9uX3QgeworICBtcF9wdHIgICAgIHB0cjsKKyAgbXBfc2l6ZV90ICBzaXplOworfTsKKworCisjZGVmaW5lIFRSQVBfTk9XSEVSRSAwCisjZGVmaW5lIFRSQVBfUkVGICAgICAxCisjZGVmaW5lIFRSQVBfRlVOICAgICAyCisjZGVmaW5lIFRSQVBfU0VUVVBTICAzCitpbnQgdHJhcF9sb2NhdGlvbiA9IFRSQVBfTk9XSEVSRTsKKworCisjZGVmaW5lIE5VTV9TT1VSQ0VTICA1CisjZGVmaW5lIE5VTV9ERVNUUyAgICAyCisKK3N0cnVjdCBzb3VyY2VfdCB7CisgIHN0cnVjdCByZWdpb25fdCAgcmVnaW9uOworICBpbnQgICAgICAgIGhpZ2g7CisgIG1wX3NpemVfdCAgYWxpZ247CisgIG1wX3B0ciAgICAgcDsKK307CisKK3N0cnVjdCBzb3VyY2VfdCAgc1tOVU1fU09VUkNFU107CisKK3N0cnVjdCBkZXN0X3QgeworICBpbnQgICAgICAgIGhpZ2g7CisgIG1wX3NpemVfdCAgYWxpZ247CisgIG1wX3NpemVfdCAgc2l6ZTsKK307CisKK3N0cnVjdCBkZXN0X3QgIGRbTlVNX0RFU1RTXTsKKworc3RydWN0IHNvdXJjZV9lYWNoX3QgeworICBtcF9wdHIgICAgIHA7Cit9OworCitzdHJ1Y3QgZGVzdF9lYWNoX3QgeworICBzdHJ1Y3QgcmVnaW9uX3QgIHJlZ2lvbjsKKyAgbXBfcHRyICAgICBwOworfTsKKworbXBfc2l6ZV90ICAgICAgIHNpemU7CittcF9zaXplX3QgICAgICAgc2l6ZTI7Cit1bnNpZ25lZCBsb25nICAgc2hpZnQ7CittcF9saW1iX3QgICAgICAgY2Fycnk7CittcF9saW1iX3QgICAgICAgZGl2aXNvcjsKK21wX2xpbWJfdCAgICAgICBtdWx0aXBsaWVyOworbXBfbGltYl90ICAgICAgIG11bHRpcGxpZXJfTls4XTsKKworc3RydWN0IGVhY2hfdCB7CisgIGNvbnN0IGNoYXIgICpuYW1lOworICBzdHJ1Y3QgZGVzdF9lYWNoX3QgICAgZFtOVU1fREVTVFNdOworICBzdHJ1Y3Qgc291cmNlX2VhY2hfdCAgc1tOVU1fU09VUkNFU107CisgIG1wX2xpbWJfdCAgcmV0dmFsOworfTsKKworc3RydWN0IGVhY2hfdCAgcmVmID0geyAiUmVmIiB9Oworc3RydWN0IGVhY2hfdCAgZnVuID0geyAiRnVuIiB9OworCisjZGVmaW5lIFNSQ19TSVpFKG4pICAoKG4pID09IDEgJiYgdHItPnNpemUyID8gc2l6ZTIgOiBzaXplKQorCit2b2lkIHZhbGlkYXRlX2ZhaWwgKHZvaWQpOworCisKKyNpZiBIQVZFX1RSWV9ORVdfQworI2luY2x1ZGUgInRyeS1uZXcuYyIKKyNlbmRpZgorCisKK3R5cGVkZWYgbXBfbGltYl90ICgqdHJ5ZnVuX3QpIChBTllBUkdTKTsKKworc3RydWN0IHRyeV90IHsKKyAgY2hhciAgcmV0dmFsOworCisgIGNoYXIgIHNyY1tOVU1fU09VUkNFU107CisgIGNoYXIgIGRzdFtOVU1fREVTVFNdOworCisjZGVmaW5lIFNJWkVfWUVTICAgICAgICAgIDEKKyNkZWZpbmUgU0laRV9BTExPV19aRVJPICAgMgorI2RlZmluZSBTSVpFXzEgICAgICAgICAgICAzICAvKiAxIGxpbWIgICovCisjZGVmaW5lIFNJWkVfMiAgICAgICAgICAgIDQgIC8qIDIgbGltYnMgKi8KKyNkZWZpbmUgU0laRV8zICAgICAgICAgICAgNSAgLyogMyBsaW1icyAqLworI2RlZmluZSBTSVpFXzQgICAgICAgICAgICA2ICAvKiA0IGxpbWJzICovCisjZGVmaW5lIFNJWkVfNiAgICAgICAgICAgIDcgIC8qIDYgbGltYnMgKi8KKyNkZWZpbmUgU0laRV9GUkFDVElPTiAgICAgOCAgLyogc2l6ZTIgaXMgZnJhY3Rpb24gZm9yIGRpdnJlbSBldGMgKi8KKyNkZWZpbmUgU0laRV9TSVpFMiAgICAgICAgOQorI2RlZmluZSBTSVpFX1BMVVNfMSAgICAgIDEwCisjZGVmaW5lIFNJWkVfU1VNICAgICAgICAgMTEKKyNkZWZpbmUgU0laRV9ESUZGICAgICAgICAxMgorI2RlZmluZSBTSVpFX0RJRkZfUExVU18xIDEzCisjZGVmaW5lIFNJWkVfRElGRl9QTFVTXzMgMTQKKyNkZWZpbmUgU0laRV9SRVRWQUwgICAgICAxNQorI2RlZmluZSBTSVpFX0NFSUxfSEFMRiAgIDE2CisjZGVmaW5lIFNJWkVfR0VUX1NUUiAgICAgMTcKKyNkZWZpbmUgU0laRV9QTFVTX01TSVpFX1NVQl8xIDE4ICAvKiBzaXplK21zaXplLTEgKi8KKyNkZWZpbmUgU0laRV9PREQgICAgICAgICAxOQorICBjaGFyICBzaXplOworICBjaGFyICBzaXplMjsKKyAgY2hhciAgZHN0X3NpemVbTlVNX0RFU1RTXTsKKworICAvKiBtdWx0aXBsaWVyX04gc2l6ZSBpbiBsaW1icyAqLworICBtcF9zaXplX3QgIG1zaXplOworCisgIGNoYXIgIGRzdF9ieXRlc1tOVU1fREVTVFNdOworCisgIGNoYXIgIGRzdDBfZnJvbV9zcmMxOworCisjZGVmaW5lIENBUlJZX0JJVCAgICAgMSAgLyogc2luZ2xlIGJpdCAwIG9yIDEgKi8KKyNkZWZpbmUgQ0FSUllfMyAgICAgICAyICAvKiAwLCAxLCAyICovCisjZGVmaW5lIENBUlJZXzQgICAgICAgMyAgLyogMCB0byAzICovCisjZGVmaW5lIENBUlJZX0xJTUIgICAgNCAgLyogYW55IGxpbWIgdmFsdWUgKi8KKyNkZWZpbmUgQ0FSUllfRElWSVNPUiA1ICAvKiBjYXJyeTxkaXZpc29yICovCisgIGNoYXIgIGNhcnJ5OworCisgIC8qIGEgZnVkZ2UgdG8gdGVsbCB0aGUgb3V0cHV0IHdoZW4gdG8gcHJpbnQgbmVnYXRpdmVzICovCisgIGNoYXIgIGNhcnJ5X3NpZ247CisKKyAgY2hhciAgbXVsdGlwbGllcjsKKyAgY2hhciAgc2hpZnQ7CisKKyNkZWZpbmUgRElWSVNPUl9MSU1CICAxCisjZGVmaW5lIERJVklTT1JfTk9STSAgMgorI2RlZmluZSBESVZJU09SX09ERCAgIDMKKyAgY2hhciAgZGl2aXNvcjsKKworI2RlZmluZSBEQVRBX05PTl9aRVJPICAgICAgICAgMQorI2RlZmluZSBEQVRBX0dDRCAgICAgICAgICAgICAgMgorI2RlZmluZSBEQVRBX1NSQzBfT0REICAgICAgICAgMworI2RlZmluZSBEQVRBX1NSQzBfSElHSEJJVCAgICAgNAorI2RlZmluZSBEQVRBX1NSQzFfT0REICAgICAgICAgNQorI2RlZmluZSBEQVRBX1NSQzFfT0REX1BSSU1FICAgNgorI2RlZmluZSBEQVRBX1NSQzFfSElHSEJJVCAgICAgNworI2RlZmluZSBEQVRBX01VTFRJUExFX0RJVklTT1IgOAorI2RlZmluZSBEQVRBX1VESVZfUVJOTkQgICAgICAgOQorI2RlZmluZSBEQVRBX0RJVl9RUl8xICAgICAgICAxMAorICBjaGFyICBkYXRhOworCisvKiBEZWZhdWx0IGlzIGFsbG93IGZ1bGwgb3ZlcmxhcC4gKi8KKyNkZWZpbmUgT1ZFUkxBUF9OT05FICAgICAgICAgMQorI2RlZmluZSBPVkVSTEFQX0xPV19UT19ISUdIICAyCisjZGVmaW5lIE9WRVJMQVBfSElHSF9UT19MT1cgIDMKKyNkZWZpbmUgT1ZFUkxBUF9OT1RfU1JDUyAgICAgNAorI2RlZmluZSBPVkVSTEFQX05PVF9TUkMyICAgICA4CisjZGVmaW5lIE9WRVJMQVBfTk9UX0RTVDIgICAgIDE2CisgIGNoYXIgIG92ZXJsYXA7CisKKyAgdHJ5ZnVuX3QgICAgcmVmZXJlbmNlOworICBjb25zdCBjaGFyICAqcmVmZXJlbmNlX25hbWU7CisKKyAgdm9pZCAgICAgICAgKCp2YWxpZGF0ZSkgKHZvaWQpOworICBjb25zdCBjaGFyICAqdmFsaWRhdGVfbmFtZTsKK307CisKK3N0cnVjdCB0cnlfdCAgKnRyOworCisKK3ZvaWQKK3ZhbGlkYXRlX21vZF8zNGxzdWIxICh2b2lkKQoreworI2RlZmluZSBDTlNUXzM0TFNVQjEgICAoKENOU1RfTElNQigxKSA8PCAoMyAqIChHTVBfTlVNQl9CSVRTIC8gNCkpKSAtIDEpCisKKyAgbXBfc3JjcHRyICBwdHIgPSBzWzBdLnA7CisgIGludCAgICAgICAgZXJyb3IgPSAwOworICBtcF9saW1iX3QgIGdvdCwgZ290X21vZCwgd2FudCwgd2FudF9tb2Q7CisKKyAgQVNTRVJUIChzaXplID49IDEpOworCisgIGdvdCA9IGZ1bi5yZXR2YWw7CisgIGdvdF9tb2QgPSBnb3QgJSBDTlNUXzM0TFNVQjE7CisKKyAgd2FudCA9IHJlZm1wbl9tb2RfMzRsc3ViMSAocHRyLCBzaXplKTsKKyAgd2FudF9tb2QgPSB3YW50ICUgQ05TVF8zNExTVUIxOworCisgIGlmIChnb3RfbW9kICE9IHdhbnRfbW9kKQorICAgIHsKKyAgICAgIGdtcF9wcmludGYgKCJnb3QgICAweCVNWCByZWR1Y2VkIGZyb20gMHglTVhcbiIsIGdvdF9tb2QsIGdvdCk7CisgICAgICBnbXBfcHJpbnRmICgid2FudCAgMHglTVggcmVkdWNlZCBmcm9tIDB4JU1YXG4iLCB3YW50X21vZCwgd2FudCk7CisgICAgICBlcnJvciA9IDE7CisgICAgfQorCisgIGlmIChlcnJvcikKKyAgICB2YWxpZGF0ZV9mYWlsICgpOworfQorCit2b2lkCit2YWxpZGF0ZV9kaXZleGFjdF8xICh2b2lkKQoreworICBtcF9zcmNwdHIgIHNyYyA9IHNbMF0ucDsKKyAgbXBfc3JjcHRyICBkc3QgPSBmdW4uZFswXS5wOworICBpbnQgIGVycm9yID0gMDsKKworICBBU1NFUlQgKHNpemUgPj0gMSk7CisKKyAgeworICAgIG1wX3B0ciAgICAgdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChzaXplKTsKKyAgICBtcF9saW1iX3QgIHJlbTsKKworICAgIHJlbSA9IHJlZm1wbl9kaXZyZW1fMSAodHAsIDAsIHNyYywgc2l6ZSwgZGl2aXNvcik7CisgICAgaWYgKHJlbSAhPSAwKQorICAgICAgeworCWdtcF9wcmludGYgKCJSZW1haW5kZXIgYSUlZCA9PSAweCVNWCwgbXBuX2RpdmV4YWN0XzEgdW5kZWZpbmVkXG4iLCByZW0pOworCWVycm9yID0gMTsKKyAgICAgIH0KKyAgICBpZiAoISByZWZtcG5fZXF1YWxfYW55bmFpbCAodHAsIGRzdCwgc2l6ZSkpCisgICAgICB7CisJcHJpbnRmICgiUXVvdGllbnQgYS9kIHdyb25nXG4iKTsKKwltcG5fdHJhY2UgKCJmdW4gIiwgZHN0LCBzaXplKTsKKwltcG5fdHJhY2UgKCJ3YW50IiwgdHAsIHNpemUpOworCWVycm9yID0gMTsKKyAgICAgIH0KKyAgICBmcmVlICh0cCk7CisgIH0KKworICBpZiAoZXJyb3IpCisgICAgdmFsaWRhdGVfZmFpbCAoKTsKK30KKwordm9pZAordmFsaWRhdGVfYmRpdl9xXzEKKyAodm9pZCkKK3sKKyAgbXBfc3JjcHRyICBzcmMgPSBzWzBdLnA7CisgIG1wX3NyY3B0ciAgZHN0ID0gZnVuLmRbMF0ucDsKKyAgaW50ICBlcnJvciA9IDA7CisKKyAgQVNTRVJUIChzaXplID49IDEpOworCisgIHsKKyAgICBtcF9wdHIgICAgIHRwID0gcmVmbXBuX21hbGxvY19saW1icyAoc2l6ZSArIDEpOworCisgICAgcmVmbXBuX211bF8xICh0cCwgZHN0LCBzaXplLCBkaXZpc29yKTsKKyAgICAvKiBTZXQgaWdub3JlZCBsb3cgYml0cyAqLworICAgIHRwWzBdIHw9IChzcmNbMF0gJiBMT1dfWkVST1NfTUFTSyAoZGl2aXNvcikpOworICAgIGlmICghIHJlZm1wbl9lcXVhbF9hbnluYWlsICh0cCwgc3JjLCBzaXplKSkKKyAgICAgIHsKKwlwcmludGYgKCJCZGl2IHdyb25nOiByZXMgKiBkaXZpc29yICE9IHNyYyAobW9kIEJec2l6ZSlcbiIpOworCW1wbl90cmFjZSAoInJlcyAiLCBkc3QsIHNpemUpOworCW1wbl90cmFjZSAoInNyYyAiLCBzcmMsIHNpemUpOworCWVycm9yID0gMTsKKyAgICAgIH0KKyAgICBmcmVlICh0cCk7CisgIH0KKworICBpZiAoZXJyb3IpCisgICAgdmFsaWRhdGVfZmFpbCAoKTsKK30KKworCit2b2lkCit2YWxpZGF0ZV9tb2RleGFjdF8xY19vZGQgKHZvaWQpCit7CisgIG1wX3NyY3B0ciAgcHRyID0gc1swXS5wOworICBtcF9saW1iX3QgIHIgPSBmdW4ucmV0dmFsOworICBpbnQgIGVycm9yID0gMDsKKworICBBU1NFUlQgKHNpemUgPj0gMSk7CisgIEFTU0VSVCAoZGl2aXNvciAmIDEpOworCisgIGlmICgociAmIEdNUF9OQUlMX01BU0spICE9IDApCisgICAgcHJpbnRmICgiciBoYXMgbm9uLXplcm8gbmFpbFxuIik7CisKKyAgaWYgKGNhcnJ5IDwgZGl2aXNvcikKKyAgICB7CisgICAgICBpZiAoISAociA8IGRpdmlzb3IpKQorCXsKKwkgIHByaW50ZiAoIkRvbid0IGhhdmUgciA8IGRpdmlzb3JcbiIpOworCSAgZXJyb3IgPSAxOworCX0KKyAgICB9CisgIGVsc2UgLyogY2FycnkgPj0gZGl2aXNvciAqLworICAgIHsKKyAgICAgIGlmICghIChyIDw9IGRpdmlzb3IpKQorCXsKKwkgIHByaW50ZiAoIkRvbid0IGhhdmUgciA8PSBkaXZpc29yXG4iKTsKKwkgIGVycm9yID0gMTsKKwl9CisgICAgfQorCisgIHsKKyAgICBtcF9saW1iX3QgIGMgPSBjYXJyeSAlIGRpdmlzb3I7CisgICAgbXBfcHRyICAgICB0cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUrMSk7CisgICAgbXBfc2l6ZV90ICBrOworCisgICAgZm9yIChrID0gc2l6ZS0xOyBrIDw9IHNpemU7IGsrKykKKyAgICAgIHsKKwkvKiBzZXQge3RwLHNpemUrMX0gdG8gcipiXmsgKyBhIC0gYyAqLworCXJlZm1wbl9jb3B5aSAodHAsIHB0ciwgc2l6ZSk7CisJdHBbc2l6ZV0gPSAwOworCUFTU0VSVF9OT0NBUlJZIChyZWZtcG5fYWRkXzEgKHRwK2ssIHRwK2ssIHNpemUrMS1rLCByKSk7CisJaWYgKHJlZm1wbl9zdWJfMSAodHAsIHRwLCBzaXplKzEsIGMpKQorCSAgQVNTRVJUX0NBUlJZIChtcG5fYWRkXzEgKHRwLCB0cCwgc2l6ZSsxLCBkaXZpc29yKSk7CisKKwlpZiAocmVmbXBuX21vZF8xICh0cCwgc2l6ZSsxLCBkaXZpc29yKSA9PSAwKQorCSAgZ290byBnb29kX3JlbWFpbmRlcjsKKyAgICAgIH0KKyAgICBwcmludGYgKCJSZW1haW5kZXIgbWF0Y2hlcyBuZWl0aGVyIHIqYl4oc2l6ZS0xKSBub3IgcipiXnNpemVcbiIpOworICAgIGVycm9yID0gMTsKKworICBnb29kX3JlbWFpbmRlcjoKKyAgICBmcmVlICh0cCk7CisgIH0KKworICBpZiAoZXJyb3IpCisgICAgdmFsaWRhdGVfZmFpbCAoKTsKK30KKwordm9pZAordmFsaWRhdGVfbW9kZXhhY3RfMV9vZGQgKHZvaWQpCit7CisgIGNhcnJ5ID0gMDsKKyAgdmFsaWRhdGVfbW9kZXhhY3RfMWNfb2RkICgpOworfQorCit2b2lkCit2YWxpZGF0ZV9kaXZfcXJfMV9waTEgKHZvaWQpCit7CisgIG1wX3NyY3B0ciB1cCA9IHJlZi5zWzBdLnA7CisgIG1wX3NpemVfdCB1biA9IHNpemU7CisgIG1wX3NpemVfdCB1aCA9IHJlZi5zWzFdLnBbMF07CisgIG1wX3NyY3B0ciBxcCA9IGZ1bi5kWzBdLnA7CisgIG1wX2xpbWJfdCByID0gZnVuLnJldHZhbDsKKyAgbXBfbGltYl90IGN5OworICBpbnQgY21wOworICBtcF9wdHIgdHA7CisgIGlmIChyID49IGRpdmlzb3IpCisgICAgeworICAgICAgZ21wX3ByaW50ZiAoIkJhZCByZW1haW5kZXIgJU1kLCBkID0gJU1kXG4iLCByLCBkaXZpc29yKTsKKyAgICAgIHZhbGlkYXRlX2ZhaWwgKCk7CisgICAgfQorICB0cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHVuKTsKKyAgY3kgPSByZWZtcG5fbXVsXzEgKHRwLCBxcCwgdW4sIGRpdmlzb3IpOworICBjeSArPSByZWZtcG5fYWRkXzEgKHRwLCB0cCwgdW4sIHIpOworICBpZiAoY3kgIT0gdWggfHwgcmVmbXBuX2NtcCAodHAsIHVwLCB1bikgIT0gMCkKKyAgICB7CisgICAgICBnbXBfcHJpbnRmICgiSW5jb3JyZWN0IHJlc3VsdCwgc2l6ZSAlbGQuXG4iCisJCSAgImQgPSAlTXgsIHUgPSAlTXgsICVOeFxuIgorCQkgICJnb3Q6IHIgPSAlTXgsIHEgPSAlTnhcbiIKKwkJICAicSBkICsgciA9ICVNeCwgJU54IiwKKwkJICAobG9uZykgdW4sCisJCSAgZGl2aXNvciwgdWgsIHVwLCB1biwKKwkJICByLCBxcCwgdW4sCisJCSAgY3ksIHRwLCB1bik7CisgICAgICB2YWxpZGF0ZV9mYWlsICgpOworICAgIH0KKyAgZnJlZSAodHApOworfQorCisKK3ZvaWQKK3ZhbGlkYXRlX3NxcnRyZW0gKHZvaWQpCit7CisgIG1wX3NyY3B0ciAgb3JpZ19wdHIgPSBzWzBdLnA7CisgIG1wX3NpemVfdCAgb3JpZ19zaXplID0gc2l6ZTsKKyAgbXBfc2l6ZV90ICByb290X3NpemUgPSAoc2l6ZSsxKS8yOworICBtcF9zcmNwdHIgIHJvb3RfcHRyID0gZnVuLmRbMF0ucDsKKyAgbXBfc2l6ZV90ICByZW1fc2l6ZSA9IGZ1bi5yZXR2YWw7CisgIG1wX3NyY3B0ciAgcmVtX3B0ciA9IGZ1bi5kWzFdLnA7CisgIG1wX3NpemVfdCAgcHJvZF9zaXplID0gMipyb290X3NpemU7CisgIG1wX3B0ciAgICAgcDsKKyAgaW50ICBlcnJvciA9IDA7CisKKyAgaWYgKHJlbV9zaXplIDwgMCB8fCByZW1fc2l6ZSA+IHNpemUpCisgICAgeworICAgICAgcHJpbnRmICgiQmFkIHJlbWFpbmRlciBzaXplIHJldHZhbCAlbGRcbiIsIChsb25nKSByZW1fc2l6ZSk7CisgICAgICB2YWxpZGF0ZV9mYWlsICgpOworICAgIH0KKworICBwID0gcmVmbXBuX21hbGxvY19saW1icyAocHJvZF9zaXplKTsKKworICBwW3Jvb3Rfc2l6ZV0gPSByZWZtcG5fbHNoaWZ0IChwLCByb290X3B0ciwgcm9vdF9zaXplLCAxKTsKKyAgaWYgKHJlZm1wbl9jbXBfdHdvc2l6ZXMgKHAscm9vdF9zaXplKzEsIHJlbV9wdHIscmVtX3NpemUpIDwgMCkKKyAgICB7CisgICAgICBwcmludGYgKCJSZW1haW5kZXIgYmlnZ2VyIHRoYW4gMipyb290XG4iKTsKKyAgICAgIGVycm9yID0gMTsKKyAgICB9CisKKyAgcmVmbXBuX3NxciAocCwgcm9vdF9wdHIsIHJvb3Rfc2l6ZSk7CisgIGlmIChyZW1fc2l6ZSAhPSAwKQorICAgIHJlZm1wbl9hZGQgKHAsIHAsIHByb2Rfc2l6ZSwgcmVtX3B0ciwgcmVtX3NpemUpOworICBpZiAocmVmbXBuX2NtcF90d29zaXplcyAocCxwcm9kX3NpemUsIG9yaWdfcHRyLG9yaWdfc2l6ZSkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJyb290XjIrcmVtICE9IG9yaWdpbmFsXG4iKTsKKyAgICAgIG1wbl90cmFjZSAoInByb2QiLCBwLCBwcm9kX3NpemUpOworICAgICAgZXJyb3IgPSAxOworICAgIH0KKyAgZnJlZSAocCk7CisKKyAgaWYgKGVycm9yKQorICAgIHZhbGlkYXRlX2ZhaWwgKCk7Cit9CisKK3ZvaWQKK3ZhbGlkYXRlX3NxcnQgKHZvaWQpCit7CisgIG1wX3NyY3B0ciAgb3JpZ19wdHIgPSBzWzBdLnA7CisgIG1wX3NpemVfdCAgb3JpZ19zaXplID0gc2l6ZTsKKyAgbXBfc2l6ZV90ICByb290X3NpemUgPSAoc2l6ZSsxKS8yOworICBtcF9zcmNwdHIgIHJvb3RfcHRyID0gZnVuLmRbMF0ucDsKKyAgaW50ICAgICAgICBwZXJmX3BvdyA9IChmdW4ucmV0dmFsID09IDApOworICBtcF9zaXplX3QgIHByb2Rfc2l6ZSA9IDIqcm9vdF9zaXplOworICBtcF9wdHIgICAgIHA7CisgIGludCAgZXJyb3IgPSAwOworCisgIHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChwcm9kX3NpemUpOworCisgIHJlZm1wbl9zcXIgKHAsIHJvb3RfcHRyLCByb290X3NpemUpOworICBNUE5fTk9STUFMSVpFIChwLCBwcm9kX3NpemUpOworICBpZiAocmVmbXBuX2NtcF90d29zaXplcyAocCxwcm9kX3NpemUsIG9yaWdfcHRyLG9yaWdfc2l6ZSkgIT0gLSAhcGVyZl9wb3cpCisgICAgeworICAgICAgcHJpbnRmICgicm9vdF4yIGJpZ2dlciB0aGFuIG9yaWdpbmFsLCBvciB3cm9uZyByZXR1cm4gdmFsdWUuXG4iKTsKKyAgICAgIG1wbl90cmFjZSAoInByb2QuLi4iLCBwLCBwcm9kX3NpemUpOworICAgICAgZXJyb3IgPSAxOworICAgIH0KKworICByZWZtcG5fc3ViIChwLCBvcmlnX3B0cixvcmlnX3NpemUsIHAscHJvZF9zaXplKTsKKyAgTVBOX05PUk1BTElaRSAocCwgcHJvZF9zaXplKTsKKyAgaWYgKHByb2Rfc2l6ZSA+PSByb290X3NpemUgJiYKKyAgICAgIHJlZm1wbl9zdWIgKHAsIHAscHJvZF9zaXplLCByb290X3B0ciwgcm9vdF9zaXplKSA9PSAwICYmCisgICAgICByZWZtcG5fY21wX3R3b3NpemVzIChwLCBwcm9kX3NpemUsIHJvb3RfcHRyLCByb290X3NpemUpID4gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIocm9vdCsxKV4yIHNtYWxsZXIgdGhhbiBvcmlnaW5hbC5cbiIpOworICAgICAgbXBuX3RyYWNlICgicHJvZCIsIHAsIHByb2Rfc2l6ZSk7CisgICAgICBlcnJvciA9IDE7CisgICAgfQorICBmcmVlIChwKTsKKworICBpZiAoZXJyb3IpCisgICAgdmFsaWRhdGVfZmFpbCAoKTsKK30KKworCisvKiBUaGVzZSB0eXBlcyBhcmUgaW5kZXhlcyBpbnRvIHRoZSBwYXJhbVtdIGFycmF5IGFuZCBhcmUgYXJiaXRyYXJ5IHNvIGxvbmcKKyAgIGFzIHRoZXkncmUgYWxsIGRpc3RpbmN0IGFuZCB3aXRoaW4gdGhlIHNpemUgb2YgcGFyYW1bXS4gIFJlbnVtYmVyCisgICB3aGVuZXZlciBuZWNlc3Nhcnkgb3IgZGVzaXJlZC4gICovCisKK2VudW0geworICBUWVBFX0FERCA9IDEsIFRZUEVfQUREX04sIFRZUEVfQUREX05DLCBUWVBFX1NVQiwgVFlQRV9TVUJfTiwgVFlQRV9TVUJfTkMsCisKKyAgVFlQRV9BRERfRVJSMV9OLCBUWVBFX0FERF9FUlIyX04sIFRZUEVfQUREX0VSUjNfTiwKKyAgVFlQRV9TVUJfRVJSMV9OLCBUWVBFX1NVQl9FUlIyX04sIFRZUEVfU1VCX0VSUjNfTiwKKworICBUWVBFX01VTF8xLCBUWVBFX01VTF8xQywKKworICBUWVBFX01VTF8yLCBUWVBFX01VTF8zLCBUWVBFX01VTF80LCBUWVBFX01VTF81LCBUWVBFX01VTF82LAorCisgIFRZUEVfQURETVVMXzEsIFRZUEVfQURETVVMXzFDLCBUWVBFX1NVQk1VTF8xLCBUWVBFX1NVQk1VTF8xQywKKworICBUWVBFX0FERE1VTF8yLCBUWVBFX0FERE1VTF8zLCBUWVBFX0FERE1VTF80LCBUWVBFX0FERE1VTF81LCBUWVBFX0FERE1VTF82LAorICBUWVBFX0FERE1VTF83LCBUWVBFX0FERE1VTF84LAorCisgIFRZUEVfQUREU1VCX04sIFRZUEVfQUREU1VCX05DLAorCisgIFRZUEVfUlNISUZULCBUWVBFX0xTSElGVCwgVFlQRV9MU0hJRlRDLAorCisgIFRZUEVfQ09QWSwgVFlQRV9DT1BZSSwgVFlQRV9DT1BZRCwgVFlQRV9DT00sCisKKyAgVFlQRV9BRERMU0gxX04sIFRZUEVfQURETFNIMl9OLCBUWVBFX0FERExTSF9OLAorICBUWVBFX0FERExTSDFfTl9JUDEsIFRZUEVfQURETFNIMl9OX0lQMSwgVFlQRV9BRERMU0hfTl9JUDEsCisgIFRZUEVfQURETFNIMV9OX0lQMiwgVFlQRV9BRERMU0gyX05fSVAyLCBUWVBFX0FERExTSF9OX0lQMiwKKyAgVFlQRV9TVUJMU0gxX04sIFRZUEVfU1VCTFNIMl9OLCBUWVBFX1NVQkxTSF9OLAorICBUWVBFX1NVQkxTSDFfTl9JUDEsIFRZUEVfU1VCTFNIMl9OX0lQMSwgVFlQRV9TVUJMU0hfTl9JUDEsCisgIFRZUEVfUlNCTFNIMV9OLCBUWVBFX1JTQkxTSDJfTiwgVFlQRV9SU0JMU0hfTiwKKyAgVFlQRV9SU0gxQUREX04sIFRZUEVfUlNIMVNVQl9OLAorCisgIFRZUEVfQURETFNIMV9OQywgVFlQRV9BRERMU0gyX05DLCBUWVBFX0FERExTSF9OQywKKyAgVFlQRV9TVUJMU0gxX05DLCBUWVBFX1NVQkxTSDJfTkMsIFRZUEVfU1VCTFNIX05DLAorICBUWVBFX1JTQkxTSDFfTkMsIFRZUEVfUlNCTFNIMl9OQywgVFlQRV9SU0JMU0hfTkMsCisKKyAgVFlQRV9BRERDTkRfTiwgVFlQRV9TVUJDTkRfTiwKKworICBUWVBFX01PRF8xLCBUWVBFX01PRF8xQywgVFlQRV9ESVZNT0RfMSwgVFlQRV9ESVZNT0RfMUMsIFRZUEVfRElWUkVNXzEsCisgIFRZUEVfRElWUkVNXzFDLCBUWVBFX1BSRUlOVl9ESVZSRU1fMSwgVFlQRV9ESVZSRU1fMiwgVFlQRV9QUkVJTlZfTU9EXzEsCisgIFRZUEVfRElWX1FSXzFOX1BJMSwKKyAgVFlQRV9NT0RfMzRMU1VCMSwgVFlQRV9VRElWX1FSTk5ELCBUWVBFX1VESVZfUVJOTkRfUiwKKworICBUWVBFX0RJVkVYQUNUXzEsIFRZUEVfQkRJVl9RXzEsIFRZUEVfRElWRVhBQ1RfQlkzLCBUWVBFX0RJVkVYQUNUX0JZM0MsCisgIFRZUEVfTU9ERVhBQ1RfMV9PREQsIFRZUEVfTU9ERVhBQ1RfMUNfT0RELAorCisgIFRZUEVfSU5WRVJULCBUWVBFX0JJTlZFUlQsCisKKyAgVFlQRV9HQ0QsIFRZUEVfR0NEXzEsIFRZUEVfR0NEX0ZJTkRBLCBUWVBFX01QWl9KQUNPQkksIFRZUEVfTVBaX0tST05FQ0tFUiwKKyAgVFlQRV9NUFpfS1JPTkVDS0VSX1VJLCBUWVBFX01QWl9LUk9ORUNLRVJfU0ksIFRZUEVfTVBaX1VJX0tST05FQ0tFUiwKKyAgVFlQRV9NUFpfU0lfS1JPTkVDS0VSLCBUWVBFX01QWl9MRUdFTkRSRSwKKworICBUWVBFX0FORF9OLCBUWVBFX05BTkRfTiwgVFlQRV9BTkROX04sIFRZUEVfSU9SX04sIFRZUEVfSU9STl9OLCBUWVBFX05JT1JfTiwKKyAgVFlQRV9YT1JfTiwgVFlQRV9YTk9SX04sCisKKyAgVFlQRV9NVUxfTU4sIFRZUEVfTVVMX04sIFRZUEVfU1FSLCBUWVBFX1VNVUxfUFBNTSwgVFlQRV9VTVVMX1BQTU1fUiwKKyAgVFlQRV9NVUxMT19OLCBUWVBFX1NRUkxPLCBUWVBFX01VTE1JRF9NTiwgVFlQRV9NVUxNSURfTiwKKworICBUWVBFX1NCUEkxX0RJVl9RUiwgVFlQRV9URElWX1FSLAorCisgIFRZUEVfU1FSVFJFTSwgVFlQRV9TUVJULCBUWVBFX1pFUk8sIFRZUEVfR0VUX1NUUiwgVFlQRV9QT1BDT1VOVCwgVFlQRV9IQU1ESVNULAorCisgIFRZUEVfRVhUUkEKK307CisKK3N0cnVjdCB0cnlfdCAgcGFyYW1bVFlQRV9FWFRSQV07CisKKwordm9pZAorcGFyYW1faW5pdCAodm9pZCkKK3sKKyAgc3RydWN0IHRyeV90ICAqcDsKKworI2RlZmluZSBDT1BZKGluZGV4KSAgbWVtY3B5IChwLCAmcGFyYW1baW5kZXhdLCBzaXplb2YgKCpwKSkKKworI2RlZmluZSBSRUZFUkVOQ0UoZnVuKSAgICAgICAgICAgICAgICAgIFwKKyAgcC0+cmVmZXJlbmNlID0gKHRyeWZ1bl90KSBmdW47ICAgICAgICBcCisgIHAtPnJlZmVyZW5jZV9uYW1lID0gI2Z1bgorI2RlZmluZSBWQUxJREFURShmdW4pICAgICAgICAgICBcCisgIHAtPnZhbGlkYXRlID0gZnVuOyAgICAgICAgICAgIFwKKyAgcC0+dmFsaWRhdGVfbmFtZSA9ICNmdW4KKworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERfTl07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNyY1sxXSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZF9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfQUREX05DXTsKKyAgQ09QWSAoVFlQRV9BRERfTik7CisgIHAtPmNhcnJ5ID0gQ0FSUllfQklUOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRfbmMpOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJfTl07CisgIENPUFkgKFRZUEVfQUREX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQl9OQ107CisgIENPUFkgKFRZUEVfQUREX05DKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fc3ViX25jKTsKKworICBwID0gJnBhcmFtW1RZUEVfQUREXTsKKyAgQ09QWSAoVFlQRV9BRERfTik7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPnNpemUyID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCXTsKKyAgQ09QWSAoVFlQRV9BREQpOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWIpOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERF9FUlIxX05dOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3RbMV0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5zcmNbMV0gPSAxOworICBwLT5zcmNbMl0gPSAxOworICBwLT5kc3Rfc2l6ZVsxXSA9IFNJWkVfMjsKKyAgcC0+Y2FycnkgPSBDQVJSWV9CSVQ7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX05PVF9EU1QyOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRfZXJyMV9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCX0VSUjFfTl07CisgIENPUFkgKFRZUEVfQUREX0VSUjFfTik7CisgIFJFRkVSRU5DRSAocmVmbXBuX3N1Yl9lcnIxX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERfRVJSMl9OXTsKKyAgQ09QWSAoVFlQRV9BRERfRVJSMV9OKTsKKyAgcC0+c3JjWzNdID0gMTsKKyAgcC0+ZHN0X3NpemVbMV0gPSBTSVpFXzQ7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZF9lcnIyX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJfRVJSMl9OXTsKKyAgQ09QWSAoVFlQRV9BRERfRVJSMl9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fc3ViX2VycjJfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERF9FUlIzX05dOworICBDT1BZIChUWVBFX0FERF9FUlIyX04pOworICBwLT5zcmNbNF0gPSAxOworICBwLT5kc3Rfc2l6ZVsxXSA9IFNJWkVfNjsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkX2VycjNfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQl9FUlIzX05dOworICBDT1BZIChUWVBFX0FERF9FUlIzX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJfZXJyM19uKTsKKworICBwID0gJnBhcmFtW1RZUEVfQUREQ05EX05dOworICBDT1BZIChUWVBFX0FERF9OKTsKKyAgcC0+Y2FycnkgPSBDQVJSWV9CSVQ7CisgIFJFRkVSRU5DRSAocmVmbXBuX2NuZF9hZGRfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQkNORF9OXTsKKyAgQ09QWSAoVFlQRV9BRERfTik7CisgIHAtPmNhcnJ5ID0gQ0FSUllfQklUOworICBSRUZFUkVOQ0UgKHJlZm1wbl9jbmRfc3ViX24pOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX01VTF8xXTsKKyAgcC0+cmV0dmFsID0gMTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+bXVsdGlwbGllciA9IDE7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX0xPV19UT19ISUdIOworICBSRUZFUkVOQ0UgKHJlZm1wbl9tdWxfMSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX01VTF8xQ107CisgIENPUFkgKFRZUEVfTVVMXzEpOworICBwLT5jYXJyeSA9IENBUlJZX0xJTUI7CisgIFJFRkVSRU5DRSAocmVmbXBuX211bF8xYyk7CisKKworICBwID0gJnBhcmFtW1RZUEVfTVVMXzJdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3Rfc2l6ZVswXSA9IFNJWkVfUExVU19NU0laRV9TVUJfMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+c3JjWzFdID0gMTsKKyAgcC0+bXNpemUgPSAyOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT1RfU1JDMjsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbXVsXzIpOworCisgIHAgPSAmcGFyYW1bVFlQRV9NVUxfM107CisgIENPUFkgKFRZUEVfTVVMXzIpOworICBwLT5tc2l6ZSA9IDM7CisgIFJFRkVSRU5DRSAocmVmbXBuX211bF8zKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVVMXzRdOworICBDT1BZIChUWVBFX01VTF8yKTsKKyAgcC0+bXNpemUgPSA0OworICBSRUZFUkVOQ0UgKHJlZm1wbl9tdWxfNCk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX01VTF81XTsKKyAgQ09QWSAoVFlQRV9NVUxfMik7CisgIHAtPm1zaXplID0gNTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbXVsXzUpOworCisgIHAgPSAmcGFyYW1bVFlQRV9NVUxfNl07CisgIENPUFkgKFRZUEVfTVVMXzIpOworICBwLT5tc2l6ZSA9IDY7CisgIFJFRkVSRU5DRSAocmVmbXBuX211bF82KTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERNVUxfMV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPm11bHRpcGxpZXIgPSAxOworICBwLT5kc3QwX2Zyb21fc3JjMSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZG11bF8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETVVMXzFDXTsKKyAgQ09QWSAoVFlQRV9BRERNVUxfMSk7CisgIHAtPmNhcnJ5ID0gQ0FSUllfTElNQjsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbXVsXzFjKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCTVVMXzFdOworICBDT1BZIChUWVBFX0FERE1VTF8xKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fc3VibXVsXzEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJNVUxfMUNdOworICBDT1BZIChUWVBFX0FERE1VTF8xQyk7CisgIFJFRkVSRU5DRSAocmVmbXBuX3N1Ym11bF8xYyk7CisKKworICBwID0gJnBhcmFtW1RZUEVfQURETVVMXzJdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3Rfc2l6ZVswXSA9IFNJWkVfUExVU19NU0laRV9TVUJfMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+c3JjWzFdID0gMTsKKyAgcC0+bXNpemUgPSAyOworICBwLT5kc3QwX2Zyb21fc3JjMSA9IDE7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX05PTkU7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZG11bF8yKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETVVMXzNdOworICBDT1BZIChUWVBFX0FERE1VTF8yKTsKKyAgcC0+bXNpemUgPSAzOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRtdWxfMyk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERE1VTF80XTsKKyAgQ09QWSAoVFlQRV9BRERNVUxfMik7CisgIHAtPm1zaXplID0gNDsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbXVsXzQpOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERNVUxfNV07CisgIENPUFkgKFRZUEVfQURETVVMXzIpOworICBwLT5tc2l6ZSA9IDU7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZG11bF81KTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETVVMXzZdOworICBDT1BZIChUWVBFX0FERE1VTF8yKTsKKyAgcC0+bXNpemUgPSA2OworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRtdWxfNik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERE1VTF83XTsKKyAgQ09QWSAoVFlQRV9BRERNVUxfMik7CisgIHAtPm1zaXplID0gNzsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbXVsXzcpOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERNVUxfOF07CisgIENPUFkgKFRZUEVfQURETVVMXzIpOworICBwLT5tc2l6ZSA9IDg7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZG11bF84KTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9BTkRfTl07CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNyY1sxXSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FuZF9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfQU5ETl9OXTsKKyAgQ09QWSAoVFlQRV9BTkRfTik7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FuZG5fbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX05BTkRfTl07CisgIENPUFkgKFRZUEVfQU5EX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9uYW5kX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9JT1JfTl07CisgIENPUFkgKFRZUEVfQU5EX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9pb3Jfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0lPUk5fTl07CisgIENPUFkgKFRZUEVfQU5EX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9pb3JuX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9OSU9SX05dOworICBDT1BZIChUWVBFX0FORF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbmlvcl9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfWE9SX05dOworICBDT1BZIChUWVBFX0FORF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5feG9yX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9YTk9SX05dOworICBDT1BZIChUWVBFX0FORF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5feG5vcl9uKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERTVUJfTl07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPmRzdFsxXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNyY1sxXSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZF9uX3N1Yl9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfQUREU1VCX05DXTsKKyAgQ09QWSAoVFlQRV9BRERTVUJfTik7CisgIHAtPmNhcnJ5ID0gQ0FSUllfNDsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkX25fc3ViX25jKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9DT1BZXTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+b3ZlcmxhcCA9IE9WRVJMQVBfTk9ORTsKKyAgcC0+c2l6ZSA9IFNJWkVfQUxMT1dfWkVSTzsKKyAgUkVGRVJFTkNFIChyZWZtcG5fY29weSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0NPUFlJXTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+b3ZlcmxhcCA9IE9WRVJMQVBfTE9XX1RPX0hJR0g7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIFJFRkVSRU5DRSAocmVmbXBuX2NvcHlpKTsKKworICBwID0gJnBhcmFtW1RZUEVfQ09QWURdOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9ISUdIX1RPX0xPVzsKKyAgcC0+c2l6ZSA9IFNJWkVfQUxMT1dfWkVSTzsKKyAgUkVGRVJFTkNFIChyZWZtcG5fY29weWQpOworCisgIHAgPSAmcGFyYW1bVFlQRV9DT01dOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBSRUZFUkVOQ0UgKHJlZm1wbl9jb20pOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERExTSDFfTl07CisgIENPUFkgKFRZUEVfQUREX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRsc2gxX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERMU0gyX05dOworICBDT1BZIChUWVBFX0FERF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbHNoMl9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETFNIX05dOworICBDT1BZIChUWVBFX0FERF9OKTsKKyAgcC0+c2hpZnQgPSAxOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRsc2hfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERExTSDFfTl9JUDFdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5kc3QwX2Zyb21fc3JjMSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZGxzaDFfbl9pcDEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERMU0gyX05fSVAxXTsKKyAgQ09QWSAoVFlQRV9BRERMU0gxX05fSVAxKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbHNoMl9uX2lwMSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERExTSF9OX0lQMV07CisgIENPUFkgKFRZUEVfQURETFNIMV9OX0lQMSk7CisgIHAtPnNoaWZ0ID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbHNoX25faXAxKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETFNIMV9OX0lQMl07CisgIENPUFkgKFRZUEVfQURETFNIMV9OX0lQMSk7CisgIFJFRkVSRU5DRSAocmVmbXBuX2FkZGxzaDFfbl9pcDIpOworCisgIHAgPSAmcGFyYW1bVFlQRV9BRERMU0gyX05fSVAyXTsKKyAgQ09QWSAoVFlQRV9BRERMU0gxX05fSVAxKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbHNoMl9uX2lwMik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0FERExTSF9OX0lQMl07CisgIENPUFkgKFRZUEVfQURETFNIX05fSVAxKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fYWRkbHNoX25faXAyKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCTFNIMV9OXTsKKyAgQ09QWSAoVFlQRV9BRERfTik7CisgIFJFRkVSRU5DRSAocmVmbXBuX3N1YmxzaDFfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQkxTSDJfTl07CisgIENPUFkgKFRZUEVfQUREX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJsc2gyX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJMU0hfTl07CisgIENPUFkgKFRZUEVfQURETFNIX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJsc2hfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQkxTSDFfTl9JUDFdOworICBDT1BZIChUWVBFX0FERExTSDFfTl9JUDEpOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJsc2gxX25faXAxKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCTFNIMl9OX0lQMV07CisgIENPUFkgKFRZUEVfQURETFNIMV9OX0lQMSk7CisgIFJFRkVSRU5DRSAocmVmbXBuX3N1YmxzaDJfbl9pcDEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJMU0hfTl9JUDFdOworICBDT1BZIChUWVBFX0FERExTSF9OX0lQMSk7CisgIFJFRkVSRU5DRSAocmVmbXBuX3N1YmxzaF9uX2lwMSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1JTQkxTSDFfTl07CisgIENPUFkgKFRZUEVfQUREX04pOworICBSRUZFUkVOQ0UgKHJlZm1wbl9yc2Jsc2gxX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9SU0JMU0gyX05dOworICBDT1BZIChUWVBFX0FERF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNibHNoMl9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfUlNCTFNIX05dOworICBDT1BZIChUWVBFX0FERExTSF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNibHNoX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9SU0gxQUREX05dOworICBDT1BZIChUWVBFX0FERF9OKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNoMWFkZF9uKTsKKworICBwID0gJnBhcmFtW1RZUEVfUlNIMVNVQl9OXTsKKyAgQ09QWSAoVFlQRV9BRERfTik7CisgIFJFRkVSRU5DRSAocmVmbXBuX3JzaDFzdWJfbik7CisKKworICBwID0gJnBhcmFtW1RZUEVfQURETFNIMV9OQ107CisgIENPUFkgKFRZUEVfQURETFNIMV9OKTsKKyAgcC0+Y2FycnkgPSBDQVJSWV8zOworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRsc2gxX25jKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETFNIMl9OQ107CisgIENPUFkgKFRZUEVfQURETFNIMl9OKTsKKyAgcC0+Y2FycnkgPSBDQVJSWV80OyAvKiBGSVhNRSAqLworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRsc2gyX25jKTsKKworICBwID0gJnBhcmFtW1RZUEVfQURETFNIX05DXTsKKyAgQ09QWSAoVFlQRV9BRERMU0hfTik7CisgIHAtPmNhcnJ5ID0gQ0FSUllfQklUOyAvKiBGSVhNRSAqLworICBSRUZFUkVOQ0UgKHJlZm1wbl9hZGRsc2hfbmMpOworCisgIHAgPSAmcGFyYW1bVFlQRV9TVUJMU0gxX05DXTsKKyAgQ09QWSAoVFlQRV9BRERMU0gxX05DKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fc3VibHNoMV9uYyk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NVQkxTSDJfTkNdOworICBDT1BZIChUWVBFX0FERExTSDJfTkMpOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJsc2gyX25jKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1VCTFNIX05DXTsKKyAgQ09QWSAoVFlQRV9BRERMU0hfTkMpOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zdWJsc2hfbmMpOworCisgIHAgPSAmcGFyYW1bVFlQRV9SU0JMU0gxX05DXTsKKyAgQ09QWSAoVFlQRV9SU0JMU0gxX04pOworICBwLT5jYXJyeSA9IENBUlJZX0JJVDsgLyogRklYTUUgKi8KKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNibHNoMV9uYyk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1JTQkxTSDJfTkNdOworICBDT1BZIChUWVBFX1JTQkxTSDJfTik7CisgIHAtPmNhcnJ5ID0gQ0FSUllfNDsgLyogRklYTUUgKi8KKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNibHNoMl9uYyk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1JTQkxTSF9OQ107CisgIENPUFkgKFRZUEVfUlNCTFNIX04pOworICBwLT5jYXJyeSA9IENBUlJZX0JJVDsgLyogRklYTUUgKi8KKyAgUkVGRVJFTkNFIChyZWZtcG5fcnNibHNoX25jKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9NT0RfMV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPmRpdmlzb3IgPSBESVZJU09SX0xJTUI7CisgIFJFRkVSRU5DRSAocmVmbXBuX21vZF8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfTU9EXzFDXTsKKyAgQ09QWSAoVFlQRV9NT0RfMSk7CisgIHAtPmNhcnJ5ID0gQ0FSUllfRElWSVNPUjsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbW9kXzFjKTsKKworICBwID0gJnBhcmFtW1RZUEVfRElWTU9EXzFdOworICBDT1BZIChUWVBFX01PRF8xKTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fZGl2bW9kXzEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9ESVZNT0RfMUNdOworICBDT1BZIChUWVBFX0RJVk1PRF8xKTsKKyAgcC0+Y2FycnkgPSBDQVJSWV9ESVZJU09SOworICBSRUZFUkVOQ0UgKHJlZm1wbl9kaXZtb2RfMWMpOworCisgIHAgPSAmcGFyYW1bVFlQRV9ESVZSRU1fMV07CisgIENPUFkgKFRZUEVfRElWTU9EXzEpOworICBwLT5zaXplMiA9IFNJWkVfRlJBQ1RJT047CisgIHAtPmRzdF9zaXplWzBdID0gU0laRV9TVU07CisgIFJFRkVSRU5DRSAocmVmbXBuX2RpdnJlbV8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfRElWUkVNXzFDXTsKKyAgQ09QWSAoVFlQRV9ESVZSRU1fMSk7CisgIHAtPmNhcnJ5ID0gQ0FSUllfRElWSVNPUjsKKyAgUkVGRVJFTkNFIChyZWZtcG5fZGl2cmVtXzFjKTsKKworICBwID0gJnBhcmFtW1RZUEVfUFJFSU5WX0RJVlJFTV8xXTsKKyAgQ09QWSAoVFlQRV9ESVZSRU1fMSk7CisgIHAtPnNpemUgPSBTSVpFX1lFUzsgLyogaWUuIG5vIHNpemU9PTAgKi8KKyAgUkVGRVJFTkNFIChyZWZtcG5fcHJlaW52X2RpdnJlbV8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfRElWX1FSXzFOX1BJMV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNyY1sxXSA9IDE7CisgIC8qIFNJWkVfMSBub3Qgc3VwcG9ydGVkLiBBbHdheXMgdXNlcyBsb3cgbGltYiBvbmx5LiAqLworICBwLT5zaXplMiA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPmRpdmlzb3IgPSBESVZJU09SX05PUk07CisgIHAtPmRhdGEgPSBEQVRBX0RJVl9RUl8xOworICBWQUxJREFURSAodmFsaWRhdGVfZGl2X3FyXzFfcGkxKTsKKworICBwID0gJnBhcmFtW1RZUEVfUFJFSU5WX01PRF8xXTsKKyAgcC0+cmV0dmFsID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+ZGl2aXNvciA9IERJVklTT1JfTk9STTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fcHJlaW52X21vZF8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfTU9EXzM0TFNVQjFdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5zcmNbMF0gPSAxOworICBWQUxJREFURSAodmFsaWRhdGVfbW9kXzM0bHN1YjEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9VRElWX1FSTk5EXTsKKyAgcC0+cmV0dmFsID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgcC0+ZHN0X3NpemVbMF0gPSBTSVpFXzE7CisgIHAtPmRpdmlzb3IgPSBVRElWX05FRURTX05PUk1BTElaQVRJT04gPyBESVZJU09SX05PUk0gOiBESVZJU09SX0xJTUI7CisgIHAtPmRhdGEgPSBEQVRBX1VESVZfUVJOTkQ7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX05PTkU7CisgIFJFRkVSRU5DRSAocmVmbXBuX3VkaXZfcXJubmQpOworCisgIHAgPSAmcGFyYW1bVFlQRV9VRElWX1FSTk5EX1JdOworICBDT1BZIChUWVBFX1VESVZfUVJOTkQpOworICBSRUZFUkVOQ0UgKHJlZm1wbl91ZGl2X3Fybm5kX3IpOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX0RJVkVYQUNUXzFdOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5kaXZpc29yID0gRElWSVNPUl9MSU1COworICBwLT5kYXRhID0gREFUQV9NVUxUSVBMRV9ESVZJU09SOworICBWQUxJREFURSAodmFsaWRhdGVfZGl2ZXhhY3RfMSk7CisgIFJFRkVSRU5DRSAocmVmbXBuX2Rpdm1vZF8xKTsKKworICBwID0gJnBhcmFtW1RZUEVfQkRJVl9RXzFdOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5kaXZpc29yID0gRElWSVNPUl9MSU1COworICBWQUxJREFURSAodmFsaWRhdGVfYmRpdl9xXzEpOworCisgIHAgPSAmcGFyYW1bVFlQRV9ESVZFWEFDVF9CWTNdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBSRUZFUkVOQ0UgKHJlZm1wbl9kaXZleGFjdF9ieTMpOworCisgIHAgPSAmcGFyYW1bVFlQRV9ESVZFWEFDVF9CWTNDXTsKKyAgQ09QWSAoVFlQRV9ESVZFWEFDVF9CWTMpOworICBwLT5jYXJyeSA9IENBUlJZXzM7CisgIFJFRkVSRU5DRSAocmVmbXBuX2RpdmV4YWN0X2J5M2MpOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX01PREVYQUNUXzFfT0REXTsKKyAgcC0+cmV0dmFsID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+ZGl2aXNvciA9IERJVklTT1JfT0REOworICBWQUxJREFURSAodmFsaWRhdGVfbW9kZXhhY3RfMV9vZGQpOworCisgIHAgPSAmcGFyYW1bVFlQRV9NT0RFWEFDVF8xQ19PRERdOworICBDT1BZIChUWVBFX01PREVYQUNUXzFfT0REKTsKKyAgcC0+Y2FycnkgPSBDQVJSWV9MSU1COworICBWQUxJREFURSAodmFsaWRhdGVfbW9kZXhhY3RfMWNfb2RkKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9HQ0RfMV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPmRhdGEgPSBEQVRBX05PTl9aRVJPOworICBwLT5kaXZpc29yID0gRElWSVNPUl9MSU1COworICBSRUZFUkVOQ0UgKHJlZm1wbl9nY2RfMSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0dDRF07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNyY1sxXSA9IDE7CisgIHAtPnNpemUyID0gMTsKKyAgcC0+ZHN0X3NpemVbMF0gPSBTSVpFX1JFVFZBTDsKKyAgcC0+b3ZlcmxhcCA9IE9WRVJMQVBfTk9UX1NSQ1M7CisgIHAtPmRhdGEgPSBEQVRBX0dDRDsKKyAgUkVGRVJFTkNFIChyZWZtcG5fZ2NkKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9NUFpfTEVHRU5EUkVdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5zaXplID0gU0laRV9BTExPV19aRVJPOworICBwLT5zcmNbMV0gPSAxOworICBwLT5kYXRhID0gREFUQV9TUkMxX09ERF9QUklNRTsKKyAgcC0+c2l6ZTIgPSAxOworICBwLT5jYXJyeSA9IENBUlJZX0JJVDsKKyAgcC0+Y2Fycnlfc2lnbiA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXB6X2xlZ2VuZHJlKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVBaX0pBQ09CSV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPnNyY1sxXSA9IDE7CisgIHAtPmRhdGEgPSBEQVRBX1NSQzFfT0REOworICBwLT5zaXplMiA9IDE7CisgIHAtPmNhcnJ5ID0gQ0FSUllfQklUOworICBwLT5jYXJyeV9zaWduID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcHpfamFjb2JpKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVBaX0tST05FQ0tFUl07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPnNyY1sxXSA9IDE7CisgIHAtPmRhdGEgPSAwOworICBwLT5zaXplMiA9IDE7CisgIHAtPmNhcnJ5ID0gQ0FSUllfNDsKKyAgcC0+Y2Fycnlfc2lnbiA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXB6X2tyb25lY2tlcik7CisKKworICBwID0gJnBhcmFtW1RZUEVfTVBaX0tST05FQ0tFUl9VSV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPm11bHRpcGxpZXIgPSAxOworICBwLT5jYXJyeSA9IENBUlJZX0JJVDsKKyAgUkVGRVJFTkNFIChyZWZtcHpfa3JvbmVja2VyX3VpKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVBaX0tST05FQ0tFUl9TSV07CisgIENPUFkgKFRZUEVfTVBaX0tST05FQ0tFUl9VSSk7CisgIFJFRkVSRU5DRSAocmVmbXB6X2tyb25lY2tlcl9zaSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX01QWl9VSV9LUk9ORUNLRVJdOworICBDT1BZIChUWVBFX01QWl9LUk9ORUNLRVJfVUkpOworICBSRUZFUkVOQ0UgKHJlZm1wel91aV9rcm9uZWNrZXIpOworCisgIHAgPSAmcGFyYW1bVFlQRV9NUFpfU0lfS1JPTkVDS0VSXTsKKyAgQ09QWSAoVFlQRV9NUFpfS1JPTkVDS0VSX1VJKTsKKyAgUkVGRVJFTkNFIChyZWZtcHpfc2lfa3JvbmVja2VyKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9TUVJdOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5kc3Rfc2l6ZVswXSA9IFNJWkVfU1VNOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl9zcXIpOworCisgIHAgPSAmcGFyYW1bVFlQRV9NVUxfTl07CisgIENPUFkgKFRZUEVfU1FSKTsKKyAgcC0+c3JjWzFdID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbXVsX24pOworCisgIHAgPSAmcGFyYW1bVFlQRV9NVUxMT19OXTsKKyAgQ09QWSAoVFlQRV9NVUxfTik7CisgIHAtPmRzdF9zaXplWzBdID0gMDsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbXVsbG9fbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NRUkxPXTsKKyAgQ09QWSAoVFlQRV9TUVIpOworICBwLT5kc3Rfc2l6ZVswXSA9IDA7CisgIFJFRkVSRU5DRSAocmVmbXBuX3NxcmxvKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVVMX01OXTsKKyAgQ09QWSAoVFlQRV9NVUxfTik7CisgIHAtPnNpemUyID0gMTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fbXVsX2Jhc2VjYXNlKTsKKworICBwID0gJnBhcmFtW1RZUEVfTVVMTUlEX01OXTsKKyAgQ09QWSAoVFlQRV9NVUxfTU4pOworICBwLT5kc3Rfc2l6ZVswXSA9IFNJWkVfRElGRl9QTFVTXzM7CisgIFJFRkVSRU5DRSAocmVmbXBuX211bG1pZF9iYXNlY2FzZSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX01VTE1JRF9OXTsKKyAgQ09QWSAoVFlQRV9NVUxfTik7CisgIHAtPnNpemUgPSBTSVpFX09ERDsKKyAgcC0+c2l6ZTIgPSBTSVpFX0NFSUxfSEFMRjsKKyAgcC0+ZHN0X3NpemVbMF0gPSBTSVpFX0RJRkZfUExVU18zOworICBSRUZFUkVOQ0UgKHJlZm1wbl9tdWxtaWRfbik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1VNVUxfUFBNTV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPmRzdF9zaXplWzBdID0gU0laRV8xOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl91bXVsX3BwbW0pOworCisgIHAgPSAmcGFyYW1bVFlQRV9VTVVMX1BQTU1fUl07CisgIENPUFkgKFRZUEVfVU1VTF9QUE1NKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fdW11bF9wcG1tX3IpOworCisKKyAgcCA9ICZwYXJhbVtUWVBFX1JTSElGVF07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNoaWZ0ID0gMTsKKyAgcC0+b3ZlcmxhcCA9IE9WRVJMQVBfTE9XX1RPX0hJR0g7CisgIFJFRkVSRU5DRSAocmVmbXBuX3JzaGlmdCk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0xTSElGVF07CisgIENPUFkgKFRZUEVfUlNISUZUKTsKKyAgcC0+b3ZlcmxhcCA9IE9WRVJMQVBfSElHSF9UT19MT1c7CisgIFJFRkVSRU5DRSAocmVmbXBuX2xzaGlmdCk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX0xTSElGVENdOworICBDT1BZIChUWVBFX1JTSElGVCk7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX0hJR0hfVE9fTE9XOworICBSRUZFUkVOQ0UgKHJlZm1wbl9sc2hpZnRjKTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9QT1BDT1VOVF07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIFJFRkVSRU5DRSAocmVmbXBuX3BvcGNvdW50KTsKKworICBwID0gJnBhcmFtW1RZUEVfSEFNRElTVF07CisgIENPUFkgKFRZUEVfUE9QQ09VTlQpOworICBwLT5zcmNbMV0gPSAxOworICBSRUZFUkVOQ0UgKHJlZm1wbl9oYW1kaXN0KTsKKworCisgIHAgPSAmcGFyYW1bVFlQRV9TQlBJMV9ESVZfUVJdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3RbMV0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5zcmNbMV0gPSAxOworICBwLT5kYXRhID0gREFUQV9TUkMxX0hJR0hCSVQ7CisgIHAtPnNpemUyID0gMTsKKyAgcC0+ZHN0X3NpemVbMF0gPSBTSVpFX0RJRkY7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX05PTkU7CisgIFJFRkVSRU5DRSAocmVmbXBuX3NiX2Rpdl9xcik7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1RESVZfUVJdOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3RbMV0gPSAxOworICBwLT5zcmNbMF0gPSAxOworICBwLT5zcmNbMV0gPSAxOworICBwLT5zaXplMiA9IDE7CisgIHAtPmRzdF9zaXplWzBdID0gU0laRV9ESUZGX1BMVVNfMTsKKyAgcC0+ZHN0X3NpemVbMV0gPSBTSVpFX1NJWkUyOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl90ZGl2X3FyKTsKKworICBwID0gJnBhcmFtW1RZUEVfU1FSVFJFTV07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPmRzdFsxXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPmRzdF9zaXplWzBdID0gU0laRV9DRUlMX0hBTEY7CisgIHAtPmRzdF9zaXplWzFdID0gU0laRV9SRVRWQUw7CisgIHAtPm92ZXJsYXAgPSBPVkVSTEFQX05PTkU7CisgIFZBTElEQVRFICh2YWxpZGF0ZV9zcXJ0cmVtKTsKKyAgUkVGRVJFTkNFIChyZWZtcG5fc3FydHJlbSk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1NRUlRdOworICBwLT5yZXR2YWwgPSAxOworICBwLT5kc3RbMF0gPSAxOworICBwLT5kc3RbMV0gPSAwOworICBwLT5zcmNbMF0gPSAxOworICBwLT5kc3Rfc2l6ZVswXSA9IFNJWkVfQ0VJTF9IQUxGOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBWQUxJREFURSAodmFsaWRhdGVfc3FydCk7CisKKyAgcCA9ICZwYXJhbVtUWVBFX1pFUk9dOworICBwLT5kc3RbMF0gPSAxOworICBwLT5zaXplID0gU0laRV9BTExPV19aRVJPOworICBSRUZFUkVOQ0UgKHJlZm1wbl96ZXJvKTsKKworICBwID0gJnBhcmFtW1RZUEVfR0VUX1NUUl07CisgIHAtPnJldHZhbCA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPnNpemUgPSBTSVpFX0FMTE9XX1pFUk87CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPmRzdFsxXSA9IDE7CisgIHAtPmRzdF9zaXplWzBdID0gU0laRV9HRVRfU1RSOworICBwLT5kc3RfYnl0ZXNbMF0gPSAxOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl9nZXRfc3RyKTsKKworICBwID0gJnBhcmFtW1RZUEVfQklOVkVSVF07CisgIHAtPmRzdFswXSA9IDE7CisgIHAtPnNyY1swXSA9IDE7CisgIHAtPmRhdGEgPSBEQVRBX1NSQzBfT0REOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl9iaW52ZXJ0KTsKKworICBwID0gJnBhcmFtW1RZUEVfSU5WRVJUXTsKKyAgcC0+ZHN0WzBdID0gMTsKKyAgcC0+c3JjWzBdID0gMTsKKyAgcC0+ZGF0YSA9IERBVEFfU1JDMF9ISUdIQklUOworICBwLT5vdmVybGFwID0gT1ZFUkxBUF9OT05FOworICBSRUZFUkVOQ0UgKHJlZm1wbl9pbnZlcnQpOworCisjaWZkZWYgRVhUUkFfUEFSQU1fSU5JVAorICBFWFRSQV9QQVJBTV9JTklUCisjZW5kaWYKK30KKworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBtYWNyb3MgaWYgdGhlcmUncyBubyBuYXRpdmUgdmVyc2lvbnMsIHNvIHdyYXAgdGhlbSBpbgorICAgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGluIHRyeV9hcnJheVtdLiAqLworCit2b2lkCitNUE5fQ09QWV9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sgTVBOX0NPUFkgKHJwLCBzcCwgc2l6ZSk7IH0KKwordm9pZAorTVBOX0NPUFlfSU5DUl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sgTVBOX0NPUFlfSU5DUiAocnAsIHNwLCBzaXplKTsgfQorCit2b2lkCitNUE5fQ09QWV9ERUNSX2Z1biAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplKQoreyBNUE5fQ09QWV9ERUNSIChycCwgc3AsIHNpemUpOyB9CisKK3ZvaWQKK19fR01QTl9DT1BZX2Z1biAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplKQoreyBfX0dNUE5fQ09QWSAocnAsIHNwLCBzaXplKTsgfQorCisjaWZkZWYgX19HTVBOX0NPUFlfSU5DUgordm9pZAorX19HTVBOX0NPUFlfSU5DUl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sgX19HTVBOX0NPUFlfSU5DUiAocnAsIHNwLCBzaXplKTsgfQorI2VuZGlmCisKK3ZvaWQKK21wbl9jb21fZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUpCit7IG1wbl9jb20gKHJwLCBzcCwgc2l6ZSk7IH0KKwordm9pZAorbXBuX2FuZF9uX2Z1biAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczEsIG1wX3NyY3B0ciBzMiwgbXBfc2l6ZV90IHNpemUpCit7IG1wbl9hbmRfbiAocnAsIHMxLCBzMiwgc2l6ZSk7IH0KKwordm9pZAorbXBuX2FuZG5fbl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxLCBtcF9zcmNwdHIgczIsIG1wX3NpemVfdCBzaXplKQoreyBtcG5fYW5kbl9uIChycCwgczEsIHMyLCBzaXplKTsgfQorCit2b2lkCittcG5fbmFuZF9uX2Z1biAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczEsIG1wX3NyY3B0ciBzMiwgbXBfc2l6ZV90IHNpemUpCit7IG1wbl9uYW5kX24gKHJwLCBzMSwgczIsIHNpemUpOyB9CisKK3ZvaWQKK21wbl9pb3Jfbl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxLCBtcF9zcmNwdHIgczIsIG1wX3NpemVfdCBzaXplKQoreyBtcG5faW9yX24gKHJwLCBzMSwgczIsIHNpemUpOyB9CisKK3ZvaWQKK21wbl9pb3JuX25fZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMSwgbXBfc3JjcHRyIHMyLCBtcF9zaXplX3Qgc2l6ZSkKK3sgbXBuX2lvcm5fbiAocnAsIHMxLCBzMiwgc2l6ZSk7IH0KKwordm9pZAorbXBuX25pb3Jfbl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxLCBtcF9zcmNwdHIgczIsIG1wX3NpemVfdCBzaXplKQoreyBtcG5fbmlvcl9uIChycCwgczEsIHMyLCBzaXplKTsgfQorCit2b2lkCittcG5feG9yX25fZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMSwgbXBfc3JjcHRyIHMyLCBtcF9zaXplX3Qgc2l6ZSkKK3sgbXBuX3hvcl9uIChycCwgczEsIHMyLCBzaXplKTsgfQorCit2b2lkCittcG5feG5vcl9uX2Z1biAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczEsIG1wX3NyY3B0ciBzMiwgbXBfc2l6ZV90IHNpemUpCit7IG1wbl94bm9yX24gKHJwLCBzMSwgczIsIHNpemUpOyB9CisKK21wX2xpbWJfdAordWRpdl9xcm5uZF9mdW4gKG1wX2xpbWJfdCAqcmVtcHRyLCBtcF9saW1iX3QgbjEsIG1wX2xpbWJfdCBuMCwgbXBfbGltYl90IGQpCit7CisgIG1wX2xpbWJfdCAgcTsKKyAgdWRpdl9xcm5uZCAocSwgKnJlbXB0ciwgbjEsIG4wLCBkKTsKKyAgcmV0dXJuIHE7Cit9CisKK21wX2xpbWJfdAorbXBuX2RpdmV4YWN0X2J5M19mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIG1wbl9kaXZleGFjdF9ieTMgKHJwLCBzcCwgc2l6ZSk7Cit9CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorbXBfbGltYl90CittcG5fYWRkbHNoMV9uX2lwMV9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIG1wbl9hZGRsc2gxX25faXAxIChycCwgc3AsIHNpemUpOworfQorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbl9pcDEKK21wX2xpbWJfdAorbXBuX2FkZGxzaDJfbl9pcDFfZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBtcG5fYWRkbHNoMl9uX2lwMSAocnAsIHNwLCBzaXplKTsKK30KKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbl9pcDEKK21wX2xpbWJfdAorbXBuX2FkZGxzaF9uX2lwMV9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHNoKQoreworICByZXR1cm4gbXBuX2FkZGxzaF9uX2lwMSAocnAsIHNwLCBzaXplLCBzaCk7Cit9CisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMgorbXBfbGltYl90CittcG5fYWRkbHNoMV9uX2lwMl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIG1wbl9hZGRsc2gxX25faXAyIChycCwgc3AsIHNpemUpOworfQorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaDJfbl9pcDIKK21wX2xpbWJfdAorbXBuX2FkZGxzaDJfbl9pcDJfZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBtcG5fYWRkbHNoMl9uX2lwMiAocnAsIHNwLCBzaXplKTsKK30KKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbl9pcDIKK21wX2xpbWJfdAorbXBuX2FkZGxzaF9uX2lwMl9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHNoKQoreworICByZXR1cm4gbXBuX2FkZGxzaF9uX2lwMiAocnAsIHNwLCBzaXplLCBzaCk7Cit9CisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uX2lwMQorbXBfbGltYl90CittcG5fc3VibHNoMV9uX2lwMV9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIG1wbl9zdWJsc2gxX25faXAxIChycCwgc3AsIHNpemUpOworfQorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbl9pcDEKK21wX2xpbWJfdAorbXBuX3N1YmxzaDJfbl9pcDFfZnVuIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBtcG5fc3VibHNoMl9uX2lwMSAocnAsIHNwLCBzaXplKTsKK30KKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2hfbl9pcDEKK21wX2xpbWJfdAorbXBuX3N1YmxzaF9uX2lwMV9mdW4gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHNoKQoreworICByZXR1cm4gbXBuX3N1YmxzaF9uX2lwMSAocnAsIHNwLCBzaXplLCBzaCk7Cit9CisjZW5kaWYKKworbXBfbGltYl90CittcG5fbW9kZXhhY3RfMV9vZGRfZnVuIChtcF9zcmNwdHIgcHRyLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRpdmlzb3IpCit7CisgIHJldHVybiBtcG5fbW9kZXhhY3RfMV9vZGQgKHB0ciwgc2l6ZSwgZGl2aXNvcik7Cit9CisKK3ZvaWQKK21wbl90b29tMjJfbXVsX2Z1biAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYzEsIG1wX3NyY3B0ciBzcmMyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICB0c3BhY2U7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKyAgdHNwYWNlID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbTIyX211bF9pdGNoIChzaXplLCBzaXplKSk7CisgIG1wbl90b29tMjJfbXVsIChkc3QsIHNyYzEsIHNpemUsIHNyYzIsIHNpemUsIHRzcGFjZSk7CisgIFRNUF9GUkVFOworfQordm9pZAorbXBuX3Rvb20yX3Nxcl9mdW4gKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9wdHIgdHNwYWNlOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisgIHRzcGFjZSA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3Rvb20yX3Nxcl9pdGNoIChzaXplKSk7CisgIG1wbl90b29tMl9zcXIgKGRzdCwgc3JjLCBzaXplLCB0c3BhY2UpOworICBUTVBfRlJFRTsKK30KK3ZvaWQKK21wbl90b29tMzNfbXVsX2Z1biAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYzEsIG1wX3NyY3B0ciBzcmMyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICB0c3BhY2U7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKyAgdHNwYWNlID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbTMzX211bF9pdGNoIChzaXplLCBzaXplKSk7CisgIG1wbl90b29tMzNfbXVsIChkc3QsIHNyYzEsIHNpemUsIHNyYzIsIHNpemUsIHRzcGFjZSk7CisgIFRNUF9GUkVFOworfQordm9pZAorbXBuX3Rvb20zX3Nxcl9mdW4gKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9wdHIgdHNwYWNlOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisgIHRzcGFjZSA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3Rvb20zX3Nxcl9pdGNoIChzaXplKSk7CisgIG1wbl90b29tM19zcXIgKGRzdCwgc3JjLCBzaXplLCB0c3BhY2UpOworICBUTVBfRlJFRTsKK30KK3ZvaWQKK21wbl90b29tNDRfbXVsX2Z1biAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYzEsIG1wX3NyY3B0ciBzcmMyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICB0c3BhY2U7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKyAgdHNwYWNlID0gVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbTQ0X211bF9pdGNoIChzaXplLCBzaXplKSk7CisgIG1wbl90b29tNDRfbXVsIChkc3QsIHNyYzEsIHNpemUsIHNyYzIsIHNpemUsIHRzcGFjZSk7CisgIFRNUF9GUkVFOworfQordm9pZAorbXBuX3Rvb200X3Nxcl9mdW4gKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9wdHIgdHNwYWNlOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisgIHRzcGFjZSA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3Rvb200X3Nxcl9pdGNoIChzaXplKSk7CisgIG1wbl90b29tNF9zcXIgKGRzdCwgc3JjLCBzaXplLCB0c3BhY2UpOworICBUTVBfRlJFRTsKK30KKwordm9pZAorbXBuX3Rvb200Ml9tdWxtaWRfZnVuIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjMSwgbXBfc3JjcHRyIHNyYzIsCisJCSAgICAgICBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICB0c3BhY2U7CisgIG1wX3NpemVfdCBuOworICBUTVBfREVDTDsKKyAgVE1QX01BUks7CisgIHRzcGFjZSA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3Rvb200Ml9tdWxtaWRfaXRjaCAoc2l6ZSkpOworICBtcG5fdG9vbTQyX211bG1pZCAoZHN0LCBzcmMxLCBzcmMyLCBzaXplLCB0c3BhY2UpOworICBUTVBfRlJFRTsKK30KKworbXBfbGltYl90Cit1bXVsX3BwbW1fZnVuIChtcF9saW1iX3QgKmxvd3B0ciwgbXBfbGltYl90IG0xLCBtcF9saW1iX3QgbTIpCit7CisgIG1wX2xpbWJfdCAgaGlnaDsKKyAgdW11bF9wcG1tIChoaWdoLCAqbG93cHRyLCBtMSwgbTIpOworICByZXR1cm4gaGlnaDsKK30KKwordm9pZAorTVBOX1pFUk9fZnVuIChtcF9wdHIgcHRyLCBtcF9zaXplX3Qgc2l6ZSkKK3sgTVBOX1pFUk8gKHB0ciwgc2l6ZSk7IH0KKworbXBfc2l6ZV90CittcG5fc3FydF9mdW4gKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreyByZXR1cm4gbXBuX3NxcnRyZW0gKGRzdCwgTlVMTCwgc3JjLCBzaXplKTsgfQorCitzdHJ1Y3QgY2hvaWNlX3QgeworICBjb25zdCBjaGFyICAqbmFtZTsKKyAgdHJ5ZnVuX3QgICAgZnVuY3Rpb247CisgIGludCAgICAgICAgIHR5cGU7CisgIG1wX3NpemVfdCAgIG1pbnNpemU7Cit9OworCisjZGVmaW5lIFRSWShmdW4pICAgICAgICAjZnVuLCAodHJ5ZnVuX3QpIGZ1bgorI2RlZmluZSBUUllfRlVORlVOKGZ1bikgI2Z1biwgKHRyeWZ1bl90KSBmdW4jI19mdW4KKworY29uc3Qgc3RydWN0IGNob2ljZV90IGNob2ljZV9hcnJheVtdID0geworICB7IFRSWShtcG5fYWRkKSwgICAgICAgVFlQRV9BREQgICAgfSwKKyAgeyBUUlkobXBuX3N1YiksICAgICAgIFRZUEVfU1VCICAgIH0sCisKKyAgeyBUUlkobXBuX2FkZF9uKSwgICAgIFRZUEVfQUREX04gIH0sCisgIHsgVFJZKG1wbl9zdWJfbiksICAgICBUWVBFX1NVQl9OICB9LAorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZF9uYworICB7IFRSWShtcG5fYWRkX25jKSwgICAgVFlQRV9BRERfTkMgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJfbmMKKyAgeyBUUlkobXBuX3N1Yl9uYyksICAgIFRZUEVfU1VCX05DIH0sCisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbgorICB7IFRSWShtcG5fYWRkX25fc3ViX24pLCAgVFlQRV9BRERTVUJfTiAgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbl9zdWJfbmMKKyAgeyBUUlkobXBuX2FkZF9uX3N1Yl9uYyksIFRZUEVfQUREU1VCX05DIH0sCisjZW5kaWYKKworICB7IFRSWShtcG5fYWRkX2VycjFfbiksICBUWVBFX0FERF9FUlIxX04gIH0sCisgIHsgVFJZKG1wbl9zdWJfZXJyMV9uKSwgIFRZUEVfU1VCX0VSUjFfTiAgfSwKKyAgeyBUUlkobXBuX2FkZF9lcnIyX24pLCAgVFlQRV9BRERfRVJSMl9OICB9LAorICB7IFRSWShtcG5fc3ViX2VycjJfbiksICBUWVBFX1NVQl9FUlIyX04gIH0sCisgIHsgVFJZKG1wbl9hZGRfZXJyM19uKSwgIFRZUEVfQUREX0VSUjNfTiAgfSwKKyAgeyBUUlkobXBuX3N1Yl9lcnIzX24pLCAgVFlQRV9TVUJfRVJSM19OICB9LAorCisgIHsgVFJZKG1wbl9hZGRtdWxfMSksICBUWVBFX0FERE1VTF8xICB9LAorICB7IFRSWShtcG5fc3VibXVsXzEpLCAgVFlQRV9TVUJNVUxfMSAgfSwKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzFjCisgIHsgVFJZKG1wbl9hZGRtdWxfMWMpLCBUWVBFX0FERE1VTF8xQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1Ym11bF8xYworICB7IFRSWShtcG5fc3VibXVsXzFjKSwgVFlQRV9TVUJNVUxfMUMgfSwKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF8yCisgIHsgVFJZKG1wbl9hZGRtdWxfMiksIFRZUEVfQURETVVMXzIsIDIgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRtdWxfMworICB7IFRSWShtcG5fYWRkbXVsXzMpLCBUWVBFX0FERE1VTF8zLCAzIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzQKKyAgeyBUUlkobXBuX2FkZG11bF80KSwgVFlQRV9BRERNVUxfNCwgNCB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF81CisgIHsgVFJZKG1wbl9hZGRtdWxfNSksIFRZUEVfQURETVVMXzUsIDUgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRtdWxfNgorICB7IFRSWShtcG5fYWRkbXVsXzYpLCBUWVBFX0FERE1VTF82LCA2IH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzcKKyAgeyBUUlkobXBuX2FkZG11bF83KSwgVFlQRV9BRERNVUxfNywgNyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZG11bF84CisgIHsgVFJZKG1wbl9hZGRtdWxfOCksIFRZUEVfQURETVVMXzgsIDggfSwKKyNlbmRpZgorCisgIHsgVFJZX0ZVTkZVTihtcG5fY29tKSwgIFRZUEVfQ09NIH0sCisKKyAgeyBUUllfRlVORlVOKE1QTl9DT1BZKSwgICAgICBUWVBFX0NPUFkgfSwKKyAgeyBUUllfRlVORlVOKE1QTl9DT1BZX0lOQ1IpLCBUWVBFX0NPUFlJIH0sCisgIHsgVFJZX0ZVTkZVTihNUE5fQ09QWV9ERUNSKSwgVFlQRV9DT1BZRCB9LAorCisgIHsgVFJZX0ZVTkZVTihfX0dNUE5fQ09QWSksICAgICAgVFlQRV9DT1BZIH0sCisjaWZkZWYgX19HTVBOX0NPUFlfSU5DUgorICB7IFRSWV9GVU5GVU4oX19HTVBOX0NPUFlfSU5DUiksIFRZUEVfQ09QWUkgfSwKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2NvcHlpCisgIHsgVFJZKG1wbl9jb3B5aSksIFRZUEVfQ09QWUkgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9jb3B5ZAorICB7IFRSWShtcG5fY29weWQpLCBUWVBFX0NPUFlEIH0sCisjZW5kaWYKKworICB7IFRSWShtcG5fY25kX2FkZF9uKSwgVFlQRV9BRERDTkRfTiB9LAorICB7IFRSWShtcG5fY25kX3N1Yl9uKSwgVFlQRV9TVUJDTkRfTiB9LAorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gxX24gPT0gMQorICB7IFRSWShtcG5fYWRkbHNoMV9uKSwgVFlQRV9BRERMU0gxX04gfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX24gPT0gMQorICB7IFRSWShtcG5fYWRkbHNoMl9uKSwgVFlQRV9BRERMU0gyX04gfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2hfbgorICB7IFRSWShtcG5fYWRkbHNoX24pLCBUWVBFX0FERExTSF9OIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMQorICB7IFRSWV9GVU5GVU4obXBuX2FkZGxzaDFfbl9pcDEpLCBUWVBFX0FERExTSDFfTl9JUDEgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25faXAxCisgIHsgVFJZX0ZVTkZVTihtcG5fYWRkbHNoMl9uX2lwMSksIFRZUEVfQURETFNIMl9OX0lQMSB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uX2lwMQorICB7IFRSWV9GVU5GVU4obXBuX2FkZGxzaF9uX2lwMSksIFRZUEVfQURETFNIX05fSVAxIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uX2lwMgorICB7IFRSWV9GVU5GVU4obXBuX2FkZGxzaDFfbl9pcDIpLCBUWVBFX0FERExTSDFfTl9JUDIgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRsc2gyX25faXAyCisgIHsgVFJZX0ZVTkZVTihtcG5fYWRkbHNoMl9uX2lwMiksIFRZUEVfQURETFNIMl9OX0lQMiB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FkZGxzaF9uX2lwMgorICB7IFRSWV9GVU5GVU4obXBuX2FkZGxzaF9uX2lwMiksIFRZUEVfQURETFNIX05fSVAyIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uID09IDEKKyAgeyBUUlkobXBuX3N1YmxzaDFfbiksIFRZUEVfU1VCTFNIMV9OIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMl9uID09IDEKKyAgeyBUUlkobXBuX3N1YmxzaDJfbiksIFRZUEVfU1VCTFNIMl9OIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoX24KKyAgeyBUUlkobXBuX3N1YmxzaF9uKSwgVFlQRV9TVUJMU0hfTiB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbl9pcDEKKyAgeyBUUllfRlVORlVOKG1wbl9zdWJsc2gxX25faXAxKSwgVFlQRV9TVUJMU0gxX05fSVAxIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMl9uX2lwMQorICB7IFRSWV9GVU5GVU4obXBuX3N1YmxzaDJfbl9pcDEpLCBUWVBFX1NVQkxTSDJfTl9JUDEgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJsc2hfbl9pcDEKKyAgeyBUUllfRlVORlVOKG1wbl9zdWJsc2hfbl9pcDEpLCBUWVBFX1NVQkxTSF9OX0lQMSB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDFfbiA9PSAxCisgIHsgVFJZKG1wbl9yc2Jsc2gxX24pLCBUWVBFX1JTQkxTSDFfTiB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaDJfbiA9PSAxCisgIHsgVFJZKG1wbl9yc2Jsc2gyX24pLCBUWVBFX1JTQkxTSDJfTiB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaF9uCisgIHsgVFJZKG1wbl9yc2Jsc2hfbiksIFRZUEVfUlNCTFNIX04gfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9yc2gxYWRkX24KKyAgeyBUUlkobXBuX3JzaDFhZGRfbiksIFRZUEVfUlNIMUFERF9OIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisgIHsgVFJZKG1wbl9yc2gxc3ViX24pLCBUWVBFX1JTSDFTVUJfTiB9LAorI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uYyA9PSAxCisgIHsgVFJZKG1wbl9hZGRsc2gxX25jKSwgVFlQRV9BRERMU0gxX05DIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMl9uYyA9PSAxCisgIHsgVFJZKG1wbl9hZGRsc2gyX25jKSwgVFlQRV9BRERMU0gyX05DIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoX25jCisgIHsgVFJZKG1wbl9hZGRsc2hfbmMpLCBUWVBFX0FERExTSF9OQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDFfbmMgPT0gMQorICB7IFRSWShtcG5fc3VibHNoMV9uYyksIFRZUEVfU1VCTFNIMV9OQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaDJfbmMgPT0gMQorICB7IFRSWShtcG5fc3VibHNoMl9uYyksIFRZUEVfU1VCTFNIMl9OQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1YmxzaF9uYworICB7IFRSWShtcG5fc3VibHNoX25jKSwgVFlQRV9TVUJMU0hfTkMgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9yc2Jsc2gxX25jCisgIHsgVFJZKG1wbl9yc2Jsc2gxX25jKSwgVFlQRV9SU0JMU0gxX05DIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNibHNoMl9uYworICB7IFRSWShtcG5fcnNibHNoMl9uYyksIFRZUEVfUlNCTFNIMl9OQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzYmxzaF9uYworICB7IFRSWShtcG5fcnNibHNoX25jKSwgVFlQRV9SU0JMU0hfTkMgfSwKKyNlbmRpZgorCisgIHsgVFJZX0ZVTkZVTihtcG5fYW5kX24pLCAgVFlQRV9BTkRfTiAgfSwKKyAgeyBUUllfRlVORlVOKG1wbl9hbmRuX24pLCBUWVBFX0FORE5fTiB9LAorICB7IFRSWV9GVU5GVU4obXBuX25hbmRfbiksIFRZUEVfTkFORF9OIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5faW9yX24pLCAgVFlQRV9JT1JfTiAgfSwKKyAgeyBUUllfRlVORlVOKG1wbl9pb3JuX24pLCBUWVBFX0lPUk5fTiB9LAorICB7IFRSWV9GVU5GVU4obXBuX25pb3JfbiksIFRZUEVfTklPUl9OIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5feG9yX24pLCAgVFlQRV9YT1JfTiAgfSwKKyAgeyBUUllfRlVORlVOKG1wbl94bm9yX24pLCBUWVBFX1hOT1JfTiB9LAorCisgIHsgVFJZKG1wbl9kaXZyZW1fMSksICAgICBUWVBFX0RJVlJFTV8xIH0sCisjaWYgVVNFX1BSRUlOVl9ESVZSRU1fMQorICB7IFRSWShtcG5fcHJlaW52X2RpdnJlbV8xKSwgVFlQRV9QUkVJTlZfRElWUkVNXzEgfSwKKyNlbmRpZgorICB7IFRSWShtcG5fbW9kXzEpLCAgICAgICAgVFlQRV9NT0RfMSB9LAorI2lmIFVTRV9QUkVJTlZfTU9EXzEKKyAgeyBUUlkobXBuX3ByZWludl9tb2RfMSksIFRZUEVfUFJFSU5WX01PRF8xIH0sCisjZW5kaWYKKyNpZiBIQVZFX05BVElWRV9tcG5fZGl2cmVtXzFjCisgIHsgVFJZKG1wbl9kaXZyZW1fMWMpLCAgICBUWVBFX0RJVlJFTV8xQyB9LAorI2VuZGlmCisjaWYgSEFWRV9OQVRJVkVfbXBuX21vZF8xYworICB7IFRSWShtcG5fbW9kXzFjKSwgICAgICAgVFlQRV9NT0RfMUMgfSwKKyNlbmRpZgorICB7IFRSWShtcG5fZGl2X3FyXzFuX3BpMSksIFRZUEVfRElWX1FSXzFOX1BJMSB9LAorI2lmIEdNUF9OVU1CX0JJVFMgJSA0ID09IDAKKyAgeyBUUlkobXBuX21vZF8zNGxzdWIxKSwgIFRZUEVfTU9EXzM0TFNVQjEgfSwKKyNlbmRpZgorCisgIHsgVFJZX0ZVTkZVTih1ZGl2X3Fybm5kKSwgVFlQRV9VRElWX1FSTk5ELCAyIH0sCisjaWYgSEFWRV9OQVRJVkVfbXBuX3VkaXZfcXJubmQKKyAgeyBUUlkobXBuX3VkaXZfcXJubmQpLCAgICBUWVBFX1VESVZfUVJOTkQsIDIgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl91ZGl2X3Fybm5kX3IKKyAgeyBUUlkobXBuX3VkaXZfcXJubmRfciksICBUWVBFX1VESVZfUVJOTkRfUiwgMiB9LAorI2VuZGlmCisKKyAgeyBUUlkobXBuX2RpdmV4YWN0XzEpLCAgICAgICAgICBUWVBFX0RJVkVYQUNUXzEgfSwKKyAgeyBUUlkobXBuX2JkaXZfcV8xKSwgICAgICAgICAgICBUWVBFX0JESVZfUV8xIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5fZGl2ZXhhY3RfYnkzKSwgVFlQRV9ESVZFWEFDVF9CWTMgfSwKKyAgeyBUUlkobXBuX2RpdmV4YWN0X2J5M2MpLCAgICAgICBUWVBFX0RJVkVYQUNUX0JZM0MgfSwKKworICB7IFRSWV9GVU5GVU4obXBuX21vZGV4YWN0XzFfb2RkKSwgVFlQRV9NT0RFWEFDVF8xX09ERCB9LAorICB7IFRSWShtcG5fbW9kZXhhY3RfMWNfb2RkKSwgICAgICAgVFlQRV9NT0RFWEFDVF8xQ19PREQgfSwKKworCisgIHsgVFJZKG1wbl9zYnBpMV9kaXZfcXIpLCBUWVBFX1NCUEkxX0RJVl9RUiwgM30sCisgIHsgVFJZKG1wbl90ZGl2X3FyKSwgICAgICBUWVBFX1RESVZfUVIgfSwKKworICB7IFRSWShtcG5fbXVsXzEpLCAgICAgIFRZUEVfTVVMXzEgfSwKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzFjCisgIHsgVFJZKG1wbl9tdWxfMWMpLCAgICAgVFlQRV9NVUxfMUMgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMgorICB7IFRSWShtcG5fbXVsXzIpLCAgICAgIFRZUEVfTVVMXzIsIDIgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMworICB7IFRSWShtcG5fbXVsXzMpLCAgICAgIFRZUEVfTVVMXzMsIDMgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfNAorICB7IFRSWShtcG5fbXVsXzQpLCAgICAgIFRZUEVfTVVMXzQsIDQgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfNQorICB7IFRSWShtcG5fbXVsXzUpLCAgICAgIFRZUEVfTVVMXzUsIDUgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfNgorICB7IFRSWShtcG5fbXVsXzYpLCAgICAgIFRZUEVfTVVMXzYsIDYgfSwKKyNlbmRpZgorCisgIHsgVFJZKG1wbl9yc2hpZnQpLCAgICAgVFlQRV9SU0hJRlQgfSwKKyAgeyBUUlkobXBuX2xzaGlmdCksICAgICBUWVBFX0xTSElGVCB9LAorICB7IFRSWShtcG5fbHNoaWZ0YyksICAgIFRZUEVfTFNISUZUQyB9LAorCisKKyAgeyBUUlkobXBuX211bF9iYXNlY2FzZSksIFRZUEVfTVVMX01OIH0sCisgIHsgVFJZKG1wbl9tdWxtaWRfYmFzZWNhc2UpLCBUWVBFX01VTE1JRF9NTiB9LAorICB7IFRSWShtcG5fbXVsbG9fYmFzZWNhc2UpLCBUWVBFX01VTExPX04gfSwKKyAgeyBUUlkobXBuX3NxcmxvX2Jhc2VjYXNlKSwgVFlQRV9TUVJMTyB9LAorICB7IFRSWShtcG5fc3FybG8pLCBUWVBFX1NRUkxPIH0sCisjaWYgU1FSX1RPT00yX1RIUkVTSE9MRCA+IDAKKyAgeyBUUlkobXBuX3Nxcl9iYXNlY2FzZSksIFRZUEVfU1FSIH0sCisjZW5kaWYKKworICB7IFRSWShtcG5fbXVsKSwgICAgVFlQRV9NVUxfTU4gfSwKKyAgeyBUUlkobXBuX211bF9uKSwgIFRZUEVfTVVMX04gfSwKKyAgeyBUUlkobXBuX3NxciksICAgIFRZUEVfU1FSIH0sCisKKyAgeyBUUllfRlVORlVOKHVtdWxfcHBtbSksIFRZUEVfVU1VTF9QUE1NLCAyIH0sCisjaWYgSEFWRV9OQVRJVkVfbXBuX3VtdWxfcHBtbQorICB7IFRSWShtcG5fdW11bF9wcG1tKSwgICAgVFlQRV9VTVVMX1BQTU0sIDIgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkFUSVZFX21wbl91bXVsX3BwbW1fcgorICB7IFRSWShtcG5fdW11bF9wcG1tX3IpLCAgVFlQRV9VTVVMX1BQTU1fUiwgMiB9LAorI2VuZGlmCisKKyAgeyBUUllfRlVORlVOKG1wbl90b29tMjJfbXVsKSwgIFRZUEVfTVVMX04sICBNUE5fVE9PTTIyX01VTF9NSU5TSVpFIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5fdG9vbTJfc3FyKSwgICBUWVBFX1NRUiwgICAgTVBOX1RPT00yX1NRUl9NSU5TSVpFIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5fdG9vbTMzX211bCksICBUWVBFX01VTF9OLCAgTVBOX1RPT00zM19NVUxfTUlOU0laRSB9LAorICB7IFRSWV9GVU5GVU4obXBuX3Rvb20zX3NxciksICAgVFlQRV9TUVIsICAgIE1QTl9UT09NM19TUVJfTUlOU0laRSB9LAorICB7IFRSWV9GVU5GVU4obXBuX3Rvb200NF9tdWwpLCAgVFlQRV9NVUxfTiwgIE1QTl9UT09NNDRfTVVMX01JTlNJWkUgfSwKKyAgeyBUUllfRlVORlVOKG1wbl90b29tNF9zcXIpLCAgIFRZUEVfU1FSLCAgICBNUE5fVE9PTTRfU1FSX01JTlNJWkUgfSwKKworICB7IFRSWShtcG5fbXVsbWlkX24pLCAgVFlQRV9NVUxNSURfTiwgMSB9LAorICB7IFRSWShtcG5fbXVsbWlkKSwgIFRZUEVfTVVMTUlEX01OLCAxIH0sCisgIHsgVFJZX0ZVTkZVTihtcG5fdG9vbTQyX211bG1pZCksICBUWVBFX01VTE1JRF9OLAorICAgICgyICogTVBOX1RPT000Ml9NVUxNSURfTUlOU0laRSAtIDEpIH0sCisKKyAgeyBUUlkobXBuX2djZF8xKSwgICAgICAgIFRZUEVfR0NEXzEgICAgICAgICAgICB9LAorICB7IFRSWShtcG5fZ2NkKSwgICAgICAgICAgVFlQRV9HQ0QgICAgICAgICAgICAgIH0sCisgIHsgVFJZKG1wel9sZWdlbmRyZSksICAgICBUWVBFX01QWl9MRUdFTkRSRSAgICAgfSwKKyAgeyBUUlkobXB6X2phY29iaSksICAgICAgIFRZUEVfTVBaX0pBQ09CSSAgICAgICB9LAorICB7IFRSWShtcHpfa3JvbmVja2VyKSwgICAgVFlQRV9NUFpfS1JPTkVDS0VSICAgIH0sCisgIHsgVFJZKG1wel9rcm9uZWNrZXJfdWkpLCBUWVBFX01QWl9LUk9ORUNLRVJfVUkgfSwKKyAgeyBUUlkobXB6X2tyb25lY2tlcl9zaSksIFRZUEVfTVBaX0tST05FQ0tFUl9TSSB9LAorICB7IFRSWShtcHpfdWlfa3JvbmVja2VyKSwgVFlQRV9NUFpfVUlfS1JPTkVDS0VSIH0sCisgIHsgVFJZKG1wel9zaV9rcm9uZWNrZXIpLCBUWVBFX01QWl9TSV9LUk9ORUNLRVIgfSwKKworICB7IFRSWShtcG5fcG9wY291bnQpLCAgIFRZUEVfUE9QQ09VTlQgfSwKKyAgeyBUUlkobXBuX2hhbWRpc3QpLCAgICBUWVBFX0hBTURJU1QgfSwKKworICB7IFRSWShtcG5fc3FydHJlbSksICAgICBUWVBFX1NRUlRSRU0gfSwKKyAgeyBUUllfRlVORlVOKG1wbl9zcXJ0KSwgVFlQRV9TUVJUIH0sCisKKyAgeyBUUllfRlVORlVOKE1QTl9aRVJPKSwgVFlQRV9aRVJPIH0sCisKKyAgeyBUUlkobXBuX2dldF9zdHIpLCAgICBUWVBFX0dFVF9TVFIgfSwKKworICB7IFRSWShtcG5fYmludmVydCksICAgIFRZUEVfQklOVkVSVCB9LAorICB7IFRSWShtcG5faW52ZXJ0KSwgICAgIFRZUEVfSU5WRVJUICB9LAorCisjaWZkZWYgRVhUUkFfUk9VVElORVMKKyAgRVhUUkFfUk9VVElORVMKKyNlbmRpZgorfTsKKworY29uc3Qgc3RydWN0IGNob2ljZV90ICpjaG9pY2UgPSBOVUxMOworCisKK3ZvaWQKK21wcm90ZWN0X21heWJlICh2b2lkICphZGRyLCBzaXplX3QgbGVuLCBpbnQgcHJvdCkKK3sKKyAgaWYgKCFvcHRpb25fcmVkem9uZXMpCisgICAgcmV0dXJuOworCisjaWYgSEFWRV9NUFJPVEVDVAorICBpZiAobXByb3RlY3QgKGFkZHIsIGxlbiwgcHJvdCkgIT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDYW5ub3QgbXByb3RlY3QgJXAgMHglWCAweCVYOiAlc1xuIiwKKwkgICAgICAgYWRkciwgKHVuc2lnbmVkKSBsZW4sIHByb3QsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorI2Vsc2UKKyAgeworICAgIHN0YXRpYyBpbnQgIHdhcm5lZCA9IDA7CisgICAgaWYgKCF3YXJuZWQpCisgICAgICB7CisJZnByaW50ZiAoc3RkZXJyLAorCQkgIm1wcm90ZWN0IG5vdCBhdmFpbGFibGUsIGJvdW5kcyB0ZXN0aW5nIG5vdCBwZXJmb3JtZWRcbiIpOworCXdhcm5lZCA9IDE7CisgICAgICB9CisgIH0KKyNlbmRpZgorfQorCisvKiByb3VuZCAiYSIgdXAgdG8gYSBtdWx0aXBsZSBvZiAibSIgKi8KK3NpemVfdAorcm91bmRfdXBfbXVsdGlwbGUgKHNpemVfdCBhLCBzaXplX3QgbSkKK3sKKyAgdW5zaWduZWQgbG9uZyAgcjsKKworICByID0gYSAlIG07CisgIGlmIChyID09IDApCisgICAgcmV0dXJuIGE7CisgIGVsc2UKKyAgICByZXR1cm4gYSArIChtIC0gcik7Cit9CisKKworLyogT24gc29tZSBzeXN0ZW1zIGl0IHNlZW1zIHRoYXQgb25seSBhbiBtbWFwJ2VkIHJlZ2lvbiBjYW4gYmUgbXByb3RlY3QnZWQsCisgICBmb3IgaW5zdGFuY2UgSFAtVVggMTAuCisKKyAgIG1tYXAgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJldHVybiBhIHBvaW50ZXIgYWxyZWFkeSBhbGlnbmVkIHRvIGEgcGFnZQorICAgYm91bmRhcnksIGJ1dCBpdCdzIGVhc3kgZW5vdWdoIHRvIHNoYXJlIHRoZSBhbGlnbm1lbnQgaGFuZGxpbmcgd2l0aCB0aGUKKyAgIG1hbGxvYyBjYXNlLiAqLworCit2b2lkCittYWxsb2NfcmVnaW9uIChzdHJ1Y3QgcmVnaW9uX3QgKnIsIG1wX3NpemVfdCBuKQoreworICBtcF9wdHIgIHA7CisgIHNpemVfdCAgbmJ5dGVzOworCisgIEFTU0VSVCAoKHBhZ2VzaXplICUgR01QX0xJTUJfQllURVMpID09IDApOworCisgIG4gPSByb3VuZF91cF9tdWx0aXBsZSAobiwgUEFHRVNJWkVfTElNQlMpOworICByLT5zaXplID0gbjsKKworICBuYnl0ZXMgPSBuKkdNUF9MSU1CX0JZVEVTICsgMipSRURaT05FX0JZVEVTICsgcGFnZXNpemU7CisKKyNpZiBkZWZpbmVkIChNQVBfQU5PTllNT1VTKSAmJiAhIGRlZmluZWQgKE1BUF9BTk9OKQorI2RlZmluZSBNQVBfQU5PTiAgTUFQX0FOT05ZTU9VUworI2VuZGlmCisKKyNpZiBIQVZFX01NQVAgJiYgZGVmaW5lZCAoTUFQX0FOT04pCisgIC8qIG5vdGUgbXVzdCBwYXNzIGZkPS0xIGZvciBNQVBfQU5PTiBvbiBCU0QgKi8KKyAgcCA9IChtcF9wdHIpIG1tYXAgKE5VTEwsIG5ieXRlcywgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9QUklWQVRFfE1BUF9BTk9OLCAtMSwgMCk7CisgIGlmIChwID09ICh2b2lkICopIC0xKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBtbWFwICUjeCBhbm9uIGJ5dGVzOiAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkKSBuYnl0ZXMsIHN0cmVycm9yIChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorI2Vsc2UKKyAgcCA9IChtcF9wdHIpIG1hbGxvYyAobmJ5dGVzKTsKKyAgQVNTRVJUX0FMV0FZUyAocCAhPSBOVUxMKTsKKyNlbmRpZgorCisgIHAgPSAobXBfcHRyKSBhbGlnbl9wb2ludGVyIChwLCBwYWdlc2l6ZSk7CisKKyAgbXByb3RlY3RfbWF5YmUgKHAsIFJFRFpPTkVfQllURVMsIFBST1RfTk9ORSk7CisgIHAgKz0gUkVEWk9ORV9MSU1CUzsKKyAgci0+cHRyID0gcDsKKworICBtcHJvdGVjdF9tYXliZSAocCArIG4sIFJFRFpPTkVfQllURVMsIFBST1RfTk9ORSk7Cit9CisKK3ZvaWQKK21wcm90ZWN0X3JlZ2lvbiAoY29uc3Qgc3RydWN0IHJlZ2lvbl90ICpyLCBpbnQgcHJvdCkKK3sKKyAgbXByb3RlY3RfbWF5YmUgKHItPnB0ciwgci0+c2l6ZSwgcHJvdCk7Cit9CisKKworLyogRmlyc3QgZm91ciBlbnRyaWVzIG11c3QgYmUgMCwxLDIsMyBmb3IgdGhlIGJlbmVmaXQgb2YgQ0FSUllfQklULCBDQVJSWV8zLAorICAgYW5kIENBUlJZXzQgKi8KK21wX2xpbWJfdCAgY2FycnlfYXJyYXlbXSA9IHsKKyAgMCwgMSwgMiwgMywKKyAgNCwKKyAgQ05TVF9MSU1CKDEpIDw8IDgsCisgIENOU1RfTElNQigxKSA8PCAxNiwKKyAgR01QX05VTUJfTUFYCit9OworaW50ICAgICAgICBjYXJyeV9pbmRleDsKKworI2RlZmluZSBDQVJSWV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh0ci0+Y2FycnkgPT0gQ0FSUllfQklUKSA/IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6IHRyLT5jYXJyeSA9PSBDQVJSWV8zICAgPyAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiB0ci0+Y2FycnkgPT0gQ0FSUllfNCAgID8gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogKHRyLT5jYXJyeSA9PSBDQVJSWV9MSU1CIHx8IHRyLT5jYXJyeSA9PSBDQVJSWV9ESVZJU09SKSAgICBcCisgICAgID8gbnVtYmVyb2YoY2FycnlfYXJyYXkpICsgQ0FSUllfUkFORE9NUyAgICAgICAgICAgICAgICAgICAgXAorICAgOiAxKQorCisjZGVmaW5lIE1QTl9SQU5ET01fQUxUKGluZGV4LGRzdCxzaXplKSBcCisgICgoKGluZGV4KSAmIDEpID8gcmVmbXBuX3JhbmRvbSAoZHN0LCBzaXplKSA6IHJlZm1wbl9yYW5kb20yIChkc3QsIHNpemUpKQorCisvKiBUaGUgZHVtbXkgdmFsdWUgYWZ0ZXIgTVBOX1JBTkRPTV9BTFQgZW5zdXJlcyBib3RoIHNpZGVzIG9mIHRoZSAiOiIgaGF2ZQorICAgdGhlIHNhbWUgdHlwZSAqLworI2RlZmluZSBDQVJSWV9JVEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGNhcnJ5X2luZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIChjYXJyeV9pbmRleCA8IG51bWJlcm9mIChjYXJyeV9hcnJheSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCT8gKGNhcnJ5ID0gY2FycnlfYXJyYXlbY2FycnlfaW5kZXhdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJOiAoTVBOX1JBTkRPTV9BTFQgKGNhcnJ5X2luZGV4LCAmY2FycnksIDEpLCAobXBfbGltYl90KSAwKSksICAgIFwKKwkgKHRyLT5jYXJyeSA9PSBDQVJSWV9ESVZJU09SID8gY2FycnkgJT0gZGl2aXNvciA6IDApLCAgICAgICAgICAgXAorCSBjYXJyeV9pbmRleCA8IENBUlJZX0NPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgY2FycnlfaW5kZXgrKykKKworCittcF9saW1iX3QgIG11bHRpcGxpZXJfYXJyYXlbXSA9IHsKKyAgMCwgMSwgMiwgMywKKyAgQ05TVF9MSU1CKDEpIDw8IDgsCisgIENOU1RfTElNQigxKSA8PCAxNiwKKyAgR01QX05VTUJfTUFYIC0gMiwKKyAgR01QX05VTUJfTUFYIC0gMSwKKyAgR01QX05VTUJfTUFYCit9OworaW50ICAgICAgICBtdWx0aXBsaWVyX2luZGV4OworCittcF9saW1iX3QgIGRpdmlzb3JfYXJyYXlbXSA9IHsKKyAgMSwgMiwgMywKKyAgQ05TVF9MSU1CKDEpIDw8IDgsCisgIENOU1RfTElNQigxKSA8PCAxNiwKKyAgQ05TVF9MSU1CKDEpIDw8IChHTVBfTlVNQl9CSVRTLzIgLSAxKSwKKyAgR01QX05VTUJfTUFYID4+IChHTVBfTlVNQl9CSVRTLzIpLAorICBHTVBfTlVNQl9ISUdIQklULAorICBHTVBfTlVNQl9ISUdIQklUICsgMSwKKyAgR01QX05VTUJfTUFYIC0gMiwKKyAgR01QX05VTUJfTUFYIC0gMSwKKyAgR01QX05VTUJfTUFYCit9OworCitpbnQgICAgICAgIGRpdmlzb3JfaW5kZXg7CisKKy8qIFRoZSBkdW1teSB2YWx1ZSBhZnRlciBNUE5fUkFORE9NX0FMVCBlbnN1cmVzIGJvdGggc2lkZXMgb2YgdGhlICI6IiBoYXZlCisgICB0aGUgc2FtZSB0eXBlICovCisjZGVmaW5lIEFSUkFZX0lURVJBVElPTih2YXIsIGluZGV4LCBsaW1pdCwgYXJyYXksIHJhbmRvbXMsIGNvbmQpICAgICAgICBcCisgIGZvciAoaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKGluZGV4IDwgbnVtYmVyb2YgKGFycmF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJPyAodmFyID0gYXJyYXlbaW5kZXhdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwk6IChNUE5fUkFORE9NX0FMVCAoaW5kZXgsICZ2YXIsIDEpLCAobXBfbGltYl90KSAwKSksICAgICAgICAgICAgXAorICAgICAgIGluZGV4IDwgbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGluZGV4KyspCisKKyNkZWZpbmUgTVVMVElQTElFUl9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodHItPm11bHRpcGxpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyBudW1iZXJvZiAobXVsdGlwbGllcl9hcnJheSkgKyBNVUxUSVBMSUVSX1JBTkRPTVMgIFwKKyAgICA6IDEpCisKKyNkZWZpbmUgTVVMVElQTElFUl9JVEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVJSQVlfSVRFUkFUSU9OKG11bHRpcGxpZXIsIG11bHRpcGxpZXJfaW5kZXgsIE1VTFRJUExJRVJfQ09VTlQsICAgICAgIFwKKwkJICBtdWx0aXBsaWVyX2FycmF5LCBNVUxUSVBMSUVSX1JBTkRPTVMsIFRSWV9NVUxUSVBMSUVSKQorCisjZGVmaW5lIERJVklTT1JfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh0ci0+ZGl2aXNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA/IG51bWJlcm9mIChkaXZpc29yX2FycmF5KSArIERJVklTT1JfUkFORE9NUyBcCisgICA6IDEpCisKKyNkZWZpbmUgRElWSVNPUl9JVEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVJSQVlfSVRFUkFUSU9OKGRpdmlzb3IsIGRpdmlzb3JfaW5kZXgsIERJVklTT1JfQ09VTlQsIGRpdmlzb3JfYXJyYXksIFwKKwkJICBESVZJU09SX1JBTkRPTVMsIFRSWV9ESVZJU09SKQorCisKKy8qIG92ZXJsYXBfYXJyYXlbXS5zW2ldIGlzIHdoZXJlIHNbaV0gc2hvdWxkIGJlLCAwIG9yIDEgbWVhbnMgb3ZlcmxhcHBpbmcKKyAgIGRbMF0gb3IgZFsxXSByZXNwZWN0aXZlbHksIC0xIG1lYW5zIGEgc2VwYXJhdGUgKHdyaXRlLXByb3RlY3RlZCkKKyAgIGxvY2F0aW9uLiAqLworCitzdHJ1Y3Qgb3ZlcmxhcF90IHsKKyAgaW50ICBzW05VTV9TT1VSQ0VTXTsKK30gb3ZlcmxhcF9hcnJheVtdID0geworICB7IHsgLTEsIC0xLCAtMSwgLTEsIC0xIH0gfSwKKyAgeyB7ICAwLCAtMSwgLTEsIC0xLCAtMSB9IH0sCisgIHsgeyAtMSwgIDAsIC0xLCAtMSwgLTEgfSB9LAorICB7IHsgIDAsICAwLCAtMSwgLTEsIC0xIH0gfSwKKyAgeyB7ICAxLCAtMSwgLTEsIC0xLCAtMSB9IH0sCisgIHsgeyAtMSwgIDEsIC0xLCAtMSwgLTEgfSB9LAorICB7IHsgIDEsICAxLCAtMSwgLTEsIC0xIH0gfSwKKyAgeyB7ICAwLCAgMSwgLTEsIC0xLCAtMSB9IH0sCisgIHsgeyAgMSwgIDAsIC0xLCAtMSwgLTEgfSB9LAorfTsKKworc3RydWN0IG92ZXJsYXBfdCAgKm92ZXJsYXAsICpvdmVybGFwX2xpbWl0OworCisjZGVmaW5lIE9WRVJMQVBfQ09VTlQgICAgICAgICAgICAgICAgICAgXAorICAodHItPm92ZXJsYXAgJiBPVkVSTEFQX05PTkUgICAgICAgPyAxIFwKKyAgIDogdHItPm92ZXJsYXAgJiBPVkVSTEFQX05PVF9TUkNTID8gMyBcCisgICA6IHRyLT5vdmVybGFwICYgT1ZFUkxBUF9OT1RfU1JDMiA/IDIgXAorICAgOiB0ci0+b3ZlcmxhcCAmIE9WRVJMQVBfTk9UX0RTVDIgPyA0CVwKKyAgIDogdHItPmRzdFsxXSAgICAgICAgICAgICAgICAgICAgID8gOSBcCisgICA6IHRyLT5zcmNbMV0gICAgICAgICAgICAgICAgICAgICA/IDQgXAorICAgOiB0ci0+ZHN0WzBdICAgICAgICAgICAgICAgICAgICAgPyAyIFwKKyAgIDogMSkKKworI2RlZmluZSBPVkVSTEFQX0lURVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAob3ZlcmxhcCA9ICZvdmVybGFwX2FycmF5WzBdLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdmVybGFwX2xpbWl0ID0gJm92ZXJsYXBfYXJyYXlbT1ZFUkxBUF9DT1VOVF07ICAgICAgXAorICAgIG92ZXJsYXAgPCBvdmVybGFwX2xpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3ZlcmxhcCsrKQorCisKK2ludCAgYmFzZSA9IDEwOworCisjZGVmaW5lIFRfUkFORF9DT1VOVCAgMgoraW50ICB0X3JhbmQ7CisKK3ZvaWQKK3RfcmFuZG9tIChtcF9wdHIgcHRyLCBtcF9zaXplX3QgbikKK3sKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChvcHRpb25fZGF0YSkgeworICBjYXNlIERBVEFfVFJBTkQ6CisgICAgc3dpdGNoICh0X3JhbmQpIHsKKyAgICBjYXNlIDA6IHJlZm1wbl9yYW5kb20gKHB0ciwgbik7IGJyZWFrOworICAgIGNhc2UgMTogcmVmbXBuX3JhbmRvbTIgKHB0ciwgbik7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIERBVEFfU0VROgorICAgIHsKKyAgICAgIHN0YXRpYyBtcF9saW1iX3QgIGNvdW50ZXIgPSAwOworICAgICAgbXBfc2l6ZV90ICBpOworICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwlwdHJbaV0gPSArK2NvdW50ZXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIERBVEFfWkVST1M6CisgICAgcmVmbXBuX3plcm8gKHB0ciwgbik7CisgICAgYnJlYWs7CisgIGNhc2UgREFUQV9GRlM6CisgICAgcmVmbXBuX2ZpbGwgKHB0ciwgbiwgR01QX05VTUJfTUFYKTsKKyAgICBicmVhazsKKyAgY2FzZSBEQVRBXzJGRDoKKyAgICAvKiBTcGVjaWFsIHZhbHVlIDB4MkZGRi4uLkZGRkQsIHdoaWNoIGRpdmlkZWQgYnkgMyBnaXZlcyAweEZGRi4uLkZGRiwKKyAgICAgICBpbmR1Y2luZyB0aGUgcTFfZmYgc3BlY2lhbCBjYXNlIGluIHRoZSBtdWwtYnktaW52ZXJzZSBwYXJ0IG9mIHNvbWUKKyAgICAgICB2ZXJzaW9ucyBvZiBkaXZyZW1fMSBhbmQgbW9kXzEuICovCisgICAgcmVmbXBuX2ZpbGwgKHB0ciwgbiwgKG1wX2xpbWJfdCkgLTEpOworICAgIHB0cltuLTFdID0gMjsKKyAgICBwdHJbMF0gLT0gMjsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGFib3J0KCk7CisgIH0KK30KKyNkZWZpbmUgVF9SQU5EX0lURVJBVElPTiBcCisgIGZvciAodF9yYW5kID0gMDsgdF9yYW5kIDwgVF9SQU5EX0NPVU5UOyB0X3JhbmQrKykKKworCit2b2lkCitwcmludF9lYWNoIChjb25zdCBzdHJ1Y3QgZWFjaF90ICplKQoreworICBpbnQgIGk7CisKKyAgcHJpbnRmICgiJXMgJXNcbiIsIGUtPm5hbWUsIGUgPT0gJnJlZiA/IHRyLT5yZWZlcmVuY2VfbmFtZSA6IGNob2ljZS0+bmFtZSk7CisgIGlmICh0ci0+cmV0dmFsKQorICAgIG1wbl90cmFjZSAoIiAgIHJldHZhbCIsICZlLT5yZXR2YWwsIDEpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykKKyAgICB7CisgICAgICBpZiAodHItPmRzdFtpXSkKKwl7CisJICBpZiAodHItPmRzdF9ieXRlc1tpXSkKKwkgICAgYnl0ZV90cmFjZW4gKCIgICBkWyVkXSIsIGksIGUtPmRbaV0ucCwgZFtpXS5zaXplKTsKKwkgIGVsc2UKKwkgICAgbXBuX3RyYWNlbiAoIiAgIGRbJWRdIiwgaSwgZS0+ZFtpXS5wLCBkW2ldLnNpemUpOworCSAgcHJpbnRmICgiICAgICAgICBsb2NhdGVkICVwXG4iLCAodm9pZCAqKSAoZS0+ZFtpXS5wKSk7CisJfQorICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NPVVJDRVM7IGkrKykKKyAgICBpZiAodHItPnNyY1tpXSkKKyAgICAgIHByaW50ZiAoIiAgIHNbJWRdIGxvY2F0ZWQgJXBcbiIsIGksICh2b2lkICopICAoZS0+c1tpXS5wKSk7Cit9CisKKwordm9pZAorcHJpbnRfYWxsICh2b2lkKQoreworICBpbnQgIGk7CisKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgic2l6ZSAgJWxkXG4iLCAobG9uZykgc2l6ZSk7CisgIGlmICh0ci0+c2l6ZTIpCisgICAgcHJpbnRmICgic2l6ZTIgJWxkXG4iLCAobG9uZykgc2l6ZTIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykKKyAgICBpZiAoZFtpXS5zaXplICE9IHNpemUpCisgICAgICBwcmludGYgKCJkWyVkXS5zaXplICVsZFxuIiwgaSwgKGxvbmcpIGRbaV0uc2l6ZSk7CisKKyAgaWYgKHRyLT5tdWx0aXBsaWVyKQorICAgIG1wbl90cmFjZSAoIiAgIG11bHRpcGxpZXIiLCAmbXVsdGlwbGllciwgMSk7CisgIGlmICh0ci0+ZGl2aXNvcikKKyAgICBtcG5fdHJhY2UgKCIgICBkaXZpc29yIiwgJmRpdmlzb3IsIDEpOworICBpZiAodHItPnNoaWZ0KQorICAgIHByaW50ZiAoIiAgIHNoaWZ0ICVsdVxuIiwgc2hpZnQpOworICBpZiAodHItPmNhcnJ5KQorICAgIG1wbl90cmFjZSAoIiAgIGNhcnJ5IiwgJmNhcnJ5LCAxKTsKKyAgaWYgKHRyLT5tc2l6ZSkKKyAgICBtcG5fdHJhY2UgKCIgICBtdWx0aXBsaWVyX04iLCBtdWx0aXBsaWVyX04sIHRyLT5tc2l6ZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9ERVNUUzsgaSsrKQorICAgIGlmICh0ci0+ZHN0W2ldKQorICAgICAgcHJpbnRmICgiICAgZFslZF0gJXMsIGFsaWduICVsZCwgc2l6ZSAlbGRcbiIsCisJICAgICAgaSwgZFtpXS5oaWdoID8gImhpZ2giIDogImxvdyIsCisJICAgICAgKGxvbmcpIGRbaV0uYWxpZ24sIChsb25nKSBkW2ldLnNpemUpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09VUkNFUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICh0ci0+c3JjW2ldKQorCXsKKwkgIHByaW50ZiAoIiAgIHNbJWRdICVzLCBhbGlnbiAlbGQsICIsCisJCSAgaSwgc1tpXS5oaWdoID8gImhpZ2giIDogImxvdyIsIChsb25nKSBzW2ldLmFsaWduKTsKKwkgIHN3aXRjaCAob3ZlcmxhcC0+c1tpXSkgeworCSAgY2FzZSAtMToKKwkgICAgcHJpbnRmICgibm8gb3ZlcmxhcFxuIik7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgcHJpbnRmICgiPT1kWyVkXSVzXG4iLAorCQkgICAgb3ZlcmxhcC0+c1tpXSwKKwkJICAgIHRyLT5vdmVybGFwID09IE9WRVJMQVBfTE9XX1RPX0hJR0ggPyAiK2EiCisJCSAgICA6IHRyLT5vdmVybGFwID09IE9WRVJMQVBfSElHSF9UT19MT1cgPyAiLWEiCisJCSAgICA6ICIiKTsKKwkgICAgYnJlYWs7CisJICB9CisJICBwcmludGYgKCIgICBzWyVkXT0iLCBpKTsKKwkgIGlmICh0ci0+Y2Fycnlfc2lnbiAmJiAoY2FycnkgJiAoMSA8PCBpKSkpCisJICAgIHByaW50ZiAoIi0iKTsKKwkgIG1wbl90cmFjZSAoTlVMTCwgc1tpXS5wLCBTUkNfU0laRShpKSk7CisJfQorICAgIH0KKworICBpZiAodHItPmRzdDBfZnJvbV9zcmMxKQorICAgIG1wbl90cmFjZSAoIiAgIGRbMF0iLCBzWzFdLnJlZ2lvbi5wdHIsIHNpemUpOworCisgIGlmICh0ci0+cmVmZXJlbmNlKQorICAgIHByaW50X2VhY2ggKCZyZWYpOworICBwcmludF9lYWNoICgmZnVuKTsKK30KKwordm9pZAorY29tcGFyZSAodm9pZCkKK3sKKyAgaW50ICBlcnJvciA9IDA7CisgIGludCAgaTsKKworICBpZiAodHItPnJldHZhbCAmJiByZWYucmV0dmFsICE9IGZ1bi5yZXR2YWwpCisgICAgeworICAgICAgZ21wX3ByaW50ZiAoIkRpZmZlcmVudCByZXR1cm4gdmFsdWVzICglTXUsICVNdSlcbiIsCisJCSAgcmVmLnJldHZhbCwgZnVuLnJldHZhbCk7CisgICAgICBlcnJvciA9IDE7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKHRyLT5kc3Rfc2l6ZVtpXSkgeworICAgICAgY2FzZSBTSVpFX1JFVFZBTDoKKyAgICAgIGNhc2UgU0laRV9HRVRfU1RSOgorCWRbaV0uc2l6ZSA9IHJlZi5yZXR2YWw7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykKKyAgICB7CisgICAgICBpZiAoISB0ci0+ZHN0W2ldKQorCWNvbnRpbnVlOworCisgICAgICBpZiAodHItPmRzdF9ieXRlc1tpXSkKKwl7CisJICBpZiAobWVtY21wIChyZWYuZFtpXS5wLCBmdW4uZFtpXS5wLCBkW2ldLnNpemUpICE9IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJEaWZmZXJlbnQgZFslZF0gZGF0YSByZXN1bHRzLCBsb3cgZGlmZiBhdCAlbGQsIGhpZ2ggZGlmZiBhdCAlbGRcbiIsCisJCSAgICAgIGksCisJCSAgICAgIChsb25nKSBieXRlX2RpZmZfbG93ZXN0IChyZWYuZFtpXS5wLCBmdW4uZFtpXS5wLCBkW2ldLnNpemUpLAorCQkgICAgICAobG9uZykgYnl0ZV9kaWZmX2hpZ2hlc3QgKHJlZi5kW2ldLnAsIGZ1bi5kW2ldLnAsIGRbaV0uc2l6ZSkpOworCSAgICAgIGVycm9yID0gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZFtpXS5zaXplICE9IDAKKwkgICAgICAmJiAhIHJlZm1wbl9lcXVhbF9hbnluYWlsIChyZWYuZFtpXS5wLCBmdW4uZFtpXS5wLCBkW2ldLnNpemUpKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRGlmZmVyZW50IGRbJWRdIGRhdGEgcmVzdWx0cywgbG93IGRpZmYgYXQgJWxkLCBoaWdoIGRpZmYgYXQgJWxkXG4iLAorCQkgICAgICBpLAorCQkgICAgICAobG9uZykgbXBuX2RpZmZfbG93ZXN0IChyZWYuZFtpXS5wLCBmdW4uZFtpXS5wLCBkW2ldLnNpemUpLAorCQkgICAgICAobG9uZykgbXBuX2RpZmZfaGlnaGVzdCAocmVmLmRbaV0ucCwgZnVuLmRbaV0ucCwgZFtpXS5zaXplKSk7CisJICAgICAgZXJyb3IgPSAxOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoZXJyb3IpCisgICAgeworICAgICAgcHJpbnRfYWxsKCk7CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKworCisvKiBUaGUgZnVuY3Rpb25zIGFyZSBjYXN0IGlmIHRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGEgbG9uZyByYXRoZXIgdGhhbgorICAgdGhlIGRlZmF1bHQgbXBfbGltYl90LiAgVGhpcyBpcyBuZWNlc3NhcnkgdW5kZXIgX0xPTkdfTE9OR19MSU1CLiAgVGhpcworICAgbWlnaHQgbm90IGJlIGVub3VnaCBpZiBzb21lIGFjdHVhbCBjYWxsaW5nIGNvbnZlbnRpb25zIGNoZWNraW5nIGlzCisgICBpbXBsZW1lbnRlZCBvbiBhIGxvbmcgbG9uZyBsaW1iIHN5c3RlbS4gICovCisKK3ZvaWQKK2NhbGwgKHN0cnVjdCBlYWNoX3QgKmUsIHRyeWZ1bl90IGZ1bmN0aW9uKQoreworICBzd2l0Y2ggKGNob2ljZS0+dHlwZSkgeworICBjYXNlIFRZUEVfQUREOgorICBjYXNlIFRZUEVfU1VCOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplLCBlLT5zWzFdLnAsIHNpemUyKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfQUREX046CisgIGNhc2UgVFlQRV9TVUJfTjoKKyAgY2FzZSBUWVBFX0FERExTSDFfTjoKKyAgY2FzZSBUWVBFX0FERExTSDJfTjoKKyAgY2FzZSBUWVBFX1NVQkxTSDFfTjoKKyAgY2FzZSBUWVBFX1NVQkxTSDJfTjoKKyAgY2FzZSBUWVBFX1JTQkxTSDFfTjoKKyAgY2FzZSBUWVBFX1JTQkxTSDJfTjoKKyAgY2FzZSBUWVBFX1JTSDFBRERfTjoKKyAgY2FzZSBUWVBFX1JTSDFTVUJfTjoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0FERExTSF9OOgorICBjYXNlIFRZUEVfU1VCTFNIX046CisgIGNhc2UgVFlQRV9SU0JMU0hfTjoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplLCBzaGlmdCk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9BRERMU0hfTkM6CisgIGNhc2UgVFlQRV9TVUJMU0hfTkM6CisgIGNhc2UgVFlQRV9SU0JMU0hfTkM6CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pCisgICAgICAoZS0+ZFswXS5wLCBlLT5zWzBdLnAsIGUtPnNbMV0ucCwgc2l6ZSwgc2hpZnQsIGNhcnJ5KTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0FERExTSDFfTkM6CisgIGNhc2UgVFlQRV9BRERMU0gyX05DOgorICBjYXNlIFRZUEVfU1VCTFNIMV9OQzoKKyAgY2FzZSBUWVBFX1NVQkxTSDJfTkM6CisgIGNhc2UgVFlQRV9SU0JMU0gxX05DOgorICBjYXNlIFRZUEVfUlNCTFNIMl9OQzoKKyAgY2FzZSBUWVBFX0FERF9OQzoKKyAgY2FzZSBUWVBFX1NVQl9OQzoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplLCBjYXJyeSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9BRERDTkRfTjoKKyAgY2FzZSBUWVBFX1NVQkNORF9OOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGNhcnJ5LCBlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0FERF9FUlIxX046CisgIGNhc2UgVFlQRV9TVUJfRVJSMV9OOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBlLT5zWzFdLnAsIGUtPmRbMV0ucCwgZS0+c1syXS5wLCBzaXplLCBjYXJyeSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9BRERfRVJSMl9OOgorICBjYXNlIFRZUEVfU1VCX0VSUjJfTjoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBlLT5kWzFdLnAsIGUtPnNbMl0ucCwgZS0+c1szXS5wLCBzaXplLCBjYXJyeSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9BRERfRVJSM19OOgorICBjYXNlIFRZUEVfU1VCX0VSUjNfTjoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBlLT5kWzFdLnAsIGUtPnNbMl0ucCwgZS0+c1szXS5wLCBlLT5zWzRdLnAsIHNpemUsIGNhcnJ5KTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfTVVMXzE6CisgIGNhc2UgVFlQRV9BRERNVUxfMToKKyAgY2FzZSBUWVBFX1NVQk1VTF8xOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplLCBtdWx0aXBsaWVyKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX01VTF8xQzoKKyAgY2FzZSBUWVBFX0FERE1VTF8xQzoKKyAgY2FzZSBUWVBFX1NVQk1VTF8xQzoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgbXVsdGlwbGllciwgY2FycnkpOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9NVUxfMjoKKyAgY2FzZSBUWVBFX01VTF8zOgorICBjYXNlIFRZUEVfTVVMXzQ6CisgIGNhc2UgVFlQRV9NVUxfNToKKyAgY2FzZSBUWVBFX01VTF82OgorICAgIGlmIChzaXplID09IDEpCisgICAgICBhYm9ydCAoKTsKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgbXVsdGlwbGllcl9OKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfQURETVVMXzI6CisgIGNhc2UgVFlQRV9BRERNVUxfMzoKKyAgY2FzZSBUWVBFX0FERE1VTF80OgorICBjYXNlIFRZUEVfQURETVVMXzU6CisgIGNhc2UgVFlQRV9BRERNVUxfNjoKKyAgY2FzZSBUWVBFX0FERE1VTF83OgorICBjYXNlIFRZUEVfQURETVVMXzg6CisgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgIGFib3J0ICgpOworICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplLCBtdWx0aXBsaWVyX04pOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9BTkRfTjoKKyAgY2FzZSBUWVBFX0FORE5fTjoKKyAgY2FzZSBUWVBFX05BTkRfTjoKKyAgY2FzZSBUWVBFX0lPUl9OOgorICBjYXNlIFRZUEVfSU9STl9OOgorICBjYXNlIFRZUEVfTklPUl9OOgorICBjYXNlIFRZUEVfWE9SX046CisgIGNhc2UgVFlQRV9YTk9SX046CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfQUREU1VCX046CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pCisgICAgICAoZS0+ZFswXS5wLCBlLT5kWzFdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0FERFNVQl9OQzoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPmRbMV0ucCwgZS0+c1swXS5wLCBlLT5zWzFdLnAsIHNpemUsIGNhcnJ5KTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfQ09QWToKKyAgY2FzZSBUWVBFX0NPUFlJOgorICBjYXNlIFRZUEVfQ09QWUQ6CisgIGNhc2UgVFlQRV9DT006CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX0FERExTSDFfTl9JUDE6CisgIGNhc2UgVFlQRV9BRERMU0gyX05fSVAxOgorICBjYXNlIFRZUEVfQURETFNIMV9OX0lQMjoKKyAgY2FzZSBUWVBFX0FERExTSDJfTl9JUDI6CisgIGNhc2UgVFlQRV9TVUJMU0gxX05fSVAxOgorICBjYXNlIFRZUEVfU1VCTFNIMl9OX0lQMToKKyAgY2FzZSBUWVBFX0RJVkVYQUNUX0JZMzoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0RJVkVYQUNUX0JZM0M6CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwKKwkJCQkJCWNhcnJ5KTsKKyAgICBicmVhazsKKworCisgIGNhc2UgVFlQRV9ESVZNT0RfMToKKyAgY2FzZSBUWVBFX0RJVkVYQUNUXzE6CisgIGNhc2UgVFlQRV9CRElWX1FfMToKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgZGl2aXNvcik7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9ESVZNT0RfMUM6CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pCisgICAgICAoZS0+ZFswXS5wLCBlLT5zWzBdLnAsIHNpemUsIGRpdmlzb3IsIGNhcnJ5KTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0RJVlJFTV8xOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgc2l6ZTIsIGUtPnNbMF0ucCwgc2l6ZSwgZGl2aXNvcik7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9ESVZSRU1fMUM6CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pCisgICAgICAoZS0+ZFswXS5wLCBzaXplMiwgZS0+c1swXS5wLCBzaXplLCBkaXZpc29yLCBjYXJyeSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9QUkVJTlZfRElWUkVNXzE6CisgICAgeworICAgICAgbXBfbGltYl90ICBkaW52OworICAgICAgdW5zaWduZWQgICBzaGlmdDsKKyAgICAgIHNoaWZ0ID0gcmVmbXBuX2NvdW50X2xlYWRpbmdfemVyb3MgKGRpdmlzb3IpOworICAgICAgZGludiA9IHJlZm1wbl9pbnZlcnRfbGltYiAoZGl2aXNvciA8PCBzaGlmdCk7CisgICAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKwkoZS0+ZFswXS5wLCBzaXplMiwgZS0+c1swXS5wLCBzaXplLCBkaXZpc29yLCBkaW52LCBzaGlmdCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRZUEVfTU9EXzE6CisgIGNhc2UgVFlQRV9NT0RFWEFDVF8xX09ERDoKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5zWzBdLnAsIHNpemUsIGRpdmlzb3IpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfTU9EXzFDOgorICBjYXNlIFRZUEVfTU9ERVhBQ1RfMUNfT0REOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPnNbMF0ucCwgc2l6ZSwgZGl2aXNvciwgY2FycnkpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfUFJFSU5WX01PRF8xOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPnNbMF0ucCwgc2l6ZSwgZGl2aXNvciwgcmVmbXBuX2ludmVydF9saW1iIChkaXZpc29yKSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9ESVZfUVJfMU5fUEkxOgorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBkaW52ID0gcmVmbXBuX2ludmVydF9saW1iIChkaXZpc29yKTsKKyAgICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorCShlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgZS0+c1sxXS5wWzBdLCBkaXZpc29yLCBkaW52KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBjYXNlIFRZUEVfTU9EXzM0TFNVQjE6CisgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5zWzBdLnAsIHNpemUpOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9VRElWX1FSTk5EOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wWzFdLCBlLT5zWzBdLnBbMF0sIGRpdmlzb3IpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfVURJVl9RUk5ORF9SOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPnNbMF0ucFsxXSwgZS0+c1swXS5wWzBdLCBkaXZpc29yLCBlLT5kWzBdLnApOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9TQlBJMV9ESVZfUVI6CisgICAgeworICAgICAgZ21wX3BpMV90IGRpbnY7CisgICAgICBpbnZlcnRfcGkxIChkaW52LCBlLT5zWzFdLnBbc2l6ZTItMV0sIGUtPnNbMV0ucFtzaXplMi0yXSk7IC8qIEZJWE1FOiB1c2UgcmVmaW52ZXJ0X3BpMSAqLworICAgICAgcmVmbXBuX2NvcHlpIChlLT5kWzFdLnAsIGUtPnNbMF0ucCwgc2l6ZSk7ICAgICAgICAvKiBkaXZpZGVuZCAqLworICAgICAgcmVmbXBuX2ZpbGwgKGUtPmRbMF0ucCwgc2l6ZS1zaXplMiwgMHg5ODc2NTQzMik7ICAvKiBxdW90aWVudCAqLworICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pCisJKGUtPmRbMF0ucCwgZS0+ZFsxXS5wLCBzaXplLCBlLT5zWzFdLnAsIHNpemUyLCBkaW52LmludjMyKTsKKyAgICAgIHJlZm1wbl96ZXJvIChlLT5kWzFdLnArc2l6ZTIsIHNpemUtc2l6ZTIpOyAgICAvKiBleGNlc3Mgb3ZlciByZW1haW5kZXIgKi8KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX1RESVZfUVI6CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPmRbMV0ucCwgMCwKKwkJCQkgICAgZS0+c1swXS5wLCBzaXplLCBlLT5zWzFdLnAsIHNpemUyKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfR0NEXzE6CisgICAgLyogTXVzdCBoYXZlIGEgbm9uLXplcm8gc3JjLCBidXQgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgYmVzdCB3YXkgdG8gZG8KKyAgICAgICBpdC4gKi8KKyAgICBpZiAocmVmbXBuX3plcm9fcCAoZS0+c1swXS5wLCBzaXplKSkKKyAgICAgIGUtPnJldHZhbCA9IDA7CisgICAgZWxzZQorICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5zWzBdLnAsIHNpemUsIGRpdmlzb3IpOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9HQ0Q6CisgICAgLyogU291cmNlcyBhcmUgZGVzdHJveWVkLCBzbyB0aGV5J3JlIHNhdmVkIGFuZCByZXBsYWNlZCwgYnV0IGEgZ2VuZXJhbAorICAgICAgIGFwcHJvYWNoIHRvIHRoaXMgbWlnaHQgYmUgYmV0dGVyLiAgTm90ZSB0aGF0IGl0J3Mgc3RpbGwgZS0+c1swXS5wIGFuZAorICAgICAgIGUtPnNbMV0ucCB0aGF0IGFyZSBwYXNzZWQsIHRvIGdldCB0aGUgZGVzaXJlZCBhbGlnbm1lbnRzLiAqLworICAgIHsKKyAgICAgIG1wX3B0ciAgczAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChzaXplKTsKKyAgICAgIG1wX3B0ciAgczEgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChzaXplMik7CisgICAgICByZWZtcG5fY29weWkgKHMwLCBlLT5zWzBdLnAsIHNpemUpOworICAgICAgcmVmbXBuX2NvcHlpIChzMSwgZS0+c1sxXS5wLCBzaXplMik7CisKKyAgICAgIG1wcm90ZWN0X3JlZ2lvbiAoJnNbMF0ucmVnaW9uLCBQUk9UX1JFQUR8UFJPVF9XUklURSk7CisgICAgICBtcHJvdGVjdF9yZWdpb24gKCZzWzFdLnJlZ2lvbiwgUFJPVF9SRUFEfFBST1RfV1JJVEUpOworICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsCisJCQkJCQkgIGUtPnNbMF0ucCwgc2l6ZSwKKwkJCQkJCSAgZS0+c1sxXS5wLCBzaXplMik7CisgICAgICByZWZtcG5fY29weWkgKGUtPnNbMF0ucCwgczAsIHNpemUpOworICAgICAgcmVmbXBuX2NvcHlpIChlLT5zWzFdLnAsIHMxLCBzaXplMik7CisgICAgICBmcmVlIChzMCk7CisgICAgICBmcmVlIChzMSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9HQ0RfRklOREE6CisgICAgeworICAgICAgLyogRklYTUU6IGRvIHRoaXMgd2l0aCBhIGZsYWcgKi8KKyAgICAgIG1wX2xpbWJfdCAgY1syXTsKKyAgICAgIGNbMF0gPSBlLT5zWzBdLnBbMF07CisgICAgICBjWzBdICs9IChjWzBdID09IDApOworICAgICAgY1sxXSA9IGUtPnNbMF0ucFswXTsKKyAgICAgIGNbMV0gKz0gKGNbMV0gPT0gMCk7CisgICAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKGMpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfTVBaX0xFR0VORFJFOgorICBjYXNlIFRZUEVfTVBaX0pBQ09CSToKKyAgICB7CisgICAgICBtcHpfdCAgYSwgYjsKKyAgICAgIFBUUihhKSA9IGUtPnNbMF0ucDsgU0laKGEpID0gKGNhcnJ5PT0wID8gc2l6ZSA6IC1zaXplKTsKKyAgICAgIFBUUihiKSA9IGUtPnNbMV0ucDsgU0laKGIpID0gc2l6ZTI7CisgICAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKGEsIGIpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX01QWl9LUk9ORUNLRVI6CisgICAgeworICAgICAgbXB6X3QgIGEsIGI7CisgICAgICBQVFIoYSkgPSBlLT5zWzBdLnA7IFNJWihhKSA9ICgoY2FycnkmMSk9PTAgPyBzaXplIDogLXNpemUpOworICAgICAgUFRSKGIpID0gZS0+c1sxXS5wOyBTSVooYikgPSAoKGNhcnJ5JjIpPT0wID8gc2l6ZTIgOiAtc2l6ZTIpOworICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChhLCBiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9NUFpfS1JPTkVDS0VSX1VJOgorICAgIHsKKyAgICAgIG1wel90ICBhOworICAgICAgUFRSKGEpID0gZS0+c1swXS5wOyBTSVooYSkgPSAoY2Fycnk9PTAgPyBzaXplIDogLXNpemUpOworICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyhmdW5jdGlvbikgKGEsICh1bnNpZ25lZCBsb25nKW11bHRpcGxpZXIpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX01QWl9LUk9ORUNLRVJfU0k6CisgICAgeworICAgICAgbXB6X3QgIGE7CisgICAgICBQVFIoYSkgPSBlLT5zWzBdLnA7IFNJWihhKSA9IChjYXJyeT09MCA/IHNpemUgOiAtc2l6ZSk7CisgICAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKGEsIChsb25nKSBtdWx0aXBsaWVyKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9NUFpfVUlfS1JPTkVDS0VSOgorICAgIHsKKyAgICAgIG1wel90ICBiOworICAgICAgUFRSKGIpID0gZS0+c1swXS5wOyBTSVooYikgPSAoY2Fycnk9PTAgPyBzaXplIDogLXNpemUpOworICAgICAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyhmdW5jdGlvbikgKCh1bnNpZ25lZCBsb25nKW11bHRpcGxpZXIsIGIpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX01QWl9TSV9LUk9ORUNLRVI6CisgICAgeworICAgICAgbXB6X3QgIGI7CisgICAgICBQVFIoYikgPSBlLT5zWzBdLnA7IFNJWihiKSA9IChjYXJyeT09MCA/IHNpemUgOiAtc2l6ZSk7CisgICAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKChsb25nKSBtdWx0aXBsaWVyLCBiKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX01VTF9NTjoKKyAgY2FzZSBUWVBFX01VTE1JRF9NTjoKKyAgICBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgZS0+c1sxXS5wLCBzaXplMik7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9NVUxfTjoKKyAgY2FzZSBUWVBFX01VTExPX046CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX01VTE1JRF9OOgorICAgIENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKSAoZS0+ZFswXS5wLCBlLT5zWzBdLnAsIGUtPnNbMV0ucCwKKwkJCQkgICAgKHNpemUgKyAxKSAvIDIpOworICAgIGJyZWFrOworICBjYXNlIFRZUEVfU1FSOgorICBjYXNlIFRZUEVfU1FSTE86CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX1VNVUxfUFBNTToKKyAgICBlLT5yZXR2YWwgPSBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucFswXSwgZS0+c1swXS5wWzFdKTsKKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX1VNVUxfUFBNTV9SOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPnNbMF0ucFswXSwgZS0+c1swXS5wWzFdLCBlLT5kWzBdLnApOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9BRERMU0hfTl9JUDE6CisgIGNhc2UgVFlQRV9BRERMU0hfTl9JUDI6CisgIGNhc2UgVFlQRV9TVUJMU0hfTl9JUDE6CisgIGNhc2UgVFlQRV9MU0hJRlQ6CisgIGNhc2UgVFlQRV9MU0hJRlRDOgorICBjYXNlIFRZUEVfUlNISUZUOgorICAgIGUtPnJldHZhbCA9IENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKQorICAgICAgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplLCBzaGlmdCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX1BPUENPVU5UOgorICAgIGUtPnJldHZhbCA9ICgqICh1bnNpZ25lZCBsb25nICgqKShBTllBUkdTKSkKKwkJIENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKSkgKGUtPnNbMF0ucCwgc2l6ZSk7CisgICAgYnJlYWs7CisgIGNhc2UgVFlQRV9IQU1ESVNUOgorICAgIGUtPnJldHZhbCA9ICgqICh1bnNpZ25lZCBsb25nICgqKShBTllBUkdTKSkKKwkJIENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKSkgKGUtPnNbMF0ucCwgZS0+c1sxXS5wLCBzaXplKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfU1FSVFJFTToKKyAgICBlLT5yZXR2YWwgPSAoKiAobG9uZyAoKikoQU5ZQVJHUykpIENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKSkKKyAgICAgIChlLT5kWzBdLnAsIGUtPmRbMV0ucCwgZS0+c1swXS5wLCBzaXplKTsKKyAgICBicmVhazsKKworICBjYXNlIFRZUEVfU1FSVDoKKyAgICBlLT5yZXR2YWwgPSAoKiAobG9uZyAoKikoQU5ZQVJHUykpIENBTExJTkdfQ09OVkVOVElPTlMgKGZ1bmN0aW9uKSkKKyAgICAgIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUWVBFX1pFUk86CisgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIHNpemUpOworICAgIGJyZWFrOworCisgIGNhc2UgVFlQRV9HRVRfU1RSOgorICAgIHsKKyAgICAgIHNpemVfdCAgc2l6ZWluYmFzZSwgZmlsbDsKKyAgICAgIGNoYXIgICAgKmRzdDsKKyAgICAgIE1QTl9TSVpFSU5CQVNFIChzaXplaW5iYXNlLCBlLT5zWzBdLnAsIHNpemUsIGJhc2UpOworICAgICAgQVNTRVJUX0FMV0FZUyAoc2l6ZWluYmFzZSA8PSBkWzBdLnNpemUpOworICAgICAgZmlsbCA9IGRbMF0uc2l6ZSAtIHNpemVpbmJhc2U7CisgICAgICBpZiAoZFswXS5oaWdoKQorCXsKKwkgIG1lbXNldCAoZS0+ZFswXS5wLCAweEJBLCBmaWxsKTsKKwkgIGRzdCA9IChjaGFyICopIGUtPmRbMF0ucCArIGZpbGw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRzdCA9IChjaGFyICopIGUtPmRbMF0ucDsKKwkgIG1lbXNldCAoZHN0ICsgc2l6ZWluYmFzZSwgMHhCQSwgZmlsbCk7CisJfQorICAgICAgaWYgKFBPVzJfUCAoYmFzZSkpCisJeworCSAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChkc3QsIGJhc2UsCisJCQkJCQkgICAgICBlLT5zWzBdLnAsIHNpemUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZWZtcG5fY29weSAoZS0+ZFsxXS5wLCBlLT5zWzBdLnAsIHNpemUpOworCSAgZS0+cmV0dmFsID0gQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChkc3QsIGJhc2UsCisJCQkJCQkgICAgICBlLT5kWzFdLnAsIHNpemUpOworCX0KKyAgICAgIHJlZm1wbl96ZXJvIChlLT5kWzFdLnAsIHNpemUpOyAgLyogY2xvYmJlcmVkIG9yIHVudXNlZCAqLworICAgIH0KKyAgICBicmVhazsKKworIGNhc2UgVFlQRV9JTlZFUlQ6CisgICAgeworICAgICAgbXBfcHRyIHNjcmF0Y2g7CisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworICAgICAgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX2ludmVydF9pdGNoIChzaXplKSk7CisgICAgICBDQUxMSU5HX0NPTlZFTlRJT05TIChmdW5jdGlvbikgKGUtPmRbMF0ucCwgZS0+c1swXS5wLCBzaXplLCBzY3JhdGNoKTsKKyAgICAgIFRNUF9GUkVFOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUWVBFX0JJTlZFUlQ6CisgICAgeworICAgICAgbXBfcHRyIHNjcmF0Y2g7CisgICAgICBUTVBfREVDTDsKKyAgICAgIFRNUF9NQVJLOworICAgICAgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX2JpbnZlcnRfaXRjaCAoc2l6ZSkpOworICAgICAgQ0FMTElOR19DT05WRU5USU9OUyAoZnVuY3Rpb24pIChlLT5kWzBdLnAsIGUtPnNbMF0ucCwgc2l6ZSwgc2NyYXRjaCk7CisgICAgICBUTVBfRlJFRTsKKyAgICB9CisgICAgYnJlYWs7CisKKyNpZmRlZiBFWFRSQV9DQUxMCisgICAgRVhUUkFfQ0FMTAorI2VuZGlmCisKKyAgZGVmYXVsdDoKKyAgICBwcmludGYgKCJVbmtub3duIHJvdXRpbmUgdHlwZSAlZFxuIiwgY2hvaWNlLT50eXBlKTsKKyAgICBhYm9ydCAoKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK3ZvaWQKK3BvaW50ZXJfc2V0dXAgKHN0cnVjdCBlYWNoX3QgKmUpCit7CisgIGludCAgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RFU1RTOyBpKyspCisgICAgeworICAgICAgc3dpdGNoICh0ci0+ZHN0X3NpemVbaV0pIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgU0laRV9SRVRWQUw6IC8qIHdpbGwgYmUgYWRqdXN0ZWQgbGF0ZXIgKi8KKwlkW2ldLnNpemUgPSBzaXplOworCWJyZWFrOworCisgICAgICBjYXNlIFNJWkVfMToKKwlkW2ldLnNpemUgPSAxOworCWJyZWFrOworICAgICAgY2FzZSBTSVpFXzI6CisJZFtpXS5zaXplID0gMjsKKwlicmVhazsKKyAgICAgIGNhc2UgU0laRV8zOgorCWRbaV0uc2l6ZSA9IDM7CisJYnJlYWs7CisgICAgICBjYXNlIFNJWkVfNDoKKwlkW2ldLnNpemUgPSA0OworCWJyZWFrOworICAgICAgY2FzZSBTSVpFXzY6CisJZFtpXS5zaXplID0gNjsKKwlicmVhazsKKworICAgICAgY2FzZSBTSVpFX1BMVVNfMToKKwlkW2ldLnNpemUgPSBzaXplKzE7CisJYnJlYWs7CisgICAgICBjYXNlIFNJWkVfUExVU19NU0laRV9TVUJfMToKKwlkW2ldLnNpemUgPSBzaXplICsgdHItPm1zaXplIC0gMTsKKwlicmVhazsKKworICAgICAgY2FzZSBTSVpFX1NVTToKKwlpZiAodHItPnNpemUyKQorCSAgZFtpXS5zaXplID0gc2l6ZSArIHNpemUyOworCWVsc2UKKwkgIGRbaV0uc2l6ZSA9IDIqc2l6ZTsKKwlicmVhazsKKworICAgICAgY2FzZSBTSVpFX1NJWkUyOgorCWRbaV0uc2l6ZSA9IHNpemUyOworCWJyZWFrOworCisgICAgICBjYXNlIFNJWkVfRElGRjoKKwlkW2ldLnNpemUgPSBzaXplIC0gc2l6ZTI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU0laRV9ESUZGX1BMVVNfMToKKwlkW2ldLnNpemUgPSBzaXplIC0gc2l6ZTIgKyAxOworCWJyZWFrOworCisgICAgICBjYXNlIFNJWkVfRElGRl9QTFVTXzM6CisJZFtpXS5zaXplID0gc2l6ZSAtIHNpemUyICsgMzsKKwlicmVhazsKKworICAgICAgY2FzZSBTSVpFX0NFSUxfSEFMRjoKKwlkW2ldLnNpemUgPSAoc2l6ZSsxKS8yOworCWJyZWFrOworCisgICAgICBjYXNlIFNJWkVfR0VUX1NUUjoKKwl7CisJICBtcF9saW1iX3QgZmYgPSBHTVBfTlVNQl9NQVg7CisJICBNUE5fU0laRUlOQkFTRSAoZFtpXS5zaXplLCAmZmYgLSAoc2l6ZS0xKSwgc2l6ZSwgYmFzZSk7CisJfQorCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCXByaW50ZiAoIlVucmVjb2duaXNlZCBkc3Rfc2l6ZSB0eXBlICVkXG4iLCB0ci0+ZHN0X3NpemVbaV0pOworCWFib3J0ICgpOworICAgICAgfQorICAgIH0KKworICAvKiBlc3RhYmxpc2ggZS0+ZFtdLnAgZGVzdGluYXRpb25zICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykKKyAgICB7CisgICAgICBtcF9zaXplX3QgIG9mZnNldCA9IDA7CisKKyAgICAgIC8qIHBvc3NpYmxlIHJvb20gZm9yIG92ZXJsYXBwaW5nIHNvdXJjZXMgKi8KKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJvZiAob3ZlcmxhcC0+cyk7IGorKykKKwlpZiAob3ZlcmxhcC0+c1tqXSA9PSBpKQorCSAgb2Zmc2V0ID0gTUFYIChvZmZzZXQsIHNbal0uYWxpZ24pOworCisgICAgICBpZiAoZFtpXS5oaWdoKQorCXsKKwkgIGlmICh0ci0+ZHN0X2J5dGVzW2ldKQorCSAgICB7CisJICAgICAgZS0+ZFtpXS5wID0gKG1wX3B0cikKKwkJKChjaGFyICopIChlLT5kW2ldLnJlZ2lvbi5wdHIgKyBlLT5kW2ldLnJlZ2lvbi5zaXplKQorCQkgLSBkW2ldLnNpemUgLSBkW2ldLmFsaWduKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZS0+ZFtpXS5wID0gZS0+ZFtpXS5yZWdpb24ucHRyICsgZS0+ZFtpXS5yZWdpb24uc2l6ZQorCQktIGRbaV0uc2l6ZSAtIGRbaV0uYWxpZ247CisJICAgICAgaWYgKHRyLT5vdmVybGFwID09IE9WRVJMQVBfTE9XX1RPX0hJR0gpCisJCWUtPmRbaV0ucCAtPSBvZmZzZXQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHRyLT5kc3RfYnl0ZXNbaV0pCisJICAgIHsKKwkgICAgICBlLT5kW2ldLnAgPSAobXBfcHRyKSAoKGNoYXIgKikgZS0+ZFtpXS5yZWdpb24ucHRyICsgZFtpXS5hbGlnbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGUtPmRbaV0ucCA9IGUtPmRbaV0ucmVnaW9uLnB0ciArIGRbaV0uYWxpZ247CisJICAgICAgaWYgKHRyLT5vdmVybGFwID09IE9WRVJMQVBfSElHSF9UT19MT1cpCisJCWUtPmRbaV0ucCArPSBvZmZzZXQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIGVzdGFibGlzaCBlLT5zW10ucCBzb3VyY2VzICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09VUkNFUzsgaSsrKQorICAgIHsKKyAgICAgIGludCAgbyA9IG92ZXJsYXAtPnNbaV07CisgICAgICBzd2l0Y2ggKG8pIHsKKyAgICAgIGNhc2UgLTE6CisJLyogbm8gb3ZlcmxhcCAqLworCWUtPnNbaV0ucCA9IHNbaV0ucDsKKwlicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKwkvKiBvdmVybGFwIHdpdGggZFtvXSAqLworCWlmICh0ci0+b3ZlcmxhcCA9PSBPVkVSTEFQX0hJR0hfVE9fTE9XKQorCSAgZS0+c1tpXS5wID0gZS0+ZFtvXS5wIC0gc1tpXS5hbGlnbjsKKwllbHNlIGlmICh0ci0+b3ZlcmxhcCA9PSBPVkVSTEFQX0xPV19UT19ISUdIKQorCSAgZS0+c1tpXS5wID0gZS0+ZFtvXS5wICsgc1tpXS5hbGlnbjsKKwllbHNlIGlmICh0ci0+c2l6ZTIgPT0gU0laRV9GUkFDVElPTikKKwkgIGUtPnNbaV0ucCA9IGUtPmRbb10ucCArIHNpemUyOworCWVsc2UKKwkgIGUtPnNbaV0ucCA9IGUtPmRbb10ucDsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYWJvcnQoKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZAordmFsaWRhdGVfZmFpbCAodm9pZCkKK3sKKyAgaWYgKHRyLT5yZWZlcmVuY2UpCisgICAgeworICAgICAgdHJhcF9sb2NhdGlvbiA9IFRSQVBfUkVGOworICAgICAgY2FsbCAoJnJlZiwgdHItPnJlZmVyZW5jZSk7CisgICAgICB0cmFwX2xvY2F0aW9uID0gVFJBUF9OT1dIRVJFOworICAgIH0KKworICBwcmludF9hbGwoKTsKKyAgYWJvcnQoKTsKK30KKworCit2b2lkCit0cnlfb25lICh2b2lkKQoreworICBpbnQgIGk7CisKKyAgaWYgKG9wdGlvbl9zcGlubmVyKQorICAgIHNwaW5uZXIoKTsKKyAgc3Bpbm5lcl9jb3VudCsrOworCisgIHRyYXBfbG9jYXRpb24gPSBUUkFQX1NFVFVQUzsKKworICBpZiAodHItPmRpdmlzb3IgPT0gRElWSVNPUl9OT1JNKQorICAgIGRpdmlzb3IgfD0gR01QX05VTUJfSElHSEJJVDsKKyAgaWYgKHRyLT5kaXZpc29yID09IERJVklTT1JfT0REKQorICAgIGRpdmlzb3IgfD0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NPVVJDRVM7IGkrKykKKyAgICB7CisgICAgICBpZiAoc1tpXS5oaWdoKQorCXNbaV0ucCA9IHNbaV0ucmVnaW9uLnB0ciArIHNbaV0ucmVnaW9uLnNpemUgLSBTUkNfU0laRShpKSAtIHNbaV0uYWxpZ247CisgICAgICBlbHNlCisJc1tpXS5wID0gc1tpXS5yZWdpb24ucHRyICsgc1tpXS5hbGlnbjsKKyAgICB9CisKKyAgcG9pbnRlcl9zZXR1cCAoJnJlZik7CisgIHBvaW50ZXJfc2V0dXAgKCZmdW4pOworCisgIHJlZi5yZXR2YWwgPSAweDA0MTUyNjM3OworICBmdW4ucmV0dmFsID0gMHg4QzlEQUVCRjsKKworICB0X3JhbmRvbSAobXVsdGlwbGllcl9OLCB0ci0+bXNpemUpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09VUkNFUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghIHRyLT5zcmNbaV0pCisJY29udGludWU7CisKKyAgICAgIG1wcm90ZWN0X3JlZ2lvbiAoJnNbaV0ucmVnaW9uLCBQUk9UX1JFQUR8UFJPVF9XUklURSk7CisgICAgICB0X3JhbmRvbSAoc1tpXS5wLCBTUkNfU0laRShpKSk7CisKKyAgICAgIHN3aXRjaCAodHItPmRhdGEpIHsKKyAgICAgIGNhc2UgREFUQV9OT05fWkVSTzoKKwlpZiAocmVmbXBuX3plcm9fcCAoc1tpXS5wLCBTUkNfU0laRShpKSkpCisJICBzW2ldLnBbMF0gPSAxOworCWJyZWFrOworCisgICAgICBjYXNlIERBVEFfTVVMVElQTEVfRElWSVNPUjoKKwkvKiBzYW1lIG51bWJlciBvZiBsb3cgemVybyBiaXRzIGFzIGRpdmlzb3IgKi8KKwlzW2ldLnBbMF0gJj0gfiBMT1dfWkVST1NfTUFTSyAoZGl2aXNvcik7CisJcmVmbXBuX3N1Yl8xIChzW2ldLnAsIHNbaV0ucCwgc2l6ZSwKKwkJICAgICAgcmVmbXBuX21vZF8xIChzW2ldLnAsIHNpemUsIGRpdmlzb3IpKTsKKwlicmVhazsKKworICAgICAgY2FzZSBEQVRBX0dDRDoKKwkvKiBzWzFdIG5vIG1vcmUgYml0cyB0aGFuIHNbMF0gKi8KKwlpZiAoaSA9PSAxICYmIHNpemUyID09IHNpemUpCisJICBzWzFdLnBbc2l6ZS0xXSAmPSByZWZtcG5fbXNib25lX21hc2sgKHNbMF0ucFtzaXplLTFdKTsKKworCS8qIGhpZ2ggbGltYiBub24temVybyAqLworCXNbaV0ucFtTUkNfU0laRShpKS0xXSArPSAoc1tpXS5wW1NSQ19TSVpFKGkpLTFdID09IDApOworCisJLyogb2RkICovCisJc1tpXS5wWzBdIHw9IDE7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREFUQV9TUkMwX09ERDoKKwlpZiAoaSA9PSAwKQorCSAgc1tpXS5wWzBdIHw9IDE7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREFUQV9TUkMxX09ERDoKKwlpZiAoaSA9PSAxKQorCSAgc1tpXS5wWzBdIHw9IDE7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREFUQV9TUkMxX09ERF9QUklNRToKKwlpZiAoaSA9PSAxKQorCSAgeworCSAgICBpZiAocmVmbXBuX3plcm9fcCAoc1tpXS5wKzEsIFNSQ19TSVpFKGkpLTEpCisJCSYmIHNbaV0ucFswXSA8PTMpCisJICAgICAgc1tpXS5wWzBdID0gMzsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbXB6X3QgcDsKKwkJbXB6X2luaXQgKHApOworCQlmb3IgKDs7KQorCQkgIHsKKwkJICAgIF9tcHpfcmVhbGxvYyAocCwgU1JDX1NJWkUoaSkpOworCQkgICAgTVBOX0NPUFkgKFBUUihwKSwgc1tpXS5wLCBTUkNfU0laRShpKSk7CisJCSAgICBTSVoocCkgPSBTUkNfU0laRShpKTsKKwkJICAgIE1QTl9OT1JNQUxJWkUgKFBUUihwKSwgU0laKHApKTsKKwkJICAgIG1wel9uZXh0cHJpbWUgKHAsIHApOworCQkgICAgaWYgKG1wel9zaXplIChwKSA8PSBTUkNfU0laRShpKSkKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIHRfcmFuZG9tIChzW2ldLnAsIFNSQ19TSVpFKGkpKTsKKwkJICB9CisJCU1QTl9DT1BZIChzW2ldLnAsIFBUUihwKSwgU0laKHApKTsKKwkJaWYgKFNJWihwKSA8IFNSQ19TSVpFKGkpKQorCQkgIE1QTl9aRVJPIChzW2ldLnAgKyBTSVoocCksIFNSQ19TSVpFKGkpIC0gU0laKHApKTsKKwkJbXB6X2NsZWFyIChwKTsKKwkgICAgICB9CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREFUQV9TUkMxX0hJR0hCSVQ6CisJaWYgKGkgPT0gMSkKKwkgIHsKKwkgICAgaWYgKHRyLT5zaXplMikKKwkgICAgICBzW2ldLnBbc2l6ZTItMV0gfD0gR01QX05VTUJfSElHSEJJVDsKKwkgICAgZWxzZQorCSAgICAgIHNbaV0ucFtzaXplLTFdIHw9IEdNUF9OVU1CX0hJR0hCSVQ7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgREFUQV9TUkMwX0hJR0hCSVQ6CisgICAgICAgaWYgKGkgPT0gMCkKKwkgeworCSAgIHNbaV0ucFtzaXplLTFdIHw9IEdNUF9OVU1CX0hJR0hCSVQ7CisJIH0KKyAgICAgICBicmVhazsKKworICAgICAgY2FzZSBEQVRBX1VESVZfUVJOTkQ6CisJc1tpXS5wWzFdICU9IGRpdmlzb3I7CisJYnJlYWs7CisgICAgICBjYXNlIERBVEFfRElWX1FSXzE6CisJaWYgKGkgPT0gMSkKKwkgIHNbaV0ucFswXSAlPSBkaXZpc29yOworCWJyZWFrOworICAgICAgfQorCisgICAgICBtcHJvdGVjdF9yZWdpb24gKCZzW2ldLnJlZ2lvbiwgUFJPVF9SRUFEKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9ERVNUUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghIHRyLT5kc3RbaV0pCisJY29udGludWU7CisKKyAgICAgIGlmICh0ci0+ZHN0MF9mcm9tX3NyYzEgJiYgaT09MCkKKwl7CisJICBtcF9zaXplX3QgIGNvcHkgPSBNSU4gKGRbMF0uc2l6ZSwgU1JDX1NJWkUoMSkpOworCSAgbXBfc2l6ZV90ICBmaWxsID0gTUFYICgwLCBkWzBdLnNpemUgLSBjb3B5KTsKKwkgIE1QTl9DT1BZIChmdW4uZFswXS5wLCBzWzFdLnJlZ2lvbi5wdHIsIGNvcHkpOworCSAgTVBOX0NPUFkgKHJlZi5kWzBdLnAsIHNbMV0ucmVnaW9uLnB0ciwgY29weSk7CisJICByZWZtcG5fZmlsbCAoZnVuLmRbMF0ucCArIGNvcHksIGZpbGwsIERFQURWQUwpOworCSAgcmVmbXBuX2ZpbGwgKHJlZi5kWzBdLnAgKyBjb3B5LCBmaWxsLCBERUFEVkFMKTsKKwl9CisgICAgICBlbHNlIGlmICh0ci0+ZHN0X2J5dGVzW2ldKQorCXsKKwkgIG1lbXNldCAocmVmLmRbaV0ucCwgMHhCQSwgZFtpXS5zaXplKTsKKwkgIG1lbXNldCAoZnVuLmRbaV0ucCwgMHhCQSwgZFtpXS5zaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmVmbXBuX2ZpbGwgKHJlZi5kW2ldLnAsIGRbaV0uc2l6ZSwgREVBRFZBTCk7CisJICByZWZtcG5fZmlsbCAoZnVuLmRbaV0ucCwgZFtpXS5zaXplLCBERUFEVkFMKTsKKwl9CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09VUkNFUzsgaSsrKQorICAgIHsKKyAgICAgIGlmICghIHRyLT5zcmNbaV0pCisJY29udGludWU7CisKKyAgICAgIGlmIChyZWYuc1tpXS5wICE9IHNbaV0ucCkKKwl7CisJICByZWZtcG5fY29weWkgKHJlZi5zW2ldLnAsIHNbaV0ucCwgU1JDX1NJWkUoaSkpOworCSAgcmVmbXBuX2NvcHlpIChmdW4uc1tpXS5wLCBzW2ldLnAsIFNSQ19TSVpFKGkpKTsKKwl9CisgICAgfQorCisgIGlmIChvcHRpb25fcHJpbnQpCisgICAgcHJpbnRfYWxsKCk7CisKKyAgaWYgKHRyLT52YWxpZGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHRyYXBfbG9jYXRpb24gPSBUUkFQX0ZVTjsKKyAgICAgIGNhbGwgKCZmdW4sIGNob2ljZS0+ZnVuY3Rpb24pOworICAgICAgdHJhcF9sb2NhdGlvbiA9IFRSQVBfTk9XSEVSRTsKKworICAgICAgaWYgKCEgQ0FMTElOR19DT05WRU5USU9OU19DSEVDSyAoKSkKKwl7CisJICBwcmludF9hbGwoKTsKKwkgIGFib3J0KCk7CisJfQorCisgICAgICAoKnRyLT52YWxpZGF0ZSkgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdHJhcF9sb2NhdGlvbiA9IFRSQVBfUkVGOworICAgICAgY2FsbCAoJnJlZiwgdHItPnJlZmVyZW5jZSk7CisgICAgICB0cmFwX2xvY2F0aW9uID0gVFJBUF9GVU47CisgICAgICBjYWxsICgmZnVuLCBjaG9pY2UtPmZ1bmN0aW9uKTsKKyAgICAgIHRyYXBfbG9jYXRpb24gPSBUUkFQX05PV0hFUkU7CisKKyAgICAgIGlmICghIENBTExJTkdfQ09OVkVOVElPTlNfQ0hFQ0sgKCkpCisJeworCSAgcHJpbnRfYWxsKCk7CisJICBhYm9ydCgpOworCX0KKworICAgICAgY29tcGFyZSAoKTsKKyAgICB9Cit9CisKKworI2RlZmluZSBTSVpFX0lURVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzaXplID0gTUFYMyAob3B0aW9uX2ZpcnN0c2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgICBjaG9pY2UtPm1pbnNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICh0ci0+c2l6ZSA9PSBTSVpFX0FMTE9XX1pFUk8pID8gMCA6IDEpLAlcCisJIHNpemUgKz0gKHRyLT5zaXplID09IFNJWkVfT0REKSAmJiAhKHNpemUgJiAxKTsJCVwKKyAgICAgICBzaXplIDw9IG9wdGlvbl9sYXN0c2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgc2l6ZSArPSAodHItPnNpemUgPT0gU0laRV9PREQpID8gMiA6IDEpCisKKyNkZWZpbmUgU0laRTJfRklSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodHItPnNpemUyID09IFNJWkVfMiA/IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6IHRyLT5zaXplMiA9PSBTSVpFX0ZSQUNUSU9OID8gb3B0aW9uX2ZpcnN0c2l6ZTIgICAgIFwKKyAgIDogdHItPnNpemUyID09IFNJWkVfQ0VJTF9IQUxGID8gKChzaXplICsgMSkgLyAyKQlcCisgICA6IHRyLT5zaXplMiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIE1BWCAoY2hvaWNlLT5taW5zaXplLCAob3B0aW9uX2ZpcnN0c2l6ZTIgIT0gMCAgICAgICAgXAorCQkJICA/IG9wdGlvbl9maXJzdHNpemUyIDogMSkpICAgICBcCisgICA6IDApCisKKyNkZWZpbmUgU0laRTJfTEFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodHItPnNpemUyID09IFNJWkVfMiA/IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6IHRyLT5zaXplMiA9PSBTSVpFX0ZSQUNUSU9OID8gRlJBQ1RJT05fQ09VTlQtMSAgICAgIFwKKyAgIDogdHItPnNpemUyID09IFNJWkVfQ0VJTF9IQUxGID8gKChzaXplICsgMSkgLyAyKQlcCisgICA6IHRyLT5zaXplMiA/IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDogMCkKKworI2RlZmluZSBTSVpFMl9JVEVSQVRJT04gXAorICBmb3IgKHNpemUyID0gU0laRTJfRklSU1Q7IHNpemUyIDw9IFNJWkUyX0xBU1Q7IHNpemUyKyspCisKKyNkZWZpbmUgQUxJR05fQ09VTlQoY29uZCkgICgoY29uZCkgPyBBTElHTk1FTlRTIDogMSkKKyNkZWZpbmUgQUxJR05fSVRFUkFUSU9OKHcsbixjb25kKSBcCisgIGZvciAod1tuXS5hbGlnbiA9IDA7IHdbbl0uYWxpZ24gPCBBTElHTl9DT1VOVChjb25kKTsgd1tuXS5hbGlnbisrKQorCisjZGVmaW5lIEhJR0hfTElNSVQoY29uZCkgICgoY29uZCkgIT0gMCkKKyNkZWZpbmUgSElHSF9DT1VOVChjb25kKSAgKEhJR0hfTElNSVQgKGNvbmQpICsgMSkKKyNkZWZpbmUgSElHSF9JVEVSQVRJT04odyxuLGNvbmQpIFwKKyAgZm9yICh3W25dLmhpZ2ggPSAwOyB3W25dLmhpZ2ggPD0gSElHSF9MSU1JVChjb25kKTsgd1tuXS5oaWdoKyspCisKKyNkZWZpbmUgU0hJRlRfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHVuc2lnbmVkIGxvbmcpICh0ci0+c2hpZnQgPyBHTVBfTlVNQl9CSVRTIC0xIDogMSkpCisKKyNkZWZpbmUgU0hJRlRfSVRFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHNoaWZ0ID0gMTsgc2hpZnQgPD0gU0hJRlRfTElNSVQ7IHNoaWZ0KyspCisKKwordm9pZAordHJ5X21hbnkgKHZvaWQpCit7CisgIGludCAgIGk7CisKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgIHRvdGFsID0gMTsKKworICAgIHRvdGFsICo9IG9wdGlvbl9yZXBldGl0aW9uczsKKyAgICB0b3RhbCAqPSBvcHRpb25fbGFzdHNpemU7CisgICAgaWYgKHRyLT5zaXplMiA9PSBTSVpFX0ZSQUNUSU9OKSB0b3RhbCAqPSBGUkFDVElPTl9DT1VOVDsKKyAgICBlbHNlIGlmICh0ci0+c2l6ZTIpICAgICAgICAgICAgIHRvdGFsICo9IChvcHRpb25fbGFzdHNpemUrMSkvMjsKKworICAgIHRvdGFsICo9IFNISUZUX0xJTUlUOworICAgIHRvdGFsICo9IE1VTFRJUExJRVJfQ09VTlQ7CisgICAgdG90YWwgKj0gRElWSVNPUl9DT1VOVDsKKyAgICB0b3RhbCAqPSBDQVJSWV9DT1VOVDsKKyAgICB0b3RhbCAqPSBUX1JBTkRfQ09VTlQ7CisKKyAgICB0b3RhbCAqPSBISUdIX0NPVU5UICh0ci0+ZHN0WzBdKTsKKyAgICB0b3RhbCAqPSBISUdIX0NPVU5UICh0ci0+ZHN0WzFdKTsKKyAgICB0b3RhbCAqPSBISUdIX0NPVU5UICh0ci0+c3JjWzBdKTsKKyAgICB0b3RhbCAqPSBISUdIX0NPVU5UICh0ci0+c3JjWzFdKTsKKworICAgIHRvdGFsICo9IEFMSUdOX0NPVU5UICh0ci0+ZHN0WzBdKTsKKyAgICB0b3RhbCAqPSBBTElHTl9DT1VOVCAodHItPmRzdFsxXSk7CisgICAgdG90YWwgKj0gQUxJR05fQ09VTlQgKHRyLT5zcmNbMF0pOworICAgIHRvdGFsICo9IEFMSUdOX0NPVU5UICh0ci0+c3JjWzFdKTsKKworICAgIHRvdGFsICo9IE9WRVJMQVBfQ09VTlQ7CisKKyAgICBwcmludGYgKCIlcyAlbHVcbiIsIGNob2ljZS0+bmFtZSwgdG90YWwpOworICB9CisKKyAgc3Bpbm5lcl9jb3VudCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IG9wdGlvbl9yZXBldGl0aW9uczsgaSsrKQorICAgIFNJWkVfSVRFUkFUSU9OCisgICAgICBTSVpFMl9JVEVSQVRJT04KKworICAgICAgU0hJRlRfSVRFUkFUSU9OCisgICAgICBNVUxUSVBMSUVSX0lURVJBVElPTgorICAgICAgRElWSVNPUl9JVEVSQVRJT04KKyAgICAgIENBUlJZX0lURVJBVElPTiAvKiBtdXN0IGJlIGFmdGVyIGRpdmlzb3IgKi8KKyAgICAgIFRfUkFORF9JVEVSQVRJT04KKworICAgICAgSElHSF9JVEVSQVRJT04oZCwwLCB0ci0+ZHN0WzBdKQorICAgICAgSElHSF9JVEVSQVRJT04oZCwxLCB0ci0+ZHN0WzFdKQorICAgICAgSElHSF9JVEVSQVRJT04ocywwLCB0ci0+c3JjWzBdKQorICAgICAgSElHSF9JVEVSQVRJT04ocywxLCB0ci0+c3JjWzFdKQorCisgICAgICBBTElHTl9JVEVSQVRJT04oZCwwLCB0ci0+ZHN0WzBdKQorICAgICAgQUxJR05fSVRFUkFUSU9OKGQsMSwgdHItPmRzdFsxXSkKKyAgICAgIEFMSUdOX0lURVJBVElPTihzLDAsIHRyLT5zcmNbMF0pCisgICAgICBBTElHTl9JVEVSQVRJT04ocywxLCB0ci0+c3JjWzFdKQorCisgICAgICBPVkVSTEFQX0lURVJBVElPTgorICAgICAgdHJ5X29uZSgpOworCisgIHByaW50ZigiXG4iKTsKK30KKworCisvKiBVc3VhbGx5IHByaW50X2FsbCgpIGRvZXNuJ3Qgc2hvdyBtdWNoLCBidXQgaXQgbWlnaHQgZ2l2ZSBhIGhpbnQgYXMgdG8KKyAgIHdoZXJlIHRoZSBmdW5jdGlvbiB3YXMgdXAgdG8gd2hlbiBpdCBkaWVkLiAqLwordm9pZAordHJhcCAoaW50IHNpZykKK3sKKyAgY29uc3QgY2hhciAqbmFtZSA9ICJub25hbWUiOworCisgIHN3aXRjaCAoc2lnKSB7CisgIGNhc2UgU0lHSUxMOiAgbmFtZSA9ICJTSUdJTEwiOyAgYnJlYWs7CisjaWZkZWYgU0lHQlVTCisgIGNhc2UgU0lHQlVTOiAgbmFtZSA9ICJTSUdCVVMiOyAgYnJlYWs7CisjZW5kaWYKKyAgY2FzZSBTSUdTRUdWOiBuYW1lID0gIlNJR1NFR1YiOyBicmVhazsKKyAgY2FzZSBTSUdGUEU6ICBuYW1lID0gIlNJR0ZQRSI7ICBicmVhazsKKyAgfQorCisgIHByaW50ZiAoIlxuXG5TSUdOQUwgVFJBUDogJXNcbiIsIG5hbWUpOworCisgIHN3aXRjaCAodHJhcF9sb2NhdGlvbikgeworICBjYXNlIFRSQVBfUkVGOgorICAgIHByaW50ZiAoIiAgaW4gcmVmZXJlbmNlIGZ1bmN0aW9uOiAlc1xuIiwgdHItPnJlZmVyZW5jZV9uYW1lKTsKKyAgICBicmVhazsKKyAgY2FzZSBUUkFQX0ZVTjoKKyAgICBwcmludGYgKCIgIGluIHRlc3QgZnVuY3Rpb246ICVzXG4iLCBjaG9pY2UtPm5hbWUpOworICAgIHByaW50X2FsbCAoKTsKKyAgICBicmVhazsKKyAgY2FzZSBUUkFQX1NFVFVQUzoKKyAgICBwcmludGYgKCIgIGluIHBhcmFtZXRlciBzZXR1cHNcbiIpOworICAgIHByaW50X2FsbCAoKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBwcmludGYgKCIgIHNvbWV3aGVyZSB1bmtub3duXG4iKTsKKyAgICBicmVhazsKKyAgfQorICBleGl0ICgxKTsKK30KKworCit2b2lkCit0cnlfaW5pdCAodm9pZCkKK3sKKyNpZiBIQVZFX0dFVFBBR0VTSVpFCisgIC8qIFByZWZlciBnZXRwYWdlc2l6ZSgpIG92ZXIgc3lzY29uZigpLCBzaW5jZSBvbiBTdW5PUyA0IHN5c2NvbmYoKSBkb2Vzbid0CisgICAgIGtub3cgX1NDX1BBR0VTSVpFLiAqLworICBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOworI2Vsc2UKKyNpZiBIQVZFX1NZU0NPTkYKKyAgaWYgKChwYWdlc2l6ZSA9IHN5c2NvbmYgKF9TQ19QQUdFU0laRSkpID09IC0xKQorICAgIHsKKyAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgbGludXggbWFuIHBhZ2UsIHN5c2NvbmYgZG9lc24ndCBzZXQgZXJybm8gKi8KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBnZXQgc3lzY29uZiBfU0NfUEFHRVNJWkVcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorI2Vsc2UKK0Vycm9yLCBlcnJvciwgY2Fubm90IGdldCBwYWdlIHNpemUKKyNlbmRpZgorI2VuZGlmCisKKyAgcHJpbnRmICgicGFnZXNpemUgaXMgMHglbFggYnl0ZXNcbiIsIHBhZ2VzaXplKTsKKworICBzaWduYWwgKFNJR0lMTCwgIHRyYXApOworI2lmZGVmIFNJR0JVUworICBzaWduYWwgKFNJR0JVUywgIHRyYXApOworI2VuZGlmCisgIHNpZ25hbCAoU0lHU0VHViwgdHJhcCk7CisgIHNpZ25hbCAoU0lHRlBFLCAgdHJhcCk7CisKKyAgeworICAgIGludCAgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU09VUkNFUzsgaSsrKQorICAgICAgeworCW1hbGxvY19yZWdpb24gKCZzW2ldLnJlZ2lvbiwgMipvcHRpb25fbGFzdHNpemUrQUxJR05NRU5UUy0xKTsKKwlwcmludGYgKCJzWyVkXSAlcCB0byAlcCAoMHglbFggYnl0ZXMpXG4iLAorCQlpLCAodm9pZCAqKSAoc1tpXS5yZWdpb24ucHRyKSwKKwkJKHZvaWQgKikgKHNbaV0ucmVnaW9uLnB0ciArIHNbaV0ucmVnaW9uLnNpemUpLAorCQkobG9uZykgc1tpXS5yZWdpb24uc2l6ZSAqIEdNUF9MSU1CX0JZVEVTKTsKKyAgICAgIH0KKworI2RlZmluZSBJTklUX0VBQ0goZSxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fREVTVFM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW1hbGxvY19yZWdpb24gKCZlLmRbaV0ucmVnaW9uLCAyKm9wdGlvbl9sYXN0c2l6ZStBTElHTk1FTlRTLTEpOyBcCisJcHJpbnRmICgiJXMgZFslZF0gJXAgdG8gJXAgKDB4JWxYIGJ5dGVzKVxuIiwgICAgICAgICAgICAgICAgICAgIFwKKwkJZXMsIGksICh2b2lkICopIChlLmRbaV0ucmVnaW9uLnB0ciksCQkJXAorCQkodm9pZCAqKSAgKGUuZFtpXS5yZWdpb24ucHRyICsgZS5kW2ldLnJlZ2lvbi5zaXplKSwJXAorCQkobG9uZykgZS5kW2ldLnJlZ2lvbi5zaXplICogR01QX0xJTUJfQllURVMpOyAgICAgICAgIFwKKyAgICAgIH0KKworICAgIElOSVRfRUFDSChyZWYsICJyZWYiKTsKKyAgICBJTklUX0VBQ0goZnVuLCAiZnVuIik7CisgIH0KK30KKworaW50CitzdHJtYXRjaF93aWxkIChjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHIpCit7CisgIHNpemVfdCAgcGxlbiwgc2xlbjsKKworICAvKiB3aWxkY2FyZCBhdCBzdGFydCAqLworICBpZiAocGF0dGVyblswXSA9PSAnKicpCisgICAgeworICAgICAgcGF0dGVybisrOworICAgICAgcGxlbiA9IHN0cmxlbiAocGF0dGVybik7CisgICAgICBzbGVuID0gc3RybGVuIChzdHIpOworICAgICAgcmV0dXJuIChwbGVuID09IDAKKwkgICAgICB8fCAoc2xlbiA+PSBwbGVuICYmIG1lbWNtcCAocGF0dGVybiwgc3RyK3NsZW4tcGxlbiwgcGxlbikgPT0gMCkpOworICAgIH0KKworICAvKiB3aWxkY2FyZCBhdCBlbmQgKi8KKyAgcGxlbiA9IHN0cmxlbiAocGF0dGVybik7CisgIGlmIChwbGVuID49IDEgJiYgcGF0dGVybltwbGVuLTFdID09ICcqJykKKyAgICByZXR1cm4gKG1lbWNtcCAocGF0dGVybiwgc3RyLCBwbGVuLTEpID09IDApOworCisgIC8qIG5vIHdpbGRjYXJkcyAqLworICByZXR1cm4gKHN0cmNtcCAocGF0dGVybiwgc3RyKSA9PSAwKTsKK30KKwordm9pZAordHJ5X25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGludCAgZm91bmQgPSAwOworICBpbnQgIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChjaG9pY2VfYXJyYXkpOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm1hdGNoX3dpbGQgKG5hbWUsIGNob2ljZV9hcnJheVtpXS5uYW1lKSkKKwl7CisJICBjaG9pY2UgPSAmY2hvaWNlX2FycmF5W2ldOworCSAgdHIgPSAmcGFyYW1bY2hvaWNlLT50eXBlXTsKKwkgIHRyeV9tYW55ICgpOworCSAgZm91bmQgPSAxOworCX0KKyAgICB9CisKKyAgaWYgKCFmb3VuZCkKKyAgICB7CisgICAgICBwcmludGYgKCIlcyB1bmtub3duXG4iLCBuYW1lKTsKKyAgICAgIC8qIGV4aXQgKDEpOyAqLworICAgIH0KK30KKworCit2b2lkCit1c2FnZSAoY29uc3QgY2hhciAqcHJvZykKK3sKKyAgaW50ICBjb2wgPSAwOworICBpbnQgIGk7CisKKyAgcHJpbnRmICgiVXNhZ2U6ICVzIFtvcHRpb25zXSBmdW5jdGlvbi4uLlxuIiwgcHJvZyk7CisgIHByaW50ZiAoIiAgICAtMSAgICAgICAgdXNlIGxpbWIgZGF0YSAxLDIsMyxldGNcbiIpOworICBwcmludGYgKCIgICAgLTkgICAgICAgIHVzZSBsaW1iIGRhdGEgYWxsIDB4RkYuLkZGc1xuIik7CisgIHByaW50ZiAoIiAgICAtYSB6ZXJvcyAgdXNlIGxpbWIgZGF0YSBhbGwgemVyb3NcbiIpOworICBwcmludGYgKCIgICAgLWEgZmZzICAgIHVzZSBsaW1iIGRhdGEgYWxsIDB4RkYuLkZGcyAoc2FtZSBhcyAtOSlcbiIpOworICBwcmludGYgKCIgICAgLWEgMmZkICAgIHVzZSBkYXRhIDB4MkZGRi4uLkZGRkRcbiIpOworICBwcmludGYgKCIgICAgLXAgICAgICAgIHByaW50IGVhY2ggY2FzZSB0cmllZCAodHJ5IHRoaXMgaWYgc2VnIGZhdWx0aW5nKVxuIik7CisgIHByaW50ZiAoIiAgICAtUiAgICAgICAgc2VlZCByYW5kb20gbnVtYmVycyBmcm9tIHRpbWUoKVxuIik7CisgIHByaW50ZiAoIiAgICAtciByZXBzICAgc2V0IHJlcGV0aXRpb25zIChkZWZhdWx0ICVkKVxuIiwgREVGQVVMVF9SRVBFVElUSU9OUyk7CisgIHByaW50ZiAoIiAgICAtcyBzaXplICAgc3RhcnRpbmcgc2l6ZSB0byB0ZXN0XG4iKTsKKyAgcHJpbnRmICgiICAgIC1TIHNpemUyICBzdGFydGluZyBzaXplMiB0byB0ZXN0XG4iKTsKKyAgcHJpbnRmICgiICAgIC1zIHMxLXMyICByYW5nZSBvZiBzaXplcyB0byB0ZXN0XG4iKTsKKyAgcHJpbnRmICgiICAgIC1XICAgICAgICBkb24ndCBzaG93IHRoZSBzcGlubmVyICh1c2UgdGhpcyBpbiBnZGIpXG4iKTsKKyAgcHJpbnRmICgiICAgIC16ICAgICAgICBkaXNhYmxlIG1wcm90ZWN0KCkgcmVkem9uZXNcbiIpOworICBwcmludGYgKCJEZWZhdWx0IGRhdGEgaXMgcmVmbXBuX3JhbmRvbSgpIGFuZCByZWZtcG5fcmFuZG9tMigpLlxuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIkZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB0ZXN0ZWQ6XG4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGNob2ljZV9hcnJheSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoY29sICsgMSArIHN0cmxlbiAoY2hvaWNlX2FycmF5W2ldLm5hbWUpID4gNzkpCisJeworCSAgcHJpbnRmICgiXG4iKTsKKwkgIGNvbCA9IDA7CisJfQorICAgICAgcHJpbnRmICgiICVzIiwgY2hvaWNlX2FycmF5W2ldLm5hbWUpOworICAgICAgY29sICs9IDEgKyBzdHJsZW4gKGNob2ljZV9hcnJheVtpXS5uYW1lKTsKKyAgICB9CisgIHByaW50ZiAoIlxuIik7CisKKyAgZXhpdCgxKTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCAgaTsKKworICAvKiB1bmJ1ZmZlcmVkIG91dHB1dCAqLworICBzZXRidWYgKHN0ZG91dCwgTlVMTCk7CisgIHNldGJ1ZiAoc3RkZXJyLCBOVUxMKTsKKworICAvKiBkZWZhdWx0IHRyYWNlIGluIGhleCwgYW5kIGluIHVwcGVyLWNhc2Ugc28gY2FuIHBhc3RlIGludG8gYmMgKi8KKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBwYXJhbV9pbml0ICgpOworCisgIHsKKyAgICB1bnNpZ25lZCBsb25nICBzZWVkID0gMTIzOworICAgIGludCAgIG9wdDsKKworICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIxOWE6YjpFOnBScjpTOnM6V3oiKSkgIT0gRU9GKQorICAgICAgeworCXN3aXRjaCAob3B0KSB7CisJY2FzZSAnMSc6CisJICAvKiB1c2UgbGltYiBkYXRhIHZhbHVlcyAxLCAyLCAzLCAuLi4gZXRjICovCisJICBvcHRpb25fZGF0YSA9IERBVEFfU0VROworCSAgYnJlYWs7CisJY2FzZSAnOSc6CisJICAvKiB1c2UgbGltYiBkYXRhIHZhbHVlcyAweEZGRi4uLkZGRiBhbHdheXMgKi8KKwkgIG9wdGlvbl9kYXRhID0gREFUQV9GRlM7CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGlmIChzdHJjbXAgKG9wdGFyZywgInplcm9zIikgPT0gMCkgICAgIG9wdGlvbl9kYXRhID0gREFUQV9aRVJPUzsKKwkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAic2VxIikgPT0gMCkgIG9wdGlvbl9kYXRhID0gREFUQV9TRVE7CisJICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImZmcyIpID09IDApICBvcHRpb25fZGF0YSA9IERBVEFfRkZTOworCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICIyZmQiKSA9PSAwKSAgb3B0aW9uX2RhdGEgPSBEQVRBXzJGRDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVucmVjb2duaXNlZCBkYXRhIG9wdGlvbjogJXNcbiIsIG9wdGFyZyk7CisJICAgICAgZXhpdCAoMSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ2InOgorCSAgbXBfdHJhY2VfYmFzZSA9IGF0b2kgKG9wdGFyZyk7CisJICBicmVhazsKKwljYXNlICdFJzoKKwkgIC8qIHJlLXNlZWQgKi8KKwkgIHNzY2FuZiAob3B0YXJnLCAiJWx1IiwgJnNlZWQpOworCSAgcHJpbnRmICgiUmUtc2VlZGluZyB3aXRoICVsdVxuIiwgc2VlZCk7CisJICBicmVhazsKKwljYXNlICdwJzoKKwkgIG9wdGlvbl9wcmludCA9IDE7CisJICBicmVhazsKKwljYXNlICdSJzoKKwkgIC8qIHJhbmRvbWl6ZSAqLworCSAgc2VlZCA9IHRpbWUgKE5VTEwpOworCSAgcHJpbnRmICgiU2VlZGluZyB3aXRoICVsdSwgcmUtcnVuIHVzaW5nIFwiLUUgJWx1XCJcbiIsIHNlZWQsIHNlZWQpOworCSAgYnJlYWs7CisJY2FzZSAncic6CisJICBvcHRpb25fcmVwZXRpdGlvbnMgPSBhdG9pIChvcHRhcmcpOworCSAgYnJlYWs7CisJY2FzZSAncyc6CisJICB7CisJICAgIGNoYXIgICpwOworCSAgICBvcHRpb25fZmlyc3RzaXplID0gc3RydG9sIChvcHRhcmcsIDAsIDApOworCSAgICBpZiAoKHAgPSBzdHJjaHIgKG9wdGFyZywgJy0nKSkgIT0gTlVMTCkKKwkgICAgICBvcHRpb25fbGFzdHNpemUgPSBzdHJ0b2wgKHArMSwgMCwgMCk7CisJICB9CisJICBicmVhazsKKwljYXNlICdTJzoKKwkgIC8qIC1TIDxzaXplPiBzZXRzIHRoZSBzdGFydGluZyBzaXplIGZvciB0aGUgc2Vjb25kIG9mIGEgdHdvIHNpemUKKwkgICAgIHJvdXRpbmUgKGxpa2UgbXBuX211bF9iYXNlY2FzZSkgKi8KKwkgIG9wdGlvbl9maXJzdHNpemUyID0gc3RydG9sIChvcHRhcmcsIDAsIDApOworCSAgYnJlYWs7CisJY2FzZSAnVyc6CisJICAvKiB1c2UgdGhpcyB3aGVuIHJ1bm5pbmcgaW4gdGhlIGRlYnVnZ2VyICovCisJICBvcHRpb25fc3Bpbm5lciA9IDA7CisJICBicmVhazsKKwljYXNlICd6JzoKKwkgIC8qIGRpc2FibGUgcmVkem9uZXMgKi8KKwkgIG9wdGlvbl9yZWR6b25lcyA9IDA7CisJICBicmVhazsKKwljYXNlICc/JzoKKwkgIHVzYWdlIChhcmd2WzBdKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIH0KKworICAgIGdtcF9yYW5kaW5pdF9kZWZhdWx0IChfX2dtcF9yYW5kcyk7CisgICAgX19nbXBfcmFuZHNfaW5pdGlhbGl6ZWQgPSAxOworICAgIGdtcF9yYW5kc2VlZF91aSAoX19nbXBfcmFuZHMsIHNlZWQpOworICB9CisKKyAgdHJ5X2luaXQoKTsKKworICBpZiAoYXJnYyA8PSBvcHRpbmQpCisgICAgdXNhZ2UgKGFyZ3ZbMF0pOworCisgIGZvciAoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkrKykKKyAgICB0cnlfbmFtZSAoYXJndltpXSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW1vcnkuYyBiL3Rlc3RzL21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjU0YjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW1vcnkuYwpAQCAtMCwwICsxLDI0NiBAQAorLyogTWVtb3J5IGFsbG9jYXRpb24gdXNlZCBkdXJpbmcgdGVzdHMuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDA3LCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIGZvciBhYm9ydCAqLworI2luY2x1ZGUgPHN0cmluZy5oPgkJLyogZm9yIG1lbWNweSwgbWVtY21wICovCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaWYgR01QX0xJTUJfQklUUyA9PSA2NAorI2RlZmluZSBQQVRURVJOMSBDTlNUX0xJTUIoMHhjYWZlYmFiZWRlYWRiZWVmKQorI2RlZmluZSBQQVRURVJOMiBDTlNUX0xJTUIoMHhhYmFjYWRhYmFlZGVlZGFiKQorI2Vsc2UKKyNkZWZpbmUgUEFUVEVSTjEgQ05TVF9MSU1CKDB4Y2FmZWJhYmUpCisjZGVmaW5lIFBBVFRFUk4yIENOU1RfTElNQigweGRlYWRiZWVmKQorI2VuZGlmCisKKyNpZiBIQVZFX0lOVFBUUl9UCisjZGVmaW5lIFBUUkxJTUIocCkgICgobXBfbGltYl90KSAoaW50cHRyX3QpIHApCisjZWxzZQorI2RlZmluZSBQVFJMSU1CKHApICAoKG1wX2xpbWJfdCkgKHNpemVfdCkgcCkKKyNlbmRpZgorCisvKiBFYWNoIGJsb2NrIGFsbG9jYXRlZCBpcyBhIHNlcGFyYXRlIG1hbGxvYywgZm9yIHRoZSBiZW5lZml0IG9mIGEgcmVkem9uaW5nCisgICBtYWxsb2MgZGVidWdnZXIgZHVyaW5nIGRldmVsb3BtZW50IG9yIHdoZW4gYnVnIGh1bnRpbmcuCisKKyAgIFNpemVzIHBhc3NlZCB3aGVuIHJlYWxsb2NhdGluZyBvciBmcmVlaW5nIGFyZSBjaGVja2VkICh0aGUgZGVmYXVsdAorICAgcm91dGluZXMgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSkuCisKKyAgIE1lbW9yeSBsZWFrcyBhcmUgY2hlY2tlZCBieSByZXF1aXJpbmcgdGhhdCBhbGwgYmxvY2tzIGhhdmUgYmVlbiBmcmVlZAorICAgd2hlbiB0ZXN0c19tZW1vcnlfZW5kKCkgaXMgY2FsbGVkLiAgVGVzdCBwcm9ncmFtcyBtdXN0IGJlIHN1cmUgdG8gaGF2ZQorICAgImNsZWFyInMgZm9yIGFsbCB0ZW1wb3JhcnkgdmFyaWFibGVzIHVzZWQuICAqLworCisKK3N0cnVjdCBoZWFkZXIgeworICB2b2lkICAgICAgICAgICAqcHRyOworICBzaXplX3QgICAgICAgICBzaXplOworICBzdHJ1Y3QgaGVhZGVyICAqbmV4dDsKK307CisKK3N0cnVjdCBoZWFkZXIgICp0ZXN0c19tZW1vcnlfbGlzdCA9IE5VTEw7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBmb3VuZCBibG9jayAoc28gaXQgY2FuIGJlIHVwZGF0ZWQKKyAgIHdoZW4gdW5saW5raW5nKS4gKi8KK3N0cnVjdCBoZWFkZXIgKioKK3Rlc3RzX21lbW9yeV9maW5kICh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBoZWFkZXIgICoqaHA7CisKKyAgZm9yIChocCA9ICZ0ZXN0c19tZW1vcnlfbGlzdDsgKmhwICE9IE5VTEw7IGhwID0gJigoKmhwKS0+bmV4dCkpCisgICAgaWYgKCgqaHApLT5wdHIgPT0gcHRyKQorICAgICAgcmV0dXJuIGhwOworCisgIHJldHVybiBOVUxMOworfQorCitpbnQKK3Rlc3RzX21lbW9yeV92YWxpZCAodm9pZCAqcHRyKQoreworICByZXR1cm4gKHRlc3RzX21lbW9yeV9maW5kIChwdHIpICE9IE5VTEwpOworfQorCit2b2lkICoKK3Rlc3RzX2FsbG9jYXRlIChzaXplX3Qgc2l6ZSkKK3sKKyAgc3RydWN0IGhlYWRlciAgKmg7CisgIHZvaWQgKnJwdHIsICpwdHI7CisgIG1wX2xpbWJfdCBQQVRURVJOMl92YXI7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJ0ZXN0c19hbGxvY2F0ZSgpOiBhdHRlbXB0IHRvIGFsbG9jYXRlIDAgYnl0ZXNcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGggPSAoc3RydWN0IGhlYWRlciAqKSBfX2dtcF9kZWZhdWx0X2FsbG9jYXRlIChzaXplb2YgKCpoKSk7CisgIGgtPm5leHQgPSB0ZXN0c19tZW1vcnlfbGlzdDsKKyAgdGVzdHNfbWVtb3J5X2xpc3QgPSBoOworCisgIHJwdHIgPSBfX2dtcF9kZWZhdWx0X2FsbG9jYXRlIChzaXplICsgMiAqIHNpemVvZiAobXBfbGltYl90KSk7CisgIHB0ciA9ICh2b2lkICopICgoZ21wX2ludHB0cl90KSBycHRyICsgc2l6ZW9mIChtcF9saW1iX3QpKTsKKworICAqKChtcF9saW1iX3QgKikgKChnbXBfaW50cHRyX3QpIHB0ciAtIHNpemVvZiAobXBfbGltYl90KSkpCisgICAgPSBQQVRURVJOMSAtIFBUUkxJTUIgKHB0cik7CisgIFBBVFRFUk4yX3ZhciA9IFBBVFRFUk4yIC0gUFRSTElNQiAocHRyKTsKKyAgbWVtY3B5ICgodm9pZCAqKSAoKGdtcF9pbnRwdHJfdCkgcHRyICsgc2l6ZSksICZQQVRURVJOMl92YXIsIHNpemVvZiAobXBfbGltYl90KSk7CisKKyAgaC0+c2l6ZSA9IHNpemU7CisgIGgtPnB0ciA9IHB0cjsKKyAgcmV0dXJuIGgtPnB0cjsKK30KKwordm9pZCAqCit0ZXN0c19yZWFsbG9jYXRlICh2b2lkICpwdHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKQoreworICBzdHJ1Y3QgaGVhZGVyICAqKmhwLCAqaDsKKyAgdm9pZCAqcnB0cjsKKyAgbXBfbGltYl90IFBBVFRFUk4yX3ZhcjsKKworICBpZiAobmV3X3NpemUgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJ0ZXN0c19yZWFsbG9jYXRlKCk6IGF0dGVtcHQgdG8gcmVhbGxvY2F0ZSAlcCB0byAwIGJ5dGVzXG4iLAorCSAgICAgICBwdHIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGhwID0gdGVzdHNfbWVtb3J5X2ZpbmQgKHB0cik7CisgIGlmIChocCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3RzX3JlYWxsb2NhdGUoKTogYXR0ZW1wdCB0byByZWFsbG9jYXRlIGJhZCBwb2ludGVyICVwXG4iLAorCSAgICAgICBwdHIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBoID0gKmhwOworCisgIGlmIChoLT5zaXplICE9IG9sZF9zaXplKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3RzX3JlYWxsb2NhdGUoKTogYmFkIG9sZCBzaXplICVsdSwgc2hvdWxkIGJlICVsdVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9sZF9zaXplLCAodW5zaWduZWQgbG9uZykgaC0+c2l6ZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKCooKG1wX2xpbWJfdCAqKSAoKGdtcF9pbnRwdHJfdCkgcHRyIC0gc2l6ZW9mIChtcF9saW1iX3QpKSkKKyAgICAgICE9IFBBVFRFUk4xIC0gUFRSTElNQiAocHRyKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJpbiByZWFsbG9jOiByZWR6b25lIGNsb2JiZXJlZCBiZWZvcmUgYmxvY2tcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBQQVRURVJOMl92YXIgPSBQQVRURVJOMiAtIFBUUkxJTUIgKHB0cik7CisgIGlmIChtZW1jbXAgKCh2b2lkICopICgoZ21wX2ludHB0cl90KSBwdHIgKyBoLT5zaXplKSwgJlBBVFRFUk4yX3Zhciwgc2l6ZW9mIChtcF9saW1iX3QpKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJpbiByZWFsbG9jOiByZWR6b25lIGNsb2JiZXJlZCBhZnRlciBibG9ja1xuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcnB0ciA9IF9fZ21wX2RlZmF1bHRfcmVhbGxvY2F0ZSAoKHZvaWQgKikgKChnbXBfaW50cHRyX3QpIHB0ciAtIHNpemVvZiAobXBfbGltYl90KSksCisJCQkJIG9sZF9zaXplICsgMiAqIHNpemVvZiAobXBfbGltYl90KSwKKwkJCQkgbmV3X3NpemUgKyAyICogc2l6ZW9mIChtcF9saW1iX3QpKTsKKyAgcHRyID0gKHZvaWQgKikgKChnbXBfaW50cHRyX3QpIHJwdHIgKyBzaXplb2YgKG1wX2xpbWJfdCkpOworCisgICooKG1wX2xpbWJfdCAqKSAoKGdtcF9pbnRwdHJfdCkgcHRyIC0gc2l6ZW9mIChtcF9saW1iX3QpKSkKKyAgICA9IFBBVFRFUk4xIC0gUFRSTElNQiAocHRyKTsKKyAgUEFUVEVSTjJfdmFyID0gUEFUVEVSTjIgLSBQVFJMSU1CIChwdHIpOworICBtZW1jcHkgKCh2b2lkICopICgoZ21wX2ludHB0cl90KSBwdHIgKyBuZXdfc2l6ZSksICZQQVRURVJOMl92YXIsIHNpemVvZiAobXBfbGltYl90KSk7CisKKyAgaC0+c2l6ZSA9IG5ld19zaXplOworICBoLT5wdHIgPSBwdHI7CisgIHJldHVybiBoLT5wdHI7Cit9CisKK3N0cnVjdCBoZWFkZXIgKioKK3Rlc3RzX2ZyZWVfZmluZCAodm9pZCAqcHRyKQoreworICBzdHJ1Y3QgaGVhZGVyICAqKmhwID0gdGVzdHNfbWVtb3J5X2ZpbmQgKHB0cik7CisgIGlmIChocCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3RzX2ZyZWUoKTogYXR0ZW1wdCB0byBmcmVlIGJhZCBwb2ludGVyICVwXG4iLAorCSAgICAgICBwdHIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICByZXR1cm4gaHA7Cit9CisKK3ZvaWQKK3Rlc3RzX2ZyZWVfbm9zaXplICh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBoZWFkZXIgICoqaHAgPSB0ZXN0c19mcmVlX2ZpbmQgKHB0cik7CisgIHN0cnVjdCBoZWFkZXIgICpoID0gKmhwOworICBtcF9saW1iX3QgUEFUVEVSTjJfdmFyOworCisgICpocCA9IGgtPm5leHQ7ICAvKiB1bmxpbmsgKi8KKworICBpZiAoKigobXBfbGltYl90ICopICgoZ21wX2ludHB0cl90KSBwdHIgLSBzaXplb2YgKG1wX2xpbWJfdCkpKQorICAgICAgIT0gUEFUVEVSTjEgLSBQVFJMSU1CIChwdHIpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImluIGZyZWU6IHJlZHpvbmUgY2xvYmJlcmVkIGJlZm9yZSBibG9ja1xuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIFBBVFRFUk4yX3ZhciA9IFBBVFRFUk4yIC0gUFRSTElNQiAocHRyKTsKKyAgaWYgKG1lbWNtcCAoKHZvaWQgKikgKChnbXBfaW50cHRyX3QpIHB0ciArIGgtPnNpemUpLCAmUEFUVEVSTjJfdmFyLCBzaXplb2YgKG1wX2xpbWJfdCkpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImluIGZyZWU6IHJlZHpvbmUgY2xvYmJlcmVkIGFmdGVyIGJsb2NrXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBfX2dtcF9kZWZhdWx0X2ZyZWUgKCh2b2lkICopICgoZ21wX2ludHB0cl90KSBwdHIgLSBzaXplb2YobXBfbGltYl90KSksCisJCSAgICAgIGgtPnNpemUgKyAyICogc2l6ZW9mIChtcF9saW1iX3QpKTsKKyAgX19nbXBfZGVmYXVsdF9mcmVlIChoLCBzaXplb2YgKCpoKSk7Cit9CisKK3ZvaWQKK3Rlc3RzX2ZyZWUgKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIHN0cnVjdCBoZWFkZXIgICoqaHAgPSB0ZXN0c19mcmVlX2ZpbmQgKHB0cik7CisgIHN0cnVjdCBoZWFkZXIgICpoID0gKmhwOworCisgIGlmIChoLT5zaXplICE9IHNpemUpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAidGVzdHNfZnJlZSgpOiBiYWQgc2l6ZSAlbHUsIHNob3VsZCBiZSAlbHVcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplLCAodW5zaWduZWQgbG9uZykgaC0+c2l6ZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgdGVzdHNfZnJlZV9ub3NpemUgKHB0cik7Cit9CisKK3ZvaWQKK3Rlc3RzX21lbW9yeV9zdGFydCAodm9pZCkKK3sKKyAgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgKHRlc3RzX2FsbG9jYXRlLCB0ZXN0c19yZWFsbG9jYXRlLCB0ZXN0c19mcmVlKTsKK30KKwordm9pZAordGVzdHNfbWVtb3J5X2VuZCAodm9pZCkKK3sKKyAgaWYgKHRlc3RzX21lbW9yeV9saXN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGhlYWRlciAgKmg7CisgICAgICB1bnNpZ25lZCAgY291bnQ7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3RzX21lbW9yeV9lbmQoKTogbm90IGFsbCBtZW1vcnkgZnJlZWRcbiIpOworCisgICAgICBjb3VudCA9IDA7CisgICAgICBmb3IgKGggPSB0ZXN0c19tZW1vcnlfbGlzdDsgaCAhPSBOVUxMOyBoID0gaC0+bmV4dCkKKwljb3VudCsrOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICAgJXUgYmxvY2tzIHJlbWFpbmluZ1xuIiwgY291bnQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWlzYy5jIGIvdGVzdHMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9taXNjLmMKQEAgLTAsMCArMSw2MDggQEAKKy8qIE1pc2NlbGxhbmVvdXMgdGVzdCBwcm9ncmFtIHN1cHBvcnQgcm91dGluZXMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMsIDIwMDUsIDIwMTMsIDIwMTUsIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIGZvciBnZXRlbnYgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfRkxPQVRfSAorI2luY2x1ZGUgPGZsb2F0Lmg+ICAgICAgLyogZm9yIERCTF9NQU5UX0RJRyAqLworI2VuZGlmCisKKyNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4gIC8qIGZvciBzdHJ1Y3QgdGltZXZhbCAqLworIyBpbmNsdWRlIDx0aW1lLmg+CisjZWxzZQorIyBpZiBIQVZFX1NZU19USU1FX0gKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIFRoZSB2YXJpb3VzIHRlc3RzIHNldHVwcyBhbmQgZmluYWwgY2hlY2tzLCBjb2xsZWN0ZWQgdXAgdG9nZXRoZXIuICovCit2b2lkCit0ZXN0c19zdGFydCAodm9pZCkKK3sKKyAgY2hhciB2ZXJzaW9uWzEwXTsKKyAgc25wcmludGYgKHZlcnNpb24sIDEwLCAiJXUuJXUuJXUiLAorCSAgICBfX0dOVV9NUF9WRVJTSU9OLAorCSAgICBfX0dOVV9NUF9WRVJTSU9OX01JTk9SLAorCSAgICBfX0dOVV9NUF9WRVJTSU9OX1BBVENITEVWRUwpOworCisgIGlmIChzdHJjbXAgKGdtcF92ZXJzaW9uLCB2ZXJzaW9uKSAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInRlc3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBuZXdseSBjb21waWxlZCBsaWJyYXJ5XG4iKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgbG9jYWwgdmVyc2lvbiBpczogJXNcbiIsIHZlcnNpb24pOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBsaW5rZWQgdmVyc2lvbiBpczogJXNcbiIsIGdtcF92ZXJzaW9uKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICAvKiBkb24ndCBidWZmZXIsIHNvIG91dHB1dCBpcyBub3QgbG9zdCBpZiBhIHRlc3QgY2F1c2VzIGEgc2VndiBldGMgKi8KKyAgc2V0YnVmIChzdGRvdXQsIE5VTEwpOworICBzZXRidWYgKHN0ZGVyciwgTlVMTCk7CisKKyAgdGVzdHNfbWVtb3J5X3N0YXJ0ICgpOworICB0ZXN0c19yYW5kX3N0YXJ0ICgpOworfQordm9pZAordGVzdHNfZW5kICh2b2lkKQoreworICB0ZXN0c19yYW5kX2VuZCAoKTsKKyAgdGVzdHNfbWVtb3J5X2VuZCAoKTsKK30KKworc3RhdGljIHZvaWQKK3NlZWRfZnJvbV90b2QgKGdtcF9yYW5kc3RhdGVfcHRyICByYW5kcykKK3sKKyAgdW5zaWduZWQgbG9uZyBzZWVkOworI2lmIEhBVkVfR0VUVElNRU9GREFZCisgIHN0cnVjdCB0aW1ldmFsICB0djsKKyAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOworICBzZWVkID0gdHYudHZfc2VjIF4gKCh1bnNpZ25lZCBsb25nKSB0di50dl91c2VjIDw8IDEyKTsKKyAgc2VlZCAmPSAweGZmZmZmZmZmOworI2Vsc2UKKyAgdGltZV90ICB0djsKKyAgdGltZSAoJnR2KTsKKyAgc2VlZCA9IHR2OworI2VuZGlmCisgIGdtcF9yYW5kc2VlZF91aSAocmFuZHMsIHNlZWQpOworICBwcmludGYgKCJTZWVkIEdNUF9DSEVDS19SQU5ET01JWkU9JWx1IChpbmNsdWRlIHRoaXMgaW4gYnVnIHJlcG9ydHMpXG4iLCBzZWVkKTsKK30KKworc3RhdGljIHZvaWQKK3NlZWRfZnJvbV91cmFuZG9tIChnbXBfcmFuZHN0YXRlX3B0ciByYW5kcywgRklMRSAqZnMpCit7CisgIG1wel90IHNlZWQ7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzZdOworICBmcmVhZCAoYnVmLCAxLCA2LCBmcyk7CisgIG1wel9pbml0IChzZWVkKTsKKyAgbXB6X2ltcG9ydCAoc2VlZCwgNiwgMSwgMSwgMCwgMCwgYnVmKTsKKyAgZ21wX3JhbmRzZWVkIChyYW5kcywgc2VlZCk7CisgIGdtcF9wcmludGYgKCJTZWVkIEdNUF9DSEVDS19SQU5ET01JWkU9JVpkIChpbmNsdWRlIHRoaXMgaW4gYnVnIHJlcG9ydHMpXG4iLCBzZWVkKTsKKyAgbXB6X2NsZWFyIChzZWVkKTsKK30KKwordm9pZAordGVzdHNfcmFuZF9zdGFydCAodm9pZCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzOworICBjaGFyICAgICAgICAgICAqc2VlZF9zdHJpbmc7CisKKyAgaWYgKF9fZ21wX3JhbmRzX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlBsZWFzZSBsZXQgdGVzdHNfc3RhcnQoKSBpbml0aWFsaXplIHRoZSBnbG9iYWwgX19nbXBfcmFuZHMuXG4iKTsKKyAgICAgIHByaW50ZiAoImllLiBlbnN1cmUgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2YgUkFORFMuXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBnbXBfcmFuZGluaXRfZGVmYXVsdCAoX19nbXBfcmFuZHMpOworICBfX2dtcF9yYW5kc19pbml0aWFsaXplZCA9IDE7CisgIHJhbmRzID0gX19nbXBfcmFuZHM7CisKKyAgc2VlZF9zdHJpbmcgPSBnZXRlbnYgKCJHTVBfQ0hFQ0tfUkFORE9NSVpFIik7CisgIGlmIChzZWVkX3N0cmluZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHNlZWRfc3RyaW5nLCAiMCIpICE9IDAgJiYKKwkgIHN0cmNtcCAoc2VlZF9zdHJpbmcsICIxIikgIT0gMCkKKyAgICAgICAgeworCSAgbXB6X3Qgc2VlZDsKKwkgIG1wel9pbml0X3NldF9zdHIgKHNlZWQsIHNlZWRfc3RyaW5nLCAwKTsKKyAgICAgICAgICBnbXBfcHJpbnRmICgiUmUtc2VlZGluZyB3aXRoIEdNUF9DSEVDS19SQU5ET01JWkU9JVpkXG4iLCBzZWVkKTsKKyAgICAgICAgICBnbXBfcmFuZHNlZWQgKHJhbmRzLCBzZWVkKTsKKwkgIG1wel9jbGVhciAoc2VlZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgRklMRSAqZnMgPSBmb3BlbiAoIi9kZXYvdXJhbmRvbSIsICJyIik7CisJICBpZiAoZnMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNlZWRfZnJvbV91cmFuZG9tIChyYW5kcywgZnMpOworCSAgICAgIGZjbG9zZSAoZnMpOworCSAgICB9CisJICBlbHNlCisJICAgIHNlZWRfZnJvbV90b2QgKHJhbmRzKTsKKyAgICAgICAgfQorICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgIH0KK30KK3ZvaWQKK3Rlc3RzX3JhbmRfZW5kICh2b2lkKQoreworICBSQU5EU19DTEVBUiAoKTsKK30KKworCisvKiBPbmx5IHVzZWQgaWYgQ1BVIGNhbGxpbmcgY29udmVudGlvbnMgY2hlY2tpbmcgaXMgYXZhaWxhYmxlLiAqLworbXBfbGltYl90ICgqY2FsbGluZ19jb252ZW50aW9uc19mdW5jdGlvbikgKEFOWUFSR1MpOworCisKKy8qIFJldHVybiBwIGFkdmFuY2VkIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mICJhbGlnbiIgYnl0ZXMuICAiYWxpZ24iIG11c3QgYmUKKyAgIGEgcG93ZXIgb2YgMi4gIENhcmUgaXMgdGFrZW4gbm90IHRvIGFzc3VtZSBzaXplb2YoaW50KT09c2l6ZW9mKHBvaW50ZXIpLgorICAgVXNpbmcgInVuc2lnbmVkIGxvbmciIGF2b2lkcyBhIHdhcm5pbmcgb24gaHB1eC4gICovCit2b2lkICoKK2FsaWduX3BvaW50ZXIgKHZvaWQgKnAsIHNpemVfdCBhbGlnbikKK3sKKyAgZ21wX2ludHB0cl90IGQ7CisgIGQgPSAoKGdtcF9pbnRwdHJfdCkgcCkgJiAoYWxpZ24tMSk7CisgIGQgPSAoZCAhPSAwID8gYWxpZ24tZCA6IDApOworICByZXR1cm4gKHZvaWQgKikgKCgoY2hhciAqKSBwKSArIGQpOworfQorCisKKy8qIE5vdGUgdGhhdCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiBjYW4gbmV2ZXIgYmUgZnJlZWQsIGJlY2F1c2UKKyAgIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBibG9jayBhbGxvY2F0ZWQgaXMgbG9zdC4gKi8KK3ZvaWQgKgorX19nbXBfYWxsb2NhdGVfZnVuY19hbGlnbmVkIChzaXplX3QgYnl0ZXMsIHNpemVfdCBhbGlnbikKK3sKKyAgcmV0dXJuIGFsaWduX3BvaW50ZXIgKCgqX19nbXBfYWxsb2NhdGVfZnVuYykgKGJ5dGVzICsgYWxpZ24tMSksIGFsaWduKTsKK30KKworCit2b2lkICoKK19fZ21wX2FsbG9jYXRlX29yX3JlYWxsb2NhdGUgKHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBuZXdzaXplKQoreworICBpZiAocHRyID09IE5VTEwpCisgICAgcmV0dXJuICgqX19nbXBfYWxsb2NhdGVfZnVuYykgKG5ld3NpemUpOworICBlbHNlCisgICAgcmV0dXJuICgqX19nbXBfcmVhbGxvY2F0ZV9mdW5jKSAocHRyLCBvbGRzaXplLCBuZXdzaXplKTsKK30KKworY2hhciAqCitfX2dtcF9hbGxvY2F0ZV9zdHJkdXAgKGNvbnN0IGNoYXIgKnMpCit7CisgIHNpemVfdCAgbGVuOworICBjaGFyICAgICp0OworICBsZW4gPSBzdHJsZW4gKHMpOworICB0ID0gKGNoYXIgKikgKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAobGVuKzEpOworICBtZW1jcHkgKHQsIHMsIGxlbisxKTsKKyAgcmV0dXJuIHQ7Cit9CisKKworY2hhciAqCitzdHJ0b3VwcGVyIChjaGFyICpzX29yaWcpCit7CisgIGNoYXIgICpzOworICBmb3IgKHMgPSBzX29yaWc7ICpzICE9ICdcMCc7IHMrKykKKyAgICBpZiAoaXNsb3dlciAoKnMpKQorICAgICAgKnMgPSB0b3VwcGVyICgqcyk7CisgIHJldHVybiBzX29yaWc7Cit9CisKKwordm9pZAorbXB6X3NldF9uIChtcHpfcHRyIHosIG1wX3NyY3B0ciBwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgQVNTRVJUIChzaXplID49IDApOworICBNUE5fTk9STUFMSVpFIChwLCBzaXplKTsKKyAgTVBaX1JFQUxMT0MgKHosIHNpemUpOworICBNUE5fQ09QWSAoUFRSKHopLCBwLCBzaXplKTsKKyAgU0laKHopID0gc2l6ZTsKK30KKwordm9pZAorbXB6X2luaXRfc2V0X24gKG1wel9wdHIgeiwgbXBfc3JjcHRyIHAsIG1wX3NpemVfdCBzaXplKQoreworICBBU1NFUlQgKHNpemUgPj0gMCk7CisKKyAgTVBOX05PUk1BTElaRSAocCwgc2l6ZSk7CisgIEFMTE9DKHopID0gTUFYIChzaXplLCAxKTsKKyAgUFRSKHopID0gX19HTVBfQUxMT0NBVEVfRlVOQ19MSU1CUyAoQUxMT0MoeikpOworICBTSVooeikgPSBzaXplOworICBNUE5fQ09QWSAoUFRSKHopLCBwLCBzaXplKTsKK30KKworCisvKiBGaW5kIGxlYXN0IHNpZ25pZmljYW50IGxpbWIgcG9zaXRpb24gd2hlcmUgcDEsc2l6ZSBhbmQgcDIsc2l6ZSBkaWZmZXIuICAqLworbXBfc2l6ZV90CittcG5fZGlmZl9sb3dlc3QgKG1wX3NyY3B0ciBwMSwgbXBfc3JjcHRyIHAyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90ICBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHAxW2ldICE9IHAyW2ldKQorICAgICAgcmV0dXJuIGk7CisKKyAgLyogbm8gZGlmZmVyZW5jZXMgKi8KKyAgcmV0dXJuIC0xOworfQorCisKKy8qIEZpbmQgbW9zdCBzaWduaWZpY2FudCBsaW1iIHBvc2l0aW9uIHdoZXJlIHAxLHNpemUgYW5kIHAyLHNpemUgZGlmZmVyLiAgKi8KK21wX3NpemVfdAorbXBuX2RpZmZfaGlnaGVzdCAobXBfc3JjcHRyIHAxLCBtcF9zcmNwdHIgcDIsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9zaXplX3QgIGk7CisKKyAgZm9yIChpID0gc2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICBpZiAocDFbaV0gIT0gcDJbaV0pCisgICAgICByZXR1cm4gaTsKKworICAvKiBubyBkaWZmZXJlbmNlcyAqLworICByZXR1cm4gLTE7Cit9CisKKworLyogRmluZCBsZWFzdCBzaWduaWZpY2FudCBieXRlIHBvc2l0aW9uIHdoZXJlIHAxLHNpemUgYW5kIHAyLHNpemUgZGlmZmVyLiAgKi8KK21wX3NpemVfdAorYnl0ZV9kaWZmX2xvd2VzdCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90ICBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKCgoY29uc3QgY2hhciAqKSBwMSlbaV0gIT0gKChjb25zdCBjaGFyICopIHAyKVtpXSkKKyAgICAgIHJldHVybiBpOworCisgIC8qIG5vIGRpZmZlcmVuY2VzICovCisgIHJldHVybiAtMTsKK30KKworCisvKiBGaW5kIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBwb3NpdGlvbiB3aGVyZSBwMSxzaXplIGFuZCBwMixzaXplIGRpZmZlci4gICovCittcF9zaXplX3QKK2J5dGVfZGlmZl9oaWdoZXN0IChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9zaXplX3QgIGk7CisKKyAgZm9yIChpID0gc2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICBpZiAoKChjb25zdCBjaGFyICopIHAxKVtpXSAhPSAoKGNvbnN0IGNoYXIgKikgcDIpW2ldKQorICAgICAgcmV0dXJuIGk7CisKKyAgLyogbm8gZGlmZmVyZW5jZXMgKi8KKyAgcmV0dXJuIC0xOworfQorCisKK3ZvaWQKK21wel9zZXRfc3RyX29yX2Fib3J0IChtcHpfcHRyIHosIGNvbnN0IGNoYXIgKnN0ciwgaW50IGJhc2UpCit7CisgIGlmIChtcHpfc2V0X3N0ciAoeiwgc3RyLCBiYXNlKSAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBtcHpfc2V0X3N0ciBmYWlsZWRcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgc3RyICA9IFwiJXNcIlxuIiwgc3RyKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgIGJhc2UgPSAlZFxuIiwgYmFzZSk7CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKwordm9pZAorbXBxX3NldF9zdHJfb3JfYWJvcnQgKG1wcV9wdHIgcSwgY29uc3QgY2hhciAqc3RyLCBpbnQgYmFzZSkKK3sKKyAgaWYgKG1wcV9zZXRfc3RyIChxLCBzdHIsIGJhc2UpICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6IG1wcV9zZXRfc3RyIGZhaWxlZFxuIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgICBzdHIgID0gXCIlc1wiXG4iLCBzdHIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgYmFzZSA9ICVkXG4iLCBiYXNlKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorfQorCit2b2lkCittcGZfc2V0X3N0cl9vcl9hYm9ydCAobXBmX3B0ciBmLCBjb25zdCBjaGFyICpzdHIsIGludCBiYXNlKQoreworICBpZiAobXBmX3NldF9zdHIgKGYsIHN0ciwgYmFzZSkgIT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBtcGZfc2V0X3N0ciBmYWlsZWRcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgc3RyICA9IFwiJXNcIlxuIiwgc3RyKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgIGJhc2UgPSAlZFxuIiwgYmFzZSk7CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKworCisvKiBXaGV0aGVyIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIGEgcG93ZXIgb2YgMi4gKi8KK2ludAorbXB6X3BvdzJhYnNfcCAobXB6X3NyY3B0ciB6KQoreworICBtcF9zaXplX3QgIHNpemUsIGk7CisgIG1wX3NyY3B0ciAgcHRyOworCisgIHNpemUgPSBTSVogKHopOworICBpZiAoc2l6ZSA9PSAwKQorICAgIHJldHVybiAwOyAgLyogemVybyBpcyBub3QgYSBwb3dlciBvZiAyICovCisgIHNpemUgPSBBQlMgKHNpemUpOworCisgIHB0ciA9IFBUUiAoeik7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplLTE7IGkrKykKKyAgICBpZiAocHRyW2ldICE9IDApCisgICAgICByZXR1cm4gMDsgIC8qIG5vbi16ZXJvIGxvdyBsaW1iIG1lYW5zIG5vdCBhIHBvd2VyIG9mIDIgKi8KKworICByZXR1cm4gUE9XMl9QIChwdHJbaV0pOyAgLyogaGlnaCBsaW1iIHBvd2VyIG9mIDIgKi8KK30KKworCisvKiBFeHBvbmVudGlhbGx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gMCBhbmQgMl5uYml0cy0xLCBtZWFuaW5nIHRoZSBudW1iZXIgb2YKKyAgIGJpdHMgaW4gdGhlIHJlc3VsdCBpcyB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYmV0d2VlbiAwIGFuZCBuYml0cy0xLgorCisgICBGSVhNRTogVGhpcyBpcyBub3QgYSBwcm9wZXIgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLCBzaW5jZSB0aGUKKyAgIHByb2JhYmlsaXR5IGZ1bmN0aW9uIHdpbGwgaGF2ZSBhIHN0ZXBwZWQgc2hhcGUgZHVlIHRvIHVzaW5nIGEgdW5pZm9ybQorICAgZGlzdHJpYnV0aW9uIGFmdGVyIGNob29zaW5nIGhvdyBtYW55IGJpdHMuICAqLworCit2b2lkCittcHpfZXJhbmRvbWIgKG1wel9wdHIgcm9wLCBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlLCB1bnNpZ25lZCBsb25nIG5iaXRzKQoreworICBtcHpfdXJhbmRvbWIgKHJvcCwgcnN0YXRlLCBnbXBfdXJhbmRvbW1fdWkgKHJzdGF0ZSwgbmJpdHMpKTsKK30KKwordm9pZAorbXB6X2VyYW5kb21iX25vbnplcm8gKG1wel9wdHIgcm9wLCBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlLCB1bnNpZ25lZCBsb25nIG5iaXRzKQoreworICBtcHpfZXJhbmRvbWIgKHJvcCwgcnN0YXRlLCBuYml0cyk7CisgIGlmIChtcHpfc2duIChyb3ApID09IDApCisgICAgbXB6X3NldF91aSAocm9wLCAxTCk7Cit9CisKK3ZvaWQKK21wel9lcnJhbmRvbWIgKG1wel9wdHIgcm9wLCBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlLCB1bnNpZ25lZCBsb25nIG5iaXRzKQoreworICBtcHpfcnJhbmRvbWIgKHJvcCwgcnN0YXRlLCBnbXBfdXJhbmRvbW1fdWkgKHJzdGF0ZSwgbmJpdHMpKTsKK30KKwordm9pZAorbXB6X2VycmFuZG9tYl9ub256ZXJvIChtcHpfcHRyIHJvcCwgZ21wX3JhbmRzdGF0ZV90IHJzdGF0ZSwgdW5zaWduZWQgbG9uZyBuYml0cykKK3sKKyAgbXB6X2VycmFuZG9tYiAocm9wLCByc3RhdGUsIG5iaXRzKTsKKyAgaWYgKG1wel9zZ24gKHJvcCkgPT0gMCkKKyAgICBtcHpfc2V0X3VpIChyb3AsIDFMKTsKK30KKwordm9pZAorbXB6X25lZ3JhbmRvbSAobXB6X3B0ciByb3AsIGdtcF9yYW5kc3RhdGVfdCByc3RhdGUpCit7CisgIG1wX2xpbWJfdCAgbjsKKyAgX2dtcF9yYW5kICgmbiwgcnN0YXRlLCAxKTsKKyAgaWYgKG4gIT0gMCkKKyAgICBtcHpfbmVnIChyb3AsIHJvcCk7Cit9CisKK3ZvaWQKK21wel9jbG9iYmVyKG1wel9wdHIgcm9wKQoreworICBNUE5fWkVSTyhQVFIocm9wKSwgQUxMT0Mocm9wKSk7CisgIFBUUihyb3ApWzBdID0gMHhERUFEQkVFRjsKKyAgU0laKHJvcCkgPSAweERFRkFDRTsKK30KKworbXBfbGltYl90Cit1cmFuZG9tICh2b2lkKQoreworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICBtcF9saW1iX3QgIG47CisgIF9nbXBfcmFuZCAoJm4sIFJBTkRTLCBHTVBfTElNQl9CSVRTKTsKKyAgcmV0dXJuIG47CisjZWxzZQorICBtcF9saW1iX3QgblsyXTsKKyAgX2dtcF9yYW5kIChuLCBSQU5EUywgR01QX0xJTUJfQklUUyk7CisgIHJldHVybiBuWzBdICsgKG5bMV0gPDwgR01QX05VTUJfQklUUyk7CisjZW5kaWYKK30KKworCisvKiBDYWxsICgqZnVuYykoKSB3aXRoIHZhcmlvdXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLiAqLwordm9pZAorY2FsbF9yYW5kX2FsZ3MgKHZvaWQgKCpmdW5jKSAoY29uc3QgY2hhciAqLCBnbXBfcmFuZHN0YXRlX3B0cikpCit7CisgIGdtcF9yYW5kc3RhdGVfdCAgcnN0YXRlOworICBtcHpfdCAgICAgICAgICAgIGE7CisKKyAgbXB6X2luaXQgKGEpOworCisgIGdtcF9yYW5kaW5pdF9kZWZhdWx0IChyc3RhdGUpOworICAoKmZ1bmMpICgiZ21wX3JhbmRpbml0X2RlZmF1bHQiLCByc3RhdGUpOworICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworCisgIGdtcF9yYW5kaW5pdF9tdCAocnN0YXRlKTsKKyAgKCpmdW5jKSAoImdtcF9yYW5kaW5pdF9tdCIsIHJzdGF0ZSk7CisgIGdtcF9yYW5kY2xlYXIgKHJzdGF0ZSk7CisKKyAgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSAocnN0YXRlLCA4TCk7CisgICgqZnVuYykgKCJnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIDgiLCByc3RhdGUpOworICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworCisgIGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgKHJzdGF0ZSwgMTZMKTsKKyAgKCpmdW5jKSAoImdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgMTYiLCByc3RhdGUpOworICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworCisgIGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgKHJzdGF0ZSwgMTI4TCk7CisgICgqZnVuYykgKCJnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIDEyOCIsIHJzdGF0ZSk7CisgIGdtcF9yYW5kY2xlYXIgKHJzdGF0ZSk7CisKKyAgLyogZGVnZW5lcmF0ZSBhbHdheXMgemVyb3MgKi8KKyAgbXB6X3NldF91aSAoYSwgMEwpOworICBnbXBfcmFuZGluaXRfbGNfMmV4cCAocnN0YXRlLCBhLCAwTCwgOEwpOworICAoKmZ1bmMpICgiZ21wX3JhbmRpbml0X2xjXzJleHAgYT0wIGM9MCBtPTgiLCByc3RhdGUpOworICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworCisgIC8qIGRlZ2VuZXJhdGUgYWx3YXlzIEZGcyAqLworICBtcHpfc2V0X3VpIChhLCAwTCk7CisgIGdtcF9yYW5kaW5pdF9sY18yZXhwIChyc3RhdGUsIGEsIDB4RkZMLCA4TCk7CisgICgqZnVuYykgKCJnbXBfcmFuZGluaXRfbGNfMmV4cCBhPTAgYz0weEZGIG09OCIsIHJzdGF0ZSk7CisgIGdtcF9yYW5kY2xlYXIgKHJzdGF0ZSk7CisKKyAgbXB6X2NsZWFyIChhKTsKK30KKworCisvKiBSZXR1cm4gK2luZmluaXR5IGlmIGF2YWlsYWJsZSwgb3IgMCBpZiBub3QuCisgICBXZSBkb24ndCB3YW50IHRvIHVzZSBsaWJtLCBzbyBJTkZJTklUWSBvciBvdGhlciBzeXN0ZW0gdmFsdWVzIGFyZSBub3QKKyAgIHVzZWQgaGVyZS4gICovCitkb3VibGUKK3Rlc3RzX2luZmluaXR5X2QgKHZvaWQpCit7CisjaWYgX0dNUF9JRUVFX0ZMT0FUUworICB1bmlvbiBpZWVlX2RvdWJsZV9leHRyYWN0IHg7CisgIHgucy5leHAgPSAyMDQ3OworICB4LnMubWFubCA9IDA7CisgIHgucy5tYW5oID0gMDsKKyAgeC5zLnNpZyA9IDA7CisgIHJldHVybiB4LmQ7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKy8qIFJldHVybiBub24temVybyBpZiBkIGlzIGFuIGluZmluaXR5IChlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUpLgorICAgRG9uJ3Qgd2FudCBsaWJtLCBzbyBkb24ndCB1c2UgaXNpbmYoKSBvciBvdGhlciBzeXN0ZW0gdGVzdHMuICAqLworaW50Cit0ZXN0c19pc2luZiAoZG91YmxlIGQpCit7CisjaWYgX0dNUF9JRUVFX0ZMT0FUUworICB1bmlvbiBpZWVlX2RvdWJsZV9leHRyYWN0IHg7CisgIHguZCA9IGQ7CisgIHJldHVybiAoeC5zLmV4cCA9PSAyMDQ3ICYmIHgucy5tYW5sID09IDAgJiYgeC5zLm1hbmggPT0gMCk7CisjZWxzZQorICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKy8qIFNldCB0aGUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZS4gIFNhbWUgbW9kZSB2YWx1ZXMgYXMgbXBmciwKKyAgIG5hbWVseSAwPW5lYXJlc3QsIDE9dG96ZXJvLCAyPXVwLCAzPWRvd24uICBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmCisgICBub3QuICAqLworaW50Cit0ZXN0c19oYXJkd2FyZV9zZXRyb3VuZCAoaW50IG1vZGUpCit7CisjaWYgISBkZWZpbmVkIE5PX0FTTSAmJiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYKKyAgaW50ICByYzsKKyAgc3dpdGNoIChtb2RlKSB7CisgIGNhc2UgMDogcmMgPSAwOyBicmVhazsgIC8qIG5lYXJlc3QgKi8KKyAgY2FzZSAxOiByYyA9IDM7IGJyZWFrOyAgLyogdG96ZXJvICAqLworICBjYXNlIDI6IHJjID0gMjsgYnJlYWs7ICAvKiB1cCAgICAgICovCisgIGNhc2UgMzogcmMgPSAxOyBicmVhazsgIC8qIGRvd24gICAgKi8KKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorICB4ODZfZmxkY3cgKCh4ODZfZnN0Y3cgKCkgJiB+MHhDMDApIHwgKHJjIDw8IDEwKSk7CisgIHJldHVybiAxOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgbW9kZSwgb3IgLTEgaWYgdW5rbm93bi4gKi8KK2ludAordGVzdHNfaGFyZHdhcmVfZ2V0cm91bmQgKHZvaWQpCit7CisjaWYgISBkZWZpbmVkIE5PX0FTTSAmJiBIQVZFX0hPU1RfQ1BVX0ZBTUlMWV94ODYKKyAgc3dpdGNoICgoeDg2X2ZzdGN3ICgpICYgfjB4QzAwKSA+PiAxMCkgeworICBjYXNlIDA6IHJldHVybiAwOyBicmVhazsgIC8qIG5lYXJlc3QgKi8KKyAgY2FzZSAxOiByZXR1cm4gMzsgYnJlYWs7ICAvKiBkb3duICAgICovCisgIGNhc2UgMjogcmV0dXJuIDI7IGJyZWFrOyAgLyogdXAgICAgICAqLworICBjYXNlIDM6IHJldHVybiAxOyBicmVhazsgIC8qIHRvemVybyAgKi8KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIC0xOworfQorCisKKy8qIHRlc3RzX2RibF9tYW50X2JpdHMoKSBkZXRlcm1pbmVzIGJ5IGV4cGVyaW1lbnQgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZQorICAgbWFudGlzc2Egb2YgYSAiZG91YmxlIi4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGZpbmQgYSB2YWx1ZSAocGVyaGFwcworICAgZHVlIHRvIHRoZSBjb21waWxlciBvcHRpbWl6aW5nIHRvbyBhZ2dyZXNzaXZlbHkpLCB0aGVuIHJldHVybiAwLgorCisgICBUaGlzIGNvZGUgaXMgdXNlZCByYXRoZXIgdGhhbiBEQkxfTUFOVF9ESUcgZnJvbSA8ZmxvYXQuaD4gc2luY2UgYW5jaWVudAorICAgc3lzdGVtcyBsaWtlIFN1bk9TIGRvbid0IGhhdmUgdGhhdCBmaWxlLCBhbmQgc2luY2Ugb25lIEdOVS9MaW51eCBBUk0KKyAgIHN5c3RlbSB3YXMgc2VlbiB3aGVyZSB0aGUgZmxvYXQgZW11bGF0aW9uIHNlZW1lZCB0byBoYXZlIG9ubHkgMzIgd29ya2luZworICAgYml0cywgbm90IHRoZSA1MyBmbG9hdC5oIGNsYWltZWQuICAqLworCitpbnQKK3Rlc3RzX2RibF9tYW50X2JpdHMgKHZvaWQpCit7CisgIHN0YXRpYyBpbnQgbiA9IC0xOworICB2b2xhdGlsZSBkb3VibGUgeCwgeSwgZDsKKworICBpZiAobiAhPSAtMSkKKyAgICByZXR1cm4gbjsKKworICBuID0gMTsKKyAgeCA9IDIuMDsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBzZWUgaWYgMl4obisxKSsxIGNhbiBiZSBmb3JtZWQgd2l0aG91dCByb3VuZGluZywgaWYgc28gdGhlbgorICAgICAgICAgY29udGludWUsIGlmIG5vdCB0aGVuICJuIiBpcyB0aGUgYW5zd2VyICovCisgICAgICB5ID0geCArIDEuMDsKKyAgICAgIGQgPSB5IC0geDsKKyAgICAgIGlmIChkICE9IDEuMCkKKyAgICAgICAgeworI2lmIGRlZmluZWQgKERCTF9NQU5UX0RJRykgJiYgREJMX1JBRElYID09IDIKKyAgICAgICAgICBpZiAobiAhPSBEQkxfTUFOVF9ESUcpCisgICAgICAgICAgICBwcmludGYgKCJXYXJuaW5nLCB0ZXN0c19kYmxfbWFudF9iaXRzIGdvdCAlZCBidXQgREJMX01BTlRfRElHIHNheXMgJWRcbiIsIG4sIERCTF9NQU5UX0RJRyk7CisjZW5kaWYKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICB4ICo9IDI7CisgICAgICBuKys7CisKKyAgICAgIGlmIChuID4gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIk9vcHMsIHRlc3RzX2RibF9tYW50X2JpdHMgY2FuJ3QgZGV0ZXJtaW5lIG1hbnRpc3NhIHNpemVcbiIpOworICAgICAgICAgIG4gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gbjsKK30KKworCisvKiBTZWUgdGVzdHNfc2V0am1wX3NpZ2ZwZSBpbiB0ZXN0cy5oLiAqLworCitqbXBfYnVmICAgIHRlc3RzX3NpZ2ZwZV90YXJnZXQ7CisKK1JFVFNJR1RZUEUKK3Rlc3RzX3NpZ2ZwZV9oYW5kbGVyIChpbnQgc2lnKQoreworICBsb25nam1wICh0ZXN0c19zaWdmcGVfdGFyZ2V0LCAxKTsKK30KKwordm9pZAordGVzdHNfc2lnZnBlX2RvbmUgKHZvaWQpCit7CisgIHNpZ25hbCAoU0lHRlBFLCBTSUdfREZMKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21pc2MvdC1sb2NhbGUuYyBiL3Rlc3RzL21pc2MvdC1sb2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIwYjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWlzYy90LWxvY2FsZS5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiBUZXN0IGxvY2FsZSBzdXBwb3J0LCBvciBhdHRlbXB0IHRvIGRvIHNvLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAxMSwgMjAxNCwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAgICAvKiBmb3IgREVDSU1BTF9QT0lOVCBpbiBnbGliYyBsYW5naW5mby5oICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBIQVZFX05MX1RZUEVTX0gKKyNpbmNsdWRlIDxubF90eXBlcy5oPiAgLyogZm9yIG5sX2l0ZW0gKG9uIG5ldGJzZCAxLjQuMSBhdCBsZWFzdCkgKi8KKyNlbmRpZgorCisjaWYgSEFWRV9MQU5HSU5GT19ICisjaW5jbHVkZSA8bGFuZ2luZm8uaD4gIC8qIGZvciBubF9sYW5naW5mbyAqLworI2VuZGlmCisKKyNpZiBIQVZFX0xPQ0FMRV9ICisjaW5jbHVkZSA8bG9jYWxlLmg+ICAgIC8qIGZvciBsY29udiAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK2NvbnN0IGNoYXIgKmRlY2ltYWxfcG9pbnQ7CisKKy8qIFJlcGxhY2UgdGhlIGxpYmMgbG9jYWxlY29udiB3aXRoIG9uZSB3ZSBjYW4gbWFuaXB1bGF0ZS4gKi8KKyNpZiBIQVZFX0xPQ0FMRUNPTlYgJiYgISBkZWZpbmVkIF9fTUlOR1czMl9fCitzdHJ1Y3QgbGNvbnYgKgorbG9jYWxlY29udiAodm9pZCkKKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIGRlZmluZWQgX19HTElCQ19fCisgIHRocm93KCkKKyNlbmRpZgoreworICBzdGF0aWMgc3RydWN0IGxjb252ICBsOworICBsLmRlY2ltYWxfcG9pbnQgPSAoY2hhciAqKSBkZWNpbWFsX3BvaW50OworICByZXR1cm4gJmw7Cit9CisjZW5kaWYKKworLyogUmVwbGFjZSB0aGUgbGliYyBubF9sYW5naW5mbyB3aXRoIG9uZSB3ZSBjYW4gbWFuaXB1bGF0ZS4gKi8KKyNpZiBIQVZFX05MX0xBTkdJTkZPICYmICEgZGVmaW5lZCBfX1RFUk1VWF9fCitjaGFyICoKK25sX2xhbmdpbmZvIChubF9pdGVtIG4pCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9fR0xJQkNfXworICB0aHJvdygpCisjZW5kaWYKK3sKKyNpZiBkZWZpbmVkIChERUNJTUFMX1BPSU5UKQorICBpZiAobiA9PSBERUNJTUFMX1BPSU5UKQorICAgIHJldHVybiAoY2hhciAqKSBkZWNpbWFsX3BvaW50OworI2VuZGlmCisjaWYgZGVmaW5lZCAoUkFESVhDSEFSKQorICBpZiAobiA9PSBSQURJWENIQVIpCisgICAgcmV0dXJuIChjaGFyICopIGRlY2ltYWxfcG9pbnQ7CisjZW5kaWYKKyAgcmV0dXJuIChjaGFyICopICIiOworfQorI2VuZGlmCisKK3ZvaWQKK2NoZWNrX2lucHV0ICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqcG9pbnRbXSA9IHsKKyAgICAiLiIsICIsIiwgIldVIiwgIlNUUiIsICJaVFYqKioiCisgIH07CisKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKnN0cjsKKyAgICBkb3VibGUgICAgICBkOworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIjElcyIsICAgMS4wIH0sCisgICAgeyAiMSVzMCIsICAxLjAgfSwKKyAgICB7ICIxJXMwMCIsIDEuMCB9LAorCisgICAgeyAiJXM1IiwgICAgMC41IH0sCisgICAgeyAiMCVzNSIsICAgMC41IH0sCisgICAgeyAiMDAlczUiLCAgMC41IH0sCisgICAgeyAiMDAlczUwIiwgMC41IH0sCisKKyAgICB7ICIxJXM1IiwgICAgMS41IH0sCisgICAgeyAiMSVzNWUxIiwgMTUuMCB9LAorICB9OworCisgIGludCAgICAgaSwgaiwgbmVnLCByZXQ7CisgIGNoYXIgICAgc3RyWzEyOF07CisgIG1wZl90ICAgZjsKKyAgZG91YmxlICBkOworCisgIG1wZl9pbml0IChmKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKHBvaW50KTsgaSsrKQorICAgIHsKKyAgICAgIGRlY2ltYWxfcG9pbnQgPSAoY29uc3QgY2hhciAqKSBwb2ludFtpXTsKKworICAgICAgZm9yIChuZWcgPSAwOyBuZWcgPD0gMTsgbmVnKyspCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyb2YgKGRhdGEpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0cmNweSAoc3RyLCBuZWcgPyAiLSIgOiAiIik7CisgICAgICAgICAgICAgIHNwcmludGYgKHN0citzdHJsZW4oc3RyKSwgZGF0YVtqXS5zdHIsIGRlY2ltYWxfcG9pbnQpOworCisgICAgICAgICAgICAgIGQgPSBkYXRhW2pdLmQ7CisgICAgICAgICAgICAgIGlmIChuZWcpCisgICAgICAgICAgICAgICAgZCA9IC1kOworCisgICAgICAgICAgICAgIG1wZl9zZXRfZCAoZiwgMTIzLjApOworICAgICAgICAgICAgICBpZiAobXBmX3NldF9zdHIgKGYsIHN0ciwgMTApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICgibXBmX3NldF9zdHIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBwb2ludCAgJXNcbiIsIGRlY2ltYWxfcG9pbnQpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBzdHIgICAgJXNcbiIsIHN0cik7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChtcGZfY21wX2QgKGYsIGQpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgibXBmX3NldF9zdHIgd3JvbmcgcmVzdWx0XG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgcG9pbnQgICVzXG4iLCBkZWNpbWFsX3BvaW50KTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgc3RyICAgICVzXG4iLCBzdHIpOworICAgICAgICAgICAgICAgICAgbXBmX3RyYWNlICgiICBmIiwgZik7CisgICAgICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGQ9JWdcbiIsIGQpOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1wZl9zZXRfZCAoZiwgMTIzLjApOworICAgICAgICAgICAgICByZXQgPSBnbXBfc3NjYW5mIChzdHIsICIlRmYiLCBmKTsKKyAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoImdtcF9zc2NhbmYgd3JvbmcgcmV0dXJuIHZhbHVlXG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgcG9pbnQgICVzXG4iLCBkZWNpbWFsX3BvaW50KTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgc3RyICAgICVzXG4iLCBzdHIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICByZXQgICAgJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChtcGZfY21wX2QgKGYsIGQpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiZ21wX3NzY2FuZiB3cm9uZyByZXN1bHRcbiIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBwb2ludCAgJXNcbiIsIGRlY2ltYWxfcG9pbnQpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBzdHIgICAgJXNcbiIsIHN0cik7CisgICAgICAgICAgICAgICAgICBtcGZfdHJhY2UgKCIgIGYiLCBmKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgZD0lZ1xuIiwgZCk7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIG1wZl9jbGVhciAoZik7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgLyogVGhlIGxvY2FsZWNvbnYgcmVwbGFjZW1lbnQgYnJlYWtzIHByaW50ZiAiJWx1IiBvbiBTdW5PUyA0LCBzbyB3ZSBjYW4ndAorICAgICBwcmludCB0aGUgc2VlZCBpbiB0ZXN0c19yYW5kX3N0YXJ0KCkuICBOb3RoaW5nIHJhbmRvbSBpcyB1c2VkIGluIHRoaXMKKyAgICAgcHJvZ3JhbSB0aG91Z2gsIHNvIGp1c3QgdXNlIHRoZSBtZW1vcnkgdGVzdHMgYWxvbmUuICAqLworICB0ZXN0c19tZW1vcnlfc3RhcnQgKCk7CisKKyAgeworICAgIG1wZl90ICBmOworICAgIGNoYXIgICBidWZbMTI4XTsKKyAgICBtcGZfaW5pdCAoZik7CisgICAgZGVjaW1hbF9wb2ludCA9ICIsIjsKKyAgICBtcGZfc2V0X2QgKGYsIDEuNSk7CisgICAgZ21wX3NucHJpbnRmIChidWYsIHNpemVvZihidWYpLCAiJS4xRmYiLCBmKTsKKyAgICBtcGZfY2xlYXIgKGYpOworICAgIGlmIChzdHJjbXAgKGJ1ZiwgIjEsNSIpICE9IDApCisgICAgICB7CisgICAgICAgIHByaW50ZiAoIlRlc3Qgc2tpcHBlZCwgcmVwbGFjaW5nIGxvY2FsZWNvbnYvbmxfbGFuZ2luZm8gZG9lc24ndCB3b3JrXG4iKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICB9CisKKyAgY2hlY2tfaW5wdXQgKCk7CisKKyBkb25lOgorICB0ZXN0c19tZW1vcnlfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21pc2MvdC1wcmludGYuYyBiL3Rlc3RzL21pc2MvdC1wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTNhMjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWlzYy90LXByaW50Zi5jCkBAIC0wLDAgKzEsOTU1IEBACisvKiBUZXN0IGdtcF9wcmludGYgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIFVzYWdlOiB0LXByaW50ZiBbLXNdCisKKyAgIC1zICBDaGVjayB0aGUgZGF0YSBhZ2FpbnN0IHRoZSBzeXN0ZW0gcHJpbnRmLCB3aGVyZSBwb3NzaWJsZS4gIFRoaXMgaXMKKyAgICAgICBvbmx5IGFuIG9wdGlvbiBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGZhaWwgaWYgdGhlIHN5c3RlbSBwcmludGYgaXMKKyAgICAgICBmYXVsdHkgb3Igc3RyYW5nZS4gICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgkvKiBuZWVkZWQgZm9yIHRoZSBIQVZFXywgY291bGQgYWxzbyBtb3ZlIGdtcCBpbmNscyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+ICAgIC8qIGZvciBwdHJkaWZmX3QgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgSEFWRV9PQlNUQUNLX1ZQUklOVEYKKyNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB0ZXN0c19hbGxvY2F0ZQorI2RlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgIHRlc3RzX2ZyZWVfbm9zaXplCisjaW5jbHVkZSA8b2JzdGFjay5oPgorI2VuZGlmCisKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4gLyogZm9yIGludG1heF90ICovCisjZW5kaWYKKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+ICAvKiBmb3IgdW5saW5rICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitpbnQgICBvcHRpb25fY2hlY2tfcHJpbnRmID0gMDsKKworCisjZGVmaW5lIENIRUNLX1ZGUFJJTlRGX0ZJTEVOQU1FICAiL3RtcC90LXByaW50Zi50bXAiCitGSUxFICAqY2hlY2tfdmZwcmludGZfZnA7CisKKworLyogRnJvbSBhbnkgb2YgdGhlIHRlc3RzIHJ1biBoZXJlLiAqLworI2RlZmluZSBNQVhfT1VUUFVUICAxMDI0CisKKwordm9pZAorY2hlY2tfcGxhaW4gKGNvbnN0IGNoYXIgKndhbnQsIGNvbnN0IGNoYXIgKmZtdF9vcmlnLCAuLi4pCit7CisgIGNoYXIgICAgICAgIGdvdFtNQVhfT1VUUFVUXTsKKyAgaW50ICAgICAgICAgZ290X2xlbiwgd2FudF9sZW47CisgIHNpemVfdCAgICAgIGZtdHNpemU7CisgIGNoYXIgICAgICAgICpmbXQsICpxOworICBjb25zdCBjaGFyICAqcDsKKyAgdmFfbGlzdCAgICAgYXA7CisgIHZhX3N0YXJ0IChhcCwgZm10X29yaWcpOworCisgIGlmICghIG9wdGlvbl9jaGVja19wcmludGYpCisgICAgcmV0dXJuOworCisgIGZtdHNpemUgPSBzdHJsZW4gKGZtdF9vcmlnKSArIDE7CisgIGZtdCA9IChjaGFyICopICgqX19nbXBfYWxsb2NhdGVfZnVuYykgKGZtdHNpemUpOworCisgIGZvciAocCA9IGZtdF9vcmlnLCBxID0gZm10OyAqcCAhPSAnXDAnOyBwKyspCisgICAgeworICAgICAgc3dpdGNoICgqcCkgeworICAgICAgY2FzZSAnYSc6CisgICAgICBjYXNlICdBJzoKKwkvKiBUaGUgZXhhY3QgdmFsdWUgb2YgdGhlIGV4cG9uZW50IGlzbid0IGd1YXJhbnRlZWQgaW4gZ2xpYmMsIGFuZCBpdAorCSAgIGFuZCBnbXBfcHJpbnRmIGRvIHNsaWdodGx5IGRpZmZlcmVudCB0aGluZ3MsIHNvIGRvbid0IGNvbXBhcmUKKwkgICBkaXJlY3RseS4gKi8KKwlnb3RvIGRvbmU7CisgICAgICBjYXNlICdGJzoKKwlpZiAocCA+IGZtdF9vcmlnICYmICoocC0xKSA9PSAnLicpCisJICBnb3RvIGRvbmU7ICAvKiBkb24ndCB0ZXN0IHRoZSAiYWxsIGRpZ2l0cyIgY2FzZXMgKi8KKwkvKiBkaXNjYXJkICdGJyB0eXBlICovCisJYnJlYWs7CisgICAgICBjYXNlICdaJzoKKwkvKiB0cmFuc211dGUgKi8KKwkqcSsrID0gJ2wnOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwkqcSsrID0gKnA7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAqcSA9ICdcMCc7CisKKyAgd2FudF9sZW4gPSBzdHJsZW4gKHdhbnQpOworICBBU1NFUlRfQUxXQVlTICh3YW50X2xlbiA8IHNpemVvZihnb3QpKTsKKworICBnb3RfbGVuID0gdnNwcmludGYgKGdvdCwgZm10LCBhcCk7CisKKyAgaWYgKGdvdF9sZW4gIT0gd2FudF9sZW4gfHwgc3RyY21wIChnb3QsIHdhbnQpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgid2FudGVkIGRhdGEgZG9lc24ndCBtYXRjaCBwbGFpbiB2c3ByaW50ZlxuIik7CisgICAgICBwcmludGYgKCIgIGZtdCAgICAgIHwlc3xcbiIsIGZtdCk7CisgICAgICBwcmludGYgKCIgIGdvdCAgICAgIHwlc3xcbiIsIGdvdCk7CisgICAgICBwcmludGYgKCIgIHdhbnQgICAgIHwlc3xcbiIsIHdhbnQpOworICAgICAgcHJpbnRmICgiICBnb3RfbGVuICAlZFxuIiwgZ290X2xlbik7CisgICAgICBwcmludGYgKCIgIHdhbnRfbGVuICVkXG4iLCB3YW50X2xlbik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyBkb25lOgorICAoKl9fZ21wX2ZyZWVfZnVuYykgKGZtdCwgZm10c2l6ZSk7Cit9CisKK3ZvaWQKK2NoZWNrX3ZzcHJpbnRmIChjb25zdCBjaGFyICp3YW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgIGNoYXIgIGdvdFtNQVhfT1VUUFVUXTsKKyAgaW50ICAgZ290X2xlbiwgd2FudF9sZW47CisKKyAgd2FudF9sZW4gPSBzdHJsZW4gKHdhbnQpOworICBnb3RfbGVuID0gZ21wX3ZzcHJpbnRmIChnb3QsIGZtdCwgYXApOworCisgIGlmIChnb3RfbGVuICE9IHdhbnRfbGVuIHx8IHN0cmNtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImdtcF92c3ByaW50ZiB3cm9uZ1xuIik7CisgICAgICBwcmludGYgKCIgIGZtdCAgICAgIHwlc3xcbiIsIGZtdCk7CisgICAgICBwcmludGYgKCIgIGdvdCAgICAgIHwlc3xcbiIsIGdvdCk7CisgICAgICBwcmludGYgKCIgIHdhbnQgICAgIHwlc3xcbiIsIHdhbnQpOworICAgICAgcHJpbnRmICgiICBnb3RfbGVuICAlZFxuIiwgZ290X2xlbik7CisgICAgICBwcmludGYgKCIgIHdhbnRfbGVuICVkXG4iLCB3YW50X2xlbik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX3ZmcHJpbnRmIChjb25zdCBjaGFyICp3YW50LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgIGNoYXIgIGdvdFtNQVhfT1VUUFVUXTsKKyAgaW50ICAgZ290X2xlbiwgd2FudF9sZW4sIGZyZWFkX2xlbjsKKyAgbG9uZyAgZnRlbGxfbGVuOworCisgIHdhbnRfbGVuID0gc3RybGVuICh3YW50KTsKKworICByZXdpbmQgKGNoZWNrX3ZmcHJpbnRmX2ZwKTsKKyAgZ290X2xlbiA9IGdtcF92ZnByaW50ZiAoY2hlY2tfdmZwcmludGZfZnAsIGZtdCwgYXApOworICBBU1NFUlRfQUxXQVlTIChnb3RfbGVuICE9IC0xKTsKKyAgQVNTRVJUX0FMV0FZUyAoZmZsdXNoIChjaGVja192ZnByaW50Zl9mcCkgPT0gMCk7CisKKyAgZnRlbGxfbGVuID0gZnRlbGwgKGNoZWNrX3ZmcHJpbnRmX2ZwKTsKKyAgQVNTRVJUX0FMV0FZUyAoZnRlbGxfbGVuICE9IC0xKTsKKworICByZXdpbmQgKGNoZWNrX3ZmcHJpbnRmX2ZwKTsKKyAgQVNTRVJUX0FMV0FZUyAoZnRlbGxfbGVuIDw9IHNpemVvZihnb3QpKTsKKyAgZnJlYWRfbGVuID0gZnJlYWQgKGdvdCwgMSwgZnRlbGxfbGVuLCBjaGVja192ZnByaW50Zl9mcCk7CisKKyAgaWYgKGdvdF9sZW4gIT0gd2FudF9sZW4KKyAgICAgIHx8IGZ0ZWxsX2xlbiAhPSB3YW50X2xlbgorICAgICAgfHwgZnJlYWRfbGVuICE9IHdhbnRfbGVuCisgICAgICB8fCBtZW1jbXAgKGdvdCwgd2FudCwgd2FudF9sZW4pICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiZ21wX3ZmcHJpbnRmIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgZm10ICAgICAgIHwlc3xcbiIsIGZtdCk7CisgICAgICBwcmludGYgKCIgIGdvdCAgICAgICB8JS4qc3xcbiIsIGZyZWFkX2xlbiwgZ290KTsKKyAgICAgIHByaW50ZiAoIiAgd2FudCAgICAgIHwlc3xcbiIsIHdhbnQpOworICAgICAgcHJpbnRmICgiICBnb3RfbGVuICAgJWRcbiIsIGdvdF9sZW4pOworICAgICAgcHJpbnRmICgiICBmdGVsbF9sZW4gJWxkXG4iLCBmdGVsbF9sZW4pOworICAgICAgcHJpbnRmICgiICBmcmVhZF9sZW4gJWRcbiIsIGZyZWFkX2xlbik7CisgICAgICBwcmludGYgKCIgIHdhbnRfbGVuICAlZFxuIiwgd2FudF9sZW4pOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVja192c25wcmludGYgKGNvbnN0IGNoYXIgKndhbnQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgY2hhciAgICBnb3RbTUFYX09VVFBVVCsxXTsKKyAgaW50ICAgICByZXQsIGdvdF9sZW4sIHdhbnRfbGVuOworICBzaXplX3QgIGJ1ZnNpemU7CisKKyAgd2FudF9sZW4gPSBzdHJsZW4gKHdhbnQpOworCisgIGJ1ZnNpemUgPSAtMTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBkbyAwIHRvIDUsIHRoZW4gd2FudC01IHRvIHdhbnQrNSAqLworICAgICAgYnVmc2l6ZSsrOworICAgICAgaWYgKGJ1ZnNpemUgPiA1ICYmIGJ1ZnNpemUgPCB3YW50X2xlbi01KQorCWJ1ZnNpemUgPSB3YW50X2xlbi01OworICAgICAgaWYgKGJ1ZnNpemUgPiB3YW50X2xlbiArIDUpCisJYnJlYWs7CisgICAgICBBU1NFUlRfQUxXQVlTIChidWZzaXplKzEgPD0gc2l6ZW9mIChnb3QpKTsKKworICAgICAgZ290W2J1ZnNpemVdID0gJyEnOworICAgICAgcmV0ID0gZ21wX3ZzbnByaW50ZiAoZ290LCBidWZzaXplLCBmbXQsIGFwKTsKKworICAgICAgZ290X2xlbiA9IE1JTiAoTUFYKDEsYnVmc2l6ZSktMSwgd2FudF9sZW4pOworCisgICAgICBpZiAoZ290W2J1ZnNpemVdICE9ICchJykKKwl7CisJICBwcmludGYgKCJnbXBfdnNucHJpbnRmIG92ZXJ3cm90ZSBidWZzaXplIHNlbnRpbmVsXG4iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCisgICAgICBpZiAocmV0ICE9IHdhbnRfbGVuKQorCXsKKwkgIHByaW50ZiAoImdtcF92c25wcmludGYgcmV0dXJuIHZhbHVlIHdyb25nXG4iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCisgICAgICBpZiAoYnVmc2l6ZSA+IDApCisJeworCSAgaWYgKG1lbWNtcCAoZ290LCB3YW50LCBnb3RfbGVuKSAhPSAwIHx8IGdvdFtnb3RfbGVuXSAhPSAnXDAnKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiZ21wX3ZzbnByaW50ZiB3cm9uZyByZXN1bHQgc3RyaW5nXG4iKTsKKwkgICAgZXJyb3I6CisJICAgICAgcHJpbnRmICgiICBmbXQgICAgICAgfCVzfFxuIiwgZm10KTsKKwkgICAgICBwcmludGYgKCIgIGJ1ZnNpemUgICAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBidWZzaXplKTsKKwkgICAgICBwcmludGYgKCIgIGdvdCAgICAgICB8JXN8XG4iLCBnb3QpOworCSAgICAgIHByaW50ZiAoIiAgd2FudCAgICAgIHwlLipzfFxuIiwgZ290X2xlbiwgd2FudCk7CisJICAgICAgcHJpbnRmICgiICB3YW50IGZ1bGwgfCVzfFxuIiwgd2FudCk7CisJICAgICAgcHJpbnRmICgiICByZXQgICAgICAgJWRcbiIsIHJldCk7CisJICAgICAgcHJpbnRmICgiICB3YW50X2xlbiAgJWRcbiIsIHdhbnRfbGVuKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX3Zhc3ByaW50ZiAoY29uc3QgY2hhciAqd2FudCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICBjaGFyICAqZ290OworICBpbnQgICBnb3RfbGVuLCB3YW50X2xlbjsKKworICB3YW50X2xlbiA9IHN0cmxlbiAod2FudCk7CisgIGdvdF9sZW4gPSBnbXBfdmFzcHJpbnRmICgmZ290LCBmbXQsIGFwKTsKKworICBpZiAoZ290X2xlbiAhPSB3YW50X2xlbiB8fCBzdHJjbXAgKGdvdCwgd2FudCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJnbXBfdmFzcHJpbnRmIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgZm10ICAgICAgfCVzfFxuIiwgZm10KTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAgICAgfCVzfFxuIiwgZ290KTsKKyAgICAgIHByaW50ZiAoIiAgd2FudCAgICAgfCVzfFxuIiwgd2FudCk7CisgICAgICBwcmludGYgKCIgIGdvdF9sZW4gICVkXG4iLCBnb3RfbGVuKTsKKyAgICAgIHByaW50ZiAoIiAgd2FudF9sZW4gJWRcbiIsIHdhbnRfbGVuKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChnb3QsIHN0cmxlbihnb3QpKzEpOworfQorCit2b2lkCitjaGVja19vYnN0YWNrX3ZwcmludGYgKGNvbnN0IGNoYXIgKndhbnQsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyNpZiBIQVZFX09CU1RBQ0tfVlBSSU5URgorICBzdHJ1Y3Qgb2JzdGFjayAgb2I7CisgIGludCAgIGdvdF9sZW4sIHdhbnRfbGVuLCBvYl9sZW47CisgIGNoYXIgICpnb3Q7CisKKyAgd2FudF9sZW4gPSBzdHJsZW4gKHdhbnQpOworCisgIG9ic3RhY2tfaW5pdCAoJm9iKTsKKyAgZ290X2xlbiA9IGdtcF9vYnN0YWNrX3ZwcmludGYgKCZvYiwgZm10LCBhcCk7CisgIGdvdCA9IChjaGFyICopIG9ic3RhY2tfYmFzZSAoJm9iKTsKKyAgb2JfbGVuID0gb2JzdGFja19vYmplY3Rfc2l6ZSAoJm9iKTsKKworICBpZiAoZ290X2xlbiAhPSB3YW50X2xlbgorICAgICAgfHwgb2JfbGVuICE9IHdhbnRfbGVuCisgICAgICB8fCBtZW1jbXAgKGdvdCwgd2FudCwgd2FudF9sZW4pICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgiZ21wX29ic3RhY2tfdnByaW50ZiB3cm9uZ1xuIik7CisgICAgICBwcmludGYgKCIgIGZtdCAgICAgIHwlc3xcbiIsIGZtdCk7CisgICAgICBwcmludGYgKCIgIGdvdCAgICAgIHwlc3xcbiIsIGdvdCk7CisgICAgICBwcmludGYgKCIgIHdhbnQgICAgIHwlc3xcbiIsIHdhbnQpOworICAgICAgcHJpbnRmICgiICBnb3RfbGVuICAlZFxuIiwgZ290X2xlbik7CisgICAgICBwcmludGYgKCIgIG9iX2xlbiAgICVkXG4iLCBvYl9sZW4pOworICAgICAgcHJpbnRmICgiICB3YW50X2xlbiAlZFxuIiwgd2FudF9sZW4pOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBvYnN0YWNrX2ZyZWUgKCZvYiwgTlVMTCk7CisjZW5kaWYKK30KKworCit2b2lkCitjaGVja19vbmUgKGNvbnN0IGNoYXIgKndhbnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgLyogc2ltcGxlc3QgZmlyc3QgKi8KKyAgY2hlY2tfdnNwcmludGYgKHdhbnQsIGZtdCwgYXApOworICBjaGVja192ZnByaW50ZiAod2FudCwgZm10LCBhcCk7CisgIGNoZWNrX3ZzbnByaW50ZiAod2FudCwgZm10LCBhcCk7CisgIGNoZWNrX3Zhc3ByaW50ZiAod2FudCwgZm10LCBhcCk7CisgIGNoZWNrX29ic3RhY2tfdnByaW50ZiAod2FudCwgZm10LCBhcCk7Cit9CisKKworI2RlZmluZSBoZXhfb3Jfb2N0YWxfcChmbXQpICAgICAgICAgICAgIFwKKyAgKHN0cmNociAoZm10LCAneCcpICE9IE5VTEwgICAgICAgICAgICBcCisgICB8fCBzdHJjaHIgKGZtdCwgJ1gnKSAhPSBOVUxMICAgICAgICAgXAorICAgfHwgc3RyY2hyIChmbXQsICdvJykgIT0gTlVMTCkKKwordm9pZAorY2hlY2tfeiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKmZtdDsKKyAgICBjb25zdCBjaGFyICAqejsKKyAgICBjb25zdCBjaGFyICAqd2FudDsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAiJVpkIiwgIjAiLCAgICAiMCIgfSwKKyAgICB7ICIlWmQiLCAiMSIsICAgICIxIiB9LAorICAgIHsgIiVaZCIsICIxMjMiLCAgIjEyMyIgfSwKKyAgICB7ICIlWmQiLCAiLTEiLCAgICItMSIgfSwKKyAgICB7ICIlWmQiLCAiLTEyMyIsICItMTIzIiB9LAorCisgICAgeyAiJStaZCIsICIwIiwgICAgICAiKzAiIH0sCisgICAgeyAiJStaZCIsICIxMjMiLCAgIisxMjMiIH0sCisgICAgeyAiJStaZCIsICItMTIzIiwgIi0xMjMiIH0sCisKKyAgICB7ICIlWngiLCAgIjEyMyIsICAgIjdiIiB9LAorICAgIHsgIiVaWCIsICAiMTIzIiwgICAiN0IiIH0sCisgICAgeyAiJVp4IiwgIi0xMjMiLCAgIi03YiIgfSwKKyAgICB7ICIlWlgiLCAiLTEyMyIsICAiLTdCIiB9LAorICAgIHsgIiVabyIsICAiMTIzIiwgICIxNzMiIH0sCisgICAgeyAiJVpvIiwgIi0xMjMiLCAiLTE3MyIgfSwKKworICAgIHsgIiUjWngiLCAgICAiMCIsICAgICAiMCIgfSwKKyAgICB7ICIlI1pYIiwgICAgIjAiLCAgICAgIjAiIH0sCisgICAgeyAiJSNaeCIsICAiMTIzIiwgICIweDdiIiB9LAorICAgIHsgIiUjWlgiLCAgIjEyMyIsICAiMFg3QiIgfSwKKyAgICB7ICIlI1p4IiwgIi0xMjMiLCAiLTB4N2IiIH0sCisgICAgeyAiJSNaWCIsICItMTIzIiwgIi0wWDdCIiB9LAorCisgICAgeyAiJSNabyIsICAgICIwIiwgICAgICIwIiB9LAorICAgIHsgIiUjWm8iLCAgIjEyMyIsICAiMDE3MyIgfSwKKyAgICB7ICIlI1pvIiwgIi0xMjMiLCAiLTAxNzMiIH0sCisKKyAgICB7ICIlMTBaZCIsICAgICAgIjAiLCAiICAgICAgICAgMCIgfSwKKyAgICB7ICIlMTBaZCIsICAgICIxMjMiLCAiICAgICAgIDEyMyIgfSwKKyAgICB7ICIlMTBaZCIsICAgIi0xMjMiLCAiICAgICAgLTEyMyIgfSwKKworICAgIHsgIiUtMTBaZCIsICAgICAiMCIsICIwICAgICAgICAgIiB9LAorICAgIHsgIiUtMTBaZCIsICAgIjEyMyIsICIxMjMgICAgICAgIiB9LAorICAgIHsgIiUtMTBaZCIsICAiLTEyMyIsICItMTIzICAgICAgIiB9LAorCisgICAgeyAiJSsxMFpkIiwgICAiMTIzIiwgIiAgICAgICsxMjMiIH0sCisgICAgeyAiJSstMTBaZCIsICAiMTIzIiwgIisxMjMgICAgICAiIH0sCisgICAgeyAiJSsxMFpkIiwgICItMTIzIiwgIiAgICAgIC0xMjMiIH0sCisgICAgeyAiJSstMTBaZCIsICItMTIzIiwgIi0xMjMgICAgICAiIH0sCisKKyAgICB7ICIlMDhaZCIsICAgICIwIiwgIjAwMDAwMDAwIiB9LAorICAgIHsgIiUwOFpkIiwgICIxMjMiLCAiMDAwMDAxMjMiIH0sCisgICAgeyAiJTA4WmQiLCAiLTEyMyIsICItMDAwMDEyMyIgfSwKKworICAgIHsgIiUrMDhaZCIsICAgICIwIiwgIiswMDAwMDAwIiB9LAorICAgIHsgIiUrMDhaZCIsICAiMTIzIiwgIiswMDAwMTIzIiB9LAorICAgIHsgIiUrMDhaZCIsICItMTIzIiwgIi0wMDAwMTIzIiB9LAorCisgICAgeyAiJSMwOFp4IiwgICAgIjAiLCAiMDAwMDAwMDAiIH0sCisgICAgeyAiJSMwOFp4IiwgICIxMjMiLCAiMHgwMDAwN2IiIH0sCisgICAgeyAiJSMwOFp4IiwgIi0xMjMiLCAiLTB4MDAwN2IiIH0sCisKKyAgICB7ICIlKyMwOFp4IiwgICAgIjAiLCAiKzAwMDAwMDAiIH0sCisgICAgeyAiJSsjMDhaeCIsICAiMTIzIiwgIisweDAwMDdiIiB9LAorICAgIHsgIiUrIzA4WngiLCAiLTEyMyIsICItMHgwMDA3YiIgfSwKKworICAgIHsgIiUuMFpkIiwgIjAiLCAiIiB9LAorICAgIHsgIiUuMVpkIiwgIjAiLCAiMCIgfSwKKyAgICB7ICIlLjJaZCIsICIwIiwgIjAwIiB9LAorICAgIHsgIiUuM1pkIiwgIjAiLCAiMDAwIiB9LAorICB9OworCisgIGludCAgICAgICAgaSwgajsKKyAgbXB6X3QgICAgICB6OworICBjaGFyICAgICAgICpuZm10OworICBtcF9zaXplX3QgIG5zaXplLCB6ZXJvczsKKworICBtcHpfaW5pdCAoeik7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0ICh6LCBkYXRhW2ldLnosIDApOworCisgICAgICAvKiBkb24ndCB0cnkgbmVnYXRpdmVzIG9yIGZvcmNlZCBzaWduIGluIGhleCBvciBvY3RhbCAqLworICAgICAgaWYgKG1wel9maXRzX3Nsb25nX3AgKHopCisJICAmJiAhIChoZXhfb3Jfb2N0YWxfcCAoZGF0YVtpXS5mbXQpCisJCSYmIChzdHJjaHIgKGRhdGFbaV0uZm10LCAnKycpICE9IE5VTEwgfHwgbXB6X3Nnbih6KSA8IDApKSkKKwl7CisJICBjaGVja19wbGFpbiAoZGF0YVtpXS53YW50LCBkYXRhW2ldLmZtdCwgbXB6X2dldF9zaSAoeikpOworCX0KKworICAgICAgY2hlY2tfb25lIChkYXRhW2ldLndhbnQsIGRhdGFbaV0uZm10LCB6KTsKKworICAgICAgLyogU2FtZSBhZ2Fpbiwgd2l0aCAlTiBhbmQgcG9zc2libHkgc29tZSBoaWdoIHplcm8gbGltYnMgKi8KKyAgICAgIG5mbXQgPSBfX2dtcF9hbGxvY2F0ZV9zdHJkdXAgKGRhdGFbaV0uZm10KTsKKyAgICAgIGZvciAoaiA9IDA7IG5mbXRbal0gIT0gJ1wwJzsgaisrKQorCWlmIChuZm10W2pdID09ICdaJykKKwkgIG5mbXRbal0gPSAnTic7CisgICAgICBmb3IgKHplcm9zID0gMDsgemVyb3MgPD0gMzsgemVyb3MrKykKKwl7CisJICBuc2l6ZSA9IEFCU0laKHopK3plcm9zOworCSAgTVBaX1JFQUxMT0MgKHosIG5zaXplKTsKKwkgIG5zaXplID0gKFNJWih6KSA+PSAwID8gbnNpemUgOiAtbnNpemUpOworCSAgcmVmbXBuX3plcm8gKFBUUih6KStBQlNJWih6KSwgemVyb3MpOworCSAgY2hlY2tfb25lIChkYXRhW2ldLndhbnQsIG5mbXQsIFBUUih6KSwgbnNpemUpOworCX0KKyAgICAgIF9fZ21wX2ZyZWVfZnVuYyAobmZtdCwgc3RybGVuKG5mbXQpKzEpOworICAgIH0KKworICBtcHpfY2xlYXIgKHopOworfQorCit2b2lkCitjaGVja19xICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqZm10OworICAgIGNvbnN0IGNoYXIgICpxOworICAgIGNvbnN0IGNoYXIgICp3YW50OworICB9IGRhdGFbXSA9IHsKKyAgICB7ICIlUWQiLCAgICAiMCIsICAgICIwIiB9LAorICAgIHsgIiVRZCIsICAgICIxIiwgICAgIjEiIH0sCisgICAgeyAiJVFkIiwgICIxMjMiLCAgIjEyMyIgfSwKKyAgICB7ICIlUWQiLCAgICItMSIsICAgIi0xIiB9LAorICAgIHsgIiVRZCIsICItMTIzIiwgIi0xMjMiIH0sCisgICAgeyAiJVFkIiwgICIzLzIiLCAgIjMvMiIgfSwKKyAgICB7ICIlUWQiLCAiLTMvMiIsICItMy8yIiB9LAorCisgICAgeyAiJStRZCIsICIwIiwgICAgICAiKzAiIH0sCisgICAgeyAiJStRZCIsICIxMjMiLCAgIisxMjMiIH0sCisgICAgeyAiJStRZCIsICItMTIzIiwgIi0xMjMiIH0sCisgICAgeyAiJStRZCIsICI1LzgiLCAgIis1LzgiIH0sCisgICAgeyAiJStRZCIsICItNS84IiwgIi01LzgiIH0sCisKKyAgICB7ICIlUXgiLCAgIjEyMyIsICAgIjdiIiB9LAorICAgIHsgIiVRWCIsICAiMTIzIiwgICAiN0IiIH0sCisgICAgeyAiJVF4IiwgICIxNS8xNiIsICJmLzEwIiB9LAorICAgIHsgIiVRWCIsICAiMTUvMTYiLCAiRi8xMCIgfSwKKyAgICB7ICIlUXgiLCAiLTEyMyIsICAiLTdiIiB9LAorICAgIHsgIiVRWCIsICItMTIzIiwgICItN0IiIH0sCisgICAgeyAiJVF4IiwgIi0xNS8xNiIsICItZi8xMCIgfSwKKyAgICB7ICIlUVgiLCAiLTE1LzE2IiwgIi1GLzEwIiB9LAorICAgIHsgIiVRbyIsICAiMTIzIiwgICIxNzMiIH0sCisgICAgeyAiJVFvIiwgIi0xMjMiLCAiLTE3MyIgfSwKKyAgICB7ICIlUW8iLCAgIjE2LzE3IiwgICIyMC8yMSIgfSwKKyAgICB7ICIlUW8iLCAiLTE2LzE3IiwgIi0yMC8yMSIgfSwKKworICAgIHsgIiUjUXgiLCAgICAiMCIsICAgICAiMCIgfSwKKyAgICB7ICIlI1FYIiwgICAgIjAiLCAgICAgIjAiIH0sCisgICAgeyAiJSNReCIsICAiMTIzIiwgICIweDdiIiB9LAorICAgIHsgIiUjUVgiLCAgIjEyMyIsICAiMFg3QiIgfSwKKyAgICB7ICIlI1F4IiwgICI1LzgiLCAgIjB4NS8weDgiIH0sCisgICAgeyAiJSNRWCIsICAiNS84IiwgICIwWDUvMFg4IiB9LAorICAgIHsgIiUjUXgiLCAiLTEyMyIsICItMHg3YiIgfSwKKyAgICB7ICIlI1FYIiwgIi0xMjMiLCAiLTBYN0IiIH0sCisgICAgeyAiJSNReCIsICItNS84IiwgIi0weDUvMHg4IiB9LAorICAgIHsgIiUjUVgiLCAiLTUvOCIsICItMFg1LzBYOCIgfSwKKyAgICB7ICIlI1FvIiwgICAgIjAiLCAgICAgIjAiIH0sCisgICAgeyAiJSNRbyIsICAiMTIzIiwgICIwMTczIiB9LAorICAgIHsgIiUjUW8iLCAiLTEyMyIsICItMDE3MyIgfSwKKyAgICB7ICIlI1FvIiwgICI1LzciLCAgIjA1LzA3IiB9LAorICAgIHsgIiUjUW8iLCAiLTUvNyIsICItMDUvMDciIH0sCisKKyAgICAvKiB6ZXJvIGRlbm9taW5hdG9yIGFuZCBzaG93YmFzZSAqLworICAgIHsgIiUjMTBRbyIsICIwLzAiLCAgICAgIiAgICAgICAwLzAiIH0sCisgICAgeyAiJSMxMFFkIiwgIjAvMCIsICAgICAiICAgICAgIDAvMCIgfSwKKyAgICB7ICIlIzEwUXgiLCAiMC8wIiwgICAgICIgICAgICAgMC8wIiB9LAorICAgIHsgIiUjMTBRbyIsICIxMjMvMCIsICAgIiAgICAwMTczLzAiIH0sCisgICAgeyAiJSMxMFFkIiwgIjEyMy8wIiwgICAiICAgICAxMjMvMCIgfSwKKyAgICB7ICIlIzEwUXgiLCAiMTIzLzAiLCAgICIgICAgMHg3Yi8wIiB9LAorICAgIHsgIiUjMTBRWCIsICIxMjMvMCIsICAgIiAgICAwWDdCLzAiIH0sCisgICAgeyAiJSMxMFFvIiwgIi0xMjMvMCIsICAiICAgLTAxNzMvMCIgfSwKKyAgICB7ICIlIzEwUWQiLCAiLTEyMy8wIiwgICIgICAgLTEyMy8wIiB9LAorICAgIHsgIiUjMTBReCIsICItMTIzLzAiLCAgIiAgIC0weDdiLzAiIH0sCisgICAgeyAiJSMxMFFYIiwgIi0xMjMvMCIsICAiICAgLTBYN0IvMCIgfSwKKworICAgIHsgIiUxMFFkIiwgICAgICAiMCIsICIgICAgICAgICAwIiB9LAorICAgIHsgIiUtMTBRZCIsICAgICAiMCIsICIwICAgICAgICAgIiB9LAorICAgIHsgIiUxMFFkIiwgICAgIjEyMyIsICIgICAgICAgMTIzIiB9LAorICAgIHsgIiUtMTBRZCIsICAgIjEyMyIsICIxMjMgICAgICAgIiB9LAorICAgIHsgIiUxMFFkIiwgICAiLTEyMyIsICIgICAgICAtMTIzIiB9LAorICAgIHsgIiUtMTBRZCIsICAiLTEyMyIsICItMTIzICAgICAgIiB9LAorCisgICAgeyAiJSsxMFFkIiwgICAiMTIzIiwgIiAgICAgICsxMjMiIH0sCisgICAgeyAiJSstMTBRZCIsICAiMTIzIiwgIisxMjMgICAgICAiIH0sCisgICAgeyAiJSsxMFFkIiwgICItMTIzIiwgIiAgICAgIC0xMjMiIH0sCisgICAgeyAiJSstMTBRZCIsICItMTIzIiwgIi0xMjMgICAgICAiIH0sCisKKyAgICB7ICIlMDhRZCIsICAgICIwIiwgIjAwMDAwMDAwIiB9LAorICAgIHsgIiUwOFFkIiwgICIxMjMiLCAiMDAwMDAxMjMiIH0sCisgICAgeyAiJTA4UWQiLCAiLTEyMyIsICItMDAwMDEyMyIgfSwKKworICAgIHsgIiUrMDhRZCIsICAgICIwIiwgIiswMDAwMDAwIiB9LAorICAgIHsgIiUrMDhRZCIsICAiMTIzIiwgIiswMDAwMTIzIiB9LAorICAgIHsgIiUrMDhRZCIsICItMTIzIiwgIi0wMDAwMTIzIiB9LAorCisgICAgeyAiJSMwOFF4IiwgICAgIjAiLCAiMDAwMDAwMDAiIH0sCisgICAgeyAiJSMwOFF4IiwgICIxMjMiLCAiMHgwMDAwN2IiIH0sCisgICAgeyAiJSMwOFF4IiwgIi0xMjMiLCAiLTB4MDAwN2IiIH0sCisKKyAgICB7ICIlKyMwOFF4IiwgICAgIjAiLCAiKzAwMDAwMDAiIH0sCisgICAgeyAiJSsjMDhReCIsICAiMTIzIiwgIisweDAwMDdiIiB9LAorICAgIHsgIiUrIzA4UXgiLCAiLTEyMyIsICItMHgwMDA3YiIgfSwKKyAgfTsKKworICBpbnQgICAgaTsKKyAgbXBxX3QgIHE7CisKKyAgbXBxX2luaXQgKHEpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHFfc2V0X3N0cl9vcl9hYm9ydCAocSwgZGF0YVtpXS5xLCAwKTsKKyAgICAgIGNoZWNrX29uZSAoZGF0YVtpXS53YW50LCBkYXRhW2ldLmZtdCwgcSk7CisgICAgfQorCisgIG1wcV9jbGVhciAocSk7Cit9CisKK3ZvaWQKK2NoZWNrX2YgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICpmbXQ7CisgICAgY29uc3QgY2hhciAgKmY7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7ICIlRmYiLCAgICAiMCIsICAgICIwLjAwMDAwMCIgfSwKKyAgICB7ICIlRmYiLCAgIjEyMyIsICAiMTIzLjAwMDAwMCIgfSwKKyAgICB7ICIlRmYiLCAiLTEyMyIsICItMTIzLjAwMDAwMCIgfSwKKworICAgIHsgIiUrRmYiLCAgICAiMCIsICAgIiswLjAwMDAwMCIgfSwKKyAgICB7ICIlK0ZmIiwgICIxMjMiLCAiKzEyMy4wMDAwMDAiIH0sCisgICAgeyAiJStGZiIsICItMTIzIiwgIi0xMjMuMDAwMDAwIiB9LAorCisgICAgeyAiJS4wRmYiLCAgICAiMCIsICAgICIwIiB9LAorICAgIHsgIiUuMEZmIiwgICIxMjMiLCAgIjEyMyIgfSwKKyAgICB7ICIlLjBGZiIsICItMTIzIiwgIi0xMjMiIH0sCisKKyAgICB7ICIlOC4wRmYiLCAgICAiMCIsICIgICAgICAgMCIgfSwKKyAgICB7ICIlOC4wRmYiLCAgIjEyMyIsICIgICAgIDEyMyIgfSwKKyAgICB7ICIlOC4wRmYiLCAiLTEyMyIsICIgICAgLTEyMyIgfSwKKworICAgIHsgIiUwOC4wRmYiLCAgICAiMCIsICIwMDAwMDAwMCIgfSwKKyAgICB7ICIlMDguMEZmIiwgICIxMjMiLCAiMDAwMDAxMjMiIH0sCisgICAgeyAiJTA4LjBGZiIsICItMTIzIiwgIi0wMDAwMTIzIiB9LAorCisgICAgeyAiJTEwLjJGZiIsICAgICAgICIwIiwgIiAgICAgIDAuMDAiIH0sCisgICAgeyAiJTEwLjJGZiIsICAgICIwLjI1IiwgIiAgICAgIDAuMjUiIH0sCisgICAgeyAiJTEwLjJGZiIsICAiMTIzLjI1IiwgIiAgICAxMjMuMjUiIH0sCisgICAgeyAiJTEwLjJGZiIsICItMTIzLjI1IiwgIiAgIC0xMjMuMjUiIH0sCisKKyAgICB7ICIlLTEwLjJGZiIsICAgICAgICIwIiwgIjAuMDAgICAgICAiIH0sCisgICAgeyAiJS0xMC4yRmYiLCAgICAiMC4yNSIsICIwLjI1ICAgICAgIiB9LAorICAgIHsgIiUtMTAuMkZmIiwgICIxMjMuMjUiLCAiMTIzLjI1ICAgICIgfSwKKyAgICB7ICIlLTEwLjJGZiIsICItMTIzLjI1IiwgIi0xMjMuMjUgICAiIH0sCisKKyAgICB7ICIlLjJGZiIsICIwLjAwMDAwMDAwMDAwMDAxIiwgIjAuMDAiIH0sCisgICAgeyAiJS4yRmYiLCAiMC4wMDIiLCAgICAgICAgICAgICIwLjAwIiB9LAorICAgIHsgIiUuMkZmIiwgIjAuMDA4IiwgICAgICAgICAgICAiMC4wMSIgfSwKKworICAgIHsgIiUuMEZmIiwgIjEyMy4wMDAwMDAwMDAwMDAwMSIsICIxMjMiIH0sCisgICAgeyAiJS4wRmYiLCAiMTIzLjIiLCAgICAgICAgICAgICAgIjEyMyIgfSwKKyAgICB7ICIlLjBGZiIsICIxMjMuOCIsICAgICAgICAgICAgICAiMTI0IiB9LAorCisgICAgeyAiJS4wRmYiLCAgIjk5OTk5OS45IiwgIjEwMDAwMDAiIH0sCisgICAgeyAiJS4wRmYiLCAiMzk5OTk5OS45IiwgIjQwMDAwMDAiIH0sCisKKyAgICB7ICIlRmUiLCAgICAiMCIsICAiMC4wMDAwMDBlKzAwIiB9LAorICAgIHsgIiVGZSIsICAgICIxIiwgICIxLjAwMDAwMGUrMDAiIH0sCisgICAgeyAiJUZlIiwgICIxMjMiLCAgIjEuMjMwMDAwZSswMiIgfSwKKworICAgIHsgIiVGRSIsICAgICIwIiwgICIwLjAwMDAwMEUrMDAiIH0sCisgICAgeyAiJUZFIiwgICAgIjEiLCAgIjEuMDAwMDAwRSswMCIgfSwKKyAgICB7ICIlRkUiLCAgIjEyMyIsICAiMS4yMzAwMDBFKzAyIiB9LAorCisgICAgeyAiJUZlIiwgICAgIjAiLCAgIjAuMDAwMDAwZSswMCIgfSwKKyAgICB7ICIlRmUiLCAgICAiMSIsICAiMS4wMDAwMDBlKzAwIiB9LAorCisgICAgeyAiJS4wRmUiLCAgICAgIjEwMDAwMDAwMDAwIiwgICAgIjFlKzEwIiB9LAorICAgIHsgIiUuMEZlIiwgICAgIi0xMDAwMDAwMDAwMCIsICAgIi0xZSsxMCIgfSwKKworICAgIHsgIiUuMkZlIiwgICAgICIxMDAwMDAwMDAwMCIsICAiMS4wMGUrMTAiIH0sCisgICAgeyAiJS4yRmUiLCAgICAiLTEwMDAwMDAwMDAwIiwgIi0xLjAwZSsxMCIgfSwKKworICAgIHsgIiU4LjBGZSIsICAgICIxMDAwMDAwMDAwMCIsICIgICAxZSsxMCIgfSwKKyAgICB7ICIlOC4wRmUiLCAgICItMTAwMDAwMDAwMDAiLCAiICAtMWUrMTAiIH0sCisKKyAgICB7ICIlLTguMEZlIiwgICAiMTAwMDAwMDAwMDAiLCAiMWUrMTAgICAiIH0sCisgICAgeyAiJS04LjBGZSIsICAiLTEwMDAwMDAwMDAwIiwgIi0xZSsxMCAgIiB9LAorCisgICAgeyAiJTEyLjJGZSIsICAgIjEwMDAwMDAwMDAwIiwgIiAgICAxLjAwZSsxMCIgfSwKKyAgICB7ICIlMTIuMkZlIiwgICItMTAwMDAwMDAwMDAiLCAiICAgLTEuMDBlKzEwIiB9LAorCisgICAgeyAiJTAxMi4yRmUiLCAgIjEwMDAwMDAwMDAwIiwgIjAwMDAxLjAwZSsxMCIgfSwKKyAgICB7ICIlMDEyLjJGZSIsICItMTAwMDAwMDAwMDAiLCAiLTAwMDEuMDBlKzEwIiB9LAorCisgICAgeyAiJUZnIiwgICAiMCIsICIwIiB9LAorICAgIHsgIiVGZyIsICAgIjEiLCAiMSIgfSwKKyAgICB7ICIlRmciLCAgICItMSIsICItMSIgfSwKKworICAgIHsgIiUuMEZnIiwgIjAiLCAiMCIgfSwKKyAgICB7ICIlLjBGZyIsICIxIiwgIjEiIH0sCisgICAgeyAiJS4wRmciLCAiLTEiLCAiLTEiIH0sCisKKyAgICB7ICIlLjFGZyIsICIxMDAiLCAiMWUrMDIiIH0sCisgICAgeyAiJS4yRmciLCAiMTAwIiwgIjFlKzAyIiB9LAorICAgIHsgIiUuM0ZnIiwgIjEwMCIsICIxMDAiIH0sCisgICAgeyAiJS40RmciLCAiMTAwIiwgIjEwMCIgfSwKKworICAgIHsgIiVGZyIsICIwLjAwMSIsICAgICIwLjAwMSIgfSwKKyAgICB7ICIlRmciLCAiMC4wMDAxIiwgICAiMC4wMDAxIiB9LAorICAgIHsgIiVGZyIsICIwLjAwMDAxIiwgICIxZS0wNSIgfSwKKyAgICB7ICIlRmciLCAiMC4wMDAwMDEiLCAiMWUtMDYiIH0sCisKKyAgICB7ICIlLjRGZyIsICIxLjAwMDAwMDAwMDAwMDAxIiwgIjEiIH0sCisgICAgeyAiJS40RmciLCAiMTAwMDAwMDAwMDAwMDAxIiwgICIxZSsxNCIgfSwKKworICAgIHsgIiUuNEZnIiwgIjEyMzQ1Njc4IiwgIjEuMjM1ZSswNyIgfSwKKworICAgIHsgIiVGYSIsICIwIiwiMHgwcCswIiB9LAorICAgIHsgIiVGQSIsICIwIiwiMFgwUCswIiB9LAorCisgICAgeyAiJUZhIiwgIjEiLCIweDFwKzAiIH0sCisgICAgeyAiJUZhIiwgIjY1NTM1IiwiMHhmLmZmZnArMTIiIH0sCisgICAgeyAiJUZhIiwgIjY1NTM2IiwiMHgxcCsxNiIgfSwKKyAgICB7ICIlRi4xMGEiLCAiNjU1MzYiLCIweDEuMDAwMDAwMDAwMHArMTYiIH0sCisgICAgeyAiJUYuMWEiLCAiNjU1MzUiLCIweDEuMHArMTYiIH0sCisgICAgeyAiJUYuMGEiLCAiNjU1MzUiLCIweDFwKzE2IiB9LAorCisgICAgeyAiJS4yRmYiLCAiMC45OTYwOTM3NSIsICIxLjAwIiB9LAorICAgIHsgIiUuRmYiLCAgIjAuOTk2MDkzNzUiLCAiMC45OTYwOTM3NSIgfSwKKyAgICB7ICIlLkZlIiwgICIwLjk5NjA5Mzc1IiwgIjkuOTYwOTM3NWUtMDEiIH0sCisgICAgeyAiJS5GZyIsICAiMC45OTYwOTM3NSIsICIwLjk5NjA5Mzc1IiB9LAorICAgIHsgIiUuMjBGZyIsICAiMTAwMDAwMCIsICIxMDAwMDAwIiB9LAorICAgIHsgIiUuRmciLCAgIjEwMDAwMDAiLCAiMTAwMDAwMCIgfSwKKworICAgIHsgIiUjLjBGZiIsICIxIiwgIjEuIiB9LAorICAgIHsgIiUjLjBGZSIsICIxIiwgIjEuZSswMCIgfSwKKyAgICB7ICIlIy4wRmciLCAiMSIsICIxLiIgfSwKKworICAgIHsgIiUjLjFGZiIsICIxIiwgIjEuMCIgfSwKKyAgICB7ICIlIy4xRmUiLCAiMSIsICIxLjBlKzAwIiB9LAorICAgIHsgIiUjLjFGZyIsICIxIiwgIjEuIiB9LAorCisgICAgeyAiJSMuNEZmIiwgIjEyMzQiLCAiMTIzNC4wMDAwIiB9LAorICAgIHsgIiUjLjRGZSIsICIxMjM0IiwgIjEuMjM0MGUrMDMiIH0sCisgICAgeyAiJSMuNEZnIiwgIjEyMzQiLCAiMTIzNC4iIH0sCisKKyAgICB7ICIlIy44RmYiLCAiMTIzNCIsICIxMjM0LjAwMDAwMDAwIiB9LAorICAgIHsgIiUjLjhGZSIsICIxMjM0IiwgIjEuMjM0MDAwMDBlKzAzIiB9LAorICAgIHsgIiUjLjhGZyIsICIxMjM0IiwgIjEyMzQuMDAwMCIgfSwKKworICB9OworCisgIGludCAgICAgaTsKKyAgbXBmX3QgICBmOworICBkb3VibGUgIGQ7CisKKyAgbXBmX2luaXQyIChmLCAyNTZMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgaWYgKGRhdGFbaV0uZlswXSA9PSAnMCcgJiYgZGF0YVtpXS5mWzFdID09ICd4JykKKwltcGZfc2V0X3N0cl9vcl9hYm9ydCAoZiwgZGF0YVtpXS5mLCAxNik7CisgICAgICBlbHNlCisJbXBmX3NldF9zdHJfb3JfYWJvcnQgKGYsIGRhdGFbaV0uZiwgMTApOworCisgICAgICAvKiBpZiBtcGYtPmRvdWJsZSBkb2Vzbid0IHRydW5jYXRlLCB0aGVuIGV4cGVjdCBzYW1lIHJlc3VsdCAqLworICAgICAgZCA9IG1wZl9nZXRfZCAoZik7CisgICAgICBpZiAobXBmX2NtcF9kIChmLCBkKSA9PSAwKQorCWNoZWNrX3BsYWluIChkYXRhW2ldLndhbnQsIGRhdGFbaV0uZm10LCBkKTsKKworICAgICAgY2hlY2tfb25lIChkYXRhW2ldLndhbnQsIGRhdGFbaV0uZm10LCBmKTsKKyAgICB9CisKKyAgbXBmX2NsZWFyIChmKTsKK30KKworCit2b2lkCitjaGVja19saW1iICh2b2lkKQoreworICBpbnQgICAgICAgIGk7CisgIG1wX2xpbWJfdCAgbGltYjsKKyAgbXB6X3QgICAgICB6OworICBjaGFyICAgICAgICpzOworCisgIGNoZWNrX29uZSAoIjAiLCAiJU1kIiwgQ05TVF9MSU1CKDApKTsKKyAgY2hlY2tfb25lICgiMSIsICIlTWQiLCBDTlNUX0xJTUIoMSkpOworCisgIC8qICJpIiBtYW55IDEgYml0cywgdGVzdGVkIGFnYWluc3QgbXB6X2dldF9zdHIgaW4gZGVjaW1hbCBhbmQgaGV4ICovCisgIGxpbWIgPSAxOworICBtcHpfaW5pdF9zZXRfdWkgKHosIDFMKTsKKyAgZm9yIChpID0gMTsgaSA8PSBHTVBfTElNQl9CSVRTOyBpKyspCisgICAgeworICAgICAgcyA9IG1wel9nZXRfc3RyIChOVUxMLCAxMCwgeik7CisgICAgICBjaGVja19vbmUgKHMsICIlTXUiLCBsaW1iKTsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAocywgc3RybGVuIChzKSArIDEpOworCisgICAgICBzID0gbXB6X2dldF9zdHIgKE5VTEwsIDE2LCB6KTsKKyAgICAgIGNoZWNrX29uZSAocywgIiVNeCIsIGxpbWIpOworICAgICAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzLCBzdHJsZW4gKHMpICsgMSk7CisKKyAgICAgIHMgPSBtcHpfZ2V0X3N0ciAoTlVMTCwgLTE2LCB6KTsKKyAgICAgIGNoZWNrX29uZSAocywgIiVNWCIsIGxpbWIpOworICAgICAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzLCBzdHJsZW4gKHMpICsgMSk7CisKKyAgICAgIGxpbWIgPSAyKmxpbWIgKyAxOworICAgICAgbXB6X211bF8yZXhwICh6LCB6LCAxTCk7CisgICAgICBtcHpfYWRkX3VpICh6LCB6LCAxTCk7CisgICAgfQorCisgIG1wel9jbGVhciAoeik7Cit9CisKKwordm9pZAorY2hlY2tfbiAodm9pZCkKK3sKKyAgeworICAgIGludCAgbiA9IC0xOworICAgIGNoZWNrX29uZSAoImJsYWgiLCAiJW5ibGFoIiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKG4gPT0gMCk7CisgIH0KKworICB7CisgICAgaW50ICBuID0gLTE7CisgICAgY2hlY2tfb25lICgiaGVsbG8gIiwgImhlbGxvICVuIiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKG4gPT0gNik7CisgIH0KKworICB7CisgICAgaW50ICBuID0gLTE7CisgICAgY2hlY2tfb25lICgiaGVsbG8gIHdvcmxkIiwgImhlbGxvICVuIHdvcmxkIiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKG4gPT0gNik7CisgIH0KKworI2RlZmluZSBDSEVDS19OKHR5cGUsIHN0cmluZykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlICB4WzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgIGZtdFsxMjhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJXAorICAgIHhbMF0gPSB+ICh0eXBlKSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeFsxXSA9IH4gKHR5cGUpIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmIChmbXQsICIlJWQlJSVzbiUlZCIsIHN0cmluZyk7ICAgICAgICAgICAgICAgXAorICAgIGNoZWNrX29uZSAoIjEyMzQ1NiIsIGZtdCwgMTIzLCAmeFswXSwgNDU2KTsgICAgICAgICBcCisJCQkJCQkJXAorICAgIC8qIHNob3VsZCB3cml0ZSB3aG9sZSBvZiB4WzBdIGFuZCBub25lIG9mIHhbMV0gKi8gICBcCisgICAgQVNTRVJUX0FMV0FZUyAoeFswXSA9PSAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlRfQUxXQVlTICh4WzFdID09ICh0eXBlKSB+ICh0eXBlKSAwKTsJCVwKKwkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyAgQ0hFQ0tfTiAobXBfbGltYl90LCAiTSIpOworICBDSEVDS19OIChjaGFyLCAgICAgICJoaCIpOworICBDSEVDS19OIChsb25nLCAgICAgICJsIik7CisjaWYgSEFWRV9MT05HX0xPTkcKKyAgQ0hFQ0tfTiAobG9uZyBsb25nLCAiTCIpOworI2VuZGlmCisjaWYgSEFWRV9JTlRNQVhfVAorICBDSEVDS19OIChpbnRtYXhfdCwgICJqIik7CisjZW5kaWYKKyNpZiBIQVZFX1BUUkRJRkZfVAorICBDSEVDS19OIChwdHJkaWZmX3QsICJ0Iik7CisjZW5kaWYKKyAgQ0hFQ0tfTiAoc2hvcnQsICAgICAiaCIpOworICBDSEVDS19OIChzaXplX3QsICAgICJ6Iik7CisKKyAgeworICAgIG1wel90ICB4WzJdOworICAgIG1wel9pbml0X3NldF9zaSAoeFswXSwgLTk4N0wpOworICAgIG1wel9pbml0X3NldF9zaSAoeFsxXSwgIDY1NEwpOworICAgIGNoZWNrX29uZSAoIjEyMzQ1NiIsICIlZCVabiVkIiwgMTIzLCB4WzBdLCA0NTYpOworICAgIE1QWl9DSEVDS19GT1JNQVQgKHhbMF0pOworICAgIE1QWl9DSEVDS19GT1JNQVQgKHhbMV0pOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHhbMF0sIDNMKSA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh4WzFdLCA2NTRMKSA9PSAwKTsKKyAgICBtcHpfY2xlYXIgKHhbMF0pOworICAgIG1wel9jbGVhciAoeFsxXSk7CisgIH0KKworICB7CisgICAgbXBxX3QgIHhbMl07CisgICAgbXBxX2luaXQgKHhbMF0pOworICAgIG1wcV9pbml0ICh4WzFdKTsKKyAgICBtcHFfc2V0X3VpICh4WzBdLCA5ODdMLCA2NTRMKTsKKyAgICBtcHFfc2V0X3VpICh4WzFdLCA0MTE1TCwgMjI2TCk7CisgICAgY2hlY2tfb25lICgiMTIzNDU2IiwgIiVkJVFuJWQiLCAxMjMsIHhbMF0sIDQ1Nik7CisgICAgTVBRX0NIRUNLX0ZPUk1BVCAoeFswXSk7CisgICAgTVBRX0NIRUNLX0ZPUk1BVCAoeFsxXSk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBxX2NtcF91aSAoeFswXSwgM0wsIDFMKSA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHFfY21wX3VpICh4WzFdLCA0MTE1TCwgMjI2TCkgPT0gMCk7CisgICAgbXBxX2NsZWFyICh4WzBdKTsKKyAgICBtcHFfY2xlYXIgKHhbMV0pOworICB9CisKKyAgeworICAgIG1wZl90ICB4WzJdOworICAgIG1wZl9pbml0ICh4WzBdKTsKKyAgICBtcGZfaW5pdCAoeFsxXSk7CisgICAgbXBmX3NldF91aSAoeFswXSwgOTg3TCk7CisgICAgbXBmX3NldF91aSAoeFsxXSwgNjU0TCk7CisgICAgY2hlY2tfb25lICgiMTIzNDU2IiwgIiVkJUZuJWQiLCAxMjMsIHhbMF0sIDQ1Nik7CisgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeFswXSk7CisgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeFsxXSk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBmX2NtcF91aSAoeFswXSwgM0wpID09IDApOworICAgIEFTU0VSVF9BTFdBWVMgKG1wZl9jbXBfdWkgKHhbMV0sIDY1NEwpID09IDApOworICAgIG1wZl9jbGVhciAoeFswXSk7CisgICAgbXBmX2NsZWFyICh4WzFdKTsKKyAgfQorCisgIHsKKyAgICBtcF9saW1iX3QgIGFbNV07CisgICAgbXBfbGltYl90ICBhX3dhbnRbbnVtYmVyb2YoYSldOworICAgIG1wX3NpemVfdCAgaTsKKworICAgIGFbMF0gPSAxMjM7CisgICAgY2hlY2tfb25lICgiYmxhaCIsICJibCVObmFoIiwgYSwgKG1wX3NpemVfdCkgMCk7CisgICAgQVNTRVJUX0FMV0FZUyAoYVswXSA9PSAxMjMpOworCisgICAgTVBOX1pFUk8gKGFfd2FudCwgbnVtYmVyb2YgKGFfd2FudCkpOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1iZXJvZiAoYSk7IGkrKykKKyAgICAgIHsKKwljaGVja19vbmUgKCJibGFoIiwgImJsJU5uYWgiLCBhLCBpKTsKKwlhX3dhbnRbMF0gPSAyOworCUFTU0VSVF9BTFdBWVMgKG1wbl9jbXAgKGEsIGFfd2FudCwgaSkgPT0gMCk7CisgICAgICB9CisgIH0KK30KKworCit2b2lkCitjaGVja19taXNjICh2b2lkKQoreworICBtcHpfdCAgejsKKyAgbXBmX3QgIGY7CisKKyAgbXB6X2luaXQgKHopOworICBtcGZfaW5pdDIgKGYsIDEyOEwpOworCisgIGNoZWNrX29uZSAoIiEiLCAiJWMiLCAnIScpOworCisgIGNoZWNrX29uZSAoImhlbGxvIHdvcmxkIiwgImhlbGxvICVzIiwgIndvcmxkIik7CisgIGNoZWNrX29uZSAoImhlbGxvOiIsICIlczoiLCAiaGVsbG8iKTsKKyAgbXB6X3NldF91aSAoeiwgMEwpOworICBjaGVja19vbmUgKCJoZWxsbzAiLCAiJXMlWmQiLCAiaGVsbG8iLCB6LCB6KTsKKworICB7CisgICAgc3RhdGljIGNoYXIgIHhzWzgwMV07CisgICAgbWVtc2V0ICh4cywgJ3gnLCBzaXplb2YoeHMpLTEpOworICAgIGNoZWNrX29uZSAoeHMsICIlcyIsIHhzKTsKKyAgfQorICB7CisgICAgY2hhciAgKnhzOworICAgIHhzID0gKGNoYXIgKikgKCpfX2dtcF9hbGxvY2F0ZV9mdW5jKSAoTUFYX09VVFBVVCAqIDIgLSAxMik7CisgICAgbWVtc2V0ICh4cywgJyUnLCBNQVhfT1VUUFVUICogMiAtIDE0KTsKKyAgICB4cyBbTUFYX09VVFBVVCAqIDIgLSAxM10gPSAnXDAnOworICAgIHhzIFtNQVhfT1VUUFVUICogMiAtIDE0XSA9ICd4JzsKKyAgICBjaGVja19vbmUgKHhzICsgTUFYX09VVFBVVCAtIDcsIHhzLCBOVUxMKTsKKyAgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHhzLCBNQVhfT1VUUFVUICogMiAtIDEyKTsKKyAgfQorCisgIG1wel9zZXRfdWkgKHosIDEyMzQ1TCk7CisgIGNoZWNrX29uZSAoIiAgICAgMTIzNDUiLCAiJSpaZCIsIDEwLCB6KTsKKyAgY2hlY2tfb25lICgiMDAwMDAxMjM0NSIsICIlMCpaZCIsIDEwLCB6KTsKKyAgY2hlY2tfb25lICgiMTIzNDUgICAgICIsICIlKlpkIiwgLTEwLCB6KTsKKyAgY2hlY2tfb25lICgiMTIzNDUgYW5kIDY3OCIsICIlWmQgYW5kICVkIiwgeiwgNjc4KTsKKyAgY2hlY2tfb25lICgiMTIzNDUsMSwxMjM0NSwyLDEyMzQ1IiwgIiVaZCwlZCwlWmQsJWQsJVpkIiwgeiwgMSwgeiwgMiwgeik7CisKKyAgLyogZnJvbSB0aGUgZ2xpYmMgaW5mbyBkb2NzICovCisgIG1wel9zZXRfc2kgKHosIDBMKTsKKyAgY2hlY2tfb25lICgifCAgICAwfDAgICAgfCAgICswfCswICAgfCAgICAwfDAwMDAwfCAgICAgfCAgIDAwfDB8IiwKKwkgICAgICJ8JTVaZHwlLTVaZHwlKzVaZHwlKy01WmR8JSA1WmR8JTA1WmR8JTUuMFpkfCU1LjJaZHwlWmR8IiwKKwkgICAgIC8qKi8geiwgICAgeiwgICAgeiwgICAgIHosICAgIHosICAgIHosICAgICB6LCAgICAgeiwgIHopOworICBtcHpfc2V0X3NpICh6LCAxTCk7CisgIGNoZWNrX29uZSAoInwgICAgMXwxICAgIHwgICArMXwrMSAgIHwgICAgMXwwMDAwMXwgICAgMXwgICAwMXwxfCIsCisJICAgICAifCU1WmR8JS01WmR8JSs1WmR8JSstNVpkfCUgNVpkfCUwNVpkfCU1LjBaZHwlNS4yWmR8JVpkfCIsCisJICAgICAvKiovIHosICAgIHosICAgIHosICAgICB6LCAgICB6LCAgICB6LCAgICAgeiwgICAgIHosICB6KTsKKyAgbXB6X3NldF9zaSAoeiwgLTFMKTsKKyAgY2hlY2tfb25lICgifCAgIC0xfC0xICAgfCAgIC0xfC0xICAgfCAgIC0xfC0wMDAxfCAgIC0xfCAgLTAxfC0xfCIsCisJICAgICAifCU1WmR8JS01WmR8JSs1WmR8JSstNVpkfCUgNVpkfCUwNVpkfCU1LjBaZHwlNS4yWmR8JVpkfCIsCisJICAgICAvKiovIHosICAgIHosICAgIHosICAgICB6LCAgICB6LCAgICB6LCAgICAgeiwgICAgIHosICB6KTsKKyAgbXB6X3NldF9zaSAoeiwgMTAwMDAwTCk7CisgIGNoZWNrX29uZSAoInwxMDAwMDB8MTAwMDAwfCsxMDAwMDB8KzEwMDAwMHwgMTAwMDAwfDEwMDAwMHwxMDAwMDB8MTAwMDAwfDEwMDAwMHwiLAorCSAgICAgInwlNVpkfCUtNVpkfCUrNVpkfCUrLTVaZHwlIDVaZHwlMDVaZHwlNS4wWmR8JTUuMlpkfCVaZHwiLAorCSAgICAgLyoqLyB6LCAgICB6LCAgICB6LCAgICAgeiwgICAgeiwgICAgeiwgICAgIHosICAgICB6LCAgeik7CisgIG1wel9zZXRfc2kgKHosIDBMKTsKKyAgY2hlY2tfb25lICgifCAgICAwfCAgICAwfCAgICAwfCAgICAwfCAgICAwfCAgICAwfCAgMDAwMDAwMDB8IiwKKwkgICAgICJ8JTVab3wlNVp4fCU1Wlh8JSM1Wm98JSM1Wnh8JSM1Wlh8JSMxMC44Wnh8IiwKKwkgICAgIC8qKi8geiwgICB6LCAgIHosICAgIHosICAgIHosICAgIHosICAgICAgIHopOworICBtcHpfc2V0X3NpICh6LCAxTCk7CisgIGNoZWNrX29uZSAoInwgICAgMXwgICAgMXwgICAgMXwgICAwMXwgIDB4MXwgIDBYMXwweDAwMDAwMDAxfCIsCisJICAgICAifCU1Wm98JTVaeHwlNVpYfCUjNVpvfCUjNVp4fCUjNVpYfCUjMTAuOFp4fCIsCisJICAgICAvKiovIHosICAgeiwgICB6LCAgICB6LCAgICB6LCAgICB6LCAgICAgICB6KTsKKyAgbXB6X3NldF9zaSAoeiwgMTAwMDAwTCk7CisgIGNoZWNrX29uZSAoInwzMDMyNDB8MTg2YTB8MTg2QTB8MDMwMzI0MHwweDE4NmEwfDBYMTg2QTB8MHgwMDAxODZhMHwiLAorCSAgICAgInwlNVpvfCU1Wnh8JTVaWHwlIzVab3wlIzVaeHwlIzVaWHwlIzEwLjhaeHwiLAorCSAgICAgLyoqLyB6LCAgIHosICAgeiwgICAgeiwgICAgeiwgICAgeiwgICAgICAgeik7CisKKyAgLyogJXpkIGZvciBzaXplX3Qgd29uJ3QgYmUgYXZhaWxhYmxlIG9uIG9sZCBzeXN0ZW1zLCBhbmQgcnVubmluZyBzb21ldGhpbmcKKyAgICAgdG8gc2VlIGlmIGl0IHdvcmtzIG1pZ2h0IGJlIGJhZCwgc28gb25seSB0cnkgaXQgb24gZ2xpYmMsIGFuZCBvbmx5IG9uIGEKKyAgICAgbmV3IGVub3VnaCB2ZXJzaW9uIChnbGliYyAyLjAgZG9lc24ndCBoYXZlICV6ZCkgKi8KKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAwKQorICBtcHpfc2V0X3VpICh6LCA3ODlMKTsKKyAgY2hlY2tfb25lICgiNDU2IDc4OSBibGFoIiwgIiV6ZCAlWmQgYmxhaCIsIChzaXplX3QpIDQ1Niwgeik7CisjZW5kaWYKKworICBtcHpfY2xlYXIgKHopOworICBtcGZfY2xlYXIgKGYpOworfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaWYgKGFyZ2MgPiAxICYmIHN0cmNtcCAoYXJndlsxXSwgIi1zIikgPT0gMCkKKyAgICBvcHRpb25fY2hlY2tfcHJpbnRmID0gMTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgY2hlY2tfdmZwcmludGZfZnAgPSBmb3BlbiAoQ0hFQ0tfVkZQUklOVEZfRklMRU5BTUUsICJ3KyIpOworICBBU1NFUlRfQUxXQVlTIChjaGVja192ZnByaW50Zl9mcCAhPSBOVUxMKTsKKworICBjaGVja196ICgpOworICBjaGVja19xICgpOworICBjaGVja19mICgpOworICBjaGVja19saW1iICgpOworICBjaGVja19uICgpOworICBjaGVja19taXNjICgpOworCisgIEFTU0VSVF9BTFdBWVMgKGZjbG9zZSAoY2hlY2tfdmZwcmludGZfZnApID09IDApOworICB1bmxpbmsgKENIRUNLX1ZGUFJJTlRGX0ZJTEVOQU1FKTsKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21pc2MvdC1zY2FuZi5jIGIvdGVzdHMvbWlzYy90LXNjYW5mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNTUzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21pc2MvdC1zY2FuZi5jCkBAIC0wLDAgKzEsMTYxNSBAQAorLyogVGVzdCBnbXBfc2NhbmYgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMS0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIFVzYWdlOiB0LXNjYW5mIFstc10KKworICAgLXMgIENoZWNrIHRoZSBkYXRhIGFnYWluc3QgdGhlIHN5c3RlbSBzY2FuZiwgd2hlcmUgcG9zc2libGUuICBUaGlzIGlzCisgICAgICAgb25seSBhbiBvcHRpb24gc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBmYWlsIGlmIHRoZSBzeXN0ZW0gc2NhbmYgaXMKKyAgICAgICBmYXVsdHkgb3Igc3RyYW5nZS4KKworICAgVGhlcmUncyBzb21lIGZhaXJseSB1bmF0dHJhY3RpdmUgcmVwZXRpdGlvbiBiZXR3ZWVuIGNoZWNrX3osIGNoZWNrX3EgYW5kCisgICBjaGVja19mLCBidXQgZW5vdWdoIGRpZmZlcmVuY2VzIHRvIG1ha2UgYSBjb21tb24gbG9vcCBvciBhIHNldCBvZiBtYWNyb3MKKyAgIHNlZW0gbGlrZSB0b28gbXVjaCB0cm91YmxlLiAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCS8qIG5lZWRlZCBmb3IgdGhlIEhBVkVfLCBjb3VsZCBhbHNvIG1vdmUgZ21wIGluY2xzICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgICAvKiBmb3IgcHRyZGlmZl90ICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPiAvKiBmb3IgaW50bWF4X3QgKi8KKyNlbmRpZgorI2lmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4gIC8qIGZvciB1bmxpbmsgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKyNkZWZpbmUgVEVNUEZJTEUgICIvdG1wL3Qtc2NhbmYudG1wIgorCitpbnQgICBvcHRpb25fbGliY19zY2FuZiA9IDA7CisKK3R5cGVkZWYgaW50ICgqZnVuX3QpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCB2b2lkICopOworCisKKy8qIFRoaXMgcHJvYmxlbSB3YXMgc2VlbiBvbiBwb3dlcnBjNzQ1MC1hcHBsZS1kYXJ3aW43LjAuMCwgc3NjYW5mIHJldHVybnMgMAorICAgd2hlcmUgaXQgc2hvdWxkIHJldHVybiBFT0YuICBBIHdvcmthcm91bmQgaW4gZ21wX3NzY2FuZiB3b3VsZCBiZSBhIGJpdAorICAgdGVkaW91cywgYW5kIHNpbmNlIHRoaXMgaXMgYSByYXRoZXIgb2J2aW91cyBsaWJjIGJ1ZywgcXVpdGUgbGlrZWx5CisgICBhZmZlY3Rpbmcgb3RoZXIgcHJvZ3JhbXMsIHdlJ2xsIGp1c3Qgc3VwcHJlc3MgYWZmZWN0ZWQgdGVzdHMgZm9yIG5vdy4gICovCitpbnQKK3Rlc3Rfc3NjYW5mX2VvZl9vayAodm9pZCkKK3sKKyAgc3RhdGljIGludCAgcmVzdWx0ID0gLTE7CisKKyAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICB7CisgICAgICBpbnQgIHg7CisgICAgICBpZiAoc3NjYW5mICgiIiwgIiVkIiwgJngpID09IEVPRikKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIldhcm5pbmcsIHNzY2FuZihcIlwiLFwiJSVkXCIsJngpIGRvZXNuJ3QgcmV0dXJuIEVPRi5cbiIpOworICAgICAgICAgIHByaW50ZiAoIlRoaXMgYWZmZWN0cyBnbXBfc3NjYW5mLCB0ZXN0cyBpbnZvbHZpbmcgaXQgd2lsbCBiZSBzdXBwcmVzc2VkLlxuIik7CisgICAgICAgICAgcHJpbnRmICgiWW91IHNob3VsZCB0cnkgdG8gZ2V0IGEgZml4IGZvciB5b3VyIGxpYmMuXG4iKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIENvbnZlcnQgZm10IGZyb20gYSBHTVAgc2NhbmYgZm9ybWF0IHN0cmluZyB0byBhbiBlcXVpdmFsZW50IGZvciBhIHBsYWluCisgICBsaWJjIHNjYW5mLCBmb3IgZXhhbXBsZSAiJVpkIiBiZWNvbWVzICIlbGQiLiAgUmV0dXJuIDEgaWYgdGhpcyBzdWNjZWVkcywKKyAgIDAgaWYgaXQgY2Fubm90IChvciBzaG91bGQgbm90KSBiZSBkb25lLiAgKi8KK2ludAorbGliY19zY2FuZl9jb252ZXJ0IChjaGFyICpmbXQpCit7CisgIGNoYXIgICpwID0gZm10OworCisgIGlmICghIG9wdGlvbl9saWJjX3NjYW5mKQorICAgIHJldHVybiAwOworCisgIGZvciAoIDsgKmZtdCAhPSAnXDAnOyBmbXQrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpmbXQpIHsKKyAgICAgIGNhc2UgJ0YnOgorICAgICAgY2FzZSAnUSc6CisgICAgICBjYXNlICdaJzoKKyAgICAgICAgLyogdHJhbnNtdXRlICovCisgICAgICAgICpwKysgPSAnbCc7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKnArKyA9ICpmbXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgKnAgPSAnXDAnOworICByZXR1cm4gMTsKK30KKworCitsb25nICBnb3RfZnRlbGw7CitpbnQgICBmcm9tc3RyaW5nX25leHRfYzsKKworLyogQ2FsbCBnbXBfZnNjYW5mLCByZWFkaW5nIHRoZSAiaW5wdXQiIHN0cmluZyBkYXRhIHByb3ZpZGVkLiAqLworaW50Citmcm9tc3RyaW5nX2dtcF9mc2NhbmYgKGNvbnN0IGNoYXIgKmlucHV0LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCAgYXA7CisgIEZJTEUgICAgICpmcDsKKyAgaW50ICAgICAgcmV0OworICB2YV9zdGFydCAoYXAsIGZtdCk7CisKKyAgZnAgPSBmb3BlbiAoVEVNUEZJTEUsICJ3KyIpOworICBBU1NFUlRfQUxXQVlTIChmcCAhPSBOVUxMKTsKKyAgQVNTRVJUX0FMV0FZUyAoZnB1dHMgKGlucHV0LCBmcCkgIT0gRU9GKTsKKyAgQVNTRVJUX0FMV0FZUyAoZmZsdXNoIChmcCkgPT0gMCk7CisgIHJld2luZCAoZnApOworCisgIHJldCA9IGdtcF92ZnNjYW5mIChmcCwgZm10LCBhcCk7CisgIGdvdF9mdGVsbCA9IGZ0ZWxsIChmcCk7CisgIEFTU0VSVF9BTFdBWVMgKGdvdF9mdGVsbCAhPSAtMUwpOworCisgIGZyb21zdHJpbmdfbmV4dF9jID0gZ2V0YyAoZnApOworCisgIEFTU0VSVF9BTFdBWVMgKGZjbG9zZSAoZnApID09IDApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIHJldDsKK30KKworCitpbnQKK2Z1bl9nbXBfc3NjYW5mIChjb25zdCBjaGFyICppbnB1dCwgY29uc3QgY2hhciAqZm10LCB2b2lkICphMSwgdm9pZCAqYTIpCit7CisgIGlmIChhMiA9PSBOVUxMKQorICAgIHJldHVybiBnbXBfc3NjYW5mIChpbnB1dCwgZm10LCBhMSk7CisgIGVsc2UKKyAgICByZXR1cm4gZ21wX3NzY2FuZiAoaW5wdXQsIGZtdCwgYTEsIGEyKTsKK30KKworaW50CitmdW5fZ21wX2ZzY2FuZiAoY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKmZtdCwgdm9pZCAqYTEsIHZvaWQgKmEyKQoreworICBpZiAoYTIgPT0gTlVMTCkKKyAgICByZXR1cm4gZnJvbXN0cmluZ19nbXBfZnNjYW5mIChpbnB1dCwgZm10LCBhMSk7CisgIGVsc2UKKyAgICByZXR1cm4gZnJvbXN0cmluZ19nbXBfZnNjYW5mIChpbnB1dCwgZm10LCBhMSwgYTIpOworfQorCisKK2ludAorZnVuX2ZzY2FuZiAoY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKmZtdCwgdm9pZCAqYTEsIHZvaWQgKmEyKQoreworICBGSUxFICAqZnA7CisgIGludCAgIHJldDsKKworICBmcCA9IGZvcGVuIChURU1QRklMRSwgIncrIik7CisgIEFTU0VSVF9BTFdBWVMgKGZwICE9IE5VTEwpOworICBBU1NFUlRfQUxXQVlTIChmcHV0cyAoaW5wdXQsIGZwKSAhPSBFT0YpOworICBBU1NFUlRfQUxXQVlTIChmZmx1c2ggKGZwKSA9PSAwKTsKKyAgcmV3aW5kIChmcCk7CisKKyAgaWYgKGEyID09IE5VTEwpCisgICAgcmV0ID0gZnNjYW5mIChmcCwgZm10LCBhMSk7CisgIGVsc2UKKyAgICByZXQgPSBmc2NhbmYgKGZwLCBmbXQsIGExLCBhMik7CisKKyAgZ290X2Z0ZWxsID0gZnRlbGwgKGZwKTsKKyAgQVNTRVJUX0FMV0FZUyAoZ290X2Z0ZWxsICE9IC0xTCk7CisKKyAgZnJvbXN0cmluZ19uZXh0X2MgPSBnZXRjIChmcCk7CisKKyAgQVNTRVJUX0FMV0FZUyAoZmNsb3NlIChmcCkgPT0gMCk7CisgIHJldHVybiByZXQ7Cit9CisKKworLyogT24gdmFyaW91cyBvbGQgc3lzdGVtcywgZm9yIGluc3RhbmNlIEhQLVVYIDksIHRoZSBDIGxpYnJhcnkgc3NjYW5mIG5lZWRzCisgICB0byBiZSBhYmxlIHRvIHdyaXRlIGludG8gdGhlIGlucHV0IHN0cmluZy4gIEVuc3VyZSB0aGF0IHRoaXMgaXMgcG9zc2libGUsCisgICB3aGVuIGdjYyBpcyBwdXR0aW5nIHRoZSB0ZXN0IGRhdGEgaW50byBhIHJlYWQtb25seSBzZWN0aW9uLgorCisgICBBY3R1YWxseSB3ZSBvdWdodCB0byBvbmx5IG5lZWQgdGhpcyB1bmRlciBTU0NBTkZfV1JJVEFCTEVfSU5QVVQgZnJvbQorICAgY29uZmlndXJlLCBidXQgaXQncyBqdXN0IGFzIGVhc3kgdG8gZG8gaXQgdW5jb25kaXRpb25hbGx5LCBhbmQgaW4gYW55CisgICBjYXNlIHRoaXMgY29kZSBpcyBvbmx5IGV4ZWN1dGVkIHVuZGVyIHRoZSAtcyBvcHRpb24uICAqLworCitpbnQKK2Z1bl9zc2NhbmYgKGNvbnN0IGNoYXIgKmlucHV0LCBjb25zdCBjaGFyICpmbXQsIHZvaWQgKmExLCB2b2lkICphMikKK3sKKyAgY2hhciAgICAqaW5wdXRfd3JpdGFibGU7CisgIHNpemVfdCAgc2l6ZTsKKyAgaW50ICAgICByZXQ7CisKKyAgc2l6ZSA9IHN0cmxlbiAoaW5wdXQpICsgMTsKKyAgaW5wdXRfd3JpdGFibGUgPSAoY2hhciAqKSAoKl9fZ21wX2FsbG9jYXRlX2Z1bmMpIChzaXplKTsKKyAgbWVtY3B5IChpbnB1dF93cml0YWJsZSwgaW5wdXQsIHNpemUpOworCisgIGlmIChhMiA9PSBOVUxMKQorICAgIHJldCA9IHNzY2FuZiAoaW5wdXRfd3JpdGFibGUsIGZtdCwgYTEpOworICBlbHNlCisgICAgcmV0ID0gc3NjYW5mIChpbnB1dF93cml0YWJsZSwgZm10LCBhMSwgYTIpOworCisgICgqX19nbXBfZnJlZV9mdW5jKSAoaW5wdXRfd3JpdGFibGUsIHNpemUpOworICByZXR1cm4gcmV0OworfQorCisKKy8qIHdoZXRoZXIgdGhlIGZvcm1hdCBzdHJpbmcgY29uc2lzdHMgZW50aXJlbHkgb2YgaWdub3JlZCBmaWVsZHMgKi8KK2ludAorZm10X2FsbGlnbm9yZSAoY29uc3QgY2hhciAqZm10KQoreworICBpbnQgIHNhd19zdGFyID0gMTsKKyAgZm9yICggOyAqZm10ICE9ICdcMCc7IGZtdCsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKmZtdCkgeworICAgICAgY2FzZSAnJSc6CisgICAgICAgIGlmICghIHNhd19zdGFyKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzYXdfc3RhciA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHNhd19zdGFyID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICByZXR1cm4gMTsKK30KKwordm9pZAorY2hlY2tfeiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKmZtdDsKKyAgICBjb25zdCBjaGFyICAqaW5wdXQ7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisgICAgaW50ICAgICAgICAgd2FudF9yZXQ7CisgICAgbG9uZyAgICAgICAgd2FudF9mdGVsbDsKKyAgICBpbnQgICAgICAgICB3YW50X3VwdG87CisgICAgaW50ICAgICAgICAgbm90X2dsaWJjOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiJVpkIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaZCIsICAgICIxIiwgICAgIjEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmQiLCAgIjEyMyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpkIiwgICAiKzAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaZCIsICAgIisxIiwgICAgIjEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmQiLCAiKzEyMyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpkIiwgICAiLTAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaZCIsICAgIi0xIiwgICAiLTEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmQiLCAiLTEyMyIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisKKyAgICB7ICIlWm8iLCAgICAiMCIsICAgICIwIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpvIiwgICIxNzMiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVabyIsICAgIiswIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWm8iLCAiKzE3MyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpvIiwgICAiLTAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVabyIsICItMTczIiwgIi0xMjMiLCAxLCAtMSwgLTEgfSwKKworICAgIHsgIiVaeCIsICAgICIwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICAiN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaeCIsICAgIiswIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICIrN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaeCIsICAgIi0wIiwgICAiLTAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgIi03YiIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICItN2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgICIwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICAiN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgIiswIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICIrN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgIi0wIiwgICAiLTAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgIi03YiIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICItN2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaeCIsICAgICIwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICAiN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaeCIsICAgIiswIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICIrN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaeCIsICAgIi0wIiwgICAiLTAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWngiLCAgIi03QiIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVp4IiwgICItN0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgICIwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICAiN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgIiswIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICIrN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaWCIsICAgIi0wIiwgICAiLTAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWlgiLCAgIi03QiIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpYIiwgICItN0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorCisgICAgeyAiJVppIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgICIxIiwgICAgIjEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmkiLCAgIjEyMyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVppIiwgICAiKzAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIisxIiwgICAgIjEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmkiLCAiKzEyMyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVppIiwgICAiLTAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0xIiwgICAiLTEiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmkiLCAiLTEyMyIsICItMTIzIiwgMSwgLTEsIC0xIH0sCisKKyAgICB7ICIlWmkiLCAgICAiMDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiMDE3MyIsICAiMTIzIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVppIiwgICAiKzAwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmkiLCAiKzAxNzMiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0wMCIsICAgICIwIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVppIiwgIi0wMTczIiwgIi0xMjMiLCAxLCAtMSwgLTEgfSwKKworICAgIHsgIiVaaSIsICAgICIweDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjB4N2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjB4N2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIisweDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzB4N2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzB4N2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0weDAiLCAgICItMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTB4N2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTB4N2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgICIwWDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjBYN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjBYN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIiswWDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzBYN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzBYN2IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0wWDAiLCAgICItMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTBYN2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTBYN2IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgICIweDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjB4N0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjB4N0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIisweDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzB4N0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzB4N0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0weDAiLCAgICItMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTB4N0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTB4N0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgICIwWDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjBYN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIjBYN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIiswWDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzBYN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiKzBYN0IiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAgIi0wWDAiLCAgICItMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTBYN0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaaSIsICAiLTBYN0IiLCAiLTEyMyIsIDEsIC0xLCAtMSB9LAorCisgICAgeyAiJVpkIiwgICAgIiAwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmQiLCAgICIgIDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgIiVaZCIsICAiICAgMCIsICAgICIwIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiJVpkIiwgICAiXHQwIiwgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlWmQiLCAiXHRcdDAiLCAgICAiMCIsIDEsIC0xLCAtMSB9LAorCisgICAgeyAiaGVsbG8lWmQiLCAgICAgICJoZWxsbzAiLCAgICAgICAiMCIsIDEsIC0xLCAtMSB9LAorICAgIHsgImhlbGxvJVpkIiwgICAgICAiaGVsbG8gMCIsICAgICAgIjAiLCAxLCAtMSwgLTEgfSwKKyAgICB7ICJoZWxsbyVaZCIsICAgICAgImhlbGxvIFx0MCIsICAgICIwIiwgMSwgLTEsIC0xIH0sCisgICAgeyAiaGVsbG8lWmR3b3JsZCIsICJoZWxsbyAwd29ybGQiLCAiMCIsIDEsIC0xLCAtMSB9LAorCisgICAgeyAiaGVsbG8lKlpkIiwgICAgICAiaGVsbG8wIiwgICAgICAgIi05OTkiLCAwLCAtMSwgLTEgfSwKKyAgICB7ICJoZWxsbyUqWmQiLCAgICAgICJoZWxsbyAwIiwgICAgICAiLTk5OSIsIDAsIC0xLCAtMSB9LAorICAgIHsgImhlbGxvJSpaZCIsICAgICAgImhlbGxvIFx0MCIsICAgICItOTk5IiwgMCwgLTEsIC0xIH0sCisgICAgeyAiaGVsbG8lKlpkd29ybGQiLCAiaGVsbG8gMHdvcmxkIiwgIi05OTkiLCAwLCAtMSwgLTEgfSwKKworICAgIHsgIiVaZCIsICAgICIiLCAgICAgIi05OTkiLCAtMSwgLTEsIC01NTUgfSwKKyAgICB7ICIlWmQiLCAgICAiICIsICAgICItOTk5IiwgLTEsIC0xLCAtNTU1IH0sCisgICAgeyAiICVaZCIsICAgIiIsICAgICAiLTk5OSIsIC0xLCAtMSwgLTU1NSB9LAorICAgIHsgInh5eiVaZCIsICIiLCAgICAgIi05OTkiLCAtMSwgLTEsIC01NTUgfSwKKworICAgIHsgIiUqWmQiLCAgICAiIiwgICAgICItOTk5IiwgLTEsIC0xLCAtNTU1IH0sCisgICAgeyAiICUqWmQiLCAgICIiLCAgICAgIi05OTkiLCAtMSwgLTEsIC01NTUgfSwKKyAgICB7ICJ4eXolKlpkIiwgIiIsICAgICAiLTk5OSIsIC0xLCAtMSwgLTU1NSB9LAorCisgICAgeyAiJVpkIiwgICAgInh5eiIsICAiMCIsICAgICAwLCAwLCAtNTU1IH0sCisKKyAgICAvKiBtYXRjaCBzb21ldGhpbmcsIGJ1dCBpbnZhbGlkICovCisgICAgeyAiJVpkIiwgICAgIi0iLCAgICAiLTk5OSIsICAwLCAxLCAtNTU1IH0sCisgICAgeyAiJVpkIiwgICAgIisiLCAgICAiLTk5OSIsICAwLCAxLCAtNTU1IH0sCisgICAgeyAieHl6JVpkIiwgInh5ei0iLCAiLTk5OSIsICAwLCA0LCAtNTU1IH0sCisgICAgeyAieHl6JVpkIiwgInh5eisiLCAiLTk5OSIsICAwLCA0LCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIjB4IiwgICAiLTk5OSIsICAwLCAyLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIjBYIiwgICAiLTk5OSIsICAwLCAyLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIjB4LSIsICAiLTk5OSIsICAwLCAyLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIjBYKyIsICAiLTk5OSIsICAwLCAyLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIi0weCIsICAiLTk5OSIsICAwLCAzLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIi0wWCIsICAiLTk5OSIsICAwLCAzLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIisweCIsICAiLTk5OSIsICAwLCAzLCAtNTU1IH0sCisgICAgeyAiJVppIiwgICAgIiswWCIsICAiLTk5OSIsICAwLCAzLCAtNTU1IH0sCisKKyAgICB7ICIlMVppIiwgICIxMjM0IiwgIjEiLCAgICAxLCAxLCAxIH0sCisgICAgeyAiJTJaaSIsICAiMTIzNCIsICIxMiIsICAgMSwgMiwgMiB9LAorICAgIHsgIiUzWmkiLCAgIjEyMzQiLCAiMTIzIiwgIDEsIDMsIDMgfSwKKyAgICB7ICIlNFppIiwgICIxMjM0IiwgIjEyMzQiLCAxLCA0LCA0IH0sCisgICAgeyAiJTVaaSIsICAiMTIzNCIsICIxMjM0IiwgMSwgNCwgNCB9LAorICAgIHsgIiU2WmkiLCAgIjEyMzQiLCAiMTIzNCIsIDEsIDQsIDQgfSwKKworICAgIHsgIiUxWmkiLCAgIjAxMjM0IiwgIjAiLCAgICAgMSwgMSwgMSB9LAorICAgIHsgIiUyWmkiLCAgIjAxMjM0IiwgIjAxIiwgICAgMSwgMiwgMiB9LAorICAgIHsgIiUzWmkiLCAgIjAxMjM0IiwgIjAxMiIsICAgMSwgMywgMyB9LAorICAgIHsgIiU0WmkiLCAgIjAxMjM0IiwgIjAxMjMiLCAgMSwgNCwgNCB9LAorICAgIHsgIiU1WmkiLCAgIjAxMjM0IiwgIjAxMjM0IiwgMSwgNSwgNSB9LAorICAgIHsgIiU2WmkiLCAgIjAxMjM0IiwgIjAxMjM0IiwgMSwgNSwgNSB9LAorICAgIHsgIiU3WmkiLCAgIjAxMjM0IiwgIjAxMjM0IiwgMSwgNSwgNSB9LAorCisgICAgeyAiJTFaaSIsICAiMHgxMjM0IiwgIjAiLCAgICAgIDEsIDEsIDEgfSwKKyAgICB7ICIlMlppIiwgICIweDEyMzQiLCAiLTk5OSIsICAgMCwgMiwgLTU1NSB9LAorICAgIHsgIiUzWmkiLCAgIjB4MTIzNCIsICIweDEiLCAgICAxLCAzLCAzIH0sCisgICAgeyAiJTRaaSIsICAiMHgxMjM0IiwgIjB4MTIiLCAgIDEsIDQsIDQgfSwKKyAgICB7ICIlNVppIiwgICIweDEyMzQiLCAiMHgxMjMiLCAgMSwgNSwgNSB9LAorICAgIHsgIiU2WmkiLCAgIjB4MTIzNCIsICIweDEyMzQiLCAxLCA2LCA2IH0sCisgICAgeyAiJTdaaSIsICAiMHgxMjM0IiwgIjB4MTIzNCIsIDEsIDYsIDYgfSwKKyAgICB7ICIlOFppIiwgICIweDEyMzQiLCAiMHgxMjM0IiwgMSwgNiwgNiB9LAorCisgICAgeyAiJSV4eXolWmQiLCAgIiV4eXoxMjMiLCAgIjEyMyIsIDEsIC0xLCAtMSB9LAorICAgIHsgIjEyJSUzNCVaZCIsICIxMiUzNDU2NyIsICI1NjciLCAxLCAtMSwgLTEgfSwKKyAgICB7ICIlJSUlJVpkIiwgICAiJSUxMjMiLCAgICAiMTIzIiwgMSwgLTEsIC0xIH0sCisKKyAgICAvKiB2YXJpb3VzIHN1YnRsZSBFT0YgY2FzZXMgKi8KKyAgICB7ICJ4IiwgICAgICAgIiIsICAgICItOTk5IiwgRU9GLCAwLCAtNTU1IH0sCisgICAgeyAiIHgiLCAgICAgICIiLCAgICAiLTk5OSIsIEVPRiwgMCwgLTU1NSB9LAorICAgIHsgInh5eiIsICAgICAiIiwgICAgIi05OTkiLCBFT0YsIDAsIC01NTUgfSwKKyAgICB7ICIgIiwgICAgICAgIiIsICAgICItOTk5IiwgICAwLCAwLCAgICAwIH0sCisgICAgeyAiICIsICAgICAgICIgIiwgICAiLTk5OSIsICAgMCwgMSwgICAgMSB9LAorICAgIHsgIiUqWmQlWmQiLCAiIiwgICAgIi05OTkiLCBFT0YsIDAsIC01NTUgfSwKKyAgICB7ICIlKlpkJVpkIiwgIjEyMyIsICItOTk5IiwgRU9GLCAzLCAtNTU1IH0sCisgICAgeyAieCIsICAgICAgICJ4IiwgICAiLTk5OSIsICAgMCwgMSwgICAgMSB9LAorICAgIHsgInh5eiIsICAgICAieCIsICAgIi05OTkiLCBFT0YsIDEsIC01NTUgfSwKKyAgICB7ICJ4eXoiLCAgICAgInh5IiwgICItOTk5IiwgRU9GLCAyLCAtNTU1IH0sCisgICAgeyAieHl6IiwgICAgICJ4eXoiLCAiLTk5OSIsICAgMCwgMywgICAgMyB9LAorICAgIHsgIiVabiIsICAgICAiIiwgICAgIjAiLCAgICAgIDAsIDAsICAgIDAgfSwKKyAgICB7ICIgJVpuIiwgICAgIiIsICAgICIwIiwgICAgICAwLCAwLCAgICAwIH0sCisgICAgeyAiIHglWm4iLCAgICIiLCAgICAiLTk5OSIsIEVPRiwgMCwgLTU1NSB9LAorICAgIHsgInh5eiVabiIsICAiIiwgICAgIi05OTkiLCBFT0YsIDAsIC01NTUgfSwKKyAgICB7ICIgeCVabiIsICAgIiIsICAgICItOTk5IiwgRU9GLCAwLCAtNTU1IH0sCisgICAgeyAiICVabiB4IiwgICIgIiwgICAiLTk5OSIsIEVPRiwgMSwgLTU1NSB9LAorCisgICAgLyogdGhlc2Ugc2VlbSB0byB0aWNrbGUgYSBidWcgaW4gZ2xpYmMgMi4yLjQgKi8KKyAgICB7ICIgeCIsICAgICAgIiAiLCAgICItOTk5IiwgRU9GLCAxLCAtNTU1LCAxIH0sCisgICAgeyAiIHh5eiIsICAgICIgIiwgICAiLTk5OSIsIEVPRiwgMSwgLTU1NSwgMSB9LAorICAgIHsgIiB4JVpuIiwgICAiICIsICAgIi05OTkiLCBFT0YsIDEsIC01NTUsIDEgfSwKKyAgfTsKKworICBpbnQgICAgICAgICBpLCBqLCBpZ25vcmU7CisgIGludCAgICAgICAgIGdvdF9yZXQsIHdhbnRfcmV0LCBnb3RfdXB0bywgd2FudF91cHRvOworICBtcHpfdCAgICAgICBnb3QsIHdhbnQ7CisgIGxvbmcgICAgICAgIGdvdF9sLCB3YW50X2Z0ZWxsOworICBpbnQgICAgICAgICBlcnJvciA9IDA7CisgIGZ1bl90ICAgICAgIGZ1bjsKKyAgY29uc3QgY2hhciAgKm5hbWU7CisgIGNoYXIgICAgICAgIGZtdFsxMjhdOworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0ICh3YW50LCBkYXRhW2ldLndhbnQsIDApOworCisgICAgICBBU1NFUlRfQUxXQVlTIChzdHJsZW4gKGRhdGFbaV0uZm10KSArIDIgPCBzaXplb2YgKGZtdCkpOworICAgICAgc3RyY3B5IChmbXQsIGRhdGFbaV0uZm10KTsKKyAgICAgIHN0cmNhdCAoZm10LCAiJW4iKTsKKworICAgICAgaWdub3JlID0gZm10X2FsbGlnbm9yZSAoZm10KTsKKworICAgICAgZm9yIChqID0gMDsgaiA8PSAzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICB3YW50X3JldCA9IGRhdGFbaV0ud2FudF9yZXQ7CisKKyAgICAgICAgICB3YW50X2Z0ZWxsID0gZGF0YVtpXS53YW50X2Z0ZWxsOworICAgICAgICAgIGlmICh3YW50X2Z0ZWxsID09IC0xKQorICAgICAgICAgICAgd2FudF9mdGVsbCA9IHN0cmxlbiAoZGF0YVtpXS5pbnB1dCk7CisKKyAgICAgICAgICB3YW50X3VwdG8gPSBkYXRhW2ldLndhbnRfdXB0bzsKKyAgICAgICAgICBpZiAod2FudF91cHRvID09IC0xKQorICAgICAgICAgICAgd2FudF91cHRvID0gc3RybGVuIChkYXRhW2ldLmlucHV0KTsKKworICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG5hbWUgPSAiZ21wX3NzY2FuZiI7CisgICAgICAgICAgICBmdW4gPSBmdW5fZ21wX3NzY2FuZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG5hbWUgPSAiZ21wX2ZzY2FuZiI7CisgICAgICAgICAgICBmdW4gPSBmdW5fZ21wX2ZzY2FuZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyNpZmRlZiBfX0dMSUJDX18KKyAgICAgICAgICAgIGlmIChkYXRhW2ldLm5vdF9nbGliYykKKyAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICghIGxpYmNfc2NhbmZfY29udmVydCAoZm10KSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBuYW1lID0gInN0YW5kYXJkIHNzY2FuZiI7CisgICAgICAgICAgICBmdW4gPSBmdW5fc3NjYW5mOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorI2lmZGVmIF9fR0xJQkNfXworICAgICAgICAgICAgaWYgKGRhdGFbaV0ubm90X2dsaWJjKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCEgbGliY19zY2FuZl9jb252ZXJ0IChmbXQpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5hbWUgPSAic3RhbmRhcmQgZnNjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9mc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnb3RfdXB0byA9IC01NTU7CisgICAgICAgICAgZ290X2Z0ZWxsID0gLTFMOworCisgICAgICAgICAgc3dpdGNoIChqKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1wel9zZXRfc2kgKGdvdCwgLTk5OUwpOworICAgICAgICAgICAgaWYgKGlnbm9yZSkKKyAgICAgICAgICAgICAgZ290X3JldCA9ICgqZnVuKSAoZGF0YVtpXS5pbnB1dCwgZm10LCAmZ290X3VwdG8sIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBnb3RfcmV0ID0gKCpmdW4pIChkYXRhW2ldLmlucHV0LCBmbXQsIGdvdCwgJmdvdF91cHRvKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBnb3RfbCA9IC05OTlMOworICAgICAgICAgICAgaWYgKGlnbm9yZSkKKyAgICAgICAgICAgICAgZ290X3JldCA9ICgqZnVuKSAoZGF0YVtpXS5pbnB1dCwgZm10LCAmZ290X3VwdG8sIE5VTEwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBnb3RfcmV0ID0gKCpmdW4pIChkYXRhW2ldLmlucHV0LCBmbXQsICZnb3RfbCwgJmdvdF91cHRvKTsKKyAgICAgICAgICAgIG1wel9zZXRfc2kgKGdvdCwgZ290X2wpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9BTFdBWVMgKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworICAgICAgICAgIGlmIChnb3RfcmV0ICE9IHdhbnRfcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyByZXR1cm4gdmFsdWVcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdhbnRfcmV0ID09IDEgJiYgbXB6X2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyByZXN1bHRcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGdvdF91cHRvICE9IHdhbnRfdXB0bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiJXMgd3JvbmcgdXB0b1xuIiwgbmFtZSk7CisgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZ290X2Z0ZWxsICE9IC0xICYmIHdhbnRfZnRlbGwgIT0gLTEgJiYgZ290X2Z0ZWxsICE9IHdhbnRfZnRlbGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiVzIHdyb25nIGZ0ZWxsXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBmbXQgICBcIiVzXCJcbiIsIGRhdGFbaV0uZm10KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBpbnB1dCBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wdXQpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGlnbm9yZSAlZFxuIiwgaWdub3JlKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICByZXQgICB3YW50PSVkXG4iLCB3YW50X3JldCk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgICAgICAgZ290ID0lZFxuIiwgZ290X3JldCk7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgdmFsdWUgd2FudCIsIHdhbnQpOworICAgICAgICAgICAgICBtcHpfdHJhY2UgKCIgICAgICAgIGdvdCAiLCBnb3QpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIHVwdG8gIHdhbnQgPSVkXG4iLCB3YW50X3VwdG8pOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICAgICAgIGdvdCAgPSVkXG4iLCBnb3RfdXB0byk7CisgICAgICAgICAgICAgIGlmIChnb3RfZnRlbGwgIT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBmdGVsbCB3YW50ID0lbGRcbiIsIHdhbnRfZnRlbGwpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgICAgICBnb3QgID0lbGRcbiIsIGdvdF9mdGVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKGdvdCk7CisgIG1wel9jbGVhciAod2FudCk7Cit9CisKK3ZvaWQKK2NoZWNrX3EgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICpmbXQ7CisgICAgY29uc3QgY2hhciAgKmlucHV0OworICAgIGNvbnN0IGNoYXIgICp3YW50OworICAgIGludCAgICAgICAgIHJldDsKKyAgICBsb25nICAgICAgICBmdGVsbDsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIiVRZCIsICAgICIwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgICIxIiwgICAgIjEiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAiMTIzIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIiswIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIisxIiwgICAgIjEiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICIrMTIzIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIi0wIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIi0xIiwgICAiLTEiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICItMTIzIiwgIi0xMjMiLCAxLCAtMSB9LAorCisgICAgeyAiJVFvIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgICIxNzMiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgICAiKzAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgIisxNzMiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgICAiLTAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgIi0xNzMiLCAiLTEyMyIsIDEsIC0xIH0sCisKKyAgICB7ICIlUXgiLCAgICAiMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICIrMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICItMCIsICAgIi0wIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIi03YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIi03YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICAiMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICI3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICIrMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIis3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICItMCIsICAgIi0wIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIi03YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIi03YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICAiMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICIrMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgICItMCIsICAgIi0wIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIi03QiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUXgiLCAgIi03QiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICAiMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICI3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICIrMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIis3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgICItMCIsICAgIi0wIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIi03QiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgIi03QiIsICItMTIzIiwgMSwgLTEgfSwKKworICAgIHsgIiVRaSIsICAgICIwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgICIxIiwgICAgIjEiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiMTIzIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIiswIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIisxIiwgICAgIjEiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICIrMTIzIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIi0wIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIi0xIiwgICAiLTEiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICItMTIzIiwgIi0xMjMiLCAxLCAtMSB9LAorCisgICAgeyAiJVFpIiwgICAgIjAwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiMDE3MyIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMDAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgIiswMTczIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIi0wMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAiLTAxNzMiLCAiLTEyMyIsIDEsIC0xIH0sCisKKyAgICB7ICIlUWkiLCAgICAiMHgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIjB4N2IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiMHg3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMHgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiKzB4N2IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMHg3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMHgwIiwgICAiLTAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiLTB4N2IiLCAiLTEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICItMHg3YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICAiMFgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIjBYN2IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiMFg3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMFgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiKzBYN2IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMFg3YiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMFgwIiwgICAiLTAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiLTBYN2IiLCAiLTEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICItMFg3YiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICAiMHgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIjB4N0IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiMHg3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMHgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiKzB4N0IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMHg3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMHgwIiwgICAiLTAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiLTB4N0IiLCAiLTEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICItMHg3QiIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICAiMFgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIjBYN0IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiMFg3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMFgwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiKzBYN0IiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMFg3QiIsICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMFgwIiwgICAiLTAiLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiLTBYN0IiLCAiLTEyMyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICItMFg3QiIsICItMTIzIiwgMSwgLTEgfSwKKworICAgIHsgIiVRZCIsICAgICIgMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUWQiLCAgICIgIDAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJVFkIiwgICIgICAwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIlx0MCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlUWQiLCAiXHRcdDAiLCAgICAiMCIsIDEsIC0xIH0sCisKKyAgICB7ICIlUWQiLCAgIjMvMiIsICAgIjMvMiIsIDEsIC0xIH0sCisgICAgeyAiJVFkIiwgIiszLzIiLCAgICIzLzIiLCAxLCAtMSB9LAorICAgIHsgIiVRZCIsICItMy8yIiwgICItMy8yIiwgMSwgLTEgfSwKKworICAgIHsgIiVReCIsICAiZi8xMCIsICIxNS8xNiIsIDEsIC0xIH0sCisgICAgeyAiJVF4IiwgICJGLzEwIiwgIjE1LzE2IiwgMSwgLTEgfSwKKyAgICB7ICIlUVgiLCAgImYvMTAiLCAiMTUvMTYiLCAxLCAtMSB9LAorICAgIHsgIiVRWCIsICAiRi8xMCIsICIxNS8xNiIsIDEsIC0xIH0sCisKKyAgICB7ICIlUW8iLCAgIjIwLzIxIiwgICIxNi8xNyIsIDEsIC0xIH0sCisgICAgeyAiJVFvIiwgIi0yMC8yMSIsICItMTYvMTciLCAxLCAtMSB9LAorCisgICAgeyAiJVFpIiwgICAgIjEwLzExIiwgICIxMC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiKzEwLzExIiwgICIxMC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiLTEwLzExIiwgIi0xMC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiMDEwLzExIiwgICAiOC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMDEwLzExIiwgICAiOC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICItMDEwLzExIiwgICItOC8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIweDEwLzExIiwgICIxNi8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgIisweDEwLzExIiwgICIxNi8xMSIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgIi0weDEwLzExIiwgIi0xNi8xMSIsIDEsIC0xIH0sCisKKyAgICB7ICIlUWkiLCAgICAiMTAvMDExIiwgICIxMC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIrMTAvMDExIiwgICIxMC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMTAvMDExIiwgIi0xMC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICIwMTAvMDExIiwgICAiOC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgIiswMTAvMDExIiwgICAiOC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgIi0wMTAvMDExIiwgICItOC85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgIjB4MTAvMDExIiwgICIxNi85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAiKzB4MTAvMDExIiwgICIxNi85IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAiLTB4MTAvMDExIiwgIi0xNi85IiwgMSwgLTEgfSwKKworICAgIHsgIiVRaSIsICAgICIxMC8weDExIiwgICIxMC8xNyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICAiKzEwLzB4MTEiLCAgIjEwLzE3IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgICItMTAvMHgxMSIsICItMTAvMTciLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAgIjAxMC8weDExIiwgICAiOC8xNyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgICIrMDEwLzB4MTEiLCAgICI4LzE3IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAgIi0wMTAvMHgxMSIsICAiLTgvMTciLCAxLCAtMSB9LAorICAgIHsgIiVRaSIsICAiMHgxMC8weDExIiwgICIxNi8xNyIsIDEsIC0xIH0sCisgICAgeyAiJVFpIiwgIisweDEwLzB4MTEiLCAgIjE2LzE3IiwgMSwgLTEgfSwKKyAgICB7ICIlUWkiLCAiLTB4MTAvMHgxMSIsICItMTYvMTciLCAxLCAtMSB9LAorCisgICAgeyAiaGVsbG8lUWQiLCAgICAgICJoZWxsbzAiLCAgICAgICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICJoZWxsbyVRZCIsICAgICAgImhlbGxvIDAiLCAgICAgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgImhlbGxvJVFkIiwgICAgICAiaGVsbG8gXHQwIiwgICAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiaGVsbG8lUWR3b3JsZCIsICJoZWxsbyAwd29ybGQiLCAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICJoZWxsbyVRZCIsICAgICAgImhlbGxvMy8yIiwgICAgICIzLzIiLCAxLCAtMSB9LAorCisgICAgeyAiaGVsbG8lKlFkIiwgICAgICAiaGVsbG8wIiwgICAgICAgICItOTk5LzEyMSIsIDAsIC0xIH0sCisgICAgeyAiaGVsbG8lKlFkIiwgICAgICAiaGVsbG8gMCIsICAgICAgICItOTk5LzEyMSIsIDAsIC0xIH0sCisgICAgeyAiaGVsbG8lKlFkIiwgICAgICAiaGVsbG8gXHQwIiwgICAgICItOTk5LzEyMSIsIDAsIC0xIH0sCisgICAgeyAiaGVsbG8lKlFkd29ybGQiLCAiaGVsbG8gMHdvcmxkIiwgICItOTk5LzEyMSIsIDAsIC0xIH0sCisgICAgeyAiaGVsbG8lKlFkd29ybGQiLCAiaGVsbG8zLzJ3b3JsZCIsICItOTk5LzEyMSIsIDAsIC0xIH0sCisKKyAgICB7ICIlUWQiLCAgICAiIiwgICAgICItOTk5LzEyMSIsIC0xLCAtMSB9LAorICAgIHsgIiVRZCIsICAgIiAiLCAgICAgIi05OTkvMTIxIiwgLTEsIC0xIH0sCisgICAgeyAiICVRZCIsICAgIiIsICAgICAiLTk5OS8xMjEiLCAtMSwgLTEgfSwKKyAgICB7ICJ4eXolUWQiLCAiIiwgICAgICItOTk5LzEyMSIsIC0xLCAtMSB9LAorCisgICAgeyAiJSpRZCIsICAgICIiLCAgICAgIi05OTkvMTIxIiwgLTEsIC0xIH0sCisgICAgeyAiICUqUWQiLCAgICIiLCAgICAgIi05OTkvMTIxIiwgLTEsIC0xIH0sCisgICAgeyAieHl6JSpRZCIsICIiLCAgICAgIi05OTkvMTIxIiwgLTEsIC0xIH0sCisKKyAgICAvKiBtYXRjaCBzb21ldGhpbmcsIGJ1dCBpbnZhbGlkICovCisgICAgeyAiJVFkIiwgICAgIi0iLCAgICAgIi05OTkvMTIxIiwgIDAsIDEgfSwKKyAgICB7ICIlUWQiLCAgICAiKyIsICAgICAiLTk5OS8xMjEiLCAgMCwgMSB9LAorICAgIHsgIiVRZCIsICAgICIvLSIsICAgICItOTk5LzEyMSIsICAwLCAxIH0sCisgICAgeyAiJVFkIiwgICAgIi8rIiwgICAgIi05OTkvMTIxIiwgIDAsIDEgfSwKKyAgICB7ICIlUWQiLCAgICAiLS8iLCAgICAiLTk5OS8xMjEiLCAgMCwgMSB9LAorICAgIHsgIiVRZCIsICAgICIrLyIsICAgICItOTk5LzEyMSIsICAwLCAxIH0sCisgICAgeyAiJVFkIiwgICAgIi0vLSIsICAgIi05OTkvMTIxIiwgIDAsIDEgfSwKKyAgICB7ICIlUWQiLCAgICAiLS8rIiwgICAiLTk5OS8xMjEiLCAgMCwgMSB9LAorICAgIHsgIiVRZCIsICAgICIrLysiLCAgICItOTk5LzEyMSIsICAwLCAxIH0sCisgICAgeyAiJVFkIiwgICAgIi8xMjMiLCAgIi05OTkvMTIxIiwgIDAsIDEgfSwKKyAgICB7ICIlUWQiLCAgICAiLS8xMjMiLCAiLTk5OS8xMjEiLCAgMCwgMSB9LAorICAgIHsgIiVRZCIsICAgICIrLzEyMyIsICItOTk5LzEyMSIsICAwLCAxIH0sCisgICAgeyAiJVFkIiwgICAgIjEyMy8iLCAgIi05OTkvMTIxIiwgIDAsIDEgfSwKKyAgICB7ICIlUWQiLCAgICAiMTIzLy0iLCAiLTk5OS8xMjEiLCAgMCwgMSB9LAorICAgIHsgIiVRZCIsICAgICIxMjMvKyIsICItOTk5LzEyMSIsICAwLCAxIH0sCisgICAgeyAieHl6JVFkIiwgInh5ei0iLCAgIi05OTkvMTIxIiwgIDAsIDQgfSwKKyAgICB7ICJ4eXolUWQiLCAieHl6KyIsICAiLTk5OS8xMjEiLCAgMCwgNCB9LAorCisgICAgeyAiJTFRaSIsICAiMTIvNTciLCAiMSIsICAgICAgICAxLCAxIH0sCisgICAgeyAiJTJRaSIsICAiMTIvNTciLCAiMTIiLCAgICAgICAxLCAyIH0sCisgICAgeyAiJTNRaSIsICAiMTIvNTciLCAiLTk5OS8xMjEiLCAwLCAtMSB9LAorICAgIHsgIiU0UWkiLCAgIjEyLzU3IiwgIjEyLzUiLCAgICAgMSwgNCB9LAorICAgIHsgIiU1UWkiLCAgIjEyLzU3IiwgIjEyLzU3IiwgICAgMSwgNSB9LAorICAgIHsgIiU2UWkiLCAgIjEyLzU3IiwgIjEyLzU3IiwgICAgMSwgNSB9LAorICAgIHsgIiU3UWkiLCAgIjEyLzU3IiwgIjEyLzU3IiwgICAgMSwgNSB9LAorCisgICAgeyAiJTFRaSIsICAiMDEyLzA1NyIsICIwIiwgICAgICAgIDEsIDEgfSwKKyAgICB7ICIlMlFpIiwgICIwMTIvMDU3IiwgIjAxIiwgICAgICAgMSwgMiB9LAorICAgIHsgIiUzUWkiLCAgIjAxMi8wNTciLCAiMDEyIiwgICAgICAxLCAzIH0sCisgICAgeyAiJTRRaSIsICAiMDEyLzA1NyIsICItOTk5LzEyMSIsIDAsIC0xIH0sCisgICAgeyAiJTVRaSIsICAiMDEyLzA1NyIsICIwMTIvMCIsICAgIDEsIDUgfSwKKyAgICB7ICIlNlFpIiwgICIwMTIvMDU3IiwgIjAxMi81IiwgICAgMSwgNiB9LAorICAgIHsgIiU3UWkiLCAgIjAxMi8wNTciLCAiMDEyLzA1NyIsICAxLCA3IH0sCisgICAgeyAiJThRaSIsICAiMDEyLzA1NyIsICIwMTIvMDU3IiwgIDEsIDcgfSwKKyAgICB7ICIlOVFpIiwgICIwMTIvMDU3IiwgIjAxMi8wNTciLCAgMSwgNyB9LAorCisgICAgeyAiJTFRaSIsICAiMHgxMi8weDU3IiwgIjAiLCAgICAgICAgIDEsIDEgfSwKKyAgICB7ICIlMlFpIiwgICIweDEyLzB4NTciLCAiLTk5OSIsICAgICAgMCwgMiB9LAorICAgIHsgIiUzUWkiLCAgIjB4MTIvMHg1NyIsICIweDEiLCAgICAgICAxLCAzIH0sCisgICAgeyAiJTRRaSIsICAiMHgxMi8weDU3IiwgIjB4MTIiLCAgICAgIDEsIDQgfSwKKyAgICB7ICIlNVFpIiwgICIweDEyLzB4NTciLCAiLTk5OS8xMjEiLCAgMCwgNSB9LAorICAgIHsgIiU2UWkiLCAgIjB4MTIvMHg1NyIsICIweDEyLzAiLCAgICAxLCA2IH0sCisgICAgeyAiJTdRaSIsICAiMHgxMi8weDU3IiwgIi05OTkvMTIxIiwgIDAsIDcgfSwKKyAgICB7ICIlOFFpIiwgICIweDEyLzB4NTciLCAiMHgxMi8weDUiLCAgMSwgOCB9LAorICAgIHsgIiU5UWkiLCAgIjB4MTIvMHg1NyIsICIweDEyLzB4NTciLCAxLCA5IH0sCisgICAgeyAiJTEwUWkiLCAiMHgxMi8weDU3IiwgIjB4MTIvMHg1NyIsIDEsIDkgfSwKKyAgICB7ICIlMTFRaSIsICIweDEyLzB4NTciLCAiMHgxMi8weDU3IiwgMSwgOSB9LAorCisgICAgeyAiJVFkIiwgICJ4eXoiLCAiMCIsIDAsIDAgfSwKKyAgfTsKKworICBpbnQgICAgICAgICBpLCBqLCBpZ25vcmUsIGdvdF9yZXQsIHdhbnRfcmV0LCBnb3RfdXB0bywgd2FudF91cHRvOworICBtcHFfdCAgICAgICBnb3QsIHdhbnQ7CisgIGxvbmcgICAgICAgIGdvdF9sLCB3YW50X2Z0ZWxsOworICBpbnQgICAgICAgICBlcnJvciA9IDA7CisgIGZ1bl90ICAgICAgIGZ1bjsKKyAgY29uc3QgY2hhciAgKm5hbWU7CisgIGNoYXIgICAgICAgIGZtdFsxMjhdOworCisgIG1wcV9pbml0IChnb3QpOworICBtcHFfaW5pdCAod2FudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wcV9zZXRfc3RyX29yX2Fib3J0ICh3YW50LCBkYXRhW2ldLndhbnQsIDApOworCisgICAgICBBU1NFUlRfQUxXQVlTIChzdHJsZW4gKGRhdGFbaV0uZm10KSArIDIgPCBzaXplb2YgKGZtdCkpOworICAgICAgc3RyY3B5IChmbXQsIGRhdGFbaV0uZm10KTsKKyAgICAgIHN0cmNhdCAoZm10LCAiJW4iKTsKKworICAgICAgaWdub3JlID0gKHN0cmNociAoZm10LCAnKicpICE9IE5VTEwpOworCisgICAgICBmb3IgKGogPSAwOyBqIDw9IDM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIHdhbnRfcmV0ID0gZGF0YVtpXS5yZXQ7CisKKyAgICAgICAgICB3YW50X2Z0ZWxsID0gZGF0YVtpXS5mdGVsbDsKKyAgICAgICAgICBpZiAod2FudF9mdGVsbCA9PSAtMSkKKyAgICAgICAgICAgIHdhbnRfZnRlbGwgPSBzdHJsZW4gKGRhdGFbaV0uaW5wdXQpOworICAgICAgICAgIHdhbnRfdXB0byA9IHdhbnRfZnRlbGw7CisKKyAgICAgICAgICBpZiAod2FudF9yZXQgPT0gLTEgfHwgKHdhbnRfcmV0ID09IDAgJiYgISBpZ25vcmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3YW50X2Z0ZWxsID0gLTE7CisgICAgICAgICAgICAgIHdhbnRfdXB0byA9IC01NTU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBuYW1lID0gImdtcF9zc2NhbmYiOworICAgICAgICAgICAgZnVuID0gZnVuX2dtcF9zc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBuYW1lID0gImdtcF9mc2NhbmYiOworICAgICAgICAgICAgZnVuID0gZnVuX2dtcF9mc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoc3RyY2hyIChkYXRhW2ldLmlucHV0LCAnLycpICE9IE5VTEwpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCEgbGliY19zY2FuZl9jb252ZXJ0IChmbXQpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5hbWUgPSAic3RhbmRhcmQgc3NjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9zc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoc3RyY2hyIChkYXRhW2ldLmlucHV0LCAnLycpICE9IE5VTEwpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCEgbGliY19zY2FuZl9jb252ZXJ0IChmbXQpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5hbWUgPSAic3RhbmRhcmQgZnNjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9mc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnb3RfdXB0byA9IC01NTU7CisgICAgICAgICAgZ290X2Z0ZWxsID0gLTE7CisKKyAgICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbXBxX3NldF9zaSAoZ290LCAtOTk5TCwgMTIxTCk7CisgICAgICAgICAgICBpZiAoaWdub3JlKQorICAgICAgICAgICAgICBnb3RfcmV0ID0gKCpmdW4pIChkYXRhW2ldLmlucHV0LCBmbXQsICZnb3RfdXB0bywgTlVMTCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdF9yZXQgPSAoKmZ1bikgKGRhdGFbaV0uaW5wdXQsIGZtdCwgZ290LCAmZ290X3VwdG8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGdvdF9sID0gLTk5OUw7CisgICAgICAgICAgICBpZiAoaWdub3JlKQorICAgICAgICAgICAgICBnb3RfcmV0ID0gKCpmdW4pIChkYXRhW2ldLmlucHV0LCBmbXQsICZnb3RfdXB0bywgTlVMTCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdF9yZXQgPSAoKmZ1bikgKGRhdGFbaV0uaW5wdXQsIGZtdCwgJmdvdF9sLCAmZ290X3VwdG8pOworICAgICAgICAgICAgbXBxX3NldF9zaSAoZ290LCBnb3RfbCwgKGdvdF9sID09IC05OTlMID8gMTIxTCA6IDFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX0FMV0FZUyAoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChtcHFfbnVtcmVmIChnb3QpKTsKKyAgICAgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChtcHFfZGVucmVmIChnb3QpKTsKKworICAgICAgICAgIGlmIChnb3RfcmV0ICE9IHdhbnRfcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyByZXR1cm4gdmFsdWVcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgLyogdXNlIGRpcmVjdCBtcHogY29tcGFyZXMsIHNpbmNlIHNvbWUgb2YgdGhlIHRlc3QgZGF0YSBpcworICAgICAgICAgICAgIG5vbi1jYW5vbmljYWwgYW5kIGNhbiB0cmlwIEFTU0VSVHMgaW4gbXBxX2VxdWFsICovCisgICAgICAgICAgaWYgKHdhbnRfcmV0ID09IDEKKyAgICAgICAgICAgICAgJiYgISAobXB6X2NtcCAobXBxX251bXJlZih3YW50KSwgbXBxX251bXJlZihnb3QpKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIG1wel9jbXAgKG1wcV9kZW5yZWYod2FudCksIG1wcV9kZW5yZWYoZ290KSkgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiVzIHdyb25nIHJlc3VsdFxuIiwgbmFtZSk7CisgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZ290X3VwdG8gIT0gd2FudF91cHRvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyB1cHRvXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChnb3RfZnRlbGwgIT0gLTEgJiYgd2FudF9mdGVsbCAhPSAtMSAmJiBnb3RfZnRlbGwgIT0gd2FudF9mdGVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiJXMgd3JvbmcgZnRlbGxcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGZtdCAgIFwiJXNcIlxuIiwgZGF0YVtpXS5mbXQpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGlucHV0IFwiJXNcIlxuIiwgZGF0YVtpXS5pbnB1dCk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgcmV0ICAgd2FudD0lZFxuIiwgd2FudF9yZXQpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICAgICAgIGdvdCA9JWRcbiIsIGdvdF9yZXQpOworICAgICAgICAgICAgICBtcHFfdHJhY2UgKCIgIHZhbHVlIHdhbnQiLCB3YW50KTsKKyAgICAgICAgICAgICAgbXBxX3RyYWNlICgiICAgICAgICBnb3QgIiwgZ290KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICB1cHRvICB3YW50PSVkXG4iLCB3YW50X3VwdG8pOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICAgICAgIGdvdCA9JWRcbiIsIGdvdF91cHRvKTsKKyAgICAgICAgICAgICAgaWYgKGdvdF9mdGVsbCAhPSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGZ0ZWxsIHdhbnQgPSVsZFxuIiwgd2FudF9mdGVsbCk7CisgICAgICAgICAgICAgICAgICBwcmludGYgICAgKCIgICAgICAgIGdvdCAgPSVsZFxuIiwgZ290X2Z0ZWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIG1wcV9jbGVhciAoZ290KTsKKyAgbXBxX2NsZWFyICh3YW50KTsKK30KKwordm9pZAorY2hlY2tfZiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKmZtdDsKKyAgICBjb25zdCBjaGFyICAqaW5wdXQ7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisgICAgaW50ICAgICAgICAgcmV0OworICAgIGxvbmcgICAgICAgIGZ0ZWxsOyAgICAvKiBvciAtMSBmb3IgbGVuZ3RoIG9mIGlucHV0IHN0cmluZyAqLworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiJUZmIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJUZlIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJUZFIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJUZnIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJUZHIiwgICAgIjAiLCAgICAiMCIsIDEsIC0xIH0sCisKKyAgICB7ICIlRmYiLCAgIjEyMyIsICAgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMTIzIiwgICAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMiLCAgICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIjEyMy4iLCAgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMTIzLiIsICAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMuIiwgICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIjEyMy4wIiwgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMTIzLjAiLCAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMuMCIsICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIjAxMjMiLCAgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMDEyMyIsICAiLTEyMyIsIDEsIC0xIH0sCisKKyAgICB7ICIlRmYiLCAgIjEyMy40NTZlMyIsICAgIjEyMzQ1NiIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMuNDU2ZTMiLCAgIi0xMjM0NTYiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICAiMTIzLjQ1NmUrMyIsICAiMTIzNDU2IiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAiLTEyMy40NTZlKzMiLCAiLTEyMzQ1NiIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgICIxMjMwMDBlLTMiLCAgICAgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMTIzMDAwZS0zIiwgICAgICItMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIjEyMzAwMC5lLTMiLCAgICAgIjEyMyIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMwMDAuZS0zIiwgICAgIi0xMjMiLCAxLCAtMSB9LAorCisgICAgeyAiJUZmIiwgICIxMjMuNDU2RTMiLCAgICIxMjM0NTYiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMTIzLjQ1NkUzIiwgICItMTIzNDU2IiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIjEyMy40NTZFKzMiLCAgIjEyMzQ1NiIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgIi0xMjMuNDU2RSszIiwgIi0xMjM0NTYiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICAiMTIzMDAwRS0zIiwgICAgICAiMTIzIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAiLTEyMzAwMEUtMyIsICAgICAiLTEyMyIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgICIxMjMwMDAuRS0zIiwgICAgICIxMjMiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMTIzMDAwLkUtMyIsICAgICItMTIzIiwgMSwgLTEgfSwKKworICAgIHsgIiVGZiIsICAiLjQ1NmUzIiwgICAiNDU2IiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAiLS40NTZlMyIsICAiLTQ1NiIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgICIuNDU2ZSszIiwgICI0NTYiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItLjQ1NmUrMyIsICItNDU2IiwgMSwgLTEgfSwKKworICAgIHsgIiVGZiIsICAgICIgMCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgICIgIDAiLCAgICAiMCIsIDEsIC0xIH0sCisgICAgeyAiJUZmIiwgICIgICAwIiwgICAgIjAiLCAxLCAtMSB9LAorICAgIHsgIiVGZiIsICAgIlx0MCIsICAgICIwIiwgMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAiXHRcdDAiLCAgICAiMCIsIDEsIC0xIH0sCisKKyAgICB7ICJoZWxsbyVGZyIsICAgICAgImhlbGxvMCIsICAgICAgICIwIiwgICAxLCAtMSB9LAorICAgIHsgImhlbGxvJUZnIiwgICAgICAiaGVsbG8gMCIsICAgICAgIjAiLCAgIDEsIC0xIH0sCisgICAgeyAiaGVsbG8lRmciLCAgICAgICJoZWxsbyBcdDAiLCAgICAiMCIsICAgMSwgLTEgfSwKKyAgICB7ICJoZWxsbyVGZ3dvcmxkIiwgImhlbGxvIDB3b3JsZCIsICIwIiwgICAxLCAtMSB9LAorICAgIHsgImhlbGxvJUZnIiwgICAgICAiaGVsbG8zLjAiLCAgICAgIjMuMCIsIDEsIC0xIH0sCisKKyAgICB7ICJoZWxsbyUqRmciLCAgICAgICJoZWxsbzAiLCAgICAgICAgIi05OTkiLCAwLCAtMSB9LAorICAgIHsgImhlbGxvJSpGZyIsICAgICAgImhlbGxvIDAiLCAgICAgICAiLTk5OSIsIDAsIC0xIH0sCisgICAgeyAiaGVsbG8lKkZnIiwgICAgICAiaGVsbG8gXHQwIiwgICAgICItOTk5IiwgMCwgLTEgfSwKKyAgICB7ICJoZWxsbyUqRmd3b3JsZCIsICJoZWxsbyAwd29ybGQiLCAgIi05OTkiLCAwLCAtMSB9LAorICAgIHsgImhlbGxvJSpGZ3dvcmxkIiwgImhlbGxvMy4wd29ybGQiLCAiLTk5OSIsIDAsIC0xIH0sCisKKyAgICB7ICIlRmYiLCAgICAgIiIsICAgIi05OTkiLCAtMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgICAiICIsICAgIi05OTkiLCAtMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgICJcdCIsICAgIi05OTkiLCAtMSwgLTEgfSwKKyAgICB7ICIlRmYiLCAgIiBcdCIsICAgIi05OTkiLCAtMSwgLTEgfSwKKyAgICB7ICIgJUZmIiwgICAgIiIsICAgIi05OTkiLCAtMSwgLTEgfSwKKyAgICB7ICJ4eXolRmYiLCAgIiIsICAgIi05OTkiLCAtMSwgLTEgfSwKKworICAgIHsgIiUqRmYiLCAgICAiIiwgICAiLTk5OSIsIC0xLCAtMSB9LAorICAgIHsgIiAlKkZmIiwgICAiIiwgICAiLTk5OSIsIC0xLCAtMSB9LAorICAgIHsgInh5eiUqRmYiLCAiIiwgICAiLTk5OSIsIC0xLCAtMSB9LAorCisgICAgeyAiJUZmIiwgICAgInh5eiIsICIwIiwgMCB9LAorCisgICAgLyogdmFyaW91cyBub24tZW1wdHkgYnV0IGludmFsaWQgKi8KKyAgICB7ICIlRmYiLCAgICAiLSIsICAgICAgIi05OTkiLCAgMCwgMSB9LAorICAgIHsgIiVGZiIsICAgICIrIiwgICAgICAiLTk5OSIsICAwLCAxIH0sCisgICAgeyAieHl6JUZmIiwgInh5ei0iLCAgICItOTk5IiwgIDAsIDQgfSwKKyAgICB7ICJ4eXolRmYiLCAieHl6KyIsICAgIi05OTkiLCAgMCwgNCB9LAorICAgIHsgIiVGZiIsICAgICItLiIsICAgICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgICAgIisuIiwgICAgICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAgICAiLmUiLCAgICAgIi05OTkiLCAgMCwgMSB9LAorICAgIHsgIiVGZiIsICAgIi0uZSIsICAgICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgICAiKy5lIiwgICAgICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAgICAiLkUiLCAgICAgIi05OTkiLCAgMCwgMSB9LAorICAgIHsgIiVGZiIsICAgIi0uRSIsICAgICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgICAiKy5FIiwgICAgICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAgICAiLmUxMjMiLCAgIi05OTkiLCAgMCwgMSB9LAorICAgIHsgIiVGZiIsICAgIi0uZTEyMyIsICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgICAiKy5lMTIzIiwgICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAgICAiMTIzZSIsICAgIi05OTkiLCAgMCwgNCB9LAorICAgIHsgIiVGZiIsICAgIi0xMjNlIiwgICAiLTk5OSIsICAwLCA1IH0sCisgICAgeyAiJUZmIiwgICAgIjEyM2UtIiwgICItOTk5IiwgIDAsIDUgfSwKKyAgICB7ICIlRmYiLCAgICItMTIzZS0iLCAgIi05OTkiLCAgMCwgNiB9LAorICAgIHsgIiVGZiIsICAgICIxMjNlKyIsICAiLTk5OSIsICAwLCA1IH0sCisgICAgeyAiJUZmIiwgICAiLTEyM2UrIiwgICItOTk5IiwgIDAsIDYgfSwKKyAgICB7ICIlRmYiLCAgICIxMjNlLVoiLCAgIi05OTkiLCAgMCwgNSB9LAorCisgICAgLyogaGV4IGZsb2F0cyAqLworICAgIHsgIiVGZiIsICIweDEyM3AwIiwgICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIweDEyM1AwIiwgICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIwWDEyM3AwIiwgICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIwWDEyM1AwIiwgICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMHgxMjNwMCIsICAgICAiLTI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMHgxMjNwMCIsICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIweDEyMy5wMCIsICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIweDEyLjNwNCIsICAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMHgxMi4zcDQiLCAgICAiLTI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMHgxMi4zcDQiLCAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIweDEyMzBwLTQiLCAgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICItMHgxMjMwcC00IiwgICAiLTI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMHgxMjMwcC00IiwgICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMHguMTIzMHAxMiIsICAgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIrMHgxMjMwMDBwLTEyIiwgIjI5MSIsICAxLCAtMSB9LAorICAgIHsgIiVGZiIsICIweDEyMyBwMTIiLCAgICAgIjI5MSIsICAxLCA1IH0sCisgICAgeyAiJUZmIiwgIjB4OSA5IiwgICAgICAgICAgICI5IiwgIDEsIDMgfSwKKyAgICB7ICIlRmYiLCAiMHgwMSIsICAgICAgICAgICAgIjEiLCAgMSwgNCB9LAorICAgIHsgIiVGZiIsICIweDIzIiwgICAgICAgICAgICIzNSIsICAxLCA0IH0sCisgICAgeyAiJUZmIiwgIjB4NDUiLCAgICAgICAgICAgIjY5IiwgIDEsIDQgfSwKKyAgICB7ICIlRmYiLCAiMHg2NyIsICAgICAgICAgICIxMDMiLCAgMSwgNCB9LAorICAgIHsgIiVGZiIsICIweDg5IiwgICAgICAgICAgIjEzNyIsICAxLCA0IH0sCisgICAgeyAiJUZmIiwgIjB4QUIiLCAgICAgICAgICAiMTcxIiwgIDEsIDQgfSwKKyAgICB7ICIlRmYiLCAiMHhDRCIsICAgICAgICAgICIyMDUiLCAgMSwgNCB9LAorICAgIHsgIiVGZiIsICIweEVGIiwgICAgICAgICAgIjIzOSIsICAxLCA0IH0sCisgICAgeyAiJUZmIiwgIjB4YWIiLCAgICAgICAgICAiMTcxIiwgIDEsIDQgfSwKKyAgICB7ICIlRmYiLCAiMHhjZCIsICAgICAgICAgICIyMDUiLCAgMSwgNCB9LAorICAgIHsgIiVGZiIsICIweGVmIiwgICAgICAgICAgIjIzOSIsICAxLCA0IH0sCisgICAgeyAiJUZmIiwgIjB4MTAwcDBBIiwgICAgICAiMjU2IiwgIDEsIDcgfSwKKyAgICB7ICIlRmYiLCAiMHgxcDkiLCAgICAgICAgICI1MTIiLCAgMSwgLTEgfSwKKworICAgIC8qIGludmFsaWQgaGV4IGZsb2F0cyAqLworICAgIHsgIiVGZiIsICIweCIsICAgICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgIi0weCIsICAgICItOTk5IiwgIDAsIDMgfSwKKyAgICB7ICIlRmYiLCAiKzB4IiwgICAgIi05OTkiLCAgMCwgMyB9LAorICAgIHsgIiVGZiIsICIweC0iLCAgICAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgIjB4KyIsICAgICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAiMHguIiwgICAgIi05OTkiLCAgMCwgMyB9LAorICAgIHsgIiVGZiIsICItMHguIiwgICAiLTk5OSIsICAwLCA0IH0sCisgICAgeyAiJUZmIiwgIisweC4iLCAgICItOTk5IiwgIDAsIDQgfSwKKyAgICB7ICIlRmYiLCAiMHgucCIsICAgIi05OTkiLCAgMCwgMyB9LAorICAgIHsgIiVGZiIsICItMHgucCIsICAiLTk5OSIsICAwLCA0IH0sCisgICAgeyAiJUZmIiwgIisweC5wIiwgICItOTk5IiwgIDAsIDQgfSwKKyAgICB7ICIlRmYiLCAiMHguUCIsICAgIi05OTkiLCAgMCwgMyB9LAorICAgIHsgIiVGZiIsICItMHguUCIsICAiLTk5OSIsICAwLCA0IH0sCisgICAgeyAiJUZmIiwgIisweC5QIiwgICItOTk5IiwgIDAsIDQgfSwKKyAgICB7ICIlRmYiLCAiLnAxMjMiLCAgIi05OTkiLCAgMCwgMSB9LAorICAgIHsgIiVGZiIsICItLnAxMjMiLCAiLTk5OSIsICAwLCAyIH0sCisgICAgeyAiJUZmIiwgIisucDEyMyIsICItOTk5IiwgIDAsIDIgfSwKKyAgICB7ICIlRmYiLCAiMHgxcCIsICAgIi05OTkiLCAgMCwgNCB9LAorICAgIHsgIiVGZiIsICIweDFwLSIsICAiLTk5OSIsICAwLCA1IH0sCisgICAgeyAiJUZmIiwgIjB4MXArIiwgICItOTk5IiwgIDAsIDUgfSwKKyAgICB7ICIlRmYiLCAiMHgxMjNwIDEyIiwgIjI5MSIsICAwLCA2IH0sCisgICAgeyAiJUZmIiwgIjB4IDEyM3AxMiIsICIyOTEiLCAgMCwgMiB9LAorCisgIH07CisKKyAgaW50ICAgICAgICAgaSwgaiwgaWdub3JlLCBnb3RfcmV0LCB3YW50X3JldCwgZ290X3VwdG8sIHdhbnRfdXB0bzsKKyAgbXBmX3QgICAgICAgZ290LCB3YW50OworICBkb3VibGUgICAgICBnb3RfZDsKKyAgbG9uZyAgICAgICAgd2FudF9mdGVsbDsKKyAgaW50ICAgICAgICAgZXJyb3IgPSAwOworICBmdW5fdCAgICAgICBmdW47CisgIGNvbnN0IGNoYXIgICpuYW1lOworICBjaGFyICAgICAgICBmbXRbMTI4XTsKKworICBtcGZfaW5pdCAoZ290KTsKKyAgbXBmX2luaXQgKHdhbnQpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcGZfc2V0X3N0cl9vcl9hYm9ydCAod2FudCwgZGF0YVtpXS53YW50LCAxMCk7CisKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHN0cmxlbiAoZGF0YVtpXS5mbXQpICsgMiA8IHNpemVvZiAoZm10KSk7CisgICAgICBzdHJjcHkgKGZtdCwgZGF0YVtpXS5mbXQpOworICAgICAgc3RyY2F0IChmbXQsICIlbiIpOworCisgICAgICBpZ25vcmUgPSAoc3RyY2hyIChmbXQsICcqJykgIT0gTlVMTCk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPD0gMzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgd2FudF9yZXQgPSBkYXRhW2ldLnJldDsKKworICAgICAgICAgIHdhbnRfZnRlbGwgPSBkYXRhW2ldLmZ0ZWxsOworICAgICAgICAgIGlmICh3YW50X2Z0ZWxsID09IC0xKQorICAgICAgICAgICAgd2FudF9mdGVsbCA9IHN0cmxlbiAoZGF0YVtpXS5pbnB1dCk7CisgICAgICAgICAgd2FudF91cHRvID0gd2FudF9mdGVsbDsKKworICAgICAgICAgIGlmICh3YW50X3JldCA9PSAtMSB8fCAod2FudF9yZXQgPT0gMCAmJiAhIGlnbm9yZSkpCisgICAgICAgICAgICB3YW50X3VwdG8gPSAtNTU1OworCisgICAgICAgICAgc3dpdGNoIChqKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbmFtZSA9ICJnbXBfc3NjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9nbXBfc3NjYW5mOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbmFtZSA9ICJnbXBfZnNjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9nbXBfZnNjYW5mOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKCEgbGliY19zY2FuZl9jb252ZXJ0IChmbXQpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5hbWUgPSAic3RhbmRhcmQgc3NjYW5mIjsKKyAgICAgICAgICAgIGZ1biA9IGZ1bl9zc2NhbmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoISBsaWJjX3NjYW5mX2NvbnZlcnQgKGZtdCkpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbmFtZSA9ICJzdGFuZGFyZCBmc2NhbmYiOworICAgICAgICAgICAgZnVuID0gZnVuX2ZzY2FuZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfQUxXQVlTICgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGdvdF91cHRvID0gLTU1NTsKKyAgICAgICAgICBnb3RfZnRlbGwgPSAtMTsKKworICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtcGZfc2V0X3NpIChnb3QsIC05OTlMKTsKKyAgICAgICAgICAgIGlmIChpZ25vcmUpCisgICAgICAgICAgICAgIGdvdF9yZXQgPSAoKmZ1bikgKGRhdGFbaV0uaW5wdXQsIGZtdCwgJmdvdF91cHRvLCBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ290X3JldCA9ICgqZnVuKSAoZGF0YVtpXS5pbnB1dCwgZm10LCBnb3QsICZnb3RfdXB0byk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ290X2QgPSAtOTk5TDsKKyAgICAgICAgICAgIGlmIChpZ25vcmUpCisgICAgICAgICAgICAgIGdvdF9yZXQgPSAoKmZ1bikgKGRhdGFbaV0uaW5wdXQsIGZtdCwgJmdvdF91cHRvLCBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ290X3JldCA9ICgqZnVuKSAoZGF0YVtpXS5pbnB1dCwgZm10LCAmZ290X2QsICZnb3RfdXB0byk7CisgICAgICAgICAgICBtcGZfc2V0X2QgKGdvdCwgZ290X2QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9BTFdBWVMgKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgTVBGX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworICAgICAgICAgIGlmIChnb3RfcmV0ICE9IHdhbnRfcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyByZXR1cm4gdmFsdWVcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdhbnRfcmV0ID09IDEgJiYgbXBmX2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCIlcyB3cm9uZyByZXN1bHRcbiIsIG5hbWUpOworICAgICAgICAgICAgICBlcnJvciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKGdvdF91cHRvICE9IHdhbnRfdXB0bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiJXMgd3JvbmcgdXB0b1xuIiwgbmFtZSk7CisgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZ290X2Z0ZWxsICE9IC0xICYmIHdhbnRfZnRlbGwgIT0gLTEgJiYgZ290X2Z0ZWxsICE9IHdhbnRfZnRlbGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiVzIHdyb25nIGZ0ZWxsXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBmbXQgICBcIiVzXCJcbiIsIGRhdGFbaV0uZm10KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBpbnB1dCBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wdXQpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIHJldCAgIHdhbnQ9JWRcbiIsIHdhbnRfcmV0KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgICAgICBnb3QgPSVkXG4iLCBnb3RfcmV0KTsKKyAgICAgICAgICAgICAgbXBmX3RyYWNlICgiICB2YWx1ZSB3YW50Iiwgd2FudCk7CisgICAgICAgICAgICAgIG1wZl90cmFjZSAoIiAgICAgICAgZ290ICIsIGdvdCk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgdXB0byAgd2FudD0lZFxuIiwgd2FudF91cHRvKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgICAgICBnb3QgPSVkXG4iLCBnb3RfdXB0byk7CisgICAgICAgICAgICAgIGlmIChnb3RfZnRlbGwgIT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBmdGVsbCB3YW50ID0lbGRcbiIsIHdhbnRfZnRlbGwpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgICAgICBnb3QgID0lbGRcbiIsIGdvdF9mdGVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBtcGZfY2xlYXIgKGdvdCk7CisgIG1wZl9jbGVhciAod2FudCk7Cit9CisKKwordm9pZAorY2hlY2tfbiAodm9pZCkKK3sKKyAgaW50ICAgIHJldDsKKworICAvKiAlbiBzdXBwcmVzc2VkICovCisgIHsKKyAgICBpbnQgbiA9IDEyMzsKKyAgICBnbXBfc3NjYW5mICgiICAgIiwgIiAlKm4iLCAmbik7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSAxMjMpOworICB9CisgIHsKKyAgICBpbnQgbiA9IDEyMzsKKyAgICBmcm9tc3RyaW5nX2dtcF9mc2NhbmYgKCIgICAiLCAiICUqbiIsICZuKTsKKyAgICBBU1NFUlRfQUxXQVlTIChuID09IDEyMyk7CisgIH0KKworCisjZGVmaW5lIENIRUNLX04odHlwZSwgc3RyaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIHhbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciAgZm10WzEyOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeFswXSA9IH4gKHR5cGUpIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4WzFdID0gfiAodHlwZSkgMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYgKGZtdCwgImFiYyUlJXNuIiwgc3RyaW5nKTsgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gZ21wX3NzY2FuZiAoImFiYyIsIGZtdCwgJnhbMF0pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBzaG91bGQgd3JpdGUgd2hvbGUgb2YgeFswXSBhbmQgbm9uZSBvZiB4WzFdICovICAgXAorICAgIEFTU0VSVF9BTFdBWVMgKHhbMF0gPT0gMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUX0FMV0FZUyAoeFsxXSA9PSAodHlwZSkgfiAodHlwZSkgMCk7CQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBDSEVDS19OIChjaGFyLCAgICAgICJoaCIpOworICBDSEVDS19OIChsb25nLCAgICAgICJsIik7CisjaWYgSEFWRV9MT05HX0xPTkcKKyAgQ0hFQ0tfTiAobG9uZyBsb25nLCAiTCIpOworI2VuZGlmCisjaWYgSEFWRV9JTlRNQVhfVAorICBDSEVDS19OIChpbnRtYXhfdCwgICJqIik7CisjZW5kaWYKKyNpZiBIQVZFX1BUUkRJRkZfVAorICBDSEVDS19OIChwdHJkaWZmX3QsICJ0Iik7CisjZW5kaWYKKyAgQ0hFQ0tfTiAoc2hvcnQsICAgICAiaCIpOworICBDSEVDS19OIChzaXplX3QsICAgICJ6Iik7CisKKyAgLyogJVpuICovCisgIHsKKyAgICBtcHpfdCAgeFsyXTsKKyAgICBtcHpfaW5pdF9zZXRfc2kgKHhbMF0sIC05ODdMKTsKKyAgICBtcHpfaW5pdF9zZXRfc2kgKHhbMV0sICA2NTRMKTsKKyAgICByZXQgPSBnbXBfc3NjYW5mICgieHl6ICAgIiwgInh5eiVabiIsIHhbMF0pOworICAgIE1QWl9DSEVDS19GT1JNQVQgKHhbMF0pOworICAgIE1QWl9DSEVDS19GT1JNQVQgKHhbMV0pOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh4WzBdLCAzTCkgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXB6X2NtcF91aSAoeFsxXSwgNjU0TCkgPT0gMCk7CisgICAgbXB6X2NsZWFyICh4WzBdKTsKKyAgICBtcHpfY2xlYXIgKHhbMV0pOworICB9CisgIHsKKyAgICBtcHpfdCAgeDsKKyAgICBtcHpfaW5pdCAoeCk7CisgICAgcmV0ID0gZnJvbXN0cmluZ19nbXBfZnNjYW5mICgieHl6ICAgIiwgInh5eiVabiIsIHgpOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh4LCAzTCkgPT0gMCk7CisgICAgbXB6X2NsZWFyICh4KTsKKyAgfQorCisgIC8qICVRbiAqLworICB7CisgICAgbXBxX3QgIHhbMl07CisgICAgbXBxX2luaXQgKHhbMF0pOworICAgIG1wcV9pbml0ICh4WzFdKTsKKyAgICBtcHFfc2V0X3VpICh4WzBdLCA5ODdMLCA2NTRMKTsKKyAgICBtcHFfc2V0X3VpICh4WzFdLCA0MTE1TCwgMjI2TCk7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoInh5eiAgICIsICJ4eXolUW4iLCB4WzBdKTsKKyAgICBNUFFfQ0hFQ0tfRk9STUFUICh4WzBdKTsKKyAgICBNUFFfQ0hFQ0tfRk9STUFUICh4WzFdKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBxX2NtcF91aSAoeFswXSwgM0wsIDFMKSA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHFfY21wX3VpICh4WzFdLCA0MTE1TCwgMjI2TCkgPT0gMCk7CisgICAgbXBxX2NsZWFyICh4WzBdKTsKKyAgICBtcHFfY2xlYXIgKHhbMV0pOworICB9CisgIHsKKyAgICBtcHFfdCAgeDsKKyAgICBtcHFfaW5pdCAoeCk7CisgICAgcmV0ID0gZnJvbXN0cmluZ19nbXBfZnNjYW5mICgieHl6ICAgIiwgInh5eiVRbiIsIHgpOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHFfY21wX3VpICh4LCAzTCwgMUwpID09IDApOworICAgIG1wcV9jbGVhciAoeCk7CisgIH0KKworICAvKiAlRm4gKi8KKyAgeworICAgIG1wZl90ICB4WzJdOworICAgIG1wZl9pbml0ICh4WzBdKTsKKyAgICBtcGZfaW5pdCAoeFsxXSk7CisgICAgbXBmX3NldF91aSAoeFswXSwgOTg3TCk7CisgICAgbXBmX3NldF91aSAoeFsxXSwgNjU0TCk7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoInh5eiAgICIsICJ4eXolRm4iLCB4WzBdKTsKKyAgICBNUEZfQ0hFQ0tfRk9STUFUICh4WzBdKTsKKyAgICBNUEZfQ0hFQ0tfRk9STUFUICh4WzFdKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBmX2NtcF91aSAoeFswXSwgM0wpID09IDApOworICAgIEFTU0VSVF9BTFdBWVMgKG1wZl9jbXBfdWkgKHhbMV0sIDY1NEwpID09IDApOworICAgIG1wZl9jbGVhciAoeFswXSk7CisgICAgbXBmX2NsZWFyICh4WzFdKTsKKyAgfQorICB7CisgICAgbXBmX3QgIHg7CisgICAgbXBmX2luaXQgKHgpOworICAgIHJldCA9IGZyb21zdHJpbmdfZ21wX2ZzY2FuZiAoInh5eiAgICIsICJ4eXolRm4iLCB4KTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobXBmX2NtcF91aSAoeCwgM0wpID09IDApOworICAgIG1wZl9jbGVhciAoeCk7CisgIH0KK30KKworCit2b2lkCitjaGVja19taXNjICh2b2lkKQoreworICBpbnQgIHJldCwgY21wOworICB7CisgICAgaW50ICBhPTksIGI9OCwgYz03LCBuPTY2OworICAgIG1wel90ICB6OworICAgIG1wel9pbml0ICh6KTsKKyAgICByZXQgPSBnbXBfc3NjYW5mICgiMSAyIDMgNCIsICIlZCAlZCAlZCAlWmQlbiIsCisgICAgICAgICAgICAgICAgICAgICAgJmEsICZiLCAmYywgeiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSA0KTsKKyAgICBBU1NFUlRfQUxXQVlTIChhID09IDEpOworICAgIEFTU0VSVF9BTFdBWVMgKGIgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAoYyA9PSAzKTsKKyAgICBBU1NFUlRfQUxXQVlTIChuID09IDcpOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHosIDRMKSA9PSAwKTsKKyAgICBtcHpfY2xlYXIgKHopOworICB9CisgIHsKKyAgICBpbnQgIGE9OSwgYj04LCBjPTcsIG49NjY7CisgICAgbXB6X3QgIHo7CisgICAgbXB6X2luaXQgKHopOworICAgIHJldCA9IGZyb21zdHJpbmdfZ21wX2ZzY2FuZiAoIjEgMiAzIDQiLCAiJWQgJWQgJWQgJVpkJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmEsICZiLCAmYywgeiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSA0KTsKKyAgICBBU1NFUlRfQUxXQVlTIChhID09IDEpOworICAgIEFTU0VSVF9BTFdBWVMgKGIgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAoYyA9PSAzKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh6LCA0TCkgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSA3KTsKKyAgICBBU1NFUlRfQUxXQVlTIChnb3RfZnRlbGwgPT0gNyk7CisgICAgbXB6X2NsZWFyICh6KTsKKyAgfQorCisgIHsKKyAgICBpbnQgIGE9OSwgbj04OworICAgIG1wel90ICB6OworICAgIG1wel9pbml0ICh6KTsKKyAgICByZXQgPSBnbXBfc3NjYW5mICgiMSAyIDMgNCIsICIlZCAlKmQgJSpkICVaZCVuIiwgJmEsIHosICZuKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAoYSA9PSAxKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh6LCA0TCkgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSA3KTsKKyAgICBtcHpfY2xlYXIgKHopOworICB9CisgIHsKKyAgICBpbnQgIGE9OSwgbj04OworICAgIG1wel90ICB6OworICAgIG1wel9pbml0ICh6KTsKKyAgICByZXQgPSBmcm9tc3RyaW5nX2dtcF9mc2NhbmYgKCIxIDIgMyA0IiwgIiVkICUqZCAlKmQgJVpkJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmEsIHosICZuKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAoYSA9PSAxKTsKKyAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpICh6LCA0TCkgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSA3KTsKKyAgICBBU1NFUlRfQUxXQVlTIChnb3RfZnRlbGwgPT0gNyk7CisgICAgbXB6X2NsZWFyICh6KTsKKyAgfQorCisgIC8qIEVPRiBmb3Igbm8gbWF0Y2hpbmcgKi8KKyAgeworICAgIGNoYXIgYnVmWzEyOF07CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoIiAgICIsICIlcyIsIGJ1Zik7CisgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IEVPRik7CisgICAgcmV0ID0gZnJvbXN0cmluZ19nbXBfZnNjYW5mICgiICAgIiwgIiVzIiwgYnVmKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gRU9GKTsKKyAgICBpZiAob3B0aW9uX2xpYmNfc2NhbmYpCisgICAgICB7CisgICAgICAgIHJldCA9IHNzY2FuZiAoIiAgICIsICIlcyIsIGJ1Zik7CisgICAgICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSBFT0YpOworICAgICAgICByZXQgPSBmdW5fZnNjYW5mICgiICAgIiwgIiVzIiwgYnVmLCBOVUxMKTsKKyAgICAgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IEVPRik7CisgICAgICB9CisgIH0KKworICAvKiBzdXBwcmVzc2VkIGZpZWxkLCB0aGVuIGVvZiAqLworICB7CisgICAgaW50ICB4OworICAgIGlmICh0ZXN0X3NzY2FuZl9lb2Zfb2sgKCkpCisgICAgICB7CisgICAgICAgIHJldCA9IGdtcF9zc2NhbmYgKCIxMjMiLCAiJSpkJWQiLCAmeCk7CisgICAgICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSBFT0YpOworICAgICAgfQorICAgIHJldCA9IGZyb21zdHJpbmdfZ21wX2ZzY2FuZiAoIjEyMyIsICIlKmQlZCIsICZ4KTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gRU9GKTsKKyAgICBpZiAob3B0aW9uX2xpYmNfc2NhbmYpCisgICAgICB7CisgICAgICAgIHJldCA9IHNzY2FuZiAoIjEyMyIsICIlKmQlZCIsICZ4KTsKKyAgICAgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IEVPRik7CisgICAgICAgIHJldCA9IGZ1bl9mc2NhbmYgKCIxMjMiLCAiJSpkJWQiLCAmeCwgTlVMTCk7CisgICAgICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSBFT0YpOworICAgICAgfQorICB9CisgIHsKKyAgICBtcHpfdCAgeDsKKyAgICBtcHpfaW5pdCAoeCk7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoIjEyMyIsICIlKlpkJVpkIiwgeCk7CisgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IEVPRik7CisgICAgcmV0ID0gZnJvbXN0cmluZ19nbXBfZnNjYW5mICgiMTIzIiwgIiUqWmQlWmQiLCB4KTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gRU9GKTsKKyAgICBtcHpfY2xlYXIgKHgpOworICB9CisKKyAgLyogJVsuLi5dLCBnbGliYyBvbmx5ICovCisjaWZkZWYgX19HTElCQ19fCisgIHsKKyAgICBjaGFyICBidWZbMTI4XTsKKyAgICBpbnQgICBuID0gLTE7CisgICAgYnVmWzBdID0gJ1wwJzsKKyAgICByZXQgPSBnbXBfc3NjYW5mICgiYWJjZGVmZ2giLCAiJVthLWRdZWYlbiIsIGJ1ZiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAxKTsKKyAgICBjbXAgPSBzdHJjbXAgKGJ1ZiwgImFiY2QiKTsKKyAgICBBU1NFUlRfQUxXQVlTIChjbXAgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSA2KTsKKyAgfQorICB7CisgICAgY2hhciAgYnVmWzEyOF07CisgICAgaW50ICAgbiA9IC0xOworICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoInh5emEiLCAiJVteYV1hJW4iLCBidWYsICZuKTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMSk7CisgICAgY21wID0gc3RyY21wIChidWYsICJ4eXoiKTsKKyAgICBBU1NFUlRfQUxXQVlTIChjbXAgPT0gMCk7CisgICAgQVNTRVJUX0FMV0FZUyAobiA9PSA0KTsKKyAgfQorICB7CisgICAgY2hhciAgYnVmWzEyOF07CisgICAgaW50ICAgbiA9IC0xOworICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoImFiXWFiXSIsICIlW11hYl0lbiIsIGJ1ZiwgJm4pOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAxKTsKKyAgICBjbXAgPSBzdHJjbXAgKGJ1ZiwgImFiXWFiXSIpOworICAgIEFTU0VSVF9BTFdBWVMgKGNtcCA9PSAwKTsKKyAgICBBU1NFUlRfQUxXQVlTIChuID09IDYpOworICB9CisgIHsKKyAgICBjaGFyICBidWZbMTI4XTsKKyAgICBpbnQgICBuID0gLTE7CisgICAgYnVmWzBdID0gJ1wwJzsKKyAgICByZXQgPSBnbXBfc3NjYW5mICgieHl6YiIsICIlW15dYWJdYiVuIiwgYnVmLCAmbik7CisgICAgQVNTRVJUX0FMV0FZUyAocmV0ID09IDEpOworICAgIGNtcCA9IHN0cmNtcCAoYnVmLCAieHl6Iik7CisgICAgQVNTRVJUX0FMV0FZUyAoY21wID09IDApOworICAgIEFTU0VSVF9BTFdBWVMgKG4gPT0gNCk7CisgIH0KKyNlbmRpZgorCisgIC8qICV6ZCBldGMgd29uJ3QgYmUgYWNjZXB0ZWQgYnkgc3NjYW5mIG9uIG9sZCBzeXN0ZW1zLCBhbmQgcnVubmluZworICAgICBzb21ldGhpbmcgdG8gc2VlIGlmIHRoZXkgd29yayBtaWdodCBiZSBiYWQsIHNvIG9ubHkgdHJ5IGl0IG9uIGdsaWJjLAorICAgICBhbmQgb25seSBvbiBhIG5ldyBlbm91Z2ggdmVyc2lvbiAoZ2xpYmMgMi4wIGRvZXNuJ3QgaGF2ZSAlemQpICovCisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMCkKKyAgeworICAgIG1wel90ICAgejsKKyAgICBzaXplX3QgIHMgPSAtMTsKKyAgICBtcHpfaW5pdCAoeik7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoIjQ1NiA3ODkiLCAiJXpkICVaZCIsICZzLCB6KTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAocyA9PSA0NTYpOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHosIDc4OUwpID09IDApOworICAgIG1wel9jbGVhciAoeik7CisgIH0KKyAgeworICAgIG1wel90ICAgICAgejsKKyAgICBwdHJkaWZmX3QgIGQgPSAtMTsKKyAgICBtcHpfaW5pdCAoeik7CisgICAgcmV0ID0gZ21wX3NzY2FuZiAoIjQ1NiA3ODkiLCAiJXRkICVaZCIsICZkLCB6KTsKKyAgICBBU1NFUlRfQUxXQVlTIChyZXQgPT0gMik7CisgICAgQVNTRVJUX0FMV0FZUyAoZCA9PSA0NTYpOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHosIDc4OUwpID09IDApOworICAgIG1wel9jbGVhciAoeik7CisgIH0KKyAgeworICAgIG1wel90ICAgICAgejsKKyAgICBsb25nIGxvbmcgIGxsID0gLTE7CisgICAgbXB6X2luaXQgKHopOworICAgIHJldCA9IGdtcF9zc2NhbmYgKCI0NTYgNzg5IiwgIiVMZCAlWmQiLCAmbGwsIHopOworICAgIEFTU0VSVF9BTFdBWVMgKHJldCA9PSAyKTsKKyAgICBBU1NFUlRfQUxXQVlTIChsbCA9PSA0NTYpOworICAgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKHosIDc4OUwpID09IDApOworICAgIG1wel9jbGVhciAoeik7CisgIH0KKyNlbmRpZgorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGlmIChhcmdjID4gMSAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItcyIpID09IDApCisgICAgb3B0aW9uX2xpYmNfc2NhbmYgPSAxOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIG1wX3RyYWNlX2Jhc2UgPSAxNjsKKworICBjaGVja196ICgpOworICBjaGVja19xICgpOworICBjaGVja19mICgpOworICBjaGVja19uICgpOworICBjaGVja19taXNjICgpOworCisgIHVubGluayAoVEVNUEZJTEUpOworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3JldXNlLmMgYi90ZXN0cy9tcGYvcmV1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRiNWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3JldXNlLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIFRlc3QgdGhhdCByb3V0aW5lcyBhbGxvdyByZXVzaW5nIGEgc291cmNlIHZhcmlhYmxlIGFzIGRlc3RpbmF0aW9uLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMC0yMDAyLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmIF9fR01QX0xJQkdNUF9ETEwKKworLyogRklYTUU6IFdoZW4gbGlua2luZyB0byBhIERMTCBsaWJnbXAsIG1wZl9hZGQgZXRjIGNhbid0IGJlIHVzZWQgYXMKKyAgIGluaXRpYWxpemVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBiZWNhdXNlIHRoZXkncmUgZWZmZWN0aXZlbHkgZ2xvYmFsCisgICB2YXJpYWJsZXMgKGZ1bmN0aW9uIHBvaW50ZXJzKSB0aGVtc2VsdmVzLiAgUGVyaGFwcyBjYWxsaW5nIGEgdGVzdAorICAgZnVuY3Rpb24gc3VjY2Vzc2l2ZWx5IHdpdGggbXBmX2FkZCBldGMgd291bGQgYmUgYmV0dGVyLiAgKi8KKworaW50CittYWluICh2b2lkKQoreworICBwcmludGYgKCJUZXN0IHN1cHByZXNzZWQgZm9yIHdpbmRvd3MgRExMXG4iKTsKKyAgZXhpdCAoMCk7Cit9CisKKworI2Vsc2UgLyogISBETExfRVhQT1JUICovCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDE2CisjZW5kaWYKKworI2lmbmRlZiBFWFBPCisjZGVmaW5lIEVYUE8gMzIKKyNlbmRpZgorCit2b2lkIGR1bXBfYWJvcnQgKGNvbnN0IGNoYXIgKiwgbXBmX3QsIG1wZl90KTsKKwordHlwZWRlZiB2b2lkICgqZHNzX2Z1bmMpIChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKTsKKworZHNzX2Z1bmMgZHNzX2Z1bmNzW10gPQoreworICBtcGZfZGl2LCBtcGZfYWRkLCBtcGZfbXVsLCBtcGZfc3ViLAorfTsKKworY29uc3QgY2hhciAqZHNzX2Z1bmNfbmFtZXNbXSA9Cit7CisgICJtcGZfZGl2IiwgIm1wZl9hZGQiLCAibXBmX211bCIsICJtcGZfc3ViIiwKK307CisKK3R5cGVkZWYgdm9pZCAoKmRzaV9mdW5jKSAobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCitkc2lfZnVuYyBkc2lfZnVuY3NbXSA9Cit7CisgIG1wZl9kaXZfdWksIG1wZl9hZGRfdWksIG1wZl9tdWxfdWksIG1wZl9zdWJfdWksCisgIG1wZl9tdWxfMmV4cCwgbXBmX2Rpdl8yZXhwLCBtcGZfcG93X3VpCit9OworCitjb25zdCBjaGFyICpkc2lfZnVuY19uYW1lc1tdID0KK3sKKyAgIm1wZl9kaXZfdWkiLCAibXBmX2FkZF91aSIsICJtcGZfbXVsX3VpIiwgIm1wZl9zdWJfdWkiLAorICAibXBmX211bF8yZXhwIiwgIm1wZl9kaXZfMmV4cCIsICJtcGZfcG93X3VpIgorfTsKKwordHlwZWRlZiB2b2lkICgqZGlzX2Z1bmMpIChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBmX3NyY3B0cik7CisKK2Rpc19mdW5jIGRpc19mdW5jc1tdID0KK3sKKyAgbXBmX3VpX2RpdiwgbXBmX3VpX3N1YiwKK307CisKK2NvbnN0IGNoYXIgKmRpc19mdW5jX25hbWVzW10gPQoreworICAibXBmX3VpX2RpdiIsICJtcGZfdWlfc3ViIiwKK307CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgaTsKKyAgaW50IHBhc3MsIHJlcHMgPSAxMDAwMDsKKyAgbXBmX3QgaW4xLCBpbjIsIG91dDE7CisgIHVuc2lnbmVkIGxvbmcgaW50IGluMWksIGluMmk7CisgIG1wZl90IHJlczEsIHJlczIsIHJlczM7CisgIG1wX3NpemVfdCBicHJlYyA9IDEwMDsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgcmVwcyA9IHN0cnRvbCAoYXJndlsxXSwgMCwgMCk7CisgICAgICBpZiAoYXJnYyA+IDIpCisJYnByZWMgPSBzdHJ0b2wgKGFyZ3ZbMl0sIDAsIDApOworICAgIH0KKworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyAoYnByZWMpOworCisgIG1wZl9pbml0IChpbjEpOworICBtcGZfaW5pdCAoaW4yKTsKKyAgbXBmX2luaXQgKG91dDEpOworICBtcGZfaW5pdCAocmVzMSk7CisgIG1wZl9pbml0IChyZXMyKTsKKyAgbXBmX2luaXQgKHJlczMpOworCisgIGZvciAocGFzcyA9IDE7IHBhc3MgPD0gcmVwczsgcGFzcysrKQorICAgIHsKKyAgICAgIG1wZl9yYW5kb20yIChpbjEsIHVyYW5kb20gKCkgJSBTSVpFIC0gU0laRS8yLCB1cmFuZG9tICgpICUgRVhQTyk7CisgICAgICBtcGZfcmFuZG9tMiAoaW4yLCB1cmFuZG9tICgpICUgU0laRSAtIFNJWkUvMiwgdXJhbmRvbSAoKSAlIEVYUE8pOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkc3NfZnVuY3MpIC8gc2l6ZW9mIChkc3NfZnVuYyk7IGkrKykKKwl7CisJICAvKiBEb24ndCBkaXZpZGUgYnkgMC4gICovCisJICBpZiAoaSA9PSAwICYmIG1wZl9jbXBfdWkgKGluMiwgMCkgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIChkc3NfZnVuY3NbaV0pIChyZXMxLCBpbjEsIGluMik7CisKKwkgIG1wZl9zZXQgKG91dDEsIGluMSk7CisJICAoZHNzX2Z1bmNzW2ldKSAob3V0MSwgb3V0MSwgaW4yKTsKKwkgIG1wZl9zZXQgKHJlczIsIG91dDEpOworCisJICBtcGZfc2V0IChvdXQxLCBpbjIpOworCSAgKGRzc19mdW5jc1tpXSkgKG91dDEsIGluMSwgb3V0MSk7CisJICBtcGZfc2V0IChyZXMzLCBvdXQxKTsKKworCSAgaWYgKG1wZl9jbXAgKHJlczEsIHJlczIpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGRzc19mdW5jX25hbWVzW2ldLCByZXMxLCByZXMyKTsKKwkgIGlmIChtcGZfY21wIChyZXMxLCByZXMzKSAhPSAwKQorCSAgICBkdW1wX2Fib3J0IChkc3NfZnVuY19uYW1lc1tpXSwgcmVzMSwgcmVzMyk7CisJfQorCisgICAgICBpbjJpID0gdXJhbmRvbSAoKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRzaV9mdW5jcykgLyBzaXplb2YgKGRzaV9mdW5jKTsgaSsrKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgdGhpc19pbjJpID0gaW4yaTsKKworCSAgLyogRG9uJ3QgZGl2aWRlIGJ5IDAuICAqLworCSAgaWYgKGkgPT0gMCAmJiB0aGlzX2luMmkgPT0gMCkgLyogZHNpX2Z1bmNzW2ldID09IG1wZl9kaXZfdWkgKi8KKwkgICAgY29udGludWU7CisKKwkgIC8qIEF2b2lkIG92ZXJmbG93L3VuZGVyZmxvdyBpbiB0aGUgZXhwb25lbnQuICAqLworCSAgaWYgKGRzaV9mdW5jc1tpXSA9PSBtcGZfbXVsXzJleHAgfHwgZHNpX2Z1bmNzW2ldID09IG1wZl9kaXZfMmV4cCkKKwkgICAgdGhpc19pbjJpICU9IDB4MTAwMDAwOworCSAgZWxzZSBpZiAoZHNpX2Z1bmNzW2ldID09IG1wZl9wb3dfdWkpCisJICAgIHRoaXNfaW4yaSAlPSAweDEwMDA7CisKKwkgIChkc2lfZnVuY3NbaV0pIChyZXMxLCBpbjEsIHRoaXNfaW4yaSk7CisKKwkgIG1wZl9zZXQgKG91dDEsIGluMSk7CisJICAoZHNpX2Z1bmNzW2ldKSAob3V0MSwgb3V0MSwgdGhpc19pbjJpKTsKKwkgIG1wZl9zZXQgKHJlczIsIG91dDEpOworCisJICBpZiAobXBmX2NtcCAocmVzMSwgcmVzMikgIT0gMCkKKwkgICAgZHVtcF9hYm9ydCAoZHNpX2Z1bmNfbmFtZXNbaV0sIHJlczEsIHJlczIpOworCX0KKworICAgICAgaW4xaSA9IHVyYW5kb20gKCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkaXNfZnVuY3MpIC8gc2l6ZW9mIChkaXNfZnVuYyk7IGkrKykKKwl7CisJICAvKiBEb24ndCBkaXZpZGUgYnkgMC4gICovCisJICBpZiAoaSA9PSAwIC8qIGRpc19mdW5jc1tpXSA9PSBtcGZfdWlfZGl2ICovCisJICAgICAgJiYgbXBmX2NtcF91aSAoaW4yLCAwKSA9PSAwKQorCSAgICBjb250aW51ZTsKKworCSAgKGRpc19mdW5jc1tpXSkgKHJlczEsIGluMWksIGluMik7CisKKwkgIG1wZl9zZXQgKG91dDEsIGluMik7CisJICAoZGlzX2Z1bmNzW2ldKSAob3V0MSwgaW4xaSwgb3V0MSk7CisJICBtcGZfc2V0IChyZXMyLCBvdXQxKTsKKworCSAgaWYgKG1wZl9jbXAgKHJlczEsIHJlczIpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGRpc19mdW5jX25hbWVzW2ldLCByZXMxLCByZXMyKTsKKwl9CisKKyAgICB9CisKKyAgbXBmX2NsZWFyIChpbjEpOworICBtcGZfY2xlYXIgKGluMik7CisgIG1wZl9jbGVhciAob3V0MSk7CisgIG1wZl9jbGVhciAocmVzMSk7CisgIG1wZl9jbGVhciAocmVzMik7CisgIG1wZl9jbGVhciAocmVzMyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZHVtcF9hYm9ydCAoY29uc3QgY2hhciAqbmFtZSwgbXBmX3QgcmVzMSwgbXBmX3QgcmVzMikKK3sKKyAgcHJpbnRmICgiZmFpbHVyZSBpbiAlczpcbiIsIG5hbWUpOworICBtcGZfZHVtcCAocmVzMSk7CisgIG1wZl9kdW1wIChyZXMyKTsKKyAgYWJvcnQgKCk7Cit9CisKKyNpZiAwCit2b2lkIG1wZl9hYnMJCShtcGZfcHRyLCBtcGZfc3JjcHRyKTsKK3ZvaWQgbXBmX3NxcnQJCShtcGZfcHRyLCBtcGZfc3JjcHRyKTsKK3ZvaWQgbXBmX25lZwkJKG1wZl9wdHIsIG1wZl9zcmNwdHIpOworI2VuZGlmCisKKyNlbmRpZiAvKiAhIERMTF9FWFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWFkZC5jIGIvdGVzdHMvbXBmL3QtYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4YmJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LWFkZC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBUZXN0IG1wZl9hZGQuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTYKKyNlbmRpZgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfc2l6ZV90IHNpemU7CisgIG1wX2V4cF90IGV4cDsKKyAgaW50IHJlcHMgPSAyMDAwMDsKKyAgaW50IGk7CisgIG1wZl90IHUsIHYsIHcsIHdyZWY7CisgIG1wX3NpemVfdCBicHJlYyA9IDEwMDsKKyAgbXBmX3QgcmVyciwgbWF4X3JlcnIsIGxpbWl0X3JlcnI7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHsKKyAgICAgIHJlcHMgPSBzdHJ0b2wgKGFyZ3ZbMV0sIDAsIDApOworICAgICAgaWYgKGFyZ2MgPiAyKQorCWJwcmVjID0gc3RydG9sIChhcmd2WzJdLCAwLCAwKTsKKyAgICB9CisKKyAgbXBmX3NldF9kZWZhdWx0X3ByZWMgKGJwcmVjKTsKKworICBtcGZfaW5pdF9zZXRfdWkgKGxpbWl0X3JlcnIsIDEpOworICBtcGZfZGl2XzJleHAgKGxpbWl0X3JlcnIsIGxpbWl0X3JlcnIsIGJwcmVjKTsKKyNpZiBWRVJCT1NFCisgIG1wZl9kdW1wIChsaW1pdF9yZXJyKTsKKyNlbmRpZgorICBtcGZfaW5pdCAocmVycik7CisgIG1wZl9pbml0X3NldF91aSAobWF4X3JlcnIsIDApOworCisgIG1wZl9pbml0ICh1KTsKKyAgbXBmX2luaXQgKHYpOworICBtcGZfaW5pdCAodyk7CisgIG1wZl9pbml0ICh3cmVmKTsKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBzaXplID0gdXJhbmRvbSAoKSAlICgyICogU0laRSkgLSBTSVpFOworICAgICAgZXhwID0gdXJhbmRvbSAoKSAlIFNJWkU7CisgICAgICBtcGZfcmFuZG9tMiAodSwgc2l6ZSwgZXhwKTsKKworICAgICAgc2l6ZSA9IHVyYW5kb20gKCkgJSAoMiAqIFNJWkUpIC0gU0laRTsKKyAgICAgIGV4cCA9IHVyYW5kb20gKCkgJSBTSVpFOworICAgICAgbXBmX3JhbmRvbTIgKHYsIHNpemUsIGV4cCk7CisKKyAgICAgIG1wZl9hZGQgKHcsIHUsIHYpOworICAgICAgcmVmbXBmX2FkZCAod3JlZiwgdSwgdik7CisKKyAgICAgIG1wZl9yZWxkaWZmIChyZXJyLCB3LCB3cmVmKTsKKyAgICAgIGlmIChtcGZfY21wIChyZXJyLCBtYXhfcmVycikgPiAwKQorCXsKKwkgIG1wZl9zZXQgKG1heF9yZXJyLCByZXJyKTsKKyNpZiBWRVJCT1NFCisJICBtcGZfZHVtcCAobWF4X3JlcnIpOworI2VuZGlmCisJICBpZiAobXBmX2NtcCAocmVyciwgbGltaXRfcmVycikgPiAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1IgYWZ0ZXIgJWQgdGVzdHNcbiIsIGkpOworCSAgICAgIHByaW50ZiAoIiAgIHUgPSAiKTsgbXBmX2R1bXAgKHUpOworCSAgICAgIHByaW50ZiAoIiAgIHYgPSAiKTsgbXBmX2R1bXAgKHYpOworCSAgICAgIHByaW50ZiAoIndyZWYgPSAiKTsgbXBmX2R1bXAgKHdyZWYpOworCSAgICAgIHByaW50ZiAoIiAgIHcgPSAiKTsgbXBmX2R1bXAgKHcpOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJfQorICAgIH0KKworICBtcGZfY2xlYXIgKGxpbWl0X3JlcnIpOworICBtcGZfY2xlYXIgKHJlcnIpOworICBtcGZfY2xlYXIgKG1heF9yZXJyKTsKKworICBtcGZfY2xlYXIgKHUpOworICBtcGZfY2xlYXIgKHYpOworICBtcGZfY2xlYXIgKHcpOworICBtcGZfY2xlYXIgKHdyZWYpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcGYvdC1jbXBfZC5jIGIvdGVzdHMvbXBmL3QtY21wX2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNjMDkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtY21wX2QuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogVGVzdCBtcGZfY21wX2QuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAzLCAyMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisjZGVmaW5lIFNHTihuKSAgKChuKSA+IDAgPyAxIDogKG4pIDwgMCA/IC0xIDogMCkKKwordm9pZAorY2hlY2tfb25lIChjb25zdCBjaGFyICpuYW1lLCBtcGZfc3JjcHRyIHgsIGRvdWJsZSB5LCBpbnQgY21wKQoreworICBpbnQgICBnb3Q7CisKKyAgZ290ID0gbXBmX2NtcF9kICh4LCB5KTsKKyAgaWYgKFNHTihnb3QpICE9IGNtcCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHByaW50ZiAgICAoIm1wZl9jbXBfZCB3cm9uZyAoZnJvbSAlcylcbiIsIG5hbWUpOworICAgICAgcHJpbnRmICAgICgiICBnb3QgICVkXG4iLCBnb3QpOworICAgICAgcHJpbnRmICAgICgiICB3YW50ICVkXG4iLCBjbXApOworICAgICAgbXBmX3RyYWNlICgiICB4IiwgeCk7CisgICAgICBwcmludGYgICAgKCIgIHkgJWdcbiIsIHkpOworICAgICAgbXBfdHJhY2VfYmFzZT0tMTY7CisgICAgICBtcGZfdHJhY2UgKCIgIHgiLCB4KTsKKyAgICAgIHByaW50ZiAgICAoIiAgeSAlZ1xuIiwgeSk7CisgICAgICBwcmludGYgICAgKCIgIHkiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoeSk7IGkrKykKKyAgICAgICAgcHJpbnRmICgiICUwMlgiLCAodW5zaWduZWQpICgodW5zaWduZWQgY2hhciAqKSAmeSlbaV0pOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfaW5maW5pdHkgKHZvaWQpCit7CisgIG1wZl90ICAgeDsKKyAgZG91YmxlICB5ID0gdGVzdHNfaW5maW5pdHlfZCAoKTsKKyAgaWYgKHkgPT0gMC4wKQorICAgIHJldHVybjsKKworICBtcGZfaW5pdCAoeCk7CisKKyAgLyogMCBjbXAgaW5mICovCisgIG1wZl9zZXRfdWkgKHgsIDBMKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAgeSwgLTEpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsIC15LCAgMSk7CisKKyAgLyogMTIzIGNtcCBpbmYgKi8KKyAgbXBmX3NldF91aSAoeCwgMTIzTCk7CisgIGNoZWNrX29uZSAoImNoZWNrX2luZmluaXR5IiwgeCwgIHksIC0xKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAteSwgIDEpOworCisgIC8qIC0xMjMgY21wIGluZiAqLworICBtcGZfc2V0X3NpICh4LCAtMTIzTCk7CisgIGNoZWNrX29uZSAoImNoZWNrX2luZmluaXR5IiwgeCwgIHksIC0xKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAteSwgIDEpOworCisgIC8qIDJeNTAwMCBjbXAgaW5mICovCisgIG1wZl9zZXRfdWkgKHgsIDFMKTsKKyAgbXBmX211bF8yZXhwICh4LCB4LCA1MDAwTCk7CisgIGNoZWNrX29uZSAoImNoZWNrX2luZmluaXR5IiwgeCwgIHksIC0xKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAteSwgIDEpOworCisgIC8qIC0yXjUwMDAgY21wIGluZiAqLworICBtcGZfbmVnICh4LCB4KTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAgeSwgLTEpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsIC15LCAgMSk7CisKKyAgbXBmX2NsZWFyICh4KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19pbmZpbml0eSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtY21wX3NpLmMgYi90ZXN0cy9tcGYvdC1jbXBfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY3Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtY21wX3NpLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIFRlc3QgbXBmX2NtcF9zaSBhbmQgbXBmX2NtcF96LgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwNCwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjZGVmaW5lIFNHTih4KSAgICAgICAoKHgpIDwgMCA/IC0xIDogKHgpID09IDAgPyAwIDogMSkKKwordm9pZAorY2hlY2tfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgYV9iYXNlOworICAgIGNvbnN0IGNoYXIgICphOworICAgIGNvbnN0IGNoYXIgICpiOworICAgIGludCAgICAgICAgIHdhbnQ7CisgIH0gZGF0YVtdID0geworICAgIHsgMTAsICIwIiwgICIxIiwgLTEgfSwKKyAgICB7IDEwLCAiMCIsICAiMCIsICAwIH0sCisgICAgeyAxMCwgIjAiLCAiLTEiLCAgMSB9LAorCisgICAgeyAxMCwgIjEiLCAgIjEiLCAwIH0sCisgICAgeyAxMCwgIjEiLCAgIjAiLCAxIH0sCisgICAgeyAxMCwgIjEiLCAiLTEiLCAxIH0sCisKKyAgICB7IDEwLCAiLTEiLCAgIjEiLCAtMSB9LAorICAgIHsgMTAsICItMSIsICAiMCIsIC0xIH0sCisgICAgeyAxMCwgIi0xIiwgIi0xIiwgMCB9LAorCisgICAgeyAxMCwgIjEuNSIsICIyIiwgLTEgfSwKKyAgICB7IDEwLCAiMS41IiwgIjEiLCAgMSB9LAorICAgIHsgMTAsICIwLjUiLCAiMSIsIC0xIH0sCisKKyAgICB7IDEwLCAiLTEuNSIsICItMiIsICAxIH0sCisgICAgeyAxMCwgIi0xLjUiLCAiLTEiLCAtMSB9LAorICAgIHsgMTAsICItMC41IiwgIi0xIiwgIDEgfSwKKworICAgIHsgMTYsICAgICAgICAgIjAiLCAiLTB4ODAwMDAwMDAiLCAgMSB9LAorICAgIHsgMTYsICAiODAwMDAwMDAiLCAiLTB4ODAwMDAwMDAiLCAgMSB9LAorICAgIHsgMTYsICAiODAwMDAwMDEiLCAiLTB4ODAwMDAwMDAiLCAgMSB9LAorICAgIHsgMTYsICItODAwMDAwMDAiLCAiLTB4ODAwMDAwMDAiLCAgMCB9LAorICAgIHsgMTYsICItODAwMDAwMDEiLCAiLTB4ODAwMDAwMDAiLCAtMSB9LAorICAgIHsgMTYsICItRkYwMDgwMDAwMDAxIiwgIi0weDgwMDAwMDAwIiwgLTEgfSwKKworICAgIHsgMTYsICAgICAgICAgICAgICAgICAiMCIsICItMHg4MDAwMDAwMDAwMDAwMDAwIiwgIDEgfSwKKyAgICB7IDE2LCAgIjgwMDAwMDAwMDAwMDAwMDAiLCAiLTB4ODAwMDAwMDAwMDAwMDAwMCIsICAxIH0sCisgICAgeyAxNiwgICI4MDAwMDAwMDAwMDAwMDAxIiwgIi0weDgwMDAwMDAwMDAwMDAwMDAiLCAgMSB9LAorICAgIHsgMTYsICItODAwMDAwMDAwMDAwMDAwMCIsICItMHg4MDAwMDAwMDAwMDAwMDAwIiwgIDAgfSwKKyAgICB7IDE2LCAiLTgwMDAwMDAwMDAwMDAwMDAuMSIsICItMHg4MDAwMDAwMDAwMDAwMDAwIiwgLTEgfSwKKyAgICB7IDE2LCAiLUZGMDA4MDAwMDAwMDAwMDAwMDAxIiwgIi0weDgwMDAwMDAwMDAwMDAwMDAiLCAtMSB9LAorCisgICAgeyAxNiwgICAgICAgICAgICAgICAgICIwIiwgIi0weDg3NjU0MzIxMEZFRENCQTk4NzY1NDMyMTAwMDAwMDAiLCAgMSB9LAorICAgIHsgMTYsICAiODc2NTQzMjEwRkVEQ0JBOTg3NjU0MzIxMDAwMDAwMCIsICItMHg4NzY1NDMyMTBGRURDQkE5ODc2NTQzMjEwMDAwMDAwIiwgIDEgfSwKKyAgICB7IDE2LCAgIjg3NjU0MzIxMEZFRENCQTk4NzY1NDMyMTAwMDAwMDEiLCAiLTB4ODc2NTQzMjEwRkVEQ0JBOTg3NjU0MzIxMDAwMDAwMCIsICAxIH0sCisgICAgeyAxNiwgIi04NzY1NDMyMTBGRURDQkE5ODc2NTQzMjEwMDAwMDAwIiwgIi0weDg3NjU0MzIxMEZFRENCQTk4NzY1NDMyMTAwMDAwMDAiLCAgMCB9LAorICAgIHsgMTYsICItODc2NTQzMjEwRkVEQ0JBOTg3NjU0MzIxMDAwMDAwMC4xIiwgIi0weDg3NjU0MzIxMEZFRENCQTk4NzY1NDMyMTAwMDAwMDAiLCAtMSB9LAorICAgIHsgMTYsICItRkYwMDg3NjU0MzIxMEZFRENCQTk4NzY1NDMyMTAwMDAwMDAiLCAiLTB4ODc2NTQzMjEwRkVEQ0JBOTg3NjU0MzIxMDAwMDAwMCIsIC0xIH0sCisgIH07CisKKyAgbXBmX3QgIGE7CisgIG1wel90ICBiejsKKyAgbG9uZyAgIGI7CisgIGludCAgICBnb3Q7CisgIGludCAgICBpOworCisgIG1wZl9pbml0MiAoYSwgMTI4KTsKKyAgbXB6X2luaXQgKGJ6KTsKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wZl9zZXRfc3RyX29yX2Fib3J0IChhLCBkYXRhW2ldLmEsIGRhdGFbaV0uYV9iYXNlKTsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChieiwgZGF0YVtpXS5iLCAwKTsKKworICAgICAgaWYgKG1wel9maXRzX3Nsb25nX3AgKGJ6KSkKKyAgICAgICAgeworICAgICAgICAgIGIgPSBtcHpfZ2V0X3NpIChieik7CisgICAgICAgICAgZ290ID0gbXBmX2NtcF9zaSAoYSwgYik7CisgICAgICAgICAgaWYgKFNHTiAoZ290KSAhPSBkYXRhW2ldLndhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIm1wZl9jbXBfc2kgd3Jvbmcgb24gZGF0YVslZF1cbiIsIGkpOworICAgICAgICAgICAgICBwcmludGYgKCIgIGE9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAwLCBhKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICglcylcbiIsIGRhdGFbaV0uYSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgYj0lbGQgKCVzKVxuIiwgYiwgZGF0YVtpXS5iKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICBnb3Q9JWRcbiIsIGdvdCk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgd2FudD0lZFxuIiwgZGF0YVtpXS53YW50KTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBnb3QgPSBtcGZfY21wX3ogKGEsIGJ6KTsKKyAgICAgIGlmIChTR04gKGdvdCkgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIGIgPSBtcHpfZ2V0X3NpIChieik7CisJICBwcmludGYgKCJtcGZfY21wX3ogd3Jvbmcgb24gZGF0YVslZF1cbiIsIGkpOworCSAgcHJpbnRmICgiICBhPSIpOyBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgMCwgYSk7CisJICBwcmludGYgKCIgKCVzKVxuIiwgZGF0YVtpXS5hKTsKKwkgIHByaW50ZiAoIiAgYj0lbGQgKCVzKVxuIiwgYiwgZGF0YVtpXS5iKTsKKwkgIHByaW50ZiAoIiAgZ290PSVkXG4iLCBnb3QpOworCSAgcHJpbnRmICgiICB3YW50PSVkXG4iLCBkYXRhW2ldLndhbnQpOworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorCisgIG1wZl9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYnopOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWNvbnYuYyBiL3Rlc3RzL21wZi90LWNvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk5MmFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtY29udi5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiBUZXN0IG1wZl9nZXRfc3RyIGFuZCBtcGZfc2V0X3N0ci4KKworQ29weXJpZ2h0IDE5OTYsIDIwMDAsIDIwMDEsIDIwMDgsIDIwMTksIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBmb3Igc3RybGVuICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwCisjZW5kaWYKKworI2lmbmRlZiBFWFBPCisjZGVmaW5lIEVYUE8gMjAwCisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wZl90IHgsIHk7CisgIGludCByZXBzID0gMjAwMDA7CisgIGludCBpOworICBtcF9zaXplX3QgYnByZWMgPSAxMDA7CisgIG1wZl90IGQsIHJlcnIsIG1heF9yZXJyLCBsaW1pdF9yZXJyOworICBjaGFyICpzdHI7CisgIG1wX2V4cF90IGJleHA7CisgIGxvbmcgc2l6ZSwgZXhwOworICBpbnQgYmFzZTsKKyAgY2hhciBidWZbU0laRSAqIEdNUF9MSU1CX0JJVFMgKyA1XTsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgcmVwcyA9IHN0cnRvbCAoYXJndlsxXSwgMCwgMCk7CisgICAgICBpZiAoYXJnYyA+IDIpCisJYnByZWMgPSBzdHJ0b2wgKGFyZ3ZbMl0sIDAsIDApOworICAgIH0KKworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyAoYnByZWMpOworCisgIG1wZl9pbml0X3NldF91aSAobGltaXRfcmVyciwgMSk7CisgIG1wZl9kaXZfMmV4cCAobGltaXRfcmVyciwgbGltaXRfcmVyciwgYnByZWMpOworI2lmIFZFUkJPU0UKKyAgbXBmX2R1bXAgKGxpbWl0X3JlcnIpOworI2VuZGlmCisgIG1wZl9pbml0IChyZXJyKTsKKyAgbXBmX2luaXRfc2V0X3VpIChtYXhfcmVyciwgMCk7CisKKyAgbXBmX2luaXQgKHgpOworICBtcGZfaW5pdCAoeSk7CisgIG1wZl9pbml0IChkKTsKKworICAvKiBGaXJzdCB0ZXN0IHNvbWUgc3BlY2lmaWMgdmFsdWVzLiAgKi8KKworICBtcGZfc2V0X3N0ciAoeSwgIjEuMjM0NTYiLCAwKTsKKyAgbXBmX3NldF9zdHIgKHgsICIxLjIzNDU2IiwgMTApOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEuMjM0NTYiLCAxMCk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NmU0MCIsIDEwKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTZlNDAiLCAxMCk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NmUyMSIsIDEwKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworCisgIG1wZl9zZXRfc3RyICh5LCAiMS4yMzQ1NmUxMDAwIiwgMCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMS4yMzQ1NmUxMDAwIiwgMTApOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIxLjIzNDU2ZSsxMDAwIiwgMCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjEuMjM0NTZlKzEwMDAiLCAxMCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxLjIzNDU2ZSsxMDAwIiwgMTApOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTZlKzEwNDAiLCAxMCk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2ZSsxMDQwIiwgMTApOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTZlKzEwMjEiLCAxMCk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBtcGZfc2V0X3N0ciAoeSwgIjEuMjM0NTYiLCAxNik7CisgIG1wZl9zZXRfc3RyICh4LCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEuMjM0NTYiLCAxNik7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NkAyOCIsIDE2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTZAMjgiLCAxNik7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NkAxNSIsIDE2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworCisgIG1wZl9zZXRfc3RyICh5LCAiICAgMCIsIDEwKTsKKyAgbXBmX3NldF9zdHIgKHgsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDEwKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuIiwgMTApOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAiLCAxMCk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDEwKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMTApOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisKKyAgbXBmX3NldF9zdHIgKHgsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDE2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuIiwgMTYpOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAiLCAxNik7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgbXBmX3NldF9zdHIgKHgsICIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDE2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMTYpOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZS0zNDUiLCA5KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIi0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLkBBQiIsIDI2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgIGlmIChtcGZfY21wICh4LCB5KSAhPSAwKQorICAgIGFib3J0ICgpOworICBtcGZfc2V0X3N0ciAoeCwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wQDc4IiwgMTkpOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiKy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZTU1NSIsIDYpOworICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKyAgaWYgKG1wZl9jbXAgKHgsIHkpICE9IDApCisgICAgYWJvcnQgKCk7CisgIG1wZl9zZXRfc3RyICh4LCAiLTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQC1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiLCAxNyk7CisgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICBpZiAobXBmX2NtcCAoeCwgeSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICAvKiBOb3cgdGVzdCByYW5kb20gdmFsdWVzLiAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIGlmIChpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBleGVyY2lzZSB0aGUgc3BlY2lhbCBjYXNlIGluIGdldF9zdHIgZm9yIGZvciB4PT0wICovCisgICAgICAgICAgbXBmX3NldF91aSAoeCwgMEwpOworICAgICAgICAgIGJhc2UgPSAwOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzaXplID0gdXJhbmRvbSAoKSAlICgyICogU0laRSkgLSBTSVpFOworICAgICAgICAgIGV4cCA9IHVyYW5kb20gKCkgJSBFWFBPOworICAgICAgICAgIG1wZl9yYW5kb20yICh4LCBzaXplLCBleHApOworICAgICAgICAgIGJhc2UgPSB1cmFuZG9tICgpICUgNjI7CisgICAgICAgICAgYmFzZSArPSBiYXNlID4gMDsKKyAgICAgICAgfQorCisgICAgICBzdHIgPSBtcGZfZ2V0X3N0ciAoMCwgJmJleHAsIGJhc2UsIDAsIHgpOworCisgICAgICBpZiAoc3RyWzBdID09ICctJykKKwlzcHJpbnRmIChidWYsICItMC4lc0AlbGQiLCBzdHIgKyAxLCBiZXhwKTsKKyAgICAgIGVsc2UKKwlzcHJpbnRmIChidWYsICIwLiVzQCVsZCIsIHN0ciwgYmV4cCk7CisKKyAgICAgIG1wZl9zZXRfc3RyX29yX2Fib3J0ICh5LCBidWYsIC1iYXNlKTsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAoc3RyLCBzdHJsZW4gKHN0cikgKyAxKTsKKworICAgICAgbXBmX3JlbGRpZmYgKHJlcnIsIHgsIHkpOworICAgICAgaWYgKG1wZl9jbXAgKHJlcnIsIG1heF9yZXJyKSA+IDApCisJeworCSAgbXBmX3NldCAobWF4X3JlcnIsIHJlcnIpOworI2lmIFZFUkJPU0UKKwkgIG1wZl9kdW1wIChtYXhfcmVycik7CisjZW5kaWYKKwkgIGlmIChtcGZfY21wIChyZXJyLCBsaW1pdF9yZXJyKSA+IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJFUlJPUiBhZnRlciAlZCB0ZXN0c1xuIiwgaSk7CisJICAgICAgcHJpbnRmICgiYmFzZSA9ICVkXG4iLCBiYXNlKTsKKwkgICAgICBwcmludGYgKCIgICB4ID0gIik7IG1wZl9kdW1wICh4KTsKKwkgICAgICBwcmludGYgKCIgICB5ID0gIik7IG1wZl9kdW1wICh5KTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChsaW1pdF9yZXJyKTsKKyAgbXBmX2NsZWFyIChyZXJyKTsKKyAgbXBmX2NsZWFyIChtYXhfcmVycik7CisKKyAgbXBmX2NsZWFyICh4KTsKKyAgbXBmX2NsZWFyICh5KTsKKyAgbXBmX2NsZWFyIChkKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtZGl2LmMgYi90ZXN0cy9tcGYvdC1kaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjE0NTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtZGl2LmMKQEAgLTAsMCArMSwxODUgQEAKKy8qIFRlc3QgbXBmX2Rpdi4KKworQ29weXJpZ2h0IDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKGNvbnN0IGNoYXIgKmRlc2MsIG1wZl9wdHIgZ290LCBtcGZfc3JjcHRyIHUsIG1wZl9zcmNwdHIgdikKK3sKKyAgaWYgKCEgcmVmbXBmX3ZhbGlkYXRlX2RpdmlzaW9uICgibXBmX2RpdiIsIGdvdCwgdSwgdikpCisgICAgeworICAgICAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKyAgICAgIG1wZl90cmFjZSAoIiAgdSIsIHUpOworICAgICAgbXBmX3RyYWNlICgiICB2Iiwgdik7CisgICAgICBwcmludGYgICAgKCIgICVzXG4iLCBkZXNjKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgbWluX3ByZWMgPSBfX0dNUEZfQklUU19UT19QUkVDICgxKTsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzID0gUkFORFM7CisgIHVuc2lnbmVkIGxvbmcgIHByZWM7CisgIG1wZl90ICBnb3QsIHUsIHY7CisgIGludCAgICBpOworCisgIG1wZl9pbml0IChnb3QpOworICBtcGZfaW5pdCAodSk7CisgIG1wZl9pbml0ICh2KTsKKworICAvKiBzZXBhcmF0ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgeworICAgICAgLyogZ290IHByZWNpc2lvbiAqLworICAgICAgcHJlYyA9IG1pbl9wcmVjICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgMTVMKTsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAoZ290LCBwcmVjKTsKKworICAgICAgLyogdSAqLworICAgICAgcHJlYyA9IG1pbl9wcmVjICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgMTVMKTsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAodSwgcHJlYyk7CisgICAgICBkbyB7CisgICAgICAgIG1wZl9yYW5kb20yICh1LCBQUkVDKHUpLCAobXBfZXhwX3QpIDIwKTsKKyAgICAgIH0gd2hpbGUgKFNJWih1KSA9PSAwKTsKKyAgICAgIGlmIChnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLCAxTCkpCisgICAgICAgIG1wZl9uZWcgKHUsIHUpOworCisgICAgICAvKiB2ICovCisgICAgICBwcmVjID0gbWluX3ByZWMgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAxNUwpOworICAgICAgcmVmbXBmX3NldF9wcmVjX2xpbWJzICh2LCBwcmVjKTsKKyAgICAgIGRvIHsKKyAgICAgICAgbXBmX3JhbmRvbTIgKHYsIFBSRUModiksIChtcF9leHBfdCkgMjApOworICAgICAgfSB3aGlsZSAoU0laKHYpID09IDApOworICAgICAgaWYgKGdtcF91cmFuZG9tYl91aSAocmFuZHMsIDFMKSkKKyAgICAgICAgbXBmX25lZyAodiwgdik7CisKKyAgICAgIHN3aXRjaCAoaSAlIDMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgbXBmX2RpdiAoZ290LCB1LCB2KTsKKyAgICAgICAgY2hlY2tfb25lICgic2VwYXJhdGUiLCBnb3QsIHUsIHYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcHJlYyA9IHJlZm1wZl9zZXRfb3ZlcmxhcCAoZ290LCB1KTsKKyAgICAgICAgbXBmX2RpdiAoZ290LCBnb3QsIHYpOworICAgICAgICBjaGVja19vbmUgKCJkc3QgPT0gdSIsIGdvdCwgdSwgdik7CisgICAgICAgIG1wZl9zZXRfcHJlY19yYXcgKGdvdCwgcHJlYyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBwcmVjID0gcmVmbXBmX3NldF9vdmVybGFwIChnb3QsIHYpOworICAgICAgICBtcGZfZGl2IChnb3QsIHUsIGdvdCk7CisgICAgICAgIGNoZWNrX29uZSAoImRzdCA9PSB2IiwgZ290LCB1LCB2KTsKKyAgICAgICAgbXBmX3NldF9wcmVjX3JhdyAoZ290LCBwcmVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoZ290KTsKKyAgbXBmX2NsZWFyICh1KTsKKyAgbXBmX2NsZWFyICh2KTsKK30KKworLyogRXhlcmNpc2UgY2FsbHMgbXBmKHgseCx4KSAqLwordm9pZAorY2hlY2tfcmV1c2VfdGhyZWUgKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgIG1pbl9wcmVjID0gX19HTVBGX0JJVFNfVE9fUFJFQyAoMSk7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kcyA9IFJBTkRTOworICB1bnNpZ25lZCBsb25nICByZXN1bHRfcHJlYywgaW5wdXRfcHJlYywgc2V0X3ByZWM7CisgIG1wZl90ICBnb3Q7CisgIGludCAgICBpOworCisgIG1wZl9pbml0IChnb3QpOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgcmVzdWx0X3ByZWMgPSBtaW5fcHJlYyArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDE1TCk7CisgICAgICBpbnB1dF9wcmVjID0gbWluX3ByZWMgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAxNUwpOworCisgICAgICBzZXRfcHJlYyA9IE1BWCAocmVzdWx0X3ByZWMsIGlucHV0X3ByZWMpOworICAgICAgcmVmbXBmX3NldF9wcmVjX2xpbWJzIChnb3QsIHNldF9wcmVjKTsKKworICAgICAgLyogaW5wdXQsIG5vbi16ZXJvLCBwb3NzaWJseSBuZWdhdGl2ZSAqLworICAgICAgUFJFQyhnb3QpID0gaW5wdXRfcHJlYzsKKyAgICAgIGRvIHsKKyAgICAgICAgbXBmX3JhbmRvbTIgKGdvdCwgaW5wdXRfcHJlYywgKG1wX2V4cF90KSAyMCk7CisgICAgICB9IHdoaWxlIChTSVooZ290KSA9PSAwKTsKKyAgICAgIGlmIChnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLCAxTCkpCisgICAgICAgIG1wZl9uZWcgKGdvdCwgZ290KTsKKworICAgICAgUFJFQyhnb3QpID0gcmVzdWx0X3ByZWM7CisKKyAgICAgIG1wZl9kaXYgKGdvdCwgZ290LCBnb3QpOworCisgICAgICAvKiBleHBlY3QgZXhhY3RseSAxLjAgYWx3YXlzICovCisgICAgICBBU1NFUlRfQUxXQVlTIChtcGZfY21wX3VpIChnb3QsIDFMKSA9PSAwKTsKKworICAgICAgUFJFQyhnb3QpID0gc2V0X3ByZWM7CisgICAgfQorCisgIG1wZl9jbGVhciAoZ290KTsKK30KKwordm9pZAorY2hlY2tfdmFyaW91cyAodm9pZCkKK3sKKyAgbXBmX3QgZ290LCB1LCB2OworCisgIG1wZl9pbml0IChnb3QpOworICBtcGZfaW5pdCAodSk7CisgIG1wZl9pbml0ICh2KTsKKworICAvKiAxMDAvNCA9PSAyNSAqLworICBtcGZfc2V0X3ByZWMgKGdvdCwgMjBMKTsKKyAgbXBmX3NldF91aSAodSwgMTAwTCk7CisgIG1wZl9zZXRfdWkgKHYsIDRMKTsKKyAgbXBmX2RpdiAoZ290LCB1LCB2KTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgQVNTRVJUX0FMV0FZUyAobXBmX2NtcF91aSAoZ290LCAyNUwpID09IDApOworCisgIC8qIDEvKDJebisxKSwgYSBjYXNlIHdoZXJlIHRydW5jYXRpbmcgdGhlIGRpdmlzb3Igd291bGQgYmUgd3JvbmcgKi8KKyAgbXBmX3NldF9wcmVjIChnb3QsIDUwMEwpOworICBtcGZfc2V0X3ByZWMgKHYsIDkwMEwpOworICBtcGZfc2V0X3VpICh2LCAxTCk7CisgIG1wZl9tdWxfMmV4cCAodiwgdiwgODAwTCk7CisgIG1wZl9hZGRfdWkgKHYsIHYsIDFMKTsKKyAgbXBmX2RpdiAoZ290LCB1LCB2KTsKKyAgY2hlY2tfb25lICgiMS8yXm4rMSwgc2VwYXJhdGUiLCBnb3QsIHUsIHYpOworCisgIG1wZl9jbGVhciAoZ290KTsKKyAgbXBmX2NsZWFyICh1KTsKKyAgbXBmX2NsZWFyICh2KTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja192YXJpb3VzICgpOworICBjaGVja19yYW5kICgpOworICBjaGVja19yZXVzZV90aHJlZSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtZG0yZXhwLmMgYi90ZXN0cy9tcGYvdC1kbTJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdjOWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtZG0yZXhwLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIFRlc3QgbXBmX2RpdiwgbXBmX2Rpdl8yZXhwLCBtcGZfbXVsXzJleHAuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTYKKyNlbmRpZgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IHJlcHMgPSAxMDAwMDA7CisgIGludCBpOworICBtcGZfdCB1LCB2LCB3MSwgdzIsIHczOworICBtcF9zaXplX3QgYnByZWMgPSAxMDA7CisgIG1wZl90IHJlcnIsIGxpbWl0X3JlcnI7CisgIG1wX3NpemVfdCB1bjsKKyAgbXBfZXhwX3QgdWU7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHsKKyAgICAgIHJlcHMgPSBzdHJ0b2wgKGFyZ3ZbMV0sIDAsIDApOworICAgICAgaWYgKGFyZ2MgPiAyKQorCWJwcmVjID0gc3RydG9sIChhcmd2WzJdLCAwLCAwKTsKKyAgICB9CisKKyAgbXBmX3NldF9kZWZhdWx0X3ByZWMgKGJwcmVjKTsKKworICBtcGZfaW5pdCAocmVycik7CisgIG1wZl9pbml0IChsaW1pdF9yZXJyKTsKKworICBtcGZfaW5pdCAodSk7CisgIG1wZl9pbml0ICh2KTsKKyAgbXBmX2luaXQgKHcxKTsKKyAgbXBmX2luaXQgKHcyKTsKKyAgbXBmX2luaXQgKHczKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlc19wcmVjOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgcG93MjsKKworICAgICAgcmVzX3ByZWMgPSB1cmFuZG9tICgpICUgKGJwcmVjICsgMTAwKTsKKyAgICAgIG1wZl9zZXRfcHJlYyAodzEsIHJlc19wcmVjKTsKKyAgICAgIG1wZl9zZXRfcHJlYyAodzIsIHJlc19wcmVjKTsKKyAgICAgIG1wZl9zZXRfcHJlYyAodzMsIHJlc19wcmVjKTsKKworICAgICAgbXBmX3NldF91aSAobGltaXRfcmVyciwgMSk7CisgICAgICBtcGZfZGl2XzJleHAgKGxpbWl0X3JlcnIsIGxpbWl0X3JlcnIsIHJlc19wcmVjKTsKKworICAgICAgcG93MiA9IHVyYW5kb20gKCkgJSAweDEwMDAwOworICAgICAgbXBmX3NldF91aSAodiwgMSk7CisgICAgICBtcGZfbXVsXzJleHAgKHYsIHYsIHBvdzIpOworCisgICAgICB1biA9IHVyYW5kb20gKCkgJSAoMiAqIFNJWkUpIC0gU0laRTsKKyAgICAgIHVlID0gdXJhbmRvbSAoKSAlIFNJWkU7CisgICAgICBtcGZfcmFuZG9tMiAodSwgdW4sIHVlKTsKKworICAgICAgbXBmX2Rpdl8yZXhwICh3MSwgdSwgcG93Mik7CisgICAgICBtcGZfZGl2ICh3MiwgdSwgdik7CisgICAgICBtcGZfcmVsZGlmZiAocmVyciwgdzEsIHcyKTsKKyAgICAgIGlmIChtcGZfY21wIChyZXJyLCBsaW1pdF9yZXJyKSA+IDApCisJeworCSAgcHJpbnRmICgiRVJST1IgaW4gbXBmX2RpdiBvciBtcGZfZGl2XzJleHAgYWZ0ZXIgJWQgdGVzdHNcbiIsIGkpOworCSAgcHJpbnRmICgiICAgdSA9ICIpOyBtcGZfZHVtcCAodSk7CisJICBwcmludGYgKCIgICB2ID0gIik7IG1wZl9kdW1wICh2KTsKKwkgIHByaW50ZiAoIiAgdzEgPSAiKTsgbXBmX2R1bXAgKHcxKTsKKwkgIHByaW50ZiAoIiAgdzIgPSAiKTsgbXBmX2R1bXAgKHcyKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIG1wZl9tdWxfMmV4cCAodzMsIHcxLCBwb3cyKTsKKyAgICAgIG1wZl9yZWxkaWZmIChyZXJyLCB1LCB3Myk7CisgICAgICBpZiAobXBmX2NtcCAocmVyciwgbGltaXRfcmVycikgPiAwKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SIGluIG1wZl9tdWxfMmV4cCBhZnRlciAlZCB0ZXN0c1xuIiwgaSk7CisJICBwcmludGYgKCIgICB1ID0gIik7IG1wZl9kdW1wICh1KTsKKwkgIHByaW50ZiAoIiAgIHYgPSAiKTsgbXBmX2R1bXAgKHYpOworCSAgcHJpbnRmICgiICB3MSA9ICIpOyBtcGZfZHVtcCAodzEpOworCSAgcHJpbnRmICgiICB3MyA9ICIpOyBtcGZfZHVtcCAodzMpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBtcGZfY2xlYXIgKHJlcnIpOworICBtcGZfY2xlYXIgKGxpbWl0X3JlcnIpOworCisgIG1wZl9jbGVhciAodSk7CisgIG1wZl9jbGVhciAodik7CisgIG1wZl9jbGVhciAodzEpOworICBtcGZfY2xlYXIgKHcyKTsKKyAgbXBmX2NsZWFyICh3Myk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWVxLmMgYi90ZXN0cy9tcGYvdC1lcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODBiMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcGYvdC1lcS5jCkBAIC0wLDAgKzEsMjE3IEBACisvKiBUZXN0IG1wZl9lcS4KKworQ29weXJpZ2h0IDIwMDksIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjZGVmaW5lIFNaICgyICogc2l6ZW9mKG1wX2xpbWJfdCkpCisKK3ZvaWQgaW5zZXJ0X3JhbmRvbV9sb3dfemVyb19saW1icyAobXBmX3QsIGdtcF9yYW5kc3RhdGVfcHRyKTsKK3ZvaWQgZHVtcF9hYm9ydCAobXBmX3QsIG1wZl90LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgbG9uZyk7Cit2b2lkIGhleGR1bXAgKG1wZl90KTsKKwordm9pZAorY2hlY2tfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgc3RydWN0IHsKKyAgICAgIGludCAgICAgICAgZXhwLCBzaXplOworICAgICAgbXBfbGltYl90ICBkWzEwXTsKKyAgICB9IHgsIHk7CisgICAgbXBfYml0Y250X3QgYml0czsKKyAgICBpbnQgd2FudDsKKworICB9IGRhdGFbXSA9IHsKKyAgICB7IHsgMCwgMCwgeyAwIH0gfSwgICAgICAgICAgICAgeyAwLCAwLCB7IDAgfSB9LCAgICAwLCAxIH0sCisKKyAgICB7IHsgMCwgMSwgeyA3IH0gfSwgICAgICAgICAgICAgeyAwLCAxLCB7IDcgfSB9LCAgICAwLCAxIH0sCisgICAgeyB7IDAsIDEsIHsgNyB9IH0sICAgICAgICAgICAgIHsgMCwgMSwgeyA3IH0gfSwgICAxNywgMSB9LAorICAgIHsgeyAwLCAxLCB7IDcgfSB9LCAgICAgICAgICAgICB7IDAsIDEsIHsgNyB9IH0sIDQ3MTEsIDEgfSwKKworICAgIHsgeyAwLCAxLCB7IDcgfSB9LCAgICAgICAgICAgICB7IDAsIDEsIHsgNiB9IH0sICAgIDAsIDEgfSwKKyAgICB7IHsgMCwgMSwgeyA3IH0gfSwgICAgICAgICAgICAgeyAwLCAxLCB7IDYgfSB9LCAgICAyLCAxIH0sCisgICAgeyB7IDAsIDEsIHsgNyB9IH0sICAgICAgICAgICAgIHsgMCwgMSwgeyA2IH0gfSwgICAgMywgMCB9LAorCisgICAgeyB7IDAsIDAsIHsgMCB9IH0sICAgICAgICAgICAgIHsgMCwgMSwgeyAxIH0gfSwgICAgMCwgMCB9LAorICAgIHsgeyAwLCAxLCB7IDEgfSB9LCAgICAgICAgICAgICB7IDAsLTEgLHsgMSB9IH0sICAgIDAsIDAgfSwKKyAgICB7IHsgMSwgMSwgeyAxIH0gfSwgICAgICAgICAgICAgeyAwLCAxLCB7IDEgfSB9LCAgICAwLCAwIH0sCisKKyAgICB7IHsgMCwgMSwgeyA4IH0gfSwgICAgICAgICAgICAgeyAwLCAxLCB7IDQgfSB9LCAgICAwLCAwIH0sCisKKyAgICB7IHsgMCwgMiwgeyAwLCAzIH0gfSwgICAgICAgICAgeyAwLCAxLCB7IDMgfSB9LCAxMDAwLCAxIH0sCisgIH07CisKKyAgbXBmX3QgIHgsIHk7CisgIGludCBnb3QsIGdvdF9zd2FwcGVkOworICBpbnQgaTsKKyAgbXBfdHJhY2VfYmFzZSA9IDE2OworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBQVFIoeCkgPSAobXBfcHRyKSBkYXRhW2ldLnguZDsKKyAgICAgIFNJWih4KSA9IGRhdGFbaV0ueC5zaXplOworICAgICAgRVhQKHgpID0gZGF0YVtpXS54LmV4cDsKKyAgICAgIFBSRUMoeCkgPSBudW1iZXJvZiAoZGF0YVtpXS54LmQpOworICAgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisKKyAgICAgIFBUUih5KSA9IChtcF9wdHIpIGRhdGFbaV0ueS5kOworICAgICAgU0laKHkpID0gZGF0YVtpXS55LnNpemU7CisgICAgICBFWFAoeSkgPSBkYXRhW2ldLnkuZXhwOworICAgICAgUFJFQyh5KSA9IG51bWJlcm9mIChkYXRhW2ldLnkuZCk7CisgICAgICBNUEZfQ0hFQ0tfRk9STUFUICh5KTsKKworICAgICAgZ290ICAgICAgICAgPSBtcGZfZXEgKHgsIHksIGRhdGFbaV0uYml0cyk7CisgICAgICBnb3Rfc3dhcHBlZCA9IG1wZl9lcSAoeSwgeCwgZGF0YVtpXS5iaXRzKTsKKworICAgICAgaWYgKGdvdCAhPSBnb3Rfc3dhcHBlZCB8fCBnb3QgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIHByaW50ZiAoImNoZWNrX2RhdGEoKSB3cm9uZyByZXN1bHQgYXQgZGF0YVslZF1cbiIsIGkpOworCSAgbXBmX3RyYWNlICgieCAgICIsIHgpOworCSAgbXBmX3RyYWNlICgieSAgICIsIHkpOworCSAgcHJpbnRmICgiZ290ICAgICAgICAgJWRcbiIsIGdvdCk7CisJICBwcmludGYgKCJnb3Rfc3dhcHBlZCAlZFxuIiwgZ290X3N3YXBwZWQpOworCSAgcHJpbnRmICgid2FudCAgICAgICAgJWRcbiIsIGRhdGFbaV0ud2FudCk7CisJICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorY2hlY2tfcmFuZG9tIChsb25nIHJlcHMpCit7CisgIHVuc2lnbmVkIGxvbmcgdGVzdDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMgPSBSQU5EUzsKKyAgbXBmX3QgYSwgYiwgeDsKKyAgbXB6X3QgZHM7CisgIGludCBoaWJpdHMsIGxzaGlmdDEsIGxzaGlmdDI7CisgIGludCB4dHJhOworCisjZGVmaW5lIEhJQklUUyAxMAorI2RlZmluZSBMU0hJRlQxIDEwCisjZGVmaW5lIExTSElGVDIgMTAKKworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyAoKDEgPDwgSElCSVRTKSArICgxIDw8IExTSElGVDEpICsgKDEgPDwgTFNISUZUMikpOworCisgIG1wel9pbml0IChkcyk7CisgIG1wZl9pbml0cyAoYSwgYiwgeCwgTlVMTCk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IHJlcHM7IHRlc3QrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGRzLCByYW5kcywgSElCSVRTKTsKKyAgICAgIGhpYml0cyA9IG1wel9nZXRfdWkgKGRzKSArIDE7CisgICAgICBtcHpfdXJhbmRvbWIgKGRzLCByYW5kcywgaGliaXRzKTsKKyAgICAgIG1wel9zZXRiaXQgKGRzLCBoaWJpdHMgIC0gMSk7CS8qIG1ha2Ugc3VyZSBtc2IgaXMgc2V0ICovCisgICAgICBtcGZfc2V0X3ogKGEsIGRzKTsKKyAgICAgIG1wZl9zZXRfeiAoYiwgZHMpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGRzLCByYW5kcywgTFNISUZUMSk7CisgICAgICBsc2hpZnQxID0gbXB6X2dldF91aSAoZHMpOworICAgICAgbXBmX211bF8yZXhwIChhLCBhLCBsc2hpZnQxICsgMSk7CisgICAgICBtcGZfbXVsXzJleHAgKGIsIGIsIGxzaGlmdDEgKyAxKTsKKyAgICAgIG1wZl9hZGRfdWkgKGEsIGEsIDEpOwkvKiBtYWtlIGEgb25lLWJpdCBkaWZmZXJlbmNlICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoZHMsIHJhbmRzLCBMU0hJRlQyKTsKKyAgICAgIGxzaGlmdDIgPSBtcHpfZ2V0X3VpIChkcyk7CisgICAgICBtcGZfbXVsXzJleHAgKGEsIGEsIGxzaGlmdDIpOworICAgICAgbXBmX211bF8yZXhwIChiLCBiLCBsc2hpZnQyKTsKKyAgICAgIG1wel91cmFuZG9tYiAoZHMsIHJhbmRzLCBsc2hpZnQyKTsKKyAgICAgIG1wZl9zZXRfeiAoeCwgZHMpOworICAgICAgbXBmX2FkZCAoYSwgYSwgeCk7CisgICAgICBtcGZfYWRkIChiLCBiLCB4KTsKKworICAgICAgaW5zZXJ0X3JhbmRvbV9sb3dfemVyb19saW1icyAoYSwgcmFuZHMpOworICAgICAgaW5zZXJ0X3JhbmRvbV9sb3dfemVyb19saW1icyAoYiwgcmFuZHMpOworCisgICAgICBpZiAobXBmX2VxIChhLCBiLCBsc2hpZnQxICsgaGliaXRzKSA9PSAwIHx8CisJICBtcGZfZXEgKGIsIGEsIGxzaGlmdDEgKyBoaWJpdHMpID09IDApCisJeworCSAgZHVtcF9hYm9ydCAoYSwgYiwgbHNoaWZ0MSArIGhpYml0cywgbHNoaWZ0MSwgbHNoaWZ0MiwgaGliaXRzLCAxLCB0ZXN0KTsKKwl9CisgICAgICBmb3IgKHh0cmEgPSAxOyB4dHJhIDwgMTAwOyB4dHJhKyspCisJaWYgKG1wZl9lcSAoYSwgYiwgbHNoaWZ0MSArIGhpYml0cyArIHh0cmEpICE9IDAgfHwKKwkgICAgbXBmX2VxIChiLCBhLCBsc2hpZnQxICsgaGliaXRzICsgeHRyYSkgIT0gMCkKKwkgIHsKKwkgICAgZHVtcF9hYm9ydCAoYSwgYiwgbHNoaWZ0MSArIGhpYml0cyArIHh0cmEsIGxzaGlmdDEsIGxzaGlmdDIsIGhpYml0cywgMCwgdGVzdCk7CisJICB9CisgICAgfQorCisgIG1wZl9jbGVhcnMgKGEsIGIsIHgsIE5VTEwpOworICBtcHpfY2xlYXIgKGRzKTsKK30KKwordm9pZAoraW5zZXJ0X3JhbmRvbV9sb3dfemVyb19saW1icyAobXBmX3QgeCwgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMpCit7CisgIG1wX3NpemVfdCBtYXggPSBQUkVDKHgpIC0gU0laKHgpOworICBtcF9zaXplX3QgczsKKyAgbXB6X3QgZHM7IG1wel9pbml0IChkcyk7CisgIG1wel91cmFuZG9tYiAoZHMsIHJhbmRzLCAzMik7CisgIHMgPSBtcHpfZ2V0X3VpIChkcykgJSAobWF4ICsgMSk7CisgIE1QTl9DT1BZX0RFQ1IgKFBUUih4KSArIHMsIFBUUih4KSwgU0laKHgpKTsKKyAgTVBOX1pFUk8gKFBUUih4KSwgcyk7CisgIFNJWih4KSArPSBzOworICBtcHpfY2xlYXIgKGRzKTsKK30KKwordm9pZAorZHVtcF9hYm9ydCAobXBmX3QgYSwgbXBmX3QgYiwgaW50IGNtcF9wcmVjLCBpbnQgbHNoaWZ0MSwgaW50IGxzaGlmdDIsIGludCBoaWJpdHMsIGludCB3YW50LCBsb25nIHRlc3QpCit7CisgIHByaW50ZiAoIkVSUk9SIGluIHRlc3QgJWxkXG4iLCB0ZXN0KTsKKyAgcHJpbnRmICgid2FudCAlZCBnb3QgJWQgZnJvbSBtcGZfZXFcbiIsIHdhbnQsIDEtd2FudCk7CisgIHByaW50ZiAoImNtcF9wcmVjID0gJWRcbiIsIGNtcF9wcmVjKTsKKyAgcHJpbnRmICgibHNoaWZ0MSA9ICVkXG4iLCBsc2hpZnQxKTsKKyAgcHJpbnRmICgibHNoaWZ0MiA9ICVkXG4iLCBsc2hpZnQyKTsKKyAgcHJpbnRmICgiaGliaXRzID0gJWRcbiIsIGhpYml0cyk7CisgIGhleGR1bXAgKGEpOyBwdXRzICgiIik7CisgIGhleGR1bXAgKGIpOyBwdXRzICgiIik7CisgIGFib3J0ICgpOworfQorCit2b2lkCitoZXhkdW1wIChtcGZfdCB4KQoreworICBtcF9zaXplX3QgaTsKKyAgZm9yIChpID0gQUJTSVooeCkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBnbXBfcHJpbnRmICgiJTAqTVgiLCBTWiwgUFRSKHgpW2ldKTsKKyAgICAgIGlmIChpICE9IDApCisJcHJpbnRmICgiICIpOworICAgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBsb25nIHJlcHMgPSAxMDAwMDsKKworICBpZiAoYXJnYyA9PSAyKQorICAgIHJlcHMgPSBzdHJ0b2wgKGFyZ3ZbMV0sIDAsIDApOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisgIGNoZWNrX3JhbmRvbSAocmVwcyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWZpdHMuYyBiL3Rlc3RzL21wZi90LWZpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzdlNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtZml0cy5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBUZXN0IG1wZl9maXRzXypfcAorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIE5vdGhpbmcgc29waGlzdGljYXRlZCBoZXJlLCBqdXN0IGV4ZXJjaXNlIG1wZl9maXRzXypfcCBvbiBhIHNtYWxsIGFtb3VudAorICAgb2YgZGF0YS4gKi8KKworI2RlZmluZSBFWFBFQ1RfUyhmdW4sbmFtZSxhbnN3ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ290ID0gZnVuIChmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChnb3QgIT0gYW5zd2VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZiAoIiVzICglcykgZ290ICVkIHdhbnQgJWRcbiIsIG5hbWUsIGV4cHIsIGdvdCwgYW5zd2VyKTsgICAgICBcCisgICAgICBwcmludGYgKCIgZiBzaXplICVkIGV4cCAlbGRcbiIsIFNJWihmKSwgRVhQKGYpKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJpbnRmICgiIGYgZGVjICIpOyBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgMCwgZik7IHByaW50ZiAoIlxuIik7IFwKKyAgICAgIHByaW50ZiAoIiBmIGhleCAiKTsgbXBmX291dF9zdHIgKHN0ZG91dCwgMTYsIDAsIGYpOyBwcmludGYgKCJcbiIpOyBcCisgICAgICBlcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBFWFBFQ1QoZnVuLGFuc3dlcikgIEVYUEVDVF9TKGZ1biwjZnVuLGFuc3dlcikKKworaW50CittYWluICh2b2lkKQoreworICBtcGZfdCAgICAgICBmLCBmMHA1OworICBpbnQgICAgICAgICBnb3Q7CisgIGNvbnN0IGNoYXIgICpleHByOworICBpbnQgICAgICAgICBlcnJvciA9IDA7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wZl9pbml0MiAoZiwgMjAwTCk7CisgIG1wZl9pbml0MiAoZjBwNSwgMjAwTCk7CisKKyAgLyogMC41ICovCisgIG1wZl9zZXRfdWkgKGYwcDUsIDFMKTsKKyAgbXBmX2Rpdl8yZXhwIChmMHA1LCBmMHA1LCAxTCk7CisKKyAgbXBmX3NldF91aSAoZiwgMEwpOworICBleHByID0gIjAiOworICBFWFBFQ1QgKG1wZl9maXRzX3Vsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdXNob3J0X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDEpOworCisgIG1wZl9zZXRfdWkgKGYsIDFMKTsKKyAgZXhwciA9ICIxIjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191aW50X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3VzaG9ydF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NzaG9ydF9wLCAxKTsKKworICBtcGZfc2V0X3NpIChmLCAtMUwpOworICBleHByID0gIi0xIjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c191aW50X3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3VzaG9ydF9wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NzaG9ydF9wLCAxKTsKKworCisgIG1wZl9zZXRfdWkgKGYsICh1bnNpZ25lZCBsb25nKSBVU0hSVF9NQVgpOworICBleHByID0gIlVTSFJUX01BWCI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF91aSAoZiwgKHVuc2lnbmVkIGxvbmcpIFVTSFJUX01BWCk7CisgIG1wZl9hZGQgKGYsIGYsIGYwcDUpOworICBleHByID0gIlVTSFJUX01BWCArIDAuNSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF91aSAoZiwgKHVuc2lnbmVkIGxvbmcpIFVTSFJUX01BWCk7CisgIG1wZl9hZGRfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICJVU0hSVF9NQVggKyAxIjsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMCk7CisKKworICBtcGZfc2V0X3VpIChmLCAodW5zaWduZWQgbG9uZykgVUlOVF9NQVgpOworICBleHByID0gIlVJTlRfTUFYIjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191aW50X3AsIDEpOworCisgIG1wZl9zZXRfdWkgKGYsICh1bnNpZ25lZCBsb25nKSBVSU5UX01BWCk7CisgIG1wZl9hZGQgKGYsIGYsIGYwcDUpOworICBleHByID0gIlVJTlRfTUFYICsgMC41IjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191aW50X3AsIDEpOworCisgIG1wZl9zZXRfdWkgKGYsICh1bnNpZ25lZCBsb25nKSBVSU5UX01BWCk7CisgIG1wZl9hZGRfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICJVSU5UX01BWCArIDEiOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMCk7CisKKworICBtcGZfc2V0X3VpIChmLCBVTE9OR19NQVgpOworICBleHByID0gIlVMT05HX01BWCI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMSk7CisKKyAgbXBmX3NldF91aSAoZiwgVUxPTkdfTUFYKTsKKyAgbXBmX2FkZCAoZiwgZiwgZjBwNSk7CisgIGV4cHIgPSAiVUxPTkdfTUFYICsgMC41IjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAxKTsKKworICBtcGZfc2V0X3VpIChmLCBVTE9OR19NQVgpOworICBtcGZfYWRkX3VpIChmLCBmLCAxTCk7CisgIGV4cHIgPSAiVUxPTkdfTUFYICsgMSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMCk7CisKKworICBtcGZfc2V0X3NpIChmLCAobG9uZykgU0hSVF9NQVgpOworICBleHByID0gIlNIUlRfTUFYIjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NzaG9ydF9wLCAxKTsKKworICBtcGZfc2V0X3NpIChmLCAobG9uZykgU0hSVF9NQVgpOworICBleHByID0gIlNIUlRfTUFYICsgMC41IjsKKyAgbXBmX2FkZCAoZiwgZiwgZjBwNSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF9zaSAoZiwgKGxvbmcpIFNIUlRfTUFYKTsKKyAgbXBmX2FkZF91aSAoZiwgZiwgMUwpOworICBleHByID0gIlNIUlRfTUFYICsgMSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDApOworCisKKyAgbXBmX3NldF9zaSAoZiwgKGxvbmcpIElOVF9NQVgpOworICBleHByID0gIklOVF9NQVgiOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMSk7CisKKyAgbXBmX3NldF9zaSAoZiwgKGxvbmcpIElOVF9NQVgpOworICBtcGZfYWRkIChmLCBmLCBmMHA1KTsKKyAgZXhwciA9ICJJTlRfTUFYICsgMC41IjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworCisgIG1wZl9zZXRfc2kgKGYsIChsb25nKSBJTlRfTUFYKTsKKyAgbXBmX2FkZF91aSAoZiwgZiwgMUwpOworICBleHByID0gIklOVF9NQVggKyAxIjsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDApOworCisKKyAgbXBmX3NldF9zaSAoZiwgTE9OR19NQVgpOworICBleHByID0gIkxPTkdfTUFYIjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKworICBtcGZfc2V0X3NpIChmLCBMT05HX01BWCk7CisgIG1wZl9hZGQgKGYsIGYsIGYwcDUpOworICBleHByID0gIkxPTkdfTUFYICsgMC41IjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKworICBtcGZfc2V0X3NpIChmLCBMT05HX01BWCk7CisgIG1wZl9hZGRfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICJMT05HX01BWCArIDEiOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDApOworCisKKyAgbXBmX3NldF9zaSAoZiwgKGxvbmcpIFNIUlRfTUlOKTsKKyAgZXhwciA9ICJTSFJUX01JTiI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF9zaSAoZiwgKGxvbmcpIFNIUlRfTUlOKTsKKyAgbXBmX3N1YiAoZiwgZiwgZjBwNSk7CisgIGV4cHIgPSAiU0hSVF9NSU4gLSAwLjUiOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDEpOworCisgIG1wZl9zZXRfc2kgKGYsIChsb25nKSBTSFJUX01JTik7CisgIG1wZl9zdWJfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICJTSFJUX01JTiAtIDEiOworICBFWFBFQ1QgKG1wZl9maXRzX3NzaG9ydF9wLCAwKTsKKworCisgIG1wZl9zZXRfc2kgKGYsIChsb25nKSBJTlRfTUlOKTsKKyAgZXhwciA9ICJJTlRfTUlOIjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworCisgIG1wZl9zZXRfc2kgKGYsIChsb25nKSBJTlRfTUlOKTsKKyAgbXBmX3N1YiAoZiwgZiwgZjBwNSk7CisgIGV4cHIgPSAiSU5UX01JTiAtIDAuNSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAxKTsKKworICBtcGZfc2V0X3NpIChmLCAobG9uZykgSU5UX01JTik7CisgIG1wZl9zdWJfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICJJTlRfTUlOIC0gMSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAwKTsKKworCisgIG1wZl9zZXRfc2kgKGYsIExPTkdfTUlOKTsKKyAgZXhwciA9ICJMT05HX01JTiI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisKKyAgbXBmX3NldF9zaSAoZiwgTE9OR19NSU4pOworICBtcGZfc3ViIChmLCBmLCBmMHA1KTsKKyAgZXhwciA9ICJMT05HX01JTiAtIDAuNSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisKKyAgbXBmX3NldF9zaSAoZiwgTE9OR19NSU4pOworICBtcGZfc3ViX3VpIChmLCBmLCAxTCk7CisgIGV4cHIgPSAiTE9OR19NSU4gLSAxIjsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAwKTsKKworCisgIG1wZl9zZXRfc3RyX29yX2Fib3J0IChmLCAiMC41IiwgMTApOworICBleHByID0gIjAuNSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF9zdHJfb3JfYWJvcnQgKGYsICItMC41IiwgMTApOworICBleHByID0gIi0wLjUiOworICBFWFBFQ1QgKG1wZl9maXRzX3Vsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdXNob3J0X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDEpOworCisgIG1wZl9zZXRfc3RyX29yX2Fib3J0IChmLCAiLTEuNSIsIDEwKTsKKyAgZXhwciA9ICItMS41IjsKKyAgRVhQRUNUIChtcGZfZml0c191bG9uZ19wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c191aW50X3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3VzaG9ydF9wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zaW50X3AsIDEpOworICBFWFBFQ1QgKG1wZl9maXRzX3NzaG9ydF9wLCAxKTsKKworCisgIG1wZl9zZXRfc3RyX29yX2Fib3J0IChmLCAiMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiLCAxNik7CisgIGV4cHIgPSAiMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgYmFzZSAxNiI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcGZfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXBmX3NldF9zdHJfb3JfYWJvcnQgKGYsICIxQDEwMDAiLCAxNik7CisgIGV4cHIgPSAiMUAxMDAwIGJhc2UgMTYiOworICBFWFBFQ1QgKG1wZl9maXRzX3Vsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdXNob3J0X3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDApOworCisKKyAgbXBmX3NldF91aSAoZiwgMUwpOworICBtcGZfbXVsXzJleHAgKGYsIGYsIEJJVFNfUEVSX1VMT05HICsgMSk7CisgIG1wZl9zdWJfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICIyXihCSVRTX1BFUl9VTE9ORysxKSAtIDEiOworICBFWFBFQ1QgKG1wZl9maXRzX3Vsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdXNob3J0X3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDApOworCisgIG1wZl9zZXRfdWkgKGYsIDFMKTsKKyAgbXBmX211bF8yZXhwIChmLCBmLCBCSVRTX1BFUl9VTE9ORyArIDEpOworICBtcGZfdWlfc3ViIChmLCAxTCwgZik7CisgIGV4cHIgPSAiLSAoMl4oQklUU19QRVJfVUxPTkcrMSkgLSAxKSI7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWxvbmdfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdWludF9wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c191c2hvcnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2xvbmdfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc2ludF9wLCAwKTsKKyAgRVhQRUNUIChtcGZfZml0c19zc2hvcnRfcCwgMCk7CisKKyAgbXBmX3NldF91aSAoZiwgMUwpOworICBtcGZfbXVsXzJleHAgKGYsIGYsIEJJVFNfUEVSX1VMT05HICsgNSk7CisgIG1wZl9zdWJfdWkgKGYsIGYsIDFMKTsKKyAgZXhwciA9ICIyXihCSVRTX1BFUl9VTE9ORys1KSAtIDEiOworICBFWFBFQ1QgKG1wZl9maXRzX3Vsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3VpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfdXNob3J0X3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3Nsb25nX3AsIDApOworICBFWFBFQ1QgKG1wZl9maXRzX3NpbnRfcCwgMCk7CisgIEVYUEVDVCAobXBmX2ZpdHNfc3Nob3J0X3AsIDApOworCisKKyAgaWYgKGVycm9yKQorICAgIGFib3J0ICgpOworCisgIG1wZl9jbGVhciAoZik7CisgIG1wZl9jbGVhciAoZjBwNSk7CisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcGYvdC1nZXRfZC5jIGIvdGVzdHMvbXBmL3QtZ2V0X2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTRjNzQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtZ2V0X2QuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGVzdCBtcGZfZ2V0X2QgYW5kIG1wZl9zZXRfZC4KKworQ29weXJpZ2h0IDE5OTYsIDE5OTktMjAwMSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaWYgZGVmaW5lZCAoX192YXgpIHx8IGRlZmluZWQgKF9fdmF4X18pCisjZGVmaW5lIExPV19CT1VORCAxZS0zOAorI2RlZmluZSBISUdIX0JPVU5EIDhlMzcKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0NSQVkpICYmICEgZGVmaW5lZCAoX0NSQVlJRUVFKQorLyogVGhlIHJhbmdlIHZhcmllcyBteXN0ZXJpb3VzbHkgYmV0d2VlbiBDcmF5IHZlcnNpb24uICBPbiBhbiBTVjEsCisgICB0aGUgcmFuZ2Ugc2VlbSB0byBiZSAxZS02MDAuLjFlNjAzLCBidXQgYSBjZnAgKG5vbi1pZWVlKSBUOTAKKyAgIGhhcyBhIG11Y2ggc21hbGxlciByYW5nZSBvZiAxZS0yNDAuLjFlMjQwLiAgKi8KKyNkZWZpbmUgTE9XX0JPVU5EIDFlLTI0MAorI2RlZmluZSBISUdIX0JPVU5EIDFlMjQwCisjZW5kaWYKKworI2lmICEgZGVmaW5lZCAoTE9XX0JPVU5EKQorI2RlZmluZSBMT1dfQk9VTkQgMWUtMzAwCisjZGVmaW5lIEhJR0hfQk9VTkQgMWUzMDAKKyNlbmRpZgorCit2b2lkCit0ZXN0X2Rlbm9ybXMgKGludCBwcmMpCit7CisjaWZkZWYgX0dNUF9JRUVFX0ZMT0FUUworICBkb3VibGUgZDEsIGQyOworICBtcGZfdCBmOworICBpbnQgaTsKKworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyAocHJjKTsKKworICBtcGZfaW5pdCAoZik7CisKKyAgZDEgPSAxLjk7CisgIGZvciAoaSA9IDA7IGkgPCA4MjA7IGkrKykKKyAgICB7CisgICAgICBtcGZfc2V0X2QgKGYsIGQxKTsKKyAgICAgIGQyID0gbXBmX2dldF9kIChmKTsKKyAgICAgIGlmIChkMSAhPSBkMikKKyAgICAgICAgYWJvcnQgKCk7CisgICAgICBkMSAqPSAwLjQ7CisgICAgfQorCisgIG1wZl9jbGVhciAoZik7CisjZW5kaWYKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGRvdWJsZSBkLCBlLCByOworICBtcGZfdCB1LCB2OworCisgIHRlc3RzX3N0YXJ0ICgpOworICBtcGZfaW5pdCAodSk7CisgIG1wZl9pbml0ICh2KTsKKworICBtcGZfc2V0X2QgKHUsIExPV19CT1VORCk7CisgIGZvciAoZCA9IDIuMCAqIExPV19CT1VORDsgZCA8IEhJR0hfQk9VTkQ7IGQgKj0gMS4wMSkKKyAgICB7CisgICAgICBtcGZfc2V0X2QgKHYsIGQpOworICAgICAgaWYgKG1wZl9jbXAgKHUsIHYpID49IDApCisJYWJvcnQgKCk7CisgICAgICBlID0gbXBmX2dldF9kICh2KTsKKyAgICAgIHIgPSBlL2Q7CisgICAgICBpZiAociA8IDAuOTk5OTk5OTk5OTk5OTkgfHwgciA+IDEuMDAwMDAwMDAwMDAwMDEpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAic2hvdWxkIGJlIG9uZSB1bHAgZnJvbSAxOiAlLjE2ZlxuIiwgcik7CisJICBhYm9ydCAoKTsKKwl9CisgICAgICBtcGZfc2V0ICh1LCB2KTsKKyAgICB9CisKKyAgbXBmX2NsZWFyICh1KTsKKyAgbXBmX2NsZWFyICh2KTsKKworICB0ZXN0X2Rlbm9ybXMgKDEwKTsKKyAgdGVzdF9kZW5vcm1zICgzMik7CisgIHRlc3RfZGVub3JtcyAoNjQpOworICB0ZXN0X2Rlbm9ybXMgKDEwMCk7CisgIHRlc3RfZGVub3JtcyAoMjAwKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtZ2V0X2RfMmV4cC5jIGIvdGVzdHMvbXBmL3QtZ2V0X2RfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTZjZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcGYvdC1nZXRfZF8yZXhwLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIFRlc3QgbXBmX2dldF9kXzJleHAuCisKK0NvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDE3LCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworc3RhdGljIHZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIG1wZl90ICAgZjsKKyAgZG91YmxlICBnb3QsIHdhbnQ7CisgIGxvbmcgICAgZ290X2V4cDsKKyAgbG9uZyAgICBleHA7CisgIHN0cnVjdCB7CisgICAgaW50IGJhc2U7CisgICAgaW50IHNoaWZ0OworICB9IGRhdGFbXSA9IHsKKyAgIHstMSwgMX0sIHstMywgMn0sIHstNSwgM30sIHstNywgM30sIHsgMSwgMX0sIHsgMywgMn0sIHsgNSwgM30sIHsgNywgM30KKyAgfTsKKworICBtcGZfaW5pdDIgKGYsIDMpOworCisgIGdvdCA9IG1wZl9nZXRfZF8yZXhwICgmZ290X2V4cCwgZik7CisgIGlmIChnb3QgIT0gMCB8fCBnb3RfZXhwICE9IDApCisgICAgeworICAgICAgcHJpbnRmICAgICgibXBmX2dldF9kXzJleHAgd3Jvbmcgb24gemVyb1xuIik7CisgICAgICBtcGZfdHJhY2UgKCIgICBmICAgICIsIGYpOworICAgICAgZF90cmFjZSAgICgiICAgZ290ICAiLCBnb3QpOworICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgIGZvciAoZXhwID0gLTUxMzsgZXhwIDw9IDUxMzsgZXhwKyspCisgICAgeworICAgICAgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisJeworCSAgd2FudCA9IChkb3VibGUpIGRhdGFbaV0uYmFzZSAvICgxIDw8IGRhdGFbaV0uc2hpZnQpOworCSAgbXBmX3NldF9kIChmLCB3YW50KTsKKworCSAgaWYgKGV4cCA+PSAwKQorCSAgICBtcGZfbXVsXzJleHAgKGYsIGYsIGV4cCk7CisJICBlbHNlCisJICAgIG1wZl9kaXZfMmV4cCAoZiwgZiwgLWV4cCk7CisKKwkgIGdvdCA9IG1wZl9nZXRfZF8yZXhwICgmZ290X2V4cCwgZik7CisJICBpZiAoZ290ICE9IHdhbnQgfHwgZ290X2V4cCAhPSBleHApCisJICAgIHsKKwkgICAgICBwcmludGYgICAgKCJtcGZfZ2V0X2RfMmV4cCB3cm9uZyBvbiAyKiolbGRcbiIsIGV4cCk7CisJICAgICAgbXBmX3RyYWNlICgiICAgZiAgICAiLCBmKTsKKwkgICAgICBkX3RyYWNlICAgKCIgICB3YW50ICIsIHdhbnQpOworCSAgICAgIGRfdHJhY2UgICAoIiAgIGdvdCAgIiwgZ290KTsKKwkgICAgICBwcmludGYgICAgKCIgICB3YW50IGV4cCAlbGRcbiIsIGV4cCk7CisJICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKwkgICAgICBhYm9ydCgpOworCSAgICB9CisJfQorICAgIH0KKyAgbXBmX2NsZWFyIChmKTsKK30KKworLyogQ2hlY2sgdGhhdCBoYXJkd2FyZSByb3VuZGluZyBkb2Vzbid0IG1ha2UgbXBmX2dldF9kXzJleHAgcmV0dXJuIGEgdmFsdWUKKyAgIG91dHNpZGUgaXRzIGRlZmluZWQgcmFuZ2UuICovCitzdGF0aWMgdm9pZAorY2hlY2tfcm91bmQgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGRhdGFbXSA9IHsgMSwgMzIsIDUzLCA1NCwgNjQsIDEyOCwgMjU2LCA1MTIgfTsKKyAgbXBmX3QgICBmOworICBkb3VibGUgIGdvdDsKKyAgbG9uZyAgICBnb3RfZXhwOworICBpbnQgICAgIGksIHJuZF9tb2RlLCBvbGRfcm5kX21vZGU7CisKKyAgbXBmX2luaXQyIChmLCAxMDI0TCk7CisgIG9sZF9ybmRfbW9kZSA9IHRlc3RzX2hhcmR3YXJlX2dldHJvdW5kICgpOworCisgIGZvciAocm5kX21vZGUgPSAwOyBybmRfbW9kZSA8IDQ7IHJuZF9tb2RlKyspCisgICAgeworICAgICAgdGVzdHNfaGFyZHdhcmVfc2V0cm91bmQgKHJuZF9tb2RlKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgbXBmX3NldF91aSAoZiwgMUwpOworICAgICAgICAgIG1wZl9tdWxfMmV4cCAoZiwgZiwgZGF0YVtpXSk7CisgICAgICAgICAgbXBmX3N1Yl91aSAoZiwgZiwgMUwpOworCisgICAgICAgICAgZ290ID0gbXBmX2dldF9kXzJleHAgKCZnb3RfZXhwLCBmKTsKKyAgICAgICAgICBpZiAoZ290IDwgMC41IHx8IGdvdCA+PSAxLjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIm1wZl9nZXRfZF8yZXhwIGJhZCBvbiAyKiolbHUtMVxuIiwgZGF0YVtpXSk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoInJlc3VsdCBvdXQgb2YgcmFuZ2UsIGV4cGVjdCAwLjUgPD0gZ290IDwgMS4wXG4iKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgcm5kX21vZGUgPSAlZFxuIiwgcm5kX21vZGUpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICBkYXRhW2ldICA9ICVsdVxuIiwgZGF0YVtpXSk7CisgICAgICAgICAgICAgIG1wZl90cmFjZSAoIiAgIGYgICAgIiwgZik7CisgICAgICAgICAgICAgIGRfdHJhY2UgICAoIiAgIGdvdCAgIiwgZ290KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBtcGZfY2xlYXIgKGYpOworICB0ZXN0c19oYXJkd2FyZV9zZXRyb3VuZCAob2xkX3JuZF9tb2RlKTsKK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gMTY7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfcm91bmQgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWdldF9zaS5jIGIvdGVzdHMvbXBmL3QtZ2V0X3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMGIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LWdldF9zaS5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBFeGVyY2lzZSBtcHpfZ2V0X3NpLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCAgICAgICAgIGJhc2U7CisgICAgY29uc3QgY2hhciAgKmY7CisgICAgbG9uZyAgICAgICAgd2FudDsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAxMCwgIjAiLCAgICAgIDBMIH0sCisgICAgeyAxMCwgIjEiLCAgICAgIDFMIH0sCisgICAgeyAxMCwgIi0xIiwgICAgIC0xTCB9LAorICAgIHsgMTAsICIyIiwgICAgICAyTCB9LAorICAgIHsgMTAsICItMiIsICAgICAtMkwgfSwKKyAgICB7IDEwLCAiMTIzNDUiLCAgMTIzNDVMIH0sCisgICAgeyAxMCwgIi0xMjM0NSIsIC0xMjM0NUwgfSwKKworICAgIC8qIGZyYWN0aW9uIGJpdHMgaWdub3JlZCAqLworICAgIHsgMTAsICIwLjUiLCAgICAwTCB9LAorICAgIHsgMTAsICItMC41IiwgICAwTCB9LAorICAgIHsgMTAsICIxLjEiLCAgICAxTCB9LAorICAgIHsgMTAsICItMS4xIiwgICAtMUwgfSwKKyAgICB7IDEwLCAiMS45IiwgICAgMUwgfSwKKyAgICB7IDEwLCAiLTEuOSIsICAgLTFMIH0sCisgICAgeyAxNiwgIjEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwgMUwgfSwKKyAgICB7IDE2LCAiLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwgLTFMIH0sCisKKyAgICAvKiBsb3cgYml0cyBleHRyYWN0ZWQgKHRoaXMgaXMgdW5kb2N1bWVudGVkKSAqLworICAgIHsgMTYsICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwgMUwgfSwKKyAgICB7IDE2LCAiLTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiLCAtMUwgfSwKKyAgfTsKKworICBpbnQgICAgaTsKKyAgbXBmX3QgIGY7CisgIGxvbmcgICBnb3Q7CisKKyAgbXBmX2luaXQyIChmLCAyMDAwTCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcGZfc2V0X3N0cl9vcl9hYm9ydCAoZiwgZGF0YVtpXS5mLCBkYXRhW2ldLmJhc2UpOworCisgICAgICBnb3QgPSBtcGZfZ2V0X3NpIChmKTsKKyAgICAgIGlmIChnb3QgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIHByaW50ZiAoIm1wZl9nZXRfc2kgd3JvbmcgYXQgZGF0YVslZF1cbiIsIGkpOworCSAgcHJpbnRmICgiICAgZiAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLmYpOworCSAgcHJpbnRmICgiICAgICBkZWMgIik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAwLCBmKTsgcHJpbnRmICgiXG4iKTsKKwkgIHByaW50ZiAoIiAgICAgaGV4ICIpOyBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgMCwgZik7IHByaW50ZiAoIlxuIik7CisJICBwcmludGYgKCIgICAgIHNpemUgJWxkXG4iLCAobG9uZykgU0laKGYpKTsKKwkgIHByaW50ZiAoIiAgICAgZXhwICAlbGRcbiIsIChsb25nKSBFWFAoZikpOworCSAgcHJpbnRmICgiICAgZ290ICAgJWxkICgweCVsWClcbiIsIGdvdCwgZ290KTsKKwkgIHByaW50ZiAoIiAgIHdhbnQgICVsZCAoMHglbFgpXG4iLCBkYXRhW2ldLndhbnQsIGRhdGFbaV0ud2FudCk7CisJICBhYm9ydCgpOworCX0KKyAgICB9CisgIG1wZl9jbGVhciAoZik7Cit9CisKKwordm9pZAorY2hlY2tfbWF4ICh2b2lkKQoreworICBtcGZfdCAgZjsKKyAgbG9uZyAgIHdhbnQ7CisgIGxvbmcgICBnb3Q7CisKKyAgbXBmX2luaXQyIChmLCAyMDBMKTsKKworI2RlZmluZSBDSEVDS19NQVgobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdvdCAhPSB3YW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJpbnRmICgibXBmX2dldF9zaSB3cm9uZyBvbiAlc1xuIiwgbmFtZSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZiAoIiAgIGYgICAgIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgMCwgZik7IHByaW50ZiAoIiwgaGV4ICIpOyAgICAgICAgXAorICAgICAgbXBmX291dF9zdHIgKHN0ZG91dCwgMTYsIDAsIGYpOyBwcmludGYgKCJcbiIpOyAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZiAoIiAgIGdvdCAgJWxkLCBoZXggJWxYXG4iLCBnb3QsIGdvdCk7ICAgICAgICAgICAgICBcCisgICAgICBwcmludGYgKCIgICB3YW50ICVsZCwgaGV4ICVsWFxuIiwgd2FudCwgd2FudCk7ICAgICAgICAgICAgXAorICAgICAgYWJvcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyAgd2FudCA9IExPTkdfTUFYOworICBtcGZfc2V0X3NpIChmLCB3YW50KTsKKyAgZ290ID0gbXBmX2dldF9zaSAoZik7CisgIENIRUNLX01BWCAoIkxPTkdfTUFYIik7CisKKyAgd2FudCA9IExPTkdfTUlOOworICBtcGZfc2V0X3NpIChmLCB3YW50KTsKKyAgZ290ID0gbXBmX2dldF9zaSAoZik7CisgIENIRUNLX01BWCAoIkxPTkdfTUlOIik7CisKKyAgbXBmX2NsZWFyIChmKTsKK30KKworCit2b2lkCitjaGVja19saW1iZGF0YSAodm9pZCkKK3sKKyNkZWZpbmUgTSAgR01QX05VTUJfTUFYCisKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbXBfZXhwX3QgICAgICAgZXhwOworICAgIG1wX3NpemVfdCAgICAgIHNpemU7CisgICAgbXBfbGltYl90ICAgICAgZFsxMF07CisgICAgdW5zaWduZWQgbG9uZyAgd2FudDsKKworICB9IGRhdGFbXSA9IHsKKworICAgIC8qIGluIHRoZSBjb21tZW50cyBoZXJlLCBhICJfIiBpbmRpY2F0ZXMgYSBkaWdpdCAoaWUuIGxpbWIpIHBvc2l0aW9uIG5vdAorICAgICAgIGluY2x1ZGVkIGluIHRoZSBkIGRhdGEsIGFuZCB0aGVyZWZvcmUgemVybyAqLworCisgICAgeyAwLCAwLCB7IDAgfSwgMEwgfSwgICAgLyogMCAqLworCisgICAgeyAxLCAgMSwgeyAxIH0sIDFMIH0sICAgLyogMSAqLworICAgIHsgMSwgLTEsIHsgMSB9LCAtMVVMIH0sICAvKiAtMSAqLworCisgICAgeyAwLCAgMSwgeyAxIH0sIDBMIH0sICAgLyogLjEgKi8KKyAgICB7IDAsIC0xLCB7IDEgfSwgMEwgfSwgICAvKiAtLjEgKi8KKworICAgIHsgLTEsICAxLCB7IDEgfSwgMEwgfSwgIC8qIC5fMSAqLworICAgIHsgLTEsIC0xLCB7IDEgfSwgMEwgfSwgIC8qIC0uXzEgKi8KKworICAgIHsgLTk5OSwgICAgICAgICAgMSwgeyAxIH0sIDBMIH0sICAgLyogLl9fXzEgc21hbGwgKi8KKyAgICB7IE1QX0VYUF9UX01JTiwgIDEsIHsgMSB9LCAwTCB9LCAgIC8qIC5fX19fMSB2ZXJ5IHNtYWxsICovCisKKyAgICB7IDk5OSwgICAgICAgICAgMSwgeyAxIH0sIDBMIH0sICAgIC8qIDFfX19fLiBiaWcgKi8KKyAgICB7IE1QX0VYUF9UX01BWCwgMSwgeyAxIH0sIDBMIH0sICAgIC8qIDFfX19fXy4gdmVyeSBiaWcgKi8KKworICAgIHsgMSwgMiwgeyA5OTksIDIgfSwgMkwgfSwgICAgICAgICAgICAgICAgICAvKiAyLjkgKi8KKyAgICB7IDUsIDgsIHsgNywgOCwgOSwgMywgMCwgMCwgMCwgMSB9LCAzTCB9LCAgLyogMTAwMDMuOTg3ICovCisKKyAgICB7IDIsIDIsIHsgTSwgTSB9LCAgICBMT05HX01BWCB9LCAvKiBGRi4gKi8KKyAgICB7IDIsIDIsIHsgTSwgTSwgTSB9LCBMT05HX01BWCB9LCAvKiBGRi5GICovCisgICAgeyAzLCAzLCB7IE0sIE0sIE0gfSwgTE9OR19NQVggfSwgLyogRkZGLiAqLworCisjaWYgR01QX05VTUJfQklUUyA+PSBCSVRTX1BFUl9VTE9ORworICAgIC8qIG5vcm1hbCBjYXNlLCBudW1iIGJpZ2dlciB0aGFuIGxvbmcgKi8KKyAgICB7IDIsICAxLCB7IDEgfSwgICAgMEwgfSwgICAgICAvKiAxXy4gKi8KKyAgICB7IDIsICAyLCB7IDAsIDEgfSwgMEwgfSwgICAgICAvKiAxMC4gKi8KKyAgICB7IDIsICAyLCB7IDk5OSwgMSB9LCA5OTlMIH0sICAvKiAxOS4gKi8KKyAgICB7IDMsICAyLCB7IDk5OSwgMSB9LCAwTCB9LCAgICAvKiAxOV8uICovCisKKyNlbHNlCisgICAgLyogbmFpbHMgY2FzZSwgbnVtYiBzbWFsbGVyIHRoYW4gbG9uZyAqLworICAgIHsgMiwgIDEsIHsgMSB9LCAxTCA8PCBHTVBfTlVNQl9CSVRTIH0sICAvKiAxXy4gKi8KKyAgICB7IDMsICAxLCB7IDEgfSwgMEwgfSwgICAgICAgICAgICAgICAgICAgLyogMV9fLiAqLworCisgICAgeyAyLCAgMiwgeyA5OSwgMSB9LCAgICA5OUwgKyAoMUwgPDwgR01QX05VTUJfQklUUykgfSwgIC8qIDE5LiAqLworICAgIHsgMywgIDIsIHsgMSwgOTkgfSwgICAgMUwgPDwgR01QX05VTUJfQklUUyB9LCAgICAgICAgICAvKiA5MV8uICovCisgICAgeyAzLCAgMywgeyAwLCAxLCA5OSB9LCAxTCA8PCBHTVBfTlVNQl9CSVRTIH0sICAgICAgICAgIC8qIDkxMC4gKi8KKworI2VuZGlmCisgIH07CisKKyAgbXBmX3QgICAgICAgICAgZjsKKyAgdW5zaWduZWQgbG9uZyAgZ290OworICBpbnQgICAgICAgICAgICBpOworICBtcF9saW1iX3QgICAgICBidWZbMjAgKyBudW1iZXJvZihkYXRhW2ldLmQpXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgcmVmbXBuX2ZpbGwgKGJ1ZiwgMTAsIENOU1RfTElNQigweERFQURCRUVGKSk7CisgICAgICByZWZtcG5fY29weSAoYnVmKzEwLCBkYXRhW2ldLmQsIEFCUyhkYXRhW2ldLnNpemUpKTsKKyAgICAgIHJlZm1wbl9maWxsIChidWYrMTArQUJTKGRhdGFbaV0uc2l6ZSksIDEwLCBDTlNUX0xJTUIoMHhERUFEQkVFRikpOworCisgICAgICBQVFIoZikgPSBidWYrMTA7CisgICAgICBFWFAoZikgPSBkYXRhW2ldLmV4cDsKKyAgICAgIFNJWihmKSA9IGRhdGFbaV0uc2l6ZTsKKyAgICAgIFBSRUMoZikgPSBudW1iZXJvZiAoZGF0YVtpXS5kKTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKGYpOworCisgICAgICBnb3QgPSBtcGZfZ2V0X3NpIChmKTsKKyAgICAgIGlmIChnb3QgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIHByaW50ZiAgICAoIm1wZl9nZXRfc2kgd3JvbmcgYXQgbGltYiBkYXRhWyVkXVxuIiwgaSk7CisJICBtcGZfdHJhY2UgKCIgIGYiLCBmKTsKKwkgIG1wbl90cmFjZSAoIiAgZCIsIGRhdGFbaV0uZCwgZGF0YVtpXS5zaXplKTsKKwkgIHByaW50ZiAgICAoIiAgc2l6ZSAlbGRcbiIsIChsb25nKSBkYXRhW2ldLnNpemUpOworCSAgcHJpbnRmICAgICgiICBleHAgJWxkXG4iLCAobG9uZykgZGF0YVtpXS5leHApOworCSAgcHJpbnRmICAgICgiICBnb3QgICAlbHUgKDB4JWxYKVxuIiwgZ290LCBnb3QpOworCSAgcHJpbnRmICAgICgiICB3YW50ICAlbHUgKDB4JWxYKVxuIiwgZGF0YVtpXS53YW50LCBkYXRhW2ldLndhbnQpOworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfbWF4ICgpOworICBjaGVja19saW1iZGF0YSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtZ2V0X3VpLmMgYi90ZXN0cy9tcGYvdC1nZXRfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDExYjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtZ2V0X3VpLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIEV4ZXJjaXNlIG1wZl9nZXRfdWkuCisKK0NvcHlyaWdodCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfbGltYmRhdGEgKHZvaWQpCit7CisjZGVmaW5lIE0gIEdNUF9OVU1CX01BWAorCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIG1wX2V4cF90ICAgICAgIGV4cDsKKyAgICBtcF9zaXplX3QgICAgICBzaXplOworICAgIG1wX2xpbWJfdCAgICAgIGRbMTBdOworICAgIHVuc2lnbmVkIGxvbmcgIHdhbnQ7CisKKyAgfSBkYXRhW10gPSB7CisKKyAgICAvKiBpbiB0aGUgY29tbWVudHMgaGVyZSwgYSAiXyIgaW5kaWNhdGVzIGEgZGlnaXQgKGllLiBsaW1iKSBwb3NpdGlvbiBub3QKKyAgICAgICBpbmNsdWRlZCBpbiB0aGUgZCBkYXRhLCBhbmQgdGhlcmVmb3JlIHplcm8gKi8KKworICAgIHsgMCwgMCwgeyAwIH0sIDBMIH0sICAgIC8qIDAgKi8KKworICAgIHsgMSwgIDEsIHsgMSB9LCAxTCB9LCAgIC8qIDEgKi8KKyAgICB7IDEsIC0xLCB7IDEgfSwgMUwgfSwgICAvKiAtMSAqLworCisgICAgeyAwLCAgMSwgeyAxIH0sIDBMIH0sICAgLyogLjEgKi8KKyAgICB7IDAsIC0xLCB7IDEgfSwgMEwgfSwgICAvKiAtLjEgKi8KKworICAgIHsgLTEsICAxLCB7IDEgfSwgMEwgfSwgIC8qIC5fMSAqLworICAgIHsgLTEsIC0xLCB7IDEgfSwgMEwgfSwgIC8qIC0uXzEgKi8KKworICAgIHsgLTk5OSwgICAgICAgICAgMSwgeyAxIH0sIDBMIH0sICAgLyogLl9fXzEgc21hbGwgKi8KKyAgICB7IE1QX0VYUF9UX01JTiwgIDEsIHsgMSB9LCAwTCB9LCAgIC8qIC5fX19fMSB2ZXJ5IHNtYWxsICovCisKKyAgICB7IDk5OSwgICAgICAgICAgMSwgeyAxIH0sIDBMIH0sICAgIC8qIDFfX19fLiBiaWcgKi8KKyAgICB7IE1QX0VYUF9UX01BWCwgMSwgeyAxIH0sIDBMIH0sICAgIC8qIDFfX19fXy4gdmVyeSBiaWcgKi8KKworICAgIHsgMSwgMiwgeyA5OTksIDIgfSwgMkwgfSwgICAgICAgICAgICAgICAgICAvKiAyLjkgKi8KKyAgICB7IDUsIDgsIHsgNywgOCwgOSwgMywgMCwgMCwgMCwgMSB9LCAzTCB9LCAgLyogMTAwMDMuOTg3ICovCisKKyAgICB7IDIsIDIsIHsgTSwgTSB9LCAgICBVTE9OR19NQVggfSwgLyogRkYuICovCisgICAgeyAyLCAyLCB7IE0sIE0sIE0gfSwgVUxPTkdfTUFYIH0sIC8qIEZGLkYgKi8KKyAgICB7IDMsIDMsIHsgTSwgTSwgTSB9LCBVTE9OR19NQVggfSwgLyogRkZGLiAqLworCisjaWYgR01QX05VTUJfQklUUyA+PSBCSVRTX1BFUl9VTE9ORworICAgIC8qIG5vcm1hbCBjYXNlLCBudW1iIGJpZ2dlciB0aGFuIGxvbmcgKi8KKyAgICB7IDIsICAxLCB7IDEgfSwgICAgMEwgfSwgICAgICAvKiAxXy4gKi8KKyAgICB7IDIsICAyLCB7IDAsIDEgfSwgMEwgfSwgICAgICAvKiAxMC4gKi8KKyAgICB7IDIsICAyLCB7IDk5OSwgMSB9LCA5OTlMIH0sICAvKiAxOS4gKi8KKyAgICB7IDMsICAyLCB7IDk5OSwgMSB9LCAwTCB9LCAgICAvKiAxOV8uICovCisKKyNlbHNlCisgICAgLyogbmFpbHMgY2FzZSwgbnVtYiBzbWFsbGVyIHRoYW4gbG9uZyAqLworICAgIHsgMiwgIDEsIHsgMSB9LCAxTCA8PCBHTVBfTlVNQl9CSVRTIH0sICAvKiAxXy4gKi8KKyAgICB7IDMsICAxLCB7IDEgfSwgMEwgfSwgICAgICAgICAgICAgICAgICAgLyogMV9fLiAqLworCisgICAgeyAyLCAgMiwgeyA5OSwgMSB9LCAgICA5OUwgKyAoMUwgPDwgR01QX05VTUJfQklUUykgfSwgIC8qIDE5LiAqLworICAgIHsgMywgIDIsIHsgMSwgOTkgfSwgICAgMUwgPDwgR01QX05VTUJfQklUUyB9LCAgICAgICAgICAvKiA5MV8uICovCisgICAgeyAzLCAgMywgeyAwLCAxLCA5OSB9LCAxTCA8PCBHTVBfTlVNQl9CSVRTIH0sICAgICAgICAgIC8qIDkxMC4gKi8KKworI2VuZGlmCisgIH07CisKKyAgbXBmX3QgICAgICAgICAgZjsKKyAgdW5zaWduZWQgbG9uZyAgZ290OworICBpbnQgICAgICAgICAgICBpOworICBtcF9saW1iX3QgICAgICBidWZbMjAgKyBudW1iZXJvZihkYXRhW2ldLmQpXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgcmVmbXBuX2ZpbGwgKGJ1ZiwgMTAsIENOU1RfTElNQigweERFQURCRUVGKSk7CisgICAgICByZWZtcG5fY29weSAoYnVmKzEwLCBkYXRhW2ldLmQsIEFCUyhkYXRhW2ldLnNpemUpKTsKKyAgICAgIHJlZm1wbl9maWxsIChidWYrMTArQUJTKGRhdGFbaV0uc2l6ZSksIDEwLCBDTlNUX0xJTUIoMHhERUFEQkVFRikpOworCisgICAgICBQVFIoZikgPSBidWYrMTA7CisgICAgICBFWFAoZikgPSBkYXRhW2ldLmV4cDsKKyAgICAgIFNJWihmKSA9IGRhdGFbaV0uc2l6ZTsKKyAgICAgIFBSRUMoZikgPSBudW1iZXJvZiAoZGF0YVtpXS5kKTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKGYpOworCisgICAgICBnb3QgPSBtcGZfZ2V0X3VpIChmKTsKKyAgICAgIGlmIChnb3QgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIHByaW50ZiAgICAoIm1wZl9nZXRfdWkgd3JvbmcgYXQgbGltYiBkYXRhWyVkXVxuIiwgaSk7CisJICBtcGZfdHJhY2UgKCIgIGYiLCBmKTsKKwkgIG1wbl90cmFjZSAoIiAgZCIsIGRhdGFbaV0uZCwgZGF0YVtpXS5zaXplKTsKKwkgIHByaW50ZiAgICAoIiAgc2l6ZSAlbGRcbiIsIChsb25nKSBkYXRhW2ldLnNpemUpOworCSAgcHJpbnRmICAgICgiICBleHAgJWxkXG4iLCAobG9uZykgZGF0YVtpXS5leHApOworCSAgcHJpbnRmICAgICgiICBnb3QgICAlbHUgKDB4JWxYKVxuIiwgZ290LCBnb3QpOworCSAgcHJpbnRmICAgICgiICB3YW50ICAlbHUgKDB4JWxYKVxuIiwgZGF0YVtpXS53YW50LCBkYXRhW2ldLndhbnQpOworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gMTY7CisKKyAgY2hlY2tfbGltYmRhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWdzcHJlYy5jIGIvdGVzdHMvbXBmL3QtZ3NwcmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwN2YzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LWdzcHJlYy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIFRlc3QgbXBmX2dldF9wcmVjIGFuZCBtcGZfc2V0X3ByZWMuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQKK2NoZWNrX2NvbnNpc3RlbmN5ICh2b2lkKQoreworICBtcGZfdCAgeDsKKyAgdW5zaWduZWQgbG9uZyAgaSwgYSwgYjsKKworICBtcGZfaW5pdCAoeCk7CisKKyAgZm9yIChpID0gMTsgaSA8IDIwMDA7IGkrKykKKyAgICB7CisgICAgICBtcGZfc2V0X3ByZWMgKHgsIGkpOworICAgICAgYSA9IG1wZl9nZXRfcHJlYyAoeCk7CisgICAgICBtcGZfc2V0X3ByZWMgKHgsIGEpOworICAgICAgYiA9IG1wZl9nZXRfcHJlYyAoeCk7CisgICAgICBpZiAoYSAhPSBiKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBmX2dldF9wcmVjIC8gbXBmX3NldF9wcmVjIGluY29uc2lzdGVudFxuIik7CisgICAgICAgICAgcHJpbnRmICgiICAgc2V0ICVsdSBnaXZlcyAlbHUsIGJ1dCB0aGVuIHNldCAlbHUgZ2l2ZXMgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgaSwgYSwKKyAgICAgICAgICAgICAgICAgIGEsIGIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoeCk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfY29uc2lzdGVuY3kgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LWlucF9zdHIuYyBiL3Rlc3RzL21wZi90LWlucF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWUwZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtaW5wX3N0ci5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiBUZXN0IG1wZl9pbnBfc3RyLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3IgdW5saW5rICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisjZGVmaW5lIEZJTEVOQU1FICAiL3RtcC90LWlucF9zdHIudG1wIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICppbnA7CisgICAgaW50ICAgICAgICAgYmFzZTsKKyAgICBjb25zdCBjaGFyICAqd2FudDsKKyAgICBpbnQgICAgICAgICB3YW50X25yZWFkOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICAgMTAsICIwIiwgMSB9LAorCisgICAgeyAiYWJjIiwgMTAsICIwIiwgMCB9LAorICAgIHsgImdoaSIsIDE2LCAiMCIsIDAgfSwKKworICAgIHsgIjEyNSIsICAgIDEwLCAiMTI1IiwgIDMgfSwKKyAgICB7ICIxMjVlMSIsICAxMCwgIjEyNTAiLCA1IH0sCisgICAgeyAiMTJlKzIiLCAgMTAsICIxMjAwIiwgNSB9LAorICAgIHsgIjEyNWUtMSIsIDEwLCAiMTIuNSIsIDYgfSwKKworICAgIHsgICJmZiIsIDE2LCAgIjI1NSIsIDIgfSwKKyAgICB7ICItZmYiLCAxNiwgIi0yNTUiLCAzIH0sCisgICAgeyAgIkZGIiwgMTYsICAiMjU1IiwgMiB9LAorICAgIHsgIi1GRiIsIDE2LCAiLTI1NSIsIDMgfSwKKworICAgIHsgIjEwMCIsICAgICAxNiwgIjI1NiIsICAzIH0sCisgICAgeyAiMTAwQDEiLCAgIDE2LCAiNDA5NiIsIDUgfSwKKyAgICB7ICIxMDBAMTAiLCAgMTYsICI0NzIyMzY2NDgyODY5NjQ1MjEzNjk2IiwgNiB9LAorICAgIHsgIjEwMEAxMCIsIC0xNiwgIjI4MTQ3NDk3NjcxMDY1NiIsICAgICAgICA2IH0sCisgICAgeyAiMTAwQC0xIiwgIDE2LCAiMTYiLCAgIDYgfSwKKyAgICB7ICIxMDAwMDAwMDAwMDAwMDAwMEAtMTAiLCAgMTYsICIxIiwgMjEgfSwKKyAgICB7ICIxMDAwMDAwMDAwMEAtMTAiLCAgICAgICAtMTYsICIxIiwgMTUgfSwKKworICAgIHsgInoiLCAzNiwgIjM1IiwgMSB9LAorICAgIHsgIloiLCAzNiwgIjM1IiwgMSB9LAorICAgIHsgInpAMSIsIDM2LCAiMTI2MCIsIDMgfSwKKyAgICB7ICJaQDEiLCAzNiwgIjEyNjAiLCAzIH0sCisKKyAgICB7ICAiMCIsICAgICAgMCwgICAiMCIsIDEgfSwKKyAgfTsKKworICBtcGZfdCAgZ290LCB3YW50OworICBsb25nICAgZnRlbGxfbnJlYWQ7CisgIGludCAgICBpLCBwcmUsIHBvc3QsIGosIGdvdF9ucmVhZCwgd2FudF9ucmVhZDsKKyAgRklMRSAgICpmcDsKKworICBtcGZfaW5pdCAoZ290KTsKKyAgbXBmX2luaXQgKHdhbnQpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBmb3IgKHByZSA9IDA7IHByZSA8PSAzOyBwcmUrKykKKyAgICAgICAgeworICAgICAgICAgIGZvciAocG9zdCA9IDA7IHBvc3QgPD0gMjsgcG9zdCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGZfc2V0X3N0cl9vcl9hYm9ydCAod2FudCwgZGF0YVtpXS53YW50LCAxMCk7CisgICAgICAgICAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHdhbnQpOworCisgICAgICAgICAgICAgIC8qIGNyZWF0ZSB0aGUgZmlsZSBuZXcgZWFjaCB0aW1lIHRvIGVuc3VyZSBpdHMgbGVuZ3RoIGlzIHdoYXQKKyAgICAgICAgICAgICAgICAgd2Ugd2FudCAqLworICAgICAgICAgICAgICBmcCA9IGZvcGVuIChGSUxFTkFNRSwgIncrIik7CisgICAgICAgICAgICAgIEFTU0VSVF9BTFdBWVMgKGZwICE9IE5VTEwpOworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJlOyBqKyspCisgICAgICAgICAgICAgICAgcHV0YyAoJyAnLCBmcCk7CisgICAgICAgICAgICAgIGZwdXRzIChkYXRhW2ldLmlucCwgZnApOworICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcG9zdDsgaisrKQorICAgICAgICAgICAgICAgIHB1dGMgKCcgJywgZnApOworICAgICAgICAgICAgICBmZmx1c2ggKGZwKTsKKyAgICAgICAgICAgICAgQVNTRVJUX0FMV0FZUyAoISBmZXJyb3IoZnApKTsKKworICAgICAgICAgICAgICByZXdpbmQgKGZwKTsKKyAgICAgICAgICAgICAgZ290X25yZWFkID0gbXBmX2lucF9zdHIgKGdvdCwgZnAsIGRhdGFbaV0uYmFzZSk7CisKKyAgICAgICAgICAgICAgaWYgKGdvdF9ucmVhZCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZ0ZWxsX25yZWFkID0gZnRlbGwgKGZwKTsKKyAgICAgICAgICAgICAgICAgIGlmIChnb3RfbnJlYWQgIT0gZnRlbGxfbnJlYWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJtcGZfaW5wX3N0ciBucmVhZCB3cm9uZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBpbnAgICAgICAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBiYXNlICAgICAgICAgJWRcbiIsIGRhdGFbaV0uYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBwcmUgICAgICAgICAgJWRcbiIsIHByZSk7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBwb3N0ICAgICAgICAgJWRcbiIsIHBvc3QpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgZ290X25yZWFkICAgICVkXG4iLCBnb3RfbnJlYWQpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgZnRlbGxfbnJlYWQgICVsZFxuIiwgZnRlbGxfbnJlYWQpOworICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGlmIGRhdGFbaV0uaW5wIGlzIGEgd2hvbGUgc3RyaW5nIHRvIHJlYWQgYW5kIHRoZXJlJ3Mgbm8gcG9zdAorICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIHRoZW4gZXhwZWN0IHRvIGhhdmUgRU9GICovCisgICAgICAgICAgICAgIGlmIChwb3N0ID09IDAgJiYgZGF0YVtpXS53YW50X25yZWFkID09IHN0cmxlbihkYXRhW2ldLmlucCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50ICBjID0gZ2V0YyhmcCk7CisgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBFT0YpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJtcGZfaW5wX3N0ciBkaWRuJ3QgcmVhZCB0byBFT0ZcbiIpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgaW5wICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBiYXNlICAlZFxuIiwgZGF0YVtpXS5iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgIHByZSAgICVkXG4iLCBwcmUpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgcG9zdCAgJWRcbiIsIHBvc3QpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgYyAgICAgJyVjJyAlI3hcbiIsIGMsIGMpOworICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIG9ubHkgZXhwZWN0ICJwcmUiIGluY2x1ZGVkIGluIHRoZSBjb3VudCB3aGVuIG5vbi16ZXJvICovCisgICAgICAgICAgICAgIHdhbnRfbnJlYWQgPSBkYXRhW2ldLndhbnRfbnJlYWQ7CisgICAgICAgICAgICAgIGlmICh3YW50X25yZWFkICE9IDApCisgICAgICAgICAgICAgICAgd2FudF9ucmVhZCArPSBwcmU7CisKKyAgICAgICAgICAgICAgaWYgKGdvdF9ucmVhZCAhPSB3YW50X25yZWFkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIm1wZl9pbnBfc3RyIG5yZWFkIHdyb25nXG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgaW5wICAgICAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisgICAgICAgICAgICAgICAgICBwcmludGYgKCIgIGJhc2UgICAgICAgICVkXG4iLCBkYXRhW2ldLmJhc2UpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBwcmUgICAgICAgICAlZFxuIiwgcHJlKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgcG9zdCAgICAgICAgJWRcbiIsIHBvc3QpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBnb3RfbnJlYWQgICAlZFxuIiwgZ290X25yZWFkKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgd2FudF9ucmVhZCAgJWRcbiIsIHdhbnRfbnJlYWQpOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIE1QRl9DSEVDS19GT1JNQVQgKGdvdCk7CisKKyAgICAgICAgICAgICAgaWYgKG1wZl9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgKCJtcGZfaW5wX3N0ciB3cm9uZyByZXN1bHRcbiIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICBpbnAgICBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgYmFzZSAgJWRcbiIsIGRhdGFbaV0uYmFzZSk7CisgICAgICAgICAgICAgICAgICBtcGZfdHJhY2UgKCIgIGdvdCAiLCAgZ290KTsKKyAgICAgICAgICAgICAgICAgIG1wZl90cmFjZSAoIiAgd2FudCIsIHdhbnQpOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEFTU0VSVF9BTFdBWVMgKGZjbG9zZSAoZnApID09IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoZ290KTsKKyAgbXBmX2NsZWFyICh3YW50KTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHVubGluayAoRklMRU5BTUUpOworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtaW50X3AuYyBiL3Rlc3RzL21wZi90LWludF9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1MzZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LWludF9wLmMKQEAgLTAsMCArMSw5MCBAQAorLyogVGVzdCBtcGZfaW50ZWdlcl9wLgorCitDb3B5cmlnaHQgMjAwMSwgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK29uZSAobXBmX3NyY3B0ciBmLCBpbnQgd2FudCkKK3sKKyAgaW50ICBnb3Q7CisgIGdvdCA9IG1wZl9pbnRlZ2VyX3AgKGYpOworICBpZiAoZ290ICE9IHdhbnQpCisgICAgeworICAgICAgcHJpbnRmICgibXBmX2ludGVnZXJfcCBnb3QgJWQgd2FudCAlZFxuIiwgZ290LCB3YW50KTsKKyAgICAgIG1wZl90cmFjZSAoIiBmIiwgZik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK2FsbCAobXBmX3B0ciBmLCBpbnQgd2FudCkKK3sKKyAgb25lIChmLCB3YW50KTsKKyAgbXBmX25lZyAoZiwgZik7CisgIG9uZSAoZiwgd2FudCk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgbXBmX3QgIGY7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wZl9pbml0MiAoZiwgMjAwTCk7CisKKyAgbXBmX3NldF91aSAoZiwgMEwpOworICBvbmUgKGYsIDEpOworCisgIG1wZl9zZXRfdWkgKGYsIDFMKTsKKyAgYWxsIChmLCAxKTsKKworICBtcGZfc2V0X3VpIChmLCAxTCk7CisgIG1wZl9kaXZfMmV4cCAoZiwgZiwgMUwpOworICBhbGwgKGYsIDApOworCisgIG1wZl9zZXRfdWkgKGYsIDFMKTsKKyAgbXBmX2Rpdl8yZXhwIChmLCBmLCA1MDAwTCk7CisgIGFsbCAoZiwgMCk7CisKKyAgbXBmX3NldF91aSAoZiwgMUwpOworICBtcGZfbXVsXzJleHAgKGYsIGYsIDUwMDBMKTsKKyAgYWxsIChmLCAxKTsKKworICBtcGZfc2V0X3N0ciAoZiwgIjAuNSIsIDEwKTsKKyAgYWxsIChmLCAwKTsKKworICBtcGZfc2V0X3N0ciAoZiwgIjIuNSIsIDEwKTsKKyAgYWxsIChmLCAwKTsKKworICBtcGZfc2V0X3VpIChmLCAxTCk7CisgIG1wZl9kaXZfdWkgKGYsIGYsIDNMKTsKKyAgYWxsIChmLCAwKTsKKworICBtcGZfc2V0X3VpIChmLCA3TCk7CisgIG1wZl9kaXZfdWkgKGYsIGYsIDNMKTsKKyAgYWxsIChmLCAwKTsKKworICBtcGZfY2xlYXIgKGYpOworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtbXVsX3VpLmMgYi90ZXN0cy9tcGYvdC1tdWxfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYyYmIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtbXVsX3VpLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEV4ZXJjaXNlIG1wZl9tdWxfdWkuCisKK0NvcHlyaWdodCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfb25lIChjb25zdCBjaGFyICpkZXNjLCBtcGZfcHRyIGdvdCwgbXBmX3NyY3B0ciB1LCB1bnNpZ25lZCBsb25nIHYpCit7CisgIG1wX3NpemVfdCAgdXNpemUsIHVzaWduOworICBtcF9wdHIgICAgIHdwOworICBtcGZfdCAgICAgIHdhbnQ7CisKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworICAvKiB0aGlzIGNvZGUgbm90IG5haWxpZmllZCB5ZXQgKi8KKyAgQVNTRVJUX0FMV0FZUyAoQklUU19QRVJfVUxPTkcgPD0gR01QX05VTUJfQklUUyk7CisgIHVzaWduID0gU0laICh1KTsKKyAgdXNpemUgPSBBQlMgKHVzaWduKTsKKyAgd3AgPSByZWZtcG5fbWFsbG9jX2xpbWJzICh1c2l6ZSArIDEpOworICB3cFt1c2l6ZV0gPSBtcG5fbXVsXzEgKHdwLCBQVFIodSksIHVzaXplLCAobXBfbGltYl90KSB2KTsKKworICBQVFIod2FudCkgPSB3cDsKKyAgU0laKHdhbnQpID0gKHVzaWduID49IDAgPyB1c2l6ZSsxIDogLSh1c2l6ZSsxKSk7CisgIEVYUCh3YW50KSA9IEVYUCh1KSArIDE7CisgIHJlZm1wZl9ub3JtYWxpemUgKHdhbnQpOworCisgIGlmICghIHJlZm1wZl92YWxpZGF0ZSAoIm1wZl9tdWxfdWkiLCBnb3QsIHdhbnQpKQorICAgIHsKKyAgICAgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisgICAgICBwcmludGYgICAgKCIgICVzXG4iLCBkZXNjKTsKKyAgICAgIG1wZl90cmFjZSAoIiAgdSIsIHUpOworICAgICAgcHJpbnRmICAgICgiICB2ICVsZCAgMHglbFhcbiIsIHYsIHYpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGZyZWUgKHdwKTsKK30KKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgbWluX3ByZWMgPSBfX0dNUEZfQklUU19UT19QUkVDICgxKTsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzID0gUkFORFM7CisgIG1wZl90ICAgICAgICAgICAgICBnb3QsIHU7CisgIHVuc2lnbmVkIGxvbmcgICAgICBwcmVjLCB2OworICBpbnQgICAgICAgICAgICAgICAgaTsKKworICAvKiBUaGUgbmFpbHMgY29kZSBpbiBtcGZfbXVsX3VpIGN1cnJlbnRseSBpc24ndCBleGFjdCwgc28gc3VwcHJlc3MgdGhlc2UKKyAgICAgdGVzdHMgZm9yIG5vdy4gICovCisgIGlmIChCSVRTX1BFUl9VTE9ORyA+IEdNUF9OVU1CX0JJVFMpCisgICAgcmV0dXJuOworCisgIG1wZl9pbml0IChnb3QpOworICBtcGZfaW5pdCAodSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKQorICAgIHsKKyAgICAgIC8qIGdvdCBwcmVjaXNpb24gKi8KKyAgICAgIHByZWMgPSBtaW5fcHJlYyArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDE1TCk7CisgICAgICByZWZtcGZfc2V0X3ByZWNfbGltYnMgKGdvdCwgcHJlYyk7CisKKyAgICAgIC8qIHUgcHJlY2lzaW9uICovCisgICAgICBwcmVjID0gbWluX3ByZWMgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAxNUwpOworICAgICAgcmVmbXBmX3NldF9wcmVjX2xpbWJzICh1LCBwcmVjKTsKKworICAgICAgLyogdSwgcG9zc2libHkgbmVnYXRpdmUgKi8KKyAgICAgIG1wZl9yYW5kb20yICh1LCBQUkVDKHUpLCAobXBfZXhwX3QpIDIwKTsKKyAgICAgIGlmIChnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLCAxTCkpCisgICAgICAgIG1wZl9uZWcgKHUsIHUpOworCisgICAgICAvKiB2LCAwIHRvIEJJVFNfUEVSX1VMT05HIGJpdHMgKGluY2x1c2l2ZSkgKi8KKyAgICAgIHByZWMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBCSVRTX1BFUl9VTE9ORysxKTsKKyAgICAgIHYgPSBnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLCBwcmVjKTsKKworICAgICAgaWYgKChpICUgMikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIHNlcGFyYXRlICovCisgICAgICAgICAgbXBmX211bF91aSAoZ290LCB1LCB2KTsKKyAgICAgICAgICBjaGVja19vbmUgKCJzZXBhcmF0ZSIsIGdvdCwgdSwgdik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIG92ZXJsYXAgKi8KKyAgICAgICAgICBwcmVjID0gcmVmbXBmX3NldF9vdmVybGFwIChnb3QsIHUpOworICAgICAgICAgIG1wZl9tdWxfdWkgKGdvdCwgZ290LCB2KTsKKyAgICAgICAgICBjaGVja19vbmUgKCJvdmVybGFwIHNyYz09ZHN0IiwgZ290LCB1LCB2KTsKKworICAgICAgICAgIG1wZl9zZXRfcHJlY19yYXcgKGdvdCwgcHJlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChnb3QpOworICBtcGZfY2xlYXIgKHUpOworfQorCit2b2lkCitjaGVja192YXJpb3VzICh2b2lkKQoreworICBtcGZfdCAgdSwgZ290LCB3YW50OworICBjb25zdCBjaGFyICAgKnM7CisKKyAgbXBmX2luaXQyICh1LCAgICAyKjgqc2l6ZW9mKGxvbmcpKTsKKyAgbXBmX2luaXQyIChnb3QsICAyKjgqc2l6ZW9mKGxvbmcpKTsKKyAgbXBmX2luaXQyICh3YW50LCAyKjgqc2l6ZW9mKGxvbmcpKTsKKworICBzID0gIjAgKiBVTE9OR19NQVgiOworICBtcGZfc2V0X3VpICh1LCAwTCk7CisgIG1wZl9tdWxfdWkgKGdvdCwgdSwgVUxPTkdfTUFYKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgbXBmX3NldF91aSAod2FudCwgMEwpOworICBpZiAobXBmX2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIHsKKyAgICBlcnJvcjoKKyAgICAgIHByaW50ZiAoIldyb25nIHJlc3VsdCBmcm9tICVzXG4iLCBzKTsKKyAgICAgIG1wZl90cmFjZSAoInUgICAiLCB1KTsKKyAgICAgIG1wZl90cmFjZSAoImdvdCAiLCBnb3QpOworICAgICAgbXBmX3RyYWNlICgid2FudCIsIHdhbnQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHMgPSAiMSAqIFVMT05HX01BWCI7CisgIG1wZl9zZXRfdWkgKHUsIDFMKTsKKyAgbXBmX211bF91aSAoZ290LCB1LCBVTE9OR19NQVgpOworICBNUEZfQ0hFQ0tfRk9STUFUIChnb3QpOworICBtcGZfc2V0X3VpICh3YW50LCBVTE9OR19NQVgpOworICBpZiAobXBmX2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgbXBmX2NsZWFyICh1KTsKKyAgbXBmX2NsZWFyIChnb3QpOworICBtcGZfY2xlYXIgKHdhbnQpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX3ZhcmlvdXMgKCk7CisgIGNoZWNrX3JhbmQgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LW11bGRpdi5jIGIvdGVzdHMvbXBmL3QtbXVsZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkY2E1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LW11bGRpdi5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiBUZXN0IG1wZl9tdWwsIG1wZl9kaXYsIG1wZl91aV9kaXYsIGFuZCBtcGZfZGl2X3VpLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMCwgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDE2CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wX3NpemVfdCBzaXplOworICBtcF9leHBfdCBleHA7CisgIGludCByZXBzID0gMTAwMDA7CisgIGludCBpOworICBtcGZfdCB1LCB2LCB3LCB4OworICBtcF9zaXplX3QgYnByZWMgPSBTSVpFICogR01QX0xJTUJfQklUUzsKKyAgbXBmX3QgcmVyciwgbGltaXRfcmVycjsKKyAgdW5zaWduZWQgbG9uZyB1bGltYiwgdmxpbWI7CisgIGludCBzaW5nbGVfZmxhZzsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBpZiAoYXJnYyA+IDEpCisgICAgeworICAgICAgcmVwcyA9IHN0cnRvbCAoYXJndlsxXSwgMCwgMCk7CisgICAgICBpZiAoYXJnYyA+IDIpCisJYnByZWMgPSBzdHJ0b2wgKGFyZ3ZbMl0sIDAsIDApOworICAgIH0KKworICBtcGZfc2V0X2RlZmF1bHRfcHJlYyAoYnByZWMpOworCisgIG1wZl9pbml0IChyZXJyKTsKKyAgbXBmX2luaXQgKGxpbWl0X3JlcnIpOworCisgIG1wZl9pbml0ICh1KTsKKyAgbXBmX2luaXQgKHYpOworICBtcGZfaW5pdCAodyk7CisgIG1wZl9pbml0ICh4KTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCByZXNfcHJlYzsKKworICAgICAgcmVzX3ByZWMgPSB1cmFuZG9tICgpICUgYnByZWMgKyAxOworICAgICAgbXBmX3NldF9wcmVjICh3LCByZXNfcHJlYyk7CisgICAgICBtcGZfc2V0X3ByZWMgKHgsIHJlc19wcmVjKTsKKworICAgICAgbXBmX3NldF91aSAobGltaXRfcmVyciwgMSk7CisgICAgICBtcGZfZGl2XzJleHAgKGxpbWl0X3JlcnIsIGxpbWl0X3JlcnIsIHJlc19wcmVjIC0gMSk7CisKKyAgICAgIHNpbmdsZV9mbGFnID0gMDsKKworICAgICAgaWYgKCh1cmFuZG9tICgpICYgMSkgIT0gMCkKKwl7CisJICBzaXplID0gdXJhbmRvbSAoKSAlICgyICogU0laRSkgLSBTSVpFOworCSAgZXhwID0gdXJhbmRvbSAoKSAlIFNJWkU7CisJICBtcGZfcmFuZG9tMiAodSwgc2l6ZSwgZXhwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdWxpbWIgPSB1cmFuZG9tICgpOworCSAgbXBmX3NldF91aSAodSwgdWxpbWIpOworCSAgc2luZ2xlX2ZsYWcgPSAxOworCX0KKworICAgICAgaWYgKCh1cmFuZG9tICgpICYgMSkgIT0gMCkKKwl7CisJICBzaXplID0gdXJhbmRvbSAoKSAlICgyICogU0laRSkgLSBTSVpFOworCSAgZXhwID0gdXJhbmRvbSAoKSAlIFNJWkU7CisJICBtcGZfcmFuZG9tMiAodiwgc2l6ZSwgZXhwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmxpbWIgPSB1cmFuZG9tICgpOworCSAgbXBmX3NldF91aSAodiwgdmxpbWIpOworCSAgc2luZ2xlX2ZsYWcgPSAyOworCX0KKworICAgICAgaWYgKG1wZl9zZ24gKHYpID09IDApCisJY29udGludWU7CisKKyAgICAgIG1wZl9kaXYgKHcsIHUsIHYpOworICAgICAgbXBmX211bCAoeCwgdywgdik7CisgICAgICBtcGZfcmVsZGlmZiAocmVyciwgdSwgeCk7CisgICAgICBpZiAobXBmX2NtcCAocmVyciwgbGltaXRfcmVycikgPiAwKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SIGluIG1wZl9tdWwgb3IgbXBmX2RpdiBhZnRlciAlZCB0ZXN0c1xuIiwgaSk7CisJICBwcmludGYgKCIgICB1ID0gIik7IG1wZl9kdW1wICh1KTsKKwkgIHByaW50ZiAoIiAgIHYgPSAiKTsgbXBmX2R1bXAgKHYpOworCSAgcHJpbnRmICgiICAgeCA9ICIpOyBtcGZfZHVtcCAoeCk7CisJICBwcmludGYgKCIgICB3ID0gIik7IG1wZl9kdW1wICh3KTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKHNpbmdsZV9mbGFnID09IDIpCisJeworCSAgbXBmX2Rpdl91aSAoeCwgdSwgdmxpbWIpOworCSAgbXBmX3JlbGRpZmYgKHJlcnIsIHcsIHgpOworCSAgaWYgKG1wZl9jbXAgKHJlcnIsIGxpbWl0X3JlcnIpID4gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIkVSUk9SIGluIG1wZl9kaXYgb3IgbXBmX2Rpdl91aSBhZnRlciAlZCB0ZXN0c1xuIiwgaSk7CisJICAgICAgcHJpbnRmICgiICAgdSA9ICIpOyBtcGZfZHVtcCAodSk7CisJICAgICAgcHJpbnRmICgiICAgdiA9ICIpOyBtcGZfZHVtcCAodik7CisJICAgICAgcHJpbnRmICgiICAgeCA9ICIpOyBtcGZfZHVtcCAoeCk7CisJICAgICAgcHJpbnRmICgiICAgdyA9ICIpOyBtcGZfZHVtcCAodyk7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzaW5nbGVfZmxhZyA9PSAxKQorCXsKKwkgIG1wZl91aV9kaXYgKHgsIHVsaW1iLCB2KTsKKwkgIG1wZl9yZWxkaWZmIChyZXJyLCB3LCB4KTsKKwkgIGlmIChtcGZfY21wIChyZXJyLCBsaW1pdF9yZXJyKSA+IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJFUlJPUiBpbiBtcGZfZGl2IG9yIG1wZl91aV9kaXYgYWZ0ZXIgJWQgdGVzdHNcbiIsIGkpOworCSAgICAgIHByaW50ZiAoIiAgIHUgPSAiKTsgbXBmX2R1bXAgKHUpOworCSAgICAgIHByaW50ZiAoIiAgIHYgPSAiKTsgbXBmX2R1bXAgKHYpOworCSAgICAgIHByaW50ZiAoIiAgIHggPSAiKTsgbXBmX2R1bXAgKHgpOworCSAgICAgIHByaW50ZiAoIiAgIHcgPSAiKTsgbXBmX2R1bXAgKHcpOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJfQorICAgIH0KKworICBtcGZfY2xlYXIgKHJlcnIpOworICBtcGZfY2xlYXIgKGxpbWl0X3JlcnIpOworCisgIG1wZl9jbGVhciAodSk7CisgIG1wZl9jbGVhciAodik7CisgIG1wZl9jbGVhciAodyk7CisgIG1wZl9jbGVhciAoeCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LXBvd191aS5jIGIvdGVzdHMvbXBmL3QtcG93X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNTMwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LXBvd191aS5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFRlc3QgbXBmX3Bvd191aQorCitDb3B5cmlnaHQgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHVuc2lnbmVkIGludCBiLCBlOworICBtcGZfdCBiMSwgciwgcjIsIGxpbWl0OworCisgIG1wZl9pbml0cyAoYjEsIHIsIHIyLCBOVUxMKTsKKyAgbXBmX2luaXRfc2V0X3VpIChsaW1pdCwgMSk7CisgIG1wZl9tdWxfMmV4cCAobGltaXQsIGxpbWl0LCBNQVggKEdNUF9OVU1CX0JJVFMsIDUzKSk7CisKKyAgLyogVGhpcyB0ZXN0IGp1c3QgdGVzdCBpbnRlZ2VycyB3aXRoIHJlc3VsdHMgdGhhdCBmaXQgaW4gYSBzaW5nbGUKKyAgICAgbGltYiBvciA1MyBiaXRzLiAgVGhpcyBhdm9pZHMgYW55IHJvdW5kaW5nLiAgKi8KKworICBmb3IgKGIgPSAwOyBiIDw9IDQwMDsgYisrKQorICAgIHsKKyAgICAgIG1wZl9zZXRfdWkgKGIxLCBiKTsKKyAgICAgIG1wZl9zZXRfdWkgKHIyLCAxKTsKKyAgICAgIGZvciAoZSA9IDA7IGUgPD0gR01QX0xJTUJfQklUUzsgZSsrKQorCXsKKwkgIG1wZl9wb3dfdWkgKHIsIGIxLCBlKTsKKworCSAgaWYgKG1wZl9jbXAgKHIsIHIyKSkKKwkgICAgYWJvcnQgKCk7CisKKwkgIG1wZl9tdWxfdWkgKHIyLCByMiwgYik7CisKKwkgIGlmIChtcGZfY21wIChyMiwgbGltaXQpID49IDApCisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgbXBmX2NsZWFycyAoYjEsIHIsIHIyLCBsaW1pdCwgTlVMTCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcGYvdC1zZXQuYyBiL3Rlc3RzL21wZi90LXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTA3NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcGYvdC1zZXQuYwpAQCAtMCwwICsxLDExMiBAQAorLyogVGVzdCBtcGZfc2V0LCBtcGZfaW5pdF9zZXQuCisKK0NvcHlyaWdodCAyMDA0LCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQKK2NoZWNrX3JldXNlICh2b2lkKQoreworICAvKiBUcnkgbXBmX3NldChmLGYpIHdoZW4gZiBpcyBiaWdnZXIgdGhhbiBwcmVjLiAgSW4gdGhlIHBhc3QgdGhpcyBoYWQKKyAgICAgcmVzdWx0ZWQgaW4gYW4gTVBOX0NPUFkgd2l0aCBpbnZhbGlkIG9wZXJhbmQgb3ZlcmxhcC4gKi8KKyAgbXBmX3QgIGY7CisgIG1wX3NpemVfdCAgICAgIGxpbWJzID0gMjA7CisgIHVuc2lnbmVkIGxvbmcgIGJpdHMgPSBsaW1icyAqIEdNUF9OVU1CX0JJVFM7CisgIG1wZl9pbml0MiAoZiwgYml0cyk7CisgIHJlZm1wZl9maWxsIChmLCBsaW1icywgR01QX05VTUJfTUFYKTsKKyAgbXBmX3NldF9wcmVjX3JhdyAoZiwgYml0cyAvIDIpOworICBtcGZfc2V0IChmLCBmKTsKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoZik7CisgIG1wZl9zZXRfcHJlY19yYXcgKGYsIGJpdHMpOworICBtcGZfY2xlYXIgKGYpOworfQorCit2b2lkCitjaGVja19yYW5kb20gKGxvbmcgcmVwcykKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXBmX3QgYSwgYjsKKyAgbXB6X3QgejsKKyAgaW50IHByZWNiaXRzOworCisjZGVmaW5lIFBSRUNCSVRTIDEwCisKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoeik7CisgIG1wZl9pbml0MiAoYSwgMSA8PCBQUkVDQklUUyk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IHJlcHM7IHRlc3QrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKHosIHJhbmRzLCBQUkVDQklUUyArIDEpOworICAgICAgcHJlY2JpdHMgPSBtcHpfZ2V0X3VpICh6KSArIDE7CisgICAgICBtcHpfdXJhbmRvbWIgKHosIHJhbmRzLCBwcmVjYml0cyk7CisgICAgICBtcHpfc2V0Yml0ICh6LCBwcmVjYml0cyAgLSAxKTsJLyogbWFrZSBzdXJlIG1zYiBpcyBzZXQgKi8KKyAgICAgIG1wZl9zZXRfeiAoYSwgeik7CisgICAgICBpZiAocHJlY2JpdHMgJiAxKQorCW1wZl9uZWcgKGEsIGEpOworICAgICAgbXB6X3VyYW5kb21iICh6LCByYW5kcywgUFJFQ0JJVFMpOworICAgICAgbXBmX2Rpdl8yZXhwIChhLCBhLCBtcHpfZ2V0X3VpICh6KSArIDEpOworICAgICAgbXB6X3VyYW5kb21iICh6LCByYW5kcywgUFJFQ0JJVFMpOworICAgICAgcHJlY2JpdHMgLT0gbXB6X2dldF91aSAoeik7CisgICAgICBpZiAocHJlY2JpdHMgPD0gMCkKKwlwcmVjYml0cyA9IDEgLSBwcmVjYml0czsKKyAgICAgIG1wZl9zZXRfZGVmYXVsdF9wcmVjIChwcmVjYml0cyk7CisKKyAgICAgIG1wZl9pbml0X3NldCAoYiwgYSk7CisgICAgICBNUEZfQ0hFQ0tfRk9STUFUIChiKTsKKyAgICAgIGlmICghbXBmX2VxIChhLCBiLCBwcmVjYml0cykpCisJeworCSAgcHJpbnRmICgibXBmX2luaXRfc2V0IHdyb25nLlxuIik7CisJICBhYm9ydCgpOworCX0KKworICAgICAgbXBmX3NldF91aSAoYiwgMCk7CisgICAgICBtcGZfc2V0IChiLCBhKTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKGIpOworICAgICAgaWYgKCFtcGZfZXEgKGEsIGIsIHByZWNiaXRzKSkKKwl7CisJICBwcmludGYgKCJtcGZfc2V0IHdyb25nLlxuIik7CisJICBhYm9ydCgpOworCX0KKworICAgICAgbXBmX2NsZWFyIChiKTsKKyAgICB9CisKKyAgbXBmX2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyICh6KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBsb25nIHJlcHMgPSAxMDAwMDsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgY2hlY2tfcmV1c2UgKCk7CisgIGNoZWNrX3JhbmRvbSAocmVwcyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LXNldF9xLmMgYi90ZXN0cy9tcGYvdC1zZXRfcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGVjNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcGYvdC1zZXRfcS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKiBUZXN0IG1wZl9zZXRfcS4KKworQ29weXJpZ2h0IDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKG1wZl9wdHIgZ290LCBtcHFfc3JjcHRyIHEpCit7CisgIG1wZl90ICBuLCBkOworCisgIG1wZl9zZXRfcSAoZ290LCBxKTsKKworICBQVFIobikgPSBQVFIoJnEtPl9tcF9udW0pOworICBTSVoobikgPSBTSVooJnEtPl9tcF9udW0pOworICBFWFAobikgPSBBQlNJWigmcS0+X21wX251bSk7CisKKyAgUFRSKGQpID0gUFRSKCZxLT5fbXBfZGVuKTsKKyAgU0laKGQpID0gU0laKCZxLT5fbXBfZGVuKTsKKyAgRVhQKGQpID0gQUJTSVooJnEtPl9tcF9kZW4pOworCisgIGlmICghIHJlZm1wZl92YWxpZGF0ZV9kaXZpc2lvbiAoIm1wZl9zZXRfcSIsIGdvdCwgbiwgZCkpCisgICAgeworICAgICAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKyAgICAgIG1wcV90cmFjZSAoIiAgIHEiLCBxKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgbWluX3ByZWMgPSBfX0dNUEZfQklUU19UT19QUkVDICgxKTsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzID0gUkFORFM7CisgIHVuc2lnbmVkIGxvbmcgIHByZWM7CisgIG1wZl90ICBnb3Q7CisgIG1wcV90ICBxOworICBpbnQgICAgaTsKKworICBtcGZfaW5pdCAoZ290KTsKKyAgbXBxX2luaXQgKHEpOworCisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykKKyAgICB7CisgICAgICAvKiByZXN1bHQgcHJlY2lzaW9uICovCisgICAgICBwcmVjID0gbWluX3ByZWMgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAyMEwpOworICAgICAgcmVmbXBmX3NldF9wcmVjX2xpbWJzIChnb3QsIHByZWMpOworCisgICAgICAvKiBudW0gKi8KKyAgICAgIHByZWMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAyMEwgKiBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIG1wel9ycmFuZG9tYiAobXBxX251bXJlZihxKSwgcmFuZHMsIHByZWMpOworCisgICAgICAvKiBwb3NzaWJseSBuZWdhdGl2ZSBudW0gKi8KKyAgICAgIGlmIChnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLCAxTCkpCisgICAgICAgIG1wel9uZWcgKG1wcV9udW1yZWYocSksIG1wcV9udW1yZWYocSkpOworCisgICAgICAvKiBkZW4sIG5vbi16ZXJvICovCisgICAgICBkbyB7CisgICAgICAgIHByZWMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAyMEwgKiBHTVBfTlVNQl9CSVRTKTsKKyAgICAgICAgbXB6X3JyYW5kb21iIChtcHFfZGVucmVmKHEpLCByYW5kcywgcHJlYyk7CisgICAgICB9IHdoaWxlIChtcHpfc2duIChtcHFfZGVucmVmKHEpKSA8PSAwKTsKKworICAgICAgY2hlY2tfb25lIChnb3QsIHEpOworICAgIH0KKworICBtcGZfY2xlYXIgKGdvdCk7CisgIG1wcV9jbGVhciAocSk7Cit9CisKK3ZvaWQKK2NoZWNrX3ZhcmlvdXMgKHZvaWQpCit7CisgIG1wZl90IGdvdDsKKyAgbXBxX3QgcTsKKworICBtcGZfaW5pdCAoZ290KTsKKyAgbXBxX2luaXQgKHEpOworCisgIC8qIDEvMSA9PSAxICovCisgIG1wZl9zZXRfcHJlYyAoZ290LCAyMEwpOworICBtcHFfc2V0X3VpIChxLCAxTCwgMUwpOworICBtcGZfc2V0X3EgKGdvdCwgcSk7CisgIE1QRl9DSEVDS19GT1JNQVQgKGdvdCk7CisgIEFTU0VSVF9BTFdBWVMgKG1wZl9jbXBfdWkgKGdvdCwgMUwpID09IDApOworCisgIC8qIDEvKDJebisxKSwgYSBjYXNlIHdoZXJlIHRydW5jYXRpbmcgdGhlIGRpdmlzb3Igd291bGQgYmUgd3JvbmcgKi8KKyAgbXBmX3NldF9wcmVjIChnb3QsIDUwMEwpOworICBtcHFfc2V0X3VpIChxLCAxTCwgMUwpOworICBtcHpfbXVsXzJleHAgKG1wcV9kZW5yZWYocSksIG1wcV9kZW5yZWYocSksIDgwMEwpOworICBtcHpfYWRkX3VpIChtcHFfZGVucmVmKHEpLCBtcHFfZGVucmVmKHEpLCAxTCk7CisgIGNoZWNrX29uZSAoZ290LCBxKTsKKworICBtcGZfY2xlYXIgKGdvdCk7CisgIG1wcV9jbGVhciAocSk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKyAgY2hlY2tfcmFuZCAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3Qtc2V0X3NpLmMgYi90ZXN0cy9tcGYvdC1zZXRfc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q2Yzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3Qtc2V0X3NpLmMKQEAgLTAsMCArMSw5MCBAQAorLyogVGVzdCBtcGZfc2V0X3NpIGFuZCBtcGZfaW5pdF9zZXRfc2kuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGxvbmcgICAgICAgeDsKKyAgICBtcF9zaXplX3QgIHdhbnRfc2l6ZTsKKyAgICBtcF9saW1iX3QgIHdhbnRfZGF0YVsyXTsKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7ICAwTCwgIDAgfSwKKyAgICB7ICAxTCwgIDEsIHsgMSB9IH0sCisgICAgeyAtMUwsIC0xLCB7IDEgfSB9LAorCisjaWYgR01QX05VTUJfQklUUyA+PSBCSVRTX1BFUl9VTE9ORworICAgIHsgTE9OR19NQVgsICAxLCB7IExPTkdfTUFYLCAwIH0gfSwKKyAgICB7IC1MT05HX01BWCwgIC0xLCB7IExPTkdfTUFYLCAwIH0gfSwKKyAgICB7IExPTkdfSElHSEJJVCwgIC0xLCB7IFVMT05HX0hJR0hCSVQsIDAgfSB9LAorI2Vsc2UKKyAgICB7IExPTkdfTUFYLCAgMiwgeyBMT05HX01BWCAmIEdNUF9OVU1CX01BU0ssIExPTkdfTUFYID4+IEdNUF9OVU1CX0JJVFMgfSB9LAorICAgIHsgLUxPTkdfTUFYLCAgLTIsIHsgTE9OR19NQVggJiBHTVBfTlVNQl9NQVNLLCBMT05HX01BWCA+PiBHTVBfTlVNQl9CSVRTIH19LAorICAgIHsgTE9OR19ISUdIQklULCAgLTIsIHsgMCwgVUxPTkdfSElHSEJJVCA+PiBHTVBfTlVNQl9CSVRTIH0gfSwKKyNlbmRpZgorICB9OworCisgIG1wZl90ICB4OworICBpbnQgICAgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXBmX2luaXQgKHgpOworICAgICAgbXBmX3NldF9zaSAoeCwgZGF0YVtpXS54KTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICAgICAgaWYgKHgtPl9tcF9zaXplICE9IGRhdGFbaV0ud2FudF9zaXplCisgICAgICAgICAgfHwgcmVmbXBuX2NtcF9hbGxvd3plcm8gKHgtPl9tcF9kLCBkYXRhW2ldLndhbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpICE9IDAKKyAgICAgICAgICB8fCB4LT5fbXBfZXhwICE9IEFCUyAoZGF0YVtpXS53YW50X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBmX3NldF9zaSB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgbXBmX2NsZWFyICh4KTsKKworICAgICAgbXBmX2luaXRfc2V0X3NpICh4LCBkYXRhW2ldLngpOworICAgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgICAgICBpZiAoeC0+X21wX3NpemUgIT0gZGF0YVtpXS53YW50X3NpemUKKyAgICAgICAgICB8fCByZWZtcG5fY21wX2FsbG93emVybyAoeC0+X21wX2QsIGRhdGFbaV0ud2FudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgKGRhdGFbaV0ud2FudF9zaXplKSkgIT0gMAorICAgICAgICAgIHx8IHgtPl9tcF9leHAgIT0gQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcGZfaW5pdF9zZXRfc2kgd3Jvbmcgb24gZGF0YVslZF1cbiIsIGkpOworICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgIG1wZl9jbGVhciAoeCk7CisgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LXNldF91aS5jIGIvdGVzdHMvbXBmL3Qtc2V0X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4MDY3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LXNldF91aS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIFRlc3QgbXBmX3NldF91aSBhbmQgbXBmX2luaXRfc2V0X3VpLgorCitDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBsb25nICB4OworICAgIG1wX3NpemVfdCAgICAgIHdhbnRfc2l6ZTsKKyAgICBtcF9saW1iX3QgICAgICB3YW50X2RhdGFbMl07CisgIH0gZGF0YVtdID0geworCisgICAgeyAgMEwsICAwIH0sCisgICAgeyAgMUwsICAxLCB7IDEgfSB9LAorCisjaWYgR01QX05VTUJfQklUUyA+PSBCSVRTX1BFUl9VTE9ORworICAgIHsgVUxPTkdfTUFYLCAgICAgMSwgeyBVTE9OR19NQVgsIDAgfSB9LAorICAgIHsgVUxPTkdfSElHSEJJVCwgMSwgeyBVTE9OR19ISUdIQklULCAwIH0gfSwKKyNlbHNlCisgICAgeyBVTE9OR19NQVgsICAgICAyLCB7IFVMT05HX01BWCAmIEdNUF9OVU1CX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HX01BWCA+PiBHTVBfTlVNQl9CSVRTIH0gfSwKKyAgICB7IFVMT05HX0hJR0hCSVQsIDIsIHsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkdfSElHSEJJVCA+PiBHTVBfTlVNQl9CSVRTIH0gfSwKKyNlbmRpZgorICB9OworCisgIG1wZl90ICB4OworICBpbnQgICAgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXBmX2luaXQgKHgpOworICAgICAgbXBmX3NldF91aSAoeCwgZGF0YVtpXS54KTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHgpOworICAgICAgaWYgKHgtPl9tcF9zaXplICE9IGRhdGFbaV0ud2FudF9zaXplCisgICAgICAgICAgfHwgcmVmbXBuX2NtcF9hbGxvd3plcm8gKHgtPl9tcF9kLCBkYXRhW2ldLndhbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpICE9IDAKKyAgICAgICAgICB8fCB4LT5fbXBfZXhwICE9IEFCUyAoZGF0YVtpXS53YW50X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBmX3NldF91aSB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgbXBmX2NsZWFyICh4KTsKKworICAgICAgbXBmX2luaXRfc2V0X3VpICh4LCBkYXRhW2ldLngpOworICAgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeCk7CisgICAgICBpZiAoeC0+X21wX3NpemUgIT0gZGF0YVtpXS53YW50X3NpemUKKyAgICAgICAgICB8fCByZWZtcG5fY21wX2FsbG93emVybyAoeC0+X21wX2QsIGRhdGFbaV0ud2FudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgKGRhdGFbaV0ud2FudF9zaXplKSkgIT0gMAorICAgICAgICAgIHx8IHgtPl9tcF9leHAgIT0gQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcGZfaW5pdF9zZXRfdWkgd3Jvbmcgb24gZGF0YVslZF1cbiIsIGkpOworICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgIG1wZl9jbGVhciAoeCk7CisgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LXNxcnQuYyBiL3Rlc3RzL21wZi90LXNxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTkzYWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3Qtc3FydC5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBUZXN0IG1wZl9zcXJ0LCBtcGZfbXVsLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDE2CisjZW5kaWYKKwordm9pZAorY2hlY2tfcmFuZDEgKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfc2l6ZV90IHNpemU7CisgIG1wX2V4cF90IGV4cDsKKyAgaW50IHJlcHMgPSAyMDAwMDsKKyAgaW50IGk7CisgIG1wZl90IHgsIHksIHkyOworICBtcF9zaXplX3QgYnByZWMgPSAxMDA7CisgIG1wZl90IHJlcnIsIG1heF9yZXJyLCBsaW1pdF9yZXJyOworCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICByZXBzID0gc3RydG9sIChhcmd2WzFdLCAwLCAwKTsKKyAgICAgIGlmIChhcmdjID4gMikKKwlicHJlYyA9IHN0cnRvbCAoYXJndlsyXSwgMCwgMCk7CisgICAgfQorCisgIG1wZl9zZXRfZGVmYXVsdF9wcmVjIChicHJlYyk7CisKKyAgbXBmX2luaXRfc2V0X3VpIChsaW1pdF9yZXJyLCAxKTsKKyAgbXBmX2Rpdl8yZXhwIChsaW1pdF9yZXJyLCBsaW1pdF9yZXJyLCBicHJlYyk7CisjaWYgVkVSQk9TRQorICBtcGZfZHVtcCAobGltaXRfcmVycik7CisjZW5kaWYKKyAgbXBmX2luaXQgKHJlcnIpOworICBtcGZfaW5pdF9zZXRfdWkgKG1heF9yZXJyLCAwKTsKKworICBtcGZfaW5pdCAoeCk7CisgIG1wZl9pbml0ICh5KTsKKyAgbXBmX2luaXQgKHkyKTsKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBzaXplID0gdXJhbmRvbSAoKSAlIFNJWkU7CisgICAgICBleHAgPSB1cmFuZG9tICgpICUgU0laRTsKKyAgICAgIG1wZl9yYW5kb20yICh4LCBzaXplLCBleHApOworCisgICAgICBtcGZfc3FydCAoeSwgeCk7CisgICAgICBNUEZfQ0hFQ0tfRk9STUFUICh5KTsKKyAgICAgIG1wZl9tdWwgKHkyLCB5LCB5KTsKKworICAgICAgbXBmX3JlbGRpZmYgKHJlcnIsIHgsIHkyKTsKKyAgICAgIGlmIChtcGZfY21wIChyZXJyLCBtYXhfcmVycikgPiAwKQorCXsKKwkgIG1wZl9zZXQgKG1heF9yZXJyLCByZXJyKTsKKyNpZiBWRVJCT1NFCisJICBtcGZfZHVtcCAobWF4X3JlcnIpOworI2VuZGlmCisJICBpZiAobXBmX2NtcCAocmVyciwgbGltaXRfcmVycikgPiAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1IgYWZ0ZXIgJWQgdGVzdHNcbiIsIGkpOworCSAgICAgIHByaW50ZiAoIiAgIHggPSAiKTsgbXBmX2R1bXAgKHgpOworCSAgICAgIHByaW50ZiAoIiAgIHkgPSAiKTsgbXBmX2R1bXAgKHkpOworCSAgICAgIHByaW50ZiAoIiAgeTIgPSAiKTsgbXBmX2R1bXAgKHkyKTsKKwkgICAgICBwcmludGYgKCIgICByZXJyICAgICAgID0gIik7IG1wZl9kdW1wIChyZXJyKTsKKwkgICAgICBwcmludGYgKCIgICBsaW1pdF9yZXJyID0gIik7IG1wZl9kdW1wIChsaW1pdF9yZXJyKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiaW4gaGV4OlxuIik7CisgICAgICAgICAgICAgIG1wX3RyYWNlX2Jhc2UgPSAxNjsKKwkgICAgICBtcGZfdHJhY2UgKCIgICB4ICAiLCB4KTsKKwkgICAgICBtcGZfdHJhY2UgKCIgICB5ICAiLCB5KTsKKwkgICAgICBtcGZfdHJhY2UgKCIgICB5MiAiLCB5Mik7CisJICAgICAgbXBmX3RyYWNlICgiICAgcmVyciAgICAgICIsIHJlcnIpOworCSAgICAgIG1wZl90cmFjZSAoIiAgIGxpbWl0X3JlcnIiLCBsaW1pdF9yZXJyKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChsaW1pdF9yZXJyKTsKKyAgbXBmX2NsZWFyIChyZXJyKTsKKyAgbXBmX2NsZWFyIChtYXhfcmVycik7CisKKyAgbXBmX2NsZWFyICh4KTsKKyAgbXBmX2NsZWFyICh5KTsKKyAgbXBmX2NsZWFyICh5Mik7Cit9CisKK3ZvaWQKK2NoZWNrX3JhbmQyICh2b2lkKQoreworICB1bnNpZ25lZCBsb25nICAgICAgbWF4X3ByZWMgPSAyMDsKKyAgdW5zaWduZWQgbG9uZyAgICAgIG1pbl9wcmVjID0gX19HTVBGX0JJVFNfVE9fUFJFQyAoMSk7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kcyA9IFJBTkRTOworICB1bnNpZ25lZCBsb25nICAgICAgeF9wcmVjLCByX3ByZWM7CisgIG1wZl90ICAgICAgICAgICAgICB4LCByLCBzOworICBpbnQgICAgICAgICAgICAgICAgaTsKKworICBtcGZfaW5pdCAoeCk7CisgIG1wZl9pbml0IChyKTsKKyAgbXBmX2luaXQgKHMpOworICByZWZtcGZfc2V0X3ByZWNfbGltYnMgKHMsIDIqbWF4X3ByZWMrMTApOworCisgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykKKyAgICB7CisgICAgICAvKiBpbnB1dCBwcmVjaXNpb24gKi8KKyAgICAgIHhfcHJlYyA9IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIG1heF9wcmVjLW1pbl9wcmVjKSArIG1pbl9wcmVjOworICAgICAgcmVmbXBmX3NldF9wcmVjX2xpbWJzICh4LCB4X3ByZWMpOworCisgICAgICAvKiByZXN1bHQgcHJlY2lzaW9uICovCisgICAgICByX3ByZWMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBtYXhfcHJlYy1taW5fcHJlYykgKyBtaW5fcHJlYzsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAociwgcl9wcmVjKTsKKworICAgICAgbXBmX3JhbmRvbTIgKHgsIHhfcHJlYywgMTAwMCk7CisKKyAgICAgIG1wZl9zcXJ0IChyLCB4KTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHIpOworCisgICAgICAvKiBFeHBlY3QgdG8gcHJlYyBsaW1icyBvZiByZXN1bHQuCisgICAgICAgICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGVyZSdzIG5vIHN0cmlwcGluZyBvZiBsb3cgemVybworICAgICAgICAgbGltYnMgaW4gbXBmX3NxcnQsIHNvIHNpemUgc2hvdWxkIGJlIGV4YWN0bHkgcHJlYy4gICovCisgICAgICBpZiAoU0laKHIpICE9IHJfcHJlYykKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wZl9zcXJ0IHdyb25nIG51bWJlciBvZiByZXN1bHQgbGltYnNcbiIpOworICAgICAgICAgIG1wZl90cmFjZSAoIiAgeCIsIHgpOworICAgICAgICAgIG1wZl90cmFjZSAoIiAgciIsIHIpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgcl9wcmVjPSVsdVxuIiwgcl9wcmVjKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIFNJWihyKSAgJWxkXG4iLCAobG9uZykgU0laKHIpKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIFBSRUMocikgJWxkXG4iLCAobG9uZykgUFJFQyhyKSk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgLyogTXVzdCBoYXZlIHJeMiA8PSB4LCBzaW5jZSByIGhhcyBiZWVuIHRydW5jYXRlZC4gKi8KKyAgICAgIG1wZl9tdWwgKHMsIHIsIHIpOworICAgICAgaWYgKCEgKG1wZl9jbXAgKHMsIHgpIDw9IDApKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXBmX3NxcnQgcmVzdWx0IHRvbyBiaWdcbiIpOworICAgICAgICAgIG1wZl90cmFjZSAoIiAgeCIsIHgpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgcl9wcmVjPSVsdVxuIiwgcl9wcmVjKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHIiLCByKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHMiLCBzKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICAvKiBNdXN0IGhhdmUgKHIrdWxwKV4yID4geCwgb3IgZWxzZSByIGlzIHRvbyBzbWFsbC4gKi8KKyAgICAgIHJlZm1wZl9hZGRfdWxwIChyKTsKKyAgICAgIG1wZl9tdWwgKHMsIHIsIHIpOworICAgICAgaWYgKCEgKG1wZl9jbXAgKHMsIHgpID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgICAgKCJtcGZfc3FydCByZXN1bHQgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHgiLCB4KTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIHJfcHJlYz0lbHVcbiIsIHJfcHJlYyk7CisgICAgICAgICAgbXBmX3RyYWNlICgiICByK3VscCIsIHIpOworICAgICAgICAgIG1wZl90cmFjZSAoIiAgcyIsIHMpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoeCk7CisgIG1wZl9jbGVhciAocik7CisgIG1wZl9jbGVhciAocyk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja19yYW5kMSAoYXJnYywgYXJndik7CisgIGNoZWNrX3JhbmQyICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcGYvdC1zcXJ0X3VpLmMgYi90ZXN0cy9tcGYvdC1zcXJ0X3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjNTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LXNxcnRfdWkuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogVGVzdCBtcGZfc3FydF91aS4KKworQ29weXJpZ2h0IDIwMDQsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX3JhbmQgKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgICAgICBtYXhfcHJlYyA9IDE1OworICB1bnNpZ25lZCBsb25nICAgICAgbWluX3ByZWMgPSBfX0dNUEZfQklUU19UT19QUkVDICgxKTsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzID0gUkFORFM7CisgIHVuc2lnbmVkIGxvbmcgICAgICB4LCBwcmVjOworICBtcGZfdCAgICAgICAgICAgICAgciwgczsKKyAgaW50ICAgICAgICAgICAgICAgIGk7CisKKyAgbXBmX2luaXQgKHIpOworICBtcGZfaW5pdCAocyk7CisgIHJlZm1wZl9zZXRfcHJlY19saW1icyAocywgMiptYXhfcHJlYysxMCk7CisKKyAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykKKyAgICB7CisgICAgICBtcGZfc3FydF91aSAociwgeCk7CisgICAgICBNUEZfQ0hFQ0tfRk9STUFUIChyKTsKKyAgICAgIGlmIChtcGZfY21wX3VpIChyLCB4KSAhPSAwKQorCXsKKwkgIHByaW50ZiAgICAoIm1wZl9zcXJ0X3VpIHdyb25nIGZvciBzcGVjaWFsIGNhc2U6XG4iKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIHg9JWx1XG4iLCB4KTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHIiLCByKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDUwOyBpKyspCisgICAgeworICAgICAgLyogaW5wdXQsIGEgcmFuZG9tIG5vbi16ZXJvIHVsb25nLCBleHBvbmVudGlhbGx5IGRpc3RyaWJ1dGVkICovCisgICAgICBkbyB7CisgICAgICAgIHggPSBnbXBfdXJhbmRvbWJfdWkgKHJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBCSVRTX1BFUl9VTE9ORykgKyAxKTsKKyAgICAgIH0gd2hpbGUgKHggPD0gMSk7CisKKyAgICAgIC8qIHJlc3VsdCBwcmVjaXNpb24gKi8KKyAgICAgIHByZWMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBtYXhfcHJlYy1taW5fcHJlYykgKyBtaW5fcHJlYzsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAociwgcHJlYyk7CisKKyAgICAgIG1wZl9zcXJ0X3VpIChyLCB4KTsKKyAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHIpOworCisgICAgICAvKiBFeHBlY3QgdG8gcHJlYyBsaW1icyBvZiByZXN1bHQuCisgICAgICAgICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGVyZSdzIG5vIHN0cmlwcGluZyBvZiBsb3cgemVybworICAgICAgICAgbGltYnMgaW4gbXBmX3NxcnRfdWksIG5vdCBldmVuIG9uIHBlcmZlY3Qgc3F1YXJlcywgc28gc2l6ZSBzaG91bGQKKyAgICAgICAgIGJlIGV4YWN0bHkgcHJlYy4gICovCisgICAgICBpZiAoU0laKHIpICE9IHByZWMpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcGZfc3FydF91aSByZXN1bHQgbm90IGVub3VnaCByZXN1bHQgbGltYnNcbiIpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgeD0lbHVcbiIsIHgpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgd2FudCBwcmVjPSVsdVxuIiwgcHJlYyk7CisgICAgICAgICAgbXBmX3RyYWNlICgiICByIiwgcik7CisgICAgICAgICAgcHJpbnRmICAgICgiICByIHNpemUgJWxkXG4iLCAobG9uZykgU0laKHIpKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIHIgcHJlYyAlbGRcbiIsIChsb25nKSBQUkVDKHIpKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICAvKiBNdXN0IGhhdmUgcl4yIDw9IHgsIHNpbmNlIHIgaGFzIGJlZW4gdHJ1bmNhdGVkLiAqLworICAgICAgbXBmX211bCAocywgciwgcik7CisgICAgICBpZiAoISAobXBmX2NtcF91aSAocywgeCkgPD0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgICAgKCJtcGZfc3FydF91aSByZXN1bHQgdG9vIGJpZ1xuIik7CisgICAgICAgICAgcHJpbnRmICAgICgiICB4PSVsdVxuIiwgeCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICB3YW50IHByZWM9JWx1XG4iLCBwcmVjKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHIiLCByKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHMiLCBzKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICAvKiBNdXN0IGhhdmUgKHIrdWxwKV4yID4geC4KKyAgICAgICAgIE5vIG92ZXJmbG93IGZyb20gcmVmbXBmX2FkZF91bHAgc2luY2UgciBpcyBvbmx5IHByZWMgbGltYnMuICovCisgICAgICByZWZtcGZfYWRkX3VscCAocik7CisgICAgICBtcGZfbXVsIChzLCByLCByKTsKKyAgICAgIGlmICghIChtcGZfY21wX3VpIChzLCB4KSA+IDApKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXBmX3NxcnRfdWkgcmVzdWx0IHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgcHJpbnRmICAgICgiICB4PSVsdVxuIiwgeCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICB3YW50IHByZWM9JWx1XG4iLCBwcmVjKTsKKyAgICAgICAgICBtcGZfdHJhY2UgKCIgIHIrdWxwIiwgcik7CisgICAgICAgICAgbXBmX3RyYWNlICgiICBzIiwgcyk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChyKTsKKyAgbXBmX2NsZWFyIChzKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIGNoZWNrX3JhbmQgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wZi90LXN1Yi5jIGIvdGVzdHMvbXBmL3Qtc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3MjI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wZi90LXN1Yi5jCkBAIC0wLDAgKzEsMjg3IEBACisvKiBUZXN0IG1wZl9zdWIuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAxLCAyMDA0LCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTYKKyNlbmRpZgorCit2b2lkCitjaGVja19yYW5kIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wX3NpemVfdCBzaXplOworICBtcF9leHBfdCBleHA7CisgIGludCByZXBzID0gMjAwMDA7CisgIGludCBpOworICBtcGZfdCB1LCB2LCB3LCB3cmVmOworICBtcF9zaXplX3QgYnByZWMgPSAxMDA7CisgIG1wZl90IHJlcnIsIG1heF9yZXJyLCBsaW1pdF9yZXJyOworCisgIGlmIChhcmdjID4gMSkKKyAgICB7CisgICAgICByZXBzID0gc3RydG9sIChhcmd2WzFdLCAwLCAwKTsKKyAgICAgIGlmIChhcmdjID4gMikKKwlicHJlYyA9IHN0cnRvbCAoYXJndlsyXSwgMCwgMCk7CisgICAgfQorCisgIG1wZl9zZXRfZGVmYXVsdF9wcmVjIChicHJlYyk7CisKKyAgbXBmX2luaXRfc2V0X3VpIChsaW1pdF9yZXJyLCAxKTsKKyAgbXBmX2Rpdl8yZXhwIChsaW1pdF9yZXJyLCBsaW1pdF9yZXJyLCBicHJlYyk7CisjaWYgVkVSQk9TRQorICBtcGZfZHVtcCAobGltaXRfcmVycik7CisjZW5kaWYKKyAgbXBmX2luaXQgKHJlcnIpOworICBtcGZfaW5pdF9zZXRfdWkgKG1heF9yZXJyLCAwKTsKKworICBtcGZfaW5pdCAodSk7CisgIG1wZl9pbml0ICh2KTsKKyAgbXBmX2luaXQgKHcpOworICBtcGZfaW5pdCAod3JlZik7CisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgc2l6ZSA9IHVyYW5kb20gKCkgJSAoMiAqIFNJWkUpIC0gU0laRTsKKyAgICAgIGV4cCA9IHVyYW5kb20gKCkgJSBTSVpFOworICAgICAgbXBmX3JhbmRvbTIgKHUsIHNpemUsIGV4cCk7CisKKyAgICAgIHNpemUgPSB1cmFuZG9tICgpICUgKDIgKiBTSVpFKSAtIFNJWkU7CisgICAgICBleHAgPSB1cmFuZG9tICgpICUgU0laRTsKKyAgICAgIG1wZl9yYW5kb20yICh2LCBzaXplLCBleHApOworCisgICAgICBpZiAoKHVyYW5kb20gKCkgJiAxKSAhPSAwKQorCW1wZl9hZGRfdWkgKHUsIHYsIDEpOworICAgICAgZWxzZSBpZiAoKHVyYW5kb20gKCkgJiAxKSAhPSAwKQorCW1wZl9zdWJfdWkgKHUsIHYsIDEpOworCisgICAgICBtcGZfc3ViICh3LCB1LCB2KTsKKyAgICAgIHJlZm1wZl9zdWIgKHdyZWYsIHUsIHYpOworCisgICAgICBtcGZfcmVsZGlmZiAocmVyciwgdywgd3JlZik7CisgICAgICBpZiAobXBmX2NtcCAocmVyciwgbWF4X3JlcnIpID4gMCkKKwl7CisJICBtcGZfc2V0IChtYXhfcmVyciwgcmVycik7CisjaWYgVkVSQk9TRQorCSAgbXBmX2R1bXAgKG1heF9yZXJyKTsKKyNlbmRpZgorCSAgaWYgKG1wZl9jbXAgKHJlcnIsIGxpbWl0X3JlcnIpID4gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIkVSUk9SIGFmdGVyICVkIHRlc3RzXG4iLCBpKTsKKwkgICAgICBwcmludGYgKCIgICB1ID0gIik7IG1wZl9kdW1wICh1KTsKKwkgICAgICBwcmludGYgKCIgICB2ID0gIik7IG1wZl9kdW1wICh2KTsKKwkgICAgICBwcmludGYgKCJ3cmVmID0gIik7IG1wZl9kdW1wICh3cmVmKTsKKwkgICAgICBwcmludGYgKCIgICB3ID0gIik7IG1wZl9kdW1wICh3KTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChsaW1pdF9yZXJyKTsKKyAgbXBmX2NsZWFyIChyZXJyKTsKKyAgbXBmX2NsZWFyIChtYXhfcmVycik7CisKKyAgbXBmX2NsZWFyICh1KTsKKyAgbXBmX2NsZWFyICh2KTsKKyAgbXBmX2NsZWFyICh3KTsKKyAgbXBmX2NsZWFyICh3cmVmKTsKK30KKworI2RlZmluZSBXIEdNUF9OVU1CX01BWAorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50ICAgICAgICBleHAsIHNpemU7CisgICAgICBtcF9saW1iX3QgIGRbMTBdOworICAgIH0geCwgeSwgd2FudDsKKworICB9IGRhdGFbXSA9IHsKKyAgICB7IHsgMTIzLCAyLCB7IDgsIDkgfSB9LCAgICAgICAgICAgICB7IDEyMywgMSwgeyA5IH0gfSwgeyAxMjIsIDEsIHsgOCB9IH0gfSwKKyAgICB7IHsgMSwgMSwgeyA5IH0gfSwgICAgICAgICAgICAgICAgICB7IDEsIDEsIHsgOCB9IH0sICAgeyAxLCAxLCB7IDEgfSB9IH0sCisgICAgeyB7IDEsIDEsIHsgOSB9IH0sICAgICAgICAgICAgICAgICB7IDEsIC0xLCB7IDYgfSB9LCAgIHsgMSwgMSwgeyAxNSB9IH0gfSwKKyAgICB7IHsgMSwgMiwgeyA4LCA5IH0gfSwgICAgICAgICAgICAgICB7IDEsIDEsIHsgOCB9IH0sICAgeyAxLCAyLCB7IDgsIDEgfSB9IH0sCisgICAgeyB7IDIsIDIsIHsgOCwgMSB9IH0sICAgICAgICAgICAgICAgeyAxLCAxLCB7IDkgfSB9LCAgIHsgMSwgMSwgeyBXIH0gfSB9LAorICAgIHsgeyAyLCAyLCB7IDksIDggfSB9LCAgICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDIsIDEsIHsgOCB9IH0gfSwKKyAgICB7IHsgMiwgMSwgeyAxIH0gfSwgICAgICAgICAgICAgICAgICB7IDEsIDEsIHsgMSB9IH0sICAgeyAxLCAxLCB7IFcgfSB9IH0sCisgICAgeyB7IDIsIDEsIHsgOSB9IH0sICAgICAgICAgICAgICAgICAgeyAxLCAxLCB7IFcgfSB9LCAgIHsgMiwgMiwgeyAxLCA4IH0gfSB9LAorCisgICAgeyB7IDEsIDIsIHsgVywgOCB9IH0sICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDAsIC0xLCB7IDEgfSB9IH0sCisgICAgeyB7IDEsIDIsIHsgVywgNyB9IH0sICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDEsIC0yLCB7IDEsIDEgfSB9IH0sCisgICAgeyB7IDEsIDIsIHsgMSwgOCB9IH0sICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDAsIC0xLCB7IFcgfSB9IH0sCisgICAgeyB7IDEsIDIsIHsgMSwgNyB9IH0sICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDEsIC0yLCB7IFcsIDEgfSB9IH0sCisgICAgeyB7IDEsIDIsIHsgMCwgOCB9IH0sICAgICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDEsIC0xLCB7IDEgfSB9IH0sCisgICAgeyB7IDIsIDMsIHsgNSwgOCwgMSB9IH0sICAgICAgICAgIHsgMSwgMSwgeyA5IH0gfSwgICB7IDEsIDIsIHsgNSwgVyB9IH0gfSwKKyAgICB7IHsgMywgMSwgeyAxIH0gfSwgICAgICAgICAgICAgICAgeyAxLCAxLCB7IDEgfSB9LCAgIHsgMiwgMiwgeyBXLCBXIH0gfSB9LAorICAgIHsgeyAxLCA2LCB7IFcsIFcsIFcsIFcsIFcsIDggfSB9LCB7IDEsIDEsIHsgOSB9IH0sICAgeyAtNCwgLTEsIHsgMSB9IH0gfSwKKyAgICB7IHsgNSwgNSwgeyBXLTYsIFcsIFcsIFcsIFcgfSB9LCAgeyA2LCAxLCB7IDEgfSB9LCAgIHsgMSwgLTEsIHsgNyB9IH0gfSwKKworICAgIC8qIGYgLSBmID09IDAsIHZhcmlvdXMgc2l6ZXMuCisgICAgICAgVGhlc2UgZXhlcmNpc2UgYSBwYXN0IHByb2JsZW0gKGdtcCA0LjEuMyBhbmQgZWFybGllcikgd2hlcmUgdGhlCisgICAgICAgcmVzdWx0IGV4cG9uZW50IHdhcyBub3QgemVyb2VkIG9uIGEgemVybyByZXN1bHQgbGlrZSB0aGlzLiAgKi8KKyAgICB7IHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAwIH0gfSwKKyAgICB7IHsgOTksIDMsIHsgMCwgMCwgMSB9IH0sICAgICAgIHsgOTksIDEsIHsgMSB9IH0sICAgICAgICAgICAgIHsgMCwgMCB9IH0sCisgICAgeyB7IDk5LCAzLCB7IDAsIDEyMywgNDU2IH0gfSwgICB7IDk5LCAyLCB7IDEyMywgNDU2IH0gfSwgICAgICB7IDAsIDAgfSB9LAorICAgIHsgeyA5OSwgMywgeyAxMjMsIDQ1NiwgNzg5IH0gfSwgeyA5OSwgMywgeyAxMjMsIDQ1NiwgNzg5IH0gfSwgeyAwLCAwIH0gfSwKKworICAgIC8qIEhpZ2ggbGltYnMgY2FuY2VsLCBsZWF2aW5nIGp1c3QgdGhlIGxvdyBsaW1icyBvZiB0aGUgbG9uZ2VyIG9wZXJhbmQuCisgICAgICAgVGhpcyBleGVyY2lzZXMgYSBwYXN0IHByb2JsZW0gKGdtcCA0LjEuMyBhbmQgZWFybGllcikgd2hlcmUgaGlnaCB6ZXJvCisgICAgICAgbGltYnMgb24gdGhlIHJlbWFpbmRlciB3ZXJlIG5vdCBzdHJpcHBlZCBiZWZvcmUgdHJ1bmNhdGluZyB0byB0aGUKKyAgICAgICBkZXN0aW5hdGlvbiwgY2F1c2luZyBsb3NzIG9mIHByZWNpc2lvbi4gICovCisgICAgeyB7IDEyMywgMiwgeyA4LCA5IH0gfSwgICAgICAgICAgICAgeyAxMjMsIDEsIHsgOSB9IH0sIHsgMTIyLCAxLCB7IDggfSB9IH0sCisgICAgeyB7IDEyMywgMywgeyA4LCAwLCA5IH0gfSwgICAgICAgICAgeyAxMjMsIDEsIHsgOSB9IH0sIHsgMTIxLCAxLCB7IDggfSB9IH0sCisgICAgeyB7IDEyMywgNCwgeyA4LCAwLCAwLCA5IH0gfSwgICAgICAgeyAxMjMsIDEsIHsgOSB9IH0sIHsgMTIwLCAxLCB7IDggfSB9IH0sCisgICAgeyB7IDEyMywgNSwgeyA4LCAwLCAwLCAwLCA5IH0gfSwgICAgeyAxMjMsIDEsIHsgOSB9IH0sIHsgMTE5LCAxLCB7IDggfSB9IH0sCisgICAgeyB7IDEyMywgNiwgeyA4LCAwLCAwLCAwLCAwLCA5IH0gfSwgeyAxMjMsIDEsIHsgOSB9IH0sIHsgMTE4LCAxLCB7IDggfSB9IH0sCisgICAgLyogeyB7IDEyMywgNiwgeyA4LCAwLCAwLCAwLCAwLCA5IH0gfSwgeyAxMjMsIDYsIHsgOSwgMCwgMCwgMCwgMCwgOCB9IH0sIHsgMTIyLCA1LCB7IFcsIFcsIFcsIFcsIFcgfSB9IH0sICovCisKKyAgfTsKKworICBtcGZfdCAgeCwgeSwgZ290LCB3YW50OworICBpbnQgIGksIHN3YXAsIGZhaWw7CisKKyAgZmFpbCA9IDA7CisgIG1wX3RyYWNlX2Jhc2UgPSAxNjsKKyAgbXBmX2luaXQgKGdvdCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoc3dhcCA9IDA7IHN3YXAgPD0gNzsgc3dhcCsrKQorICAgICAgICB7CisgICAgICAgICAgUFRSKHgpID0gKG1wX3B0cikgZGF0YVtpXS54LmQ7CisgICAgICAgICAgU0laKHgpID0gZGF0YVtpXS54LnNpemU7CisgICAgICAgICAgRVhQKHgpID0gZGF0YVtpXS54LmV4cDsKKyAgICAgICAgICBQUkVDKHgpID0gbnVtYmVyb2YgKGRhdGFbaV0ueC5kKTsKKyAgICAgICAgICBNUEZfQ0hFQ0tfRk9STUFUICh4KTsKKworICAgICAgICAgIFBUUih5KSA9IChtcF9wdHIpIGRhdGFbaV0ueS5kOworICAgICAgICAgIFNJWih5KSA9IGRhdGFbaV0ueS5zaXplOworICAgICAgICAgIEVYUCh5KSA9IGRhdGFbaV0ueS5leHA7CisgICAgICAgICAgUFJFQyh5KSA9IG51bWJlcm9mIChkYXRhW2ldLnkuZCk7CisgICAgICAgICAgTVBGX0NIRUNLX0ZPUk1BVCAoeSk7CisKKyAgICAgICAgICBQVFIod2FudCkgPSAobXBfcHRyKSBkYXRhW2ldLndhbnQuZDsKKyAgICAgICAgICBTSVood2FudCkgPSBkYXRhW2ldLndhbnQuc2l6ZTsKKyAgICAgICAgICBFWFAod2FudCkgPSBkYXRhW2ldLndhbnQuZXhwOworICAgICAgICAgIFBSRUMod2FudCkgPSBudW1iZXJvZiAoZGF0YVtpXS53YW50LmQpOworICAgICAgICAgIE1QRl9DSEVDS19GT1JNQVQgKHdhbnQpOworCisgICAgICAgICAgaWYgKHN3YXAgJiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGZfc3dhcCAod2FudCwgeSk7CisgICAgICAgICAgICB9CisKKwkgIGlmICgoU0laICh4KSBeIFNJWiAoeSkpIDwgMCkKKwkgICAgY29udGludWU7IC8qIEl0J3MgYW4gYWRkaXRpb24sIG5vdCBhIHN1YnRyYWN0aW9uIChUTyBCRSBSRU1PVkVEKSAqLworCisgICAgICAgICAgaWYgKHN3YXAgJiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcGZfc3dhcCAoeCwgeSk7CisgICAgICAgICAgICAgIFNJWih3YW50KSA9IC0gU0laKHdhbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHN3YXAgJiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBTSVood2FudCkgPSAtIFNJWih3YW50KTsKKyAgICAgICAgICAgICAgU0laKHgpID0gLSBTSVooeCk7CisgICAgICAgICAgICAgIFNJWih5KSA9IC0gU0laKHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbXBmX3N1YiAoZ290LCB4LCB5KTsKKy8qICAgICAgICAgICBNUEZfQ0hFQ0tfRk9STUFUIChnb3QpOyAqLworCisgICAgICAgICAgaWYgKCEgcmVmbXBmX3ZhbGlkYXRlICgibXBmX3N1YiIsIGdvdCwgd2FudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoImNoZWNrX2RhdGEoKSB3cm9uZyByZXN1bHQgYXQgZGF0YVslZF0gKG9wZXJhbmRzJXMgc3dhcHBlZClcbiIsIGksIHN3YXAgPyAiIiA6ICIgbm90Iik7CisgICAgICAgICAgICAgIG1wZl90cmFjZSAoInggICAiLCB4KTsKKyAgICAgICAgICAgICAgbXBmX3RyYWNlICgieSAgICIsIHkpOworICAgICAgICAgICAgICBtcGZfdHJhY2UgKCJnb3QgIiwgZ290KTsKKyAgICAgICAgICAgICAgbXBmX3RyYWNlICgid2FudCIsIHdhbnQpOworCSAgICAgIGZhaWwgPSAxOworICAgICAgICAgICAgfQorCisJICBpZiAoU0laICh4KSA9PSAxIHx8IFNJWiAoeCkgPT0gMCApCisJICAgIHsKKwkgICAgICBpZiAoU0laICh5KSkgRVhQICh5KSAtPSBFWFAgKHgpIC0gKG1wX2V4cF90KSBTSVogKHgpOworCSAgICAgIGlmIChTSVogKHdhbnQpKSBFWFAgKHdhbnQpIC09IEVYUCAoeCkgLSAobXBfZXhwX3QpIFNJWiAoeCk7CisJICAgICAgRVhQICh4KSA9IChtcF9leHBfdCkgU0laICh4KTsKKworCSAgICAgIGlmIChtcGZfZml0c191aW50X3AgKHgpKQorCQl7CisJCSAgbXBmX3VpX3N1YiAoZ290LCBtcGZfZ2V0X3VpICh4KSwgeSk7CisKKwkJICBpZiAoISByZWZtcGZfdmFsaWRhdGUgKCJtcGZfdWlfc3ViIiwgZ290LCB3YW50KSkKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiY2hlY2tfZGF0YSgpIHdyb25nIHJlc3VsdCBhdCBkYXRhWyVkXSAob3BlcmFuZHMlcyBzd2FwcGVkKVxuIiwgaSwgc3dhcCA/ICIiIDogIiBub3QiKTsKKwkJICAgICAgbXBmX3RyYWNlICgieCAgICIsIHgpOworCQkgICAgICBtcGZfdHJhY2UgKCJ5ICAgIiwgeSk7CisJCSAgICAgIG1wZl90cmFjZSAoImdvdCAiLCBnb3QpOworCQkgICAgICBtcGZfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisJCSAgICAgIGZhaWwgPSAxOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKFNJWiAoeSkgPT0gMSB8fCBTSVogKHkpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoU0laICh4KSkgRVhQICh4KSAtPSBFWFAgKHkpIC0gKG1wX2V4cF90KSBTSVogKHkpOworCSAgICAgIGlmIChTSVogKHdhbnQpKSBFWFAgKHdhbnQpIC09IEVYUCAoeSkgLSAobXBfZXhwX3QpIFNJWiAoeSk7CisJICAgICAgRVhQICh5KSA9IChtcF9leHBfdCkgU0laICh5KTsKKworCSAgICAgIGlmIChtcGZfZml0c191aW50X3AgKHgpKQorCQl7CisJCSAgbXBmX3N1Yl91aSAoZ290LCB4LCBtcGZfZ2V0X3VpICh5KSk7CisKKwkJICBpZiAoISByZWZtcGZfdmFsaWRhdGUgKCJtcGZfc3ViX3VpIiwgZ290LCB3YW50KSkKKwkJICAgIHsKKwkJICAgICAgcHJpbnRmICgiY2hlY2tfZGF0YSgpIHdyb25nIHJlc3VsdCBhdCBkYXRhWyVkXSAob3BlcmFuZHMlcyBzd2FwcGVkKVxuIiwgaSwgc3dhcCA/ICIiIDogIiBub3QiKTsKKwkJICAgICAgbXBmX3RyYWNlICgieCAgICIsIHgpOworCQkgICAgICBtcGZfdHJhY2UgKCJ5ICAgIiwgeSk7CisJCSAgICAgIG1wZl90cmFjZSAoImdvdCAiLCBnb3QpOworCQkgICAgICBtcGZfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisJCSAgICAgIGZhaWwgPSAxOworCQkgICAgfQorCQl9CisJICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgIG1wZl9jbGVhciAoZ290KTsKKyAgaWYgKGZhaWwpCisgICAgYWJvcnQgKCk7Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisgIGNoZWNrX3JhbmQgKGFyZ2MsIGFyZ3YpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcGYvdC10cnVuYy5jIGIvdGVzdHMvbXBmL3QtdHJ1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQzYTFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtdHJ1bmMuYwpAQCAtMCwwICsxLDI3MCBAQAorLyogVGVzdCBtcGZfdHJ1bmMsIG1wZl9jZWlsLCBtcGZfZmxvb3IuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfcHJpbnQgKG1wZl9zcmNwdHIgc3JjLCBtcGZfc3JjcHRyIGdvdCwgbXBmX3NyY3B0ciB3YW50KQoreworICBtcF90cmFjZV9iYXNlID0gMTY7CisgIG1wZl90cmFjZSAoInNyYyAiLCBzcmMpOworICBtcGZfdHJhY2UgKCJnb3QgIiwgZ290KTsKKyAgbXBmX3RyYWNlICgid2FudCIsIHdhbnQpOworCisgIHByaW50ZiAoImdvdCAgc2l6ZT0lZCBleHA9JWxkXG4iLCBTSVooZ290KSwgRVhQKGdvdCkpOworICBtcG5fdHJhY2UgKCIgICAgIGxpbWJzPSIsIFBUUihnb3QpLCAobXBfc2l6ZV90KSBBQlNJWihnb3QpKTsKKworICBwcmludGYgKCJ3YW50IHNpemU9JWQgZXhwPSVsZFxuIiwgU0laKHdhbnQpLCBFWFAod2FudCkpOworICBtcG5fdHJhY2UgKCIgICAgIGxpbWJzPSIsIFBUUih3YW50KSwgKG1wX3NpemVfdCkgQUJTSVood2FudCkpOworfQorCit2b2lkCitjaGVja19vbmUgKG1wZl9zcmNwdHIgc3JjLCBtcGZfc3JjcHRyIHRydW5jLCBtcGZfc3JjcHRyIGNlaWwsIG1wZl9zcmNwdHIgZmxvb3IpCit7CisgIG1wZl90ICBnb3Q7CisKKyAgbXBmX2luaXQyIChnb3QsIG1wZl9nZXRfcHJlYyAodHJ1bmMpKTsKKyAgQVNTRVJUX0FMV0FZUyAoUFJFQyhnb3QpID09IFBSRUModHJ1bmMpKTsKKyAgQVNTRVJUX0FMV0FZUyAoUFJFQyhnb3QpID09IFBSRUMoY2VpbCkpOworICBBU1NFUlRfQUxXQVlTIChQUkVDKGdvdCkgPT0gUFJFQyhmbG9vcikpOworCisjZGVmaW5lIENIRUNLX1NFUChuYW1lLCBmdW4sIHdhbnQpICAgICAgICAgICAgICBcCisgIG1wZl9zZXRfdWkgKGdvdCwgNTQzMjFMKTsgLyogaW5pdGlhbCBqdW5rICovICBcCisgIGZ1biAoZ290LCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1QRl9DSEVDS19GT1JNQVQgKGdvdCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChtcGZfY21wIChnb3QsIHdhbnQpICE9IDApICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcHJpbnRmICgiJXMgd3JvbmdcbiIsIG5hbWUpOyAgICAgICAgICAgIFwKKwljaGVja19wcmludCAoc3JjLCBnb3QsIHdhbnQpOyAgICAgICAgICAgXAorCWFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgIENIRUNLX1NFUCAoIm1wZl90cnVuYyIsIG1wZl90cnVuYywgdHJ1bmMpOworICBDSEVDS19TRVAgKCJtcGZfY2VpbCIsICBtcGZfY2VpbCwgIGNlaWwpOworICBDSEVDS19TRVAgKCJtcGZfZmxvb3IiLCBtcGZfZmxvb3IsIGZsb29yKTsKKworI2RlZmluZSBDSEVDS19JTlBMQUNFKG5hbWUsIGZ1biwgd2FudCkgIFwKKyAgbXBmX3NldCAoZ290LCBzcmMpOyAgICAgICAgICAgICAgICAgICBcCisgIGZ1biAoZ290LCBnb3QpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBNUEZfQ0hFQ0tfRk9STUFUIChnb3QpOyAgICAgICAgICAgICAgIFwKKyAgaWYgKG1wZl9jbXAgKGdvdCwgd2FudCkgIT0gMCkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXByaW50ZiAoIiVzIHdyb25nXG4iLCBuYW1lKTsgICAgXAorCWNoZWNrX3ByaW50IChzcmMsIGdvdCwgd2FudCk7ICAgXAorCWFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICBDSEVDS19JTlBMQUNFICgibXBmX3RydW5jIiwgbXBmX3RydW5jLCB0cnVuYyk7CisKKyAgLyogQ2FuJ3QgZG8gdGhlc2UgdW5jb25kaXRpb25hbGx5IGluIGNhc2UgdHJ1bmNhdGlvbiBieSBtcGZfc2V0IHN0cmlwcworICAgICBzb21lIGxvdyBub24temVybyBsaW1icyB3aGljaCB3b3VsZCBoYXZlIHJvdW5kZWQgdGhlIHJlc3VsdC4gICovCisgIGlmIChtcGZfc2l6ZSAoc3JjKSA8PSBQUkVDKHRydW5jKSsxKQorICAgIHsKKyAgICAgIENIRUNLX0lOUExBQ0UgKCJtcGZfY2VpbCIsICBtcGZfY2VpbCwgIGNlaWwpOworICAgICAgQ0hFQ0tfSU5QTEFDRSAoIm1wZl9mbG9vciIsIG1wZl9mbG9vciwgZmxvb3IpOworICAgIH0KKworICBtcGZfY2xlYXIgKGdvdCk7Cit9CisKK3ZvaWQKK2NoZWNrX2FsbCAobXBmX3B0ciBzcmMsIG1wZl9wdHIgdHJ1bmMsIG1wZl9wdHIgY2VpbCwgbXBmX3B0ciBmbG9vcikKK3sKKyAgLyogc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlIGdlbmVyYXRlZCB3aXRoIGRpcmVjdCBmaWVsZCBhc3NpZ25tZW50cyAqLworICBNUEZfQ0hFQ0tfRk9STUFUIChzcmMpOworICBNUEZfQ0hFQ0tfRk9STUFUICh0cnVuYyk7CisgIE1QRl9DSEVDS19GT1JNQVQgKGNlaWwpOworICBNUEZfQ0hFQ0tfRk9STUFUIChmbG9vcik7CisKKyAgY2hlY2tfb25lIChzcmMsIHRydW5jLCBjZWlsLCBmbG9vcik7CisKKyAgbXBmX25lZyAoc3JjLCAgIHNyYyk7CisgIG1wZl9uZWcgKHRydW5jLCB0cnVuYyk7CisgIG1wZl9uZWcgKGNlaWwsICBjZWlsKTsKKyAgbXBmX25lZyAoZmxvb3IsIGZsb29yKTsKKyAgY2hlY2tfb25lIChzcmMsIHRydW5jLCBmbG9vciwgY2VpbCk7Cit9CisKK3ZvaWQKK2NoZWNrX3ZhcmlvdXMgKHZvaWQpCit7CisgIG1wZl90ICBzcmMsIHRydW5jLCBjZWlsLCBmbG9vcjsKKyAgaW50ICAgIG4sIGk7CisKKyAgbXBmX2luaXQyIChzcmMsIDUxMkwpOworICBtcGZfaW5pdDIgKHRydW5jLCAyNTZMKTsKKyAgbXBmX2luaXQyIChjZWlsLCAgMjU2TCk7CisgIG1wZl9pbml0MiAoZmxvb3IsIDI1NkwpOworCisgIC8qIDAgKi8KKyAgbXBmX3NldF91aSAoc3JjLCAwTCk7CisgIG1wZl9zZXRfdWkgKHRydW5jLCAwTCk7CisgIG1wZl9zZXRfdWkgKGNlaWwsIDBMKTsKKyAgbXBmX3NldF91aSAoZmxvb3IsIDBMKTsKKyAgY2hlY2tfYWxsIChzcmMsIHRydW5jLCBjZWlsLCBmbG9vcik7CisKKyAgLyogMSAqLworICBtcGZfc2V0X3VpIChzcmMsIDFMKTsKKyAgbXBmX3NldF91aSAodHJ1bmMsIDFMKTsKKyAgbXBmX3NldF91aSAoY2VpbCwgMUwpOworICBtcGZfc2V0X3VpIChmbG9vciwgMUwpOworICBjaGVja19hbGwgKHNyYywgdHJ1bmMsIGNlaWwsIGZsb29yKTsKKworICAvKiAyXjEwMjQgKi8KKyAgbXBmX3NldF91aSAoc3JjLCAxTCk7CisgIG1wZl9tdWxfMmV4cCAoc3JjLCAgIHNyYywgICAxMDI0TCk7CisgIG1wZl9zZXQgKHRydW5jLCBzcmMpOworICBtcGZfc2V0IChjZWlsLCAgc3JjKTsKKyAgbXBmX3NldCAoZmxvb3IsIHNyYyk7CisgIGNoZWNrX2FsbCAoc3JjLCB0cnVuYywgY2VpbCwgZmxvb3IpOworCisgIC8qIDEvMl4xMDI0LCBmcmFjdGlvbiBvbmx5ICovCisgIG1wZl9zZXRfdWkgKHNyYywgMUwpOworICBtcGZfZGl2XzJleHAgKHNyYywgIHNyYywgMTAyNEwpOworICBtcGZfc2V0X3NpICh0cnVuYywgMEwpOworICBtcGZfc2V0X3NpIChjZWlsLCAxTCk7CisgIG1wZl9zZXRfc2kgKGZsb29yLCAwTCk7CisgIGNoZWNrX2FsbCAoc3JjLCB0cnVuYywgY2VpbCwgZmxvb3IpOworCisgIC8qIDEvMiAqLworICBtcGZfc2V0X3VpIChzcmMsIDFMKTsKKyAgbXBmX2Rpdl8yZXhwIChzcmMsICBzcmMsIDFMKTsKKyAgbXBmX3NldF9zaSAodHJ1bmMsIDBMKTsKKyAgbXBmX3NldF9zaSAoY2VpbCwgMUwpOworICBtcGZfc2V0X3NpIChmbG9vciwgMEwpOworICBjaGVja19hbGwgKHNyYywgdHJ1bmMsIGNlaWwsIGZsb29yKTsKKworICAvKiAxMjMrMS8yXjY0ICovCisgIG1wZl9zZXRfdWkgKHNyYywgMUwpOworICBtcGZfZGl2XzJleHAgKHNyYywgIHNyYywgNjRMKTsKKyAgbXBmX2FkZF91aSAoc3JjLCAgc3JjLCAxMjNMKTsKKyAgbXBmX3NldF9zaSAodHJ1bmMsIDEyM0wpOworICBtcGZfc2V0X3NpIChjZWlsLCAxMjRMKTsKKyAgbXBmX3NldF9zaSAoZmxvb3IsIDEyM0wpOworICBjaGVja19hbGwgKHNyYywgdHJ1bmMsIGNlaWwsIGZsb29yKTsKKworICAvKiBpbnRlZ2VyIG9mIGZ1bGwgcHJlYysxIGxpbWJzLCB1bmNoYW5nZWQgKi8KKyAgbiA9IFBSRUModHJ1bmMpKzE7CisgIEFTU0VSVF9BTFdBWVMgKG4gPD0gUFJFQyhzcmMpKzEpOworICBFWFAoc3JjKSA9IG47CisgIFNJWihzcmMpID0gbjsKKyAgZm9yIChpID0gMDsgaSA8IFNJWihzcmMpOyBpKyspCisgICAgUFRSKHNyYylbaV0gPSBpKzEwMDsKKyAgbXBmX3NldCAodHJ1bmMsIHNyYyk7CisgIG1wZl9zZXQgKGNlaWwsIHNyYyk7CisgIG1wZl9zZXQgKGZsb29yLCBzcmMpOworICBjaGVja19hbGwgKHNyYywgdHJ1bmMsIGNlaWwsIGZsb29yKTsKKworICAvKiBmdWxsIHByZWMrMSBsaW1icywgMSB0cmltbWVkIGZvciBpbnRlZ2VyICovCisgIG4gPSBQUkVDKHRydW5jKSsxOworICBBU1NFUlRfQUxXQVlTIChuIDw9IFBSRUMoc3JjKSsxKTsKKyAgRVhQKHNyYykgPSBuLTE7CisgIFNJWihzcmMpID0gbjsKKyAgZm9yIChpID0gMDsgaSA8IFNJWihzcmMpOyBpKyspCisgICAgUFRSKHNyYylbaV0gPSBpKzIwMDsKKyAgRVhQKHRydW5jKSA9IG4tMTsKKyAgU0laKHRydW5jKSA9IG4tMTsKKyAgZm9yIChpID0gMDsgaSA8IFNJWih0cnVuYyk7IGkrKykKKyAgICBQVFIodHJ1bmMpW2ldID0gaSsyMDE7CisgIG1wZl9zZXQgKGZsb29yLCB0cnVuYyk7CisgIG1wZl9hZGRfdWkgKGNlaWwsIHRydW5jLCAxTCk7CisgIGNoZWNrX2FsbCAoc3JjLCB0cnVuYywgY2VpbCwgZmxvb3IpOworCisgIC8qIHByZWMrMyBsaW1icywgMiB0cmltbWVkIGZvciBzaXplICovCisgIG4gPSBQUkVDKHRydW5jKSszOworICBBU1NFUlRfQUxXQVlTIChuIDw9IFBSRUMoc3JjKSsxKTsKKyAgRVhQKHNyYykgPSBuOworICBTSVooc3JjKSA9IG47CisgIGZvciAoaSA9IDA7IGkgPCBTSVooc3JjKTsgaSsrKQorICAgIFBUUihzcmMpW2ldID0gaSszMDA7CisgIEVYUCh0cnVuYykgPSBuOworICBTSVoodHJ1bmMpID0gbi0yOworICBmb3IgKGkgPSAwOyBpIDwgU0laKHRydW5jKTsgaSsrKQorICAgIFBUUih0cnVuYylbaV0gPSBpKzMwMjsKKyAgbXBmX3NldCAoZmxvb3IsIHRydW5jKTsKKyAgbXBmX3NldCAoY2VpbCwgdHJ1bmMpOworICBQVFIoY2VpbClbMF0rKzsKKyAgY2hlY2tfYWxsIChzcmMsIHRydW5jLCBjZWlsLCBmbG9vcik7CisKKyAgLyogcHJlYys0IGxpbWJzLCAyIHRyaW1tZWQgZm9yIHNpemUsIDEgdHJpbW1lZCBmb3IgaW50ZWdlciAqLworICBuID0gUFJFQyh0cnVuYykrNDsKKyAgQVNTRVJUX0FMV0FZUyAobiA8PSBQUkVDKHNyYykrMSk7CisgIEVYUChzcmMpID0gbi0xOworICBTSVooc3JjKSA9IG47CisgIGZvciAoaSA9IDA7IGkgPCBTSVooc3JjKTsgaSsrKQorICAgIFBUUihzcmMpW2ldID0gaSs0MDA7CisgIEVYUCh0cnVuYykgPSBuLTE7CisgIFNJWih0cnVuYykgPSBuLTM7CisgIGZvciAoaSA9IDA7IGkgPCBTSVoodHJ1bmMpOyBpKyspCisgICAgUFRSKHRydW5jKVtpXSA9IGkrNDAzOworICBtcGZfc2V0IChmbG9vciwgdHJ1bmMpOworICBtcGZfc2V0IChjZWlsLCB0cnVuYyk7CisgIFBUUihjZWlsKVswXSsrOworICBjaGVja19hbGwgKHNyYywgdHJ1bmMsIGNlaWwsIGZsb29yKTsKKworICAvKiBGLkYsIGNhcnJ5IG91dCBvZiBjZWlsICovCisgIEVYUChzcmMpID0gMTsKKyAgU0laKHNyYykgPSAyOworICBQVFIoc3JjKVswXSA9IEdNUF9OVU1CX01BWDsKKyAgUFRSKHNyYylbMV0gPSBHTVBfTlVNQl9NQVg7CisgIEVYUCh0cnVuYykgPSAxOworICBTSVoodHJ1bmMpID0gMTsKKyAgUFRSKHRydW5jKVswXSA9IEdNUF9OVU1CX01BWDsKKyAgbXBmX3NldCAoZmxvb3IsIHRydW5jKTsKKyAgRVhQKGNlaWwpID0gMjsKKyAgU0laKGNlaWwpID0gMTsKKyAgUFRSKGNlaWwpWzBdID0gMTsKKyAgY2hlY2tfYWxsIChzcmMsIHRydW5jLCBjZWlsLCBmbG9vcik7CisKKyAgLyogRkYuRiwgY2Fycnkgb3V0IG9mIGNlaWwgKi8KKyAgRVhQKHNyYykgPSAyOworICBTSVooc3JjKSA9IDM7CisgIFBUUihzcmMpWzBdID0gR01QX05VTUJfTUFYOworICBQVFIoc3JjKVsxXSA9IEdNUF9OVU1CX01BWDsKKyAgUFRSKHNyYylbMl0gPSBHTVBfTlVNQl9NQVg7CisgIEVYUCh0cnVuYykgPSAyOworICBTSVoodHJ1bmMpID0gMjsKKyAgUFRSKHRydW5jKVswXSA9IEdNUF9OVU1CX01BWDsKKyAgUFRSKHRydW5jKVsxXSA9IEdNUF9OVU1CX01BWDsKKyAgbXBmX3NldCAoZmxvb3IsIHRydW5jKTsKKyAgRVhQKGNlaWwpID0gMzsKKyAgU0laKGNlaWwpID0gMTsKKyAgUFRSKGNlaWwpWzBdID0gMTsKKyAgY2hlY2tfYWxsIChzcmMsIHRydW5jLCBjZWlsLCBmbG9vcik7CisKKyAgbXBmX2NsZWFyIChzcmMpOworICBtcGZfY2xlYXIgKHRydW5jKTsKKyAgbXBmX2NsZWFyIChjZWlsKTsKKyAgbXBmX2NsZWFyIChmbG9vcik7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBmL3QtdWlfZGl2LmMgYi90ZXN0cy9tcGYvdC11aV9kaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg2MjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBmL3QtdWlfZGl2LmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIFRlc3QgbXBmX3VpX2Rpdi4KKworQ29weXJpZ2h0IDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKGNvbnN0IGNoYXIgKmRlc2MsIG1wZl9wdHIgZ290LCB1bnNpZ25lZCBsb25nIHUsIG1wZl9zcmNwdHIgdikKK3sKKyAgbXBmX3QgICAgICB1ZjsKKyAgbXBfbGltYl90ICB1bGltYnNbMl07CisgIG1wX3NpemVfdCAgdXNpemU7CisKKyAgdWxpbWJzWzBdID0gdSAmIEdNUF9OVU1CX01BU0s7CisgIHVzaXplID0gKHUgIT0gMCk7CisjaWYgQklUU19QRVJfVUxPTkcgPiBHTVBfTlVNQl9CSVRTCisgIHUgPj49IEdNUF9OVU1CX0JJVFM7CisgIHVsaW1ic1sxXSA9IHU7CisgIHVzaXplICs9ICh1ICE9IDApOworI2VuZGlmCisgIFBUUih1ZikgPSB1bGltYnM7CisgIFNJWih1ZikgPSB1c2l6ZTsKKyAgRVhQKHVmKSA9IHVzaXplOworCisgIGlmICghIHJlZm1wZl92YWxpZGF0ZV9kaXZpc2lvbiAoIm1wZl91aV9kaXYiLCBnb3QsIHVmLCB2KSkKKyAgICB7CisgICAgICBtcF90cmFjZV9iYXNlID0gLTE2OworICAgICAgcHJpbnRmICAgICgiICB1IDB4JWxYICAoJWx1KVxuIiwgdSwgdSk7CisgICAgICBtcGZfdHJhY2UgKCIgIHYiLCB2KTsKKyAgICAgIHByaW50ZiAgICAoIiAgJXNcbiIsIGRlc2MpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVja19yYW5kICh2b2lkKQoreworICB1bnNpZ25lZCBsb25nICBtaW5fcHJlYyA9IF9fR01QRl9CSVRTX1RPX1BSRUMgKDEpOworICBnbXBfcmFuZHN0YXRlX3B0ciAgcmFuZHMgPSBSQU5EUzsKKyAgdW5zaWduZWQgbG9uZyAgcHJlYywgdTsKKyAgbXBmX3QgIGdvdCwgdjsKKyAgaW50ICAgIGk7CisKKyAgbXBmX2luaXQgKGdvdCk7CisgIG1wZl9pbml0ICh2KTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspCisgICAgeworICAgICAgLyogZ290IHByZWNpc2lvbiAqLworICAgICAgcHJlYyA9IG1pbl9wcmVjICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgMTVMKTsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAoZ290LCBwcmVjKTsKKworICAgICAgLyogdSAqLworICAgICAgcHJlYyA9IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIEJJVFNfUEVSX1VMT05HKzEpOworICAgICAgdSA9IGdtcF91cmFuZG9tYl91aSAocmFuZHMsIHByZWMpOworCisgICAgICAvKiB2IHByZWNpc2lvbiAqLworICAgICAgcHJlYyA9IG1pbl9wcmVjICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgMTVMKTsKKyAgICAgIHJlZm1wZl9zZXRfcHJlY19saW1icyAodiwgcHJlYyk7CisKKyAgICAgIC8qIHYsIG5vbi16ZXJvICovCisgICAgICBkbyB7CisgICAgICAgIG1wZl9yYW5kb20yICh2LCBQUkVDKHYpLCAobXBfZXhwX3QpIDIwKTsKKyAgICAgIH0gd2hpbGUgKFNJWih2KSA9PSAwKTsKKworICAgICAgLyogdiBwb3NzaWJseSBuZWdhdGl2ZSAqLworICAgICAgaWYgKGdtcF91cmFuZG9tYl91aSAocmFuZHMsIDFMKSkKKyAgICAgICAgbXBmX25lZyAodiwgdik7CisKKyAgICAgIGlmICgoaSAlIDIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzcmMgIT0gZHN0ICovCisgICAgICAgICAgbXBmX3VpX2RpdiAoZ290LCB1LCB2KTsKKyAgICAgICAgICBjaGVja19vbmUgKCJzZXBhcmF0ZSIsIGdvdCwgdSwgdik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIHNyYyA9PSBkc3QgKi8KKyAgICAgICAgICBwcmVjID0gcmVmbXBmX3NldF9vdmVybGFwIChnb3QsIHYpOworICAgICAgICAgIG1wZl91aV9kaXYgKGdvdCwgdSwgZ290KTsKKyAgICAgICAgICBjaGVja19vbmUgKCJvdmVybGFwIHNyYz09ZHN0IiwgZ290LCB1LCB2KTsKKworICAgICAgICAgIG1wZl9zZXRfcHJlY19yYXcgKGdvdCwgcHJlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChnb3QpOworICBtcGZfY2xlYXIgKHYpOworfQorCit2b2lkCitjaGVja192YXJpb3VzICh2b2lkKQoreworICBtcGZfdCBnb3QsIHY7CisKKyAgbXBmX2luaXQgKGdvdCk7CisgIG1wZl9pbml0ICh2KTsKKworICAvKiAxMDAvNCA9PSAyNSAqLworICBtcGZfc2V0X3ByZWMgKGdvdCwgMjBMKTsKKyAgbXBmX3NldF91aSAodiwgNEwpOworICBtcGZfdWlfZGl2IChnb3QsIDEwMEwsIHYpOworICBNUEZfQ0hFQ0tfRk9STUFUIChnb3QpOworICBBU1NFUlRfQUxXQVlTIChtcGZfY21wX3VpIChnb3QsIDI1TCkgPT0gMCk7CisKKyAgeworICAgIC8qIDEvKDJebisxKSwgYSBjYXNlIHdoZXJlIHRydW5jYXRpbmcgdGhlIGRpdmlzb3Igd291bGQgYmUgd3JvbmcgKi8KKyAgICB1bnNpZ25lZCBsb25nICB1ID0gMUw7CisgICAgbXBmX3NldF9wcmVjIChnb3QsIDUwMEwpOworICAgIG1wZl9zZXRfcHJlYyAodiwgOTAwTCk7CisgICAgbXBmX3NldF91aSAodiwgMUwpOworICAgIG1wZl9tdWxfMmV4cCAodiwgdiwgODAwTCk7CisgICAgbXBmX2FkZF91aSAodiwgdiwgMUwpOworICAgIG1wZl91aV9kaXYgKGdvdCwgdSwgdik7CisgICAgY2hlY2tfb25lICgiMS8yXm4rMSwgc2VwYXJhdGUiLCBnb3QsIHUsIHYpOworICB9CisKKyAgbXBmX2NsZWFyIChnb3QpOworICBtcGZfY2xlYXIgKHYpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX3ZhcmlvdXMgKCk7CisgIGNoZWNrX3JhbmQgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi9sb2dpYy5jIGIvdGVzdHMvbXBuL2xvZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxYzlhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi9sb2dpYy5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBUZXN0IG1wbl9hbmQsIG1wbl9pb3IsIG1wbl94b3IsIG1wbl9hbmRuLCBtcG5faW9ybiwgbXBuX3hub3IsIG1wbl9uYW5kLCBhbmQKKyAgIG1wbl9uaW9yLgorCitDb3B5cmlnaHQgMjAxMS0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBGYWtlIG5hdGl2ZSBwcmV2YWxlbmNlIG9mIHRoZSB0ZXN0ZWQgb3BlcmF0aW9ucywgc28gdGhhdCB3ZSBhY3R1YWxseSB0ZXN0CisgICB0aGUgY29tcGlsZWQgZnVuY3Rpb25zLCBpLmUuLCB0aGUgb25lcyB3aGljaCB1c2VycyB3aWxsIHJlYWNoLiAgVGhlIGlubGluZWQKKyAgIHZhcmlhbnRzIHdpbGwgYmUgdGVzdGVkIHRocm91Z2ggdGVzdHMvbXB6L2xvZ2ljLmMuICAqLworI2RlZmluZSBIQVZFX05BVElWRV9tcG5fY29tICAgIDEKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX2FuZF9uICAxCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9hbmRuX24gMQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fbmFuZF9uIDEKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX2lvcl9uICAxCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl9pb3JuX24gMQorI2RlZmluZSBIQVZFX05BVElWRV9tcG5fbmlvcl9uIDEKKyNkZWZpbmUgSEFWRV9OQVRJVkVfbXBuX3hvcl9uICAxCisjZGVmaW5lIEhBVkVfTkFUSVZFX21wbl94bm9yX24gMQorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZSAobXBfc3JjcHRyIHJlZnAsIG1wX3NyY3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBuLCBjb25zdCBjaGFyICpmdW5jbmFtZSkKK3sKKyAgaWYgKG1wbl9jbXAgKHJlZnAsIHJwLCBuKSkKKyAgICB7CisgICAgICBwcmludGYgKCJFUlJPUiBpbiBtcG5fJXNcbiIsIGZ1bmNuYW1lKTsKKyAgICAgIHByaW50ZiAoImE6ICIpOyBtcG5fZHVtcCAoYXAsIG4pOworICAgICAgcHJpbnRmICgiYjogIik7IG1wbl9kdW1wIChicCwgbik7CisgICAgICBwcmludGYgKCJyOiAgICIpOyBtcG5fZHVtcCAocnAsIG4pOworICAgICAgcHJpbnRmICgicmVmOiAiKTsgbXBuX2R1bXAgKHJlZnAsIG4pOworICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBhLCBiOworICBtcF9wdHIgYXAsIGJwLCBycCwgcmVmcDsKKyAgbXBfc2l6ZV90IG1heF9uLCBuLCBpOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbG9uZyB0ZXN0LCByZXBzID0gMTAwMDsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICBtcHpfaW5pdHMgKGEsIGIsIE5VTEwpOworCisgIHJhbmRzID0gUkFORFM7CQkvKiBGSVhNRTogbm90IHVzZWQgKi8KKworICBtYXhfbiA9IDEwMDsKKworICBycCA9IFRNUF9BTExPQ19MSU1CUyAoMSArIG1heF9uICogOCAvIEdNUF9MSU1CX0JJVFMpOworICByZWZwID0gVE1QX0FMTE9DX0xJTUJTICgxICsgbWF4X24gKiA4IC8gR01QX0xJTUJfQklUUyk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IHJlcHM7IHRlc3QrKykKKyAgICB7CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IG1heF9uOyBpKyspCisJeworCSAgbXB6X3JyYW5kb21iIChhLCByYW5kcywgaSAqIDgpOworCSAgbXB6X3JyYW5kb21iIChiLCByYW5kcywgaSAqIDgpOworCSAgbXB6X3NldGJpdCAoYSwgaSAqIDggLSAxKTsKKwkgIG1wel9zZXRiaXQgKGIsIGkgKiA4IC0gMSk7CisJICBhcCA9IFBUUihhKTsKKwkgIGJwID0gUFRSKGIpOworCSAgbiA9IFNJWihhKTsKKworCSAgcmVmbXBuX2FuZF9uIChyZWZwLCBhcCwgYnAsIG4pOworCSAgbXBuX2FuZF9uIChycCwgYXAsIGJwLCBuKTsKKwkgIGNoZWNrX29uZSAocmVmcCwgcnAsIGFwLCBicCwgbiwgImFuZF9uIik7CisKKwkgIHJlZm1wbl9pb3JfbiAocmVmcCwgYXAsIGJwLCBuKTsKKwkgIG1wbl9pb3JfbiAocnAsIGFwLCBicCwgbik7CisJICBjaGVja19vbmUgKHJlZnAsIHJwLCBhcCwgYnAsIG4sICJpb3JfbiIpOworCisJICByZWZtcG5feG9yX24gKHJlZnAsIGFwLCBicCwgbik7CisJICBtcG5feG9yX24gKHJwLCBhcCwgYnAsIG4pOworCSAgY2hlY2tfb25lIChyZWZwLCBycCwgYXAsIGJwLCBuLCAieG9yX24iKTsKKworCSAgcmVmbXBuX2FuZG5fbiAocmVmcCwgYXAsIGJwLCBuKTsKKwkgIG1wbl9hbmRuX24gKHJwLCBhcCwgYnAsIG4pOworCSAgY2hlY2tfb25lIChyZWZwLCBycCwgYXAsIGJwLCBuLCAiYW5kbl9uIik7CisKKwkgIHJlZm1wbl9pb3JuX24gKHJlZnAsIGFwLCBicCwgbik7CisJICBtcG5faW9ybl9uIChycCwgYXAsIGJwLCBuKTsKKwkgIGNoZWNrX29uZSAocmVmcCwgcnAsIGFwLCBicCwgbiwgImlvcm5fbiIpOworCisJICByZWZtcG5fbmFuZF9uIChyZWZwLCBhcCwgYnAsIG4pOworCSAgbXBuX25hbmRfbiAocnAsIGFwLCBicCwgbik7CisJICBjaGVja19vbmUgKHJlZnAsIHJwLCBhcCwgYnAsIG4sICJuYW5kX24iKTsKKworCSAgcmVmbXBuX25pb3JfbiAocmVmcCwgYXAsIGJwLCBuKTsKKwkgIG1wbl9uaW9yX24gKHJwLCBhcCwgYnAsIG4pOworCSAgY2hlY2tfb25lIChyZWZwLCBycCwgYXAsIGJwLCBuLCAibmlvcl9uIik7CisKKwkgIHJlZm1wbl94bm9yX24gKHJlZnAsIGFwLCBicCwgbik7CisJICBtcG5feG5vcl9uIChycCwgYXAsIGJwLCBuKTsKKwkgIGNoZWNrX29uZSAocmVmcCwgcnAsIGFwLCBicCwgbiwgInhub3JfbiIpOworCisJICByZWZtcG5fY29tIChyZWZwLCBhcCwgbik7CisJICBtcG5fY29tIChycCwgYXAsIG4pOworCSAgY2hlY2tfb25lIChyZWZwLCBycCwgYXAsIGJwLCBuLCAiY29tIik7CisJfQorICAgIH0KKworICBUTVBfRlJFRTsKKyAgbXB6X2NsZWFycyAoYSwgYiwgTlVMTCk7CisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1hZGRhZGRtdWwuYyBiL3Rlc3RzL21wbi90LWFkZGFkZG11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkM2IwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1hZGRhZGRtdWwuYwpAQCAtMCwwICsxLDk4IEBACisvKiBUZXN0IG1wbl9hZGRhZGRtdWxfMW1zYjAuCisKK0NvcHlyaWdodCAyMDIxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZiAhSEFWRV9OQVRJVkVfbXBuX2FkZGFkZG11bF8xbXNiMAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIHJldHVybiA3NzsgIC8qIFRlc3QgZHJpdmVyICJTS0lQIiAqLworfQorI2Vsc2UKKworc3RhdGljIHZvaWQKK29uZV90ZXN0IChpbnQgaSwgbXBfc3JjcHRyIGEsIG1wX3NyY3B0ciBiLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IHUsIG1wX2xpbWJfdCB2KQoreworICBtcF9wdHIgciA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG4gKyAxKTsKKyAgbXBfcHRyIHJlZiA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG4gKyAxKTsKKworICB1ICY9IH5HTVBfTlVNQl9ISUdIQklUOworICB2ICY9IH5HTVBfTlVNQl9ISUdIQklUOworICByZWZbbl0gPSBtcG5fbXVsXzEgKHJlZiwgYSwgbiwgdSk7CisgIHJlZltuXSArPSBtcG5fYWRkbXVsXzEgKHJlZiwgYiwgbiwgdik7CisgIHJbbl0gPSBtcG5fYWRkYWRkbXVsXzFtc2IwIChyLCBhLCBiLCBuLCB1LCB2KTsKKworICBpZiAobXBuX2NtcCAociwgcmVmLCBuKzEpICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgaSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgcmVzdWx0IGZyb20gYWRkYWRkbXVsXzFtc2IwXG4iKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJvcDE9JU54XG4iLCBhLCBuKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJvcDI9JU54XG4iLCBiLCBuKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJ1ID0gJU14LCB2ID0gJU14XG4iLCB1LCB2KTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJyZXM9JU54XG4iLCByLCBuICsgMSk7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAicmVmPSVOeFxuIiwgcmVmLCBuICsgMSk7CisKKyAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBvcDEsIG9wMjsKKyAgaW50IGk7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdHMgKGJzLCBvcDEsIG9wMiwgTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBzaXplX3JhbmdlOworICAgICAgbXBfc2l6ZV90IGJpdF9zaXplOworICAgICAgbXBfc2l6ZV90IGxpbWJfc2l6ZTsKKyAgICAgIG1wX2xpbWJfdCB1LCB2OworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDEwICsgMjsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKworICAgICAgYml0X3NpemUgPSBtcHpfZ2V0X3VpIChicykgKyAxMDsKKyAgICAgIG1wel9ycmFuZG9tYiAob3AxLCByYW5kcywgYml0X3NpemUpOworICAgICAgbXB6X3JyYW5kb21iIChvcDIsIHJhbmRzLCBiaXRfc2l6ZSk7CisKKyAgICAgIG1wel9ycmFuZG9tYiAoYnMsIHJhbmRzLCBHTVBfTlVNQl9CSVRTIC0gMSk7CisgICAgICB1ID0gbXB6X2dldGxpbWJuIChicywgMCk7CisKKyAgICAgIG1wel9ycmFuZG9tYiAoYnMsIHJhbmRzLCBHTVBfTlVNQl9CSVRTIC0gMSk7CisgICAgICB2ID0gbXB6X2dldGxpbWJuIChicywgMCk7CisKKyAgICAgIGxpbWJfc2l6ZSA9IG1wel9zaXplIChvcDEpOworICAgICAgb25lX3Rlc3QgKGksIG1wel9saW1ic19yZWFkIChvcDEpLCBtcHpfbGltYnNfcmVhZChvcDIpLCBsaW1iX3NpemUsIHUsIHYpOworICAgIH0KKyAgbXB6X2NsZWFycyAoYnMsIG9wMSwgb3AyLCBOVUxMKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWFvcnNfMS5jIGIvdGVzdHMvbXBuL3QtYW9yc18xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5NDkyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LWFvcnNfMS5jCkBAIC0wLDAgKzEsMzEwIEBACisvKiBUZXN0IG1wbl9hZGRfMSBhbmQgbXBuX3N1Yl8xLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2RlZmluZSBNICAgICAgR01QX05VTUJfTUFYCisjZGVmaW5lIEFTSVpFICAxMAorI2RlZmluZSBNQUdJQyAgMHgxMjM0CisKKyNkZWZpbmUgU0VUVVAoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZm1wbl9yYW5kb20gKGdvdCwgZGF0YVtpXS5zaXplKTsgIFwKKyAgICBnb3RbZGF0YVtpXS5zaXplXSA9IE1BR0lDOyAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0VUVVBfSU5QTEFDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmbXBuX2NvcHlpIChnb3QsIGRhdGFbaV0uc3JjLCBkYXRhW2ldLnNpemUpOyAgICAgIFwKKyAgICBnb3RbZGF0YVtpXS5zaXplXSA9IE1BR0lDOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFZFUklGWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVyaWZ5IChuYW1lLCBpLCBkYXRhW2ldLnNyYywgZGF0YVtpXS5uLCAgICBcCisgICAgICAgICAgICBnb3RfYywgZGF0YVtpXS53YW50X2MsICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3QsIGRhdGFbaV0ud2FudCwgZGF0YVtpXS5zaXplKTsgICBcCisgIH0gd2hpbGUgKDApCisKK3R5cGVkZWYgbXBfbGltYl90ICgqbXBuX2FvcnNfMV90KSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wbl9hb3JzXzFfdCBmdWRnZSAobXBuX2FvcnNfMV90KTsKKworCit2b2lkCit2ZXJpZnkgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpLAorICAgICAgICBtcF9zcmNwdHIgc3JjLCBtcF9saW1iX3QgbiwKKyAgICAgICAgbXBfbGltYl90IGdvdF9jLCBtcF9saW1iX3Qgd2FudF9jLAorICAgICAgICBtcF9zcmNwdHIgZ290LCBtcF9zcmNwdHIgd2FudCwgbXBfc2l6ZV90IHNpemUpCit7CisgIGlmIChnb3Rbc2l6ZV0gIT0gTUFHSUMpCisgICAgeworICAgICAgcHJpbnRmICgiT3ZlcndyaXRlIGF0ICVzIGk9JWRcbiIsIG5hbWUsIGkpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGlmIChnb3RfYyAhPSB3YW50X2MgfHwgISByZWZtcG5fZXF1YWxfYW55bmFpbCAoZ290LCB3YW50LCBzaXplKSkKKyAgICB7CisgICAgICBwcmludGYgKCJXcm9uZyBhdCAlcyBpPSVkIHNpemU9JWxkXG4iLCBuYW1lLCBpLCBzaXplKTsKKyAgICAgIG1wbl90cmFjZSAoIiAgIHNyYyIsIHNyYywgIHNpemUpOworICAgICAgbXBuX3RyYWNlICgiICAgICBuIiwgJm4sICAgKG1wX3NpemVfdCkgMSk7CisgICAgICBtcG5fdHJhY2UgKCIgICBnb3QiLCBnb3QsICBzaXplKTsKKyAgICAgIG1wbl90cmFjZSAoIiAgd2FudCIsIHdhbnQsIHNpemUpOworICAgICAgbXBuX3RyYWNlICgiIGdvdCBjIiwgJmdvdF9jLCAgKG1wX3NpemVfdCkgMSk7CisgICAgICBtcG5fdHJhY2UgKCJ3YW50IGMiLCAmd2FudF9jLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworCit2b2lkCitjaGVja19hZGRfMSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbXBfc2l6ZV90ICAgICAgICBzaXplOworICAgIG1wX2xpbWJfdCAgICAgICAgbjsKKyAgICBjb25zdCBtcF9saW1iX3QgIHNyY1tBU0laRV07CisgICAgbXBfbGltYl90ICAgICAgICB3YW50X2M7CisgICAgY29uc3QgbXBfbGltYl90ICB3YW50W0FTSVpFXTsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAxLCAwLCB7IDAgfSwgIDAsIHsgMCB9IH0sCisgICAgeyAxLCAwLCB7IDEgfSwgIDAsIHsgMSB9IH0sCisgICAgeyAxLCAxLCB7IDAgfSwgIDAsIHsgMSB9IH0sCisgICAgeyAxLCAwLCB7IE0gfSwgIDAsIHsgTSB9IH0sCisgICAgeyAxLCBNLCB7IDAgfSwgIDAsIHsgTSB9IH0sCisgICAgeyAxLCAxLCB7IDEyMyB9LCAwLCB7IDEyNCB9IH0sCisKKyAgICB7IDEsIDEsIHsgTSB9LCAgMSwgeyAwIH0gfSwKKyAgICB7IDEsIE0sIHsgMSB9LCAgMSwgeyAwIH0gfSwKKyAgICB7IDEsIE0sIHsgTSB9LCAgMSwgeyBNLTEgfSB9LAorCisgICAgeyAyLCAwLCB7IDAsIDAgfSwgIDAsIHsgMCwgMCB9IH0sCisgICAgeyAyLCAwLCB7IDEsIDAgfSwgIDAsIHsgMSwgMCB9IH0sCisgICAgeyAyLCAxLCB7IDAsIDAgfSwgIDAsIHsgMSwgMCB9IH0sCisgICAgeyAyLCAwLCB7IE0sIDAgfSwgIDAsIHsgTSwgMCB9IH0sCisgICAgeyAyLCBNLCB7IDAsIDAgfSwgIDAsIHsgTSwgMCB9IH0sCisgICAgeyAyLCAxLCB7IE0sIDAgfSwgIDAsIHsgMCwgMSB9IH0sCisgICAgeyAyLCBNLCB7IDEsIDAgfSwgIDAsIHsgMCwgMSB9IH0sCisgICAgeyAyLCBNLCB7IE0sIDAgfSwgIDAsIHsgTS0xLCAxIH0gfSwKKyAgICB7IDIsIE0sIHsgTSwgMCB9LCAgMCwgeyBNLTEsIDEgfSB9LAorCisgICAgeyAyLCAxLCB7IE0sIE0gfSwgIDEsIHsgMCwgMCB9IH0sCisgICAgeyAyLCBNLCB7IDEsIE0gfSwgIDEsIHsgMCwgMCB9IH0sCisgICAgeyAyLCBNLCB7IE0sIE0gfSwgIDEsIHsgTS0xLCAwIH0gfSwKKyAgICB7IDIsIE0sIHsgTSwgTSB9LCAgMSwgeyBNLTEsIDAgfSB9LAorCisgICAgeyAzLCAxLCB7IE0sIE0sIE0gfSwgIDEsIHsgMCwgMCwgMCB9IH0sCisgICAgeyAzLCBNLCB7IDEsIE0sIE0gfSwgIDEsIHsgMCwgMCwgMCB9IH0sCisgICAgeyAzLCBNLCB7IE0sIE0sIE0gfSwgIDEsIHsgTS0xLCAwLCAwIH0gfSwKKyAgICB7IDMsIE0sIHsgTSwgTSwgTSB9LCAgMSwgeyBNLTEsIDAsIDAgfSB9LAorCisgICAgeyA0LCAxLCB7IE0sIE0sIE0sIE0gfSwgIDEsIHsgMCwgMCwgMCwgMCB9IH0sCisgICAgeyA0LCBNLCB7IDEsIE0sIE0sIE0gfSwgIDEsIHsgMCwgMCwgMCwgMCB9IH0sCisgICAgeyA0LCBNLCB7IE0sIE0sIE0sIE0gfSwgIDEsIHsgTS0xLCAwLCAwLCAwIH0gfSwKKyAgICB7IDQsIE0sIHsgTSwgTSwgTSwgTSB9LCAgMSwgeyBNLTEsIDAsIDAsIDAgfSB9LAorCisgICAgeyA0LCBNLCB7IE0sIDAsICAgTSwgTSB9LCAgMCwgeyBNLTEsIDEsIE0sIE0gfSB9LAorICAgIHsgNCwgTSwgeyBNLCBNLTEsIE0sIE0gfSwgIDAsIHsgTS0xLCBNLCBNLCBNIH0gfSwKKworICAgIHsgNCwgTSwgeyBNLCBNLCAwLCAgIE0gfSwgIDAsIHsgTS0xLCAwLCAxLCBNIH0gfSwKKyAgICB7IDQsIE0sIHsgTSwgTSwgTS0xLCBNIH0sICAwLCB7IE0tMSwgMCwgTSwgTSB9IH0sCisgIH07CisKKyAgbXBfbGltYl90ICBnb3RbQVNJWkVdOworICBtcF9saW1iX3QgIGdvdF9jOworICAvKiBtcG5fc2VjX2FkZF9hX2l0Y2gobikgPD0gbiAqLworICBtcF9saW1iX3QgIHNjcmF0Y2hbQVNJWkVdOworICBpbnQgICAgICAgIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIFNFVFVQICgpOworICAgICAgZ290X2MgPSBtcG5fYWRkXzEgKGdvdCwgZGF0YVtpXS5zcmMsIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5uKTsKKyAgICAgIFZFUklGWSAoImNoZWNrX2FkZF8xIChzZXBhcmF0ZSkiKTsKKworICAgICAgU0VUVVBfSU5QTEFDRSAoKTsKKyAgICAgIGdvdF9jID0gbXBuX2FkZF8xIChnb3QsIGdvdCwgZGF0YVtpXS5zaXplLCBkYXRhW2ldLm4pOworICAgICAgVkVSSUZZICgiY2hlY2tfYWRkXzEgKGluLXBsYWNlKSIpOworCisgICAgICBTRVRVUCAoKTsKKyAgICAgIHNjcmF0Y2ggW21wbl9zZWNfYWRkXzFfaXRjaChkYXRhW2ldLnNpemUpXSA9IE1BR0lDOworICAgICAgZ290X2MgPSBtcG5fc2VjX2FkZF8xIChnb3QsIGRhdGFbaV0uc3JjLCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubiwgc2NyYXRjaCk7CisgICAgICBnb3RfYyBePSBzY3JhdGNoIFttcG5fc2VjX2FkZF8xX2l0Y2goZGF0YVtpXS5zaXplKV0gXiBNQUdJQzsKKyAgICAgIFZFUklGWSAoImNoZWNrX3NlY19hZGRfMSAoc2VwYXJhdGUpIik7CisKKyAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICBnb3RfYyA9IG1wbl9zZWNfYWRkXzEgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubiwgc2NyYXRjaCk7CisgICAgICBWRVJJRlkgKCJjaGVja19zZWNfYWRkXzEgKGluLXBsYWNlKSIpOworCisgICAgICBpZiAoZGF0YVtpXS5uID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICBTRVRVUCAoKTsKKyAgICAgICAgICBnb3RfYyA9IG1wbl9hZGRfMSAoZ290LCBkYXRhW2ldLnNyYywgZGF0YVtpXS5zaXplLCBDTlNUX0xJTUIoMSkpOworICAgICAgICAgIFZFUklGWSAoImNoZWNrX2FkZF8xIChzZXBhcmF0ZSwgY29uc3QgMSkiKTsKKworICAgICAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fYWRkXzEgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIENOU1RfTElNQigxKSk7CisgICAgICAgICAgVkVSSUZZICgiY2hlY2tfYWRkXzEgKGluLXBsYWNlLCBjb25zdCAxKSIpOworCisgICAgICAgICAgU0VUVVAgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fc2VjX2FkZF8xIChnb3QsIGRhdGFbaV0uc3JjLCBkYXRhW2ldLnNpemUsCisJCQkJIENOU1RfTElNQigxKSwgc2NyYXRjaCk7CisgICAgICAgICAgVkVSSUZZICgiY2hlY2tfc2VjX2FkZF8xIChzZXBhcmF0ZSwgY29uc3QgMSkiKTsKKworICAgICAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fc2VjX2FkZF8xIChnb3QsIGdvdCwgZGF0YVtpXS5zaXplLAorCQkJCSBDTlNUX0xJTUIoMSksIHNjcmF0Y2gpOworICAgICAgICAgIFZFUklGWSAoImNoZWNrX3NlY19hZGRfMSAoaW4tcGxhY2UsIGNvbnN0IDEpIik7CisgICAgICAgIH0KKworICAgICAgLyogU2FtZSBhZ2FpbiBvbiBmdW5jdGlvbnMsIG5vdCBpbmxpbmVzLiAqLworICAgICAgU0VUVVAgKCk7CisgICAgICBnb3RfYyA9ICgqZnVkZ2UobXBuX2FkZF8xKSkgKGdvdCwgZGF0YVtpXS5zcmMsIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5uKTsKKyAgICAgIFZFUklGWSAoImNoZWNrX2FkZF8xIChmdW5jdGlvbiwgc2VwYXJhdGUpIik7CisKKyAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICBnb3RfYyA9ICgqZnVkZ2UobXBuX2FkZF8xKSkgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubik7CisgICAgICBWRVJJRlkgKCJjaGVja19hZGRfMSAoZnVuY3Rpb24sIGluLXBsYWNlKSIpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfc3ViXzEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIG1wX3NpemVfdCAgICAgICAgc2l6ZTsKKyAgICBtcF9saW1iX3QgICAgICAgIG47CisgICAgY29uc3QgbXBfbGltYl90ICBzcmNbQVNJWkVdOworICAgIG1wX2xpbWJfdCAgICAgICAgd2FudF9jOworICAgIGNvbnN0IG1wX2xpbWJfdCAgd2FudFtBU0laRV07CisgIH0gZGF0YVtdID0geworICAgIHsgMSwgMCwgeyAwIH0sICAwLCB7IDAgfSB9LAorICAgIHsgMSwgMCwgeyAxIH0sICAwLCB7IDEgfSB9LAorICAgIHsgMSwgMSwgeyAxIH0sICAwLCB7IDAgfSB9LAorICAgIHsgMSwgMCwgeyBNIH0sICAwLCB7IE0gfSB9LAorICAgIHsgMSwgMSwgeyBNIH0sICAwLCB7IE0tMSB9IH0sCisgICAgeyAxLCAxLCB7IDEyMyB9LCAwLCB7IDEyMiB9IH0sCisKKyAgICB7IDEsIDEsIHsgMCB9LCAgMSwgeyBNIH0gfSwKKyAgICB7IDEsIE0sIHsgMCB9LCAgMSwgeyAxIH0gfSwKKworICAgIHsgMiwgMCwgeyAwLCAwIH0sICAwLCB7IDAsIDAgfSB9LAorICAgIHsgMiwgMCwgeyAxLCAwIH0sICAwLCB7IDEsIDAgfSB9LAorICAgIHsgMiwgMSwgeyAxLCAwIH0sICAwLCB7IDAsIDAgfSB9LAorICAgIHsgMiwgMCwgeyBNLCAwIH0sICAwLCB7IE0sIDAgfSB9LAorICAgIHsgMiwgMSwgeyBNLCAwIH0sICAwLCB7IE0tMSwgMCB9IH0sCisgICAgeyAyLCAxLCB7IDEyMywgMCB9LCAwLCB7IDEyMiwgMCB9IH0sCisKKyAgICB7IDIsIDEsIHsgMCwgMCB9LCAgMSwgeyBNLCBNIH0gfSwKKyAgICB7IDIsIE0sIHsgMCwgMCB9LCAgMSwgeyAxLCBNIH0gfSwKKworICAgIHsgMywgMCwgeyAwLCAgIDAsIDAgfSwgIDAsIHsgMCwgICAwLCAwIH0gfSwKKyAgICB7IDMsIDAsIHsgMTIzLCAwLCAwIH0sICAwLCB7IDEyMywgMCwgMCB9IH0sCisKKyAgICB7IDMsIDEsIHsgMCwgMCwgMCB9LCAgMSwgeyBNLCBNLCBNIH0gfSwKKyAgICB7IDMsIE0sIHsgMCwgMCwgMCB9LCAgMSwgeyAxLCBNLCBNIH0gfSwKKworICAgIHsgNCwgMSwgeyAwLCAwLCAwLCAwIH0sICAxLCB7IE0sIE0sIE0sIE0gfSB9LAorICAgIHsgNCwgTSwgeyAwLCAwLCAwLCAwIH0sICAxLCB7IDEsIE0sIE0sIE0gfSB9LAorCisgICAgeyA0LCAxLCB7IDAsIDAsIDEsICAgNDIgfSwgIDAsIHsgTSwgTSwgMCwgICA0MiB9IH0sCisgICAgeyA0LCBNLCB7IDAsIDAsIDEyMywgMjQgfSwgIDAsIHsgMSwgTSwgMTIyLCAyNCB9IH0sCisgIH07CisKKyAgbXBfbGltYl90ICBnb3RbQVNJWkVdOworICBtcF9saW1iX3QgIGdvdF9jOworICAvKiBtcG5fc2VjX3N1Yl8xX2l0Y2gobikgPD0gbiAqLworICBtcF9saW1iX3QgIHNjcmF0Y2hbQVNJWkVdOworICBpbnQgICAgICAgIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIFNFVFVQICgpOworICAgICAgZ290X2MgPSBtcG5fc3ViXzEgKGdvdCwgZGF0YVtpXS5zcmMsIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5uKTsKKyAgICAgIFZFUklGWSAoImNoZWNrX3N1Yl8xIChzZXBhcmF0ZSkiKTsKKworICAgICAgU0VUVVBfSU5QTEFDRSAoKTsKKyAgICAgIGdvdF9jID0gbXBuX3N1Yl8xIChnb3QsIGdvdCwgZGF0YVtpXS5zaXplLCBkYXRhW2ldLm4pOworICAgICAgVkVSSUZZICgiY2hlY2tfc3ViXzEgKGluLXBsYWNlKSIpOworCisgICAgICBTRVRVUCAoKTsKKyAgICAgIHNjcmF0Y2ggW21wbl9zZWNfc3ViXzFfaXRjaChkYXRhW2ldLnNpemUpXSA9IE1BR0lDOworICAgICAgZ290X2MgPSBtcG5fc2VjX3N1Yl8xIChnb3QsIGRhdGFbaV0uc3JjLCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubiwgc2NyYXRjaCk7CisgICAgICBnb3RfYyBePSBzY3JhdGNoIFttcG5fc2VjX3N1Yl8xX2l0Y2goZGF0YVtpXS5zaXplKV0gXiBNQUdJQzsKKyAgICAgIFZFUklGWSAoImNoZWNrX3NlY19zdWJfMSAoc2VwYXJhdGUpIik7CisKKyAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICBnb3RfYyA9IG1wbl9zZWNfc3ViXzEgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubiwgc2NyYXRjaCk7CisgICAgICBWRVJJRlkgKCJjaGVja19zZWNfc3ViXzEgKGluLXBsYWNlKSIpOworCisgICAgICBpZiAoZGF0YVtpXS5uID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICBTRVRVUCAoKTsKKyAgICAgICAgICBnb3RfYyA9IG1wbl9zdWJfMSAoZ290LCBkYXRhW2ldLnNyYywgZGF0YVtpXS5zaXplLCBDTlNUX0xJTUIoMSkpOworICAgICAgICAgIFZFUklGWSAoImNoZWNrX3N1Yl8xIChzZXBhcmF0ZSwgY29uc3QgMSkiKTsKKworICAgICAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fc3ViXzEgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIENOU1RfTElNQigxKSk7CisgICAgICAgICAgVkVSSUZZICgiY2hlY2tfc3ViXzEgKGluLXBsYWNlLCBjb25zdCAxKSIpOworCisgICAgICAgICAgU0VUVVAgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fc2VjX3N1Yl8xIChnb3QsIGRhdGFbaV0uc3JjLCBkYXRhW2ldLnNpemUsCisJCQkJIENOU1RfTElNQigxKSwgc2NyYXRjaCk7CisgICAgICAgICAgVkVSSUZZICgiY2hlY2tfc2VjX3N1Yl8xIChzZXBhcmF0ZSwgY29uc3QgMSkiKTsKKworICAgICAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICAgICAgZ290X2MgPSBtcG5fc2VjX3N1Yl8xIChnb3QsIGdvdCwgZGF0YVtpXS5zaXplLAorCQkJCSBDTlNUX0xJTUIoMSksIHNjcmF0Y2gpOworICAgICAgICAgIFZFUklGWSAoImNoZWNrX3NlY19zdWJfMSAoaW4tcGxhY2UsIGNvbnN0IDEpIik7CisgICAgICAgIH0KKworICAgICAgLyogU2FtZSBhZ2FpbiBvbiBmdW5jdGlvbnMsIG5vdCBpbmxpbmVzLiAqLworICAgICAgU0VUVVAgKCk7CisgICAgICBnb3RfYyA9ICgqZnVkZ2UobXBuX3N1Yl8xKSkgKGdvdCwgZGF0YVtpXS5zcmMsIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5uKTsKKyAgICAgIFZFUklGWSAoImNoZWNrX3N1Yl8xIChmdW5jdGlvbiwgc2VwYXJhdGUpIik7CisKKyAgICAgIFNFVFVQX0lOUExBQ0UgKCk7CisgICAgICBnb3RfYyA9ICgqZnVkZ2UobXBuX3N1Yl8xKSkgKGdvdCwgZ290LCBkYXRhW2ldLnNpemUsIGRhdGFbaV0ubik7CisgICAgICBWRVJJRlkgKCJjaGVja19zdWJfMSAoZnVuY3Rpb24sIGluLXBsYWNlKSIpOworICAgIH0KK30KKworLyogVHJ5IHRvIHByZXZlbnQgdGhlIG9wdGltaXplciBpbmxpbmluZy4gKi8KK21wbl9hb3JzXzFfdAorZnVkZ2UgKG1wbl9hb3JzXzFfdCBmKQoreworICByZXR1cm4gZjsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja19hZGRfMSAoKTsKKyAgY2hlY2tfc3ViXzEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWFzbXR5cGUuYyBiL3Rlc3RzL21wbi90LWFzbXR5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjU3N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtYXNtdHlwZS5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIFRlc3QgLnR5cGUgZGlyZWN0aXZlcyBvbiBhc3NlbWJsZXIgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBUaGlzIGFwcGFyZW50bHkgdHJpdmlhbCB0ZXN0IGlzIGRlc2lnbmVkIHRvIGRldGVjdCBtaXNzaW5nIC50eXBlIGFuZAorICAgLnNpemUgZGlyZWN0aXZlcyBpbiBhc20gY29kZSwgcGVyIHRoZSBwcm9ibGVtIGRlc2NyaWJlZCB1bmRlcgorICAgR01QX0FTTV9UWVBFIGluIGFjaW5jbHVkZS5tNC4KKworICAgQSBmYWlsdXJlIGNhbiBiZSBwcm92b2tlZCBpbiBhIHNoYXJlZCBvciBzaGFyZWQrc3RhdGljIGJ1aWxkIGJ5IG1ha2luZworICAgVFlQRSBhbmQgU0laRSBpbiBjb25maWcubTQgZW1wdHksIGVpdGhlciBieSBlZGl0aW5nIGl0IG9yIGJ5IGNvbmZpZ3VyaW5nCisgICB3aXRoCisKKyAgICAgICAuL2NvbmZpZ3VyZSBnbXBfY3ZfYXNtX3R5cGU9IGdtcF9jdl9hc21fc2l6ZT0KKworICAgbXBuX2FkZF9uIGlzIHVzZWQgZm9yIHRoZSB0ZXN0IGJlY2F1c2Ugbm9ybWFsbHkgaXQncyBpbXBsZW1lbnRlZCBpbgorICAgYXNzZW1ibGVyIG9uIGEgQ1BVIHRoYXQgaGFzIGFueSBhc20gY29kZS4KKworICAgRW5oYW5jZW1lbnQ6IEFzIG5vdGVkIHdpdGggR01QX0FTTV9UWVBFLCBpZiAudHlwZSBpcyB3cm9uZyBidXQgLnNpemUgaXMKKyAgIHJpZ2h0IHRoZW4gZXZlcnl0aGluZyB3b3JrcywgYnV0IHVzZXMgY29kZSBjb3BpZWQgZG93biB0byB0aGUgbWFpbmxpbmUKKyAgIGRhdGEgYXJlYS4gIE1heWJlIHdlIGNvdWxkIGRldGVjdCB0aGF0IGlmIHdlIGJ1aWx0IGEgdGVzdCBsaWJyYXJ5IHdpdGggYW4KKyAgIG9iamVjdCB0aGF0IGhhZCAuc2l6ZSBkZWxpYmVyYXRlbHkgZGlzYWJsZWQuICAqLworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBtcF9saW1iX3QgeFszXSAgICA9IHsgMSwgMiwgMyB9OworICBzdGF0aWMgY29uc3QgbXBfbGltYl90IHlbM10gICAgPSB7IDQsIDUsIDYgfTsKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCB3YW50WzNdID0geyA1LCA3LCA5IH07CisgIG1wX2xpbWJfdCAgZ290WzNdOworCisgIG1wbl9hZGRfbiAoZ290LCB4LCB5LCAobXBfc2l6ZV90KSAzKTsKKworICBpZiAocmVmbXBuX2NtcCAoZ290LCB3YW50LCAobXBfc2l6ZV90KSAzKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIldyb25nIHJlc3VsdCBmcm9tIG1wbl9hZGRfblxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1iZGl2LmMgYi90ZXN0cy9tcG4vdC1iZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmNThkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LWJkaXYuYwpAQCAtMCwwICsxLDM1NCBAQAorLyogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIHN0cnRvbCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKworCitzdGF0aWMgdm9pZAorZHVtcHkgKG1wX3NyY3B0ciBwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisgIGlmIChuID4gMjApCisgICAgeworICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gbiAtIDQ7IGktLSkKKwl7CisJICBwcmludGYgKCIlMCpseCIsIChpbnQpICgyICogc2l6ZW9mIChtcF9saW1iX3QpKSwgcFtpXSk7CisJICBwcmludGYgKCIgIik7CisJfQorICAgICAgcHJpbnRmICgiLi4uICIpOworICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pCisJeworCSAgcHJpbnRmICgiJTAqbHgiLCAoaW50KSAoMiAqIHNpemVvZiAobXBfbGltYl90KSksIHBbaV0pOworCSAgcHJpbnRmIChpID09IDAgPyAiIiA6ICIgIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBwcmludGYgKCIlMCpseCIsIChpbnQpICgyICogc2l6ZW9mIChtcF9saW1iX3QpKSwgcFtpXSk7CisJICBwcmludGYgKGkgPT0gMCA/ICIiIDogIiAiKTsKKwl9CisgICAgfQorICBwdXRzICgiIik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRlc3Q7CisKK3ZvaWQKK2NoZWNrX29uZSAobXBfcHRyIHFwLCBtcF9zcmNwdHIgcnAsIG1wX2xpbWJfdCByaCwKKwkgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICBtcF9zaXplX3QgcW47CisgIG1wX3B0ciB0cDsKKyAgbXBfbGltYl90IGN5ID0gNDcxMTsJCS8qIHNpbGVuY2Ugd2FybmluZ3MgKi8KKyAgVE1QX0RFQ0w7CisKKyAgcW4gPSBubiAtIGRuOworCisgIGlmIChxbiA9PSAwKQorICAgIHJldHVybjsKKworICBUTVBfTUFSSzsKKworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAobm4gKyAxKTsKKworICBpZiAoZG4gPj0gcW4pCisgICAgbXBuX211bCAodHAsIGRwLCBkbiwgcXAsIHFuKTsKKyAgZWxzZQorICAgIG1wbl9tdWwgKHRwLCBxcCwgcW4sIGRwLCBkbik7CisKKyAgY3kgPSBtcG5fYWRkX24gKHRwLCB0cCwgbnAsIG5uKTsKKworICBpZiAoISBtcG5femVyb19wICh0cCwgcW4pCisgICAgICB8fCAocnAgIT0gTlVMTCAmJiAoY3kgIT0gcmggfHwgbXBuX2NtcCAodHAgKyBxbiwgcnAsIGRuKSAhPSAwKSkpCisgICAgeworICAgICAgcHJpbnRmICgiXHIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKyAgICAgIHByaW50ZiAoIiVzIGluY29uc2lzdGVudCBpbiB0ZXN0ICVsdVxuIiwgZm5hbWUsIHRlc3QpOworICAgICAgcHJpbnRmICgiTj0gICAiKTsgZHVtcHkgKG5wLCBubik7CisgICAgICBwcmludGYgKCJEPSAgICIpOyBkdW1weSAoZHAsIGRuKTsKKyAgICAgIHByaW50ZiAoIlE9ICAgIik7IGR1bXB5IChxcCwgcW4pOworICAgICAgaWYgKHJwICE9IE5VTEwpCisJeworCSAgcHJpbnRmICgiUj0gICAiKTsgZHVtcHkgKHJwLCBkbik7CisJICBwcmludGYgKCJSYj0gICVkLCBDeT0lZFxuIiwgKGludCkgY3ksIChpbnQpIHJoKTsKKwl9CisgICAgICBwcmludGYgKCJUPSAgICIpOyBkdW1weSAodHAsIG5uKTsKKyAgICAgIHByaW50ZiAoIm5uID0gJWxkLCBkbiA9ICVsZCwgcW4gPSAlbGQiLCBubiwgZG4sIHFuKTsKKyAgICAgIHByaW50ZiAoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgVE1QX0ZSRUU7Cit9CisKKworLyogVGhlc2UgYXJlICpiaXQqIHNpemVzLiAqLworI2RlZmluZSBTSVpFX0xPRyAxNgorI2RlZmluZSBNQVhfRE4gKDFMIDw8IFNJWkVfTE9HKQorI2RlZmluZSBNQVhfTk4gKDFMIDw8IChTSVpFX0xPRyArIDEpKQorCisjZGVmaW5lIENPVU5UIDUwMAorCittcF9saW1iX3QKK3JhbmRvbV93b3JkIChnbXBfcmFuZHN0YXRlX3B0ciBycykKK3sKKyAgbXB6X3QgeDsKKyAgbXBfbGltYl90IHI7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBNUFpfVE1QX0lOSVQgKHgsIDIpOworICBtcHpfdXJhbmRvbWIgKHgsIHJzLCAzMik7CisgIHIgPSBtcHpfZ2V0X3VpICh4KTsKKyAgVE1QX0ZSRUU7CisgIHJldHVybiByOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIHVuc2lnbmVkIGxvbmcgbWF4bmJpdHMsIG1heGRiaXRzLCBuYml0cywgZGJpdHM7CisgIG1wel90IG4sIGQsIHR6OworICBtcF9zaXplX3QgbWF4bm4sIG1heGRuLCBubiwgZG4sIGNsZWFybiwgaTsKKyAgbXBfcHRyIG5wLCBkcCwgcXAsIHJwOworICBtcF9saW1iX3Qgcmg7CisgIG1wX2xpbWJfdCB0OworICBtcF9saW1iX3QgZGludjsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIG1wX3B0ciBzY3JhdGNoOworICBtcF9saW1iX3QgcmFuOworICBtcF9zaXplX3QgYWxsb2MsIGl0Y2g7CisgIG1wX2xpbWJfdCBycmFuMCwgcnJhbjEsIHFyYW4wLCBxcmFuMTsKKyAgVE1QX0RFQ0w7CisKKyAgVEVTVFNfUkVQUyAoY291bnQsIGFyZ3YsIGFyZ2MpOworCisgIG1heGRiaXRzID0gTUFYX0ROOworICBtYXhuYml0cyA9IE1BWF9OTjsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAobik7CisgIG1wel9pbml0IChkKTsKKyAgbXB6X2luaXQgKHR6KTsKKworICBtYXhubiA9IG1heG5iaXRzIC8gR01QX05VTUJfQklUUyArIDE7CisgIG1heGRuID0gbWF4ZGJpdHMgLyBHTVBfTlVNQl9CSVRTICsgMTsKKworICBUTVBfTUFSSzsKKworICBxcCA9IFRNUF9BTExPQ19MSU1CUyAobWF4bm4gKyAyKSArIDE7CisgIHJwID0gVE1QX0FMTE9DX0xJTUJTIChtYXhubiArIDIpICsgMTsKKworICBhbGxvYyA9IDE7CisgIHNjcmF0Y2ggPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChhbGxvYyk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IGNvdW50OykKKyAgICB7CisgICAgICBuYml0cyA9IHJhbmRvbV93b3JkIChyYW5kcykgJSAobWF4bmJpdHMgLSBHTVBfTlVNQl9CSVRTKSArIDIgKiBHTVBfTlVNQl9CSVRTOworICAgICAgaWYgKG1heGRiaXRzID4gbmJpdHMpCisJZGJpdHMgPSByYW5kb21fd29yZCAocmFuZHMpICUgbmJpdHMgKyAxOworICAgICAgZWxzZQorCWRiaXRzID0gcmFuZG9tX3dvcmQgKHJhbmRzKSAlIG1heGRiaXRzICsgMTsKKworI2lmIFJBTkRfVU5JRk9STQorI2RlZmluZSBSQU5ERlVOQyBtcHpfdXJhbmRvbWIKKyNlbHNlCisjZGVmaW5lIFJBTkRGVU5DIG1wel9ycmFuZG9tYgorI2VuZGlmCisKKyAgICAgIGRvCisJeworCSAgUkFOREZVTkMgKG4sIHJhbmRzLCBuYml0cyk7CisJICBkbworCSAgICB7CisJICAgICAgUkFOREZVTkMgKGQsIHJhbmRzLCBkYml0cyk7CisJICAgIH0KKwkgIHdoaWxlIChtcHpfc2duIChkKSA9PSAwKTsKKworCSAgbnAgPSBQVFIgKG4pOworCSAgZHAgPSBQVFIgKGQpOworCSAgbm4gPSBTSVogKG4pOworCSAgZG4gPSBTSVogKGQpOworCX0KKyAgICAgIHdoaWxlIChubiA8IGRuKTsKKworICAgICAgZHBbMF0gfD0gMTsKKworICAgICAgbXB6X3VyYW5kb21iICh0eiwgcmFuZHMsIDMyKTsKKyAgICAgIHQgPSBtcHpfZ2V0X3VpICh0eik7CisKKyAgICAgIGlmICh0ICUgMTcgPT0gMCkKKwlkcFswXSA9IEdNUF9OVU1CX01BWDsKKworICAgICAgc3dpdGNoICgoaW50KSB0ICUgMTYpCisJeworCWNhc2UgMDoKKwkgIGNsZWFybiA9IHJhbmRvbV93b3JkIChyYW5kcykgJSBubjsKKwkgIGZvciAoaSA9IDA7IGkgPD0gY2xlYXJuOyBpKyspCisJICAgIG5wW2ldID0gMDsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIG1wbl9zdWJfMSAobnAgKyBubiAtIGRuLCBkcCwgZG4sIHJhbmRvbV93b3JkIChyYW5kcykpOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgbXBuX2FkZF8xIChucCArIG5uIC0gZG4sIGRwLCBkbiwgcmFuZG9tX3dvcmQgKHJhbmRzKSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIHRlc3QrKzsKKworICAgICAgYmludmVydF9saW1iIChkaW52LCBkcFswXSk7CisKKyAgICAgIHJyYW4wID0gcmFuZG9tX3dvcmQgKHJhbmRzKTsKKyAgICAgIHJyYW4xID0gcmFuZG9tX3dvcmQgKHJhbmRzKTsKKyAgICAgIHFyYW4wID0gcmFuZG9tX3dvcmQgKHJhbmRzKTsKKyAgICAgIHFyYW4xID0gcmFuZG9tX3dvcmQgKHJhbmRzKTsKKworICAgICAgcXBbLTFdID0gcXJhbjA7CisgICAgICBxcFtubiAtIGRuICsgMV0gPSBxcmFuMTsKKyAgICAgIHJwWy0xXSA9IHJyYW4wOworCisgICAgICByYW4gPSByYW5kb21fd29yZCAocmFuZHMpOworCisgICAgICBpZiAoKGRvdWJsZSkgKG5uIC0gZG4pICogZG4gPCAxZTUpCisJeworCSAgaWYgKG5uID4gZG4pCisJICAgIHsKKwkgICAgICAvKiBUZXN0IG1wbl9zYnBpMV9iZGl2X3FyICovCisJICAgICAgTVBOX1pFUk8gKHFwLCBubiAtIGRuKTsKKwkgICAgICBNUE5fWkVSTyAocnAsIGRuKTsKKwkgICAgICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICAgICAgcmggPSBtcG5fc2JwaTFfYmRpdl9xciAocXAsIHJwLCBubiwgZHAsIGRuLCAtZGludik7CisJICAgICAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICAgICAgQVNTRVJUX0FMV0FZUyAocnBbLTFdID09IHJyYW4wKTsKKwkgICAgICBjaGVja19vbmUgKHFwLCBycCArIG5uIC0gZG4sIHJoLCBucCwgbm4sIGRwLCBkbiwgIm1wbl9zYnBpMV9iZGl2X3FyIik7CisKKwkgICAgICAvKiBUZXN0IG1wbl9zYnBpMV9iZGl2X3EgKi8KKwkgICAgICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICAgICAgTVBOX1pFUk8gKHFwLCBubiAtIGRuKTsKKwkgICAgICBtcG5fc2JwaTFfYmRpdl9xIChxcCwgcnAsIG5uIC0gZG4sIGRwLCBNSU4oZG4sbm4tZG4pLCAtZGludik7CisJICAgICAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICAgICAgQVNTRVJUX0FMV0FZUyAocnBbLTFdID09IHJyYW4wKTsKKwkgICAgICBjaGVja19vbmUgKHFwLCBOVUxMLCAwLCBucCwgbm4sIGRwLCBkbiwgIm1wbl9zYnBpMV9iZGl2X3EiKTsKKworCSAgICAgIC8qIFRlc3QgbXBuX3NicGkxX2JkaXZfcjsgd2UgdXNlIG1wbl9zYnBpMV9iZGl2X3EncyBxdW90aWVudC4gKi8KKwkgICAgICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICAgICAgbXBuX3NicGkxX2JkaXZfciAocnAsIG5uLCBkcCwgZG4sIC1kaW52KTsKKwkgICAgICBBU1NFUlRfQUxXQVlTIChycFstMV0gPT0gcnJhbjApOworCSAgICAgIGNoZWNrX29uZSAocXAsIE5VTEwsIDAsIG5wLCBubiwgZHAsIGRuLCAibXBuX3NicGkxX2JkaXZfciIpOworCSAgICB9CisJfQorCisgICAgICBpZiAoZG4gPj0gNCAmJiBubiAtIGRuID49IDIpCisJeworCSAgLyogVGVzdCBtcG5fZGNwaTFfYmRpdl9xciAqLworCSAgTVBOX0NPUFkgKHJwLCBucCwgbm4pOworCSAgTVBOX1pFUk8gKHFwLCBubiAtIGRuKTsKKwkgIHJoID0gbXBuX2RjcGkxX2JkaXZfcXIgKHFwLCBycCwgbm4sIGRwLCBkbiwgLWRpbnYpOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBBU1NFUlRfQUxXQVlTIChycFstMV0gPT0gcnJhbjApOworCSAgY2hlY2tfb25lIChxcCwgcnAgKyBubiAtIGRuLCByaCwgbnAsIG5uLCBkcCwgZG4sICJtcG5fZGNwaTFfYmRpdl9xciIpOworCX0KKworICAgICAgaWYgKGRuID49IDQgJiYgbm4gLSBkbiA+PSAyKQorCXsKKwkgIC8qIFRlc3QgbXBuX2RjcGkxX2JkaXZfcSAqLworCSAgTVBOX0NPUFkgKHJwLCBucCwgbm4pOworCSAgTVBOX1pFUk8gKHFwLCBubiAtIGRuKTsKKwkgIG1wbl9kY3BpMV9iZGl2X3EgKHFwLCBycCwgbm4gLSBkbiwgZHAsIE1JTihkbixubi1kbiksIC1kaW52KTsKKwkgIEFTU0VSVF9BTFdBWVMgKHFwWy0xXSA9PSBxcmFuMCk7ICBBU1NFUlRfQUxXQVlTIChxcFtubiAtIGRuICsgMV0gPT0gcXJhbjEpOworCSAgQVNTRVJUX0FMV0FZUyAocnBbLTFdID09IHJyYW4wKTsKKwkgIGNoZWNrX29uZSAocXAsIE5VTEwsIDAsIG5wLCBubiwgZHAsIGRuLCAibXBuX2RjcGkxX2JkaXZfcSIpOworCX0KKworICAgICAgaWYgKG5uID4gZG4pCisJeworCSAgLyogVGVzdCBtcG5fYmRpdl9xciAqLworCSAgaXRjaCA9IG1wbl9iZGl2X3FyX2l0Y2ggKG5uLCBkbik7CisJICBpZiAoaXRjaCArIDEgPiBhbGxvYykKKwkgICAgeworCSAgICAgIHNjcmF0Y2ggPSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTElNQlMgKHNjcmF0Y2gsIGFsbG9jLCBpdGNoICsgMSk7CisJICAgICAgYWxsb2MgPSBpdGNoICsgMTsKKwkgICAgfQorCSAgc2NyYXRjaFtpdGNoXSA9IHJhbjsKKwkgIE1QTl9aRVJPIChxcCwgbm4gLSBkbik7CisJICBNUE5fWkVSTyAocnAsIGRuKTsKKwkgIHJwW2RuXSA9IHJyYW4xOworCSAgcmggPSBtcG5fYmRpdl9xciAocXAsIHJwLCBucCwgbm4sIGRwLCBkbiwgc2NyYXRjaCk7CisJICBBU1NFUlRfQUxXQVlTIChyYW4gPT0gc2NyYXRjaFtpdGNoXSk7CisJICBBU1NFUlRfQUxXQVlTIChxcFstMV0gPT0gcXJhbjApOyAgQVNTRVJUX0FMV0FZUyAocXBbbm4gLSBkbiArIDFdID09IHFyYW4xKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHJwWy0xXSA9PSBycmFuMCk7ICBBU1NFUlRfQUxXQVlTIChycFtkbl0gPT0gcnJhbjEpOworCisJICBjaGVja19vbmUgKHFwLCBycCwgcmgsIG5wLCBubiwgZHAsIGRuLCAibXBuX2JkaXZfcXIiKTsKKwl9CisKKyAgICAgIGlmIChubiAtIGRuIDwgMiB8fCBkbiA8IDIpCisJY29udGludWU7CisKKyAgICAgIC8qIFRlc3QgbXBuX211X2JkaXZfcXIgKi8KKyAgICAgIGl0Y2ggPSBtcG5fbXVfYmRpdl9xcl9pdGNoIChubiwgZG4pOworICAgICAgaWYgKGl0Y2ggKyAxID4gYWxsb2MpCisJeworCSAgc2NyYXRjaCA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2NyYXRjaCwgYWxsb2MsIGl0Y2ggKyAxKTsKKwkgIGFsbG9jID0gaXRjaCArIDE7CisJfQorICAgICAgc2NyYXRjaFtpdGNoXSA9IHJhbjsKKyAgICAgIE1QTl9aRVJPIChxcCwgbm4gLSBkbik7CisgICAgICBNUE5fWkVSTyAocnAsIGRuKTsKKyAgICAgIHJwW2RuXSA9IHJyYW4xOworICAgICAgcmggPSBtcG5fbXVfYmRpdl9xciAocXAsIHJwLCBucCwgbm4sIGRwLCBkbiwgc2NyYXRjaCk7CisgICAgICBBU1NFUlRfQUxXQVlTIChyYW4gPT0gc2NyYXRjaFtpdGNoXSk7CisgICAgICBBU1NFUlRfQUxXQVlTIChxcFstMV0gPT0gcXJhbjApOyAgQVNTRVJUX0FMV0FZUyAocXBbbm4gLSBkbiArIDFdID09IHFyYW4xKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHJwWy0xXSA9PSBycmFuMCk7ICBBU1NFUlRfQUxXQVlTIChycFtkbl0gPT0gcnJhbjEpOworICAgICAgY2hlY2tfb25lIChxcCwgcnAsIHJoLCBucCwgbm4sIGRwLCBkbiwgIm1wbl9tdV9iZGl2X3FyIik7CisKKyAgICAgIC8qIFRlc3QgbXBuX211X2JkaXZfcSAqLworICAgICAgaXRjaCA9IG1wbl9tdV9iZGl2X3FfaXRjaCAobm4sIGRuKTsKKyAgICAgIGlmIChpdGNoICsgMSA+IGFsbG9jKQorCXsKKwkgIHNjcmF0Y2ggPSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTElNQlMgKHNjcmF0Y2gsIGFsbG9jLCBpdGNoICsgMSk7CisJICBhbGxvYyA9IGl0Y2ggKyAxOworCX0KKyAgICAgIHNjcmF0Y2hbaXRjaF0gPSByYW47CisgICAgICBNUE5fWkVSTyAocXAsIG5uIC0gZG4gKyAxKTsKKyAgICAgIG1wbl9tdV9iZGl2X3EgKHFwLCBucCwgbm4gLSBkbiwgZHAsIGRuLCBzY3JhdGNoKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHJhbiA9PSBzY3JhdGNoW2l0Y2hdKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHFwWy0xXSA9PSBxcmFuMCk7ICBBU1NFUlRfQUxXQVlTIChxcFtubiAtIGRuICsgMV0gPT0gcXJhbjEpOworICAgICAgY2hlY2tfb25lIChxcCwgTlVMTCwgMCwgbnAsIG5uLCBkcCwgZG4sICJtcG5fbXVfYmRpdl9xIik7CisgICAgfQorCisgIF9fR01QX0ZSRUVfRlVOQ19MSU1CUyAoc2NyYXRjaCwgYWxsb2MpOworCisgIFRNUF9GUkVFOworCisgIG1wel9jbGVhciAobik7CisgIG1wel9jbGVhciAoZCk7CisgIG1wel9jbGVhciAodHopOworCisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1icm9vdC5jIGIvdGVzdHMvbXBuL3QtYnJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDhlODBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtYnJvb3QuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogQ29weXJpZ2h0IDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIHN0cnRvbCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKworI2RlZmluZSBNQVhfTElNQlMgMTUwCisjZGVmaW5lIENPVU5UIDUwMAorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisKKyAgbXBfcHRyIGFwLCBycCwgcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICB1bnNpZ25lZCBpOworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9MSU1CUyk7CisgIHJwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTElNQlMpOworICBwcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX0xJTUJTKTsKKyAgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAoMypNQVhfTElNQlMpOyAvKiBGb3IgbXBuX3Bvd2xvICovCisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgbXBfc2l6ZV90IG47CisgICAgICBtcF9saW1iX3QgazsKKyAgICAgIGludCBjOworCisgICAgICBuID0gMSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIE1BWF9MSU1CUyk7CisKKyAgICAgIGlmIChpICYgMSkKKwltcG5fcmFuZG9tMiAoYXAsIG4pOworICAgICAgZWxzZQorCW1wbl9yYW5kb20gKGFwLCBuKTsKKworICAgICAgYXBbMF0gfD0gMTsKKworICAgICAgaWYgKGkgPCAxMDApCisJayA9IDMgKyAyKmk7CisgICAgICBlbHNlCisJeworCSAgbXBuX3JhbmRvbSAoJmssIDEpOworCSAgaWYgKGsgPCAzKQorCSAgICBrID0gMzsKKwkgIGVsc2UKKwkgICAgayB8PSAxOworCX0KKyAgICAgIG1wbl9icm9vdCAocnAsIGFwLCBuLCBrKTsKKyAgICAgIG1wbl9wb3dsbyAocHAsIHJwLCAmaywgMSwgbiwgc2NyYXRjaCk7CisKKyAgICAgIE1QTl9DTVAgKGMsIGFwLCBwcCwgbik7CisgICAgICBpZiAoYyAhPSAwKQorCXsKKwkgIGdtcF9mcHJpbnRmIChzdGRlcnIsCisJCSAgICAgICAibXBuX2Jyb290IHJldHVybmVkIGJhZCByZXN1bHQ6ICV1IGxpbWJzXG4iLAorCQkgICAgICAgKHVuc2lnbmVkKSBuKTsKKwkgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJrICAgPSAlTXhcbiIsIGspOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgImEgICA9ICVOeFxuIiwgYXAsIG4pOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgInIgICA9ICVOeFxuIiwgcnAsIG4pOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgInJeayA9ICVOeFxuIiwgcHAsIG4pOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBtcG5fYnJvb3QgKHJwLCBhcCwgTUFYX0xJTUJTLCAxKTsKKyAgaWYgKG1wbl9jbXAgKGFwLCBycCwgTUFYX0xJTUJTKSAhPSAwKQorICAgIHsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsCisJCSAgICJtcG5fYnJvb3QgcmV0dXJuZWQgYmFkIHJlc3VsdDogJXUgbGltYnNcbiIsCisJCSAgICh1bnNpZ25lZCkgTUFYX0xJTUJTKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJrICAgPSAlTXhcbiIsIDEpOworICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgImEgICA9ICVOeFxuIiwgYXAsIE1BWF9MSU1CUyk7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiciAgID0gJU54XG4iLCBycCwgTUFYX0xJTUJTKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBUTVBfRlJFRTsKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWJyb290aW52LmMgYi90ZXN0cy9tcG4vdC1icm9vdGludi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTk5NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1icm9vdGludi5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIENvcHlyaWdodCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIGZvciBzdHJ0b2wgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgkJLyogZm9yIHByaW50ZiAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgInRlc3RzL3Rlc3RzLmgiCisKKyNkZWZpbmUgTUFYX0xJTUJTIDE1MAorI2RlZmluZSBDT1VOVCA1MDAKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIG1wX3B0ciBhcCwgcnAsIHBwLCBhcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICB1bnNpZ25lZCBpOworICBUTVBfREVDTDsKKworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9MSU1CUyk7CisgIHJwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTElNQlMpOworICBwcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX0xJTUJTKTsKKyAgYXBwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTElNQlMpOworICBzY3JhdGNoID0gVE1QX0FMTE9DX0xJTUJTICg1Kk1BWF9MSU1CUyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgbXBfc2l6ZV90IG47CisgICAgICBtcF9saW1iX3QgazsKKworICAgICAgbiA9IDEgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBNQVhfTElNQlMpOworCisgICAgICBpZiAoaSAmIDEpCisJbXBuX3JhbmRvbTIgKGFwLCBuKTsKKyAgICAgIGVsc2UKKwltcG5fcmFuZG9tIChhcCwgbik7CisKKyAgICAgIGFwWzBdIHw9IDE7CisKKyAgICAgIGlmIChpIDwgMTAwKQorCWsgPSAzICsgMippOworICAgICAgZWxzZQorCXsKKwkgIG1wbl9yYW5kb20gKCZrLCAxKTsKKwkgIGlmIChrIDwgMykKKwkgICAgayA9IDM7CisJICBlbHNlCisJICAgIGsgfD0gMTsKKwl9CisgICAgICBtcG5fYnJvb3RpbnYgKHJwLCBhcCwgbiwgaywgc2NyYXRjaCk7CisgICAgICBtcG5fcG93bG8gKHBwLCBycCwgJmssIDEsIG4sIHNjcmF0Y2gpOworICAgICAgbXBuX211bGxvX24gKGFwcCwgYXAsIHBwLCBuKTsKKworICAgICAgaWYgKGFwcFswXSAhPSAxIHx8ICEobiA9PSAxIHx8IG1wbl96ZXJvX3AgKGFwcCsxLCBuLTEpKSkKKwl7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAgIm1wbl9icm9vdGludiByZXR1cm5lZCBiYWQgcmVzdWx0OiAldSBsaW1ic1xuIiwKKwkJICAgICAgICh1bnNpZ25lZCkgbik7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiayAgICAgPSAlTXhcbiIsIGspOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgImEgICAgID0gJU54XG4iLCBhcCwgbik7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiciAgICAgPSAlTnhcbiIsIHJwLCBuKTsKKwkgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJyXm4gICA9ICVOeFxuIiwgcHAsIG4pOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgImEgcl5uID0gJU54XG4iLCBhcHAsIG4pOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgVE1QX0ZSRUU7CisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1kaXYuYyBiL3Rlc3RzL21wbi90LWRpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDM4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1kaXYuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyogQ29weXJpZ2h0IDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTMtMjAxNSwgMjAxOCBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIHN0cnRvbCAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMvdGVzdHMuaCIKKworCitzdGF0aWMgdm9pZAorZHVtcHkgKG1wX3NyY3B0ciBwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfc2l6ZV90IGk7CisgIGlmIChuID4gMjApCisgICAgeworICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gbiAtIDQ7IGktLSkKKwl7CisJICBwcmludGYgKCIlMCpseCIsIChpbnQpICgyICogc2l6ZW9mIChtcF9saW1iX3QpKSwgcFtpXSk7CisJICBwcmludGYgKCIgIik7CisJfQorICAgICAgcHJpbnRmICgiLi4uICIpOworICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pCisJeworCSAgcHJpbnRmICgiJTAqbHgiLCAoaW50KSAoMiAqIHNpemVvZiAobXBfbGltYl90KSksIHBbaV0pOworCSAgcHJpbnRmIChpID09IDAgPyAiIiA6ICIgIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkKKwl7CisJICBwcmludGYgKCIlMCpseCIsIChpbnQpICgyICogc2l6ZW9mIChtcF9saW1iX3QpKSwgcFtpXSk7CisJICBwcmludGYgKGkgPT0gMCA/ICIiIDogIiAiKTsKKwl9CisgICAgfQorICBwdXRzICgiIik7Cit9CisKK3N0YXRpYyBzaWduZWQgbG9uZyB0ZXN0OworCitzdGF0aWMgdm9pZAorY2hlY2tfb25lIChtcF9wdHIgcXAsIG1wX3NyY3B0ciBycCwKKwkgICBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBubiwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgZG4sCisJICAgY29uc3QgY2hhciAqZm5hbWUsIG1wX2xpbWJfdCBxX2FsbG93ZWRfZXJyKQoreworICBtcF9zaXplX3QgcW4gPSBubiAtIGRuICsgMTsKKyAgbXBfcHRyIHRwOworICBjb25zdCBjaGFyICptc2c7CisgIGNvbnN0IGNoYXIgKnR2YWx1ZTsKKyAgbXBfbGltYl90IGk7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAobm4gKyAxKTsKKyAgaWYgKGRuID49IHFuKQorICAgIHJlZm1wbl9tdWwgKHRwLCBkcCwgZG4sIHFwLCBxbik7CisgIGVsc2UKKyAgICByZWZtcG5fbXVsICh0cCwgcXAsIHFuLCBkcCwgZG4pOworCisgIGZvciAoaSA9IDA7IGkgPCBxX2FsbG93ZWRfZXJyICYmICh0cFtubl0gPiAwIHx8IG1wbl9jbXAgKHRwLCBucCwgbm4pID4gMCk7IGkrKykKKyAgICBBU1NFUlRfTk9DQVJSWSAocmVmbXBuX3N1YiAodHAsIHRwLCBubisxLCBkcCwgZG4pKTsKKworICBpZiAodHBbbm5dID4gMCB8fCBtcG5fY21wICh0cCwgbnAsIG5uKSA+IDApCisgICAgeworICAgICAgbXNnID0gInEgdG9vIGxhcmdlIjsKKyAgICAgIHR2YWx1ZSA9ICJRKkQiOworICAgIGVycm9yOgorICAgICAgcHJpbnRmICgiXHIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKyAgICAgIHByaW50ZiAoIiVzIGZhaWxlZCB0ZXN0ICVsZDogJXNcbiIsIGZuYW1lLCB0ZXN0LCBtc2cpOworICAgICAgcHJpbnRmICgiTj0gICAgIik7IGR1bXB5IChucCwgbm4pOworICAgICAgcHJpbnRmICgiRD0gICAgIik7IGR1bXB5IChkcCwgZG4pOworICAgICAgcHJpbnRmICgiUT0gICAgIik7IGR1bXB5IChxcCwgcW4pOworICAgICAgaWYgKHJwKQorCXsgcHJpbnRmICgiUj0gICAgIik7IGR1bXB5IChycCwgZG4pOyB9CisgICAgICBwcmludGYgKCIlNXM9IiwgdHZhbHVlKTsgZHVtcHkgKHRwLCBubisxKTsKKyAgICAgIHByaW50ZiAoIm5uID0gJWxkLCBkbiA9ICVsZCwgcW4gPSAlbGRcbiIsIG5uLCBkbiwgcW4pOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIEFTU0VSVF9OT0NBUlJZIChyZWZtcG5fc3ViX24gKHRwLCBucCwgdHAsIG5uKSk7CisgIHR2YWx1ZSA9ICJOLVEqRCI7CisgIGlmICghKG5uID09IGRuIHx8IG1wbl96ZXJvX3AgKHRwICsgZG4sIG5uIC0gZG4pKSB8fCBtcG5fY21wICh0cCwgZHAsIGRuKSA+PSAwKQorICAgIHsKKyAgICAgIG1zZyA9ICJxIHRvbyBzbWFsbCI7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICBpZiAocnAgJiYgbXBuX2NtcCAocnAsIHRwLCBkbikgIT0gMCkKKyAgICB7CisgICAgICBtc2cgPSAiciBpbmNvcnJlY3QiOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgVE1QX0ZSRUU7Cit9CisKKworLyogVGhlc2UgYXJlICpiaXQqIHNpemVzLiAqLworI2lmbmRlZiBTSVpFX0xPRworI2RlZmluZSBTSVpFX0xPRyAxNworI2VuZGlmCisjZGVmaW5lIE1BWF9ETiAoMUwgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1BWF9OTiAoMUwgPDwgKFNJWkVfTE9HICsgMSkpCisKKyNkZWZpbmUgQ09VTlQgMjAwCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgdW5zaWduZWQgbG9uZyBtYXhuYml0cywgbWF4ZGJpdHMsIG5iaXRzLCBkYml0czsKKyAgbXB6X3QgbiwgZCwgcSwgciwgdHosIGp1bms7CisgIG1wX3NpemVfdCBtYXhubiwgbWF4ZG4sIG5uLCBkbiwgY2xlYXJuLCBpOworICBtcF9wdHIgbnAsIGR1cCwgZG5wLCBxcCwgcnAsIGp1bmtwOworICBtcF9saW1iX3QgdDsKKyAgZ21wX3BpMV90IGRpbnY7CisgIGxvbmcgY291bnQgPSBDT1VOVDsKKyAgbXBfcHRyIHNjcmF0Y2g7CisgIG1wX2xpbWJfdCByYW47CisgIG1wX3NpemVfdCBhbGxvYywgaXRjaDsKKyAgbXBfbGltYl90IHJyYW4wLCBycmFuMSwgcXJhbjAsIHFyYW4xOworICBUTVBfREVDTDsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgbWF4ZGJpdHMgPSBNQVhfRE47CisgIG1heG5iaXRzID0gTUFYX05OOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChuKTsKKyAgbXB6X2luaXQgKGQpOworICBtcHpfaW5pdCAocSk7CisgIG1wel9pbml0IChyKTsKKyAgbXB6X2luaXQgKHR6KTsKKyAgbXB6X2luaXQgKGp1bmspOworCisgIG1heG5uID0gbWF4bmJpdHMgLyBHTVBfTlVNQl9CSVRTICsgMTsKKyAgbWF4ZG4gPSBtYXhkYml0cyAvIEdNUF9OVU1CX0JJVFMgKyAxOworCisgIFRNUF9NQVJLOworCisgIHFwID0gVE1QX0FMTE9DX0xJTUJTIChtYXhubiArIDIpICsgMTsKKyAgcnAgPSBUTVBfQUxMT0NfTElNQlMgKG1heG5uICsgMikgKyAxOworICBkbnAgPSBUTVBfQUxMT0NfTElNQlMgKG1heGRuKTsKKworICBhbGxvYyA9IDE7CisgIHNjcmF0Y2ggPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTIChhbGxvYyk7CisKKyAgZm9yICh0ZXN0ID0gLTMwMDsgdGVzdCA8IGNvdW50OyB0ZXN0KyspCisgICAgeworICAgICAgbmJpdHMgPSB1cmFuZG9tICgpICUgKG1heG5iaXRzIC0gR01QX05VTUJfQklUUykgKyAyICogR01QX05VTUJfQklUUzsKKworICAgICAgaWYgKHRlc3QgPCAwKQorCWRiaXRzID0gKHRlc3QgKyAzMDApICUgKG5iaXRzIC0gMSkgKyAxOworICAgICAgZWxzZQorCWRiaXRzID0gdXJhbmRvbSAoKSAlIChuYml0cyAtIDEpICUgbWF4ZGJpdHMgKyAxOworCisjaWYgUkFORF9VTklGT1JNCisjZGVmaW5lIFJBTkRGVU5DIG1wel91cmFuZG9tYgorI2Vsc2UKKyNkZWZpbmUgUkFOREZVTkMgbXB6X3JyYW5kb21iCisjZW5kaWYKKworICAgICAgZG8KKwlSQU5ERlVOQyAoZCwgcmFuZHMsIGRiaXRzKTsKKyAgICAgIHdoaWxlIChtcHpfc2duIChkKSA9PSAwKTsKKyAgICAgIGRuID0gU0laIChkKTsKKyAgICAgIGR1cCA9IFBUUiAoZCk7CisgICAgICBNUE5fQ09QWSAoZG5wLCBkdXAsIGRuKTsKKyAgICAgIGRucFtkbiAtIDFdIHw9IEdNUF9OVU1CX0hJR0hCSVQ7CisKKyAgICAgIGlmICh0ZXN0ICUgMiA9PSAwKQorCXsKKwkgIFJBTkRGVU5DIChuLCByYW5kcywgbmJpdHMpOworCSAgbm4gPSBTSVogKG4pOworCSAgQVNTRVJUX0FMV0FZUyAobm4gPj0gZG4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkbworCSAgICB7CisJICAgICAgUkFOREZVTkMgKHEsIHJhbmRzLCB1cmFuZG9tICgpICUgKG5iaXRzIC0gZGJpdHMgKyAxKSk7CisJICAgICAgUkFOREZVTkMgKHIsIHJhbmRzLCB1cmFuZG9tICgpICUgbXB6X3NpemVpbmJhc2UgKGQsIDIpKTsKKwkgICAgICBtcHpfbXVsIChuLCBxLCBkKTsKKwkgICAgICBtcHpfYWRkIChuLCBuLCByKTsKKwkgICAgICBubiA9IFNJWiAobik7CisJICAgIH0KKwkgIHdoaWxlIChubiA+IG1heG5uIHx8IG5uIDwgZG4pOworCX0KKworICAgICAgQVNTRVJUX0FMV0FZUyAobm4gPD0gbWF4bm4pOworICAgICAgQVNTRVJUX0FMV0FZUyAoZG4gPD0gbWF4ZG4pOworCisgICAgICBtcHpfdXJhbmRvbWIgKGp1bmssIHJhbmRzLCBuYml0cyk7CisgICAgICBqdW5rcCA9IFBUUiAoanVuayk7CisKKyAgICAgIG5wID0gUFRSIChuKTsKKworICAgICAgbXB6X3VyYW5kb21iICh0eiwgcmFuZHMsIDMyKTsKKyAgICAgIHQgPSBtcHpfZ2V0X3VpICh0eik7CisKKyAgICAgIGlmICh0ICUgMTcgPT0gMCkKKwl7CisJICBkbnBbZG4gLSAxXSA9IEdNUF9OVU1CX01BWDsKKwkgIGR1cFtkbiAtIDFdID0gR01QX05VTUJfTUFYOworCX0KKworICAgICAgc3dpdGNoICgoaW50KSB0ICUgMTYpCisJeworCWNhc2UgMDoKKwkgIGNsZWFybiA9IHVyYW5kb20gKCkgJSBubjsKKwkgIGZvciAoaSA9IGNsZWFybjsgaSA8IG5uOyBpKyspCisJICAgIG5wW2ldID0gMDsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIG1wbl9zdWJfMSAobnAgKyBubiAtIGRuLCBkbnAsIGRuLCB1cmFuZG9tICgpKTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIG1wbl9hZGRfMSAobnAgKyBubiAtIGRuLCBkbnAsIGRuLCB1cmFuZG9tICgpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKGRuID49IDIpCisJaW52ZXJ0X3BpMSAoZGludiwgZG5wW2RuIC0gMV0sIGRucFtkbiAtIDJdKTsKKworICAgICAgcnJhbjAgPSB1cmFuZG9tICgpOworICAgICAgcnJhbjEgPSB1cmFuZG9tICgpOworICAgICAgcXJhbjAgPSB1cmFuZG9tICgpOworICAgICAgcXJhbjEgPSB1cmFuZG9tICgpOworCisgICAgICBxcFstMV0gPSBxcmFuMDsKKyAgICAgIHFwW25uIC0gZG4gKyAxXSA9IHFyYW4xOworICAgICAgcnBbLTFdID0gcnJhbjA7CisKKyAgICAgIHJhbiA9IHVyYW5kb20gKCk7CisKKyAgICAgIGlmICgoZG91YmxlKSAobm4gLSBkbikgKiBkbiA8IDFlNSkKKwl7CisJICAvKiBUZXN0IG1wbl9zYnBpMV9kaXZfcXIgKi8KKwkgIGlmIChkbiA+IDIpCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICAgICAgaWYgKG5uID4gZG4pCisJCU1QTl9DT1BZIChxcCwganVua3AsIG5uIC0gZG4pOworCSAgICAgIHFwW25uIC0gZG5dID0gbXBuX3NicGkxX2Rpdl9xciAocXAsIHJwLCBubiwgZG5wLCBkbiwgZGludi5pbnYzMik7CisJICAgICAgY2hlY2tfb25lIChxcCwgcnAsIG5wLCBubiwgZG5wLCBkbiwgIm1wbl9zYnBpMV9kaXZfcXIiLCAwKTsKKwkgICAgfQorCisJICAvKiBUZXN0IG1wbl9zYnBpMV9kaXZhcHByX3EgKi8KKwkgIGlmIChkbiA+IDIpCisJICAgIHsKKwkgICAgICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICAgICAgaWYgKG5uID4gZG4pCisJCU1QTl9DT1BZIChxcCwganVua3AsIG5uIC0gZG4pOworCSAgICAgIHFwW25uIC0gZG5dID0gbXBuX3NicGkxX2RpdmFwcHJfcSAocXAsIHJwLCBubiwgZG5wLCBkbiwgZGludi5pbnYzMik7CisJICAgICAgY2hlY2tfb25lIChxcCwgTlVMTCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX3NicGkxX2RpdmFwcHJfcSIsIDEpOworCSAgICB9CisKKwkgIC8qIFRlc3QgbXBuX3NicGkxX2Rpdl9xICovCisJICBpZiAoZG4gPiAyKQorCSAgICB7CisJICAgICAgTVBOX0NPUFkgKHJwLCBucCwgbm4pOworCSAgICAgIGlmIChubiA+IGRuKQorCQlNUE5fQ09QWSAocXAsIGp1bmtwLCBubiAtIGRuKTsKKwkgICAgICBxcFtubiAtIGRuXSA9IG1wbl9zYnBpMV9kaXZfcSAocXAsIHJwLCBubiwgZG5wLCBkbiwgZGludi5pbnYzMik7CisJICAgICAgY2hlY2tfb25lIChxcCwgTlVMTCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX3NicGkxX2Rpdl9xIiwgMCk7CisJICAgIH0KKworCSAgLyogVGVzdCBtcG5fc2VjX2Rpdl9xciAqLworCSAgaXRjaCA9IG1wbl9zZWNfZGl2X3FyX2l0Y2ggKG5uLCBkbik7CisJICBpZiAoaXRjaCArIDEgPiBhbGxvYykKKwkgICAgeworCSAgICAgIHNjcmF0Y2ggPSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTElNQlMgKHNjcmF0Y2gsIGFsbG9jLCBpdGNoICsgMSk7CisJICAgICAgYWxsb2MgPSBpdGNoICsgMTsKKwkgICAgfQorCSAgc2NyYXRjaFtpdGNoXSA9IHJhbjsKKwkgIE1QTl9DT1BZIChycCwgbnAsIG5uKTsKKwkgIGlmIChubiA+PSBkbikKKwkgICAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbiArIDEpOworCSAgcXBbbm4gLSBkbl0gPSBtcG5fc2VjX2Rpdl9xciAocXAsIHJwLCBubiwgZHVwLCBkbiwgc2NyYXRjaCk7CisJICBBU1NFUlRfQUxXQVlTIChyYW4gPT0gc2NyYXRjaFtpdGNoXSk7CisJICBjaGVja19vbmUgKHFwLCBycCwgbnAsIG5uLCBkdXAsIGRuLCAibXBuX3NlY19kaXZfcXIgKHVubm9ybSkiLCAwKTsKKworCSAgLyogVGVzdCBtcG5fc2VjX2Rpdl9yICovCisJICBpdGNoID0gbXBuX3NlY19kaXZfcl9pdGNoIChubiwgZG4pOworCSAgaWYgKGl0Y2ggKyAxID4gYWxsb2MpCisJICAgIHsKKwkgICAgICBzY3JhdGNoID0gX19HTVBfUkVBTExPQ0FURV9GVU5DX0xJTUJTIChzY3JhdGNoLCBhbGxvYywgaXRjaCArIDEpOworCSAgICAgIGFsbG9jID0gaXRjaCArIDE7CisJICAgIH0KKwkgIHNjcmF0Y2hbaXRjaF0gPSByYW47CisJICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICBtcG5fc2VjX2Rpdl9yIChycCwgbm4sIGR1cCwgZG4sIHNjcmF0Y2gpOworCSAgQVNTRVJUX0FMV0FZUyAocmFuID09IHNjcmF0Y2hbaXRjaF0pOworCSAgLyogTm90ZTogU2luY2UgY2hlY2tfb25lIGNhbm5vdCBjb3BlIHdpdGggcmVtYWluZGVyLW9ubHkgZnVuY3Rpb25zLCB3ZQorCSAgICAgcGFzcyBxcFtdIGZyb20gdGhlIHByZXZpb3VzIGZ1bmN0aW9uLCBtcG5fc2VjX2Rpdl9xci4gICovCisJICBjaGVja19vbmUgKHFwLCBycCwgbnAsIG5uLCBkdXAsIGRuLCAibXBuX3NlY19kaXZfciAodW5ub3JtKSIsIDApOworCisJICAvKiBOb3JtYWxpc2VkIGNhc2UsIG1wbl9zZWNfZGl2X3FyICovCisJICBpdGNoID0gbXBuX3NlY19kaXZfcXJfaXRjaCAobm4sIGRuKTsKKwkgIHNjcmF0Y2hbaXRjaF0gPSByYW47CisKKwkgIE1QTl9DT1BZIChycCwgbnAsIG5uKTsKKwkgIGlmIChubiA+PSBkbikKKwkgICAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbiArIDEpOworCSAgcXBbbm4gLSBkbl0gPSBtcG5fc2VjX2Rpdl9xciAocXAsIHJwLCBubiwgZG5wLCBkbiwgc2NyYXRjaCk7CisJICBBU1NFUlRfQUxXQVlTIChyYW4gPT0gc2NyYXRjaFtpdGNoXSk7CisJICBjaGVja19vbmUgKHFwLCBycCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX3NlY19kaXZfcXIgKG5vcm0pIiwgMCk7CisKKwkgIC8qIE5vcm1hbGlzZWQgY2FzZSwgbXBuX3NlY19kaXZfciAqLworCSAgaXRjaCA9IG1wbl9zZWNfZGl2X3JfaXRjaCAobm4sIGRuKTsKKwkgIHNjcmF0Y2hbaXRjaF0gPSByYW47CisJICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICBtcG5fc2VjX2Rpdl9yIChycCwgbm4sIGRucCwgZG4sIHNjcmF0Y2gpOworCSAgQVNTRVJUX0FMV0FZUyAocmFuID09IHNjcmF0Y2hbaXRjaF0pOworCSAgLyogTm90ZTogU2luY2UgY2hlY2tfb25lIGNhbm5vdCBjb3BlIHdpdGggcmVtYWluZGVyLW9ubHkgZnVuY3Rpb25zLCB3ZQorCSAgICAgcGFzcyBxcFtdIGZyb20gdGhlIHByZXZpb3VzIGZ1bmN0aW9uLCBtcG5fc2VjX2Rpdl9xci4gICovCisJICBjaGVja19vbmUgKHFwLCBycCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX3NlY19kaXZfciAobm9ybSkiLCAwKTsKKwl9CisKKyAgICAgIC8qIFRlc3QgbXBuX2RjcGkxX2Rpdl9xciAqLworICAgICAgaWYgKGRuID49IDYgJiYgbm4gLSBkbiA+PSAzKQorCXsKKwkgIE1QTl9DT1BZIChycCwgbnAsIG5uKTsKKwkgIGlmIChubiA+IGRuKQorCSAgICBNUE5fQ09QWSAocXAsIGp1bmtwLCBubiAtIGRuKTsKKwkgIHFwW25uIC0gZG5dID0gbXBuX2RjcGkxX2Rpdl9xciAocXAsIHJwLCBubiwgZG5wLCBkbiwgJmRpbnYpOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBBU1NFUlRfQUxXQVlTIChycFstMV0gPT0gcnJhbjApOworCSAgY2hlY2tfb25lIChxcCwgcnAsIG5wLCBubiwgZG5wLCBkbiwgIm1wbl9kY3BpMV9kaXZfcXIiLCAwKTsKKwl9CisKKyAgICAgIC8qIFRlc3QgbXBuX2RjcGkxX2RpdmFwcHJfcSAqLworICAgICAgaWYgKGRuID49IDYgJiYgbm4gLSBkbiA+PSAzKQorCXsKKwkgIE1QTl9DT1BZIChycCwgbnAsIG5uKTsKKwkgIGlmIChubiA+IGRuKQorCSAgICBNUE5fQ09QWSAocXAsIGp1bmtwLCBubiAtIGRuKTsKKwkgIHFwW25uIC0gZG5dID0gbXBuX2RjcGkxX2RpdmFwcHJfcSAocXAsIHJwLCBubiwgZG5wLCBkbiwgJmRpbnYpOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBBU1NFUlRfQUxXQVlTIChycFstMV0gPT0gcnJhbjApOworCSAgY2hlY2tfb25lIChxcCwgTlVMTCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX2RjcGkxX2RpdmFwcHJfcSIsIDEpOworCX0KKworICAgICAgLyogVGVzdCBtcG5fZGNwaTFfZGl2X3EgKi8KKyAgICAgIGlmIChkbiA+PSA2ICYmIG5uIC0gZG4gPj0gMykKKwl7CisJICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICBpZiAobm4gPiBkbikKKwkgICAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbik7CisJICBxcFtubiAtIGRuXSA9IG1wbl9kY3BpMV9kaXZfcSAocXAsIHJwLCBubiwgZG5wLCBkbiwgJmRpbnYpOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBBU1NFUlRfQUxXQVlTIChycFstMV0gPT0gcnJhbjApOworCSAgY2hlY2tfb25lIChxcCwgTlVMTCwgbnAsIG5uLCBkbnAsIGRuLCAibXBuX2RjcGkxX2Rpdl9xIiwgMCk7CisJfQorCisgICAgIC8qIFRlc3QgbXBuX211X2Rpdl9xciAqLworICAgICAgaWYgKG5uIC0gZG4gPiAyICYmIGRuID49IDIpCisJeworCSAgaXRjaCA9IG1wbl9tdV9kaXZfcXJfaXRjaCAobm4sIGRuLCAwKTsKKwkgIGlmIChpdGNoICsgMSA+IGFsbG9jKQorCSAgICB7CisJICAgICAgc2NyYXRjaCA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2NyYXRjaCwgYWxsb2MsIGl0Y2ggKyAxKTsKKwkgICAgICBhbGxvYyA9IGl0Y2ggKyAxOworCSAgICB9CisJICBzY3JhdGNoW2l0Y2hdID0gcmFuOworCSAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbik7CisJICBNUE5fWkVSTyAocnAsIGRuKTsKKwkgIHJwW2RuXSA9IHJyYW4xOworCSAgcXBbbm4gLSBkbl0gPSBtcG5fbXVfZGl2X3FyIChxcCwgcnAsIG5wLCBubiwgZG5wLCBkbiwgc2NyYXRjaCk7CisJICBBU1NFUlRfQUxXQVlTIChyYW4gPT0gc2NyYXRjaFtpdGNoXSk7CisJICBBU1NFUlRfQUxXQVlTIChxcFstMV0gPT0gcXJhbjApOyAgQVNTRVJUX0FMV0FZUyAocXBbbm4gLSBkbiArIDFdID09IHFyYW4xKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHJwWy0xXSA9PSBycmFuMCk7ICBBU1NFUlRfQUxXQVlTIChycFtkbl0gPT0gcnJhbjEpOworCSAgY2hlY2tfb25lIChxcCwgcnAsIG5wLCBubiwgZG5wLCBkbiwgIm1wbl9tdV9kaXZfcXIiLCAwKTsKKwl9CisKKyAgICAgIC8qIFRlc3QgbXBuX211X2RpdmFwcHJfcSAqLworICAgICAgaWYgKG5uIC0gZG4gPiAyICYmIGRuID49IDIpCisJeworCSAgaXRjaCA9IG1wbl9tdV9kaXZhcHByX3FfaXRjaCAobm4sIGRuLCAwKTsKKwkgIGlmIChpdGNoICsgMSA+IGFsbG9jKQorCSAgICB7CisJICAgICAgc2NyYXRjaCA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2NyYXRjaCwgYWxsb2MsIGl0Y2ggKyAxKTsKKwkgICAgICBhbGxvYyA9IGl0Y2ggKyAxOworCSAgICB9CisJICBzY3JhdGNoW2l0Y2hdID0gcmFuOworCSAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbik7CisJICBxcFtubiAtIGRuXSA9IG1wbl9tdV9kaXZhcHByX3EgKHFwLCBucCwgbm4sIGRucCwgZG4sIHNjcmF0Y2gpOworCSAgQVNTRVJUX0FMV0FZUyAocmFuID09IHNjcmF0Y2hbaXRjaF0pOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBjaGVja19vbmUgKHFwLCBOVUxMLCBucCwgbm4sIGRucCwgZG4sICJtcG5fbXVfZGl2YXBwcl9xIiwgNCk7CisJfQorCisgICAgICAvKiBUZXN0IG1wbl9tdV9kaXZfcSAqLworICAgICAgaWYgKG5uIC0gZG4gPiAyICYmIGRuID49IDIpCisJeworCSAgaXRjaCA9IG1wbl9tdV9kaXZfcV9pdGNoIChubiwgZG4sIDApOworCSAgaWYgKGl0Y2ggKyAxPiBhbGxvYykKKwkgICAgeworCSAgICAgIHNjcmF0Y2ggPSBfX0dNUF9SRUFMTE9DQVRFX0ZVTkNfTElNQlMgKHNjcmF0Y2gsIGFsbG9jLCBpdGNoICsgMSk7CisJICAgICAgYWxsb2MgPSBpdGNoICsgMTsKKwkgICAgfQorCSAgc2NyYXRjaFtpdGNoXSA9IHJhbjsKKwkgIE1QTl9DT1BZIChxcCwganVua3AsIG5uIC0gZG4pOworCSAgcXBbbm4gLSBkbl0gPSBtcG5fbXVfZGl2X3EgKHFwLCBucCwgbm4sIGRucCwgZG4sIHNjcmF0Y2gpOworCSAgQVNTRVJUX0FMV0FZUyAocmFuID09IHNjcmF0Y2hbaXRjaF0pOworCSAgQVNTRVJUX0FMV0FZUyAocXBbLTFdID09IHFyYW4wKTsgIEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gZG4gKyAxXSA9PSBxcmFuMSk7CisJICBjaGVja19vbmUgKHFwLCBOVUxMLCBucCwgbm4sIGRucCwgZG4sICJtcG5fbXVfZGl2X3EiLCAwKTsKKwl9CisKKyAgICAgIGlmICgxKQorCXsKKwkgIGl0Y2ggPSBubiArIDE7CisJICBpZiAoaXRjaCArIDE+IGFsbG9jKQorCSAgICB7CisJICAgICAgc2NyYXRjaCA9IF9fR01QX1JFQUxMT0NBVEVfRlVOQ19MSU1CUyAoc2NyYXRjaCwgYWxsb2MsIGl0Y2ggKyAxKTsKKwkgICAgICBhbGxvYyA9IGl0Y2ggKyAxOworCSAgICB9CisJICBzY3JhdGNoW2l0Y2hdID0gcmFuOworCSAgTVBOX0NPUFkgKHFwLCBqdW5rcCwgbm4gLSBkbiArIDEpOworCSAgbXBuX2Rpdl9xIChxcCwgbnAsIG5uLCBkdXAsIGRuLCBzY3JhdGNoKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHJhbiA9PSBzY3JhdGNoW2l0Y2hdKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHFwWy0xXSA9PSBxcmFuMCk7ICBBU1NFUlRfQUxXQVlTIChxcFtubiAtIGRuICsgMV0gPT0gcXJhbjEpOworCSAgY2hlY2tfb25lIChxcCwgTlVMTCwgbnAsIG5uLCBkdXAsIGRuLCAibXBuX2Rpdl9xIiwgMCk7CisJfQorCisgICAgICBpZiAoZG4gPj0gMiAmJiBubiA+PSAyKQorCXsKKwkgIG1wX2xpbWJfdCBxaDsKKworCSAgLyogbXBuX2RpdnJlbV8yICovCisJICBNUE5fQ09QWSAocnAsIG5wLCBubik7CisJICBxcFtubiAtIDJdID0gcXBbbm4tMV0gPSBxcmFuMTsKKworCSAgcWggPSBtcG5fZGl2cmVtXzIgKHFwLCAwLCBycCwgbm4sIGRucCArIGRuIC0gMik7CisJICBBU1NFUlRfQUxXQVlTIChxcFtubiAtIDJdID09IHFyYW4xKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHFwWy0xXSA9PSBxcmFuMCk7ICBBU1NFUlRfQUxXQVlTIChxcFtubiAtIDFdID09IHFyYW4xKTsKKwkgIHFwW25uIC0gMl0gPSBxaDsKKwkgIGNoZWNrX29uZSAocXAsIHJwLCBucCwgbm4sIGRucCArIGRuIC0gMiwgMiwgIm1wbl9kaXZyZW1fMiIsIDApOworCisJICAvKiBNaXNzaW5nOiBkaXZyZW1fMiB3aXRoIGZyYWN0aW9uIGxpbWJzLiAqLworCisJICAvKiBtcG5fZGl2X3FyXzIgKi8KKwkgIHFwW25uIC0gMl0gPSBxcmFuMTsKKworCSAgcWggPSBtcG5fZGl2X3FyXzIgKHFwLCBycCwgbnAsIG5uLCBkdXAgKyBkbiAtIDIpOworCSAgQVNTRVJUX0FMV0FZUyAocXBbbm4gLSAyXSA9PSBxcmFuMSk7CisJICBBU1NFUlRfQUxXQVlTIChxcFstMV0gPT0gcXJhbjApOyAgQVNTRVJUX0FMV0FZUyAocXBbbm4gLSAxXSA9PSBxcmFuMSk7CisJICBxcFtubiAtIDJdID0gcWg7CisJICBjaGVja19vbmUgKHFwLCBycCwgbnAsIG5uLCBkdXAgKyBkbiAtIDIsIDIsICJtcG5fZGl2X3FyXzIiLCAwKTsKKwl9CisgICAgICBpZiAoZG4gPj0gMSAmJiBubiA+PSAxKQorCXsKKwkgIC8qIG1wbl9kaXZfcXJfMSAqLworCSAgbXBfbGltYl90IHFoOworCSAgcXBbbm4tMV0gPSBxcmFuMTsKKwkgIHJwWzBdID0gbXBuX2Rpdl9xcl8xIChxcCwgJnFoLCBucCwgbm4sIGRucFtkbiAtIDFdKTsKKwkgIEFTU0VSVF9BTFdBWVMgKHFwWy0xXSA9PSBxcmFuMCk7IEFTU0VSVF9BTFdBWVMgKHFwW25uIC0gMV0gPT0gcXJhbjEpOworCSAgcXBbbm4gLSAxXSA9IHFoOworCSAgY2hlY2tfb25lIChxcCwgcnAsIG5wLCBubiwgIGRucCArIGRuIC0gMSwgMSwgIm1wbl9kaXZfcXJfMSIsIDApOworCX0KKyAgICB9CisKKyAgX19HTVBfRlJFRV9GVU5DX0xJTUJTIChzY3JhdGNoLCBhbGxvYyk7CisKKyAgVE1QX0ZSRUU7CisKKyAgbXB6X2NsZWFyIChuKTsKKyAgbXB6X2NsZWFyIChkKTsKKyAgbXB6X2NsZWFyIChxKTsKKyAgbXB6X2NsZWFyIChyKTsKKyAgbXB6X2NsZWFyICh0eik7CisgIG1wel9jbGVhciAoanVuayk7CisKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWRpdnJlbV8xLmMgYi90ZXN0cy9tcG4vdC1kaXZyZW1fMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWI3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1kaXZyZW1fMS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBUZXN0IG1wbl9kaXZyZW1fMSBhbmQgbXBuX3ByZWludl9kaXZyZW1fMS4KKworQ29weXJpZ2h0IDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIG1wX2xpbWJfdCAgblsxXTsKKyAgICBtcF9zaXplX3QgIG5zaXplOworICAgIG1wX2xpbWJfdCAgZDsKKyAgICBtcF9zaXplX3QgIHF4bjsKKyAgICBtcF9saW1iX3QgIHdhbnRfcVs1XTsKKyAgICBtcF9saW1iX3QgIHdhbnRfcjsKKyAgfSBkYXRhW10gPSB7CisgICAgeyB7IDAgfSwgMSwgMSwgMCwKKyAgICAgIHsgMCB9LCAwfSwKKworICAgIHsgeyA1IH0sIDEsIDIsIDAsCisgICAgICB7IDIgfSwgMX0sCisKKyAgICAvKiBFeGVyY2lzZXMgdGhlIHEgdXBkYXRlIGluIHRoZSBubCA9PSBjb25zdGFudCAwIGNhc2Ugb2YKKyAgICAgICB1ZGl2X3Fybm5kX3ByZWludjMuIFRlc3QgY2FzZSBjb3BpZWQgZnJvbSB0LWZhdC5jLiAqLworICAgIHsgeyAyODcgfSwgMSwgNywgMSwKKyAgICAgIHsgMCwgNDEgfSwgMCB9LAorCisjaWYgR01QX05VTUJfQklUUyA9PSAzMgorICAgIHsgeyAweDNDIH0sIDEsIDB4RjIsIDEsCisgICAgICB7IDB4M0Y3ODk4NTQsIDAgfSwgMHg5OCB9LAorI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTID09IDY0CisgICAgeyB7IDB4M0MgfSwgMSwgMHhGMiwgMSwKKyAgICAgIHsgQ05TVF9MSU1CKDB4M0Y3ODk4NTRBMENCMUI4MSksIDAgfSwgMHgwRSB9LAorCisgICAgLyogVGhpcyBjYXNlIGV4cG9zZWQgc29tZSB3cm9uZyBjb2RlIGdlbmVyYXRlZCBieSBTR0kgY2Mgb24gbWlwczY0IGlyaXgKKyAgICAgICA2LjUgd2l0aCAtbjMyIC1PMiwgaW4gdGhlIGZyYWN0aW9uYWwgbG9vcCBmb3Igbm9ybWFsaXplZCBkaXZpc29yCisgICAgICAgdXNpbmcgdWRpdl9xcm5uZF9wcmVpbnYuICBBIHRlc3QgIng+YWwiIGluIG9uZSBvZiB0aGUgc3ViX2RkbW1zcworICAgICAgIGV4cGFuc2lvbnMgY2FtZSBvdXQgd3JvbmcsIGxlYWRpbmcgdG8gYW4gaW5jb3JyZWN0IHF1b3RpZW50LiAgKi8KKyAgICB7IHsgQ05TVF9MSU1CKDB4M0MwMDAwMDAwMDAwMDAwMCkgfSwgMSwgQ05TVF9MSU1CKDB4RjIwMDAwMDAwMDAwMDAwMCksIDEsCisgICAgICB7IENOU1RfTElNQigweDNGNzg5ODU0QTBDQjFCODEpLCAwIH0sIENOU1RfTElNQigweDBFMDAwMDAwMDAwMDAwMDApIH0sCisjZW5kaWYKKyAgfTsKKworICBtcF9saW1iX3QgIGRpbnYsIGdvdF9yLCBnb3RfcVtudW1iZXJvZihkYXRhWzBdLndhbnRfcSldOworICBtcF9zaXplX3QgIHFzaXplOworICBpbnQgICAgICAgIGksIHNoaWZ0OworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBxc2l6ZSA9IGRhdGFbaV0ubnNpemUgKyBkYXRhW2ldLnF4bjsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHFzaXplIDw9IG51bWJlcm9mIChnb3RfcSkpOworCisgICAgICBnb3RfciA9IG1wbl9kaXZyZW1fMSAoZ290X3EsIGRhdGFbaV0ucXhuLCBkYXRhW2ldLm4sIGRhdGFbaV0ubnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5kKTsKKyAgICAgIGlmIChnb3RfciAhPSBkYXRhW2ldLndhbnRfcgorICAgICAgICAgIHx8IHJlZm1wbl9jbXAgKGdvdF9xLCBkYXRhW2ldLndhbnRfcSwgcXNpemUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgICAgICAgICgibXBuX2RpdnJlbV8xIHdyb25nIGF0IGRhdGFbJWRdXG4iLCBpKTsKKyAgICAgICAgYmFkOgorICAgICAgICAgIG1wbl90cmFjZSAgICAgKCIgIG4iLCBkYXRhW2ldLm4sIGRhdGFbaV0ubnNpemUpOworICAgICAgICAgIHByaW50ZiAgICAgICAgKCIgIG5zaXplPSVsZFxuIiwgKGxvbmcpIGRhdGFbaV0ubnNpemUpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIGQiLCBkYXRhW2ldLmQpOworICAgICAgICAgIHByaW50ZiAgICAgICAgKCIgIHF4bj0lbGRcbiIsIChsb25nKSBkYXRhW2ldLnF4bik7CisgICAgICAgICAgbXBuX3RyYWNlICAgICAoIiAgd2FudCBxIiwgZGF0YVtpXS53YW50X3EsIHFzaXplKTsKKyAgICAgICAgICBtcG5fdHJhY2UgICAgICgiICBnb3QgIHEiLCBnb3RfcSwgcXNpemUpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIHdhbnQgciIsIGRhdGFbaV0ud2FudF9yKTsKKyAgICAgICAgICBtcF9saW1iX3RyYWNlICgiICBnb3QgIHIiLCBnb3Rfcik7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgLyogdGVzdCBpZiBhdmFpbGFibGUgKi8KKyNpZiBVU0VfUFJFSU5WX0RJVlJFTV8xIHx8IEhBVkVfTkFUSVZFX21wbl9wcmVpbnZfZGl2cmVtXzEKKyAgICAgIHNoaWZ0ID0gcmVmbXBuX2NvdW50X2xlYWRpbmdfemVyb3MgKGRhdGFbaV0uZCk7CisgICAgICBkaW52ID0gcmVmbXBuX2ludmVydF9saW1iIChkYXRhW2ldLmQgPDwgc2hpZnQpOworICAgICAgZ290X3IgPSBtcG5fcHJlaW52X2RpdnJlbV8xIChnb3RfcSwgZGF0YVtpXS5xeG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0ubiwgZGF0YVtpXS5uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5kLCBkaW52LCBzaGlmdCk7CisgICAgICBpZiAoZ290X3IgIT0gZGF0YVtpXS53YW50X3IKKyAgICAgICAgICB8fCByZWZtcG5fY21wIChnb3RfcSwgZGF0YVtpXS53YW50X3EsIHFzaXplKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICAgICAoIm1wbl9wcmVpbnYgZGl2cmVtXzEgd3JvbmcgYXQgZGF0YVslZF1cbiIsIGkpOworICAgICAgICAgIHByaW50ZiAgICAgICAgKCIgIHNoaWZ0PSVkXG4iLCBzaGlmdCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgZGludiIsIGRpbnYpOworICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgY2hlY2tfZGF0YSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtZmF0LmMgYi90ZXN0cy9tcG4vdC1mYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTcxMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtZmF0LmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIFRlc3QgZmF0IGJpbmFyeSBzZXR1cHMuCisKK0NvcHlyaWdodCAyMDAzLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIEluIHRoaXMgcHJvZ3JhbSB3ZSdyZSBhaW1pbmcgdG8gcGljayB1cCBjZXJ0YWluIHN1YnRsZSBwcm9ibGVtcyB0aGF0CisgICBtaWdodCBjcmVlcCBpbnRvIGEgZmF0IGJpbmFyeS4KKworICAgMS4gV2Ugd2FudCB0byBlbnN1cmUgdGhlIGFwcGxpY2F0aW9uIGVudHJ5IHBvaW50IHJvdXRpbmVzIGxpa2UKKyAgICAgIF9fZ21wbl9hZGRfbiBkaXNwYXRjaCB0byB0aGUgY29ycmVjdCBmaWVsZCBvZiBfX2dtcG5fY3B1dmVjLgorCisgICAgICBOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgYXJlIG5vdCBleGVyY2lzZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiBvdGhlcgorICAgICAgdGVzdHMgKGVnLiB0aGUgbXB6IHJvdXRpbmVzKS4gIEludGVybmFsbHkgdGhlIGZpZWxkcyBvZiBfX2dtcG5fY3B1dmVjCisgICAgICBhcmUgdXNlZCBkaXJlY3RseSwgc28gd2UgbmVlZCB0byB3cml0ZSB0ZXN0IGNvZGUgZXhwbGljaXRseSBjYWxsaW5nCisgICAgICB0aGUgbXBuIGZ1bmN0aW9ucywgbGlrZSBhbiBhcHBsaWNhdGlvbiB3aWxsIGhhdmUuCisKKyAgIDIuIFdlIHdhbnQgdG8gZW5zdXJlIHRoZSBpbml0aWFsIF9fZ21wbl9jcHV2ZWMgZGF0YSBoYXMgdGhlIGluaXRpYWxpemVyCisgICAgICBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUgY29ycmVjdCBmaWVsZHMsIGFuZCB0aGF0IHRob3NlIGluaXRpYWxpemVyCisgICAgICBmdW5jdGlvbnMgZGlzcGF0Y2ggdG8gdGhlaXIgY29ycmVjdCBjb3JyZXNwb25kaW5nIGZpZWxkIG9uY2UKKyAgICAgIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUuCisKKyAgICAgIE9ubHkgb25lIG9mIHRoZSBpbml0aWFsaXplciByb3V0aW5lcyBleGVjdXRlcyBpbiBhIG5vcm1hbCBwcm9ncmFtLAorICAgICAgc2luY2UgdGhhdCByb3V0aW5lIHNldHMgYWxsIHRoZSBwb2ludGVycyB0byBhY3R1YWwgbXBuIGZ1bmN0aW9ucy4gIFdlCisgICAgICBmb3JjaWJseSByZXNldCBfX2dtcG5fY3B1dmVjIHNvIHdlIGNhbiBydW4gZWFjaC4KKworICAgSW4gYm90aCBjYXNlcyBmb3IgdGhlIGFib3ZlLCB0aGUgZGF0YSBwdXQgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGlzCisgICBub3RoaW5nIHNwZWNpYWwsIGp1c3QgZW5vdWdoIHRvIHZlcmlmeSB0aGF0IGZvciBpbnN0YW5jZSBhbiBhZGRfbiBpcworICAgcmVhbGx5IGRvaW5nIGFuIGFkZF9uIGFuZCBoYXMgbm90IGZvciBpbnN0YW5jZSBtaXN0YWtlbmx5IGdvbmUgdG8gc3ViX24KKyAgIG9yIHNvbWV0aGluZy4KKworICAgVGhlIGxvb3AgYXJvdW5kIGVhY2ggdGVzdCB3aWxsIGV4ZXJjaXNlIHRoZSBpbml0aWFsaXplciByb3V0aW5lIG9uIHRoZQorICAgZmlyc3QgaXRlcmF0aW9uLCBhbmQgdGhlIGRpc3BhdGNoZXIgcm91dGluZSBvbiB0aGUgc2Vjb25kLgorCisgICBJZiB0aGUgZGlzcGF0Y2hlciBhbmQvb3IgaW5pdGlhbGl6ZXIgcm91dGluZXMgYXJlIGdlbmVyYXRlZCBtZWNoYW5pY2FsbHkKKyAgIHZpYSBtYWNyb3MgKGVnLiBtcG4veDg2L2ZhdC9mYXRfZW50cnkuYXNtKSB0aGVuIHRoZXJlIHNob3VsZG4ndCBiZSB0b28KKyAgIG11Y2ggcmlzayBvZiB0aGVtIGdvaW5nIHdyb25nLCBwcm92aWRlZCB0aGUgc3RydWN0dXJlIGxheW91dCBpcyBjb3JyZWN0bHkKKyAgIGV4cHJlc3NlZC4gIEJ1dCBpZiB0aGV5J3JlIGluIEMgdGhlbiBpdCdzIGdvb2QgdG8gZ3VhcmQgYWdhaW5zdCB0eXBvcyBpbgorICAgd2hhdCBpcyByYXRoZXIgcmVwZXRpdGl2ZSBjb2RlLiAgVGhlIGluaXRpYWxpemVyIGRhdGEgZm9yIF9fZ21wbl9jcHV2ZWMKKyAgIGluIGZhdC5jIGlzIGFsd2F5cyBkb25lIGJ5IGhhbmQgYW5kIGlzIGxpa2V3aXNlIGEgYml0IHJlcGV0aXRpdmUuICAqLworCisKKy8qIGR1bW1pZXMgd2hlbiBub3QgYSBmYXQgYmluYXJ5ICovCisjaWYgISBXQU5UX0ZBVF9CSU5BUlkKK3N0cnVjdCBjcHV2ZWNfdCB7CisgIGludCAgZHVtbXk7Cit9Oworc3RydWN0IGNwdXZlY190IF9fZ21wbl9jcHV2ZWM7CisjZGVmaW5lIElURVJBVEVfRkFUX1RIUkVTSE9MRFMoKSAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIHNhdmVkIGZyb20gcHJvZ3JhbSBzdGFydHVwICovCitzdHJ1Y3QgY3B1dmVjX3QgIGluaXRpYWxfY3B1dmVjOworCit2b2lkCitjaGVja19mdW5jdGlvbnMgKHZvaWQpCit7CisgIG1wX2xpbWJfdCAgd3BbMl0sIHhwWzJdLCB5cFsyXSwgcjsKKyAgaW50ICBpOworCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSAxMjM7CisgICAgICB5cFswXSA9IDQ1NjsKKyAgICAgIG1wbl9hZGRfbiAod3AsIHhwLCB5cCwgKG1wX3NpemVfdCkgMSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSA1NzkpOworICAgIH0KKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gMTIzOworICAgICAgd3BbMF0gPSA0NTY7CisgICAgICByID0gbXBuX2FkZG11bF8xICh3cCwgeHAsIChtcF9zaXplX3QpIDEsIENOU1RfTElNQigyKSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSA3MDIpOworICAgICAgQVNTRVJUX0FMV0FZUyAociA9PSAwKTsKKyAgICB9CisKKyNpZiBIQVZFX05BVElWRV9tcG5fY29weWQKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDEyMzsKKyAgICAgIHhwWzFdID0gNDU2OworICAgICAgbXBuX2NvcHlkICh4cCsxLCB4cCwgKG1wX3NpemVfdCkgMSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh4cFsxXSA9PSAxMjMpOworICAgIH0KKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2NvcHlpCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSAxMjM7CisgICAgICB4cFsxXSA9IDQ1NjsKKyAgICAgIG1wbl9jb3B5aSAoeHAsIHhwKzEsIChtcF9zaXplX3QpIDEpOworICAgICAgQVNTRVJUX0FMV0FZUyAoeHBbMF0gPT0gNDU2KTsKKyAgICB9CisjZW5kaWYKKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gMTYwNTsKKyAgICAgIG1wbl9kaXZleGFjdF8xICh3cCwgeHAsIChtcF9zaXplX3QpIDEsIENOU1RfTElNQig1KSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSAzMjEpOworICAgIH0KKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gMTI5NjsKKyAgICAgIHIgPSBtcG5fZGl2ZXhhY3RfYnkzYyAod3AsIHhwLCAobXBfc2l6ZV90KSAxLCBDTlNUX0xJTUIoMCkpOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMF0gPT0gNDMyKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHIgPT0gMCk7CisgICAgfQorCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSAyODc7CisgICAgICByID0gbXBuX2RpdnJlbV8xICh3cCwgKG1wX3NpemVfdCkgMSwgeHAsIChtcF9zaXplX3QpIDEsIENOU1RfTElNQig3KSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFsxXSA9PSA0MSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSAwKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHIgPT0gMCk7CisgICAgfQorCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSAxMjsKKyAgICAgIHIgPSBtcG5fZ2NkXzEgKHhwLCAobXBfc2l6ZV90KSAxLCBDTlNUX0xJTUIoOSkpOworICAgICAgQVNTRVJUX0FMV0FZUyAociA9PSAzKTsKKyAgICB9CisKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDB4MTAwMTsKKyAgICAgIG1wbl9sc2hpZnQgKHdwLCB4cCwgKG1wX3NpemVfdCkgMSwgMSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSAweDIwMDIpOworICAgIH0KKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gMTQ7CisgICAgICByID0gbXBuX21vZF8xICh4cCwgKG1wX3NpemVfdCkgMSwgQ05TVF9MSU1CKDQpKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHIgPT0gMik7CisgICAgfQorCisjaWYgKEdNUF9OVU1CX0JJVFMgJSA0KSA9PSAwCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgaW50ICBiaXRzID0gKEdNUF9OVU1CX0JJVFMgLyA0KSAqIDM7CisgICAgICBtcF9saW1iX3QgIG1vZCA9IChDTlNUX0xJTUIoMSkgPDwgYml0cykgLSAxOworICAgICAgbXBfbGltYl90ICB3YW50ID0gR01QX05VTUJfTUFYICUgbW9kOworICAgICAgeHBbMF0gPSBHTVBfTlVNQl9NQVg7CisgICAgICByID0gbXBuX21vZF8zNGxzdWIxICh4cCwgKG1wX3NpemVfdCkgMSk7CisgICAgICBBU1NFUlRfQUxXQVlTIChyICUgbW9kID09IHdhbnQpOworICAgIH0KKyNlbmRpZgorCisgIC8qICAgREVDTF9tb2RleGFjdF8xY19vZGQgKCgqbW9kZXhhY3RfMWNfb2RkKSk7ICovCisKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDE0OworICAgICAgciA9IG1wbl9tdWxfMSAod3AsIHhwLCAobXBfc2l6ZV90KSAxLCBDTlNUX0xJTUIoNCkpOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMF0gPT0gNTYpOworICAgICAgQVNTRVJUX0FMV0FZUyAociA9PSAwKTsKKyAgICB9CisKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDU7CisgICAgICB5cFswXSA9IDc7CisgICAgICBtcG5fbXVsX2Jhc2VjYXNlICh3cCwgeHAsIChtcF9zaXplX3QpIDEsIHlwLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHdwWzBdID09IDM1KTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHdwWzFdID09IDApOworICAgIH0KKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gNTsKKyAgICAgIHlwWzBdID0gNzsKKyAgICAgIG1wbl9tdWxsb19iYXNlY2FzZSAod3AsIHhwLCB5cCwgKG1wX3NpemVfdCkgMSk7CisgICAgICBBU1NFUlRfQUxXQVlTICh3cFswXSA9PSAzNSk7CisgICAgfQorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3ByZWludl9kaXZyZW1fMSAmJiBHTVBfTkFJTF9CSVRTID09IDAKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDB4MTAxOworICAgICAgciA9IG1wbl9wcmVpbnZfZGl2cmVtXzEgKHdwLCAobXBfc2l6ZV90KSAxLCB4cCwgKG1wX3NpemVfdCkgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTVBfTElNQl9ISUdIQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZm1wbl9pbnZlcnRfbGltYiAoR01QX0xJTUJfSElHSEJJVCksIDApOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMF0gPT0gMHgyMDIpOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMV0gPT0gMCk7CisgICAgICBBU1NFUlRfQUxXQVlTIChyID09IDApOworICAgIH0KKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA9PSAwCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSBHTVBfTElNQl9ISUdIQklUKzEyMzsKKyAgICAgIHIgPSBtcG5fcHJlaW52X21vZF8xICh4cCwgKG1wX3NpemVfdCkgMSwgR01QX0xJTUJfSElHSEJJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZtcG5faW52ZXJ0X2xpbWIgKEdNUF9MSU1CX0hJR0hCSVQpKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHIgPT0gMTIzKTsKKyAgICB9CisjZW5kaWYKKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gMHg4MDA4OworICAgICAgbXBuX3JzaGlmdCAod3AsIHhwLCAobXBfc2l6ZV90KSAxLCAxKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHdwWzBdID09IDB4NDAwNCk7CisgICAgfQorCisgIG1lbWNweSAoJl9fZ21wbl9jcHV2ZWMsICZpbml0aWFsX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgeworICAgICAgeHBbMF0gPSA1OworICAgICAgbXBuX3Nxcl9iYXNlY2FzZSAod3AsIHhwLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHdwWzBdID09IDI1KTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHdwWzFdID09IDApOworICAgIH0KKworICBtZW1jcHkgKCZfX2dtcG5fY3B1dmVjLCAmaW5pdGlhbF9jcHV2ZWMsIHNpemVvZiAoX19nbXBuX2NwdXZlYykpOworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgIHhwWzBdID0gOTk5OworICAgICAgeXBbMF0gPSA2NjY7CisgICAgICBtcG5fc3ViX24gKHdwLCB4cCwgeXAsIChtcF9zaXplX3QpIDEpOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMF0gPT0gMzMzKTsKKyAgICB9CisKKyAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICB4cFswXSA9IDEyMzsKKyAgICAgIHdwWzBdID0gNDU2OworICAgICAgciA9IG1wbl9zdWJtdWxfMSAod3AsIHhwLCAobXBfc2l6ZV90KSAxLCBDTlNUX0xJTUIoMikpOworICAgICAgQVNTRVJUX0FMV0FZUyAod3BbMF0gPT0gMjEwKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKHIgPT0gMCk7CisgICAgfQorfQorCisvKiBFeHBlY3QgdGhlIGZpcnN0IHVzZSBvZiBlYWNoIGZhdCB0aHJlc2hvbGQgdG8gaW52b2tlIHRoZSBuZWNlc3NhcnkKKyAgIGluaXRpYWxpemF0aW9uLiAgKi8KK3ZvaWQKK2NoZWNrX3RocmVzaG9sZHMgKHZvaWQpCit7CisjZGVmaW5lIElURVJBVEUobmFtZSxmaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19nbXBuX2NwdXZlY19pbml0aWFsaXplZCA9IDA7CQkJCQlcCisgICAgbWVtY3B5ICgmX19nbXBuX2NwdXZlYywgJmluaXRpYWxfY3B1dmVjLCBzaXplb2YgKF9fZ21wbl9jcHV2ZWMpKTsgICBcCisgICAgQVNTRVJUX0FMV0FZUyAobmFtZSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUX0FMV0FZUyAobmFtZSA9PSBfX2dtcG5fY3B1dmVjLmZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUX0FMV0FZUyAoX19nbXBuX2NwdXZlY19pbml0aWFsaXplZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgSVRFUkFURV9GQVRfVEhSRVNIT0xEUyAoKTsKK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIG1lbWNweSAoJmluaXRpYWxfY3B1dmVjLCAmX19nbXBuX2NwdXZlYywgc2l6ZW9mIChfX2dtcG5fY3B1dmVjKSk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZnVuY3Rpb25zICgpOworICBjaGVja190aHJlc2hvbGRzICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1maWIybS5jIGIvdGVzdHMvbXBuL3QtZmliMm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQzOTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtZmliMm0uYwpAQCAtMCwwICsxLDM0NCBAQAorLyogVGVzdCBtcG5fZmliMm0uCisKK0NvcHlyaWdodCAyMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2RlZmluZSBNQVhfS19CSVRTIDE2CisjZGVmaW5lIE1BWF9LICgxTCA8PCBNQVhfS19CSVRTKQorI2RlZmluZSBNSU5fSyAxCisKKyNkZWZpbmUgTUFYX01OIDIwCisjZGVmaW5lIE1BWF9LTiAzMAorCisjZGVmaW5lIENPVU5UIDIwMAorCitzdGF0aWMgaW50Cit0ZXN0X2ZpYjJfZmliMm0gKGludCBjb3VudCwgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMpCit7CisgIGludCB0ZXN0OworICBtcF9wdHIgZmssIGZrczEsIGZrbSwgZmtzMW0sIG1wLCBxcDsKKyAgbXBfc2l6ZV90IG1uLCBmbiwgc2l6ZSwgbWF4X21uOworICBUTVBfREVDTDsKKworICBzaXplID0gTVBOX0ZJQjJfU0laRSAoTUFYX0spOworICBtYXhfbW4gPSBzaXplIC8gNCArIDEwOworICBBU1NFUlQgKG1heF9tbiA8IHNpemUpOworCisgIFRNUF9NQVJLOworICBmawkgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUpOworICBma3MxCSA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSk7CisgIHFwCSA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSk7CisgIG1wCSA9IFRNUF9BTExPQ19MSU1CUyAobWF4X21uKTsKKyAgZmttCSA9IDEgKyBUTVBfQUxMT0NfTElNQlMgKG1heF9tbiAqIDIgKyAxICsgMik7CisgIGZrczFtCSA9IDEgKyBUTVBfQUxMT0NfTElNQlMgKG1heF9tbiAqIDIgKyAxICsgMik7CisKKyAgZm9yICh0ZXN0ID0gMTsgdGVzdCA8PSBjb3VudDsgKyt0ZXN0KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBma19iZWZvcmUsIGZrX2FmdGVyLCBmazFfYmVmb3JlLCBmazFfYWZ0ZXI7CisgICAgICBpbnQgc2lnbmZsaXA7CisgICAgICB1bnNpZ25lZCBsb25nIGs7CisKKyAgICAgIGsgPSBNSU5fSyArCisJZ21wX3VyYW5kb21tX3VpIChyYW5kcywgdGVzdCA8IE1BWF9LX0JJVFMgPworCQkJIE1BWF9LID4+IHRlc3QgOiAoTUFYX0sgLSBNSU5fSykpOworCisgICAgICBmbiA9IG1wbl9maWIyX3VpIChmaywgZmtzMSwgayk7CisgICAgICBkbyB7CisJbW4gPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBNQVhfSykgJSAoZm4gLyA0ICsgMTApOworICAgICAgfSB3aGlsZSAobW4gPT0gMCk7CisgICAgICBBU1NFUlQgKG1uIDw9IG1heF9tbik7CisgICAgICBtcG5fcmFuZG9tMiAobXAsIG1uKTsKKyAgICAgIEFTU0VSVCAobXAgW21uIC0gMV0gIT0gMCk7CisKKyAgICAgIGlmIChmbiA+PSBtbikKKwl7CisJICBtcG5fdGRpdl9xciAocXAsIGZrLCAwLCBmaywgZm4sIG1wLCBtbik7CisJICBtcG5fdGRpdl9xciAocXAsIGZrczEsIDAsIGZrczEsIGZuLCBtcCwgbW4pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBNUE5fWkVSTyAoZmsgKyBmbiwgbW4gLSBmbik7CisJICBNUE5fWkVSTyAoZmtzMSArIGZuLCBtbiAtIGZuKTsKKwl9CisKKyAgICAgIG1wbl9yYW5kb20yIChma20gLSAxLCAyKm1uKzErMik7CisgICAgICBma19iZWZvcmUgPSBma20gWy0xXTsKKyAgICAgIGZrX2FmdGVyID0gZmttIFsyICogbW4gKyAxXTsKKworICAgICAgbXBuX3JhbmRvbTIgKGZrczFtIC0gMSwgMiptbisxKzIpOworICAgICAgZmsxX2JlZm9yZSA9IGZrczFtIFstMV07CisgICAgICBmazFfYWZ0ZXIgPSBma3MxbSBbMiAqIG1uICsgMV07CisKKyAgICAgIHFwIFswXSA9IGs7CisgICAgICBzaWduZmxpcCA9IG1wbl9maWIybSAoZmttLCBma3MxbSwgcXAsIDEsIG1wLCBtbik7CisgICAgICBpZiAoZmttIFstMV0gIT0gZmtfYmVmb3JlIHx8IGZrbSBbMiAqIG1uICsgMV0gIT0gZmtfYWZ0ZXIKKwkgIHx8IGZrczFtIFstMV0gIT0gZmsxX2JlZm9yZSB8fCBma3MxbSBbMiAqIG1uICsgMV0gIT0gZmsxX2FmdGVyKQorCXsKKwkgIHByaW50ZiAoIlJFRFpPTkUgdmlvbGF0aW9uIGluIHRlc3QgJWQsIGsgPSAlbHUsIG1uID0gJXVcbiIsCisJCSAgdGVzdCwgaywgKHVuc2lnbmVkKSBtbik7CisJICBpZiAoZmttWy0xXSAhPSBma19iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgZmttOiIpOyBtcG5fZHVtcCAoZmttIC0gMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZma19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoZmttWzIgKiBtbiArIDFdICE9IGZrX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgZmttOiIpOyBtcG5fZHVtcCAoZmttICsgMiAqIG1uICsgMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZma19hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChma3MxbVstMV0gIT0gZmsxX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBma3MxbToiKTsgbXBuX2R1bXAgKGZrczFtIC0gMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZmazFfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKGZrczFtWzIgKiBtbiArIDFdICE9IGZrMV9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIGZrczFtOiIpOyBtcG5fZHVtcCAoZmtzMW0gKyAyICogbW4gKyAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJmZrMV9hZnRlciwgMSk7CisJICAgIH0KKwkgIGFib3J0KCk7CisJfQorCisgICAgICBpZiAobXBuX2NtcCAoZmttLCBmaywgbW4pICE9IDApCisJeworCSAgaWYgKG1wbl9zdWJfbiAoZmssIG1wLCBmaywgbW4pIHx8IG1wbl9jbXAgKGZrbSwgZmssIG1uKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1IoaykgaW4gdGVzdCAlZCwgayA9ICVsdSwgbW4gPSAldVxuIiwKKwkJICAgICAgdGVzdCwgaywgKHVuc2lnbmVkKSBtbik7CisJICAgICAgbXBuX2R1bXAgKGZrLCBtbik7CisJICAgICAgbXBuX2R1bXAgKGZrbSwgbW4pOworCSAgICAgIG1wbl9kdW1wIChtcCwgbW4pOworCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwkgIHNpZ25mbGlwIF49IDE7CisJfQorCisgICAgICBpZiAobXBuX2NtcCAoZmtzMW0sIGZrczEsIG1uKSAhPSAwKQorCXsKKwkgIGlmIChtcG5fc3ViX24gKGZrczEsIG1wLCBma3MxLCBtbikgfHwgbXBuX2NtcCAoZmtzMW0sIGZrczEsIG1uKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1Ioay0xKSBpbiB0ZXN0ICVkLCBrID0gJWx1LCBtbiA9ICV1XG4iLAorCQkgICAgICB0ZXN0LCBrLCAodW5zaWduZWQpIG1uKTsKKwkgICAgICBtcG5fZHVtcCAoZmtzMSwgbW4pOworCSAgICAgIG1wbl9kdW1wIChma3MxbSwgbW4pOworCSAgICAgIG1wbl9kdW1wIChtcCwgbW4pOworCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwkgIHNpZ25mbGlwIF49IDE7CisJfQorCisgICAgICBpZiAoc2lnbmZsaXAgIT0gMCAmJiAhIG1wbl96ZXJvX3AgKGZrczFtLCBtbikgJiYgISBtcG5femVyb19wIChma20sIG1uKSkKKwl7CisJICBpZiAoKG1wIFswXSAmIDEpID09IDApIC8qIFNob3VsZCB3ZSB0ZXN0IG9ubHkgb2RkIG1vZHVsdXMtZXM/ICovCisJICAgIHsKKwkgICAgICBpZiAoISBtcG5fbHNoaWZ0IChma3MxbSwgZmtzMW0sIG1uLCAxKSAmJgorCQkgIG1wbl9jbXAgKG1wLCBma3MxbSwgbW4pID09IDApCisJCWNvbnRpbnVlOworCSAgICAgIGlmICghIG1wbl9sc2hpZnQgKGZrbSwgZmttLCBtbiwgMSkgJiYKKwkJICBtcG5fY21wIChtcCwgZmttLCBtbikgPT0gMCkKKwkJY29udGludWU7CisJICAgIH0KKwkgIHByaW50ZiAoIkVSUk9SKHNpZ24pIGluIHRlc3QgJWQsIGsgPSAlbHUsIG1uID0gJXVcbiIsCisJCSAgdGVzdCwgaywgKHVuc2lnbmVkKSBtbik7CisJICBhYm9ydCgpOworCX0KKyAgICB9CisgIFRNUF9GUkVFOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGVzdF9maWIybV8yZXhwIChpbnQgY291bnQsIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzKQoreworICBpbnQgdGVzdDsKKyAgbXBfcHRyIGZrYSwgZmtzMWEsIGZrYiwgZmtzMWIsIG1wLCBrcDsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisgIGtwCSA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX0tOKTsKKyAgbXAJID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTU4pOworICBma2EJID0gMSArIFRNUF9BTExPQ19MSU1CUyAoTUFYX01OICogMiArIDEgKyAyKTsKKyAgZmtzMWEJID0gMSArIFRNUF9BTExPQ19MSU1CUyAoTUFYX01OICogMiArIDEgKyAyKTsKKyAgZmtiCSA9IDEgKyBUTVBfQUxMT0NfTElNQlMgKE1BWF9NTiAqIDIgKyAxICsgMik7CisgIGZrczFiCSA9IDEgKyBUTVBfQUxMT0NfTElNQlMgKE1BWF9NTiAqIDIgKyAxICsgMik7CisKKyAgZm9yICh0ZXN0ID0gMTsgdGVzdCA8PSBjb3VudDsgKyt0ZXN0KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBma2FfYmVmb3JlLCBma2FfYWZ0ZXIsIGZrMWFfYmVmb3JlLCBmazFhX2FmdGVyOworICAgICAgbXBfbGltYl90IGZrYl9iZWZvcmUsIGZrYl9hZnRlciwgZmsxYl9iZWZvcmUsIGZrMWJfYWZ0ZXI7CisgICAgICBtcF9zaXplX3QgbW4sIGtuOworICAgICAgaW50IHNpZ25mbGlwOworICAgICAgbXBfYml0Y250X3QgZXhwMjsKKworICAgICAgbW4gPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBNQVhfTU4gLSAxKSArIDE7CisgICAgICBtcG5fcmFuZG9tMiAobXAsIG1uKTsKKworICAgICAgZXhwMiA9IE1JTl9LICsgMSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIE1BWF9LTiAqIEdNUF9OVU1CX0JJVFMgLSBNSU5fSyAtIDEpOworCisgICAgICBrbiA9IEJJVFNfVE9fTElNQlMgKGV4cDIpOworICAgICAgTVBOX1pFUk8gKGtwLCBrbiAtIDEpOworICAgICAga3AgW2tuIC0gMV0gPSBDTlNUX0xJTUIgKDEpIDw8ICgoZXhwMiAtIDEpICUgR01QX05VTUJfQklUUyk7CisKKyAgICAgIG1wbl9yYW5kb20yIChma2EgLSAxLCAyKm1uKzErMik7CisgICAgICBma2FfYmVmb3JlID0gZmthIFstMV07CisgICAgICBma2FfYWZ0ZXIgPSBma2EgWzIgKiBtbiArIDFdOworCisgICAgICBtcG5fcmFuZG9tMiAoZmtzMWEgLSAxLCAyKm1uKzErMik7CisgICAgICBmazFhX2JlZm9yZSA9IGZrczFhIFstMV07CisgICAgICBmazFhX2FmdGVyID0gZmtzMWEgWzIgKiBtbiArIDFdOworCisgICAgICBzaWduZmxpcCA9IG1wbl9maWIybSAoZmthLCBma3MxYSwga3AsIGtuLCBtcCwgbW4pOworICAgICAgaWYgKGZrYSBbLTFdICE9IGZrYV9iZWZvcmUgfHwgZmthIFsyICogbW4gKyAxXSAhPSBma2FfYWZ0ZXIKKwkgIHx8IGZrczFhIFstMV0gIT0gZmsxYV9iZWZvcmUgfHwgZmtzMWEgWzIgKiBtbiArIDFdICE9IGZrMWFfYWZ0ZXIpCisJeworCSAgcHJpbnRmICgiUkVEWk9ORShhKSB2aW9sYXRpb24gaW4gdGVzdCAlZCwgZXhwMiA9ICVsdVxuIiwgdGVzdCwgZXhwMik7CisJICBpZiAoZmthWy0xXSAhPSBma2FfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIGZrYToiKTsgbXBuX2R1bXAgKGZrYSAtIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmZmthX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChma2FbMiAqIG1uICsgMV0gIT0gZmthX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgZmthOiIpOyBtcG5fZHVtcCAoZmthICsgMiAqIG1uICsgMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZma2FfYWZ0ZXIsIDEpOworCSAgICB9CisJICBpZiAoZmtzMWFbLTFdICE9IGZrMWFfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIGZrczFhOiIpOyBtcG5fZHVtcCAoZmtzMWEgLSAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJmZrMWFfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKGZrczFhWzIgKiBtbiArIDFdICE9IGZrMWFfYWZ0ZXIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJhZnRlciBma3MxYToiKTsgbXBuX2R1bXAgKGZrczFhICsgMiAqIG1uICsgMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZmazFhX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgYWJvcnQoKTsKKwl9CisKKyAgICAgIGlmIChzaWduZmxpcCAmJiAhIG1wbl96ZXJvX3AgKGZrczFhLCBtbikpCisJbXBuX3N1Yl9uIChma3MxYSwgbXAsIGZrczFhLCBtbik7CisgICAgICBpZiAobXBuX3N1Yl9uIChma2EsIGZrYSwgZmtzMWEsIG1uKSkKKwlBU1NFUlRfQ0FSUlkgKG1wbl9hZGRfbiAoZmthLCBma2EsIG1wLCBtbikpOworCisgICAgICBtcG5fc3ViXzEgKGtwLCBrcCwga24sIDEpOworICAgICAgQVNTRVJUIChleHAyICUgR01QX05VTUJfQklUUyA9PSAxIHx8IGtwIFtrbiAtIDFdICE9IDApOworICAgICAga24gLT0ga3AgW2tuIC0gMV0gPT0gMDsKKworICAgICAgbXBuX3JhbmRvbTIgKGZrYiAtIDEsIDIqbW4rMSsyKTsKKyAgICAgIGZrYl9iZWZvcmUgPSBma2IgWy0xXTsKKyAgICAgIGZrYl9hZnRlciA9IGZrYiBbMiAqIG1uICsgMV07CisKKyAgICAgIG1wbl9yYW5kb20yIChma3MxYiAtIDEsIDIqbW4rMSsyKTsKKyAgICAgIGZrMWJfYmVmb3JlID0gZmtzMWIgWy0xXTsKKyAgICAgIGZrMWJfYWZ0ZXIgPSBma3MxYiBbMiAqIG1uICsgMV07CisKKyAgICAgIHNpZ25mbGlwID0gbXBuX2ZpYjJtIChma2IsIGZrczFiLCBrcCwga24sIG1wLCBtbik7CisgICAgICBpZiAoZmtiIFstMV0gIT0gZmtiX2JlZm9yZSB8fCBma2IgWzIgKiBtbiArIDFdICE9IGZrYl9hZnRlcgorCSAgfHwgZmtzMWIgWy0xXSAhPSBmazFiX2JlZm9yZSB8fCBma3MxYiBbMiAqIG1uICsgMV0gIT0gZmsxYl9hZnRlcikKKwl7CisJICBwcmludGYgKCJSRURaT05FKGIpIHZpb2xhdGlvbiBpbiB0ZXN0ICVkLCBleHAyID0gJWx1XG4iLCB0ZXN0LCBleHAyKTsKKwkgIGlmIChma2JbLTFdICE9IGZrYl9iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgZmtiOiIpOyBtcG5fZHVtcCAoZmtiIC0gMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZma2JfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKGZrYlsyICogbW4gKyAxXSAhPSBma2JfYWZ0ZXIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJhZnRlciBma2I6Iik7IG1wbl9kdW1wIChma2IgKyAyICogbW4gKyAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJmZrYl9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChma3MxYlstMV0gIT0gZmsxYl9iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgZmtzMWI6Iik7IG1wbl9kdW1wIChma3MxYiAtIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmZmsxYl9iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoZmtzMWJbMiAqIG1uICsgMV0gIT0gZmsxYl9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIGZrczFiOiIpOyBtcG5fZHVtcCAoZmtzMWIgKyAyICogbW4gKyAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJmZrMWJfYWZ0ZXIsIDEpOworCSAgICB9CisJICBhYm9ydCgpOworCX0KKworICAgICAgaWYgKG1wbl9jbXAgKGZrczFhLCBma2IsIG1uKSAhPSAwKQorCXsKKwkgIGlmIChtcG5fc3ViX24gKGZrYiwgbXAsIGZrYiwgbW4pIHx8IG1wbl9jbXAgKGZrczFhLCBma2IsIG1uKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1IoaykgaW4gdGVzdCAlZCwgZXhwMiA9ICVsdVxuIiwgdGVzdCwgZXhwMik7CisJICAgICAgbXBuX2R1bXAgKGZrczFhLCBtbik7CisJICAgICAgbXBuX2R1bXAgKGZrYiwgbW4pOworCSAgICAgIG1wbl9kdW1wIChtcCwgbW4pOworCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwkgIHNpZ25mbGlwIF49IDE7CisJfQorCisgICAgICBpZiAobXBuX2NtcCAoZmthLCBma3MxYiwgbW4pICE9IDApCisJeworCSAgaWYgKG1wbl9zdWJfbiAoZmtzMWIsIG1wLCBma3MxYiwgbW4pIHx8IG1wbl9jbXAgKGZrYSwgZmtzMWIsIG1uKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiRVJST1Ioay0xKSBpbiB0ZXN0ICVkLCBleHAyID0gJWx1XG4iLCB0ZXN0LCBleHAyKTsKKwkgICAgICBtcG5fZHVtcCAoZmthLCBtbik7CisJICAgICAgbXBuX2R1bXAgKGZrczFiLCBtbik7CisJICAgICAgbXBuX2R1bXAgKG1wLCBtbik7CisJICAgICAgYWJvcnQoKTsKKwkgICAgfQorCSAgc2lnbmZsaXAgXj0gMTsKKwl9CisKKyAgICAgIGlmIChzaWduZmxpcCAhPSAwICYmICEgbXBuX3plcm9fcCAoZmtzMWIsIG1uKSAmJiAhIG1wbl96ZXJvX3AgKGZrYiwgbW4pKQorCXsKKwkgIGlmICgobXAgWzBdICYgMSkgPT0gMCkgLyogU2hvdWxkIHdlIHRlc3Qgb25seSBvZGQgbW9kdWx1cy1lcz8gKi8KKwkgICAgeworCSAgICAgIGlmICghIG1wbl9sc2hpZnQgKGZrczFiLCBma3MxYiwgbW4sIDEpICYmCisJCSAgbXBuX2NtcCAobXAsIGZrczFiLCBtbikgPT0gMCkKKwkJY29udGludWU7CisJICAgICAgaWYgKCEgbXBuX2xzaGlmdCAoZmtiLCBma2IsIG1uLCAxKSAmJgorCQkgIG1wbl9jbXAgKG1wLCBma2IsIG1uKSA9PSAwKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgcHJpbnRmICgiRVJST1Ioc2lnbikgaW4gdGVzdCAlZCwgZXhwMiA9ICVsdVxuIiwKKwkJICB0ZXN0LCBleHAyKTsKKwkgIGFib3J0KCk7CisJfQorICAgIH0KKyAgVE1QX0ZSRUU7CisgIHJldHVybiAwOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgdGVzdF9maWIyX2ZpYjJtIChjb3VudCAvIDIsIHJhbmRzKTsKKyAgdGVzdF9maWIybV8yZXhwIChjb3VudCAvIDIsIHJhbmRzKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtZ2NkXzExLmMgYi90ZXN0cy9tcG4vdC1nY2RfMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRkZTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtZ2NkXzExLmMKQEAgLTAsMCArMSw4NiBAQAorLyogVGVzdCBtcG5fZ2NkXzExLgorCitDb3B5cmlnaHQgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgQ09VTlQKKyNkZWZpbmUgQ09VTlQgNTAwMDAwCisjZW5kaWYKKworc3RhdGljIHZvaWQKK29uZV90ZXN0IChtcF9saW1iX3QgYSwgbXBfbGltYl90IGIsIG1wX2xpbWJfdCByZWYpCit7CisgIG1wX2xpbWJfdCByID0gbXBuX2djZF8xMSAoYSwgYik7CisgIGlmIChyICE9IHJlZikKKyAgICB7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLAorCQkgICAiZ2NkXzExICgweCVNeCwgMHglTXgpIGZhaWxlZCwgZ290OiAweCVNeCwgcmVmOiAweCVNeFxuIiwKKwkJICAgYSwgYiwgciwgcmVmKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgYSwgYjsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBjb3VudDsgdGVzdCsrKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBhbCwgYmw7CisgICAgICBtcF9iaXRjbnRfdCBhc2l6ZSA9IDEgKyBnbXBfdXJhbmRvbW1fdWkocmFuZHMsIEdNUF9OVU1CX0JJVFMpOworICAgICAgbXBfYml0Y250X3QgYnNpemUgPSAxICsgZ21wX3VyYW5kb21tX3VpKHJhbmRzLCBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIGlmICh0ZXN0ICYgMSkKKwl7CisJICBtcHpfdXJhbmRvbWIgKGEsIHJhbmRzLCBhc2l6ZSk7CisJICBtcHpfdXJhbmRvbWIgKGIsIHJhbmRzLCBic2l6ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIGFzaXplKTsKKwkgIG1wel9ycmFuZG9tYiAoYiwgcmFuZHMsIGJzaXplKTsKKwl9CisKKyAgICAgIG1wel9zZXRiaXQgKGEsIDApOworICAgICAgbXB6X3NldGJpdCAoYiwgMCk7CisgICAgICBhbCA9IG1wel9nZXRsaW1ibiAoYSwgMCk7CisgICAgICBibCA9IG1wel9nZXRsaW1ibiAoYiwgMCk7CisgICAgICBvbmVfdGVzdCAoYWwsIGJsLCByZWZtcG5fZ2NkXzExIChhbCwgYmwpKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtZ2NkXzIyLmMgYi90ZXN0cy9tcG4vdC1nY2RfMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRiZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtZ2NkXzIyLmMKQEAgLTAsMCArMSw4NyBAQAorLyogVGVzdCBtcG5fZ2NkXzIyLgorCitDb3B5cmlnaHQgMjAxOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgQ09VTlQKKyNkZWZpbmUgQ09VTlQgMTUwMDAwCisjZW5kaWYKKworc3RhdGljIHZvaWQKK29uZV90ZXN0IChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYiwgbXB6X3NyY3B0ciByZWYpCit7CisgIG1wX2RvdWJsZV9saW1iX3QgciA9IG1wbl9nY2RfMjIgKG1wel9nZXRsaW1ibiAoYSwgMSksIG1wel9nZXRsaW1ibiAoYSwgMCksCisJCQkJICAgbXB6X2dldGxpbWJuIChiLCAxKSwgbXB6X2dldGxpbWJuIChiLCAwKSk7CisgIGlmIChyLmQwICE9IG1wel9nZXRsaW1ibiAocmVmLCAwKSB8fCByLmQxICE9IG1wel9nZXRsaW1ibiAocmVmLCAxKSkKKyAgICB7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLAorCQkgICAiZ2NkXzIyICgweCVaeCwgMHglWngpIGZhaWxlZCwgZ290OiBnMSA9IDB4JU14IGcwID0gJU14LCByZWY6IDB4JVp4XG4iLAorICAgICAgICAgICAgICAgICAgIGEsIGIsIHIuZDEsIHIuZDAsIHJlZik7CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IGEsIGIsIHJlZjsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIG1wel9pbml0IChyZWYpOworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgY291bnQ7IHRlc3QrKykKKyAgICB7CisgICAgICBtcF9iaXRjbnRfdCBhc2l6ZSA9IDEgKyBnbXBfdXJhbmRvbW1fdWkocmFuZHMsIDIqR01QX05VTUJfQklUUyk7CisgICAgICBtcF9iaXRjbnRfdCBic2l6ZSA9IDEgKyBnbXBfdXJhbmRvbW1fdWkocmFuZHMsIDIqR01QX05VTUJfQklUUyk7CisgICAgICBpZiAodGVzdCAmIDEpCisJeworCSAgbXB6X3VyYW5kb21iIChhLCByYW5kcywgYXNpemUpOworCSAgbXB6X3VyYW5kb21iIChiLCByYW5kcywgYnNpemUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtcHpfcnJhbmRvbWIgKGEsIHJhbmRzLCBhc2l6ZSk7CisJICBtcHpfcnJhbmRvbWIgKGIsIHJhbmRzLCBic2l6ZSk7CisJfQorCisgICAgICBtcHpfc2V0Yml0IChhLCAwKTsKKyAgICAgIG1wel9zZXRiaXQgKGIsIDApOworICAgICAgcmVmbXB6X2djZCAocmVmLCBhLCBiKTsKKyAgICAgIG9uZV90ZXN0IChhLCBiLCByZWYpOworICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGIpOworICBtcHpfY2xlYXIgKHJlZik7CisKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWdjZGV4dF8xLmMgYi90ZXN0cy9tcG4vdC1nY2RleHRfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzNhMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1nY2RleHRfMS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBUZXN0IG1wbl9nY2RleHRfMS4KKworQ29weXJpZ2h0IDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaWZuZGVmIENPVU5UCisjZGVmaW5lIENPVU5UIDI1MDAwMAorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzZXRfc2lnbmVkX2xpbWIgKG1wel90IHIsIG1wX2xpbWJfc2lnbmVkX3QgeCkKK3sKKyAgbXB6X3QgdDsKKyAgbXBfbGltYl90IGFic194ID0gQUJTX0NBU1QobXBfbGltYl90LCB4KTsKKyAgbXB6X3NldCAociwgbXB6X3JvaW5pdF9uICh0LCAmYWJzX3gsIDEpKTsKKyAgaWYgKHggPCAwKQorICAgIG1wel9uZWcgKHIsIHIpOworfQorCitzdGF0aWMgdm9pZAorb25lX3Rlc3QgKG1wX2xpbWJfdCBhLCBtcF9saW1iX3QgYikKK3sKKyAgbXBfbGltYl9zaWduZWRfdCBzLCB0OworICBtcF9saW1iX3QgZzsKKworICBnID0gbXBuX2djZGV4dF8xICgmcywgJnQsIGEsIGIpOworCisgIGlmIChnID4gMCkKKyAgICB7CisgICAgICBtcHpfdCBkLCBzeiwgdHosIHRtcDsKKworICAgICAgbXB6X2luaXQgKGQpOworICAgICAgbXB6X2luaXQgKHN6KTsKKyAgICAgIG1wel9pbml0ICh0eik7CisKKyAgICAgIHNldF9zaWduZWRfbGltYiAoc3osIHMpOworICAgICAgc2V0X3NpZ25lZF9saW1iICh0eiwgdCk7CisKKyAgICAgIG1wel9tdWwgKGQsIG1wel9yb2luaXRfbiAodG1wLCAmYSwgMSksIHN6KTsKKyAgICAgIG1wel9hZGRtdWwgKGQsIG1wel9yb2luaXRfbiAodG1wLCAmYiwgMSksIHR6KTsKKworICAgICAgaWYgKG1wel9jbXAgKGQsIG1wel9yb2luaXRfbiAodG1wLCAmZywgMSkpID09IDAKKwkgICYmIGEgJSBnID09IDAgJiYgYiAlIGcgPT0gMCkKKwl7CisJICBtcF9saW1iX3QgYV9kaXZfZyA9IGEgLyBnOworCSAgbXBfbGltYl90IGJfZGl2X2cgPSBiIC8gZzsKKwkgIG1wX2xpbWJfdCBhYnNfcyA9IEFCU19DQVNUKG1wX2xpbWJfdCwgcyk7CisJICBtcF9saW1iX3QgYWJzX3QgPSBBQlNfQ0FTVChtcF9saW1iX3QsIHQpOworCSAgbXB6X211bF91aSAoc3osIHN6LCAyKTsKKwkgIG1wel9tdWxfdWkgKHR6LCB0eiwgMik7CisJICBpZiAoKGFic19zID09IDEgfHwgbXB6X2NtcGFicyAoc3osIG1wel9yb2luaXRfbiAodG1wLCAmYl9kaXZfZywgMSkpIDwgMCkKKwkgICAgICAgJiYgKGFic190ID09IDEgfHwgbXB6X2NtcGFicyAodHosIG1wel9yb2luaXRfbiAodG1wLCAmYV9kaXZfZywgMSkpIDwgMCkpCisJICAgIHsKKwkgICAgICBtcHpfY2xlYXIgKGQpOworCSAgICAgIG1wel9jbGVhciAoc3opOworCSAgICAgIG1wel9jbGVhciAodHopOworCisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKyAgZ21wX2ZwcmludGYgKHN0ZGVyciwKKwkgICAgICAgImdjZGV4dF8xICgweCVNeCwgMHglTXgpIGZhaWxlZCwgZ290OiBnID0gMHglTXgsIHMgPSAlczB4JU14LCB0ID0gJXMweCVNeFxuIiwKKwkgICAgICAgYSwgYiwgZywKKwkgICAgICAgcyA8IDAgPyAiLSIgOiAiIiwgQUJTX0NBU1QobXBfbGltYl90LCBzKSwKKwkgICAgICAgdCA8IDAgPyAiLSIgOiAiIiwgQUJTX0NBU1QobXBfbGltYl90LCB0KSk7CisgIGFib3J0KCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBhLCBiOworICBpbnQgY291bnQgPSBDT1VOVDsKKyAgaW50IHRlc3Q7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChiKTsKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IGNvdW50OyB0ZXN0KyspCisgICAgeworICAgICAgbXBfbGltYl90IGFsLCBibDsKKyAgICAgIG1wX2JpdGNudF90IGFzaXplID0gMSArIGdtcF91cmFuZG9tbV91aShyYW5kcywgR01QX05VTUJfQklUUyk7CisgICAgICBtcF9iaXRjbnRfdCBic2l6ZSA9IDEgKyBnbXBfdXJhbmRvbW1fdWkocmFuZHMsIEdNUF9OVU1CX0JJVFMpOworICAgICAgaWYgKHRlc3QgJiAxKQorCXsKKwkgIG1wel91cmFuZG9tYiAoYSwgcmFuZHMsIGFzaXplKTsKKwkgIG1wel91cmFuZG9tYiAoYiwgcmFuZHMsIGJzaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXB6X3JyYW5kb21iIChhLCByYW5kcywgYXNpemUpOworCSAgbXB6X3JyYW5kb21iIChiLCByYW5kcywgYnNpemUpOworCX0KKworICAgICAgYWwgPSBtcHpfZ2V0bGltYm4gKGEsIDApOworICAgICAgYmwgPSBtcHpfZ2V0bGltYm4gKGIsIDApOworICAgICAgYWwgKz0gKGFsID09IDApOworICAgICAgYmwgKz0gKGJsID09IDApOworCisgICAgICBvbmVfdGVzdCAoYWwsIGJsKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtZ2V0X2QuYyBiL3Rlc3RzL21wbi90LWdldF9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwZTJlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LWdldF9kLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qIFRlc3QgbXBuX2dldF9kLgorCitDb3B5cmlnaHQgMjAwMi0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKyNpZm5kZWYgX0dNUF9JRUVFX0ZMT0FUUworI2RlZmluZSBfR01QX0lFRUVfRkxPQVRTIDAKKyNlbmRpZgorCisKKy8qIEV4ZXJjaXNlIHZhcmlvdXMgMl5uIHZhbHVlcywgd2l0aCB2YXJpb3VzIGV4cG9uZW50cyBhbmQgcG9zaXRpdmUgYW5kCisgICBuZWdhdGl2ZS4gICovCit2b2lkCitjaGVja19vbmViaXQgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBpbnQgYml0X3RhYmxlW10gPSB7CisgICAgMCwgMSwgMiwgMywKKyAgICBHTVBfTlVNQl9CSVRTIC0gMiwgR01QX05VTUJfQklUUyAtIDEsCisgICAgR01QX05VTUJfQklUUywKKyAgICBHTVBfTlVNQl9CSVRTICsgMSwgR01QX05VTUJfQklUUyArIDIsCisgICAgMiAqIEdNUF9OVU1CX0JJVFMgLSAyLCAyICogR01QX05VTUJfQklUUyAtIDEsCisgICAgMiAqIEdNUF9OVU1CX0JJVFMsCisgICAgMiAqIEdNUF9OVU1CX0JJVFMgKyAxLCAyICogR01QX05VTUJfQklUUyArIDIsCisgICAgMyAqIEdNUF9OVU1CX0JJVFMgLSAyLCAzICogR01QX05VTUJfQklUUyAtIDEsCisgICAgMyAqIEdNUF9OVU1CX0JJVFMsCisgICAgMyAqIEdNUF9OVU1CX0JJVFMgKyAxLCAzICogR01QX05VTUJfQklUUyArIDIsCisgICAgNCAqIEdNUF9OVU1CX0JJVFMgLSAyLCA0ICogR01QX05VTUJfQklUUyAtIDEsCisgICAgNCAqIEdNUF9OVU1CX0JJVFMsCisgICAgNCAqIEdNUF9OVU1CX0JJVFMgKyAxLCA0ICogR01QX05VTUJfQklUUyArIDIsCisgICAgNSAqIEdNUF9OVU1CX0JJVFMgLSAyLCA1ICogR01QX05VTUJfQklUUyAtIDEsCisgICAgNSAqIEdNUF9OVU1CX0JJVFMsCisgICAgNSAqIEdNUF9OVU1CX0JJVFMgKyAxLCA1ICogR01QX05VTUJfQklUUyArIDIsCisgICAgNiAqIEdNUF9OVU1CX0JJVFMgLSAyLCA2ICogR01QX05VTUJfQklUUyAtIDEsCisgICAgNiAqIEdNUF9OVU1CX0JJVFMsCisgICAgNiAqIEdNUF9OVU1CX0JJVFMgKyAxLCA2ICogR01QX05VTUJfQklUUyArIDIsCisgIH07CisgIHN0YXRpYyBjb25zdCBpbnQgZXhwX3RhYmxlW10gPSB7CisgICAgMCwgLTEwMCwgLTEwLCAtMSwgMSwgMTAsIDEwMCwKKyAgfTsKKworICAvKiBGSVhNRTogSXQnZCBiZSBiZXR0ZXIgdG8gYmFzZSB0aGlzIG9uIHRoZSBmbG9hdCBmb3JtYXQuICovCisjaWYgZGVmaW5lZCAoX192YXgpIHx8IGRlZmluZWQgKF9fdmF4X18pCisgIGludCAgICAgbGltaXQgPSAxMjc7ICAvKiB2YXggZnAgbnVtYmVycyBoYXZlIGxpbWl0ZWQgcmFuZ2UgKi8KKyNlbHNlCisgIGludCAgICAgbGltaXQgPSA1MTE7CisjZW5kaWYKKworICBpbnQgICAgICAgIGJpdF9pLCBleHBfaSwgaTsKKyAgZG91YmxlICAgICBnb3QsIHdhbnQ7CisgIG1wX3NpemVfdCAgbnNpemUsIHNpZ247CisgIGxvbmcgICAgICAgYml0LCBleHAsIHdhbnRfYml0OworICBtcF9saW1iX3QgIG5wWzIwXTsKKworICBmb3IgKGJpdF9pID0gMDsgYml0X2kgPCBudW1iZXJvZiAoYml0X3RhYmxlKTsgYml0X2krKykKKyAgICB7CisgICAgICBiaXQgPSBiaXRfdGFibGVbYml0X2ldOworCisgICAgICBuc2l6ZSA9IEJJVFNfVE9fTElNQlMgKGJpdCsxKTsKKyAgICAgIHJlZm1wbl96ZXJvIChucCwgbnNpemUpOworICAgICAgbnBbYml0L0dNUF9OVU1CX0JJVFNdID0gQ05TVF9MSU1CKDEpIDw8IChiaXQgJSBHTVBfTlVNQl9CSVRTKTsKKworICAgICAgZm9yIChleHBfaSA9IDA7IGV4cF9pIDwgbnVtYmVyb2YgKGV4cF90YWJsZSk7IGV4cF9pKyspCisgICAgICAgIHsKKyAgICAgICAgICBleHAgPSBleHBfdGFibGVbZXhwX2ldOworCisgICAgICAgICAgd2FudF9iaXQgPSBiaXQgKyBleHA7CisgICAgICAgICAgaWYgKHdhbnRfYml0ID49IGxpbWl0IHx8IHdhbnRfYml0IDw9IC1saW1pdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgd2FudCA9IDEuMDsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2FudF9iaXQ7IGkrKykKKyAgICAgICAgICAgIHdhbnQgKj0gMi4wOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPiB3YW50X2JpdDsgaS0tKQorICAgICAgICAgICAgd2FudCAqPSAwLjU7CisKKyAgICAgICAgICBmb3IgKHNpZ24gPSAwOyBzaWduID49IC0xOyBzaWduLS0sIHdhbnQgPSAtd2FudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ290ID0gbXBuX2dldF9kIChucCwgbnNpemUsIHNpZ24sIGV4cCk7CisgICAgICAgICAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgICAgKCJtcG5fZ2V0X2Qgd3Jvbmcgb24gMl5uXG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIGJpdCAgICAgICVsZFxuIiwgYml0KTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIGV4cCAgICAgICVsZFxuIiwgZXhwKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIHdhbnRfYml0ICVsZFxuIiwgd2FudF9iaXQpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgc2lnbiAgICAgJWxkXG4iLCAobG9uZykgc2lnbik7CisgICAgICAgICAgICAgICAgICBtcG5fdHJhY2UgKCIgICBuICAgICAgICAiLCBucCwgbnNpemUpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgbnNpemUgICAgJWxkXG4iLCAobG9uZykgbnNpemUpOworICAgICAgICAgICAgICAgICAgZF90cmFjZSAgICgiICAgd2FudCAgICAgIiwgd2FudCk7CisgICAgICAgICAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICAgICAiLCBnb3QpOworICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogRXhlcmNpc2UgdmFsdWVzIDJebisxLCB3aGlsZSBzdWNoIGEgdmFsdWUgZml0cyB0aGUgbWFudGlzc2Egb2YgYSBkb3VibGUuICovCit2b2lkCitjaGVja190d29iaXQgKHZvaWQpCit7CisgIGludCAgICAgICAgaSwgbWFudF9iaXRzOworICBkb3VibGUgICAgIGdvdCwgd2FudDsKKyAgbXBfc2l6ZV90ICBuc2l6ZSwgc2lnbjsKKyAgbXBfcHRyICAgICBucDsKKworICBtYW50X2JpdHMgPSB0ZXN0c19kYmxfbWFudF9iaXRzICgpOworICBpZiAobWFudF9iaXRzID09IDApCisgICAgcmV0dXJuOworCisgIG5wID0gcmVmbXBuX21hbGxvY19saW1icyAoQklUU19UT19MSU1CUyAobWFudF9iaXRzKSk7CisgIHdhbnQgPSAzLjA7CisgIGZvciAoaSA9IDE7IGkgPCBtYW50X2JpdHM7IGkrKykKKyAgICB7CisgICAgICBuc2l6ZSA9IEJJVFNfVE9fTElNQlMgKGkrMSk7CisgICAgICByZWZtcG5femVybyAobnAsIG5zaXplKTsKKyAgICAgIG5wW2kvR01QX05VTUJfQklUU10gPSBDTlNUX0xJTUIoMSkgPDwgKGkgJSBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIG5wWzBdIHw9IDE7CisKKyAgICAgIGZvciAoc2lnbiA9IDA7IHNpZ24gPj0gLTE7IHNpZ24tLSkKKyAgICAgICAgeworICAgICAgICAgIGdvdCA9IG1wbl9nZXRfZCAobnAsIG5zaXplLCBzaWduLCAwKTsKKyAgICAgICAgICBpZiAoZ290ICE9IHdhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIm1wbl9nZXRfZCB3cm9uZyBvbiAyXiVkICsgMVxuIiwgaSk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIHNpZ24gICAgICVsZFxuIiwgKGxvbmcpIHNpZ24pOworICAgICAgICAgICAgICBtcG5fdHJhY2UgKCIgICBuICAgICAgICAiLCBucCwgbnNpemUpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICBuc2l6ZSAgICAlbGRcbiIsIChsb25nKSBuc2l6ZSk7CisgICAgICAgICAgICAgIGRfdHJhY2UgICAoIiAgIHdhbnQgICAgICIsIHdhbnQpOworICAgICAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICAgICAiLCBnb3QpOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIHdhbnQgPSAtd2FudDsKKyAgICAgICAgfQorCisgICAgICB3YW50ID0gMi4wICogd2FudCAtIDEuMDsKKyAgICB9CisKKyAgZnJlZSAobnApOworfQorCisKKy8qIEV4cGVjdCBsYXJnZSBuZWdhdGl2ZSBleHBvbmVudHMgdG8gdW5kZXJmbG93IHRvIDAuMC4KKyAgIFNvbWUgc3lzdGVtcyBtaWdodCBoYXZlIGhhcmR3YXJlIHRyYXBzIGZvciBzdWNoIGFuIHVuZGVyZmxvdyAodGhvdWdoCisgICB1c3VhbGx5IGl0J3Mgbm90IHRoZSBkZWZhdWx0KSwgc28gd2F0Y2ggb3V0IGZvciBTSUdGUEUuICovCit2b2lkCitjaGVja191bmRlcmZsb3cgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBsb25nIGV4cF90YWJsZVtdID0geworICAgIC05OTk5OTlMLCBMT05HX01JTiwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IG1wX2xpbWJfdCAgbnBbMV0gPSB7IDEgfTsKKworICBzdGF0aWMgbG9uZyBleHA7CisgIG1wX3NpemVfdCAgbnNpemUsIHNpZ247CisgIGRvdWJsZSAgICAgZ290OworICBpbnQgICAgICAgIGV4cF9pOworCisgIG5zaXplID0gbnVtYmVyb2YgKG5wKTsKKworICBpZiAodGVzdHNfc2V0am1wX3NpZ2ZwZSgpID09IDApCisgICAgeworICAgICAgZm9yIChleHBfaSA9IDA7IGV4cF9pIDwgbnVtYmVyb2YgKGV4cF90YWJsZSk7IGV4cF9pKyspCisgICAgICAgIHsKKyAgICAgICAgICBleHAgPSBleHBfdGFibGVbZXhwX2ldOworCisgICAgICAgICAgZm9yIChzaWduID0gMDsgc2lnbiA+PSAtMTsgc2lnbi0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnb3QgPSBtcG5fZ2V0X2QgKG5wLCBuc2l6ZSwgc2lnbiwgZXhwKTsKKyAgICAgICAgICAgICAgaWYgKGdvdCAhPSAwLjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRmICAoIm1wbl9nZXRfZCB3cm9uZywgZGlkbid0IGdldCAwLjAgb24gdW5kZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCIgIG5zaXplICAgICVsZFxuIiwgKGxvbmcpIG5zaXplKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCIgIGV4cCAgICAgICVsZFxuIiwgZXhwKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCIgIHNpZ24gICAgICVsZFxuIiwgKGxvbmcpIHNpZ24pOworICAgICAgICAgICAgICAgICAgZF90cmFjZSAoIiAgZ290ICAgICAgIiwgZ290KTsKKyAgICAgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIldhcm5pbmcsIHVuZGVyZmxvdyB0byB6ZXJvIHRlc3RzIHNraXBwZWQgZHVlIHRvIFNJR0ZQRSAoZXhwPSVsZClcbiIsIGV4cCk7CisgICAgfQorICB0ZXN0c19zaWdmcGVfZG9uZSAoKTsKK30KKworCisvKiBFeHBlY3QgbGFyZ2UgdmFsdWVzIHRvIHJlc3VsdCBpbiArLy1pbmYsIG9uIElFRUUgc3lzdGVtcy4gKi8KK3ZvaWQKK2NoZWNrX2luZiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGxvbmcgZXhwX3RhYmxlW10gPSB7CisgICAgOTk5OTk5TCwgTE9OR19NQVgsCisgIH07CisgIHN0YXRpYyBjb25zdCBtcF9saW1iX3QgIG5wWzRdID0geyAxLCAxLCAxLCAxIH07CisgIGxvbmcgICAgICAgZXhwOworICBtcF9zaXplX3QgIG5zaXplLCBzaWduLCBnb3Rfc2lnbjsKKyAgZG91YmxlICAgICBnb3Q7CisgIGludCAgICAgICAgZXhwX2k7CisKKyAgaWYgKCEgX0dNUF9JRUVFX0ZMT0FUUykKKyAgICByZXR1cm47CisKKyAgZm9yIChuc2l6ZSA9IDE7IG5zaXplIDw9IG51bWJlcm9mIChucCk7IG5zaXplKyspCisgICAgeworICAgICAgZm9yIChleHBfaSA9IDA7IGV4cF9pIDwgbnVtYmVyb2YgKGV4cF90YWJsZSk7IGV4cF9pKyspCisgICAgICAgIHsKKyAgICAgICAgICBleHAgPSBleHBfdGFibGVbZXhwX2ldOworCisgICAgICAgICAgZm9yIChzaWduID0gMDsgc2lnbiA+PSAtMTsgc2lnbi0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnb3QgPSBtcG5fZ2V0X2QgKG5wLCBuc2l6ZSwgc2lnbiwgZXhwKTsKKyAgICAgICAgICAgICAgZ290X3NpZ24gPSAoZ290ID49IDAgPyAwIDogLTEpOworICAgICAgICAgICAgICBpZiAoISB0ZXN0c19pc2luZiAoZ290KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgibXBuX2dldF9kIHdyb25nLCBkaWRuJ3QgZ2V0IGluZmluaXR5XG4iKTsKKyAgICAgICAgICAgICAgICBiYWQ6CisgICAgICAgICAgICAgICAgICBwcmludGYgICgiICBuc2l6ZSAgICAlbGRcbiIsIChsb25nKSBuc2l6ZSk7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgiICBleHAgICAgICAlbGRcbiIsIGV4cCk7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgiICBzaWduICAgICAlbGRcbiIsIChsb25nKSBzaWduKTsKKyAgICAgICAgICAgICAgICAgIGRfdHJhY2UgKCIgIGdvdCAgICAgICIsIGdvdCk7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgiICBnb3Qgc2lnbiAlbGRcbiIsIChsb25nKSBnb3Rfc2lnbik7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChnb3Rfc2lnbiAhPSBzaWduKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCJtcG5fZ2V0X2Qgd3Jvbmcgc2lnbiBvbiBpbmZpbml0eVxuIik7CisgICAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENoZWNrIHZhbHVlcyAyXm4gYXBwcm9hY2hpbmcgYW5kIGludG8gSUVFRSBkZW5vcm0gcmFuZ2UuCisgICBTb21lIHN5c3RlbXMgbWlnaHQgbm90IHN1cHBvcnQgZGVub3Jtcywgb3IgbWlnaHQgaGF2ZSB0cmFwcyBzZXR1cCwgc28KKyAgIHdhdGNoIG91dCBmb3IgU0lHRlBFLiAgKi8KK3ZvaWQKK2NoZWNrX2llZWVfZGVub3JtICh2b2lkKQoreworICBzdGF0aWMgbG9uZyBleHA7CisgIG1wX2xpbWJfdCAgbiA9IDE7CisgIGxvbmcgICAgICAgaTsKKyAgbXBfc2l6ZV90ICBzaWduOworICBkb3VibGUgICAgIHdhbnQsIGdvdDsKKworICBpZiAoISBfR01QX0lFRUVfRkxPQVRTKQorICAgIHJldHVybjsKKworICBpZiAodGVzdHNfc2V0am1wX3NpZ2ZwZSgpID09IDApCisgICAgeworICAgICAgZXhwID0gLTEwMjA7CisgICAgICB3YW50ID0gMS4wOworICAgICAgZm9yIChpID0gMDsgaSA+IGV4cDsgaS0tKQorICAgICAgICB3YW50ICo9IDAuNTsKKworICAgICAgZm9yICggOyBleHAgPiAtMTUwMCAmJiB3YW50ICE9IDAuMDsgZXhwLS0pCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKHNpZ24gPSAwOyBzaWduID49IC0xOyBzaWduLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdvdCA9IG1wbl9nZXRfZCAoJm4sIChtcF9zaXplX3QpIDEsIHNpZ24sIGV4cCk7CisgICAgICAgICAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgibXBuX2dldF9kIHdyb25nIG9uIGRlbm9ybVxuIik7CisgICAgICAgICAgICAgICAgICBwcmludGYgICgiICBuPTFcbiIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAoIiAgZXhwICAgJWxkXG4iLCBleHApOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAoIiAgc2lnbiAgJWxkXG4iLCAobG9uZykgc2lnbik7CisgICAgICAgICAgICAgICAgICBkX3RyYWNlICgiICBnb3QgICAiLCBnb3QpOworICAgICAgICAgICAgICAgICAgZF90cmFjZSAoIiAgd2FudCAgIiwgd2FudCk7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHdhbnQgPSAtd2FudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB3YW50ICo9IDAuNTsKKyAgICAgICAgICBGT1JDRV9ET1VCTEUgKHdhbnQpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiV2FybmluZywgSUVFRSBkZW5vcm0gdGVzdHMgc2tpcHBlZCBkdWUgdG8gU0lHRlBFIChleHA9JWxkKVxuIiwgZXhwKTsKKyAgICB9CisgIHRlc3RzX3NpZ2ZwZV9kb25lICgpOworfQorCisKKy8qIENoZWNrIHZhbHVlcyAyXm4gYXBwcm9hY2hpbmcgZXhwb25lbnQgb3ZlcmZsb3cuCisgICBTb21lIHN5c3RlbXMgbWlnaHQgdHJhcCBvbiBvdmVyZmxvdywgc28gd2F0Y2ggb3V0IGZvciBTSUdGUEUuICAqLwordm9pZAorY2hlY2tfaWVlZV9vdmVyZmxvdyAodm9pZCkKK3sKKyAgc3RhdGljIGxvbmcgZXhwOworICBtcF9saW1iX3QgIG4gPSAxOworICBsb25nICAgICAgIGk7CisgIG1wX3NpemVfdCAgc2lnbjsKKyAgZG91YmxlICAgICB3YW50LCBnb3Q7CisKKyAgaWYgKCEgX0dNUF9JRUVFX0ZMT0FUUykKKyAgICByZXR1cm47CisKKyAgaWYgKHRlc3RzX3NldGptcF9zaWdmcGUoKSA9PSAwKQorICAgIHsKKyAgICAgIGV4cCA9IDEwMTA7CisgICAgICB3YW50ID0gMS4wOworICAgICAgZm9yIChpID0gMDsgaSA8IGV4cDsgaSsrKQorICAgICAgICB3YW50ICo9IDIuMDsKKworICAgICAgZm9yICggOyBleHAgPCAxMDUwOyBleHArKykKKyAgICAgICAgeworICAgICAgICAgIGZvciAoc2lnbiA9IDA7IHNpZ24gPj0gLTE7IHNpZ24tLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ290ID0gbXBuX2dldF9kICgmbiwgKG1wX3NpemVfdCkgMSwgc2lnbiwgZXhwKTsKKyAgICAgICAgICAgICAgaWYgKGdvdCAhPSB3YW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCJtcG5fZ2V0X2Qgd3Jvbmcgb24gb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgcHJpbnRmICAoIiAgbj0xXG4iKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCIgIGV4cCAgICVsZFxuIiwgZXhwKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAgKCIgIHNpZ24gICVsZFxuIiwgKGxvbmcpIHNpZ24pOworICAgICAgICAgICAgICAgICAgZF90cmFjZSAoIiAgZ290ICAgIiwgZ290KTsKKyAgICAgICAgICAgICAgICAgIGRfdHJhY2UgKCIgIHdhbnQgICIsIHdhbnQpOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB3YW50ID0gLXdhbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgd2FudCAqPSAyLjA7CisgICAgICAgICAgRk9SQ0VfRE9VQkxFICh3YW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZiAoIldhcm5pbmcsIElFRUUgb3ZlcmZsb3cgdGVzdHMgc2tpcHBlZCBkdWUgdG8gU0lHRlBFIChleHA9JWxkKVxuIiwgZXhwKTsKKyAgICB9CisgIHRlc3RzX3NpZ2ZwZV9kb25lICgpOworfQorCisKKy8qIEFSTSBnY2MgMi45NS40IHdhcyBzZWVuIGdlbmVyYXRpbmcgYmFkIGNvZGUgZm9yIHVsb25nLT5kb3VibGUKKyAgIGNvbnZlcnNpb25zLCByZXN1bHRpbmcgaW4gZm9yIGluc3RhbmNlIDB4ODFjMjUxMTMgaW5jb3JyZWN0bHkgY29udmVydGVkLgorICAgVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGF0IHZhbHVlLCB0byBzZWUgbXBuX2dldF9kIGhhcyBhdm9pZGVkIHRoZQorICAgcHJvYmxlbS4gICovCit2b2lkCitjaGVja18weDgxYzI1MTEzICh2b2lkKQoreworI2lmIEdNUF9OVU1CX0JJVFMgPj0gMzIKKyAgZG91YmxlICAgICB3YW50ID0gMjE3Njk5NTYwMy4wOworICBkb3VibGUgICAgIGdvdDsKKyAgbXBfbGltYl90ICBucFs0XTsKKyAgbXBfc2l6ZV90ICBuc2l6ZTsKKyAgbG9uZyAgICAgICBleHA7CisKKyAgaWYgKHRlc3RzX2RibF9tYW50X2JpdHMoKSA8IDMyKQorICAgIHJldHVybjsKKworICBmb3IgKG5zaXplID0gMTsgbnNpemUgPD0gbnVtYmVyb2YgKG5wKTsgbnNpemUrKykKKyAgICB7CisgICAgICByZWZtcG5femVybyAobnAsIG5zaXplLTEpOworICAgICAgbnBbbnNpemUtMV0gPSBDTlNUX0xJTUIoMHg4MWMyNTExMyk7CisgICAgICBleHAgPSAtIChuc2l6ZS0xKSAqIEdNUF9OVU1CX0JJVFM7CisgICAgICBnb3QgPSBtcG5fZ2V0X2QgKG5wLCBuc2l6ZSwgKG1wX3NpemVfdCkgMCwgZXhwKTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAgKCJtcG5fZ2V0X2Qgd3Jvbmcgb24gMjE3Njk5NTYwMyAoMHg4MWMyNTExMylcbiIpOworICAgICAgICAgIHByaW50ZiAgKCIgIG5zaXplICAlbGRcbiIsIChsb25nKSBuc2l6ZSk7CisgICAgICAgICAgcHJpbnRmICAoIiAgZXhwICAgICVsZFxuIiwgZXhwKTsKKyAgICAgICAgICBkX3RyYWNlICgiICBnb3QgICAgIiwgZ290KTsKKyAgICAgICAgICBkX3RyYWNlICgiICB3YW50ICAgIiwgd2FudCk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworCit2b2lkCitjaGVja19yYW5kICh2b2lkKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBpbnQgICAgICAgICAgICByZXAsIGk7CisgIHVuc2lnbmVkIGxvbmcgIG1hbnRfYml0czsKKyAgbG9uZyAgICAgICAgICAgZXhwLCBleHBfbWluLCBleHBfbWF4OworICBkb3VibGUgICAgICAgICBnb3QsIHdhbnQsIGQ7CisgIG1wX3NpemVfdCAgICAgIG5hbGxvYywgbnNpemUsIHNpZ247CisgIG1wX2xpbWJfdCAgICAgIG5oaWdoX21hc2s7CisgIG1wX3B0ciAgICAgICAgIG5wOworCisgIG1hbnRfYml0cyA9IHRlc3RzX2RibF9tYW50X2JpdHMgKCk7CisgIGlmIChtYW50X2JpdHMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogQWxsb3cgZm9yIHZheCBEIGZvcm1hdCB3aXRoIGV4cG9uZW50IDEyNyB0byAtMTI4IG9ubHkuCisgICAgIEZJWE1FOiBEbyBzb21ldGhpbmcgdG8gcHJvYmUgZm9yIGEgdmFsaWQgZXhwb25lbnQgcmFuZ2UuICAqLworICBleHBfbWluID0gLTEwMCAtIG1hbnRfYml0czsKKyAgZXhwX21heCA9ICAxMDAgLSBtYW50X2JpdHM7CisKKyAgLyogc3BhY2UgZm9yIG1hbnRfYml0cyAqLworICBuYWxsb2MgPSBCSVRTX1RPX0xJTUJTIChtYW50X2JpdHMpOworICBucCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG5hbGxvYyk7CisgIG5oaWdoX21hc2sgPSBNUF9MSU1CX1RfTUFYCisgICAgPj4gKEdNUF9OQUlMX0JJVFMgKyBuYWxsb2MgKiBHTVBfTlVNQl9CSVRTIC0gbWFudF9iaXRzKTsKKworICBmb3IgKHJlcCA9IDA7IHJlcCA8IDIwMDsgcmVwKyspCisgICAgeworICAgICAgLyogcmFuZG9tIGV4cF9taW4gdG8gZXhwX21heCwgaW5jbHVzaXZlICovCisgICAgICBleHAgPSBleHBfbWluICsgKGxvbmcpIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIGV4cF9tYXggLSBleHBfbWluICsgMSk7CisKKyAgICAgIC8qIG1hbnRfYml0cyB3b3J0aCBvZiByYW5kb20gYXQgbnAgKi8KKyAgICAgIGlmIChyZXAgJiAxKQorICAgICAgICBtcG5fcmFuZG9tIChucCwgbmFsbG9jKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbXBuX3JhbmRvbTIgKG5wLCBuYWxsb2MpOworICAgICAgbnNpemUgPSBuYWxsb2M7CisgICAgICBucFtuc2l6ZS0xXSAmPSBuaGlnaF9tYXNrOworICAgICAgTVBOX05PUk1BTElaRSAobnAsIG5zaXplKTsKKyAgICAgIGlmIChuc2l6ZSA9PSAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc2lnbiA9IChtcF9zaXplX3QpIGdtcF91cmFuZG9tYl91aSAocmFuZHMsIDFMKSAtIDE7CisKKyAgICAgIC8qIHdhbnQgPSB7bnAsbnNpemV9LCBjb252ZXJ0aW5nIG9uZSBiaXQgYXQgYSB0aW1lICovCisgICAgICB3YW50ID0gMC4wOworICAgICAgZm9yIChpID0gMCwgZCA9IDEuMDsgaSA8IG1hbnRfYml0czsgaSsrLCBkICo9IDIuMCkKKyAgICAgICAgaWYgKG5wW2kvR01QX05VTUJfQklUU10gJiAoQ05TVF9MSU1CKDEpIDw8IChpJUdNUF9OVU1CX0JJVFMpKSkKKyAgICAgICAgICB3YW50ICs9IGQ7CisgICAgICBpZiAoc2lnbiA8IDApCisgICAgICAgIHdhbnQgPSAtd2FudDsKKworICAgICAgLyogd2FudCA9IHdhbnQgKiAyXmV4cCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGV4cDsgaSsrKQorICAgICAgICB3YW50ICo9IDIuMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPiBleHA7IGktLSkKKyAgICAgICAgd2FudCAqPSAwLjU7CisKKyAgICAgIGdvdCA9IG1wbl9nZXRfZCAobnAsIG5zaXplLCBzaWduLCBleHApOworCisgICAgICBpZiAoZ290ICE9IHdhbnQpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgICAgKCJtcG5fZ2V0X2Qgd3Jvbmcgb24gcmFuZG9tIGRhdGFcbiIpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIHNpZ24gICAgICVsZFxuIiwgKGxvbmcpIHNpZ24pOworICAgICAgICAgIG1wbl90cmFjZSAoIiAgIG4gICAgICAgICIsIG5wLCBuc2l6ZSk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgbnNpemUgICAgJWxkXG4iLCAobG9uZykgbnNpemUpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIGV4cCAgICAgICVsZFxuIiwgZXhwKTsKKyAgICAgICAgICBkX3RyYWNlICAgKCIgICB3YW50ICAgICAiLCB3YW50KTsKKyAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICAgICAiLCBnb3QpOworICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgZnJlZSAobnApOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgY2hlY2tfb25lYml0ICgpOworICBjaGVja190d29iaXQgKCk7CisgIGNoZWNrX2luZiAoKTsKKyAgY2hlY2tfdW5kZXJmbG93ICgpOworICBjaGVja19pZWVlX2Rlbm9ybSAoKTsKKyAgY2hlY2tfaWVlZV9vdmVyZmxvdyAoKTsKKyAgY2hlY2tfMHg4MWMyNTExMyAoKTsKKyNpZiAhIChkZWZpbmVkIChfX3ZheCkgfHwgZGVmaW5lZCAoX192YXhfXykpCisgIGNoZWNrX3JhbmQgKCk7CisjZW5kaWYKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtaGdjZC5jIGIvdGVzdHMvbXBuL3QtaGdjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjgzZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1oZ2NkLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qIFRlc3QgbXBuX2hnY2QuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworc3RhdGljIG1wX3NpemVfdCBvbmVfdGVzdCAobXB6X3QsIG1wel90LCBpbnQpOworc3RhdGljIHZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCisjZGVmaW5lIE1JTl9PUEVSQU5EX1NJWkUgMgorCisvKiBGaXhlZCB2YWx1ZXMsIGZvciByZWdyZXNzaW9uIHRlc3Rpbmcgb2YgbXBuX2hnY2QuICovCitzdHJ1Y3QgdmFsdWUgeyBpbnQgcmVzOyBjb25zdCBjaGFyICphOyBjb25zdCBjaGFyICpiOyB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZSBoZ2NkX3ZhbHVlc1tdID0geworI2lmIEdNUF9OVU1CX0JJVFMgPT0gMzIKKyAgeyA1LAorICAgICIweDFiZGRmZjg2NzI3MmE5Mjk2YWM0OTNjMjUxZDdmNDZmMDlhNTU5MWZlIiwKKyAgICAiMHhiNTU5MzBhMmE2OGE5MTY0NTBhN2RlMDA2MDMxMDY4YzVkZGIwZTVjIiB9LAorICB7IDQsCisgICAgIjB4MmYwZWNlNWIxZWU5YzE1ZTEzMmEwMWQ1NTc2OGRjMTMiLAorICAgICIweDFjNmY0ZmQ5ODczY2RiMjQ0NjZlNmQwM2UxY2M2NmU3IiB9LAorICB7IDMsICIweDdGRkZGQzAwM0ZGRkZGRkZGRkM1IiwgIjB4M0ZGRkZFMDAxRkZGRkZGRkZGRTMifSwKKyNlbmRpZgorICB7IC0xLCBOVUxMLCBOVUxMIH0KK307CisKK3N0cnVjdCBoZ2NkX3JlZgoreworICBtcHpfdCBtWzJdWzJdOworfTsKKworc3RhdGljIHZvaWQgaGdjZF9yZWZfaW5pdCAoc3RydWN0IGhnY2RfcmVmICopOworc3RhdGljIHZvaWQgaGdjZF9yZWZfY2xlYXIgKHN0cnVjdCBoZ2NkX3JlZiAqKTsKK3N0YXRpYyBpbnQgaGdjZF9yZWYgKHN0cnVjdCBoZ2NkX3JlZiAqLCBtcHpfdCwgbXB6X3QpOworc3RhdGljIGludCBoZ2NkX3JlZl9lcXVhbCAoY29uc3Qgc3RydWN0IGhnY2RfbWF0cml4ICosIGNvbnN0IHN0cnVjdCBoZ2NkX3JlZiAqKTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IG9wMSwgb3AyLCB0ZW1wMSwgdGVtcDI7CisgIGludCBpLCBqLCBjaGFpbl9sZW47CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisgIG1wel9pbml0IChvcDEpOworICBtcHpfaW5pdCAob3AyKTsKKyAgbXB6X2luaXQgKHRlbXAxKTsKKyAgbXB6X2luaXQgKHRlbXAyKTsKKworICBmb3IgKGkgPSAwOyBoZ2NkX3ZhbHVlc1tpXS5yZXMgPj0gMDsgaSsrKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCByZXM7CisKKyAgICAgIG1wel9zZXRfc3RyIChvcDEsIGhnY2RfdmFsdWVzW2ldLmEsIDApOworICAgICAgbXB6X3NldF9zdHIgKG9wMiwgaGdjZF92YWx1ZXNbaV0uYiwgMCk7CisKKyAgICAgIHJlcyA9IG9uZV90ZXN0IChvcDEsIG9wMiwgLTEtaSk7CisgICAgICBpZiAocmVzICE9IGhnY2RfdmFsdWVzW2ldLnJlcykKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCAtMS1pKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkJhZCByZXR1cm4gY29kZSBmcm9tIGhnY2RcbiIpOworCSAgZnByaW50ZiAoc3RkZXJyLCAib3AxPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMSwgLTE2KTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIm9wMj0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChvcDIsIC0xNik7CisJICBmcHJpbnRmIChzdGRlcnIsICJleHBlY3RlZDogJWRcbiIsIGhnY2RfdmFsdWVzW2ldLnJlcyk7CisJICBmcHJpbnRmIChzdGRlcnIsICJoZ2NkOiAgICAgJWRcbiIsIChpbnQpIHJlcyk7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIHBsYWluIG9wZXJhbmRzIHdpdGggdW5rbm93biBnY2QuICBUaGVzZSB0eXBlcyBvZiBvcGVyYW5kcworCSBoYXZlIHByb3ZlbiB0byB0cmlnZ2VyIGNlcnRhaW4gYnVncyBpbiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiB0aGUKKwkgZ2NkIGNvZGUuICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTMgKyAyOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMSwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSArIE1JTl9PUEVSQU5EX1NJWkUpOworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgbXB6X3JyYW5kb21iIChvcDIsIHJhbmRzLCBtcHpfZ2V0X3VpIChicykgKyBNSU5fT1BFUkFORF9TSVpFKTsKKworICAgICAgaWYgKG1wel9jbXAgKG9wMSwgb3AyKSA8IDApCisJbXB6X3N3YXAgKG9wMSwgb3AyKTsKKworICAgICAgaWYgKG1wel9zaXplIChvcDEpID4gMCkKKwlvbmVfdGVzdCAob3AxLCBvcDIsIGkpOworCisgICAgICAvKiBHZW5lcmF0ZSBhIGRpdmlzaW9uIGNoYWluIGJhY2t3YXJkcywgYWxsb3dpbmcgb3RoZXJ3aXNlCisJIHVubGlrZWx5IGh1Z2UgcXVvdGllbnRzLiAgKi8KKworICAgICAgbXB6X3NldF91aSAob3AxLCAwKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgbXB6X2dldF91aSAoYnMpICUgMTYgKyAxKTsKKyAgICAgIG1wel9ycmFuZG9tYiAob3AyLCByYW5kcywgbXB6X2dldF91aSAoYnMpKTsKKyAgICAgIG1wel9hZGRfdWkgKG9wMiwgb3AyLCAxKTsKKworI2lmIDAKKyAgICAgIGNoYWluX2xlbiA9IDEwMDAwMDA7CisjZWxzZQorICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIGNoYWluX2xlbiA9IG1wel9nZXRfdWkgKGJzKSAlIChHTVBfTlVNQl9CSVRTICogR0NEX0RDX1RIUkVTSE9MRCAvIDI1Nik7CisjZW5kaWYKKworICAgICAgZm9yIChqID0gMDsgaiA8IGNoYWluX2xlbjsgaisrKQorCXsKKwkgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgbXB6X2dldF91aSAoYnMpICUgMTIgKyAxKTsKKwkgIG1wel9ycmFuZG9tYiAodGVtcDIsIHJhbmRzLCBtcHpfZ2V0X3VpIChicykgKyAxKTsKKwkgIG1wel9hZGRfdWkgKHRlbXAyLCB0ZW1wMiwgMSk7CisJICBtcHpfbXVsICh0ZW1wMSwgb3AyLCB0ZW1wMik7CisJICBtcHpfYWRkIChvcDEsIG9wMSwgdGVtcDEpOworCisJICAvKiBEb24ndCBnZW5lcmF0ZSBvdmVybHkgaHVnZSBvcGVyYW5kcy4gICovCisJICBpZiAoU0laIChvcDEpID4gMyAqIEdDRF9EQ19USFJFU0hPTEQpCisJICAgIGJyZWFrOworCisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSAlIDEyICsgMSk7CisJICBtcHpfcnJhbmRvbWIgKHRlbXAyLCByYW5kcywgbXB6X2dldF91aSAoYnMpICsgMSk7CisJICBtcHpfYWRkX3VpICh0ZW1wMiwgdGVtcDIsIDEpOworCSAgbXB6X211bCAodGVtcDEsIG9wMSwgdGVtcDIpOworCSAgbXB6X2FkZCAob3AyLCBvcDIsIHRlbXAxKTsKKworCSAgLyogRG9uJ3QgZ2VuZXJhdGUgb3Zlcmx5IGh1Z2Ugb3BlcmFuZHMuICAqLworCSAgaWYgKFNJWiAob3AyKSA+IDMgKiBHQ0RfRENfVEhSRVNIT0xEKQorCSAgICBicmVhazsKKwl9CisgICAgICBpZiAobXB6X2NtcCAob3AxLCBvcDIpIDwgMCkKKwltcHpfc3dhcCAob3AxLCBvcDIpOworCisgICAgICBpZiAobXB6X3NpemUgKG9wMSkgPiAwKQorCW9uZV90ZXN0IChvcDEsIG9wMiwgaSk7CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKG9wMSk7CisgIG1wel9jbGVhciAob3AyKTsKKyAgbXB6X2NsZWFyICh0ZW1wMSk7CisgIG1wel9jbGVhciAodGVtcDIpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z19tcCAobXB6X3QgeCwgaW50IGJhc2UpCit7CisgIG1wel9vdXRfc3RyIChzdGRlcnIsIGJhc2UsIHgpOyBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KKworc3RhdGljIGludAorbXB6X21wbl9lcXVhbCAoY29uc3QgbXB6X3QgYSwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYnNpemUpOworCitzdGF0aWMgbXBfc2l6ZV90CitvbmVfdGVzdCAobXB6X3QgYSwgbXB6X3QgYiwgaW50IGkpCit7CisgIHN0cnVjdCBoZ2NkX21hdHJpeCBoZ2NkOworICBzdHJ1Y3QgaGdjZF9yZWYgcmVmOworCisgIG1wel90IHJlZl9yMDsKKyAgbXB6X3QgcmVmX3IxOworICBtcHpfdCBoZ2NkX3IwOworICBtcHpfdCBoZ2NkX3IxOworCisgIG1wX3NpemVfdCByZXNbMl07CisgIG1wX3NpemVfdCBhc2l6ZTsKKyAgbXBfc2l6ZV90IGJzaXplOworCisgIG1wX3NpemVfdCBoZ2NkX2luaXRfc2NyYXRjaDsKKyAgbXBfc2l6ZV90IGhnY2Rfc2NyYXRjaDsKKworICBtcF9wdHIgaGdjZF9pbml0X3RwOworICBtcF9wdHIgaGdjZF90cDsKKworICBhc2l6ZSA9IGEtPl9tcF9zaXplOworICBic2l6ZSA9IGItPl9tcF9zaXplOworCisgIEFTU0VSVCAoYXNpemUgPj0gYnNpemUpOworCisgIGhnY2RfaW5pdF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAoYXNpemUpOworICBoZ2NkX2luaXRfdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChoZ2NkX2luaXRfc2NyYXRjaCk7CisgIG1wbl9oZ2NkX21hdHJpeF9pbml0ICgmaGdjZCwgYXNpemUsIGhnY2RfaW5pdF90cCk7CisKKyAgaGdjZF9zY3JhdGNoID0gbXBuX2hnY2RfaXRjaCAoYXNpemUpOworICBoZ2NkX3RwID0gcmVmbXBuX21hbGxvY19saW1icyAoaGdjZF9zY3JhdGNoKTsKKworI2lmIDAKKyAgZnByaW50ZiAoc3RkZXJyLAorCSAgICJvbmVfdGVzdDogaSA9ICVkIGFzaXplID0gJWQsIGJzaXplID0gJWRcbiIsCisJICAgaSwgYS0+X21wX3NpemUsIGItPl9tcF9zaXplKTsKKworICBnbXBfZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAib25lX3Rlc3Q6IGkgPSAlZFxuIgorCSAgICAgICAiICBhID0gJVp4XG4iCisJICAgICAgICIgIGIgPSAlWnhcbiIsCisJICAgICAgIGksIGEsIGIpOworI2VuZGlmCisgIGhnY2RfcmVmX2luaXQgKCZyZWYpOworCisgIG1wel9pbml0X3NldCAocmVmX3IwLCBhKTsKKyAgbXB6X2luaXRfc2V0IChyZWZfcjEsIGIpOworICByZXNbMF0gPSBoZ2NkX3JlZiAoJnJlZiwgcmVmX3IwLCByZWZfcjEpOworCisgIG1wel9pbml0X3NldCAoaGdjZF9yMCwgYSk7CisgIG1wel9pbml0X3NldCAoaGdjZF9yMSwgYik7CisgIGlmIChic2l6ZSA8IGFzaXplKQorICAgIHsKKyAgICAgIF9tcHpfcmVhbGxvYyAoaGdjZF9yMSwgYXNpemUpOworICAgICAgTVBOX1pFUk8gKGhnY2RfcjEtPl9tcF9kICsgYnNpemUsIGFzaXplIC0gYnNpemUpOworICAgIH0KKyAgcmVzWzFdID0gbXBuX2hnY2QgKGhnY2RfcjAtPl9tcF9kLAorCQkgICAgIGhnY2RfcjEtPl9tcF9kLAorCQkgICAgIGFzaXplLAorCQkgICAgICZoZ2NkLCBoZ2NkX3RwKTsKKworICBpZiAocmVzWzBdICE9IHJlc1sxXSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRpZmZlcmVudCByZXR1cm4gdmFsdWUgZnJvbSBoZ2NkIGFuZCBoZ2NkX3JlZlxuIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJvcDE9Iik7ICAgICAgICAgICAgICAgICBkZWJ1Z19tcCAoYSwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm9wMj0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChiLCAtMTYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaGdjZF9yZWY6ICVsZFxuIiwgKGxvbmcpIHJlc1swXSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJtcG5faGdjZDogJWxkXG4iLCAobG9uZykgcmVzWzFdKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgaWYgKHJlc1swXSA+IDApCisgICAgeworICAgICAgaWYgKCFoZ2NkX3JlZl9lcXVhbCAoJmhnY2QsICZyZWYpCisJICB8fCAhbXB6X21wbl9lcXVhbCAocmVmX3IwLCBoZ2NkX3IwLT5fbXBfZCwgcmVzWzFdKQorCSAgfHwgIW1wel9tcG5fZXF1YWwgKHJlZl9yMSwgaGdjZF9yMS0+X21wX2QsIHJlc1sxXSkpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgaSk7CisJICBmcHJpbnRmIChzdGRlcnIsICJtcG5faGdjZCBhbmQgaGdjZF9yZWYgcmV0dXJuZWQgZGlmZmVyZW50IHZhbHVlc1xuIik7CisJICBmcHJpbnRmIChzdGRlcnIsICJvcDE9Iik7ICAgICAgICAgICAgICAgICBkZWJ1Z19tcCAoYSwgLTE2KTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIm9wMj0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChiLCAtMTYpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICByZWZtcG5fZnJlZV9saW1icyAoaGdjZF9pbml0X3RwKTsKKyAgcmVmbXBuX2ZyZWVfbGltYnMgKGhnY2RfdHApOworICBoZ2NkX3JlZl9jbGVhciAoJnJlZik7CisgIG1wel9jbGVhciAocmVmX3IwKTsKKyAgbXB6X2NsZWFyIChyZWZfcjEpOworICBtcHpfY2xlYXIgKGhnY2RfcjApOworICBtcHpfY2xlYXIgKGhnY2RfcjEpOworCisgIHJldHVybiByZXNbMF07Cit9CisKK3N0YXRpYyB2b2lkCitoZ2NkX3JlZl9pbml0IChzdHJ1Y3QgaGdjZF9yZWYgKmhnY2QpCit7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGk8MjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGo7CisgICAgICBmb3IgKGogPSAwOyBqPDI7IGorKykKKwltcHpfaW5pdCAoaGdjZC0+bVtpXVtqXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGdjZF9yZWZfY2xlYXIgKHN0cnVjdCBoZ2NkX3JlZiAqaGdjZCkKK3sKKyAgdW5zaWduZWQgaTsKKyAgZm9yIChpID0gMDsgaTwyOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgajsKKyAgICAgIGZvciAoaiA9IDA7IGo8MjsgaisrKQorCW1wel9jbGVhciAoaGdjZC0+bVtpXVtqXSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK3NkaXZfcXIgKG1wel90IHEsIG1wel90IHIsIG1wX3NpemVfdCBzLCBjb25zdCBtcHpfdCBhLCBjb25zdCBtcHpfdCBiKQoreworICBtcHpfZmRpdl9xciAocSwgciwgYSwgYik7CisgIGlmIChtcHpfc2l6ZSAocikgPD0gcykKKyAgICB7CisgICAgICBtcHpfYWRkIChyLCByLCBiKTsKKyAgICAgIG1wel9zdWJfdWkgKHEsIHEsIDEpOworICAgIH0KKworICByZXR1cm4gKG1wel9zZ24gKHEpID4gMCk7Cit9CisKK3N0YXRpYyBpbnQKK2hnY2RfcmVmIChzdHJ1Y3QgaGdjZF9yZWYgKmhnY2QsIG1wel90IGEsIG1wel90IGIpCit7CisgIG1wX3NpemVfdCBuID0gTUFYIChtcHpfc2l6ZSAoYSksIG1wel9zaXplIChiKSk7CisgIG1wX3NpemVfdCBzID0gbi8yICsgMTsKKyAgbXBfc2l6ZV90IGFzaXplOworICBtcF9zaXplX3QgYnNpemU7CisgIG1wel90IHE7CisgIGludCByZXM7CisKKyAgaWYgKG1wel9zaXplIChhKSA8PSBzIHx8IG1wel9zaXplIChiKSA8PSBzKQorICAgIHJldHVybiAwOworCisgIHJlcyA9IG1wel9jbXAgKGEsIGIpOworICBpZiAocmVzIDwgMCkKKyAgICB7CisgICAgICBtcHpfc3ViIChiLCBiLCBhKTsKKyAgICAgIGlmIChtcHpfc2l6ZSAoYikgPD0gcykKKwlyZXR1cm4gMDsKKworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVswXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMF1bMV0sIDApOworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVsxXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMV1bMV0sIDEpOworICAgIH0KKyAgZWxzZSBpZiAocmVzID4gMCkKKyAgICB7CisgICAgICBtcHpfc3ViIChhLCBhLCBiKTsKKyAgICAgIGlmIChtcHpfc2l6ZSAoYSkgPD0gcykKKwlyZXR1cm4gMDsKKworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVswXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMF1bMV0sIDEpOworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVsxXVswXSwgMCk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMV1bMV0sIDEpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworCisgIG1wel9pbml0IChxKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIEFTU0VSVCAobXB6X3NpemUgKGEpID4gcyk7CisgICAgICBBU1NFUlQgKG1wel9zaXplIChiKSA+IHMpOworCisgICAgICBpZiAobXB6X2NtcCAoYSwgYikgPiAwKQorCXsKKwkgIGlmICghc2Rpdl9xciAocSwgYSwgcywgYSwgYikpCisJICAgIGJyZWFrOworCSAgbXB6X2FkZG11bCAoaGdjZC0+bVswXVsxXSwgcSwgaGdjZC0+bVswXVswXSk7CisJICBtcHpfYWRkbXVsIChoZ2NkLT5tWzFdWzFdLCBxLCBoZ2NkLT5tWzFdWzBdKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCFzZGl2X3FyIChxLCBiLCBzLCBiLCBhKSkKKwkgICAgYnJlYWs7CisJICBtcHpfYWRkbXVsIChoZ2NkLT5tWzBdWzBdLCBxLCBoZ2NkLT5tWzBdWzFdKTsKKwkgIG1wel9hZGRtdWwgKGhnY2QtPm1bMV1bMF0sIHEsIGhnY2QtPm1bMV1bMV0pOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChxKTsKKworICBhc2l6ZSA9IG1wel9zaXplIChhKTsKKyAgYnNpemUgPSBtcHpfc2l6ZSAoYik7CisgIHJldHVybiBNQVggKGFzaXplLCBic2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK21wel9tcG5fZXF1YWwgKGNvbnN0IG1wel90IGEsIG1wX3NyY3B0ciBicCwgbXBfc2l6ZV90IGJzaXplKQoreworICBtcF9zcmNwdHIgYXAgPSBhLT5fbXBfZDsKKyAgbXBfc2l6ZV90IGFzaXplID0gYS0+X21wX3NpemU7CisKKyAgTVBOX05PUk1BTElaRSAoYnAsIGJzaXplKTsKKyAgcmV0dXJuIGFzaXplID09IGJzaXplICYmIG1wbl9jbXAgKGFwLCBicCwgYXNpemUpID09IDA7Cit9CisKK3N0YXRpYyBpbnQKK2hnY2RfcmVmX2VxdWFsIChjb25zdCBzdHJ1Y3QgaGdjZF9tYXRyaXggKmhnY2QsIGNvbnN0IHN0cnVjdCBoZ2NkX3JlZiAqcmVmKQoreworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGk8MjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGo8MjsgaisrKQorCWlmICghbXB6X21wbl9lcXVhbCAocmVmLT5tW2ldW2pdLCBoZ2NkLT5wW2ldW2pdLCBoZ2NkLT5uKSkKKwkgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWhnY2RfYXBwci5jIGIvdGVzdHMvbXBuL3QtaGdjZF9hcHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMmVhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LWhnY2RfYXBwci5jCkBAIC0wLDAgKzEsNTYzIEBACisvKiBUZXN0IG1wbl9oZ2NkX2FwcHIuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDQsIDIwMTEgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworc3RhdGljIG1wX3NpemVfdCBvbmVfdGVzdCAobXB6X3QsIG1wel90LCBpbnQpOworc3RhdGljIHZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCisjZGVmaW5lIE1JTl9PUEVSQU5EX1NJWkUgMgorCitzdHJ1Y3QgaGdjZF9yZWYKK3sKKyAgbXB6X3QgbVsyXVsyXTsKK307CisKK3N0YXRpYyB2b2lkIGhnY2RfcmVmX2luaXQgKHN0cnVjdCBoZ2NkX3JlZiAqaGdjZCk7CitzdGF0aWMgdm9pZCBoZ2NkX3JlZl9jbGVhciAoc3RydWN0IGhnY2RfcmVmICpoZ2NkKTsKK3N0YXRpYyBpbnQgaGdjZF9yZWYgKHN0cnVjdCBoZ2NkX3JlZiAqaGdjZCwgbXB6X3QgYSwgbXB6X3QgYik7CitzdGF0aWMgaW50IGhnY2RfcmVmX2VxdWFsIChjb25zdCBzdHJ1Y3QgaGdjZF9yZWYgKiwgY29uc3Qgc3RydWN0IGhnY2RfcmVmICopOworc3RhdGljIGludCBoZ2NkX2FwcHJfdmFsaWRfcCAobXB6X3QsIG1wel90LCBtcF9zaXplX3QsIHN0cnVjdCBoZ2NkX3JlZiAqLAorCQkJICAgICAgbXB6X3QsIG1wel90LCBtcF9zaXplX3QsIHN0cnVjdCBoZ2NkX21hdHJpeCAqKTsKKworc3RhdGljIGludCB2ZXJib3NlX2ZsYWcgPSAwOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3Qgb3AxLCBvcDIsIHRlbXAxLCB0ZW1wMjsKKyAgaW50IGksIGosIGNoYWluX2xlbjsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIHNpemVfcmFuZ2U7CisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICItdiIpID09IDApCisJdmVyYm9zZV9mbGFnID0gMTsKKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIGFyZ3VtZW50LlxuIik7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisgIG1wel9pbml0IChvcDEpOworICBtcHpfaW5pdCAob3AyKTsKKyAgbXB6X2luaXQgKHRlbXAxKTsKKyAgbXB6X2luaXQgKHRlbXAyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKyAgICB7CisgICAgICAvKiBHZW5lcmF0ZSBwbGFpbiBvcGVyYW5kcyB3aXRoIHVua25vd24gZ2NkLiAgVGhlc2UgdHlwZXMgb2Ygb3BlcmFuZHMKKwkgaGF2ZSBwcm92ZW4gdG8gdHJpZ2dlciBjZXJ0YWluIGJ1Z3MgaW4gZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgdGhlCisJIGdjZCBjb2RlLiAqLworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDEzICsgMjsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgbXB6X3VyYW5kb21iIChvcDEsIHJhbmRzLCBtcHpfZ2V0X3VpIChicykgKyBNSU5fT1BFUkFORF9TSVpFKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIG1wel91cmFuZG9tYiAob3AyLCByYW5kcywgbXB6X2dldF91aSAoYnMpICsgTUlOX09QRVJBTkRfU0laRSk7CisKKyAgICAgIGlmIChtcHpfY21wIChvcDEsIG9wMikgPCAwKQorCW1wel9zd2FwIChvcDEsIG9wMik7CisKKyAgICAgIGlmIChtcHpfc2l6ZSAob3AxKSA+IDApCisJb25lX3Rlc3QgKG9wMSwgb3AyLCBpKTsKKworICAgICAgLyogR2VuZXJhdGUgYSBkaXZpc2lvbiBjaGFpbiBiYWNrd2FyZHMsIGFsbG93aW5nIG90aGVyd2lzZQorCSB1bmxpa2VseSBodWdlIHF1b3RpZW50cy4gICovCisKKyAgICAgIG1wel9zZXRfdWkgKG9wMSwgMCk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSAlIDE2ICsgMSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMiwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSk7CisgICAgICBtcHpfYWRkX3VpIChvcDIsIG9wMiwgMSk7CisKKyNpZiAwCisgICAgICBjaGFpbl9sZW4gPSAxMDAwMDAwOworI2Vsc2UKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBjaGFpbl9sZW4gPSBtcHpfZ2V0X3VpIChicykgJSAoR01QX05VTUJfQklUUyAqIEdDRF9EQ19USFJFU0hPTEQgLyAyNTYpOworI2VuZGlmCisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFpbl9sZW47IGorKykKKwl7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSAlIDEyICsgMSk7CisJICBtcHpfcnJhbmRvbWIgKHRlbXAyLCByYW5kcywgbXB6X2dldF91aSAoYnMpICsgMSk7CisJICBtcHpfYWRkX3VpICh0ZW1wMiwgdGVtcDIsIDEpOworCSAgbXB6X211bCAodGVtcDEsIG9wMiwgdGVtcDIpOworCSAgbXB6X2FkZCAob3AxLCBvcDEsIHRlbXAxKTsKKworCSAgLyogRG9uJ3QgZ2VuZXJhdGUgb3Zlcmx5IGh1Z2Ugb3BlcmFuZHMuICAqLworCSAgaWYgKFNJWiAob3AxKSA+IDMgKiBHQ0RfRENfVEhSRVNIT0xEKQorCSAgICBicmVhazsKKworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKwkgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBtcHpfZ2V0X3VpIChicykgJSAxMiArIDEpOworCSAgbXB6X3JyYW5kb21iICh0ZW1wMiwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSArIDEpOworCSAgbXB6X2FkZF91aSAodGVtcDIsIHRlbXAyLCAxKTsKKwkgIG1wel9tdWwgKHRlbXAxLCBvcDEsIHRlbXAyKTsKKwkgIG1wel9hZGQgKG9wMiwgb3AyLCB0ZW1wMSk7CisKKwkgIC8qIERvbid0IGdlbmVyYXRlIG92ZXJseSBodWdlIG9wZXJhbmRzLiAgKi8KKwkgIGlmIChTSVogKG9wMikgPiAzICogR0NEX0RDX1RIUkVTSE9MRCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgaWYgKG1wel9jbXAgKG9wMSwgb3AyKSA8IDApCisJbXB6X3N3YXAgKG9wMSwgb3AyKTsKKworICAgICAgaWYgKG1wel9zaXplIChvcDEpID4gMCkKKwlvbmVfdGVzdCAob3AxLCBvcDIsIGkpOworICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChvcDEpOworICBtcHpfY2xlYXIgKG9wMik7CisgIG1wel9jbGVhciAodGVtcDEpOworICBtcHpfY2xlYXIgKHRlbXAyKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CisKK3N0YXRpYyBtcF9zaXplX3QKK29uZV90ZXN0IChtcHpfdCBhLCBtcHpfdCBiLCBpbnQgaSkKK3sKKyAgc3RydWN0IGhnY2RfbWF0cml4IGhnY2Q7CisgIHN0cnVjdCBoZ2NkX3JlZiByZWY7CisKKyAgbXB6X3QgcmVmX3IwOworICBtcHpfdCByZWZfcjE7CisgIG1wel90IGhnY2RfcjA7CisgIG1wel90IGhnY2RfcjE7CisKKyAgaW50IHJlc1syXTsKKyAgbXBfc2l6ZV90IGFzaXplOworICBtcF9zaXplX3QgYnNpemU7CisKKyAgbXBfc2l6ZV90IGhnY2RfaW5pdF9zY3JhdGNoOworICBtcF9zaXplX3QgaGdjZF9zY3JhdGNoOworCisgIG1wX3B0ciBoZ2NkX2luaXRfdHA7CisgIG1wX3B0ciBoZ2NkX3RwOworICBtcF9saW1iX3QgbWFya2VyWzRdOworCisgIGFzaXplID0gYS0+X21wX3NpemU7CisgIGJzaXplID0gYi0+X21wX3NpemU7CisKKyAgQVNTRVJUIChhc2l6ZSA+PSBic2l6ZSk7CisKKyAgaGdjZF9pbml0X3NjcmF0Y2ggPSBNUE5fSEdDRF9NQVRSSVhfSU5JVF9JVENIIChhc2l6ZSk7CisgIGhnY2RfaW5pdF90cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKGhnY2RfaW5pdF9zY3JhdGNoICsgMikgKyAxOworICBtcG5faGdjZF9tYXRyaXhfaW5pdCAoJmhnY2QsIGFzaXplLCBoZ2NkX2luaXRfdHApOworCisgIGhnY2Rfc2NyYXRjaCA9IG1wbl9oZ2NkX2FwcHJfaXRjaCAoYXNpemUpOworICBoZ2NkX3RwID0gcmVmbXBuX21hbGxvY19saW1icyAoaGdjZF9zY3JhdGNoICsgMikgKyAxOworCisgIG1wbl9yYW5kb20gKG1hcmtlciwgNCk7CisKKyAgaGdjZF9pbml0X3RwWy0xXSA9IG1hcmtlclswXTsKKyAgaGdjZF9pbml0X3RwW2hnY2RfaW5pdF9zY3JhdGNoXSA9IG1hcmtlclsxXTsKKyAgaGdjZF90cFstMV0gPSBtYXJrZXJbMl07CisgIGhnY2RfdHBbaGdjZF9zY3JhdGNoXSA9IG1hcmtlclszXTsKKworI2lmIDAKKyAgZnByaW50ZiAoc3RkZXJyLAorCSAgICJvbmVfdGVzdDogaSA9ICVkIGFzaXplID0gJWQsIGJzaXplID0gJWRcbiIsCisJICAgaSwgYS0+X21wX3NpemUsIGItPl9tcF9zaXplKTsKKworICBnbXBfZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAib25lX3Rlc3Q6IGkgPSAlZFxuIgorCSAgICAgICAiICBhID0gJVp4XG4iCisJICAgICAgICIgIGIgPSAlWnhcbiIsCisJICAgICAgIGksIGEsIGIpOworI2VuZGlmCisgIGhnY2RfcmVmX2luaXQgKCZyZWYpOworCisgIG1wel9pbml0X3NldCAocmVmX3IwLCBhKTsKKyAgbXB6X2luaXRfc2V0IChyZWZfcjEsIGIpOworICByZXNbMF0gPSBoZ2NkX3JlZiAoJnJlZiwgcmVmX3IwLCByZWZfcjEpOworCisgIG1wel9pbml0X3NldCAoaGdjZF9yMCwgYSk7CisgIG1wel9pbml0X3NldCAoaGdjZF9yMSwgYik7CisgIGlmIChic2l6ZSA8IGFzaXplKQorICAgIHsKKyAgICAgIF9tcHpfcmVhbGxvYyAoaGdjZF9yMSwgYXNpemUpOworICAgICAgTVBOX1pFUk8gKGhnY2RfcjEtPl9tcF9kICsgYnNpemUsIGFzaXplIC0gYnNpemUpOworICAgIH0KKyAgcmVzWzFdID0gbXBuX2hnY2RfYXBwciAoaGdjZF9yMC0+X21wX2QsCisJCQkgIGhnY2RfcjEtPl9tcF9kLAorCQkJICBhc2l6ZSwKKwkJCSAgJmhnY2QsIGhnY2RfdHApOworCisgIGlmIChoZ2NkX2luaXRfdHBbLTFdICE9IG1hcmtlclswXQorICAgICAgfHwgaGdjZF9pbml0X3RwW2hnY2RfaW5pdF9zY3JhdGNoXSAhPSBtYXJrZXJbMV0KKyAgICAgIHx8IGhnY2RfdHBbLTFdICE9IG1hcmtlclsyXQorICAgICAgfHwgaGdjZF90cFtoZ2NkX3NjcmF0Y2hdICE9IG1hcmtlclszXSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInNjcmF0Y2ggc3BhY2Ugb3ZlcndyaXR0ZW4hXG4iKTsKKworICAgICAgaWYgKGhnY2RfaW5pdF90cFstMV0gIT0gbWFya2VyWzBdKQorCWdtcF9mcHJpbnRmIChzdGRlcnIsCisJCSAgICAgImJlZm9yZSBpbml0X3RwOiAlTXhcbiIKKwkJICAgICAiZXhwZWN0ZWQ6ICVNeFxuIiwKKwkJICAgICBoZ2NkX2luaXRfdHBbLTFdLCBtYXJrZXJbMF0pOworICAgICAgaWYgKGhnY2RfaW5pdF90cFtoZ2NkX2luaXRfc2NyYXRjaF0gIT0gbWFya2VyWzFdKQorCWdtcF9mcHJpbnRmIChzdGRlcnIsCisJCSAgICAgImFmdGVyIGluaXRfdHA6ICVNeFxuIgorCQkgICAgICJleHBlY3RlZDogJU14XG4iLAorCQkgICAgIGhnY2RfaW5pdF90cFtoZ2NkX2luaXRfc2NyYXRjaF0sIG1hcmtlclsxXSk7CisgICAgICBpZiAoaGdjZF90cFstMV0gIT0gbWFya2VyWzJdKQorCWdtcF9mcHJpbnRmIChzdGRlcnIsCisJCSAgICAgImJlZm9yZSB0cDogJU14XG4iCisJCSAgICAgImV4cGVjdGVkOiAlTXhcbiIsCisJCSAgICAgaGdjZF90cFstMV0sIG1hcmtlclsyXSk7CisgICAgICBpZiAoaGdjZF90cFtoZ2NkX3NjcmF0Y2hdICE9IG1hcmtlclszXSkKKwlnbXBfZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICJhZnRlciB0cDogJU14XG4iCisJCSAgICAgImV4cGVjdGVkOiAlTXhcbiIsCisJCSAgICAgaGdjZF90cFtoZ2NkX3NjcmF0Y2hdLCBtYXJrZXJbM10pOworCisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKCFoZ2NkX2FwcHJfdmFsaWRfcCAoYSwgYiwgcmVzWzBdLCAmcmVmLCByZWZfcjAsIHJlZl9yMSwKKwkJCSAgcmVzWzFdLCAmaGdjZCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgaSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIHJlc3VsdHMgZm9yIGhnY2QgYW5kIGhnY2RfcmVmXG4iKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm9wMT0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChhLCAtMTYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3AyPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKGIsIC0xNik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJoZ2NkX3JlZjogJWxkXG4iLCAobG9uZykgcmVzWzBdKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wbl9oZ2NkX2FwcHI6ICVsZFxuIiwgKGxvbmcpIHJlc1sxXSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgcmVmbXBuX2ZyZWVfbGltYnMgKGhnY2RfaW5pdF90cCAtIDEpOworICByZWZtcG5fZnJlZV9saW1icyAoaGdjZF90cCAtIDEpOworICBoZ2NkX3JlZl9jbGVhciAoJnJlZik7CisgIG1wel9jbGVhciAocmVmX3IwKTsKKyAgbXB6X2NsZWFyIChyZWZfcjEpOworICBtcHpfY2xlYXIgKGhnY2RfcjApOworICBtcHpfY2xlYXIgKGhnY2RfcjEpOworCisgIHJldHVybiByZXNbMF07Cit9CisKK3N0YXRpYyB2b2lkCitoZ2NkX3JlZl9pbml0IChzdHJ1Y3QgaGdjZF9yZWYgKmhnY2QpCit7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGk8MjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGo7CisgICAgICBmb3IgKGogPSAwOyBqPDI7IGorKykKKwltcHpfaW5pdCAoaGdjZC0+bVtpXVtqXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraGdjZF9yZWZfY2xlYXIgKHN0cnVjdCBoZ2NkX3JlZiAqaGdjZCkKK3sKKyAgdW5zaWduZWQgaTsKKyAgZm9yIChpID0gMDsgaTwyOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQgajsKKyAgICAgIGZvciAoaiA9IDA7IGo8MjsgaisrKQorCW1wel9jbGVhciAoaGdjZC0+bVtpXVtqXSk7CisgICAgfQorfQorCitzdGF0aWMgaW50CitzZGl2X3FyIChtcHpfdCBxLCBtcHpfdCByLCBtcF9zaXplX3QgcywgY29uc3QgbXB6X3QgYSwgY29uc3QgbXB6X3QgYikKK3sKKyAgbXB6X2ZkaXZfcXIgKHEsIHIsIGEsIGIpOworICBpZiAobXB6X3NpemUgKHIpIDw9IHMpCisgICAgeworICAgICAgbXB6X2FkZCAociwgciwgYik7CisgICAgICBtcHpfc3ViX3VpIChxLCBxLCAxKTsKKyAgICB9CisKKyAgcmV0dXJuIChtcHpfc2duIChxKSA+IDApOworfQorCitzdGF0aWMgaW50CitoZ2NkX3JlZiAoc3RydWN0IGhnY2RfcmVmICpoZ2NkLCBtcHpfdCBhLCBtcHpfdCBiKQoreworICBtcF9zaXplX3QgbiA9IE1BWCAobXB6X3NpemUgKGEpLCBtcHpfc2l6ZSAoYikpOworICBtcF9zaXplX3QgcyA9IG4vMiArIDE7CisgIG1wel90IHE7CisgIGludCByZXM7CisKKyAgaWYgKG1wel9zaXplIChhKSA8PSBzIHx8IG1wel9zaXplIChiKSA8PSBzKQorICAgIHJldHVybiAwOworCisgIHJlcyA9IG1wel9jbXAgKGEsIGIpOworICBpZiAocmVzIDwgMCkKKyAgICB7CisgICAgICBtcHpfc3ViIChiLCBiLCBhKTsKKyAgICAgIGlmIChtcHpfc2l6ZSAoYikgPD0gcykKKwlyZXR1cm4gMDsKKworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVswXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMF1bMV0sIDApOworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVsxXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMV1bMV0sIDEpOworICAgIH0KKyAgZWxzZSBpZiAocmVzID4gMCkKKyAgICB7CisgICAgICBtcHpfc3ViIChhLCBhLCBiKTsKKyAgICAgIGlmIChtcHpfc2l6ZSAoYSkgPD0gcykKKwlyZXR1cm4gMDsKKworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVswXVswXSwgMSk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMF1bMV0sIDEpOworICAgICAgbXB6X3NldF91aSAoaGdjZC0+bVsxXVswXSwgMCk7IG1wel9zZXRfdWkgKGhnY2QtPm1bMV1bMV0sIDEpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworCisgIG1wel9pbml0IChxKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIEFTU0VSVCAobXB6X3NpemUgKGEpID4gcyk7CisgICAgICBBU1NFUlQgKG1wel9zaXplIChiKSA+IHMpOworCisgICAgICBpZiAobXB6X2NtcCAoYSwgYikgPiAwKQorCXsKKwkgIGlmICghc2Rpdl9xciAocSwgYSwgcywgYSwgYikpCisJICAgIGJyZWFrOworCSAgbXB6X2FkZG11bCAoaGdjZC0+bVswXVsxXSwgcSwgaGdjZC0+bVswXVswXSk7CisJICBtcHpfYWRkbXVsIChoZ2NkLT5tWzFdWzFdLCBxLCBoZ2NkLT5tWzFdWzBdKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCFzZGl2X3FyIChxLCBiLCBzLCBiLCBhKSkKKwkgICAgYnJlYWs7CisJICBtcHpfYWRkbXVsIChoZ2NkLT5tWzBdWzBdLCBxLCBoZ2NkLT5tWzBdWzFdKTsKKwkgIG1wel9hZGRtdWwgKGhnY2QtPm1bMV1bMF0sIHEsIGhnY2QtPm1bMV1bMV0pOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChxKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraGdjZF9yZWZfZXF1YWwgKGNvbnN0IHN0cnVjdCBoZ2NkX3JlZiAqQSwgY29uc3Qgc3RydWN0IGhnY2RfcmVmICpCKQoreworICB1bnNpZ25lZCBpOworCisgIGZvciAoaSA9IDA7IGk8MjsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGo7CisKKyAgICAgIGZvciAoaiA9IDA7IGo8MjsgaisrKQorCWlmIChtcHpfY21wIChBLT5tW2ldW2pdLCBCLT5tW2ldW2pdKSAhPSAwKQorCSAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitoZ2NkX2FwcHJfdmFsaWRfcCAobXB6X3QgYSwgbXB6X3QgYiwgbXBfc2l6ZV90IHJlczAsCisJCSAgIHN0cnVjdCBoZ2NkX3JlZiAqcmVmLCBtcHpfdCByZWZfcjAsIG1wel90IHJlZl9yMSwKKwkJICAgbXBfc2l6ZV90IHJlczEsIHN0cnVjdCBoZ2NkX21hdHJpeCAqaGdjZCkKK3sKKyAgbXBfc2l6ZV90IG4gPSBNQVggKG1wel9zaXplIChhKSwgbXB6X3NpemUgKGIpKTsKKyAgbXBfc2l6ZV90IHMgPSBuLzIgKyAxOworCisgIG1wX2JpdGNudF90IGRiaXRzLCBhYml0cywgbWFyZ2luOworICBtcHpfdCBhcHByX3IwLCBhcHByX3IxLCB0LCBxOworICBzdHJ1Y3QgaGdjZF9yZWYgYXBwcjsKKworICBpZiAoIXJlczApCisgICAgeworICAgICAgaWYgKCFyZXMxKQorCXJldHVybiAxOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJtcG5faGdjZF9hcHByIHJldHVybmVkIDEgd2hlbiBubyByZWR1Y3Rpb24gcG9zc2libGUuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBOT1RFOiBObyAqX2NsZWFyIGNhbGxzIG9uIGVycm9yIHJldHVybiwgc2luY2Ugd2UncmUgZ29pbmcgdG8KKyAgICAgYWJvcnQgYW55d2F5LiAqLworICBtcHpfaW5pdCAodCk7CisgIG1wel9pbml0IChxKTsKKyAgaGdjZF9yZWZfaW5pdCAoJmFwcHIpOworICBtcHpfaW5pdCAoYXBwcl9yMCk7CisgIG1wel9pbml0IChhcHByX3IxKTsKKworICBpZiAobXB6X3NpemUgKHJlZl9yMCkgPD0gcykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWZfcjAgdG9vIHNtYWxsISEhOiAiKTsgZGVidWdfbXAgKHJlZl9yMCwgMTYpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAobXB6X3NpemUgKHJlZl9yMSkgPD0gcykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWZfcjEgdG9vIHNtYWxsISEhOiAiKTsgZGVidWdfbXAgKHJlZl9yMSwgMTYpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIG1wel9zdWIgKHQsIHJlZl9yMCwgcmVmX3IxKTsKKyAgZGJpdHMgPSBtcHpfc2l6ZWluYmFzZSAodCwgMik7CisgIGlmIChkYml0cyA+IHMqR01QX05VTUJfQklUUykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWYgfHIwIC0gcjF8IHRvbyBsYXJnZSEhITogIik7IGRlYnVnX21wICh0LCAxNik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFyZXMxKQorICAgIHsKKyAgICAgIG1wel9zZXQgKGFwcHJfcjAsIGEpOworICAgICAgbXB6X3NldCAoYXBwcl9yMSwgYik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgaTsKKworICAgICAgZm9yIChpID0gMDsgaTwyOyBpKyspCisJeworCSAgdW5zaWduZWQgajsKKworCSAgZm9yIChqID0gMDsgajwyOyBqKyspCisJICAgIHsKKwkgICAgICBtcF9zaXplX3QgbW4gPSBoZ2NkLT5uOworCSAgICAgIE1QTl9OT1JNQUxJWkUgKGhnY2QtPnBbaV1bal0sIG1uKTsKKwkgICAgICBtcHpfcmVhbGxvYyAoYXBwci5tW2ldW2pdLCBtbik7CisJICAgICAgTVBOX0NPUFkgKFBUUiAoYXBwci5tW2ldW2pdKSwgaGdjZC0+cFtpXVtqXSwgbW4pOworCSAgICAgIFNJWiAoYXBwci5tW2ldW2pdKSA9IG1uOworCSAgICB9CisJfQorICAgICAgbXB6X211bCAoYXBwcl9yMCwgYXBwci5tWzFdWzFdLCBhKTsKKyAgICAgIG1wel9tdWwgKHQsIGFwcHIubVswXVsxXSwgYik7CisgICAgICBtcHpfc3ViIChhcHByX3IwLCBhcHByX3IwLCB0KTsKKyAgICAgIGlmIChtcHpfc2duIChhcHByX3IwKSA8PSAwCisJICB8fCBtcHpfc2l6ZSAoYXBwcl9yMCkgPD0gcykKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJhcHByX3IwIHRvbyBzbWFsbDogIik7IGRlYnVnX21wIChhcHByX3IwLCAxNik7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIG1wel9tdWwgKGFwcHJfcjEsIGFwcHIubVsxXVswXSwgYSk7CisgICAgICBtcHpfbXVsICh0LCBhcHByLm1bMF1bMF0sIGIpOworICAgICAgbXB6X3N1YiAoYXBwcl9yMSwgdCwgYXBwcl9yMSk7CisgICAgICBpZiAobXB6X3NnbiAoYXBwcl9yMSkgPD0gMAorCSAgfHwgbXB6X3NpemUgKGFwcHJfcjEpIDw9IHMpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiYXBwcl9yMSB0b28gc21hbGw6ICIpOyBkZWJ1Z19tcCAoYXBwcl9yMSwgMTYpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBtcHpfc3ViICh0LCBhcHByX3IwLCBhcHByX3IxKTsKKyAgYWJpdHMgPSBtcHpfc2l6ZWluYmFzZSAodCwgMik7CisgIGlmIChhYml0cyA8IGRiaXRzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInxyMCAtIHIxfCB0b28gc21hbGw6ICIpOyBkZWJ1Z19tcCAodCwgMTYpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIFdlIGxvc2Ugb25lIGJpdCBlYWNoIHRpbWUgd2UgZGlzY2FyZCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMuCisgICAgIEZvciB0aGUgbGVobWVyIGNvZGUsIHRoYXQgY2FuIGhhcHBlbiBhdCBtb3N0IHMgKiAoR01QX05VTUJfQklUUykKKyAgICAgLyAoR01QX05VTUJfQklUUyAtIDEpIHRpbWVzLiBGb3IgdGhlIGRjIGNvZGUsIHdlIGxvc2UgYW4gZW50aXJlCisgICAgIGxpbWIgKG9yIG1vcmU/KSBmb3IgZWFjaCBsZXZlbCBvZiByZWN1cnNpb24uICovCisKKyAgbWFyZ2luID0gKG4vMisxKSAqIEdNUF9OVU1CX0JJVFMgLyAoR01QX05VTUJfQklUUyAtIDEpOworICB7CisgICAgbXBfc2l6ZV90IHJuOworICAgIGZvciAocm4gPSBuOyBBQk9WRV9USFJFU0hPTEQgKHJuLCBIR0NEX0FQUFJfVEhSRVNIT0xEKTsgcm4gPSAocm4gKyAxKS8yKQorICAgICAgbWFyZ2luICs9IEdNUF9OVU1CX0JJVFM7CisgIH0KKworICBpZiAodmVyYm9zZV9mbGFnICYmIGFiaXRzID4gZGJpdHMpCisgICAgZnByaW50ZiAoc3RkZXJyLCAibiA9ICV1OiBzYml0cyA9ICV1OiByZWYgIyhyMC1yMSk6ICV1LCBhcHByICMocjAtcjEpOiAldSBleGNlc3M6ICVkLCBtYXJnaW46ICV1XG4iLAorCSAgICAgKHVuc2lnbmVkKSBuLCAodW5zaWduZWQpIHMqR01QX05VTUJfQklUUywKKwkgICAgICh1bnNpZ25lZCkgZGJpdHMsICh1bnNpZ25lZCkgYWJpdHMsCisJICAgICAoaW50KSAoYWJpdHMgLSBzICogR01QX05VTUJfQklUUyksICh1bnNpZ25lZCkgbWFyZ2luKTsKKworICBpZiAoYWJpdHMgPiBzKkdNUF9OVU1CX0JJVFMgKyBtYXJnaW4pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYXBwciB8cjAgLSByMXwgbXVjaCBsYXJnZXIgdGhhbiBtaW5pbWFsIChieSAldSBiaXRzLCBtYXJnaW4gPSAldSBiaXRzKVxuIiwKKwkgICAgICAgKHVuc2lnbmVkKSAoYWJpdHMgLSBzKkdNUF9OVU1CX0JJVFMpLCAodW5zaWduZWQpIG1hcmdpbik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgd2hpbGUgKG1wel9jbXAgKGFwcHJfcjAsIHJlZl9yMCkgPiAwIHx8IG1wel9jbXAgKGFwcHJfcjEsIHJlZl9yMSkgPiAwKQorICAgIHsKKyAgICAgIEFTU0VSVCAobXB6X3NpemUgKGFwcHJfcjApID4gcyk7CisgICAgICBBU1NFUlQgKG1wel9zaXplIChhcHByX3IxKSA+IHMpOworCisgICAgICBpZiAobXB6X2NtcCAoYXBwcl9yMCwgYXBwcl9yMSkgPiAwKQorCXsKKwkgIGlmICghc2Rpdl9xciAocSwgYXBwcl9yMCwgcywgYXBwcl9yMCwgYXBwcl9yMSkpCisJICAgIGJyZWFrOworCSAgbXB6X2FkZG11bCAoYXBwci5tWzBdWzFdLCBxLCBhcHByLm1bMF1bMF0pOworCSAgbXB6X2FkZG11bCAoYXBwci5tWzFdWzFdLCBxLCBhcHByLm1bMV1bMF0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIXNkaXZfcXIgKHEsIGFwcHJfcjEsIHMsIGFwcHJfcjEsIGFwcHJfcjApKQorCSAgICBicmVhazsKKwkgIG1wel9hZGRtdWwgKGFwcHIubVswXVswXSwgcSwgYXBwci5tWzBdWzFdKTsKKwkgIG1wel9hZGRtdWwgKGFwcHIubVsxXVswXSwgcSwgYXBwci5tWzFdWzFdKTsKKwl9CisgICAgfQorCisgIGlmIChtcHpfY21wIChhcHByX3IwLCByZWZfcjApICE9IDAKKyAgICAgIHx8IG1wel9jbXAgKGFwcHJfcjEsIHJlZl9yMSkgIT0gMAorICAgICAgfHwgIWhnY2RfcmVmX2VxdWFsIChyZWYsICZhcHByKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJhcHByX3IwOiAiKTsgZGVidWdfbXAgKGFwcHJfcjAsIDE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInJlZl9yMDogIik7IGRlYnVnX21wIChyZWZfcjAsIDE2KTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYXBwcl9yMTogIik7IGRlYnVnX21wIChhcHByX3IxLCAxNik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJyZWZfcjE6ICIpOyBkZWJ1Z19tcCAocmVmX3IxLCAxNik7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgbXB6X2NsZWFyICh0KTsKKyAgbXB6X2NsZWFyIChxKTsKKyAgaGdjZF9yZWZfY2xlYXIgKCZhcHByKTsKKyAgbXB6X2NsZWFyIChhcHByX3IwKTsKKyAgbXB6X2NsZWFyIChhcHByX3IxKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWluc3RydW1lbnQuYyBiL3Rlc3RzL21wbi90LWluc3RydW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTRlMTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtaW5zdHJ1bWVudC5jCkBAIC0wLDAgKzEsNDE1IEBACisvKiBUZXN0IGFzc2VtYmxlciBzdXBwb3J0IGZvciAtLWVuYWJsZS1wcm9maWxpbmc9aW5zdHJ1bWVudC4KKworQ29weXJpZ2h0IDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKyNpZiBXQU5UX1BST0ZJTElOR19JTlNUUlVNRU5UCisKKy8qIFRoaXMgcHJvZ3JhbSBleGVyY2lzZXMgZWFjaCBtcG4gcm91dGluZSB0aGF0IG1pZ2h0IGJlIGltcGxlbWVudGVkIGluCisgICBhc3NlbWJsZXIuICBJdCBlbnN1cmVzIHRoZSBfX2N5Z19wcm9maWxlX2Z1bmNfZW50ZXIgYW5kIGV4aXQgY2FsbHMgaGF2ZQorICAgY29tZSBvdXQgcmlnaHQsIGFuZCB0aGF0IGluIHRoZSB4ODYgY29kZSAicmV0X2ludGVybmFsIiBpcyBjb3JyZWN0bHkgdXNlZAorICAgZm9yIFBJQyBzZXR1cHMuICAqLworCisKKy8qIENoYW5nZXMgdG8gZW50ZXJfc2VlbiBkb25lIGJ5IF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciBhcmUgZXNzZW50aWFsbHkKKyAgIHVua25vd24gdG8gdGhlIG9wdGltaXplciwgc28gbXVzdCB1c2Ugdm9sYXRpbGUuICAqLwordm9sYXRpbGUgaW50ICBlbnRlcl9zZWVuOworCisvKiBEdW1teSB1c2VkIHRvIHN0b3AgdmFyaW91cyBjYWxscyBnb2luZyBkZWFkLiAqLwordW5zaWduZWQgbG9uZyAgbm90ZGVhZDsKKworY29uc3QgY2hhciAgICAgKm5hbWUgPSAiPG5vbmU+IjsKK2ludCAgb2xkX25jYWxsOworCitzdHJ1Y3QgeworICB2b2lkICAqdGhpc19mbjsKKyAgdm9pZCAgKmNhbGxfc2l0ZTsKK30gY2FsbFsxMDBdOworaW50ICBuY2FsbDsKKworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqLCB2b2lkICopCisgIF9fYXR0cmlidXRlX18gKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7CisKK3ZvaWQKK19fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQoreworI2lmIDAKKyAgcHJpbnRmICgiJTI0cyAlcCAlcFxuIiwgbmFtZSwgdGhpc19mbiwgY2FsbF9zaXRlKTsKKyNlbmRpZgorICBBU1NFUlRfQUxXQVlTIChuY2FsbCA+PSAwKTsKKyAgQVNTRVJUX0FMV0FZUyAobmNhbGwgPD0gbnVtYmVyb2YgKGNhbGwpKTsKKworICBpZiAobmNhbGwgPj0gbnVtYmVyb2YgKGNhbGwpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIl9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlcjogb29wcywgY2FsbCBzdGFjayBmdWxsLCBmcm9tICVzXG4iLCBuYW1lKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBlbnRlcl9zZWVuID0gMTsKKyAgY2FsbFtuY2FsbF0udGhpc19mbiA9IHRoaXNfZm47CisgIGNhbGxbbmNhbGxdLmNhbGxfc2l0ZSA9IGNhbGxfc2l0ZTsKKyAgbmNhbGwrKzsKK30KKwordm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdCAodm9pZCAqLCB2b2lkICopCisgIF9fYXR0cmlidXRlX18gKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7CisKK3ZvaWQKK19fY3lnX3Byb2ZpbGVfZnVuY19leGl0ICAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQoreworICBBU1NFUlRfQUxXQVlTIChuY2FsbCA+PSAwKTsKKyAgQVNTRVJUX0FMV0FZUyAobmNhbGwgPD0gbnVtYmVyb2YgKGNhbGwpKTsKKworICBpZiAobmNhbGwgPT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdDogY2FsbCBzdGFjayBlbXB0eSwgZnJvbSAlc1xuIiwgbmFtZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbmNhbGwtLTsKKyAgaWYgKHRoaXNfZm4gIT0gY2FsbFtuY2FsbF0udGhpc19mbiB8fCBjYWxsX3NpdGUgIT0gY2FsbFtuY2FsbF0uY2FsbF9zaXRlKQorICAgIHsKKyAgICAgIHByaW50ZiAoIl9fY3lnX3Byb2ZpbGVfZnVuY19leGl0OiB1bmJhbGFuY2VkIHRoaXNfZm4vY2FsbF9zaXRlIGZyb20gJXNcbiIsIG5hbWUpOworICAgICAgcHJpbnRmICgiICB0aGlzX2ZuIGdvdCAgJXBcbiIsIHRoaXNfZm4pOworICAgICAgcHJpbnRmICgiICAgICAgICAgIHdhbnQgJXBcbiIsIGNhbGxbbmNhbGxdLnRoaXNfZm4pOworICAgICAgcHJpbnRmICgiICBjYWxsX3NpdGUgZ290ICAlcFxuIiwgY2FsbF9zaXRlKTsKKyAgICAgIHByaW50ZiAoIiAgICAgICAgICAgIHdhbnQgJXBcbiIsIGNhbGxbbmNhbGxdLmNhbGxfc2l0ZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKwordm9pZAorcHJlIChjb25zdCBjaGFyICpzdHIpCit7CisgIG5hbWUgPSBzdHI7CisgIGVudGVyX3NlZW4gPSAwOworICBvbGRfbmNhbGwgPSBuY2FsbDsKK30KKwordm9pZAorcG9zdCAodm9pZCkKK3sKKyAgaWYgKCEgZW50ZXJfc2VlbikKKyAgICB7CisgICAgICBwcmludGYgKCJkaWQgbm90IHJlYWNoIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciBmcm9tICVzXG4iLCBuYW1lKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAobmNhbGwgIT0gb2xkX25jYWxsKQorICAgIHsKKyAgICAgIHByaW50ZiAoInVuYmFsYW5jZSBlbnRlci9leGl0IGNhbGxzIGZyb20gJXNcbiIsIG5hbWUpOworICAgICAgcHJpbnRmICgiICBuY2FsbCAgICAgJWRcbiIsIG5jYWxsKTsKKyAgICAgIHByaW50ZiAoIiAgb2xkX25jYWxsICVkXG4iLCBvbGRfbmNhbGwpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVjayAodm9pZCkKK3sKKyAgbXBfbGltYl90ICB3cFsxMDBdLCB4cFsxMDBdLCB5cFsxMDBdOworICBtcF9zaXplX3QgIHNpemUgPSAxMDA7CisKKyAgcmVmbXBuX3plcm8gKHhwLCBzaXplKTsKKyAgcmVmbXBuX3plcm8gKHlwLCBzaXplKTsKKyAgcmVmbXBuX3plcm8gKHdwLCBzaXplKTsKKworICBwcmUgKCJtcG5fYWRkX24iKTsKKyAgbXBuX2FkZF9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hZGRfbmMKKyAgcHJlICgibXBuX2FkZF9uYyIpOworICBtcG5fYWRkX25jICh3cCwgeHAsIHlwLCBzaXplLCBDTlNUX0xJTUIoMCkpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbHNoMV9uCisgIHByZSAoIm1wbl9hZGRsc2gxX24iKTsKKyAgbXBuX2FkZGxzaDFfbiAod3AsIHhwLCB5cCwgc2l6ZSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9hbmRfbgorICBwcmUgKCJtcG5fYW5kX24iKTsKKyAgbXBuX2FuZF9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2FuZG5fbgorICBwcmUgKCJtcG5fYW5kbl9uIik7CisgIG1wbl9hbmRuX24gKHdwLCB4cCwgeXAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCisKKyAgcHJlICgibXBuX2FkZG11bF8xIik7CisgIG1wbl9hZGRtdWxfMSAod3AsIHhwLCBzaXplLCB5cFswXSk7CisgIHBvc3QgKCk7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fYWRkbXVsXzFjCisgIHByZSAoIm1wbl9hZGRtdWxfMWMiKTsKKyAgbXBuX2FkZG11bF8xYyAod3AsIHhwLCBzaXplLCB5cFswXSwgQ05TVF9MSU1CKDApKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2NvbQorICBwcmUgKCJtcG5fY29tIik7CisgIG1wbl9jb20gKHdwLCB4cCwgc2l6ZSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9jb3B5ZAorICBwcmUgKCJtcG5fY29weWQiKTsKKyAgbXBuX2NvcHlkICh3cCwgeHAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fY29weWkKKyAgcHJlICgibXBuX2NvcHlpIik7CisgIG1wbl9jb3B5aSAod3AsIHhwLCBzaXplKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisgIHByZSAoIm1wbl9kaXZleGFjdF8xIik7CisgIG1wbl9kaXZleGFjdF8xICh3cCwgeHAsIHNpemUsIENOU1RfTElNQigxMjMpKTsKKyAgcG9zdCAoKTsKKworICBwcmUgKCJtcG5fZGl2ZXhhY3RfYnkzYyIpOworICBtcG5fZGl2ZXhhY3RfYnkzYyAod3AsIHhwLCBzaXplLCBDTlNUX0xJTUIoMCkpOworICBwb3N0ICgpOworCisgIHByZSAoIm1wbl9kaXZyZW1fMSIpOworICBtcG5fZGl2cmVtXzEgKHdwLCAobXBfc2l6ZV90KSAwLCB4cCwgc2l6ZSwgQ05TVF9MSU1CKDEyMykpOworICBwb3N0ICgpOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX2RpdnJlbV8xYworICBwcmUgKCJtcG5fZGl2cmVtXzFjIik7CisgIG1wbl9kaXZyZW1fMWMgKHdwLCAobXBfc2l6ZV90KSAwLCB4cCwgc2l6ZSwgQ05TVF9MSU1CKDEyMyksIENOU1RfTElNQigxMjIpKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisgIHByZSAoIm1wbl9nY2RfMSIpOworICB4cFswXSB8PSAxOworICBub3RkZWFkICs9ICh1bnNpZ25lZCBsb25nKSBtcG5fZ2NkXzEgKHhwLCBzaXplLCBDTlNUX0xJTUIoMTIzKSk7CisgIHBvc3QgKCk7CisKKyAgcHJlICgibXBuX2hhbWRpc3QiKTsKKyAgbm90ZGVhZCArPSBtcG5faGFtZGlzdCAoeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9pb3JfbgorICBwcmUgKCJtcG5faW9yX24iKTsKKyAgbXBuX2lvcl9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX2lvcm5fbgorICBwcmUgKCJtcG5faW9ybl9uIik7CisgIG1wbl9pb3JuX24gKHdwLCB4cCwgeXAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCisKKyAgcHJlICgibXBuX2xzaGlmdCIpOworICBtcG5fbHNoaWZ0ICh3cCwgeHAsIHNpemUsIDEpOworICBwb3N0ICgpOworCisgIHByZSAoIm1wbl9tb2RfMSIpOworICBub3RkZWFkICs9IG1wbl9tb2RfMSAoeHAsIHNpemUsIENOU1RfTElNQigxMjMpKTsKKyAgcG9zdCAoKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9tb2RfMWMKKyAgcHJlICgibXBuX21vZF8xYyIpOworICBub3RkZWFkICs9IG1wbl9tb2RfMWMgKHhwLCBzaXplLCBDTlNUX0xJTUIoMTIzKSwgQ05TVF9MSU1CKDEyMikpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgNCA9PSAwCisgIHByZSAoIm1wbl9tb2RfMzRsc3ViMSIpOworICBub3RkZWFkICs9IG1wbl9tb2RfMzRsc3ViMSAoeHAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCisKKyAgcHJlICgibXBuX21vZGV4YWN0XzFfb2RkIik7CisgIG5vdGRlYWQgKz0gbXBuX21vZGV4YWN0XzFfb2RkICh4cCwgc2l6ZSwgQ05TVF9MSU1CKDEyMykpOworICBwb3N0ICgpOworCisgIHByZSAoIm1wbl9tb2RleGFjdF8xY19vZGQiKTsKKyAgbm90ZGVhZCArPSBtcG5fbW9kZXhhY3RfMWNfb2RkICh4cCwgc2l6ZSwgQ05TVF9MSU1CKDEyMyksIENOU1RfTElNQig0NTYpKTsKKyAgcG9zdCAoKTsKKworICBwcmUgKCJtcG5fbXVsXzEiKTsKKyAgbXBuX211bF8xICh3cCwgeHAsIHNpemUsIHlwWzBdKTsKKyAgcG9zdCAoKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9tdWxfMWMKKyAgcHJlICgibXBuX211bF8xYyIpOworICBtcG5fbXVsXzFjICh3cCwgeHAsIHNpemUsIHlwWzBdLCBDTlNUX0xJTUIoMCkpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fbXVsXzIKKyAgcHJlICgibXBuX211bF8yIik7CisgIG1wbl9tdWxfMiAod3AsIHhwLCBzaXplLTEsIHlwKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisgIHByZSAoIm1wbl9tdWxfYmFzZWNhc2UiKTsKKyAgbXBuX211bF9iYXNlY2FzZSAod3AsIHhwLCAobXBfc2l6ZV90KSAzLCB5cCwgKG1wX3NpemVfdCkgMyk7CisgIHBvc3QgKCk7CisKKyNpZiBIQVZFX05BVElWRV9tcG5fbmFuZF9uCisgIHByZSAoIm1wbl9uYW5kX24iKTsKKyAgbXBuX25hbmRfbiAod3AsIHhwLCB5cCwgc2l6ZSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl9uaW9yX24KKyAgcHJlICgibXBuX25pb3JfbiIpOworICBtcG5fbmlvcl9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisgIHByZSAoIm1wbl9wb3Bjb3VudCIpOworICBub3RkZWFkICs9IG1wbl9wb3Bjb3VudCAoeHAsIHNpemUpOworICBwb3N0ICgpOworCisgIHByZSAoIm1wbl9wcmVpbnZfbW9kXzEiKTsKKyAgbm90ZGVhZCArPSBtcG5fcHJlaW52X21vZF8xICh4cCwgc2l6ZSwgR01QX05VTUJfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZm1wbl9pbnZlcnRfbGltYiAoR01QX05VTUJfTUFYKSk7CisgIHBvc3QgKCk7CisKKyNpZiBVU0VfUFJFSU5WX0RJVlJFTV8xIHx8IEhBVkVfTkFUSVZFX21wbl9wcmVpbnZfZGl2cmVtXzEKKyAgcHJlICgibXBuX3ByZWludl9kaXZyZW1fMSIpOworICBtcG5fcHJlaW52X2RpdnJlbV8xICh3cCwgKG1wX3NpemVfdCkgMCwgeHAsIHNpemUsIEdNUF9OVU1CX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVmbXBuX2ludmVydF9saW1iIChHTVBfTlVNQl9NQVgpLCAwKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3JzaDFhZGRfbgorICBwcmUgKCJtcG5fcnNoMWFkZF9uIik7CisgIG1wbl9yc2gxYWRkX24gKHdwLCB4cCwgeXAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fcnNoMXN1Yl9uCisgIHByZSAoIm1wbl9yc2gxc3ViX24iKTsKKyAgbXBuX3JzaDFzdWJfbiAod3AsIHhwLCB5cCwgc2l6ZSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworICBwcmUgKCJtcG5fcnNoaWZ0Iik7CisgIG1wbl9yc2hpZnQgKHdwLCB4cCwgc2l6ZSwgMSk7CisgIHBvc3QgKCk7CisKKyAgcHJlICgibXBuX3Nxcl9iYXNlY2FzZSIpOworICBtcG5fc3FyX2Jhc2VjYXNlICh3cCwgeHAsIChtcF9zaXplX3QpIDMpOworICBwb3N0ICgpOworCisgIHByZSAoIm1wbl9zdWJtdWxfMSIpOworICBtcG5fc3VibXVsXzEgKHdwLCB4cCwgc2l6ZSwgeXBbMF0pOworICBwb3N0ICgpOworCisjaWYgSEFWRV9OQVRJVkVfbXBuX3N1Ym11bF8xYworICBwcmUgKCJtcG5fc3VibXVsXzFjIik7CisgIG1wbl9zdWJtdWxfMWMgKHdwLCB4cCwgc2l6ZSwgeXBbMF0sIENOU1RfTElNQigwKSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworICBwcmUgKCJtcG5fc3ViX24iKTsKKyAgbXBuX3N1Yl9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKworI2lmIEhBVkVfTkFUSVZFX21wbl9zdWJfbmMKKyAgcHJlICgibXBuX3N1Yl9uYyIpOworICBtcG5fc3ViX25jICh3cCwgeHAsIHlwLCBzaXplLCBDTlNUX0xJTUIoMCkpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fc3VibHNoMV9uCisgIHByZSAoIm1wbl9zdWJsc2gxX24iKTsKKyAgbXBuX3N1YmxzaDFfbiAod3AsIHhwLCB5cCwgc2l6ZSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl91ZGl2X3Fybm5kCisgIHByZSAoIm1wbl91ZGl2X3Fybm5kIik7CisgIG1wbl91ZGl2X3Fybm5kICgmd3BbMF0sIENOU1RfTElNQigxMjIpLCB4cFswXSwgQ05TVF9MSU1CKDEyMykpOworICBwb3N0ICgpOworI2VuZGlmCisKKyNpZiBIQVZFX05BVElWRV9tcG5fdWRpdl9xcm5uZF9yCisgIHByZSAoIm1wbl91ZGl2X3Fybm5kX3IiKTsKKyAgbXBuX3VkaXZfcXJubmQgKENOU1RfTElNQigxMjIpLCB4cFswXSwgQ05TVF9MSU1CKDEyMyksICZ3cFswXSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl91bXVsX3BwbW0KKyAgcHJlICgibXBuX3VtdWxfcHBtbSIpOworICBtcG5fdW11bF9wcG1tICgmd3BbMF0sIHhwWzBdLCB5cFswXSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl91bXVsX3BwbW1fcgorICBwcmUgKCJtcG5fdW11bF9wcG1tX3IiKTsKKyAgbXBuX3VtdWxfcHBtbV9yICgmd3BbMF0sIHhwWzBdLCB5cFswXSk7CisgIHBvc3QgKCk7CisjZW5kaWYKKworI2lmIEhBVkVfTkFUSVZFX21wbl94b3JfbgorICBwcmUgKCJtcG5feG9yX24iKTsKKyAgbXBuX3hvcl9uICh3cCwgeHAsIHlwLCBzaXplKTsKKyAgcG9zdCAoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9OQVRJVkVfbXBuX3hub3JfbgorICBwcmUgKCJtcG5feG5vcl9uIik7CisgIG1wbl94bm9yX24gKHdwLCB4cCwgeXAsIHNpemUpOworICBwb3N0ICgpOworI2VuZGlmCit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVjayAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCisKKyNlbHNlIC8qICEgV0FOVF9QUk9GSUxJTkdfSU5TVFJVTUVOVCAqLworCitpbnQKK21haW4gKHZvaWQpCit7CisgIGV4aXQgKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LWludmVydC5jIGIvdGVzdHMvbXBuL3QtaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LWludmVydC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiBUZXN0IGZvciBtcG5faW52ZXJ0IGZ1bmN0aW9uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIFNpemVzIGFyZSB1cCB0byAyXlNJWkVfTE9HIGxpbWJzICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDEyCisjZW5kaWYKKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCAxMDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfTiAoMUwgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1JTl9OIDEKKworCitzdGF0aWMgaW50CitpbnZlcnRfdmFsaWQgKG1wX3NyY3B0ciBpcCwgbXBfc3JjcHRyIGRwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfcHRyIHRwOworICBpbnQgY3k7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoMipuKTsKKworICByZWZtcG5fbXVsICh0cCwgaXAsIG4sIGRwLCBuKTsKKyAgY3kgID0gcmVmbXBuX2FkZF9uICh0cCArIG4sIHRwICsgbiwgZHAsIG4pOyAvKiBUaGlzIG11c3Qgbm90IGdpdmUgYSBjYXJyeS4gKi8KKyAgY3kgLT0gcmVmbXBuX2FkZCAodHAsIHRwLCAyKm4sIGRwLCBuKTsgLyogVGhpcyBtdXN0IGdpdmUgYSBjYXJyeS4gKi8KKyAgVE1QX0ZSRUU7CisKKyAgcmV0dXJuIChjeSA9PSAtMSk7Cit9CisKKy8qCisgIENoZWNrIHRoZSByZXN1bHQgb2YgdGhlIG1wbl9pbnZlcnQgZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkuCisqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGlwLCBkcCwgc2NyYXRjaDsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBkcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04pOworICBpcCA9IDErVE1QX0FMTE9DX0xJTUJTIChNQVhfTiArIDIpOworICBzY3JhdGNoCisgICAgPSAxK1RNUF9BTExPQ19MSU1CUyAobXBuX2ludmVydF9pdGNoIChNQVhfTikgKyAyKTsKKworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgY291bnQ7IHRlc3QrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaXplX21pbjsKKyAgICAgIHVuc2lnbmVkIHNpemVfcmFuZ2U7CisgICAgICBtcF9zaXplX3QgbjsKKyAgICAgIG1wX3NpemVfdCBpdGNoOworICAgICAgbXBfbGltYl90IGlfYmVmb3JlLCBpX2FmdGVyLCBzX2JlZm9yZSwgc19hZnRlcjsKKworICAgICAgZm9yIChzaXplX21pbiA9IDE7ICgxTCA8PCBzaXplX21pbikgPCBNSU5fTjsgc2l6ZV9taW4rKykKKwk7CisKKyAgICAgIC8qIFdlIGdlbmVyYXRlIGFuIGluIHRoZSBNSU5fTiA8PSBuIDw9ICgxIDw8IHNpemVfcmFuZ2UpLiAqLworICAgICAgc2l6ZV9yYW5nZSA9IHNpemVfbWluCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBTSVpFX0xPRyArIDEgLSBzaXplX21pbik7CisKKyAgICAgIG4gPSBNSU5fTgorCSsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgKDFMIDw8IHNpemVfcmFuZ2UpICsgMSAtIE1JTl9OKTsKKworICAgICAgbXBuX3JhbmRvbTIgKGRwLCBuKTsKKworICAgICAgbXBuX3JhbmRvbTIgKGlwLTEsIG4gKyAyKTsKKyAgICAgIGlfYmVmb3JlID0gaXBbLTFdOworICAgICAgaV9hZnRlciA9IGlwW25dOworCisgICAgICBpdGNoID0gbXBuX2ludmVydF9pdGNoIChuKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKGl0Y2ggPD0gbXBuX2ludmVydF9pdGNoIChNQVhfTikpOworICAgICAgbXBuX3JhbmRvbTIgKHNjcmF0Y2gtMSwgaXRjaCsyKTsKKyAgICAgIHNfYmVmb3JlID0gc2NyYXRjaFstMV07CisgICAgICBzX2FmdGVyID0gc2NyYXRjaFtpdGNoXTsKKworICAgICAgZHBbbi0xXSB8PSBHTVBfTlVNQl9ISUdIQklUOworICAgICAgbXBuX2ludmVydCAoaXAsIGRwLCBuLCBzY3JhdGNoKTsKKyAgICAgIGlmIChpcFstMV0gIT0gaV9iZWZvcmUgfHwgaXBbbl0gIT0gaV9hZnRlcgorCSAgfHwgc2NyYXRjaFstMV0gIT0gc19iZWZvcmUgfHwgc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyCisJICB8fCAhIGludmVydF92YWxpZChpcCwgZHAsIG4pKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SIGluIHRlc3QgJWQsIG4gPSAlZFxuIiwKKwkJICB0ZXN0LCAoaW50KSBuKTsKKwkgIGlmIChpcFstMV0gIT0gaV9iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgaXA6Iik7IG1wbl9kdW1wIChpcCAtMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZpX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChpcFtuXSAhPSBpX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgaXA6Iik7IG1wbl9kdW1wIChpcCArIG4sIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmaV9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHNjcmF0Y2g6Iik7IG1wbl9kdW1wIChzY3JhdGNoICsgaXRjaCwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgbXBuX2R1bXAgKGRwLCBuKTsKKwkgIG1wbl9kdW1wIChpcCwgbik7CisKKwkgIGFib3J0KCk7CisJfQorICAgIH0KKyAgVE1QX0ZSRUU7CisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1pb3JkX3UuYyBiL3Rlc3RzL21wbi90LWlvcmRfdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjc3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1pb3JkX3UuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogVGVzdCBNUE5fSU5DUl9VIGFuZCBNUE5fREVDUl9VLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogVGhlIGkzODYgTVBOX0lOQ1JfVSBhbmQgTVBOX0RFQ1JfVSBoYXZlIHNwZWNpYWwgY2FzZXMgZm9yICJuIiBiZWluZyBhCisgICBjb21waWxlLXRpbWUgY29uc3RhbnQgMSwgc28gdGhhdCdzIGV4ZXJjaXNlZCBleHBsaWNpdGx5LiAgKi8KKworCisjZGVmaW5lIE0gICAgIEdNUF9OVU1CX01BWAorI2RlZmluZSBTSVpFICAoKG1wX3NpemVfdCkgMTApCisKKwordm9pZAorY2hlY2tfb25lIChjb25zdCBjaGFyICpuYW1lLCBpbnQgaSwKKyAgICAgICAgICAgbXBfc3JjcHRyIHNyYywgbXBfbGltYl90IG4sCisgICAgICAgICAgIG1wX3NyY3B0ciBnb3QsIG1wX3NyY3B0ciB3YW50LCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKCEgcmVmbXBuX2VxdWFsX2FueW5haWwgKGdvdCwgd2FudCwgc2l6ZSkpCisgICAgeworICAgICAgcHJpbnRmICgiV3JvbmcgYXQgJXMgaT0lZFxuIiwgbmFtZSwgaSk7CisgICAgICBtcG5fdHJhY2UgKCIgIHNyYyIsIHNyYywgIHNpemUpOworICAgICAgbXBuX3RyYWNlICgiICAgIG4iLCAmbiwgICAobXBfc2l6ZV90KSAxKTsKKyAgICAgIG1wbl90cmFjZSAoIiAgZ290IiwgZ290LCAgc2l6ZSk7CisgICAgICBtcG5fdHJhY2UgKCIgd2FudCIsIHdhbnQsIHNpemUpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK3ZvaWQKK2NoZWNrX2luY3JfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbXBfbGltYl90ICAgICAgICBuOworICAgIGNvbnN0IG1wX2xpbWJfdCAgc3JjW1NJWkVdOworICAgIGNvbnN0IG1wX2xpbWJfdCAgd2FudFtTSVpFXTsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAxLCB7IDAgfSwgICB7IDEgfSB9LAorICAgIHsgMSwgeyAxMjMgfSwgeyAxMjQgfSB9LAorICAgIHsgMiwgeyAwIH0sICAgeyAyIH0gfSwKKyAgICB7IDIsIHsgMTIzIH0sIHsgMTI1IH0gfSwKKyAgICB7IE0sIHsgMCB9LCAgIHsgTSB9IH0sCisKKyAgICB7IDEsIHsgTSwgMCB9LCAgIHsgMCwgICAxIH0gfSwKKyAgICB7IDEsIHsgTSwgMTIzIH0sIHsgMCwgICAxMjQgfSB9LAorICAgIHsgMiwgeyBNLCAwIH0sICAgeyAxLCAgIDEgfSB9LAorICAgIHsgMiwgeyBNLCAxMjMgfSwgeyAxLCAgIDEyNCB9IH0sCisgICAgeyBNLCB7IE0sIDAgfSwgICB7IE0tMSwgMSB9IH0sCisgICAgeyBNLCB7IE0sIDEyMyB9LCB7IE0tMSwgMTI0IH0gfSwKKworICAgIHsgMSwgeyBNLCBNLCAwIH0sICAgeyAwLCAgIDAsIDEgfSB9LAorICAgIHsgMSwgeyBNLCBNLCAxMjMgfSwgeyAwLCAgIDAsIDEyNCB9IH0sCisgICAgeyAyLCB7IE0sIE0sIDAgfSwgICB7IDEsICAgMCwgMSB9IH0sCisgICAgeyAyLCB7IE0sIE0sIDEyMyB9LCB7IDEsICAgMCwgMTI0IH0gfSwKKyAgICB7IE0sIHsgTSwgTSwgMCB9LCAgIHsgTS0xLCAwLCAxIH0gfSwKKyAgICB7IE0sIHsgTSwgTSwgMTIzIH0sIHsgTS0xLCAwLCAxMjQgfSB9LAorCisgICAgeyAxLCB7IE0sIE0sIE0sIDAgfSwgICB7IDAsICAgMCwgMCwgMSB9IH0sCisgICAgeyAxLCB7IE0sIE0sIE0sIDEyMyB9LCB7IDAsICAgMCwgMCwgMTI0IH0gfSwKKyAgICB7IDIsIHsgTSwgTSwgTSwgMCB9LCAgIHsgMSwgICAwLCAwLCAxIH0gfSwKKyAgICB7IDIsIHsgTSwgTSwgTSwgMTIzIH0sIHsgMSwgICAwLCAwLCAxMjQgfSB9LAorICAgIHsgTSwgeyBNLCBNLCBNLCAwIH0sICAgeyBNLTEsIDAsIDAsIDEgfSB9LAorICAgIHsgTSwgeyBNLCBNLCBNLCAxMjMgfSwgeyBNLTEsIDAsIDAsIDEyNCB9IH0sCisKKyAgICB7IDEsIHsgTSwgTSwgTSwgTSwgMCB9LCAgIHsgMCwgICAwLCAwLCAwLCAxIH0gfSwKKyAgICB7IDEsIHsgTSwgTSwgTSwgTSwgMTIzIH0sIHsgMCwgICAwLCAwLCAwLCAxMjQgfSB9LAorICAgIHsgMiwgeyBNLCBNLCBNLCBNLCAwIH0sICAgeyAxLCAgIDAsIDAsIDAsIDEgfSB9LAorICAgIHsgMiwgeyBNLCBNLCBNLCBNLCAxMjMgfSwgeyAxLCAgIDAsIDAsIDAsIDEyNCB9IH0sCisgICAgeyBNLCB7IE0sIE0sIE0sIE0sIDAgfSwgICB7IE0tMSwgMCwgMCwgMCwgMSB9IH0sCisgICAgeyBNLCB7IE0sIE0sIE0sIE0sIDEyMyB9LCB7IE0tMSwgMCwgMCwgMCwgMTI0CisjaWYgZGVmaW5lZCAoX19ocHV4KSAmJiAhIGRlZmluZWQgKF9fR05VQ19fKQorICAgIC8qIFNvbWUgdmVyc2lvbnMgKGF0IGxlYXN0IEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCkgb2YgdGhlCisgICAgICAgSFAgQyBjb21waWxlcnMgZmFpbCB0byB6ZXJvLWZpbGwgYWdncmVnYXRlcyBhcyB0aGUgSVNPIEMgc3RhbmRhcmQKKyAgICAgICByZXF1aXJlcyAoY2YgNi41LjcgSW5pdGlhbGl6YXRpb24pLiAgQ29tcGVuc2F0ZSBoZXJlOiAgKi8KKwkJCQksIDAsIDAsIDAsIDAsIDAKKyNlbmRpZgorICAgIH0gfQorICB9OworCisgIG1wX2xpbWJfdCAgZ290W1NJWkVdOworICBpbnQgICBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICByZWZtcG5fY29weWkgKGdvdCwgZGF0YVtpXS5zcmMsIFNJWkUpOworICAgICAgTVBOX0lOQ1JfVSAoZ290LCBTSVpFLCBkYXRhW2ldLm4pOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfaW5jciAoZ2VuZXJhbCkiLCBpLAorICAgICAgICAgICAgICAgICBkYXRhW2ldLnNyYywgZGF0YVtpXS5uLAorICAgICAgICAgICAgICAgICBnb3QsIGRhdGFbaV0ud2FudCwgU0laRSk7CisKKyAgICAgIGlmIChkYXRhW2ldLm4gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgIHJlZm1wbl9jb3B5aSAoZ290LCBkYXRhW2ldLnNyYywgU0laRSk7CisgICAgICAgICAgTVBOX0lOQ1JfVSAoZ290LCBTSVpFLCBDTlNUX0xJTUIoMSkpOworICAgICAgICAgIGNoZWNrX29uZSAoImNoZWNrX2luY3IgKGNvbnN0IDEpIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uc3JjLCBkYXRhW2ldLm4sCisgICAgICAgICAgICAgICAgICAgICBnb3QsIGRhdGFbaV0ud2FudCwgU0laRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX2RlY3JfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbXBfbGltYl90ICAgICAgICBuOworICAgIGNvbnN0IG1wX2xpbWJfdCAgc3JjW1NJWkVdOworICAgIGNvbnN0IG1wX2xpbWJfdCAgd2FudFtTSVpFXTsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAxLCAgIHsgMSB9LCAgIHsgMCAgIH0gfSwKKyAgICB7IDEsICAgeyAxMjMgfSwgeyAxMjIgfSB9LAorICAgIHsgMSwgICB7IE0gfSwgICB7IE0tMSB9IH0sCisgICAgeyAyLCAgIHsgMiB9LCAgIHsgMCAgIH0gfSwKKyAgICB7IDIsICAgeyAxMjMgfSwgeyAxMjEgfSB9LAorICAgIHsgTSwgICB7IE0gfSwgICB7IDAgICB9IH0sCisgICAgeyBNLTEsIHsgTSB9LCAgIHsgMSAgIH0gfSwKKworICAgIHsgMSwgICB7IDAsICAgMSAgIH0sIHsgTSwgICAwICAgfSB9LAorICAgIHsgMSwgICB7IDAsICAgMTIzIH0sIHsgTSwgICAxMjIgfSB9LAorICAgIHsgMSwgICB7IDAsICAgTSAgIH0sIHsgTSwgICBNLTEgfSB9LAorICAgIHsgMiwgICB7IDAsICAgMTIzIH0sIHsgTS0xLCAxMjIgfSB9LAorICAgIHsgMiwgICB7IDEsICAgMTIzIH0sIHsgTSwgICAxMjIgfSB9LAorICAgIHsgTSwgICB7IDAsICAgMTIzIH0sIHsgMSwgICAxMjIgfSB9LAorICAgIHsgTSwgICB7IE0tMSwgTSAgIH0sIHsgTSwgICBNLTEgfSB9LAorCisgICAgeyAxLCAgIHsgMCwgICAwLCAxICAgfSwgeyBNLCAgIE0sIDAgICB9IH0sCisgICAgeyAxLCAgIHsgMCwgICAwLCAxMjMgfSwgeyBNLCAgIE0sIDEyMiB9IH0sCisgICAgeyAxLCAgIHsgMCwgICAwLCBNICAgfSwgeyBNLCAgIE0sIE0tMSB9IH0sCisgICAgeyAyLCAgIHsgMCwgICAwLCAxMjMgfSwgeyBNLTEsIE0sIDEyMiB9IH0sCisgICAgeyAyLCAgIHsgMSwgICAwLCAxMjMgfSwgeyBNLCAgIE0sIDEyMiB9IH0sCisgICAgeyBNLCAgIHsgMCwgICAwLCAxMjMgfSwgeyAxLCAgIE0sIDEyMiB9IH0sCisgICAgeyBNLCAgIHsgTS0xLCAwLCBNICAgfSwgeyBNLCAgIE0sIE0tMSB9IH0sCisKKyAgICB7IDEsICAgeyAwLCAgIDAsIDAsIDEgICB9LCB7IE0sICAgTSwgTSwgMCAgIH0gfSwKKyAgICB7IDEsICAgeyAwLCAgIDAsIDAsIDEyMyB9LCB7IE0sICAgTSwgTSwgMTIyIH0gfSwKKyAgICB7IDEsICAgeyAwLCAgIDAsIDAsIE0gICB9LCB7IE0sICAgTSwgTSwgTS0xIH0gfSwKKyAgICB7IDIsICAgeyAwLCAgIDAsIDAsIDEyMyB9LCB7IE0tMSwgTSwgTSwgMTIyIH0gfSwKKyAgICB7IDIsICAgeyAxLCAgIDAsIDAsIDEyMyB9LCB7IE0sICAgTSwgTSwgMTIyIH0gfSwKKyAgICB7IE0sICAgeyAwLCAgIDAsIDAsIDEyMyB9LCB7IDEsICAgTSwgTSwgMTIyIH0gfSwKKyAgICB7IE0sICAgeyBNLTEsIDAsIDAsIE0gICB9LCB7IE0sICAgTSwgTSwgTS0xIH0gfSwKKworICAgIHsgMSwgICB7IDAsICAgMCwgMCwgMCwgMSAgIH0sIHsgTSwgICBNLCBNLCBNLCAwICAgfSB9LAorICAgIHsgMSwgICB7IDAsICAgMCwgMCwgMCwgMTIzIH0sIHsgTSwgICBNLCBNLCBNLCAxMjIgfSB9LAorICAgIHsgMSwgICB7IDAsICAgMCwgMCwgMCwgTSAgIH0sIHsgTSwgICBNLCBNLCBNLCBNLTEgfSB9LAorICAgIHsgMiwgICB7IDAsICAgMCwgMCwgMCwgMTIzIH0sIHsgTS0xLCBNLCBNLCBNLCAxMjIgfSB9LAorICAgIHsgMiwgICB7IDEsICAgMCwgMCwgMCwgMTIzIH0sIHsgTSwgICBNLCBNLCBNLCAxMjIgfSB9LAorICAgIHsgTSwgICB7IDAsICAgMCwgMCwgMCwgMTIzIH0sIHsgMSwgICBNLCBNLCBNLCAxMjIgfSB9LAorICAgIHsgTSwgICB7IE0tMSwgMCwgMCwgMCwgTSAgIH0sIHsgTSwgICBNLCBNLCBNLCBNLTEgfSB9LAorCisgICAgeyAxLCAgIHsgMCwgICAwLCAwLCAwLCAwLCAxICAgfSwgeyBNLCAgIE0sIE0sIE0sIE0sIDAgICB9IH0sCisgICAgeyAxLCAgIHsgMCwgICAwLCAwLCAwLCAwLCAxMjMgfSwgeyBNLCAgIE0sIE0sIE0sIE0sIDEyMiB9IH0sCisgICAgeyAxLCAgIHsgMCwgICAwLCAwLCAwLCAwLCBNICAgfSwgeyBNLCAgIE0sIE0sIE0sIE0sIE0tMSB9IH0sCisgICAgeyAyLCAgIHsgMCwgICAwLCAwLCAwLCAwLCAxMjMgfSwgeyBNLTEsIE0sIE0sIE0sIE0sIDEyMiB9IH0sCisgICAgeyAyLCAgIHsgMSwgICAwLCAwLCAwLCAwLCAxMjMgfSwgeyBNLCAgIE0sIE0sIE0sIE0sIDEyMiB9IH0sCisgICAgeyBNLCAgIHsgMCwgICAwLCAwLCAwLCAwLCAxMjMgfSwgeyAxLCAgIE0sIE0sIE0sIE0sIDEyMiB9IH0sCisgICAgeyBNLCAgIHsgTS0xLCAwLCAwLCAwLCAwLCBNICAgfSwgeyBNLCAgIE0sIE0sIE0sIE0sIE0tMQorI2lmIGRlZmluZWQgKF9faHB1eCkgJiYgISBkZWZpbmVkIChfX0dOVUNfXykKKyAgICAvKiBGb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBnYXJiYWdlLCBzZWUgcHJldmlvdXMgZnVuY3Rpb24uICAqLworCQkJCSAgICAgICAsIDAsIDAsIDAsIDAKKyNlbmRpZgorICAgIH0gfQorICB9OworCisgIG1wX2xpbWJfdCAgZ290W1NJWkVdOworICBpbnQgICBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICByZWZtcG5fY29weWkgKGdvdCwgZGF0YVtpXS5zcmMsIFNJWkUpOworICAgICAgTVBOX0RFQ1JfVSAoZ290LCBTSVpFLCBkYXRhW2ldLm4pOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfZGVjcl9kYXRhIiwgaSwKKyAgICAgICAgICAgICAgICAgZGF0YVtpXS5zcmMsIGRhdGFbaV0ubiwKKyAgICAgICAgICAgICAgICAgZ290LCBkYXRhW2ldLndhbnQsIFNJWkUpOworCisgICAgICBpZiAoZGF0YVtpXS5uID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICByZWZtcG5fY29weWkgKGdvdCwgZGF0YVtpXS5zcmMsIFNJWkUpOworICAgICAgICAgIE1QTl9ERUNSX1UgKGdvdCwgU0laRSwgQ05TVF9MSU1CKDEpKTsKKyAgICAgICAgICBjaGVja19vbmUgKCJjaGVja19kZWNyIChjb25zdCAxKSIsIGksCisgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldLnNyYywgZGF0YVtpXS5uLAorICAgICAgICAgICAgICAgICAgICAgZ290LCBkYXRhW2ldLndhbnQsIFNJWkUpOworICAgICAgICB9CisgICAgfQorfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgY2hlY2tfaW5jcl9kYXRhICgpOworICBjaGVja19kZWNyX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LW1hdHJpeDIyLmMgYi90ZXN0cy9tcG4vdC1tYXRyaXgyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTFlM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1tYXRyaXgyMi5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiBUZXN0cyBtYXRyaXgyMl9tdWwuCisKK0NvcHlyaWdodCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworc3RydWN0IG1hdHJpeCB7CisgIG1wX3NpemVfdCBhbGxvYzsKKyAgbXBfc2l6ZV90IG47CisgIG1wX3B0ciBlMDAsIGUwMSwgZTEwLCBlMTE7Cit9OworCitzdGF0aWMgdm9pZAorbWF0cml4X2luaXQgKHN0cnVjdCBtYXRyaXggKk0sIG1wX3NpemVfdCBuKQoreworICBtcF9wdHIgcCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKDQqKG4rMSkpOworICBNLT5lMDAgPSBwOyBwICs9IG4rMTsKKyAgTS0+ZTAxID0gcDsgcCArPSBuKzE7CisgIE0tPmUxMCA9IHA7IHAgKz0gbisxOworICBNLT5lMTEgPSBwOworICBNLT5hbGxvYyA9IG4gKyAxOworICBNLT5uID0gMDsKK30KKworc3RhdGljIHZvaWQKK21hdHJpeF9jbGVhciAoc3RydWN0IG1hdHJpeCAqTSkKK3sKKyAgcmVmbXBuX2ZyZWVfbGltYnMgKE0tPmUwMCk7Cit9CisKK3N0YXRpYyB2b2lkCittYXRyaXhfY29weSAoc3RydWN0IG1hdHJpeCAqUiwgY29uc3Qgc3RydWN0IG1hdHJpeCAqTSkKK3sKKyAgUi0+biA9IE0tPm47CisgIE1QTl9DT1BZIChSLT5lMDAsIE0tPmUwMCwgTS0+bik7CisgIE1QTl9DT1BZIChSLT5lMDEsIE0tPmUwMSwgTS0+bik7CisgIE1QTl9DT1BZIChSLT5lMTAsIE0tPmUxMCwgTS0+bik7CisgIE1QTl9DT1BZIChSLT5lMTEsIE0tPmUxMSwgTS0+bik7Cit9CisKKy8qIFVzZWQgd2l0aCBzYW1lIHNpemUsIHNvIG5vIG5lZWQgZm9yIG5vcm1hbGl6YXRpb24uICovCitzdGF0aWMgaW50CittYXRyaXhfZXF1YWxfcCAoY29uc3Qgc3RydWN0IG1hdHJpeCAqQSwgY29uc3Qgc3RydWN0IG1hdHJpeCAqQikKK3sKKyAgcmV0dXJuIChBLT5uID09IEItPm4KKwkgICYmIG1wbl9jbXAgKEEtPmUwMCwgQi0+ZTAwLCBBLT5uKSA9PSAwCisJICAmJiBtcG5fY21wIChBLT5lMDEsIEItPmUwMSwgQS0+bikgPT0gMAorCSAgJiYgbXBuX2NtcCAoQS0+ZTEwLCBCLT5lMTAsIEEtPm4pID09IDAKKwkgICYmIG1wbl9jbXAgKEEtPmUxMSwgQi0+ZTExLCBBLT5uKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK21hdHJpeF9yYW5kb20oc3RydWN0IG1hdHJpeCAqTSwgbXBfc2l6ZV90IG4sIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzKQoreworICBNLT5uID0gbjsKKyAgbXBuX3JhbmRvbSAoTS0+ZTAwLCBuKTsKKyAgbXBuX3JhbmRvbSAoTS0+ZTAxLCBuKTsKKyAgbXBuX3JhbmRvbSAoTS0+ZTEwLCBuKTsKKyAgbXBuX3JhbmRvbSAoTS0+ZTExLCBuKTsKK30KKworI2RlZmluZSBNVUwocnAsIGFwLCBhbiwgYnAsIGJuKSBkbyB7IFwKKyAgICBpZiAoYW4gPiBibikJCSAgICAgXAorICAgICAgbXBuX211bCAocnAsIGFwLCBhbiwgYnAsIGJuKTsgIFwKKyAgICBlbHNlCQkJICAgICBcCisgICAgICBtcG5fbXVsIChycCwgYnAsIGJuLCBhcCwgYW4pOyAgXAorICB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkCityZWZfbWF0cml4MjJfbXVsIChzdHJ1Y3QgbWF0cml4ICpSLAorCQkgIGNvbnN0IHN0cnVjdCBtYXRyaXggKkEsCisJCSAgY29uc3Qgc3RydWN0IG1hdHJpeCAqQiwgbXBfcHRyIHRwKQoreworICBtcF9zaXplX3QgYW4sIGJuLCBuOworICBtcF9wdHIgcjAwLCByMDEsIHIxMCwgcjExLCBhMDAsIGEwMSwgYTEwLCBhMTEsIGIwMCwgYjAxLCBiMTAsIGIxMTsKKworICBpZiAoQS0+biA+PSBCLT5uKQorICAgIHsKKyAgICAgIHIwMCA9IFItPmUwMDsgYTAwID0gQS0+ZTAwOyBiMDAgPSBCLT5lMDA7CisgICAgICByMDEgPSBSLT5lMDE7IGEwMSA9IEEtPmUwMTsgYjAxID0gQi0+ZTAxOworICAgICAgcjEwID0gUi0+ZTEwOyBhMTAgPSBBLT5lMTA7IGIxMCA9IEItPmUxMDsKKyAgICAgIHIxMSA9IFItPmUxMTsgYTExID0gQS0+ZTExOyBiMTEgPSBCLT5lMTE7CisgICAgICBhbiA9IEEtPm4sIGJuID0gQi0+bjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUcmFuc3Bvc2UgKi8KKyAgICAgIHIwMCA9IFItPmUwMDsgYTAwID0gQi0+ZTAwOyBiMDAgPSBBLT5lMDA7CisgICAgICByMDEgPSBSLT5lMTA7IGEwMSA9IEItPmUxMDsgYjAxID0gQS0+ZTEwOworICAgICAgcjEwID0gUi0+ZTAxOyBhMTAgPSBCLT5lMDE7IGIxMCA9IEEtPmUwMTsKKyAgICAgIHIxMSA9IFItPmUxMTsgYTExID0gQi0+ZTExOyBiMTEgPSBBLT5lMTE7CisgICAgICBhbiA9IEItPm4sIGJuID0gQS0+bjsKKyAgICB9CisgIG4gPSBhbiArIGJuOworICBSLT5uID0gbiArIDE7CisKKyAgbXBuX211bCAocjAwLCBhMDAsIGFuLCBiMDAsIGJuKTsKKyAgbXBuX211bCAodHAsIGEwMSwgYW4sIGIxMCwgYm4pOworICByMDBbbl0gPSBtcG5fYWRkX24gKHIwMCwgcjAwLCB0cCwgbik7CisKKyAgbXBuX211bCAocjAxLCBhMDAsIGFuLCBiMDEsIGJuKTsKKyAgbXBuX211bCAodHAsIGEwMSwgYW4sIGIxMSwgYm4pOworICByMDFbbl0gPSBtcG5fYWRkX24gKHIwMSwgcjAxLCB0cCwgbik7CisKKyAgbXBuX211bCAocjEwLCBhMTAsIGFuLCBiMDAsIGJuKTsKKyAgbXBuX211bCAodHAsIGExMSwgYW4sIGIxMCwgYm4pOworICByMTBbbl0gPSBtcG5fYWRkX24gKHIxMCwgcjEwLCB0cCwgbik7CisKKyAgbXBuX211bCAocjExLCBhMTAsIGFuLCBiMDEsIGJuKTsKKyAgbXBuX211bCAodHAsIGExMSwgYW4sIGIxMSwgYm4pOworICByMTFbbl0gPSBtcG5fYWRkX24gKHIxMSwgcjExLCB0cCwgbik7Cit9CisKK3N0YXRpYyB2b2lkCitvbmVfdGVzdCAoY29uc3Qgc3RydWN0IG1hdHJpeCAqQSwgY29uc3Qgc3RydWN0IG1hdHJpeCAqQiwgaW50IGkpCit7CisgIHN0cnVjdCBtYXRyaXggUjsKKyAgc3RydWN0IG1hdHJpeCBQOworICBtcF9wdHIgdHA7CisKKyAgbWF0cml4X2luaXQgKCZSLCBBLT5uICsgQi0+biArIDEpOworICBtYXRyaXhfaW5pdCAoJlAsIEEtPm4gKyBCLT5uICsgMSk7CisKKyAgdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChtcG5fbWF0cml4MjJfbXVsX2l0Y2ggKEEtPm4sIEItPm4pKTsKKworICByZWZfbWF0cml4MjJfbXVsICgmUiwgQSwgQiwgdHApOworICBtYXRyaXhfY29weSAoJlAsIEEpOworICBtcG5fbWF0cml4MjJfbXVsIChQLmUwMCwgUC5lMDEsIFAuZTEwLCBQLmUxMSwgQS0+biwKKwkJICAgIEItPmUwMCwgQi0+ZTAxLCBCLT5lMTAsIEItPmUxMSwgQi0+biwgdHApOworICBQLm4gPSBBLT5uICsgQi0+biArIDE7CisgIGlmICghbWF0cml4X2VxdWFsX3AgKCZSLCAmUCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgaSk7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiQSA9ICglTngsICVOeFxuICAgICAgJU54LCAlTngpXG4iCisJCSAgICJCID0gKCVOeCwgJU54XG4gICAgICAlTngsICVOeClcbiIKKwkJICAgIlIgPSAoJU54LCAlTnggKGV4cGVjdGVkKVxuICAgICAgJU54LCAlTngpXG4iCisJCSAgICJQID0gKCVOeCwgJU54IChpbmNvcnJlY3QpXG4gICAgICAlTngsICVOeClcbiIsCisJCSAgIEEtPmUwMCwgQS0+biwgQS0+ZTAxLCBBLT5uLCBBLT5lMTAsIEEtPm4sIEEtPmUxMSwgQS0+biwKKwkJICAgQi0+ZTAwLCBCLT5uLCBCLT5lMDEsIEItPm4sIEItPmUxMCwgQi0+biwgQi0+ZTExLCBCLT5uLAorCQkgICBSLmUwMCwgUi5uLCBSLmUwMSwgUi5uLCBSLmUxMCwgUi5uLCBSLmUxMSwgUi5uLAorCQkgICBQLmUwMCwgUC5uLCBQLmUwMSwgUC5uLCBQLmUxMCwgUC5uLCBQLmUxMSwgUC5uKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICByZWZtcG5fZnJlZV9saW1icyAodHApOworICBtYXRyaXhfY2xlYXIgKCZSKTsKKyAgbWF0cml4X2NsZWFyICgmUCk7Cit9CisKKyNkZWZpbmUgTUFYX1NJWkUgKDIrMipNQVRSSVgyMl9TVFJBU1NFTl9USFJFU0hPTEQpCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgbWF0cml4IEE7CisgIHN0cnVjdCBtYXRyaXggQjsKKworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIGludCBpOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1hdHJpeF9pbml0ICgmQSwgTUFYX1NJWkUpOworICBtYXRyaXhfaW5pdCAoJkIsIE1BWF9TSVpFKTsKKyAgbXB6X2luaXQgKGJzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBhbiwgYm47CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgYW4gPSAxICsgbXB6X2dldF91aSAoYnMpICUgTUFYX1NJWkU7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgYm4gPSAxICsgbXB6X2dldF91aSAoYnMpICUgTUFYX1NJWkU7CisKKyAgICAgIG1hdHJpeF9yYW5kb20gKCZBLCBhbiwgcmFuZHMpOworICAgICAgbWF0cml4X3JhbmRvbSAoJkIsIGJuLCByYW5kcyk7CisKKyAgICAgIG9uZV90ZXN0ICgmQSwgJkIsIGkpOworICAgIH0KKyAgbXB6X2NsZWFyIChicyk7CisgIG1hdHJpeF9jbGVhciAoJkEpOworICBtYXRyaXhfY2xlYXIgKCZCKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtbWludmVydC5jIGIvdGVzdHMvbXBuL3QtbWludmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTY5MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1taW52ZXJ0LmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIHN0cnRvbCAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgInRlc3RzL3Rlc3RzLmgiCisKKyNkZWZpbmUgTUFYX1NJWkUgNTAKKworI2RlZmluZSBDT1VOVCAyMDAKKworc3RhdGljIHZvaWQKK21wel90b19tcG4gKG1wX3B0ciBhcCwgbXBfc2l6ZV90IGFuLCBjb25zdCBtcHpfdCBiKQoreworICBtcF9zaXplX3QgYm4gPSBtcHpfc2l6ZSAoYik7CisgIEFTU0VSVF9BTFdBWVMgKGJuIDw9IGFuKTsKKyAgTVBOX0NPUFlfSU5DUiAoYXAsIG1wel9saW1ic19yZWFkIChiKSwgYm4pOworICBNUE5fWkVSTyAoYXAgKyBibiwgYW4gLSBibik7Cit9CisKK2ludAorbXB6X2VxX21wbiAobXBfcHRyIGFwLCBtcF9zaXplX3QgYW4sIGNvbnN0IG1wel90IGIpCit7CisgIG1wX3NpemVfdCBibiA9IG1wel9zaXplIChiKTsKKworICByZXR1cm4gKGJuID49IDAgJiYgYm4gPD0gYW4KKwkgICYmIG1wbl9jbXAgKGFwLCBtcHpfbGltYnNfcmVhZCAoYiksIGJuKSA9PSAwCisJICAmJiAoYW4gPT0gYm4gfHwgbXBuX3plcm9fcCAoYXAgKyBibiwgYW4gLSBibikpKTsKK30KKworc3RhdGljIG1wX2JpdGNudF90CitiaXRfc2l6ZSAobXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgbikKK3sKKyAgTVBOX05PUk1BTElaRSAoeHAsIG4pOworICByZXR1cm4gbiA+IDAgPyBtcG5fc2l6ZWluYmFzZSAoeHAsIG4sIDIpIDogMDsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBsb25nIGNvdW50ID0gQ09VTlQ7CisgIG1wX3B0ciBtcDsKKyAgbXBfcHRyIGFwOworICBtcF9wdHIgdHA7CisgIG1wX3B0ciBzY3JhdGNoOworICBtcHpfdCBtLCBhLCByLCBnOworICBpbnQgdGVzdDsKKyAgbXBfbGltYl90IHJhbjsKKyAgbXBfc2l6ZV90IGl0Y2g7CisgIFRNUF9ERUNMOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisKKyAgVE1QX01BUks7CisgIG1wel9pbml0IChtKTsKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAocik7CisgIG1wel9pbml0IChnKTsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgbXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9TSVpFKTsKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9TSVpFKTsKKyAgdHAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9TSVpFKTsKKyAgc2NyYXRjaCA9IFRNUF9BTExPQ19MSU1CUyAobXBuX3NlY19pbnZlcnRfaXRjaCAoTUFYX1NJWkUpICsgMSk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IGNvdW50OyB0ZXN0KyspCisgICAgeworICAgICAgbXBfYml0Y250X3QgYml0czsKKyAgICAgIGludCBycmVzLCB0cmVzOworICAgICAgbXBfc2l6ZV90IG47CisKKyAgICAgIGJpdHMgPSB1cmFuZG9tICgpICUgKEdNUF9OVU1CX0JJVFMgKiBNQVhfU0laRSkgKyAxOworCisgICAgICBpZiAodGVzdCAmIDEpCisJbXB6X3JyYW5kb21iIChtLCByYW5kcywgYml0cyk7CisgICAgICBlbHNlCisJbXB6X3VyYW5kb21iIChtLCByYW5kcywgYml0cyk7CisgICAgICBpZiAodGVzdCAmIDIpCisJbXB6X3JyYW5kb21iIChhLCByYW5kcywgYml0cyk7CisgICAgICBlbHNlCisJbXB6X3VyYW5kb21iIChhLCByYW5kcywgYml0cyk7CisKKyAgICAgIG1wel9zZXRiaXQgKG0sIDApOworICAgICAgaWYgKHRlc3QgJiA0KQorCXsKKwkgIC8qIEVuc3VyZSBpdCByZWFsbHkgaXMgaW52ZXJ0aWJsZSAqLworCSAgaWYgKG1wel9zZ24gKGEpID09IDApCisJICAgIG1wel9zZXRfdWkgKGEsIDEpOworCSAgZWxzZQorCSAgICBmb3IgKDs7KQorCSAgICAgIHsKKwkJbXB6X2djZCAoZywgYSwgbSk7CisJCWlmIChtcHpfY21wX3VpIChnLCAxKSA9PSAwKQorCQkgIGJyZWFrOworCQltcHpfcmVtb3ZlIChhLCBhLCBnKTsKKwkgICAgICB9CisJfQorCisgICAgICBycmVzID0gbXB6X2ludmVydCAociwgYSwgbSk7CisgICAgICBpZiAoICh0ZXN0ICYgNCkgJiYgIXJyZXMpCisJeworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgInRlc3QgJWQ6IE5vdCBpbnZlcnRpYmxlIVxuIgorCQkgICAgICAgIm0gPSAlWmRcbiIKKwkJICAgICAgICJhID0gJVpkXG4iLCB0ZXN0LCBtLCBhKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICAgIEFTU0VSVF9BTFdBWVMgKCEgKHRlc3QgJiA0KSB8fCBycmVzKTsKKworICAgICAgbiA9IChiaXRzICsgR01QX05VTUJfQklUUyAtIDEpIC8gR01QX05VTUJfQklUUzsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKG4gPD0gTUFYX1NJWkUpOworICAgICAgaXRjaCA9IG1wbl9zZWNfaW52ZXJ0X2l0Y2ggKG4pOworICAgICAgc2NyYXRjaFtpdGNoXSA9IHJhbiA9IHVyYW5kb20gKCk7CisKKyAgICAgIG1wel90b19tcG4gKGFwLCBuLCBhKTsKKyAgICAgIG1wel90b19tcG4gKG1wLCBuLCBtKTsKKyAgICAgIHRyZXMgPSBtcG5fc2VjX2ludmVydCAodHAsIGFwLCBtcCwgbiwKKwkJCSAgICAgYml0X3NpemUgKGFwLCBuKSArIGJpdF9zaXplIChtcCwgbiksCisJCQkgICAgIHNjcmF0Y2gpOworCisgICAgICBpZiAocnJlcyAhPSB0cmVzIHx8IChycmVzID09IDEgJiYgIW1wel9lcV9tcG4gKHRwLCBuLCByKSkgfHwgcmFuICE9IHNjcmF0Y2hbaXRjaF0pCisJeworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIlRlc3QgJWQgZmFpbGVkLlxuIgorCQkgICAgICAgIm0gPSAlWmRcbiIKKwkJICAgICAgICJhID0gJVpkXG4iLCB0ZXN0LCBtLCBhKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgInJlZiByZXQ6ICVkXG4iCisJCSAgImdvdCByZXQ6ICVkXG4iLCBycmVzLCB0cmVzKTsKKwkgIGlmIChycmVzKQorCSAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAicmVmOiAlWmRcbiIsIHIpOworCSAgaWYgKHRyZXMpCisJICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJnb3Q6ICVOZFxuIiwgdHAsIG4pOworCSAgaWYgKHJhbiAhPSBzY3JhdGNoW2l0Y2hdKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJzY3JhdGNoW2l0Y2hdIGNoYW5nZWQuXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgVE1QX0ZSRUU7CisKKyAgbXB6X2NsZWFyIChtKTsKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChyKTsKKyAgbXB6X2NsZWFyIChnKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtbW9kXzEuYyBiL3Rlc3RzL21wbi90LW1vZF8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NTcwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LW1vZF8xLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIFRlc3QgbXBuX21vZF8xIHZhcmlhbnRzLgorCitDb3B5cmlnaHQgMjAxMCwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3N0YXRpYyB2b2lkCitjaGVja19vbmUgKG1wX3NyY3B0ciBhcCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBiKQoreworICBtcF9saW1iX3Qgcl9yZWYgPSByZWZtcG5fbW9kXzEgKGFwLCBuLCBiKTsKKyAgbXBfbGltYl90IHI7CisKKyAgaWYgKG4gPj0gMikKKyAgICB7CisgICAgICBtcF9saW1iX3QgcHJlWzRdOworICAgICAgbXBuX21vZF8xXzFwX2NwcyAocHJlLCBiKTsKKyAgICAgIHIgPSBtcG5fbW9kXzFfMXAgKGFwLCBuLCBiIDw8IHByZVsxXSwgcHJlKTsKKyAgICAgIGlmIChyICE9IHJfcmVmKQorCXsKKwkgIHByaW50ZiAoIm1wbl9tb2RfMV8xcCBmYWlsZWRcbiIpOworCSAgZ290byBmYWlsOworCX0KKyAgICB9CisgIGlmICgoYiAmIEdNUF9OVU1CX0hJR0hCSVQpID09IDApCisgICAgeworICAgICAgbXBfbGltYl90IHByZVs1XTsKKyAgICAgIG1wbl9tb2RfMXNfMnBfY3BzIChwcmUsIGIpOworICAgICAgciA9IG1wbl9tb2RfMXNfMnAgKGFwLCBuLCBiIDw8IHByZVsxXSwgcHJlKTsKKyAgICAgIGlmIChyICE9IHJfcmVmKQorCXsKKwkgIHByaW50ZiAoIm1wbl9tb2RfMXNfMnAgZmFpbGVkXG4iKTsKKwkgIGdvdG8gZmFpbDsKKwl9CisgICAgfQorICBpZiAoYiA8PSBHTVBfTlVNQl9NQVNLIC8gMykKKyAgICB7CisgICAgICBtcF9saW1iX3QgcHJlWzZdOworICAgICAgbXBuX21vZF8xc18zcF9jcHMgKHByZSwgYik7CisgICAgICByID0gbXBuX21vZF8xc18zcCAoYXAsIG4sIGIgPDwgcHJlWzFdLCBwcmUpOworICAgICAgaWYgKHIgIT0gcl9yZWYpCisJeworCSAgcHJpbnRmICgibXBuX21vZF8xc18zcCBmYWlsZWRcbiIpOworCSAgZ290byBmYWlsOworCX0KKyAgICB9CisgIGlmIChiIDw9IEdNUF9OVU1CX01BU0sgLyA0KQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCBwcmVbN107CisgICAgICBtcG5fbW9kXzFzXzRwX2NwcyAocHJlLCBiKTsKKyAgICAgIHIgPSBtcG5fbW9kXzFzXzRwIChhcCwgbiwgYiA8PCBwcmVbMV0sIHByZSk7CisgICAgICBpZiAociAhPSByX3JlZikKKwl7CisJICBwcmludGYgKCJtcG5fbW9kXzFzXzRwIGZhaWxlZFxuIik7CisJICBnb3RvIGZhaWw7CisJfQorICAgIH0KKyAgciA9IG1wbl9tb2RfMSAoYXAsIG4sIGIpOworICBpZiAociAhPSByX3JlZikKKyAgICB7CisgICAgICBwcmludGYgKCJtcG5fbW9kXzEgZmFpbGVkXG4iKTsKKyAgICBmYWlsOgorICAgICAgcHJpbnRmICgiYW4gPSAlZCwgYTogIiwgKGludCkgbik7IG1wbl9kdW1wIChhcCwgbik7CisgICAgICBwcmludGYgKCJiICAgICAgICAgICA6ICIpOyBtcG5fZHVtcCAoJmIsIDEpOworICAgICAgcHJpbnRmICgiciAoZXhwZWN0ZWQpOiAiKTsgbXBuX2R1bXAgKCZyX3JlZiwgMSk7CisgICAgICBwcmludGYgKCJyIChiYWQpICAgICA6ICIpOyBtcG5fZHVtcCAoJnIsIDEpOworICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGFfYml0czsKKyAgdW5zaWduZWQgYl9iaXRzOworICBtcHpfdCBhOworICBtcHpfdCBiOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMzAwOyBpKyspCisgICAgeworICAgICAgbXBfc2l6ZV90IGFzaXplOworICAgICAgYV9iaXRzID0gMSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDEwMDApOworICAgICAgYl9iaXRzID0gMSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIEdNUF9OVU1CX0JJVFMpOworCisgICAgICBtcHpfcnJhbmRvbWIgKGEsIHJhbmRzLCBhX2JpdHMpOworICAgICAgbXB6X3JyYW5kb21iIChiLCByYW5kcywgYl9iaXRzKTsKKworICAgICAgYXNpemUgPSBTSVooYSk7CisgICAgICBpZiAoIWFzaXplKQorCWFzaXplID0gMTsKKyAgICAgIGlmIChtcHpfc2duIChiKSA9PSAwKQorCW1wel9zZXRfdWkgKGIsIDEpOworCisgICAgICBjaGVja19vbmUgKFBUUihhKSwgYXNpemUsIFBUUihiKVswXSk7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYik7CisKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LW1wX2Jhc2VzLmMgYi90ZXN0cy9tcG4vdC1tcF9iYXNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjdmNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1tcF9iYXNlcy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKiBDaGVjayBtcF9iYXNlcyB2YWx1ZXMuCisKK0NvcHlyaWdodCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIG1wX2xpbWJfdCAgd2FudF9iYiwgd2FudF9iYl9pbnY7CisgIGludCAgICAgICAgYmFzZSwgd2FudF9jaGFyc19wZXJfbGltYjsKKworICB3YW50X2NoYXJzX3Blcl9saW1iID0gcmVmbXBuX2NoYXJzX3Blcl9saW1iICgxMCk7CisgIGlmIChNUF9CQVNFU19DSEFSU19QRVJfTElNQl8xMCAhPSB3YW50X2NoYXJzX3Blcl9saW1iKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk1QX0JBU0VTX0NIQVJTX1BFUl9MSU1CXzEwIHdyb25nXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICB3YW50X2JiID0gcmVmbXBuX2JpZ19iYXNlICgxMCk7CisgIGlmIChNUF9CQVNFU19CSUdfQkFTRV8xMCAhPSB3YW50X2JiKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk1QX0JBU0VTX0JJR19CQVNFXzEwIHdyb25nXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICB3YW50X2JiX2ludiA9IHJlZm1wbl9pbnZlcnRfbGltYgorICAgICh3YW50X2JiIDw8IHJlZm1wbl9jb3VudF9sZWFkaW5nX3plcm9zICh3YW50X2JiKSk7CisgIGlmIChNUF9CQVNFU19CSUdfQkFTRV9JTlZFUlRFRF8xMCAhPSB3YW50X2JiX2ludikKKyAgICB7CisgICAgICBwcmludGYgKCJNUF9CQVNFU19CSUdfQkFTRV9JTlZFUlRFRF8xMCB3cm9uZ1xuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKE1QX0JBU0VTX05PUk1BTElaQVRJT05fU1RFUFNfMTAKKyAgICAgICE9IHJlZm1wbl9jb3VudF9sZWFkaW5nX3plcm9zIChNUF9CQVNFU19CSUdfQkFTRV8xMCkpCisgICAgeworICAgICAgcHJpbnRmICgiTVBfQkFTRVNfTk9STUFMSVpBVElPTl9TVEVQU18xMCB3cm9uZ1xuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgZm9yIChiYXNlID0gMjsgYmFzZSA8IG51bWJlcm9mIChtcF9iYXNlcyk7IGJhc2UrKykKKyAgICB7CisgICAgICB3YW50X2NoYXJzX3Blcl9saW1iID0gcmVmbXBuX2NoYXJzX3Blcl9saW1iIChiYXNlKTsKKyAgICAgIGlmIChtcF9iYXNlc1tiYXNlXS5jaGFyc19wZXJfbGltYiAhPSB3YW50X2NoYXJzX3Blcl9saW1iKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBfYmFzZXNbJWRdLmNoYXJzX3Blcl9saW1iIHdyb25nXG4iLCBiYXNlKTsKKyAgICAgICAgICBwcmludGYgKCIgIGdvdCAgJWRcbiIsIG1wX2Jhc2VzW2Jhc2VdLmNoYXJzX3Blcl9saW1iKTsKKyAgICAgICAgICBwcmludGYgKCIgIHdhbnQgJWRcbiIsIHdhbnRfY2hhcnNfcGVyX2xpbWIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIGlmIChQT1cyX1AgKGJhc2UpKQorICAgICAgICB7CisgICAgICAgICAgd2FudF9iYiA9IHJlZm1wbl9jb3VudF90cmFpbGluZ196ZXJvcyAoKG1wX2xpbWJfdCkgYmFzZSk7CisgICAgICAgICAgaWYgKG1wX2Jhc2VzW2Jhc2VdLmJpZ19iYXNlICE9IHdhbnRfYmIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIm1wX2Jhc2VzWyVkXS5iaWdfYmFzZSAobG9nMiBvZiBiYXNlKSB3cm9uZ1xuIiwgYmFzZSk7CisgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YW50X2JiID0gcmVmbXBuX2JpZ19iYXNlIChiYXNlKTsKKyAgICAgICAgICBpZiAobXBfYmFzZXNbYmFzZV0uYmlnX2Jhc2UgIT0gd2FudF9iYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgibXBfYmFzZXNbJWRdLmJpZ19iYXNlIHdyb25nXG4iLCBiYXNlKTsKKyAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICB9CisKKyNpZiBVU0VfUFJFSU5WX0RJVlJFTV8xCisgICAgICAgICAgd2FudF9iYl9pbnYgPSByZWZtcG5faW52ZXJ0X2xpbWIKKyAgICAgICAgICAgICh3YW50X2JiIDw8IHJlZm1wbl9jb3VudF9sZWFkaW5nX3plcm9zICh3YW50X2JiKSk7CisgICAgICAgICAgaWYgKG1wX2Jhc2VzW2Jhc2VdLmJpZ19iYXNlX2ludmVydGVkICE9IHdhbnRfYmJfaW52KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJtcF9iYXNlc1slZF0uYmlnX2Jhc2VfaW52ZXJ0ZWQgd3JvbmdcbiIsIGJhc2UpOworICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtbXVsLmMgYi90ZXN0cy9tcG4vdC1tdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY2ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtbXVsLmMKQEAgLTAsMCArMSw5NyBAQAorLyogVGVzdCBtcG5fbXVsIGZ1bmN0aW9uIGZvciBhbGwgc2l6ZXMgdXAgdG8gYSBzZWxlY3RlZCBsaW1pdC4KKworQ29weXJpZ2h0IDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3N0YXRpYyB1bnNpZ25lZAoraXNxcnQgKHVuc2lnbmVkIHQpCit7CisgIHVuc2lnbmVkIHMsIGI7CisKKyAgZm9yIChiID0gMCwgcyA9IHQ7ICBiKyssIHMgPj49IDE7ICkKKyAgICA7CisKKyAgcyA9IDEgPDwgKGIgPj4gMSk7CisgIGlmIChiICYgMSkKKyAgICBzICs9IHMgPj4gMTsKKworICBkbworICAgIHsKKyAgICAgIGIgPSB0IC8gczsKKyAgICAgIHMgPSAocyArIGIpID4+IDE7CisgICAgfQorICB3aGlsZSAoYiA8IHMpOworCisgIHJldHVybiBzOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCBicCwgcnAsIHJlZnA7CisgIG1wX3NpemVfdCBtYXhfbiwgYW4sIGJuLCBybjsKKyAgaW50IHJlcHM7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICByZXBzID0gMTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgLyogUmUtaW50ZXJwcmV0IHJlcHMgYXJndW1lbnQgYXMgYSBzaXplIGFyZ3VtZW50LiAgKi8KKyAgbWF4X24gPSBpc3FydCAocmVwcyAqIDI1MDAwKTsKKworICBhcCA9IFRNUF9BTExPQ19MSU1CUyAobWF4X24gKyAxKTsKKyAgYnAgPSBUTVBfQUxMT0NfTElNQlMgKG1heF9uICsgMSk7CisgIHJwID0gVE1QX0FMTE9DX0xJTUJTICgyICogbWF4X24pOworICByZWZwID0gVE1QX0FMTE9DX0xJTUJTICgyICogbWF4X24pOworCisgIGZvciAoYW4gPSAxOyBhbiA8PSBtYXhfbjsgYW4gKz0gMSkKKyAgICB7CisgICAgICBmb3IgKGJuID0gMTsgYm4gPD0gYW47IGJuICs9IDEpCisJeworCSAgbXBuX3JhbmRvbTIgKGFwLCBhbiArIDEpOworCSAgbXBuX3JhbmRvbTIgKGJwLCBibiArIDEpOworCisJICByZWZtcG5fbXVsIChyZWZwLCBhcCwgYW4sIGJwLCBibik7CisJICBtcG5fbXVsIChycCwgYXAsIGFuLCBicCwgYm4pOworCisJICBybiA9IGFuICsgYm47CisJICBpZiAobXBuX2NtcCAocmVmcCwgcnAsIHJuKSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIkVSUk9SLCBhbiA9ICVkLCBibiA9ICVkLCBybiA9ICVkXG4iLAorCQkgICAgICAoaW50KSBhbiwgKGludCkgYm4sIChpbnQpIHJuKTsKKwkgICAgICBwcmludGYgKCJhOiAiKTsgbXBuX2R1bXAgKGFwLCBhbik7CisJICAgICAgcHJpbnRmICgiYjogIik7IG1wbl9kdW1wIChicCwgYm4pOworCSAgICAgIHByaW50ZiAoInI6ICAgIik7IG1wbl9kdW1wIChycCwgcm4pOworCSAgICAgIHByaW50ZiAoInJlZjogIik7IG1wbl9kdW1wIChyZWZwLCBybik7CisJICAgICAgYWJvcnQoKTsKKwkgICAgfQorCX0KKyAgICB9CisgIFRNUF9GUkVFOworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtbXVsbG8uYyBiL3Rlc3RzL21wbi90LW11bGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhMGYwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LW11bGxvLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIFRlc3QgZm9yIG11bGxvIGZ1bmN0aW9uLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogU2l6ZXMgYXJlIHVwIHRvIDJeU0laRV9MT0cgbGltYnMgKi8KKyNpZm5kZWYgU0laRV9MT0cKKyNkZWZpbmUgU0laRV9MT0cgMTAKKyNlbmRpZgorCisjaWZuZGVmIENPVU5UCisjZGVmaW5lIENPVU5UIDEwMDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfTiAoMUwgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1JTl9OICgxKQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCBicCwgcmVmcCwgcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICBpbnQgdGVzdDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyNkZWZpbmUgbXBuX211bGxvX2l0Y2gobikgKDApCisKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OKTsKKyAgYnAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OKTsKKyAgcmVmcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKiAyKTsKKyAgcHAgPSAxK1RNUF9BTExPQ19MSU1CUyAoTUFYX04gKyAyKTsKKyAgc2NyYXRjaAorICAgID0gMStUTVBfQUxMT0NfTElNQlMgKG1wbl9tdWxsb19pdGNoIChNQVhfTikgKyAyKTsKKworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgY291bnQ7IHRlc3QrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaXplX21pbjsKKyAgICAgIHVuc2lnbmVkIHNpemVfcmFuZ2U7CisgICAgICBtcF9zaXplX3QgbjsKKyAgICAgIG1wX3NpemVfdCBpdGNoOworICAgICAgbXBfbGltYl90IHBfYmVmb3JlLCBwX2FmdGVyLCBzX2JlZm9yZSwgc19hZnRlcjsKKworICAgICAgZm9yIChzaXplX21pbiA9IDE7ICgxTCA8PCBzaXplX21pbikgPCBNSU5fTjsgc2l6ZV9taW4rKykKKwk7CisKKyAgICAgIC8qIFdlIGdlbmVyYXRlIGFuIGluIHRoZSBNSU5fTiA8PSBuIDw9ICgxIDw8IHNpemVfcmFuZ2UpLiAqLworICAgICAgc2l6ZV9yYW5nZSA9IHNpemVfbWluCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBTSVpFX0xPRyArIDEgLSBzaXplX21pbik7CisKKyAgICAgIG4gPSBNSU5fTgorCSsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgKDFMIDw8IHNpemVfcmFuZ2UpICsgMSAtIE1JTl9OKTsKKworICAgICAgbXBuX3JhbmRvbTIgKGFwLCBuKTsKKyAgICAgIG1wbl9yYW5kb20yIChicCwgbik7CisgICAgICBtcG5fcmFuZG9tMiAocHAtMSwgbiArIDIpOworICAgICAgcF9iZWZvcmUgPSBwcFstMV07CisgICAgICBwX2FmdGVyID0gcHBbbl07CisKKyAgICAgIGl0Y2ggPSBtcG5fbXVsbG9faXRjaCAobik7CisgICAgICBBU1NFUlRfQUxXQVlTIChpdGNoIDw9IG1wbl9tdWxsb19pdGNoIChNQVhfTikpOworICAgICAgbXBuX3JhbmRvbTIgKHNjcmF0Y2gtMSwgaXRjaCsyKTsKKyAgICAgIHNfYmVmb3JlID0gc2NyYXRjaFstMV07CisgICAgICBzX2FmdGVyID0gc2NyYXRjaFtpdGNoXTsKKworICAgICAgbXBuX211bGxvX24gKHBwLCBhcCwgYnAsIG4pOworICAgICAgbXBuX211bF9uIChyZWZwLCBhcCwgYnAsIG4pOworICAgICAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSB8fCBwcFtuXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBuKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SIGluIHRlc3QgJWQsIG4gPSAlZCIsCisJCSAgdGVzdCwgKGludCkgbik7CisJICBpZiAocHBbLTFdICE9IHBfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHBwOiIpOyBtcG5fZHVtcCAocHAgLTEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAocHBbbl0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBuLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYWZ0ZXIsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFstMV0gIT0gc19iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2gtMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJhZnRlciBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaCArIGl0Y2gsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19hZnRlciwgMSk7CisJICAgIH0KKwkgIG1wbl9kdW1wIChhcCwgbik7CisJICBtcG5fZHVtcCAoYnAsIG4pOworCSAgbXBuX2R1bXAgKHBwLCBuKTsKKwkgIG1wbl9kdW1wIChyZWZwLCBuKTsKKworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorICBUTVBfRlJFRTsKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LW11bG1pZC5jIGIvdGVzdHMvbXBuL3QtbXVsbWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MWIwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LW11bG1pZC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIFRlc3QgZm9yIG11bG1pZCBmdW5jdGlvbi4KKworQ29weXJpZ2h0IDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIFNpemVzIGFyZSB1cCB0byAyXlNJWkVfTE9HIGxpbWJzICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDkKKyNlbmRpZgorCisjaWZuZGVmIENPVU5UCisjZGVmaW5lIENPVU5UIDUwMDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OICgxTCA8PCBTSVpFX0xPRykKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wX3B0ciBhcCwgYnAsIHJwLCByZWZwOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgaW50IHRlc3Q7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBhcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04pOworICBicCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04pOworICBycCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKyAyKTsKKyAgcmVmcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKyAyKTsKKworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgQ09VTlQ7IHRlc3QrKykKKyAgICB7CisgICAgICBtcF9zaXplX3QgYW4sIGJuLCBybjsKKyAgICAgIHVuc2lnbmVkIHNpemVfbG9nOworCisgICAgICBzaXplX2xvZyA9IDEgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBTSVpFX0xPRyk7CisgICAgICBhbiA9IDEgKyBnbXBfdXJhbmRvbW1fdWkocmFuZHMsIDFMIDw8IHNpemVfbG9nKTsKKworICAgICAgc2l6ZV9sb2cgPSAxICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgU0laRV9MT0cpOworICAgICAgYm4gPSAxICsgZ21wX3VyYW5kb21tX3VpKHJhbmRzLCAxTCA8PCBzaXplX2xvZyk7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSBhbiA+PSBibiAqLworICAgICAgaWYgKGFuIDwgYm4pCisJTVBfU0laRV9UX1NXQVAgKGFuLCBibik7CisKKyAgICAgIG1wbl9yYW5kb20yIChhcCwgYW4pOworICAgICAgbXBuX3JhbmRvbTIgKGJwLCBibik7CisKKyAgICAgIHJlZm1wbl9tdWxtaWQgKHJlZnAsIGFwLCBhbiwgYnAsIGJuKTsKKyAgICAgIG1wbl9tdWxtaWQgKHJwLCBhcCwgYW4sIGJwLCBibik7CisKKyAgICAgIHJuID0gYW4gKyAzIC0gYm47CisgICAgICBpZiAobXBuX2NtcCAocmVmcCwgcnAsIHJuKSkKKwl7CisJICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBhbiA9ICVkLCBibiA9ICVkLCBybiA9ICVkXG4iLAorCQkgIHRlc3QsIChpbnQpIGFuLCAoaW50KSBibiwgKGludCkgcm4pOworCSAgcHJpbnRmKCJhOiAiKTsgbXBuX2R1bXAgKGFwLCBhbik7CisJICBwcmludGYoImI6ICIpOyBtcG5fZHVtcCAoYnAsIGJuKTsKKwkgIHByaW50ZigicjogICAiKTsgbXBuX2R1bXAgKHJwLCBybik7CisJICBwcmludGYoInJlZjogIik7IG1wbl9kdW1wIChyZWZwLCBybik7CisKKwkgIGFib3J0KCk7CisJfQorICAgIH0KKyAgVE1QX0ZSRUU7CisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1tdWxtb2RfYmtucDEuYyBiL3Rlc3RzL21wbi90LW11bG1vZF9ia25wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGExZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1tdWxtb2RfYmtucDEuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogVGVzdCBmb3IgbXVsbW9kX2JrbnAxIGZ1bmN0aW9uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDIwMDksIDIwMjAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmIE1PRF9CS05QMV9VU0UxMQorI2RlZmluZSBVU0UxMSAxMSwKKyNlbHNlCisjZGVmaW5lIFVTRTExCisjZW5kaWYKKworCisjaWYgR01QX05VTUJfQklUUyAlIDMyID09IDAKKyNkZWZpbmUgTUFYX0sgMTcKKyNkZWZpbmUgU1VQUE9SVEVEX0sgezMsIDUsIDcsIDEzLCBVU0UxMSBNQVhfS30KKyNlbHNlCisjaWYgR01QX05VTUJfQklUUyAlIDE2ID09IDAKKyNkZWZpbmUgTUFYX0sgMTMKKyNkZWZpbmUgU1VQUE9SVEVEX0sgezMsIDUsIDcsIFVTRTExIE1BWF9LfQorI2Vsc2UKKyNpZiBHTVBfTlVNQl9CSVRTICUgOCA9PSAwCisjZGVmaW5lIE1BWF9LIDcKKyNkZWZpbmUgU1VQUE9SVEVEX0sgezMsIFVTRTExIE1BWF9LfQorI2Vsc2UKKyNkZWZpbmUgU1VQUE9SVEVEX0sge1VTRTExfSAvKiBTdXBwb3J0ZWQgPyAqLworI2VuZGlmIC8qIEdNUF9OVU1CX0JJVFMgJSA4ID09IDAgKi8KKyNlbmRpZiAvKiBHTVBfTlVNQl9CSVRTICUgMTYgPT0gMCAqLworI2VuZGlmIC8qIEdNUF9OVU1CX0JJVFMgJSAzMiA9PSAwICovCisKKyNpZiBNT0RfQktOUDFfT05MWTMKKyN1bmRlZiBTVVBQT1JURURfSworI3VuZGVmIE1BWF9LCisjZGVmaW5lIE1BWF9LIDMKKyNkZWZpbmUgU1VQUE9SVEVEX0sgezN9CisjZW5kaWYKKworLyogU2l6ZXMgYXJlIHVwIHRvIE1BWF9LICogMl5TSVpFX0xPRyBsaW1icyAqLworI2lmbmRlZiBTSVpFX0xPRworI2RlZmluZSBTSVpFX0xPRyA3CisjZW5kaWYKKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCA1MDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfTiAoTUFYX0sgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1JTl9OIDEKKworLyoKKyAgUmVmZXJlbmNlIGZ1bmN0aW9uIGZvciBtdWx0aXBsaWNhdGlvbiBtb2R1bG8gQl57aypybn0rMS4KKyovCisKK3N0YXRpYyB2b2lkCityZWZfbXVsbW9kX2JucDEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIGFwLCBtcF9zcmNwdHIgYnAsIG1wX3NpemVfdCBybikKK3sKKyAgbXBfbGltYl90IGN5OworCisgIG1wbl9tdWxfbiAocnAsIGFwLCBicCwgcm4gKyAxKTsKKyAgY3kgPSBycFsyICogcm5dOworICBNUE5fSU5DUl9VIChycCwgMiAqIHJuICsgMSwgcnBbMiAqIHJuXSk7CisgIGN5ID0gcnBbMiAqIHJuXSAtIGN5ICsgbXBuX3N1Yl9uIChycCwgcnAsIHJwICsgcm4sIHJuKTsKKyAgcnBbcm5dID0gMDsKKyAgTVBOX0lOQ1JfVSAocnAsIHJuICsgMSwgY3kpOworfQorCisvKgorICBDb21wYXJlIHRoZSByZXN1bHQgb2YgdGhlIG1wbl9tdWxtb2RfYm5wMSBmdW5jdGlvbiBpbiB0aGUgbGlicmFyeQorICB3aXRoIHRoZSByZWZlcmVuY2UgZnVuY3Rpb24gYWJvdmUuCisqLwordW5zaWduZWQgc3VwcG9ydGVkX2tbXSA9IFNVUFBPUlRFRF9LOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCBicCwgcmVmcCwgcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICBpbnQgdGVzdDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OICsgMSk7CisgIGJwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTiArIDEpOworICByZWZwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTiAqIDIgKyAyKTsKKyAgcHAgPSAxICsgVE1QX0FMTE9DX0xJTUJTIChNQVhfTiArIDMpOworICBzY3JhdGNoCisgICAgPSAxICsgVE1QX0FMTE9DX0xJTUJTIChtcG5fbXVsbW9kX2JrbnAxX2l0Y2ggKE1BWF9OKSArIDIpOworCisgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBjb3VudDsgdGVzdCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNpemVfbWluOworICAgICAgdW5zaWduZWQgc2l6ZV9yYW5nZTsKKyAgICAgIHVuc2lnbmVkIGs7CisgICAgICBtcF9zaXplX3Qgcm4sIG47CisgICAgICBtcF9zaXplX3QgaXRjaDsKKyAgICAgIG1wX2xpbWJfdCBwX2JlZm9yZSwgcF9hZnRlciwgc19iZWZvcmUsIHNfYWZ0ZXI7CisKKyAgICAgIGZvciAoc2l6ZV9taW4gPSAxOyAoMUwgPDwgc2l6ZV9taW4pIDwgTUlOX047IHNpemVfbWluKyspCisJOworCisgICAgICAvKiBXZSBnZW5lcmF0ZSBybiBpbiB0aGUgTUlOX04gPD0gbiA8PSAoMSA8PCBzaXplX3JhbmdlKS4gKi8KKyAgICAgIHNpemVfcmFuZ2UgPSBzaXplX21pbgorCSsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgU0laRV9MT0cgKyAxIC0gc2l6ZV9taW4pOworCisgICAgICBrID0gc3VwcG9ydGVkX2tbdGVzdCAlIG51bWJlcm9mIChzdXBwb3J0ZWRfayldOworICAgICAgbiA9IE1JTl9OCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAoMUwgPDwgc2l6ZV9yYW5nZSkgKyAxIC0gTUlOX04pOworICAgICAgcm4gPSBrICogbjsKKyAgICAgIGlmICgoR01QX05VTUJfTUFYICUgayAhPSAwKSAmJiAocm4gJSAzID09IDApKQorCW4gPSBybiAvIChrID0gMyk7CisKKyAgICAgIGlmICh0ZXN0ID09IDApCisJeworCSAgbXBuX3JhbmRvbTIgKGFwLCBuKTsKKwkgIG1wbl9hZGRfMSAoYXAgKyBuLCBhcCwgbiwgMSk7IC8qIHthcCxhbn0gPSAtMSBtb2QgQisxICovCisJICBNUE5fWkVSTyAoYXAgKyAyICogbiwgcm4gLSAyICogbiArIDEpOworCX0KKyAgICAgIGVsc2UKKwltcG5fcmFuZG9tMiAoYXAsIHJuICsgMSk7CisgICAgICBtcG5fcmFuZG9tMiAoYnAsIHJuICsgMSk7CisKKyAgICAgIGJwIFtybl0gJj0gMTsKKyAgICAgIGFwIFtybl0gJj0gMTsKKworICAgICAgbXBuX3JhbmRvbTIgKHBwLTEsIHJuICsgMyk7CisgICAgICBwX2JlZm9yZSA9IHBwWy0xXTsKKyAgICAgIHBfYWZ0ZXIgPSBwcFtybiArIDFdOworCisgICAgICBpdGNoID0gbXBuX211bG1vZF9ia25wMV9pdGNoIChybik7CisgICAgICBBU1NFUlRfQUxXQVlTIChpdGNoIDw9IG1wbl9tdWxtb2RfYmtucDFfaXRjaCAoTUFYX04pKTsKKyAgICAgIG1wbl9yYW5kb20yIChzY3JhdGNoIC0gMSwgaXRjaCArIDIpOworICAgICAgc19iZWZvcmUgPSBzY3JhdGNoWy0xXTsKKyAgICAgIHNfYWZ0ZXIgPSBzY3JhdGNoW2l0Y2hdOworCisgICAgICBtcG5fbXVsbW9kX2JrbnAxICggcHAsIGFwLCBicCwgbiwgaywgc2NyYXRjaCk7CisgICAgICByZWZfbXVsbW9kX2JucDEgKHJlZnAsIGFwLCBicCwgcm4pOworICAgICAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSB8fCBwcFtybiArIDFdICE9IHBfYWZ0ZXIKKwkgIHx8IHNjcmF0Y2hbLTFdICE9IHNfYmVmb3JlIHx8IHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcgorCSAgfHwgbXBuX2NtcCAocmVmcCwgcHAsIHJuICsgMSkgIT0gMCkKKwl7CisJICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBybiA9ICVkLCBuID0gJWQsIGsgPSAlZFxuIiwKKwkJICB0ZXN0LCAoaW50KSBybiwgKGludCkgbiwgKGludCkgayk7CisJICBpZiAocHBbLTFdICE9IHBfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHBwOiIpOyBtcG5fZHVtcCAocHAgLSAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW3JuICsgMV0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBybiArIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaCAtIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYWZ0ZXIsIDEpOworCSAgICB9CisJICBtcG5fZHVtcCAoYXAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAoYnAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocHAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocmVmcCwgcm4gKyAxKTsKKworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorICBUTVBfRlJFRTsKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LW11bG1vZF9ibm0xLmMgYi90ZXN0cy9tcG4vdC1tdWxtb2RfYm5tMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjU5YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1tdWxtb2RfYm5tMS5jCkBAIC0wLDAgKzEsMjEwIEBACisKKy8qIFRlc3QgZm9yIG11bG1vZF9ibm0xIGZ1bmN0aW9uLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgTWFyY28gQm9kcmF0by4KKworQ29weXJpZ2h0IDIwMDksIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIFNpemVzIGFyZSB1cCB0byAyXlNJWkVfTE9HIGxpbWJzICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDExCisjZW5kaWYKKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCA1MDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfTiAoMUwgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1JTl9OIDEKKworLyoKKyAgUmVmZXJlbmNlIGZ1bmN0aW9uIGZvciBtdWx0aXBsaWNhdGlvbiBtb2R1bG8gQl5ybi0xLgorCisgIFRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgWkVSTyBpZiBhbmQgb25seSBpZiBvbmUgb2YgdGhlIG9wZXJhbmQKKyAgYWxyZWFkeSBpcy4gT3RoZXJ3aXNlIHRoZSBjbGFzcyBbMF0gTW9kKEJecm4tMSkgaXMgcmVwcmVzZW50ZWQgYnkKKyAgQl5ybi0xLiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGlmIG11bG1vZF9ibm0xIGlzIHVzZWQgdG8KKyAgY29tYmluZSByZXN1bHRzIGFuZCBvYnRhaW4gYSBuYXR1cmFsIG51bWJlciB3aGVuIG9uZSBrbm93cyBpbgorICBhZHZhbmNlIHRoYXQgdGhlIGZpbmFsIHZhbHVlIGlzIGxlc3MgdGhhbiAoQl5ybi0xKS4KKyovCisKK3N0YXRpYyB2b2lkCityZWZfbXVsbW9kX2JubTEgKG1wX3B0ciBycCwgbXBfc2l6ZV90IHJuLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBhbiwgbXBfc3JjcHRyIGJwLCBtcF9zaXplX3QgYm4pCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKDAgPCBhbiAmJiBhbiA8PSBybik7CisgIEFTU0VSVCAoMCA8IGJuICYmIGJuIDw9IHJuKTsKKworICBpZiAoYW4gPj0gYm4pCisgICAgcmVmbXBuX211bCAocnAsIGFwLCBhbiwgYnAsIGJuKTsKKyAgZWxzZQorICAgIHJlZm1wbl9tdWwgKHJwLCBicCwgYm4sIGFwLCBhbik7CisgIGFuICs9IGJuOworICBpZiAoYW4gPiBybikgeworICAgIGN5ID0gbXBuX2FkZCAocnAsIHJwLCBybiwgcnAgKyBybiwgYW4gLSBybik7CisgICAgLyogSWYgY3kgPT0gMSwgdGhlbiB0aGUgdmFsdWUgb2YgcnAgaXMgYXQgbW9zdCBCXnJuIC0gMiwgc28gdGhlcmUgY2FuCisgICAgICogYmUgbm8gb3ZlcmZsb3cgd2hlbiBhZGRpbmcgaW4gdGhlIGNhcnJ5LiAqLworICAgIE1QTl9JTkNSX1UgKHJwLCBybiwgY3kpOworICB9Cit9CisKKy8qCisgIENvbXBhcmUgdGhlIHJlc3VsdCBvZiB0aGUgbXBuX211bG1vZF9ibm0xIGZ1bmN0aW9uIGluIHRoZSBsaWJyYXJ5CisgIHdpdGggdGhlIHJlZmVyZW5jZSBmdW5jdGlvbiBhYm92ZS4KKyovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcF9wdHIgYXAsIGJwLCByZWZwLCBwcCwgc2NyYXRjaDsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBBU1NFUlRfQUxXQVlTIChtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChNQVhfTikgPT0gTUFYX04pOworCisgIGFwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTik7CisgIGJwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTik7CisgIHJlZnAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OICogNCk7CisgIHBwID0gMStUTVBfQUxMT0NfTElNQlMgKE1BWF9OICsgMik7CisgIHNjcmF0Y2gKKyAgICA9IDErVE1QX0FMTE9DX0xJTUJTIChtcG5fbXVsbW9kX2JubTFfaXRjaCAoTUFYX04sIE1BWF9OLCBNQVhfTikgKyAyKTsKKworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgY291bnQ7IHRlc3QrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaXplX21pbjsKKyAgICAgIHVuc2lnbmVkIHNpemVfcmFuZ2U7CisgICAgICBtcF9zaXplX3QgYW4sYm4scm4sbjsKKyAgICAgIG1wX3NpemVfdCBpdGNoOworICAgICAgbXBfbGltYl90IHBfYmVmb3JlLCBwX2FmdGVyLCBzX2JlZm9yZSwgc19hZnRlcjsKKworICAgICAgZm9yIChzaXplX21pbiA9IDE7ICgxTCA8PCBzaXplX21pbikgPCBNSU5fTjsgc2l6ZV9taW4rKykKKwk7CisKKyAgICAgIC8qIFdlIGdlbmVyYXRlIGFuIGluIHRoZSBNSU5fTiA8PSBuIDw9ICgxIDw8IHNpemVfcmFuZ2UpLiAqLworICAgICAgc2l6ZV9yYW5nZSA9IHNpemVfbWluCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBTSVpFX0xPRyArIDEgLSBzaXplX21pbik7CisKKyAgICAgIG4gPSBNSU5fTgorCSsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgKDFMIDw8IHNpemVfcmFuZ2UpICsgMSAtIE1JTl9OKTsKKyAgICAgIG4gPSBtcG5fbXVsbW9kX2JubTFfbmV4dF9zaXplIChuKTsKKworICAgICAgaWYgKCAodGVzdCAmIDEpIHx8IG4gPT0gMSkgeworCS8qIEhhbGYgb2YgdGhlIHRlc3RzIGFyZSBkb25lIHdpdGggdGhlIG1haW4gc2NlbmFyaW8gaW4gbWluZDoKKwkgICBib3RoIGFuIGFuZCBibiA+PSBybi8yICovCisJYW4gPSAoKG4rMSkgPj4gMSkgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAobisxKSA+PiAxKTsKKwlibiA9ICgobisxKSA+PiAxKSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIChuKzEpID4+IDEpOworICAgICAgfSBlbHNlIHsKKwkvKiBTZWNvbmQgaGFsZiBvZiB0aGUgdGVzdHMgYXJlIGRvbmUgdXNpbmcgbXVsbW9kIHRvIGNvbXB1dGUgYQorCSAgIGZ1bGwgcHJvZHVjdCB3aXRoIG4vMiA8IGFuK2JuIDw9IG4uICovCisJYW4gPSAxICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgbiAtIDEpOworCWlmIChhbiA+PSBuLzIpCisJICBibiA9IDEgKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBuIC0gYW4pOworCWVsc2UKKwkgIGJuID0gbi8yICsgMSAtIGFuICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgKG4rMSkvMik7CisgICAgICB9CisKKyAgICAgIC8qIE1ha2Ugc3VyZSBhbiA+PSBibiAqLworICAgICAgaWYgKGFuIDwgYm4pCisJTVBfU0laRV9UX1NXQVAgKGFuLCBibik7CisKKyAgICAgIG1wbl9yYW5kb20yIChhcCwgYW4pOworICAgICAgbXBuX3JhbmRvbTIgKGJwLCBibik7CisKKyAgICAgIC8qIFNvbWV0aW1lIHRyaWdnZXIgdGhlIGJvcmRlcmxpbmUgY29uZGl0aW9ucworCSBBID0gLTEsMCwrMSBvciBCID0gLTEsMCwrMSBvciBBKkIgPT0gLTEsMCwxIE1vZChCXntuLzJ9KzEpLgorCSBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSBzcGxpdCwgaS5lLiBuIGlzIGV2ZW4uICovCisgICAgICBpZiAoKHRlc3QgJiAweDFmKSA9PSAxICYmIChuICYgMSkgPT0gMCkgeworCW1wX3NpemVfdCB4OworCU1QTl9DT1BZIChhcCwgYXAgKyAobiA+PiAxKSwgYW4gLSAobiA+PiAxKSk7CisJTVBOX1pFUk8gKGFwICsgYW4gLSAobiA+PiAxKSAsIG4gLSBhbik7CisJTVBOX0NPUFkgKGJwLCBicCArIChuID4+IDEpLCBibiAtIChuID4+IDEpKTsKKwlNUE5fWkVSTyAoYnAgKyBibiAtIChuID4+IDEpICwgbiAtIGJuKTsKKwl4ID0gMDsKKwkvKiB4ID0gKG4gPT0gYW4pID8gMCA6IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIG4gLSBhbik7ICovCisJYXBbeF0gKz0gZ21wX3VyYW5kb21tX3VpIChyYW5kcywgMykgLSAxOworCS8qIHggPSAobiA+PiAxKSAtIHggJSAobiA+PiAxKTsgKi8KKwlicFt4XSArPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAzKSAtIDE7CisJLyogV2UgZG9uJ3QgcHJvcGFnYXRlIGNhcnJ5LCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRlc2lyZWQgY29uZGl0aW9uCisJICAgaXMgbm90IHRyaWdnZXJlZCBhbGwgdGhlIHRpbWVzLiBBIGZldyB0aW1lcyBhcmUgZW5vdWdoIGFueXdheS4gKi8KKyAgICAgIH0KKyAgICAgIHJuID0gTUlOKG4sIGFuICsgYm4pOworICAgICAgbXBuX3JhbmRvbTIgKHBwLTEsIHJuICsgMik7CisgICAgICBwX2JlZm9yZSA9IHBwWy0xXTsKKyAgICAgIHBfYWZ0ZXIgPSBwcFtybl07CisKKyAgICAgIGl0Y2ggPSBtcG5fbXVsbW9kX2JubTFfaXRjaCAobiwgYW4sIGJuKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKGl0Y2ggPD0gbXBuX211bG1vZF9ibm0xX2l0Y2ggKE1BWF9OLCBNQVhfTiwgTUFYX04pKTsKKyAgICAgIG1wbl9yYW5kb20yIChzY3JhdGNoLTEsIGl0Y2grMik7CisgICAgICBzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworICAgICAgc19hZnRlciA9IHNjcmF0Y2hbaXRjaF07CisKKyAgICAgIG1wbl9tdWxtb2RfYm5tMSAoICBwcCwgbiwgYXAsIGFuLCBicCwgYm4sIHNjcmF0Y2gpOworICAgICAgcmVmX211bG1vZF9ibm0xIChyZWZwLCBuLCBhcCwgYW4sIGJwLCBibik7CisgICAgICBpZiAocHBbLTFdICE9IHBfYmVmb3JlIHx8IHBwW3JuXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBybikgIT0gMCkKKwl7CisJICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBhbiA9ICVkLCBibiA9ICVkLCBuID0gJWRcbiIsCisJCSAgdGVzdCwgKGludCkgYW4sIChpbnQpIGJuLCAoaW50KSBuKTsKKwkgIGlmIChwcFstMV0gIT0gcF9iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgcHA6Iik7IG1wbl9kdW1wIChwcCAtMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZwX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChwcFtybl0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBybiwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZwX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgaWYgKHNjcmF0Y2hbLTFdICE9IHNfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHNjcmF0Y2g6Iik7IG1wbl9kdW1wIChzY3JhdGNoLTEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYWZ0ZXIsIDEpOworCSAgICB9CisJICBtcG5fZHVtcCAoYXAsIGFuKTsKKwkgIG1wbl9kdW1wIChicCwgYm4pOworCSAgbXBuX2R1bXAgKHBwLCBybik7CisJICBtcG5fZHVtcCAocmVmcCwgcm4pOworCisJICBhYm9ydCgpOworCX0KKyAgICB9CisgIFRNUF9GUkVFOworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtcGVyZnNxci5jIGIvdGVzdHMvbXBuL3QtcGVyZnNxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWVlOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1wZXJmc3FyLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIFRlc3QgbXBuX3BlcmZlY3Rfc3F1YXJlX3AgZGF0YS4KKworQ29weXJpZ2h0IDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaW5jbHVkZSAibXBuL3BlcmZzcXIuaCIKKworCisjZGVmaW5lIFBFUkZTUVJfTU9EX01BU0sgICAoKENOU1RfTElNQigxKSA8PCBQRVJGU1FSX01PRF9CSVRTKSAtIDEpCisKK3ZvaWQKK2NoZWNrX21vZF8yIChtcF9saW1iX3QgZCwgbXBfbGltYl90IGludiwgbXBfbGltYl90IGdvdF9oaSwgbXBfbGltYl90IGdvdF9sbykKK3sKKyAgaW50ICAgICAgICB3YW50WzIqR01QX0xJTUJfQklUU10sIGdvdDsKKyAgdW5zaWduZWQgICByLCBpZHg7CisgIG1wX2xpbWJfdCAgcTsKKworICBBU1NFUlRfQUxXQVlTIChkIDw9IG51bWJlcm9mICh3YW50KSk7CisgIEFTU0VSVF9BTFdBWVMgKCgoaW52ICogZCkgJiBQRVJGU1FSX01PRF9NQVNLKSA9PSAxKTsKKyAgQVNTRVJUX0FMV0FZUyAoTVBfTElNQl9UX01BWCAvIGQgPj0gUEVSRlNRUl9NT0RfTUFTSyk7CisKKyAgLyogdGhlIHNxdWFyZXMgbW9kIGQgKi8KKyAgZm9yIChyID0gMDsgciA8IGQ7IHIrKykKKyAgICB3YW50W3JdID0gMDsKKyAgZm9yIChyID0gMDsgciA8IGQ7IHIrKykKKyAgICB3YW50WyhyKnIpJWRdID0gMTsKKworICAvKiBmb3IgZWFjaCByZW1haW5kZXIgbW9kIGQsIGV4cGVjdCB0aGUgdGFibGUgZGF0YSB0byBjb3JyZWN0bHkgaWRlbnRpZnkKKyAgICAgaXQgYXMgYSByZXNpZHVlIG9yIG5vbi1yZXNpZHVlICovCisgIGZvciAociA9IDA7IHIgPCBkOyByKyspCisgICAgeworICAgICAgLyogYXMgcGVyIFBFUkZTUVJfTU9EX0lEWCAqLworICAgICAgcSA9ICgocikgKiAoaW52KSkgJiBQRVJGU1FSX01PRF9NQVNLOworICAgICAgaWR4ID0gKHEgKiAoZCkpID4+IFBFUkZTUVJfTU9EX0JJVFM7CisKKyAgICAgIGlmIChpZHggPj0gR01QX0xJTUJfQklUUykKKyAgICAgICAgZ290ID0gKGdvdF9oaSA+PiAoaWR4IC0gR01QX0xJTUJfQklUUykpICYgMTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290ID0gKGdvdF9sbyA+PiBpZHgpICYgMTsKKworICAgICAgaWYgKGdvdCAhPSB3YW50W3JdKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiV3JvbmcgZ2VuZXJhdGVkIGRhdGFcbiIpOworICAgICAgICAgIHByaW50ZiAoIiAgZD0ldVxuIiwgKHVuc2lnbmVkKSBkKTsKKyAgICAgICAgICBwcmludGYgKCIgIHI9JXVcbiIsIHIpOworICAgICAgICAgIHByaW50ZiAoIiAgaWR4PSV1XG4iLCBpZHgpOworICAgICAgICAgIHByaW50ZiAoIiAgZ290ICAlZFxuIiwgZ290KTsKKyAgICAgICAgICBwcmludGYgKCIgIHdhbnQgJWRcbiIsIHdhbnRbcl0pOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDaGVjayB0aGUgZ2VuZXJhdGVkIGRhdGEgaW4gcGVyZnNxci5oLiAqLwordm9pZAorY2hlY2tfbW9kICh2b2lkKQoreworI2RlZmluZSBQRVJGU1FSX01PRF8zNChyLCB1cCwgdXNpemUpICAgICAgIHsgciA9IDA7IH0gLyogc28gciBpc24ndCB1bnVzZWQgKi8KKyNkZWZpbmUgUEVSRlNRUl9NT0RfUFAociwgdXAsIHVzaXplKSAgICAgICB7IHIgPSAwOyB9CisjZGVmaW5lIFBFUkZTUVJfTU9EXzEociwgZCwgaW52LCBtYXNrKSAgICAgY2hlY2tfbW9kXzIgKGQsIGludiwgQ05TVF9MSU1CKDApLCBtYXNrKQorI2RlZmluZSBQRVJGU1FSX01PRF8yKHIsIGQsIGludiwgbWhpLCBtbG8pIGNoZWNrX21vZF8yIChkLCBpbnYsIG1oaSwgbWxvKQorCisgIFBFUkZTUVJfTU9EX1RFU1QgKGR1bW15LCBkdW1teSk7Cit9CisKKy8qIENoZWNrIFBFUkZTUVJfUFAsIGlmIGluIHVzZS4gKi8KK3ZvaWQKK2NoZWNrX3BwICh2b2lkKQoreworI2lmZGVmIFBFUkZTUVJfUFAKKyAgQVNTRVJUX0FMV0FZU19MSU1CIChQRVJGU1FSX1BQKTsKKyAgQVNTRVJUX0FMV0FZU19MSU1CIChQRVJGU1FSX1BQX05PUk0pOworICBBU1NFUlRfQUxXQVlTX0xJTUIgKFBFUkZTUVJfUFBfSU5WRVJURUQpOworCisgIC8qIHByZWludiBzdHVmZiBvbmx5IGZvciBuYWlscz09MCAqLworICBpZiAoR01QX05BSUxfQklUUyA9PSAwKQorICAgIHsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKFBFUkZTUVJfUFBfTk9STQorICAgICAgICAgICAgICAgICAgICAgPT0gUEVSRlNRUl9QUCA8PCByZWZtcG5fY291bnRfbGVhZGluZ196ZXJvcyAoUEVSRlNRUl9QUCkpOworICAgICAgQVNTRVJUX0FMV0FZUyAoUEVSRlNRUl9QUF9JTlZFUlRFRAorICAgICAgICAgICAgICAgICAgICAgPT0gcmVmbXBuX2ludmVydF9saW1iIChQRVJGU1FSX1BQX05PUk0pKTsKKyAgICB9CisjZW5kaWYKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19tb2QgKCk7CisgIGNoZWNrX3BwICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC1zY2FuLmMgYi90ZXN0cy9tcG4vdC1zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNWI5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXNjYW4uYwpAQCAtMCwwICsxLDE0NCBAQAorLyogVGVzdCBtcG5fc2NhbjAgYW5kIG1wbl9zY2FuMS4KKworQ29weXJpZ2h0IDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2RlZmluZSBTSVpFICAoKG1wX3NpemVfdCkgMykKK21wX2xpbWJfdCAgeFtTSVpFKzFdOworCit2b2lkCitjaGVjayAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgaSwgZ290LCB3YW50OworCisgIHhbU0laRV0gPSAxOworICBmb3IgKGkgPSAwOyBpIDwgU0laRSpHTVBfTlVNQl9CSVRTOyBpKyspCisgICAgeworICAgICAgZ290ID0gcmVmbXBuX3NjYW4xICh4LCBpKTsKKyAgICAgIHdhbnQgPSBtcG5fc2NhbjEgKHgsIGkpOworICAgICAgaWYgKGdvdCAhPSB3YW50KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBuX3NjYW4xXG4iKTsKKyAgICAgICAgICBwcmludGYgKCIgIGkgICAgICVsdVxuIiwgaSk7CisgICAgICAgICAgcHJpbnRmICgiICBnb3QgICAlbHVcbiIsIGdvdCk7CisgICAgICAgICAgcHJpbnRmICgiICB3YW50ICAlbHVcbiIsIHdhbnQpOworICAgICAgICAgIG1wbl90cmFjZSAoIiAgeCAgICAiLCB4LCBTSVpFKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICB4W1NJWkVdID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IFNJWkUqR01QX05VTUJfQklUUzsgaSsrKQorICAgIHsKKyAgICAgIGdvdCA9IHJlZm1wbl9zY2FuMCAoeCwgaSk7CisgICAgICB3YW50ID0gbXBuX3NjYW4wICh4LCBpKTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wbl9zY2FuMFxuIik7CisgICAgICAgICAgcHJpbnRmICgiICBpICAgICAlbHVcbiIsIGkpOworICAgICAgICAgIHByaW50ZiAoIiAgZ290ICAgJWx1XG4iLCBnb3QpOworICAgICAgICAgIHByaW50ZiAoIiAgd2FudCAgJWx1XG4iLCB3YW50KTsKKyAgICAgICAgICBtcG5fdHJhY2UgKCIgIHggICAgIiwgeCwgU0laRSk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX3R3b2JpdHMgKHZvaWQpCit7CisjZGVmaW5lIFRXT0JJVFMoYSwgYikgXAorICAoKENOU1RfTElNQigxKSA8PCAoYSkpIHwgKENOU1RfTElNQigxKSA8PCAoYikpKQorCisgIHJlZm1wbl96ZXJvICh4LCBTSVpFKTsKKyAgeFswXSA9IFRXT0JJVFMgKDEsIDApOworICBjaGVjayAoKTsKKworICByZWZtcG5femVybyAoeCwgU0laRSk7CisgIHhbMF0gPSBUV09CSVRTIChHTVBfTlVNQl9CSVRTLTEsIDEpOworICBjaGVjayAoKTsKKworICByZWZtcG5femVybyAoeCwgU0laRSk7CisgIHhbMF0gPSBDTlNUX0xJTUIoMSk7CisgIHhbMV0gPSBDTlNUX0xJTUIoMSk7CisgIGNoZWNrICgpOworCisgIHJlZm1wbl96ZXJvICh4LCBTSVpFKTsKKyAgeFswXSA9IENOU1RfTElNQigxKSA8PCAoR01QX05VTUJfQklUUy0xKTsKKyAgeFsxXSA9IENOU1RfTElNQigxKTsKKyAgY2hlY2sgKCk7CisKKyAgcmVmbXBuX3plcm8gKHgsIFNJWkUpOworICB4WzFdID0gVFdPQklUUyAoMSwgMCk7CisgIGNoZWNrICgpOworCisgIHJlZm1wbl96ZXJvICh4LCBTSVpFKTsKKyAgeFsxXSA9IENOU1RfTElNQigxKTsKKyAgeFsyXSA9IENOU1RfTElNQigxKTsKKyAgY2hlY2sgKCk7Cit9CisKKy8qIFRoaXMgaXMgdW51c2VkLCBpdCB0YWtlcyB0b28gbG9uZywgZXNwZWNpYWxseSBvbiA2NC1iaXQgc3lzdGVtcy4gKi8KK3ZvaWQKK2NoZWNrX3R3b2JpdHNfZXhoYXVzdGl2ZSAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgR01QX05VTUJfQklUUyAqIFNJWkU7IGkrKykKKyAgICB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgR01QX05VTUJfQklUUyAqIFNJWkU7IGorKykKKyAgICAgICAgeworICAgICAgICAgIHJlZm1wbl96ZXJvICh4LCBTSVpFKTsKKyAgICAgICAgICByZWZtcG5fc2V0Yml0ICh4LCBpKTsKKyAgICAgICAgICByZWZtcG5fc2V0Yml0ICh4LCBqKTsKKyAgICAgICAgICBjaGVjayAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgaW50ICBpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICB7CisgICAgICByZWZtcG5fcmFuZG9tMiAoeCwgU0laRSk7CisgICAgICBjaGVjayAoKTsKKyAgICB9Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfdHdvYml0cyAoKTsKKyAgY2hlY2tfcmFuZCAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3Qtc2l6ZWluYmFzZS5jIGIvdGVzdHMvbXBuL3Qtc2l6ZWluYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDcxNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1zaXplaW5iYXNlLmMKQEAgLTAsMCArMSw5OCBAQAorLyogVGVzdCBmb3Igc2l6ZWluYmFzZSBmdW5jdGlvbi4KKworQ29weXJpZ2h0IDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIEV4cG9uZW50cyB1cCB0byAyXlNJWkVfTE9HICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDEzCisjZW5kaWYKKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCAzMAorI2VuZGlmCisKKyNkZWZpbmUgTUFYX04gKDE8PFNJWkVfTE9HKQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfbGltYl90IGE7CisgIG1wX3B0ciBwcCwgc2NyYXRjaDsKKyAgbXBfbGltYl90IG1heF9iOworICBpbnQgY291bnQgPSBDT1VOVDsKKyAgaW50IHRlc3Q7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBUTVBfREVDTDsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIFRNUF9NQVJLOworICByYW5kcyA9IFJBTkRTOworCisgIHBwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTik7CisgIHNjcmF0Y2ggPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OKTsKKyAgbWF4X2IgPSBudW1iZXJvZiAobXBfYmFzZXMpOworCisgIEFTU0VSVF9BTFdBWVMgKG1heF9iID4gNjIpOworICBBU1NFUlRfQUxXQVlTIChtYXhfYiA8IEdNUF9OVU1CX01BWCk7CisKKyAgZm9yIChhID0gMjsgYSA8IG1heF9iOyArK2EpCisgICAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IGNvdW50OyArK3Rlc3QpCisgICAgICB7CisJbXBfc2l6ZV90IHBuOworCW1wX2xpbWJfdCBleHA7CisJbXBfYml0Y250X3QgcmVzOworCisJZXhwID0gZ21wX3VyYW5kb21tX3VpIChyYW5kcywgTUFYX04pOworCisJcG4gPSBtcG5fcG93XzEgKHBwLCAmYSwgMSwgZXhwLCBzY3JhdGNoKTsKKworCXJlcyA9IG1wbl9zaXplaW5iYXNlIChwcCwgcG4sIGEpIC0gMTsKKworCWlmICgocmVzIDwgZXhwKSB8fCAocmVzID4gZXhwICsgMSkpCisJICB7CisJICAgIHByaW50ZiAoIkVSUk9SIGluIHRlc3QgJWQsIGJhc2UgPSAlZCwgZXhwID0gJWQsIHJlcyA9ICVkXG4iLAorCQkgICAgdGVzdCwgKGludCkgYSwgKGludCkgZXhwLCAoaW50KSByZXMpOworCSAgICBhYm9ydCgpOworCSAgfQorCisJbXBuX3N1Yl8xIChwcCwgcHAsIHBuLCBDTlNUX0xJTUIoMSkpOworCXBuIC09IHBwW3BuLTFdID09IDA7CisKKwlyZXMgPSBtcG5fc2l6ZWluYmFzZSAocHAsIHBuLCBhKTsKKworCWlmICgocmVzIDwgZXhwKSB8fCAocmVzIC0gMSA+IGV4cCkpCisJICB7CisJICAgIHByaW50ZiAoIkVSUk9SIGluIC0xIHRlc3QgJWQsIGJhc2UgPSAlZCwgZXhwID0gJWQsIHJlcyA9ICVkXG4iLAorCQkgICAgdGVzdCwgKGludCkgYSwgKGludCkgZXhwLCAoaW50KSByZXMpOworCSAgICBhYm9ydCgpOworCSAgfQorICAgICAgfQorCisgIFRNUF9GUkVFOworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3Qtc3FybG8uYyBiL3Rlc3RzL21wbi90LXNxcmxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYjFlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXNxcmxvLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIFRlc3QgZm9yIHNxcmxvIGZ1bmN0aW9uLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogU2l6ZXMgYXJlIHVwIHRvIDJeU0laRV9MT0cgbGltYnMgKi8KKyNpZm5kZWYgU0laRV9MT0cKKyNkZWZpbmUgU0laRV9MT0cgMTAKKyNlbmRpZgorCisjaWZuZGVmIENPVU5UCisjZGVmaW5lIENPVU5UIDEwMDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfTiAoMUwgPDwgU0laRV9MT0cpCisjZGVmaW5lIE1JTl9OICgxKQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCByZWZwLCBwcCwgc2NyYXRjaDsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworI2RlZmluZSBtcG5fc3FybG9faXRjaChuKSAoMCkKKworICBhcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04pOworICByZWZwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTiAqIDIpOworICBwcCA9IDErVE1QX0FMTE9DX0xJTUJTIChNQVhfTiArIDIpOworICBzY3JhdGNoCisgICAgPSAxK1RNUF9BTExPQ19MSU1CUyAobXBuX3NxcmxvX2l0Y2ggKE1BWF9OKSArIDIpOworCisgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBjb3VudDsgdGVzdCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNpemVfbWluOworICAgICAgdW5zaWduZWQgc2l6ZV9yYW5nZTsKKyAgICAgIG1wX3NpemVfdCBuOworICAgICAgbXBfc2l6ZV90IGl0Y2g7CisgICAgICBtcF9saW1iX3QgcF9iZWZvcmUsIHBfYWZ0ZXIsIHNfYmVmb3JlLCBzX2FmdGVyOworCisgICAgICBmb3IgKHNpemVfbWluID0gMTsgKDFMIDw8IHNpemVfbWluKSA8IE1JTl9OOyBzaXplX21pbisrKQorCTsKKworICAgICAgLyogV2UgZ2VuZXJhdGUgYW4gaW4gdGhlIE1JTl9OIDw9IG4gPD0gKDEgPDwgc2l6ZV9yYW5nZSkuICovCisgICAgICBzaXplX3JhbmdlID0gc2l6ZV9taW4KKwkrIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIFNJWkVfTE9HICsgMSAtIHNpemVfbWluKTsKKworICAgICAgbiA9IE1JTl9OCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAoMUwgPDwgc2l6ZV9yYW5nZSkgKyAxIC0gTUlOX04pOworCisgICAgICBtcG5fcmFuZG9tMiAoYXAsIG4pOworICAgICAgbXBuX3JhbmRvbTIgKHBwLTEsIG4gKyAyKTsKKyAgICAgIHBfYmVmb3JlID0gcHBbLTFdOworICAgICAgcF9hZnRlciA9IHBwW25dOworCisgICAgICBpdGNoID0gbXBuX3NxcmxvX2l0Y2ggKG4pOworICAgICAgQVNTRVJUX0FMV0FZUyAoaXRjaCA8PSBtcG5fc3FybG9faXRjaCAoTUFYX04pKTsKKyAgICAgIG1wbl9yYW5kb20yIChzY3JhdGNoLTEsIGl0Y2grMik7CisgICAgICBzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworICAgICAgc19hZnRlciA9IHNjcmF0Y2hbaXRjaF07CisKKyAgICAgIG1wbl9zcXJsbyAocHAsIGFwLCBuKTsKKyAgICAgIG1wbl9zcXIgKHJlZnAsIGFwLCBuKTsKKyAgICAgIGlmIChwcFstMV0gIT0gcF9iZWZvcmUgfHwgcHBbbl0gIT0gcF9hZnRlcgorCSAgfHwgc2NyYXRjaFstMV0gIT0gc19iZWZvcmUgfHwgc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyCisJICB8fCBtcG5fY21wIChyZWZwLCBwcCwgbikgIT0gMCkKKwl7CisJICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBuID0gJWQiLAorCQkgIHRlc3QsIChpbnQpIG4pOworCSAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBwcDoiKTsgbXBuX2R1bXAgKHBwIC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW25dICE9IHBfYWZ0ZXIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJhZnRlciBwcDoiKTsgbXBuX2R1bXAgKHBwICsgbiwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZwX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgaWYgKHNjcmF0Y2hbLTFdICE9IHNfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHNjcmF0Y2g6Iik7IG1wbl9kdW1wIChzY3JhdGNoLTEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYWZ0ZXIsIDEpOworCSAgICB9CisJICBtcG5fZHVtcCAoYXAsIG4pOworCSAgbXBuX2R1bXAgKHBwLCBuKTsKKwkgIG1wbl9kdW1wIChyZWZwLCBuKTsKKworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorICBUTVBfRlJFRTsKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXNxcm1vZF9ia25wMS5jIGIvdGVzdHMvbXBuL3Qtc3FybW9kX2JrbnAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMDkyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXNxcm1vZF9ia25wMS5jCkBAIC0wLDAgKzEsMjUxIEBACisvKiBUZXN0IGZvciBtdWxtb2RfYmtucDEgZnVuY3Rpb24uCisKKyAgIENvbnRyaWJ1dGVkIHRvIHRoZSBHTlUgcHJvamVjdCBieSBNYXJjbyBCb2RyYXRvLgorCitDb3B5cmlnaHQgMjAwOSwgMjAyMC0yMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKyNpZiBNT0RfQktOUDFfVVNFMTEKKyNkZWZpbmUgVVNFMTEgMTEsCisjZWxzZQorI2RlZmluZSBVU0UxMQorI2VuZGlmCisKKyNpZiBHTVBfTlVNQl9CSVRTICUgMzIgPT0gMAorI2RlZmluZSBNQVhfSyAxNworI2RlZmluZSBTVVBQT1JURURfSyB7MywgNSwgNywgMTMsIFVTRTExIE1BWF9LfQorI2Vsc2UKKyNpZiBHTVBfTlVNQl9CSVRTICUgMTYgPT0gMAorI2RlZmluZSBNQVhfSyAxMworI2RlZmluZSBTVVBQT1JURURfSyB7MywgNSwgNywgVVNFMTEgTUFYX0t9CisjZWxzZQorI2lmIEdNUF9OVU1CX0JJVFMgJSA4ID09IDAKKyNkZWZpbmUgTUFYX0sgNworI2RlZmluZSBTVVBQT1JURURfSyB7MywgVVNFMTEgTUFYX0t9CisjZWxzZQorI2RlZmluZSBTVVBQT1JURURfSyB7VVNFMTF9IC8qIFN1cHBvcnRlZCA/ICovCisjZW5kaWYgLyogR01QX05VTUJfQklUUyAlIDggPT0gMCAqLworI2VuZGlmIC8qIEdNUF9OVU1CX0JJVFMgJSAxNiA9PSAwICovCisjZW5kaWYgLyogR01QX05VTUJfQklUUyAlIDMyID09IDAgKi8KKworI2lmIE1PRF9CS05QMV9PTkxZMworI3VuZGVmIFNVUFBPUlRFRF9LCisjdW5kZWYgTUFYX0sKKyNkZWZpbmUgTUFYX0sgMworI2RlZmluZSBTVVBQT1JURURfSyB7M30KKyNlbmRpZgorCisvKiBTaXplcyBhcmUgdXAgdG8gTUFYX0sgKiAyXlNJWkVfTE9HIGxpbWJzICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDcKKyNlbmRpZgorCisjaWZuZGVmIENPVU5UCisjZGVmaW5lIENPVU5UIDUwMDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OIChNQVhfSyA8PCBTSVpFX0xPRykKKyNkZWZpbmUgTUlOX04gMQorCisvKgorICBSZWZlcmVuY2UgZnVuY3Rpb24gZm9yIG11bHRpcGxpY2F0aW9uIG1vZHVsbyBCXntrKnJufSsxLgorKi8KKworc3RhdGljIHZvaWQKK3JlZl9zcXJtb2RfYm5wMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgYXAsIG1wX3NpemVfdCBybikKK3sKKyAgbXBfbGltYl90IGN5OworCisgIG1wbl9zcXIgKHJwLCBhcCwgcm4gKyAxKTsKKyAgY3kgPSBycFsyICogcm5dOworICBNUE5fSU5DUl9VIChycCwgMiAqIHJuICsgMSwgcnBbMiAqIHJuXSk7CisgIGN5ID0gcnBbMiAqIHJuXSAtIGN5ICsgbXBuX3N1Yl9uIChycCwgcnAsIHJwICsgcm4sIHJuKTsKKyAgcnBbcm5dID0gMDsKKyAgTVBOX0lOQ1JfVSAocnAsIHJuICsgMSwgY3kpOworfQorCisvKgorICBDb21wYXJlIHRoZSByZXN1bHQgb2YgdGhlIG1wbl9tdWxtb2RfYm5wMSBmdW5jdGlvbiBpbiB0aGUgbGlicmFyeQorICB3aXRoIHRoZSByZWZlcmVuY2UgZnVuY3Rpb24gYWJvdmUuCisqLwordW5zaWduZWQgc3VwcG9ydGVkX2tbXSA9IFNVUFBPUlRFRF9LOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCByZWZwLCBwcCwgc2NyYXRjaDsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBhcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKyAxKTsKKyAgcmVmcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKiAyICsgMik7CisgIHBwID0gMSArIFRNUF9BTExPQ19MSU1CUyAoTUFYX04gKyAzKTsKKyAgc2NyYXRjaAorICAgID0gMSArIFRNUF9BTExPQ19MSU1CUyAobXBuX211bG1vZF9ia25wMV9pdGNoIChNQVhfTikgKyAyKTsKKworICBmb3IgKHRlc3QgPSAwOyB0ZXN0IDwgY291bnQ7IHRlc3QrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaXplX21pbjsKKyAgICAgIHVuc2lnbmVkIHNpemVfcmFuZ2U7CisgICAgICB1bnNpZ25lZCBrOworICAgICAgbXBfc2l6ZV90IHJuLCBuOworICAgICAgbXBfc2l6ZV90IGl0Y2g7CisgICAgICBtcF9saW1iX3QgcF9iZWZvcmUsIHBfYWZ0ZXIsIHNfYmVmb3JlLCBzX2FmdGVyOworCisgICAgICBmb3IgKHNpemVfbWluID0gMTsgKDFMIDw8IHNpemVfbWluKSA8IE1JTl9OOyBzaXplX21pbisrKQorCTsKKworICAgICAgLyogV2UgZ2VuZXJhdGUgcm4gaW4gdGhlIE1JTl9OIDw9IG4gPD0gKDEgPDwgc2l6ZV9yYW5nZSkuICovCisgICAgICBzaXplX3JhbmdlID0gc2l6ZV9taW4KKwkrIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIFNJWkVfTE9HICsgMSAtIHNpemVfbWluKTsKKworICAgICAgayA9IHN1cHBvcnRlZF9rW3Rlc3QgJSBudW1iZXJvZiAoc3VwcG9ydGVkX2spXTsKKyAgICAgIGlmICh0ZXN0IDwgbnVtYmVyb2YgKHN1cHBvcnRlZF9rKSkKKwl7CisJICBuID0gMTsKKwkgIHJuID0gazsKKwkgIGFwIFtybl0gPSAwOworCSAgbXBfbGltYl90IHggPSBHTVBfTlVNQl9NQVggLyBrICsgMTsKKwkgIGFwIFswXSA9IHg7CisJICBmb3IgKGludCBpID0gMTsgaSA8IGs7IGkgKz0gMikKKwkgICAgeworCSAgICAgIGFwIFtpXSA9IC0geDsKKwkgICAgICBhcCBbaSArIDFdID0geCAtIDE7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgbiA9IE1JTl9OCisJICAgICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgKDFMIDw8IHNpemVfcmFuZ2UpICsgMSAtIE1JTl9OKTsKKwkgIHJuID0gayAqIG47CisJICBpZiAoKEdNUF9OVU1CX01BWCAlIGsgIT0gMCkgJiYgKHJuICUgMyA9PSAwKSkKKwkgICAgbiA9IHJuIC8gKGsgPSAzKTsKKworCSAgbXBuX3JhbmRvbTIgKGFwLCBybiArIDEpOworCisJICBhcCBbcm5dICY9IDE7CisJfQorCisgICAgICBtcG5fcmFuZG9tMiAocHAtMSwgcm4gKyAzKTsKKyAgICAgIHBfYmVmb3JlID0gcHBbLTFdOworICAgICAgcF9hZnRlciA9IHBwW3JuICsgMV07CisKKyAgICAgIGl0Y2ggPSBtcG5fc3FybW9kX2JrbnAxX2l0Y2ggKHJuKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKGl0Y2ggPD0gbXBuX211bG1vZF9ia25wMV9pdGNoIChNQVhfTikpOworICAgICAgbXBuX3JhbmRvbTIgKHNjcmF0Y2ggLSAxLCBpdGNoICsgMik7CisgICAgICBzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworICAgICAgc19hZnRlciA9IHNjcmF0Y2hbaXRjaF07CisKKyAgICAgIG1wbl9zcXJtb2RfYmtucDEgKCAgcHAsIGFwLCBuLCBrLCBzY3JhdGNoKTsKKyAgICAgIHJlZl9zcXJtb2RfYm5wMSAocmVmcCwgYXAsIHJuKTsKKyAgICAgIGlmIChwcFstMV0gIT0gcF9iZWZvcmUgfHwgcHBbcm4gKyAxXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBybiArIDEpICE9IDApCisJeworCSAgcHJpbnRmICgiRVJST1IgaW4gdGVzdCAlZChzcXIpLCBybiA9ICVkLCBuID0gJWQsIGsgPSAlZFxuIiwKKwkJICB0ZXN0LCAoaW50KSBybiwgKGludCkgbiwgKGludCkgayk7CisJICBpZiAocHBbLTFdICE9IHBfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHBwOiIpOyBtcG5fZHVtcCAocHAgLSAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW3JuICsgMV0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBybiArIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaCAtIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYWZ0ZXIsIDEpOworCSAgICB9CisJICBtcG5fZHVtcCAoYXAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocHAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocmVmcCwgcm4gKyAxKTsKKworCSAgYWJvcnQoKTsKKwl9CisKKyAgICAgIG1wbl9yYW5kb20yIChwcC0xLCBybiArIDMpOworICAgICAgcF9iZWZvcmUgPSBwcFstMV07CisgICAgICBwX2FmdGVyID0gcHBbcm4gKyAxXTsKKworICAgICAgaXRjaCA9IG1wbl9tdWxtb2RfYmtucDFfaXRjaCAocm4pOworICAgICAgQVNTRVJUX0FMV0FZUyAoaXRjaCA8PSBtcG5fbXVsbW9kX2JrbnAxX2l0Y2ggKE1BWF9OKSk7CisgICAgICBtcG5fcmFuZG9tMiAoc2NyYXRjaCAtIDEsIGl0Y2ggKyAyKTsKKyAgICAgIHNfYmVmb3JlID0gc2NyYXRjaFstMV07CisgICAgICBzX2FmdGVyID0gc2NyYXRjaFtpdGNoXTsKKworICAgICAgbXBuX211bG1vZF9ia25wMSAoICBwcCwgYXAsIGFwLCBuLCBrLCBzY3JhdGNoKTsKKyAgICAgIGlmIChwcFstMV0gIT0gcF9iZWZvcmUgfHwgcHBbcm4gKyAxXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBybiArIDEpICE9IDApCisJeworCSAgcHJpbnRmICgiRVJST1IgaW4gdGVzdCAlZChtdWwpLCBybiA9ICVkLCBuID0gJWQsIGsgPSAlZFxuIiwKKwkJICB0ZXN0LCAoaW50KSBybiwgKGludCkgbiwgKGludCkgayk7CisJICBpZiAocHBbLTFdICE9IHBfYmVmb3JlKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYmVmb3JlIHBwOiIpOyBtcG5fZHVtcCAocHAgLSAxLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW3JuICsgMV0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBybiArIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaCAtIDEsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19iZWZvcmUsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYWZ0ZXIsIDEpOworCSAgICB9CisJICBtcG5fZHVtcCAoYXAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocHAsIHJuICsgMSk7CisJICBtcG5fZHVtcCAocmVmcCwgcm4gKyAxKTsKKworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorICBUTVBfRlJFRTsKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXNxcm1vZF9ibm0xLmMgYi90ZXN0cy9tcG4vdC1zcXJtb2RfYm5tMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTVmMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC1zcXJtb2RfYm5tMS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBUZXN0IGZvciBzcXJtb2RfYm5tMSBmdW5jdGlvbi4KKworICAgQ29udHJpYnV0ZWQgdG8gdGhlIEdOVSBwcm9qZWN0IGJ5IE1hcmNvIEJvZHJhdG8uCisKK0NvcHlyaWdodCAyMDA5LCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisvKiBTaXplcyBhcmUgdXAgdG8gMl5TSVpFX0xPRyBsaW1icyAqLworI2lmbmRlZiBTSVpFX0xPRworI2RlZmluZSBTSVpFX0xPRyAxMgorI2VuZGlmCisKKyNpZm5kZWYgQ09VTlQKKyNkZWZpbmUgQ09VTlQgMzAwMAorI2VuZGlmCisKKyNkZWZpbmUgTUFYX04gKDFMIDw8IFNJWkVfTE9HKQorI2RlZmluZSBNSU5fTiAxCisKKy8qCisgIFJlZmVyZW5jZSBmdW5jdGlvbiBmb3Igc3F1YXJpbmcgbW9kdWxvIEJecm4tMS4KKworICBUaGUgcmVzdWx0IGlzIGV4cGVjdGVkIHRvIGJlIFpFUk8gaWYgYW5kIG9ubHkgaWYgb25lIG9mIHRoZSBvcGVyYW5kCisgIGFscmVhZHkgaXMuIE90aGVyd2lzZSB0aGUgY2xhc3MgWzBdIE1vZChCXnJuLTEpIGlzIHJlcHJlc2VudGVkIGJ5CisgIEJecm4tMS4gVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpZiBzcXJtb2RfYm5tMSBpcyB1c2VkIHRvCisgIGNvbWJpbmUgcmVzdWx0cyBhbmQgb2J0YWluIGEgbmF0dXJhbCBudW1iZXIgd2hlbiBvbmUga25vd3MgaW4KKyAgYWR2YW5jZSB0aGF0IHRoZSBmaW5hbCB2YWx1ZSBpcyBsZXNzIHRoYW4gKEJecm4tMSkuCisqLworCitzdGF0aWMgdm9pZAorcmVmX3Nxcm1vZF9ibm0xIChtcF9wdHIgcnAsIG1wX3NpemVfdCBybiwgbXBfc3JjcHRyIGFwLCBtcF9zaXplX3QgYW4pCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKDAgPCBhbiAmJiBhbiA8PSBybik7CisKKyAgcmVmbXBuX211bCAocnAsIGFwLCBhbiwgYXAsIGFuKTsKKyAgYW4gKj0gMjsKKyAgaWYgKGFuID4gcm4pIHsKKyAgICBjeSA9IG1wbl9hZGQgKHJwLCBycCwgcm4sIHJwICsgcm4sIGFuIC0gcm4pOworICAgIC8qIElmIGN5ID09IDEsIHRoZW4gdGhlIHZhbHVlIG9mIHJwIGlzIGF0IG1vc3QgQl5ybiAtIDIsIHNvIHRoZXJlIGNhbgorICAgICAqIGJlIG5vIG92ZXJmbG93IHdoZW4gYWRkaW5nIGluIHRoZSBjYXJyeS4gKi8KKyAgICBNUE5fSU5DUl9VIChycCwgcm4sIGN5KTsKKyAgfQorfQorCisvKgorICBDb21wYXJlIHRoZSByZXN1bHQgb2YgdGhlIG1wbl9zcXJtb2RfYm5tMSBmdW5jdGlvbiBpbiB0aGUgbGlicmFyeQorICB3aXRoIHRoZSByZWZlcmVuY2UgZnVuY3Rpb24gYWJvdmUuCisqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCByZWZwLCBwcCwgc2NyYXRjaDsKKyAgaW50IGNvdW50ID0gQ09VTlQ7CisgIGludCB0ZXN0OworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBBU1NFUlRfQUxXQVlTIChtcG5fc3FybW9kX2JubTFfbmV4dF9zaXplIChNQVhfTikgPT0gTUFYX04pOworCisgIGFwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfTik7CisgIHJlZnAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9OICogNCk7CisgIHBwID0gMStUTVBfQUxMT0NfTElNQlMgKE1BWF9OICsgMik7CisgIHNjcmF0Y2gKKyAgICA9IDErVE1QX0FMTE9DX0xJTUJTIChtcG5fc3FybW9kX2JubTFfaXRjaCAoTUFYX04sIE1BWF9OKSArIDIpOworCisgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBjb3VudDsgdGVzdCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNpemVfbWluOworICAgICAgdW5zaWduZWQgc2l6ZV9yYW5nZTsKKyAgICAgIG1wX3NpemVfdCBhbixybixuOworICAgICAgbXBfc2l6ZV90IGl0Y2g7CisgICAgICBtcF9saW1iX3QgcF9iZWZvcmUsIHBfYWZ0ZXIsIHNfYmVmb3JlLCBzX2FmdGVyOworCisgICAgICBmb3IgKHNpemVfbWluID0gMTsgKDFMIDw8IHNpemVfbWluKSA8IE1JTl9OOyBzaXplX21pbisrKQorCTsKKworICAgICAgLyogV2UgZ2VuZXJhdGUgYW4gaW4gdGhlIE1JTl9OIDw9IG4gPD0gKDEgPDwgc2l6ZV9yYW5nZSkuICovCisgICAgICBzaXplX3JhbmdlID0gc2l6ZV9taW4KKwkrIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIFNJWkVfTE9HICsgMSAtIHNpemVfbWluKTsKKworICAgICAgbiA9IE1JTl9OCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAoMUwgPDwgc2l6ZV9yYW5nZSkgKyAxIC0gTUlOX04pOworICAgICAgbiA9IG1wbl9zcXJtb2RfYm5tMV9uZXh0X3NpemUgKG4pOworCisgICAgICBpZiAobiA9PSAxKQorCWFuID0gMTsKKyAgICAgIGVsc2UKKwlhbiA9ICgobisxKSA+PiAxKSArIGdtcF91cmFuZG9tbV91aSAocmFuZHMsIChuKzEpID4+IDEpOworCisgICAgICBtcG5fcmFuZG9tMiAoYXAsIGFuKTsKKworICAgICAgLyogU29tZXRpbWUgdHJpZ2dlciB0aGUgYm9yZGVybGluZSBjb25kaXRpb25zCisJIEEgPSAtMSwwLCsxIE1vZChCXntuLzJ9KzEpLgorCSBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSBzcGxpdCwgaS5lLiBuIGlzIGV2ZW4uICovCisgICAgICBpZiAoKHRlc3QgJiAweDFmKSA9PSAxICYmIChuICYgMSkgPT0gMCkgeworCW1wX3NpemVfdCB4OworCU1QTl9DT1BZIChhcCwgYXAgKyAobiA+PiAxKSwgYW4gLSAobiA+PiAxKSk7CisJTVBOX1pFUk8gKGFwICsgYW4gLSAobiA+PiAxKSAsIG4gLSBhbik7CisJeCA9IDA7CisJLyogeCA9IChuID09IGFuKSA/IDAgOiBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBuIC0gYW4pOyAqLworCWFwW3hdICs9IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDMpIC0gMTsKKyAgICAgIH0KKyAgICAgIHJuID0gTUlOKG4sIDIqYW4pOworICAgICAgbXBuX3JhbmRvbTIgKHBwLTEsIHJuICsgMik7CisgICAgICBwX2JlZm9yZSA9IHBwWy0xXTsKKyAgICAgIHBfYWZ0ZXIgPSBwcFtybl07CisKKyAgICAgIGl0Y2ggPSBtcG5fc3FybW9kX2JubTFfaXRjaCAobiwgYW4pOworICAgICAgQVNTRVJUX0FMV0FZUyAoaXRjaCA8PSBtcG5fc3FybW9kX2JubTFfaXRjaCAoTUFYX04sIE1BWF9OKSk7CisgICAgICBtcG5fcmFuZG9tMiAoc2NyYXRjaC0xLCBpdGNoKzIpOworICAgICAgc19iZWZvcmUgPSBzY3JhdGNoWy0xXTsKKyAgICAgIHNfYWZ0ZXIgPSBzY3JhdGNoW2l0Y2hdOworCisgICAgICBtcG5fc3FybW9kX2JubTEgKCAgcHAsIG4sIGFwLCBhbiwgc2NyYXRjaCk7CisgICAgICByZWZfc3FybW9kX2JubTEgKHJlZnAsIG4sIGFwLCBhbik7CisgICAgICBpZiAocHBbLTFdICE9IHBfYmVmb3JlIHx8IHBwW3JuXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBybikgIT0gMCkKKwl7CisJICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBhbiA9ICVkLCBuID0gJWRcbiIsCisJCSAgdGVzdCwgKGludCkgYW4sIChpbnQpIG4pOworCSAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBwcDoiKTsgbXBuX2R1bXAgKHBwIC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW3JuXSAhPSBwX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgcHA6Iik7IG1wbl9kdW1wIChwcCArIHJuLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYWZ0ZXIsIDEpOworCSAgICB9CisJICBpZiAoc2NyYXRjaFstMV0gIT0gc19iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2gtMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJhZnRlciBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaCArIGl0Y2gsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmc19hZnRlciwgMSk7CisJICAgIH0KKwkgIG1wbl9kdW1wIChhcCwgYW4pOworCSAgbXBuX2R1bXAgKHBwLCBybik7CisJICBtcG5fZHVtcCAocmVmcCwgcm4pOworCisJICBhYm9ydCgpOworCX0KKyAgICB9CisgIFRNUF9GUkVFOworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTItc3FyLmMgYi90ZXN0cy9tcG4vdC10b29tMi1zcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQyODUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTItc3FyLmMKQEAgLTAsMCArMSw4NiBAQAorI2RlZmluZSBtcG5fdG9vbU5fc3FyIG1wbl90b29tMl9zcXIKKyNkZWZpbmUgbXBuX3Rvb21OX3Nxcl9pdGNoIG1wbl90b29tMl9zcXJfaXRjaAorI2RlZmluZSBNSU5fQU4gTVBOX1RPT00yX1NRUl9NSU5TSVpFCisjZGVmaW5lIE1BWF9BTiBTUVJfVE9PTTNfVEhSRVNIT0xECisKKyNkZWZpbmUgTU9SRV9TUVJfVEVTVFMgZXhwbG9yZV91bmxpa2VseV9icmFuY2gKKyNpbmNsdWRlICJ0b29tLXNxci1zaGFyZWQuaCIKKwordm9pZAorZXhwbG9yZV91bmxpa2VseV9icmFuY2ggKGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzKQoreworICBtcF9wdHIgYXAsIHJlZnAsIHBwLCBzY3JhdGNoOworICBtcF9zaXplX3QgYW47CisgIG1wX2JpdGNudF90IGJpdDsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIGFwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfQU4pOworICByZWZwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfQU4gKiAyKTsKKyAgcHAgPSAxICsgVE1QX0FMTE9DX0xJTUJTIChNQVhfQU4gKiAyICsgMik7CisgIHNjcmF0Y2gKKyAgICA9IDErVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbU5fc3FyX2l0Y2ggKE1BWF9BTikgKyAyKTsKKworICBmb3IgKGFuID0gTUlOX0FOICsgKE1JTl9BTiAmIDEpOyBhbiA8IE1BWF9BTjsgYW4rPTIpCisgICAgeworICAgICAgbXBfc2l6ZV90IGl0Y2g7CisgICAgICBtcF9saW1iX3QgcF9iZWZvcmUsIHBfYWZ0ZXIsIHNfYmVmb3JlLCBzX2FmdGVyOworCisgICAgICBiaXQgPSBhbiAvIDIgKiBHTVBfTlVNQl9CSVRTCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBhbiAvIDIgKiBHTVBfTlVNQl9CSVRTIC0gMSk7CisKKyAgICAgIG1wbl96ZXJvIChhcCwgYW4pOworICAgICAgbXBuX3plcm8gKHBwLCBhbiAqIDIpOworICAgICAgcHAgW2FuIC0gMV0gfD0gR01QX05VTUJfSElHSEJJVDsKKyAgICAgIHBwIFtiaXQgLyBHTVBfTlVNQl9CSVRTXSB8PSBDTlNUX0xJTUIgKDEpIDw8IChiaXQgJSBHTVBfTlVNQl9CSVRTKTsKKyAgICAgIG1wbl9zcXJ0cmVtIChhcCwgTlVMTCwgcHAsIGFuKTsKKyAgICAgIC8qIFdlIG5lZWQge2FwLCBhbn0gc3VjaCB0aGF0IHthcCArIGFuLzIsIGFuLzJ9IGlzIHplcm8gYW5kCisJIHRoZSByZXN1bHQge3BwLCAyKmFufSBpcyBzdWNoIHRoYXQgdGhlIHN1bQorCSB7cHAsIGFuLzJ9ICsge3BwICsgYW4vMiwgYW4vMn0gZ2l2ZXMgYSBjYXJyeS4gKi8KKyAgICAgIG1wbl9yYW5kb20yIChwcC0xLCBhbiAqIDIgKyAyKTsKKyAgICAgIHBfYmVmb3JlID0gcHBbLTFdOworICAgICAgcF9hZnRlciA9IHBwW2FuICogMl07CisKKyAgICAgIGl0Y2ggPSBtcG5fdG9vbU5fc3FyX2l0Y2ggKGFuKTsKKyAgICAgIEFTU0VSVF9BTFdBWVMgKGl0Y2ggPD0gbXBuX3Rvb21OX3Nxcl9pdGNoIChNQVhfQU4pKTsKKyAgICAgIG1wbl9yYW5kb20yIChzY3JhdGNoLTEsIGl0Y2grMik7CisgICAgICBzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworICAgICAgc19hZnRlciA9IHNjcmF0Y2hbaXRjaF07CisKKyAgICAgIG1wbl90b29tTl9zcXIgKHBwLCBhcCwgYW4sIHNjcmF0Y2gpOworICAgICAgcmVmbXBuX211bCAocmVmcCwgYXAsIGFuLCBhcCwgYW4pOworICAgICAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSB8fCBwcFthbiAqIDJdICE9IHBfYWZ0ZXIKKwkgIHx8IHNjcmF0Y2hbLTFdICE9IHNfYmVmb3JlIHx8IHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcgorCSAgfHwgbXBuX2NtcCAocmVmcCwgcHAsIGFuICogMikgIT0gMCkKKwl7CisJICBwcmludGYgKCJFUlJPUiB3aXRoIGJpdCAlbHUsIGFuID0gJWRcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcpIGJpdCwgKGludCkgYW4pOworCSAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBwcDoiKTsgbXBuX2R1bXAgKHBwIC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHBwW2FuICogMl0gIT0gcF9hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHBwOiIpOyBtcG5fZHVtcCAocHAgKyBhbiAqIDIsIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHNjcmF0Y2g6Iik7IG1wbl9kdW1wIChzY3JhdGNoICsgaXRjaCwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgbXBuX2R1bXAgKGFwLCBhbik7CisJICBtcG5fZHVtcCAocHAsIGFuICogMik7CisJICBtcG5fZHVtcCAocmVmcCwgYW4gKiAyKTsKKworCSAgYWJvcnQoKTsKKwl9CisgICAgfQorICBUTVBfRlJFRTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb20yMi5jIGIvdGVzdHMvbXBuL3QtdG9vbTIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZWVkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb20yMi5jCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgbXBuX3Rvb21NTl9tdWwgbXBuX3Rvb20yMl9tdWwKKyNkZWZpbmUgbXBuX3Rvb21NTl9tdWxfaXRjaCBtcG5fdG9vbTIyX211bF9pdGNoCisjZGVmaW5lIE1JTl9BTiBNSU4oTVBOX1RPT00yMl9NVUxfTUlOU0laRSw0KQorCisjZGVmaW5lIE1JTl9CTihhbikJCQkJXAorICAoKGFuKSA+PSAyKk1VTF9UT09NMjJfVEhSRVNIT0xECQlcCisgICA/IChhbikgKyAyIC0gTVVMX1RPT00yMl9USFJFU0hPTEQJCVwKKyAgIDogKChhbikrMSkvMiArIDEgKyAoYW4gJiAxKSkKKworI2luY2x1ZGUgInRvb20tc2hhcmVkLmgiCmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC10b29tMy1zcXIuYyBiL3Rlc3RzL21wbi90LXRvb20zLXNxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzNiOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC10b29tMy1zcXIuYwpAQCAtMCwwICsxLDYgQEAKKyNkZWZpbmUgbXBuX3Rvb21OX3NxciBtcG5fdG9vbTNfc3FyCisjZGVmaW5lIG1wbl90b29tTl9zcXJfaXRjaCBtcG5fdG9vbTNfc3FyX2l0Y2gKKyNkZWZpbmUgTUlOX0FOIE1BWChTUVJfVE9PTTNfVEhSRVNIT0xELE1QTl9UT09NM19TUVJfTUlOU0laRSkKKyNkZWZpbmUgTUFYX0FOIFNRUl9UT09NNF9USFJFU0hPTEQKKworI2luY2x1ZGUgInRvb20tc3FyLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTMyLmMgYi90ZXN0cy9tcG4vdC10b29tMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI3NDVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTMyLmMKQEAgLTAsMCArMSw4IEBACisjZGVmaW5lIG1wbl90b29tTU5fbXVsIG1wbl90b29tMzJfbXVsCisjZGVmaW5lIG1wbl90b29tTU5fbXVsX2l0Y2ggbXBuX3Rvb20zMl9tdWxfaXRjaAorCisjZGVmaW5lIE1JTl9BTiA2CisjZGVmaW5lIE1JTl9CTihhbikgKCgoYW4pICsgOCkgLyAoc2l6ZV90KSAzKQorI2RlZmluZSBNQVhfQk4oYW4pICgoYW4pIC0gMikKKworI2luY2x1ZGUgInRvb20tc2hhcmVkLmgiCmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC10b29tMzMuYyBiL3Rlc3RzL21wbi90LXRvb20zMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTgyYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC10b29tMzMuYwpAQCAtMCwwICsxLDExIEBACisjZGVmaW5lIG1wbl90b29tTU5fbXVsIG1wbl90b29tMzNfbXVsCisjZGVmaW5lIG1wbl90b29tTU5fbXVsX2l0Y2ggbXBuX3Rvb20zM19tdWxfaXRjaAorCisvKiBTbWFsbGVyIHNpemVzIG5vdCBzdXBwb3J0ZWQ7IG1heSBsZWFkIHRvIHJlY3Vyc2l2ZSBjYWxscyB0bworICAgdG9vbTIyX211bCB3aXRoIGludmFsaWQgaW5wdXQgc2l6ZS4gKi8KKyNkZWZpbmUgTUlOX0FOIE1VTF9UT09NMzNfVEhSRVNIT0xECisjZGVmaW5lIE1JTl9CTihhbikgKDEgKyAyKigoKGFuKSsyKS8oc2l6ZV90KSAzKSkKKworI2RlZmluZSBDT1VOVCAxMDAwCisKKyNpbmNsdWRlICJ0b29tLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTQtc3FyLmMgYi90ZXN0cy9tcG4vdC10b29tNC1zcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE0YWIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTQtc3FyLmMKQEAgLTAsMCArMSw2IEBACisjZGVmaW5lIG1wbl90b29tTl9zcXIgbXBuX3Rvb200X3NxcgorI2RlZmluZSBtcG5fdG9vbU5fc3FyX2l0Y2ggbXBuX3Rvb200X3Nxcl9pdGNoCisjZGVmaW5lIE1JTl9BTiBNQVgoU1FSX1RPT00zX1RIUkVTSE9MRCxNQVgoU1FSX1RPT000X1RIUkVTSE9MRCxNUE5fVE9PTTRfU1FSX01JTlNJWkUpKQorI2RlZmluZSBNQVhfQU4gU1FSX1RPT002X1RIUkVTSE9MRAorCisjaW5jbHVkZSAidG9vbS1zcXItc2hhcmVkLmgiCmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC10b29tNDIuYyBiL3Rlc3RzL21wbi90LXRvb200Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTRhMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC10b29tNDIuYwpAQCAtMCwwICsxLDggQEAKKyNkZWZpbmUgbXBuX3Rvb21NTl9tdWwgbXBuX3Rvb200Ml9tdWwKKyNkZWZpbmUgbXBuX3Rvb21NTl9tdWxfaXRjaCBtcG5fdG9vbTQyX211bF9pdGNoCisKKyNkZWZpbmUgTUlOX0FOIDEwCisjZGVmaW5lIE1JTl9CTihhbikgKCgoYW4pICsgNykgPj4gMikKKyNkZWZpbmUgTUFYX0JOKGFuKSAoKDIqKGFuKS01KSAvIChzaXplX3QpIDMpCisKKyNpbmNsdWRlICJ0b29tLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTQzLmMgYi90ZXN0cy9tcG4vdC10b29tNDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRhNDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTQzLmMKQEAgLTAsMCArMSw4IEBACisjZGVmaW5lIG1wbl90b29tTU5fbXVsIG1wbl90b29tNDNfbXVsCisjZGVmaW5lIG1wbl90b29tTU5fbXVsX2l0Y2ggbXBuX3Rvb200M19tdWxfaXRjaAorCisjZGVmaW5lIE1JTl9BTiAyNQorI2RlZmluZSBNSU5fQk4oYW4pICgxICsgMiooKChhbikrMykgPj4gMikpCisjZGVmaW5lIE1BWF9CTihhbikgKChhbiktMykKKworI2luY2x1ZGUgInRvb20tc2hhcmVkLmgiCmRpZmYgLS1naXQgYS90ZXN0cy9tcG4vdC10b29tNDQuYyBiL3Rlc3RzL21wbi90LXRvb200NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjI3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcG4vdC10b29tNDQuYwpAQCAtMCwwICsxLDExIEBACisjZGVmaW5lIG1wbl90b29tTU5fbXVsIG1wbl90b29tNDRfbXVsCisjZGVmaW5lIG1wbl90b29tTU5fbXVsX2l0Y2ggbXBuX3Rvb200NF9tdWxfaXRjaAorCisvKiBTbWFsbGVyIHNpemVzIG5vdCBzdXBwb3J0ZWQ7IG1heSBsZWFkIHRvIHJlY3Vyc2l2ZSBjYWxscyB0bworICAgdG9vbTIyX211bCBvciB0b29tMzNfbXVsIHdpdGggaW52YWxpZCBpbnB1dCBzaXplLiAqLworI2RlZmluZSBNSU5fQU4gTVVMX1RPT000NF9USFJFU0hPTEQKKyNkZWZpbmUgTUlOX0JOKGFuKSAoMSArIDMqKCgoYW4pKzMpPj4yKSkKKworI2RlZmluZSBDT1VOVCAxMDAwCisKKyNpbmNsdWRlICJ0b29tLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTUyLmMgYi90ZXN0cy9tcG4vdC10b29tNTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2ZiMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTUyLmMKQEAgLTAsMCArMSw4IEBACisjZGVmaW5lIG1wbl90b29tTU5fbXVsIG1wbl90b29tNTJfbXVsCisjZGVmaW5lIG1wbl90b29tTU5fbXVsX2l0Y2ggbXBuX3Rvb201Ml9tdWxfaXRjaAorCisjZGVmaW5lIE1JTl9BTiAzMgorI2RlZmluZSBNSU5fQk4oYW4pICgoKGFuKSArIDkpIC8gKHNpemVfdCkgNSkKKyNkZWZpbmUgTUFYX0JOKGFuKSAoKChhbikgLSAzKSA+PiAxKQorCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb201My5jIGIvdGVzdHMvbXBuL3QtdG9vbTUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiZjE3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb201My5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbTUzX211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tNTNfbXVsX2l0Y2gKKworI2RlZmluZSBNSU5fQU4gMTcKKyNkZWZpbmUgTUlOX0JOKGFuKSAoMSArIDIqKCgoYW4pICsgNCkgLyAoc2l6ZV90KSA1KSkKKyNkZWZpbmUgTUFYX0JOKGFuKSAoKDMqKGFuKSAtIDExKSA+PiAyKQorCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb201NC5jIGIvdGVzdHMvbXBuL3QtdG9vbTU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhMmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb201NC5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbTU0X211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tNTRfbXVsX2l0Y2gKKworI2RlZmluZSBNSU5fQU4gMzEKKyNkZWZpbmUgTUlOX0JOKGFuKSAoKDMqKGFuKSArIDMyKSAvIChzaXplX3QpIDUpCQkvKiAzLzUgKi8KKyNkZWZpbmUgTUFYX0JOKGFuKSAoKGFuKSAtIDYpCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEvMSAqLworCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb202LXNxci5jIGIvdGVzdHMvbXBuL3QtdG9vbTYtc3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkN2E2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb202LXNxci5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU5fc3FyIG1wbl90b29tNl9zcXIKKyNkZWZpbmUgbXBuX3Rvb21OX3Nxcl9pdGNoIG1wbl90b29tNl9zcXJfaXRjaAorI2RlZmluZSBNSU5fQU4gTUFYKFNRUl9UT09NM19USFJFU0hPTEQsTUFYKFNRUl9UT09NNF9USFJFU0hPTEQsTUFYKFNRUl9UT09NNl9USFJFU0hPTEQsTVBOX1RPT002X1NRUl9NSU5TSVpFKSkpCisjZGVmaW5lIE1BWF9BTiBTUVJfVE9PTThfVEhSRVNIT0xECisKKyNkZWZpbmUgQ09VTlQgMjUwCisKKyNpbmNsdWRlICJ0b29tLXNxci1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb202Mi5jIGIvdGVzdHMvbXBuL3QtdG9vbTYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiMmFhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb202Mi5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbTYyX211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tNjJfbXVsX2l0Y2gKKworI2RlZmluZSBNSU5fQU4gMzEKKyNkZWZpbmUgTUlOX0JOKGFuKSAoKChhbikgKyAxMSkgLyAoc2l6ZV90KSA2KQorI2RlZmluZSBNQVhfQk4oYW4pICgoMiooYW4pIC0gNykgLyAoc2l6ZV90KSA1KQorCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb202My5jIGIvdGVzdHMvbXBuL3QtdG9vbTYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb202My5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbTYzX211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tNjNfbXVsX2l0Y2gKKworI2RlZmluZSBNSU5fQU4gNDkKKyNkZWZpbmUgTUlOX0JOKGFuKSAoMiooKChhbikgKyAyMykgLyAoc2l6ZV90KSA2KSkJLyogMi82ICovCisjZGVmaW5lIE1BWF9CTihhbikgKCgzKihhbikgLSAyMykgIC8gKHNpemVfdCkgNSkJLyogMy81ICovCisKKyNpbmNsdWRlICJ0b29tLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbTZoLmMgYi90ZXN0cy9tcG4vdC10b29tNmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2NhOWZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbTZoLmMKQEAgLTAsMCArMSwxMyBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbTZoX211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tNmhfbXVsX2l0Y2gKKworI2RlZmluZSBTSVpFX0xPRyAxMQorCisvKiBTbWFsbGVyIHNpemVzIG5vdCBzdXBwb3J0ZWQ7IG1heSBsZWFkIHRvIHJlY3Vyc2l2ZSBjYWxscyB0bworICAgdG9vbTIyX211bCwgdG9vbTMzX211bCwgb3IgdG9vbTQ0X211bCB3aXRoIGludmFsaWQgaW5wdXQgc2l6ZS4gKi8KKyNkZWZpbmUgTUlOX0FOIE1VTF9UT09NNkhfTUlOCisjZGVmaW5lIE1JTl9CTihhbikgKE1BWCAoKGFuKjMpPj4zLCA0NikpCisKKyNkZWZpbmUgQ09VTlQgMTAwMAorCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90LXRvb204LXNxci5jIGIvdGVzdHMvbXBuL3QtdG9vbTgtc3FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlZTYwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90LXRvb204LXNxci5jCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBtcG5fdG9vbU5fc3FyIG1wbl90b29tOF9zcXIKKyNkZWZpbmUgbXBuX3Rvb21OX3Nxcl9pdGNoIG1wbl90b29tOF9zcXJfaXRjaAorI2RlZmluZSBNSU5fQU4gTUFYKFNRUl9UT09NM19USFJFU0hPTEQsTUFYKFNRUl9UT09NNF9USFJFU0hPTEQsTUFYKFNRUl9UT09NNl9USFJFU0hPTEQsTUFYKFNRUl9UT09NOF9USFJFU0hPTEQsTVBOX1RPT004X1NRUl9NSU5TSVpFKSkpKQorI2RlZmluZSBNQVhfQU4gU1FSX0ZGVF9USFJFU0hPTEQKKworI2RlZmluZSBDT1VOVCAyNTAKKworI2luY2x1ZGUgInRvb20tc3FyLXNoYXJlZC5oIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBuL3QtdG9vbThoLmMgYi90ZXN0cy9tcG4vdC10b29tOGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEzNDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3QtdG9vbThoLmMKQEAgLTAsMCArMSwxOSBAQAorI2RlZmluZSBtcG5fdG9vbU1OX211bCBtcG5fdG9vbThoX211bAorI2RlZmluZSBtcG5fdG9vbU1OX211bF9pdGNoIG1wbl90b29tOGhfbXVsX2l0Y2gKKworI2RlZmluZSBTSVpFX0xPRyAxMQorCisvKiBTbWFsbGVyIHNpemVzIG5vdCBzdXBwb3J0ZWQ7IG1heSBsZWFkIHRvIHJlY3Vyc2l2ZSBjYWxscyB0bworICAgdG9vbXsyMiwzMyw0NCw2aH1fbXVsIHdpdGggaW52YWxpZCBpbnB1dCBzaXplLiAqLworI2RlZmluZSBNSU5fQU4gTVVMX1RPT004SF9NSU4KKworI2RlZmluZSBNSU5fQk4oYW4pCQkJIFwKKyhNQVgoR01QX05VTUJfQklUUyA8PSAgOSozID8gKGFuKjcpLyA5IDogXAorICAgICBHTVBfTlVNQl9CSVRTIDw9IDEwKjMgPyAoYW4qNikvMTAgOiBcCisgICAgIEdNUF9OVU1CX0JJVFMgPD0gMTEqMyA/IChhbio1KS8xMSA6IFwKKyAgICAgR01QX05VTUJfQklUUyA8PSAxMiozID8gKGFuKjQpLzEyIDogXAorICAgICAoYW4qNCkvMTMsIDg2KSApCisKKyNkZWZpbmUgQ09VTlQgMTAwMAorCisjaW5jbHVkZSAidG9vbS1zaGFyZWQuaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90b29tLXNoYXJlZC5oIGIvdGVzdHMvbXBuL3Rvb20tc2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4OGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbi90b29tLXNoYXJlZC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBUZXN0IGZvciB2YXJpb3VzIFRvb20gZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogTWFpbiBmaWxlIGlzIGV4cGVjdGVkIHRvIGRlZmluZSBtcG5fdG9vbU1OX211bCwKKyAqIG1wbl90b29tTU5fbXVsX2l0Y2gsIE1JTl9BTiwgTUlOX0JOKGFuKSwgTUFYX0JOKGFuKSBhbmQgdGhlbgorICogaW5jbHVkZSB0aGlzIGZpbGUuICovCisKKy8qIFNpemVzIGFyZSB1cCB0byAyXlNJWkVfTE9HIGxpbWJzICovCisjaWZuZGVmIFNJWkVfTE9HCisjZGVmaW5lIFNJWkVfTE9HIDEwCisjZW5kaWYKKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCAyMDAwCisjZW5kaWYKKworI2RlZmluZSBNQVhfQU4gKDFMIDw8IFNJWkVfTE9HKQorCisjaWZuZGVmIE1BWF9CTgorI2RlZmluZSBNQVhfQk4oYW4pIChhbikKKyNlbmRpZgorCisvKiBGb3IgZ2VuZXJhbCB0b29tTU5fbXVsLCB3ZSBuZWVkCisgKgorICogTUlOX0JOKGFuKSA9IE4gKyBmbG9vcigoKE4tMSkqYW4gKyBNIC0gTikvTSkKKyAqCisgKiBNQVhfQk4oYW4pID0gZmxvb3IoTiooYW4tMSkvKE0tMSkpIC0gTiArIDEKKyAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXBfcHRyIGFwLCBicCwgcmVmcCwgcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICBpbnQgdGVzdDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgYXAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9BTik7CisgIGJwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfQk4oTUFYX0FOKSk7CisgIHJlZnAgPSBUTVBfQUxMT0NfTElNQlMgKE1BWF9BTiArIE1BWF9CTihNQVhfQU4pKTsKKyAgcHAgPSAxK1RNUF9BTExPQ19MSU1CUyAoTUFYX0FOICsgTUFYX0JOKE1BWF9BTikrMik7CisgIHNjcmF0Y2gKKyAgICA9IDErVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbU1OX211bF9pdGNoIChNQVhfQU4sIE1BWF9CTihNQVhfQU4pKQorCQkJICsgMik7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IGNvdW50OyB0ZXN0KyspCisgICAgeworICAgICAgdW5zaWduZWQgc2l6ZV9taW47CisgICAgICB1bnNpZ25lZCBzaXplX3JhbmdlOworICAgICAgbXBfc2l6ZV90IGFuLCBibjsKKyAgICAgIG1wX3NpemVfdCBpdGNoOworICAgICAgbXBfbGltYl90IHBfYmVmb3JlLCBwX2FmdGVyLCBzX2JlZm9yZSwgc19hZnRlcjsKKworICAgICAgZm9yIChzaXplX21pbiA9IDE7ICgxTCA8PCBzaXplX21pbikgPCBNSU5fQU47IHNpemVfbWluKyspCisJOworCisgICAgICAvKiBXZSBnZW5lcmF0ZSBhbiBpbiB0aGUgTUlOX0FOIDw9IGFuIDw9ICgxIDw8IHNpemVfcmFuZ2UpLiAqLworICAgICAgc2l6ZV9yYW5nZSA9IHNpemVfbWluCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCBTSVpFX0xPRyArIDEgLSBzaXplX21pbik7CisKKyAgICAgIGFuID0gTUlOX0FOCisJKyBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAoMUwgPDwgc2l6ZV9yYW5nZSkgKyAxIC0gTUlOX0FOKTsKKyAgICAgIGJuID0gTUlOX0JOKGFuKQorCSsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgTUFYX0JOKGFuKSArIDEgLSBNSU5fQk4oYW4pKTsKKworICAgICAgbXBuX3JhbmRvbTIgKGFwLCBhbik7CisgICAgICBtcG5fcmFuZG9tMiAoYnAsIGJuKTsKKyAgICAgIG1wbl9yYW5kb20yIChwcC0xLCBhbiArIGJuICsgMik7CisgICAgICBwX2JlZm9yZSA9IHBwWy0xXTsKKyAgICAgIHBfYWZ0ZXIgPSBwcFthbiArIGJuXTsKKworICAgICAgaXRjaCA9IG1wbl90b29tTU5fbXVsX2l0Y2ggKGFuLCBibik7CisgICAgICBBU1NFUlRfQUxXQVlTIChpdGNoIDw9IG1wbl90b29tTU5fbXVsX2l0Y2ggKE1BWF9BTiwgTUFYX0JOKE1BWF9BTikpKTsKKyAgICAgIG1wbl9yYW5kb20yIChzY3JhdGNoLTEsIGl0Y2grMik7CisgICAgICBzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworICAgICAgc19hZnRlciA9IHNjcmF0Y2hbaXRjaF07CisKKyAgICAgIG1wbl90b29tTU5fbXVsIChwcCwgYXAsIGFuLCBicCwgYm4sIHNjcmF0Y2gpOworICAgICAgcmVmbXBuX211bCAocmVmcCwgYXAsIGFuLCBicCwgYm4pOworICAgICAgaWYgKHBwWy0xXSAhPSBwX2JlZm9yZSB8fCBwcFthbiArIGJuXSAhPSBwX2FmdGVyCisJICB8fCBzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSB8fCBzY3JhdGNoW2l0Y2hdICE9IHNfYWZ0ZXIKKwkgIHx8IG1wbl9jbXAgKHJlZnAsIHBwLCBhbiArIGJuKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SIGluIHRlc3QgJWQsIGFuID0gJWQsIGJuID0gJWRcbiIsCisJCSAgdGVzdCwgKGludCkgYW4sIChpbnQpIGJuKTsKKwkgIGlmIChwcFstMV0gIT0gcF9iZWZvcmUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJiZWZvcmUgcHA6Iik7IG1wbl9kdW1wIChwcCAtMSwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZwX2JlZm9yZSwgMSk7CisJICAgIH0KKwkgIGlmIChwcFthbiArIGJuXSAhPSBwX2FmdGVyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiYWZ0ZXIgcHA6Iik7IG1wbl9kdW1wIChwcCArIGFuICsgYm4sIDEpOworCSAgICAgIHByaW50ZiAoImtlZXA6ICAgIik7IG1wbl9kdW1wICgmcF9hZnRlciwgMSk7CisJICAgIH0KKwkgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaC0xLCAxKTsKKwkgICAgICBwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnNfYmVmb3JlLCAxKTsKKwkgICAgfQorCSAgaWYgKHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImFmdGVyIHNjcmF0Y2g6Iik7IG1wbl9kdW1wIChzY3JhdGNoICsgaXRjaCwgMSk7CisJICAgICAgcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2FmdGVyLCAxKTsKKwkgICAgfQorCSAgbXBuX2R1bXAgKGFwLCBhbik7CisJICBtcG5fZHVtcCAoYnAsIGJuKTsKKwkgIG1wbl9kdW1wIChwcCwgYW4gKyBibik7CisJICBtcG5fZHVtcCAocmVmcCwgYW4gKyBibik7CisKKwkgIGFib3J0KCk7CisJfQorICAgIH0KKyAgVE1QX0ZSRUU7CisKKyAgdGVzdHNfZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wbi90b29tLXNxci1zaGFyZWQuaCBiL3Rlc3RzL21wbi90b29tLXNxci1zaGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFiOGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBuL3Rvb20tc3FyLXNoYXJlZC5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBUZXN0IGZvciB2YXJpb3VzIFRvb20gc3F1YXJpbmcgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogTWFpbiBmaWxlIGlzIGV4cGVjdGVkIHRvIGRlZmluZSBtcG5fdG9vbU5fbXVsLCBtcG5fdG9vbU5fc3FyX2l0Y2gsCisgKiBNSU5fQU4sIE1BWF9BTiBhbmQgdGhlbiBpbmNsdWRlIHRoaXMgZmlsZS4gKi8KKworI2lmbmRlZiBDT1VOVAorI2RlZmluZSBDT1VOVCAyMDAwCisjZW5kaWYKKworI2lmZGVmIE1PUkVfU1FSX1RFU1RTCit2b2lkIE1PUkVfU1FSX1RFU1RTIChnbXBfcmFuZHN0YXRlX3B0cik7CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wX3B0ciBhcCwgcmVmcCwgcHAsIHNjcmF0Y2g7CisgIGludCBjb3VudCA9IENPVU5UOworICBpbnQgdGVzdDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICBURVNUU19SRVBTIChjb3VudCwgYXJndiwgYXJnYyk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKE1BWF9BTiA+IE1JTl9BTikgeworICAgIHJhbmRzID0gUkFORFM7CisKKyAgICBhcCA9IFRNUF9BTExPQ19MSU1CUyAoTUFYX0FOKTsKKyAgICByZWZwID0gVE1QX0FMTE9DX0xJTUJTIChNQVhfQU4gKiAyKTsKKyAgICBwcCA9IDEgKyBUTVBfQUxMT0NfTElNQlMgKE1BWF9BTiAqIDIgKyAyKTsKKyAgICBzY3JhdGNoCisgICAgICA9IDErVE1QX0FMTE9DX0xJTUJTIChtcG5fdG9vbU5fc3FyX2l0Y2ggKE1BWF9BTikgKyAyKTsKKworICAgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBjb3VudDsgdGVzdCsrKQorICAgICAgeworCW1wX3NpemVfdCBhbjsKKwltcF9zaXplX3QgaXRjaDsKKwltcF9saW1iX3QgcF9iZWZvcmUsIHBfYWZ0ZXIsIHNfYmVmb3JlLCBzX2FmdGVyOworCisJYW4gPSBNSU5fQU4KKwkgICsgZ21wX3VyYW5kb21tX3VpIChyYW5kcywgTUFYX0FOIC0gTUlOX0FOKTsKKworCW1wbl9yYW5kb20yIChhcCwgYW4pOworCW1wbl9yYW5kb20yIChwcC0xLCBhbiAqIDIgKyAyKTsKKwlwX2JlZm9yZSA9IHBwWy0xXTsKKwlwX2FmdGVyID0gcHBbYW4gKiAyXTsKKworCWl0Y2ggPSBtcG5fdG9vbU5fc3FyX2l0Y2ggKGFuKTsKKwlBU1NFUlRfQUxXQVlTIChpdGNoIDw9IG1wbl90b29tTl9zcXJfaXRjaCAoTUFYX0FOKSk7CisJbXBuX3JhbmRvbTIgKHNjcmF0Y2gtMSwgaXRjaCsyKTsKKwlzX2JlZm9yZSA9IHNjcmF0Y2hbLTFdOworCXNfYWZ0ZXIgPSBzY3JhdGNoW2l0Y2hdOworCisJbXBuX3Rvb21OX3NxciAocHAsIGFwLCBhbiwgc2NyYXRjaCk7CisJcmVmbXBuX211bCAocmVmcCwgYXAsIGFuLCBhcCwgYW4pOworCWlmIChwcFstMV0gIT0gcF9iZWZvcmUgfHwgcHBbYW4gKiAyXSAhPSBwX2FmdGVyCisJICAgIHx8IHNjcmF0Y2hbLTFdICE9IHNfYmVmb3JlIHx8IHNjcmF0Y2hbaXRjaF0gIT0gc19hZnRlcgorCSAgICB8fCBtcG5fY21wIChyZWZwLCBwcCwgYW4gKiAyKSAhPSAwKQorCSAgeworCSAgICBwcmludGYgKCJFUlJPUiBpbiB0ZXN0ICVkLCBhbiA9ICVkXG4iLAorCQkgICAgdGVzdCwgKGludCkgYW4pOworCSAgICBpZiAocHBbLTFdICE9IHBfYmVmb3JlKQorCSAgICAgIHsKKwkJcHJpbnRmICgiYmVmb3JlIHBwOiIpOyBtcG5fZHVtcCAocHAgLTEsIDEpOworCQlwcmludGYgKCJrZWVwOiAgICIpOyBtcG5fZHVtcCAoJnBfYmVmb3JlLCAxKTsKKwkgICAgICB9CisJICAgIGlmIChwcFthbiAqIDJdICE9IHBfYWZ0ZXIpCisJICAgICAgeworCQlwcmludGYgKCJhZnRlciBwcDoiKTsgbXBuX2R1bXAgKHBwICsgYW4gKiAyLCAxKTsKKwkJcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZwX2FmdGVyLCAxKTsKKwkgICAgICB9CisJICAgIGlmIChzY3JhdGNoWy0xXSAhPSBzX2JlZm9yZSkKKwkgICAgICB7CisJCXByaW50ZiAoImJlZm9yZSBzY3JhdGNoOiIpOyBtcG5fZHVtcCAoc2NyYXRjaC0xLCAxKTsKKwkJcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2JlZm9yZSwgMSk7CisJICAgICAgfQorCSAgICBpZiAoc2NyYXRjaFtpdGNoXSAhPSBzX2FmdGVyKQorCSAgICAgIHsKKwkJcHJpbnRmICgiYWZ0ZXIgc2NyYXRjaDoiKTsgbXBuX2R1bXAgKHNjcmF0Y2ggKyBpdGNoLCAxKTsKKwkJcHJpbnRmICgia2VlcDogICAiKTsgbXBuX2R1bXAgKCZzX2FmdGVyLCAxKTsKKwkgICAgICB9CisJICAgIG1wbl9kdW1wIChhcCwgYW4pOworCSAgICBtcG5fZHVtcCAocHAsIGFuICogMik7CisJICAgIG1wbl9kdW1wIChyZWZwLCBhbiAqIDIpOworCisJICAgIGFib3J0KCk7CisJICB9CisgICAgICB9CisgICAgVE1QX0ZSRUU7CisKKyNpZmRlZiBNT1JFX1NRUl9URVNUUworICBNT1JFX1NRUl9URVNUUyAocmFuZHMpOworI2VuZGlmCisgIH0KKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL2lvLmMgYi90ZXN0cy9tcHEvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTE2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL2lvLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIFRlc3QgY29udmVyc2lvbiBhbmQgSS9PIHVzaW5nIG1wcV9vdXRfc3RyIGFuZCBtcHFfaW5wX3N0ci4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIHVubGluayAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgRklMRU5BTUUgICIvdG1wL2lvLnRtcCIKKwordm9pZAorZGVidWdfbXAgKG1wcV90IHgsIGludCBiYXNlKQoreworICBtcHFfb3V0X3N0ciAoc3Rkb3V0LCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZG91dCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHFfdCAgb3AxLCBvcDI7CisgIG1wX3NpemVfdCBzaXplOworICBpbnQgaTsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKyAgRklMRSAqZnA7CisgIGludCBiYXNlOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworICBzaXplX3QgbnJlYWQ7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGJzKTsKKworICBpZiAoYXJnYyA9PSAyKQorICAgIHJlcHMgPSBhdG9pIChhcmd2WzFdKTsKKworICBtcHFfaW5pdCAob3AxKTsKKyAgbXBxX2luaXQgKG9wMik7CisKKyAgZnAgPSBmb3BlbiAoRklMRU5BTUUsICJ3KyIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMCArIDI7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIHNpemUgPSBtcHpfZ2V0X3VpIChicykgKyAyOworICAgICAgbXB6X2VycmFuZG9tYiAobXBxX251bXJlZihvcDEpLCByYW5kcywgc2l6ZSk7CisgICAgICBtcHpfZXJyYW5kb21iX25vbnplcm8gKG1wcV9kZW5yZWYob3AxKSwgcmFuZHMsIHNpemUpOworICAgICAgbXBxX2Nhbm9uaWNhbGl6ZSAob3AxKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDEpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wcV9uZWcgKG9wMSwgb3AxKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDE2KTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGJhc2UgPSBic2kgJSAzNiArIDE7CisgICAgICBpZiAoYmFzZSA9PSAxKQorCWJhc2UgPSAwOworCisgICAgICByZXdpbmQgKGZwKTsKKyAgICAgIGlmIChtcHFfb3V0X3N0ciAoZnAsIGJhc2UsIG9wMSkgPT0gMAorCSAgfHwgcHV0YyAoJyAnLCBmcCkgPT0gRU9GCisJICB8fCBmZmx1c2ggKGZwKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIm1wcV9vdXRfc3RyIHdyaXRlIGVycm9yXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgcmV3aW5kIChmcCk7CisgICAgICBucmVhZCA9IG1wcV9pbnBfc3RyIChvcDIsIGZwLCBiYXNlKTsKKyAgICAgIGlmIChucmVhZCA9PSAwKQorCXsKKwkgIGlmIChmZXJyb3IgKGZwKSkKKwkgICAgcHJpbnRmICgibXBxX2lucF9zdHIgc3RyZWFtIHJlYWQgZXJyb3JcbiIpOworCSAgZWxzZQorCSAgICBwcmludGYgKCJtcHFfaW5wX3N0ciBkYXRhIGNvbnZlcnNpb24gZXJyb3JcbiIpOworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBpZiAobnJlYWQgIT0gZnRlbGwoZnApKQorCXsKKwkgIHByaW50ZiAoIm1wcV9pbnBfc3RyIG5yZWFkIGRvZXNuJ3QgbWF0Y2ggZnRlbGxcbiIpOworCSAgcHJpbnRmICgiICBucmVhZCAgJWx1XG4iLCAodW5zaWduZWQgbG9uZykgbnJlYWQpOworCSAgcHJpbnRmICgiICBmdGVsbCAgJWxkXG4iLCBmdGVsbChmcCkpOworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICBpZiAobXBxX2NtcCAob3AxLCBvcDIpKQorCXsKKwkgIHByaW50ZiAoIkVSUk9SXG4iKTsKKwkgIHByaW50ZiAoIm9wMSAgPSAiKTsgZGVidWdfbXAgKG9wMSwgLTE2KTsKKwkgIHByaW50ZiAoIm9wMiAgPSAiKTsgZGVidWdfbXAgKG9wMiwgLTE2KTsKKwkgIHByaW50ZiAoImJhc2UgPSAlZFxuIiwgYmFzZSk7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIGZjbG9zZSAoZnApOworCisgIHVubGluayAoRklMRU5BTUUpOworCisgIG1wel9jbGVhciAoYnMpOworICBtcHFfY2xlYXIgKG9wMSk7CisgIG1wcV9jbGVhciAob3AyKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL3JldXNlLmMgYi90ZXN0cy9tcHEvcmV1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzI0ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL3JldXNlLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qIFRlc3QgdGhhdCByb3V0aW5lcyBhbGxvdyByZXVzaW5nIGEgc291cmNlIHZhcmlhYmxlIGFzIGRlc3RpbmF0aW9uLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMC0yMDAyLCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmIF9fR01QX0xJQkdNUF9ETEwKKworLyogRklYTUU6IFdoZW4gbGlua2luZyB0byBhIERMTCBsaWJnbXAsIG1wcV9hZGQgZXRjIGNhbid0IGJlIHVzZWQgYXMKKyAgIGluaXRpYWxpemVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBiZWNhdXNlIHRoZXkncmUgZWZmZWN0aXZlbHkgZ2xvYmFsCisgICB2YXJpYWJsZXMgKGZ1bmN0aW9uIHBvaW50ZXJzKSB0aGVtc2VsdmVzLiAgUGVyaGFwcyBjYWxsaW5nIGEgdGVzdAorICAgZnVuY3Rpb24gc3VjY2Vzc2l2ZWx5IHdpdGggbXBxX2FkZCBldGMgd291bGQgYmUgYmV0dGVyLiAgKi8KKworaW50CittYWluICh2b2lkKQoreworICBwcmludGYgKCJUZXN0IHN1cHByZXNzZWQgZm9yIHdpbmRvd3MgRExMXG4iKTsKKyAgZXhpdCAoMCk7Cit9CisKKworI2Vsc2UgLyogISBETExfRVhQT1JUICovCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDE2CisjZW5kaWYKKwordm9pZCBkdW1wX2Fib3J0IChjb25zdCBjaGFyICosIG1wcV90LCBtcHFfdCk7CisKK3R5cGVkZWYgdm9pZCAoKmRzc19mdW5jKSAobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cik7CisKK2Rzc19mdW5jIGRzc19mdW5jc1tdID0KK3sKKyAgbXBxX2RpdiwgbXBxX2FkZCwgbXBxX211bCwgbXBxX3N1YiwKK307CisKK2NvbnN0IGNoYXIgKmRzc19mdW5jX25hbWVzW10gPQoreworICAibXBxX2RpdiIsICJtcHFfYWRkIiwgIm1wcV9tdWwiLCAibXBxX3N1YiIsCit9OworCit0eXBlZGVmIHZvaWQgKCpkc19mdW5jKSAobXBxX3B0ciwgbXBxX3NyY3B0cik7CisKK2RzX2Z1bmMgZHNfZnVuY3NbXSA9Cit7CisgIG1wcV9hYnMsIG1wcV9uZWcsCit9OworCitjb25zdCBjaGFyICpkc19mdW5jX25hbWVzW10gPQoreworICAibXBxX2FicyIsICJtcHFfbmVnIiwKK307CisKK3R5cGVkZWYgdm9pZCAoKmRzaV9mdW5jKSAobXBxX3B0ciwgbXBxX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpOworCitkc2lfZnVuYyBkc2lfZnVuY3NbXSA9Cit7CisgIG1wcV9tdWxfMmV4cCwgbXBxX2Rpdl8yZXhwCit9OworCitjb25zdCBjaGFyICpkc2lfZnVuY19uYW1lc1tdID0KK3sKKyAgIm1wcV9tdWxfMmV4cCIsICJtcHFfZGl2XzJleHAiCit9OworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGk7CisgIGludCBwYXNzLCByZXBzID0gMTAwOworICBtcHFfdCBpbjEsIGluMiwgb3V0MTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmFuZGJpdHMsIGluMmk7CisgIG1wcV90IHJlczEsIHJlczI7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kczsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wcV9pbml0IChpbjEpOworICBtcHFfaW5pdCAoaW4yKTsKKyAgbXBxX2luaXQgKG91dDEpOworICBtcHFfaW5pdCAocmVzMSk7CisgIG1wcV9pbml0IChyZXMyKTsKKworICBmb3IgKHBhc3MgPSAxOyBwYXNzIDw9IHJlcHM7IHBhc3MrKykKKyAgICB7CisgICAgICByYW5kYml0cyA9IHVyYW5kb20gKCk7CisKKyAgICAgIGlmIChyYW5kYml0cyAmIDEpCisJeworCSAgbXBxX2NsZWFyIChpbjEpOworCSAgbXBxX2luaXQgKGluMSk7CisJfQorICAgICAgcmFuZGJpdHMgPj49IDE7CisgICAgICBtcHpfZXJyYW5kb21iIChtcHFfbnVtcmVmKGluMSksIHJhbmRzLCA1MTJMKTsKKyAgICAgIG1wel9lcnJhbmRvbWJfbm9uemVybyAobXBxX2RlbnJlZihpbjEpLCByYW5kcywgNTEyTCk7CisgICAgICBpZiAocmFuZGJpdHMgJiAxKQorCW1wel9uZWcgKG1wcV9udW1yZWYoaW4xKSxtcHFfbnVtcmVmKGluMSkpOworICAgICAgcmFuZGJpdHMgPj49IDE7CisgICAgICBtcHFfY2Fub25pY2FsaXplIChpbjEpOworCisgICAgICBpZiAocmFuZGJpdHMgJiAxKQorCXsKKwkgIG1wcV9jbGVhciAoaW4yKTsKKwkgIG1wcV9pbml0IChpbjIpOworCX0KKyAgICAgIHJhbmRiaXRzID4+PSAxOworICAgICAgbXB6X2VycmFuZG9tYiAobXBxX251bXJlZihpbjIpLCByYW5kcywgNTEyTCk7CisgICAgICBtcHpfZXJyYW5kb21iX25vbnplcm8gKG1wcV9kZW5yZWYoaW4yKSwgcmFuZHMsIDUxMkwpOworICAgICAgaWYgKHJhbmRiaXRzICYgMSkKKwltcHpfbmVnIChtcHFfbnVtcmVmKGluMiksbXBxX251bXJlZihpbjIpKTsKKyAgICAgIHJhbmRiaXRzID4+PSAxOworICAgICAgbXBxX2Nhbm9uaWNhbGl6ZSAoaW4yKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZHNzX2Z1bmNzKSAvIHNpemVvZiAoZHNzX2Z1bmMpOyBpKyspCisJeworCSAgLyogRG9uJ3QgZGl2aWRlIGJ5IDAuICAqLworCSAgaWYgKGkgPT0gMCAmJiBtcHFfY21wX3VpIChpbjIsIDAsIDEpID09IDApCisJICAgIGNvbnRpbnVlOworCisJICBpZiAocmFuZGJpdHMgJiAxKQorCSAgICB7CisJICAgICAgbXBxX2NsZWFyIChyZXMxKTsKKwkgICAgICBtcHFfaW5pdCAocmVzMSk7CisJICAgIH0KKwkgIHJhbmRiaXRzID4+PSAxOworCisJICAoZHNzX2Z1bmNzW2ldKSAocmVzMSwgaW4xLCBpbjIpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChyZXMxKTsKKworCSAgbXBxX3NldCAob3V0MSwgaW4xKTsKKwkgIChkc3NfZnVuY3NbaV0pIChvdXQxLCBvdXQxLCBpbjIpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChvdXQxKTsKKworCSAgaWYgKG1wcV9jbXAgKHJlczEsIG91dDEpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGRzc19mdW5jX25hbWVzW2ldLCByZXMxLCBvdXQxKTsKKworCSAgbXBxX3NldCAob3V0MSwgaW4yKTsKKwkgIChkc3NfZnVuY3NbaV0pIChvdXQxLCBpbjEsIG91dDEpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChvdXQxKTsKKworCSAgaWYgKG1wcV9jbXAgKHJlczEsIG91dDEpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGRzc19mdW5jX25hbWVzW2ldLCByZXMxLCBvdXQxKTsKKworCSAgbXBxX3NldCAob3V0MSwgaW4yKTsKKwkgIChkc3NfZnVuY3NbaV0pIChyZXMxLCBvdXQxLCBpbjIpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChyZXMxKTsKKworCSAgKGRzc19mdW5jc1tpXSkgKHJlczIsIGluMiwgaW4yKTsKKwkgIE1QUV9DSEVDS19GT1JNQVQocmVzMik7CisKKwkgIChkc3NfZnVuY3NbaV0pIChvdXQxLCBvdXQxLCBvdXQxKTsKKwkgIE1QUV9DSEVDS19GT1JNQVQob3V0MSk7CisKKwkgIGlmIChtcHFfY21wIChyZXMxLCByZXMyKSAhPSAwKQorCSAgICBkdW1wX2Fib3J0IChkc3NfZnVuY19uYW1lc1tpXSwgcmVzMSwgcmVzMik7CisJICBpZiAobXBxX2NtcCAocmVzMSwgb3V0MSkgIT0gMCkKKwkgICAgZHVtcF9hYm9ydCAoZHNzX2Z1bmNfbmFtZXNbaV0sIHJlczEsIG91dDEpOworCX0KKworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZHNfZnVuY3MpIC8gc2l6ZW9mIChkc19mdW5jKTsgaSsrKQorCXsKKwkgIGlmIChyYW5kYml0cyAmIDEpCisJICAgIHsKKwkgICAgICBtcHFfY2xlYXIgKHJlczEpOworCSAgICAgIG1wcV9pbml0IChyZXMxKTsKKwkgICAgfQorCSAgcmFuZGJpdHMgPj49IDE7CisJICAoZHNfZnVuY3NbaV0pIChyZXMxLCBpbjEpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChyZXMxKTsKKworCSAgbXBxX3NldCAob3V0MSwgaW4xKTsKKwkgIChkc19mdW5jc1tpXSkgKG91dDEsIG91dDEpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChvdXQxKTsKKworCSAgaWYgKG1wcV9jbXAgKHJlczEsIG91dDEpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGRzX2Z1bmNfbmFtZXNbaV0sIHJlczEsIG91dDEpOworCX0KKworICAgICAgaW4yaSA9IHVyYW5kb20gKCkgJSA2NTUzNjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRzaV9mdW5jcykgLyBzaXplb2YgKGRzaV9mdW5jKTsgaSsrKQorCXsKKwkgIGlmIChyYW5kYml0cyAmIDEpCisJICAgIHsKKwkgICAgICBtcHFfY2xlYXIgKHJlczEpOworCSAgICAgIG1wcV9pbml0IChyZXMxKTsKKwkgICAgfQorCSAgcmFuZGJpdHMgPj49IDE7CisKKwkgIChkc2lfZnVuY3NbaV0pIChyZXMxLCBpbjEsIGluMmkpOworCSAgTVBRX0NIRUNLX0ZPUk1BVChyZXMxKTsKKworCSAgbXBxX3NldCAob3V0MSwgaW4xKTsKKwkgIChkc2lfZnVuY3NbaV0pIChvdXQxLCBvdXQxLCBpbjJpKTsKKwkgIE1QUV9DSEVDS19GT1JNQVQob3V0MSk7CisKKwkgIGlmIChtcHFfY21wIChyZXMxLCBvdXQxKSAhPSAwKQorCSAgICBkdW1wX2Fib3J0IChkc2lfZnVuY19uYW1lc1tpXSwgcmVzMSwgb3V0MSk7CisJfQorCisgICAgfQorCisgIG1wcV9jbGVhciAoaW4xKTsKKyAgbXBxX2NsZWFyIChpbjIpOworICBtcHFfY2xlYXIgKG91dDEpOworICBtcHFfY2xlYXIgKHJlczEpOworICBtcHFfY2xlYXIgKHJlczIpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3ZvaWQKK2R1bXBfYWJvcnQgKGNvbnN0IGNoYXIgKm5hbWUsIG1wcV90IHJlczEsIG1wcV90IHJlczIpCit7CisgIHByaW50ZiAoImZhaWx1cmUgaW4gJXM6XG4iLCBuYW1lKTsKKyAgbXBxX3RyYWNlICgiICByZXMxICAiLCByZXMxKTsKKyAgbXBxX3RyYWNlICgiICByZXMyICAiLCByZXMyKTsKKyAgYWJvcnQgKCk7Cit9CisKKyNlbmRpZiAvKiAhIERMTF9FWFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL21wcS90LWFvcnMuYyBiL3Rlc3RzL21wcS90LWFvcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWU5ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL3QtYW9ycy5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBUZXN0IG1wcV9hZGQgYW5kIG1wcV9zdWIuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2FsbCAobXBxX3B0ciB4LCBtcHFfcHRyIHksIG1wcV9wdHIgd2FudF9hZGQsIG1wcV9wdHIgd2FudF9zdWIpCit7CisgIG1wcV90ICBnb3Q7CisgIGludCAgICBuZWdfeCwgbmVnX3ksIHN3YXA7CisKKyAgbXBxX2luaXQgKGdvdCk7CisKKyAgTVBRX0NIRUNLX0ZPUk1BVCAod2FudF9hZGQpOworICBNUFFfQ0hFQ0tfRk9STUFUICh3YW50X3N1Yik7CisgIE1QUV9DSEVDS19GT1JNQVQgKHgpOworICBNUFFfQ0hFQ0tfRk9STUFUICh5KTsKKworICBmb3IgKHN3YXAgPSAwOyBzd2FwIDw9IDE7IHN3YXArKykKKyAgICB7CisgICAgICBmb3IgKG5lZ194ID0gMDsgbmVnX3ggPD0gMTsgbmVnX3grKykKKyAgICAgICAgeworICAgICAgICAgIGZvciAobmVnX3kgPSAwOyBuZWdfeSA8PSAxOyBuZWdfeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcHFfYWRkIChnb3QsIHgsIHkpOworICAgICAgICAgICAgICBNUFFfQ0hFQ0tfRk9STUFUIChnb3QpOworICAgICAgICAgICAgICBpZiAoISBtcHFfZXF1YWwgKGdvdCwgd2FudF9hZGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiAoIm1wcV9hZGQgd3JvbmdcbiIpOworICAgICAgICAgICAgICAgICAgbXBxX3RyYWNlICgiICB4ICAgIiwgeCk7CisgICAgICAgICAgICAgICAgICBtcHFfdHJhY2UgKCIgIHkgICAiLCB5KTsKKyAgICAgICAgICAgICAgICAgIG1wcV90cmFjZSAoIiAgZ290ICIsIGdvdCk7CisgICAgICAgICAgICAgICAgICBtcHFfdHJhY2UgKCIgIHdhbnQiLCB3YW50X2FkZCk7CisgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbXBxX3N1YiAoZ290LCB4LCB5KTsKKyAgICAgICAgICAgICAgTVBRX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgICAgICAgICAgICAgaWYgKCEgbXBxX2VxdWFsIChnb3QsIHdhbnRfc3ViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludGYgKCJtcHFfc3ViIHdyb25nXG4iKTsKKyAgICAgICAgICAgICAgICAgIG1wcV90cmFjZSAoIiAgeCAgICIsIHgpOworICAgICAgICAgICAgICAgICAgbXBxX3RyYWNlICgiICB5ICAgIiwgeSk7CisgICAgICAgICAgICAgICAgICBtcHFfdHJhY2UgKCIgIGdvdCAiLCBnb3QpOworICAgICAgICAgICAgICAgICAgbXBxX3RyYWNlICgiICB3YW50Iiwgd2FudF9zdWIpOworICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgbXBxX25lZyAoeSwgeSk7CisgICAgICAgICAgICAgIG1wcV9zd2FwICh3YW50X2FkZCwgd2FudF9zdWIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbXBxX25lZyAoeCwgeCk7CisgICAgICAgICAgbXBxX3N3YXAgKHdhbnRfYWRkLCB3YW50X3N1Yik7CisgICAgICAgICAgbXBxX25lZyAod2FudF9hZGQsIHdhbnRfYWRkKTsKKyAgICAgICAgICBtcHFfbmVnICh3YW50X3N1Yiwgd2FudF9zdWIpOworICAgICAgICB9CisKKyAgICAgIG1wcV9zd2FwICh4LCB5KTsKKyAgICAgIG1wcV9uZWcgKHdhbnRfc3ViLCB3YW50X3N1Yik7CisgICAgfQorCisgIG1wcV9jbGVhciAoZ290KTsKK30KKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqeDsKKyAgICBjb25zdCBjaGFyICAqeTsKKyAgICBjb25zdCBjaGFyICAqd2FudF9hZGQ7CisgICAgY29uc3QgY2hhciAgKndhbnRfc3ViOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICIwIiwgIjAiLCAiMCIgfSwKKyAgICB7ICIxIiwgIjAiLCAiMSIsICIxIiB9LAorICAgIHsgIjEiLCAiMSIsICIyIiwgIjAiIH0sCisKKyAgICB7ICIxLzIiLCAiMS8yIiwgIjEiLCAiMCIgfSwKKyAgICB7ICI1LzYiLCAiMTQvMTUiLCAiNTMvMzAiLCAiLTEvMTAiIH0sCisgIH07CisKKyAgbXBxX3QgIHgsIHksIHdhbnRfYWRkLCB3YW50X3N1YjsKKyAgaW50IGk7CisKKyAgbXBxX2luaXQgKHgpOworICBtcHFfaW5pdCAoeSk7CisgIG1wcV9pbml0ICh3YW50X2FkZCk7CisgIG1wcV9pbml0ICh3YW50X3N1Yik7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wcV9zZXRfc3RyX29yX2Fib3J0ICh4LCBkYXRhW2ldLngsIDApOworICAgICAgbXBxX3NldF9zdHJfb3JfYWJvcnQgKHksIGRhdGFbaV0ueSwgMCk7CisgICAgICBtcHFfc2V0X3N0cl9vcl9hYm9ydCAod2FudF9hZGQsIGRhdGFbaV0ud2FudF9hZGQsIDApOworICAgICAgbXBxX3NldF9zdHJfb3JfYWJvcnQgKHdhbnRfc3ViLCBkYXRhW2ldLndhbnRfc3ViLCAwKTsKKworICAgICAgY2hlY2tfYWxsICh4LCB5LCB3YW50X2FkZCwgd2FudF9zdWIpOworICAgIH0KKworICBtcHFfY2xlYXIgKHgpOworICBtcHFfY2xlYXIgKHkpOworICBtcHFfY2xlYXIgKHdhbnRfYWRkKTsKKyAgbXBxX2NsZWFyICh3YW50X3N1Yik7Cit9CisKKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgbXBxX3QgIHgsIHksIHdhbnRfYWRkLCB3YW50X3N1YjsKKyAgaW50IGk7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kcyA9IFJBTkRTOworCisgIG1wcV9pbml0ICh4KTsKKyAgbXBxX2luaXQgKHkpOworICBtcHFfaW5pdCAod2FudF9hZGQpOworICBtcHFfaW5pdCAod2FudF9zdWIpOworCisgIGZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykKKyAgICB7CisgICAgICBtcHpfZXJyYW5kb21iIChtcHFfbnVtcmVmKHgpLCByYW5kcywgNTEyTCk7CisgICAgICBtcHpfZXJyYW5kb21iX25vbnplcm8gKG1wcV9kZW5yZWYoeCksIHJhbmRzLCA1MTJMKTsKKyAgICAgIG1wcV9jYW5vbmljYWxpemUgKHgpOworCisgICAgICBtcHpfZXJyYW5kb21iIChtcHFfbnVtcmVmKHkpLCByYW5kcywgNTEyTCk7CisgICAgICBtcHpfZXJyYW5kb21iX25vbnplcm8gKG1wcV9kZW5yZWYoeSksIHJhbmRzLCA1MTJMKTsKKyAgICAgIG1wcV9jYW5vbmljYWxpemUgKHkpOworCisgICAgICByZWZtcHFfYWRkICh3YW50X2FkZCwgeCwgeSk7CisgICAgICByZWZtcHFfc3ViICh3YW50X3N1YiwgeCwgeSk7CisKKyAgICAgIGNoZWNrX2FsbCAoeCwgeSwgd2FudF9hZGQsIHdhbnRfc3ViKTsKKyAgICB9CisKKyAgbXBxX2NsZWFyICh4KTsKKyAgbXBxX2NsZWFyICh5KTsKKyAgbXBxX2NsZWFyICh3YW50X2FkZCk7CisgIG1wcV9jbGVhciAod2FudF9zdWIpOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfcmFuZCAoKTsKKworICB0ZXN0c19lbmQgKCk7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1jbXAuYyBiL3Rlc3RzL21wcS90LWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4N2RiN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHEvdC1jbXAuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogVGVzdCBtcHFfY21wLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgU0dOKHgpICgoeCkgPCAwID8gLTEgOiAoeCkgPiAwID8gMSA6IDApCisKK2ludAorcmVmX21wcV9jbXAgKG1wcV90IGEsIG1wcV90IGIpCit7CisgIG1wel90IGFpLCBiaTsKKyAgaW50IGNjOworCisgIG1wel9pbml0IChhaSk7CisgIG1wel9pbml0IChiaSk7CisKKyAgbXB6X211bCAoYWksIE5VTSAoYSksIERFTiAoYikpOworICBtcHpfbXVsIChiaSwgTlVNIChiKSwgREVOIChhKSk7CisgIGNjID0gbXB6X2NtcCAoYWksIGJpKTsKKyAgbXB6X2NsZWFyIChhaSk7CisgIG1wel9jbGVhciAoYmkpOworICByZXR1cm4gY2M7Cit9CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDgJLyogaW5jcmVhc2luZyB0aGlzIGxvd2VycyB0aGUgcHJvYmFiaWxpdHkgb2YgZmluZGluZyBhbiBlcnJvciAqLworI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHFfdCBhLCBiOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKyAgaW50IGk7CisgIGludCBjYywgY2NyZWY7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wcV9pbml0IChhKTsKKyAgbXBxX2luaXQgKGIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgc2l6ZSA9IHVyYW5kb20gKCkgJSBTSVpFIC0gU0laRS8yOworICAgICAgbXB6X3JhbmRvbTIgKE5VTSAoYSksIHNpemUpOworICAgICAgZG8KKwl7CisJICBzaXplID0gdXJhbmRvbSAoKSAlIFNJWkUgLSBTSVpFLzI7CisJICBtcHpfcmFuZG9tMiAoREVOIChhKSwgc2l6ZSk7CisJfQorICAgICAgd2hpbGUgKG1wel9jbXBfdWkgKERFTiAoYSksIDApID09IDApOworCisgICAgICBzaXplID0gdXJhbmRvbSAoKSAlIFNJWkUgLSBTSVpFLzI7CisgICAgICBtcHpfcmFuZG9tMiAoTlVNIChiKSwgc2l6ZSk7CisgICAgICBkbworCXsKKwkgIHNpemUgPSB1cmFuZG9tICgpICUgU0laRSAtIFNJWkUvMjsKKwkgIG1wel9yYW5kb20yIChERU4gKGIpLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAoREVOIChiKSwgMCkgPT0gMCk7CisKKyAgICAgIG1wcV9jYW5vbmljYWxpemUgKGEpOworICAgICAgbXBxX2Nhbm9uaWNhbGl6ZSAoYik7CisKKyAgICAgIGNjcmVmID0gcmVmX21wcV9jbXAgKGEsIGIpOworICAgICAgY2MgPSBtcHFfY21wIChhLCBiKTsKKworICAgICAgaWYgKFNHTiAoY2NyZWYpICE9IFNHTiAoY2MpKQorCWFib3J0ICgpOworICAgIH0KKworICBtcHFfY2xlYXIgKGEpOworICBtcHFfY2xlYXIgKGIpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1jbXBfc2kuYyBiL3Rlc3RzL21wcS90LWNtcF9zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmEyNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHEvdC1jbXBfc2kuYwpAQCAtMCwwICsxLDExNyBAQAorLyogVGVzdCBtcHFfY21wX3NpLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2RlZmluZSBTR04oeCkgICAoKHgpPDAgPyAtMSA6ICh4KSAhPSAwKQorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAgICAqcTsKKyAgICBsb25nICAgICAgICAgICBuOworICAgIHVuc2lnbmVkIGxvbmcgIGQ7CisgICAgaW50ICAgICAgICAgICAgd2FudDsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAiMCIsIDAsIDEsIDAgfSwKKyAgICB7ICIwIiwgMCwgMTIzLCAwIH0sCisgICAgeyAiMCIsIDAsIFVMT05HX01BWCwgMCB9LAorICAgIHsgIjEiLCAwLCAxLCAxIH0sCisgICAgeyAiMSIsIDAsIDEyMywgMSB9LAorICAgIHsgIjEiLCAwLCBVTE9OR19NQVgsIDEgfSwKKyAgICB7ICItMSIsIDAsIDEsIC0xIH0sCisgICAgeyAiLTEiLCAwLCAxMjMsIC0xIH0sCisgICAgeyAiLTEiLCAwLCBVTE9OR19NQVgsIC0xIH0sCisKKyAgICB7ICIxMjMiLCAxMjMsIDEsIDAgfSwKKyAgICB7ICIxMjQiLCAxMjMsIDEsIDEgfSwKKyAgICB7ICIxMjIiLCAxMjMsIDEsIC0xIH0sCisKKyAgICB7ICItMTIzIiwgMTIzLCAxLCAtMSB9LAorICAgIHsgIi0xMjQiLCAxMjMsIDEsIC0xIH0sCisgICAgeyAiLTEyMiIsIDEyMywgMSwgLTEgfSwKKworICAgIHsgIjEyMyIsIC0xMjMsIDEsIDEgfSwKKyAgICB7ICIxMjQiLCAtMTIzLCAxLCAxIH0sCisgICAgeyAiMTIyIiwgLTEyMywgMSwgMSB9LAorCisgICAgeyAiLTEyMyIsIC0xMjMsIDEsIDAgfSwKKyAgICB7ICItMTI0IiwgLTEyMywgMSwgLTEgfSwKKyAgICB7ICItMTIyIiwgLTEyMywgMSwgMSB9LAorCisgICAgeyAiNS83IiwgMyw0LCAtMSB9LAorICAgIHsgIjUvNyIsIC0zLDQsIDEgfSwKKyAgICB7ICItNS83IiwgMyw0LCAtMSB9LAorICAgIHsgIi01LzciLCAtMyw0LCAxIH0sCisgIH07CisKKyAgbXBxX3QgIHE7CisgIGludCAgICBpLCBnb3Q7CisKKyAgbXBxX2luaXQgKHEpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHFfc2V0X3N0cl9vcl9hYm9ydCAocSwgZGF0YVtpXS5xLCAwKTsKKyAgICAgIE1QUV9DSEVDS19GT1JNQVQgKHEpOworCisgICAgICBnb3QgPSBtcHFfY21wX3NpIChxLCBkYXRhW2ldLm4sIGRhdGFbaV0uZCk7CisgICAgICBpZiAoU0dOKGdvdCkgIT0gZGF0YVtpXS53YW50KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXBxX2NtcF9zaSB3cm9uZ1xuIik7CisgICAgICAgIGVycm9yOgorICAgICAgICAgIG1wcV90cmFjZSAoIiAgcSIsIHEpOworICAgICAgICAgIHByaW50ZiAoIiAgbj0lbGRcbiIsIGRhdGFbaV0ubik7CisgICAgICAgICAgcHJpbnRmICgiICBkPSVsdVxuIiwgZGF0YVtpXS5kKTsKKyAgICAgICAgICBwcmludGYgKCIgIGdvdD0lZFxuIiwgZ290KTsKKyAgICAgICAgICBwcmludGYgKCIgIHdhbnQ9JWRcbiIsIGRhdGFbaV0ud2FudCk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgaWYgKGRhdGFbaV0ubiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZ290ID0gbXBxX2NtcF9zaSAocSwgMEwsIGRhdGFbaV0uZCk7CisgICAgICAgICAgaWYgKFNHTihnb3QpICE9IGRhdGFbaV0ud2FudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgibXBxX2NtcF9zaSB3cm9uZ1xuIik7CisgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbXBxX2NsZWFyIChxKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wcS90LWNtcF91aS5jIGIvdGVzdHMvbXBxL3QtY21wX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYjJjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wcS90LWNtcF91aS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiBUZXN0IG1wcV9jbXBfdWkuCisKK0NvcHlyaWdodCAxOTk2LCAxOTk3LCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2RlZmluZSBTR04oeCkgKCh4KSA8IDAgPyAtMSA6ICh4KSA+IDAgPyAxIDogMCkKKworaW50CityZWZfbXBxX2NtcF91aSAobXBxX3QgYSwgdW5zaWduZWQgbG9uZyBpbnQgYm4sIHVuc2lnbmVkIGxvbmcgaW50IGJkKQoreworICBtcHpfdCBhaSwgYmk7CisgIGludCBjYzsKKworICBtcHpfaW5pdCAoYWkpOworICBtcHpfaW5pdCAoYmkpOworCisgIG1wel9tdWxfdWkgKGFpLCBOVU0gKGEpLCBiZCk7CisgIG1wel9tdWxfdWkgKGJpLCBERU4gKGEpLCBibik7CisgIGNjID0gbXB6X2NtcCAoYWksIGJpKTsKKyAgbXB6X2NsZWFyIChhaSk7CisgIG1wel9jbGVhciAoYmkpOworICByZXR1cm4gY2M7Cit9CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDgJLyogaW5jcmVhc2luZyB0aGlzIGxvd2VycyB0aGUgcHJvYmFiaWxpdHkgb2YgZmluZGluZyBhbiBlcnJvciAqLworI2VuZGlmCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHFfdCBhLCBiOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKyAgaW50IGk7CisgIGludCBjYywgY2NyZWY7CisgIHVuc2lnbmVkIGxvbmcgaW50IGJuLCBiZDsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBpZiAoYXJnYyA9PSAyKQorICAgICByZXBzID0gYXRvaSAoYXJndlsxXSk7CisKKyAgbXBxX2luaXQgKGEpOworICBtcHFfaW5pdCAoYik7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBzaXplID0gdXJhbmRvbSAoKSAlIFNJWkUgLSBTSVpFLzI7CisgICAgICBtcHpfcmFuZG9tMiAoTlVNIChhKSwgc2l6ZSk7CisgICAgICBkbworCXsKKwkgIHNpemUgPSB1cmFuZG9tICgpICUgU0laRSAtIFNJWkUvMjsKKwkgIG1wel9yYW5kb20yIChERU4gKGEpLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAoREVOIChhKSwgMCkgPT0gMCk7CisKKyAgICAgIG1wel9yYW5kb20yIChOVU0gKGIpLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIG1wel9tb2RfdWkgKE5VTSAoYiksIE5VTSAoYiksIH4odW5zaWduZWQgbG9uZyBpbnQpIDApOworICAgICAgbXB6X2FkZF91aSAoTlVNIChiKSwgTlVNIChiKSwgMSk7CisKKyAgICAgIG1wel9yYW5kb20yIChERU4gKGIpLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIG1wel9tb2RfdWkgKERFTiAoYiksIERFTiAoYiksIH4odW5zaWduZWQgbG9uZyBpbnQpIDApOworICAgICAgbXB6X2FkZF91aSAoREVOIChiKSwgREVOIChiKSwgMSk7CisKKyAgICAgIG1wcV9jYW5vbmljYWxpemUgKGEpOworICAgICAgbXBxX2Nhbm9uaWNhbGl6ZSAoYik7CisKKyAgICAgIGNjcmVmID0gcmVmX21wcV9jbXBfdWkgKGEsIDEsIDEpOworICAgICAgY2MgPSBtcHFfY21wX3VpIChhLCAxLCAxKTsKKworICAgICAgaWYgKFNHTiAoY2NyZWYpICE9IFNHTiAoY2MpKQorCWFib3J0ICgpOworCisgICAgICBjY3JlZiA9IHJlZl9tcHFfY21wX3VpIChhLCAwLCAxKTsKKyAgICAgIGNjID0gbXBxX2NtcF91aSAoYSwgMCwgMSk7CisKKyAgICAgIGlmIChTR04gKGNjcmVmKSAhPSBTR04gKGNjKSkKKwlhYm9ydCAoKTsKKworICAgICAgYm4gPSBtcHpfZ2V0X3VpIChOVU0gKGIpKTsKKyAgICAgIGJkID0gbXB6X2dldF91aSAoREVOIChiKSk7CisKKyAgICAgIGNjcmVmID0gcmVmX21wcV9jbXBfdWkgKGEsIGJuLCBiZCk7CisgICAgICBjYyA9IG1wcV9jbXBfdWkgKGEsIGJuLCBiZCk7CisKKyAgICAgIGlmIChTR04gKGNjcmVmKSAhPSBTR04gKGNjKSkKKwlhYm9ydCAoKTsKKyAgICB9CisKKyAgbXBxX2NsZWFyIChhKTsKKyAgbXBxX2NsZWFyIChiKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL3QtY21wX3ouYyBiL3Rlc3RzL21wcS90LWNtcF96LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2NmEzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wcS90LWNtcF96LmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIFRlc3QgbXBxX2NtcF96LgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSwgMjAxNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgU0dOKHgpICgoeCkgPCAwID8gLTEgOiAoeCkgPiAwID8gMSA6IDApCisKK2ludAorcmVmX21wcV9jbXBfeiAobXBxX3QgYSwgbXB6X3QgYikKK3sKKyAgbXB6X3QgYmk7CisgIGludCBjYzsKKworICBtcHpfaW5pdCAoYmkpOworCisgIG1wel9tdWwgKGJpLCBiLCBERU4gKGEpKTsKKyAgY2MgPSBtcHpfY21wIChOVU0gKGEpLCBiaSk7CisgIG1wel9jbGVhciAoYmkpOworICByZXR1cm4gY2M7Cit9CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDgJLyogaW5jcmVhc2luZyB0aGlzIGxvd2VycyB0aGUgcHJvYmFiaWxpdHkgb2YgZmluZGluZyBhbiBlcnJvciAqLworI2VuZGlmCisKKyNpZm5kZWYgTUFYTgorI2RlZmluZSBNQVhOIDUJLyogaW5jcmVhc2luZyB0aGlzIGltcGF0Y3Mgb24gdG90YWwgdGltaW5nICovCisjZW5kaWYKKwordm9pZAorc2l6ZXNfdGVzdCAoaW50IG0pCit7CisgIG1wcV90IGE7CisgIG1wel90IGI7CisgIGludCBpLCBqLCBrLCBzOworICBpbnQgY2MsIGNjcmVmOworCisgIG1wcV9pbml0IChhKTsKKyAgbXB6X2luaXQgKGIpOworCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYTiA7ICsraSkKKyAgICB7CisgICAgICBtcHpfc2V0Yml0IChERU4gKGEpLCBpKm0pOyAvKiBcc3VtXzBeaSAyXihpKm0pICovCisgICAgICBmb3IgKGogPSAwOyBqIDw9IE1BWE47ICsraikKKwl7CisJICBtcHpfc2V0X3VpIChOVU0gKGEpLCAwKTsKKwkgIG1wel9zZXRiaXQgKE5VTSAoYSksIGoqbSk7IC8qIDJeKGoqbSkgKi8KKwkgIGZvciAoayA9IDA7IGsgPD0gTUFYTjsgKytrKQorCSAgICB7CisJICAgICAgbXB6X3NldF91aSAoYiwgMCk7CisJICAgICAgbXB6X3NldGJpdCAoYiwgayptKTsgLyogMl4oayptKSAqLworCSAgICAgIGlmIChpID09IDApIC8qIERlbm9taW5hdG9yIGlzIDEsIGNvbXBhcmUgdGhlIHR3byBleHBvbmVudHMgKi8KKwkJY2NyZWYgPSAoaj5rKS0oajxrKTsKKwkgICAgICBlbHNlCisJCWNjcmVmID0gai1pID4gayA/IDEgOiAtMTsKKwkgICAgICBmb3IgKHMgPSAxOyBzID49IC0xOyBzIC09IDIpCisJCXsKKwkJICBjYyA9IG1wcV9jbXBfeiAoYSwgYik7CisKKwkJICBpZiAoY2NyZWYgIT0gU0dOIChjYykpCisJCSAgICB7CisJCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImk9JWksIGo9JWksIGs9JWksIG09JWksIHM9JWlcbjsgY2NyZWY9ICVpLCBjYz0gJWlcbiIsIGksIGosIGssIG0sIHMsIGNjcmVmLCBjYyk7CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCisJCSAgbXBxX25lZyAoYSwgYSk7CisJCSAgbXB6X25lZyAoYiwgYik7CisJCSAgY2NyZWYgPSAtIGNjcmVmOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wcV9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHFfdCBhOworICBtcHpfdCBiOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKyAgaW50IGk7CisgIGludCBjYywgY2NyZWY7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wcV9pbml0IChhKTsKKyAgbXB6X2luaXQgKGIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgaWYgKGkgJSA4MTkyID09IDApCisJc2l6ZXNfdGVzdCAodXJhbmRvbSAoKSAlIChpICsgMSkgKyAxKTsKKyAgICAgIHNpemUgPSB1cmFuZG9tICgpICUgU0laRSAtIFNJWkUvMjsKKyAgICAgIG1wel9yYW5kb20yIChOVU0gKGEpLCBzaXplKTsKKyAgICAgIGRvCisJeworCSAgc2l6ZSA9IHVyYW5kb20gKCkgJSAoU0laRS8yKTsKKwkgIG1wel9yYW5kb20yIChERU4gKGEpLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAoREVOIChhKSwgMCkgPT0gMCk7CisKKyAgICAgIHNpemUgPSB1cmFuZG9tICgpICUgU0laRSAtIFNJWkUvMjsKKyAgICAgIG1wel9yYW5kb20yIChiLCBzaXplKTsKKworICAgICAgbXBxX2Nhbm9uaWNhbGl6ZSAoYSk7CisKKyAgICAgIGNjcmVmID0gcmVmX21wcV9jbXBfeiAoYSwgYik7CisgICAgICBjYyA9IG1wcV9jbXBfeiAoYSwgYik7CisKKyAgICAgIGlmIChTR04gKGNjcmVmKSAhPSBTR04gKGNjKSkKKwlhYm9ydCAoKTsKKyAgICB9CisKKyAgbXBxX2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL3QtZXF1YWwuYyBiL3Rlc3RzL21wcS90LWVxdWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxYzUzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wcS90LWVxdWFsLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIFRlc3QgbXBxX2VxdWFsLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZSAobXBxX3NyY3B0ciB4LCBtcHFfc3JjcHRyIHksIGludCB3YW50KQoreworICBpbnQgIGdvdDsKKworICBNUFFfQ0hFQ0tfRk9STUFUICh4KTsKKyAgTVBRX0NIRUNLX0ZPUk1BVCAoeSk7CisKKyAgZ290ID0gbXBxX2VxdWFsICh4LCB5KTsKKyAgaWYgKChnb3QgIT0gMCkgIT0gKHdhbnQgIT0gMCkpCisgICAgeworICAgICAgcHJpbnRmICgibXBxX2VxdWFsIGdvdCAlZCB3YW50ICVkXG4iLCBnb3QsIHdhbnQpOworICAgICAgbXBxX3RyYWNlICgieCIsIHgpOworICAgICAgbXBxX3RyYWNlICgieSIsIHkpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK3ZvaWQKK2NoZWNrX2FsbCAobXBxX3B0ciB4LCBtcHFfcHRyIHksIGludCB3YW50KQoreworICBjaGVja19vbmUgKHgsIHksIHdhbnQpOworICBjaGVja19vbmUgKHksIHgsIHdhbnQpOworCisgIG1wcV9uZWcgKHgsIHgpOworICBtcHFfbmVnICh5LCB5KTsKKworICBjaGVja19vbmUgKHgsIHksIHdhbnQpOworICBjaGVja19vbmUgKHksIHgsIHdhbnQpOworfQorCisKKyNkZWZpbmUgU0VUNFooeiwgc2l6ZSxsMyxsMixsMSxsMCkgXAorICBTSVooeikgPSBzaXplOyBQVFIoeilbM10gPSBsMzsgUFRSKHopWzJdID0gbDI7IFBUUih6KVsxXSA9IGwxOyBQVFIoeilbMF0gPSBsMAorCisjZGVmaW5lIFNFVDQocSwgbnNpemUsbjMsbjIsbjEsbjAsIGRzaXplLGQzLGQyLGQxLGQwKSAgIFwKKyAgU0VUNFogKG1wcV9udW1yZWYocSksIG5zaXplLG4zLG4yLG4xLG4wKTsgICAgICAgICAgICAgXAorICBTRVQ0WiAobXBxX2RlbnJlZihxKSwgZHNpemUsZDMsZDIsZDEsZDApCisKKworLyogRXhlcmNpc2UgdmFyaW91cyBjb21iaW5hdGlvbnMgb2Ygc2FtZSBhbmQgc2xpZ2h0bHkgZGlmZmVyZW50IHZhbHVlcy4gKi8KKwordm9pZAorY2hlY2tfdmFyaW91cyAodm9pZCkKK3sKKyAgbXBxX3QgIHgsIHk7CisKKyAgbXBxX2luaXQgKHgpOworICBtcHFfaW5pdCAoeSk7CisKKyAgbXB6X3JlYWxsb2MgKG1wcV9udW1yZWYoeCksIChtcF9zaXplX3QpIDIwKTsKKyAgbXB6X3JlYWxsb2MgKG1wcV9kZW5yZWYoeCksIChtcF9zaXplX3QpIDIwKTsKKyAgbXB6X3JlYWxsb2MgKG1wcV9udW1yZWYoeSksIChtcF9zaXplX3QpIDIwKTsKKyAgbXB6X3JlYWxsb2MgKG1wcV9kZW5yZWYoeSksIChtcF9zaXplX3QpIDIwKTsKKworICAvKiAwID09IDAgKi8KKyAgU0VUNCAoeCwgMCwxMywxMiwxMSwxMCwgMSwyMywyMiwyMSwxKTsKKyAgU0VUNCAoeSwgMCwzMywzMiwzMSwzMCwgMSw0Myw0Miw0MSwxKTsKKyAgY2hlY2tfYWxsICh4LCB5LCAxKTsKKworICAvKiA4My85OSA9PSA4My85OSAqLworICBTRVQ0ICh4LCAxLDEzLDEyLDExLDgzLCAxLDIzLDIyLDIxLDk5KTsKKyAgU0VUNCAoeSwgMSwzMywzMiwzMSw4MywgMSw0Myw0Miw0MSw5OSk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMSk7CisKKyAgLyogMToyOjM6NC81OjY6NyA9PSAxOjI6Mzo0LzU6Njo3ICovCisgIFNFVDQgKHgsIDQsMSwyLDMsNCwgMyw4OCw1LDYsNyk7CisgIFNFVDQgKHksIDQsMSwyLDMsNCwgMyw5OSw1LDYsNyk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMSk7CisKKyAgLyogdmFyaW91cyBpbmRpdmlkdWFsIGNoYW5nZXMgbWFraW5nICE9ICovCisgIFNFVDQgKHgsIDQsMSwyLDMsNjY3LCAzLDg4LDUsNiw3KTsKKyAgU0VUNCAoeSwgNCwxLDIsMyw0LCAzLDk5LDUsNiw3KTsKKyAgY2hlY2tfYWxsICh4LCB5LCAwKTsKKyAgU0VUNCAoeCwgNCwxLDIsNjY2LDQsIDMsODgsNSw2LDcpOworICBTRVQ0ICh5LCA0LDEsMiwzLDQsIDMsOTksNSw2LDcpOworICBjaGVja19hbGwgKHgsIHksIDApOworICBTRVQ0ICh4LCA0LDEsNjY2LDMsNCwgMyw4OCw1LDYsNyk7CisgIFNFVDQgKHksIDQsMSwyLDMsNCwgMyw5OSw1LDYsNyk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMCk7CisjaWYgR01QX05VTUJfQklUUyAhPSA2MgorICBTRVQ0ICh4LCA0LDY2NywyLDMsNCwgMyw4OCw1LDYsNyk7CisgIFNFVDQgKHksIDQsMSwyLDMsNCwgMyw5OSw1LDYsNyk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMCk7CisjZW5kaWYKKyAgU0VUNCAoeCwgNCwxLDIsMyw0LCAzLDg4LDUsNiw2NjcpOworICBTRVQ0ICh5LCA0LDEsMiwzLDQsIDMsOTksNSw2LDcpOworICBjaGVja19hbGwgKHgsIHksIDApOworICBTRVQ0ICh4LCA0LDEsMiwzLDQsIDMsODgsNSw2NjcsNyk7CisgIFNFVDQgKHksIDQsMSwyLDMsNCwgMyw5OSw1LDYsNyk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMCk7CisgIFNFVDQgKHgsIDQsMSwyLDMsNCwgMyw4OCw2NjYsNiw3KTsKKyAgU0VUNCAoeSwgNCwxLDIsMyw0LCAzLDk5LDUsNiw3KTsKKyAgY2hlY2tfYWxsICh4LCB5LCAwKTsKKyAgU0VUNCAoeCwgLTQsMSwyLDMsNCwgMyw4OCw1LDYsNyk7CisgIFNFVDQgKHksICA0LDEsMiwzLDQsIDMsOTksNSw2LDcpOworICBjaGVja19hbGwgKHgsIHksIDApOworICBTRVQ0ICh4LCAxLDEsMiwzLDQsIDMsODgsNSw2LDcpOworICBTRVQ0ICh5LCA0LDEsMiwzLDQsIDMsOTksNSw2LDcpOworICBjaGVja19hbGwgKHgsIHksIDApOworICBTRVQ0ICh4LCA0LDEsMiwzLDQsIDMsODgsNSw2LDcpOworICBTRVQ0ICh5LCA0LDEsMiwzLDQsIDIsOTksNSw2LDcpOworICBjaGVja19hbGwgKHgsIHksIDApOworCisgIG1wcV9jbGVhciAoeCk7CisgIG1wcV9jbGVhciAoeSk7Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja192YXJpb3VzICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1nZXRfZC5jIGIvdGVzdHMvbXBxL3QtZ2V0X2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ2YTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL3QtZ2V0X2QuYwpAQCAtMCwwICsxLDI5NCBAQAorLyogVGVzdCBtcHFfZ2V0X2QgYW5kIG1wcV9zZXRfZAorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAzLCAyMDEyLCAyMDEzIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDgKKyNlbmRpZgorCisvKiBWQVggRCBmbG9hdHMgb25seSBoYXZlIGFuIDggYml0IHNpZ25lZCBleHBvbmVudCwgc28gYW55dGhpbmcgMl4xMjggb3IKKyAgIGJpZ2dlciB3aWxsIG92ZXJmbG93LCB0aGF0IGJlaW5nIDQgbGltYnMuICovCisjaWYgZGVmaW5lZCAoX192YXgpIHx8IGRlZmluZWQgKF9fdmF4X18pICYmIFNJWkUgPiA0CisjdW5kZWYgU0laRQorI2RlZmluZSBTSVpFIDQKKyNkZWZpbmUgRVBTSVpFIDMKKyNlbHNlCisjZGVmaW5lIEVQU0laRSBTSVpFCisjZW5kaWYKKwordm9pZCBkdW1wIChtcHFfdCk7CisKK3ZvaWQKK2NoZWNrX21vbm90b25pYyAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHFfdCBhOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IHJlcHMgPSAxMDA7CisgIGludCBpLCBqOworICBkb3VibGUgbGFzdF9kLCBuZXdfZDsKKyAgbXBxX3QgcWxhc3RfZCwgcW5ld19kOworICBtcHFfdCBlcHM7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIC8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gdGVzdCB0aGUgbW9ub3Rvbm91c25lc3Mgb2YgbXBxX2dldF9kIGJ5IGFkZGluZworICAgICBudW1iZXJzIHRvIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLiAgKi8KKworICBtcHFfaW5pdCAoYSk7CisgIG1wcV9pbml0IChlcHMpOworICBtcHFfaW5pdCAocWxhc3RfZCk7CisgIG1wcV9pbml0IChxbmV3X2QpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgc2l6ZSA9IHVyYW5kb20gKCkgJSBTSVpFIC0gU0laRS8yOworICAgICAgbXB6X3JhbmRvbTIgKG1wcV9udW1yZWYgKGEpLCBzaXplKTsKKyAgICAgIGRvCisJeworCSAgc2l6ZSA9IHVyYW5kb20gKCkgJSBTSVpFIC0gU0laRS8yOworCSAgbXB6X3JhbmRvbTIgKG1wcV9kZW5yZWYgKGEpLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAobXBxX2RlbnJlZiAoYSksIDApID09IDApOworCisgICAgICBtcHFfY2Fub25pY2FsaXplIChhKTsKKworICAgICAgbGFzdF9kID0gbXBxX2dldF9kIChhKTsKKyAgICAgIG1wcV9zZXRfZCAocWxhc3RfZCwgbGFzdF9kKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorCXsKKwkgIHNpemUgPSB1cmFuZG9tICgpICUgRVBTSVpFICsgMTsKKwkgIG1wel9yYW5kb20yIChtcHFfbnVtcmVmIChlcHMpLCBzaXplKTsKKwkgIHNpemUgPSB1cmFuZG9tICgpICUgRVBTSVpFICsgMTsKKwkgIG1wel9yYW5kb20yIChtcHFfZGVucmVmIChlcHMpLCBzaXplKTsKKwkgIG1wcV9jYW5vbmljYWxpemUgKGVwcyk7CisKKwkgIG1wcV9hZGQgKGEsIGEsIGVwcyk7CisJICBtcHFfY2Fub25pY2FsaXplIChhKTsKKwkgIG5ld19kID0gbXBxX2dldF9kIChhKTsKKwkgIGlmIChsYXN0X2QgPiBuZXdfZCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlxuRVJST1IgKHRlc3QgJWQvJWQpOiBiYWQgbXBxX2dldF9kIHJlc3VsdHNcbiIsIGksIGopOworCSAgICAgIHByaW50ZiAoImxhc3Q6ICUuMTZnXG4iLCBsYXN0X2QpOworCSAgICAgIHByaW50ZiAoIiBuZXc6ICUuMTZnXG4iLCBuZXdfZCk7IGR1bXAgKGEpOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBtcHFfc2V0X2QgKHFuZXdfZCwgbmV3X2QpOworCSAgTVBRX0NIRUNLX0ZPUk1BVCAocW5ld19kKTsKKwkgIGlmIChtcHFfY21wIChxbGFzdF9kLCBxbmV3X2QpID4gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIkVSUk9SICh0ZXN0ICVkLyVkKTogYmFkIG1wcV9zZXRfZCByZXN1bHRzXG4iLCBpLCBqKTsKKwkgICAgICBwcmludGYgKCJsYXN0OiAlLjE2Z1xuIiwgbGFzdF9kKTsgZHVtcCAocWxhc3RfZCk7CisJICAgICAgcHJpbnRmICgiIG5ldzogJS4xNmdcbiIsIG5ld19kKTsgZHVtcCAocW5ld19kKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgbGFzdF9kID0gbmV3X2Q7CisJICBtcHFfc2V0IChxbGFzdF9kLCBxbmV3X2QpOworCX0KKyAgICB9CisKKyAgbXBxX2NsZWFyIChhKTsKKyAgbXBxX2NsZWFyIChlcHMpOworICBtcHFfY2xlYXIgKHFsYXN0X2QpOworICBtcHFfY2xlYXIgKHFuZXdfZCk7Cit9CisKK2RvdWJsZQorbXlfbGRleHAgKGRvdWJsZSBkLCBpbnQgZSkKK3sKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAoZSA+IDApCisJeworCSAgaWYgKGUgPj0gMTYpCisJICAgIHsKKwkgICAgICBkICo9IDY1NTM2LjA7CisJICAgICAgZSAtPSAxNjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZCAqPSAyLjA7CisJICAgICAgZSAtPSAxOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoZSA8IDApCisJeworCisJICBpZiAoZSA8PSAtMTYpCisJICAgIHsKKwkgICAgICBkIC89IDY1NTM2LjA7CisJICAgICAgZSArPSAxNjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZCAvPSAyLjA7CisJICAgICAgZSArPSAxOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXJldHVybiBkOworICAgIH0KK30KKworI2RlZmluZSBNQVhFWFAgNTAwCisKKyNpZiBkZWZpbmVkIChfX3ZheCkgfHwgZGVmaW5lZCAoX192YXhfXykKKyN1bmRlZiBNQVhFWFAKKyNkZWZpbmUgTUFYRVhQIDMwCisjZW5kaWYKKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzID0gUkFORFM7CisKKyAgZG91YmxlIGQ7CisgIG1wcV90IHE7CisgIG1wel90IGEsIHQ7CisgIGludCBleHA7CisKKyAgaW50IHRlc3QsIHJlcHMgPSAxMDAwMDA7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IDEwMCAqIGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wcV9pbml0IChxKTsKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAodCk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IHJlcHM7IHRlc3QrKykKKyAgICB7CisgICAgICBtcHpfcnJhbmRvbWIgKGEsIHJhbmRzLCA1Myk7CisgICAgICBtcHpfdXJhbmRvbWIgKHQsIHJhbmRzLCAzMik7CisgICAgICBleHAgPSBtcHpfZ2V0X3VpICh0KSAlICgyKk1BWEVYUCkgLSBNQVhFWFA7CisKKyAgICAgIGQgPSBteV9sZGV4cCAobXB6X2dldF9kIChhKSwgZXhwKTsKKyAgICAgIG1wcV9zZXRfZCAocSwgZCk7CisgICAgICAvKiBDaGVjayB0aGF0IG4vZCA9IGEgKiAyXmV4cCwgb3IKKwkgZCphIDJee2V4cH0gPSBuICovCisgICAgICBtcHpfbXVsICh0LCBhLCBtcHFfZGVucmVmIChxKSk7CisgICAgICBpZiAoZXhwID4gMCkKKwltcHpfbXVsXzJleHAgKHQsIHQsIGV4cCk7CisgICAgICBlbHNlCisJeworCSAgaWYgKCFtcHpfZGl2aXNpYmxlXzJleHBfcCAodCwgLWV4cCkpCisJICAgIGdvdG8gZmFpbDsKKwkgIG1wel9kaXZfMmV4cCAodCwgdCwgLWV4cCk7CisJfQorICAgICAgaWYgKG1wel9jbXAgKHQsIG1wcV9udW1yZWYgKHEpKSAhPSAwKQorCXsKKwlmYWlsOgorCSAgcHJpbnRmICgiRVJST1IgKGNoZWNrX3JhbmRvbSB0ZXN0ICVkKTogYmFkIG1wcV9zZXRfZCByZXN1bHRzXG4iLCB0ZXN0KTsKKwkgIHByaW50ZiAoIiUuMTZnXG4iLCBkKTsKKwkgIGdtcF9wcmludGYgKCIlUWRcbiIsIHEpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgbXBxX2NsZWFyIChxKTsKKyAgbXB6X2NsZWFyICh0KTsKKyAgbXB6X2NsZWFyIChhKTsKK30KKwordm9pZAorZHVtcCAobXBxX3QgeCkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIG1wcV9udW1yZWYgKHgpKTsKKyAgcHJpbnRmICgiLyIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgbXBxX2RlbnJlZiAoeCkpOworICBwcmludGYgKCJcbiIpOworfQorCisvKiBDaGVjayB2YXJpb3VzIHZhbHVlcyAyXm4gYW5kIDEvMl5uLiAqLwordm9pZAorY2hlY2tfb25lYml0ICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgbG9uZyBkYXRhW10gPSB7CisgICAgLTMqR01QX05VTUJfQklUUy0xLCAtMypHTVBfTlVNQl9CSVRTLCAtMypHTVBfTlVNQl9CSVRTKzEsCisgICAgLTIqR01QX05VTUJfQklUUy0xLCAtMipHTVBfTlVNQl9CSVRTLCAtMipHTVBfTlVNQl9CSVRTKzEsCisgICAgLUdNUF9OVU1CX0JJVFMtMSwgLUdNUF9OVU1CX0JJVFMsIC1HTVBfTlVNQl9CSVRTKzEsCisgICAgLTUsIC0yLCAtMSwgMCwgMSwgMiwgNSwKKyAgICBHTVBfTlVNQl9CSVRTLTEsIEdNUF9OVU1CX0JJVFMsIEdNUF9OVU1CX0JJVFMrMSwKKyAgICAyKkdNUF9OVU1CX0JJVFMtMSwgMipHTVBfTlVNQl9CSVRTLCAyKkdNUF9OVU1CX0JJVFMrMSwKKyAgICAzKkdNUF9OVU1CX0JJVFMtMSwgMypHTVBfTlVNQl9CSVRTLCAzKkdNUF9OVU1CX0JJVFMrMSwKKyAgfTsKKworICBpbnQgICAgIGksIG5lZzsKKyAgbG9uZyAgICBleHAsIGw7CisgIG1wcV90ICAgcTsKKyAgZG91YmxlICBnb3QsIHdhbnQ7CisKKyAgbXBxX2luaXQgKHEpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBleHAgPSBkYXRhW2ldOworCisgICAgICBtcHFfc2V0X3VpIChxLCAxTCwgMUwpOworICAgICAgaWYgKGV4cCA+PSAwKQorCW1wcV9tdWxfMmV4cCAocSwgcSwgZXhwKTsKKyAgICAgIGVsc2UKKwltcHFfZGl2XzJleHAgKHEsIHEsIC1leHApOworCisgICAgICB3YW50ID0gMS4wOworICAgICAgZm9yIChsID0gMDsgbCA8IGV4cDsgbCsrKQorCXdhbnQgKj0gMi4wOworICAgICAgZm9yIChsID0gMDsgbCA+IGV4cDsgbC0tKQorCXdhbnQgLz0gMi4wOworCisgICAgICBmb3IgKG5lZyA9IDA7IG5lZyA8PSAxOyBuZWcrKykKKwl7CisJICBpZiAobmVnKQorCSAgICB7CisJICAgICAgbXBxX25lZyAocSwgcSk7CisJICAgICAgd2FudCA9IC13YW50OworCSAgICB9CisKKwkgIGdvdCA9IG1wcV9nZXRfZCAocSk7CisKKwkgIGlmIChnb3QgIT0gd2FudCkKKwkgICAgeworCSAgICAgIHByaW50ZiAgICAoIm1wcV9nZXRfZCB3cm9uZyBvbiAlczIqKiVsZFxuIiwgbmVnID8gIi0iIDogIiIsIGV4cCk7CisJICAgICAgbXBxX3RyYWNlICgiICAgcSAgICAiLCBxKTsKKwkgICAgICBkX3RyYWNlICAgKCIgICB3YW50ICIsIHdhbnQpOworCSAgICAgIGRfdHJhY2UgICAoIiAgIGdvdCAgIiwgZ290KTsKKwkgICAgICBhYm9ydCgpOworCSAgICB9CisJfQorICAgIH0KKyAgbXBxX2NsZWFyIChxKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX29uZWJpdCAoKTsKKyAgY2hlY2tfbW9ub3RvbmljIChhcmdjLCBhcmd2KTsKKyAgY2hlY2tfcmFuZG9tIChhcmdjLCBhcmd2KTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL3QtZ2V0X3N0ci5jIGIvdGVzdHMvbXBxL3QtZ2V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODY1MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHEvdC1nZXRfc3RyLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIFRlc3QgbXBxX2dldF9zdHIuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfb25lIChtcHFfc3JjcHRyIHEsIGludCBiYXNlLCBjb25zdCBjaGFyICp3YW50KQoreworICBjaGFyICAgICpzdHIsICpyZXQ7CisgIHNpemVfdCAgc3RyX2FsbG9jOworCisgIE1QUV9DSEVDS19GT1JNQVQgKHEpOworICBtcF90cmFjZV9iYXNlID0gYmFzZTsKKworICBzdHJfYWxsb2MgPQorICAgIG1wel9zaXplaW5iYXNlIChtcHFfbnVtcmVmKHEpLCBBQlMoYmFzZSkpICsKKyAgICBtcHpfc2l6ZWluYmFzZSAobXBxX2RlbnJlZihxKSwgQUJTKGJhc2UpKSArIDM7CisKKyAgc3RyID0gbXBxX2dldF9zdHIgKE5VTEwsIGJhc2UsIHEpOworICBpZiAoc3RybGVuKHN0cikrMSA+IHN0cl9hbGxvYykKKyAgICB7CisgICAgICBwcmludGYgKCJtcHFfZ2V0X3N0ciBzaXplIGJpZ2dlciB0aGFuIHNob3VsZCBiZSAocGFzc2luZyBOVUxMKVxuIik7CisgICAgICBwcmludGYgKCIgIGJhc2UgJWRcbiIsIGJhc2UpOworICAgICAgcHJpbnRmICgiICBnb3QgIHNpemUgJWx1IFwiJXNcIlxuIiwgKHVuc2lnbmVkIGxvbmcpICBzdHJsZW4oc3RyKSsxLCBzdHIpOworICAgICAgcHJpbnRmICgiICB3YW50IHNpemUgJWx1XG4iLCAodW5zaWduZWQgbG9uZykgc3RyX2FsbG9jKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgaWYgKHN0cmNtcCAoc3RyLCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wcV9nZXRfc3RyIHdyb25nIChwYXNzaW5nIE5VTEwpXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgYmFzZSAlZFxuIiwgYmFzZSk7CisgICAgICBwcmludGYgKCIgIGdvdCAgXCIlc1wiXG4iLCBzdHIpOworICAgICAgcHJpbnRmICgiICB3YW50IFwiJXNcIlxuIiwgd2FudCk7CisgICAgICBtcHFfdHJhY2UgKCIgIHEiLCBxKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzdHIsIHN0cmxlbiAoc3RyKSArIDEpOworCisgIHN0ciA9IChjaGFyICopICgqX19nbXBfYWxsb2NhdGVfZnVuYykgKHN0cl9hbGxvYyk7CisKKyAgcmV0ID0gbXBxX2dldF9zdHIgKHN0ciwgYmFzZSwgcSk7CisgIGlmIChzdHIgIT0gcmV0KQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wcV9nZXRfc3RyIHdyb25nIHJldHVybiB2YWx1ZSAocGFzc2luZyBub24tTlVMTClcbiIpOworICAgICAgcHJpbnRmICgiICBiYXNlICVkXG4iLCBiYXNlKTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAlcFxuIiwgKHZvaWQgKikgcmV0KTsKKyAgICAgIHByaW50ZiAoIiAgd2FudCAlcFxuIiwgKHZvaWQgKikgc3RyKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgaWYgKHN0cmNtcCAoc3RyLCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wcV9nZXRfc3RyIHdyb25nIChwYXNzaW5nIG5vbi1OVUxMKVxuIik7CisgICAgICBwcmludGYgKCIgIGJhc2UgJWRcbiIsIGJhc2UpOworICAgICAgcHJpbnRmICgiICBnb3QgIFwiJXNcIlxuIiwgc3RyKTsKKyAgICAgIHByaW50ZiAoIiAgd2FudCBcIiVzXCJcbiIsIHdhbnQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgc3RyX2FsbG9jKTsKK30KKworCit2b2lkCitjaGVja19hbGwgKG1wcV9zcmNwdHIgcSwgaW50IGJhc2UsIGNvbnN0IGNoYXIgKndhbnQpCit7CisgIGNoYXIgICpzOworCisgIGNoZWNrX29uZSAocSwgYmFzZSwgd2FudCk7CisKKyAgcyA9IF9fZ21wX2FsbG9jYXRlX3N0cmR1cCAod2FudCk7CisgIHN0cnRvdXBwZXIgKHMpOworICBjaGVja19vbmUgKHEsIC1iYXNlLCBzKTsKKyAgKCpfX2dtcF9mcmVlX2Z1bmMpIChzLCBzdHJsZW4ocykrMSk7Cit9CisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCAgICAgICAgIGJhc2U7CisgICAgY29uc3QgY2hhciAgKm51bTsKKyAgICBjb25zdCBjaGFyICAqZGVuOworICAgIGNvbnN0IGNoYXIgICp3YW50OworICB9IGRhdGFbXSA9IHsKKyAgICB7IDEwLCAiMCIsICIxIiwgIjAiIH0sCisgICAgeyAxMCwgIjEiLCAiMSIsICIxIiB9LAorCisgICAgeyAxNiwgImZmZmZmZmZmIiwgIjEiLCAiZmZmZmZmZmYiIH0sCisgICAgeyAxNiwgImZmZmZmZmZmZmZmZmZmZmYiLCAiMSIsICJmZmZmZmZmZmZmZmZmZmZmIiB9LAorCisgICAgeyAxNiwgIjEiLCAiZmZmZmZmZmYiLCAiMS9mZmZmZmZmZiIgfSwKKyAgICB7IDE2LCAiMSIsICJmZmZmZmZmZmZmZmZmZmZmIiwgIjEvZmZmZmZmZmZmZmZmZmZmZiIgfSwKKyAgICB7IDE2LCAiMSIsICIxMDAwMDAwMDAwMDAwMDAwMyIsICIxLzEwMDAwMDAwMDAwMDAwMDAzIiB9LAorCisgICAgeyAxMCwgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgIjk4NzY1NDMyMTA5ODc2NTQzMjMiLAorICAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwLzk4NzY1NDMyMTA5ODc2NTQzMjMiIH0sCisgIH07CisKKyAgbXBxX3QgIHE7CisgIGludCAgICBpOworCisgIG1wcV9pbml0IChxKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChtcHFfbnVtcmVmKHEpLCBkYXRhW2ldLm51bSwgZGF0YVtpXS5iYXNlKTsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChtcHFfZGVucmVmKHEpLCBkYXRhW2ldLmRlbiwgZGF0YVtpXS5iYXNlKTsKKyAgICAgIGNoZWNrX2FsbCAocSwgZGF0YVtpXS5iYXNlLCBkYXRhW2ldLndhbnQpOworICAgIH0KKyAgbXBxX2NsZWFyIChxKTsKK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wcS90LWlucF9zdHIuYyBiL3Rlc3RzL21wcS90LWlucF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL3QtaW5wX3N0ci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiBUZXN0IG1wcV9pbnBfc3RyLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgLyogZm9yIHVubGluayAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2RlZmluZSBGSUxFTkFNRSAgIi90bXAvdC1pbnBfc3RyLnRtcCIKKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqaW5wOworICAgIGludCAgICAgICAgIGJhc2U7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisgICAgaW50ICAgICAgICAgd2FudF9ucmVhZDsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIjAiLCAgIDEwLCAiMCIsIDEgfSwKKyAgICB7ICIwLzEiLCAxMCwgIjAiLCAzIH0sCisKKyAgICB7ICIwLyIsICAgMTAsICIwIiwgMCB9LAorICAgIHsgIi8xMjMiLCAxMCwgIjAiLCAwIH0sCisgICAgeyAiYmxhaCIsIDEwLCAiMCIsIDAgfSwKKyAgICB7ICIxMjMvYmxhaCIsIDEwLCAiMCIsIDAgfSwKKyAgICB7ICI1IC84IiwgMTAsICI1IiwgMSB9LAorICAgIHsgIjUvIDgiLCAxMCwgIjAiLCAwIH0sCisKKyAgICB7ICAiZmYiLCAxNiwgICIyNTUiLCAyIH0sCisgICAgeyAiLWZmIiwgMTYsICItMjU1IiwgMyB9LAorICAgIHsgICJGRiIsIDE2LCAgIjI1NSIsIDIgfSwKKyAgICB7ICItRkYiLCAxNiwgIi0yNTUiLCAzIH0sCisKKyAgICB7ICJ6IiwgMzYsICIzNSIsIDEgfSwKKyAgICB7ICJaIiwgMzYsICIzNSIsIDEgfSwKKworICAgIHsgICIweDAiLCAgICAwLCAgICIwIiwgMyB9LAorICAgIHsgICIweDEwIiwgICAwLCAgIjE2IiwgNCB9LAorICAgIHsgIi0weDAiLCAgICAwLCAgICIwIiwgNCB9LAorICAgIHsgIi0weDEwIiwgICAwLCAiLTE2IiwgNSB9LAorICAgIHsgIi0weDEwLzUiLCAwLCAiLTE2LzUiLCA3IH0sCisKKyAgICB7ICAiMDAiLCAgIDAsICAiMCIsIDIgfSwKKyAgICB7ICAiMDEwIiwgIDAsICAiOCIsIDMgfSwKKyAgICB7ICItMDAiLCAgIDAsICAiMCIsIDMgfSwKKyAgICB7ICItMDEwIiwgIDAsICItOCIsIDQgfSwKKyAgfTsKKworICBtcHFfdCAgZ290LCB3YW50OworICBsb25nICAgZnRlbGxfbnJlYWQ7CisgIGludCAgICBpLCBwb3N0LCBqLCBnb3RfbnJlYWQ7CisgIEZJTEUgICAqZnA7CisKKyAgbXBxX2luaXQgKGdvdCk7CisgIG1wcV9pbml0ICh3YW50KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgZm9yIChwb3N0ID0gMDsgcG9zdCA8PSAyOyBwb3N0KyspCisJeworCSAgbXBxX3NldF9zdHJfb3JfYWJvcnQgKHdhbnQsIGRhdGFbaV0ud2FudCwgMCk7CisJICBNUFFfQ0hFQ0tfRk9STUFUICh3YW50KTsKKworCSAgZnAgPSBmb3BlbiAoRklMRU5BTUUsICJ3KyIpOworCSAgQVNTRVJUX0FMV0FZUyAoZnAgIT0gTlVMTCk7CisJICBmcHV0cyAoZGF0YVtpXS5pbnAsIGZwKTsKKwkgIGZvciAoaiA9IDA7IGogPCBwb3N0OyBqKyspCisJICAgIHB1dGMgKCcgJywgZnApOworCSAgZmZsdXNoIChmcCk7CisJICBBU1NFUlRfQUxXQVlTICghIGZlcnJvcihmcCkpOworCisJICByZXdpbmQgKGZwKTsKKwkgIGdvdF9ucmVhZCA9IG1wcV9pbnBfc3RyIChnb3QsIGZwLCBkYXRhW2ldLmJhc2UpOworCisJICBpZiAoZ290X25yZWFkICE9IDApCisJICAgIHsKKwkgICAgICBmdGVsbF9ucmVhZCA9IGZ0ZWxsIChmcCk7CisJICAgICAgaWYgKGdvdF9ucmVhZCAhPSBmdGVsbF9ucmVhZCkKKwkJeworCQkgIHByaW50ZiAoIm1wcV9pbnBfc3RyIG5yZWFkIHdyb25nXG4iKTsKKwkJICBwcmludGYgKCIgIGlucCAgICAgICAgICBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wKTsKKwkJICBwcmludGYgKCIgIGJhc2UgICAgICAgICAlZFxuIiwgZGF0YVtpXS5iYXNlKTsKKwkJICBwcmludGYgKCIgIGdvdF9ucmVhZCAgICAlZFxuIiwgZ290X25yZWFkKTsKKwkJICBwcmludGYgKCIgIGZ0ZWxsX25yZWFkICAlbGRcbiIsIGZ0ZWxsX25yZWFkKTsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICB9CisKKwkgIGlmIChwb3N0ID09IDAgJiYgZGF0YVtpXS53YW50X25yZWFkID09IHN0cmxlbihkYXRhW2ldLmlucCkpCisJICAgIHsKKwkgICAgICBpbnQgIGMgPSBnZXRjKGZwKTsKKwkgICAgICBpZiAoYyAhPSBFT0YpCisJCXsKKwkJICBwcmludGYgKCJtcHFfaW5wX3N0ciBkaWRuJ3QgcmVhZCB0byBFT0ZcbiIpOworCQkgIHByaW50ZiAoIiAgaW5wICAgICAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisJCSAgcHJpbnRmICgiICBiYXNlICAgICAgICAlZFxuIiwgZGF0YVtpXS5iYXNlKTsKKwkJICBwcmludGYgKCIgIGMgJyVjJyAlI3hcbiIsIGMsIGMpOworCQkgIGFib3J0ICgpOworCQl9CisJICAgIH0KKworCSAgaWYgKGdvdF9ucmVhZCAhPSBkYXRhW2ldLndhbnRfbnJlYWQpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJtcHFfaW5wX3N0ciBucmVhZCB3cm9uZ1xuIik7CisJICAgICAgcHJpbnRmICgiICBpbnAgICAgICAgICBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wKTsKKwkgICAgICBwcmludGYgKCIgIGJhc2UgICAgICAgICVkXG4iLCBkYXRhW2ldLmJhc2UpOworCSAgICAgIHByaW50ZiAoIiAgZ290X25yZWFkICAgJWRcbiIsIGdvdF9ucmVhZCk7CisJICAgICAgcHJpbnRmICgiICB3YW50X25yZWFkICAlZFxuIiwgZGF0YVtpXS53YW50X25yZWFkKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBNUFFfQ0hFQ0tfRk9STUFUIChnb3QpOworCisJICBpZiAoISBtcHFfZXF1YWwgKGdvdCwgd2FudCkpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJtcHFfaW5wX3N0ciB3cm9uZyByZXN1bHRcbiIpOworCSAgICAgIHByaW50ZiAoIiAgaW5wICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisJICAgICAgcHJpbnRmICgiICBiYXNlICAlZFxuIiwgZGF0YVtpXS5iYXNlKTsKKwkgICAgICBtcHFfdHJhY2UgKCIgIGdvdCAiLCAgZ290KTsKKwkgICAgICBtcHFfdHJhY2UgKCIgIHdhbnQiLCB3YW50KTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBBU1NFUlRfQUxXQVlTIChmY2xvc2UgKGZwKSA9PSAwKTsKKwl9CisgICAgfQorCisgIG1wcV9jbGVhciAoZ290KTsKKyAgbXBxX2NsZWFyICh3YW50KTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHVubGluayAoRklMRU5BTUUpOworICB0ZXN0c19lbmQgKCk7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1pbnYuYyBiL3Rlc3RzL21wcS90LWludi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmE4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHEvdC1pbnYuYwpAQCAtMCwwICsxLDYwIEBACisvKiBUZXN0IG1wcV9pbnYgKGFuZCBzZXQvZ2V0X251bS9kZW4pLgorCitDb3B5cmlnaHQgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wcV90IGEsIGI7CisgIG1wel90IG0sIG47CisgIGNvbnN0IGNoYXIqIHMgPSAiLTQyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCI7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgbXBxX2luaXRzIChhLCBiLCAobXBxX3B0cikwKTsKKyAgbXB6X2luaXRzIChtLCBuLCAobXB6X3B0cikwKTsKKworICBtcHpfc2V0X3VpIChtLCAxMyk7CisgIG1wcV9zZXRfZGVuIChhLCBtKTsKKyAgbXB6X3NldF9zdHIgKG0sIHMsIDApOworICBtcHFfc2V0X251bSAoYSwgbSk7CisgIE1QUV9DSEVDS19GT1JNQVQgKGEpOworICBtcHFfaW52IChiLCBhKTsKKyAgTVBRX0NIRUNLX0ZPUk1BVCAoYik7CisgIG1wcV9nZXRfbnVtIChuLCBiKTsKKyAgQVNTRVJUX0FMV0FZUyAobXB6X2NtcF9zaSAobiwgLTEzKSA9PSAwKTsKKyAgbXBxX25lZyAoYiwgYik7CisgIG1wcV9pbnYgKGEsIGIpOworICBNUFFfQ0hFQ0tfRk9STUFUIChhKTsKKyAgbXBxX2ludiAoYiwgYik7CisgIE1QUV9DSEVDS19GT1JNQVQgKGIpOworICBtcHFfZ2V0X2RlbiAobiwgYik7CisgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfdWkgKG4sIDEzKSA9PSAwKTsKKyAgbXBxX2dldF9udW0gKG4sIGEpOworICBtcHpfYWRkIChuLCBuLCBtKTsKKyAgQVNTRVJUX0FMV0FZUyAobXB6X3NnbiAobikgPT0gMCk7CisKKyAgbXBxX2NsZWFycyAoYSwgYiwgKG1wcV9wdHIpMCk7CisgIG1wel9jbGVhcnMgKG0sIG4sIChtcHpfcHRyKTApOworCisgIHRlc3RzX2VuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1tZF8yZXhwLmMgYi90ZXN0cy9tcHEvdC1tZF8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmZmNlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wcS90LW1kXzJleHAuYwpAQCAtMCwwICsxLDI0NCBAQAorLyogVGVzdCBtcHFfbXVsXzJleHAgYW5kIG1wcV9kaXZfMmV4cC4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitzdHJ1Y3QgcGFpcl90IHsKKyAgY29uc3QgY2hhciAgICAgKm51bTsKKyAgY29uc3QgY2hhciAgICAgKmRlbjsKK307CisKK3ZvaWQKK2NoZWNrX3JhbmRvbSAoKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYXJnX3NpemUsIHNpemVfcmFuZ2U7CisgIG1wcV90IHEsIHI7CisgIGludCBpOworICBtcF9iaXRjbnRfdCBzaGlmdDsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisgIG1wcV9pbml0IChxKTsKKyAgbXBxX2luaXQgKHIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMSArIDI7IC8qIDAuLjQwOTYgYml0IG9wZXJhbmRzICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGFyZ19zaXplID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChtcHFfbnVtcmVmIChxKSwgcmFuZHMsIGFyZ19zaXplKTsKKyAgICAgIGRvCisJeworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworCSAgYXJnX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKG1wcV9kZW5yZWYgKHEpLCByYW5kcywgYXJnX3NpemUpOworCX0KKyAgICAgIHdoaWxlIChtcHpfc2duIChtcHFfZGVucmVmIChxKSkgPT0gMCk7CisKKyAgICAgIC8qIFdlIG5vdyBoYXZlIGEgcmFuZG9tIHJhdGlvbmFsIGluIHEsIGFsYmVpdCBhbiB1bm5vcm1hbGlzZWQgb25lLiAgVGhlCisJIGxhY2sgb2Ygbm9ybWFsaXNhdGlvbiBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBzbyBsZXQncyBzYXZlIHRoZSB0aW1lIGEKKwkgZ2NkIHdvdWxkIHJlcXVpcmUuICAqLworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2hpZnQgPSBtcHpfZ2V0X3VpIChicykgJSA0MDk2OworCisgICAgICBtcHFfbXVsXzJleHAgKHIsIHEsIHNoaWZ0KTsKKworICAgICAgaWYgKG1wcV9jbXAgKHIsIHEpIDwgMCkKKwl7CisJICBwcmludGYgKCJtcHFfbXVsXzJleHAgd3Jvbmcgb24gcmFuZG9tXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgbXBxX2Rpdl8yZXhwIChyLCByLCBzaGlmdCk7CisKKyAgICAgIGlmIChtcHFfY21wIChyLCBxKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIm1wcV9tdWxfMmV4cCBvciBtcHFfZGl2XzJleHAgd3Jvbmcgb24gcmFuZG9tXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisgIG1wcV9jbGVhciAocSk7CisgIG1wcV9jbGVhciAocik7CisgIG1wel9jbGVhciAoYnMpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgc3RydWN0IHBhaXJfdCAgbGVmdDsKKyAgICB1bnNpZ25lZCBsb25nICBuOworICAgIHN0cnVjdCBwYWlyX3QgIHJpZ2h0OworCisgIH0gZGF0YVtdID0geworICAgIHsgeyIwIiwiMSJ9LCAwLCB7IjAiLCIxIn0gfSwKKyAgICB7IHsiMCIsIjEifSwgMSwgeyIwIiwiMSJ9IH0sCisgICAgeyB7IjAiLCIxIn0sIDIsIHsiMCIsIjEifSB9LAorCisgICAgeyB7IjEiLCIxIn0sIDAsIHsiMSIsIjEifSB9LAorICAgIHsgeyIxIiwiMSJ9LCAxLCB7IjIiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgMiwgeyI0IiwiMSJ9IH0sCisgICAgeyB7IjEiLCIxIn0sIDMsIHsiOCIsIjEifSB9LAorCisgICAgeyB7IjEiLCIxIn0sIDMxLCB7IjB4ODAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgMzIsIHsiMHgxMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgMzMsIHsiMHgyMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgNjMsIHsiMHg4MDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIxIn0sIDY0LCB7IjB4MTAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgNjUsIHsiMHgyMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMSJ9LCA5NSwgeyIweDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMSJ9LCA5NiwgeyIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjEifSwgOTcsIHsiMHgyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIxIn0sIDEyNywgeyIweDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIxIn0sIDEyOCwgeyIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMSJ9LCAxMjksIHsiMHgyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKworICAgIHsgeyIxIiwiMiJ9LCAzMSwgeyIweDQwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIyIn0sIDMyLCB7IjB4ODAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjIifSwgMzMsIHsiMHgxMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjIifSwgNjMsIHsiMHg0MDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIyIn0sIDY0LCB7IjB4ODAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMiJ9LCA2NSwgeyIweDEwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIyIn0sIDk1LCB7IjB4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIyIn0sIDk2LCB7IjB4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIyIn0sIDk3LCB7IjB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMiJ9LCAxMjcsIHsiMHg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMiJ9LCAxMjgsIHsiMHg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMiJ9LCAxMjksIHsiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKworICAgIHsgeyIxIiwiMHg4MDAwMDAwMCJ9LCAzMCwgeyIxIiwiMiJ9IH0sCisgICAgeyB7IjEiLCIweDgwMDAwMDAwIn0sIDMxLCB7IjEiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgMzIsIHsiMiIsIjEifSB9LAorICAgIHsgeyIxIiwiMHg4MDAwMDAwMCJ9LCAzMywgeyI0IiwiMSJ9IH0sCisgICAgeyB7IjEiLCIweDgwMDAwMDAwIn0sIDYyLCB7IjB4ODAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgNjMsIHsiMHgxMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgNjQsIHsiMHgyMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgOTQsIHsiMHg4MDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisgICAgeyB7IjEiLCIweDgwMDAwMDAwIn0sIDk1LCB7IjB4MTAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgOTYsIHsiMHgyMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMHg4MDAwMDAwMCJ9LCAxMjYsIHsiMHg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIxIn0gfSwKKyAgICB7IHsiMSIsIjB4ODAwMDAwMDAifSwgMTI3LCB7IjB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEifSB9LAorICAgIHsgeyIxIiwiMHg4MDAwMDAwMCJ9LCAxMjgsIHsiMHgyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMSJ9IH0sCisKKyAgICB7IHsiMSIsIjB4MTAwMDAwMDAwIn0sIDEsIHsiMSIsIjB4ODAwMDAwMDAifSB9LAorICAgIHsgeyIxIiwiMHgxMDAwMDAwMDAifSwgMiwgeyIxIiwiMHg0MDAwMDAwMCJ9IH0sCisgICAgeyB7IjEiLCIweDEwMDAwMDAwMCJ9LCAzLCB7IjEiLCIweDIwMDAwMDAwIn0gfSwKKworICAgIHsgeyIxIiwiMHgxMDAwMDAwMDAwMDAwMDAwMCJ9LCAxLCB7IjEiLCIweDgwMDAwMDAwMDAwMDAwMDAifSB9LAorICAgIHsgeyIxIiwiMHgxMDAwMDAwMDAwMDAwMDAwMCJ9LCAyLCB7IjEiLCIweDQwMDAwMDAwMDAwMDAwMDAifSB9LAorICAgIHsgeyIxIiwiMHgxMDAwMDAwMDAwMDAwMDAwMCJ9LCAzLCB7IjEiLCIweDIwMDAwMDAwMDAwMDAwMDAifSB9LAorICB9OworCisgIHZvaWQgKCpmdW4pIChtcHFfcHRyLCBtcHFfc3JjcHRyLCB1bnNpZ25lZCBsb25nKTsKKyAgY29uc3Qgc3RydWN0IHBhaXJfdCAgKnBfc3RhcnQsICpwX3dhbnQ7CisgIGNvbnN0IGNoYXIgICpuYW1lOworICBtcHFfdCAgICBzZXAsIGdvdCwgd2FudDsKKyAgbXBxX3B0ciAgcTsKKyAgaW50ICAgICAgaSwgbXVsZGl2LCBzaWduLCBvdmVybGFwOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIG1wcV9pbml0IChzZXApOworICBtcHFfaW5pdCAoZ290KTsKKyAgbXBxX2luaXQgKHdhbnQpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBmb3IgKG11bGRpdiA9IDA7IG11bGRpdiA8IDI7IG11bGRpdisrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKG11bGRpdiA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmdW4gPSBtcHFfbXVsXzJleHA7CisgICAgICAgICAgICAgIG5hbWUgPSAibXBxX211bF8yZXhwIjsKKyAgICAgICAgICAgICAgcF9zdGFydCA9ICZkYXRhW2ldLmxlZnQ7CisgICAgICAgICAgICAgIHBfd2FudCA9ICZkYXRhW2ldLnJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnVuID0gbXBxX2Rpdl8yZXhwOworICAgICAgICAgICAgICBuYW1lID0gIm1wcV9kaXZfMmV4cCI7CisgICAgICAgICAgICAgIHBfc3RhcnQgPSAmZGF0YVtpXS5yaWdodDsKKyAgICAgICAgICAgICAgcF93YW50ID0gJmRhdGFbaV0ubGVmdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoc2lnbiA9IDA7IHNpZ24gPD0gMTsgc2lnbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobXBxX251bXJlZih3YW50KSwgcF93YW50LT5udW0sIDApOworICAgICAgICAgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobXBxX2RlbnJlZih3YW50KSwgcF93YW50LT5kZW4sIDApOworICAgICAgICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgICAgICBtcHFfbmVnICh3YW50LCB3YW50KTsKKworICAgICAgICAgICAgICBmb3IgKG92ZXJsYXAgPSAwOyBvdmVybGFwIDw9IDE7IG92ZXJsYXArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBxID0gb3ZlcmxhcCA/IGdvdCA6IHNlcDsKKworICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBnYXJiYWdlIGluICJnb3QiICovCisgICAgICAgICAgICAgICAgICBtcHFfc2V0X3VpIChnb3QsIDEyM0wsIDQ1NkwpOworCisgICAgICAgICAgICAgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobXBxX251bXJlZihxKSwgcF9zdGFydC0+bnVtLCAwKTsKKyAgICAgICAgICAgICAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChtcHFfZGVucmVmKHEpLCBwX3N0YXJ0LT5kZW4sIDApOworICAgICAgICAgICAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICAgICAgICAgIG1wcV9uZWcgKHEsIHEpOworCisgICAgICAgICAgICAgICAgICAoKmZ1bikgKGdvdCwgcSwgZGF0YVtpXS5uKTsKKyAgICAgICAgICAgICAgICAgIE1QUV9DSEVDS19GT1JNQVQgKGdvdCk7CisKKyAgICAgICAgICAgICAgICAgIGlmICghIG1wcV9lcXVhbCAoZ290LCB3YW50KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiVzIHdyb25nIGF0IGRhdGFbJWRdLCBzaWduICVkLCBvdmVybGFwICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaSwgc2lnbiwgb3ZlcmxhcCk7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICAgbnVtIFwiJXNcIlxuIiwgcF9zdGFydC0+bnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgICBkZW4gXCIlc1wiXG4iLCBwX3N0YXJ0LT5kZW4pOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgIG4gICAlbHVcbiIsIGRhdGFbaV0ubik7CisKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgICBnb3QgICIpOworICAgICAgICAgICAgICAgICAgICAgIG1wcV9vdXRfc3RyIChzdGRvdXQsIDE2LCBnb3QpOworICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAoaGV4KVxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgICB3YW50ICIpOworICAgICAgICAgICAgICAgICAgICAgIG1wcV9vdXRfc3RyIChzdGRvdXQsIDE2LCB3YW50KTsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgKGhleClcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgY2hlY2tfcmFuZG9tICgpOworCisgIG1wcV9jbGVhciAoc2VwKTsKKyAgbXBxX2NsZWFyIChnb3QpOworICBtcHFfY2xlYXIgKHdhbnQpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHEvdC1zZXRfZi5jIGIvdGVzdHMvbXBxL3Qtc2V0X2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJlM2FhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBxL3Qtc2V0X2YuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogVGVzdCBtcHFfc2V0X2YuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICBmX2Jhc2U7CisgICAgY29uc3QgY2hhciAgKmY7CisgICAgaW50ICAgICAgICAgel9iYXNlOworICAgIGNvbnN0IGNoYXIgICp3YW50X251bTsKKyAgICBjb25zdCBjaGFyICAqd2FudF9kZW47CisKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7IC0yLCAiMCIsICAgIDE2LCAiMCIsICIxIiB9LAorICAgIHsgLTIsICIxIiwgICAgMTYsICIxIiwgIjEiIH0sCisgICAgeyAtMiwgIjFAMSIsICAxNiwgIjIiLCAiMSIgfSwKKyAgICB7IC0yLCAiMUAyIiwgIDE2LCAiNCIsICIxIiB9LAorICAgIHsgLTIsICIxQDMiLCAgMTYsICI4IiwgIjEiIH0sCisKKyAgICB7IC0yLCAiMUAzMCIsIDE2LCAgIjQwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFAMzEiLCAxNiwgICI4MDAwMDAwMCIsICIxIiB9LAorICAgIHsgLTIsICIxQDMyIiwgMTYsICIxMDAwMDAwMDAiLCAiMSIgfSwKKyAgICB7IC0yLCAiMUAzMyIsIDE2LCAiMjAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFAMzQiLCAxNiwgIjQwMDAwMDAwMCIsICIxIiB9LAorCisgICAgeyAtMiwgIjFANjIiLCAxNiwgICI0MDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFANjMiLCAxNiwgICI4MDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFANjQiLCAxNiwgIjEwMDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFANjUiLCAxNiwgIjIwMDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFANjYiLCAxNiwgIjQwMDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisKKyAgICB7IC0yLCAiMUAxMjYiLCAxNiwgICI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIxIiB9LAorICAgIHsgLTIsICIxQDEyNyIsIDE2LCAgIjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisgICAgeyAtMiwgIjFAMTI4IiwgMTYsICIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMSIgfSwKKyAgICB7IC0yLCAiMUAxMjkiLCAxNiwgIjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIxIiB9LAorICAgIHsgLTIsICIxQDEzMCIsIDE2LCAiNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjEiIH0sCisKKyAgICB7IC0yLCAiMUAtMSIsICAxNiwgIjEiLCAiMiIgfSwKKyAgICB7IC0yLCAiMUAtMiIsICAxNiwgIjEiLCAiNCIgfSwKKyAgICB7IC0yLCAiMUAtMyIsICAxNiwgIjEiLCAiOCIgfSwKKworICAgIHsgLTIsICIxQC0zMCIsIDE2LCAiMSIsICAiNDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjFALTMxIiwgMTYsICIxIiwgICI4MDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMzIiLCAxNiwgIjEiLCAiMTAwMDAwMDAwIiB9LAorICAgIHsgLTIsICIxQC0zMyIsIDE2LCAiMSIsICIyMDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjFALTM0IiwgMTYsICIxIiwgIjQwMDAwMDAwMCIgfSwKKworICAgIHsgLTIsICIxQC02MiIsIDE2LCAiMSIsICAiNDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtNjMiLCAxNiwgIjEiLCAgIjgwMDAwMDAwMDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjFALTY0IiwgMTYsICIxIiwgIjEwMDAwMDAwMDAwMDAwMDAwIiB9LAorICAgIHsgLTIsICIxQC02NSIsIDE2LCAiMSIsICIyMDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtNjYiLCAxNiwgIjEiLCAiNDAwMDAwMDAwMDAwMDAwMDAiIH0sCisKKyAgICB7IC0yLCAiMUAtMTI2IiwgMTYsICIxIiwgICI0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMTI3IiwgMTYsICIxIiwgICI4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMTI4IiwgMTYsICIxIiwgIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMTI5IiwgMTYsICIxIiwgIjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMTMwIiwgMTYsICIxIiwgIjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIgfSwKKworICAgIHsgLTIsICIxQC0zMCIsIDE2LCAiMSIsICAiNDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjFALTMxIiwgMTYsICIxIiwgICI4MDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMUAtMzIiLCAxNiwgIjEiLCAiMTAwMDAwMDAwIiB9LAorICAgIHsgLTIsICIxQC0zMyIsIDE2LCAiMSIsICIyMDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjFALTM0IiwgMTYsICIxIiwgIjQwMDAwMDAwMCIgfSwKKworICAgIHsgLTIsICIxMUAtNjIiLCAxNiwgIjMiLCAgIjQwMDAwMDAwMDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjExQC02MyIsIDE2LCAiMyIsICAiODAwMDAwMDAwMDAwMDAwMCIgfSwKKyAgICB7IC0yLCAiMTFALTY0IiwgMTYsICIzIiwgIjEwMDAwMDAwMDAwMDAwMDAwIiB9LAorICAgIHsgLTIsICIxMUAtNjUiLCAxNiwgIjMiLCAiMjAwMDAwMDAwMDAwMDAwMDAiIH0sCisgICAgeyAtMiwgIjExQC02NiIsIDE2LCAiMyIsICI0MDAwMDAwMDAwMDAwMDAwMCIgfSwKKworICAgIHsgMTYsICI4MDAwMDAwMC4wMDAwMDAwMSIsIDE2LCAiODAwMDAwMDAwMDAwMDAwMSIsICIxMDAwMDAwMDAiIH0sCisgICAgeyAxNiwgIjgwMDAwMDAwLjAwMDAwMDA4IiwgMTYsICIxMDAwMDAwMDAwMDAwMDAxIiwgICIyMDAwMDAwMCIgfSwKKyAgICB7IDE2LCAiODAwMDAwMDAuOCIsICAgICAgICAxNiwgIjEwMDAwMDAwMSIsICIyIiB9LAorCisgIH07CisKKyAgbXBmX3QgIGY7CisgIG1wcV90ICBnb3Q7CisgIG1wel90ICB3YW50X251bSwgd2FudF9kZW47CisgIGludCAgICBpLCBuZWc7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgbXBmX2luaXQyIChmLCAxMDI0TCk7CisgIG1wcV9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudF9udW0pOworICBtcHpfaW5pdCAod2FudF9kZW4pOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBmb3IgKG5lZyA9IDA7IG5lZyA8PSAxOyBuZWcrKykKKyAgICAgICAgeworICAgICAgICAgIG1wZl9zZXRfc3RyX29yX2Fib3J0IChmLCBkYXRhW2ldLmYsIGRhdGFbaV0uZl9iYXNlKTsKKyAgICAgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAod2FudF9udW0sIGRhdGFbaV0ud2FudF9udW0sIGRhdGFbaV0uel9iYXNlKTsKKyAgICAgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAod2FudF9kZW4sIGRhdGFbaV0ud2FudF9kZW4sIGRhdGFbaV0uel9iYXNlKTsKKworICAgICAgICAgIGlmIChuZWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1wZl9uZWcgKGYsIGYpOworICAgICAgICAgICAgICBtcHpfbmVnICh3YW50X251bSwgd2FudF9udW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbXBxX3NldF9mIChnb3QsIGYpOworICAgICAgICAgIE1QUV9DSEVDS19GT1JNQVQgKGdvdCk7CisKKyAgICAgICAgICBpZiAobXB6X2NtcCAobXBxX251bXJlZihnb3QpLCB3YW50X251bSkgIT0gMAorICAgICAgICAgICAgICB8fCBtcHpfY21wIChtcHFfZGVucmVmKGdvdCksIHdhbnRfZGVuKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJ3cm9uZyBhdCBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgIGZfYmFzZSAlZCwgel9iYXNlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uZl9iYXNlLCBkYXRhW2ldLnpfYmFzZSk7CisKKyAgICAgICAgICAgICAgcHJpbnRmICgiICAgZiBcIiVzXCIgaGV4ICIsIGRhdGFbaV0uZik7CisgICAgICAgICAgICAgIG1wZl9vdXRfc3RyIChzdGRvdXQsIDE2LCAwLCBmKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiXG4iKTsKKworICAgICAgICAgICAgICBwcmludGYgKCIgICB3YW50IG51bSAweCIpOworICAgICAgICAgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgd2FudF9udW0pOworICAgICAgICAgICAgICBwcmludGYgKCJcbiIpOworICAgICAgICAgICAgICBwcmludGYgKCIgICB3YW50IGRlbiAweCIpOworICAgICAgICAgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgd2FudF9kZW4pOworICAgICAgICAgICAgICBwcmludGYgKCJcbiIpOworCisgICAgICAgICAgICAgIHByaW50ZiAoIiAgIGdvdCBudW0gMHgiKTsKKyAgICAgICAgICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIG1wcV9udW1yZWYoZ290KSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgIGdvdCBkZW4gMHgiKTsKKyAgICAgICAgICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIG1wcV9kZW5yZWYoZ290KSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisKKyAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbXBmX2NsZWFyIChmKTsKKyAgbXBxX2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnRfbnVtKTsKKyAgbXB6X2NsZWFyICh3YW50X2Rlbik7CisKKyAgdGVzdHNfZW5kICgpOworI2VuZGlmCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBxL3Qtc2V0X3N0ci5jIGIvdGVzdHMvbXBxL3Qtc2V0X3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWNhOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHEvdC1zZXRfc3RyLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIFRlc3QgbXBxX3NldF9zdHIuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfb25lIChtcHFfc3JjcHRyIHdhbnQsIGludCBiYXNlLCBjb25zdCBjaGFyICpzdHIpCit7CisgIG1wcV90ICAgZ290OworCisgIE1QUV9DSEVDS19GT1JNQVQgKHdhbnQpOworICBtcF90cmFjZV9iYXNlID0gYmFzZTsKKworICBtcHFfaW5pdCAoZ290KTsKKworICBpZiAobXBxX3NldF9zdHIgKGdvdCwgc3RyLCBiYXNlKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wcV9zZXRfc3RyIHVuZXhwZWN0ZWRseSBmYWlsZWRcbiIpOworICAgICAgcHJpbnRmICgiICBiYXNlICVkXG4iLCBiYXNlKTsKKyAgICAgIHByaW50ZiAoIiAgc3RyICBcIiVzXCJcbiIsIHN0cik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIE1QUV9DSEVDS19GT1JNQVQgKGdvdCk7CisKKyAgaWYgKCEgbXBxX2VxdWFsIChnb3QsIHdhbnQpKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wcV9zZXRfc3RyIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgYmFzZSAlZFxuIiwgYmFzZSk7CisgICAgICBwcmludGYgKCIgIHN0ciAgXCIlc1wiXG4iLCBzdHIpOworICAgICAgbXBxX3RyYWNlICgiZ290ICIsIGdvdCk7CisgICAgICBtcHFfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbXBxX2NsZWFyIChnb3QpOworfQorCit2b2lkCitjaGVja19zYW1wbGVzICh2b2lkKQoreworICBtcHFfdCAgcTsKKworICBtcHFfaW5pdCAocSk7CisKKyAgbXBxX3NldF91aSAocSwgMEwsIDFMKTsKKyAgY2hlY2tfb25lIChxLCAxMCwgIjAiKTsKKyAgY2hlY2tfb25lIChxLCAxMCwgIjAvMSIpOworICBjaGVja19vbmUgKHEsIDEwLCAiMCAgLyAxIik7CisgIGNoZWNrX29uZSAocSwgMCwgIjB4MC8gMSIpOworICBjaGVja19vbmUgKHEsIDAsICIweDAvIDB4MSIpOworICBjaGVja19vbmUgKHEsIDAsICIwIC8gMHgxIik7CisKKyAgY2hlY2tfb25lIChxLCAxMCwgIi0wIik7CisgIGNoZWNrX29uZSAocSwgMTAsICItMC8xIik7CisgIGNoZWNrX29uZSAocSwgMTAsICItMCAgLyAxIik7CisgIGNoZWNrX29uZSAocSwgMCwgIi0weDAvIDEiKTsKKyAgY2hlY2tfb25lIChxLCAwLCAiLTB4MC8gMHgxIik7CisgIGNoZWNrX29uZSAocSwgMCwgIi0wIC8gMHgxIik7CisKKyAgbXBxX3NldF91aSAocSwgMjU1TCwgMjU2TCk7CisgIGNoZWNrX29uZSAocSwgMTAsICIyNTUvMjU2Iik7CisgIGNoZWNrX29uZSAocSwgMCwgICIweEZGLzB4MTAwIik7CisgIGNoZWNrX29uZSAocSwgMTYsICJGRi8xMDAiKTsKKworICBtcHFfbmVnIChxLCBxKTsKKyAgY2hlY2tfb25lIChxLCAxMCwgIi0yNTUvMjU2Iik7CisgIGNoZWNrX29uZSAocSwgMCwgICItMHhGRi8weDEwMCIpOworICBjaGVja19vbmUgKHEsIDE2LCAiLUZGLzEwMCIpOworCisgIG1wcV9jbGVhciAocSk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfc2FtcGxlcyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L2NvbnZlcnQuYyBiL3Rlc3RzL21wei9jb252ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0OWM2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei9jb252ZXJ0LmMKQEAgLTAsMCArMSwxODYgQEAKKy8qIFRlc3QgY29udmVyc2lvbiB1c2luZyBtcHpfZ2V0X3N0ciBhbmQgbXB6X3NldF9zdHIuCisKK0NvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk5LTIwMDIsIDIwMDYsIDIwMDcsIDIwMjAgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogZm9yIHN0cmxlbiAqLworI2luY2x1ZGUgPGN0eXBlLmg+IC8qIGZvciB0b2xvd2VyICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCitzdGF0aWMgaW50IHN0cl9jYXNlY21wIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK3ZvaWQKK3N0cmluZ191cmFuZG9tYiAoY2hhciAqYnAsIHNpemVfdCBsZW4sIGludCBiYXNlLCBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcykKK3sKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpOworICBpbnQgZCwgbDsKKyAgY29uc3QgY2hhciAqY29sbHNlcSA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKyAgbXB6X2luaXQgKGJzKTsKKworICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisgIGQgPSBic2kgJSBiYXNlOworICB3aGlsZSAobGVuICE9IDApCisgICAgeworICAgICAgbCA9IChic2kgPj4gMTYpICUgMjA7CisgICAgICBsID0gTUlOIChsLCBsZW4pOworCisgICAgICBtZW1zZXQgKGJwLCBjb2xsc2VxW2RdLCBsKTsKKworICAgICAgbGVuIC09IGw7CisgICAgICBicCArPSBsOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgZCA9IGJzaSAmIDB4ZmZmOworICAgICAgaWYgKGQgPj0gYmFzZSkKKwlkID0gMDsKKyAgICB9CisKKyAgYnBbMF0gPSAnXDAnOworICBtcHpfY2xlYXIgKGJzKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IG9wMSwgb3AyOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gMjAwMDsKKyAgY2hhciAqc3RyLCAqYnVmLCAqYnA7CisgIGludCBiYXNlOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworICBzaXplX3QgbGVuOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKG9wMSk7CisgIG1wel9pbml0IChvcDIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgLyogMS4gR2VuZXJhdGUgcmFuZG9tIG1wel90IGFuZCBjb252ZXJ0IHRvIGEgc3RyaW5nIGFuZCBiYWNrIHRvIG1wel90CisJIGFnYWluLiAgKi8KKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTcgKyAyOwkvKiAyLi4xOCAqLworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOwkvKiAzLi4yNjIxNDQgYml0cyAqLworICAgICAgc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIG1wel9ycmFuZG9tYiAob3AxLCByYW5kcywgc2l6ZSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAxKTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChvcDEsIG9wMSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBiYXNlID0gYnNpICUgNjIgKyAxOworICAgICAgaWYgKGJhc2UgPT0gMSkKKwliYXNlID0gMDsKKworICAgICAgc3RyID0gbXB6X2dldF9zdHIgKChjaGFyICopIDAsIGJhc2UsIG9wMSk7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAob3AyLCBzdHIsIGJhc2UpOworCisgICAgICBpZiAobXB6X2NtcCAob3AxLCBvcDIpKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SLCBvcDEgYW5kIG9wMiBkaWZmZXJlbnQgaW4gdGVzdCAlZFxuIiwgaSk7CisJICBmcHJpbnRmIChzdGRlcnIsICJzdHIgID0gJXNcbiIsIHN0cik7CisJICBmcHJpbnRmIChzdGRlcnIsICJiYXNlID0gJWRcbiIsIGJhc2UpOworCSAgZnByaW50ZiAoc3RkZXJyLCAib3AxICA9ICIpOyBkZWJ1Z19tcCAob3AxLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAib3AyICA9ICIpOyBkZWJ1Z19tcCAob3AyLCAtMTYpOworCSAgYWJvcnQgKCk7CisJfQorCisgICAgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHN0ciwgc3RybGVuIChzdHIpICsgMSk7CisKKyAgICAgIC8qIDIuIEdlbmVyYXRlIHJhbmRvbSBzdHJpbmcgYW5kIGNvbnZlcnQgdG8gbXB6X3QgYW5kIGJhY2sgdG8gYSBzdHJpbmcKKwkgYWdhaW4uICAqLworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxNiArIDE7CS8qIDEuLjE2ICovCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CS8qIDEuLjY1NTM2IGRpZ2l0cyAqLworICAgICAgbGVuID0gbXB6X2dldF91aSAoYnMpICsgMTsKKyAgICAgIGJ1ZiA9IChjaGFyICopICgqX19nbXBfYWxsb2NhdGVfZnVuYykgKGxlbiArIDEpOworICAgICAgaWYgKGJhc2UgPT0gMCkKKwliYXNlID0gMTA7CisgICAgICBzdHJpbmdfdXJhbmRvbWIgKGJ1ZiwgbGVuLCBiYXNlLCByYW5kcyk7CisKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChvcDEsIGJ1ZiwgYmFzZSk7CisgICAgICBzdHIgPSBtcHpfZ2V0X3N0ciAoKGNoYXIgKikgMCwgYmFzZSwgb3AxKTsKKworICAgICAgLyogU2tpcCBvdmVyIGxlYWRpbmcgemVyb3MsIGJ1dCBkb24ndCBsZWF2ZSB0aGUgc3RyaW5nIGF0IHplcm8gbGVuZ3RoLiAqLworICAgICAgZm9yIChicCA9IGJ1ZjsgYnBbMF0gPT0gJzAnICYmIGJwWzFdICE9ICdcMCc7IGJwKyspCisJOworCisgICAgICBpZiAoc3RyX2Nhc2VjbXAgKHN0ciwgYnApICE9IDApCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IsIHN0ciBhbmQgYnVmIGRpZmZlcmVudCBpbiB0ZXN0ICVkXG4iLCBpKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgInN0ciAgPSAlc1xuIiwgc3RyKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgImJ1ZiAgPSAlc1xuIiwgYnVmKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgImJhc2UgPSAlZFxuIiwgYmFzZSk7CisJICBmcHJpbnRmIChzdGRlcnIsICJvcDEgID0gIik7IGRlYnVnX21wIChvcDEsIC0xNik7CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAoYnVmLCBsZW4gKyAxKTsKKyAgICAgICgqX19nbXBfZnJlZV9mdW5jKSAoc3RyLCBzdHJsZW4gKHN0cikgKyAxKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChicyk7CisgIG1wel9jbGVhciAob3AxKTsKKyAgbXB6X2NsZWFyIChvcDIpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKKy8qIFRoaXMgaXMgc2ltaWxhciB0byBQT1NJWCBzdHJjYXNlY21wIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGRvIHRoZSBjb21wYXJpc29uCisgICB3aXRoIHVuc2lnbmVkIGNoYXIuICBXZSBhdm9pZCBzdHJjYXNlY21wIGZvciBDIHN0YW5kYXJkIGNvbmZvcm1hbmNlLiAgKi8KK3N0YXRpYyBpbnQKK3N0cl9jYXNlY21wIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOzsgaSsrKQorICAgIHsKKyAgICAgIGludCBjMSA9IHMxW2ldOworICAgICAgaW50IGMyID0gczJbaV07CisgICAgICBpZiAoYzEgPT0gMCB8fCB0b2xvd2VyIChjMSkgIT0gdG9sb3dlciAoYzIpKQorCXJldHVybiBjMSAtIGMyOworICAgIH0KK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovZGl2ZS5jIGIvdGVzdHMvbXB6L2RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU4Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L2RpdmUuYwpAQCAtMCwwICsxLDEwMCBAQAorLyogVGVzdCBtcHpfbXVsLCBtcHpfZGl2ZXhhY3QuCisKK0NvcHlyaWdodCAxOTk2LCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IG9wMSwgb3AyOworICBtcHpfdCBwcm9kLCBxdW90OworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gNTAwMDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKG9wMSk7CisgIG1wel9pbml0IChvcDIpOworICBtcHpfaW5pdCAocHJvZCk7CisgIG1wel9pbml0IChxdW90KTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTcgKyAyOyAvKiAwLi4yMDQ3IGJpdCBvcGVyYW5kcyAqLworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBzaXplID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChvcDEsIHJhbmRzLCBzaXplKTsKKworICAgICAgZG8KKwl7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJICBzaXplID0gbXB6X2dldF91aSAoYnMpOworCSAgbXB6X3JyYW5kb21iIChvcDIsIHJhbmRzLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X3NnbiAob3AyKSA9PSAwKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKG9wMSwgb3AxKTsKKyAgICAgIGlmICgoYnNpICYgMikgIT0gMCkKKwltcHpfbmVnIChvcDIsIG9wMik7CisKKyAgICAgIG1wel9tdWwgKHByb2QsIG9wMSwgb3AyKTsKKworICAgICAgbXB6X2RpdmV4YWN0IChxdW90LCBwcm9kLCBvcDIpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocXVvdCk7CisKKyAgICAgIGlmIChtcHpfY21wIChxdW90LCBvcDEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJXcm9uZyByZXN1bHRzOlxuIik7CisgICAgICAgICAgbXB6X3RyYWNlICgiICBnb3QgICAgICIsIHF1b3QpOworICAgICAgICAgIG1wel90cmFjZSAoIiAgd2FudCAgICAiLCBvcDEpOworICAgICAgICAgIG1wel90cmFjZSAoIiAgZGl2aWRlbmQiLCBwcm9kKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgIGRpdmlzb3IgIiwgb3AyKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChvcDEpOworICBtcHpfY2xlYXIgKG9wMik7CisgIG1wel9jbGVhciAocHJvZCk7CisgIG1wel9jbGVhciAocXVvdCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei9kaXZlX3VpLmMgYi90ZXN0cy9tcHovZGl2ZV91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzRiY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovZGl2ZV91aS5jCkBAIC0wLDAgKzEsODYgQEAKKy8qIFRlc3QgbXB6X2RpdmV4YWN0X3VpLgorCitDb3B5cmlnaHQgMTk5NiwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBpbnQgICAgcmVwcyA9IDUwMDAwMDsKKyAgbXB6X3QgIGEsIHEsIGdvdDsKKyAgaW50ICAgIGksIHFuZWc7CisgIHVuc2lnbmVkIGxvbmcgIGQ7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICByZXBzID0gYXRvaSAoYXJndlsxXSk7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAocSk7CisgIG1wel9pbml0IChnb3QpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgZG8KKwlkID0gKHVuc2lnbmVkIGxvbmcpIHVyYW5kb20oKTsKKyAgICAgIHdoaWxlIChkID09IDApOworICAgICAgbXB6X2VyYW5kb21iIChxLCByYW5kcywgNTEyKTsKKyAgICAgIG1wel9tdWxfdWkgKGEsIHEsIGQpOworCisgICAgICBmb3IgKHFuZWcgPSAwOyBxbmVnIDw9IDE7IHFuZWcrKykKKyAgICAgICAgeworICAgICAgICAgIG1wel9kaXZleGFjdF91aSAoZ290LCBhLCBkKTsKKyAgICAgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICAgICAgICAgIGlmIChtcHpfY21wIChnb3QsIHEpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIm1wel9kaXZleGFjdF91aSB3cm9uZ1xuIik7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgICBhIiwgYSk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgICBkPSVsdVxuIiwgZCk7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgICBxIiwgcSk7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgZ290IiwgZ290KTsKKyAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBtcHpfbmVnIChxLCBxKTsKKyAgICAgICAgICBtcHpfbmVnIChhLCBhKTsKKyAgICAgICAgfQorCisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAocSk7CisgIG1wel9jbGVhciAoZ290KTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfcmFuZG9tIChhcmdjLCBhcmd2KTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L2lvLmMgYi90ZXN0cy9tcHovaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODYyOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L2lvLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIFRlc3QgY29udmVyc2lvbiBhbmQgSS9PIHVzaW5nIG1wel9vdXRfc3RyIGFuZCBtcHpfaW5wX3N0ci4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEsIDIwMTIsIDIwMjAgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciB1bmxpbmsgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjZGVmaW5lIEZJTEVOQU1FICAiL3RtcC9pby50bXAiCisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZG91dCwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRvdXQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgIG9wMSwgb3AyOworICBtcF9zaXplX3Qgc2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDA7CisgIEZJTEUgKmZwOworICBpbnQgYmFzZSwgYmFzZV9vdXQ7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisgIHNpemVfdCBucmVhZDsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworCisgIGlmIChhcmdjID09IDIpCisgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0IChvcDEpOworICBtcHpfaW5pdCAob3AyKTsKKworICBmcCA9IGZvcGVuIChGSUxFTkFNRSwgIncrIik7CisKKyAgaWYgKG1wel9vdXRfc3RyIChmcCwgNjMsIG9wMSkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfb3V0X3N0ciBkaWQgbm90IHJldHVybiAwIChlcnJvcikgd2l0aCBiYXNlID4gNjJcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGlmIChtcHpfb3V0X3N0ciAoZnAsIC0zNywgb3AxKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9vdXRfc3RyIGRpZCBub3QgcmV0dXJuIDAgKGVycm9yKSB3aXRoIGJhc2UgPCAtMzdcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMCArIDI7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIHNpemUgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMSwgcmFuZHMsIHNpemUpOworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDEpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKG9wMSwgb3AxKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDE2KTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGJhc2UgPSBic2kgJSA2MiArIDE7CisgICAgICBpZiAoYmFzZSA9PSAxKQorCWJhc2UgPSAwOworCisgICAgICBpZiAoaSAlIDIgPT0gMCAmJiBiYXNlIDw9IDM2KQorCWJhc2Vfb3V0ID0gLWJhc2U7CisgICAgICBlbHNlCisJYmFzZV9vdXQgPSBiYXNlOworCisgICAgICByZXdpbmQgKGZwKTsKKyAgICAgIGlmIChtcHpfb3V0X3N0ciAoZnAsIGJhc2Vfb3V0LCBvcDEpID09IDAKKwkgIHx8IHB1dGMgKCcgJywgZnApID09IEVPRgorCSAgfHwgZmZsdXNoIChmcCkgIT0gMCkKKwl7CisJICBwcmludGYgKCJtcHpfb3V0X3N0ciB3cml0ZSBlcnJvclxuIik7CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIHJld2luZCAoZnApOworICAgICAgbnJlYWQgPSBtcHpfaW5wX3N0ciAob3AyLCBmcCwgYmFzZSk7CisgICAgICBpZiAobnJlYWQgPT0gMCkKKwl7CisJICBpZiAoZmVycm9yIChmcCkpCisJICAgIHByaW50ZiAoIm1wel9pbnBfc3RyIHN0cmVhbSByZWFkIGVycm9yXG4iKTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgibXB6X2lucF9zdHIgZGF0YSBjb252ZXJzaW9uIGVycm9yXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKG5yZWFkICE9IGZ0ZWxsKGZwKSkKKwl7CisJICBwcmludGYgKCJtcHpfaW5wX3N0ciBucmVhZCBkb2Vzbid0IG1hdGNoIGZ0ZWxsXG4iKTsKKwkgIHByaW50ZiAoIiAgbnJlYWQgICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIG5yZWFkKTsKKwkgIHByaW50ZiAoIiAgZnRlbGwgICVsZFxuIiwgZnRlbGwoZnApKTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKG1wel9jbXAgKG9wMSwgb3AyKSkKKwl7CisJICBwcmludGYgKCJFUlJPUlxuIik7CisJICBwcmludGYgKCJvcDEgID0gIik7IGRlYnVnX21wIChvcDEsIC0xNik7CisJICBwcmludGYgKCJvcDIgID0gIik7IGRlYnVnX21wIChvcDIsIC0xNik7CisJICBwcmludGYgKCJiYXNlID0gJWRcbiIsIGJhc2UpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBmY2xvc2UgKGZwKTsKKworICB1bmxpbmsgKEZJTEVOQU1FKTsKKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChvcDEpOworICBtcHpfY2xlYXIgKG9wMik7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei9sb2dpYy5jIGIvdGVzdHMvbXB6L2xvZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMzhiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei9sb2dpYy5jCkBAIC0wLDAgKzEsMTk0IEBACisvKiBUZXN0IG1wel9jb20sIG1wel9hbmQsIG1wel9pb3IsIGFuZCBtcHpfeG9yLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMjAwMSwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZHVtcF9hYm9ydCAodm9pZCk7Cit2b2lkIGRlYnVnX21wIChtcHpfdCwgaW50KTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IHgsIHksIHIxLCByMjsKKyAgbXB6X3QgdDEsIHQyLCB0MzsKKyAgbXBfc2l6ZV90IHhzaXplLCB5c2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDAwOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0ICh4KTsKKyAgbXB6X2luaXQgKHkpOworICBtcHpfaW5pdCAocjEpOworICBtcHpfaW5pdCAocjIpOworICBtcHpfaW5pdCAodDEpOworICBtcHpfaW5pdCAodDIpOworICBtcHpfaW5pdCAodDMpOworCisgIG1wel9zZXRfc2kgKHgsIC0xKTsKKyAgbXB6X3NldF91aSAoeSwgMCk7CisgIGZvciAoaSA9IDA7IGkgPCAzMDA7IGkrKykKKyAgICB7CisgICAgICBtcHpfbXVsXzJleHAgKHgsIHgsIDEpOworCisgICAgICBtcHpfYW5kIChyMSwgeCwgeCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMSk7CisgICAgICBpZiAobXB6X2NtcCAocjEsIHgpICE9IDApCisJZHVtcF9hYm9ydCAoKTsKKworICAgICAgbXB6X2lvciAocjIsIHgsIHgpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjIpOworICAgICAgaWYgKG1wel9jbXAgKHIyLCB4KSAhPSAwKQorCWR1bXBfYWJvcnQgKCk7CisKKyAgICAgIG1wel94b3IgKHQxLCB4LCB4KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHQxKTsKKyAgICAgIGlmIChtcHpfY21wX3NpICh0MSwgMCkgIT0gMCkKKwlkdW1wX2Fib3J0ICgpOworCisgICAgICBtcHpfaW9yICh0MSwgeCwgeSk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0MSk7CisgICAgICBpZiAobXB6X2NtcCAodDEsIHgpICE9IDApCisJZHVtcF9hYm9ydCAoKTsKKworICAgICAgbXB6X3hvciAodDIsIHgsIHkpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAodDIpOworICAgICAgaWYgKG1wel9jbXAgKHQyLCB4KSAhPSAwKQorCWR1bXBfYWJvcnQgKCk7CisKKyAgICAgIG1wel9jb20gKHQyLCB4KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHQyKTsKKyAgICAgIG1wel94b3IgKHQzLCB0MiwgeCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0Myk7CisgICAgICBpZiAobXB6X2NtcF9zaSAodDMsIC0xKSAhPSAwKQorCWR1bXBfYWJvcnQgKCk7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSA4ICsgMjsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgeHNpemUgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKHgsIHJhbmRzLCB4c2l6ZSk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMSk7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBpZiAoKGJzaSAmIDEpICE9IDApCisJbXB6X25lZyAoeCwgeCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIHlzaXplID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iICh5LCByYW5kcywgeXNpemUpOworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDEpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKHksIHkpOworCisgICAgICBtcHpfY29tIChyMSwgeCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMSk7CisgICAgICBtcHpfY29tIChyMSwgcjEpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjEpOworICAgICAgaWYgKG1wel9jbXAgKHIxLCB4KSAhPSAwKQorCWR1bXBfYWJvcnQgKCk7CisKKyAgICAgIG1wel9jb20gKHIxLCB5KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIxKTsKKyAgICAgIG1wel9jb20gKHIyLCByMSk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMik7CisgICAgICBpZiAobXB6X2NtcCAocjIsIHkpICE9IDApCisJZHVtcF9hYm9ydCAoKTsKKworICAgICAgbXB6X2NvbSAodDEsIHgpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAodDEpOworICAgICAgbXB6X2NvbSAodDIsIHkpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAodDIpOworICAgICAgbXB6X2FuZCAodDMsIHQxLCB0Mik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0Myk7CisgICAgICBtcHpfY29tIChyMSwgdDMpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjEpOworICAgICAgbXB6X2lvciAocjIsIHgsIHkpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjIpOworICAgICAgaWYgKG1wel9jbXAgKHIxLCByMikgIT0gMCkKKwlkdW1wX2Fib3J0ICgpOworCisgICAgICBtcHpfY29tICh0MSwgeCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0MSk7CisgICAgICBtcHpfY29tICh0MiwgeSk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0Mik7CisgICAgICBtcHpfaW9yICh0MywgdDEsIHQyKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHQzKTsKKyAgICAgIG1wel9jb20gKHIxLCB0Myk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMSk7CisgICAgICBtcHpfYW5kIChyMiwgeCwgeSk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMik7CisgICAgICBpZiAobXB6X2NtcCAocjEsIHIyKSAhPSAwKQorCWR1bXBfYWJvcnQgKCk7CisKKyAgICAgIG1wel9pb3IgKHQxLCB4LCB5KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHQxKTsKKyAgICAgIG1wel9hbmQgKHQyLCB4LCB5KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHQyKTsKKyAgICAgIG1wel9jb20gKHQzLCB0Mik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0Myk7CisgICAgICBtcHpfYW5kIChyMSwgdDEsIHQzKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIxKTsKKyAgICAgIG1wel94b3IgKHIyLCB4LCB5KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIyKTsKKyAgICAgIGlmIChtcHpfY21wIChyMSwgcjIpICE9IDApCisJZHVtcF9hYm9ydCAoKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChicyk7CisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoeSk7CisgIG1wel9jbGVhciAocjEpOworICBtcHpfY2xlYXIgKHIyKTsKKyAgbXB6X2NsZWFyICh0MSk7CisgIG1wel9jbGVhciAodDIpOworICBtcHpfY2xlYXIgKHQzKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCit2b2lkCitkdW1wX2Fib3J0ICgpCit7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZGVyciwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3JldXNlLmMgYi90ZXN0cy9tcHovcmV1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGYyMjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3JldXNlLmMKQEAgLTAsMCArMSw3ODYgQEAKKy8qIFRlc3QgdGhhdCByb3V0aW5lcyBhbGxvdyByZXVzaW5nIGEgc291cmNlIHZhcmlhYmxlIGFzIGRlc3RpbmF0aW9uLgorCisgICBUZXN0IGFsbCByZWxldmFudCBmdW5jdGlvbnMgZXhjZXB0OgorCW1wel9iaW5fdWkKKwltcHpfbmV4dHByaW1lCisJbXB6X211bF9zaQorCW1wel9hZGRtdWxfdWkgKHNob3VsZCB0aGlzIHJlYWxseSBhbGxvdyBhKz1hKmM/KQorCitDb3B5cmlnaHQgMTk5NiwgMTk5OS0yMDAyLCAyMDA5LCAyMDEyLCAyMDEzLCAyMDE2LCAyMDIwIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZiBfX0dNUF9MSUJHTVBfRExMCisKKy8qIEZJWE1FOiBXaGVuIGxpbmtpbmcgdG8gYSBETEwgbGliZ21wLCBtcHpfYWRkIGV0YyBjYW4ndCBiZSB1c2VkIGFzCisgICBpbml0aWFsaXplcnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMgYmVjYXVzZSB0aGV5J3JlIGVmZmVjdGl2ZWx5IGdsb2JhbAorICAgdmFyaWFibGVzIChmdW5jdGlvbiBwb2ludGVycykgdGhlbXNlbHZlcy4gIFBlcmhhcHMgY2FsbGluZyBhIHRlc3QKKyAgIGZ1bmN0aW9uIHN1Y2Nlc3NpdmVseSB3aXRoIG1wel9hZGQgZXRjIHdvdWxkIGJlIGJldHRlci4gICovCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgcHJpbnRmICgiVGVzdCBzdXBwcmVzc2VkIGZvciB3aW5kb3dzIERMTFxuIik7CisgIGV4aXQgKDApOworfQorCisKKyNlbHNlIC8qICEgRExMX0VYUE9SVCAqLworCit2b2lkIGR1bXAgKGNvbnN0IGNoYXIgKiwgbXB6X3QsIG1wel90LCBtcHpfdCk7CisKK3R5cGVkZWYgdm9pZCAoKmRzc19mdW5jKSAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7Cit0eXBlZGVmIHZvaWQgKCpkc2lfZnVuYykgKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgKCpkc2lfZGl2X2Z1bmMpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCk7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50ICgqZGRzaV9kaXZfZnVuYykgKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KTsKK3R5cGVkZWYgdm9pZCAoKmRkc3NfZGl2X2Z1bmMpIChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKK3R5cGVkZWYgdm9pZCAoKmRzX2Z1bmMpIChtcHpfcHRyLCBtcHpfc3JjcHRyKTsKKworCit2b2lkCittcHpfeGludmVydCAobXB6X3B0ciByLCBtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYikKK3sKKyAgaW50IHJlczsKKyAgcmVzID0gbXB6X2ludmVydCAociwgYSwgYik7CisgIGlmIChyZXMgPT0gMCkKKyAgICBtcHpfc2V0X3VpIChyLCAwKTsKK30KKworc3RydWN0IHsKKyAgZHNzX2Z1bmMgZnB0cjsKKyAgY29uc3QgY2hhciAqZm5hbWU7CisgIGludCBpc2RpdmlzaW9uOworICBpbnQgaXNzbG93OworfSBzdGF0aWMgZHNzW10gPQorICB7IHsgbXB6X2FkZCwgICAgICJtcHpfYWRkIiwJICAwLCAwIH0sCisgICAgeyBtcHpfc3ViLCAgICAgIm1wel9zdWIiLAkgIDAsIDAgfSwKKyAgICB7IG1wel9tdWwsICAgICAibXB6X211bCIsCSAgMCwgMCB9LAorICAgIHsgbXB6X2NkaXZfcSwgICJtcHpfY2Rpdl9xIiwgIDEsIDAgfSwKKyAgICB7IG1wel9jZGl2X3IsICAibXB6X2NkaXZfciIsICAxLCAwIH0sCisgICAgeyBtcHpfZmRpdl9xLCAgIm1wel9mZGl2X3EiLCAgMSwgMCB9LAorICAgIHsgbXB6X2ZkaXZfciwgICJtcHpfZmRpdl9yIiwgIDEsIDAgfSwKKyAgICB7IG1wel90ZGl2X3EsICAibXB6X3RkaXZfcSIsICAxLCAwIH0sCisgICAgeyBtcHpfdGRpdl9yLCAgIm1wel90ZGl2X3IiLCAgMSwgMCB9LAorICAgIHsgbXB6X21vZCwgICAgICJtcHpfbW9kIiwJICAxLCAwIH0sCisgICAgeyBtcHpfeGludmVydCwgIm1wel94aW52ZXJ0IiwgMSwgMSB9LAorICAgIHsgbXB6X2djZCwgICAgICJtcHpfZ2NkIiwJICAwLCAxIH0sCisgICAgeyBtcHpfbGNtLCAgICAgIm1wel9sY20iLAkgIDAsIDEgfSwKKyAgICB7IG1wel9hbmQsICAgICAibXB6X2FuZCIsCSAgMCwgMCB9LAorICAgIHsgbXB6X2lvciwgICAgICJtcHpfaW9yIiwJICAwLCAwIH0sCisgICAgeyBtcHpfeG9yLCAgICAgIm1wel94b3IiLCAgICAgMCwgMCB9CisgIH07CisKKworc3RydWN0IHsKKyAgZHNpX2Z1bmMgZnB0cjsKKyAgY29uc3QgY2hhciAqZm5hbWU7CisgIGludCBtb2Q7Cit9IHN0YXRpYyBkc2lbXSA9Cit7CisgIC8qIERvbid0IGNoYW5nZSBvcmRlciBoZXJlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNvZGUgaW4gbWFpbigpLiAqLworICB7IG1wel9hZGRfdWksICAgICAgICAgIm1wel9hZGRfdWkiLAkgICAgIDAgfSwKKyAgeyBtcHpfbXVsX3VpLAkJIm1wel9tdWxfdWkiLAkgICAgIDAgfSwKKyAgeyBtcHpfc3ViX3VpLAkJIm1wel9zdWJfdWkiLAkgICAgIDAgfSwKKyAgeyBtcHpfZmRpdl9xXzJleHAsICAgICJtcHpfZmRpdl9xXzJleHAiLCAgIDB4MTAwMCB9LAorICB7IG1wel9mZGl2X3JfMmV4cCwgICAgIm1wel9mZGl2X3JfMmV4cCIsICAgMHgxMDAwIH0sCisgIHsgbXB6X2NkaXZfcV8yZXhwLCAgICAibXB6X2NkaXZfcV8yZXhwIiwgICAweDEwMDAgfSwKKyAgeyBtcHpfY2Rpdl9yXzJleHAsICAgICJtcHpfY2Rpdl9yXzJleHAiLCAgIDB4MTAwMCB9LAorICB7IG1wel90ZGl2X3FfMmV4cCwgICAgIm1wel90ZGl2X3FfMmV4cCIsICAgMHgxMDAwIH0sCisgIHsgbXB6X3RkaXZfcl8yZXhwLCAgICAibXB6X3RkaXZfcl8yZXhwIiwgICAweDEwMDAgfSwKKyAgeyBtcHpfbXVsXzJleHAsCSJtcHpfbXVsXzJleHAiLCAgICAgIDB4MTAwIH0sCisgIHsgbXB6X3Bvd191aSwJCSJtcHpfcG93X3VpIiwgICAgICAgIDB4MTAgfQorfTsKKworc3RydWN0IHsKKyAgZHNpX2Rpdl9mdW5jIGZwdHI7CisgIGNvbnN0IGNoYXIgKmZuYW1lOworfSBzdGF0aWMgZHNpX2RpdltdID0KK3sKKyAgeyBtcHpfY2Rpdl9xX3VpLCAgICAgICAibXB6X2NkaXZfcV91aSIgfSwKKyAgeyBtcHpfY2Rpdl9yX3VpLCAgICAgICAibXB6X2NkaXZfcl91aSIgfSwKKyAgeyBtcHpfZmRpdl9xX3VpLCAgICAgICAibXB6X2ZkaXZfcV91aSIgfSwKKyAgeyBtcHpfZmRpdl9yX3VpLCAgICAgICAibXB6X2ZkaXZfcl91aSIgfSwKKyAgeyBtcHpfdGRpdl9xX3VpLCAgICAgICAibXB6X3RkaXZfcV91aSIgfSwKKyAgeyBtcHpfdGRpdl9yX3VpLCAgICAgICAibXB6X3RkaXZfcl91aSIgfQorfTsKKworc3RydWN0IHsKKyAgZGRzaV9kaXZfZnVuYyBmcHRyOworICBjb25zdCBjaGFyICpmbmFtZTsKKyAgaW50IGlzc2xvdzsKK30gc3RhdGljIGRkc2lfZGl2W10gPQoreworICB7IG1wel9jZGl2X3FyX3VpLCAgICAgIm1wel9jZGl2X3FyX3VpIiwgICAgMCB9LAorICB7IG1wel9mZGl2X3FyX3VpLCAgICAgIm1wel9mZGl2X3FyX3VpIiwgICAgMCB9LAorICB7IG1wel90ZGl2X3FyX3VpLCAgICAgIm1wel90ZGl2X3FyX3VpIiwgICAgMCB9LAorfTsKKworCitzdHJ1Y3QgeworICBkZHNzX2Rpdl9mdW5jIGZwdHI7CisgIGNvbnN0IGNoYXIgKmZuYW1lOworICBpbnQgaXNzbG93OworfSBzdGF0aWMgZGRzc19kaXZbXSA9Cit7CisgIHsgbXB6X2NkaXZfcXIsICAibXB6X2NkaXZfcXIiLCAgICAwIH0sCisgIHsgbXB6X2ZkaXZfcXIsICAibXB6X2ZkaXZfcXIiLCAgICAwIH0sCisgIHsgbXB6X3RkaXZfcXIsICAibXB6X3RkaXZfcXIiLCAgICAwIH0sCit9OworCitzdHJ1Y3QgeworICBkc19mdW5jIGZwdHI7CisgIGNvbnN0IGNoYXIgKmZuYW1lOworICBpbnQgbm9ubmVnOworfSBzdGF0aWMgZHNbXSA9Cit7CisgIHsgbXB6X2FicywgICAgIm1wel9hYnMiLCAgICAwIH0sCisgIHsgbXB6X2NvbSwgICAgIm1wel9jb20iLCAgICAwIH0sCisgIHsgbXB6X25lZywgICAgIm1wel9uZWciLCAgICAwIH0sCisgIHsgbXB6X3NxcnQsICAgIm1wel9zcXJ0IiwgICAxIH0sCit9OworCisjZGVmaW5lIEZBSUwoY2xhc3MsaW5keCxvcDEsb3AyLG9wMykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBkdW1wIChjbGFzc1tpbmR4XS5mbmFtZSwgb3AxLCBvcDIsIG9wMyk7CQkJCVwKKyAgICBleGl0ICgxKTsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGQUlMMihmbmFtZSxvcDEsb3AyLG9wMykJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBkdW1wICgjZm5hbWUsIG9wMSwgb3AyLCBvcDMpOwkJCQkJXAorICAgIGV4aXQgKDEpOwkJCQkJCQkJXAorICB9IHdoaWxlICgwKQorCisKK3ZvaWQKK3JlYWxsb2NfaWZfcmVkdWNpbmcgKG1wel9wdHIgcikKK3sKKyAgaWYgKEFCU0laKHIpIDwgQUxMT0MocikpCisgICAgICBfbXB6X3JlYWxsb2MgKHIsIEFCU0laKHIpKTsKK30KKworI2RlZmluZSBJTlZPS0VfUlJTKGRlc2MscjEscjIsaTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgaWYgKHBhc3MgJiAxKSByZWFsbG9jX2lmX3JlZHVjaW5nIChyMSk7CQkJCVwKKyAgICBpZiAocGFzcyAmIDIpIHJlYWxsb2NfaWZfcmVkdWNpbmcgKHIyKTsJCQkJXAorICAgIChkZXNjKS5mcHRyIChyMSwgcjIsIGkxKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZGVmaW5lIElOVk9LRV9SUyhkZXNjLHIxLGkxKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAocGFzcyAmIDEpIHJlYWxsb2NfaWZfcmVkdWNpbmcgKHIxKTsJCQkJXAorICAgIChkZXNjKS5mcHRyIChyMSwgaTEpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSU5WT0tFX1JSU1MoZGVzYyxyMSxyMixpMSxpMikJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAocGFzcyAmIDEpIHJlYWxsb2NfaWZfcmVkdWNpbmcgKHIxKTsJCQkJXAorICAgIGlmIChwYXNzICYgMikgcmVhbGxvY19pZl9yZWR1Y2luZyAocjIpOwkJCQlcCisgICAgKGRlc2MpLmZwdHIgKHIxLCByMiwgaTEsIGkyKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSU5WT0tFX1JTUyhkZXNjLHIxLGkxLGkyKQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGlmIChwYXNzICYgMSkgcmVhbGxvY19pZl9yZWR1Y2luZyAocjEpOwkJCQlcCisgICAgKGRlc2MpLmZwdHIgKHIxLCBpMSwgaTIpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCBpOworICB1bnNpZ25lZCBpbnQgcGFzcywgcmVwcyA9IDQwMDsKKyAgbXB6X3QgaW4xLCBpbjIsIGluMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgaW4yaTsKKyAgbXB6X3QgcmVzMSwgcmVzMiwgcmVzMzsKKyAgbXB6X3QgcmVmMSwgcmVmMiwgcmVmMzsKKyAgbXB6X3QgdDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcjEsIHIyOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKGluMSk7CisgIG1wel9pbml0IChpbjIpOworICBtcHpfaW5pdCAoaW4zKTsKKyAgbXB6X2luaXQgKHJlZjEpOworICBtcHpfaW5pdCAocmVmMik7CisgIG1wel9pbml0IChyZWYzKTsKKyAgbXB6X2luaXQgKHJlczEpOworICBtcHpfaW5pdCAocmVzMik7CisgIG1wel9pbml0IChyZXMzKTsKKyAgbXB6X2luaXQgKHQpOworCisgIG1wel9zZXRfdWkgKHJlczEsIDEpOwkJLyogZm9yY2UgYWxsb2NhdGlvbiAqLworICBtcHpfc2V0X3VpIChyZXMyLCAxKTsJCS8qIGZvcmNlIGFsbG9jYXRpb24gKi8KKyAgbXB6X3NldF91aSAocmVzMywgMSk7CQkvKiBmb3JjZSBhbGxvY2F0aW9uICovCisKKyAgZm9yIChwYXNzID0gMTsgcGFzcyA8PSByZXBzOyBwYXNzKyspCisgICAgeworI2lmbmRlZiBWRVJCT1NFCisgICAgICBpZiAoaXNhdHR5IChTVERPVVRfRklMRU5PKSkKKwl7CisJICBwcmludGYgKCJcciVkLyVkIHBhc3NlcyIsIHBhc3MsIHJlcHMpOworCSAgZmZsdXNoIChzdGRvdXQpOworCX0KKyNlbmRpZgorCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgLyogTWFrZSBzaXplX3JhbmdlIGdyYWR1YWxseSBiaWdnZXIgd2l0aCBlYWNoIHBhc3MuICovCisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgKHBhc3MgKiAxNSAvIHJlcHMgKyAxKSArIDg7CisKKyNkZWZpbmUgTUFLRV9SQU5ET01fT1AoaW4sIHNpemVfcmFuZ2UsIHMpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CQkJCVwKKyAgICBpZiAoKChwYXNzID4+IHMpICYgMykgPT0gMykgLyogY29uZGl0aW9uYWwgZXhwb25lbnRpYWwgZGlzdCAqLwlcCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgbXB6X2dldF91aSAoYnMpICUgKHNpemVfcmFuZ2UgLSA3KSArIDcpOwlcCisgICAgbXB6X3JyYW5kb21iIChpbiwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSk7CQkJCVwKKyAgfSB3aGlsZSAoMCkKKworICAgICAgTUFLRV9SQU5ET01fT1AgKGluMSwgc2l6ZV9yYW5nZSwgMCk7CisgICAgICBNQUtFX1JBTkRPTV9PUCAoaW4yLCBzaXplX3JhbmdlLCAyKTsKKyAgICAgIE1BS0VfUkFORE9NX09QIChpbjMsIHNpemVfcmFuZ2UsIDQpOworI3VuZGVmIE1BS0VfUkFORE9NX09QCisKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiU5ZCU5ZCU4ZFxuIiwKKwkgICAgIG1wel9zaXplaW5iYXNlKGluMSwyKSwKKwkgICAgIG1wel9zaXplaW5iYXNlKGluMiwyKSwKKwkgICAgIG1wel9zaXplaW5iYXNlKGluMywyKSk7CisjZW5kaWYKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKGluMSwgaW4xKTsKKyAgICAgIGlmICgoYnNpICYgMikgIT0gMCkKKwltcHpfbmVnIChpbjIsIGluMik7CisgICAgICBpZiAoKGJzaSAmIDQpICE9IDApCisJbXB6X25lZyAoaW4zLCBpbjMpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRzcyk7IGkrKykKKwl7CisJICBpZiAoZHNzW2ldLmlzZGl2aXNpb24gJiYgbXB6X3NnbiAoaW4yKSA9PSAwKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChkc3NbaV0uaXNzbG93ICYmIHNpemVfcmFuZ2UgPiAxOSkKKwkgICAgY29udGludWU7CisKKwkgIChkc3NbaV0uZnB0cikgKHJlZjEsIGluMSwgaW4yKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlZjEpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgSU5WT0tFX1JTUyAoZHNzW2ldLCByZXMxLCByZXMxLCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTCAoZHNzLCBpLCBpbjEsIGluMiwgTlVMTCk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMik7CisJICBJTlZPS0VfUlNTIChkc3NbaV0sIHJlczEsIGluMSwgcmVzMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwKQorCSAgICBGQUlMIChkc3MsIGksIGluMSwgaW4yLCBOVUxMKTsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGRzc19kaXYpOyBpKyspCisJeworCSAgaWYgKG1wel9zZ24gKGluMikgPT0gMCkKKwkgICAgY29udGludWU7CisKKwkgIChkZHNzX2RpdltpXS5mcHRyKSAocmVmMSwgcmVmMiwgaW4xLCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYyKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgIG1wel9jbG9iYmVyIChyZXMyKTsKKwkgIElOVk9LRV9SUlNTIChkZHNzX2RpdltpXSwgcmVzMSwgcmVzMiwgcmVzMSwgaW4yKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMik7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQorCSAgICBGQUlMIChkZHNzX2RpdiwgaSwgaW4xLCBpbjIsIE5VTEwpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjEpOworCSAgSU5WT0tFX1JSU1MgKGRkc3NfZGl2W2ldLCByZXMxLCByZXMyLCByZXMyLCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMyKTsKKwkgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwIHx8IG1wel9jbXAgKHJlZjIsIHJlczIpICE9IDApCisJICAgIEZBSUwgKGRkc3NfZGl2LCBpLCBpbjEsIGluMiwgTlVMTCk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMik7CisJICBtcHpfY2xvYmJlciAocmVzMik7CisJICBJTlZPS0VfUlJTUyAoZGRzc19kaXZbaV0sIHJlczEsIHJlczIsIGluMSwgcmVzMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczIpOworCSAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDAgfHwgbXB6X2NtcCAocmVmMiwgcmVzMikgIT0gMCkKKwkgICAgRkFJTCAoZGRzc19kaXYsIGksIGluMSwgaW4yLCBOVUxMKTsKKworCSAgbXB6X2Nsb2JiZXIgKHJlczEpOworCSAgbXB6X3NldCAocmVzMiwgaW4yKTsKKwkgIElOVk9LRV9SUlNTIChkZHNzX2RpdltpXSwgcmVzMSwgcmVzMiwgaW4xLCByZXMyKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMik7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQorCSAgICBGQUlMIChkZHNzX2RpdiwgaSwgaW4xLCBpbjIsIE5VTEwpOworCX0KKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkcyk7IGkrKykKKwl7CisJICBpZiAoZHNbaV0ubm9ubmVnICYmIG1wel9zZ24gKGluMSkgPCAwKQorCSAgICBjb250aW51ZTsKKworCSAgKGRzW2ldLmZwdHIpIChyZWYxLCBpbjEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICBJTlZPS0VfUlMgKGRzW2ldLCByZXMxLCByZXMxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDApCisJICAgIEZBSUwgKGRzLCBpLCBpbjEsIGluMiwgTlVMTCk7CisJfQorCisgICAgICBpbjJpID0gbXB6X2dldF91aSAoaW4yKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkc2kpOyBpKyspCisJeworCSAgaWYgKGRzaVtpXS5tb2QgIT0gMCkKKwkgICAgaW4yaSA9IG1wel9nZXRfdWkgKGluMikgJSBkc2lbaV0ubW9kOworCisJICAoZHNpW2ldLmZwdHIpIChyZWYxLCBpbjEsIGluMmkpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICBJTlZPS0VfUlJTIChkc2lbaV0sIHJlczEsIHJlczEsIGluMmkpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTCAoZHNpLCBpLCBpbjEsIGluMiwgTlVMTCk7CisJfQorCisgICAgICBpZiAoaW4yaSAhPSAwKQkgIC8qIERvbid0IGRpdmlkZSBieSAwLiAgKi8KKwl7CisJICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRzaV9kaXYpOyBpKyspCisJICAgIHsKKwkgICAgICByMSA9IChkc2lfZGl2W2ldLmZwdHIpIChyZWYxLCBpbjEsIGluMmkpOworCSAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlZjEpOworCisJICAgICAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgICAgICByMiA9IChkc2lfZGl2W2ldLmZwdHIpIChyZXMxLCByZXMxLCBpbjJpKTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgICAgICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCByMSAhPSByMikKKwkJRkFJTCAoZHNpX2RpdiwgaSwgaW4xLCBpbjIsIE5VTEwpOworCSAgICB9CisKKwkgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGRzaV9kaXYpOyBpKyspCisJICAgIHsKKwkgICAgICByMSA9IChkZHNpX2RpdltpXS5mcHRyKSAocmVmMSwgcmVmMiwgaW4xLCBpbjJpKTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYxKTsKKworCSAgICAgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICAgICAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgICAgIHIyID0gKGRkc2lfZGl2W2ldLmZwdHIpIChyZXMxLCByZXMyLCByZXMxLCBpbjJpKTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgICAgICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwIHx8IHIxICE9IHIyKQorCQlGQUlMIChkZHNpX2RpdiwgaSwgaW4xLCBpbjIsIE5VTEwpOworCisJICAgICAgbXB6X2Nsb2JiZXIgKHJlczEpOworCSAgICAgIG1wel9zZXQgKHJlczIsIGluMSk7CisJICAgICAgKGRkc2lfZGl2W2ldLmZwdHIpIChyZXMxLCByZXMyLCByZXMyLCBpbjJpKTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgICAgICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwIHx8IHIxICE9IHIyKQorCQlGQUlMIChkZHNpX2RpdiwgaSwgaW4xLCBpbjIsIE5VTEwpOworCSAgICB9CisJfQorCisgICAgICBpZiAobXB6X3NnbiAoaW4xKSA+PSAwKQorCXsKKwkgIG1wel9zcXJ0cmVtIChyZWYxLCByZWYyLCBpbjEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYyKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgIG1wel9zcXJ0cmVtIChyZXMxLCByZXMyLCByZXMxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMik7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQorCSAgICBGQUlMMiAobXB6X3NxcnRyZW0sIGluMSwgTlVMTCwgTlVMTCk7CisKKwkgIG1wel9zZXQgKHJlczIsIGluMSk7CisJICBtcHpfc3FydHJlbSAocmVzMSwgcmVzMiwgcmVzMik7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczIpOworCSAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDAgfHwgbXB6X2NtcCAocmVmMiwgcmVzMikgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9zcXJ0cmVtLCBpbjEsIE5VTEwsIE5VTEwpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X3NxcnRyZW0gKHJlczEsIHJlczEsIHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMiwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9zcXJ0cmVtLCBpbjEsIE5VTEwsIE5VTEwpOworCX0KKworICAgICAgaWYgKG1wel9zZ24gKGluMSkgPj0gMCkKKwl7CisJICBtcHpfcm9vdCAocmVmMSwgaW4xLCBpbjJpICUgMHgxMDAgKyAxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlZjEpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X3Jvb3QgKHJlczEsIHJlczEsIGluMmkgJSAweDEwMCArIDEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9yb290LCBpbjEsIGluMiwgTlVMTCk7CisJfQorCisgICAgICBpZiAobXB6X3NnbiAoaW4xKSA+PSAwKQorCXsKKwkgIG1wel9yb290cmVtIChyZWYxLCByZWYyLCBpbjEsIGluMmkgJSAweDEwMCArIDEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYyKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgIG1wel9yb290cmVtIChyZXMxLCByZXMyLCByZXMxLCBpbjJpICUgMHgxMDAgKyAxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMik7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQorCSAgICBGQUlMMiAobXB6X3Jvb3RyZW0sIGluMSwgaW4yLCBOVUxMKTsKKworCSAgbXB6X3NldCAocmVzMiwgaW4xKTsKKwkgIG1wel9yb290cmVtIChyZXMxLCByZXMyLCByZXMyLCBpbjJpICUgMHgxMDAgKyAxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMik7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQorCSAgICBGQUlMMiAobXB6X3Jvb3RyZW0sIGluMSwgaW4yLCBOVUxMKTsKKwl9CisKKyAgICAgIGlmIChzaXplX3JhbmdlIDwgMTgpCS8qIHJ1biBmZXdlciB0ZXN0cyBzaW5jZSBnY2RleHQgaXMgc2xvdyAqLworCXsKKwkgIG1wel9nY2RleHQgKHJlZjEsIHJlZjIsIHJlZjMsIGluMSwgaW4yKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlZjEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMik7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYzKTsKKworI2RlZmluZSBHQ0RFWFRfQ0hFQ0szKGkxLCBpMikgZG8gewkJCQkJXAorCSAgICBtcHpfZ2NkZXh0IChyZXMxLCByZXMyLCByZXMzLCBpMSwgaTIpOwkJCVwKKwkgICAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CQkJCQlcCisJICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlczIpOwkJCQkJXAorCSAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMzKTsJCQkJCVwKKwkgICAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDAgfHwgbXB6X2NtcCAocmVmMiwgcmVzMikgIT0gMAlcCisJCXx8IG1wel9jbXAgKHJlZjMsIHJlczMpICE9IDApCQkJCVwKKwkgICAgICBGQUlMMiAobXB6X2djZGV4dCwgaTEsIGkyLCBOVUxMKTsJCQkJXAorCSAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgR0NERVhUX0NIRUNLMihpMSwgaTIpIGRvIHsJCQkJCVwKKwkgICAgbXB6X2djZGV4dCAocmVzMSwgcmVzMiwgTlVMTCwgaTEsIGkyKTsJCQlcCisJICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOwkJCQkJXAorCSAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMyKTsJCQkJCVwKKwkgICAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDAgfHwgbXB6X2NtcCAocmVmMiwgcmVzMikgIT0gMCkJXAorCSAgICAgIEZBSUwyIChtcHpfZ2NkZXh0LCBpMSwgaTIsIE5VTEwpOwkJCQlcCisJICB9IHdoaWxlICgwKQorCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgbXB6X2Nsb2JiZXIgKHJlczMpOworCSAgR0NERVhUX0NIRUNLMyAocmVzMSwgaW4yKTsKKworCSAgbXB6X2Nsb2JiZXIgKHJlczEpOworCSAgbXB6X3NldCAocmVzMiwgaW4xKTsKKwkgIG1wel9jbG9iYmVyIChyZXMzKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczIsIGluMik7CisKKwkgIG1wel9jbG9iYmVyIChyZXMxKTsKKwkgIG1wel9jbG9iYmVyIChyZXMyKTsKKwkgIG1wel9zZXQgKHJlczMsIGluMSk7CisJICBHQ0RFWFRfQ0hFQ0szIChyZXMzLCBpbjIpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjIpOworCSAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgbXB6X2Nsb2JiZXIgKHJlczMpOworCSAgR0NERVhUX0NIRUNLMyAoaW4xLCByZXMxKTsKKworCSAgbXB6X2Nsb2JiZXIgKHJlczEpOworCSAgbXB6X3NldCAocmVzMiwgaW4yKTsKKwkgIG1wel9jbG9iYmVyIChyZXMzKTsKKwkgIEdDREVYVF9DSEVDSzMgKGluMSwgcmVzMik7CisKKwkgIG1wel9jbG9iYmVyIChyZXMxKTsKKwkgIG1wel9jbG9iYmVyIChyZXMyKTsKKwkgIG1wel9zZXQgKHJlczMsIGluMik7CisJICBHQ0RFWFRfQ0hFQ0szIChpbjEsIHJlczMpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X3NldCAocmVzMiwgaW4yKTsKKwkgIG1wel9jbG9iYmVyIChyZXMzKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczEsIHJlczIpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgbXB6X3NldCAocmVzMywgaW4yKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczEsIHJlczMpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjEpOworCSAgbXB6X3NldCAocmVzMywgaW4yKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczIsIHJlczMpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjIpOworCSAgbXB6X3NldCAocmVzMiwgaW4xKTsKKwkgIG1wel9jbG9iYmVyIChyZXMzKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczIsIHJlczEpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjIpOworCSAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgbXB6X3NldCAocmVzMywgaW4xKTsKKwkgIEdDREVYVF9DSEVDSzMgKHJlczMsIHJlczEpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjIpOworCSAgbXB6X3NldCAocmVzMywgaW4xKTsKKwkgIEdDREVYVF9DSEVDSzMocmVzMywgcmVzMik7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICBtcHpfY2xvYmJlciAocmVzMik7CisJICBHQ0RFWFRfQ0hFQ0syIChyZXMxLCBpbjIpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjEpOworCSAgR0NERVhUX0NIRUNLMiAocmVzMiwgaW4yKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4yKTsKKwkgIG1wel9jbG9iYmVyIChyZXMyKTsKKwkgIEdDREVYVF9DSEVDSzIgKGluMSwgcmVzMSk7CisKKwkgIG1wel9jbG9iYmVyIChyZXMxKTsKKwkgIG1wel9zZXQgKHJlczIsIGluMik7CisJICBHQ0RFWFRfQ0hFQ0syIChpbjEsIHJlczIpOworI3VuZGVmIEdDREVYVF9DSEVDSworCSAgLyogSWRlbnRpY2FsIGlucHV0cywgZ2NkKGluMSwgaW4xKS4gVGhlbiB0aGUgcmVzdWx0IHNob3VsZCBiZQorCSAgICAgZ2NkID0gYWJzKGluMSksIHMgPSAwLCB0ID0gc2duKGluMSkuICovCisJICBtcHpfYWJzIChyZWYxLCBpbjEpOworCSAgbXB6X3NldF91aSAocmVmMiwgMCk7CisJICBtcHpfc2V0X3NpIChyZWYzLCBtcHpfc2duIChpbjEpKTsKKworI2RlZmluZSBHQ0RFWFRfQ0hFQ0tfU0FNRTMoaW4pIGRvIHsJCQkJCVwKKwkgICAgbXB6X2djZGV4dCAocmVzMSwgcmVzMiwgcmVzMywgaW4sIGluKTsJCQlcCisJICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOwkJCQkJXAorCSAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMyKTsJCQkJCVwKKwkgICAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMyk7CQkJCQlcCisJICAgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwIHx8IG1wel9jbXAgKHJlZjIsIHJlczIpICE9IDAJXAorCQl8fCBtcHpfY21wIChyZWYzLCByZXMzKSAhPSAwKQkJCQlcCisJICAgICAgRkFJTDIgKG1wel9nY2RleHQsIGluLCBpbiwgTlVMTCk7CQkJCVwKKwkgIH0gd2hpbGUgKDApCisjZGVmaW5lIEdDREVYVF9DSEVDS19TQU1FMihpbikgZG8gewkJCQkJXAorCSAgICBtcHpfZ2NkZXh0IChyZXMxLCByZXMyLCBOVUxMLCBpbiwgaW4pOwkJCVwKKwkgICAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CQkJCQlcCisJICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlczIpOwkJCQkJXAorCSAgICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCBtcHpfY21wIChyZWYyLCByZXMyKSAhPSAwKQlcCisJICAgICAgRkFJTDIgKG1wel9nY2RleHQsIGluLCBpbiwgTlVMTCk7CQkJCVwKKwkgIH0gd2hpbGUgKDApCisKKwkgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICBtcHpfY2xvYmJlciAocmVzMik7CisJICBtcHpfY2xvYmJlciAocmVzMyk7CisJICBHQ0RFWFRfQ0hFQ0tfU0FNRTMgKHJlczEpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjEpOworCSAgbXB6X2Nsb2JiZXIgKHJlczMpOworCSAgR0NERVhUX0NIRUNLX1NBTUUzIChyZXMyKTsKKworCSAgbXB6X2Nsb2JiZXIgKHJlczEpOworCSAgbXB6X2Nsb2JiZXIgKHJlczIpOworCSAgbXB6X3NldCAocmVzMywgaW4xKTsKKwkgIEdDREVYVF9DSEVDS19TQU1FMyAocmVzMyk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMSk7CisJICBtcHpfY2xvYmJlciAocmVzMik7CisJICBtcHpfY2xvYmJlciAocmVzMyk7CisJICBHQ0RFWFRfQ0hFQ0tfU0FNRTIgKHJlczEpOworCisJICBtcHpfY2xvYmJlciAocmVzMSk7CisJICBtcHpfc2V0IChyZXMyLCBpbjEpOworCSAgbXB6X2Nsb2JiZXIgKHJlczMpOworCSAgR0NERVhUX0NIRUNLX1NBTUUyIChyZXMyKTsKKyN1bmRlZiBHQ0RFWFRfQ0hFQ0tfU0FNRQorCX0KKworICAgICAgLyogRG9uJ3QgcnVuIG1wel9wb3dtIGZvciBodWdlIGV4cG9uZW50cyBvciB3aGVuIHVuZGVmaW5lZC4gICovCisgICAgICBpZiAoc2l6ZV9yYW5nZSA8IDE3ICYmIG1wel9zaXplaW5iYXNlIChpbjIsIDIpIDwgMjUwICYmIG1wel9zZ24gKGluMykgIT0gMAorCSAgJiYgKG1wel9zZ24gKGluMikgPj0gMCB8fCBtcHpfaW52ZXJ0ICh0LCBpbjEsIGluMykpKQorCXsKKwkgIG1wel9wb3dtIChyZWYxLCBpbjEsIGluMiwgaW4zKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlZjEpOworCisJICBtcHpfc2V0IChyZXMxLCBpbjEpOworCSAgbXB6X3Bvd20gKHJlczEsIHJlczEsIGluMiwgaW4zKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDApCisJICAgIEZBSUwyIChtcHpfcG93bSwgaW4xLCBpbjIsIGluMyk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMik7CisJICBtcHpfcG93bSAocmVzMSwgaW4xLCByZXMxLCBpbjMpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9wb3dtLCBpbjEsIGluMiwgaW4zKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4zKTsKKwkgIG1wel9wb3dtIChyZXMxLCBpbjEsIGluMiwgcmVzMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwKQorCSAgICBGQUlMMiAobXB6X3Bvd20sIGluMSwgaW4yLCBpbjMpOworCX0KKworICAgICAgLyogRG9uJ3QgcnVuIG1wel9wb3dtX3VpIHdoZW4gdW5kZWZpbmVkLiAgKi8KKyAgICAgIGlmIChzaXplX3JhbmdlIDwgMTcgJiYgbXB6X3NnbiAoaW4zKSAhPSAwKQorCXsKKwkgIG1wel9wb3dtX3VpIChyZWYxLCBpbjEsIGluMmksIGluMyk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYxKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgIG1wel9wb3dtX3VpIChyZXMxLCByZXMxLCBpbjJpLCBpbjMpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9wb3dtX3VpLCBpbjEsIGluMiwgaW4zKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4zKTsKKwkgIG1wel9wb3dtX3VpIChyZXMxLCBpbjEsIGluMmksIHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9wb3dtX3VpLCBpbjEsIGluMiwgaW4zKTsKKwl9CisKKyAgICAgIHsKKwlyMSA9IG1wel9nY2RfdWkgKHJlZjEsIGluMSwgaW4yaSk7CisJTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisKKwltcHpfc2V0IChyZXMxLCBpbjEpOworCXIyID0gbXB6X2djZF91aSAocmVzMSwgcmVzMSwgaW4yaSk7CisJTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDApCisJICBGQUlMMiAobXB6X2djZF91aSwgaW4xLCBpbjIsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAobXB6X3NnbiAoaW4yKSAhPSAwKQorCXsKKwkgIC8qIFRlc3QgbXB6X3JlbW92ZSAqLworCSAgbXBfYml0Y250X3QgcmVmcmV0dmFsLCByZXR2YWw7CisJICByZWZyZXR2YWwgPSBtcHpfcmVtb3ZlIChyZWYxLCBpbjEsIGluMik7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYxKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4xKTsKKwkgIHJldHZhbCA9IG1wel9yZW1vdmUgKHJlczEsIHJlczEsIGluMik7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwIHx8IHJlZnJldHZhbCAhPSByZXR2YWwpCisJICAgIEZBSUwyIChtcHpfcmVtb3ZlLCBpbjEsIGluMiwgTlVMTCk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMik7CisJICByZXR2YWwgPSBtcHpfcmVtb3ZlIChyZXMxLCBpbjEsIHJlczEpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCB8fCByZWZyZXR2YWwgIT0gcmV0dmFsKQorCSAgICBGQUlMMiAobXB6X3JlbW92ZSwgaW4xLCBpbjIsIE5VTEwpOworCX0KKworICAgICAgaWYgKG1wel9zZ24gKGluMikgIT0gMCkKKwl7CisJICAvKiBUZXN0IG1wel9kaXZleGFjdCAqLworCSAgbXB6X211bCAodCwgaW4xLCBpbjIpOworCSAgbXB6X2RpdmV4YWN0IChyZWYxLCB0LCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVmMSk7CisKKwkgIG1wel9zZXQgKHJlczEsIHQpOworCSAgbXB6X2RpdmV4YWN0IChyZXMxLCByZXMxLCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9kaXZleGFjdCwgdCwgaW4yLCBOVUxMKTsKKworCSAgbXB6X3NldCAocmVzMSwgaW4yKTsKKwkgIG1wel9kaXZleGFjdCAocmVzMSwgdCwgcmVzMSk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZXMxKTsKKwkgIGlmIChtcHpfY21wIChyZWYxLCByZXMxKSAhPSAwKQorCSAgICBGQUlMMiAobXB6X2RpdmV4YWN0LCB0LCBpbjIsIE5VTEwpOworCX0KKworICAgICAgaWYgKG1wel9zZ24gKGluMikgPiAwKQorCXsKKwkgIC8qIFRlc3QgbXB6X2RpdmV4YWN0X2djZCwgc2FtZSBhcyBtcHpfZGl2ZXhhY3QgKi8KKwkgIG1wel9tdWwgKHQsIGluMSwgaW4yKTsKKwkgIG1wel9kaXZleGFjdF9nY2QgKHJlZjEsIHQsIGluMik7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYxKTsKKworCSAgbXB6X3NldCAocmVzMSwgdCk7CisJICBtcHpfZGl2ZXhhY3RfZ2NkIChyZXMxLCByZXMxLCBpbjIpOworCSAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzMSk7CisJICBpZiAobXB6X2NtcCAocmVmMSwgcmVzMSkgIT0gMCkKKwkgICAgRkFJTDIgKG1wel9kaXZleGFjdF9nY2QsIHQsIGluMiwgTlVMTCk7CisKKwkgIG1wel9zZXQgKHJlczEsIGluMik7CisJICBtcHpfZGl2ZXhhY3RfZ2NkIChyZXMxLCB0LCByZXMxKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHJlczEpOworCSAgaWYgKG1wel9jbXAgKHJlZjEsIHJlczEpICE9IDApCisJICAgIEZBSUwyIChtcHpfZGl2ZXhhY3RfZ2NkLCB0LCBpbjIsIE5VTEwpOworCX0KKyAgICB9CisKKyAgaWYgKGlzYXR0eSAoU1RET1VUX0ZJTEVOTykpCisgICAgcHJpbnRmICgiXHIlMjBzIiwgIiIpOworCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKGluMSk7CisgIG1wel9jbGVhciAoaW4yKTsKKyAgbXB6X2NsZWFyIChpbjMpOworICBtcHpfY2xlYXIgKHJlZjEpOworICBtcHpfY2xlYXIgKHJlZjIpOworICBtcHpfY2xlYXIgKHJlZjMpOworICBtcHpfY2xlYXIgKHJlczEpOworICBtcHpfY2xlYXIgKHJlczIpOworICBtcHpfY2xlYXIgKHJlczMpOworICBtcHpfY2xlYXIgKHQpOworCisgIGlmIChpc2F0dHkgKFNURE9VVF9GSUxFTk8pKQorICAgIHByaW50ZiAoIlxyIik7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZHVtcCAoY29uc3QgY2hhciAqbmFtZSwgbXB6X3QgaW4xLCBtcHpfdCBpbjIsIG1wel90IGluMykKK3sKKyAgcHJpbnRmICgiZmFpbHVyZSBpbiAlcyAoIiwgbmFtZSk7CisgIG1wel9vdXRfc3RyIChzdGRvdXQsIC0xNiwgaW4xKTsKKyAgaWYgKGluMiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIC0xNiwgaW4yKTsKKyAgICB9CisgIGlmIChpbjMgIT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCIgIik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIGluMyk7CisgICAgfQorICBwcmludGYgKCIpXG4iKTsKK30KKworI2VuZGlmIC8qICEgRExMX0VYUE9SVCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtYWRkc3ViLmMgYi90ZXN0cy9tcHovdC1hZGRzdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEzMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtYWRkc3ViLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIFRlc3QgbXB6X2FkZCwgbXB6X3N1YiwgbXB6X2FkZF91aSwgbXB6X3N1Yl91aSwgYW5kIG1wel91aV9zdWIuCisKK0NvcHlyaWdodCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGRlYnVnX21wIChtcHpfdCwgaW50KTsKK3ZvaWQgZHVtcF9hYm9ydCAoaW50LCBjb25zdCBjaGFyICosIG1wel90LCBtcHpfdCk7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBvcDEsIG9wMiwgcjEsIHIyOworICBtcF9zaXplX3Qgb3Axbiwgb3AybjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgb3AybG9uZzsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDAwOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0IChvcDEpOworICBtcHpfaW5pdCAob3AyKTsKKyAgbXB6X2luaXQgKHIxKTsKKyAgbXB6X2luaXQgKHIyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTAgKyAyOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBvcDFuID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChvcDEsIHJhbmRzLCBvcDFuKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgb3AybiA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIG1wel9ycmFuZG9tYiAob3AyLCByYW5kcywgb3Aybik7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAyKTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChvcDEsIG9wMSk7CisgICAgICBpZiAoKGJzaSAmIDIpICE9IDApCisJbXB6X25lZyAob3AyLCBvcDIpOworCisgICAgICAvKiBwcmludGYgKCIlbGQgJWxkXG4iLCBTSVogKG11bHRpcGxpZXIpLCBTSVogKG11bHRpcGxpY2FuZCkpOyAqLworCisgICAgICBtcHpfYWRkIChyMSwgb3AxLCBvcDIpOworICAgICAgbXB6X3N1YiAocjIsIHIxLCBvcDIpOworICAgICAgaWYgKG1wel9jbXAgKHIyLCBvcDEpICE9IDApCisJZHVtcF9hYm9ydCAoaSwgIm1wel9hZGQgb3IgbXB6X3N1YiBpbmNvcnJlY3QiLCBvcDEsIG9wMik7CisKKyAgICAgIGlmIChtcHpfZml0c191bG9uZ19wIChvcDIpKQorCXsKKwkgIG9wMmxvbmcgPSBtcHpfZ2V0X3VpIChvcDIpOworCSAgbXB6X2FkZF91aSAocjEsIG9wMSwgb3AybG9uZyk7CisJICBtcHpfc3ViX3VpIChyMiwgcjEsIG9wMmxvbmcpOworCSAgaWYgKG1wel9jbXAgKHIyLCBvcDEpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGksICJtcHpfYWRkX3VpIG9yIG1wel9zdWJfdWkgaW5jb3JyZWN0Iiwgb3AxLCBvcDIpOworCisJICBtcHpfdWlfc3ViIChyMSwgb3AybG9uZywgb3AxKTsKKwkgIG1wel9zdWJfdWkgKHIyLCBvcDEsIG9wMmxvbmcpOworCSAgbXB6X25lZyAocjIsIHIyKTsKKwkgIGlmIChtcHpfY21wIChyMSwgcjIpICE9IDApCisJICAgIGR1bXBfYWJvcnQgKGksICJtcHpfYWRkX3VpIG9yIG1wel91aV9zdWIgaW5jb3JyZWN0Iiwgb3AxLCBvcDIpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChicyk7CisgIG1wel9jbGVhciAob3AxKTsKKyAgbXB6X2NsZWFyIChvcDIpOworICBtcHpfY2xlYXIgKHIxKTsKKyAgbXB6X2NsZWFyIChyMik7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZHVtcF9hYm9ydCAoaW50IGksIGNvbnN0IGNoYXIgKnMsIG1wel90IG9wMSwgbXB6X3Qgb3AyKQoreworICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogJXMgaW4gdGVzdCAlZFxuIiwgcywgaSk7CisgIGZwcmludGYgKHN0ZGVyciwgIm9wMSA9ICIpOyBkZWJ1Z19tcCAob3AxLCAtMTYpOworICBmcHJpbnRmIChzdGRlcnIsICJvcDIgPSAiKTsgZGVidWdfbXAgKG9wMiwgLTE2KTsKKyAgYWJvcnQoKTsKK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1hb3JzbXVsLmMgYi90ZXN0cy9tcHovdC1hb3JzbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNDM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWFvcnNtdWwuYwpAQCAtMCwwICsxLDQ2NCBAQAorLyogVGVzdCBtcHpfYWRkbXVsLCBtcHpfYWRkbXVsX3VpLCBtcHpfc3VibXVsLCBtcHpfc3VibXVsX3VpLgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisjZGVmaW5lIE0gR01QX05VTUJfTUFYCisKKwordm9pZAorY2hlY2tfb25lX2lucGxhY2UgKG1wel9zcmNwdHIgdywgbXB6X3NyY3B0ciB5KQoreworICBtcHpfdCAgd2FudCwgZ290OworCisgIG1wel9pbml0ICh3YW50KTsKKyAgbXB6X2luaXQgKGdvdCk7CisKKyAgbXB6X211bCAod2FudCwgdywgeSk7CisgIG1wel9hZGQgKHdhbnQsIHcsIHdhbnQpOworICBtcHpfc2V0IChnb3QsIHcpOworICBtcHpfYWRkbXVsIChnb3QsIGdvdCwgeSk7CisgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisgIGlmIChtcHpfY21wICh3YW50LCBnb3QpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2FkZG11bCBpbnBsYWNlIGZhaWxcbiIpOworICAgIGZhaWw6CisgICAgICBtcHpfdHJhY2UgKCJ3Iiwgdyk7CisgICAgICBtcHpfdHJhY2UgKCJ5IiwgeSk7CisgICAgICBtcHpfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisgICAgICBtcHpfdHJhY2UgKCJnb3QgIiwgZ290KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBtcHpfbXVsICh3YW50LCB3LCB5KTsKKyAgbXB6X3N1YiAod2FudCwgdywgd2FudCk7CisgIG1wel9zZXQgKGdvdCwgdyk7CisgIG1wel9zdWJtdWwgKGdvdCwgZ290LCB5KTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgaWYgKG1wel9jbXAgKHdhbnQsIGdvdCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfc3VibXVsIGlucGxhY2UgZmFpbFxuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIG1wel9jbGVhciAod2FudCk7CisgIG1wel9jbGVhciAoZ290KTsKK30KKwordm9pZAorY2hlY2tfb25lX3VpX2lucGxhY2UgKG1wel9wdHIgdywgdW5zaWduZWQgbG9uZyB5KQoreworICBtcHpfdCAgd2FudCwgZ290OworCisgIG1wel9pbml0ICh3YW50KTsKKyAgbXB6X2luaXQgKGdvdCk7CisKKyAgbXB6X211bF91aSAod2FudCwgdywgKHVuc2lnbmVkIGxvbmcpIHkpOworICBtcHpfYWRkICh3YW50LCB3LCB3YW50KTsKKyAgbXB6X3NldCAoZ290LCB3KTsKKyAgbXB6X2FkZG11bF91aSAoZ290LCBnb3QsICh1bnNpZ25lZCBsb25nKSB5KTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgaWYgKG1wel9jbXAgKHdhbnQsIGdvdCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfYWRkbXVsX3VpIGZhaWxcbiIpOworICAgIGZhaWw6CisgICAgICBtcHpfdHJhY2UgKCJ3Iiwgdyk7CisgICAgICBwcmludGYgICAgKCJ5PTB4JWxYICAgJWx1XG4iLCB5LCB5KTsKKyAgICAgIG1wel90cmFjZSAoIndhbnQiLCB3YW50KTsKKyAgICAgIG1wel90cmFjZSAoImdvdCAiLCBnb3QpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9tdWxfdWkgKHdhbnQsIHcsIHkpOworICBtcHpfc3ViICh3YW50LCB3LCB3YW50KTsKKyAgbXB6X3NldCAoZ290LCB3KTsKKyAgbXB6X3N1Ym11bF91aSAoZ290LCBnb3QsIHkpOworICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICBpZiAobXB6X2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9zdWJtdWxfdWkgZmFpbFxuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIG1wel9jbGVhciAod2FudCk7CisgIG1wel9jbGVhciAoZ290KTsKK30KKwordm9pZAorY2hlY2tfYWxsX2lucGxhY2UgKG1wel9wdHIgdywgbXB6X3B0ciB5KQoreworICBpbnQgIHduZWcsIHluZWc7CisKKyAgTVBaX0NIRUNLX0ZPUk1BVCAodyk7CisgIE1QWl9DSEVDS19GT1JNQVQgKHkpOworCisgIGZvciAod25lZyA9IDA7IHduZWcgPCAyOyB3bmVnKyspCisgICAgeworICAgICAgZm9yICh5bmVnID0gMDsgeW5lZyA8IDI7IHluZWcrKykKKyAgICAgICAgeworICAgICAgICAgIGNoZWNrX29uZV9pbnBsYWNlICh3LCB5KTsKKworICAgICAgICAgIGlmIChtcHpfZml0c191bG9uZ19wICh5KSkKKyAgICAgICAgICAgIGNoZWNrX29uZV91aV9pbnBsYWNlICh3LCBtcHpfZ2V0X3VpICh5KSk7CisKKyAgICAgICAgICBtcHpfbmVnICh5LCB5KTsKKyAgICAgICAgfQorICAgICAgbXB6X25lZyAodywgdyk7CisgICAgfQorfQorCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgdywgbXB6X3NyY3B0ciB4LCBtcHpfc3JjcHRyIHkpCit7CisgIG1wel90ICB3YW50LCBnb3Q7CisKKyAgbXB6X2luaXQgKHdhbnQpOworICBtcHpfaW5pdCAoZ290KTsKKworICBtcHpfbXVsICh3YW50LCB4LCB5KTsKKyAgbXB6X2FkZCAod2FudCwgdywgd2FudCk7CisgIG1wel9zZXQgKGdvdCwgdyk7CisgIG1wel9hZGRtdWwgKGdvdCwgeCwgeSk7CisgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisgIGlmIChtcHpfY21wICh3YW50LCBnb3QpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2FkZG11bCBmYWlsXG4iKTsKKyAgICBmYWlsOgorICAgICAgbXB6X3RyYWNlICgidyIsIHcpOworICAgICAgbXB6X3RyYWNlICgieCIsIHgpOworICAgICAgbXB6X3RyYWNlICgieSIsIHkpOworICAgICAgbXB6X3RyYWNlICgid2FudCIsIHdhbnQpOworICAgICAgbXB6X3RyYWNlICgiZ290ICIsIGdvdCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKworICBtcHpfc3ViICh3YW50LCB3YW50LCB3KTsKKyAgbXB6X3N1YiAod2FudCwgdywgd2FudCk7CisgIG1wel9zZXQgKGdvdCwgdyk7CisgIG1wel9zdWJtdWwgKGdvdCwgeCwgeSk7CisgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisgIGlmIChtcHpfY21wICh3YW50LCBnb3QpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3N1Ym11bCBmYWlsXG4iKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgbXB6X2NsZWFyICh3YW50KTsKKyAgbXB6X2NsZWFyIChnb3QpOworfQorCit2b2lkCitjaGVja19zcXIgKG1wel9zcmNwdHIgdywgbXB6X3NyY3B0ciB4KQoreworICBtcHpfdCAgd2FudCwgZ290OworCisgIG1wel9pbml0ICh3YW50KTsKKyAgbXB6X2luaXQgKGdvdCk7CisKKyAgbXB6X211bCAod2FudCwgeCwgeCk7CisgIG1wel9hZGQgKHdhbnQsIHcsIHdhbnQpOworICBtcHpfc2V0IChnb3QsIHcpOworICBtcHpfYWRkbXVsIChnb3QsIHgsIHgpOworICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICBpZiAobXB6X2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9hZGRtdWwgeHggZmFpbFxuIik7CisgICAgc3FyZmFpbDoKKyAgICAgIG1wel90cmFjZSAoInciLCB3KTsKKyAgICAgIG1wel90cmFjZSAoIngiLCB4KTsKKyAgICAgIG1wel90cmFjZSAoIndhbnQiLCB3YW50KTsKKyAgICAgIG1wel90cmFjZSAoImdvdCAiLCBnb3QpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9zdWIgKHdhbnQsIHdhbnQsIHcpOworICBtcHpfc3ViICh3YW50LCB3LCB3YW50KTsKKyAgbXB6X3NldCAoZ290LCB3KTsKKyAgbXB6X3N1Ym11bCAoZ290LCB4LCB4KTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgaWYgKG1wel9jbXAgKHdhbnQsIGdvdCkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfc3VibXVsIHh4IGZhaWxcbiIpOworICAgICAgZ290byBzcXJmYWlsOworICAgIH0KKworICBtcHpfY2xlYXIgKHdhbnQpOworICBtcHpfY2xlYXIgKGdvdCk7Cit9CisKK3ZvaWQKK2NoZWNrX29uZV91aSAobXB6X3B0ciB3LCBtcHpfcHRyIHgsIHVuc2lnbmVkIGxvbmcgeSkKK3sKKyAgbXB6X3QgIHdhbnQsIGdvdDsKKworICBtcHpfaW5pdCAod2FudCk7CisgIG1wel9pbml0IChnb3QpOworCisgIG1wel9tdWxfdWkgKHdhbnQsIHgsICh1bnNpZ25lZCBsb25nKSB5KTsKKyAgbXB6X2FkZCAod2FudCwgdywgd2FudCk7CisgIG1wel9zZXQgKGdvdCwgdyk7CisgIG1wel9hZGRtdWxfdWkgKGdvdCwgeCwgKHVuc2lnbmVkIGxvbmcpIHkpOworICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICBpZiAobXB6X2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9hZGRtdWxfdWkgZmFpbFxuIik7CisgICAgZmFpbDoKKyAgICAgIG1wel90cmFjZSAoInciLCB3KTsKKyAgICAgIG1wel90cmFjZSAoIngiLCB4KTsKKyAgICAgIHByaW50ZiAgICAoInk9MHglbFggICAlbHVcbiIsIHksIHkpOworICAgICAgbXB6X3RyYWNlICgid2FudCIsIHdhbnQpOworICAgICAgbXB6X3RyYWNlICgiZ290ICIsIGdvdCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbXB6X211bF91aSAod2FudCwgeCwgeSk7CisgIG1wel9zdWIgKHdhbnQsIHcsIHdhbnQpOworICBtcHpfc2V0IChnb3QsIHcpOworICBtcHpfc3VibXVsX3VpIChnb3QsIHgsIHkpOworICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICBpZiAobXB6X2NtcCAod2FudCwgZ290KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9zdWJtdWxfdWkgZmFpbFxuIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIG1wel9jbGVhciAod2FudCk7CisgIG1wel9jbGVhciAoZ290KTsKK30KKworCit2b2lkCitjaGVja19hbGwgKG1wel9wdHIgdywgbXB6X3B0ciB4LCBtcHpfcHRyIHkpCit7CisgIGludCAgICBzd2FwLCB3bmVnLCB4bmVnLCB5bmVnOworCisgIE1QWl9DSEVDS19GT1JNQVQgKHcpOworICBNUFpfQ0hFQ0tfRk9STUFUICh4KTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAoeSk7CisKKyAgZm9yIChzd2FwID0gMDsgc3dhcCA8IDI7IHN3YXArKykKKyAgICB7CisgICAgICBmb3IgKHduZWcgPSAwOyB3bmVnIDwgMjsgd25lZysrKQorICAgICAgICB7CisgICAgICAgICAgZm9yICh4bmVnID0gMDsgeG5lZyA8IDI7IHhuZWcrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yICh5bmVnID0gMDsgeW5lZyA8IDI7IHluZWcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjaGVja19vbmUgKHcsIHgsIHkpOworCisgICAgICAgICAgICAgICAgICBpZiAobXB6X2ZpdHNfdWxvbmdfcCAoeSkpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrX29uZV91aSAodywgeCwgbXB6X2dldF91aSAoeSkpOworCisgICAgICAgICAgICAgICAgICBtcHpfbmVnICh5LCB5KTsKKyAgICAgICAgICAgICAgICB9CisKKwkgICAgICBjaGVja19zcXIgKHcsIHgpOworCisgICAgICAgICAgICAgIG1wel9uZWcgKHgsIHgpOworICAgICAgICAgICAgfQorICAgICAgICAgIG1wel9uZWcgKHcsIHcpOworICAgICAgICB9CisgICAgICBtcHpfc3dhcCAoeCwgeSk7CisgICAgfQorfQorCit2b2lkCitjaGVja19kYXRhX2lucGxhY2VfdWkgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIG1wX2xpbWJfdCAgICAgIHdbNl07CisgICAgdW5zaWduZWQgbG9uZyAgeTsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgeyAwIH0sIDAgfSwKKyAgICB7IHsgMCB9LCAxIH0sCisgICAgeyB7IDEgfSwgMSB9LAorICAgIHsgeyAyIH0sIDEgfSwKKworICAgIHsgeyAxMjMgfSwgMSB9LAorICAgIHsgeyAxMjMgfSwgVUxPTkdfTUFYIH0sCisgICAgeyB7IE0gfSwgMSB9LAorICAgIHsgeyBNIH0sIFVMT05HX01BWCB9LAorCisgICAgeyB7IDEyMywgNDU2IH0sIDEgfSwKKyAgICB7IHsgTSwgTSB9LCAxIH0sCisgICAgeyB7IDEyMywgNDU2IH0sIFVMT05HX01BWCB9LAorICAgIHsgeyBNLCBNIH0sIFVMT05HX01BWCB9LAorCisgICAgeyB7IDEyMywgNDU2LCA3ODkgfSwgMSB9LAorICAgIHsgeyBNLCBNLCBNIH0sIDEgfSwKKyAgICB7IHsgMTIzLCA0NTYsIDc4OSB9LCBVTE9OR19NQVggfSwKKyAgICB7IHsgTSwgTSwgTSB9LCBVTE9OR19NQVggfSwKKyAgfTsKKworICBtcHpfdCAgdywgeTsKKyAgaW50ICAgIGk7CisKKyAgbXB6X2luaXQgKHcpOworICBtcHpfaW5pdCAoeSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfbiAodywgZGF0YVtpXS53LCAobXBfc2l6ZV90KSBudW1iZXJvZihkYXRhW2ldLncpKTsKKyAgICAgIG1wel9zZXRfdWkgKHksIGRhdGFbaV0ueSk7CisgICAgICBjaGVja19hbGxfaW5wbGFjZSAodywgeSk7CisgICAgfQorCisgIG1wel9jbGVhciAodyk7CisgIG1wel9jbGVhciAoeSk7Cit9CisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIG1wX2xpbWJfdCAgd1s2XTsKKyAgICBtcF9saW1iX3QgIHhbNl07CisgICAgbXBfbGltYl90ICB5WzZdOworCisgIH0gZGF0YVtdID0geworCisgICAgLyogcmVkdWNpbmcgdG8gemVybyAqLworICAgIHsgeyAxIH0sIHsgMSB9LCB7IDEgfSB9LAorICAgIHsgeyAyIH0sIHsgMSB9LCB7IDIgfSB9LAorICAgIHsgeyAwLDEgfSwgeyAwLDEgfSwgeyAxIH0gfSwKKworICAgIC8qIHJlZHVjaW5nIHRvIDEgKi8KKyAgICB7IHsgMCwxIH0sICAgICAgIHsgTSB9LCAgICAgICB7IDEgfSB9LAorICAgIHsgeyAwLDAsMSB9LCAgICAgeyBNLE0gfSwgICAgIHsgMSB9IH0sCisgICAgeyB7IDAsMCwwLDEgfSwgICB7IE0sTSxNIH0sICAgeyAxIH0gfSwKKyAgICB7IHsgMCwwLDAsMCwxIH0sIHsgTSxNLE0sTSB9LCB7IDEgfSB9LAorCisgICAgLyogcmVkdWNpbmcgdG8gLTEgKi8KKyAgICB7IHsgTSB9LCAgICAgICB7IDAsMSB9LCAgICAgICB7IDEgfSB9LAorICAgIHsgeyBNLE0gfSwgICAgIHsgMCwwLDEgfSwgICAgIHsgMSB9IH0sCisgICAgeyB7IE0sTSxNIH0sICAgeyAwLDAsMCwxIH0sICAgeyAxIH0gfSwKKyAgICB7IHsgTSxNLE0sTSB9LCB7IDAsMCwwLDAsMSB9LCB7IDEgfSB9LAorCisgICAgLyogY2Fycnkgb3V0IG9mIGFkZG11bCAqLworICAgIHsgeyBNIH0sICAgICB7IDEgfSwgeyAxIH0gfSwKKyAgICB7IHsgTSxNIH0sICAgeyAxIH0sIHsgMSB9IH0sCisgICAgeyB7IE0sTSxNIH0sIHsgMSB9LCB7IDEgfSB9LAorCisgICAgLyogYm9ycm93IGZyb20gc3VibXVsICovCisgICAgeyB7IDAsMSB9LCAgICAgeyAxIH0sIHsgMSB9IH0sCisgICAgeyB7IDAsMCwxIH0sICAgeyAxIH0sIHsgMSB9IH0sCisgICAgeyB7IDAsMCwwLDEgfSwgeyAxIH0sIHsgMSB9IH0sCisKKyAgICAvKiBib3Jyb3cgZnJvbSBzdWJtdWwgKi8KKyAgICB7IHsgMCwwLDEgfSwgICAgIHsgMCwxIH0sIHsgMSB9IH0sCisgICAgeyB7IDAsMCwwLDEgfSwgICB7IDAsMSB9LCB7IDEgfSB9LAorICAgIHsgeyAwLDAsMCwwLDEgfSwgeyAwLDEgfSwgeyAxIH0gfSwKKworICAgIC8qIG1vcmUgYm9ycm93IGZyb20gc3VibXVsICovCisgICAgeyB7IE0gfSwgeyAwLDEgfSwgICAgICAgeyAxIH0gfSwKKyAgICB7IHsgTSB9LCB7IDAsMCwxIH0sICAgICB7IDEgfSB9LAorICAgIHsgeyBNIH0sIHsgMCwwLDAsMSB9LCAgIHsgMSB9IH0sCisgICAgeyB7IE0gfSwgeyAwLDAsMCwwLDEgfSwgeyAxIH0gfSwKKworICAgIC8qIGJpZyBib3Jyb3cgZnJvbSBzdWJtdWwgKi8KKyAgICB7IHsgMCwwLDEgfSwgICAgIHsgTSxNIH0sIHsgTSB9IH0sCisgICAgeyB7IDAsMCwwLDEgfSwgICB7IE0sTSB9LCB7IE0gfSB9LAorICAgIHsgeyAwLDAsMCwwLDEgfSwgeyBNLE0gfSwgeyBNIH0gfSwKKworICAgIC8qIHNtYWxsIHcgKi8KKyAgICB7IHsgMCwxIH0sIHsgTSxNIH0sICAgICAgIHsgTSB9IH0sCisgICAgeyB7IDAsMSB9LCB7IE0sTSxNIH0sICAgICB7IE0gfSB9LAorICAgIHsgeyAwLDEgfSwgeyBNLE0sTSxNIH0sICAgeyBNIH0gfSwKKyAgICB7IHsgMCwxIH0sIHsgTSxNLE0sTSxNIH0sIHsgTSB9IH0sCisgIH07CisKKyAgbXB6X3QgIHcsIHgsIHk7CisgIGludCAgICBpOworCisgIG1wel9pbml0ICh3KTsKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAoeSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfbiAodywgZGF0YVtpXS53LCAobXBfc2l6ZV90KSBudW1iZXJvZihkYXRhW2ldLncpKTsKKyAgICAgIG1wel9zZXRfbiAoeCwgZGF0YVtpXS54LCAobXBfc2l6ZV90KSBudW1iZXJvZihkYXRhW2ldLngpKTsKKyAgICAgIG1wel9zZXRfbiAoeSwgZGF0YVtpXS55LCAobXBfc2l6ZV90KSBudW1iZXJvZihkYXRhW2ldLnkpKTsKKyAgICAgIGNoZWNrX2FsbCAodywgeCwgeSk7CisgICAgfQorCisgIG1wel9jbGVhciAodyk7CisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoeSk7Cit9CisKKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBtcHpfdCAgdywgeCwgeTsKKyAgaW50ICAgIGksIHJlcHMgPSAyMDAwOworCisgIG1wel9pbml0ICh3KTsKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAoeSk7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICByZXBzID0gYXRvaSAoYXJndlsxXSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBtcHpfZXJyYW5kb21iICh3LCByYW5kcywgNSpHTVBfTElNQl9CSVRTKTsKKyAgICAgIG1wel9lcnJhbmRvbWIgKHgsIHJhbmRzLCA1KkdNUF9MSU1CX0JJVFMpOworICAgICAgbXB6X2VycmFuZG9tYiAoeSwgcmFuZHMsIDUqR01QX0xJTUJfQklUUyk7CisgICAgICBjaGVja19hbGwgKHcsIHgsIHkpOworICAgICAgY2hlY2tfYWxsX2lucGxhY2UgKHcsIHkpOworCisgICAgICBtcHpfZXJyYW5kb21iICh3LCByYW5kcywgNSpHTVBfTElNQl9CSVRTKTsKKyAgICAgIG1wel9lcnJhbmRvbWIgKHgsIHJhbmRzLCA1KkdNUF9MSU1CX0JJVFMpOworICAgICAgbXB6X2VycmFuZG9tYiAoeSwgcmFuZHMsIEJJVFNfUEVSX1VMT05HKTsKKyAgICAgIGNoZWNrX2FsbCAodywgeCwgeSk7CisgICAgICBjaGVja19hbGxfaW5wbGFjZSAodywgeSk7CisgICAgfQorCisgIG1wel9jbGVhciAodyk7CisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoeSk7Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja19kYXRhICgpOworICBjaGVja19kYXRhX2lucGxhY2VfdWkgKCk7CisgIGNoZWNrX3JhbmRvbSAoYXJnYywgYXJndik7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWJpbi5jIGIvdGVzdHMvbXB6L3QtYmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0N2JlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWJpbi5jCkBAIC0wLDAgKzEsMzI4IEBACisvKiBFeGVyY2lzZSBtcHpfYmluX3VpIGFuZCBtcHpfYmluX3VpdWkuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDEwLCAyMDEyLCAyMDE4LCAyMDIwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIERlZmF1bHQgbnVtYmVyIG9mIGdlbmVyYXRlZCB0ZXN0cy4gKi8KKyNkZWZpbmUgQ09VTlQgNzAwCisKK3ZvaWQKK3RyeV9tcHpfYmluX3VpIChtcHpfc3JjcHRyIHdhbnQsIG1wel9zcmNwdHIgbiwgdW5zaWduZWQgbG9uZyBrKQoreworICBtcHpfdCAgZ290OworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfYmluX3VpIChnb3QsIG4sIGspOworICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICBpZiAobXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9iaW5fdWkgd3JvbmdcbiIpOworICAgICAgcHJpbnRmICgiICBuPSIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgbik7IHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIGs9JWx1XG4iLCBrKTsKKyAgICAgIHByaW50ZiAoIiAgZ290PSIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgZ290KTsgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgd2FudD0iKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHdhbnQpOyBwcmludGYgKCJcbiIpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisgIG1wel9jbGVhciAoZ290KTsKK30KKworCit2b2lkCit0cnlfbXB6X2Jpbl91aXVpIChtcHpfc3JjcHRyIHdhbnQsIHVuc2lnbmVkIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBrKQoreworICBtcHpfdCAgZ290OworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfYmluX3VpdWkgKGdvdCwgbiwgayk7CisgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2Jpbl91aXVpIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgbj0lbHVcbiIsIG4pOworICAgICAgcHJpbnRmICgiICBrPSVsdVxuIiwgayk7CisgICAgICBwcmludGYgKCIgIGdvdD0iKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGdvdCk7IHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIHdhbnQ9Iik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCB3YW50KTsgcHJpbnRmICgiXG4iKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICBtcHpfY2xlYXIgKGdvdCk7Cit9CisKKwordm9pZAorc2FtcGxlcyAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgICAgKm47CisgICAgdW5zaWduZWQgbG9uZyAgazsKKyAgICBjb25zdCBjaGFyICAgICAqd2FudDsKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7ICAgIjAiLCAxMjM0NTYsICIwIiB9LAorICAgIHsgICAiMSIsIDU0MzIxMCwgIjAiIH0sCisgICAgeyAgICIyIiwgMTIzMzIxLCAiMCIgfSwKKyAgICB7ICAgIjMiLCAyMzQ1NjcsICIwIiB9LAorICAgIHsgICAiMTAiLCAyMzQ1NiwgIjAiIH0sCisKKyAgICAvKiBuZWdhdGl2ZXMsIHVzaW5nIGJpbigtbixrKT1iaW4obitrLTEsaykgKi8KKyAgICB7ICAgIi0xIiwgIDAsICAiMSIgIH0sCisgICAgeyAgICItMSIsICAxLCAiLTEiICB9LAorICAgIHsgICAiLTEiLCAgMiwgICIxIiAgfSwKKyAgICB7ICAgIi0xIiwgIDMsICItMSIgIH0sCisgICAgeyAgICItMSIsICA0LCAgIjEiICB9LAorCisgICAgeyAgICItMiIsICAwLCAgIjEiICB9LAorICAgIHsgICAiLTIiLCAgMSwgIi0yIiAgfSwKKyAgICB7ICAgIi0yIiwgIDIsICAiMyIgIH0sCisgICAgeyAgICItMiIsICAzLCAiLTQiICB9LAorICAgIHsgICAiLTIiLCAgNCwgICI1IiAgfSwKKyAgICB7ICAgIi0yIiwgIDUsICItNiIgIH0sCisgICAgeyAgICItMiIsICA2LCAgIjciICB9LAorCisgICAgeyAgICItMyIsICAwLCAgICIxIiAgfSwKKyAgICB7ICAgIi0zIiwgIDEsICAiLTMiICB9LAorICAgIHsgICAiLTMiLCAgMiwgICAiNiIgIH0sCisgICAgeyAgICItMyIsICAzLCAiLTEwIiAgfSwKKyAgICB7ICAgIi0zIiwgIDQsICAiMTUiICB9LAorICAgIHsgICAiLTMiLCAgNSwgIi0yMSIgIH0sCisgICAgeyAgICItMyIsICA2LCAgIjI4IiAgfSwKKworICAgIC8qIEEgZmV3IHJhbmRvbSB2YWx1ZXMgKi8KKyAgICB7ICAgIjQxIiwgMjAsICAiMjY5MTI4OTM3MjIwIiB9LAorICAgIHsgICAiNjIiLCAzNywgICIxNDc0MDU1NDUzNTk1NDE3NDIiIH0sCisgICAgeyAgICI1MCIsIDE4LCAgIjE4MDUzNTI4ODgzNzc1IiB9LAorICAgIHsgICIxNDkiLCAyMSwgICIxOTMzMjk1MDg0NDQ2ODQ4MzQ2Nzg5NDY0OSIgfSwKKyAgfTsKKworICBtcHpfdCAgbiwgd2FudDsKKyAgaW50ICAgIGk7CisKKyAgbXB6X2luaXQgKG4pOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChuLCBkYXRhW2ldLm4sIDApOworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKHdhbnQsIGRhdGFbaV0ud2FudCwgMCk7CisKKyAgICAgIHRyeV9tcHpfYmluX3VpICh3YW50LCBuLCBkYXRhW2ldLmspOworCisgICAgICBpZiAobXB6X2ZpdHNfdWxvbmdfcCAobikpCisJdHJ5X21wel9iaW5fdWl1aSAod2FudCwgbXB6X2dldF91aSAobiksIGRhdGFbaV0uayk7CisgICAgfQorCisgIG1wel9jbGVhciAobik7CisgIG1wel9jbGVhciAod2FudCk7Cit9CisKKworLyogVGVzdCBzb21lIGJpbigyayxrKSBjYXNlcy4gIFRoaXMgcHJvZHVjZXMgc29tZSBiaWdnaXNoIG51bWJlcnMgdG8KKyAgIGV4ZXJjaXNlIHRoZSBsaW1iIGFjY3VtdWxhdGluZyBjb2RlLiAgKi8KK3ZvaWQKK3R3b3MgKGludCBjb3VudCkKK3sKKyAgbXB6X3QgICAgICAgICAgbiwgd2FudDsKKyAgdW5zaWduZWQgbG9uZyAgazsKKworICBtcHpfaW5pdCAobik7CisKKyAgbXB6X2luaXRfc2V0X3VpICh3YW50LCAodW5zaWduZWQgbG9uZykgMik7CisgIGZvciAoayA9IDE7IGsgPCBjb3VudDsgaysrKQorICAgIHsKKyAgICAgIG1wel9zZXRfdWkgKG4sIDIqayk7CisgICAgICB0cnlfbXB6X2Jpbl91aSAod2FudCwgbiwgayk7CisKKyAgICAgIHRyeV9tcHpfYmluX3VpdWkgKHdhbnQsIDIqaywgayk7CisKKyAgICAgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIDIqKDIqaysxKSk7CisgICAgICBtcHpfZmRpdl9xX3VpICh3YW50LCB3YW50LCBrKzEpOworICAgIH0KKworICBtcHpfY2xlYXIgKG4pOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCisvKiBUZXN0IHNvbWUgcmFuZG9tIGJpbihuLGspIGNhc2VzLiAgVGhpcyBwcm9kdWNlcyBzb21lIGJpZ2dpc2gKKyAgIG51bWJlcnMgdG8gZXhlcmNpc2UgdGhlIGxpbWIgYWNjdW11bGF0aW5nIGNvZGUuICAqLwordm9pZAorcmFuZG9td2FsayAoaW50IGNvdW50KQoreworICBtcHpfdCAgICAgICAgICBuX3osIHdhbnQsIHRtcDsKKyAgdW5zaWduZWQgbG9uZyAgbiwgaywgaSwgcjsKKyAgaW50ICAgICAgICAgICAgdGVzdHM7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIHJhbmRzID0gUkFORFM7CisgIG1wel9pbml0IChuX3opOworCisgIGsgPSAzOworICBuID0gMTI7CisgIG1wel9pbml0X3NldF91aSAod2FudCwgKHVuc2lnbmVkIGxvbmcpIDIyMCk7IC8qIGJpbm9taWFsKDEyLDMpID0gMjIwICovCisKKyAgZm9yICh0ZXN0cyA9IDE7IHRlc3RzIDwgY291bnQ7IHRlc3RzKyspCisgICAgeworICAgICAgciA9IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDYyKSArIDE7CisgICAgICBmb3IgKGkgPSByICYgNzsgaSA+IDA7IGktLSkKKwl7CisJICBuKys7IGsrKzsKKwkgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIG4pOworCSAgbXB6X2RpdmV4YWN0X3VpICh3YW50LCB3YW50LCBrKTsKKwl9CisgICAgICBmb3IgKGkgPSByID4+IDM7IGkgPiAwOyBpLS0pCisJeworCSAgbisrOworCSAgbXB6X211bF91aSAod2FudCwgd2FudCwgbik7CisJICBtcHpfZGl2ZXhhY3RfdWkgKHdhbnQsIHdhbnQsIG4gLSBrKTsKKwl9CisKKyAgICAgIG1wel9zZXRfdWkgKG5feiwgbik7CisgICAgICB0cnlfbXB6X2Jpbl91aSAod2FudCwgbl96LCBrKTsKKworICAgICAgdHJ5X21wel9iaW5fdWl1aSAod2FudCwgbiwgayk7CisgICAgfQorCisgIGsgPSAyOworICBtcHpfdXJhbmRvbWIgKG5feiwgcmFuZHMsIDIwMCk7CisgIG1wel9tdWwgKHdhbnQsIG5feiwgbl96KTsgLyogd2FudCA9IG5feiBeIDIgKi8KKyAgbXB6X3N1YiAod2FudCwgd2FudCwgbl96KTsgLyogd2FudCA9IG5feiBeIDIgLSBuX3ogPSBuX3ogKG5fei0gMSkgKi8KKyAgbXB6X3RkaXZfcV8yZXhwICh3YW50LCB3YW50LCAxKTsgLyogd2FudCA9IG5feiAobl96LSAxKSAvIDIgPSBiaW5vbWlhbCAobl96LCAyKSAqLworICBtcHpfaW5pdCAodG1wKTsKKyAgZm9yICh0ZXN0cyA9IDE7IHRlc3RzIDwgY291bnQ7IHRlc3RzKyspCisgICAgeworICAgICAgciA9IGdtcF91cmFuZG9tbV91aSAocmFuZHMsIDYyKSArIDE7CisgICAgICBmb3IgKGkgPSByICYgNzsgaSA+IDA7IGktLSkKKwl7CisJICBrKys7CisJICBtcHpfYWRkX3VpIChuX3osIG5feiwgMSk7CisJICBtcHpfbXVsICh3YW50LCB3YW50LCBuX3opOworCSAgbXB6X2RpdmV4YWN0X3VpICh3YW50LCB3YW50LCBrKTsKKwl9CisgICAgICBmb3IgKGkgPSByID4+IDM7IGkgPiAwOyBpLS0pCisJeworCSAgbXB6X2FkZF91aSAobl96LCBuX3osIDEpOworCSAgbXB6X211bCAod2FudCwgd2FudCwgbl96KTsKKwkgIG1wel9zdWJfdWkgKHRtcCwgbl96LCBrKTsKKwkgIG1wel9kaXZleGFjdCAod2FudCwgd2FudCwgdG1wKTsKKwl9CisKKyAgICAgIHRyeV9tcHpfYmluX3VpICh3YW50LCBuX3osIGspOworICAgIH0KKworICBtcHpfY2xlYXIgKHRtcCk7CisgIG1wel9jbGVhciAobl96KTsKKyAgbXB6X2NsZWFyICh3YW50KTsKK30KKworLyogVGVzdCBzb21lIHJhbmRvbSBiaW4obixrKSBjYXNlcy4gIFRoaXMgcHJvZHVjZXMgc29tZSBiaWdnaXNoCisgICBudW1iZXJzIHRvIGV4ZXJjaXNlIHRoZSBsaW1iIGFjY3VtdWxhdGluZyBjb2RlLiAgKi8KK3ZvaWQKK3JhbmRvbXdhbGtfZG93biAoaW50IGNvdW50KQoreworICBtcHpfdCAgICAgICAgICBuX3osIHdhbnQsIHRtcDsKKyAgdW5zaWduZWQgbG9uZyAgbiwgaywgaSwgcjsKKyAgaW50ICAgICAgICAgICAgdGVzdHM7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIHJhbmRzID0gUkFORFM7CisgIG1wel9pbml0IChuX3opOworICBtcHpfaW5pdCAodG1wKTsKKworICBrID0gMjsKKyAgbiA9IFVMT05HX01BWDsKKyAgbXB6X2luaXRfc2V0X3VpICh3YW50LCBuKTsKKyAgbXB6X211bF91aSAod2FudCwgd2FudCwgbiA+PiAxKTsKKworICBmb3IgKHRlc3RzID0gMTsgdGVzdHMgPCBjb3VudDsgdGVzdHMrKykKKyAgICB7CisgICAgICByID0gZ21wX3VyYW5kb21tX3VpIChyYW5kcywgNjIpICsgMTsKKyAgICAgIGZvciAoaSA9IHIgJiA3OyBpID4gMDsgaS0tKQorCXsKKwkgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIG4gLSBrKTsKKwkgICsrazsKKwkgIG1wel9kaXZleGFjdF91aSAod2FudCwgd2FudCwgayk7CisJfQorICAgICAgZm9yIChpID0gciA+PiAzOyBpID4gMDsgaS0tKQorCXsKKwkgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIG4gLSBrKTsKKwkgIG1wel9kaXZleGFjdF91aSAod2FudCwgd2FudCwgbik7CisJICAtLW47CisJfQorCisgICAgICBtcHpfc2V0X3VpIChuX3osIG4pOworICAgICAgdHJ5X21wel9iaW5fdWkgKHdhbnQsIG5feiwgbiAtIGspOworCisgICAgICB0cnlfbXB6X2Jpbl91aXVpICh3YW50LCBuLCBuIC0gayk7CisgICAgfQorCisgIG1wel9jbGVhciAodG1wKTsKKyAgbXB6X2NsZWFyIChuX3opOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCisKKy8qIFRlc3QgYWxsIGJpbihuLGspIGNhc2VzLCB3aXRoIDAgPD0gayA8PSBuICsgMSA8PSBjb3VudC4gICovCit2b2lkCitzbWFsbGV4YXVzdGl2ZSAodW5zaWduZWQgaW50IGNvdW50KQoreworICBtcHpfdCAgICAgICAgICBuX3osIHdhbnQ7CisgIHVuc2lnbmVkIGxvbmcgIG4sIGs7CisKKyAgbXB6X2luaXQgKG5feik7CisgIG1wel9pbml0ICh3YW50KTsKKworICBmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykKKyAgICB7CisgICAgICBtcHpfc2V0X3VpICh3YW50LCAodW5zaWduZWQgbG9uZykgMSk7CisgICAgICBtcHpfc2V0X3VpIChuX3osIG4pOworICAgICAgZm9yIChrID0gMDsgayA8PSBuOyBrKyspCisJeworCSAgdHJ5X21wel9iaW5fdWkgKHdhbnQsIG5feiwgayk7CisJICB0cnlfbXB6X2Jpbl91aXVpICh3YW50LCBuLCBrKTsKKwkgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIG4gLSBrKTsKKwkgIG1wel9mZGl2X3FfdWkgKHdhbnQsIHdhbnQsIGsgKyAxKTsKKwl9CisgICAgICB0cnlfbXB6X2Jpbl91aSAod2FudCwgbl96LCBrKTsKKyAgICAgIHRyeV9tcHpfYmluX3VpdWkgKHdhbnQsIG4sIGspOworICAgIH0KKworICBtcHpfY2xlYXIgKG5feik7CisgIG1wel9jbGVhciAod2FudCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgY291bnQ7CisKKyAgY291bnQgPSBDT1VOVDsKKyAgVEVTVFNfUkVQUyAoY291bnQsIGFyZ3YsIGFyZ2MpOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIHNhbXBsZXMgKCk7CisgIHNtYWxsZXhhdXN0aXZlIChjb3VudCA+PiA0KTsKKyAgdHdvcyAoY291bnQgPj4gMSk7CisgIHJhbmRvbXdhbGsgKGNvdW50IC0gKGNvdW50ID4+IDEpKTsKKyAgcmFuZG9td2Fsa19kb3duIChjb3VudCA+PiAxKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtYml0LmMgYi90ZXN0cy9tcHovdC1iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNkZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtYml0LmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qIFRlc3QgbXB6X3NldGJpdCwgbXB6X2NscmJpdCwgbXB6X3RzdGJpdC4KKworQ29weXJpZ2h0IDE5OTcsIDIwMDAtMjAwMywgMjAxMiwgMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDQKKyNlbmRpZgorCisKK3ZvaWQKK2RlYnVnX21wIChtcHpfc3JjcHRyIHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZG91dCk7Cit9CisKKworLyogZXhlcmNpc2UgdGhlIGNhc2Ugd2hlcmUgbXB6X2NscmJpdCBvciBtcHpfY29tYml0IGVuZHMgdXAgZXh0ZW5kaW5nIGEKKyAgIHZhbHVlIGxpa2UgLTJeKGsqR01QX05VTUJfQklUUy0xKSB3aGVuIGNsZWFyaW5nIGJpdCBrKkdNUF9OVU1CX0JJVFMtMS4gICovCisvKiBBbmQgdmljZS12ZXJzYS4gKi8KK3ZvaWQKK2NoZWNrX2Nscl9leHRlbmQgKHZvaWQpCit7CisgIG1wel90ICAgICAgICAgIGdvdCwgd2FudDsKKyAgdW5zaWduZWQgbG9uZyAgaTsKKyAgaW50ICAgICAgICAgICAgZjsKKworICBtcHpfaW5pdCAoZ290KTsKKyAgbXB6X2luaXQgKHdhbnQpOworCisgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgeworICAgICAgZm9yIChmID0gMDsgZiA8PSAxOyBmKyspCisJeworCSAgLyogbG90cyBvZiAxIGJpdHMgaW4gX21wX2QgKi8KKwkgIG1wel9zZXRfc2kgKGdvdCwgMUwpOworCSAgbXB6X211bF8yZXhwIChnb3QsIGdvdCwgMTAqR01QX05VTUJfQklUUyk7CisJICBtcHpfc3ViX3VpIChnb3QsIGdvdCwgMUwpOworCisJICAvKiB2YWx1ZSAtMl4obi0xKSByZXByZXNlbnRpbmcgLi4xMTEwMC4uMDAgKi8KKwkgIG1wel9zZXRfc2kgKGdvdCwgLTFMKTsKKwkgIG1wel9tdWxfMmV4cCAoZ290LCBnb3QsIGkqR01QX05VTUJfQklUUy0xKTsKKworCSAgLyogY29tcGxlbWVudCBiaXQgbiwgZ2l2aW5nIC4uMTEwMDAuLjAwIHdoaWNoIGlzIC0yXm4gKi8KKwkgIGlmIChmID09IDApCisJICAgIG1wel9jbHJiaXQgKGdvdCwgaSpHTVBfTlVNQl9CSVRTLTEpOworCSAgZWxzZQorCSAgICBtcHpfY29tYml0IChnb3QsIGkqR01QX05VTUJfQklUUy0xKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisKKwkgIG1wel9zZXRfc2kgKHdhbnQsIC0xTCk7CisJICBtcHpfbXVsXzJleHAgKHdhbnQsIHdhbnQsIGkqR01QX05VTUJfQklUUyk7CisKKwkgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisJICAgIHsKKwkgICAgICBpZiAoZiA9PSAwKQorCQlwcmludGYgKCJtcHpfY2xyYml0OiAiKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIm1wel9jb21iaXQ6ICIpOworCSAgICAgIHByaW50ZiAoIndyb25nIGFmdGVyIGV4dGVuc2lvblxuIik7CisJICAgICAgbXB6X3RyYWNlICgiZ290ICIsIGdvdCk7CisJICAgICAgbXB6X3RyYWNlICgid2FudCIsIHdhbnQpOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisKKwkgIC8qIGNvbXBsZW1lbnQgYml0IG4sIGdvaW5nIGJhY2sgdG8gLi4xMTEwMC4uMDAgd2hpY2ggaXMgLTJeKG4tMSkgKi8KKwkgIGlmIChmID09IDApCisJICAgIG1wel9zZXRiaXQgKGdvdCwgaSpHTVBfTlVNQl9CSVRTLTEpOworCSAgZWxzZQorCSAgICBtcHpfY29tYml0IChnb3QsIGkqR01QX05VTUJfQklUUy0xKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKGdvdCk7CisKKwkgIG1wel9zZXRfc2kgKHdhbnQsIC0xTCk7CisJICBtcHpfbXVsXzJleHAgKHdhbnQsIHdhbnQsIGkqR01QX05VTUJfQklUUyAtIDEpOworCisJICBpZiAobXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorCSAgICB7CisJICAgICAgaWYgKGYgPT0gMCkKKwkJcHJpbnRmICgibXB6X3NldGJpdDogIik7CisJICAgICAgZWxzZQorCQlwcmludGYgKCJtcHpfY29tYml0OiAiKTsKKwkgICAgICBwcmludGYgKCJ3cm9uZyBhZnRlciBzaHJpbmtpbmdcbiIpOworCSAgICAgIG1wel90cmFjZSAoImdvdCAiLCBnb3QpOworCSAgICAgIG1wel90cmFjZSAoIndhbnQiLCB3YW50KTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCit2b2lkCitjaGVja19jb21fbmVncyAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyAgYml0OworICAgIG1wX3NpemVfdCAgICAgIGlucF9zaXplOworICAgIG1wX2xpbWJfdCAgICAgIGlucF9uWzVdOworICAgIG1wX3NpemVfdCAgICAgIHdhbnRfc2l6ZTsKKyAgICBtcF9saW1iX3QgICAgICB3YW50X25bNV07CisgIH0gZGF0YVtdID0geworICAgIHsgR01QX05VTUJfQklUUywgICAyLCB7IDEsIDEgfSwgIDEsIHsgMSB9IH0sCisgICAgeyBHTVBfTlVNQl9CSVRTKzEsIDIsIHsgMSwgMSB9LCAgMiwgeyAxLCAzIH0gfSwKKworICAgIHsgR01QX05VTUJfQklUUywgICAyLCB7IDAsIDEgfSwgIDIsIHsgMCwgMiB9IH0sCisgICAgeyBHTVBfTlVNQl9CSVRTKzEsIDIsIHsgMCwgMSB9LCAgMiwgeyAwLCAzIH0gfSwKKyAgfTsKKyAgbXB6X3QgIGlucCwgZ290LCB3YW50OworICBpbnQgICAgaTsKKworICBtcHpfaW5pdCAoZ290KTsKKyAgbXB6X2luaXQgKHdhbnQpOworICBtcHpfaW5pdCAoaW5wKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9uIChpbnAsIGRhdGFbaV0uaW5wX24sIGRhdGFbaV0uaW5wX3NpemUpOworICAgICAgbXB6X25lZyAoaW5wLCBpbnApOworCisgICAgICBtcHpfc2V0X24gKHdhbnQsIGRhdGFbaV0ud2FudF9uLCBkYXRhW2ldLndhbnRfc2l6ZSk7CisgICAgICBtcHpfbmVnICh3YW50LCB3YW50KTsKKworICAgICAgbXB6X3NldCAoZ290LCBpbnApOworICAgICAgbXB6X2NvbWJpdCAoZ290LCBkYXRhW2ldLmJpdCk7CisKKyAgICAgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisJeworCSAgcHJpbnRmICgibXB6X2NvbWJpdDogd3Jvbmcgb24gbmVnIGRhdGFbJWRdXG4iLCBpKTsKKwkgIG1wel90cmFjZSAoImlucCAiLCBpbnApOworCSAgcHJpbnRmICAgICgiYml0ICVsdVxuIiwgZGF0YVtpXS5iaXQpOworCSAgbXB6X3RyYWNlICgiZ290ICIsIGdvdCk7CisJICBtcHpfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoaW5wKTsKKyAgbXB6X2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCisvKiBTZWUgdGhhdCBtcHpfdHN0Yml0IG1hdGNoZXMgYSB0d29zIGNvbXBsZW1lbnQgY2FsY3VsYXRlZCBleHBsaWNpdGx5LCBmb3IKKyAgIHZhcmlvdXMgbG93IHplcm9zLiAgKi8KK3ZvaWQKK2NoZWNrX3RzdGJpdCAodm9pZCkKK3sKKyNkZWZpbmUgTUFYX1pFUk9TICAzCisjZGVmaW5lIE5VTV9MSU1CUyAgMworCisgIG1wX2xpbWJfdCAgICAgIHBvc1sxK05VTV9MSU1CUytNQVhfWkVST1NdOworICBtcF9saW1iX3QgICAgICBuZWdbMStOVU1fTElNQlMrTUFYX1pFUk9TXTsKKyAgbXB6X3QgICAgICAgICAgejsKKyAgdW5zaWduZWQgbG9uZyAgaTsKKyAgaW50ICAgICAgICAgICAgemVyb3MsIGxvdzE7CisgIGludCAgICAgICAgICAgIGdvdCwgd2FudDsKKworICBtcHpfaW5pdCAoeik7CisgIGZvciAoemVyb3MgPSAwOyB6ZXJvcyA8PSBNQVhfWkVST1M7IHplcm9zKyspCisgICAgeworICAgICAgTVBOX1pFUk8gKHBvcywgbnVtYmVyb2YocG9zKSk7CisgICAgICBtcG5fcmFuZG9tMiAocG9zK3plcm9zLCAobXBfc2l6ZV90KSBOVU1fTElNQlMpOworCisgICAgICBmb3IgKGxvdzEgPSAwOyBsb3cxIDw9IDE7IGxvdzErKykKKwl7CisJICBpZiAobG93MSkKKwkgICAgcG9zWzBdIHw9IDE7CisKKwkgIHJlZm1wbl9uZWcgKG5lZywgcG9zLCAobXBfc2l6ZV90KSBudW1iZXJvZihuZWcpKTsKKwkgIG1wel9zZXRfbiAoeiwgbmVnLCAobXBfc2l6ZV90KSBudW1iZXJvZihuZWcpKTsKKwkgIG1wel9uZWcgKHosIHopOworCisJICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YocG9zKSpHTVBfTlVNQl9CSVRTOyBpKyspCisJICAgIHsKKwkgICAgICBnb3QgPSBtcHpfdHN0Yml0ICh6LCBpKTsKKwkgICAgICB3YW50ID0gcmVmbXBuX3RzdGJpdCAocG9zLCBpKTsKKwkgICAgICBpZiAoZ290ICE9IHdhbnQpCisJCXsKKwkJICBwcmludGYgKCJ3cm9uZyBhdCBiaXQgJWx1LCB3aXRoICVkIHplcm9zXG4iLCBpLCB6ZXJvcyk7CisJCSAgcHJpbnRmICgieiBuZWcgIik7IGRlYnVnX21wICh6LCAtMTYpOworCQkgIG1wel9zZXRfbiAoeiwgcG9zLCAobXBfc2l6ZV90KSBudW1iZXJvZihwb3MpKTsKKwkJICBwcmludGYgKCJwb3MgICAiKTsgZGVidWdfbXAgKHosIC0xNik7CisJCSAgbXB6X3NldF9uICh6LCBuZWcsIChtcF9zaXplX3QpIG51bWJlcm9mKG5lZykpOworCQkgIHByaW50ZiAoIm5lZyAgICIpOyBkZWJ1Z19tcCAoeiwgLTE2KTsKKwkJICBleGl0ICgxKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgbXB6X2NsZWFyICh6KTsKK30KKworCit2b2lkCitjaGVja19zaW5nbGUgKHZvaWQpCit7CisgIG1wel90ICB4OworICBpbnQgICAgbGltYiwgb2Zmc2V0LCBpbml0aWFsOworICB1bnNpZ25lZCBsb25nICBiaXQ7CisKKyAgbXB6X2luaXQgKHgpOworCisgIGZvciAobGltYiA9IDA7IGxpbWIgPCA0OyBsaW1iKyspCisgICAgeworICAgICAgZm9yIChvZmZzZXQgPSAobGltYj09MCA/IDAgOiAtMik7IG9mZnNldCA8PSAyOyBvZmZzZXQrKykKKwl7CisJICBmb3IgKGluaXRpYWwgPSAxOyBpbml0aWFsID49IC0xOyBpbml0aWFsLS0pCisJICAgIHsKKwkgICAgICBtcHpfc2V0X3NpICh4LCAobG9uZykgaW5pdGlhbCk7CisKKwkgICAgICBiaXQgPSAodW5zaWduZWQgbG9uZykgbGltYipHTVBfTElNQl9CSVRTICsgb2Zmc2V0OworCisJICAgICAgbXB6X2NscmJpdCAoeCwgYml0KTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh4KTsKKwkgICAgICBpZiAobXB6X3RzdGJpdCAoeCwgYml0KSAhPSAwKQorCQl7CisJCSAgcHJpbnRmICgiY2hlY2tfc2luZ2xlKCk6IGV4cGVjdGVkIDBcbiIpOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBtcHpfc2V0Yml0ICh4LCBiaXQpOworCSAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHgpOworCSAgICAgIGlmIChtcHpfdHN0Yml0ICh4LCBiaXQpICE9IDEpCisJCXsKKwkJICBwcmludGYgKCJjaGVja19zaW5nbGUoKTogZXhwZWN0ZWQgMVxuIik7CisJCSAgYWJvcnQgKCk7CisJCX0KKworCSAgICAgIG1wel9jbHJiaXQgKHgsIGJpdCk7CisJICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoeCk7CisJICAgICAgaWYgKG1wel90c3RiaXQgKHgsIGJpdCkgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoImNoZWNrX3NpbmdsZSgpOiBleHBlY3RlZCAwXG4iKTsKKwkJICBhYm9ydCAoKTsKKwkJfQorCisJICAgICAgbXB6X2NvbWJpdCAoeCwgYml0KTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh4KTsKKwkgICAgICBpZiAobXB6X3RzdGJpdCAoeCwgYml0KSAhPSAxKQorCQl7CisJCSAgcHJpbnRmICgiY2hlY2tfc2luZ2xlKCk6IGV4cGVjdGVkIDFcbiIpOworCQkgIGFib3J0ICgpOworCQl9CisKKwkgICAgICBtcHpfY29tYml0ICh4LCBiaXQpOworCSAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHgpOworCSAgICAgIGlmIChtcHpfdHN0Yml0ICh4LCBiaXQpICE9IDApCisJCXsKKwkJICBwcmludGYgKCJjaGVja19zaW5nbGUoKTogZXhwZWN0ZWQgMFxuIik7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyICh4KTsKK30KKworCit2b2lkCitjaGVja19yYW5kb20gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIG1wel90IHgsIHMwLCBzMSwgczIsIHMzLCBtOworICBtcF9zaXplX3QgeHNpemU7CisgIGludCBpOworICBpbnQgcmVwcyA9IDEwMDAwMDsKKyAgaW50IGJpdDAsIGJpdDEsIGJpdDIsIGJpdDM7CisgIHVuc2lnbmVkIGxvbmcgaW50IGJpdGluZGV4OworICBjb25zdCBjaGFyICAqcyA9ICIiOworCisgIGlmIChhcmdjID09IDIpCisgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0ICh4KTsKKyAgbXB6X2luaXQgKHMwKTsKKyAgbXB6X2luaXQgKHMxKTsKKyAgbXB6X2luaXQgKHMyKTsKKyAgbXB6X2luaXQgKHMzKTsKKyAgbXB6X2luaXQgKG0pOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgeHNpemUgPSB1cmFuZG9tICgpICUgKDIgKiBTSVpFKSAtIFNJWkU7CisgICAgICBtcHpfcmFuZG9tMiAoeCwgeHNpemUpOworICAgICAgYml0aW5kZXggPSB1cmFuZG9tICgpICUgU0laRTsKKworICAgICAgbXB6X3NldCAoczAsIHgpOworICAgICAgYml0MCA9IG1wel90c3RiaXQgKHgsIGJpdGluZGV4KTsKKyAgICAgIG1wel9zZXRiaXQgKHgsIGJpdGluZGV4KTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHgpOworCisgICAgICBtcHpfc2V0IChzMSwgeCk7CisgICAgICBiaXQxID0gbXB6X3RzdGJpdCAoeCwgYml0aW5kZXgpOworICAgICAgbXB6X2NscmJpdCAoeCwgYml0aW5kZXgpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoeCk7CisKKyAgICAgIG1wel9zZXQgKHMyLCB4KTsKKyAgICAgIGJpdDIgPSBtcHpfdHN0Yml0ICh4LCBiaXRpbmRleCk7CisgICAgICBtcHpfY29tYml0ICh4LCBiaXRpbmRleCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh4KTsKKworICAgICAgbXB6X3NldCAoczMsIHgpOworICAgICAgYml0MyA9IG1wel90c3RiaXQgKHgsIGJpdGluZGV4KTsKKworI2RlZmluZSBGQUlMKHN0cikgZG8geyBzID0gc3RyOyBnb3RvIGZhaWw7IH0gd2hpbGUgKDApCisKKyAgICAgIGlmIChiaXQxICE9IDEpICBGQUlMICgiYml0MSAhPSAxIik7CisgICAgICBpZiAoYml0MiAhPSAwKSAgRkFJTCAoImJpdDIgIT0gMCIpOworICAgICAgaWYgKGJpdDMgIT0gMSkgIEZBSUwgKCJiaXQzICE9IDEiKTsKKworICAgICAgaWYgKGJpdDAgPT0gMCkKKwl7CisJICBpZiAobXB6X2NtcCAoczAsIHMxKSA9PSAwIHx8IG1wel9jbXAgKHMwLCBzMikgIT0gMCB8fCBtcHpfY21wIChzMCwgczMpID09IDApCisJICAgIGFib3J0ICgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobXB6X2NtcCAoczAsIHMxKSAhPSAwIHx8IG1wel9jbXAgKHMwLCBzMikgPT0gMCB8fCBtcHpfY21wIChzMCwgczMpICE9IDApCisJICAgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKG1wel9jbXAgKHMxLCBzMikgPT0gMCB8fCBtcHpfY21wIChzMSwgczMpICE9IDApCisJYWJvcnQgKCk7CisgICAgICBpZiAobXB6X2NtcCAoczIsIHMzKSA9PSAwKQorCWFib3J0ICgpOworCisgICAgICBtcHpfY29tYml0ICh4LCBiaXRpbmRleCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh4KTsKKyAgICAgIGlmIChtcHpfY21wIChzMiwgeCkgIT0gMCkKKwlhYm9ydCAoKTsKKworICAgICAgbXB6X2NscmJpdCAoeCwgYml0aW5kZXgpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoeCk7CisgICAgICBpZiAobXB6X2NtcCAoczIsIHgpICE9IDApCisJYWJvcnQgKCk7CisKKyAgICAgIG1wel91aV9wb3dfdWkgKG0sIDJMLCBiaXRpbmRleCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChtKTsKKyAgICAgIG1wel9pb3IgKHgsIHMwLCBtKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHgpOworICAgICAgaWYgKG1wel9jbXAgKHgsIHMzKSAhPSAwKQorCWFib3J0ICgpOworCisgICAgICBtcHpfY29tIChtLCBtKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKG0pOworICAgICAgbXB6X2FuZCAoeCwgczAsIG0pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoeCk7CisgICAgICBpZiAobXB6X2NtcCAoeCwgczIpICE9IDApCisJYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoczApOworICBtcHpfY2xlYXIgKHMxKTsKKyAgbXB6X2NsZWFyIChzMik7CisgIG1wel9jbGVhciAoczMpOworICBtcHpfY2xlYXIgKG0pOworICByZXR1cm47CisKKworIGZhaWw6CisgIHByaW50ZiAoIiVzXG4iLCBzKTsKKyAgcHJpbnRmICgiYml0aW5kZXggPSAlbHVcbiIsIGJpdGluZGV4KTsKKyAgcHJpbnRmICgieCA9ICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIHgpOyBwcmludGYgKCIgaGV4XG4iKTsKKyAgZXhpdCAoMSk7Cit9CisKKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIGNoZWNrX2Nscl9leHRlbmQgKCk7CisgIGNoZWNrX2NvbV9uZWdzICgpOworICBjaGVja190c3RiaXQgKCk7CisgIGNoZWNrX3JhbmRvbSAoYXJnYywgYXJndik7CisgIGNoZWNrX3NpbmdsZSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtY2Rpdl91aS5jIGIvdGVzdHMvbXB6L3QtY2Rpdl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTU5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1jZGl2X3VpLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIFRlc3QgbXB6X2FicywgbXB6X2FkZCwgbXB6X2NtcCwgbXB6X2NtcF91aSwgbXB6X2NkaXZfcXJfdWksIG1wel9jZGl2X3FfdWksCisgICBtcHpfY2Rpdl9yX3VpLCAsIG1wel9jZGl2X3VpLCBtcHpfbXVsX3VpLgorCitDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordm9pZCBkdW1wX2Fib3J0IChjb25zdCBjaGFyICosIG1wel90LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgZGl2aWRlbmQ7CisgIG1wel90IHF1b3RpZW50LCByZW1haW5kZXI7CisgIG1wel90IHF1b3RpZW50MiwgcmVtYWluZGVyMjsKKyAgbXB6X3QgdGVtcDsKKyAgbXBfc2l6ZV90IGRpdmlkZW5kX3NpemU7CisgIHVuc2lnbmVkIGxvbmcgZGl2aXNvcjsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDA7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisgIHVuc2lnbmVkIGxvbmcgcl9ycSwgcl9xLCByX3IsIHI7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGJzKTsKKworICBpZiAoYXJnYyA9PSAyKQorICAgICByZXBzID0gYXRvaSAoYXJndlsxXSk7CisKKyAgbXB6X2luaXQgKGRpdmlkZW5kKTsKKyAgbXB6X2luaXQgKHF1b3RpZW50KTsKKyAgbXB6X2luaXQgKHJlbWFpbmRlcik7CisgIG1wel9pbml0IChxdW90aWVudDIpOworICBtcHpfaW5pdCAocmVtYWluZGVyMik7CisgIG1wel9pbml0ICh0ZW1wKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTAgKyAyOyAvKiAwLi4yMDQ3IGJpdCBvcGVyYW5kcyAqLworCisgICAgICBkbworCXsKKwkgIG1wel9ycmFuZG9tYiAoYnMsIHJhbmRzLCA2NCk7CisJICBkaXZpc29yID0gbXB6X2dldF91aSAoYnMpOworCX0KKyAgICAgIHdoaWxlIChkaXZpc29yID09IDApOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBkaXZpZGVuZF9zaXplID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChkaXZpZGVuZCwgcmFuZHMsIGRpdmlkZW5kX3NpemUpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMik7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBpZiAoKGJzaSAmIDEpICE9IDApCisJbXB6X25lZyAoZGl2aWRlbmQsIGRpdmlkZW5kKTsKKworICAgICAgLyogcHJpbnRmICgiJWxkXG4iLCBTSVogKGRpdmlkZW5kKSk7ICovCisKKyAgICAgIHJfcnEgPSBtcHpfY2Rpdl9xcl91aSAocXVvdGllbnQsIHJlbWFpbmRlciwgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgcl9xID0gbXB6X2NkaXZfcV91aSAocXVvdGllbnQyLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICByX3IgPSBtcHpfY2Rpdl9yX3VpIChyZW1haW5kZXIyLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICByID0gbXB6X2NkaXZfdWkgKGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogRmlyc3QgZGV0ZXJtaW5lIHRoYXQgdGhlIHF1b3RpZW50cyBhbmQgcmVtYWluZGVycyBjb21wdXRlZAorCSB3aXRoIGRpZmZlcmVudCBmdW5jdGlvbnMgYXJlIGVxdWFsLiAgKi8KKyAgICAgIGlmIChtcHpfY21wIChxdW90aWVudCwgcXVvdGllbnQyKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJxdW90aWVudHMgZnJvbSBtcHpfY2Rpdl9xcl91aSBhbmQgbXB6X2NkaXZfcV91aSBkaWZmZXIiLAorCQkgICAgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgaWYgKG1wel9jbXAgKHJlbWFpbmRlciwgcmVtYWluZGVyMikgIT0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVycyBmcm9tIG1wel9jZGl2X3FyX3VpIGFuZCBtcHpfY2Rpdl9yX3VpIGRpZmZlciIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBzaWduIG9mIHRoZSBxdW90aWVudCBpcyBjb3JyZWN0LiAgKi8KKyAgICAgIGlmIChtcHpfY21wX3VpIChxdW90aWVudCwgMCkgIT0gMCkKKwlpZiAoKG1wel9jbXBfdWkgKHF1b3RpZW50LCAwKSA8IDApCisJICAgICE9IChtcHpfY21wX3VpIChkaXZpZGVuZCwgMCkgPCAwKSkKKwlkdW1wX2Fib3J0ICgicXVvdGllbnQgc2lnbiB3cm9uZyIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIHJlbWFpbmRlciBoYXMgdGhlIG9wcG9zaXRlIHNpZ24gYXMgdGhlIChwb3NpdGl2ZSkgZGl2aXNvcgorCSAocXVvdGllbnQgcm91bmRlZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5KS4gICovCisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCAwKSAhPSAwKQorCWlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIDApID4gMCkKKwkgIGR1bXBfYWJvcnQgKCJyZW1haW5kZXIgc2lnbiB3cm9uZyIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgbXB6X211bF91aSAodGVtcCwgcXVvdGllbnQsIGRpdmlzb3IpOworICAgICAgbXB6X2FkZCAodGVtcCwgdGVtcCwgcmVtYWluZGVyKTsKKyAgICAgIGlmIChtcHpfY21wICh0ZW1wLCBkaXZpZGVuZCkgIT0gMCkKKwlkdW1wX2Fib3J0ICgibiBtb2QgZCAhPSBuIC0gW24vZF0qZCIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgbXB6X2FicyAocmVtYWluZGVyLCByZW1haW5kZXIpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgZGl2aXNvcikgPj0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVyIGdyZWF0ZXIgdGhhbiBkaXZpc29yIiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCByX3JxKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXIgcmV0dXJuZWQgZnJvbSBtcHpfY2Rpdl9xcl91aSBpcyB3cm9uZyIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCByX3EpICE9IDApCisJZHVtcF9hYm9ydCAoInJlbWFpbmRlciByZXR1cm5lZCBmcm9tIG1wel9jZGl2X3FfdWkgaXMgd3JvbmciLAorCQkgICAgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgcl9yKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXIgcmV0dXJuZWQgZnJvbSBtcHpfY2Rpdl9yX3VpIGlzIHdyb25nIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIHIpICE9IDApCisJZHVtcF9hYm9ydCAoInJlbWFpbmRlciByZXR1cm5lZCBmcm9tIG1wel9jZGl2X3VpIGlzIHdyb25nIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChicyk7CisgIG1wel9jbGVhciAoZGl2aWRlbmQpOworICBtcHpfY2xlYXIgKHF1b3RpZW50KTsKKyAgbXB6X2NsZWFyIChyZW1haW5kZXIpOworICBtcHpfY2xlYXIgKHF1b3RpZW50Mik7CisgIG1wel9jbGVhciAocmVtYWluZGVyMik7CisgIG1wel9jbGVhciAodGVtcCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZHVtcF9hYm9ydCAoY29uc3QgY2hhciAqc3RyLCBtcHpfdCBkaXZpZGVuZCwgdW5zaWduZWQgbG9uZyBkaXZpc29yKQoreworICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogJXNcbiIsIHN0cik7CisgIGZwcmludGYgKHN0ZGVyciwgImRpdmlkZW5kID0gIik7IGRlYnVnX21wIChkaXZpZGVuZCwgLTE2KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGl2aXNvciAgPSAlbFhcbiIsIGRpdmlzb3IpOworICBhYm9ydCgpOworfQorCit2b2lkCitkZWJ1Z19tcCAobXB6X3QgeCwgaW50IGJhc2UpCit7CisgIG1wel9vdXRfc3RyIChzdGRlcnIsIGJhc2UsIHgpOyBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWNtcC5jIGIvdGVzdHMvbXB6L3QtY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlMjUxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWNtcC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBUZXN0IG1wel9jbXAgYW5kIG1wel9jbXBhYnMuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogTm90aGluZyBzb3BoaXN0aWNhdGVkIGhlcmUsIGp1c3QgZXhlcmNpc2Ugc29tZSBjb21iaW5hdGlvbnMgb2Ygc2l6ZXMgYW5kCisgICBzaWducy4gICovCisKKwordm9pZAorY2hlY2tfb25lIChtcHpfcHRyIHgsIG1wel9wdHIgeSwgaW50IHdhbnRfY21wLCBpbnQgd2FudF9jbXBhYnMpCit7CisgIGludCAgZ290OworCisgIGdvdCA9IG1wel9jbXAgKHgsIHkpOworICBpZiAoKCAgIGdvdCA8ICAwKSAhPSAod2FudF9jbXAgPCAgMCkKKyAgICAgIHx8IChnb3QgPT0gMCkgIT0gKHdhbnRfY21wID09IDApCisgICAgICB8fCAoZ290ID4gIDApICE9ICh3YW50X2NtcCA+ICAwKSkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfY21wIGdvdCAlZCB3YW50ICVkXG4iLCBnb3QsIHdhbnRfY21wKTsKKyAgICAgIG1wel90cmFjZSAoIngiLCB4KTsKKyAgICAgIG1wel90cmFjZSAoInkiLCB5KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBnb3QgPSBtcHpfY21wYWJzICh4LCB5KTsKKyAgaWYgKCggICBnb3QgPCAgMCkgIT0gKHdhbnRfY21wYWJzIDwgIDApCisgICAgICB8fCAoZ290ID09IDApICE9ICh3YW50X2NtcGFicyA9PSAwKQorICAgICAgfHwgKGdvdCA+ICAwKSAhPSAod2FudF9jbXBhYnMgPiAgMCkpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2NtcGFicyBnb3QgJWQgd2FudCAlZFxuIiwgZ290LCB3YW50X2NtcGFicyk7CisgICAgICBtcHpfdHJhY2UgKCJ4IiwgeCk7CisgICAgICBtcHpfdHJhY2UgKCJ5IiwgeSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKwordm9pZAorY2hlY2tfYWxsIChtcHpfcHRyIHgsIG1wel9wdHIgeSwgaW50IHdhbnRfY21wLCBpbnQgd2FudF9jbXBhYnMpCit7CisgIGNoZWNrX29uZSAoeCwgeSwgIHdhbnRfY21wLCAgd2FudF9jbXBhYnMpOworICBjaGVja19vbmUgKHksIHgsIC13YW50X2NtcCwgLXdhbnRfY21wYWJzKTsKKworICBtcHpfbmVnICh4LCB4KTsKKyAgbXB6X25lZyAoeSwgeSk7CisgIHdhbnRfY21wID0gLXdhbnRfY21wOworCisgIGNoZWNrX29uZSAoeCwgeSwgIHdhbnRfY21wLCAgd2FudF9jbXBhYnMpOworICBjaGVja19vbmUgKHksIHgsIC13YW50X2NtcCwgLXdhbnRfY21wYWJzKTsKK30KKworCisjZGVmaW5lIFNFVDEoeixzaXplLCBuKSBcCisgIFNJWih6KSA9IHNpemU7IFBUUih6KVswXSA9IG4KKworI2RlZmluZSBTRVQyKHosc2l6ZSwgbjEsbjApIFwKKyAgU0laKHopID0gc2l6ZTsgUFRSKHopWzFdID0gbjE7IFBUUih6KVswXSA9IG4wCisKKyNkZWZpbmUgU0VUNCh6LHNpemUsIG4zLG4yLG4xLG4wKSBcCisgIFNJWih6KSA9IHNpemU7IFBUUih6KVszXSA9IG4zOyBQVFIoeilbMl0gPSBuMjsgUFRSKHopWzFdID0gbjE7IFBUUih6KVswXSA9IG4wCisKK3ZvaWQKK2NoZWNrX3ZhcmlvdXMgKHZvaWQpCit7CisgIG1wel90ICB4LCB5OworCisgIG1wel9pbml0ICh4KTsKKyAgbXB6X2luaXQgKHkpOworCisgIG1wel9yZWFsbG9jICh4LCAobXBfc2l6ZV90KSAyMCk7CisgIG1wel9yZWFsbG9jICh5LCAobXBfc2l6ZV90KSAyMCk7CisKKyAgLyogMCBjbXAgMCwganVuayBpbiBsb3cgbGltYnMgKi8KKyAgU0VUMSAoeCwwLCAxMjMpOworICBTRVQxICh5LDAsIDQ1Nik7CisgIGNoZWNrX2FsbCAoeCwgeSwgMCwgMCk7CisKKworICAvKiAxMjMgY21wIDAgKi8KKyAgU0VUMSAoeCwxLCAxMjMpOworICBTRVQxICh5LDAsIDQ1Nik7CisgIGNoZWNrX2FsbCAoeCwgeSwgMSwgMSk7CisKKyAgLyogMTIzOjQ1NiBjbXAgMCAqLworICBTRVQyICh4LDIsIDQ1NiwxMjMpOworICBTRVQxICh5LDAsIDk5OTkpOworICBjaGVja19hbGwgKHgsIHksIDEsIDEpOworCisKKyAgLyogMTIzIGNtcCAxMjMgKi8KKyAgU0VUMSh4LDEsIDEyMyk7CisgIFNFVDEoeSwxLCAxMjMpOworICBjaGVja19hbGwgKHgsIHksIDAsIDApOworCisgIC8qIC0xMjMgY21wIDEyMyAqLworICBTRVQxKHgsLTEsIDEyMyk7CisgIFNFVDEoeSwxLCAgMTIzKTsKKyAgY2hlY2tfYWxsICh4LCB5LCAtMSwgMCk7CisKKworICAvKiAxMjMgY21wIDQ1NiAqLworICBTRVQxKHgsMSwgMTIzKTsKKyAgU0VUMSh5LDEsIDQ1Nik7CisgIGNoZWNrX2FsbCAoeCwgeSwgLTEsIC0xKTsKKworICAvKiAtMTIzIGNtcCA0NTYgKi8KKyAgU0VUMSh4LC0xLCAxMjMpOworICBTRVQxKHksMSwgIDQ1Nik7CisgIGNoZWNrX2FsbCAoeCwgeSwgLTEsIC0xKTsKKworICAvKiAxMjMgY21wIC00NTYgKi8KKyAgU0VUMSh4LDEsICAxMjMpOworICBTRVQxKHksLTEsIDQ1Nik7CisgIGNoZWNrX2FsbCAoeCwgeSwgMSwgLTEpOworCisKKyAgLyogMTowIGNtcCAxOjAgKi8KKyAgU0VUMiAoeCwyLCAxLDApOworICBTRVQyICh5LDIsIDEsMCk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMCwgMCk7CisKKyAgLyogLTE6MCBjbXAgMTowICovCisgIFNFVDIgKHgsLTIsIDEsMCk7CisgIFNFVDIgKHksMiwgIDEsMCk7CisgIGNoZWNrX2FsbCAoeCwgeSwgLTEsIDApOworCisKKyAgLyogMjowIGNtcCAxOjAgKi8KKyAgU0VUMiAoeCwyLCAyLDApOworICBTRVQyICh5LDIsIDEsMCk7CisgIGNoZWNrX2FsbCAoeCwgeSwgMSwgMSk7CisKKworICAvKiA0OjM6MjoxIGNtcCAyOjEgKi8KKyAgU0VUNCAoeCw0LCA0LDMsMiwxKTsKKyAgU0VUMiAoeSwyLCAyLDEpOworICBjaGVja19hbGwgKHgsIHksIDEsIDEpOworCisgIC8qIC00OjM6MjoxIGNtcCAyOjEgKi8KKyAgU0VUNCAoeCwtNCwgNCwzLDIsMSk7CisgIFNFVDIgKHksMiwgIDIsMSk7CisgIGNoZWNrX2FsbCAoeCwgeSwgLTEsIDEpOworCisKKyAgbXB6X2NsZWFyICh4KTsKKyAgbXB6X2NsZWFyICh5KTsKK30KKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIGNoZWNrX3ZhcmlvdXMgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWNtcF9kLmMgYi90ZXN0cy9tcHovdC1jbXBfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Yjk4OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1jbXBfZC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiBUZXN0IG1wel9jbXBfZCBhbmQgbXB6X2NtcGFic19kLgorCitDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBGSVhNRTogTm90IHN1cmUgaWYgdGhlIHRlc3RzIGhlcmUgYXJlIGV4aGF1c3RpdmUuICBPdWdodCB0byB0cnkgdG8gZ2V0CisgICBlYWNoIHBvc3NpYmxlIGV4aXQgZnJvbSBtcHpfY21wX2QgKGFuZCBtcHpfY21wYWJzX2QpIGV4ZXJjaXNlZC4gICovCisKKworI2RlZmluZSBTR04obikgICgobikgPiAwID8gMSA6IChuKSA8IDAgPyAtMSA6IDApCisKKwordm9pZAorY2hlY2tfb25lIChjb25zdCBjaGFyICpuYW1lLCBtcHpfc3JjcHRyIHgsIGRvdWJsZSB5LCBpbnQgY21wLCBpbnQgY21wYWJzKQoreworICBpbnQgICBnb3Q7CisKKyAgZ290ID0gbXB6X2NtcF9kICh4LCB5KTsKKyAgaWYgKFNHTihnb3QpICE9IGNtcCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHByaW50ZiAgICAoIm1wel9jbXBfZCB3cm9uZyAoZnJvbSAlcylcbiIsIG5hbWUpOworICAgICAgcHJpbnRmICAgICgiICBnb3QgICVkXG4iLCBnb3QpOworICAgICAgcHJpbnRmICAgICgiICB3YW50ICVkXG4iLCBjbXApOworICAgIGZhaWw6CisgICAgICBtcHpfdHJhY2UgKCIgIHgiLCB4KTsKKyAgICAgIHByaW50ZiAgICAoIiAgeSAlZ1xuIiwgeSk7CisgICAgICBtcF90cmFjZV9iYXNlPS0xNjsKKyAgICAgIG1wel90cmFjZSAoIiAgeCIsIHgpOworICAgICAgcHJpbnRmICAgICgiICB5ICVnXG4iLCB5KTsKKyAgICAgIHByaW50ZiAgICAoIiAgeSIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih5KTsgaSsrKQorICAgICAgICBwcmludGYgKCIgJTAyWCIsICh1bnNpZ25lZCkgKCh1bnNpZ25lZCBjaGFyICopICZ5KVtpXSk7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGdvdCA9IG1wel9jbXBhYnNfZCAoeCwgeSk7CisgIGlmIChTR04oZ290KSAhPSBjbXBhYnMpCisgICAgeworICAgICAgcHJpbnRmICAgICgibXB6X2NtcGFic19kIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAgICAoIiAgZ290ICAlZFxuIiwgZ290KTsKKyAgICAgIHByaW50ZiAgICAoIiAgd2FudCAlZFxuIiwgY21wYWJzKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9Cit9CisKKwordm9pZAorY2hlY2tfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKng7CisgICAgZG91YmxlICAgICAgeTsKKyAgICBpbnQgICAgICAgICBjbXAsIGNtcGFiczsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgICIwIiwgIDAuMCwgIDAsICAwIH0sCisKKyAgICB7ICAiMSIsICAwLjAsICAxLCAgMSB9LAorICAgIHsgIi0xIiwgIDAuMCwgLTEsICAxIH0sCisKKyAgICB7ICAiMSIsICAwLjUsICAxLCAgMSB9LAorICAgIHsgIi0xIiwgLTAuNSwgLTEsICAxIH0sCisKKyAgICB7ICAiMCIsICAxLjAsIC0xLCAtMSB9LAorICAgIHsgICIwIiwgLTEuMCwgIDEsIC0xIH0sCisKKyAgICB7ICAiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMS4wLCAgMSwgMSB9LAorICAgIHsgIi0weDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAxLjAsIC0xLCAxIH0sCisKKyAgICB7ICAiMCIsICAxZTEwMCwgLTEsIC0xIH0sCisgICAgeyAgIjAiLCAtMWUxMDAsICAxLCAtMSB9LAorCisgICAgeyAgIjIiLCAgMS41LCAgIDEsICAxIH0sCisgICAgeyAgIjIiLCAtMS41LCAgIDEsICAxIH0sCisgICAgeyAiLTIiLCAgMS41LCAgLTEsICAxIH0sCisgICAgeyAiLTIiLCAtMS41LCAgLTEsICAxIH0sCisgIH07CisKKyAgbXB6X3QgIHg7CisgIGludCAgICBpOworCisgIG1wel9pbml0ICh4KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKHgsIGRhdGFbaV0ueCwgMCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19kYXRhIiwgeCwgZGF0YVtpXS55LCBkYXRhW2ldLmNtcCwgZGF0YVtpXS5jbXBhYnMpOworICAgIH0KKworICBtcHpfY2xlYXIgKHgpOworfQorCisKKy8qIEVxdWFsaXR5IG9mIGludGVnZXJzIHdpdGggdXAgdG8gNTMgYml0cyAqLwordm9pZAorY2hlY2tfb25lYml0cyAodm9pZCkKK3sKKyAgbXB6X3QgICB4LCB4MjsKKyAgZG91YmxlICB5OworICBpbnQgICAgIGk7CisKKyAgbXB6X2luaXRfc2V0X3VpICh4LCAwTCk7CisgIG1wel9pbml0ICh4Mik7CisKKyAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQorICAgIHsKKyAgICAgIG1wel9tdWxfMmV4cCAoeCwgeCwgMSk7CisgICAgICBtcHpfYWRkX3VpICh4LCB4LCAxTCk7CisKKyAgICAgIHkgPSBtcHpfZ2V0X2QgKHgpOworICAgICAgbXB6X3NldF9kICh4MiwgeSk7CisKKyAgICAgIC8qIHN0b3AgaWYgYW55IHRydW5jYXRpb24gaXMgb2NjdXJyaW5nICovCisgICAgICBpZiAobXB6X2NtcCAoeCwgeDIpICE9IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBjaGVja19vbmUgKCJjaGVja19vbmViaXRzIiwgeCwgeSwgMCwgMCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19vbmViaXRzIiwgeCwgLXksIDEsIDApOworICAgICAgbXB6X25lZyAoeCwgeCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19vbmViaXRzIiwgeCwgeSwgLTEsIDApOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfb25lYml0cyIsIHgsIC15LCAwLCAwKTsKKyAgICAgIG1wel9uZWcgKHgsIHgpOworICAgIH0KKworICBtcHpfY2xlYXIgKHgpOworICBtcHpfY2xlYXIgKHgyKTsKK30KKworCisvKiBXaXRoIHRoZSBtcHogZGlmZmVyaW5nIGJ5IDEsIGluIGEgbGltYiBwb3NpdGlvbiBwb3NzaWJseSBiZWxvdyB0aGUgZG91YmxlICovCit2b2lkCitjaGVja19sb3dfel9vbmUgKHZvaWQpCit7CisgIG1wel90ICAgICAgICAgIHg7CisgIGRvdWJsZSAgICAgICAgIHk7CisgIHVuc2lnbmVkIGxvbmcgIGk7CisKKyAgbXB6X2luaXQgKHgpOworCisgIC8qIEZJWE1FOiBJdCdkIGJlIGJldHRlciB0byBiYXNlIHRoaXMgb24gdGhlIGZsb2F0IGZvcm1hdC4gKi8KKyNpZiBkZWZpbmVkIChfX3ZheCkgfHwgZGVmaW5lZCAoX192YXhfXykKKyNkZWZpbmUgTElNIDEyNwkJCS8qIHZheCBmcCBudW1iZXJzIGhhdmUgbGltaXRlZCByYW5nZSAqLworI2Vsc2UKKyNkZWZpbmUgTElNIDUxMgorI2VuZGlmCisKKyAgZm9yIChpID0gMTsgaSA8IExJTTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgICAgIG1wel9tdWxfMmV4cCAoeCwgeCwgaSk7CisgICAgICB5ID0gbXB6X2dldF9kICh4KTsKKworICAgICAgY2hlY2tfb25lICgiY2hlY2tfbG93X3pfb25lIiwgeCwgeSwgICAwLCAwKTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX2xvd196X29uZSIsIHgsIC15LCAgMSwgMCk7CisgICAgICBtcHpfbmVnICh4LCB4KTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX2xvd196X29uZSIsIHgsIHksICAtMSwgMCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19sb3dfel9vbmUiLCB4LCAteSwgIDAsIDApOworICAgICAgbXB6X25lZyAoeCwgeCk7CisKKyAgICAgIG1wel9zdWJfdWkgKHgsIHgsIDEpOworCisgICAgICBjaGVja19vbmUgKCJjaGVja19sb3dfel9vbmUiLCB4LCB5LCAgLTEsIC0xKTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX2xvd196X29uZSIsIHgsIC15LCAgMSwgLTEpOworICAgICAgbXB6X25lZyAoeCwgeCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19sb3dfel9vbmUiLCB4LCB5LCAgLTEsIC0xKTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX2xvd196X29uZSIsIHgsIC15LCAgMSwgLTEpOworICAgICAgbXB6X25lZyAoeCwgeCk7CisKKyAgICAgIG1wel9hZGRfdWkgKHgsIHgsIDIpOworCisgICAgICBjaGVja19vbmUgKCJjaGVja19sb3dfel9vbmUiLCB4LCB5LCAgIDEsIDEpOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfbG93X3pfb25lIiwgeCwgLXksICAxLCAxKTsKKyAgICAgIG1wel9uZWcgKHgsIHgpOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfbG93X3pfb25lIiwgeCwgeSwgIC0xLCAxKTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX2xvd196X29uZSIsIHgsIC15LCAtMSwgMSk7CisgICAgICBtcHpfbmVnICh4LCB4KTsKKyAgICB9CisKKyAgbXB6X2NsZWFyICh4KTsKK30KKworLyogQ29tcGFyaW5nIDEgYW5kIDErMl4tbi4gICJ5IiBpcyB2b2xhdGlsZSB0byBtYWtlIGdjYyBzdG9yZSBhbmQgZmV0Y2ggaXQsCisgICB3aGljaCBmb3JjZXMgaXQgdG8gYSA2NC1iaXQgZG91YmxlLCB3aGVyZWFzIG9uIHg4NiBpdCB3b3VsZCBvdGhlcndpc2UKKyAgIHJlbWFpbiBvbiB0aGUgZmxvYXQgc3RhY2sgYXMgYW4gODAtYml0IGxvbmcgZG91YmxlLiAgKi8KK3ZvaWQKK2NoZWNrX29uZV8yZXhwICh2b2lkKQoreworICBkb3VibGUgICAgICAgICAgIGU7CisgIG1wel90ICAgICAgICAgICAgeDsKKyAgdm9sYXRpbGUgZG91YmxlICB5OworICBpbnQgICAgICAgICAgICAgIGk7CisKKyAgbXB6X2luaXQgKHgpOworCisgIGUgPSAxLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICB7CisgICAgICBlIC89IDIuMDsKKyAgICAgIHkgPSAxLjAgKyBlOworICAgICAgaWYgKHkgPT0gMS4wKQorICAgICAgICBicmVhazsKKworICAgICAgbXB6X3NldF91aSAoeCwgMUwpOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfb25lXzJleHAiLCB4LCAgeSwgLTEsIC0xKTsKKyAgICAgIGNoZWNrX29uZSAoImNoZWNrX29uZV8yZXhwIiwgeCwgLXksICAxLCAtMSk7CisKKyAgICAgIG1wel9zZXRfc2kgKHgsIC0xTCk7CisgICAgICBjaGVja19vbmUgKCJjaGVja19vbmVfMmV4cCIsIHgsICB5LCAtMSwgLTEpOworICAgICAgY2hlY2tfb25lICgiY2hlY2tfb25lXzJleHAiLCB4LCAteSwgIDEsIC0xKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyICh4KTsKK30KKwordm9pZAorY2hlY2tfaW5maW5pdHkgKHZvaWQpCit7CisgIG1wel90ICAgeDsKKyAgZG91YmxlICB5ID0gdGVzdHNfaW5maW5pdHlfZCAoKTsKKyAgaWYgKHkgPT0gMC4wKQorICAgIHJldHVybjsKKworICBtcHpfaW5pdCAoeCk7CisKKyAgLyogMCBjbXAgaW5mICovCisgIG1wel9zZXRfdWkgKHgsIDBMKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAgeSwgLTEsIC0xKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAteSwgIDEsIC0xKTsKKworICAvKiAxMjMgY21wIGluZiAqLworICBtcHpfc2V0X3VpICh4LCAxMjNMKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAgeSwgLTEsIC0xKTsKKyAgY2hlY2tfb25lICgiY2hlY2tfaW5maW5pdHkiLCB4LCAteSwgIDEsIC0xKTsKKworICAvKiAtMTIzIGNtcCBpbmYgKi8KKyAgbXB6X3NldF9zaSAoeCwgLTEyM0wpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsICB5LCAtMSwgLTEpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsIC15LCAgMSwgLTEpOworCisgIC8qIDJeNTAwMCBjbXAgaW5mICovCisgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgbXB6X211bF8yZXhwICh4LCB4LCA1MDAwTCk7CisgIGNoZWNrX29uZSAoImNoZWNrX2luZmluaXR5IiwgeCwgIHksIC0xLCAtMSk7CisgIGNoZWNrX29uZSAoImNoZWNrX2luZmluaXR5IiwgeCwgLXksICAxLCAtMSk7CisKKyAgLyogLTJeNTAwMCBjbXAgaW5mICovCisgIG1wel9uZWcgKHgsIHgpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsICB5LCAtMSwgLTEpOworICBjaGVja19vbmUgKCJjaGVja19pbmZpbml0eSIsIHgsIC15LCAgMSwgLTEpOworCisgIG1wel9jbGVhciAoeCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfb25lYml0cyAoKTsKKyAgY2hlY2tfbG93X3pfb25lICgpOworICBjaGVja19vbmVfMmV4cCAoKTsKKyAgY2hlY2tfaW5maW5pdHkgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWNtcF9zaS5jIGIvdGVzdHMvbXB6L3QtY21wX3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2N2QzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWNtcF9zaS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBUZXN0IG1wel9jbXBfc2kuCisKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKyNkZWZpbmUgU0dOKHgpICAgICAgICgoeCkgPCAwID8gLTEgOiAoeCkgPT0gMCA/IDAgOiAxKQorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqYSwgKmI7CisgICAgaW50ICAgICAgICAgd2FudDsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAiMCIsICAiMSIsIC0xIH0sCisgICAgeyAiMCIsICAiMCIsICAwIH0sCisgICAgeyAiMCIsICItMSIsICAxIH0sCisKKyAgICB7ICIxIiwgICIxIiwgMCB9LAorICAgIHsgIjEiLCAgIjAiLCAxIH0sCisgICAgeyAiMSIsICItMSIsIDEgfSwKKworICAgIHsgIi0xIiwgICIxIiwgLTEgfSwKKyAgICB7ICItMSIsICAiMCIsIC0xIH0sCisgICAgeyAiLTEiLCAiLTEiLCAwIH0sCisKKyAgICB7ICAgICAgICAgICAiMCIsICItMHg4MDAwMDAwMCIsICAxIH0sCisgICAgeyAgIjB4ODAwMDAwMDAiLCAiLTB4ODAwMDAwMDAiLCAgMSB9LAorICAgIHsgICIweDgwMDAwMDAxIiwgIi0weDgwMDAwMDAwIiwgIDEgfSwKKyAgICB7ICItMHg4MDAwMDAwMCIsICItMHg4MDAwMDAwMCIsICAwIH0sCisgICAgeyAiLTB4ODAwMDAwMDEiLCAiLTB4ODAwMDAwMDAiLCAtMSB9LAorCisgICAgeyAgICAgICAgICAgICAgICAgICAiMCIsICItMHg4MDAwMDAwMDAwMDAwMDAwIiwgIDEgfSwKKyAgICB7ICAiMHg4MDAwMDAwMDAwMDAwMDAwIiwgIi0weDgwMDAwMDAwMDAwMDAwMDAiLCAgMSB9LAorICAgIHsgICIweDgwMDAwMDAwMDAwMDAwMDEiLCAiLTB4ODAwMDAwMDAwMDAwMDAwMCIsICAxIH0sCisgICAgeyAiLTB4ODAwMDAwMDAwMDAwMDAwMCIsICItMHg4MDAwMDAwMDAwMDAwMDAwIiwgIDAgfSwKKyAgICB7ICItMHg4MDAwMDAwMDAwMDAwMDAxIiwgIi0weDgwMDAwMDAwMDAwMDAwMDAiLCAtMSB9LAorICB9OworCisgIG1wel90ICBhLCBiejsKKyAgbG9uZyAgIGI7CisgIGludCAgICBnb3Q7CisgIGludCAgICBpOworCisgIG1wel9pbml0IChhKTsKKyAgbXB6X2luaXQgKGJ6KTsKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChhLCBkYXRhW2ldLmEsIDApOworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKGJ6LCBkYXRhW2ldLmIsIDApOworCisgICAgICBpZiAobXB6X2ZpdHNfc2xvbmdfcCAoYnopKQorCXsKKwkgIGIgPSBtcHpfZ2V0X3NpIChieik7CisJICBnb3QgPSBtcHpfY21wX3NpIChhLCBiKTsKKwkgIGlmIChTR04gKGdvdCkgIT0gZGF0YVtpXS53YW50KQorCSAgICB7CisJICAgICAgcHJpbnRmICgibXB6X2NtcF9zaSB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisJICAgICAgcHJpbnRmICgiICBhPSIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgYSk7IHByaW50ZiAoIlxuIik7CisJICAgICAgcHJpbnRmICgiICBiPSVsZFxuIiwgYik7CisJICAgICAgcHJpbnRmICgiICBnb3Q9JWRcbiIsIGdvdCk7CisJICAgICAgcHJpbnRmICgiICB3YW50PSVkXG4iLCBkYXRhW2ldLndhbnQpOworCSAgICAgIGFib3J0KCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYnopOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtY29uZy5jIGIvdGVzdHMvbXB6L3QtY29uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDg1MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1jb25nLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIHRlc3QgbXB6X2NvbmdydWVudF9wIGFuZCBtcHpfY29uZ3J1ZW50X3VpX3AKKworQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBjLCBtcHpfc3JjcHRyIGQsIGludCB3YW50KQoreworICBpbnQgICBnb3Q7CisgIGludCAgIHN3YXA7CisKKyAgZm9yIChzd2FwID0gMDsgc3dhcCA8PSAxOyBzd2FwKyspCisgICAgeworICAgICAgZ290ID0gKG1wel9jb25ncnVlbnRfcCAoYSwgYywgZCkgIT0gMCk7CisgICAgICBpZiAod2FudCAhPSBnb3QpCisJeworCSAgcHJpbnRmICgibXB6X2NvbmdydWVudF9wIHdyb25nXG4iKTsKKwkgIHByaW50ZiAoIiAgIGV4cGVjdGVkICVkIGdvdCAlZFxuIiwgd2FudCwgZ290KTsKKwkgIG1wel90cmFjZSAoIgkgYSIsIGEpOworCSAgbXB6X3RyYWNlICgiCSBjIiwgYyk7CisJICBtcHpfdHJhY2UgKCIJIGQiLCBkKTsKKwkgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisJICBtcHpfdHJhY2UgKCIJIGEiLCBhKTsKKwkgIG1wel90cmFjZSAoIgkgYyIsIGMpOworCSAgbXB6X3RyYWNlICgiCSBkIiwgZCk7CisJICBhYm9ydCAoKTsKKwl9CisKKyAgICAgIGlmIChtcHpfZml0c191bG9uZ19wIChjKSAmJiBtcHpfZml0c191bG9uZ19wIChkKSkKKwl7CisJICB1bnNpZ25lZCBsb25nCSB1YyA9IG1wel9nZXRfdWkgKGMpOworCSAgdW5zaWduZWQgbG9uZwkgdWQgPSBtcHpfZ2V0X3VpIChkKTsKKwkgIGdvdCA9IChtcHpfY29uZ3J1ZW50X3VpX3AgKGEsIHVjLCB1ZCkgIT0gMCk7CisJICBpZiAod2FudCAhPSBnb3QpCisJICAgIHsKKwkgICAgICBwcmludGYJKCJtcHpfY29uZ3J1ZW50X3VpX3Agd3JvbmdcbiIpOworCSAgICAgIHByaW50ZgkoIiAgIGV4cGVjdGVkICVkIGdvdCAlZFxuIiwgd2FudCwgZ290KTsKKwkgICAgICBtcHpfdHJhY2UgKCIgICBhIiwgYSk7CisJICAgICAgcHJpbnRmCSgiICAgYz0lbHVcbiIsIHVjKTsKKwkgICAgICBwcmludGYJKCIgICBkPSVsdVxuIiwgdWQpOworCSAgICAgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisJICAgICAgbXB6X3RyYWNlICgiICAgYSIsIGEpOworCSAgICAgIHByaW50ZgkoIiAgIGM9MHglbFhcbiIsIHVjKTsKKwkgICAgICBwcmludGYJKCIgICBkPTB4JWxYXG4iLCB1ZCk7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisKKyAgICAgIE1QWl9TUkNQVFJfU1dBUCAoYSwgYyk7CisgICAgfQorfQorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmE7CisgICAgY29uc3QgY2hhciAqYzsKKyAgICBjb25zdCBjaGFyICpkOworICAgIGludCAgICAgICAgd2FudDsKKworICB9IGRhdGFbXSA9IHsKKworICAgIC8qIHN0cmljdCBlcXVhbGl0eSBtb2QgMCAqLworICAgIHsgIjAiLCAiMCIsICIwIiwgMSB9LAorICAgIHsgIjExIiwgIjExIiwgIjAiLCAxIH0sCisgICAgeyAiMyIsICIxMSIsICIwIiwgMCB9LAorCisgICAgLyogYW55dGhpbmcgY29uZ3J1ZW50IG1vZCAxICovCisgICAgeyAiMCIsICIwIiwgIjEiLCAxIH0sCisgICAgeyAiMSIsICIwIiwgIjEiLCAxIH0sCisgICAgeyAiMCIsICIxIiwgIjEiLCAxIH0sCisgICAgeyAiMTIzIiwgIjQ1NiIsICIxIiwgMSB9LAorICAgIHsgIjB4MTIzNDU2Nzg5MTIzNDU2Nzg5IiwgIjB4OTg3NjU0MzIxOTg3NjU0MzIxIiwgIjEiLCAxIH0sCisKKyAgICAvKiBjc2l6ZT09MSwgZHNpemU9PTIgY2hhbmdpbmcgdG8gMSBhZnRlciBzdHJpcHBpbmcgMnMgKi8KKyAgICB7ICIweDMzMzMzMzMzMzMzMzMzMzMiLCAgIjB4MzMzMzMzMzMiLAorICAgICAgIjB4MTgwMDAwMDAwIiwgMSB9LAorICAgIHsgIjB4MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiLCAiMHgzMzMzMzMzMzMzMzMzMzMzIiwKKyAgICAgICIweDE4MDAwMDAwMDAwMDAwMDAwIiwgMSB9LAorCisgICAgLyogYW5vdGhlciBkc2l6ZT09MiBiZWNvbWluZyAxLCB3aXRoIG9wcG9zaXRlIHNpZ25zIHRoaXMgdGltZSAqLworICAgIHsgICIweDQ0NDQ0NDQ0MSIsCisgICAgICAiLTB4MjIyMjIyMjFGIiwKKyAgICAgICAiMHgzMzMzMzMzMzAiLCAxIH0sCisgICAgeyAgIjB4NDQ0NDQ0NDQ0NDQ0NDQ0NDEiLAorICAgICAgIi0weDIyMjIyMjIyMjIyMjIyMjFGIiwKKyAgICAgICAiMHgzMzMzMzMzMzMzMzMzMzMzMCIsIDEgfSwKKyAgfTsKKworICBtcHpfdCAgIGEsIGMsIGQ7CisgIGludCAgICAgaTsKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChjKTsKKyAgbXB6X2luaXQgKGQpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoYSwgZGF0YVtpXS5hLCAwKTsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChjLCBkYXRhW2ldLmMsIDApOworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKGQsIGRhdGFbaV0uZCwgMCk7CisgICAgICBjaGVja19vbmUgKGEsIGMsIGQsIGRhdGFbaV0ud2FudCk7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYyk7CisgIG1wel9jbGVhciAoZCk7Cit9CisKKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBtcHpfdCAgIGEsIGMsIGQsIHJhLCByYzsKKyAgaW50ICAgICBpOworICBpbnQgICAgIHdhbnQ7CisgIGludCAgICAgcmVwcyA9IDEwMDAwOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBzaXplX3JhbmdlLCBzaXplOworCisgIGlmIChhcmdjID49IDIpCisgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYyk7CisgIG1wel9pbml0IChkKTsKKyAgbXB6X2luaXQgKHJhKTsKKyAgbXB6X2luaXQgKHJjKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTYgKyAxOyAvKiAwLi42NTUzNiBiaXQgb3BlcmFuZHMgKi8KKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIHNpemUpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDE2ICsgMTsgLyogMC4uNjU1MzYgYml0IG9wZXJhbmRzICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIHNpemUgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKGMsIHJhbmRzLCBzaXplKTsKKworICAgICAgZG8KKwl7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworCSAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDE2ICsgMTsgLyogMC4uNjU1MzYgYml0IG9wZXJhbmRzICovCisKKwkgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKwkgIHNpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKGQsIHJhbmRzLCBzaXplKTsKKwl9CisgICAgICB3aGlsZSAoU0laKGQpID09IDApOworCisgICAgICBtcHpfbmVncmFuZG9tIChhLCByYW5kcyk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChhKTsKKyAgICAgIG1wel9uZWdyYW5kb20gKGMsIHJhbmRzKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKGMpOworICAgICAgbXB6X25lZ3JhbmRvbSAoZCwgcmFuZHMpOworCisgICAgICBtcHpfZmRpdl9yIChyYSwgYSwgZCk7CisgICAgICBtcHpfZmRpdl9yIChyYywgYywgZCk7CisKKyAgICAgIHdhbnQgPSAobXB6X2NtcCAocmEsIHJjKSA9PSAwKTsKKyAgICAgIGNoZWNrX29uZSAoYSwgYywgZCwgd2FudCk7CisKKyAgICAgIG1wel9zdWIgKHJhLCByYSwgcmMpOworICAgICAgbXB6X3N1YiAoYSwgYSwgcmEpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoYSk7CisgICAgICBjaGVja19vbmUgKGEsIGMsIGQsIDEpOworCisgICAgICBpZiAoISBtcHpfcG93MmFic19wIChkKSkKKyAgICAgICAgeworCSAgcmVmbXB6X2NvbWJpdCAoYSwgdXJhbmRvbSgpICUgKDgqR01QX0xJTUJfQklUUykpOworCSAgY2hlY2tfb25lIChhLCBjLCBkLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGMpOworICBtcHpfY2xlYXIgKGQpOworICBtcHpfY2xlYXIgKHJhKTsKKyAgbXB6X2NsZWFyIChyYyk7Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworICBjaGVja19yYW5kb20gKGFyZ2MsIGFyZ3YpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1jb25nXzJleHAuYyBiL3Rlc3RzL21wei90LWNvbmdfMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmUyZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1jb25nXzJleHAuYwpAQCAtMCwwICsxLDIwNyBAQAorLyogdGVzdCBtcHpfY29uZ3J1ZW50XzJleHBfcCAqLworCisvKgorQ29weXJpZ2h0IDIwMDEsIDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBjLCB1bnNpZ25lZCBsb25nIGQsIGludCB3YW50KQoreworICBtcHpfdCAgZGlmZiwgZDJleHA7CisgIGludCAgICBnb3Q7CisgIGludCAgICBzd2FwOworCisgIGZvciAoc3dhcCA9IDA7IHN3YXAgPD0gMTsgc3dhcCsrKQorICAgIHsKKyAgICAgIGdvdCA9IChtcHpfY29uZ3J1ZW50XzJleHBfcCAoYSwgYywgZCkgIT0gMCk7CisgICAgICBpZiAod2FudCAhPSBnb3QpCisgICAgICAgIHsKKyAgICAgICAgICBtcHpfaW5pdCAoZGlmZik7CisgICAgICAgICAgbXB6X2luaXQgKGQyZXhwKTsKKworICAgICAgICAgIG1wel9zdWIgKGRpZmYsIGEsIGMpOworICAgICAgICAgIG1wel9zZXRfdWkgKGQyZXhwLCAxTCk7CisgICAgICAgICAgbXB6X211bF8yZXhwIChkMmV4cCwgZDJleHAsIGQpOworCisgICAgICAgICAgcHJpbnRmICgibXB6X2NvbmdydWVudF8yZXhwX3Agd3JvbmdcbiIpOworICAgICAgICAgIHByaW50ZiAoIiAgIGV4cGVjdGVkICVkIGdvdCAlZFxuIiwgd2FudCwgZ290KTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgICBhIiwgYSk7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgYyIsIGMpOworICAgICAgICAgIG1wel90cmFjZSAoIiBhLWMiLCBkaWZmKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgMl5kIiwgZDJleHApOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIGQ9JWx1XG4iLCBkKTsKKworICAgICAgICAgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgYSIsIGEpOworICAgICAgICAgIG1wel90cmFjZSAoIiAgIGMiLCBjKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgYS1jIiwgZGlmZik7CisgICAgICAgICAgbXB6X3RyYWNlICgiIDJeZCIsIGQyZXhwKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgICBkPTB4JWxYXG4iLCBkKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICBNUFpfU1JDUFRSX1NXQVAgKGEsIGMpOworICAgIH0KK30KKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAgICAqYTsKKyAgICBjb25zdCBjaGFyICAgICAqYzsKKyAgICB1bnNpZ25lZCBsb25nICBkOworICAgIGludCAgICAgICAgICAgIHdhbnQ7CisKKyAgfSBkYXRhW10gPSB7CisKKyAgICAvKiBhbnl0aGluZyBpcyBjb25ncnVlbnQgbW9kIDEgKi8KKyAgICB7ICIwIiwgIjAiLCAwLCAxIH0sCisgICAgeyAiMSIsICIwIiwgMCwgMSB9LAorICAgIHsgIjAiLCAiMSIsIDAsIDEgfSwKKyAgICB7ICIxMjMiLCAiLTQ1NiIsIDAsIDEgfSwKKyAgICB7ICIweDEyMzQ1Njc4OTEyMzQ1Njc4OSIsICIweDk4NzY1NDMyMTk4NzY1NDMyMSIsIDAsIDEgfSwKKyAgICB7ICIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY3IiwgIi0weDkiLCAxMjksIDAgfSwKKyAgICB7ICIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY2IiwgIi0weGEiLCAxMjgsIDEgfSwKKworICB9OworCisgIG1wel90ICAgYSwgYzsKKyAgaW50ICAgICBpOworCisgIG1wel9pbml0IChhKTsKKyAgbXB6X2luaXQgKGMpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoYSwgZGF0YVtpXS5hLCAwKTsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChjLCBkYXRhW2ldLmMsIDApOworICAgICAgY2hlY2tfb25lIChhLCBjLCBkYXRhW2ldLmQsIGRhdGFbaV0ud2FudCk7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYyk7Cit9CisKKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgcmVwcykKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMgPSBSQU5EUzsKKyAgdW5zaWduZWQgbG9uZyAgZDsKKyAgbXB6X3QgIGEsIGMsIHJhLCByYzsKKyAgaW50ICAgIGk7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYyk7CisgIG1wel9pbml0IChyYSk7CisgIG1wel9pbml0IChyYyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBtcHpfZXJyYW5kb21iIChhLCByYW5kcywgOCpHTVBfTElNQl9CSVRTKTsKKyAgICAgIG1wel9lcnJhbmRvbWIgKGMsIHJhbmRzLCA4KkdNUF9MSU1CX0JJVFMpOworICAgICAgZCA9IHVyYW5kb20oKSAlICg4KkdNUF9MSU1CX0JJVFMpOworCisgICAgICBtcHpfbXVsXzJleHAgKGEsIGEsIHVyYW5kb20oKSAlICgyKkdNUF9MSU1CX0JJVFMpKTsKKyAgICAgIG1wel9tdWxfMmV4cCAoYywgYywgdXJhbmRvbSgpICUgKDIqR01QX0xJTUJfQklUUykpOworCisgICAgICBtcHpfbmVncmFuZG9tIChhLCByYW5kcyk7CisgICAgICBtcHpfbmVncmFuZG9tIChjLCByYW5kcyk7CisKKyAgICAgIG1wel9mZGl2X3JfMmV4cCAocmEsIGEsIGQpOworICAgICAgbXB6X2ZkaXZfcl8yZXhwIChyYywgYywgZCk7CisKKyAgICAgIG1wel9zdWIgKHJhLCByYSwgcmMpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHJhLCAwKSAhPSAwKQorCXsKKwkgIGNoZWNrX29uZSAoYSwgYywgZCwgMCk7CisJICBtcHpfc3ViIChhLCBhLCByYSk7CisJfQorICAgICAgY2hlY2tfb25lIChhLCBjLCBkLCAxKTsKKyAgICAgIGlmIChkICE9IDApCisJeworCSAgbXB6X2NvbWJpdCAoYSwgdXJhbmRvbSgpICUgZCk7CisJICBjaGVja19vbmUgKGEsIGMsIGQsIDApOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChjKTsKKyAgbXB6X2NsZWFyIChyYSk7CisgIG1wel9jbGVhciAocmMpOworfQorCit2b2lkCitjaGVja19yYW5kb21fYml0cyAoaW50IHJlcHMpCit7CisgIG1wX2JpdGNudF90IGVhLCBlYywgZW4sIGQ7CisgIG1wX2JpdGNudF90IG0gPSAxMCAqIEdNUF9MSU1CX0JJVFM7CisgIG1wel90ICBhLCBjOworICBpbnQgICAgaTsKKworICBtcHpfaW5pdDIgKGEsIG0gKyAxKTsKKyAgbXB6X2luaXQyIChjLCBtKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIGQgID0gdXJhbmRvbSgpICUgbTsKKyAgICAgIGVhID0gdXJhbmRvbSgpICUgbTsKKyAgICAgIGVjID0gdXJhbmRvbSgpICUgbTsKKyAgICAgIGVuID0gdXJhbmRvbSgpICUgbTsKKworICAgICAgbXB6X3NldF91aSAoYywgMCk7CisgICAgICBtcHpfc2V0Yml0IChjLCBlbik7CisKKyAgICAgIG1wel9zZXRfdWkgKGEsIDApOworICAgICAgbXB6X3NldGJpdCAoYSwgZWMpOworICAgICAgbXB6X3N1YiAoYyAsIGEsIGMpOworCisgICAgICBtcHpfc2V0X3VpIChhLCAwKTsKKyAgICAgIG1wel9zZXRiaXQgKGEsIGVhKTsKKyAgICAgIG1wel9hZGQgKGEgLCBhLCBjKTsKKworICAgICAgY2hlY2tfb25lIChhLCBjLCBkLCBlYSA+PSBkKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChjKTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCAgICByZXBzID0gNTAwMDsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfcmFuZG9tIChyZXBzKTsKKyAgY2hlY2tfcmFuZG9tX2JpdHMgKHJlcHMpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1kaXZfMmV4cC5jIGIvdGVzdHMvbXB6L3QtZGl2XzJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEyYWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZGl2XzJleHAuYwpAQCAtMCwwICsxLDIyMyBAQAorLyogVGVzdCBtcHpfW2NmdF1kaXZfW3FyXV8yZXhwLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogSWYgdGhlIHJlbWFpbmRlciBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSBhbmQgcSpkK3IgaXMgY29ycmVjdCwgdGhlbiBxCisgICBtdXN0IGhhdmUgcm91bmRlZCBjb3JyZWN0bHkuICAqLworCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgYSwgdW5zaWduZWQgbG9uZyBkKQoreworICBtcHpfdCAgcSwgciwgcCwgZDJleHA7CisgIGludCAgICBpbnBsYWNlOworCisgIG1wel9pbml0IChkMmV4cCk7CisgIG1wel9pbml0IChxKTsKKyAgbXB6X2luaXQgKHIpOworICBtcHpfaW5pdCAocCk7CisKKyAgbXB6X3NldF91aSAoZDJleHAsIDFMKTsKKyAgbXB6X211bF8yZXhwIChkMmV4cCwgZDJleHAsIGQpOworCisjZGVmaW5lIElOUExBQ0UoZnVuLGRzdCxzcmMsZCkgIFwKKyAgaWYgKGlucGxhY2UpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtcHpfc2V0IChkc3QsIHNyYyk7ICAgICAgIFwKKyAgICAgIGZ1biAoZHN0LCBkc3QsIGQpOyAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmdW4gKGRzdCwgc3JjLCBkKTsKKworICBmb3IgKGlucGxhY2UgPSAwOyBpbnBsYWNlIDw9IDE7IGlucGxhY2UrKykKKyAgICB7CisgICAgICBJTlBMQUNFIChtcHpfZmRpdl9xXzJleHAsIHEsIGEsIGQpOworICAgICAgSU5QTEFDRSAobXB6X2ZkaXZfcl8yZXhwLCByLCBhLCBkKTsKKworICAgICAgbXB6X211bF8yZXhwIChwLCBxLCBkKTsKKyAgICAgIG1wel9hZGQgKHAsIHAsIHIpOworICAgICAgaWYgKG1wel9zZ24gKHIpIDwgMCB8fCBtcHpfY21wIChyLCBkMmV4cCkgPj0gMCkKKwl7CisJICBwcmludGYgKCJtcHpfZmRpdl9yXzJleHAgcmVzdWx0IG91dCBvZiByYW5nZVxuIik7CisJICBnb3RvIGVycm9yOworCX0KKyAgICAgIGlmIChtcHpfY21wIChwLCBhKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIm1wel9mZGl2X1txcl1fMmV4cCBkb2Vzbid0IG11bHRpcGx5IGJhY2tcbiIpOworCSAgZ290byBlcnJvcjsKKwl9CisKKworICAgICAgSU5QTEFDRSAobXB6X2NkaXZfcV8yZXhwLCBxLCBhLCBkKTsKKyAgICAgIElOUExBQ0UgKG1wel9jZGl2X3JfMmV4cCwgciwgYSwgZCk7CisKKyAgICAgIG1wel9tdWxfMmV4cCAocCwgcSwgZCk7CisgICAgICBtcHpfYWRkIChwLCBwLCByKTsKKyAgICAgIGlmIChtcHpfc2duIChyKSA+IDAgfHwgbXB6X2NtcGFicyAociwgZDJleHApID49IDApCisJeworCSAgcHJpbnRmICgibXB6X2NkaXZfcl8yZXhwIHJlc3VsdCBvdXQgb2YgcmFuZ2VcbiIpOworCSAgZ290byBlcnJvcjsKKwl9CisgICAgICBpZiAobXB6X2NtcCAocCwgYSkgIT0gMCkKKwl7CisJICBwcmludGYgKCJtcHpfY2Rpdl9bcXJdXzJleHAgZG9lc24ndCBtdWx0aXBseSBiYWNrXG4iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorCisKKyAgICAgIElOUExBQ0UgKG1wel90ZGl2X3FfMmV4cCwgcSwgYSwgZCk7CisgICAgICBJTlBMQUNFIChtcHpfdGRpdl9yXzJleHAsIHIsIGEsIGQpOworCisgICAgICBtcHpfbXVsXzJleHAgKHAsIHEsIGQpOworICAgICAgbXB6X2FkZCAocCwgcCwgcik7CisgICAgICBpZiAobXB6X3NnbiAocikgIT0gMCAmJiBtcHpfc2duIChyKSAhPSBtcHpfc2duIChhKSkKKwl7CisJICBwcmludGYgKCJtcHpfdGRpdl9yXzJleHAgcmVzdWx0IHdyb25nIHNpZ25cbiIpOworCSAgZ290byBlcnJvcjsKKwl9CisgICAgICBpZiAobXB6X2NtcGFicyAociwgZDJleHApID49IDApCisJeworCSAgcHJpbnRmICgibXB6X3RkaXZfcl8yZXhwIHJlc3VsdCBvdXQgb2YgcmFuZ2VcbiIpOworCSAgZ290byBlcnJvcjsKKwl9CisgICAgICBpZiAobXB6X2NtcCAocCwgYSkgIT0gMCkKKwl7CisJICBwcmludGYgKCJtcHpfdGRpdl9bcXJdXzJleHAgZG9lc24ndCBtdWx0aXBseSBiYWNrXG4iKTsKKwkgIGdvdG8gZXJyb3I7CisJfQorICAgIH0KKworICBtcHpfY2xlYXIgKGQyZXhwKTsKKyAgbXB6X2NsZWFyIChxKTsKKyAgbXB6X2NsZWFyIChyKTsKKyAgbXB6X2NsZWFyIChwKTsKKyAgcmV0dXJuOworCisKKyBlcnJvcjoKKyAgbXB6X3RyYWNlICgiYSIsIGEpOworICBwcmludGYgICAgKCJkPSVsdVxuIiwgZCk7CisgIG1wel90cmFjZSAoInEiLCBxKTsKKyAgbXB6X3RyYWNlICgiciIsIHIpOworICBtcHpfdHJhY2UgKCJwIiwgcCk7CisKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKyAgbXB6X3RyYWNlICgiYSIsIGEpOworICBwcmludGYgICAgKCJkPTB4JWxYXG4iLCBkKTsKKyAgbXB6X3RyYWNlICgicSIsIHEpOworICBtcHpfdHJhY2UgKCJyIiwgcik7CisgIG1wel90cmFjZSAoInAiLCBwKTsKKworICBhYm9ydCAoKTsKK30KKworCit2b2lkCitjaGVja19hbGwgKG1wel9wdHIgYSwgdW5zaWduZWQgbG9uZyBkKQoreworICBjaGVja19vbmUgKGEsIGQpOworICBtcHpfbmVnIChhLCBhKTsKKyAgY2hlY2tfb25lIChhLCBkKTsKK30KKworCit2b2lkCitjaGVja192YXJpb3VzICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyAgdGFibGVbXSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA1LAorICAgIEdNUF9OVU1CX0JJVFMtMSwgR01QX05VTUJfQklUUywgR01QX05VTUJfQklUUysxLAorICAgIDIqR01QX05VTUJfQklUUy0xLCAyKkdNUF9OVU1CX0JJVFMsIDIqR01QX05VTUJfQklUUysxLAorICAgIDMqR01QX05VTUJfQklUUy0xLCAzKkdNUF9OVU1CX0JJVFMsIDMqR01QX05VTUJfQklUUysxLAorICAgIDQqR01QX05VTUJfQklUUy0xLCA0KkdNUF9OVU1CX0JJVFMsIDQqR01QX05VTUJfQklUUysxCisgIH07CisKKyAgaW50ICAgICAgICAgICAgaSwgajsKKyAgdW5zaWduZWQgbG9uZyAgbiwgZDsKKyAgbXB6X3QgICAgICAgICAgYTsKKworICBtcHpfaW5pdCAoYSk7CisKKyAgLyogYT09MCwgYW5kIHZhcmlvdXMgZCAqLworICBtcHpfc2V0X3VpIChhLCAwTCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAodGFibGUpOyBpKyspCisgICAgY2hlY2tfb25lIChhLCB0YWJsZVtpXSk7CisKKyAgLyogYT09Ml5uLCBhbmQgdmFyaW91cyBkICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAodGFibGUpOyBpKyspCisgICAgeworICAgICAgbiA9IHRhYmxlW2ldOworICAgICAgbXB6X3NldF91aSAoYSwgMUwpOworICAgICAgbXB6X211bF8yZXhwIChhLCBhLCBuKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IG51bWJlcm9mICh0YWJsZSk7IGorKykKKwl7CisJICBkID0gdGFibGVbal07CisJICBjaGVja19hbGwgKGEsIGQpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKK30KKworCit2b2lkCitjaGVja19yYW5kb20gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyICByYW5kcyA9IFJBTkRTOworICBpbnQgICAgICAgICAgICByZXBzID0gMTAwOworICBtcHpfdCAgICAgICAgICBhOworICB1bnNpZ25lZCBsb25nICBkOworICBpbnQgICAgICAgICAgICBpOworCisgIGlmIChhcmdjID09IDIpCisgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0IChhKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIC8qIGV4cG9uZW50aWFsbHkgd2l0aGluIDIgdG8gMjU3IGJpdHMgKi8KKyAgICAgIG1wel9lcmFuZG9tYiAoYSwgcmFuZHMsIHVyYW5kb20gKCkgJSA4ICsgMik7CisKKyAgICAgIGQgPSB1cmFuZG9tICgpICUgMjU2OworCisgICAgICBjaGVja19hbGwgKGEsIGQpOworICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKyAgY2hlY2tfcmFuZG9tIChhcmdjLCBhcmd2KTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtZGl2aXMuYyBiL3Rlc3RzL21wei90LWRpdmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MTg2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWRpdmlzLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIHRlc3QgbXB6X2RpdmlzaWJsZV9wIGFuZCBtcHpfZGl2aXNpYmxlX3VpX3AKKworQ29weXJpZ2h0IDIwMDEsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZSAobXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGQsIGludCB3YW50KQoreworICBpbnQgICBnb3Q7CisKKyAgaWYgKG1wel9maXRzX3Vsb25nX3AgKGQpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgIHUgPSBtcHpfZ2V0X3VpIChkKTsKKyAgICAgIGdvdCA9IChtcHpfZGl2aXNpYmxlX3VpX3AgKGEsIHUpICE9IDApOworICAgICAgaWYgKHdhbnQgIT0gZ290KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXB6X2RpdmlzaWJsZV91aV9wIHdyb25nXG4iKTsKKyAgICAgICAgICBwcmludGYgKCIgICBleHBlY3RlZCAlZCBnb3QgJWRcbiIsIHdhbnQsIGdvdCk7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgYSIsIGEpOworICAgICAgICAgIHByaW50ZiAoIiAgIGQ9JWx1XG4iLCB1KTsKKyAgICAgICAgICBtcF90cmFjZV9iYXNlID0gLTE2OworICAgICAgICAgIG1wel90cmFjZSAoIiAgIGEiLCBhKTsKKyAgICAgICAgICBwcmludGYgKCIgICBkPTB4JWxYXG4iLCB1KTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICBnb3QgPSAobXB6X2RpdmlzaWJsZV9wIChhLCBkKSAhPSAwKTsKKyAgaWYgKHdhbnQgIT0gZ290KQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9kaXZpc2libGVfcCB3cm9uZ1xuIik7CisgICAgICBwcmludGYgKCIgICBleHBlY3RlZCAlZCBnb3QgJWRcbiIsIHdhbnQsIGdvdCk7CisgICAgICBtcHpfdHJhY2UgKCIgICBhIiwgYSk7CisgICAgICBtcHpfdHJhY2UgKCIgICBkIiwgZCk7CisgICAgICBtcF90cmFjZV9iYXNlID0gLTE2OworICAgICAgbXB6X3RyYWNlICgiICAgYSIsIGEpOworICAgICAgbXB6X3RyYWNlICgiICAgZCIsIGQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICphOworICAgIGNvbnN0IGNoYXIgKmQ7CisgICAgaW50ICAgICAgICB3YW50OworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsICAgICIwIiwgMSB9LAorICAgIHsgIjE3IiwgICAiMCIsIDAgfSwKKyAgICB7ICIwIiwgICAgIjEiLCAxIH0sCisgICAgeyAiMTIzIiwgICIxIiwgMSB9LAorICAgIHsgIi0xMjMiLCAiMSIsIDEgfSwKKworICAgIHsgIjAiLCAgIjIiLCAxIH0sCisgICAgeyAiMSIsICAiMiIsIDAgfSwKKyAgICB7ICIyIiwgICIyIiwgMSB9LAorICAgIHsgIi0yIiwgIjIiLCAxIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMiIsIDEgfSwKKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsICIyIiwgMCB9LAorCisgICAgeyAiMHgzMzMzMzMzMzMzMzMzMzMzIiwgIjMiLCAxIH0sCisgICAgeyAiMHgzMzMzMzMzMzMzMzMzMzMyIiwgIjMiLCAwIH0sCisgICAgeyAiMHgzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyIsICIzIiwgMSB9LAorICAgIHsgIjB4MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIiLCAiMyIsIDAgfSwKKworICAgIC8qIGRpdmlzb3IgY2hhbmdlcyBmcm9tIDIgdG8gMSBsaW1iIGFmdGVyIHN0cmlwcGluZyAycyAqLworICAgIHsgICAgICAgICAgIjB4MzMzMzMzMzMwMDAwMDAwMCIsICAgICAgICAgIjB4MTgwMDAwMDAwIiwgICAgICAgICAxIH0sCisgICAgeyAgIjB4MzMzMzMzMzMzMzMzMzMzMzAwMDAwMDAwMDAwMDAwMDAiLCAiMHgxODAwMDAwMDAwMDAwMDAwMCIsIDEgfSwKKyAgICB7ICIweDEzMzMzMzMzMzMzMzMzMzMzMDAwMDAwMDAwMDAwMDAwMCIsICIweDE4MDAwMDAwMDAwMDAwMDAwIiwgMCB9LAorICB9OworCisgIG1wel90ICAgYSwgZDsKKyAgaW50ICAgICBpOworCisgIG1wel9pbml0IChhKTsKKyAgbXB6X2luaXQgKGQpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoYSwgZGF0YVtpXS5hLCAwKTsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChkLCBkYXRhW2ldLmQsIDApOworICAgICAgY2hlY2tfb25lIChhLCBkLCBkYXRhW2ldLndhbnQpOworICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGQpOworfQorCit2b2lkCitjaGVja19yYW5kb20gKGludCByZXBzKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBtcHpfdCAgIGEsIGQsIHI7CisgIGludCAgICAgaTsKKyAgaW50ICAgICB3YW50OworCisgIG1wel9pbml0IChhKTsKKyAgbXB6X2luaXQgKGQpOworICBtcHpfaW5pdCAocik7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBtcHpfZXJhbmRvbWIgKGEsIHJhbmRzLCAxIDw8IDE5KTsKKyAgICAgIG1wel9lcmFuZG9tYl9ub256ZXJvIChkLCByYW5kcywgMSA8PCAxOCk7CisKKyAgICAgIG1wel9mZGl2X3IgKHIsIGEsIGQpOworCisgICAgICB3YW50ID0gKG1wel9zZ24gKHIpID09IDApOworICAgICAgY2hlY2tfb25lIChhLCBkLCB3YW50KTsKKworICAgICAgbXB6X3N1YiAoYSwgYSwgcik7CisgICAgICBjaGVja19vbmUgKGEsIGQsIDEpOworCisgICAgICBpZiAobXB6X2NtcGFic191aSAoZCwgMUwpID09IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBtcHpfYWRkX3VpIChhLCBhLCAxTCk7CisgICAgICBjaGVja19vbmUgKGEsIGQsIDApOworICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGQpOworICBtcHpfY2xlYXIgKHIpOworfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50ICByZXBzID0gMTAwOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIFRFU1RTX1JFUFMgKHJlcHMsIGFyZ3YsIGFyZ2MpOworCisgIGNoZWNrX2RhdGEgKCk7CisgIGNoZWNrX3JhbmRvbSAocmVwcyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWRpdmlzXzJleHAuYyBiL3Rlc3RzL21wei90LWRpdmlzXzJleHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzZjNzUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZGl2aXNfMmV4cC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiB0ZXN0IG1wel9kaXZpc2libGVfMmV4cF9wICovCisKKy8qCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfb25lIChtcHpfc3JjcHRyIGEsIHVuc2lnbmVkIGxvbmcgZCwgaW50IHdhbnQpCit7CisgIGludCAgIGdvdDsKKworICBnb3QgPSAobXB6X2RpdmlzaWJsZV8yZXhwX3AgKGEsIGQpICE9IDApOworICBpZiAod2FudCAhPSBnb3QpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2RpdmlzaWJsZV8yZXhwX3Agd3JvbmdcbiIpOworICAgICAgcHJpbnRmICgiICAgZXhwZWN0ZWQgJWQgZ290ICVkXG4iLCB3YW50LCBnb3QpOworICAgICAgbXB6X3RyYWNlICgiICAgYSIsIGEpOworICAgICAgcHJpbnRmICAgICgiICAgZD0lbHVcbiIsIGQpOworICAgICAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKyAgICAgIG1wel90cmFjZSAoIiAgIGEiLCBhKTsKKyAgICAgIHByaW50ZiAgICAoIiAgIGQ9MHglbFhcbiIsIGQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAgICphOworICAgIHVuc2lnbmVkIGxvbmcgZDsKKyAgICBpbnQgICAgICAgICAgIHdhbnQ7CisKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7ICIwIiwgMCwgMSB9LAorICAgIHsgIjAiLCAxLCAxIH0sCisgICAgeyAiMCIsIDIsIDEgfSwKKyAgICB7ICIwIiwgMywgMSB9LAorCisgICAgeyAiMSIsIDAsIDEgfSwKKyAgICB7ICIxIiwgMSwgMCB9LAorICAgIHsgIjEiLCAyLCAwIH0sCisgICAgeyAiMSIsIDMsIDAgfSwKKyAgICB7ICIxIiwgMTAwMDAsIDAgfSwKKworICAgIHsgIjQiLCAwLCAxIH0sCisgICAgeyAiNCIsIDEsIDEgfSwKKyAgICB7ICI0IiwgMiwgMSB9LAorICAgIHsgIjQiLCAzLCAwIH0sCisgICAgeyAiNCIsIDQsIDAgfSwKKyAgICB7ICI0IiwgMTAwMDAsIDAgfSwKKworICAgIHsgIjB4ODAwMDAwMDAiLCAzMSwgMSB9LAorICAgIHsgIjB4ODAwMDAwMDAiLCAzMiwgMCB9LAorICAgIHsgIjB4ODAwMDAwMDAiLCA2NCwgMCB9LAorCisgICAgeyAiMHgxMDAwMDAwMDAiLCAzMiwgMSB9LAorICAgIHsgIjB4MTAwMDAwMDAwIiwgMzMsIDAgfSwKKyAgICB7ICIweDEwMDAwMDAwMCIsIDY0LCAwIH0sCisKKyAgICB7ICIweDgwMDAwMDAwMDAwMDAwMDAiLCA2MywgMSB9LAorICAgIHsgIjB4ODAwMDAwMDAwMDAwMDAwMCIsIDY0LCAwIH0sCisgICAgeyAiMHg4MDAwMDAwMDAwMDAwMDAwIiwgMTI4LCAwIH0sCisKKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwIiwgNjQsIDEgfSwKKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwIiwgNjUsIDAgfSwKKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwIiwgMTI4LCAwIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMCIsIDI1NiwgMCB9LAorCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMCIsIDMyLCAxIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMCIsIDMzLCAwIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMCIsIDY0LCAwIH0sCisKKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAiLCA2NCwgMSB9LAorICAgIHsgIjB4MTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMCIsIDY1LCAwIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIiwgMTI4LCAwIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIiwgMjU2LCAwIH0sCisgICAgeyAiMHgxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIiwgMTAyNCwgMCB9LAorCisgIH07CisKKyAgbXB6X3QgICBhLCBkOworICBpbnQgICAgIGk7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoZCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChhLCBkYXRhW2ldLmEsIDApOworICAgICAgY2hlY2tfb25lIChhLCBkYXRhW2ldLmQsIGRhdGFbaV0ud2FudCk7CisKKyAgICAgIG1wel9uZWcgKGEsIGEpOworICAgICAgY2hlY2tfb25lIChhLCBkYXRhW2ldLmQsIGRhdGFbaV0ud2FudCk7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoZCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtZXhwb3J0LmMgYi90ZXN0cy9tcHovdC1leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQxMWUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZXhwb3J0LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qIFRlc3QgbXB6X2V4cG9ydC4KKworQ29weXJpZ2h0IDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqc3JjOworICAgIHNpemVfdCAgICAgIHdhbnRfY291bnQ7CisgICAgaW50ICAgICAgICAgb3JkZXI7CisgICAgc2l6ZV90ICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICBlbmRpYW47CisgICAgaW50ICAgICAgICAgbmFpbDsKKyAgICBjaGFyICAgICAgICB3YW50X2RhdGFbNjRdOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsIDAsMSwgMSwxLCAwIH0sCisgICAgeyAiMCIsIDAsMSwgMiwxLCAwIH0sCisgICAgeyAiMCIsIDAsMSwgMywxLCAwIH0sCisKKyAgICB7ICIweDEyMzQ1Njc4IiwgNCwxLCAgMSwxLCAwLCB7ICdcMDIyJywgJ1wwNjQnLCAnXDEyNicsICdcMTcwJyB9IH0sCisgICAgeyAiMHgxMjM0NTY3OCIsIDEsMSwgIDQsMSwgMCwgeyAnXDAyMicsICdcMDY0JywgJ1wxMjYnLCAnXDE3MCcgfSB9LAorICAgIHsgIjB4MTIzNDU2NzgiLCAxLC0xLCA0LDEsIDAsIHsgJ1wwMjInLCAnXDA2NCcsICdcMTI2JywgJ1wxNzAnIH0gfSwKKworICAgIHsgIjB4MTIzNDU2NzgiLCA0LC0xLCAxLC0xLCAwLCB7ICdcMTcwJywgJ1wxMjYnLCAnXDA2NCcsICdcMDIyJyB9IH0sCisgICAgeyAiMHgxMjM0NTY3OCIsIDEsMSwgIDQsLTEsIDAsIHsgJ1wxNzAnLCAnXDEyNicsICdcMDY0JywgJ1wwMjInIH0gfSwKKyAgICB7ICIweDEyMzQ1Njc4IiwgMSwtMSwgNCwtMSwgMCwgeyAnXDE3MCcsICdcMTI2JywgJ1wwNjQnLCAnXDAyMicgfSB9LAorCisgICAgeyAiMHgxNSIsIDUsMSwgIDEsMSwgNywgeyAnXDAwMScsICdcMDAwJywgJ1wwMDEnLCAnXDAwMCcsICdcMDAxJyB9IH0sCisKKyAgICB7ICIweDFGRkZGRkZGRkZGRiIsIDMsMSwgIDIsMSwgICAxLCB7CisJJ1wxNzcnLCdcMzc3JywgJ1wxNzcnLCdcMzc3JywgJ1wxNzcnLCdcMzc3JyB9IH0sCisgICAgeyAiMHgxRkZGRkZGRkZGRkYiLCAzLDEsICAyLC0xLCAgMSwgeworCSdcMzc3JywnXDE3NycsICdcMzc3JywnXDE3NycsICdcMzc3JywnXDE3NycgfSB9LAorICAgIHsgIjB4NyIsICAgICAgICAgICAgMywxLCAgMiwxLCAgMTUsIHsKKwknXDAwMCcsJ1wwMDEnLCAnXDAwMCcsJ1wwMDEnLCAnXDAwMCcsJ1wwMDEnIH0gfSwKKyAgICB7ICIweDciLCAgICAgICAgICAgIDMsMSwgIDIsLTEsIDE1LCB7CisJJ1wwMDEnLCdcMDAwJywgJ1wwMDEnLCdcMDAwJywgJ1wwMDEnLCdcMDAwJyB9IH0sCisKKyAgICB7ICIweDI0IiwgMywxLCAgMiwxLCAgMTQsIHsgJ1wwMDAnLCdcMDAyJywgJ1wwMDAnLCdcMDAxJywgJ1wwMDAnLCdcMDAwJyB9fSwKKyAgICB7ICIweDI0IiwgMywxLCAgMiwtMSwgMTQsIHsgJ1wwMDInLCdcMDAwJywgJ1wwMDEnLCdcMDAwJywgJ1wwMDAnLCdcMDAwJyB9fSwKKyAgICB7ICIweDI0IiwgMywtMSwgMiwtMSwgMTQsIHsgJ1wwMDAnLCdcMDAwJywgJ1wwMDEnLCdcMDAwJywgJ1wwMDInLCdcMDAwJyB9fSwKKyAgICB7ICIweDI0IiwgMywtMSwgMiwxLCAgMTQsIHsgJ1wwMDAnLCdcMDAwJywgJ1wwMDAnLCdcMDAxJywgJ1wwMDAnLCdcMDAyJyB9fSwKKworICAgIHsgIjB4MTIzNDU2Nzg5QUJDIiwgMywxLCAgMiwxLCAgMCwgeworCSdcMDIyJywnXDA2NCcsICdcMTI2JywnXDE3MCcsICdcMjMyJywnXDI3NCcgfSB9LAorICAgIHsgIjB4MTIzNDU2Nzg5QUJDIiwgMywtMSwgMiwxLCAgMCwgeworCSdcMjMyJywnXDI3NCcsICdcMTI2JywnXDE3MCcsICdcMDIyJywnXDA2NCcgfSB9LAorICAgIHsgIjB4MTIzNDU2Nzg5QUJDIiwgMywxLCAgMiwtMSwgMCwgeworCSdcMDY0JywnXDAyMicsICdcMTcwJywnXDEyNicsICdcMjc0JywnXDIzMicgfSB9LAorICAgIHsgIjB4MTIzNDU2Nzg5QUJDIiwgMywtMSwgMiwtMSwgMCwgeworCSdcMjc0JywnXDIzMicsICdcMTcwJywnXDEyNicsICdcMDY0JywnXDAyMicgfSB9LAorCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLDEsICA0LDEsICAwLAorICAgICAgeyAnXDAyMScsJ1wwNDInLCdcMDYzJywnXDEwNCcsCisJJ1wxMjUnLCdcMTQ2JywnXDE2NycsJ1wyMTAnLAorCSdcMjMxJywnXDI1MicsJ1wyNzMnLCdcMzE0JyB9IH0sCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLC0xLCA0LDEsICAwLAorICAgICAgeyAnXDIzMScsJ1wyNTInLCdcMjczJywnXDMxNCcsCisJJ1wxMjUnLCdcMTQ2JywnXDE2NycsJ1wyMTAnLAorCSdcMDIxJywnXDA0MicsJ1wwNjMnLCdcMTA0JyB9IH0sCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLDEsICA0LC0xLCAwLAorICAgICAgeyAnXDEwNCcsJ1wwNjMnLCdcMDQyJywnXDAyMScsCisJJ1wyMTAnLCdcMTY3JywnXDE0NicsJ1wxMjUnLAorCSdcMzE0JywnXDI3MycsJ1wyNTInLCdcMjMxJyB9IH0sCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLC0xLCA0LC0xLCAwLAorICAgICAgeyAnXDMxNCcsJ1wyNzMnLCdcMjUyJywnXDIzMScsCisJJ1wyMTAnLCdcMTY3JywnXDE0NicsJ1wxMjUnLAorCSdcMTA0JywnXDA2MycsJ1wwNDInLCdcMDIxJyB9IH0sCisKKyAgICB7ICIweDEwMDEyMDAyMzAwMzQwMDQ1MDA1NjAwNjcwMDc4MDA4OTAwOUEwMEFCMDBCQzAwQyIsIDMsMSwgIDgsMSwgIDAsCisgICAgICB7ICdcMDIwJywnXDAwMScsJ1wwNDAnLCdcMDAyJywnXDA2MCcsJ1wwMDMnLCdcMTAwJywnXDAwNCcsCisJJ1wxMjAnLCdcMDA1JywnXDE0MCcsJ1wwMDYnLCdcMTYwJywnXDAwNycsJ1wyMDAnLCdcMDEwJywKKwknXDIyMCcsJ1wwMTEnLCdcMjQwJywnXDAxMicsJ1wyNjAnLCdcMDEzJywnXDMwMCcsJ1wwMTQnIH0gfSwKKyAgICB7ICIweDEwMDEyMDAyMzAwMzQwMDQ1MDA1NjAwNjcwMDc4MDA4OTAwOUEwMEFCMDBCQzAwQyIsIDMsLTEsIDgsMSwgIDAsCisgICAgICB7ICdcMjIwJywnXDAxMScsJ1wyNDAnLCdcMDEyJywnXDI2MCcsJ1wwMTMnLCdcMzAwJywnXDAxNCcsCisJJ1wxMjAnLCdcMDA1JywnXDE0MCcsJ1wwMDYnLCdcMTYwJywnXDAwNycsJ1wyMDAnLCdcMDEwJywKKwknXDAyMCcsJ1wwMDEnLCdcMDQwJywnXDAwMicsJ1wwNjAnLCdcMDAzJywnXDEwMCcsJ1wwMDQnIH0gfSwKKyAgICB7ICIweDEwMDEyMDAyMzAwMzQwMDQ1MDA1NjAwNjcwMDc4MDA4OTAwOUEwMEFCMDBCQzAwQyIsIDMsMSwgIDgsLTEsIDAsCisgICAgICB7ICdcMDA0JywnXDEwMCcsJ1wwMDMnLCdcMDYwJywnXDAwMicsJ1wwNDAnLCdcMDAxJywnXDAyMCcsCisJJ1wwMTAnLCdcMjAwJywnXDAwNycsJ1wxNjAnLCdcMDA2JywnXDE0MCcsJ1wwMDUnLCdcMTIwJywKKwknXDAxNCcsJ1wzMDAnLCdcMDEzJywnXDI2MCcsJ1wwMTInLCdcMjQwJywnXDAxMScsJ1wyMjAnIH0gfSwKKyAgICB7ICIweDEwMDEyMDAyMzAwMzQwMDQ1MDA1NjAwNjcwMDc4MDA4OTAwOUEwMEFCMDBCQzAwQyIsIDMsLTEsIDgsLTEsIDAsCisgICAgICB7ICdcMDE0JywnXDMwMCcsJ1wwMTMnLCdcMjYwJywnXDAxMicsJ1wyNDAnLCdcMDExJywnXDIyMCcsCisJJ1wwMTAnLCdcMjAwJywnXDAwNycsJ1wxNjAnLCdcMDA2JywnXDE0MCcsJ1wwMDUnLCdcMTIwJywKKwknXDAwNCcsJ1wxMDAnLCdcMDAzJywnXDA2MCcsJ1wwMDInLCdcMDQwJywnXDAwMScsJ1wwMjAnIH0gfSwKKworICAgIHsgIjB4MTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1IiwgMywxLCAgNCwxLCAgMSwKKyAgICAgIHsgJ1wxMjUnLCdcMTI1JywnXDEyNScsJ1wxMjUnLAorCSdcMDUyJywnXDI1MicsJ1wyNTInLCdcMjUyJywKKwknXDEyNScsJ1wxMjUnLCdcMTI1JywnXDEyNScgfSB9LAorICAgIHsgIjB4MTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1IiwgMywtMSwgIDQsMSwgIDEsCisgICAgICB7ICdcMTI1JywnXDEyNScsJ1wxMjUnLCdcMTI1JywKKwknXDA1MicsJ1wyNTInLCdcMjUyJywnXDI1MicsCisJJ1wxMjUnLCdcMTI1JywnXDEyNScsJ1wxMjUnIH0gfSwKKyAgICB7ICIweDE1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NSIsIDMsMSwgIDQsLTEsICAxLAorICAgICAgeyAnXDEyNScsJ1wxMjUnLCdcMTI1JywnXDEyNScsCisJJ1wyNTInLCdcMjUyJywnXDI1MicsJ1wwNTInLAorCSdcMTI1JywnXDEyNScsJ1wxMjUnLCdcMTI1JyB9IH0sCisgICAgeyAiMHgxNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUiLCAzLC0xLCAgNCwtMSwgIDEsCisgICAgICB7ICdcMTI1JywnXDEyNScsJ1wxMjUnLCdcMTI1JywKKwknXDI1MicsJ1wyNTInLCdcMjUyJywnXDA1MicsCisJJ1wxMjUnLCdcMTI1JywnXDEyNScsJ1wxMjUnIH0gfSwKKyAgfTsKKworICBjaGFyICAgIGJ1ZltzaXplb2YoZGF0YVswXS5zcmMpICsgc2l6ZW9mIChtcF9saW1iX3QpICsgMTI4XTsKKyAgY2hhciAgICAqZ290X2RhdGE7CisgIHZvaWQgICAgKnJldDsKKyAgc2l6ZV90ICBhbGlnbiwgZ290X2NvdW50LCBqOworICBpbnQgICAgIGksIGVycm9yID0gMDsKKyAgbXB6X3QgICBzcmM7CisKKyAgbXB6X2luaXQgKHNyYyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoYWxpZ24gPSAwOyBhbGlnbiA8IHNpemVvZiAobXBfbGltYl90KTsgYWxpZ24rKykKKwl7CisJICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoc3JjLCBkYXRhW2ldLnNyYywgMCk7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChzcmMpOworCSAgZ290X2RhdGEgPSBidWYgKyBhbGlnbjsKKworCSAgQVNTRVJUX0FMV0FZUyAoZGF0YVtpXS53YW50X2NvdW50ICogZGF0YVtpXS5zaXplICsgYWxpZ24KKwkJCSA8PSBzaXplb2YgKGJ1ZikpOworCisJICBtZW1zZXQgKGdvdF9kYXRhLCAnXDAnLCBkYXRhW2ldLndhbnRfY291bnQgKiBkYXRhW2ldLnNpemUpOworCSAgcmV0ID0gbXB6X2V4cG9ydCAoZ290X2RhdGEsICZnb3RfY291bnQsIGRhdGFbaV0ub3JkZXIsCisJCQkgICAgZGF0YVtpXS5zaXplLCBkYXRhW2ldLmVuZGlhbiwgZGF0YVtpXS5uYWlsLCBzcmMpOworCisJICBpZiAocmV0ICE9IGdvdF9kYXRhKQorCSAgICB7CisJICAgICAgcHJpbnRmICgicmV0dXJuIGRvZXNuJ3QgZXF1YWwgZ2l2ZW4gcG9pbnRlclxuIik7CisJICAgICAgZXJyb3IgPSAxOworCSAgICB9CisJICBpZiAoZ290X2NvdW50ICE9IGRhdGFbaV0ud2FudF9jb3VudCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIndyb25nIGNvdW50XG4iKTsKKwkgICAgICBlcnJvciA9IDE7CisJICAgIH0KKwkgIGlmIChtZW1jbXAgKGdvdF9kYXRhLCBkYXRhW2ldLndhbnRfZGF0YSwgZ290X2NvdW50ICogZGF0YVtpXS5zaXplKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgid3JvbmcgcmVzdWx0IGRhdGFcbiIpOworCSAgICAgIGVycm9yID0gMTsKKwkgICAgfQorCSAgaWYgKGVycm9yKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiICAgIGF0IGRhdGFbJWRdICBhbGlnbj0lZFxuIiwgaSwgKGludCkgYWxpZ24pOworCSAgICAgIHByaW50ZiAoIiAgICBzcmMgXCIlc1wiXG4iLCBkYXRhW2ldLnNyYyk7CisJICAgICAgbXB6X3RyYWNlICgiICAgIHNyYyIsIHNyYyk7CisJICAgICAgcHJpbnRmICgiICAgIG9yZGVyPSVkICBzaXplPSVsdSBlbmRpYW49JWQgbmFpbD0ldVxuIiwKKwkJICAgICAgZGF0YVtpXS5vcmRlciwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5lbmRpYW4sIGRhdGFbaV0ubmFpbCk7CisJICAgICAgcHJpbnRmICgiICAgIHdhbnQgY291bnQgJWx1XG4iLCAodW5zaWduZWQgbG9uZykgZGF0YVtpXS53YW50X2NvdW50KTsKKwkgICAgICBwcmludGYgKCIgICAgZ290IGNvdW50ICAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBnb3RfY291bnQpOworCSAgICAgIHByaW50ZiAoIiAgICB3YW50Iik7CisJICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFbaV0ud2FudF9jb3VudCpkYXRhW2ldLnNpemU7IGorKykKKwkJcHJpbnRmICgiIDB4JTAyWCwiLCAodW5zaWduZWQpICh1bnNpZ25lZCBjaGFyKSBkYXRhW2ldLndhbnRfZGF0YVtqXSk7CisJICAgICAgcHJpbnRmICgiXG4iKTsKKwkgICAgICBwcmludGYgKCIgICAgZ290ICIpOworCSAgICAgIGZvciAoaiA9IDA7IGogPCBnb3RfY291bnQqZGF0YVtpXS5zaXplOyBqKyspCisJCXByaW50ZiAoIiAweCUwMlgsIiwgKHVuc2lnbmVkKSAodW5zaWduZWQgY2hhcikgZ290X2RhdGFbal0pOworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgfQorICBtcHpfY2xlYXIgKHNyYyk7Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBtcF90cmFjZV9iYXNlID0gLTE2OworICBjaGVja19kYXRhICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1mYWNfdWkuYyBiL3Rlc3RzL21wei90LWZhY191aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjYwNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1mYWNfdWkuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogRXhlcmNpc2UgbXB6X2ZhY191aSBhbmQgbXB6XzJmYWNfdWkuCisKK0NvcHlyaWdodCAyMDAwLTIwMDIsIDIwMTIsIDIwMTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBVc2FnZTogdC1mYWNfdWkgW3h8bnVtXQorCisgICBXaXRoIG5vIGFyZ3VtZW50cyB0ZXN0aW5nIGdvZXMgdXAgdG8gdGhlIGluaXRpYWwgdmFsdWUgb2YgImxpbWl0IiBiZWxvdy4KKyAgIFdpdGggYSBudW1iZXIgYXJndW1lbnQgdGVzdHMgYXJlIGNhcnJpZWQgdGhhdCBmYXIsIG9yIHdpdGggYSBsaXRlcmFsICJ4IgorICAgdGVzdHMgYXJlIGNvbnRpbnVlZCB3aXRob3V0IGxpbWl0ICh0aGlzIGJlaW5nIG1lYW50IG9ubHkgZm9yIGRldmVsb3BtZW50CisgICBwdXJwb3NlcykuICAqLworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdW5zaWduZWQgbG9uZyAgbiwgbTsKKyAgdW5zaWduZWQgbG9uZyAgbGltaXQgPSAyMjIyOworICBtcHpfdCAgICAgICAgICBkZlsyXSwgZiwgcjsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAneCcpCisgICAgbGltaXQgPSBVTE9OR19NQVg7CisgIGVsc2UKKyAgICBURVNUU19SRVBTIChsaW1pdCwgYXJndiwgYXJnYyk7CisKKyAgLyogZm9yIHNtYWxsIGxpbWIgdGVzdGluZyAqLworICBsaW1pdCA9IE1JTiAobGltaXQsIE1QX0xJTUJfVF9NQVgpOworCisgIG1wel9pbml0X3NldF91aSAoZGZbMF0sIDEpOyAgLyogMCEhID0gMSAqLworICBtcHpfaW5pdF9zZXRfdWkgKGRmWzFdLCAxKTsgIC8qIC0xISEgPSAxICovCisgIG1wel9pbml0X3NldF91aSAoZiwgMSk7ICAvKiAwISA9IDEgKi8KKyAgbXB6X2luaXQgKHIpOworCisgIGZvciAobiA9IDAsIG0gPSAwOyBuIDwgbGltaXQ7IG4rKykKKyAgICB7CisgICAgICBtcHpfZmFjX3VpIChyLCBuKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIpOworCisgICAgICBpZiAobXB6X2NtcCAoZiwgcikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9mYWNfdWkoJWx1KSB3cm9uZ1xuIiwgbik7CisgICAgICAgICAgcHJpbnRmICgiICBnb3QgICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgcik7IHByaW50ZigiXG4iKTsKKyAgICAgICAgICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBmKTsgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIG1wel8yZmFjX3VpIChyLCBuKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIpOworCisgICAgICBpZiAobXB6X2NtcCAoZGZbbV0sIHIpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcHpfMmZhY191aSglbHUpIHdyb25nXG4iLCBuKTsKKyAgICAgICAgICBwcmludGYgKCIgIGdvdCAgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByKTsgcHJpbnRmKCJcbiIpOworICAgICAgICAgIHByaW50ZiAoIiAgd2FudCAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGRmW21dKTsgcHJpbnRmKCJcbiIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIG0gXj0gMTsKKyAgICAgIG1wel9tdWxfdWkgKGRmW21dLCBkZlttXSwgbisxKTsgIC8qIChuKzEpISEgPSAobi0xKSEhICogKG4rMSkgKi8KKyAgICAgIG1wel9tdWxfdWkgKGYsIGYsIG4rMSk7ICAvKiAobisxKSEgPSBuISAqIChuKzEpICovCisgICAgfQorCisgIG4gPSAyMDk3MTY5OyAvKiBhIHByaW1lID0gMSBtb2QgNCovCisgIGlmIChuIC8gMiA+IE1QX0xJTUJfVF9NQVgpCisgICAgbiA9IDEzMTA0MTsgLyogYSBzbWFsbGVyIHByaW1lIDotKSAqLworICBtcHpfZmFjX3VpIChmLCBuIC8gMik7IC8qICgobi0xKS8yKSEgKi8KKyAgbSA9IG1wel9mZGl2X3VpIChmLCBuKTsgLyogKChuLTEpLzIpISBtb2QgbiovCisgIG1wel9zZXRfdWkgKGYsIG0pOworICBtcHpfbXVsX3VpIChmLCBmLCBtKTsgLyogKCgobi0xKS8yKSEpXjIgKi8KKyAgbSA9IG1wel9mZGl2X3VpIChmLCBuKTsgLyogKCgobi0xKS8yKSEpXjIgbW9kIG4qLworICBpZiAoIG0gIT0gbiAtIDEpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2ZhY191aSglbHUpIHdyb25nXG4iLCBuIC8gMik7CisgICAgICBwcmludGYgKCIgYWwtSGF5dGhhbSdzIHRoZW9yZW0gbm90IHZlcmlmaWVkOiBnb3QgJWx1LCBleHBlY3RlZCAlbHUuXG4iLCBtLCBuIC0gMSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChkZlswXSk7CisgIG1wel9jbGVhciAoZGZbMV0pOworICBtcHpfY2xlYXIgKGYpOworICBtcHpfY2xlYXIgKHIpOworCisgIHRlc3RzX2VuZCAoKTsKKworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWZkaXYuYyBiL3Rlc3RzL21wei90LWZkaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUwM2RmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZmRpdi5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBUZXN0IG1wel9hYnMsIG1wel9hZGQsIG1wel9jbXAsIG1wel9jbXBfdWksIG1wel9mZGl2X3FyLCBtcHpfZmRpdl9xLAorICAgbXB6X2ZkaXZfciwgbXB6X211bC4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGR1bXBfYWJvcnQgKG1wel90LCBtcHpfdCk7Cit2b2lkIGRlYnVnX21wIChtcHpfdCwgaW50KTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IGRpdmlkZW5kLCBkaXZpc29yOworICBtcHpfdCBxdW90aWVudCwgcmVtYWluZGVyOworICBtcHpfdCBxdW90aWVudDIsIHJlbWFpbmRlcjI7CisgIG1wel90IHRlbXA7CisgIG1wX3NpemVfdCBkaXZpZGVuZF9zaXplLCBkaXZpc29yX3NpemU7CisgIGludCBpOworICBpbnQgcmVwcyA9IDEwMDA7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGJzKTsKKworICBpZiAoYXJnYyA9PSAyKQorICAgICByZXBzID0gYXRvaSAoYXJndlsxXSk7CisKKyAgbXB6X2luaXQgKGRpdmlkZW5kKTsKKyAgbXB6X2luaXQgKGRpdmlzb3IpOworICBtcHpfaW5pdCAocXVvdGllbnQpOworICBtcHpfaW5pdCAocmVtYWluZGVyKTsKKyAgbXB6X2luaXQgKHF1b3RpZW50Mik7CisgIG1wel9pbml0IChyZW1haW5kZXIyKTsKKyAgbXB6X2luaXQgKHRlbXApOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxNiArIDI7IC8qIDAuLjEzMTA3MSBiaXQgb3BlcmFuZHMgKi8KKworICAgICAgZG8KKwl7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJICBkaXZpc29yX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKGRpdmlzb3IsIHJhbmRzLCBkaXZpc29yX3NpemUpOworCX0KKyAgICAgIHdoaWxlIChtcHpfc2duIChkaXZpc29yKSA9PSAwKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgZGl2aWRlbmRfc2l6ZSA9IG1wel9nZXRfdWkgKGJzKSArIGRpdmlzb3Jfc2l6ZTsKKyAgICAgIG1wel9ycmFuZG9tYiAoZGl2aWRlbmQsIHJhbmRzLCBkaXZpZGVuZF9zaXplKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKGRpdmlkZW5kLCBkaXZpZGVuZCk7CisgICAgICBpZiAoKGJzaSAmIDIpICE9IDApCisJbXB6X25lZyAoZGl2aXNvciwgZGl2aXNvcik7CisKKyAgICAgIC8qIHByaW50ZiAoIiVsZCAlbGRcbiIsIFNJWiAoZGl2aWRlbmQpLCBTSVogKGRpdmlzb3IpKTsgKi8KKworICAgICAgbXB6X2ZkaXZfcXIgKHF1b3RpZW50LCByZW1haW5kZXIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIG1wel9mZGl2X3EgKHF1b3RpZW50MiwgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgbXB6X2ZkaXZfciAocmVtYWluZGVyMiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhhdCB0aGUgcXVvdGllbnRzIGFuZCByZW1haW5kZXJzIGNvbXB1dGVkCisJIHdpdGggZGlmZmVyZW50IGZ1bmN0aW9ucyBhcmUgZXF1YWwuICAqLworICAgICAgaWYgKG1wel9jbXAgKHF1b3RpZW50LCBxdW90aWVudDIpICE9IDApCisJZHVtcF9hYm9ydCAoZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgaWYgKG1wel9jbXAgKHJlbWFpbmRlciwgcmVtYWluZGVyMikgIT0gMCkKKwlkdW1wX2Fib3J0IChkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBzaWduIG9mIHRoZSBxdW90aWVudCBpcyBjb3JyZWN0LiAgKi8KKyAgICAgIGlmIChtcHpfY21wX3VpIChxdW90aWVudCwgMCkgIT0gMCkKKwlpZiAoKG1wel9jbXBfdWkgKHF1b3RpZW50LCAwKSA8IDApCisJICAgICE9ICgobXB6X2NtcF91aSAoZGl2aWRlbmQsIDApIF4gbXB6X2NtcF91aSAoZGl2aXNvciwgMCkpIDwgMCkpCisJZHVtcF9hYm9ydCAoZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkaXZpc29yCisJIChxdW90aWVudCByb3VuZGVkIHRvd2FyZHMgbWludXMgaW5maW5pdHkpLiAgKi8KKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIDApICE9IDApCisJaWYgKChtcHpfY21wX3VpIChyZW1haW5kZXIsIDApIDwgMCkgIT0gKG1wel9jbXBfdWkgKGRpdmlzb3IsIDApIDwgMCkpCisJICBkdW1wX2Fib3J0IChkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIG1wel9tdWwgKHRlbXAsIHF1b3RpZW50LCBkaXZpc29yKTsKKyAgICAgIG1wel9hZGQgKHRlbXAsIHRlbXAsIHJlbWFpbmRlcik7CisgICAgICBpZiAobXB6X2NtcCAodGVtcCwgZGl2aWRlbmQpICE9IDApCisJZHVtcF9hYm9ydCAoZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICBtcHpfYWJzICh0ZW1wLCBkaXZpc29yKTsKKyAgICAgIG1wel9hYnMgKHJlbWFpbmRlciwgcmVtYWluZGVyKTsKKyAgICAgIGlmIChtcHpfY21wIChyZW1haW5kZXIsIHRlbXApID49IDApCisJZHVtcF9hYm9ydCAoZGl2aWRlbmQsIGRpdmlzb3IpOworICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChkaXZpZGVuZCk7CisgIG1wel9jbGVhciAoZGl2aXNvcik7CisgIG1wel9jbGVhciAocXVvdGllbnQpOworICBtcHpfY2xlYXIgKHJlbWFpbmRlcik7CisgIG1wel9jbGVhciAocXVvdGllbnQyKTsKKyAgbXB6X2NsZWFyIChyZW1haW5kZXIyKTsKKyAgbXB6X2NsZWFyICh0ZW1wKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCit2b2lkCitkdW1wX2Fib3J0IChtcHpfdCBkaXZpZGVuZCwgbXB6X3QgZGl2aXNvcikKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1JcbiIpOworICBmcHJpbnRmIChzdGRlcnIsICJkaXZpZGVuZCA9ICIpOyBkZWJ1Z19tcCAoZGl2aWRlbmQsIC0xNik7CisgIGZwcmludGYgKHN0ZGVyciwgImRpdmlzb3IgID0gIik7IGRlYnVnX21wIChkaXZpc29yLCAtMTYpOworICBhYm9ydCgpOworfQorCit2b2lkCitkZWJ1Z19tcCAobXB6X3QgeCwgaW50IGJhc2UpCit7CisgIG1wel9vdXRfc3RyIChzdGRlcnIsIGJhc2UsIHgpOyBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWZkaXZfdWkuYyBiL3Rlc3RzL21wei90LWZkaXZfdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYyMGNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZmRpdl91aS5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiBUZXN0IG1wel9hYnMsIG1wel9hZGQsIG1wel9jbXAsIG1wel9jbXBfdWksIG1wel9mZGl2X3FyX3VpLCBtcHpfZmRpdl9xX3VpLAorICAgbXB6X2ZkaXZfcl91aSwgbXB6X2ZkaXZfdWksIG1wel9tdWxfdWkuCisKK0NvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGR1bXBfYWJvcnQgKGNvbnN0IGNoYXIgKiwgbXB6X3QsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBkZWJ1Z19tcCAobXB6X3QsIGludCk7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBkaXZpZGVuZDsKKyAgbXB6X3QgcXVvdGllbnQsIHJlbWFpbmRlcjsKKyAgbXB6X3QgcXVvdGllbnQyLCByZW1haW5kZXIyOworICBtcHpfdCB0ZW1wOworICBtcF9zaXplX3QgZGl2aWRlbmRfc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBkaXZpc29yOworICBpbnQgaTsKKyAgaW50IHJlcHMgPSAxMDAwMDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKyAgdW5zaWduZWQgbG9uZyByX3JxLCByX3EsIHJfciwgcjsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworCisgIGlmIChhcmdjID09IDIpCisgICAgIHJlcHMgPSBhdG9pIChhcmd2WzFdKTsKKworICBtcHpfaW5pdCAoZGl2aWRlbmQpOworICBtcHpfaW5pdCAocXVvdGllbnQpOworICBtcHpfaW5pdCAocmVtYWluZGVyKTsKKyAgbXB6X2luaXQgKHF1b3RpZW50Mik7CisgIG1wel9pbml0IChyZW1haW5kZXIyKTsKKyAgbXB6X2luaXQgKHRlbXApOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMCArIDI7IC8qIDAuLjIwNDcgYml0IG9wZXJhbmRzICovCisKKyAgICAgIGRvCisJeworCSAgbXB6X3JyYW5kb21iIChicywgcmFuZHMsIDY0KTsKKwkgIGRpdmlzb3IgPSBtcHpfZ2V0X3VpIChicyk7CisJfQorICAgICAgd2hpbGUgKGRpdmlzb3IgPT0gMCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGRpdmlkZW5kX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKGRpdmlkZW5kLCByYW5kcywgZGl2aWRlbmRfc2l6ZSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAyKTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChkaXZpZGVuZCwgZGl2aWRlbmQpOworCisgICAgICAvKiBwcmludGYgKCIlbGRcbiIsIFNJWiAoZGl2aWRlbmQpKTsgKi8KKworICAgICAgcl9ycSA9IG1wel9mZGl2X3FyX3VpIChxdW90aWVudCwgcmVtYWluZGVyLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICByX3EgPSBtcHpfZmRpdl9xX3VpIChxdW90aWVudDIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIHJfciA9IG1wel9mZGl2X3JfdWkgKHJlbWFpbmRlcjIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIHIgPSBtcHpfZmRpdl91aSAoZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhhdCB0aGUgcXVvdGllbnRzIGFuZCByZW1haW5kZXJzIGNvbXB1dGVkCisJIHdpdGggZGlmZmVyZW50IGZ1bmN0aW9ucyBhcmUgZXF1YWwuICAqLworICAgICAgaWYgKG1wel9jbXAgKHF1b3RpZW50LCBxdW90aWVudDIpICE9IDApCisJZHVtcF9hYm9ydCAoInF1b3RpZW50cyBmcm9tIG1wel9mZGl2X3FyX3VpIGFuZCBtcHpfZmRpdl9xX3VpIGRpZmZlciIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBpZiAobXB6X2NtcCAocmVtYWluZGVyLCByZW1haW5kZXIyKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXJzIGZyb20gbXB6X2ZkaXZfcXJfdWkgYW5kIG1wel9mZGl2X3JfdWkgZGlmZmVyIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIHNpZ24gb2YgdGhlIHF1b3RpZW50IGlzIGNvcnJlY3QuICAqLworICAgICAgaWYgKG1wel9jbXBfdWkgKHF1b3RpZW50LCAwKSAhPSAwKQorCWlmICgobXB6X2NtcF91aSAocXVvdGllbnQsIDApIDwgMCkKKwkgICAgIT0gKG1wel9jbXBfdWkgKGRpdmlkZW5kLCAwKSA8IDApKQorCWR1bXBfYWJvcnQgKCJxdW90aWVudCBzaWduIHdyb25nIiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSAocG9zaXRpdmUpIGRpdmlzb3IKKwkgKHF1b3RpZW50IHJvdW5kZWQgdG93YXJkcyBtaW51cyBpbmZpbml0eSkuICAqLworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgMCkgIT0gMCkKKwlpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCAwKSA8IDApCisJICBkdW1wX2Fib3J0ICgicmVtYWluZGVyIHNpZ24gd3JvbmciLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIG1wel9tdWxfdWkgKHRlbXAsIHF1b3RpZW50LCBkaXZpc29yKTsKKyAgICAgIG1wel9hZGQgKHRlbXAsIHRlbXAsIHJlbWFpbmRlcik7CisgICAgICBpZiAobXB6X2NtcCAodGVtcCwgZGl2aWRlbmQpICE9IDApCisJZHVtcF9hYm9ydCAoIm4gbW9kIGQgIT0gbiAtIFtuL2RdKmQiLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIG1wel9hYnMgKHJlbWFpbmRlciwgcmVtYWluZGVyKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIGRpdmlzb3IpID49IDApCisJZHVtcF9hYm9ydCAoInJlbWFpbmRlciBncmVhdGVyIHRoYW4gZGl2aXNvciIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgcl9ycSkgIT0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVyIHJldHVybmVkIGZyb20gbXB6X2ZkaXZfcXJfdWkgaXMgd3JvbmciLAorCQkgICAgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgcl9xKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXIgcmV0dXJuZWQgZnJvbSBtcHpfZmRpdl9xX3VpIGlzIHdyb25nIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIHJfcikgIT0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVyIHJldHVybmVkIGZyb20gbXB6X2ZkaXZfcl91aSBpcyB3cm9uZyIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCByKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXIgcmV0dXJuZWQgZnJvbSBtcHpfZmRpdl91aSBpcyB3cm9uZyIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKGRpdmlkZW5kKTsKKyAgbXB6X2NsZWFyIChxdW90aWVudCk7CisgIG1wel9jbGVhciAocmVtYWluZGVyKTsKKyAgbXB6X2NsZWFyIChxdW90aWVudDIpOworICBtcHpfY2xlYXIgKHJlbWFpbmRlcjIpOworICBtcHpfY2xlYXIgKHRlbXApOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3ZvaWQKK2R1bXBfYWJvcnQgKGNvbnN0IGNoYXIgKnN0ciwgbXB6X3QgZGl2aWRlbmQsIHVuc2lnbmVkIGxvbmcgZGl2aXNvcikKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iLCBzdHIpOworICBmcHJpbnRmIChzdGRlcnIsICJkaXZpZGVuZCA9ICIpOyBkZWJ1Z19tcCAoZGl2aWRlbmQsIC0xNik7CisgIGZwcmludGYgKHN0ZGVyciwgImRpdmlzb3IgID0gJWxYXG4iLCBkaXZpc29yKTsKKyAgYWJvcnQoKTsKK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1maWJfdWkuYyBiL3Rlc3RzL21wei90LWZpYl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOTQyNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1maWJfdWkuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogVGVzdCBtcHpfZmliX3VpIGFuZCBtcHpfZmliMl91aS4KKworQ29weXJpZ2h0IDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIFVzYWdlOiB0LWZpYl91aSBbeHxudW1dCisKKyAgIFJ1biB3aXRoIG5vIGFyZ3VtZW50cywgdGVzdHMgZ29lcyB1cCB0byB0aGUgaW5pdGlhbCB2YWx1ZSBvZiAibGltaXQiCisgICBiZWxvdy4gIFdpdGggYSBudW1iZXIgYXJndW1lbnQgdGVzdHMgYXJlIGNhcnJpZWQgdXAgdGhhdCBmYXIsIG9yIHdpdGggYQorICAgbGl0ZXJhbCAieCIgdGVzdHMgYXJlIGNvbnRpbnVlZCB3aXRob3V0IGxpbWl0ICh0aGlzIGJlaW5nIG9ubHkgbWVhbnQgZm9yCisgICBkZXZlbG9wbWVudCBwdXJwb3NlcykuCisKKyAgIFRoZSBzaXplIHRlc3RzIHBlcmZvcm1lZCBhcmUgZGVzaWduZWQgdG8gcGFydGlhbGx5IHJlcGxpY2F0ZSB3aGF0IHdpbGwgYmUKKyAgIGdvaW5nIG9uIGluIG1wel9maWJfdWkuICBUaGVyZSdzIHBsZW50eSBvZiBBU1NFUlRzIHRoZXJlLCBidXQgb2YgY291cnNlCisgICB0aGV5J3JlIG5vdCBub3JtYWxseSBlbmFibGVkLgorCisgICBNaXNmZWF0dXJlczoKKworICAgVGhlIHRlc3RzIG9uIE1QTl9GSUIyX1NJWkUgYXJlIGEgYml0IHVzZWxlc3MsIHNpbmNlIHRoYXQgbWFjcm8gaW5jbHVkZXMgYQorICAgKzIgZm9yIHRoZSBpbnRlcm5hbCBwdXJwb3NlcyBvZiBtcG5fZmliMl91aS4gIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvCisgICBnaXZlIG1wbl9maWIyX3VpIGEgcnVuIHdpdGggYXNzZXJ0aW9uIGNoZWNraW5nIGVuYWJsZWQuICAqLworCisKKyNkZWZpbmUgTVBaX0ZJQl9TSVpFX0ZMT0FUKG4pIFwKKyAgKChtcF9zaXplX3QpICgobikgKiAwLjY5NDI0MTkgLyBHTVBfTlVNQl9CSVRTICsgMSkpCisKKwordm9pZAorY2hlY2tfZmliX3RhYmxlICh2b2lkKQoreworICBpbnQgICAgICAgIGk7CisgIG1wX2xpbWJfdCAgd2FudDsKKworICBBU1NFUlRfQUxXQVlTIChGSUJfVEFCTEUoLTEpID09IDEpOworICBBU1NFUlRfQUxXQVlTIChGSUJfVEFCTEUoMCkgPT0gMCk7CisKKyAgZm9yIChpID0gMTsgaSA8PSBGSUJfVEFCTEVfTElNSVQ7IGkrKykKKyAgICB7CisgICAgICB3YW50ID0gRklCX1RBQkxFKGktMSkgKyBGSUJfVEFCTEUoaS0yKTsKKyAgICAgIGlmIChGSUJfVEFCTEUoaSkgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIkZJQl9UQUJMRSglZCkgd3JvbmdcbiIsIGkpOworICAgICAgICAgIGdtcF9wcmludGYgKCIgIGdvdCAgJSNOeFxuIiwgJkZJQl9UQUJMRShpKSwgMSk7CisgICAgICAgICAgZ21wX3ByaW50ZiAoIiAgd2FudCAlI054XG4iLCAmd2FudCwgMSk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB1bnNpZ25lZCBsb25nICBuOworICB1bnNpZ25lZCBsb25nICBsaW1pdCA9IDEwMCAqIEdNUF9MSU1CX0JJVFM7CisgIG1wel90ICAgICAgICAgIHdhbnRfZm4sIHdhbnRfZm4xLCBnb3RfZm4sIGdvdF9mbjE7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisgIGlmIChhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICd4JykKKyAgICBsaW1pdCA9IFVMT05HX01BWDsKKyAgZWxzZQorICAgIFRFU1RTX1JFUFMgKGxpbWl0LCBhcmd2LCBhcmdjKTsKKworICBjaGVja19maWJfdGFibGUgKCk7CisKKyAgLyogc3RhcnQgYXQgbj09MCAqLworICBtcHpfaW5pdF9zZXRfdWkgKHdhbnRfZm4xLCAxKTsgIC8qIEZbLTFdICovCisgIG1wel9pbml0X3NldF91aSAod2FudF9mbiwgIDApOyAgLyogRlswXSAgICovCisgIG1wel9pbml0IChnb3RfZm4pOworICBtcHpfaW5pdCAoZ290X2ZuMSk7CisKKyAgZm9yIChuID0gMDsgbiA8IGxpbWl0OyBuKyspCisgICAgeworICAgICAgLyogY2hlY2sgb3VyIGZsb2F0IGZvcm11bGEgc2VlbXMgcmlnaHQgKi8KKyAgICAgIGlmIChNUFpfRklCX1NJWkVfRkxPQVQgKG4pIDwgU0laKHdhbnRfZm4pKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiTVBaX0ZJQl9TSVpFX0ZMT0FUIHdyb25nIGF0IG49JWx1XG4iLCBuKTsKKyAgICAgICAgICBwcmludGYgKCIgIE1QWl9GSUJfU0laRV9GTE9BVCAgJWxkXG4iLCBNUFpfRklCX1NJWkVfRkxPQVQgKG4pKTsKKyAgICAgICAgICBwcmludGYgKCIgIFNJWih3YW50X2ZuKSAgICAgICAgJWRcbiIsIFNJWih3YW50X2ZuKSk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgLyogY2hlY2sgTVBOX0ZJQjJfU0laRSBzZWVtcyByaWdodCwgY29tcGFyZWQgdG8gYWN0dWFsIHNpemUgYW5kCisgICAgICAgICBjb21wYXJlZCB0byBvdXIgZmxvYXQgZm9ybXVsYSAqLworICAgICAgaWYgKE1QTl9GSUIyX1NJWkUgKG4pIDwgTVBaX0ZJQl9TSVpFX0ZMT0FUIChuKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIk1QTl9GSUIyX1NJWkUgd3JvbmcgYXQgbj0lbHVcbiIsIG4pOworICAgICAgICAgIHByaW50ZiAoIiAgTVBOX0ZJQjJfU0laRSAgICAgICAlbGRcbiIsIE1QTl9GSUIyX1NJWkUgKG4pKTsKKyAgICAgICAgICBwcmludGYgKCIgIE1QWl9GSUJfU0laRV9GTE9BVCAgJWxkXG4iLCBNUFpfRklCX1NJWkVfRkxPQVQgKG4pKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgICAgaWYgKE1QTl9GSUIyX1NJWkUgKG4pIDwgU0laKHdhbnRfZm4pKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiTVBOX0ZJQjJfU0laRSB3cm9uZyBhdCBuPSVsdVxuIiwgbik7CisgICAgICAgICAgcHJpbnRmICgiICBNUE5fRklCMl9TSVpFICAlbGRcbiIsIE1QTl9GSUIyX1NJWkUgKG4pKTsKKyAgICAgICAgICBwcmludGYgKCIgIFNJWih3YW50X2ZuKSAgICVkXG4iLCBTSVood2FudF9mbikpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIG1wel9maWIyX3VpIChnb3RfZm4sIGdvdF9mbjEsIG4pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290X2ZuKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKGdvdF9mbjEpOworICAgICAgaWYgKG1wel9jbXAgKGdvdF9mbiwgd2FudF9mbikgIT0gMCB8fCBtcHpfY21wIChnb3RfZm4xLCB3YW50X2ZuMSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9maWIyX3VpKCVsdSkgd3JvbmdcbiIsIG4pOworICAgICAgICAgIG1wel90cmFjZSAoIndhbnQgZm4gIiwgd2FudF9mbik7CisgICAgICAgICAgbXB6X3RyYWNlICgiZ290ICBmbiAiLCAgZ290X2ZuKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCJ3YW50IGZuMSIsIHdhbnRfZm4xKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCJnb3QgIGZuMSIsICBnb3RfZm4xKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICBtcHpfZmliX3VpIChnb3RfZm4sIG4pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290X2ZuKTsKKyAgICAgIGlmIChtcHpfY21wIChnb3RfZm4sIHdhbnRfZm4pICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcHpfZmliX3VpKCVsdSkgd3JvbmdcbiIsIG4pOworICAgICAgICAgIG1wel90cmFjZSAoIndhbnQgZm4iLCB3YW50X2ZuKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCJnb3QgIGZuIiwgZ290X2ZuKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorCisgICAgICBtcHpfYWRkICh3YW50X2ZuMSwgd2FudF9mbjEsIHdhbnRfZm4pOyAgLyogRltuKzFdID0gRltuXSArIEZbbi0xXSAqLworICAgICAgbXB6X3N3YXAgKHdhbnRfZm4xLCB3YW50X2ZuKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyICh3YW50X2ZuKTsKKyAgbXB6X2NsZWFyICh3YW50X2ZuMSk7CisgIG1wel9jbGVhciAoZ290X2ZuKTsKKyAgbXB6X2NsZWFyIChnb3RfZm4xKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtZml0cy5jIGIvdGVzdHMvbXB6L3QtZml0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTk1ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1maXRzLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIFRlc3QgbXB6X2ZpdHNfKl9wICovCisKKy8qCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIE5vdGhpbmcgc29waGlzdGljYXRlZCBoZXJlLCBqdXN0IGV4ZXJjaXNlIG1wel9maXRzXypfcCBvbiBhIHNtYWxsIGFtb3VudAorICAgb2YgZGF0YS4gKi8KKworI2RlZmluZSBFWFBFQ1RfUyhmdW4sbmFtZSxhbnN3ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb3QgPSBmdW4gKHopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZ290ICE9IGFuc3dlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJpbnRmICgiJXMgKCVzKSBnb3QgJWQgd2FudCAlZFxuIiwgbmFtZSwgZXhwciwgZ290LCBhbnN3ZXIpOyAgICAgXAorICAgICAgcHJpbnRmICgiIHogc2l6ZSAlZFxuIiwgU0laKHopKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJpbnRmICgiIHogZGVjICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgeik7IHByaW50ZiAoIlxuIik7ICAgXAorICAgICAgcHJpbnRmICgiIHogaGV4ICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgeik7IHByaW50ZiAoIlxuIik7ICAgXAorICAgICAgZXJyb3IgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBFWFBFQ1QoZnVuLGFuc3dlcikgIEVYUEVDVF9TKGZ1biwjZnVuLGFuc3dlcikKKworaW50CittYWluICh2b2lkKQoreworICBtcHpfdCAgICAgICB6OworICBpbnQgICAgICAgICBnb3Q7CisgIGNvbnN0IGNoYXIgICpleHByOworICBpbnQgICAgICAgICBlcnJvciA9IDA7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wel9pbml0ICh6KTsKKworICBtcHpfc2V0X3VpICh6LCAwTCk7CisgIGV4cHIgPSAiMCI7CisgIEVYUEVDVCAobXB6X2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c191c2hvcnRfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXB6X3NldF91aSAoeiwgMUwpOworICBleHByID0gIjEiOworICBFWFBFQ1QgKG1wel9maXRzX3Vsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3VpbnRfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfdXNob3J0X3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3NpbnRfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc3Nob3J0X3AsIDEpOworCisgIG1wel9zZXRfc2kgKHosIC0xTCk7CisgIGV4cHIgPSAiLTEiOworICBFWFBFQ1QgKG1wel9maXRzX3Vsb25nX3AsIDApOworICBFWFBFQ1QgKG1wel9maXRzX3VpbnRfcCwgMCk7CisgIEVYUEVDVCAobXB6X2ZpdHNfdXNob3J0X3AsIDApOworICBFWFBFQ1QgKG1wel9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3NpbnRfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc3Nob3J0X3AsIDEpOworCisgIG1wel9zZXRfdWkgKHosIDFMKTsKKyAgbXB6X211bF8yZXhwICh6LCB6LCA1TCpHTVBfTElNQl9CSVRTKTsKKyAgZXhwciA9ICIyXig1KkJQTUwpIjsKKyAgRVhQRUNUIChtcHpfZml0c191bG9uZ19wLCAwKTsKKyAgRVhQRUNUIChtcHpfZml0c191aW50X3AsIDApOworICBFWFBFQ1QgKG1wel9maXRzX3VzaG9ydF9wLCAwKTsKKyAgRVhQRUNUIChtcHpfZml0c19zbG9uZ19wLCAwKTsKKyAgRVhQRUNUIChtcHpfZml0c19zaW50X3AsIDApOworICBFWFBFQ1QgKG1wel9maXRzX3NzaG9ydF9wLCAwKTsKKworCisgIG1wel9zZXRfdWkgKHosICh1bnNpZ25lZCBsb25nKSBVU0hSVF9NQVgpOworICBleHByID0gIlVTSFJUX01BWCI7CisgIEVYUEVDVCAobXB6X2ZpdHNfdWxvbmdfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfdWludF9wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c191c2hvcnRfcCwgMSk7CisKKyAgbXB6X3NldF91aSAoeiwgKHVuc2lnbmVkIGxvbmcpIFVTSFJUX01BWCk7CisgIG1wel9hZGRfdWkgKHosIHosIDFMKTsKKyAgZXhwciA9ICJVU0hSVF9NQVggKyAxIjsKKyAgRVhQRUNUIChtcHpfZml0c191c2hvcnRfcCwgMCk7CisKKworICBtcHpfc2V0X3VpICh6LCAodW5zaWduZWQgbG9uZykgVUlOVF9NQVgpOworICBleHByID0gIlVJTlRfTUFYIjsKKyAgRVhQRUNUIChtcHpfZml0c191bG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c191aW50X3AsIDEpOworCisgIG1wel9zZXRfdWkgKHosICh1bnNpZ25lZCBsb25nKSBVSU5UX01BWCk7CisgIG1wel9hZGRfdWkgKHosIHosIDFMKTsKKyAgZXhwciA9ICJVSU5UX01BWCArIDEiOworICBFWFBFQ1QgKG1wel9maXRzX3VpbnRfcCwgMCk7CisKKworICBtcHpfc2V0X3VpICh6LCBVTE9OR19NQVgpOworICBleHByID0gIlVMT05HX01BWCI7CisgIEVYUEVDVCAobXB6X2ZpdHNfdWxvbmdfcCwgMSk7CisKKyAgbXB6X3NldF91aSAoeiwgVUxPTkdfTUFYKTsKKyAgbXB6X2FkZF91aSAoeiwgeiwgMUwpOworICBleHByID0gIlVMT05HX01BWCArIDEiOworICBFWFBFQ1QgKG1wel9maXRzX3Vsb25nX3AsIDApOworCisKKyAgbXB6X3NldF9zaSAoeiwgKGxvbmcpIFNIUlRfTUFYKTsKKyAgZXhwciA9ICJTSFJUX01BWCI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2ludF9wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c19zc2hvcnRfcCwgMSk7CisKKyAgbXB6X3NldF9zaSAoeiwgKGxvbmcpIFNIUlRfTUFYKTsKKyAgbXB6X2FkZF91aSAoeiwgeiwgMUwpOworICBleHByID0gIlNIUlRfTUFYICsgMSI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc3Nob3J0X3AsIDApOworCisKKyAgbXB6X3NldF9zaSAoeiwgKGxvbmcpIElOVF9NQVgpOworICBleHByID0gIklOVF9NQVgiOworICBFWFBFQ1QgKG1wel9maXRzX3Nsb25nX3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3NpbnRfcCwgMSk7CisKKyAgbXB6X3NldF9zaSAoeiwgKGxvbmcpIElOVF9NQVgpOworICBtcHpfYWRkX3VpICh6LCB6LCAxTCk7CisgIGV4cHIgPSAiSU5UX01BWCArIDEiOworICBFWFBFQ1QgKG1wel9maXRzX3NpbnRfcCwgMCk7CisKKworICBtcHpfc2V0X3NpICh6LCBMT05HX01BWCk7CisgIGV4cHIgPSAiTE9OR19NQVgiOworICBFWFBFQ1QgKG1wel9maXRzX3Nsb25nX3AsIDEpOworCisgIG1wel9zZXRfc2kgKHosIExPTkdfTUFYKTsKKyAgbXB6X2FkZF91aSAoeiwgeiwgMUwpOworICBleHByID0gIkxPTkdfTUFYICsgMSI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2xvbmdfcCwgMCk7CisKKworICBtcHpfc2V0X3NpICh6LCAobG9uZykgU0hSVF9NSU4pOworICBleHByID0gIlNIUlRfTUlOIjsKKyAgRVhQRUNUIChtcHpfZml0c19zbG9uZ19wLCAxKTsKKyAgRVhQRUNUIChtcHpfZml0c19zaW50X3AsIDEpOworICBFWFBFQ1QgKG1wel9maXRzX3NzaG9ydF9wLCAxKTsKKworICBtcHpfc2V0X3NpICh6LCAobG9uZykgU0hSVF9NSU4pOworICBtcHpfc3ViX3VpICh6LCB6LCAxTCk7CisgIGV4cHIgPSAiU0hSVF9NSU4gKyAxIjsKKyAgRVhQRUNUIChtcHpfZml0c19zc2hvcnRfcCwgMCk7CisKKworICBtcHpfc2V0X3NpICh6LCAobG9uZykgSU5UX01JTik7CisgIGV4cHIgPSAiSU5UX01JTiI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2xvbmdfcCwgMSk7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2ludF9wLCAxKTsKKworICBtcHpfc2V0X3NpICh6LCAobG9uZykgSU5UX01JTik7CisgIG1wel9zdWJfdWkgKHosIHosIDFMKTsKKyAgZXhwciA9ICJJTlRfTUlOICsgMSI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2ludF9wLCAwKTsKKworCisgIG1wel9zZXRfc2kgKHosIExPTkdfTUlOKTsKKyAgZXhwciA9ICJMT05HX01JTiI7CisgIEVYUEVDVCAobXB6X2ZpdHNfc2xvbmdfcCwgMSk7CisKKyAgbXB6X3NldF9zaSAoeiwgTE9OR19NSU4pOworICBtcHpfc3ViX3VpICh6LCB6LCAxTCk7CisgIGV4cHIgPSAiTE9OR19NSU4gKyAxIjsKKyAgRVhQRUNUIChtcHpfZml0c19zbG9uZ19wLCAwKTsKKworCisgIGlmIChlcnJvcikKKyAgICBhYm9ydCAoKTsKKworICBtcHpfY2xlYXIgKHopOworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtZ2NkLmMgYi90ZXN0cy9tcHovdC1nY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmIyNzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtZ2NkLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qIFRlc3QgbXB6X2djZCwgbXB6X2djZGV4dCwgYW5kIG1wel9nY2RfdWkuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDUsIDIwMDgsIDIwMDksIDIwMTIgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordm9pZCBvbmVfdGVzdCAobXB6X3QsIG1wel90LCBtcHpfdCwgaW50KTsKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCitzdGF0aWMgaW50IGdjZGV4dF92YWxpZF9wIChjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90LCBjb25zdCBtcHpfdCk7CisKKy8qIEtlZXAgb25lX3Rlc3QncyB2YXJpYWJsZXMgZ2xvYmFsLCBzbyB0aGF0IHdlIGRvbid0IG5lZWQKKyAgIHRvIHJlaW5pdGlhbGl6ZSB0aGVtIGZvciBlYWNoIHRlc3QuICAqLworbXB6X3QgZ2NkMSwgZ2NkMiwgcywgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworI2RlZmluZSBNQVhfU0NIT0VOSEFHRV9USFJFU0hPTEQgSEdDRF9SRURVQ0VfVEhSRVNIT0xECisKKy8qIERlZmluZSB0aGlzIHRvIG1ha2UgYWxsIG9wZXJhbmRzIGJlIGxhcmdlIGVub3VnaCBmb3IgU2Nob2VuaGFnZSBnY2QKKyAgIHRvIGJlIHVzZWQuICAqLworI2lmbmRlZiBXSEFDS19TQ0hPRU5IQUdFCisjZGVmaW5lIFdIQUNLX1NDSE9FTkhBR0UgMAorI2VuZGlmCisKKyNpZiBXSEFDS19TQ0hPRU5IQUdFCisjZGVmaW5lIE1JTl9PUEVSQU5EX0JJVFNJWkUgKE1BWF9TQ0hPRU5IQUdFX1RIUkVTSE9MRCAqIEdNUF9OVU1CX0JJVFMpCisjZWxzZQorI2RlZmluZSBNSU5fT1BFUkFORF9CSVRTSVpFIDEKKyNlbmRpZgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmE7CisgICAgY29uc3QgY2hhciAqYjsKKyAgICBjb25zdCBjaGFyICp3YW50OworICB9IGRhdGFbXSA9IHsKKyAgICAvKiBUaGlzIHRpY2tsZWQgYSBidWcgaW4gZ21wIDQuMS4yIG1wbi94ODYvazYvZ2NkX2ZpbmRhLmFzbS4gKi8KKyAgICB7ICIweDNGRkMwMDAwMDdGRkZGRkZGRkZGMDAwMDAwMDAwMDNGODNGRkZGRkZGRkZGRkZGRkY4MDAwMDAwMDAwMDAwMDAwMSIsCisgICAgICAiMHgxRkZFMDAwN0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiLAorICAgICAgIjUiIH0KKyAgfTsKKworICBtcHpfdCAgYSwgYiwgZ290LCB3YW50OworICBpbnQgICAgaTsKKworICBtcHpfaW5pdHMgKGEsIGIsIGdvdCwgd2FudCwgTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChhLCBkYXRhW2ldLmEsIDApOworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKGIsIGRhdGFbaV0uYiwgMCk7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAod2FudCwgZGF0YVtpXS53YW50LCAwKTsKKyAgICAgIG1wel9nY2QgKGdvdCwgYSwgYik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICAgICAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKwl7CisJICBwcmludGYgICAgKCJtcHpfZ2NkIHdyb25nIG9uIGRhdGFbJWRdXG4iLCBpKTsKKwkgIHByaW50ZiAgICAoIiBhICAlc1xuIiwgZGF0YVtpXS5hKTsKKwkgIHByaW50ZiAgICAoIiBiICAlc1xuIiwgZGF0YVtpXS5iKTsKKwkgIG1wel90cmFjZSAoIiBhIiwgYSk7CisJICBtcHpfdHJhY2UgKCIgYiIsIGIpOworCSAgbXB6X3RyYWNlICgiIHdhbnQiLCB3YW50KTsKKwkgIG1wel90cmFjZSAoIiBnb3QgIiwgZ290KTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFycyAoYSwgYiwgZ290LCB3YW50LCBOVUxMKTsKK30KKwordm9pZAorbWFrZV9jaGFpbl9vcGVyYW5kcyAobXB6X3QgcmVmLCBtcHpfdCBhLCBtcHpfdCBiLCBnbXBfcmFuZHN0YXRlX3QgcnMsIGludCBuYjEsIGludCBuYjIsIGludCBjaGFpbl9sZW4pCit7CisgIG1wel90IGJzLCB0ZW1wMSwgdGVtcDI7CisgIGludCBqOworCisgIG1wel9pbml0cyAoYnMsIHRlbXAxLCB0ZW1wMiwgTlVMTCk7CisKKyAgLyogR2VuZXJhdGUgYSBkaXZpc2lvbiBjaGFpbiBiYWNrd2FyZHMsIGFsbG93aW5nIG90aGVyd2lzZSB1bmxpa2VseSBodWdlCisgICAgIHF1b3RpZW50cy4gICovCisKKyAgbXB6X3NldF91aSAoYSwgMCk7CisgIG1wel91cmFuZG9tYiAoYnMsIHJzLCAzMik7CisgIG1wel91cmFuZG9tYiAoYnMsIHJzLCBtcHpfZ2V0X3VpIChicykgJSBuYjEgKyAxKTsKKyAgbXB6X3JyYW5kb21iIChiLCBycywgbXB6X2dldF91aSAoYnMpKTsKKyAgbXB6X2FkZF91aSAoYiwgYiwgMSk7CisgIG1wel9zZXQgKHJlZiwgYik7CisKKyAgZm9yIChqID0gMDsgaiA8IGNoYWluX2xlbjsgaisrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJzLCAzMik7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCBycywgbXB6X2dldF91aSAoYnMpICUgbmIyICsgMSk7CisgICAgICBtcHpfcnJhbmRvbWIgKHRlbXAyLCBycywgbXB6X2dldF91aSAoYnMpICsgMSk7CisgICAgICBtcHpfYWRkX3VpICh0ZW1wMiwgdGVtcDIsIDEpOworICAgICAgbXB6X211bCAodGVtcDEsIGIsIHRlbXAyKTsKKyAgICAgIG1wel9hZGQgKGEsIGEsIHRlbXAxKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcnMsIDMyKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJzLCBtcHpfZ2V0X3VpIChicykgJSBuYjIgKyAxKTsKKyAgICAgIG1wel9ycmFuZG9tYiAodGVtcDIsIHJzLCBtcHpfZ2V0X3VpIChicykgKyAxKTsKKyAgICAgIG1wel9hZGRfdWkgKHRlbXAyLCB0ZW1wMiwgMSk7CisgICAgICBtcHpfbXVsICh0ZW1wMSwgYSwgdGVtcDIpOworICAgICAgbXB6X2FkZCAoYiwgYiwgdGVtcDEpOworICAgIH0KKworICBtcHpfY2xlYXJzIChicywgdGVtcDEsIHRlbXAyLCBOVUxMKTsKK30KKworLyogVGVzdCBvcGVyYW5kcyBmcm9tIGEgdGFibGUgb2Ygc2VlZCBkYXRhLiAgVGhpcyB2YXJpYW50IGNyZWF0ZXMgdGhlIG9wZXJhbmRzCisgICB1c2luZyBwbGFpbiBvbCcgbXB6X3JyYW5kb21iLiAgVGhpcyBpcyBhIGhhY2sgZm9yIGJldHRlciBjb3ZlcmFnZSBvZiB0aGUgZ2NkCisgICBjb2RlLCB3aGljaCBkZXBlbmRzIG9uIHRoYXQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBnaXZlIHRoZSBleGFjdAorICAgbnVtYmVycyB3ZSBleHBlY3QuICAqLwordm9pZAorY2hlY2tfa29sbW8xICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VlZDsKKyAgICBpbnQgbmI7CisgICAgY29uc3QgY2hhciAqd2FudDsKKyAgfSBkYXRhW10gPSB7CisgICAgeyA1OTYxOCwgMzgyMDgsICI1In0sCisgICAgeyA3NjUyMSwgNDkwMjQsICIzIn0sCisgICAgeyA4NTg2OSwgNTQ5NzYsICIxIn0sCisgICAgeyA5OTQ0OSwgNjM2ODAsICIxIn0sCisgICAgezExMjQ1MywgNzIwMDAsICIxIn0KKyAgfTsKKworICBnbXBfcmFuZHN0YXRlX3QgcnM7CisgIG1wel90ICBicywgYSwgYiwgd2FudDsKKyAgaW50ICAgIGksIHVuYiwgdm5iLCBuYjsKKworICBnbXBfcmFuZGluaXRfZGVmYXVsdCAocnMpOworCisgIG1wel9pbml0cyAoYnMsIGEsIGIsIHdhbnQsIE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBuYiA9IGRhdGFbaV0ubmI7CisKKyAgICAgIGdtcF9yYW5kc2VlZF91aSAocnMsIGRhdGFbaV0uc2VlZCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJzLCAzMik7CisgICAgICB1bmIgPSBtcHpfZ2V0X3VpIChicykgJSBuYjsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJzLCAzMik7CisgICAgICB2bmIgPSBtcHpfZ2V0X3VpIChicykgJSBuYjsKKworICAgICAgbXB6X3JyYW5kb21iIChhLCBycywgdW5iKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoYiwgcnMsIHZuYik7CisKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0ICh3YW50LCBkYXRhW2ldLndhbnQsIDApOworCisgICAgICBvbmVfdGVzdCAoYSwgYiwgd2FudCwgLTEpOworICAgIH0KKworICBtcHpfY2xlYXJzIChicywgYSwgYiwgd2FudCwgTlVMTCk7CisgIGdtcF9yYW5kY2xlYXIgKHJzKTsKK30KKworLyogVGVzdCBvcGVyYW5kcyBmcm9tIGEgdGFibGUgb2Ygc2VlZCBkYXRhLiAgVGhpcyB2YXJpYW50IGNyZWF0ZXMgdGhlIG9wZXJhbmRzCisgICB1c2luZyBhIGRpdmlzaW9uIGNoYWluLiAgVGhpcyBpcyBhIGhhY2sgZm9yIGJldHRlciBjb3ZlcmFnZSBvZiB0aGUgZ2NkCisgICBjb2RlLCB3aGljaCBkZXBlbmRzIG9uIHRoYXQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBnaXZlIHRoZSBleGFjdAorICAgbnVtYmVycyB3ZSBleHBlY3QuICAqLwordm9pZAorY2hlY2tfa29sbW8yICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgc2VlZDsKKyAgICBpbnQgbmIsIGNoYWluX2xlbjsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAgOTE3LCAxNSwgNSB9LAorICAgIHsgMTAzMiwgMTgsIDYgfSwKKyAgICB7IDExNjcsIDE4LCA2IH0sCisgICAgeyAxMTc0LCAxOCwgNiB9LAorICAgIHsgMTE5MiwgMTgsIDYgfSwKKyAgfTsKKworICBnbXBfcmFuZHN0YXRlX3QgcnM7CisgIG1wel90ICBicywgYSwgYiwgd2FudDsKKyAgaW50ICAgIGk7CisKKyAgZ21wX3JhbmRpbml0X2RlZmF1bHQgKHJzKTsKKworICBtcHpfaW5pdHMgKGJzLCBhLCBiLCB3YW50LCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgZ21wX3JhbmRzZWVkX3VpIChycywgZGF0YVtpXS5zZWVkKTsKKyAgICAgIG1ha2VfY2hhaW5fb3BlcmFuZHMgKHdhbnQsIGEsIGIsIHJzLCBkYXRhW2ldLm5iLCBkYXRhW2ldLm5iLCBkYXRhW2ldLmNoYWluX2xlbik7CisgICAgICBvbmVfdGVzdCAoYSwgYiwgd2FudCwgLTEpOworICAgIH0KKworICBtcHpfY2xlYXJzIChicywgYSwgYiwgd2FudCwgTlVMTCk7CisgIGdtcF9yYW5kY2xlYXIgKHJzKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IG9wMSwgb3AyLCByZWY7CisgIGludCBpLCBjaGFpbl9sZW47CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisgIGxvbmcgaW50IHJlcHMgPSAyMDA7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIFRFU1RTX1JFUFMgKHJlcHMsIGFyZ3YsIGFyZ2MpOworCisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXRzIChicywgb3AxLCBvcDIsIHJlZiwgZ2NkMSwgZ2NkMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgcywgTlVMTCk7CisKKyAgY2hlY2tfZGF0YSAoKTsKKyAgY2hlY2tfa29sbW8xICgpOworICBjaGVja19rb2xtbzIgKCk7CisKKyAgLyogVGVzdGNhc2UgdG8gZXhlcmNpc2UgdGhlIHUwID09IHUxIGNhc2UgaW4gbXBuX2djZGV4dF9sZWhtZXJfbi4gKi8KKyAgLyogbXB6X3NldF91aSAob3AyLCBHTVBfTlVNQl9NQVgpOyAqLyAvKiBGSVhNRTogSHVnZSBsaW1iIGRvZXNuJ3QgYWx3YXlzIGZpdCAqLworICBtcHpfc2V0X3VpIChvcDIsIDApOworICBtcHpfc2V0Yml0IChvcDIsIEdNUF9OVU1CX0JJVFMpOworICBtcHpfc3ViX3VpIChvcDIsIG9wMiwgMSk7CisgIG1wel9tdWxfMmV4cCAob3AxLCBvcDIsIDEwMCk7CisgIG1wel9hZGQgKG9wMSwgb3AxLCBvcDIpOworICBtcHpfbXVsX3VpIChvcDIsIG9wMiwgMik7CisgIG9uZV90ZXN0IChvcDEsIG9wMiwgTlVMTCwgLTEpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgLyogR2VuZXJhdGUgcGxhaW4gb3BlcmFuZHMgd2l0aCB1bmtub3duIGdjZC4gIFRoZXNlIHR5cGVzIG9mIG9wZXJhbmRzCisJIGhhdmUgcHJvdmVuIHRvIHRyaWdnZXIgY2VydGFpbiBidWdzIGluIGRldmVsb3BtZW50IHZlcnNpb25zIG9mIHRoZQorCSBnY2QgY29kZS4gIFRoZSAiaGdjZC0+cm93WzNdLnJzaXplID4gTSIgQVNTRVJUIGlzIG5vdCB0cmlnZ2VyZWQgYnkKKwkgdGhlIGRpdmlzaW9uIGNoYWluIGNvZGUgYmVsb3csIGJ1dCB0aGF0IGlzIG1vc3QgbGlrZWx5IGp1c3QgYSByZXN1bHQKKwkgb2YgdGhhdCBvdGhlciBBU1NFUlRzIGFyZSB0cmlnZ2VyZWQgYmVmb3JlIGl0LiAgKi8KKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxNyArIDI7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIG1wel9ycmFuZG9tYiAob3AxLCByYW5kcywgbXB6X2dldF91aSAoYnMpICsgTUlOX09QRVJBTkRfQklUU0laRSk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMiwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSArIE1JTl9PUEVSQU5EX0JJVFNJWkUpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgOCk7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisKKyAgICAgIGlmICgoYnNpICYgMHgzYykgPT0gNCkKKwltcHpfbXVsIChvcDEsIG9wMSwgb3AyKTsJLyogbWFrZSBvcDEgYSBtdWx0aXBsZSBvZiBvcDIgKi8KKyAgICAgIGVsc2UgaWYgKChic2kgJiAweDNjKSA9PSA4KQorCW1wel9tdWwgKG9wMiwgb3AxLCBvcDIpOwkvKiBtYWtlIG9wMiBhIG11bHRpcGxlIG9mIG9wMSAqLworCisgICAgICBpZiAoKGJzaSAmIDEpICE9IDApCisJbXB6X25lZyAob3AxLCBvcDEpOworICAgICAgaWYgKChic2kgJiAyKSAhPSAwKQorCW1wel9uZWcgKG9wMiwgb3AyKTsKKworICAgICAgb25lX3Rlc3QgKG9wMSwgb3AyLCBOVUxMLCBpKTsKKworICAgICAgLyogR2VuZXJhdGUgYSBkaXZpc2lvbiBjaGFpbiBiYWNrd2FyZHMsIGFsbG93aW5nIG90aGVyd2lzZSB1bmxpa2VseSBodWdlCisJIHF1b3RpZW50cy4gICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBjaGFpbl9sZW4gPSBtcHpfZ2V0X3VpIChicykgJSBMT0cyQyAoR01QX05VTUJfQklUUyAqIE1BWF9TQ0hPRU5IQUdFX1RIUkVTSE9MRCk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgY2hhaW5fbGVuID0gbXB6X2dldF91aSAoYnMpICUgKDEgPDwgY2hhaW5fbGVuKSAvIDMyOworCisgICAgICBtYWtlX2NoYWluX29wZXJhbmRzIChyZWYsIG9wMSwgb3AyLCByYW5kcywgMTYsIDEyLCBjaGFpbl9sZW4pOworCisgICAgICBvbmVfdGVzdCAob3AxLCBvcDIsIHJlZiwgaSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgd2UgY2FuIHVzZSBOVUxMIGFzIGZpcnN0IGFyZ3VtZW50IG9mIG1wel9nY2RleHQuICAqLworICBtcHpfc2V0X3NpIChvcDEsIC0xMCk7CisgIG1wel9zZXRfc2kgKG9wMiwgMCk7CisgIG1wel9nY2RleHQgKE5VTEwsIHRlbXAxLCB0ZW1wMiwgb3AxLCBvcDIpOworICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3NpICh0ZW1wMSwgLTEpID09IDApOworICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3NpICh0ZW1wMiwgMCkgPT0gMCk7CisgIG1wel9zZXRfc2kgKG9wMiwgNik7CisgIG1wel9nY2RleHQgKE5VTEwsIHRlbXAxLCB0ZW1wMiwgb3AxLCBvcDIpOworICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3NpICh0ZW1wMSwgMSkgPT0gMCk7CisgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBfc2kgKHRlbXAyLCAyKSA9PSAwKTsKKworICBtcHpfY2xlYXJzIChicywgb3AxLCBvcDIsIHJlZiwgZ2NkMSwgZ2NkMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgcywgTlVMTCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CisKK3ZvaWQKK29uZV90ZXN0IChtcHpfdCBvcDEsIG1wel90IG9wMiwgbXB6X3QgcmVmLCBpbnQgaSkKK3sKKyAgLyoKKyAgcHJpbnRmICgiJWQgJWQgJWRcbiIsIFNJWiAob3AxKSwgU0laIChvcDIpLCByZWYgIT0gTlVMTCA/IFNJWiAocmVmKSA6IDApOworICBmZmx1c2ggKHN0ZG91dCk7CisgICovCisKKyAgLyoKKyAgZnByaW50ZiAoc3RkZXJyLCAib3AxPSIpOyAgZGVidWdfbXAgKG9wMSwgLTE2KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAib3AyPSIpOyAgZGVidWdfbXAgKG9wMiwgLTE2KTsKKyAgKi8KKworICBtcHpfZ2NkZXh0IChnY2QxLCBzLCBOVUxMLCBvcDEsIG9wMik7CisgIE1QWl9DSEVDS19GT1JNQVQgKGdjZDEpOworICBNUFpfQ0hFQ0tfRk9STUFUIChzKTsKKworICBpZiAocmVmICYmIG1wel9jbXAgKHJlZiwgZ2NkMSkgIT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9nY2RleHQgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3VsdFxuIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJvcDE9Iik7ICAgICAgICAgICAgICAgICBkZWJ1Z19tcCAob3AxLCAtMTYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3AyPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMiwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImV4cGVjdGVkIHJlc3VsdDpcbiIpOyAgIGRlYnVnX21wIChyZWYsIC0xNik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJtcHpfZ2NkZXh0IHJldHVybnM6XG4iKTtkZWJ1Z19tcCAoZ2NkMSwgLTE2KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAoIWdjZGV4dF92YWxpZF9wKG9wMSwgb3AyLCBnY2QxLCBzKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9nY2RleHQgcmV0dXJuZWQgaW52YWxpZCByZXN1bHRcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3AxPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMSwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm9wMj0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChvcDIsIC0xNik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJtcHpfZ2NkZXh0IHJldHVybnM6XG4iKTtkZWJ1Z19tcCAoZ2NkMSwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInM9Iik7ICAgICAgICAgICAgICAgICAgIGRlYnVnX21wIChzLCAtMTYpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9nY2QgKGdjZDIsIG9wMSwgb3AyKTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAoZ2NkMik7CisKKyAgaWYgKG1wel9jbXAgKGdjZDIsIGdjZDEpICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgaSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJtcHpfZ2NkIHJldHVybmVkIGluY29ycmVjdCByZXN1bHRcbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3AxPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMSwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm9wMj0iKTsgICAgICAgICAgICAgICAgIGRlYnVnX21wIChvcDIsIC0xNik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJleHBlY3RlZCByZXN1bHQ6XG4iKTsgICBkZWJ1Z19tcCAoZ2NkMSwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9nY2QgcmV0dXJuczpcbiIpOyAgIGRlYnVnX21wIChnY2QyLCAtMTYpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIC8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IG1vdmUgdG8gdC1nY2RfdWkuYyAqLworICBpZiAobXB6X2ZpdHNfdWxvbmdfcCAob3AxKSB8fCBtcHpfZml0c191bG9uZ19wIChvcDIpKQorICAgIHsKKyAgICAgIGlmIChtcHpfZml0c191bG9uZ19wIChvcDEpKQorCW1wel9nY2RfdWkgKGdjZDIsIG9wMiwgbXB6X2dldF91aSAob3AxKSk7CisgICAgICBlbHNlCisJbXB6X2djZF91aSAoZ2NkMiwgb3AxLCBtcHpfZ2V0X3VpIChvcDIpKTsKKyAgICAgIGlmIChtcHpfY21wIChnY2QyLCBnY2QxKSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIm1wel9nY2RfdWkgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3VsdFxuIik7CisJICBmcHJpbnRmIChzdGRlcnIsICJvcDE9Iik7ICAgICAgICAgICAgICAgICBkZWJ1Z19tcCAob3AxLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAib3AyPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMiwgLTE2KTsKKwkgIGZwcmludGYgKHN0ZGVyciwgImV4cGVjdGVkIHJlc3VsdDpcbiIpOyAgIGRlYnVnX21wIChnY2QxLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAibXB6X2djZF91aSByZXR1cm5zOlxuIik7ICAgZGVidWdfbXAgKGdjZDIsIC0xNik7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIG1wel9nY2RleHQgKGdjZDIsIHRlbXAxLCB0ZW1wMiwgb3AxLCBvcDIpOworICBNUFpfQ0hFQ0tfRk9STUFUIChnY2QyKTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAodGVtcDEpOworICBNUFpfQ0hFQ0tfRk9STUFUICh0ZW1wMik7CisKKyAgbXB6X211bCAodGVtcDEsIHRlbXAxLCBvcDEpOworICBtcHpfbXVsICh0ZW1wMiwgdGVtcDIsIG9wMik7CisgIG1wel9hZGQgKHRlbXAxLCB0ZW1wMSwgdGVtcDIpOworCisgIGlmIChtcHpfY21wIChnY2QxLCBnY2QyKSAhPSAwCisgICAgICB8fCBtcHpfY21wIChnY2QyLCB0ZW1wMSkgIT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBpbiB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9nY2RleHQgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3VsdFxuIik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJvcDE9Iik7ICAgICAgICAgICAgICAgICBkZWJ1Z19tcCAob3AxLCAtMTYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAib3AyPSIpOyAgICAgICAgICAgICAgICAgZGVidWdfbXAgKG9wMiwgLTE2KTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImV4cGVjdGVkIHJlc3VsdDpcbiIpOyAgIGRlYnVnX21wIChnY2QxLCAtMTYpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAibXB6X2djZGV4dCByZXR1cm5zOlxuIik7ZGVidWdfbXAgKGdjZDIsIC0xNik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIENhbGxlZCB3aGVuIGcgaXMgc3VwcG9zZWQgdG8gYmUgZ2NkKGEsYiksIGFuZCBnID0gcyBhICsgdCBiLCBmb3Igc29tZSB0LgorICAgVXNlcyB0ZW1wMSwgdGVtcDIgYW5kIHRlbXAzLiAqLworc3RhdGljIGludAorZ2NkZXh0X3ZhbGlkX3AgKGNvbnN0IG1wel90IGEsIGNvbnN0IG1wel90IGIsIGNvbnN0IG1wel90IGcsIGNvbnN0IG1wel90IHMpCit7CisgIC8qIEl0J3Mgbm90IGNsZWFyIHRoYXQgZ2NkKDAsMCkgaXMgd2VsbCBkZWZpbmVkLCBidXQgd2UgYWxsb3cgaXQgYW5kIHJlcXVpcmUgdGhhdAorICAgICBnY2QoMCwwKSA9IDAuICovCisgIGlmIChtcHpfc2duIChnKSA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1wel9zZ24gKGEpID09IDApCisgICAgeworICAgICAgLyogTXVzdCBoYXZlIGcgPT0gYWJzIChiKS4gQW55IHZhbHVlIGZvciBzIGlzIGluIHNvbWUgc2Vuc2UgImNvcnJlY3QiLAorCSBidXQgaXQgbWFrZXMgc2Vuc2UgdG8gcmVxdWlyZSB0aGF0IHMgPT0gMC4gKi8KKyAgICAgIHJldHVybiBtcHpfY21wYWJzIChnLCBiKSA9PSAwICYmIG1wel9zZ24gKHMpID09IDA7CisgICAgfQorICBlbHNlIGlmIChtcHpfc2duIChiKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIE11c3QgaGF2ZSBnID09IGFicyAoYSksIHMgPT0gc2lnbiAoYSkgKi8KKyAgICAgIHJldHVybiBtcHpfY21wYWJzIChnLCBhKSA9PSAwICYmIG1wel9jbXBfc2kgKHMsIG1wel9zZ24gKGEpKSA9PSAwOworICAgIH0KKworICBpZiAobXB6X3NnbiAoZykgPD0gMCkKKyAgICByZXR1cm4gMDsKKworICBtcHpfdGRpdl9xciAodGVtcDEsIHRlbXAzLCBhLCBnKTsKKyAgaWYgKG1wel9zZ24gKHRlbXAzKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIG1wel90ZGl2X3FyICh0ZW1wMiwgdGVtcDMsIGIsIGcpOworICBpZiAobXB6X3NnbiAodGVtcDMpICE9IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogUmVxdWlyZSB0aGF0IDIgfHN8IDwgfGIvZ3wsIG9yIHxzfCA9PSAxLiAqLworICBpZiAobXB6X2NtcGFic191aSAocywgMSkgPiAwKQorICAgIHsKKyAgICAgIG1wel9tdWxfMmV4cCAodGVtcDMsIHMsIDEpOworICAgICAgaWYgKG1wel9jbXBhYnMgKHRlbXAzLCB0ZW1wMikgPj0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgb3RoZXIgY29mYWN0b3IuICovCisgIG1wel9tdWwodGVtcDIsIHMsIGEpOworICBtcHpfc3ViKHRlbXAyLCBnLCB0ZW1wMik7CisgIG1wel90ZGl2X3FyKHRlbXAyLCB0ZW1wMywgdGVtcDIsIGIpOworCisgIGlmIChtcHpfc2duICh0ZW1wMykgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBSZXF1aXJlIHRoYXQgMiB8dHwgPCB8YS9nfCBvciB8dHwgPT0gMSovCisgIGlmIChtcHpfY21wYWJzX3VpICh0ZW1wMiwgMSkgPiAwKQorICAgIHsKKyAgICAgIG1wel9tdWxfMmV4cCAodGVtcDIsIHRlbXAyLCAxKTsKKyAgICAgIGlmIChtcHpfY21wYWJzICh0ZW1wMiwgdGVtcDEpID49IDApCisJcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWdjZF91aS5jIGIvdGVzdHMvbXB6L3QtZ2NkX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1NmE5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWdjZF91aS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiBUZXN0IG1wel9nY2RfdWkuCisKK0NvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogQ2hlY2sgbXB6X2djZF91aSBkb2Vzbid0IHRyeSB0byByZXR1cm4gYSB2YWx1ZSBvdXQgb2YgcmFuZ2UuCisgICBUaGlzIHdhcyB3cm9uZyBpbiBnbXAgNC4xLjIgd2l0aCBhIGxvbmcgbG9uZyBsaW1iLiAgKi8KK3N0YXRpYyB2b2lkCitjaGVja191aV9yYW5nZSAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyAgZ290OworICBtcHpfdCAgeDsKKyAgaW50ICBpOworCisgIG1wel9pbml0X3NldF91aSAoeCwgVUxPTkdfTUFYKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICB7CisgICAgICBtcHpfbXVsXzJleHAgKHgsIHgsIDFMKTsKKyAgICAgIGdvdCA9IG1wel9nY2RfdWkgKE5VTEwsIHgsIDBMKTsKKyAgICAgIGlmIChnb3QgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9nY2RfdWkgKFVMT05HX01BWCoyXiVkLCAwKVxuIiwgaSk7CisgICAgICAgICAgcHJpbnRmICgiICAgcmV0dXJuICUjbHhcbiIsIGdvdCk7CisgICAgICAgICAgcHJpbnRmICgiICAgc2hvdWxkIGJlIDBcbiIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wel9jbGVhciAoeCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja191aV9mYWN0b3JzICh2b2lkKQoreworI2RlZmluZSBOVU1fRkFDVE9SUyA5CisgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWN0b3JzW05VTV9GQUNUT1JTXSA9IHsKKyAgICAiNjQxIiwgIjI3NDE3NyIsICIzIiwgIjUiLCAiMTciLCAiMjU3IiwgIjY1NTM3IiwKKyAgICAiNTk2NDk1ODkxMjc0OTcyMTciLCAiMTIzODkyNjM2MTU1Mjg5NyIgfTsKKyAgdW5zaWduZWQgbG9uZyAgZ290OworICBtcHpfdCAgeCwgYiwgZCwgZiwgZzsKKyAgaW50ICBpLCBqOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKworICBpZiAoR01QX05VTUJfQklUUyA8IDUgfHwgR01QX05VTUJfQklUUyA9PSA4CisgICAgICB8fCBHTVBfTlVNQl9CSVRTID09IDE2IHx8IEdNUF9OVU1CX0JJVFMgPiA1MTEpCisgICAgeworICAgICAgcHJpbnRmICgiTm8gdXNhYmxlIGZhY3RvcnMgZm9yIDJeJWkrMS5cbiIsIEdNUF9OVU1CX0JJVFMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtcHpfaW5pdCAoeCk7CisgIG1wel9pbml0IChkKTsKKyAgbXB6X2luaXQgKGYpOworICBtcHpfaW5pdCAoZyk7CisKKyAgbXB6X3NldGJpdCAoeCwgR01QX05VTUJfQklUUyk7CisgIG1wel9hZGRfdWkgKHgsIHgsIDEpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkFDVE9SUzsgKytpKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyIChmLCBmYWN0b3JzW2ldLCAxMCk7CisgICAgICBpZiAobXB6X2RpdmlzaWJsZV9wICh4LCBmKSkKKwl7CisJICBtcHpfbXVsXzJleHAgKGYsIGYsIDEpOworCSAgLyogZCBpcyBhbiBvZGQgbXVsdGlwbGUgb2YgdGhlIGZhY3RvciBmLCBleGFjdGx5IGZpbGxpbmcgYSBsaW1iLiAqLworCSAgbXB6X3N1YiAoZCwgeCwgZik7CisJICAvKiBmID0gMl5HTVBfTlVNQl9CSVRTIG1vZCBkLiAqLworCSAgbXB6X3N1Yl91aSAoZiwgZiwgMSk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIG1wel9nY2QgKGcsIGYsIGQpOworICBpZiAobXB6X2V2ZW5fcCAoZCkgfHwgbXB6X2NtcCAoZCwgZikgPD0gMCB8fCBtcHpfY21wX3VpIChnLCAxKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk5vIHVzYWJsZSBmYWN0b3IgZm91bmQuXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICByYW5kcyA9IFJBTkRTOworICBtcHpfbXVsX3VpICh4LCBkLCBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCAzMDAwMCkgKyAxKTsKKworICBtcHpfaW5pdCAoYik7CisgIG1wel9zZXRiaXQgKGIsIEdNUF9OVU1CX0JJVFMgLSAxKTsKKyAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikKKyAgICB7CisgICAgICBtcHpfYWRkICh4LCB4LCBiKTsKKworICAgICAgZm9yIChpID0gMTsgaSA+PSAtMTsgLS1pKQorCXsKKwkgIGlmIChtcHpfZml0c191bG9uZ19wIChkKQorCSAgICAgICYmICgoZ290ID0gbXB6X2djZF91aSAoTlVMTCwgeCwgbXB6X2dldF91aSAoZCkpKQorCQkgICE9IChpICE9IDAgPyAxIDogbXB6X2dldF91aSAoZCkpKSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIm1wel9nY2RfdWkgKGYsIGtWKyVpKjJeJWksIFYpOiBlcnJvciAoaiA9ICVpKVxuIiwgaSwgR01QX05VTUJfQklUUyAtIDEsIGopOworCSAgICAgIHByaW50ZiAoIiAgIHJldHVybiAlI2x4XG4iLCBnb3QpOworCSAgICAgIHByaW50ZiAoIiAgIHNob3VsZCBiZSAlI2x4XG4iLCAoaSAhPSAwID8gMSA6IG1wel9nZXRfdWkgKGQpKSk7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKworCSAgbXB6X2djZCAoZywgeCwgZCk7CisJICBpZiAoKG1wel9jbXBfdWkgKGcsIDEpID09IDApICE9IChpICE9IDApKQorCSAgICB7CisJICAgICAgcHJpbnRmICgibXB6X2djZCAoZiwga1YrJWkqMl4laSwgVik6IGVycm9yIChqID0gJWkpXG4iLCBpLCBHTVBfTlVNQl9CSVRTIC0gMSwgaik7CisJICAgICAgcHJpbnRmICgiICAgc2hvdWxkJXMgYmUgb25lLlxuIiwoaSAhPSAwID8gIiIgOiAiIG5vdCIpKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBtcHpfc3ViICh4LCB4LCBiKTsKKwl9CisgICAgICAvKiBCYWNrIHRvIHRoZSBvcmlnaW5hbCB4LiAqLworICAgICAgbXB6X2FkZG11bF91aSAoeCwgYiwgMik7CisgICAgICBtcHpfbXVsIChiLCBiLCBmKTsKKyAgICAgIG1wel9tb2QgKGIsIGIsIGQpOworICAgIH0KKworICBtcHpfY2xlYXIgKGcpOworICBtcHpfY2xlYXIgKHgpOworICBtcHpfY2xlYXIgKGYpOworICBtcHpfY2xlYXIgKGQpOworICBtcHpfY2xlYXIgKGIpOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfdWlfcmFuZ2UgKCk7CisgIGNoZWNrX3VpX2ZhY3RvcnMgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWdldF9kLmMgYi90ZXN0cy9tcHovdC1nZXRfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzgzOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1nZXRfZC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIFRlc3QgbXB6X2dldF9kLgorCitDb3B5cmlnaHQgMjAwMiwgMjAxMiwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZWJpdCAodm9pZCkKK3sKKyAgaW50ICAgICBpOworICBtcHpfdCAgIHo7CisgIGRvdWJsZSAgZ290LCB3YW50OworICAvKiBGSVhNRTogSXQnZCBiZSBiZXR0ZXIgdG8gYmFzZSB0aGlzIG9uIHRoZSBmbG9hdCBmb3JtYXQuICovCisjaWYgZGVmaW5lZCAoX192YXgpIHx8IGRlZmluZWQgKF9fdmF4X18pCisgIGludCAgICAgbGltaXQgPSAxMjcgLSAxOyAgLyogdmF4IGZwIG51bWJlcnMgaGF2ZSBsaW1pdGVkIHJhbmdlICovCisjZWxzZQorICBpbnQgICAgIGxpbWl0ID0gNTEyOworI2VuZGlmCisKKyAgbXB6X2luaXQgKHopOworCisgIGdvdCA9IG1wel9nZXRfZCAoeik7CisgIGlmIChnb3QgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgICAgKCJtcHpfZ2V0X2Qgd3Jvbmcgb24gemVyb1xuIik7CisgICAgICBhYm9ydCgpOworICAgIH0KKworICBtcHpfc2V0X3VpICh6LCAxTCk7CisgIHdhbnQgPSAxLjA7CisKKyAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspCisgICAgeworICAgICAgZ290ID0gbXB6X2dldF9kICh6KTsKKworICAgICAgaWYgKGdvdCAhPSB3YW50KQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kIHdyb25nIG9uIDIqKiVkXG4iLCBpKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgICB6ICAgICIsIHopOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIHdhbnQgICUuMjBnXG4iLCB3YW50KTsKKyAgICAgICAgICBwcmludGYgICAgKCIgICBnb3QgICAlLjIwZ1xuIiwgZ290KTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisKKyAgICAgIG1wel9tdWxfMmV4cCAoeiwgeiwgMUwpOworICAgICAgd2FudCAqPSAyLjA7CisgICAgfQorICBtcHpfY2xlYXIgKHopOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfb25lYml0ICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1nZXRfZF8yZXhwLmMgYi90ZXN0cy9tcHovdC1nZXRfZF8yZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjZjFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWdldF9kXzJleHAuYwpAQCAtMCwwICsxLDIyMiBAQAorLyogVGVzdCBtcHpfZ2V0X2RfMmV4cC4KKworQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitzdGF0aWMgdm9pZAorY2hlY2tfemVybyAodm9pZCkKK3sKKyAgbXB6X3QgICB6OworICBkb3VibGUgIGdvdCwgd2FudDsKKyAgbG9uZyAgICBnb3RfZXhwLCB3YW50X2V4cDsKKworICBtcHpfaW5pdF9zZXRfdWkgKHosIDApOworCisgIHdhbnQgPSAwLjA7CisgIHdhbnRfZXhwID0gMDsKKyAgZ290ID0gbXB6X2dldF9kXzJleHAgKCZnb3RfZXhwLCB6KTsKKyAgaWYgKGdvdCAhPSB3YW50IHx8IGdvdF9leHAgIT0gd2FudF9leHApCisgICAgeworICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kXzJleHAgd3Jvbmcgb24gemVyb1xuIik7CisgICAgICBtcHpfdHJhY2UgKCIgICB6ICAgICIsIHopOworICAgICAgZF90cmFjZSAgICgiICAgd2FudCAiLCB3YW50KTsKKyAgICAgIGRfdHJhY2UgICAoIiAgIGdvdCAgIiwgZ290KTsKKyAgICAgIHByaW50ZiAgICAoIiAgIHdhbnQgZXhwICVsZFxuIiwgd2FudF9leHApOworICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorCisgIG1wel9jbGVhciAoeik7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19vbmViaXQgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGRhdGFbXSA9IHsKKyAgICAxLCAzMiwgNTIsIDUzLCA1NCwgNjMsIDY0LCA2NSwgMTI4LCAyNTYsIDUxMSwgNTEyLCA1MTMKKyAgfTsKKyAgbXB6X3QgICB6OworICBkb3VibGUgIGdvdCwgd2FudDsKKyAgbG9uZyAgICBnb3RfZXhwLCB3YW50X2V4cDsKKyAgaW50ICAgICBpOworCisgIG1wel9pbml0ICh6KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF91aSAoeiwgMUwpOworICAgICAgbXB6X211bF8yZXhwICh6LCB6LCBkYXRhW2ldKTsKKyAgICAgIHdhbnQgPSAwLjU7CisgICAgICB3YW50X2V4cCA9IGRhdGFbaV0gKyAxOworICAgICAgZ290ID0gbXB6X2dldF9kXzJleHAgKCZnb3RfZXhwLCB6KTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCB8fCBnb3RfZXhwICE9IHdhbnRfZXhwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kXzJleHAgd3Jvbmcgb24gMioqJWxkXG4iLCBkYXRhW2ldKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgICB6ICAgICIsIHopOworICAgICAgICAgIGRfdHJhY2UgICAoIiAgIHdhbnQgIiwgd2FudCk7CisgICAgICAgICAgZF90cmFjZSAgICgiICAgZ290ICAiLCBnb3QpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIHdhbnQgZXhwICVsZFxuIiwgd2FudF9leHApOworICAgICAgICAgIHByaW50ZiAgICAoIiAgIGdvdCBleHAgICVsZFxuIiwgZ290X2V4cCk7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICBtcHpfc2V0X3NpICh6LCAtMUwpOworICAgICAgbXB6X211bF8yZXhwICh6LCB6LCBkYXRhW2ldKTsKKyAgICAgIHdhbnQgPSAtMC41OworICAgICAgd2FudF9leHAgPSBkYXRhW2ldICsgMTsKKyAgICAgIGdvdCA9IG1wel9nZXRfZF8yZXhwICgmZ290X2V4cCwgeik7CisgICAgICBpZiAoZ290ICE9IHdhbnQgfHwgZ290X2V4cCAhPSB3YW50X2V4cCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAgICAoIm1wel9nZXRfZF8yZXhwIHdyb25nIG9uIC0yKiolbGRcbiIsIGRhdGFbaV0pOworICAgICAgICAgIG1wel90cmFjZSAoIiAgIHogICAgIiwgeik7CisgICAgICAgICAgZF90cmFjZSAgICgiICAgd2FudCAiLCB3YW50KTsKKyAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICIsIGdvdCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgd2FudCBleHAgJWxkXG4iLCB3YW50X2V4cCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfQorICBtcHpfY2xlYXIgKHopOworfQorCisvKiBDaGVjayB0aGF0IGhhcmR3YXJlIHJvdW5kaW5nIGRvZXNuJ3QgbWFrZSBtcHpfZ2V0X2RfMmV4cCByZXR1cm4gYSB2YWx1ZQorICAgb3V0c2lkZSBpdHMgZGVmaW5lZCByYW5nZS4gKi8KK3N0YXRpYyB2b2lkCitjaGVja19yb3VuZCAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgZGF0YVtdID0geyAxLCAzMiwgNTMsIDU0LCA2NCwgMTI4LCAyNTYsIDUxMiB9OworICBtcHpfdCAgIHo7CisgIGRvdWJsZSAgZ290OworICBsb25nICAgIGdvdF9leHA7CisgIGludCAgICAgaSwgcm5kX21vZGUsIG9sZF9ybmRfbW9kZTsKKworICBtcHpfaW5pdCAoeik7CisgIG9sZF9ybmRfbW9kZSA9IHRlc3RzX2hhcmR3YXJlX2dldHJvdW5kICgpOworCisgIGZvciAocm5kX21vZGUgPSAwOyBybmRfbW9kZSA8IDQ7IHJuZF9tb2RlKyspCisgICAgeworICAgICAgdGVzdHNfaGFyZHdhcmVfc2V0cm91bmQgKHJuZF9tb2RlKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgbXB6X3NldF91aSAoeiwgMUwpOworICAgICAgICAgIG1wel9tdWxfMmV4cCAoeiwgeiwgZGF0YVtpXSk7CisgICAgICAgICAgbXB6X3N1Yl91aSAoeiwgeiwgMUwpOworCisgICAgICAgICAgZ290ID0gbXB6X2dldF9kXzJleHAgKCZnb3RfZXhwLCB6KTsKKyAgICAgICAgICBpZiAoZ290IDwgMC41IHx8IGdvdCA+PSAxLjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIm1wel9nZXRfZF8yZXhwIHdyb25nIG9uIDIqKiVsdS0xXG4iLCBkYXRhW2ldKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgicmVzdWx0IG91dCBvZiByYW5nZSwgZXhwZWN0IDAuNSA8PSBnb3QgPCAxLjBcbiIpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICBybmRfbW9kZSA9ICVkXG4iLCBybmRfbW9kZSk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIGRhdGFbaV0gID0gJWx1XG4iLCBkYXRhW2ldKTsKKyAgICAgICAgICAgICAgbXB6X3RyYWNlICgiICAgeiAgICAiLCB6KTsKKyAgICAgICAgICAgICAgZF90cmFjZSAgICgiICAgZ290ICAiLCBnb3QpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgICBnb3QgZXhwICAlbGRcbiIsIGdvdF9leHApOworICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgbXB6X25lZyAoeiwgeik7CisgICAgICAgICAgZ290ID0gbXB6X2dldF9kXzJleHAgKCZnb3RfZXhwLCB6KTsKKyAgICAgICAgICBpZiAoZ290IDw9IC0xLjAgfHwgZ290ID4gLTAuNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kXzJleHAgd3Jvbmcgb24gLTIqKiVsdS0xXG4iLCBkYXRhW2ldKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgicmVzdWx0IG91dCBvZiByYW5nZSwgZXhwZWN0IC0xLjAgPCBnb3QgPD0gLTAuNVxuIik7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIHJuZF9tb2RlID0gJWRcbiIsIHJuZF9tb2RlKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICAgZGF0YVtpXSAgPSAlbHVcbiIsIGRhdGFbaV0pOworICAgICAgICAgICAgICBtcHpfdHJhY2UgKCIgICB6ICAgICIsIHopOworICAgICAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICIsIGdvdCk7CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgIGdvdCBleHAgICVsZFxuIiwgZ290X2V4cCk7CisgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbXB6X2NsZWFyICh6KTsKKyAgdGVzdHNfaGFyZHdhcmVfc2V0cm91bmQgKG9sZF9ybmRfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19yYW5kICh2b2lkKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBpbnQgICAgIGk7CisgIG1wel90ICAgejsKKyAgZG91YmxlICBnb3Q7CisgIGxvbmcgICAgZ290X2V4cDsKKyAgdW5zaWduZWQgbG9uZyAgYml0czsKKworICBtcHpfaW5pdCAoeik7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKQorICAgIHsKKyAgICAgIGJpdHMgPSBnbXBfdXJhbmRvbW1fdWkgKHJhbmRzLCA1MTJMKTsKKyAgICAgIG1wel91cmFuZG9tYiAoeiwgcmFuZHMsIGJpdHMpOworCisgICAgICBnb3QgPSBtcHpfZ2V0X2RfMmV4cCAoJmdvdF9leHAsIHopOworICAgICAgaWYgKG1wel9zZ24gKHopID09IDApCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYml0cyA9IG1wel9zaXplaW5iYXNlICh6LCAyKTsKKworICAgICAgaWYgKGdvdCA8IDAuNSB8fCBnb3QgPj0gMS4wKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kXzJleHAgb3V0IG9mIHJhbmdlLCBleHBlY3QgMC41IDw9IGdvdCA8IDEuMFxuIik7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgeiAgICAiLCB6KTsKKyAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICIsIGdvdCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisKKyAgICAgIC8qIEZJWE1FOiBJZiBtcHpfZ2V0X2RfMmV4cCByb3VuZHMgdXB3YXJkcyB3ZSBtaWdodCBoYXZlIGdvdF9leHAgPT0KKyAgICAgICAgIGJpdHMrMSwgc28gbGVhdmUgdGhpcyB0ZXN0IGRpc2FibGVkIHVudGlsIHdlIGRlY2lkZSBpZiB0aGF0J3Mgd2hhdAorICAgICAgICAgc2hvdWxkIGhhcHBlbiwgb3Igbm90LiAgKi8KKyNpZiAwCisgICAgICBpZiAoZ290X2V4cCAhPSBiaXRzKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXB6X2dldF9kXzJleHAgd3JvbmcgZXhwb25lbnRcbiIsIGkpOworICAgICAgICAgIG1wel90cmFjZSAoIiAgIHogICAgIiwgeik7CisgICAgICAgICAgZF90cmFjZSAgICgiICAgYml0cyAiLCBiaXRzKTsKKyAgICAgICAgICBkX3RyYWNlICAgKCIgICBnb3QgICIsIGdvdCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgZ290IGV4cCAgJWxkXG4iLCBnb3RfZXhwKTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgIG1wel9jbGVhciAoeik7Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja196ZXJvICgpOworICBjaGVja19vbmViaXQgKCk7CisgIGNoZWNrX3JvdW5kICgpOworICBjaGVja19yYW5kICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1nZXRfc2kuYyBiL3Rlc3RzL21wei90LWdldF9zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjEwNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1nZXRfc2kuYwpAQCAtMCwwICsxLDEyMSBAQAorLyogRXhlcmNpc2UgbXB6X2dldF9zaS4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqbjsKKyAgICBsb25nICAgICAgICB3YW50OworICB9IGRhdGFbXSA9IHsKKyAgICB7ICIwIiwgICAgICAwTCB9LAorICAgIHsgIjEiLCAgICAgIDFMIH0sCisgICAgeyAiLTEiLCAgICAgLTFMIH0sCisgICAgeyAiMiIsICAgICAgMkwgfSwKKyAgICB7ICItMiIsICAgICAtMkwgfSwKKyAgICB7ICIxMjM0NSIsICAxMjM0NUwgfSwKKyAgICB7ICItMTIzNDUiLCAtMTIzNDVMIH0sCisgIH07CisKKyAgaW50ICAgIGk7CisgIG1wel90ICBuOworICBsb25nICAgZ290OworCisgIG1wel9pbml0IChuKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0IChuLCBkYXRhW2ldLm4sIDApOworCisgICAgICBnb3QgPSBtcHpfZ2V0X3NpIChuKTsKKyAgICAgIGlmIChnb3QgIT0gZGF0YVtpXS53YW50KQorCXsKKwkgIHByaW50ZiAoIm1wel9nZXRfc2kgd3JvbmcgYXQgZGF0YVslZF1cbiIsIGkpOworCSAgcHJpbnRmICgiICAgbiAgICAgXCIlc1wiICgiLCBkYXRhW2ldLm4pOworCSAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIG4pOyBwcmludGYgKCIsIGhleCAiKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBuKTsgcHJpbnRmICgiKVxuIik7CisJICBwcmludGYgKCIgICBnb3QgICAlbGQgKDB4JWxYKVxuIiwgZ290LCBnb3QpOworCSAgcHJpbnRmICgiICAgd2FudCAgJWxkICgweCVsWClcbiIsIGRhdGFbaV0ud2FudCwgZGF0YVtpXS53YW50KTsKKwkgIGFib3J0KCk7CisJfQorICAgIH0KKyAgbXB6X2NsZWFyIChuKTsKK30KKworCit2b2lkCitjaGVja19tYXggKHZvaWQpCit7CisgIG1wel90ICBuOworICBsb25nICAgd2FudDsKKyAgbG9uZyAgIGdvdDsKKworICBtcHpfaW5pdCAobik7CisKKyNkZWZpbmUgQ0hFQ0tfTUFYKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZ290ICE9IHdhbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZiAoIm1wel9nZXRfc2kgd3Jvbmcgb24gJXNcbiIsIG5hbWUpOyAgICAgICAgXAorICAgICAgcHJpbnRmICgiICAgbiAgICAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgbik7IHByaW50ZiAoIiwgaGV4ICIpOyAgIFwKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDE2LCBuKTsgcHJpbnRmICgiXG4iKTsgICAgICAgXAorICAgICAgcHJpbnRmICgiICAgZ290ICAlbGQsIGhleCAlbFhcbiIsIGdvdCwgZ290KTsgICAgICBcCisgICAgICBwcmludGYgKCIgICB3YW50ICVsZCwgaGV4ICVsWFxuIiwgd2FudCwgd2FudCk7ICAgIFwKKyAgICAgIGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICB3YW50ID0gTE9OR19NQVg7CisgIG1wel9zZXRfc2kgKG4sIHdhbnQpOworICBnb3QgPSBtcHpfZ2V0X3NpIChuKTsKKyAgQ0hFQ0tfTUFYICgiTE9OR19NQVgiKTsKKworICB3YW50ID0gTE9OR19NSU47CisgIG1wel9zZXRfc2kgKG4sIHdhbnQpOworICBnb3QgPSBtcHpfZ2V0X3NpIChuKTsKKyAgQ0hFQ0tfTUFYICgiTE9OR19NSU4iKTsKKworICAvKiBUaGUgZm9sbG93aW5nIGNoZWNrcyB0aGF0IC0weDEwMDAwMDAwMCBnaXZlcyAtMHg4MDAwMDAwMC4gIFRoaXMgZG9lc24ndAorICAgICBhY3R1YWxseSBmaXQgaW4gYSBsb25nIGFuZCB0aGUgcmVzdWx0IGZyb20gbXB6X2dldF9zaSgpIGlzIHVuZGVmaW5lZCwKKyAgICAgYnV0IC0weDgwMDAwMDAwIGlzIHdoYXQgY29tZXMgb3V0IGN1cnJlbnRseSwgYW5kIGl0IHNob3VsZCBiZSB0aGF0CisgICAgIHZhbHVlIGlycmVzcGVjdGl2ZSBvZiB0aGUgbXBfbGltYl90IHNpemUgKGxvbmcgb3IgbG9uZyBsb25nKS4gICovCisKKyAgd2FudCA9IExPTkdfTUlOOworICBtcHpfbXVsXzJleHAgKG4sIG4sIDEpOworICBDSEVDS19NQVggKCItMHgxMDAuLi4wMCIpOworCisgIG1wel9jbGVhciAobik7Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworICBjaGVja19tYXggKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWhhbWRpc3QuYyBiL3Rlc3RzL21wei90LWhhbWRpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRhMDNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtaGFtZGlzdC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBUZXN0IG1wel9oYW1kaXN0LgorCitDb3B5cmlnaHQgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX3R3b2JpdHMgKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgIGksIGosIGdvdCwgd2FudDsKKyAgbXB6X3QgIHgsIHk7CisKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAoeSk7CisgIGZvciAoaSA9IDA7IGkgPCA1ICogR01QX05VTUJfQklUUzsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA1ICogR01QX05VTUJfQklUUzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgbXB6X3NldF91aSAoeCwgMEwpOworICAgICAgICAgIG1wel9zZXRiaXQgKHgsIGkpOworICAgICAgICAgIG1wel9zZXRfdWkgKHksIDBMKTsKKyAgICAgICAgICBtcHpfc2V0Yml0ICh5LCBqKTsKKworICAgICAgICAgIHdhbnQgPSAyICogKGkgIT0gaik7CisgICAgICAgICAgZ290ID0gbXB6X2hhbWRpc3QgKHgsIHkpOworICAgICAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgibXB6X2hhbWRpc3Qgd3Jvbmcgb24gMiBiaXRzIHBvcy9wb3NcbiIpOworICAgICAgICAgICAgd3Jvbmc6CisgICAgICAgICAgICAgIHByaW50ZiAgICAoIiAgaSAgICAlbHVcbiIsIGkpOworICAgICAgICAgICAgICBwcmludGYgICAgKCIgIGogICAgJWx1XG4iLCBqKTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICBnb3QgICVsdVxuIiwgZ290KTsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgiICB3YW50ICVsdVxuIiwgd2FudCk7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgeCAgICIsIHgpOworICAgICAgICAgICAgICBtcHpfdHJhY2UgKCIgIHkgICAiLCB5KTsKKyAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIG1wel9uZWcgKHgsIHgpOworICAgICAgICAgIG1wel9uZWcgKHksIHkpOworICAgICAgICAgIHdhbnQgPSBBQlMgKChsb25nKSAoaS1qKSk7CisgICAgICAgICAgZ290ID0gbXB6X2hhbWRpc3QgKHgsIHkpOworICAgICAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICAgICgibXB6X2hhbWRpc3Qgd3Jvbmcgb24gMiBiaXRzIG5lZy9uZWdcbiIpOworICAgICAgICAgICAgICBnb3RvIHdyb25nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoeSk7Cit9CisKKwordm9pZAorY2hlY2tfcmFuZCAodm9pZCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgIHJhbmRzID0gUkFORFM7CisgIHVuc2lnbmVkIGxvbmcgIGdvdCwgd2FudDsKKyAgaW50ICAgIGk7CisgIG1wel90ICB4LCB5OworCisgIG1wel9pbml0ICh4KTsKKyAgbXB6X2luaXQgKHkpOworCisgIGZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspCisgICAgeworICAgICAgbXB6X2VyYW5kb21iICh4LCByYW5kcywgNiAqIEdNUF9OVU1CX0JJVFMpOworICAgICAgbXB6X25lZ3JhbmRvbSAoeCwgcmFuZHMpOworICAgICAgbXB6X211bF8yZXhwICh4LCB4LCB1cmFuZG9tKCkgJSAoNCAqIEdNUF9OVU1CX0JJVFMpKTsKKworICAgICAgbXB6X2VyYW5kb21iICh5LCByYW5kcywgNiAqIEdNUF9OVU1CX0JJVFMpOworICAgICAgbXB6X25lZ3JhbmRvbSAoeSwgcmFuZHMpOworICAgICAgbXB6X211bF8yZXhwICh5LCB5LCB1cmFuZG9tKCkgJSAoNCAqIEdNUF9OVU1CX0JJVFMpKTsKKworICAgICAgd2FudCA9IHJlZm1wel9oYW1kaXN0ICh4LCB5KTsKKyAgICAgIGdvdCA9IG1wel9oYW1kaXN0ICh4LCB5KTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAgICAoIm1wel9oYW1kaXN0IHdyb25nIG9uIHJhbmRvbVxuIik7CisgICAgICAgICAgcHJpbnRmICAgICgiICBnb3QgICVsdVxuIiwgZ290KTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIHdhbnQgJWx1XG4iLCB3YW50KTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgIHggICAiLCB4KTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgIHkgICAiLCB5KTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfQorICBtcHpfY2xlYXIgKHgpOworICBtcHpfY2xlYXIgKHkpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIGNoZWNrX3R3b2JpdHMgKCk7CisgIGNoZWNrX3JhbmQgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWltcG9ydC5jIGIvdGVzdHMvbXB6L3QtaW1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5NTMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWltcG9ydC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiBUZXN0IG1wel9pbXBvcnQuCisKK0NvcHlyaWdodCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorY2hlY2tfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisgICAgc2l6ZV90ICAgICAgY291bnQ7CisgICAgaW50ICAgICAgICAgb3JkZXI7CisgICAgc2l6ZV90ICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICAgICBlbmRpYW47CisgICAgaW50ICAgICAgICAgbmFpbDsKKyAgICBjaGFyICAgICAgICBzcmNbNjRdOworCisgIH0gZGF0YVtdID0geworCisgICAgeyAiMCIsIDAsMSwgMSwxLCAwIH0sCisgICAgeyAiMCIsIDEsMSwgMCwxLCAwIH0sCisKKyAgICB7ICIweDEyMzQ1Njc4IiwgNCwxLCAgMSwxLCAwLCB7ICdcMjInLCAnXDY0JywgJ1wxMjYnLCAnXDE3MCcgfSB9LAorICAgIHsgIjB4MTIzNDU2NzgiLCAxLDEsICA0LDEsIDAsIHsgJ1wyMicsICdcNjQnLCAnXDEyNicsICdcMTcwJyB9IH0sCisgICAgeyAiMHgxMjM0NTY3OCIsIDEsLTEsIDQsMSwgMCwgeyAnXDIyJywgJ1w2NCcsICdcMTI2JywgJ1wxNzAnIH0gfSwKKworICAgIHsgIjB4MTIzNDU2NzgiLCA0LC0xLCAxLC0xLCAwLCB7ICdcMTcwJywgJ1wxMjYnLCAnXDA2NCcsICdcMjInIH0gfSwKKyAgICB7ICIweDEyMzQ1Njc4IiwgMSwxLCAgNCwtMSwgMCwgeyAnXDE3MCcsICdcMTI2JywgJ1wwNjQnLCAnXDIyJyB9IH0sCisgICAgeyAiMHgxMjM0NTY3OCIsIDEsLTEsIDQsLTEsIDAsIHsgJ1wxNzAnLCAnXDEyNicsICdcMDY0JywgJ1wyMicgfSB9LAorCisgICAgeyAiMCIsICAgIDUsMSwgIDEsMSwgNywgeyAnXDM3NicsICdcMzc2JywgJ1wzNzYnLCAnXDM3NicsICdcMzc2JyB9IH0sCisgICAgeyAiMCIsICAgIDUsLTEsIDEsMSwgNywgeyAnXDM3NicsICdcMzc2JywgJ1wzNzYnLCAnXDM3NicsICdcMzc2JyB9IH0sCisgICAgeyAiMHgxNSIsIDUsMSwgIDEsMSwgNywgeyAnXDM3NycsICdcMzc2JywgJ1wzNzcnLCAnXDM3NicsICdcMzc3JyB9IH0sCisKKyAgICB7ICIwIiwgICAgMywxLCAgMiwxLCAgIDEsIHsgJ1wyMDAnLCdcMDAwJywgJ1wyMDAnLCdcMDAwJywgJ1wyMDAnLCdcMDAwJyB9fSwKKyAgICB7ICIwIiwgICAgMywxLCAgMiwtMSwgIDEsIHsgJ1wwMDAnLCdcMjAwJywgJ1wwMDAnLCdcMjAwJywgJ1wwMDAnLCdcMjAwJyB9fSwKKyAgICB7ICIwIiwgICAgMywxLCAgMiwxLCAgMTUsIHsgJ1wzNzcnLCdcMzc2JywgJ1wzNzcnLCdcMzc2JywgJ1wzNzcnLCdcMzc2JyB9fSwKKworICAgIHsgIjB4MkEiLCAzLDEsICAyLDEsIDE0LCB7ICdcMzc3JywnXDM3NicsICdcMzc3JywnXDM3NicsICdcMzc3JywnXDM3NicgfSB9LAorICAgIHsgIjB4MDYiLCAzLDEsICAyLDEsIDE0LCB7ICdcMzc3JywnXDM3NCcsICdcMzc3JywnXDM3NScsICdcMzc3JywnXDM3NicgfSB9LAorICAgIHsgIjB4MjQiLCAzLC0xLCAyLDEsIDE0LCB7ICdcMzc3JywnXDM3NCcsICdcMzc3JywnXDM3NScsICdcMzc3JywnXDM3NicgfSB9LAorCisgICAgeyAiMHgxMjM0NTY3ODlBQkMiLCAzLDEsICAyLDEsICAwLCB7CisgICAgICAgICdcMDIyJywnXDA2NCcsICdcMTI2JywnXDE3MCcsICdcMjMyJywnXDI3NCcgfSB9LAorICAgIHsgIjB4MTIzNDU2Nzg5QUJDIiwgMywtMSwgMiwxLCAgMCwgeworICAgICAgICAnXDIzMicsJ1wyNzQnLCAnXDEyNicsJ1wxNzAnLCAnXDAyMicsJ1wwNjQnIH0gfSwKKyAgICB7ICIweDEyMzQ1Njc4OUFCQyIsIDMsMSwgIDIsLTEsIDAsIHsKKyAgICAgICAgJ1wwNjQnLCdcMDIyJywgJ1wxNzAnLCdcMTI2JywgJ1wyNzQnLCdcMjMyJyB9IH0sCisgICAgeyAiMHgxMjM0NTY3ODlBQkMiLCAzLC0xLCAyLC0xLCAwLCB7CisgICAgICAgICdcMjc0JywnXDIzMicsICdcMTcwJywnXDEyNicsICdcMDY0JywnXDAyMicgfSB9LAorCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLDEsICA0LDEsICAwLAorICAgICAgeyAnXDAyMScsJ1wwNDInLCdcMDYzJywnXDEwNCcsCisgICAgICAgICdcMTI1JywnXDE0NicsJ1wxNjcnLCdcMjEwJywKKyAgICAgICAgJ1wyMzEnLCdcMjUyJywnXDI3MycsJ1wzMTQnIH0gfSwKKyAgICB7ICIweDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQyIsIDMsLTEsIDQsMSwgIDAsCisgICAgICB7ICdcMjMxJywnXDI1MicsJ1wyNzMnLCdcMzE0JywKKyAgICAgICAgJ1wxMjUnLCdcMTQ2JywnXDE2NycsJ1wyMTAnLAorICAgICAgICAnXDAyMScsJ1wwNDInLCdcMDYzJywnXDEwNCcgfSB9LAorICAgIHsgIjB4MTEyMjMzNDQ1NTY2Nzc4ODk5QUFCQkNDIiwgMywxLCAgNCwtMSwgMCwKKyAgICAgIHsgJ1wxMDQnLCdcMDYzJywnXDA0MicsJ1wwMjEnLAorICAgICAgICAnXDIxMCcsJ1wxNjcnLCdcMTQ2JywnXDEyNScsCisgICAgICAgICdcMzE0JywnXDI3MycsJ1wyNTInLCdcMjMxJyB9IH0sCisgICAgeyAiMHgxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0MiLCAzLC0xLCA0LC0xLCAwLAorICAgICAgeyAnXDMxNCcsJ1wyNzMnLCdcMjUyJywnXDIzMScsCisgICAgICAgICdcMjEwJywnXDE2NycsJ1wxNDYnLCdcMTI1JywKKyAgICAgICAgJ1wxMDQnLCdcMDYzJywnXDA0MicsJ1wwMjEnIH0gfSwKKworICAgIHsgIjB4MTAwMTIwMDIzMDAzNDAwNDUwMDU2MDA2NzAwNzgwMDg5MDA5QTAwQUIwMEJDMDBDIiwgMywxLCAgOCwxLCAgMCwKKyAgICAgIHsgJ1wwMjAnLCdcMDAxJywnXDA0MCcsJ1wwMDInLCdcMDYwJywnXDAwMycsJ1wxMDAnLCdcMDA0JywKKyAgICAgICAgJ1wxMjAnLCdcMDA1JywnXDE0MCcsJ1wwMDYnLCdcMTYwJywnXDAwNycsJ1wyMDAnLCdcMDEwJywKKyAgICAgICAgJ1wyMjAnLCdcMDExJywnXDI0MCcsJ1wwMTInLCdcMjYwJywnXDAxMycsJ1wzMDAnLCdcMDE0JyB9IH0sCisgICAgeyAiMHgxMDAxMjAwMjMwMDM0MDA0NTAwNTYwMDY3MDA3ODAwODkwMDlBMDBBQjAwQkMwMEMiLCAzLC0xLCA4LDEsICAwLAorICAgICAgeyAnXDIyMCcsJ1wwMTEnLCdcMjQwJywnXDAxMicsJ1wyNjAnLCdcMDEzJywnXDMwMCcsJ1wwMTQnLAorICAgICAgICAnXDEyMCcsJ1wwMDUnLCdcMTQwJywnXDAwNicsJ1wxNjAnLCdcMDA3JywnXDIwMCcsJ1wwMTAnLAorICAgICAgICAnXDAyMCcsJ1wwMDEnLCdcMDQwJywnXDAwMicsJ1wwNjAnLCdcMDAzJywnXDEwMCcsJ1wwMDQnIH0gfSwKKyAgICB7ICIweDEwMDEyMDAyMzAwMzQwMDQ1MDA1NjAwNjcwMDc4MDA4OTAwOUEwMEFCMDBCQzAwQyIsIDMsMSwgIDgsLTEsIDAsCisgICAgICB7ICdcMDA0JywnXDEwMCcsJ1wwMDMnLCdcMDYwJywnXDAwMicsJ1wwNDAnLCdcMDAxJywnXDAyMCcsCisgICAgICAgICdcMDEwJywnXDIwMCcsJ1wwMDcnLCdcMTYwJywnXDAwNicsJ1wxNDAnLCdcMDA1JywnXDEyMCcsCisgICAgICAgICdcMDE0JywnXDMwMCcsJ1wwMTMnLCdcMjYwJywnXDAxMicsJ1wyNDAnLCdcMDExJywnXDIyMCcgfSB9LAorICAgIHsgIjB4MTAwMTIwMDIzMDAzNDAwNDUwMDU2MDA2NzAwNzgwMDg5MDA5QTAwQUIwMEJDMDBDIiwgMywtMSwgOCwtMSwgMCwKKyAgICAgIHsgJ1wwMTQnLCdcMzAwJywnXDAxMycsJ1wyNjAnLCdcMDEyJywnXDI0MCcsJ1wwMTEnLCdcMjIwJywKKyAgICAgICAgJ1wwMTAnLCdcMjAwJywnXDAwNycsJ1wxNjAnLCdcMDA2JywnXDE0MCcsJ1wwMDUnLCdcMTIwJywKKyAgICAgICAgJ1wwMDQnLCdcMTAwJywnXDAwMycsJ1wwNjAnLCdcMDAyJywnXDA0MCcsJ1wwMDEnLCdcMDIwJyB9IH0sCisKKyAgICB7ICIweDE1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NSIsIDMsMSwgIDQsMSwgIDEsCisgICAgICB7ICdcMzI1JywnXDEyNScsJ1wxMjUnLCdcMTI1JywKKyAgICAgICAgJ1wyNTInLCdcMjUyJywnXDI1MicsJ1wyNTInLAorICAgICAgICAnXDMyNScsJ1wxMjUnLCdcMTI1JywnXDEyNScgfSB9LAorICAgIHsgIjB4MTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1IiwgMywtMSwgIDQsMSwgIDEsCisgICAgICB7ICdcMzI1JywnXDEyNScsJ1wxMjUnLCdcMTI1JywKKyAgICAgICAgJ1wyNTInLCdcMjUyJywnXDI1MicsJ1wyNTInLAorICAgICAgICAnXDMyNScsJ1wxMjUnLCdcMTI1JywnXDEyNScgfSB9LAorICAgIHsgIjB4MTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1IiwgMywxLCAgNCwtMSwgIDEsCisgICAgICB7ICdcMTI1JywnXDEyNScsJ1wxMjUnLCdcMzI1JywKKyAgICAgICAgJ1wyNTInLCdcMjUyJywnXDI1MicsJ1wyNTInLAorICAgICAgICAnXDEyNScsJ1wxMjUnLCdcMTI1JywnXDMyNScgfSB9LAorICAgIHsgIjB4MTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1IiwgMywtMSwgIDQsLTEsICAxLAorICAgICAgeyAnXDEyNScsJ1wxMjUnLCdcMTI1JywnXDMyNScsCisgICAgICAgICdcMjUyJywnXDI1MicsJ1wyNTInLCdcMjUyJywKKyAgICAgICAgJ1wxMjUnLCdcMTI1JywnXDEyNScsJ1wzMjUnIH0gfSwKKyAgfTsKKworICBjaGFyICAgIGJ1ZltzaXplb2YoZGF0YVswXS5zcmMpICsgc2l6ZW9mIChtcF9saW1iX3QpXTsKKyAgY2hhciAgICAqc3JjOworICBzaXplX3QgIGFsaWduOworICBpbnQgICAgIGk7CisgIG1wel90ICAgZ290LCB3YW50OworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAoYWxpZ24gPSAwOyBhbGlnbiA8IHNpemVvZiAobXBfbGltYl90KTsgYWxpZ24rKykKKyAgICAgICAgeworICAgICAgICAgIG1wel9zZXRfc3RyX29yX2Fib3J0ICh3YW50LCBkYXRhW2ldLndhbnQsIDApOworICAgICAgICAgIHNyYyA9IGJ1ZiArIGFsaWduOworICAgICAgICAgIG1lbWNweSAoc3JjLCBkYXRhW2ldLnNyYywgZGF0YVtpXS5jb3VudCAqIGRhdGFbaV0uc2l6ZSk7CisKKyAgICAgICAgICBtcHpfc2V0X3VpIChnb3QsIDBMKTsKKyAgICAgICAgICBtcHpfaW1wb3J0IChnb3QsIGRhdGFbaV0uY291bnQsIGRhdGFbaV0ub3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5zaXplLCBkYXRhW2ldLmVuZGlhbiwgZGF0YVtpXS5uYWlsLCBzcmMpOworCisgICAgICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKyAgICAgICAgICBpZiAobXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJ3cm9uZyBhdCBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgICBjb3VudD0lbHUgb3JkZXI9JWQgIHNpemU9JWx1IGVuZGlhbj0lZCBuYWlsPSV1ICBhbGlnbj0lbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRhdGFbaV0uY291bnQsIGRhdGFbaV0ub3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRhdGFbaV0uc2l6ZSwgZGF0YVtpXS5lbmRpYW4sIGRhdGFbaV0ubmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWxpZ24pOworICAgICAgICAgICAgICBtcHpfdHJhY2UgKCIgICAgZ290ICIsIGdvdCk7CisgICAgICAgICAgICAgIG1wel90cmFjZSAoIiAgICB3YW50Iiwgd2FudCk7CisgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBtcHpfY2xlYXIgKGdvdCk7CisgIG1wel9jbGVhciAod2FudCk7Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBtcF90cmFjZV9iYXNlID0gLTE2OworICBjaGVja19kYXRhICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1pbnBfc3RyLmMgYi90ZXN0cy9tcHovdC1pbnBfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxYzBjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWlucF9zdHIuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogVGVzdCBtcHpfaW5wX3N0ci4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJLyogZm9yIHVubGluayAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2RlZmluZSBGSUxFTkFNRSAgIi90bXAvdC1pbnBfc3RyLnRtcCIKKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAqaW5wOworICAgIGludCAgICAgICAgIGJhc2U7CisgICAgY29uc3QgY2hhciAgKndhbnQ7CisgICAgaW50ICAgICAgICAgd2FudF9ucmVhZDsKKworICB9IGRhdGFbXSA9IHsKKworICAgIHsgIjAiLCAgIDEwLCAiMCIsIDEgfSwKKworICAgIHsgImFiYyIsIDEwLCAiMCIsIDAgfSwKKyAgICB7ICIweGYiLCAxMCwgIjAiLCAxIH0sCisgICAgeyAiZ2hpIiwgMTYsICIwIiwgMCB9LAorICAgIHsgIjEwMCIsIDkwLCAiMCIsIDAgfSwKKworICAgIHsgICJmZiIsIDE2LCAgIjI1NSIsIDIgfSwKKyAgICB7ICItZmYiLCAxNiwgIi0yNTUiLCAzIH0sCisgICAgeyAgIkZGIiwgMTYsICAiMjU1IiwgMiB9LAorICAgIHsgIi1GRiIsIDE2LCAiLTI1NSIsIDMgfSwKKworICAgIHsgICJ6IiwgMzYsICIzNSIsIDEgfSwKKyAgICB7ICAiWiIsIDM2LCAiMzUiLCAxIH0sCisgICAgeyAiMUIiLCA1OSwgIjcwIiwgMiB9LAorICAgIHsgICJhIiwgNjAsICIzNiIsIDEgfSwKKyAgICB7ICAiQSIsIDYxLCAiMTAiLCAxIH0sCisKKyAgICB7ICAiMHgwIiwgICAgMCwgICAiMCIsIDMgfSwKKyAgICB7ICAiMFgxMCIsICAgMCwgICIxNiIsIDQgfSwKKyAgICB7ICItMFgwIiwgICAgMCwgICAiMCIsIDQgfSwKKyAgICB7ICItMHgxMCIsICAgMCwgIi0xNiIsIDUgfSwKKworICAgIHsgICIwYjAiLCAgICAwLCAgIjAiLCAzIH0sCisgICAgeyAgIjBCMTAiLCAgIDAsICAiMiIsIDQgfSwKKyAgICB7ICItMEIwIiwgICAgMCwgICIwIiwgNCB9LAorICAgIHsgIi0wYjEwIiwgICAwLCAiLTIiLCA1IH0sCisKKyAgICB7ICAiMDAiLCAgIDAsICAiMCIsIDIgfSwKKyAgICB7ICAiMDEwIiwgIDAsICAiOCIsIDMgfSwKKyAgICB7ICItMDAiLCAgIDAsICAiMCIsIDMgfSwKKyAgICB7ICItMDEwIiwgIDAsICItOCIsIDQgfSwKKworICAgIHsgICIweCIsICAgICAwLCAgICIwIiwgMiB9LAorICAgIHsgICIwIiwgICAgICAwLCAgICIwIiwgMSB9LAorICAgIHsgIiAwMzAiLCAgIDEwLCAgIjMwIiwgNCB9LAorICB9OworCisgIG1wel90ICBnb3QsIHdhbnQ7CisgIGxvbmcgICBmdGVsbF9ucmVhZDsKKyAgaW50ICAgIGksIHByZSwgcG9zdCwgaiwgZ290X25yZWFkLCB3YW50X25yZWFkOworICBGSUxFICAgKmZwOworCisgIG1wel9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIGZvciAocHJlID0gMDsgcHJlIDw9IDM7IHByZSsrKQorCXsKKwkgIGZvciAocG9zdCA9IDA7IHBvc3QgPD0gMjsgcG9zdCsrKQorCSAgICB7CisJICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKHdhbnQsIGRhdGFbaV0ud2FudCwgMCk7CisJICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAod2FudCk7CisKKwkgICAgICAvKiBjcmVhdGUgdGhlIGZpbGUgbmV3IGVhY2ggdGltZSB0byBlbnN1cmUgaXRzIGxlbmd0aCBpcyB3aGF0CisJCSB3ZSB3YW50ICovCisJICAgICAgZnAgPSBmb3BlbiAoRklMRU5BTUUsICJ3KyIpOworCSAgICAgIEFTU0VSVF9BTFdBWVMgKGZwICE9IE5VTEwpOworCSAgICAgIGZvciAoaiA9IDA7IGogPCBwcmU7IGorKykKKwkJcHV0YyAoJyAnLCBmcCk7CisJICAgICAgZnB1dHMgKGRhdGFbaV0uaW5wLCBmcCk7CisJICAgICAgZm9yIChqID0gMDsgaiA8IHBvc3Q7IGorKykKKwkJcHV0YyAoJyAnLCBmcCk7CisJICAgICAgZmZsdXNoIChmcCk7CisJICAgICAgQVNTRVJUX0FMV0FZUyAoISBmZXJyb3IoZnApKTsKKworCSAgICAgIHJld2luZCAoZnApOworCSAgICAgIGdvdF9ucmVhZCA9IG1wel9pbnBfc3RyIChnb3QsIGZwLCBkYXRhW2ldLmJhc2UpOworCisJICAgICAgaWYgKGdvdF9ucmVhZCAhPSAwKQorCQl7CisJCSAgZnRlbGxfbnJlYWQgPSBmdGVsbCAoZnApOworCQkgIGlmIChnb3RfbnJlYWQgIT0gZnRlbGxfbnJlYWQpCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIm1wel9pbnBfc3RyIG5yZWFkIHdyb25nXG4iKTsKKwkJICAgICAgcHJpbnRmICgiICBpbnAgICAgICAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisJCSAgICAgIHByaW50ZiAoIiAgYmFzZSAgICAgICAgICVkXG4iLCBkYXRhW2ldLmJhc2UpOworCQkgICAgICBwcmludGYgKCIgIHByZSAgICAgICAgICAlZFxuIiwgcHJlKTsKKwkJICAgICAgcHJpbnRmICgiICBwb3N0ICAgICAgICAgJWRcbiIsIHBvc3QpOworCQkgICAgICBwcmludGYgKCIgIGdvdF9ucmVhZCAgICAlZFxuIiwgZ290X25yZWFkKTsKKwkJICAgICAgcHJpbnRmICgiICBmdGVsbF9ucmVhZCAgJWxkXG4iLCBmdGVsbF9ucmVhZCk7CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCQl9CisKKwkgICAgICAvKiBpZiBkYXRhW2ldLmlucCBpcyBhIHdob2xlIHN0cmluZyB0byByZWFkIGFuZCB0aGVyZSdzIG5vIHBvc3QKKwkJIHdoaXRlc3BhY2UgdGhlbiBleHBlY3QgdG8gaGF2ZSBFT0YgKi8KKwkgICAgICBpZiAocG9zdCA9PSAwICYmIGRhdGFbaV0ud2FudF9ucmVhZCA9PSBzdHJsZW4oZGF0YVtpXS5pbnApKQorCQl7CisJCSAgaW50ICBjID0gZ2V0YyhmcCk7CisJCSAgaWYgKGMgIT0gRU9GKQorCQkgICAgeworCQkgICAgICBwcmludGYgKCJtcHpfaW5wX3N0ciBkaWRuJ3QgcmVhZCB0byBFT0ZcbiIpOworCQkgICAgICBwcmludGYgKCIgIGlucCAgIFwiJXNcIlxuIiwgZGF0YVtpXS5pbnApOworCQkgICAgICBwcmludGYgKCIgIGJhc2UgICVkXG4iLCBkYXRhW2ldLmJhc2UpOworCQkgICAgICBwcmludGYgKCIgIHByZSAgICVkXG4iLCBwcmUpOworCQkgICAgICBwcmludGYgKCIgIHBvc3QgICVkXG4iLCBwb3N0KTsKKwkJICAgICAgcHJpbnRmICgiICBjICAgICAnJWMnICUjeFxuIiwgYywgYyk7CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCQl9CisKKwkgICAgICAvKiBvbmx5IGV4cGVjdCAicHJlIiBpbmNsdWRlZCBpbiB0aGUgY291bnQgd2hlbiBub24temVybyAqLworCSAgICAgIHdhbnRfbnJlYWQgPSBkYXRhW2ldLndhbnRfbnJlYWQ7CisJICAgICAgaWYgKHdhbnRfbnJlYWQgIT0gMCkKKwkJd2FudF9ucmVhZCArPSBwcmU7CisKKwkgICAgICBpZiAoZ290X25yZWFkICE9IHdhbnRfbnJlYWQpCisJCXsKKwkJICBwcmludGYgKCJtcHpfaW5wX3N0ciBucmVhZCB3cm9uZ1xuIik7CisJCSAgcHJpbnRmICgiICBpbnAgICAgICAgICBcIiVzXCJcbiIsIGRhdGFbaV0uaW5wKTsKKwkJICBwcmludGYgKCIgIGJhc2UgICAgICAgICVkXG4iLCBkYXRhW2ldLmJhc2UpOworCQkgIHByaW50ZiAoIiAgcHJlICAgICAgICAgJWRcbiIsIHByZSk7CisJCSAgcHJpbnRmICgiICBwb3N0ICAgICAgICAlZFxuIiwgcG9zdCk7CisJCSAgcHJpbnRmICgiICBnb3RfbnJlYWQgICAlZFxuIiwgZ290X25yZWFkKTsKKwkJICBwcmludGYgKCIgIHdhbnRfbnJlYWQgICVkXG4iLCB3YW50X25yZWFkKTsKKwkJICBhYm9ydCAoKTsKKwkJfQorCisJICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworCSAgICAgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisJCXsKKwkJICBwcmludGYgKCJtcHpfaW5wX3N0ciB3cm9uZyByZXN1bHRcbiIpOworCQkgIHByaW50ZiAoIiAgaW5wICAgXCIlc1wiXG4iLCBkYXRhW2ldLmlucCk7CisJCSAgcHJpbnRmICgiICBiYXNlICAlZFxuIiwgZGF0YVtpXS5iYXNlKTsKKwkJICBtcHpfdHJhY2UgKCIgIGdvdCAiLCAgZ290KTsKKwkJICBtcHpfdHJhY2UgKCIgIHdhbnQiLCB3YW50KTsKKwkJICBhYm9ydCAoKTsKKwkJfQorCisJICAgICAgQVNTRVJUX0FMV0FZUyAoZmNsb3NlIChmcCkgPT0gMCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoZ290KTsKKyAgbXB6X2NsZWFyICh3YW50KTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHVubGluayAoRklMRU5BTUUpOworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtaW52ZXJ0LmMgYi90ZXN0cy9tcHovdC1pbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgxYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtaW52ZXJ0LmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIFRlc3QgbXB6X2ludmVydC4KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcsIDIwMDAtMjAwNSwgMjAwOCwgMjAwOSwgMjAxMiwgMjAxNCBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgYSwgbSwgYWludiwgdDsKKyAgaW50IHRlc3QsIHI7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisgIGludCByZXBzID0gMTAwMDsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChtKTsKKyAgbXB6X2luaXQgKGFpbnYpOworICBtcHpfaW5pdCAodCk7CisKKyAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IHJlcHM7IHRlc3QrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDE2ICsgMjsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgbXB6X3JyYW5kb21iIChhLCByYW5kcywgbXB6X2dldF91aSAoYnMpKTsKKyAgICAgIGRvIHsKKwltcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJbXB6X3JyYW5kb21iIChtLCByYW5kcywgbXB6X2dldF91aSAoYnMpKTsKKyAgICAgIH0gd2hpbGUgKG1wel9zZ24gKG0pID09IDApOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgOCk7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChhLCBhKTsKKyAgICAgIGlmICgoYnNpICYgMikgIT0gMCkKKwltcHpfbmVnIChtLCBtKTsKKworICAgICAgciA9IG1wel9pbnZlcnQgKGFpbnYsIGEsIG0pOworICAgICAgaWYgKHIgIT0gMCkKKwl7CisJICBNUFpfQ0hFQ0tfRk9STUFUIChhaW52KTsKKworCSAgaWYgKG1wel9jbXBfdWkgKGFpbnYsIDApIDwgMCB8fCBtcHpfY21wYWJzIChhaW52LCBtKSA+PSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgdGVzdCk7CisJICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIkludmVyc2Ugb3V0IG9mIHJhbmdlLlxuIik7CisJICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgImEgPSAlWnhcbiIsIGEpOworCSAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICIxL2EgPSAlWnhcbiIsIGFpbnYpOworCSAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJtID0gJVp4XG4iLCBtKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBtcHpfbXVsICh0LCBhaW52LCBhKTsKKwkgIG1wel9tb2QgKHQsIHQsIG0pOworCisJICBpZiAobXB6X2NtcF91aSAodCwgbXB6X2NtcGFic191aSAobSwgMSkgIT0gMCkgIT0gMCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SIGluIHRlc3QgJWRcbiIsIHRlc3QpOworCSAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJhXigtMSkqYSAhPSAxIChtb2QgbSlcbiIpOworCSAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJhID0gJVp4XG4iLCBhKTsKKwkgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAibSA9ICVaeFxuIiwgbSk7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIC8qIEludmVyc2UgZGVvcyBub3QgZXhpc3QgKi8KKwl7CisJICBtcHpfZ2NkICh0LCBhLCBtKTsKKwkgIGlmIChtcHpfY21wX3VpICh0LCAxKSA9PSAwKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1IgaW4gdGVzdCAlZFxuIiwgdGVzdCk7CisJICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIkludmVyc2UgZXhpc3RzLCBidXQgd2FzIG5vdCBmb3VuZC5cbiIpOworCSAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJhID0gJVp4XG4iLCBhKTsKKwkgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAibSA9ICVaeFxuIiwgbSk7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKG0pOworICBtcHpfY2xlYXIgKGFpbnYpOworICBtcHpfY2xlYXIgKHQpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1pb19yYXcuYyBiL3Rlc3RzL21wei90LWlvX3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDBiNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1pb19yYXcuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogVGVzdCBtcHpfaW5wX3JhdyBhbmQgbXB6X291dF9yYXcuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjZGVmaW5lIEZJTEVOQU1FICAiL3RtcC90LWlvX3Jhdy50bXAiCisKKworLyogSW4gdGhlIGZvcGVuLCAiYiIgc2VsZWN0cyBiaW5hcnkgbW9kZSBvbiBET1Mgc3lzdGVtcywgbWVhbmluZyBubworICAgY29udmVyc2lvbiBvZiAnXG4nIHRvIGFuZCBmcm9tIENSTEYuICBJdCdzIGJlbGlldmVkIHN5c3RlbXMgd2l0aG91dCBzdWNoCisgICBub25zZW5zZSB3aWxsIHNpbXBseSBpZ25vcmUgdGhlICJiIiwgYnV0IGluIGNhc2UgdGhhdCdzIG5vdCBzbyBhIHBsYWluCisgICAidysiIGlzIGF0dGVtcHRlZCBpZiAidytiIiBmYWlscy4gICovCisKK0ZJTEUgKgorZm9wZW5fd3BsdXNiX29yX2RpZSAoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIEZJTEUgICpmcDsKKyAgZnAgPSBmb3BlbiAoZmlsZW5hbWUsICJ3K2IiKTsKKyAgaWYgKGZwID09IE5VTEwpCisgICAgZnAgPSBmb3BlbiAoZmlsZW5hbWUsICJ3KyIpOworCisgIGlmIChmcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIkNhbm5vdCBjcmVhdGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICByZXR1cm4gZnA7Cit9CisKKy8qIHVzZSAweDgwIHRvIGNoZWNrIG5vdGhpbmcgYmFkIGhhcHBlbnMgd2l0aCBzaWduIGV4dGVuc2lvbiBldGMgKi8KKyNkZWZpbmUgQllURVZBTChpKSAgKCgoaSkgKyAxKSB8IDB4ODApCisKK3ZvaWQKK2NoZWNrX2luICh2b2lkKQoreworICBpbnQgICAgICAgIGksIGosIHplcm9zLCBuZWcsIGVycm9yID0gMDsKKyAgbXB6X3QgICAgICB3YW50LCBnb3Q7CisgIHNpemVfdCAgICAgd2FudF9yZXQsIGdvdF9yZXQ7CisgIG1wX3NpemVfdCAgc2l6ZTsKKyAgRklMRSAgICAgICAqZnA7CisKKyAgbXB6X2luaXQgKHdhbnQpOworICBtcHpfaW5pdCAoZ290KTsKKworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICB7CisgICAgICBmb3IgKHplcm9zID0gMDsgemVyb3MgPCA4OyB6ZXJvcysrKQorCXsKKwkgIGZvciAobmVnID0gMDsgbmVnIDw9IDE7IG5lZysrKQorCSAgICB7CisJICAgICAgd2FudF9yZXQgPSBpICsgemVyb3MgKyA0OworCisJICAgICAgLyogbmVlZCB0aGlzIHRvIGdldCB0aGUgdHdvcyBjb21wbGVtZW50IHJpZ2h0ICovCisJICAgICAgQVNTRVJUX0FMV0FZUyAoc2l6ZW9mIChzaXplKSA+PSA0KTsKKworCSAgICAgIHNpemUgPSBpICsgemVyb3M7CisJICAgICAgaWYgKG5lZykKKwkJc2l6ZSA9IC1zaXplOworCisJICAgICAgZnAgPSBmb3Blbl93cGx1c2Jfb3JfZGllIChGSUxFTkFNRSk7CisJICAgICAgZm9yIChqID0gMzsgaiA+PSAwOyBqLS0pCisJCUFTU0VSVF9BTFdBWVMgKHB1dGMgKChzaXplID4+IChqKjgpKSAmIDB4RkYsIGZwKSAhPSBFT0YpOworCSAgICAgIGZvciAoaiA9IDA7IGogPCB6ZXJvczsgaisrKQorCQlBU1NFUlRfQUxXQVlTIChwdXRjICgnXDAnLCBmcCkgIT0gRU9GKTsKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQlBU1NFUlRfQUxXQVlTIChwdXRjIChCWVRFVkFMIChqKSwgZnApICE9IEVPRik7CisJICAgICAgLyogYW5kIHNvbWUgdHJhaWxpbmcgZ2FyYmFnZSAqLworCSAgICAgIEFTU0VSVF9BTFdBWVMgKHB1dGMgKCd4JywgZnApICE9IEVPRik7CisJICAgICAgQVNTRVJUX0FMV0FZUyAocHV0YyAoJ3knLCBmcCkgIT0gRU9GKTsKKwkgICAgICBBU1NFUlRfQUxXQVlTIChwdXRjICgneicsIGZwKSAhPSBFT0YpOworCSAgICAgIEFTU0VSVF9BTFdBWVMgKGZmbHVzaCAoZnApID09IDApOworCSAgICAgIHJld2luZCAoZnApOworCisJICAgICAgZ290X3JldCA9IG1wel9pbnBfcmF3IChnb3QsIGZwKTsKKwkgICAgICBBU1NFUlRfQUxXQVlTICghIGZlcnJvcihmcCkpOworCSAgICAgIEFTU0VSVF9BTFdBWVMgKGZjbG9zZSAoZnApID09IDApOworCisJICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworCSAgICAgIGlmIChnb3RfcmV0ICE9IHdhbnRfcmV0KQorCQl7CisJCSAgcHJpbnRmICgiY2hlY2tfaW46IHJldHVybiB2YWx1ZSB3cm9uZ1xuIik7CisJCSAgZXJyb3IgPSAxOworCQl9CisJICAgICAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoImNoZWNrX2luOiByZXN1bHQgd3JvbmdcbiIpOworCQkgIGVycm9yID0gMTsKKwkJfQorCSAgICAgIGlmIChlcnJvcikKKwkJeworCQkgIHByaW50ZiAgICAoIiAgaT0lZCB6ZXJvcz0lZCBuZWc9JWRcbiIsIGksIHplcm9zLCBuZWcpOworCQkgIHByaW50ZiAgICAoIiAgZ290X3JldCAgJWx1XG4iLCAodW5zaWduZWQgbG9uZykgZ290X3JldCk7CisJCSAgcHJpbnRmICAgICgiICB3YW50X3JldCAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSB3YW50X3JldCk7CisJCSAgbXB6X3RyYWNlICgiICBnb3QgICAgICAiLCBnb3QpOworCQkgIG1wel90cmFjZSAoIiAgd2FudCAgICAgIiwgd2FudCk7CisJCSAgYWJvcnQgKCk7CisJCX0KKworCSAgICAgIG1wel9uZWcgKHdhbnQsIHdhbnQpOworCSAgICB9CisJfQorICAgICAgbXB6X211bF8yZXhwICh3YW50LCB3YW50LCA4KTsKKyAgICAgIG1wel9hZGRfdWkgKHdhbnQsIHdhbnQsICh1bnNpZ25lZCBsb25nKSBCWVRFVkFMIChpKSk7CisgICAgfQorCisgIG1wel9jbGVhciAod2FudCk7CisgIG1wel9jbGVhciAoZ290KTsKK30KKworCit2b2lkCitjaGVja19vdXQgKHZvaWQpCit7CisgIGludCAgICAgICAgaSwgaiwgbmVnLCBlcnJvciA9IDA7CisgIG1wel90ICAgICAgejsKKyAgY2hhciAgICAgICB3YW50WzI1Nl0sIGdvdFsyNTZdLCAqcDsKKyAgc2l6ZV90ICAgICB3YW50X2xlbiwgZ290X3JldCwgZ290X3JlYWQ7CisgIG1wX3NpemVfdCAgc2l6ZTsKKyAgRklMRSAgICAgICAqZnA7CisKKyAgbXB6X2luaXQgKHopOworCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIHsKKyAgICAgIGZvciAobmVnID0gMDsgbmVnIDw9IDE7IG5lZysrKQorCXsKKwkgIHdhbnRfbGVuID0gaSArIDQ7CisKKwkgIC8qIG5lZWQgdGhpcyB0byBnZXQgdGhlIHR3b3MgY29tcGxlbWVudCByaWdodCAqLworCSAgQVNTRVJUX0FMV0FZUyAoc2l6ZW9mIChzaXplKSA+PSA0KTsKKworCSAgc2l6ZSA9IGk7CisJICBpZiAobmVnKQorCSAgICBzaXplID0gLXNpemU7CisKKwkgIHAgPSB3YW50OworCSAgZm9yIChqID0gMzsgaiA+PSAwOyBqLS0pCisJICAgICpwKysgPSBzaXplID4+IChqKjgpOworCSAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkgICAgKnArKyA9IEJZVEVWQUwgKGopOworCSAgQVNTRVJUX0FMV0FZUyAocCA8PSB3YW50ICsgc2l6ZW9mICh3YW50KSk7CisKKwkgIGZwID0gZm9wZW5fd3BsdXNiX29yX2RpZSAoRklMRU5BTUUpOworCSAgZ290X3JldCA9IG1wel9vdXRfcmF3IChmcCwgeik7CisJICBBU1NFUlRfQUxXQVlTIChmZmx1c2ggKGZwKSA9PSAwKTsKKwkgIHJld2luZCAoZnApOworCSAgZ290X3JlYWQgPSBmcmVhZCAoZ290LCAxLCBzaXplb2YoZ290KSwgZnApOworCSAgQVNTRVJUX0FMV0FZUyAoISBmZXJyb3IoZnApKTsKKwkgIEFTU0VSVF9BTFdBWVMgKGZjbG9zZSAoZnApID09IDApOworCisJICBpZiAoZ290X3JldCAhPSB3YW50X2xlbikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImNoZWNrX291dDogd3JvbmcgcmV0dXJuIHZhbHVlXG4iKTsKKwkgICAgICBlcnJvciA9IDE7CisJICAgIH0KKwkgIGlmIChnb3RfcmVhZCAhPSB3YW50X2xlbikKKwkgICAgeworCSAgICAgIHByaW50ZiAoImNoZWNrX291dDogd3JvbmcgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmFja1xuIik7CisJICAgICAgZXJyb3IgPSAxOworCSAgICB9CisJICBpZiAobWVtY21wICh3YW50LCBnb3QsIHdhbnRfbGVuKSAhPSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiY2hlY2tfb3V0OiB3cm9uZyBkYXRhXG4iKTsKKwkgICAgICBlcnJvciA9IDE7CisJICAgIH0KKwkgIGlmIChlcnJvcikKKwkgICAgeworCSAgICAgIHByaW50ZiAgICAoIiAgaT0lZCBuZWc9JWRcbiIsIGksIG5lZyk7CisJICAgICAgbXB6X3RyYWNlICgiICB6Iiwgeik7CisJICAgICAgcHJpbnRmICAgICgiICBnb3RfcmV0ICAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBnb3RfcmV0KTsKKwkgICAgICBwcmludGYgICAgKCIgIGdvdF9yZWFkICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGdvdF9yZWFkKTsKKwkgICAgICBwcmludGYgICAgKCIgIHdhbnRfbGVuICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIHdhbnRfbGVuKTsKKwkgICAgICBwcmludGYgICAgKCIgIHdhbnQiKTsKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgd2FudF9sZW47IGorKykKKwkJcHJpbnRmICgiICUwMlgiLCAodW5zaWduZWQpICh1bnNpZ25lZCBjaGFyKSB3YW50W2pdKTsKKwkgICAgICBwcmludGYgICAgKCJcbiIpOworCSAgICAgIHByaW50ZiAgICAoIiAgZ290ICIpOworCSAgICAgIGZvciAoaiA9IDA7IGogPCB3YW50X2xlbjsgaisrKQorCQlwcmludGYgKCIgJTAyWCIsICh1bnNpZ25lZCkgKHVuc2lnbmVkIGNoYXIpIGdvdFtqXSk7CisJICAgICAgcHJpbnRmICAgICgiXG4iKTsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCisJICBtcHpfbmVnICh6LCB6KTsKKwl9CisgICAgICBtcHpfbXVsXzJleHAgKHosIHosIDgpOworICAgICAgbXB6X2FkZF91aSAoeiwgeiwgKHVuc2lnbmVkIGxvbmcpIEJZVEVWQUwgKGkpKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyICh6KTsKK30KKworCit2b2lkCitjaGVja19yYW5kICh2b2lkKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciAgcmFuZHMgPSBSQU5EUzsKKyAgaW50ICAgICAgICBpLCBlcnJvciA9IDA7CisgIG1wel90ICAgICAgZ290LCB3YW50OworICBzaXplX3QgICAgIGlucF9yZXQsIG91dF9yZXQ7CisgIEZJTEUgICAgICAgKmZwOworCisgIG1wel9pbml0ICh3YW50KTsKKyAgbXB6X2luaXQgKGdvdCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKQorICAgIHsKKyAgICAgIG1wel9lcmFuZG9tYiAod2FudCwgcmFuZHMsIDEwKkdNUF9MSU1CX0JJVFMpOworICAgICAgbXB6X25lZ3JhbmRvbSAod2FudCwgcmFuZHMpOworCisgICAgICBmcCA9IGZvcGVuX3dwbHVzYl9vcl9kaWUgKEZJTEVOQU1FKTsKKyAgICAgIG91dF9yZXQgPSBtcHpfb3V0X3JhdyAoZnAsIHdhbnQpOworICAgICAgQVNTRVJUX0FMV0FZUyAoZmZsdXNoIChmcCkgPT0gMCk7CisgICAgICByZXdpbmQgKGZwKTsKKyAgICAgIGlucF9yZXQgPSBtcHpfaW5wX3JhdyAoZ290LCBmcCk7CisgICAgICBBU1NFUlRfQUxXQVlTIChmY2xvc2UgKGZwKSA9PSAwKTsKKworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworICAgICAgaWYgKGlucF9yZXQgIT0gb3V0X3JldCkKKwl7CisJICBwcmludGYgKCJjaGVja19yYW5kOiBkaWZmZXJlbnQgaW5wL291dCByZXR1cm4gdmFsdWVzXG4iKTsKKwkgIGVycm9yID0gMTsKKwl9CisgICAgICBpZiAobXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorCXsKKwkgIHByaW50ZiAoImNoZWNrX3JhbmQ6IHdyb25nIHJlc3VsdFxuIik7CisJICBlcnJvciA9IDE7CisJfQorICAgICAgaWYgKGVycm9yKQorCXsKKwkgIHByaW50ZiAgICAoIiAgb3V0X3JldCAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBvdXRfcmV0KTsKKwkgIHByaW50ZiAgICAoIiAgaW5wX3JldCAlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBpbnBfcmV0KTsKKwkgIG1wel90cmFjZSAoIiAgd2FudCIsIHdhbnQpOworCSAgbXB6X3RyYWNlICgiICBnb3QgIiwgZ290KTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnQpOworfQorCisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgY2hlY2tfaW4gKCk7CisgIGNoZWNrX291dCAoKTsKKyAgY2hlY2tfcmFuZCAoKTsKKworICB1bmxpbmsgKEZJTEVOQU1FKTsKKyAgdGVzdHNfZW5kICgpOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtamFjLmMgYi90ZXN0cy9tcHovdC1qYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhhZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtamFjLmMKQEAgLTAsMCArMSwxMDA4IEBACisvKiBFeGVyY2lzZSBtcHpfKl9rcm9uZWNrZXJfKigpIGFuZCBtcHpfamFjb2JpKCkgZnVuY3Rpb25zLgorCitDb3B5cmlnaHQgMTk5OS0yMDA0LCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisKKy8qIFdpdGggbm8gYXJndW1lbnRzIHRoZSB2YXJpb3VzIEtyb25lY2tlci9KYWNvYmkgc3ltYm9sIHJvdXRpbmVzIGFyZQorICAgY2hlY2tlZCBhZ2FpbnN0IHNvbWUgdGVzdCBkYXRhIGFuZCBhIGxvdCBvZiBkZXJpdmVkIGRhdGEuCisKKyAgIFRvIGNoZWNrIHRoZSB0ZXN0IGRhdGEgYWdhaW5zdCBQQVJJLUdQLCBydW4KKworCSAgIHQtamFjIC1wIHwgZ3AgLXEKKworICAgRW5oYW5jZW1lbnRzOgorCisgICBNb3JlIGJpZyB0ZXN0IGNhc2VzIHRoYW4gdGhvc2UgZ2l2ZW4gYnkgY2hlY2tfc3F1YXJlc196aSB3b3VsZCBiZSBnb29kLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmZGVmIF9MT05HX0xPTkdfTElNQgorI2RlZmluZSBMTChsLGxsKSAgbGwKKyNlbHNlCisjZGVmaW5lIExMKGwsbGwpICBsCisjZW5kaWYKKworCitpbnQgb3B0aW9uX3BhcmkgPSAwOworCisKK3Vuc2lnbmVkIGxvbmcKK21wel9tb2Q0IChtcHpfc3JjcHRyIHopCit7CisgIG1wel90ICAgICAgICAgIG07CisgIHVuc2lnbmVkIGxvbmcgIHJldDsKKworICBtcHpfaW5pdCAobSk7CisgIG1wel9mZGl2X3JfMmV4cCAobSwgeiwgMik7CisgIHJldCA9IG1wel9nZXRfdWkgKG0pOworICBtcHpfY2xlYXIgKG0pOworICByZXR1cm4gcmV0OworfQorCitpbnQKK21wel9maXRzX3VsaW1iX3AgKG1wel9zcmNwdHIgeikKK3sKKyAgcmV0dXJuIChTSVooeikgPT0gMSB8fCBTSVooeikgPT0gMCk7Cit9CisKK21wX2xpbWJfdAorbXB6X2dldF91bGltYiAobXB6X3NyY3B0ciB6KQoreworICBpZiAoU0laKHopID09IDApCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gUFRSKHopWzBdOworfQorCisKK3ZvaWQKK3RyeV9iYXNlIChtcF9saW1iX3QgYSwgbXBfbGltYl90IGIsIGludCBhbnN3ZXIpCit7CisgIGludCAgZ290OworCisgIGlmICgoYiAmIDEpID09IDAgfHwgYiA9PSAxIHx8IGEgPiBiKQorICAgIHJldHVybjsKKworICBnb3QgPSBtcG5famFjb2JpX2Jhc2UgKGEsIGIsIDApOworICBpZiAoZ290ICE9IGFuc3dlcikKKyAgICB7CisgICAgICBwcmludGYgKExMKCJtcG5famFjb2JpX2Jhc2UgKCVsdSwgJWx1KSBpcyAlZCBzaG91bGQgYmUgJWRcbiIsCisJCSAibXBuX2phY29iaV9iYXNlICglbGx1LCAlbGx1KSBpcyAlZCBzaG91bGQgYmUgJWRcbiIpLAorCSAgICAgIGEsIGIsIGdvdCwgYW5zd2VyKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworCit2b2lkCit0cnlfemlfdWkgKG1wel9zcmNwdHIgYSwgdW5zaWduZWQgbG9uZyBiLCBpbnQgYW5zd2VyKQoreworICBpbnQgIGdvdDsKKworICBnb3QgPSBtcHpfa3JvbmVja2VyX3VpIChhLCBiKTsKKyAgaWYgKGdvdCAhPSBhbnN3ZXIpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X2tyb25lY2tlcl91aSAoIik7CisgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgYSk7CisgICAgICBwcmludGYgKCIsICVsdSkgaXMgJWQgc2hvdWxkIGJlICVkXG4iLCBiLCBnb3QsIGFuc3dlcik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKwordm9pZAordHJ5X3ppX3NpIChtcHpfc3JjcHRyIGEsIGxvbmcgYiwgaW50IGFuc3dlcikKK3sKKyAgaW50ICBnb3Q7CisKKyAgZ290ID0gbXB6X2tyb25lY2tlcl9zaSAoYSwgYik7CisgIGlmIChnb3QgIT0gYW5zd2VyKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9rcm9uZWNrZXJfc2kgKCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGEpOworICAgICAgcHJpbnRmICgiLCAlbGQpIGlzICVkIHNob3VsZCBiZSAlZFxuIiwgYiwgZ290LCBhbnN3ZXIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK3ZvaWQKK3RyeV91aV96aSAodW5zaWduZWQgbG9uZyBhLCBtcHpfc3JjcHRyIGIsIGludCBhbnN3ZXIpCit7CisgIGludCAgZ290OworCisgIGdvdCA9IG1wel91aV9rcm9uZWNrZXIgKGEsIGIpOworICBpZiAoZ290ICE9IGFuc3dlcikKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfdWlfa3JvbmVja2VyICglbHUsICIsIGEpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGIpOworICAgICAgcHJpbnRmICgiKSBpcyAlZCBzaG91bGQgYmUgJWRcbiIsIGdvdCwgYW5zd2VyKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworCit2b2lkCit0cnlfc2lfemkgKGxvbmcgYSwgbXB6X3NyY3B0ciBiLCBpbnQgYW5zd2VyKQoreworICBpbnQgIGdvdDsKKworICBnb3QgPSBtcHpfc2lfa3JvbmVja2VyIChhLCBiKTsKKyAgaWYgKGdvdCAhPSBhbnN3ZXIpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3NpX2tyb25lY2tlciAoJWxkLCAiLCBhKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBiKTsKKyAgICAgIHByaW50ZiAoIikgaXMgJWQgc2hvdWxkIGJlICVkXG4iLCBnb3QsIGFuc3dlcik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKworLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIG1wel9qYWNvYmksIHNpbmNlIGl0IG9ubHkgZGlmZmVycyBmb3IgYiBldmVuLCBhbmQKKyAgIHdlIGRvbid0IGhhdmUgYW4gYWN0dWFsIGV4cGVjdGVkIGFuc3dlciBmb3IgaXQuICB0ZXN0cy9kZXZlbC90cnkuYyBkb2VzCisgICBzb21lIGNoZWNrcyB0aG91Z2guICAqLwordm9pZAordHJ5X3ppX3ppIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYiwgaW50IGFuc3dlcikKK3sKKyAgaW50ICBnb3Q7CisKKyAgZ290ID0gbXB6X2tyb25lY2tlciAoYSwgYik7CisgIGlmIChnb3QgIT0gYW5zd2VyKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9rcm9uZWNrZXIgKCIpOworICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGEpOworICAgICAgcHJpbnRmICgiLCAiKTsKKyAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBiKTsKKyAgICAgIHByaW50ZiAoIikgaXMgJWQgc2hvdWxkIGJlICVkXG4iLCBnb3QsIGFuc3dlcik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKwordm9pZAordHJ5X3BhcmkgKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiLCBpbnQgYW5zd2VyKQoreworICBwcmludGYgKCJ0cnkoIik7CisgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBhKTsKKyAgcHJpbnRmICgiLCIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgYik7CisgIHByaW50ZiAoIiwlZClcbiIsIGFuc3dlcik7Cit9CisKKwordm9pZAordHJ5X2VhY2ggKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiLCBpbnQgYW5zd2VyKQoreworI2lmIDAKKyAgZnByaW50ZihzdGRlcnIsICJhc2l6ZSA9ICVkLCBic2l6ZSA9ICVkXG4iLAorCSAgbXB6X3NpemVpbmJhc2UgKGEsIDIpLCBtcHpfc2l6ZWluYmFzZSAoYiwgMikpOworI2VuZGlmCisgIGlmIChvcHRpb25fcGFyaSkKKyAgICB7CisgICAgICB0cnlfcGFyaSAoYSwgYiwgYW5zd2VyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG1wel9maXRzX3VsaW1iX3AgKGEpICYmIG1wel9maXRzX3VsaW1iX3AgKGIpKQorICAgIHRyeV9iYXNlIChtcHpfZ2V0X3VsaW1iIChhKSwgbXB6X2dldF91bGltYiAoYiksIGFuc3dlcik7CisKKyAgaWYgKG1wel9maXRzX3Vsb25nX3AgKGIpKQorICAgIHRyeV96aV91aSAoYSwgbXB6X2dldF91aSAoYiksIGFuc3dlcik7CisKKyAgaWYgKG1wel9maXRzX3Nsb25nX3AgKGIpKQorICAgIHRyeV96aV9zaSAoYSwgbXB6X2dldF9zaSAoYiksIGFuc3dlcik7CisKKyAgaWYgKG1wel9maXRzX3Vsb25nX3AgKGEpKQorICAgIHRyeV91aV96aSAobXB6X2dldF91aSAoYSksIGIsIGFuc3dlcik7CisKKyAgaWYgKG1wel9maXRzX3NpbnRfcCAoYSkpCisgICAgdHJ5X3NpX3ppIChtcHpfZ2V0X3NpIChhKSwgYiwgYW5zd2VyKTsKKworICB0cnlfemlfemkgKGEsIGIsIGFuc3dlcik7Cit9CisKKworLyogVHJ5IChhL2IpIGFuZCAoYS8tYikuICovCit2b2lkCit0cnlfcG4gKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiX29yaWcsIGludCBhbnN3ZXIpCit7CisgIG1wel90ICBiOworCisgIG1wel9pbml0X3NldCAoYiwgYl9vcmlnKTsKKyAgdHJ5X2VhY2ggKGEsIGIsIGFuc3dlcik7CisKKyAgbXB6X25lZyAoYiwgYik7CisgIGlmIChtcHpfc2duIChhKSA8IDApCisgICAgYW5zd2VyID0gLWFuc3dlcjsKKworICB0cnlfZWFjaCAoYSwgYiwgYW5zd2VyKTsKKworICBtcHpfY2xlYXIgKGIpOworfQorCisKKy8qIFRyeSAoYStrKnAvYikgZm9yIHZhcmlvdXMgaywgdXNpbmcgdGhlIGZhY3QgKGEvYikgaXMgcGVyaW9kaWMgaW4gYSB3aXRoCisgICBwZXJpb2QgcC4gIEZvciBiPjAsIHA9YiBpZiBiIT0ybW9kNCBvciBwPTQqYiBpZiBiPT0ybW9kNC4gKi8KKwordm9pZAordHJ5X3BlcmlvZGljX251bSAobXB6X3NyY3B0ciBhX29yaWcsIG1wel9zcmNwdHIgYiwgaW50IGFuc3dlcikKK3sKKyAgbXB6X3QgIGEsIGFfcGVyaW9kOworICBpbnQgICAgaTsKKworICBpZiAobXB6X3NnbiAoYikgPD0gMCkKKyAgICByZXR1cm47CisKKyAgbXB6X2luaXRfc2V0IChhLCBhX29yaWcpOworICBtcHpfaW5pdF9zZXQgKGFfcGVyaW9kLCBiKTsKKyAgaWYgKG1wel9tb2Q0IChiKSA9PSAyKQorICAgIG1wel9tdWxfdWkgKGFfcGVyaW9kLCBhX3BlcmlvZCwgNCk7CisKKyAgLyogZG9uJ3QgYm90aGVyIHdpdGggdGhlc2UgdGVzdHMgaWYgdGhleSdyZSBvbmx5IGdvaW5nIHRvIHByb2R1Y2UKKyAgICAgZXZlbi9ldmVuICovCisgIGlmIChtcHpfZXZlbl9wIChhKSAmJiBtcHpfZXZlbl9wIChiKSAmJiBtcHpfZXZlbl9wIChhX3BlcmlvZCkpCisgICAgZ290byBkb25lOworCisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgbXB6X2FkZCAoYSwgYSwgYV9wZXJpb2QpOworICAgICAgdHJ5X3BuIChhLCBiLCBhbnN3ZXIpOworICAgIH0KKworICBtcHpfc2V0IChhLCBhX29yaWcpOworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zdWIgKGEsIGEsIGFfcGVyaW9kKTsKKyAgICAgIHRyeV9wbiAoYSwgYiwgYW5zd2VyKTsKKyAgICB9CisKKyBkb25lOgorICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGFfcGVyaW9kKTsKK30KKworCisvKiBUcnkgKGEvYitrKnApIGZvciB2YXJpb3VzIGssIHVzaW5nIHRoZSBmYWN0IChhL2IpIGlzIHBlcmlvZGljIGluIGIgb2YKKyAgIHBlcmlvZCBwLgorCisJCQkgICAgICAgcGVyaW9kIHAKKwkgICBhPT0wLDFtb2Q0ICAgICAgICAgICAgIGEKKwkgICBhPT0ybW9kNCAgICAgICAgICAgICAgNCphCisJICAgYT09M21vZDQgYW5kIGIgb2RkICAgIDQqYQorCSAgIGE9PTNtb2Q0IGFuZCBiIGV2ZW4gICA4KmEKKworICAgSW4gSGVucmkgQ29oZW4ncyBib29rIHRoZSBwZXJpb2QgaXMgZ2l2ZW4gYXMgNCphIGZvciBhbGwgYT09MiwzbW9kNCwgYnV0CisgICBhIGNvdW50ZXJleGFtcGxlIHdvdWxkIHNlZW0gdG8gYmUgKDMvMik9LTEgd2hpY2ggd2l0aCAoMy8xNCk9KzEgZG9lc24ndAorICAgaGF2ZSBwZXJpb2QgNCphIChidXQgcmF0aGVyIDgqYSB3aXRoICgzLzI2KT0tMSkuICBNYXliZSB0aGUgcGxhaW4gNCphIGlzCisgICB0byBiZSByZWFkIGFzIGFwcGx5aW5nIHRvIGEgcGxhaW4gSmFjb2JpIHN5bWJvbCB3aXRoIGIgb2RkLCByYXRoZXIgdGhhbgorICAgdGhlIEtyb25lY2tlciBleHRlbnNpb24gdG8gYiBldmVuLiAqLworCit2b2lkCit0cnlfcGVyaW9kaWNfZGVuIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYl9vcmlnLCBpbnQgYW5zd2VyKQoreworICBtcHpfdCAgYiwgYl9wZXJpb2Q7CisgIGludCAgICBpOworCisgIGlmIChtcHpfc2duIChhKSA9PSAwIHx8IG1wel9zZ24gKGJfb3JpZykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgbXB6X2luaXRfc2V0IChiLCBiX29yaWcpOworCisgIG1wel9pbml0X3NldCAoYl9wZXJpb2QsIGEpOworICBpZiAobXB6X21vZDQgKGEpID09IDMgJiYgbXB6X2V2ZW5fcCAoYikpCisgICAgbXB6X211bF91aSAoYl9wZXJpb2QsIGJfcGVyaW9kLCA4TCk7CisgIGVsc2UgaWYgKG1wel9tb2Q0IChhKSA+PSAyKQorICAgIG1wel9tdWxfdWkgKGJfcGVyaW9kLCBiX3BlcmlvZCwgNEwpOworCisgIC8qIGRvbid0IGJvdGhlciB3aXRoIHRoZXNlIHRlc3RzIGlmIHRoZXkncmUgb25seSBnb2luZyB0byBwcm9kdWNlCisgICAgIGV2ZW4vZXZlbiAqLworICBpZiAobXB6X2V2ZW5fcCAoYSkgJiYgbXB6X2V2ZW5fcCAoYikgJiYgbXB6X2V2ZW5fcCAoYl9wZXJpb2QpKQorICAgIGdvdG8gZG9uZTsKKworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgIG1wel9hZGQgKGIsIGIsIGJfcGVyaW9kKTsKKyAgICAgIHRyeV9wbiAoYSwgYiwgYW5zd2VyKTsKKyAgICB9CisKKyAgbXB6X3NldCAoYiwgYl9vcmlnKTsKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICB7CisgICAgICBtcHpfc3ViIChiLCBiLCBiX3BlcmlvZCk7CisgICAgICB0cnlfcG4gKGEsIGIsIGFuc3dlcik7CisgICAgfQorCisgZG9uZToKKyAgbXB6X2NsZWFyIChiKTsKKyAgbXB6X2NsZWFyIChiX3BlcmlvZCk7Cit9CisKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgIGt0YWJsZVtdID0geworICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LAorICBHTVBfTlVNQl9CSVRTLTEsIEdNUF9OVU1CX0JJVFMsIEdNUF9OVU1CX0JJVFMrMSwKKyAgMipHTVBfTlVNQl9CSVRTLTEsIDIqR01QX05VTUJfQklUUywgMipHTVBfTlVNQl9CSVRTKzEsCisgIDMqR01QX05VTUJfQklUUy0xLCAzKkdNUF9OVU1CX0JJVFMsIDMqR01QX05VTUJfQklUUysxCit9OworCisKKy8qIFRyeSAoYS9iKjJeaykgZm9yIHZhcmlvdXMgay4gKi8KK3ZvaWQKK3RyeV8yZGVuIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYl9vcmlnLCBpbnQgYW5zd2VyKQoreworICBtcHpfdCAgYjsKKyAgaW50ICAgIGtpbmRleDsKKyAgaW50ICAgIGFuc3dlcl9hMiwgYW5zd2VyX2s7CisgIHVuc2lnbmVkIGxvbmcgazsKKworICAvKiBkb24ndCBib3RoZXIgd2hlbiBiPT0wICovCisgIGlmIChtcHpfc2duIChiX29yaWcpID09IDApCisgICAgcmV0dXJuOworCisgIG1wel9pbml0X3NldCAoYiwgYl9vcmlnKTsKKworICAvKiAoYS8yKSBpcyAwIGlmIGEgZXZlbiwgMSBpZiBhPT0xIG9yIDcgbW9kIDgsIC0xIGlmIGE9PTMgb3IgNSBtb2QgOCAqLworICBhbnN3ZXJfYTIgPSAobXB6X2V2ZW5fcCAoYSkgPyAwCisJICAgICAgIDogKCgoU0laKGEpID49IDAgPyBQVFIoYSlbMF0gOiAtUFRSKGEpWzBdKSArIDIpICYgNykgPCA0ID8gMQorCSAgICAgICA6IC0xKTsKKworICBmb3IgKGtpbmRleCA9IDA7IGtpbmRleCA8IG51bWJlcm9mIChrdGFibGUpOyBraW5kZXgrKykKKyAgICB7CisgICAgICBrID0ga3RhYmxlW2tpbmRleF07CisKKyAgICAgIC8qIGFuc3dlcl9rID0gYW5zd2VyKihhbnN3ZXJfYTJeaykgKi8KKyAgICAgIGFuc3dlcl9rID0gKGFuc3dlcl9hMiA9PSAwICYmIGsgIT0gMCA/IDAKKwkJICA6IChrICYgMSkgPT0gMSAmJiBhbnN3ZXJfYTIgPT0gLTEgPyAtYW5zd2VyCisJCSAgOiBhbnN3ZXIpOworCisgICAgICBtcHpfbXVsXzJleHAgKGIsIGJfb3JpZywgayk7CisgICAgICB0cnlfcG4gKGEsIGIsIGFuc3dlcl9rKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChiKTsKK30KKworCisvKiBUcnkgKGEqMl5rL2IpIGZvciB2YXJpb3VzIGsuICBJZiBpdCBoYXBwZW5zIG1wel91aV9rcm9uZWNrZXIoKSBnZXRzICgyL2IpCisgICB3cm9uZyBpdCB3aWxsIHNob3cgdXAgYXMgd3JvbmcgYW5zd2VycyBkZW1hbmRlZC4gKi8KK3ZvaWQKK3RyeV8ybnVtIChtcHpfc3JjcHRyIGFfb3JpZywgbXB6X3NyY3B0ciBiLCBpbnQgYW5zd2VyKQoreworICBtcHpfdCAgYTsKKyAgaW50ICAgIGtpbmRleDsKKyAgaW50ICAgIGFuc3dlcl8yYiwgYW5zd2VyX2s7CisgIHVuc2lnbmVkIGxvbmcgIGs7CisKKyAgLyogZG9uJ3QgYm90aGVyIHdoZW4gYT09MCAqLworICBpZiAobXB6X3NnbiAoYV9vcmlnKSA9PSAwKQorICAgIHJldHVybjsKKworICBtcHpfaW5pdCAoYSk7CisKKyAgLyogKDIvYikgaXMgMCBpZiBiIGV2ZW4sIDEgaWYgYj09MSBvciA3IG1vZCA4LCAtMSBpZiBiPT0zIG9yIDUgbW9kIDggKi8KKyAgYW5zd2VyXzJiID0gKG1wel9ldmVuX3AgKGIpID8gMAorCSAgICAgICA6ICgoKFNJWihiKSA+PSAwID8gUFRSKGIpWzBdIDogLVBUUihiKVswXSkgKyAyKSAmIDcpIDwgNCA/IDEKKwkgICAgICAgOiAtMSk7CisKKyAgZm9yIChraW5kZXggPSAwOyBraW5kZXggPCBudW1iZXJvZiAoa3RhYmxlKTsga2luZGV4KyspCisgICAgeworICAgICAgayA9IGt0YWJsZVtraW5kZXhdOworCisgICAgICAvKiBhbnN3ZXJfayA9IGFuc3dlciooYW5zd2VyXzJiXmspICovCisgICAgICBhbnN3ZXJfayA9IChhbnN3ZXJfMmIgPT0gMCAmJiBrICE9IDAgPyAwCisJCSAgOiAoayAmIDEpID09IDEgJiYgYW5zd2VyXzJiID09IC0xID8gLWFuc3dlcgorCQkgIDogYW5zd2VyKTsKKworCW1wel9tdWxfMmV4cCAoYSwgYV9vcmlnLCBrKTsKKyAgICAgIHRyeV9wbiAoYSwgYiwgYW5zd2VyX2spOworICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworfQorCisKKy8qIFRoZSB0cnlfMm51bSgpIGFuZCB0cnlfMmRlbigpIHJvdXRpbmVzIGRvbid0IGluIHR1cm4gY2FsbAorICAgdHJ5X3BlcmlvZGljX251bSgpIGFuZCB0cnlfcGVyaW9kaWNfZGVuKCkgYmVjYXVzZSBpdCBodWdlbHkgaW5jcmVhc2VzIHRoZQorICAgbnVtYmVyIG9mIHRlc3RzIHBlcmZvcm1lZCwgd2l0aG91dCBvYnZpb3VzbHkgaW5jcmVhc2luZyBjb3ZlcmFnZS4KKworICAgVXNlZnVsIGV4dHJhIGRlcml2ZWQgY2FzZXMgY2FuIGJlIGFkZGVkIGhlcmUuICovCisKK3ZvaWQKK3RyeV9hbGwgKG1wel90IGEsIG1wel90IGIsIGludCBhbnN3ZXIpCit7CisgIHRyeV9wbiAoYSwgYiwgYW5zd2VyKTsKKyAgdHJ5X3BlcmlvZGljX251bSAoYSwgYiwgYW5zd2VyKTsKKyAgdHJ5X3BlcmlvZGljX2RlbiAoYSwgYiwgYW5zd2VyKTsKKyAgdHJ5XzJudW0gKGEsIGIsIGFuc3dlcik7CisgIHRyeV8yZGVuIChhLCBiLCBhbnN3ZXIpOworfQorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgICphOworICAgIGNvbnN0IGNoYXIgICpiOworICAgIGludCAgICAgICAgIGFuc3dlcjsKKworICB9IGRhdGFbXSA9IHsKKworICAgIC8qIE5vdGUgdGhhdCB0aGUgdmFyaW91cyBkZXJpdmVkIGNoZWNrcyBpbiB0cnlfYWxsKCkgcmVkdWNlIHRoZSBjYXNlcworICAgICAgIHRoYXQgbmVlZCB0byBiZSBnaXZlbiBoZXJlLiAgKi8KKworICAgIC8qIHNvbWUgemVyb3MgKi8KKyAgICB7ICAiMCIsICAiMCIsIDAgfSwKKyAgICB7ICAiMCIsICAiMiIsIDAgfSwKKyAgICB7ICAiMCIsICAiNiIsIDAgfSwKKyAgICB7ICAiNSIsICAiMCIsIDAgfSwKKyAgICB7ICIyNCIsICI2MCIsIDAgfSwKKworICAgIC8qIChhLzEpID0gMSwgYW55IGEKKyAgICAgICBJbiBwYXJ0aWN1bGFyIG5vdGUgKDAvMSk9MSBzbyB0aGF0IChhL2IpPShhIG1vZCBiL2IpLiAqLworICAgIHsgIjAiLCAiMSIsIDEgfSwKKyAgICB7ICIxIiwgIjEiLCAxIH0sCisgICAgeyAiMiIsICIxIiwgMSB9LAorICAgIHsgIjMiLCAiMSIsIDEgfSwKKyAgICB7ICI0IiwgIjEiLCAxIH0sCisgICAgeyAiNSIsICIxIiwgMSB9LAorCisgICAgLyogKDAvYikgPSAwLCBiICE9IDEgKi8KKyAgICB7ICIwIiwgICIzIiwgMCB9LAorICAgIHsgIjAiLCAgIjUiLCAwIH0sCisgICAgeyAiMCIsICAiNyIsIDAgfSwKKyAgICB7ICIwIiwgICI5IiwgMCB9LAorICAgIHsgIjAiLCAiMTEiLCAwIH0sCisgICAgeyAiMCIsICIxMyIsIDAgfSwKKyAgICB7ICIwIiwgIjE1IiwgMCB9LAorCisgICAgLyogKDEvYikgPSAxICovCisgICAgeyAiMSIsICAiMSIsIDEgfSwKKyAgICB7ICIxIiwgICIzIiwgMSB9LAorICAgIHsgIjEiLCAgIjUiLCAxIH0sCisgICAgeyAiMSIsICAiNyIsIDEgfSwKKyAgICB7ICIxIiwgICI5IiwgMSB9LAorICAgIHsgIjEiLCAiMTEiLCAxIH0sCisKKyAgICAvKiAoLTEvYikgPSAoLTEpXigoYi0xKS8yKSB3aGljaCBpcyAtMSBmb3IgYj09MyBtb2QgNCAqLworICAgIHsgIi0xIiwgICIxIiwgIDEgfSwKKyAgICB7ICItMSIsICAiMyIsIC0xIH0sCisgICAgeyAiLTEiLCAgIjUiLCAgMSB9LAorICAgIHsgIi0xIiwgICI3IiwgLTEgfSwKKyAgICB7ICItMSIsICAiOSIsICAxIH0sCisgICAgeyAiLTEiLCAiMTEiLCAtMSB9LAorICAgIHsgIi0xIiwgIjEzIiwgIDEgfSwKKyAgICB7ICItMSIsICIxNSIsIC0xIH0sCisgICAgeyAiLTEiLCAiMTciLCAgMSB9LAorICAgIHsgIi0xIiwgIjE5IiwgLTEgfSwKKworICAgIC8qICgyL2IpID0gKC0xKV4oKGJeMi0xKS84KSB3aGljaCBpcyAtMSBmb3IgYj09Myw1IG1vZCA4LgorICAgICAgIHRyeV8ybnVtKCkgd2lsbCBleGVyY2lzZSBtdWx0aXBsZSBwb3dlcnMgb2YgMiBpbiB0aGUgbnVtZXJhdG9yLiAgKi8KKyAgICB7ICIyIiwgICIxIiwgIDEgfSwKKyAgICB7ICIyIiwgICIzIiwgLTEgfSwKKyAgICB7ICIyIiwgICI1IiwgLTEgfSwKKyAgICB7ICIyIiwgICI3IiwgIDEgfSwKKyAgICB7ICIyIiwgICI5IiwgIDEgfSwKKyAgICB7ICIyIiwgIjExIiwgLTEgfSwKKyAgICB7ICIyIiwgIjEzIiwgLTEgfSwKKyAgICB7ICIyIiwgIjE1IiwgIDEgfSwKKyAgICB7ICIyIiwgIjE3IiwgIDEgfSwKKworICAgIC8qICgtMi9iKSA9ICgtMSleKChiXjItMSkvOCkqKC0xKV4oKGItMSkvMikgd2hpY2ggaXMgLTEgZm9yIGI9PTUsN21vZDguCisgICAgICAgdHJ5XzJudW0oKSB3aWxsIGV4ZXJjaXNlIG11bHRpcGxlIHBvd2VycyBvZiAyIGluIHRoZSBudW1lcmF0b3IsIHdoaWNoCisgICAgICAgd2lsbCB0ZXN0IHRoYXQgdGhlIHNoaWZ0IGluIG1wel9zaV9rcm9uZWNrZXIoKSB1c2VzIHVuc2lnbmVkIG5vdAorICAgICAgIHNpZ25lZC4gICovCisgICAgeyAiLTIiLCAgIjEiLCAgMSB9LAorICAgIHsgIi0yIiwgICIzIiwgIDEgfSwKKyAgICB7ICItMiIsICAiNSIsIC0xIH0sCisgICAgeyAiLTIiLCAgIjciLCAtMSB9LAorICAgIHsgIi0yIiwgICI5IiwgIDEgfSwKKyAgICB7ICItMiIsICIxMSIsICAxIH0sCisgICAgeyAiLTIiLCAiMTMiLCAtMSB9LAorICAgIHsgIi0yIiwgIjE1IiwgLTEgfSwKKyAgICB7ICItMiIsICIxNyIsICAxIH0sCisKKyAgICAvKiAoYS8yKT0oMi9hKS4KKyAgICAgICB0cnlfMmRlbigpIHdpbGwgZXhlcmNpc2UgbXVsdGlwbGUgcG93ZXJzIG9mIDIgaW4gdGhlIGRlbm9taW5hdG9yLiAqLworICAgIHsgICIzIiwgICIyIiwgLTEgfSwKKyAgICB7ICAiNSIsICAiMiIsIC0xIH0sCisgICAgeyAgIjciLCAgIjIiLCAgMSB9LAorICAgIHsgICI5IiwgICIyIiwgIDEgfSwKKyAgICB7ICAiMTEiLCAiMiIsIC0xIH0sCisKKyAgICAvKiBIYXJyaWV0IEdyaWZmaW4sICJFbGVtZW50YXJ5IFRoZW9yeSBvZiBOdW1iZXJzIiwgcGFnZSAxNTUsIHZhcmlvdXMKKyAgICAgICBleGFtcGxlcy4gICovCisgICAgeyAgICIyIiwgIjEzNSIsICAxIH0sCisgICAgeyAiMTM1IiwgICIxOSIsIC0xIH0sCisgICAgeyAgICIyIiwgICIxOSIsIC0xIH0sCisgICAgeyAgIjE5IiwgIjEzNSIsICAxIH0sCisgICAgeyAiMTczIiwgIjEzNSIsICAxIH0sCisgICAgeyAgIjM4IiwgIjEzNSIsICAxIH0sCisgICAgeyAiMTM1IiwgIjE3MyIsICAxIH0sCisgICAgeyAiMTczIiwgICAiNSIsIC0xIH0sCisgICAgeyAgICIzIiwgICAiNSIsIC0xIH0sCisgICAgeyAgICI1IiwgIjE3MyIsIC0xIH0sCisgICAgeyAiMTczIiwgICAiMyIsIC0xIH0sCisgICAgeyAgICIyIiwgICAiMyIsIC0xIH0sCisgICAgeyAgICIzIiwgIjE3MyIsIC0xIH0sCisgICAgeyAiMjUzIiwgICIyMSIsICAxIH0sCisgICAgeyAgICIxIiwgICIyMSIsICAxIH0sCisgICAgeyAgIjIxIiwgIjI1MyIsICAxIH0sCisgICAgeyAgIjIxIiwgICIxMSIsIC0xIH0sCisgICAgeyAgIi0xIiwgICIxMSIsIC0xIH0sCisKKyAgICAvKiBHcmlmZmluIHBhZ2UgMTQ3ICovCisgICAgeyAgIi0xIiwgICIxNyIsICAxIH0sCisgICAgeyAgICIyIiwgICIxNyIsICAxIH0sCisgICAgeyAgIi0yIiwgICIxNyIsICAxIH0sCisgICAgeyAgIi0xIiwgICI4OSIsICAxIH0sCisgICAgeyAgICIyIiwgICI4OSIsICAxIH0sCisKKyAgICAvKiBHcmlmZmluIHBhZ2UgMTQ4ICovCisgICAgeyAgIjg5IiwgICIxMSIsICAxIH0sCisgICAgeyAgICIxIiwgICIxMSIsICAxIH0sCisgICAgeyAgIjg5IiwgICAiMyIsIC0xIH0sCisgICAgeyAgICIyIiwgICAiMyIsIC0xIH0sCisgICAgeyAgICIzIiwgICI4OSIsIC0xIH0sCisgICAgeyAgIjExIiwgICI4OSIsICAxIH0sCisgICAgeyAgIjMzIiwgICI4OSIsIC0xIH0sCisKKyAgICAvKiBILiBEYXZlbnBvcnQsICJUaGUgSGlnaGVyIEFyaXRobWV0aWMiLCBwYWdlIDY1LCB0aGUgcXVhZHJhdGljCisgICAgICAgcmVzaWR1ZXMgYW5kIG5vbi1yZXNpZHVlcyBtb2QgMTkuICAqLworICAgIHsgICIxIiwgIjE5IiwgIDEgfSwKKyAgICB7ICAiNCIsICIxOSIsICAxIH0sCisgICAgeyAgIjUiLCAiMTkiLCAgMSB9LAorICAgIHsgICI2IiwgIjE5IiwgIDEgfSwKKyAgICB7ICAiNyIsICIxOSIsICAxIH0sCisgICAgeyAgIjkiLCAiMTkiLCAgMSB9LAorICAgIHsgIjExIiwgIjE5IiwgIDEgfSwKKyAgICB7ICIxNiIsICIxOSIsICAxIH0sCisgICAgeyAiMTciLCAiMTkiLCAgMSB9LAorICAgIHsgICIyIiwgIjE5IiwgLTEgfSwKKyAgICB7ICAiMyIsICIxOSIsIC0xIH0sCisgICAgeyAgIjgiLCAiMTkiLCAtMSB9LAorICAgIHsgIjEwIiwgIjE5IiwgLTEgfSwKKyAgICB7ICIxMiIsICIxOSIsIC0xIH0sCisgICAgeyAiMTMiLCAiMTkiLCAtMSB9LAorICAgIHsgIjE0IiwgIjE5IiwgLTEgfSwKKyAgICB7ICIxNSIsICIxOSIsIC0xIH0sCisgICAgeyAiMTgiLCAiMTkiLCAtMSB9LAorCisgICAgLyogUmVzaWR1ZXMgYW5kIG5vbi1yZXNpZHVlcyBtb2QgMTMgKi8KKyAgICB7ICAiMCIsICAiMTMiLCAgMCB9LAorICAgIHsgICIxIiwgICIxMyIsICAxIH0sCisgICAgeyAgIjIiLCAgIjEzIiwgLTEgfSwKKyAgICB7ICAiMyIsICAiMTMiLCAgMSB9LAorICAgIHsgICI0IiwgICIxMyIsICAxIH0sCisgICAgeyAgIjUiLCAgIjEzIiwgLTEgfSwKKyAgICB7ICAiNiIsICAiMTMiLCAtMSB9LAorICAgIHsgICI3IiwgICIxMyIsIC0xIH0sCisgICAgeyAgIjgiLCAgIjEzIiwgLTEgfSwKKyAgICB7ICAiOSIsICAiMTMiLCAgMSB9LAorICAgIHsgIjEwIiwgICIxMyIsICAxIH0sCisgICAgeyAiMTEiLCAgIjEzIiwgLTEgfSwKKyAgICB7ICIxMiIsICAiMTMiLCAgMSB9LAorCisgICAgLyogdmFyaW91cyAqLworICAgIHsgICI1IiwgICAiNyIsIC0xIH0sCisgICAgeyAiMTUiLCAgIjE3IiwgIDEgfSwKKyAgICB7ICI2NyIsICAiODkiLCAgMSB9LAorCisgICAgLyogc3BlY2lhbCB2YWx1ZXMgaW5kdWNpbmcgYT09Yj09MSBhdCB0aGUgZW5kIG9mIGphY19vcl9rcm9uKCkgKi8KKyAgICB7ICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwKKyAgICAgICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzIiwgMSB9LAorCisgICAgLyogVGVzdCBmb3IgcHJldmlvdXMgYnVncyBpbiBqYWNvYmlfMi4gKi8KKyAgICB7ICIweDQzOTAwMDAwMDAwIiwgIjB4NDI0MDAwMDA0MzkiLCAtMSB9LCAvKiAzMi1iaXQgbGltYnMgKi8KKyAgICB7ICIweDQzOTAwMDAwMDAwMDAwMDAwMDAiLCAiMHg0MjQwMDAwMDAwMDAwMDAwNDM5IiwgLTEgfSwgLyogNjQtYml0IGxpbWJzICovCisKKyAgICB7ICIxOTgxNTg0MDgxNjEwMzkwNjMiLCAiMTk4MTU4MzYwOTE2Mzk4ODA3IiwgLTEgfSwKKworICAgIC8qIFNvbWUgdGVzdHMgaW52b2x2aW5nIGxhcmdlIHF1b3RpZW50cyBpbiB0aGUgY29udGludWVkIGZyYWN0aW9uCisgICAgICAgZXhwYW5zaW9uLiAqLworICAgIHsgIjM3MjAwMjEwODQ1MTM5MTY3NjEzMzU2MTI1NjQ1NDQ1MjgxODA1IiwKKyAgICAgICI0NTE3MTY4NDU5NzY2ODk4OTI0NDc4OTU4MTE0MDg5Nzg0MjE5MjkiLCAtMSB9LAorICAgIHsgIjY3Njc0MDkxOTMwNTc2NzgxOTQzOTIzNTk2NzAxMzQ2MjcxMDU4OTcwNjQzNTQyNDkxNzQzNjA1MDQ4NjIwNjQ0Njc2NDc3Mjc1MTUyNzAxNzc0OTYwODY4OTQxNTYxNjUyMDMyNDgyMTczNjEyNDIxMDE1IiwKKyAgICAgICI0OTAyNjc4ODY3Nzk0NTY3MTIwMjI0NTAwNjg3MjEwODA3MDY5MTcyMDM5NzM1IiwgMCB9LAorICAgIHsgIjI2NjY2MTcxNDYxMDM3NjQwNjcwNjEwMTc5NjE5MDMyODQzMzQ0OTc0NzQ0OTI3NTQ2NTI0OTk3ODg1NzEzNzgwNjI5NjkxMTEyNTA1ODQyODg2ODM1ODUyMjM2MDAxNzIxMzg1NTExOTg1NDYwODUyODE2ODMyODM2NzI1OTIiLCAiMjY2NjYxNzE0NjEwMzc2NDA2NzA2MTAxNzk2MTkwMzI4NDMzNDQ5NzQ3NDQ5Mjc1NDY1MjQ5OTc4ODU3MTM3ODA2Mjk2OTExMTI1MDU4NDI4ODY4MzU4NTIyMzYwMDE3MjEzODU1MTE5ODU0NjA4NTI4MTY4MzI5MDQ4MTc3MyIsIDEgfSwKKworICAgIC8qIEV4ZXJjaXNlcyB0aGUgY2FzZSBhc2l6ZSA9PSAxLCBidHdvcyA+IDAgaW4gbXB6X2phY29iaS4gKi8KKyAgICB7ICI4MDQ2MDkiLCAiNDIxMjQ4MzYzMjA1MjA2NjE3Mjk2NTM0Njg4MDMyNjM4MTAyMzE0NDEwNTU2NTIxNzQyNDI4ODMyMzYyNjU5ODI0IiwgMSB9ICwKKyAgICB7ICI0MTkwMjA5IiwgIjIyMzk3NDQ3NDIxNzc4MDQyMTA1NTc0NDIwNDg5ODQzMjEwMTc0NjAwMjg5NzQ2MDI5Nzg5OTUzODgzODM5MDU5NjEwNzkyODY1MzA2NTA4MjU5MjUwNzQyMDMxNzU1MzY0MjcwMDAiLCAxIH0sCisKKyAgICAvKiBFeGVyY2lzZXMgdGhlIGNhc2UgYXNpemUgPT0gMSwgYnR3b3MgPSA2MyBpbiBtcHpfamFjb2JpCisgICAgICAgKHJlbGV2YW50IHdoZW4gR01QX0xJTUJfQklUUyA9PSA2NCkuICovCisgICAgeyAiMTczMTE5NzMyOTkwMDA5MzQ0MDEiLCAiMTY3NTk3NTk5MTI0MjgyNDYzNzQ0Njc1MzEyNDc3NTY4OTQ0OTkzNjg3MTMzNzAzNjYxNDY3NzU3NzA0NDcxNzQyNDcwMDM1MTEwMzE0ODc5OTEwNzY1MTE3MTY5NDg2MzY5NTI0MjA4OTk1NjI0Mjg4ODIyOTQ1ODgzNjQyNjMzMjMwMDEyNDQxNzAxMTExNDM4MDg4NjAxNiIsIDEgfSwKKyAgICB7ICIzMjIwNTY5MjIwMTE2NTgzNjc3IiwgIjQxODU5OTE3NjIzMDM1Mzk2NzQ2IiwgLTEgfSwKKworICAgIC8qIE90aGVyIHRlc3QgY2FzZXMgdGhhdCB0cmlnZ2VyZWQgYnVncyBkdXJpbmcgZGV2ZWxvcG1lbnQuICovCisgICAgeyAiMzcyMDAyMTA4NDUxMzkxNjc2MTMzNTYxMjU2NDU0NDUyODE4MDUiLCAiMzQwMTE2MjEzNDQxMjcyMzg5NjA3ODI3NDM0NDcyNjQyNTc2NTE0IiwgLTEgfSwKKyAgICB7ICI3NDQwMDQyMTY5MDI3ODMzNTIyNjcxMjI1MTI5MDg5MDU2MzYxMCIsICI0NTE3MTY4NDU5NzY2ODk4OTI0NDc4OTU4MTE0MDg5Nzg0MjE5MjkiLCAtMSB9LAorICB9OworCisgIGludCAgICBpOworICBtcHpfdCAgYSwgYjsKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKGEsIGRhdGFbaV0uYSwgMCk7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAoYiwgZGF0YVtpXS5iLCAwKTsKKyAgICAgIHRyeV9hbGwgKGEsIGIsIGRhdGFbaV0uYW5zd2VyKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKK30KKworCisvKiAoYV4yL2IpPTEgaWYgZ2NkKGEsYik9MSwgb3IgKGFeMi9iKT0wIGlmIGdjZChhLGIpIT0xLgorICAgVGhpcyBpbmNsdWRlcyB3aGVuIGE9MCBvciBiPTAuICovCit2b2lkCitjaGVja19zcXVhcmVzX3ppICh2b2lkKQoreworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBtcHpfdCAgYSwgYiwgZzsKKyAgaW50ICAgIGksIGFuc3dlcjsKKyAgbXBfc2l6ZV90IHNpemVfcmFuZ2UsIGFuLCBibjsKKyAgbXB6X3QgYnM7CisKKyAgbXB6X2luaXQgKGJzKTsKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIG1wel9pbml0IChnKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDEwICsgaS84ICsgMjsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgYW4gPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKGEsIHJhbmRzLCBhbik7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGJuID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChiLCByYW5kcywgYm4pOworCisgICAgICBtcHpfZ2NkIChnLCBhLCBiKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChnLCAxTCkgPT0gMCkKKwlhbnN3ZXIgPSAxOworICAgICAgZWxzZQorCWFuc3dlciA9IDA7CisKKyAgICAgIG1wel9tdWwgKGEsIGEsIGEpOworCisgICAgICB0cnlfYWxsIChhLCBiLCBhbnN3ZXIpOworICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKKyAgbXB6X2NsZWFyIChnKTsKK30KKworCisvKiBDaGVjayB0aGUgaGFuZGxpbmcgb2YgYXNpemU9PTAsIG1ha2Ugc3VyZSBpdCBpc24ndCBhZmZlY3RlZCBieSB0aGUgbG93CisgICBsaW1iLiAqLwordm9pZAorY2hlY2tfYV96ZXJvICh2b2lkKQoreworICBtcHpfdCAgYSwgYjsKKworICBtcHpfaW5pdF9zZXRfdWkgKGEsIDApOworICBtcHpfaW5pdCAoYik7CisKKyAgbXB6X3NldF91aSAoYiwgMUwpOworICBQVFIoYSlbMF0gPSAwOworICB0cnlfYWxsIChhLCBiLCAxKTsgICAvKiAoMC8xKT0xICovCisgIFBUUihhKVswXSA9IDE7CisgIHRyeV9hbGwgKGEsIGIsIDEpOyAgIC8qICgwLzEpPTEgKi8KKworICBtcHpfc2V0X3NpIChiLCAtMUwpOworICBQVFIoYSlbMF0gPSAwOworICB0cnlfYWxsIChhLCBiLCAxKTsgICAvKiAoMC8tMSk9MSAqLworICBQVFIoYSlbMF0gPSAxOworICB0cnlfYWxsIChhLCBiLCAxKTsgICAvKiAoMC8tMSk9MSAqLworCisgIG1wel9zZXRfdWkgKGIsIDApOworICBQVFIoYSlbMF0gPSAwOworICB0cnlfYWxsIChhLCBiLCAwKTsgICAvKiAoMC8wKT0wICovCisgIFBUUihhKVswXSA9IDE7CisgIHRyeV9hbGwgKGEsIGIsIDApOyAgIC8qICgwLzApPTAgKi8KKworICBtcHpfc2V0X3VpIChiLCAyKTsKKyAgUFRSKGEpWzBdID0gMDsKKyAgdHJ5X2FsbCAoYSwgYiwgMCk7ICAgLyogKDAvMik9MCAqLworICBQVFIoYSlbMF0gPSAxOworICB0cnlfYWxsIChhLCBiLCAwKTsgICAvKiAoMC8yKT0wICovCisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKK30KKworCisvKiBBc3N1bWVzIHRoYXQgYiA9IHByb2QgcF9rXmVfayAqLworaW50CityZWZfamFjb2JpIChtcHpfc3JjcHRyIGEsIG1wel9zcmNwdHIgYiwgdW5zaWduZWQgbnByaW1lLAorCSAgICBtcHpfdCBwcmltZVtdLCB1bnNpZ25lZCAqZXhwKQoreworICB1bnNpZ25lZCBpOworICBpbnQgcmVzOworCisgIGZvciAoaSA9IDAsIHJlcyA9IDE7IGkgPCBucHJpbWU7IGkrKykKKyAgICBpZiAoZXhwW2ldKQorICAgICAgeworCWludCBsZWdlbmRyZSA9IHJlZm1wel9sZWdlbmRyZSAoYSwgcHJpbWVbaV0pOworCWlmICghbGVnZW5kcmUpCisJICByZXR1cm4gMDsKKwlpZiAoZXhwW2ldICYgMSkKKwkgIHJlcyAqPSBsZWdlbmRyZTsKKyAgICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordm9pZAorY2hlY2tfamFjb2JpX2ZhY3RvcmVkICh2b2lkKQoreworI2RlZmluZSBQUklNRV9OIDEwCisjZGVmaW5lIFBSSU1FX01BWF9TSVpFIDUwCisjZGVmaW5lIFBSSU1FX01BWF9FWFAgNAorI2RlZmluZSBQUklNRV9BX0NPVU5UIDEwCisjZGVmaW5lIFBSSU1FX0JfQ09VTlQgNQorI2RlZmluZSBQUklNRV9NQVhfQl9TSVpFIDIwMDAKKworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworICBtcHpfdCBwcmltZVtQUklNRV9OXTsKKyAgdW5zaWduZWQgZXhwW1BSSU1FX05dOworICBtcHpfdCBhLCBiLCB0LCBiczsKKyAgdW5zaWduZWQgaTsKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChiKTsKKyAgbXB6X2luaXQgKHQpOworICBtcHpfaW5pdCAoYnMpOworCisgIC8qIEdlbmVyYXRlIHByaW1lcyAqLworICBmb3IgKGkgPSAwOyBpIDwgUFJJTUVfTjsgaSsrKQorICAgIHsKKyAgICAgIG1wX3NpemVfdCBzaXplOworICAgICAgbXB6X2luaXQgKHByaW1lW2ldKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplID0gbXB6X2dldF91aSAoYnMpICUgUFJJTUVfTUFYX1NJWkUgKyAyOworICAgICAgbXB6X3JyYW5kb21iIChwcmltZVtpXSwgcmFuZHMsIHNpemUpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHByaW1lW2ldLCAzKSA8PSAwKQorCW1wel9zZXRfdWkgKHByaW1lW2ldLCAzKTsKKyAgICAgIGVsc2UKKwltcHpfbmV4dHByaW1lIChwcmltZVtpXSwgcHJpbWVbaV0pOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgUFJJTUVfQl9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGosIGs7CisgICAgICBtcF9iaXRjbnRfdCBic2l6ZTsKKworICAgICAgbXB6X3NldF91aSAoYiwgMSk7CisgICAgICBic2l6ZSA9IDE7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBQUklNRV9OICYmIGJzaXplIDwgUFJJTUVfTUFYX0JfU0laRTsgaisrKQorCXsKKwkgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisJICBleHBbal0gPSBtcHpfZ2V0X3VpIChicykgJSBQUklNRV9NQVhfRVhQOworCSAgbXB6X3Bvd191aSAodCwgcHJpbWVbal0sIGV4cFtqXSk7CisJICBtcHpfbXVsIChiLCBiLCB0KTsKKwkgIGJzaXplID0gbXB6X3NpemVpbmJhc2UgKGIsIDIpOworCX0KKyAgICAgIGZvciAoayA9IDA7IGsgPCBQUklNRV9BX0NPVU5UOyBrKyspCisJeworCSAgaW50IGFuc3dlcjsKKwkgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIGJzaXplICsgMik7CisJICBhbnN3ZXIgPSByZWZfamFjb2JpIChhLCBiLCBqLCBwcmltZSwgZXhwKTsKKwkgIHRyeV9hbGwgKGEsIGIsIGFuc3dlcik7CisJfQorICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IFBSSU1FX047IGkrKykKKyAgICBtcHpfY2xlYXIgKHByaW1lW2ldKTsKKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGIpOworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKGJzKTsKKworI3VuZGVmIFBSSU1FX04KKyN1bmRlZiBQUklNRV9NQVhfU0laRQorI3VuZGVmIFBSSU1FX01BWF9FWFAKKyN1bmRlZiBQUklNRV9BX0NPVU5UCisjdW5kZWYgUFJJTUVfQl9DT1VOVAorI3VuZGVmIFBSSU1FX01BWF9CX1NJWkUKK30KKworLyogVGhlc2UgdGVzdHMgY29tcHV0ZSAoYXxuKSwgd2hlcmUgdGhlIHF1b3RpZW50IHNlcXVlbmNlIGluY2x1ZGVzCisgICBsYXJnZSBxdW90aWVudHMsIGFuZCBuIGhhcyBhIGtub3duIGZhY3Rvcml6YXRpb24uIFN1Y2ggaW5wdXRzIGFyZQorICAgZ2VuZXJhdGVkIGFzIGZvbGxvd3MuIEZpcnN0LCBjb25zdHJ1Y3QgYSBsYXJnZSBuLCBhcyBhIHBvd2VyIG9mIGEKKyAgIHByaW1lIHAgb2YgbW9kZXJhdGUgc2l6ZS4KKworICAgTmV4dCwgY29tcHV0ZSBhIG1hdHJpeCBmcm9tIGZhY3RvcnMgKHEsMTsxLDApLCB3aXRoIHEgY2hvc2VuIHdpdGgKKyAgIHVuaWZvcm1seSBkaXN0cmlidXRlZCBzaXplLiBXZSBtdXN0IHN0b3Agd2l0aCBtYXRyaXggZWxlbWVudHMgb2YKKyAgIHJvdWdobHkgaGFsZiB0aGUgc2l6ZSBvZiBuLiBEZW5vdGUgZWxlbWVudHMgb2YgTSBhcyBNID0gKG0wMCwgbTAxOworICAgbTEwLCBtMTEpLgorCisgICBXZSBub3cgbG9vayBmb3Igc29sdXRpb25zIHRvCisKKyAgICAgbiA9IG0wMCB4ICsgbTAxIHkKKyAgICAgYSA9IG0xMCB4ICsgbTExIHkKKworICAgd2l0aCB4LHkgPiAwLiBTaW5jZSBuID49IG0wMCAqIG0wMSwgdGhlcmUgZXhpc3RzIGEgcG9zaXRpdmUKKyAgIHNvbHV0aW9uIHRvIHRoZSBmaXJzdCBlcXVhdGlvbi4gRmluZCB0aG9zZSB4LCB5LCBhbmQgc3Vic3RpdHV0ZSBpbgorICAgdGhlIHNlY29uZCBlcXVhdGlvbiB0byBnZXQgYS4gVGhlbiB0aGUgcXVvdGllbnQgc2VxdWVuY2UgZm9yIChhfG4pCisgICBpcyBwcmVjaXNlbHkgdGhlIHF1b3RpZW50cyB1c2VkIHdoZW4gY29uc3RydWN0aW5nIE0sIGZvbGxvd2VkIGJ5CisgICB0aGUgcXVvdGllbnQgc2VxdWVuY2UgZm9yICh4fHkpLgorCisgICBOdW1iZXJzIHNob3VsZCBhbHNvIGJlIGxhcmdlIGVub3VnaCB0aGF0IHdlIGV4ZXJjaXNlIGhnY2RfamFjb2JpLAorICAgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IHNob3VsZCBiZSBsYXJnZXIgdGhhbgorCisgICAgIG1heCAoR0NEX0RDX1RIUkVTSE9MRCwgMyAqIEhHQ0RfVEhSRVNIT0xEKQorCisgICBXaXRoIGFuIG4gb2Ygcm91Z2hseSA0MDAwMCBiaXRzLCB0aGlzIHNob3VsZCBob2xkIG9uIG1vc3QgbWFjaGluZXMuCisqLworCit2b2lkCitjaGVja19sYXJnZV9xdW90aWVudHMgKHZvaWQpCit7CisjZGVmaW5lIENPVU5UIDUwCisjZGVmaW5lIFBCSVRTIDIwMAorI2RlZmluZSBQUE9XRVIgMjAxCisjZGVmaW5lIE1BWF9RQklUUyA1MDAKKworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kcyA9IFJBTkRTOworCisgIG1wel90IHAsIG4sIHEsIGcsIHMsIHQsIHgsIHksIGJzOworICBtcHpfdCBNWzJdWzJdOworICBtcF9iaXRjbnRfdCBuc2l6ZTsKKyAgdW5zaWduZWQgaTsKKworICBtcHpfaW5pdCAocCk7CisgIG1wel9pbml0IChuKTsKKyAgbXB6X2luaXQgKHEpOworICBtcHpfaW5pdCAoZyk7CisgIG1wel9pbml0IChzKTsKKyAgbXB6X2luaXQgKHQpOworICBtcHpfaW5pdCAoeCk7CisgIG1wel9pbml0ICh5KTsKKyAgbXB6X2luaXQgKGJzKTsKKyAgbXB6X2luaXQgKE1bMF1bMF0pOworICBtcHpfaW5pdCAoTVswXVsxXSk7CisgIG1wel9pbml0IChNWzFdWzBdKTsKKyAgbXB6X2luaXQgKE1bMV1bMV0pOworCisgIC8qIEZpcnN0IGdlbmVyYXRlIGEgbnVtYmVyIHdpdGgga25vd24gZmFjdG9yaXphdGlvbiwgYXMgYSByYW5kb20KKyAgICAgc21hbGxpc2ggcHJpbWUgcmFpc2VkIHRvIGFuIG9kZCBwb3dlci4gVGhlbiAoYXxuKSA9IChhfHApLiAqLworICBtcHpfcnJhbmRvbWIgKHAsIHJhbmRzLCBQQklUUyk7CisgIG1wel9uZXh0cHJpbWUgKHAsIHApOworICBtcHpfcG93X3VpIChuLCBwLCBQUE9XRVIpOworCisgIG5zaXplID0gbXB6X3NpemVpbmJhc2UgKG4sIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgIHsKKyAgICAgIGludCBhbnN3ZXI7CisgICAgICBtcF9iaXRjbnRfdCBtc2l6ZTsKKworICAgICAgbXB6X3NldF91aSAoTVswXVswXSwgMSk7CisgICAgICBtcHpfc2V0X3VpIChNWzBdWzFdLCAwKTsKKyAgICAgIG1wel9zZXRfdWkgKE1bMV1bMF0sIDApOworICAgICAgbXB6X3NldF91aSAoTVsxXVsxXSwgMSk7CisKKyAgICAgIGZvciAobXNpemUgPSAxOyAyKihtc2l6ZSArIE1BWF9RQklUUykgKyAxIDwgbnNpemUgOykKKwl7CisJICB1bnNpZ25lZCBpOworCSAgbXB6X3JyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKwkgIG1wel9ycmFuZG9tYiAocSwgcmFuZHMsIDEgKyBtcHpfZ2V0X3VpIChicykgJSBNQVhfUUJJVFMpOworCisJICAvKiBNdWx0aXBseSBieSAocSwgMTsgMSwwKSBmcm9tIHRoZSByaWdodCAqLworCSAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkgICAgeworCSAgICAgIG1wX2JpdGNudF90IHNpemU7CisJICAgICAgbXB6X3N3YXAgKE1baV1bMF0sIE1baV1bMV0pOworCSAgICAgIG1wel9hZGRtdWwgKE1baV1bMF0sIE1baV1bMV0sIHEpOworCSAgICAgIHNpemUgPSBtcHpfc2l6ZWluYmFzZSAoTVtpXVswXSwgMik7CisJICAgICAgaWYgKHNpemUgPiBtc2l6ZSkKKwkJbXNpemUgPSBzaXplOworCSAgICB9CisJfQorICAgICAgbXB6X2djZGV4dCAoZywgcywgdCwgTVswXVswXSwgTVswXVsxXSk7CisgICAgICBBU1NFUlRfQUxXQVlTIChtcHpfY21wX3VpIChnLCAxKSA9PSAwKTsKKworICAgICAgLyogU29sdmUgbiA9IE1bMF1bMF0gKiB4ICsgTVswXVsxXSAqIHkgKi8KKyAgICAgIGlmIChtcHpfc2duIChzKSA+IDApCisJeworCSAgbXB6X211bCAoeCwgbiwgcyk7CisJICBtcHpfZmRpdl9xciAocSwgeCwgeCwgTVswXVsxXSk7CisJICBtcHpfbXVsICh5LCBxLCBNWzBdWzBdKTsKKwkgIG1wel9hZGRtdWwgKHksIHQsIG4pOworCSAgQVNTRVJUX0FMV0FZUyAobXB6X3NnbiAoeSkgPiAwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbXB6X211bCAoeSwgbiwgdCk7CisJICBtcHpfZmRpdl9xciAocSwgeSwgeSwgTVswXVswXSk7CisJICBtcHpfbXVsICh4LCBxLCBNWzBdWzFdKTsKKwkgIG1wel9hZGRtdWwgKHgsIHMsIG4pOworCSAgQVNTRVJUX0FMV0FZUyAobXB6X3NnbiAoeCkgPiAwKTsKKwl9CisgICAgICBtcHpfbXVsICh4LCB4LCBNWzFdWzBdKTsKKyAgICAgIG1wel9hZGRtdWwgKHgsIHksIE1bMV1bMV0pOworCisgICAgICAvKiBOb3cgKHh8bikgaGFzIHRoZSBzZWxlY3RlZCBsYXJnZSBxdW90aWVudHMgKi8KKyAgICAgIGFuc3dlciA9IHJlZm1wel9sZWdlbmRyZSAoeCwgcCk7CisgICAgICB0cnlfemlfemkgKHgsIG4sIGFuc3dlcik7CisgICAgfQorICBtcHpfY2xlYXIgKHApOworICBtcHpfY2xlYXIgKG4pOworICBtcHpfY2xlYXIgKHEpOworICBtcHpfY2xlYXIgKGcpOworICBtcHpfY2xlYXIgKHMpOworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKHgpOworICBtcHpfY2xlYXIgKHkpOworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChNWzBdWzBdKTsKKyAgbXB6X2NsZWFyIChNWzBdWzFdKTsKKyAgbXB6X2NsZWFyIChNWzFdWzBdKTsKKyAgbXB6X2NsZWFyIChNWzFdWzFdKTsKKyN1bmRlZiBDT1VOVAorI3VuZGVmIFBCSVRTCisjdW5kZWYgUFBPV0VSCisjdW5kZWYgTUFYX1FCSVRTCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKGFyZ2MgPj0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItcCIpID09IDApCisgICAgeworICAgICAgb3B0aW9uX3BhcmkgPSAxOworCisgICAgICBwcmludGYgKCJcCit0cnkoYSxiLGFuc3dlcikgPVxuXAore1xuXAorICBpZiAoa3JvbmVja2VyKGEsYikgIT0gYW5zd2VyLFxuXAorICAgIHByaW50KFwid3JvbmcgYXQgXCIsIGEsIFwiLFwiLCBiLFxuXAorICAgICAgXCIgZXhwZWN0ZWQgXCIsIGFuc3dlcixcblwKKyAgICAgIFwiIHBhcmkgc2F5cyBcIiwga3JvbmVja2VyKGEsYikpKVxuXAorfVxuIik7CisgICAgfQorCisgIGNoZWNrX2RhdGEgKCk7CisgIGNoZWNrX3NxdWFyZXNfemkgKCk7CisgIGNoZWNrX2FfemVybyAoKTsKKyAgY2hlY2tfamFjb2JpX2ZhY3RvcmVkICgpOworICBjaGVja19sYXJnZV9xdW90aWVudHMgKCk7CisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1sY20uYyBiL3Rlc3RzL21wei90LWxjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDUyMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1sY20uYwpAQCAtMCwwICsxLDE4NCBAQAorLyogVGVzdCBtcHpfbGNtIGFuZCBtcHpfbGNtX3VpLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19hbGwgKG1wel9wdHIgd2FudCwgbXB6X3NyY3B0ciB4X29yaWcsIG1wel9zcmNwdHIgeV9vcmlnKQoreworICBtcHpfdCAgZ290LCB4LCB5OworICBpbnQgICAgbmVneCwgbmVneSwgc3dhcCwgaW5wbGFjZTsKKworICBtcHpfaW5pdCAoZ290KTsKKyAgbXB6X2luaXRfc2V0ICh4LCB4X29yaWcpOworICBtcHpfaW5pdF9zZXQgKHksIHlfb3JpZyk7CisKKyAgZm9yIChzd2FwID0gMDsgc3dhcCA8IDI7IHN3YXArKykKKyAgICB7CisgICAgICBtcHpfc3dhcCAoeCwgeSk7CisKKyAgICAgIGZvciAobmVneCA9IDA7IG5lZ3ggPCAyOyBuZWd4KyspCisJeworCSAgbXB6X25lZyAoeCwgeCk7CisKKwkgIGZvciAobmVneSA9IDA7IG5lZ3kgPCAyOyBuZWd5KyspCisJICAgIHsKKwkgICAgICBtcHpfbmVnICh5LCB5KTsKKworCSAgICAgIGZvciAoaW5wbGFjZSA9IDA7IGlucGxhY2UgPD0gMTsgaW5wbGFjZSsrKQorCQl7CisJCSAgaWYgKGlucGxhY2UpCisJCSAgICB7IG1wel9zZXQgKGdvdCwgeCk7IG1wel9sY20gKGdvdCwgZ290LCB5KTsgfQorCQkgIGVsc2UKKwkJICAgIG1wel9sY20gKGdvdCwgeCwgeSk7CisJCSAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworCQkgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisJCSAgICB7CisJCSAgICAgIHByaW50ZiAoIm1wel9sY20gd3JvbmcsIGlucGxhY2U9JWRcbiIsIGlucGxhY2UpOworCQkgICAgZmFpbDoKKwkJICAgICAgbXB6X3RyYWNlICgieCIsIHgpOworCQkgICAgICBtcHpfdHJhY2UgKCJ5IiwgeSk7CisJCSAgICAgIG1wel90cmFjZSAoImdvdCIsIGdvdCk7CisJCSAgICAgIG1wel90cmFjZSAoIndhbnQiLCB3YW50KTsKKwkJICAgICAgYWJvcnQgKCk7CisJCSAgICB9CisKKwkJICBpZiAobXB6X2ZpdHNfdWxvbmdfcCAoeSkpCisJCSAgICB7CisJCSAgICAgIHVuc2lnbmVkIGxvbmcgIHl1ID0gbXB6X2dldF91aSAoeSk7CisJCSAgICAgIGlmIChpbnBsYWNlKQorCQkJeyBtcHpfc2V0IChnb3QsIHgpOyBtcHpfbGNtX3VpIChnb3QsIGdvdCwgeXUpOyB9CisJCSAgICAgIGVsc2UKKwkJCW1wel9sY21fdWkgKGdvdCwgeCwgeXUpOworCisJCSAgICAgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisJCQl7CisJCQkgIHByaW50ZiAoIm1wel9sY21fdWkgd3JvbmcsIGlucGxhY2U9JWRcbiIsIGlucGxhY2UpOworCQkJICBwcmludGYgICAgKCJ5dT0lbHVcbiIsIHl1KTsKKwkJCSAgZ290byBmYWlsOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoZ290KTsKKyAgbXB6X2NsZWFyICh4KTsKKyAgbXB6X2NsZWFyICh5KTsKK30KKworCit2b2lkCitjaGVja19wcmltZXMgKHZvaWQpCit7CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nICBwcmltZVtdID0geworICAgIDIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsCisgICAgMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwKKyAgICAxOTEsMTkzLDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LAorICAgIDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsCisgICAgMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4NywKKyAgfTsKKyAgbXB6X3QgIHdhbnQsIHgsIHk7CisgIGludCAgICBpOworCisgIG1wel9pbml0ICh3YW50KTsKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAoeSk7CisKKyAgLyogQ2hlY2sgemVyb3MuICovCisgIG1wel9zZXRfdWkgKHdhbnQsIDApOworICBtcHpfc2V0X3VpICh4LCAxKTsKKyAgY2hlY2tfYWxsICh3YW50LCB3YW50LCB3YW50KTsKKyAgY2hlY2tfYWxsICh3YW50LCB3YW50LCB4KTsKKyAgY2hlY2tfYWxsICh3YW50LCB4LCB3YW50KTsKKworICAvKiBOZXcgcHJpbWUgZWFjaCB0aW1lLiAqLworICBtcHpfc2V0X3VpICh3YW50LCAxTCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAocHJpbWUpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldCAoeCwgd2FudCk7CisgICAgICBtcHpfc2V0X3VpICh5LCBwcmltZVtpXSk7CisgICAgICBtcHpfbXVsX3VpICh3YW50LCB3YW50LCBwcmltZVtpXSk7CisgICAgICBjaGVja19hbGwgKHdhbnQsIHgsIHkpOworICAgIH0KKworICAvKiBPbGQgcHJpbWUgZWFjaCB0aW1lLiAqLworICBtcHpfc2V0ICh4LCB3YW50KTsKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChwcmltZSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3VpICh5LCBwcmltZVtpXSk7CisgICAgICBjaGVja19hbGwgKHdhbnQsIHgsIHkpOworICAgIH0KKworICAvKiBPbmUgb2xkLCBvbmUgbmV3IGVhY2ggdGltZS4gKi8KKyAgbXB6X3NldF91aSAod2FudCwgcHJpbWVbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgbnVtYmVyb2YgKHByaW1lKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9zZXQgKHgsIHdhbnQpOworICAgICAgbXB6X3NldF91aSAoeSwgcHJpbWVbaV0gKiBwcmltZVtpLTFdKTsKKyAgICAgIG1wel9tdWxfdWkgKHdhbnQsIHdhbnQsIHByaW1lW2ldKTsKKyAgICAgIGNoZWNrX2FsbCAod2FudCwgeCwgeSk7CisgICAgfQorCisgIC8qIFRyaXBsZXRzIHdpdGggQSxCIGluIHggYW5kIEIsQyBpbiB5LiAqLworICBtcHpfc2V0X3VpICh3YW50LCAxTCk7CisgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgbXB6X3NldF91aSAoeSwgMUwpOworICBmb3IgKGkgPSAwOyBpKzIgPCBudW1iZXJvZiAocHJpbWUpOyBpICs9IDMpCisgICAgeworICAgICAgbXB6X211bF91aSAod2FudCwgd2FudCwgcHJpbWVbaV0pOworICAgICAgbXB6X211bF91aSAod2FudCwgd2FudCwgcHJpbWVbaSsxXSk7CisgICAgICBtcHpfbXVsX3VpICh3YW50LCB3YW50LCBwcmltZVtpKzJdKTsKKworICAgICAgbXB6X211bF91aSAoeCwgeCwgcHJpbWVbaV0pOworICAgICAgbXB6X211bF91aSAoeCwgeCwgcHJpbWVbaSsxXSk7CisKKyAgICAgIG1wel9tdWxfdWkgKHksIHksIHByaW1lW2krMV0pOworICAgICAgbXB6X211bF91aSAoeSwgeSwgcHJpbWVbaSsyXSk7CisKKyAgICAgIGNoZWNrX2FsbCAod2FudCwgeCwgeSk7CisgICAgfQorCisKKyAgbXB6X2NsZWFyICh3YW50KTsKKyAgbXB6X2NsZWFyICh4KTsKKyAgbXB6X2NsZWFyICh5KTsKK30KKworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfcHJpbWVzICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1saW1icy5jIGIvdGVzdHMvbXB6L3QtbGltYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI2ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtbGltYnMuYwpAQCAtMCwwICsxLDIzMiBAQAorLyogVGVzdCBtcHpfbGltYnNfKiBmdW5jdGlvbnMKKworQ29weXJpZ2h0IDIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjZGVmaW5lIENPVU5UIDEwMAorI2RlZmluZSBCSVRTSVpFIDUwMAorCisvKiBMaWtlIG1wel9hZGQuIEZvciBzaW1wbGljaXR5LCBzdXBwb3J0IHBvc2l0aXZlIGlucHV0cyBvbmx5LiAqLworc3RhdGljIHZvaWQKK2FsdF9hZGQgKG1wel9wdHIgciwgbXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGIpCit7CisgIG1wX3NpemVfdCBhbiA9IG1wel9zaXplIChhKTsKKyAgbXBfc2l6ZV90IGJuID0gbXB6X3NpemUgKGIpOworICBtcF9wdHIgcnA7CisKKyAgQVNTRVJUIChhbiA+IDApOworICBBU1NFUlQgKGJuID4gMCk7CisgIGlmIChhbiA8IGJuKQorICAgIHsKKyAgICAgIE1QX1NJWkVfVF9TV0FQIChhbiwgYm4pOworICAgICAgTVBaX1NSQ1BUUl9TV0FQIChhLCBiKTsKKyAgICB9CisgIHJwID0gbXB6X2xpbWJzX21vZGlmeSAociwgYW4gKyAxKTsKKyAgcnBbYW5dID0gbXBuX2FkZCAocnAsIG1wel9saW1ic19yZWFkIChhKSwgYW4sIG1wel9saW1ic19yZWFkIChiKSwgYm4pOworICBtcHpfbGltYnNfZmluaXNoIChyLCBhbiArIDEpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfZnVuY3MgKGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICB2b2lkICgqZikobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0ciksCisJICAgICB2b2lkICgqcmVmX2YpKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpLAorCSAgICAgbXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGIpCit7CisgIG1wel90IHIsIHJlZjsKKyAgbXB6X2luaXRzIChyLCByZWYsIE5VTEwpOworCisgIHJlZl9mIChyZWYsIGEsIGIpOworICBNUFpfQ0hFQ0tfRk9STUFUIChyZWYpOworICBmIChyLCBhLCBiKTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAocik7CisKKyAgaWYgKG1wel9jbXAgKHIsIHJlZikgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIlcyBmYWlsZWQsIGFiaXRzICV1LCBiYml0cyAldVxuIiwKKwkgICAgICBuYW1lLAorCSAgICAgICh1bnNpZ25lZCkgbXB6X3NpemVpbmJhc2UgKGEsIDIpLAorCSAgICAgICh1bnNpZ25lZCkgbXB6X3NpemVpbmJhc2UgKGIsIDIpKTsKKyAgICAgIGdtcF9wcmludGYgKCJhID0gJVp4XG4iLCBhKTsKKyAgICAgIGdtcF9wcmludGYgKCJiID0gJVp4XG4iLCBiKTsKKyAgICAgIGdtcF9wcmludGYgKCJyID0gJVp4IChiYWQpXG4iLCByKTsKKyAgICAgIGdtcF9wcmludGYgKCJyZWYgPSAlWnhcbiIsIHJlZik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIG1wel9jbGVhcnMgKHIsIHJlZiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19hZGQgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzID0gUkFORFM7CisgIG1wel90IGJzLCBhLCBiOworICB1bnNpZ25lZCBpOworICBtcHpfaW5pdHMgKGJzLCBhLCBiLCBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIDEgKyBtcHpfZ2V0X3VpIChicykgJSBCSVRTSVpFKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBtcHpfcnJhbmRvbWIgKGIsIHJhbmRzLCAxICsgbXB6X2dldF91aSAoYnMpICUgQklUU0laRSk7CisKKyAgICAgIGNoZWNrX2Z1bmNzICgiYWRkIiwgYWx0X2FkZCwgbXB6X2FkZCwgYSwgYik7CisgICAgfQorICBtcHpfY2xlYXJzIChicywgYSwgYiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCithbHRfbXVsIChtcHpfcHRyIHIsIG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBiKQoreworICBtcF9zaXplX3QgYW4gPSBtcHpfc2l6ZSAoYSk7CisgIG1wX3NpemVfdCBibiA9IG1wel9zaXplIChiKTsKKyAgbXBfc3JjcHRyIGFwLCBicDsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgQVNTRVJUIChhbiA+IDApOworICBBU1NFUlQgKGJuID4gMCk7CisgIGlmIChhbiA8IGJuKQorICAgIHsKKyAgICAgIE1QX1NJWkVfVF9TV0FQIChhbiwgYm4pOworICAgICAgTVBaX1NSQ1BUUl9TV0FQIChhLCBiKTsKKyAgICB9CisgIC8qIE5PVEU6IFRoaXMgY29weWluZyBzZWVtcyB1bm5lY2Vzc2FyeTsgYmV0dGVyIHRvIGFsbG9jYXRlIG5ldworICAgICByZXN1bHQgYXJlYSwgYW5kIGZyZWUgdGhlIG9sZCBhcmVhIHdoZW4gZG9uZS4gKi8KKyAgaWYgKHIgPT0gYSkKKyAgICB7CisgICAgICBtcF9wdHIgdHAgPSAgVE1QX0FMTE9DX0xJTUJTIChhbik7CisgICAgICBNUE5fQ09QWSAodHAsIG1wel9saW1ic19yZWFkIChhKSwgYW4pOworICAgICAgYXAgPSB0cDsKKyAgICAgIGJwID0gKGEgPT0gYikgPyBhcCA6IG1wel9saW1ic19yZWFkIChiKTsKKyAgICB9CisgIGVsc2UgaWYgKHIgPT0gYikKKyAgICB7CisgICAgICBtcF9wdHIgdHAgPSBUTVBfQUxMT0NfTElNQlMgKGJuKTsKKyAgICAgIE1QTl9DT1BZICh0cCwgbXB6X2xpbWJzX3JlYWQgKGIpLCBibik7CisgICAgICBicCA9IHRwOworICAgICAgYXAgPSBtcHpfbGltYnNfcmVhZCAoYSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYXAgPSBtcHpfbGltYnNfcmVhZCAoYSk7CisgICAgICBicCA9IG1wel9saW1ic19yZWFkIChiKTsKKyAgICB9CisgIG1wbl9tdWwgKG1wel9saW1ic193cml0ZSAociwgYW4gKyBibiksCisJICAgYXAsIGFuLCBicCwgYm4pOworCisgIG1wel9saW1ic19maW5pc2ggKHIsIGFuICsgYm4pOworfQorCit2b2lkCitjaGVja19tdWwgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzID0gUkFORFM7CisgIG1wel90IGJzLCBhLCBiOworICB1bnNpZ25lZCBpOworICBtcHpfaW5pdHMgKGJzLCBhLCBiLCBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIDEgKyBtcHpfZ2V0X3VpIChicykgJSBCSVRTSVpFKTsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBtcHpfcnJhbmRvbWIgKGIsIHJhbmRzLCAxICsgbXB6X2dldF91aSAoYnMpICUgQklUU0laRSk7CisKKyAgICAgIGNoZWNrX2Z1bmNzICgibXVsIiwgYWx0X211bCwgbXB6X211bCwgYSwgYik7CisgICAgfQorICBtcHpfY2xlYXJzIChicywgYSwgYiwgTlVMTCk7Cit9CisKKyNkZWZpbmUgTUFYX1NJWkUgMTAwCisKK3N0YXRpYyB2b2lkCitjaGVja19yb2luaXQgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzID0gUkFORFM7CisgIG1wel90IGJzLCBhLCBiLCByLCByZWY7CisgIHVuc2lnbmVkIGk7CisKKyAgbXB6X2luaXRzIChicywgYSwgYiwgciwgcmVmLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICBtcF9zcmNwdHIgYXAsIGJwOworICAgICAgbXBfc2l6ZV90IGFuLCBibjsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBtcHpfcnJhbmRvbWIgKGEsIHJhbmRzLCAxICsgbXB6X2dldF91aSAoYnMpICUgQklUU0laRSk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgbXB6X3JyYW5kb21iIChiLCByYW5kcywgMSArIG1wel9nZXRfdWkgKGJzKSAlIEJJVFNJWkUpOworCisgICAgICBhbiA9IG1wel9zaXplIChhKTsKKyAgICAgIGFwID0gbXB6X2xpbWJzX3JlYWQgKGEpOworICAgICAgYm4gPSBtcHpfc2l6ZSAoYik7CisgICAgICBicCA9IG1wel9saW1ic19yZWFkIChiKTsKKworICAgICAgbXB6X2FkZCAocmVmLCBhLCBiKTsKKyAgICAgIHsKKwltcHpfdCBhMSwgYjE7CisjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDEKKwljb25zdCBtcHpfdCBhMiA9IE1QWl9ST0lOSVRfTiAoIChtcF9wdHIpIGFwLCBhbik7CisJY29uc3QgbXB6X3QgYjIgPSBNUFpfUk9JTklUX04gKCAobXBfcHRyKSBicCwgYm4pOworCisJbXB6X3NldF91aSAociwgMCk7CisJbXB6X2FkZCAociwgYTIsIGIyKTsKKwlpZiAobXB6X2NtcCAociwgcmVmKSAhPSAwKQorCSAgeworCSAgICBwcmludGYgKCJNUFpfUk9JTklUX04gZmFpbGVkXG4iKTsKKwkgICAgZ21wX3ByaW50ZiAoImEgPSAlWnhcbiIsIGEpOworCSAgICBnbXBfcHJpbnRmICgiYiA9ICVaeFxuIiwgYik7CisJICAgIGdtcF9wcmludGYgKCJyID0gJVp4IChiYWQpXG4iLCByKTsKKwkgICAgZ21wX3ByaW50ZiAoInJlZiA9ICVaeFxuIiwgcmVmKTsKKwkgICAgYWJvcnQgKCk7CisJICB9CisjZW5kaWYKKwltcHpfc2V0X3VpIChyLCAwKTsKKwltcHpfYWRkIChyLCBtcHpfcm9pbml0X24gKGExLCBhcCwgYW4pLCBtcHpfcm9pbml0X24gKGIxLCBicCwgYm4pKTsKKwlpZiAobXB6X2NtcCAociwgcmVmKSAhPSAwKQorCSAgeworCSAgICBwcmludGYgKCJtcHpfcm9pbml0X24gZmFpbGVkXG4iKTsKKwkgICAgZ21wX3ByaW50ZiAoImEgPSAlWnhcbiIsIGEpOworCSAgICBnbXBfcHJpbnRmICgiYiA9ICVaeFxuIiwgYik7CisJICAgIGdtcF9wcmludGYgKCJyID0gJVp4IChiYWQpXG4iLCByKTsKKwkgICAgZ21wX3ByaW50ZiAoInJlZiA9ICVaeFxuIiwgcmVmKTsKKwkgICAgYWJvcnQgKCk7CisJICB9CisgICAgICB9CisgICAgfQorICBtcHpfY2xlYXJzIChicywgYSwgYiwgciwgcmVmLCBOVUxMKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgdGVzdHNfZW5kICgpOworCisgIGNoZWNrX2FkZCAoKTsKKyAgY2hlY2tfbXVsICgpOworICBjaGVja19yb2luaXQgKCk7CisKKyAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWx1Y20uYyBiL3Rlc3RzL21wei90LWx1Y20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGJlODViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtbHVjbS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiBUZXN0IG1wel9wb3dtLCBtcHpfbHVjYXNfbW9kLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5OS0yMDAxLCAyMDA5LCAyMDEyLCAyMDE4IEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCisjZGVmaW5lIFNJWkVNIDgKKworLyogRklYTUU6IFNob3VsZCB3ZSBpbXBsZW1lbnQgYW5vdGhlciBzZXF1ZW5jZSB0byB0ZXN0IGx1Y2FzIG1vZD8JKi8KKy8qIEVnOiBhIGdlbmVyYWxpc2F0aW9uIG9mIHdoYXQgd2UgdXNlIGZvciBGaWJvbmFjY2k6CSovCisvKiBVX3sybi0xfSA9IFVfbl4yIC0gUSpVX3tuLTF9XjIJKi8KKy8qIFVfezJuKzF9ID0gRCpVX25eMiAgKyBRKlVfezJuLTF9ICsgMipRXm4gOyB3aGl0aCBEID0gKFBeMi00KlEpCSovCisvKiBQKlVfezJufSA9IFVfezJuKzF9ICsgUSpVX3sybi0xfQkqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgYmFzZSwgZXhwLCBtb2Q7CisgIG1wel90IHIxLCByMiwgdDEsIHQyOworICBtcF9zaXplX3QgZXhwX3NpemUsIG1vZF9zaXplOworICBpbnQgaSwgcmVzOworICBpbnQgcmVwcyA9IDEwMDA7CisgIGxvbmcgUTsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworCisgIG1wel9pbml0IChiYXNlKTsKKyAgbXB6X2luaXQgKGV4cCk7CisgIG1wel9pbml0IChtb2QpOworICBtcHpfaW5pdCAocjEpOworICBtcHpfaW5pdCAocjIpOworICBtcHpfaW5pdCAodDEpOworICBtcHpfaW5pdCAodDIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSBTSVpFTSArIDE7CisKKyAgICAgIGRvICAvKiBMb29wIHVudGlsIGJhc2UgPj0gMiBhbmQgZml0cyBpbiBhIGxvbmcuICAqLworCXsKKwkgIG1wel91cmFuZG9tYiAoYmFzZSwgcmFuZHMsIEJJVFNfUEVSX1VMT05HIC0gMik7CisJfQorICAgICAgd2hpbGUgKG1wel9jbXBfdWkgKGJhc2UsIDIpIDwgMCB8fCBtcHpfZml0c19zbG9uZ19wIChiYXNlKSA9PSAwKTsKKworICAgICAgUSA9IG1wel9nZXRfdWkgKGJhc2UpOworCisgICAgICBkbworICAgICAgICB7CisJICArK3NpemVfcmFuZ2U7CisJICBzaXplX3JhbmdlID0gTUlOIChzaXplX3JhbmdlLCBTSVpFTSk7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJICBtb2Rfc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKwkgIG1wel9ycmFuZG9tYiAobW9kLCByYW5kcywgbW9kX3NpemUpOworCSAgbXB6X2FkZF91aSAobW9kLCBtb2QsIDE2KTsKKwl9CisgICAgICB3aGlsZSAobXB6X2djZF91aSAoTlVMTCwgbW9kLCBRKSAhPSAxKTsKKworICAgICAgbW9kX3NpemUgPSBtcHpfc2l6ZWluYmFzZSAobW9kLCAyKSAtIDM7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgZXhwX3NpemUgPSBtcHpfZ2V0X3VpIChicykgJSBtb2Rfc2l6ZSArIDI7CisKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAoZXhwLCBtb2QsIGV4cF9zaXplKTsKKyAgICAgIG1wel9hZGRfdWkgKGV4cCwgZXhwLCAxKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCXsKKwkgIG1wel9uZWcgKGJhc2UsIGJhc2UpOworCSAgUSA9IC1ROworCX0KKworICAgICAgcmVzID0gbXB6X2x1Y2FzX21vZCAodDEsIHIyLCBRLCBleHBfc2l6ZSwgbW9kLCB0MiwgcjEpOworICAgICAgaWYgKHJlcyAmJiArK3JlcHMpCisJY29udGludWU7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyMik7CisgICAgICBpZiAobXB6X2NtcF91aSAocjIsIDApIDwgMCkKKwltcHpfYWRkIChyMiwgcjIsIG1vZCk7CisgICAgICBtcHpfcG93bSAocjEsIGJhc2UsIGV4cCwgbW9kKTsKKworICAgICAgaWYgKG1wel9jbXAgKHIxLCByMikgIT0gMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJcbkluY29ycmVjdCByZXN1bHRzIGluIHRlc3QgJWQgZm9yIG9wZXJhbmRzOlxuIiwgaSk7CisJICBkZWJ1Z19tcCAoYmFzZSwgLTE2KTsKKwkgIGRlYnVnX21wIChleHAsIC0xNik7CisJICBkZWJ1Z19tcCAobW9kLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAibXB6X3Bvd20gcmVzdWx0OlxuIik7CisJICBkZWJ1Z19tcCAocjEsIC0xNik7CisJICBmcHJpbnRmIChzdGRlcnIsICJtcHpfbHVjYXNfbW9kIHJlc3VsdCAoJWQpIFE9JWxkOlxuIiwgcmVzLCBRKTsKKwkgIGRlYnVnX21wIChyMiwgLTE2KTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChicyk7CisgIG1wel9jbGVhciAoYmFzZSk7CisgIG1wel9jbGVhciAoZXhwKTsKKyAgbXB6X2NsZWFyIChtb2QpOworICBtcHpfY2xlYXIgKHIxKTsKKyAgbXB6X2NsZWFyIChyMik7CisgIG1wel9jbGVhciAodDEpOworICBtcHpfY2xlYXIgKHQyKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCit2b2lkCitkZWJ1Z19tcCAobXB6X3QgeCwgaW50IGJhc2UpCit7CisgIG1wel9vdXRfc3RyIChzdGRlcnIsIGJhc2UsIHgpOyBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LWx1Y251bV91aS5jIGIvdGVzdHMvbXB6L3QtbHVjbnVtX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNDMxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LWx1Y251bV91aS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIFRlc3QgbXB6X2x1Y251bV91aSBhbmQgbXB6X2x1Y251bTJfdWkuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogVXNhZ2U6IHQtbHVjbnVtX3VpIFtuXQorCisgICBUZXN0IHVwIHRvIExbbl0sIG9yIGlmIG4gaXMgb21pdHRlZCB0aGVuIHRoZSBkZWZhdWx0IGxpbWl0IGJlbG93LiAgQQorICAgbGl0ZXJhbCAieCIgZm9yIHRoZSBsaW1pdCBtZWFucyBjb250aW51ZSBmb3JldmVyLCB0aGlzIGJlaW5nIG1lYW50IG9ubHkKKyAgIGZvciBkZXZlbG9wbWVudC4gICovCisKKwordm9pZAorY2hlY2tfc2VxdWVuY2UgKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHVuc2lnbmVkIGxvbmcgIG47CisgIHVuc2lnbmVkIGxvbmcgIGxpbWl0ID0gMTAwICogR01QX0xJTUJfQklUUzsKKyAgbXB6X3QgICAgICAgICAgd2FudF9sbiwgd2FudF9sbjEsIGdvdF9sbiwgZ290X2xuMTsKKworICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAneCcpCisgICAgbGltaXQgPSBVTE9OR19NQVg7CisgIGVsc2UKKyAgICBURVNUU19SRVBTIChsaW1pdCwgYXJndiwgYXJnYyk7CisKKyAgLyogc3RhcnQgYXQgbj09MCAqLworICBtcHpfaW5pdF9zZXRfc2kgKHdhbnRfbG4xLCAtMSk7IC8qIExbLTFdICovCisgIG1wel9pbml0X3NldF91aSAod2FudF9sbiwgIDIpOyAgLyogTFswXSAgICovCisgIG1wel9pbml0IChnb3RfbG4pOworICBtcHpfaW5pdCAoZ290X2xuMSk7CisKKyAgZm9yIChuID0gMDsgbiA8IGxpbWl0OyBuKyspCisgICAgeworICAgICAgbXB6X2x1Y251bTJfdWkgKGdvdF9sbiwgZ290X2xuMSwgbik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3RfbG4pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoZ290X2xuMSk7CisgICAgICBpZiAobXB6X2NtcCAoZ290X2xuLCB3YW50X2xuKSAhPSAwIHx8IG1wel9jbXAgKGdvdF9sbjEsIHdhbnRfbG4xKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXB6X2x1Y251bTJfdWkoJWx1KSB3cm9uZ1xuIiwgbik7CisgICAgICAgICAgbXB6X3RyYWNlICgid2FudCBsbiAiLCB3YW50X2xuKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCJnb3QgIGxuICIsICBnb3RfbG4pOworICAgICAgICAgIG1wel90cmFjZSAoIndhbnQgbG4xIiwgd2FudF9sbjEpOworICAgICAgICAgIG1wel90cmFjZSAoImdvdCAgbG4xIiwgIGdvdF9sbjEpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIG1wel9sdWNudW1fdWkgKGdvdF9sbiwgbik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3RfbG4pOworICAgICAgaWYgKG1wel9jbXAgKGdvdF9sbiwgd2FudF9sbikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9sdWNudW1fdWkoJWx1KSB3cm9uZ1xuIiwgbik7CisgICAgICAgICAgbXB6X3RyYWNlICgid2FudCBsbiIsIHdhbnRfbG4pOworICAgICAgICAgIG1wel90cmFjZSAoImdvdCAgbG4iLCBnb3RfbG4pOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIG1wel9hZGQgKHdhbnRfbG4xLCB3YW50X2xuMSwgd2FudF9sbik7ICAvKiBMW24rMV0gPSBMW25dICsgTFtuLTFdICovCisgICAgICBtcHpfc3dhcCAod2FudF9sbjEsIHdhbnRfbG4pOworICAgIH0KKworICBtcHpfY2xlYXIgKHdhbnRfbG4pOworICBtcHpfY2xlYXIgKHdhbnRfbG4xKTsKKyAgbXB6X2NsZWFyIChnb3RfbG4pOworICBtcHpfY2xlYXIgKGdvdF9sbjEpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gLTE2OworCisgIGNoZWNrX3NlcXVlbmNlIChhcmdjLCBhcmd2KTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtbWZhY191aXVpLmMgYi90ZXN0cy9tcHovdC1tZmFjX3VpdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmNhMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtbWZhY191aXVpLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIEV4ZXJjaXNlIG1wel9tZmFjX3VpdWkuCisKK0NvcHlyaWdodCAyMDAwLTIwMDIsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBVc2FnZTogdC1tZmFjX3VpdWkgW3h8bnVtXQorCisgICBXaXRoIG5vIGFyZ3VtZW50cyB0ZXN0aW5nIGdvZXMgdXAgdG8gdGhlIGluaXRpYWwgdmFsdWUgb2YgImxpbWl0IiBiZWxvdy4KKyAgIFdpdGggYSBudW1iZXIgYXJndW1lbnQgdGVzdHMgYXJlIGNhcnJpZWQgdGhhdCBmYXIsIG9yIHdpdGggYSBsaXRlcmFsICJ4IgorICAgdGVzdHMgYXJlIGNvbnRpbnVlZCB3aXRob3V0IGxpbWl0ICh0aGlzIGJlaW5nIG1lYW50IG9ubHkgZm9yIGRldmVsb3BtZW50CisgICBwdXJwb3NlcykuICAqLworCisjZGVmaW5lIE1VTFRJRkFDX1dIRUVMICgyKjMqMTEpCisjZGVmaW5lIE1VTFRJRkFDX1dIRUVMMiAoNSoxMykKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBtcHpfdCByZWZbTVVMVElGQUNfV0hFRUxdLCByZWYyW01VTFRJRkFDX1dIRUVMMl0sIHJlczsKKyAgdW5zaWduZWQgbG9uZyBuLCBqLCBtLCBtMjsKKyAgdW5zaWduZWQgbG9uZyBsaW1pdCA9IDIyMjIsIHN0ZXAgPSAxOworCisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGlmIChhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICd4JykKKyAgICBsaW1pdCA9IFVMT05HX01BWDsKKyAgZWxzZQorICAgIFRFU1RTX1JFUFMgKGxpbWl0LCBhcmd2LCBhcmdjKTsKKworICAvKiBmb3Igc21hbGwgbGltYiB0ZXN0aW5nICovCisgIGxpbWl0ID0gTUlOIChsaW1pdCwgTVBfTElNQl9UX01BWCk7CisKKyAgZm9yIChtID0gMDsgbSA8IE1VTFRJRkFDX1dIRUVMOyBtKyspCisgICAgbXB6X2luaXRfc2V0X3VpKHJlZiBbbV0sMSk7CisgIGZvciAobTIgPSAwOyBtMiA8IE1VTFRJRkFDX1dIRUVMMjsgbTIrKykKKyAgICBtcHpfaW5pdF9zZXRfdWkocmVmMiBbbTJdLDEpOworCisgIG1wel9pbml0IChyZXMpOworCisgIG0gPSAwOworICBtMiA9IDA7CisgIGZvciAobiA9IDA7IG4gPD0gbGltaXQ7KQorICAgIHsKKyAgICAgIG1wel9tZmFjX3VpdWkgKHJlcywgbiwgTVVMVElGQUNfV0hFRUwpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzKTsKKyAgICAgIGlmIChtcHpfY21wIChyZWZbbV0sIHJlcykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9tZmFjX3VpdWkoJWx1LCVkKSB3cm9uZ1xuIiwgbiwgTVVMVElGQUNfV0hFRUwpOworICAgICAgICAgIHByaW50ZiAoIiAgZ290ICAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHJlcyk7IHByaW50ZigiXG4iKTsKKyAgICAgICAgICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZWZbbV0pOyBwcmludGYoIlxuIik7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICAgIG1wel9tZmFjX3VpdWkgKHJlcywgbiwgTVVMVElGQUNfV0hFRUwyKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHJlcyk7CisgICAgICBpZiAobXB6X2NtcCAocmVmMlttMl0sIHJlcykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9tZmFjX3VpdWkoJWx1LCVkKSB3cm9uZ1xuIiwgbiwgTVVMVElGQUNfV0hFRUwyKTsKKyAgICAgICAgICBwcmludGYgKCIgIGdvdCAgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZXMpOyBwcmludGYoIlxuIik7CisgICAgICAgICAgcHJpbnRmICgiICB3YW50ICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgcmVmMlttMl0pOyBwcmludGYoIlxuIik7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICAgIGlmIChuICsgc3RlcCA8PSBsaW1pdCkKKwlmb3IgKGogPSAwOyBqIDwgc3RlcDsgaisrKSB7CisJICBuKys7IG0rKzsgbTIrKzsKKwkgIGlmIChtID49IE1VTFRJRkFDX1dIRUVMKSBtIC09IE1VTFRJRkFDX1dIRUVMOworCSAgaWYgKG0yID49IE1VTFRJRkFDX1dIRUVMMikgbTIgLT0gTVVMVElGQUNfV0hFRUwyOworCSAgbXB6X211bF91aSAocmVmW21dLCByZWZbbV0sIG4pOyAvKiBDb21wdXRlIGEgcmVmZXJlbmNlLCB3aXRoIGN1cnJlbnQgbGlicmFyeSAqLworCSAgbXB6X211bF91aSAocmVmMlttMl0sIHJlZjJbbTJdLCBuKTsgLyogQ29tcHV0ZSBhIHJlZmVyZW5jZSwgd2l0aCBjdXJyZW50IGxpYnJhcnkgKi8KKwl9CisgICAgICBlbHNlIG4gKz0gc3RlcDsKKyAgICB9CisgIG1wel9mYWNfdWkgKHJlZlswXSwgbik7CisgIG1wel9tZmFjX3VpdWkgKHJlcywgbiwgMSk7CisgIE1QWl9DSEVDS19GT1JNQVQgKHJlcyk7CisgIGlmIChtcHpfY21wIChyZWZbMF0sIHJlcykgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfbWZhY191aXVpKCVsdSwxKSB3cm9uZ1xuIiwgbik7CisgICAgICBwcmludGYgKCIgIGdvdCAgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZXMpOyBwcmludGYoIlxuIik7CisgICAgICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZWZbMF0pOyBwcmludGYoIlxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbXB6XzJmYWNfdWkgKHJlZlswXSwgbik7CisgIG1wel9tZmFjX3VpdWkgKHJlcywgbiwgMik7CisgIE1QWl9DSEVDS19GT1JNQVQgKHJlcyk7CisgIGlmIChtcHpfY21wIChyZWZbMF0sIHJlcykgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfbWZhY191aXVpKCVsdSwxKSB3cm9uZ1xuIiwgbik7CisgICAgICBwcmludGYgKCIgIGdvdCAgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZXMpOyBwcmludGYoIlxuIik7CisgICAgICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByZWZbMF0pOyBwcmludGYoIlxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbisrOworICBtcHpfMmZhY191aSAocmVmWzBdLCBuKTsKKyAgbXB6X21mYWNfdWl1aSAocmVzLCBuLCAyKTsKKyAgTVBaX0NIRUNLX0ZPUk1BVCAocmVzKTsKKyAgaWYgKG1wel9jbXAgKHJlZlswXSwgcmVzKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9tZmFjX3VpdWkoJWx1LDIpIHdyb25nXG4iLCBuKTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHJlcyk7IHByaW50ZigiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgd2FudCAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHJlZlswXSk7IHByaW50ZigiXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBmb3IgKG0gPSAwOyBtIDwgTVVMVElGQUNfV0hFRUw7IG0rKykKKyAgICBtcHpfY2xlYXIgKHJlZlttXSk7CisgIGZvciAobTIgPSAwOyBtMiA8IE1VTFRJRkFDX1dIRUVMMjsgbTIrKykKKyAgICBtcHpfY2xlYXIgKHJlZjJbbTJdKTsKKyAgbXB6X2NsZWFyIChyZXMpOworCisgIHRlc3RzX2VuZCAoKTsKKworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LW11bC5jIGIvdGVzdHMvbXB6L3QtbXVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjMjJlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LW11bC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiBUZXN0IG1wel9jbXAsIG1wel9tdWwuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGRlYnVnX21wIChtcHpfdCk7CitzdGF0aWMgdm9pZCByZWZtcHpfbXVsIChtcHpfdCwgY29uc3QgbXB6X3QsIGNvbnN0IG1wel90KTsKK3ZvaWQgZHVtcF9hYm9ydCAoaW50LCBjb25zdCBjaGFyICosIG1wel90LCBtcHpfdCwgbXB6X3QsIG1wel90KTsKKworI2RlZmluZSBGRlRfTUlOX0JJVFNJWkUgMTAwMDAwCisKK2NoYXIgKmV4dHJhX2ZmdDsKKwordm9pZAorb25lIChpbnQgaSwgbXB6X3QgbXVsdGlwbGljYW5kLCBtcHpfdCBtdWx0aXBsaWVyKQoreworICBtcHpfdCBwcm9kdWN0LCByZWZfcHJvZHVjdDsKKworICBtcHpfaW5pdCAocHJvZHVjdCk7CisgIG1wel9pbml0IChyZWZfcHJvZHVjdCk7CisKKyAgLyogVGVzdCBwbGFpbiBtdWx0aXBsaWNhdGlvbiBjb21wYXJpbmcgcmVzdWx0cyBhZ2FpbnN0IHJlZmVyZW5jZSBjb2RlLiAgKi8KKyAgbXB6X211bCAocHJvZHVjdCwgbXVsdGlwbGllciwgbXVsdGlwbGljYW5kKTsKKyAgcmVmbXB6X211bCAocmVmX3Byb2R1Y3QsIG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCk7CisgIGlmIChtcHpfY21wIChwcm9kdWN0LCByZWZfcHJvZHVjdCkpCisgICAgZHVtcF9hYm9ydCAoaSwgImluY29ycmVjdCBwbGFpbiBwcm9kdWN0IiwKKwkJbXVsdGlwbGllciwgbXVsdGlwbGljYW5kLCBwcm9kdWN0LCByZWZfcHJvZHVjdCk7CisKKyAgLyogVGVzdCBzcXVhcmluZywgY29tcGFyaW5nIHJlc3VsdHMgYWdhaW5zdCBwbGFpbiBtdWx0aXBsaWNhdGlvbiAgKi8KKyAgbXB6X211bCAocHJvZHVjdCwgbXVsdGlwbGllciwgbXVsdGlwbGllcik7CisgIG1wel9zZXQgKG11bHRpcGxpY2FuZCwgbXVsdGlwbGllcik7CisgIG1wel9tdWwgKHJlZl9wcm9kdWN0LCBtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpOworICBpZiAobXB6X2NtcCAocHJvZHVjdCwgcmVmX3Byb2R1Y3QpKQorICAgIGR1bXBfYWJvcnQgKGksICJpbmNvcnJlY3Qgc3F1YXJlIHByb2R1Y3QiLAorCQltdWx0aXBsaWVyLCBtdWx0aXBsaWVyLCBwcm9kdWN0LCByZWZfcHJvZHVjdCk7CisKKyAgbXB6X2NsZWFyIChwcm9kdWN0KTsKKyAgbXB6X2NsZWFyIChyZWZfcHJvZHVjdCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCBvcDEsIG9wMjsKKyAgaW50IGk7CisgIGludCBmZnRfbWF4XzJleHA7CisKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZSwgZnNpemVfcmFuZ2U7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIHJhbmRzID0gUkFORFM7CisKKyAgZXh0cmFfZmZ0ID0gZ2V0ZW52ICgiR01QX0NIRUNLX0ZGVCIpOworICBmZnRfbWF4XzJleHAgPSAwOworICBpZiAoZXh0cmFfZmZ0ICE9IE5VTEwpCisgICAgeworICAgICAgZmZ0X21heF8yZXhwID0gYXRvaSAoZXh0cmFfZmZ0KTsKKyAgICAgIHByaW50ZiAoIkdNUF9DSEVDS19GRlQ9JWQgKGluY2x1ZGUgdGhpcyBpbiBidWcgcmVwb3J0cylcbiIsIGZmdF9tYXhfMmV4cCk7CisgICAgfQorCisgIGlmIChmZnRfbWF4XzJleHAgPD0gMSkJLyogY29tcGF0IHdpdGggb2xkIHVzZSBvZiBHTVBfQ0hFQ0tfRkZUICovCisgICAgZmZ0X21heF8yZXhwID0gMjI7CQkvKiBkZWZhdWx0IGxpbWl0LCBnb29kIGZvciBhbnkgbWFjaGluZSAqLworCisgIG1wel9pbml0IChicyk7CisgIG1wel9pbml0IChvcDEpOworICBtcHpfaW5pdCAob3AyKTsKKworICBmc2l6ZV9yYW5nZSA9IDQgPDwgODsJCS8qIGEgZnJhY3Rpb24gMS8yNTYgb2Ygc2l6ZV9yYW5nZSAqLworICBmb3IgKGkgPSAwOzsgaSsrKQorICAgIHsKKyAgICAgIHNpemVfcmFuZ2UgPSBmc2l6ZV9yYW5nZSA+PiA4OworICAgICAgZnNpemVfcmFuZ2UgPSBmc2l6ZV9yYW5nZSAqIDMzIC8gMzI7CisKKyAgICAgIGlmIChzaXplX3JhbmdlID4gZmZ0X21heF8yZXhwKQorCWJyZWFrOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMSwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSk7CisgICAgICBpZiAoaSAmIDEpCisJbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgbXB6X3JyYW5kb21iIChvcDIsIHJhbmRzLCBtcHpfZ2V0X3VpIChicykpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgNCk7CisgICAgICBic2kgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBpZiAoKGJzaSAmIDB4MykgPT0gMCkKKwltcHpfbmVnIChvcDEsIG9wMSk7CisgICAgICBpZiAoKGJzaSAmIDB4QykgPT0gMCkKKwltcHpfbmVnIChvcDIsIG9wMik7CisKKyAgICAgIC8qIHByaW50ZiAoIiVkICVkXG4iLCBTSVogKG9wMSksIFNJWiAob3AyKSk7ICovCisgICAgICBvbmUgKGksIG9wMiwgb3AxKTsKKyAgICB9CisKKyAgZm9yIChpID0gLTUwOyBpIDwgMDsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgZmZ0X21heF8yZXhwOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMSwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSArIEZGVF9NSU5fQklUU0laRSk7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisgICAgICBtcHpfcnJhbmRvbWIgKG9wMiwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSArIEZGVF9NSU5fQklUU0laRSk7CisKKyAgICAgIC8qIHByaW50ZiAoIiVkOiAlZCAlZFxuIiwgaSwgU0laIChvcDEpLCBTSVogKG9wMikpOyAqLworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgb25lICgtMSwgb3AyLCBvcDEpOworICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChvcDEpOworICBtcHpfY2xlYXIgKG9wMik7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3JlZm1wel9tdWwgKG1wel90IHcsIGNvbnN0IG1wel90IHUsIGNvbnN0IG1wel90IHYpCit7CisgIG1wX3NpemVfdCB1c2l6ZSA9IHUtPl9tcF9zaXplOworICBtcF9zaXplX3QgdnNpemUgPSB2LT5fbXBfc2l6ZTsKKyAgbXBfc2l6ZV90IHdzaXplOworICBtcF9zaXplX3Qgc2lnbl9wcm9kdWN0OworICBtcF9wdHIgdXAsIHZwOworICBtcF9wdHIgd3A7CisgIG1wX3NpemVfdCB0YWxsb2M7CisKKyAgc2lnbl9wcm9kdWN0ID0gdXNpemUgXiB2c2l6ZTsKKyAgdXNpemUgPSBBQlMgKHVzaXplKTsKKyAgdnNpemUgPSBBQlMgKHZzaXplKTsKKworICBpZiAodXNpemUgPT0gMCB8fCB2c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIFNJWiAodykgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0YWxsb2MgPSB1c2l6ZSArIHZzaXplOworCisgIHVwID0gdS0+X21wX2Q7CisgIHZwID0gdi0+X21wX2Q7CisKKyAgd3AgPSBfX0dNUF9BTExPQ0FURV9GVU5DX0xJTUJTICh0YWxsb2MpOworCisgIGlmICh1c2l6ZSA+IHZzaXplKQorICAgIHJlZm1wbl9tdWwgKHdwLCB1cCwgdXNpemUsIHZwLCB2c2l6ZSk7CisgIGVsc2UKKyAgICByZWZtcG5fbXVsICh3cCwgdnAsIHZzaXplLCB1cCwgdXNpemUpOworICB3c2l6ZSA9IHVzaXplICsgdnNpemU7CisgIHdzaXplIC09IHdwW3dzaXplIC0gMV0gPT0gMDsKKyAgTVBaX1JFQUxMT0MgKHcsIHdzaXplKTsKKyAgTVBOX0NPUFkgKFBUUih3KSwgd3AsIHdzaXplKTsKKworICBTSVoodykgPSBzaWduX3Byb2R1Y3QgPCAwID8gLXdzaXplIDogd3NpemU7CisgIF9fR01QX0ZSRUVfRlVOQ19MSU1CUyAod3AsIHRhbGxvYyk7Cit9CisKK3ZvaWQKK2R1bXBfYWJvcnQgKGludCBpLCBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgbXB6X3Qgb3AxLCBtcHpfdCBvcDIsIG1wel90IHByb2R1Y3QsIG1wel90IHJlZl9wcm9kdWN0KQoreworICBtcF9zaXplX3QgYiwgZTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzIGluIHRlc3QgJWRcbiIsIHMsIGkpOworICBmcHJpbnRmIChzdGRlcnIsICJvcDEgICAgICAgICAgPSAiKTsgZGVidWdfbXAgKG9wMSk7CisgIGZwcmludGYgKHN0ZGVyciwgIm9wMiAgICAgICAgICA9ICIpOyBkZWJ1Z19tcCAob3AyKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiICAgIHByb2R1Y3QgID0gIik7IGRlYnVnX21wIChwcm9kdWN0KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAicmVmX3Byb2R1Y3QgID0gIik7IGRlYnVnX21wIChyZWZfcHJvZHVjdCk7CisgIGZvciAoYiA9IDA7IGIgPCBBQlNJWihyZWZfcHJvZHVjdCk7IGIrKykKKyAgICBpZiAoUFRSKHJlZl9wcm9kdWN0KVtiXSAhPSBQVFIocHJvZHVjdClbYl0pCisgICAgICBicmVhazsKKyAgZm9yIChlID0gQUJTSVoocmVmX3Byb2R1Y3QpIC0gMTsgZSA+PSAwOyBlLS0pCisgICAgaWYgKFBUUihyZWZfcHJvZHVjdClbZV0gIT0gUFRSKHByb2R1Y3QpW2VdKQorICAgICAgYnJlYWs7CisgIHByaW50ZiAoIkVSUk9SUyBpbiAlbGQtLSVsZFxuIiwgYiwgZSk7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4KQoreworICBzaXplX3Qgc2l6ID0gbXB6X3NpemVpbmJhc2UgKHgsIDE2KTsKKworICBpZiAoc2l6ID4gNjUpCisgICAgeworICAgICAgbXB6X3QgcTsKKyAgICAgIG1wel9pbml0IChxKTsKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAocSwgeCwgNCAqIChtcHpfc2l6ZWluYmFzZSAoeCwgMTYpIC0gMjUpKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICIlWlguLi4iLCBxKTsKKyAgICAgIG1wel90ZGl2X3JfMmV4cCAocSwgeCwgNCAqIDI1KTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICIlMDI1WlggWyVkXVxuIiwgcSwgKGludCkgc2l6KTsKKyAgICAgIG1wel9jbGVhciAocSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIiVaWFxuIiwgeCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtbXVsX2kuYyBiL3Rlc3RzL21wei90LW11bF9pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyZGFlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LW11bF9pLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIFRlc3QgbXB6X211bF91aSBhbmQgbXB6X211bF9zaS4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK21wel90IGdvdCwgd2FudCwgeDsKKwordm9pZAorY29tcGFyZV9zaSAobG9uZyB5KQoreworICBpZiAobXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAgICAoIm1wel9tdWxfc2kgd3JvbmdcbiIpOworICAgICAgbXB6X3RyYWNlICgiICB4IiwgeCk7CisgICAgICBwcmludGYgICAgKCIgIHk9JWxkICgweCVsWClcbiIsIHksIHkpOworICAgICAgbXB6X3RyYWNlICgiICBnb3QgIiwgZ290KTsKKyAgICAgIG1wel90cmFjZSAoIiAgd2FudCIsIHdhbnQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjb21wYXJlX3VpICh1bnNpZ25lZCBsb25nIHkpCit7CisgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICAgICgibXB6X211bF91aSB3cm9uZ1xuIik7CisgICAgICBtcHpfdHJhY2UgKCIgIHgiLCB4KTsKKyAgICAgIHByaW50ZiAgICAoIiAgeT0lbHUgKDB4JWxYKVxuIiwgeSwgeSk7CisgICAgICBtcHpfdHJhY2UgKCIgIGdvdCAiLCBnb3QpOworICAgICAgbXB6X3RyYWNlICgiICB3YW50Iiwgd2FudCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX3NhbXBsZXMgKHZvaWQpCit7CisgIHsKKyAgICBsb25nICB5OworCisgICAgbXB6X3NldF91aSAoeCwgMUwpOworICAgIHkgPSAwOworICAgIG1wel9tdWxfc2kgKGdvdCwgeCwgeSk7CisgICAgbXB6X3NldF9zaSAod2FudCwgeSk7CisgICAgY29tcGFyZV9zaSAoeSk7CisKKyAgICBtcHpfc2V0X3VpICh4LCAxTCk7CisgICAgeSA9IDE7CisgICAgbXB6X211bF9zaSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3NpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3NpICh5KTsKKworICAgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgICB5ID0gLTE7CisgICAgbXB6X211bF9zaSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3NpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3NpICh5KTsKKworICAgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgICB5ID0gTE9OR19NSU47CisgICAgbXB6X211bF9zaSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3NpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3NpICh5KTsKKworICAgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgICB5ID0gTE9OR19NQVg7CisgICAgbXB6X211bF9zaSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3NpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3NpICh5KTsKKyAgfQorCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIHk7CisKKyAgICBtcHpfc2V0X3VpICh4LCAxTCk7CisgICAgeSA9IDA7CisgICAgbXB6X211bF91aSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3VpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3VpICh5KTsKKworICAgIG1wel9zZXRfdWkgKHgsIDFMKTsKKyAgICB5ID0gMTsKKyAgICBtcHpfbXVsX3VpIChnb3QsIHgsIHkpOworICAgIG1wel9zZXRfdWkgKHdhbnQsIHkpOworICAgIGNvbXBhcmVfdWkgKHkpOworCisgICAgbXB6X3NldF91aSAoeCwgMUwpOworICAgIHkgPSBVTE9OR19NQVg7CisgICAgbXB6X211bF91aSAoZ290LCB4LCB5KTsKKyAgICBtcHpfc2V0X3VpICh3YW50LCB5KTsKKyAgICBjb21wYXJlX3VpICh5KTsKKyAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAoZ290KTsKKyAgbXB6X2luaXQgKHdhbnQpOworCisgIGNoZWNrX3NhbXBsZXMgKCk7CisKKyAgbXB6X2NsZWFyICh4KTsKKyAgbXB6X2NsZWFyIChnb3QpOworICBtcHpfY2xlYXIgKHdhbnQpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1uZXh0cHJpbWUuYyBiL3Rlc3RzL21wei90LW5leHRwcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZmJhZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1uZXh0cHJpbWUuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyogVGVzdCBtcHpfbmV4dHByaW1lLgorCitDb3B5cmlnaHQgMjAwOSwgMjAxNSwgMjAxOCwgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordm9pZAorcmVmbXB6X25leHRwcmltZSAobXB6X3B0ciBwLCBtcHpfc3JjcHRyIHQpCit7CisgIG1wel9hZGRfdWkgKHAsIHQsIDFMKTsKKyAgd2hpbGUgKCEgbXB6X3Byb2JhYl9wcmltZV9wIChwLCAxMCkpCisgICAgbXB6X2FkZF91aSAocCwgcCwgMUwpOworfQorCit2b2lkCityZWZtcHpfcHJldnByaW1lIChtcHpfcHRyIHAsIG1wel9zcmNwdHIgdCkKK3sKKyAgaWYgKG1wel9jbXBfdWkodCwgMikgPD0gMCkKKyAgICByZXR1cm47CisKKyAgbXB6X3N1Yl91aSAocCwgdCwgMUwpOworICB3aGlsZSAoISBtcHpfcHJvYmFiX3ByaW1lX3AgKHAsIDEwKSkKKyAgICBtcHpfc3ViX3VpIChwLCBwLCAxTCk7Cit9CisKK3ZvaWQKK3Rlc3RfbGFyZ2VnYXAgKG1wel90IGxvdywgY29uc3QgaW50IGdhcCkKK3sKKyAgbXB6X3QgdCwgbnh0OworICBtcHpfaW5pdCAodCk7CisgIG1wel9pbml0IChueHQpOworCisgIG1wel9uZXh0cHJpbWUobnh0LCBsb3cpOworICBtcHpfc3ViKHQsIG54dCwgbG93KTsKKworICBpZiAobXB6X2NtcF91aSh0LCBnYXApICE9IDApCisgICAgIHsKKyAgICAgIGdtcF9wcmludGYgKCJuZXh0cHJpbWUgZ2FwICVaZCA9PiAlWmQgIT0gJWRcbiIsIGxvdywgbnh0LCBnYXApOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9wcmV2cHJpbWUodCwgbnh0KTsKKyAgaWYgKG1wel9jbXAodCwgbG93KSAhPSAwKQorICAgIHsKKyAgICAgIGdtcF9wcmludGYgKCJwcmV2cHJpbWUgZ2FwICVaZCA9PiAlWmQgIT0gJWRcbiIsIG54dCwgdCwgZ2FwKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBtcHpfY2xlYXIgKHQpOworICBtcHpfY2xlYXIgKG54dCk7Cit9CisKK3ZvaWQKK3Rlc3RfbGFyZ2VnYXBzICgpCit7CisgIG1wel90IG47CisKKyAgbXB6X2luaXQgKG4pOworCisgIC8vIGxhcmdlc3QgZ2FwIHdpdGggc3RhcnQgPCAyXjMyLgorICBtcHpfc2V0X3N0ciAobiwgIjM4NDI2MTA3NzMiLCAxMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDMzNik7CisKKyAgLy8gbGFyZ2VzdCBnYXAgd2l0aCBzdGFydCA8IDJeNjQuCisgIG1wel9zZXRfc3RyIChuLCAiMTgzNjEzNzUzMzQ3ODcwNDY2OTciLCAxMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDE1NTApOworCisgIC8vIHRlc3QgaGlnaCBtZXJpdCBwcmltZWdhcCBpbiB0aGUgUDMwIGRpZ2l0IHJhbmdlLgorICBtcHpfc2V0X3N0ciAobiwgIjMwMDE1NDk2MTkwMjgyMjM4MzA1NTI3NTE5NjciLCAxMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDIxODQpOworCisgIC8vIHRlc3QgaGlnaCBtZXJpdCBwcmltZWdhcCBpbiB0aGUgUDEwMCByYW5nZS4KKyAgbXB6X3ByaW1vcmlhbF91aSAobiwgMjU3KTsKKyAgbXB6X2RpdmV4YWN0X3VpIChuLCBuLCA1NjEwKTsKKyAgbXB6X211bF91aSAobiwgbiwgNDI4MDUxNjAxN1VMKTsKKyAgbXB6X3N1Yl91aSAobiwgbiwgMjU2MCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDkwMDYpOworCisgIC8vIHRlc3QgaGlnaCBtZXJpdCBwcmltZWdhcCBpbiB0aGUgUDIwMCByYW5nZS4KKyAgbXB6X3ByaW1vcmlhbF91aSAobiwgNDA5KTsKKyAgbXB6X2RpdmV4YWN0X3VpIChuLCBuLCAzMCk7CisgIG1wel9tdWxfdWkgKG4sIG4sIDM0ODMzNDc3NzFVTCk7CisgIG1wel9zdWJfdWkgKG4sIG4sIDcwMTYpOworICB0ZXN0X2xhcmdlZ2FwIChuLCAxNTkwMCk7CisKKyAgbXB6X2NsZWFyIChuKTsKK30KKwordm9pZAordGVzdF9iaXRib3VuZGFyaWVzICgpCit7CisgIG1wel90IG47CisgIG1wel9pbml0IChuKTsKKworICBtcHpfc2V0X3N0ciAobiwgIjB4ZmZmMSIsIDApOworICB0ZXN0X2xhcmdlZ2FwIChuLCAxNik7CisKKyAgbXB6X3NldF9zdHIgKG4sICIweGZmZmZmZmZiIiwgMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDIwKTsKKworICBtcHpfc2V0X3N0ciAobiwgIjB4ZmZmZmZmZmZmZmM1IiwgMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDgwKTsKKworICBtcHpfc2V0X3N0ciAobiwgIjB4ZmZmZmZmZmZmZmZmZmZjNSIsIDApOworICB0ZXN0X2xhcmdlZ2FwIChuLCA3Mik7CisKKyAgbXB6X3NldF9zdHIgKG4sICIweGZmZmZmZmZmZmZmZmZmZmZmZmJmIiwgMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDc4KTsKKworICBtcHpfc2V0X3N0ciAobiwgIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmIiwgMCk7CisgIHRlc3RfbGFyZ2VnYXAgKG4sIDc4KTsKKworICBtcHpfc2V0X3N0ciAobiwgIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiNSIsIDApOworICB0ZXN0X2xhcmdlZ2FwIChuLCAxMDApOworCisgIG1wel9zZXRfc3RyIChuLCAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY2MSIsIDApOworICB0ZXN0X2xhcmdlZ2FwIChuLCAyMTApOworCisgIG1wel9zZXRfc3RyIChuLCAiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTMiLCAwKTsKKyAgdGVzdF9sYXJnZWdhcCAobiwgMzcwKTsKKworICBtcHpfY2xlYXIgKG4pOworfQorCit2b2lkCitydW4gKGNvbnN0IGNoYXIgKnN0YXJ0LCBpbnQgcmVwcywgY29uc3QgY2hhciAqZW5kLCBzaG9ydCBkaWZmc1tdKQoreworICBtcHpfdCB4LCB5OworICBpbnQgaTsKKworICBtcHpfaW5pdF9zZXRfc3RyICh4LCBzdGFydCwgMCk7CisgIG1wel9pbml0ICh5KTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel9uZXh0cHJpbWUgKHksIHgpOworICAgICAgbXB6X3N1YiAoeCwgeSwgeCk7CisgICAgICBpZiAoZGlmZnMgIT0gTlVMTCAmJgorCSAgKCEgbXB6X2ZpdHNfc3Nob3J0X3AgKHgpIHx8IGRpZmZzW2ldICE9IChzaG9ydCkgbXB6X2dldF91aSAoeCkpKQorCXsKKwkgIGdtcF9wcmludGYgKCJkaWZmIGxpc3QgZGlzY3JlcGFuY3lcbiIpOworCSAgYWJvcnQgKCk7CisJfQorICAgICAgbXB6X3N3YXAgKHgsIHkpOworICAgIH0KKworICBtcHpfc2V0X3N0ciAoeSwgZW5kLCAwKTsKKworICBpZiAobXB6X2NtcCAoeCwgeSkgIT0gMCkKKyAgICB7CisgICAgICBnbXBfcHJpbnRmICgiZ290ICAlWmRcbiIsIHgpOworICAgICAgZ21wX3ByaW50ZiAoIndhbnQgJVpkXG4iLCB5KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBtcHpfY2xlYXIgKHkpOworICBtcHpfY2xlYXIgKHgpOworfQorCit2b2lkCitydW5fcCAoY29uc3QgY2hhciAqc3RhcnQsIGludCByZXBzLCBjb25zdCBjaGFyICplbmQsIHNob3J0IGRpZmZzW10pCit7CisgIG1wel90IHgsIHk7CisgIGludCBpOworCisgIG1wel9pbml0X3NldF9zdHIgKHgsIGVuZCwgMCk7CisgIG1wel9pbml0ICh5KTsKKworICAvLyBMYXN0IHJlcCBkb2Vzbid0IHNoYXJlIHNhbWUgZGF0YSB3aXRoIG5leHRwcmltZQorICBmb3IgKGkgPSAwOyBpIDwgcmVwcyAtIDE7IGkrKykKKyAgICB7CisgICAgICBtcHpfcHJldnByaW1lICh5LCB4KTsKKyAgICAgIG1wel9zdWIgKHgsIHgsIHkpOworICAgICAgaWYgKGRpZmZzICE9IE5VTEwgJiYKKwkgICghIG1wel9maXRzX3NzaG9ydF9wICh4KSB8fCBkaWZmc1tyZXBzIC0gaSAtIDFdICE9IChzaG9ydCkgbXB6X2dldF91aSAoeCkpKQorCXsKKwkgIGdtcF9wcmludGYgKCJkaWZmIGxpc3QgZGlzY3JlcGFuY3kgJVpkLCAlZCB2cyAlZFxuIiwKKyAgICAgICAgICAgICAgICB5LCBkaWZmc1tpXSwgbXB6X2dldF91aSAoeCkpOworCSAgYWJvcnQgKCk7CisJfQorICAgICAgbXB6X3N3YXAgKHgsIHkpOworICAgIH0KKworICAvLyBzdGFydHMgYXJlbid0IGFsd2F5cyBwcmltZSwgc28gY2hlY2sgdGhhdCByZXN1bHQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCisgIG1wel9wcmV2cHJpbWUoeCwgeCk7CisKKyAgbXB6X3NldF9zdHIoeSwgc3RhcnQsIDApOworICBpZiAobXB6X2NtcCAoeCwgeSkgPiAwKQorICAgIHsKKyAgICAgIGdtcF9wcmludGYgKCJnb3QgICVaZFxuIiwgeCk7CisgICAgICBnbXBfcHJpbnRmICgid2FudCAlWmRcbiIsIHkpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9jbGVhciAoeSk7CisgIG1wel9jbGVhciAoeCk7Cit9CisKKworZXh0ZXJuIHNob3J0IGRpZmYxW107CitleHRlcm4gc2hvcnQgZGlmZjNbXTsKK2V4dGVybiBzaG9ydCBkaWZmNFtdOworZXh0ZXJuIHNob3J0IGRpZmY1W107CitleHRlcm4gc2hvcnQgZGlmZjZbXTsKKwordm9pZAordGVzdF9yZWYgKGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzLCBpbnQgcmVwcywKKyAgICAgICAgICB2b2lkICgqZnVuYykobXB6X3QsIGNvbnN0IG1wel90KSwKKyAgICAgICAgICB2b2lkKCpyZWZfZnVuYykobXB6X3QsIGNvbnN0IG1wel90KSkKK3sKKyAgaW50IGk7CisgIG1wel90IGJzLCB4LCB0ZXN0X3AsIHJlZl9wOworICB1bnNpZ25lZCBsb25nIHNpemVfcmFuZ2U7CisKKyAgbXB6X2luaXQgKGJzKTsKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAodGVzdF9wKTsKKyAgbXB6X2luaXQgKHJlZl9wKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgOCArIDI7IC8qIDAuLjEwMjQgYml0IG9wZXJhbmRzICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoeCwgcmFuZHMsIG1wel9nZXRfdWkgKGJzKSk7CisKKyAgICAgIGZ1bmMgKHRlc3RfcCwgeCk7CisgICAgICByZWZfZnVuYyAocmVmX3AsIHgpOworICAgICAgaWYgKG1wel9jbXAgKHRlc3RfcCwgcmVmX3ApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBnbXBfcHJpbnRmICgic3RhcnQgJVpkXG4iLCB4KTsKKyAgICAgICAgICBnbXBfcHJpbnRmICgiZ290ICAgJVpkXG4iLCB0ZXN0X3ApOworICAgICAgICAgIGdtcF9wcmludGYgKCJ3YW50ICAlWmRcbiIsIHJlZl9wKTsKKwkgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKHgpOworICBtcHpfY2xlYXIgKHRlc3RfcCk7CisgIG1wel9jbGVhciAocmVmX3ApOworfQorCit2b2lkCit0ZXN0X25leHRwcmltZShnbXBfcmFuZHN0YXRlX3B0ciByYW5kcywgaW50IHJlcHMpCit7CisgIHJ1biAoIjIiLCAxMDAwLCAiMHgxZWY3IiwgZGlmZjEpOworCisgIHJ1biAoIjMiLCAxMDAwIC0gMSwgIjB4MWVmNyIsIE5VTEwpOworCisgIHJ1biAoIjB4OGE0Mzg2NmY1Nzc2Y2NkNWIwMjE4NmU5MGQyODk0NmFlYjBlZDkxNCIsIDUwLAorICAgICAgICIweDhhNDM4NjZmNTc3NmNjZDViMDIxODZlOTBkMjg5NDZhZWIwZWVlYzUiLCBkaWZmMyk7CisKKyAgcnVuICgiMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjZDIiwgNTAsIC8qIDJeMTQ4IC0gMTQ4ICovCisgICAgICAgIjB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwYWIiLCBkaWZmNCk7CisKKyAgcnVuICgiMHgxYzJjMjZiZTU1MzE3NTMwMzExZmFjYjY0OGVhMDZiMzU5Yjk2OTcxNWRiODMyOTJhYjhjZjg5OGQ4YjFiIiwgNTAsCisgICAgICAgIjB4MWMyYzI2YmU1NTMxNzUzMDMxMWZhY2I2NDhlYTA2YjM1OWI5Njk3MTVkYjgzMjkyYWI4Y2Y4OThkYTk1NyIsIGRpZmY1KTsKKworICBydW4gKCIweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjgwIiwgNTAsIC8qIDJeMTI4IC0gMTI4ICovCisgICAgICAgIjB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNTVCIiwgZGlmZjYpOworCisgIHRlc3RfcmVmKAorICAgICAgcmFuZHMsIHJlcHMsCisgICAgICAodm9pZCAoKikobXB6X3QsIGNvbnN0IG1wel90KSkgbXB6X25leHRwcmltZSwKKyAgICAgIHJlZm1wel9uZXh0cHJpbWUpOworfQorCit2b2lkCit0ZXN0X3ByZXZwcmltZSAoZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMsIGludCByZXBzKQoreworICBsb25nIGk7CisgIGludCByZXR2YWw7CisgIG1wel90IG4sIHBydnA7CisKKyAgbXB6X2luaXQgKG4pOworICBtcHpfaW5pdCAocHJ2cCk7CisKKyAgLyogVGVzdCBtcHpfcHJldnByaW1lKG4gPD0gMikgcmV0dXJucyAwLCBsZWF2ZXMgcm9wIHVuY2hhbmdlZC4gKi8KKyAgeworICAgIGludCB0ZW1wID0gMTIzOworICAgIG1wel9zZXRfdWkgKHBydnAsIHRlbXApOworICAgIGZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKQorICAgICAgeworICAgICAgICBtcHpfc2V0X3NpKG4sIGkpOworICAgICAgICByZXR2YWwgPSBtcHpfcHJldnByaW1lIChwcnZwLCBuKTsKKyAgICAgICAgaWYgKCByZXR2YWwgIT0gMCB8fCBtcHpfY21wX3VpIChwcnZwLCB0ZW1wKSAhPSAwICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBnbXBfcHJpbnRmICgibXB6X3ByZXZwcmltZSglWmQpIHJldHVybiAoJWQpIHJvcCAoJVpkKVxuIiwgbiwgcmV0dmFsLCBwcnZwKTsKKyAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIG1wel9jbGVhciAobik7CisgIG1wel9jbGVhciAocHJ2cCk7CisKKyAgcnVuX3AgKCIyIiwgMTAwMCwgIjB4MWVmNyIsIGRpZmYxKTsKKworICBydW5fcCAoIjMiLCAxMDAwIC0gMSwgIjB4MWVmNyIsIE5VTEwpOworCisgIHJ1bl9wICgiMHg4YTQzODY2ZjU3NzZjY2Q1YjAyMTg2ZTkwZDI4OTQ2YWViMGVkOTE0IiwgNTAsCisgICAgICAgICAiMHg4YTQzODY2ZjU3NzZjY2Q1YjAyMTg2ZTkwZDI4OTQ2YWViMGVlZWM1IiwgZGlmZjMpOworCisgIHJ1bl9wICgiMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjZDIiwgNTAsIC8qIDJeMTQ4IC0gMTQ4ICovCisgICAgICAgICAiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBhYiIsIGRpZmY0KTsKKworICBydW5fcCAoIjB4MWMyYzI2YmU1NTMxNzUzMDMxMWZhY2I2NDhlYTA2YjM1OWI5Njk3MTVkYjgzMjkyYWI4Y2Y4OThkOGIxYiIsIDUwLAorICAgICAgICAgIjB4MWMyYzI2YmU1NTMxNzUzMDMxMWZhY2I2NDhlYTA2YjM1OWI5Njk3MTVkYjgzMjkyYWI4Y2Y4OThkYTk1NyIsIGRpZmY1KTsKKworICBydW5fcCAoIjB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGODAiLCA1MCwgLyogMl4xMjggLSAxMjggKi8KKyAgICAgICAgICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU1QiIsIGRpZmY2KTsKKworICAvLyBDYXN0IGF3YXkgaW50IHJldHVybiBmcm9tIG1wel9wcmV2cHJpbWUgZm9yIHRlc3QgcmVmLgorICB0ZXN0X3JlZigKKyAgICAgIHJhbmRzLCByZXBzLAorICAgICAgKHZvaWQgKCopKG1wel90LCBjb25zdCBtcHpfdCkpIG1wel9wcmV2cHJpbWUsCisgICAgICByZWZtcHpfcHJldnByaW1lKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBpbnQgcmVwcyA9IDIwOworCisgIHRlc3RzX3N0YXJ0KCk7CisKKyAgcmFuZHMgPSBSQU5EUzsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgdGVzdF9uZXh0cHJpbWUocmFuZHMsIHJlcHMpOworICB0ZXN0X3ByZXZwcmltZShyYW5kcywgcmVwcyk7CisKKyAgdGVzdF9sYXJnZWdhcHMgKCk7CisgIHRlc3RfYml0Ym91bmRhcmllcyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIHJldHVybiAwOworfQorCitzaG9ydCBkaWZmMVtdID0KK3sKKyAgMSwyLDIsNCwyLDQsMiw0LDYsMiw2LDQsMiw0LDYsNiwKKyAgMiw2LDQsMiw2LDQsNiw4LDQsMiw0LDIsNCwxNCw0LDYsCisgIDIsMTAsMiw2LDYsNCw2LDYsMiwxMCwyLDQsMiwxMiwxMiw0LAorICAyLDQsNiwyLDEwLDYsNiw2LDIsNiw0LDIsMTAsMTQsNCwyLAorICA0LDE0LDYsMTAsMiw0LDYsOCw2LDYsNCw2LDgsNCw4LDEwLAorICAyLDEwLDIsNiw0LDYsOCw0LDIsNCwxMiw4LDQsOCw0LDYsCisgIDEyLDIsMTgsNiwxMCw2LDYsMiw2LDEwLDYsNiwyLDYsNiw0LAorICAyLDEyLDEwLDIsNCw2LDYsMiwxMiw0LDYsOCwxMCw4LDEwLDgsCisgIDYsNiw0LDgsNiw0LDgsNCwxNCwxMCwxMiwyLDEwLDIsNCwyLAorICAxMCwxNCw0LDIsNCwxNCw0LDIsNCwyMCw0LDgsMTAsOCw0LDYsCisgIDYsMTQsNCw2LDYsOCw2LDEyLDQsNiwyLDEwLDIsNiwxMCwyLAorICAxMCwyLDYsMTgsNCwyLDQsNiw2LDgsNiw2LDIyLDIsMTAsOCwKKyAgMTAsNiw2LDgsMTIsNCw2LDYsMiw2LDEyLDEwLDE4LDIsNCw2LAorICAyLDYsNCwyLDQsMTIsMiw2LDM0LDYsNiw4LDE4LDEwLDE0LDQsCisgIDIsNCw2LDgsNCwyLDYsMTIsMTAsMiw0LDIsNCw2LDEyLDEyLAorICA4LDEyLDYsNCw2LDgsNCw4LDQsMTQsNCw2LDIsNCw2LDIsCisgIDYsMTAsMjAsNiw0LDIsMjQsNCwyLDEwLDEyLDIsMTAsOCw2LDYsCisgIDYsMTgsNiw0LDIsMTIsMTAsMTIsOCwxNiwxNCw2LDQsMiw0LDIsCisgIDEwLDEyLDYsNiwxOCwyLDE2LDIsMjIsNiw4LDYsNCwyLDQsOCwKKyAgNiwxMCwyLDEwLDE0LDEwLDYsMTIsMiw0LDIsMTAsMTIsMiwxNiwyLAorICA2LDQsMiwxMCw4LDE4LDI0LDQsNiw4LDE2LDIsNCw4LDE2LDIsCisgIDQsOCw2LDYsNCwxMiwyLDIyLDYsMiw2LDQsNiwxNCw2LDQsCisgIDIsNiw0LDYsMTIsNiw2LDE0LDQsNiwxMiw4LDYsNCwyNiwxOCwKKyAgMTAsOCw0LDYsMiw2LDIyLDEyLDIsMTYsOCw0LDEyLDE0LDEwLDIsCisgIDQsOCw2LDYsNCwyLDQsNiw4LDQsMiw2LDEwLDIsMTAsOCwKKyAgNCwxNCwxMCwxMiwyLDYsNCwyLDE2LDE0LDQsNiw4LDYsNCwxOCwKKyAgOCwxMCw2LDYsOCwxMCwxMiwxNCw0LDYsNiwyLDI4LDIsMTAsOCwKKyAgNCwxNCw0LDgsMTIsNiwxMiw0LDYsMjAsMTAsMiwxNiwyNiw0LDIsCisgIDEyLDYsNCwxMiw2LDgsNCw4LDIyLDIsNCwyLDEyLDI4LDIsNiwKKyAgNiw2LDQsNiwyLDEyLDQsMTIsMiwxMCwyLDE2LDIsMTYsNiwyMCwKKyAgMTYsOCw0LDIsNCwyLDIyLDgsMTIsNiwxMCwyLDQsNiwyLDYsCisgIDEwLDIsMTIsMTAsMiwxMCwxNCw2LDQsNiw4LDYsNiwxNiwxMiwyLAorICA0LDE0LDYsNCw4LDEwLDgsNiw2LDIyLDYsMiwxMCwxNCw0LDYsCisgIDE4LDIsMTAsMTQsNCwyLDEwLDE0LDQsOCwxOCw0LDYsMiw0LDYsCisgIDIsMTIsNCwyMCwyMiwxMiwyLDQsNiw2LDIsNiwyMiwyLDYsMTYsCisgIDYsMTIsMiw2LDEyLDE2LDIsNCw2LDE0LDQsMiwxOCwyNCwxMCw2LAorICAyLDEwLDIsMTAsMiwxMCw2LDIsMTAsMiwxMCw2LDgsMzAsMTAsMiwKKyAgMTAsOCw2LDEwLDE4LDYsMTIsMTIsMiwxOCw2LDQsNiw2LDE4LDIsCisgIDEwLDE0LDYsNCwyLDQsMjQsMiwxMiw2LDE2LDgsNiw2LDE4LDE2LAorICAyLDQsNiwyLDYsNiwxMCw2LDEyLDEyLDE4LDIsNiw0LDE4LDgsCisgIDI0LDQsMiw0LDYsMiwxMiw0LDE0LDMwLDEwLDYsMTIsMTQsNiwxMCwKKyAgMTIsMiw0LDYsOCw2LDEwLDIsNCwxNCw2LDYsNCw2LDIsMTAsCisgIDIsMTYsMTIsOCwxOCw0LDYsMTIsMiw2LDYsNiwyOCw2LDE0LDQsCisgIDgsMTAsOCwxMiwxOCw0LDIsNCwyNCwxMiw2LDIsMTYsNiw2LDE0LAorICAxMCwxNCw0LDMwLDYsNiw2LDgsNiw0LDIsMTIsNiw0LDIsNiwKKyAgMjIsNiwyLDQsMTgsMiw0LDEyLDIsNiw0LDI2LDYsNiw0LDgsCisgIDEwLDMyLDE2LDIsNiw0LDIsNCwyLDEwLDE0LDYsNCw4LDEwLDYsCisgIDIwLDQsMiw2LDMwLDQsOCwxMCw2LDYsOCw2LDEyLDQsNiwyLAorICA2LDQsNiwyLDEwLDIsMTYsNiwyMCw0LDEyLDE0LDI4LDYsMjAsNCwKKyAgMTgsOCw2LDQsNiwxNCw2LDYsMTAsMiwxMCwxMiw4LDEwLDIsMTAsCisgIDgsMTIsMTAsMjQsMiw0LDgsNiw0LDgsMTgsMTAsNiw2LDIsNiwKKyAgMTAsMTIsMiwxMCw2LDYsNiw4LDYsMTAsNiwyLDYsNiw2LDEwLAorICA4LDI0LDYsMjIsMiwxOCw0LDgsMTAsMzAsOCwxOCw0LDIsMTAsNiwKKyAgMiw2LDQsMTgsOCwxMiwxOCwxNiw2LDIsMTIsNiwxMCwyLDEwLDIsCisgIDYsMTAsMTQsNCwyNCwyLDE2LDIsMTAsMiwxMCwyMCw0LDIsNCw4LAorICAxNiw2LDYsMiwxMiwxNiw4LDQsNiwzMCwyLDEwLDIsNiw0LDYsCisgIDYsOCw2LDQsMTIsNiw4LDEyLDQsMTQsMTIsMTAsMjQsNiwxMiw2LAorICAyLDIyLDgsMTgsMTAsNiwxNCw0LDIsNiwxMCw4LDYsNCw2LDMwLAorICAxNCwxMCwyLDEyLDEwLDIsMTYsMiwxOCwyNCwxOCw2LDE2LDE4LDYsMiwKKyAgMTgsNCw2LDIsMTAsOCwxMCw2LDYsOCw0LDYsMiwxMCwyLDEyLAorICA0LDYsNiwyLDEyLDQsMTQsMTgsNCw2LDIwLDQsOCw2LDQsOCwKKyAgNCwxNCw2LDQsMTQsMTIsNCwyLDMwLDQsMjQsNiw2LDEyLDEyLDE0LAorICA2LDQsMiw0LDE4LDYsMTIsOAorfTsKKworc2hvcnQgZGlmZjNbXSA9Cit7CisgIDMzLDMyLDEzNiwxMTYsMjQsMjIsMTA0LDExNCw3NiwyNzgsMjM4LDE2MiwzNiw0NCwzODgsMTM0LAorICAxMzAsMjYsMzEyLDQyLDEzOCwyOCwyNCw4MCwxMzgsMTA4LDI3MCwxMiwzMzAsMTMwLDk4LDEwMiwKKyAgMTYyLDM0LDM2LDE3MCw5MCwzNCwxNCw2LDI0LDY2LDE1NCwyMTgsNzAsMTMyLDE4OCw4OCwKKyAgODAsODIKK307CisKK3Nob3J0IGRpZmY0W10gPQoreworICAyMzksOTIsNjQsNiwxMDQsMjQsNDYsMjU4LDY4LDE4LDU0LDEwMCw2OCwxNTQsMjYsNCwKKyAgMzgsMTQyLDE2OCw0MiwxOCwyNiwyODYsMTA0LDEzNiwxMTYsNDAsMiwyOCwxMTAsNTIsNzgsCisgIDEwNCwyNCw1NCw5Niw0LDYyNiwxOTYsMjQsNTYsMzYsNTIsMTAyLDQ4LDE1NiwyNiwxOCwKKyAgNDIsNDAKK307CisKK3Nob3J0IGRpZmY1W10gPQoreworICAyNjgsMTIwLDMyMCwxODQsMzk2LDIsOTQsMTA4LDIwLDMxOCwyNzQsMTQsNjQsMTIyLDIyMCwxMDgsCisgIDE4LDE3NCw2LDI0LDM0OCwzMiw2NCwxMTYsMjY4LDE2MiwyMCwxNTYsMjgsMTEwLDUyLDQyOCwKKyAgMTk2LDE0LDI2MiwzMCwxOTQsMTIwLDMwMCw2NiwyNjgsMTIsNDI4LDM3MCwyMTIsMTk4LDE5MiwxMzAsCisgIDMwLDgwCit9OworCitzaG9ydCBkaWZmNltdID0KK3sKKyAgMTc5LDMwLDg0LDEwOCwxMTIsMzYsNDIsMTEwLDUyLDEzMiw2MCwzMCwzMjYsMTE0LDQ5Niw5MiwxMDAsCisgIDI3MiwzNiw1NCw5MCw0LDIsMjQsNDAsMzk4LDE1MCw3Miw2MCwxNiw4LDQsODAsMTYsMiwzNDIsMTEyLAorICAxNCwxMzYsMjM2LDQwLDE4LDUwLDE5MiwxOTgsMjA0LDQwLDI2Niw0MiwyNzQKK307CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1vZGRldmVuLmMgYi90ZXN0cy9tcHovdC1vZGRldmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkYWQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LW9kZGV2ZW4uYwpAQCAtMCwwICsxLDg3IEBACisvKiBUZXN0IG1wel9vZGRfcCBhbmQgbXB6X2V2ZW5fcC4KKworQ29weXJpZ2h0IDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordm9pZAorY2hlY2tfZGF0YSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAgKm47CisgICAgaW50ICAgICAgICAgIG9kZCwgZXZlbjsKKyAgfSBkYXRhW10gPSB7CisgICAgeyAgICIwIiwgMCwgMSB9LAorICAgIHsgICAiMSIsIDEsIDAgfSwKKyAgICB7ICAgIjIiLCAwLCAxIH0sCisgICAgeyAgICIzIiwgMSwgMCB9LAorICAgIHsgICAiNCIsIDAsIDEgfSwKKworICAgIHsgICItNCIsIDAsIDEgfSwKKyAgICB7ICAiLTMiLCAxLCAwIH0sCisgICAgeyAgIi0yIiwgMCwgMSB9LAorICAgIHsgICItMSIsIDEsIDAgfSwKKworICAgIHsgICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAwLCAxIH0sCisgICAgeyAgIjB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsIDEsIDAgfSwKKyAgICB7ICAiMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyIiwgMCwgMSB9LAorICAgIHsgICIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMiLCAxLCAwIH0sCisKKyAgICB7ICItMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0IiwgMCwgMSB9LAorICAgIHsgIi0weDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMiLCAxLCAwIH0sCisgICAgeyAiLTB4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiIsIDAsIDEgfSwKKyAgICB7ICItMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwgMSwgMCB9LAorICB9OworCisgIG1wel90ICBuOworICBpbnQgICAgaTsKKworICBtcHpfaW5pdCAobik7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobiwgZGF0YVtpXS5uLCAwKTsKKworICAgICAgaWYgKChtcHpfb2RkX3AgKG4pICE9IDApICE9IGRhdGFbaV0ub2RkKQorCXsKKwkgIHByaW50ZiAoIm1wel9vZGRfcCB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisJICBhYm9ydCgpOworCX0KKworICAgICAgaWYgKChtcHpfZXZlbl9wIChuKSAhPSAwKSAhPSBkYXRhW2ldLmV2ZW4pCisJeworCSAgcHJpbnRmICgibXB6X2V2ZW5fcCB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisJICBhYm9ydCgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChuKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1wZXJmcG93LmMgYi90ZXN0cy9tcHovdC1wZXJmcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmOWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXBlcmZwb3cuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogVGVzdCBtcHpfcGVyZmVjdF9wb3dlcl9wLgorCisgICBDb250cmlidXRlZCB0byB0aGUgR05VIHByb2plY3QgYnkgVG9yYmpvcm4gR3Jhbmx1bmQgYW5kIE1hcnRpbiBCb2lqLgorCitDb3B5cmlnaHQgMjAwOC0yMDEwLCAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgKm51bV9hc19zdHI7CisgIGNoYXIgd2FudDsKK30gc3RhdGljIHRlc3RzW10gPQorICB7CisgICAgeyAiMCIsIDF9LAorICAgIHsgIjEiLCAxfSwKKyAgICB7Ii0xIiwgMX0sCisgICAgeyAiMiIsIDB9LAorICAgIHsiLTIiLCAwfSwKKyAgICB7ICIzIiwgMH0sCisgICAgeyItMyIsIDB9LAorICAgIHsgIjQiLCAxfSwKKyAgICB7Ii00IiwgMH0sCisgICAgeyAiNjQiLCAxfSwKKyAgICB7Ii02NCIsIDF9LAorICAgIHsgIjEyOCIsIDF9LAorICAgIHsiLTEyOCIsIDF9LAorICAgIHsgIjI1NiIsIDF9LAorICAgIHsiLTI1NiIsIDB9LAorICAgIHsgIjUxMiIsIDF9LAorICAgIHsiLTUxMiIsIDF9LAorICAgIHsgIjB4NDAwMDAwMCIsIDF9LAorICAgIHsiLTB4NDAwMDAwMCIsIDF9LAorICAgIHsgIjB4M2NhYjY0MCIsIDF9LAorICAgIHsiLTB4M2NhYjY0MCIsIDB9LAorICAgIHsgIjB4M2UyMzg0MCIsIDF9LAorICAgIHsiLTB4M2UyMzg0MCIsIDB9LAorICAgIHsgIjB4M2QzYTdlZDEiLCAxfSwKKyAgICB7Ii0weDNkM2E3ZWQxIiwgMX0sCisgICAgeyAiMHgzMGE3YTYwMDAiLCAxfSwKKyAgICB7Ii0weDMwYTdhNjAwMCIsIDF9LAorICAgIHsgIjB4ZjMzZTVhNWE1OSIsIDF9LAorICAgIHsiLTB4ZjMzZTVhNWE1OSIsIDB9LAorICAgIHsgIjB4ZWQxYjExODIxMTgxMzVkIiwgMX0sCisgICAgeyItMHhlZDFiMTE4MjExODEzNWQiLCAxfSwKKyAgICB7ICIweGU3MWY2ZWI3Njg5Y2MyNzZiMmYxIiwgMX0sCisgICAgeyItMHhlNzFmNmViNzY4OWNjMjc2YjJmMSIsIDB9LAorICAgIHsgIjB4MTI2NDQ1MDdmZTc4Y2Y1NjNhNGIzNDJjOTJlN2RhOWZlNWU5OWNiNzVhMDEiLCAxfSwKKyAgICB7Ii0weDEyNjQ0NTA3ZmU3OGNmNTYzYTRiMzQyYzkyZTdkYTlmZTVlOTljYjc1YTAxIiwgMH0sCisgICAgeyAiMHgxZmYyZTdjNTgxYmIwOTUxZGY2NDQ4ODViZDMzZjUwZTQ3MmIwYjczYTIwNGUxM2NiZTk4ZmRiNDI0ZDY2NTYxZTQwMDAwMDAiLCAxfSwKKyAgICB7Ii0weDFmZjJlN2M1ODFiYjA5NTFkZjY0NDg4NWJkMzNmNTBlNDcyYjBiNzNhMjA0ZTEzY2JlOThmZGI0MjRkNjY1NjFlNDAwMDAwMCIsIDF9LAorICAgIHsgIjB4MmI5YjQ0ZGIyZDkxYTZmODE2NWM4YzczMzllZjczNjMzMjI4ZWEyOWUzODg1OTJlODAzNTRlNDM4MDAwNGFhZDg0MDAwMDAwIiwgMX0sCisgICAgeyItMHgyYjliNDRkYjJkOTFhNmY4MTY1YzhjNzMzOWVmNzM2MzMyMjhlYTI5ZTM4ODU5MmU4MDM1NGU0MzgwMDA0YWFkODQwMDAwMDAiLCAxfSwKKyAgICB7ICIweDI4ZDVhMmI4ZjMzMDkxMGE5ZDNjZGEwNjAzNmFlMDU0NjQ0MmU1YjFhODNiMjZhNDM2ZWZlYTViNzI3YmYxYmNiZTdlMTJiNDdkODEiLCAxfSwKKyAgICB7Ii0weDI4ZDVhMmI4ZjMzMDkxMGE5ZDNjZGEwNjAzNmFlMDU0NjQ0MmU1YjFhODNiMjZhNDM2ZWZlYTViNzI3YmYxYmNiZTdlMTJiNDdkODEiLCAxfSwKKyAgICB7TlVMTCwgMH0KKyAgfTsKKworCit2b2lkCitjaGVja190ZXN0cyAoKQoreworICBtcHpfdCB4OworICBpbnQgaTsKKyAgaW50IGdvdCwgd2FudDsKKworICBtcHpfaW5pdCAoeCk7CisKKyAgZm9yIChpID0gMDsgdGVzdHNbaV0ubnVtX2FzX3N0ciAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9zdHIgKHgsIHRlc3RzW2ldLm51bV9hc19zdHIsIDApOworICAgICAgZ290ID0gbXB6X3BlcmZlY3RfcG93ZXJfcCAoeCk7CisgICAgICB3YW50ID0gdGVzdHNbaV0ud2FudDsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJtcHpfcGVyZmVjdF9wb3dlcl9wIHJldHVybnMgJWQgd2hlbiAlZCB3YXMgZXhwZWN0ZWRcbiIsIGdvdCwgd2FudCk7CisJICBmcHJpbnRmIChzdGRlcnIsICJmYXVsdCBvcGVyYW5kOiAlc1xuIiwgdGVzdHNbaV0ubnVtX2FzX3N0cik7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoeCk7Cit9CisKKyNkZWZpbmUgTlJQIDE1CisKK3ZvaWQKK2NoZWNrX3JhbmRvbSAoaW50IHJlcHMpCit7CisgIG1wel90IG4sIG5wLCB0ZW1wLCBwcmltZXNbTlJQXTsKKyAgaW50IGksIGosIGssIHVuaXF1ZSwgZGVzdHJveSwgcmVzOworICB1bnNpZ25lZCBsb25nIGludCBucnByaW1lcywgcHJpbWViaXRzOworICBtcF9saW1iX3QgZywgZXhwW05SUF0sIGU7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworCisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKG4pOworICBtcHpfaW5pdCAobnApOworICBtcHpfaW5pdCAodGVtcCk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5SUDsgaSsrKQorICAgIG1wel9pbml0IChwcmltZXNbaV0pOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChucCwgcmFuZHMsIDMyKTsKKyAgICAgIG5ycHJpbWVzID0gbXB6X2dldF91aSAobnApICUgTlJQICsgMTsgLyogMS1OUlAgdW5pcXVlIHByaW1lcyAqLworCisgICAgICBtcHpfdXJhbmRvbWIgKG5wLCByYW5kcywgMzIpOworICAgICAgZyA9IG1wel9nZXRfdWkgKG5wKSAlIDMyICsgMjsgLyogZ2NkIDItMzMgKi8KKworICAgICAgZm9yIChqID0gMDsgaiA8IG5ycHJpbWVzOykKKwl7CisJICBtcHpfdXJhbmRvbWIgKG5wLCByYW5kcywgMzIpOworCSAgcHJpbWViaXRzID0gbXB6X2dldF91aSAobnApICUgMTAwICsgMzsgLyogMy0xMDIgYml0IHByaW1lcyAqLworCSAgbXB6X3VyYW5kb21iIChwcmltZXNbal0sIHJhbmRzLCBwcmltZWJpdHMpOworCSAgbXB6X25leHRwcmltZSAocHJpbWVzW2pdLCBwcmltZXNbal0pOworCSAgdW5pcXVlID0gMTsKKwkgIGZvciAoayA9IDA7IGsgPCBqOyBrKyspCisJICAgIHsKKwkgICAgICBpZiAobXB6X2NtcCAocHJpbWVzW2pdLCBwcmltZXNba10pID09IDApCisJCXsKKwkJICB1bmlxdWUgPSAwOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGlmICh1bmlxdWUpCisJICAgIHsKKwkgICAgICBtcHpfdXJhbmRvbWIgKG5wLCByYW5kcywgMzIpOworCSAgICAgIGUgPSAzNzEgLyAoMTAgKiBwcmltZWJpdHMpICsgbXB6X2dldF91aSAobnApICUgMTEgKyAxOyAvKiBNYWdpYyBjb25zdGFudHMgKi8KKwkgICAgICBleHBbaisrXSA9IGcgKiBlOworCSAgICB9CisJfQorCisgICAgICBpZiAobnJwcmltZXMgPiAxKQorCXsKKwkgIC8qIERlc3Ryb3kgZCBleHBvbmVudHMsIGQgaW4gWzEsIG5ycHJpbWVzIC0gMV0gKi8KKwkgIGlmIChucnByaW1lcyA9PSAyKQorCSAgICB7CisJICAgICAgZGVzdHJveSA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wel91cmFuZG9tYiAobnAsIHJhbmRzLCAzMik7CisJICAgICAgZGVzdHJveSA9IG1wel9nZXRfdWkgKG5wKSAlIChucnByaW1lcyAtIDIpOworCSAgICB9CisKKwkgIGcgPSBleHBbZGVzdHJveV07CisJICBmb3IgKGsgPSBkZXN0cm95ICsgMTsgayA8IG5ycHJpbWVzOyBrKyspCisJICAgIGcgPSBtcG5fZ2NkXzEgKCZnLCAxLCBleHBba10pOworCisJICBmb3IgKGogPSAwOyBqIDwgZGVzdHJveTsgaisrKQorCSAgICB7CisJICAgICAgbXB6X3VyYW5kb21iIChucCwgcmFuZHMsIDMyKTsKKwkgICAgICBlID0gbXB6X2dldF91aSAobnApICUgNTAgKyAxOworCSAgICAgIHdoaWxlIChtcG5fZ2NkXzEgKCZnLCAxLCBlKSA+IDEpCisJCWUrKzsKKworCSAgICAgIGV4cFtqXSA9IGU7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIENvbXB1dGUgbiAqLworICAgICAgbXB6X3Bvd191aSAobiwgcHJpbWVzWzBdLCBleHBbMF0pOworICAgICAgZm9yIChqID0gMTsgaiA8IG5ycHJpbWVzOyBqKyspCisJeworCSAgbXB6X3Bvd191aSAodGVtcCwgcHJpbWVzW2pdLCBleHBbal0pOworCSAgbXB6X211bCAobiwgbiwgdGVtcCk7CisJfQorCisgICAgICByZXMgPSBtcHpfcGVyZmVjdF9wb3dlcl9wIChuKTsKKworICAgICAgaWYgKG5ycHJpbWVzID09IDEpCisJeworCWlmIChyZXMgPT0gMCAmJiBleHBbMF0gPiAxKQorCSAgeworCSAgICBwcmludGYoIm4gaXMgYSBwZXJmZWN0IHBvd2VyLCBwZXJmcG93X3AgZGlzYWdyZWVzXG4iKTsKKwkgICAgZ21wX3ByaW50ZigibiA9ICVadVxucHJpbWVzWzBdID0gJVp1XG5leHBbMF0gPSAlbHVcbiIsIG4sIHByaW1lc1swXSwgZXhwWzBdKTsKKwkgICAgYWJvcnQgKCk7CisJICB9CisJZWxzZSBpZiAocmVzID09IDEgJiYgZXhwWzBdID09IDEpCisJICB7CisJICAgIGdtcF9wcmludGYoIm4gPSAlWnVcbiIsIG4pOworCSAgICBwcmludGYoIm4gaXMgbm93IGEgcHJpbWUgbnVtYmVyLCBidXQgcGVyZnBvd19wIHN0aWxsIGJlbGlldmVzIG4gaXMgYSBwZXJmZWN0IHBvd2VyXG4iKTsKKwkgICAgYWJvcnQgKCk7CisJICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChyZXMgPT0gMSAmJiBkZXN0cm95ICE9IDApCisJICAgIHsKKwkgICAgICBnbXBfcHJpbnRmKCJuID0gJVp1XG5uIHdhcyBkZXN0cm95ZWQsIGJ1dCBwZXJmcG93X3Agc3RpbGwgYmVsaWV2ZXMgbiBpcyBhIHBlcmZlY3QgcG93ZXJcbiIsIG4pOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBlbHNlIGlmIChyZXMgPT0gMCAmJiBkZXN0cm95ID09IDApCisJICAgIHsKKwkgICAgICBnbXBfcHJpbnRmKCJuID0gJVp1XG5uIGlzIGEgcGVyZmVjdCBwb3dlciwgcGVyZnBvd19wIGRpc2FncmVlc1xuIiwgbik7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIG1wel9jbGVhciAobik7CisgIG1wel9jbGVhciAobnApOworICBtcHpfY2xlYXIgKHRlbXApOworICBmb3IgKGkgPSAwOyBpIDwgTlJQOyBpKyspCisgICAgbXB6X2NsZWFyIChwcmltZXNbaV0pOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IG5fdGVzdHM7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgY2hlY2tfdGVzdHMgKCk7CisKKyAgbl90ZXN0cyA9IDUwMDsKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICBuX3Rlc3RzID0gYXRvaSAoYXJndlsxXSk7CisgIGNoZWNrX3JhbmRvbSAobl90ZXN0cyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXBlcmZzcXIuYyBiL3Rlc3RzL21wei90LXBlcmZzcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjIzNTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtcGVyZnNxci5jCkBAIC0wLDAgKzEsMTU0IEBACisvKiBUZXN0IG1wel9wZXJmZWN0X3NxdWFyZV9wLgorCitDb3B5cmlnaHQgMjAwMC0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2luY2x1ZGUgIm1wbi9wZXJmc3FyLmgiCisKKworLyogY2hlY2tfbW9kdWxvKCkgZXhlcmNpc2VzIG1wel9wZXJmZWN0X3NxdWFyZV9wIG9uIHNxdWFyZXMgd2hpY2ggY292ZXIgZWFjaAorICAgcG9zc2libGUgcXVhZHJhdGljIHJlc2lkdWUgdG8gZWFjaCBkaXZpc29yIHVzZWQgd2l0aGluCisgICBtcG5fcGVyZmVjdF9zcXVhcmVfcCwgZW5zdXJpbmcgdGhvc2UgcmVzaWR1ZXMgYXJlbid0IGluY29ycmVjdGx5IGNsYWltZWQKKyAgIHRvIGJlIG5vbi1yZXNpZHVlcy4KKworICAgRWFjaCBkaXZpc29yIGlzIHRha2VuIHNlcGFyYXRlbHkuICBJdCdzIGFycmFuZ2VkIHRoYXQgbiBpcyBjb25ncnVlbnQgdG8gMAorICAgbW9kdWxvIHRoZSBvdGhlciBkaXZpc29ycywgMCBvZiBjb3Vyc2UgYmVpbmcgYSBxdWFkcmF0aWMgcmVzaWR1ZSB0byBhbnkKKyAgIG1vZHVsdXMuCisKKyAgIFRoZSB2YWx1ZXMgIihqKm90aGVycyleMiIgY292ZXIgYWxsIHF1YWRyYXRpYyByZXNpZHVlcyBtb2QgZGl2aXNvcltpXSwKKyAgIGJ1dCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLiAgaiBpcyBydW4gZnJvbSAxPD1qPD1kaXZpc29yW2ldIHNvIHRoYXQgemVybworICAgaXMgZXhjbHVkZWQuICBBIGxpdGVyYWwgbj09MCBkb2Vzbid0IHJlYWNoIHRoZSByZXNpZHVlIHRlc3RzLiAgKi8KKwordm9pZAorY2hlY2tfbW9kdWxvICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyAgZGl2aXNvcltdID0gUEVSRlNRUl9ESVZJU09SUzsKKyAgdW5zaWduZWQgbG9uZyAgaSwgajsKKworICBtcHpfdCAgYWxsZGl2LCBvdGhlcnMsIG47CisKKyAgbXB6X2luaXQgKGFsbGRpdik7CisgIG1wel9pbml0IChvdGhlcnMpOworICBtcHpfaW5pdCAobik7CisKKyAgLyogcHJvZHVjdCBvZiBhbGwgZGl2aXNvcnMgKi8KKyAgbXB6X3NldF91aSAoYWxsZGl2LCAxTCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGl2aXNvcik7IGkrKykKKyAgICBtcHpfbXVsX3VpIChhbGxkaXYsIGFsbGRpdiwgZGl2aXNvcltpXSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkaXZpc29yKTsgaSsrKQorICAgIHsKKyAgICAgIC8qIHByb2R1Y3Qgb2YgYWxsIGRpdmlzb3JzIGV4Y2VwdCBpICovCisgICAgICBtcHpfc2V0X3VpIChvdGhlcnMsIDFMKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJvZiAoZGl2aXNvcik7IGorKykKKyAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICBtcHpfbXVsX3VpIChvdGhlcnMsIG90aGVycywgZGl2aXNvcltqXSk7CisKKyAgICAgIGZvciAoaiA9IDE7IGogPD0gZGl2aXNvcltpXTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgLyogc3F1YXJlICovCisgICAgICAgICAgbXB6X211bF91aSAobiwgb3RoZXJzLCBqKTsKKyAgICAgICAgICBtcHpfbXVsIChuLCBuLCBuKTsKKyAgICAgICAgICBpZiAoISBtcHpfcGVyZmVjdF9zcXVhcmVfcCAobikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIm1wel9wZXJmZWN0X3NxdWFyZV9wIGdvdCAwLCB3YW50IDFcbiIpOworICAgICAgICAgICAgICBtcHpfdHJhY2UgKCIgIG4iLCBuKTsKKyAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChhbGxkaXYpOworICBtcHpfY2xlYXIgKG90aGVycyk7CisgIG1wel9jbGVhciAobik7Cit9CisKKworLyogRXhlcmNpc2UgbXB6X3BlcmZlY3Rfc3F1YXJlX3AgY29tcGFyZWQgdG8gd2hhdCBtcHpfc3FydCBzYXlzLiAqLwordm9pZAorY2hlY2tfc3FydCAoaW50IHJlcHMpCit7CisgIG1wel90IHgyLCB4MnQsIHg7CisgIG1wX3NpemVfdCB4Mm47CisgIGludCByZXM7CisgIGludCBpOworICAvKiBpbnQgY250ID0gMDsgKi8KKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHMgPSBSQU5EUzsKKyAgbXB6X3QgYnM7CisKKyAgbXB6X2luaXQgKGJzKTsKKworICBtcHpfaW5pdCAoeDIpOworICBtcHpfaW5pdCAoeCk7CisgIG1wel9pbml0ICh4MnQpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDkpOworICAgICAgeDJuID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iICh4MiwgcmFuZHMsIHgybik7CisgICAgICAvKiBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAtMTYsIHgyKTsgcHV0cyAoIiIpOyAqLworCisgICAgICByZXMgPSBtcHpfcGVyZmVjdF9zcXVhcmVfcCAoeDIpOworICAgICAgbXB6X3NxcnQgKHgsIHgyKTsKKyAgICAgIG1wel9tdWwgKHgydCwgeCwgeCk7CisKKyAgICAgIGlmIChyZXMgIT0gKG1wel9jbXAgKHgyLCB4MnQpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICgibXB6X3BlcmZlY3Rfc3F1YXJlX3AgYW5kIG1wel9zcXJ0IGRpZmZlclxuIik7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgeCAgIiwgeCk7CisgICAgICAgICAgbXB6X3RyYWNlICgiICAgeDIgIiwgeDIpOworICAgICAgICAgIG1wel90cmFjZSAoIiAgIHgydCIsIHgydCk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgbXB6X3BlcmZlY3Rfc3F1YXJlX3AgJWRcbiIsIHJlcyk7CisgICAgICAgICAgcHJpbnRmICAgICgiICAgbXB6X3NxcnQgICAgICAgICAgICAgJWRcbiIsIG1wel9jbXAgKHgyLCB4MnQpID09IDApOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIC8qIGNudCArPSByZXMgIT0gMDsgKi8KKyAgICB9CisgIC8qIHByaW50ZiAoIiVkLyVkIHBlcmZlY3Qgc3F1YXJlc1xuIiwgY250LCByZXBzKTsgKi8KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyICh4Mik7CisgIG1wel9jbGVhciAoeCk7CisgIG1wel9jbGVhciAoeDJ0KTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IHJlcHMgPSAyMDAwMDA7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIGNoZWNrX21vZHVsbyAoKTsKKyAgY2hlY2tfc3FydCAocmVwcyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXBvcGNvdW50LmMgYi90ZXN0cy9tcHovdC1wb3Bjb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTJjYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1wb3Bjb3VudC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBUZXN0IG1wel9wb3Bjb3VudC4KKworQ29weXJpZ2h0IDIwMDEsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisKK3ZvaWQKK2NoZWNrX29uZWJpdCAodm9pZCkKK3sKKyAgbXB6X3QgICAgICAgICAgbjsKKyAgdW5zaWduZWQgbG9uZyAgaSwgZ290OworCisgIG1wel9pbml0IChuKTsKKyAgZm9yIChpID0gMDsgaSA8IDUgKiBHTVBfTElNQl9CSVRTOyBpKyspCisgICAgeworICAgICAgbXB6X3NldGJpdCAobiwgaSk7CisgICAgICBnb3QgPSBtcHpfcG9wY291bnQgKG4pOworICAgICAgaWYgKGdvdCAhPSAxKQorCXsKKwkgIHByaW50ZiAoIm1wel9wb3Bjb3VudCB3cm9uZyBvbiBzaW5nbGUgYml0IGF0ICVsdVxuIiwgaSk7CisJICBwcmludGYgKCIgICBnb3QgJWx1LCB3YW50IDFcbiIsIGdvdCk7CisJICBhYm9ydCgpOworCX0KKyAgICAgIG1wel9jbHJiaXQgKG4sIGkpOworICAgIH0KKyAgbXB6X2NsZWFyIChuKTsKK30KKworCit2b2lkCitjaGVja19kYXRhICh2b2lkKQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICAgICAqbjsKKyAgICB1bnNpZ25lZCBsb25nICB3YW50OworICB9IGRhdGFbXSA9IHsKKyAgICB7ICItMSIsIH4gKHVuc2lnbmVkIGxvbmcpIDAgfSwKKyAgICB7ICItMTIzNDU2NzgiLCB+ICh1bnNpZ25lZCBsb25nKSAwIH0sCisgICAgeyAiMCIsIDAgfSwKKyAgICB7ICIxIiwgMSB9LAorICAgIHsgIjMiLCAyIH0sCisgICAgeyAiNSIsIDIgfSwKKyAgICB7ICIweEZGRkYiLCAxNiB9LAorICAgIHsgIjB4RkZGRkZGRkYiLCAzMiB9LAorICAgIHsgIjB4RkZGRkZGRkZGRkZGRkZGRiIsIDY0IH0sCisgICAgeyAiMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsIDEyOCB9LAorICB9OworCisgIHVuc2lnbmVkIGxvbmcgICBnb3Q7CisgIGludCAgICBpOworICBtcHpfdCAgbjsKKworICBtcHpfaW5pdCAobik7CisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAoZGF0YSk7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobiwgZGF0YVtpXS5uLCAwKTsKKyAgICAgIGdvdCA9IG1wel9wb3Bjb3VudCAobik7CisgICAgICBpZiAoZ290ICE9IGRhdGFbaV0ud2FudCkKKwl7CisJICBwcmludGYgKCJtcHpfcG9wY291bnQgd3JvbmcgYXQgZGF0YVslZF1cbiIsIGkpOworCSAgcHJpbnRmICgiICAgbiAgICAgXCIlc1wiXG4iLCBkYXRhW2ldLm4pOworCSAgcHJpbnRmICgiICAgICAgICAgIik7ICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIG4pOyBwcmludGYgKCJcbiIpOworCSAgcHJpbnRmICgiICAgICAgICAgMHgiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIG4pOyBwcmludGYgKCJcbiIpOworCSAgcHJpbnRmICgiICAgZ290ICAgJWx1XG4iLCBnb3QpOworCSAgcHJpbnRmICgiICAgd2FudCAgJWx1XG4iLCBkYXRhW2ldLndhbnQpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgbXB6X2NsZWFyIChuKTsKK30KKwordW5zaWduZWQgbG9uZworcmVmbXB6X3BvcGNvdW50IChtcHpfdCBhcmcpCit7CisgIG1wX3NpemVfdCBuLCBpOworICB1bnNpZ25lZCBsb25nIGNudDsKKyAgbXBfbGltYl90IHg7CisKKyAgbiA9IFNJWihhcmcpOworICBpZiAobiA8IDApCisgICAgcmV0dXJuIH4odW5zaWduZWQgbG9uZykgMDsKKworICBjbnQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIHggPSBQVFIoYXJnKVtpXTsKKyAgICAgIHdoaWxlICh4ICE9IDApCisJeworCSAgY250ICs9ICh4ICYgMSk7CisJICB4ID4+PSAxOworCX0KKyAgICB9CisgIHJldHVybiBjbnQ7Cit9CisKK3ZvaWQKK2NoZWNrX3JhbmRvbSAodm9pZCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICBtcHpfdCBhcmc7CisgIHVuc2lnbmVkIGxvbmcgYXJnX3NpemUsIHNpemVfcmFuZ2U7CisgIHVuc2lnbmVkIGxvbmcgZ290LCByZWY7CisgIGludCBpOworCisgIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGJzKTsKKyAgbXB6X2luaXQgKGFyZyk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMSArIDI7IC8qIDAuLjQwOTYgYml0IG9wZXJhbmRzICovCisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGFyZ19zaXplID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3JyYW5kb21iIChhcmcsIHJhbmRzLCBhcmdfc2l6ZSk7CisKKyAgICAgIGdvdCA9IG1wel9wb3Bjb3VudCAoYXJnKTsKKyAgICAgIHJlZiA9IHJlZm1wel9wb3Bjb3VudCAoYXJnKTsKKyAgICAgIGlmIChnb3QgIT0gcmVmKQorCXsKKwkgIHByaW50ZiAoIm1wel9wb3Bjb3VudCB3cm9uZyBvbiByYW5kb21cbiIpOworCSAgcHJpbnRmICgiICAgICAgICAgIik7ICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIGFyZyk7IHByaW50ZiAoIlxuIik7CisJICBwcmludGYgKCIgICAgICAgICAweCIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxNiwgYXJnKTsgcHJpbnRmICgiXG4iKTsKKwkgIHByaW50ZiAoIiAgIGdvdCAgICVsdVxuIiwgZ290KTsKKwkgIHByaW50ZiAoIiAgIHdhbnQgICVsdVxuIiwgcmVmKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisgIG1wel9jbGVhciAoYXJnKTsKKyAgbXB6X2NsZWFyIChicyk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfb25lYml0ICgpOworICBjaGVja19kYXRhICgpOworICBjaGVja19yYW5kb20gKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXBvdy5jIGIvdGVzdHMvbXB6L3QtcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MTcyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXBvdy5jCkBAIC0wLDAgKzEsMjE3IEBACisvKiBUZXN0IG1wel9wb3dfdWkgYW5kIG1wel91aV9wb3dfdWkuCisKK0NvcHlyaWdodCAxOTk3LCAxOTk5LTIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZSAobXB6X3NyY3B0ciB3YW50LCBtcHpfc3JjcHRyIGJhc2UsIHVuc2lnbmVkIGxvbmcgZXhwKQoreworICBtcHpfdCAgZ290OworCisgIG1wel9pbml0IChnb3QpOworCisgIE1QWl9DSEVDS19GT1JNQVQgKHdhbnQpOworCisgIG1wel9wb3dfdWkgKGdvdCwgYmFzZSwgZXhwKTsKKyAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3Bvd191aSB3cm9uZ1xuIik7CisgICAgICBtcHpfdHJhY2UgKCIgIGJhc2UiLCBiYXNlKTsKKyAgICAgIHByaW50ZiAgICAoIiAgZXhwID0gJWx1ICgweCVsWClcbiIsIGV4cCwgZXhwKTsKKyAgICAgIG1wel90cmFjZSAoIiAgZ290ICIsIGdvdCk7CisgICAgICBtcHpfdHJhY2UgKCIgIHdhbnQiLCB3YW50KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBtcHpfc2V0IChnb3QsIGJhc2UpOworICBtcHpfcG93X3VpIChnb3QsIGdvdCwgZXhwKTsKKyAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3Bvd191aSB3cm9uZ1xuIik7CisgICAgICBtcHpfdHJhY2UgKCIgIGJhc2UiLCBiYXNlKTsKKyAgICAgIHByaW50ZiAgICAoIiAgZXhwID0gJWx1ICgweCVsWClcbiIsIGV4cCwgZXhwKTsKKyAgICAgIG1wel90cmFjZSAoIiAgZ290ICIsIGdvdCk7CisgICAgICBtcHpfdHJhY2UgKCIgIHdhbnQiLCB3YW50KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAobXB6X2ZpdHNfdWxvbmdfcCAoYmFzZSkpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyAgYmFzZV91ID0gbXB6X2dldF91aSAoYmFzZSk7CisgICAgICBtcHpfdWlfcG93X3VpIChnb3QsIGJhc2VfdSwgZXhwKTsKKyAgICAgIGlmIChtcHpfY21wIChnb3QsIHdhbnQpKQorCXsKKwkgIHByaW50ZiAgICAoIm1wel91aV9wb3dfdWkgd3JvbmdcbiIpOworCSAgcHJpbnRmICAgICgiICBiYXNlPSVsdSAoMHglbFgpXG4iLCBiYXNlX3UsIGJhc2VfdSk7CisJICBwcmludGYgICAgKCIgIGV4cCA9ICVsdSAoMHglbFgpXG4iLCBleHAsIGV4cCk7CisJICBtcHpfdHJhY2UgKCIgIGdvdCAiLCBnb3QpOworCSAgbXB6X3RyYWNlICgiICB3YW50Iiwgd2FudCk7CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoZ290KTsKK30KKwordm9pZAorY2hlY2tfYmFzZSAobXB6X3NyY3B0ciBiYXNlKQoreworICB1bnNpZ25lZCBsb25nICBleHA7CisgIG1wel90ICAgICAgICAgIHdhbnQ7CisKKyAgbXB6X2luaXQgKHdhbnQpOworICBtcHpfc2V0X3VpICh3YW50LCAxTCk7CisKKyAgZm9yIChleHAgPSAwOyBleHAgPCAyMDsgZXhwKyspCisgICAgeworICAgICAgY2hlY2tfb25lICh3YW50LCBiYXNlLCBleHApOworICAgICAgbXB6X211bCAod2FudCwgd2FudCwgYmFzZSk7CisgICAgfQorCisgIG1wel9jbGVhciAod2FudCk7Cit9CisKK3ZvaWQKK2NoZWNrX3ZhcmlvdXMgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmJhc2U7CisgIH0gZGF0YVtdID0geworICAgIHsgIjAiIH0sCisgICAgeyAiMSIgfSwKKyAgICB7ICIyIiB9LAorICAgIHsgIjMiIH0sCisgICAgeyAiNCIgfSwKKyAgICB7ICI1IiB9LAorICAgIHsgIjYiIH0sCisgICAgeyAiMTAiIH0sCisgICAgeyAiMTUiIH0sCisgICAgeyAiMTYiIH0sCisKKyAgICB7ICIweDFGIiB9LAorICAgIHsgIjB4RkYiIH0sCisgICAgeyAiMHgxMDAxIiB9LAorICAgIHsgIjB4RkZGRiIgfSwKKyAgICB7ICIweDEwMDAwMDAxIiB9LAorICAgIHsgIjB4MTAwMDAwMDAwMDAwMDAwMSIgfSwKKworICAgIC8qIGFjdHVhbCBzaXplIGNsb3Nlc3QgdG8gZXN0aW1hdGUgKi8KKyAgICB7ICIweEZGRkZGRkZGIiB9LAorICAgIHsgIjB4RkZGRkZGRkZGRkZGRkZGRiIgfSwKKworICAgIC8qIHNhbWUgYWZ0ZXIgcnNoaWZ0ICovCisgICAgeyAiMHhGRkZGRkZGRjAiIH0sCisgICAgeyAiMHhGRkZGRkZGRjAwIiB9LAorICAgIHsgIjB4RkZGRkZGRkZGRkZGRkZGRjAiIH0sCisgICAgeyAiMHhGRkZGRkZGRkZGRkZGRkZGMDAiIH0sCisKKyAgICAvKiBjaGFuZ2UgZnJvbSAyIGxpbWJzIHRvIDEgYWZ0ZXIgcnNoaWZ0ICovCisgICAgeyAiMHgxODAwMDAwMDAiIH0sCisgICAgeyAiMHgxODAwMDAwMDAwMDAwMDAwMCIgfSwKKworICAgIC8qIGNoYW5nZSBmcm9tIDMgbGltYnMgdG8gMiBhZnRlciByc2hpZnQgKi8KKyAgICB7ICIweDE4MDAwMDAwMTAwMDAwMDAwIiB9LAorICAgIHsgIjB4MTgwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIiB9LAorCisgICAgLyogaGFuZGxpbmcgb2YgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICB7ICItMHg4MDAwMDAwMCIgfSwKKyAgICB7ICItMHg4MDAwMDAwMDAwMDAwMDAwIiB9LAorCisgICAgLyogbG93IHplcm8gbGltYiwgYW5kIHNpemU+MiwgY2hlY2tpbmcgYXJndW1lbnQgb3ZlcmxhcCBkZXRlY3Rpb24gKi8KKyAgICB7ICIweDMwMDAwMDAwMDAwMDAwMDAzMDAwMDAwMDAwMDAwMDAwMzAwMDAwMDAwMDAwMDAwMDAiIH0sCisgIH07CisKKyAgbXB6X3QgIGJhc2U7CisgIGludCAgICBpOworCisgIG1wel9pbml0IChiYXNlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyb2YgKGRhdGEpOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKGJhc2UsIGRhdGFbaV0uYmFzZSwgMCk7CisgICAgICBjaGVja19iYXNlIChiYXNlKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChiYXNlKTsKK30KKwordm9pZAorY2hlY2tfcmFuZG9tIChpbnQgcmVwcykKK3sKKyAgbXB6X3QgICAgICAgICAgICAgIGJhc2UsIHdhbnQ7CisgIG1wX3NpemVfdCAgICAgICAgICBiYXNlX3NpemU7CisgIGludCAgICAgICAgICAgICAgICBpOworICB1bnNpZ25lZCBsb25nICAgICAgc2l6ZV9yYW5nZSwgZXhwOworICBnbXBfcmFuZHN0YXRlX3B0ciAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYmFzZSk7CisgIG1wel9pbml0ICh3YW50KTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIC8qIGV4cG9uZW50aWFsbHkgcmFuZG9tIDAgdG8gMl4xMyBiaXRzIGZvciBiYXNlICovCisgICAgICBtcHpfdXJhbmRvbWIgKHdhbnQsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAod2FudCkgJSAxMiArIDI7CisgICAgICBtcHpfdXJhbmRvbWIgKHdhbnQsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGJhc2Vfc2l6ZSA9IG1wel9nZXRfdWkgKHdhbnQpOworICAgICAgbXB6X3JyYW5kb21iIChiYXNlLCByYW5kcywgYmFzZV9zaXplKTsKKworICAgICAgLyogcmFuZG9tbHkgc2lnbmVkIGJhc2UgKi8KKyAgICAgIG1wel91cmFuZG9tYiAod2FudCwgcmFuZHMsIDIpOworICAgICAgaWYgKChtcHpfZ2V0X3VpICh3YW50KSAmIDEpICE9IDApCisJbXB6X25lZyAoYmFzZSwgYmFzZSk7CisKKyAgICAgIC8qIHJhbmRvbSA1IGJpdHMgZm9yIGV4cG9uZW50ICovCisgICAgICBtcHpfdXJhbmRvbWIgKHdhbnQsIHJhbmRzLCA1TCk7CisgICAgICBleHAgPSBtcHpfZ2V0X3VpICh3YW50KTsKKworICAgICAgcmVmbXB6X3Bvd191aSAod2FudCwgYmFzZSwgZXhwKTsKKyAgICAgIGNoZWNrX29uZSAod2FudCwgYmFzZSwgZXhwKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChiYXNlKTsKKyAgbXB6X2NsZWFyICh3YW50KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGludCByZXBzID0gNTAwMDsKKworICAvKiBkdW1teSBjYWxsIHRvIGRyYWcgaW4gcmVmbXBuLm8gZm9yIHRlc3RpbmcgbXB6L25fcG93X3VpLmMgd2l0aAorICAgICByZWZtcG5fbXVsXzIgKi8KKyAgcmVmbXBuX3plcm9fcCAoTlVMTCwgKG1wX3NpemVfdCkgMCk7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIG1wX3RyYWNlX2Jhc2UgPSAtMTY7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIGNoZWNrX3ZhcmlvdXMgKCk7CisgIGNoZWNrX3JhbmRvbSAocmVwcyk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXBvd20uYyBiL3Rlc3RzL21wei90LXBvd20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTI1ZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3QtcG93bS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBUZXN0IG1wel9wb3dtLCBtcHpfbXVsLCBtcHpfbW9kLCBtcHpfbW9kX3VpLCBtcHpfZGl2X3VpLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5OS0yMDAxLCAyMDA5LCAyMDEyLCAyMDE5IEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCisjZGVmaW5lIFNJWkVNIDEzCisKKy8qIENoZWNrIHRoYXQgYWxsIHNpemVzIHVwIHRvIGp1c3QgYWJvdmUgTVVMX1RPT00yMl9USFJFU0hPTEQgaGF2ZSBiZWVuIHRlc3RlZAorICAgYSBmZXcgdGltZXMuICBGSVhNRTogSWYgU0laRU0gaXMgc2V0IHRvbyBsb3csIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4uICAqLworaW50CithbGxzaXplc19zZWVuICh1bnNpZ25lZCBpbnQgKmFsbHNpemVzKQoreworICBtcF9zaXplX3QgaTsKKworICBmb3IgKGkgPSAxOyBpIDwgTVVMX1RPT00yMl9USFJFU0hPTEQgKyA0OyBpKyspCisgICAgaWYgKGFsbHNpemVzW2ldIDwgNCkKKyAgICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordm9pZAorc21hbGxfMnBvdyAodW5zaWduZWQgbG9uZyByZXBzKQoreworICBtcHpfdCBkdSwgZXhwLCBtb2Q7CisgIG1wel90IHIxOworICB1bnNpZ25lZCBsb25nIG0sIGUsIHI7CisgIG1wX2xpbWJfdCBiMCA9IDI7CisKKyAgbXB6X3JvaW5pdF9uIChkdSwgJmIwLCAxKTsKKyAgbXB6X2luaXQgKGV4cCk7CisgIG1wel9pbml0IChtb2QpOworICBtcHpfaW5pdCAocjEpOworCisgIGZvciAobSA9IDM7IG0gKiBtIDwgcmVwczsgbSArPSAyKQorICAgIHsKKyAgICAgIG1wel9zZXRfdWkgKG1vZCwgbSk7CisgICAgICByID0gMTsKKyAgICAgIGZvciAoZSA9IDA7IGUgPCBtOyBlICs9IDEpCisJeworCSAgbXB6X3NldF91aSAoZXhwLCBlKTsKKwkgIG1wel9wb3dtIChyMSwgZHUsIGV4cCwgbW9kKTsKKwkgIE1QWl9DSEVDS19GT1JNQVQgKHIxKTsKKwkgIGlmIChtcHpfY21wX3VpIChyMSwgcikgIT0gMCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuSW5jb3JyZWN0IHJlc3VsdCBmb3Igb3BlcmFuZHM6XG4iKTsKKwkgICAgICBkZWJ1Z19tcCAoZHUsIC0xNik7CisJICAgICAgZGVidWdfbXAgKGV4cCwgLTE2KTsKKwkgICAgICBkZWJ1Z19tcCAobW9kLCAtMTYpOworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9wb3dtIHJlc3VsdDpcbiIpOworCSAgICAgIGRlYnVnX21wIChyMSwgLTE2KTsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJTaG91bGQgYmUgMiBeIDB4JWx4ID0gMHglbHggKG1vZCAweCVseClcbiIsIGUsIHIsIG0pOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAociA+IChtID4+IDEpKQorCSAgICByID0gKHIgPDwgMSkgLSBtOworCSAgZWxzZQorCSAgICByID0gciA8PCAxOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChleHApOworICBtcHpfY2xlYXIgKG1vZCk7CisgIG1wel9jbGVhciAocjEpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgYmFzZSwgZXhwLCBtb2Q7CisgIG1wel90IHIxLCByMiwgdDEsIGV4cDIsIGJhc2UyOworICBtcF9zaXplX3QgYmFzZV9zaXplLCBleHBfc2l6ZSwgbW9kX3NpemU7CisgIGludCBpOworICBpbnQgcmVwcyA9IDEwMDA7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBic2ksIHNpemVfcmFuZ2U7CisgIHVuc2lnbmVkIGludCBhbGxzaXplc1sxIDw8IChTSVpFTSArIDIgLSAxKV07CisKKyAgdGVzdHNfc3RhcnQgKCk7CisgIFRFU1RTX1JFUFMgKHJlcHMsIGFyZ3YsIGFyZ2MpOworCisgIHNtYWxsXzJwb3cgKCh1bnNpZ25lZCBpbnQpIHJlcHMpOworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKGJhc2UpOworICBtcHpfaW5pdCAoZXhwKTsKKyAgbXB6X2luaXQgKG1vZCk7CisgIG1wel9pbml0IChyMSk7CisgIG1wel9pbml0IChyMik7CisgIG1wel9pbml0ICh0MSk7CisgIG1wel9pbml0IChleHAyKTsKKyAgbXB6X2luaXQgKGJhc2UyKTsKKworICBtZW1zZXQgKGFsbHNpemVzLCAwLCAoMSA8PCAoU0laRU0gKyAyIC0gMSkpICogc2l6ZW9mIChpbnQpKTsKKworICByZXBzICs9IHJlcHMgPj4gMzsKKyAgZm9yIChpID0gMDsgaSA8IHJlcHMgfHwgISBhbGxzaXplc19zZWVuIChhbGxzaXplcyk7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIFNJWkVNICsgMjsKKworICAgICAgaWYgKChpICYgNykgPT0gMCkKKwl7CisJICBtcHpfc2V0X3VpIChleHAsIDEpOworCisJICBkbyAgLyogTG9vcCB1bnRpbCBtYXRoZW1hdGljYWxseSB3ZWxsLWRlZmluZWQuICAqLworCSAgICB7CisJICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UgLyAyICsgMik7CisJICAgICAgYmFzZV9zaXplID0gbXB6X2dldF91aSAoYnMpOworCSAgICAgIG1wel9ycmFuZG9tYiAoYmFzZSwgcmFuZHMsIGJhc2Vfc2l6ZSk7CisJICAgIH0KKwkgIHdoaWxlIChtcHpfY21wX3VpIChiYXNlLCAwKSA9PSAwKTsKKworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UgLyAyKTsKKwkgIG1vZF9zaXplID0gbXB6X2dldF91aSAoYnMpOworCSAgbW9kX3NpemUgPSBNSU4gKG1vZF9zaXplLCBiYXNlX3NpemUpOworCSAgbXB6X3JyYW5kb21iIChtb2QsIHJhbmRzLCBtb2Rfc2l6ZSk7CisKKwkgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKwkgIG1vZF9zaXplID0gbXB6X2dldF91aSAoYnMpICsgYmFzZV9zaXplICsgMjsKKwkgIGlmICgoaSAmIDgpID09IDApCisJICAgIG1vZF9zaXplICs9IEdNUF9OVU1CX0JJVFMgLSBtb2Rfc2l6ZSAlIEdNUF9OVU1CX0JJVFM7CisJICBtcHpfc2V0Yml0IChtb2QsIG1vZF9zaXplKTsKKworCSAgbXB6X3N1YiAoYmFzZSwgYmFzZSwgbW9kKTsKKwl9CisgICAgICBlbHNlCisJeworICAgICAgZG8gIC8qIExvb3AgdW50aWwgbWF0aGVtYXRpY2FsbHkgd2VsbC1kZWZpbmVkLiAgKi8KKwl7CisJICBpZiAoKGkgJiA3KSA9PSA0KQorCSAgICBtcHpfc2V0X3VpIChiYXNlLCAyKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKwkgICAgICBiYXNlX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICAgICAgbXB6X3JyYW5kb21iIChiYXNlLCByYW5kcywgYmFzZV9zaXplKTsKKwkgICAgfQorCisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgN0wpOworCSAgZXhwX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKGV4cCwgcmFuZHMsIGV4cF9zaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAoYmFzZSwgMCkgPT0gMCAmJiBtcHpfY21wX3VpIChleHAsIDApID09IDApOworCisgICAgICBkbworICAgICAgICB7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJICBtb2Rfc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKwkgIG1wel9ycmFuZG9tYiAobW9kLCByYW5kcywgbW9kX3NpemUpOworCX0KKyAgICAgIHdoaWxlIChtcHpfY21wX3VpIChtb2QsIDApID09IDApOworCisgICAgICBhbGxzaXplc1tTSVoobW9kKV0gKz0gMTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKGJhc2UsIGJhc2UpOworCisgICAgICAvKiBwcmludGYgKCIlbGQgJWxkICVsZFxuIiwgU0laIChiYXNlKSwgU0laIChleHApLCBTSVogKG1vZCkpOyAqLworCX0KKworICAgICAgbXB6X3NldF91aSAocjIsIDEpOworICAgICAgbXB6X21vZCAoYmFzZTIsIGJhc2UsIG1vZCk7CisgICAgICBtcHpfc2V0IChleHAyLCBleHApOworICAgICAgbXB6X21vZCAocjIsIHIyLCBtb2QpOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGlmIChtcHpfdHN0Yml0IChleHAyLCAwKSkKKwkgICAgeworCSAgICAgIG1wel9tdWwgKHIyLCByMiwgYmFzZTIpOworCSAgICAgIG1wel9tb2QgKHIyLCByMiwgbW9kKTsKKwkgICAgfQorCSAgaWYgIChtcHpfY21wX3VpIChleHAyLCAxKSA8PSAwKQorCSAgICBicmVhazsKKwkgIG1wel9tdWwgKGJhc2UyLCBiYXNlMiwgYmFzZTIpOworCSAgbXB6X21vZCAoYmFzZTIsIGJhc2UyLCBtb2QpOworCSAgbXB6X3RkaXZfcV8yZXhwIChleHAyLCBleHAyLCAxKTsKKwl9CisKKyAgICAgIG1wel9wb3dtIChyMSwgYmFzZSwgZXhwLCBtb2QpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjEpOworCisgICAgICBpZiAobXB6X2NtcCAocjEsIHIyKSAhPSAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIlxuSW5jb3JyZWN0IHJlc3VsdHMgaW4gdGVzdCAlZCBmb3Igb3BlcmFuZHM6XG4iLCBpKTsKKwkgIGRlYnVnX21wIChiYXNlLCAtMTYpOworCSAgZGVidWdfbXAgKGV4cCwgLTE2KTsKKwkgIGRlYnVnX21wIChtb2QsIC0xNik7CisJICBmcHJpbnRmIChzdGRlcnIsICJtcHpfcG93bSByZXN1bHQ6XG4iKTsKKwkgIGRlYnVnX21wIChyMSwgLTE2KTsKKwkgIGZwcmludGYgKHN0ZGVyciwgInJlZmVyZW5jZSByZXN1bHQ6XG4iKTsKKwkgIGRlYnVnX21wIChyMiwgLTE2KTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKG1wel90ZGl2X3VpIChtb2QsIDIpID09IDApCisJY29udGludWU7CisKKyAgICAgIG1wel9wb3dtX3NlYyAocjEsIGJhc2UsIGV4cCwgbW9kKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIxKTsKKworICAgICAgaWYgKG1wel9jbXAgKHIxLCByMikgIT0gMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJcbkluY29ycmVjdCByZXN1bHRzIGluIHRlc3QgJWQgZm9yIG9wZXJhbmRzOlxuIiwgaSk7CisJICBkZWJ1Z19tcCAoYmFzZSwgLTE2KTsKKwkgIGRlYnVnX21wIChleHAsIC0xNik7CisJICBkZWJ1Z19tcCAobW9kLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAibXB6X3Bvd21fc2VjIHJlc3VsdDpcbiIpOworCSAgZGVidWdfbXAgKHIxLCAtMTYpOworCSAgZnByaW50ZiAoc3RkZXJyLCAicmVmZXJlbmNlIHJlc3VsdDpcbiIpOworCSAgZGVidWdfbXAgKHIyLCAtMTYpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChiYXNlKTsKKyAgbXB6X2NsZWFyIChleHApOworICBtcHpfY2xlYXIgKG1vZCk7CisgIG1wel9jbGVhciAocjEpOworICBtcHpfY2xlYXIgKHIyKTsKKyAgbXB6X2NsZWFyICh0MSk7CisgIG1wel9jbGVhciAoZXhwMik7CisgIG1wel9jbGVhciAoYmFzZTIpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZGVyciwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtcG93bV91aS5jIGIvdGVzdHMvbXB6L3QtcG93bV91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDQ2YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1wb3dtX3VpLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIFRlc3QgbXB6X3Bvd21fdWksIG1wel9tdWwsIG1wel9tb2QuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLTIwMDIsIDIwMTMgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IGJhc2UsIGV4cCwgbW9kOworICBtcHpfdCByMSwgcjIsIGJhc2UyOworICBtcF9zaXplX3QgYmFzZV9zaXplLCBleHBfc2l6ZSwgbW9kX3NpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50IGV4cDI7CisgIGludCBpOworICBpbnQgcmVwcyA9IDEwMDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICBtcHpfaW5pdHMgKGJzLCBiYXNlLCBleHAsIG1vZCwgcjEsIHIyLCBiYXNlMiwgTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDE4ICsgMjsKKworICAgICAgZG8gIC8qIExvb3AgdW50aWwgbWF0aGVtYXRpY2FsbHkgd2VsbC1kZWZpbmVkLiAgKi8KKwl7CisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgc2l6ZV9yYW5nZSk7CisJICBiYXNlX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKGJhc2UsIHJhbmRzLCBiYXNlX3NpemUpOworCisJICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgNkwpOworCSAgZXhwX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKGV4cCwgcmFuZHMsIGV4cF9zaXplKTsKKwkgIGV4cDIgPSBtcHpfZ2V0bGltYm4gKGV4cCwgKG1wX3NpemVfdCkgMCk7CisJfQorICAgICAgd2hpbGUgKG1wel9jbXBfdWkgKGJhc2UsIDApID09IDAgJiYgZXhwMiA9PSAwKTsKKworICAgICAgZG8KKyAgICAgICAgeworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworCSAgbW9kX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisJICBtcHpfcnJhbmRvbWIgKG1vZCwgcmFuZHMsIG1vZF9zaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X2NtcF91aSAobW9kLCAwKSA9PSAwKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDIpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCW1wel9uZWcgKGJhc2UsIGJhc2UpOworCisgICAgICAvKiBwcmludGYgKCIlbGQgJWxkXG4iLCBTSVogKGJhc2UpLCBTSVogKG1vZCkpOyAqLworCisjaWYgMAorICAgICAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKKyAgICAgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJCID0gMHglWnhcbiIsIGJhc2UpOworICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIk0gPSAweCVaeFxuIiwgbW9kKTsKKyNlbmRpZgorCisgICAgICBleHAyID0gbXB6X2dldGxpbWJuIChleHAsIChtcF9zaXplX3QpIDApOworICAgICAgbXB6X3NldF91aSAocjIsIDEpOworICAgICAgbXB6X3NldCAoYmFzZTIsIGJhc2UpOworICAgICAgbXB6X21vZCAocjIsIHIyLCBtb2QpOwkvKiBuZWVkZWQgd2hlbiBleHA9PTAgYW5kIG1vZD09MSAqLworICAgICAgd2hpbGUgKGV4cDIgIT0gMCkKKwl7CisJICBpZiAoZXhwMiAlIDIgIT0gMCkKKwkgICAgeworCSAgICAgIG1wel9tdWwgKHIyLCByMiwgYmFzZTIpOworCSAgICAgIG1wel9tb2QgKHIyLCByMiwgbW9kKTsKKwkgICAgfQorCSAgbXB6X211bCAoYmFzZTIsIGJhc2UyLCBiYXNlMik7CisJICBtcHpfbW9kIChiYXNlMiwgYmFzZTIsIG1vZCk7CisJICBleHAyID0gZXhwMiAvIDI7CisJfQorCisgICAgICBleHAyID0gbXB6X2dldGxpbWJuIChleHAsIChtcF9zaXplX3QpIDApOworICAgICAgbXB6X3Bvd21fdWkgKHIxLCBiYXNlLCBleHAyLCBtb2QpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocjEpOworCisjaWYgMAorICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIlIgICA9IDB4JVp4XG4iLCByMSk7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiUkVGID0gMHglWnhcbiIsIHIyKTsKKyNlbmRpZgorCisgICAgICBpZiAobXB6X2NtcCAocjEsIHIyKSAhPSAwKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIlxudGVzdCAlZDogSW5jb3JyZWN0IHJlc3VsdHMgZm9yIG9wZXJhbmRzOlxuIiwgaSk7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiQiA9IDB4JVp4XG4iLCBiYXNlKTsKKwkgIGdtcF9mcHJpbnRmIChzdGRlcnIsICJFID0gMHglWnhcbiIsIGV4cCk7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiTSA9IDB4JVp4XG4iLCBtb2QpOworCSAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIlIgICA9IDB4JVp4XG4iLCByMSk7CisJICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiUkVGID0gMHglWnhcbiIsIHIyKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFycyAoYnMsIGJhc2UsIGV4cCwgbW9kLCByMSwgcjIsIGJhc2UyLCBOVUxMKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtcHByaW1lX3AuYyBiL3Rlc3RzL21wei90LXBwcmltZV9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZTZlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXBwcmltZV9wLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIEV4ZXJjaXNlIG1wel9wcm9iYWJfcHJpbWVfcC4KKworQ29weXJpZ2h0IDIwMDIsIDIwMTgtMjAxOSwgMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIEVuaGFuY2VtZW50czoKKworICAgLSBUZXN0IHNvbWUgYmlnIHByaW1lcyBkb24ndCBjb21lIGJhY2sgY2xhaW1lZCB0byBiZSBjb21wb3NpdGUuCisgICAtIFRlc3Qgc29tZSBiaWcgY29tcG9zaXRlcyBkb24ndCBjb21lIGJhY2sgY2xhaW1lZCB0byBiZSBjZXJ0YWlubHkgcHJpbWUuCisgICAtIFRlc3Qgc29tZSBiaWcgY29tcG9zaXRlcyB3aXRoIHNtYWxsIGZhY3RvcnMgYXJlIGlkZW50aWZpZWQgYXMgY2VydGFpbmx5CisgICAgIGNvbXBvc2l0ZS4gICovCisKKworLyogcmV0dXJuIDIgaWYgcHJpbWUsIDAgaWYgY29tcG9zaXRlICovCitpbnQKK2lzcHJpbWUgKHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgaWYgKG4gPCA0KQorICAgIHJldHVybiAobiAmIDIpOworICBpZiAoKG4gJiAxKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIGZvciAodW5zaWduZWQgbG9uZyBpID0gMzsgaSppIDw9IG47IGkrPTIpCisgICAgaWYgKChuICUgaSkgPT0gMCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiAyOworfQorCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgbiwgaW50IHdhbnQpCit7CisgIGludCAgZ290OworCisgIGdvdCA9IG1wel9wcm9iYWJfcHJpbWVfcCAobiwgMjUpOworCisgIC8qICJkZWZpbml0ZWx5IHByaW1lIiAoMikgaXMgZmluZSBpZiB3ZSBvbmx5IHdhbnRlZCAicHJvYmFibHkgcHJpbWUiICgxKSAqLworICBpZiAoKGdvdCAhPSB3YW50KSAmJiAoZ290ICE9IHdhbnQgKiAyKSkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfcHJvYmFiX3ByaW1lX3BcbiIpOworICAgICAgbXB6X3RyYWNlICgiICBuICAgICIsIG4pOworICAgICAgcHJpbnRmICAgICgiICBnb3QgPSVkIiwgZ290KTsKKyAgICAgIHByaW50ZiAgICAoIiAgd2FudD0lZCIsIHdhbnQpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCit2b2lkCitjaGVja19wbiAobXB6X3B0ciBuLCBpbnQgd2FudCkKK3sKKyAgY2hlY2tfb25lIChuLCB3YW50KTsKKyAgbXB6X25lZyAobiwgbik7CisgIGNoZWNrX29uZSAobiwgd2FudCk7Cit9CisKKy8qIGV4cGVjdCBjZXJ0YWludHkgZm9yIHNtYWxsIG4gKi8KK3ZvaWQKK2NoZWNrX3NtYWxsICh2b2lkKQoreworICBtcHpfdCAgbjsKKyAgbG9uZyAgIGk7CisKKyAgbXB6X2luaXQgKG4pOworCisgIGZvciAoaSA9IDA7IGkgPCAzMDA7IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3NpIChuLCBpKTsKKyAgICAgIGNoZWNrX3BuIChuLCBpc3ByaW1lIChpKSk7CisgICAgfQorCisgIG1wel9jbGVhciAobik7Cit9CisKK3ZvaWQKK2NoZWNrX2NvbXBvc2l0ZXMgKGludCBjb3VudCkKK3sKKyAgaW50IGk7CisgIG1wel90IGEsIGIsIG4sIGJzOworICB1bnNpZ25lZCBsb25nIHNpemVfcmFuZ2UsIHNpemU7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzID0gUkFORFM7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIG1wel9pbml0IChuKTsKKyAgbXB6X2luaXQgKGJzKTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbXBvc2l0ZXNbXSA9IHsKKyAgICAiMjI1NjcwNjQ0MjEzNzUwMTIxIiwJLyogbj02MSpDMTYsIGlmIEQgPCA2MSwgKG4vRCkgPSAxLgkqLworICAgICIyMzg2MzQyMDU5ODk5NjM3ODQxIiwJLyogbj02MSpDMTcsIGlmIEQgPCA2MSwgKG4vRCkgPSAxLgkqLworICAgICIxMTk0NjQ5IiwJLyogQSBzcXVhcmUsIGJ1dCBzdHJvbmcgYmFzZS0yIHBzZXVkb3ByaW1lLAkqLworICAgICIxMjMyNzEyMSIsCS8qIGFub3RoZXIgYmFzZS0yIHBzZXVkb3ByaW1lIHNxdWFyZS4JKi8KKyAgICAiMTg0NDY3NDQwNjYwNDc3NjAzNzciLAkvKiBTaG91bGQgdHJpZ2dlciBGaWJvbmFjY2kncyB0ZXN0OwkqLworICAgICIxMDMyMzc2OSIsCQkJLyogJjM9PTEsIEx1Y2FzJyB0ZXN0IHdpdGggRD0zNzsJKi8KKyAgICAiMTM5NzQxOSIsCQkJLyogJjM9PTMsIEx1Y2FzJyB0ZXN0IHdpdGggRD00MzsJKi8KKyAgICAiMTE3MDgwNjkxNjU5MTg1OTczNDEiLAkvKiAmMz09MSwgTHVjYXMnIHRlc3Qgd2l0aCBsYXJnZSBEPTEwNzsJKi8KKyAgICAiMzk1MDA5MTA5MDc3NDkzNzUxIiwJLyogJjM9PTMsIEx1Y2FzJyB0ZXN0IHdpdGggbGFyZ2UgRD0xMTMuCSovCisgICAgTlVMTAorICB9OworCisgIGZvciAoaSA9IDA7IGNvbXBvc2l0ZXNbaV07IGkrKykKKyAgICB7CisgICAgICBtcHpfc2V0X3N0cl9vcl9hYm9ydCAobiwgY29tcG9zaXRlc1tpXSwgMCk7CisgICAgICBjaGVja19vbmUgKG4sIDApOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDEzICsgMTsgLyogMC4uODE5MiBiaXQgb3BlcmFuZHMgKi8KKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoYSwgcmFuZHMsIHNpemUpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDEzICsgMTsgLyogMC4uODE5MiBiaXQgb3BlcmFuZHMgKi8KKyAgICAgIG1wel9ycmFuZG9tYiAoYiwgcmFuZHMsIHNpemUpOworCisgICAgICAvKiBFeGNsdWRlIHRyaXZpYWwgZmFjdG9ycyAqLworICAgICAgaWYgKG1wel9jbXBfdWkgKGEsIDEpID09IDApCisJbXB6X3NldF91aSAoYSwgMik7CisgICAgICBpZiAobXB6X2NtcF91aSAoYiwgMSkgPT0gMCkKKwltcHpfc2V0X3VpIChiLCAyKTsKKworICAgICAgbXB6X211bCAobiwgYSwgYik7CisKKyAgICAgIGNoZWNrX3BuIChuLCAwKTsKKyAgICB9CisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYik7CisgIG1wel9jbGVhciAobik7CisgIG1wel9jbGVhciAoYnMpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcHJpbWVzICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaW1lc1tdID0geworICAgICIyIiwgIjUzIiwgIjEyMzQ1Njc4OTEiLAorICAgICIyMDU1NjkzOTQ5IiwgIjExMjU4OTk5MDY4NDI1OTciLCAiMTY0MTIyOTIwNDM4NzE2NTAzNjkiLAorICAgICIxODQ0Njc0NDA3NTM1ODcwMjY3OSIsCS8qIEx1Y2FzJyB0ZXN0IHdpdGggbGFyZ2UgRD0xMDcuCSovCisgICAgLyogZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEsIGFsc28gIldlbGwga25vd24gZ3JvdXAgMiIgaW4gUkZDCisgICAgICAgMjQxMiwgMl4xMDI0IC0gMl45NjAgLSAxICsgMl42NCAqIHsgWzJeODk0IHBpXSArIDEyOTA5MyB9ICovCisgICAgIjB4RkZGRkZGRkZGRkZGRkZGRkM5MEZEQUEyMjE2OEMyMzRDNEM2NjI4QjgwREMxQ0QxIgorICAgICIyOTAyNEUwODhBNjdDQzc0MDIwQkJFQTYzQjEzOUIyMjUxNEEwODc5OEUzNDA0REQiCisgICAgIkVGOTUxOUIzQ0QzQTQzMUIzMDJCMEE2REYyNUYxNDM3NEZFMTM1NkQ2RDUxQzI0NSIKKyAgICAiRTQ4NUI1NzY2MjVFN0VDNkY0NEM0MkU5QTYzN0VENkIwQkZGNUNCNkY0MDZCN0VEIgorICAgICJFRTM4NkJGQjVBODk5RkE1QUU5RjI0MTE3QzRCMUZFNjQ5Mjg2NjUxRUNFNjUzODEiCisgICAgIkZGRkZGRkZGRkZGRkZGRkYiLAorICAgIE5VTEwKKyAgfTsKKworICBtcHpfdCBuOworICBpbnQgaTsKKworICBtcHpfaW5pdCAobik7CisKKyAgZm9yIChpID0gMDsgcHJpbWVzW2ldOyBpKyspCisgICAgeworICAgICAgbXB6X3NldF9zdHJfb3JfYWJvcnQgKG4sIHByaW1lc1tpXSwgMCk7CisgICAgICBjaGVja19vbmUgKG4sIDEpOworICAgIH0KKyAgbXB6X2NsZWFyIChuKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2Zlcm1hdF9tZXJzZW5uZSAoaW50IGNvdW50KQoreworICBpbnQgZmVybWF0X2V4cG9uZW50cyBbXSA9IHsxLCAyLCA0LCA4LCAxNn07CisgIGludCBtZXJzZW5uZV9leHBvbmVudHMgW10gPSB7MiwgMywgNSwgNywgMTMsIDE3LCAxOSwgMzEsIDYxLCA4OSwKKwkJCSAgICAgICAxMDcsIDEyNywgNTIxLCA2MDcsIDEyNzksIDIyMDMsIDIyODEsCisJCQkgICAgICAgMzIxNywgNDI1MywgNDQyMywgOTY4OSwgOTk0MSwgMTEyMTMsCisJCQkgICAgICAgMTk5MzcsIDIxNzAxLCAyMzIwOSwgNDQ0OTcsIDg2MjQzfTsKKyAgbXB6X3QgcHA7CisgIGludCBpLCBqLCB3YW50OworCisgIG1wel9pbml0IChwcCk7CisgIGNvdW50ID0gTUlOICgxMTAwMDAsIGNvdW50KTsKKworICBmb3IgKGk9MTsgaTxjb3VudDsgKytpKQorICAgIHsKKyAgICAgIG1wel9zZXRfdWkgKHBwLCAxKTsKKyAgICAgIG1wel9zZXRiaXQgKHBwLCBpKTsgLyogMl5pICsgMSAqLworICAgICAgd2FudCA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyb2YgKGZlcm1hdF9leHBvbmVudHMpOyBqKyspCisJaWYgKGZlcm1hdF9leHBvbmVudHNbal0gPT0gaSkKKwkgIHsKKwkgICAgLyogRmVybWF0J3MgcHJpbWVzIGFyZSBzbWFsbCBlbm91Z2ggZm9yIGEgZGVmaW5pdGUgYW5zd2VyLiAqLworCSAgICB3YW50ID0gMjsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICBjaGVja19vbmUgKHBwLCB3YW50KTsKKworICAgICAgbXB6X3N1Yl91aSAocHAsIHBwLCAyKTsgLyogMl5pIC0gMSAqLworICAgICAgd2FudCA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyb2YgKG1lcnNlbm5lX2V4cG9uZW50cyk7IGorKykKKwlpZiAobWVyc2VubmVfZXhwb25lbnRzW2pdID09IGkpCisJICB7CisJICAgIHdhbnQgPSAxIDw8IChpIDwgNTApOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIGNoZWNrX29uZSAocHAsIHdhbnQpOworICAgIH0KKyAgbXB6X2NsZWFyIChwcCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgY291bnQgPSAxMDAwOworCisgIFRFU1RTX1JFUFMgKGNvdW50LCBhcmd2LCBhcmdjKTsKKworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19zbWFsbCAoKTsKKyAgY2hlY2tfZmVybWF0X21lcnNlbm5lIChjb3VudCA+PiAzKTsKKyAgY2hlY2tfY29tcG9zaXRlcyAoY291bnQpOworICBjaGVja19wcmltZXMgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXByaW1vcmlhbF91aS5jIGIvdGVzdHMvbXB6L3QtcHJpbW9yaWFsX3VpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMmJmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXByaW1vcmlhbF91aS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBFeGVyY2lzZSBtcHpfcHJpbW9yaWFsX3VpLgorCitDb3B5cmlnaHQgMjAwMC0yMDAyLCAyMDEyLCAyMDE1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworLyogVXNhZ2U6IHQtcHJpbW9yaWFsX3VpIFt4fG51bV0KKworICAgV2l0aCBubyBhcmd1bWVudHMgdGVzdGluZyBnb2VzIHVwIHRvIHRoZSBpbml0aWFsIHZhbHVlIG9mICJsaW1pdCIgYmVsb3cuCisgICBXaXRoIGEgbnVtYmVyIGFyZ3VtZW50IHRlc3RzIGFyZSBjYXJyaWVkIHRoYXQgZmFyLCBvciB3aXRoIGEgbGl0ZXJhbCAieCIKKyAgIHRlc3RzIGFyZSBjb250aW51ZWQgd2l0aG91dCBsaW1pdCAodGhpcyBiZWluZyBtZWFudCBvbmx5IGZvciBkZXZlbG9wbWVudAorICAgcHVycG9zZXMpLiAgKi8KKworc3RhdGljIGludCBpc3ByaW1lICh1bnNpZ25lZCBsb25nIGludCB0KTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB1bnNpZ25lZCBsb25nICBuOworICB1bnNpZ25lZCBsb25nICBsaW1pdCA9IDIyMjI7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCAgICAgICAgICBmLCByLCBiczsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAneCcpCisgICAgbGltaXQgPSBVTE9OR19NQVg7CisgIGVsc2UKKyAgICBURVNUU19SRVBTIChsaW1pdCwgYXJndiwgYXJnYyk7CisKKyAgLyogZm9yIHNtYWxsIGxpbWIgdGVzdGluZyAqLworICBsaW1pdCA9IE1JTiAobGltaXQsIE1QX0xJTUJfVF9NQVgpOworCisgIG1wel9pbml0X3NldF91aSAoZiwgMSk7ICAvKiAwIyA9IDEgKi8KKyAgbXB6X2luaXQgKHIpOworCisgIG4gPSAwOworICBkbworICAgIHsKKyAgICAgIG1wel9wcmltb3JpYWxfdWkgKHIsIG4pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAocik7CisKKyAgICAgIGlmIChtcHpfY21wIChmLCByKSAhPSAwKQorCXsKKwkgIHByaW50ZiAoIm1wel9wcmltb3JpYWxfdWkoJWx1KSB3cm9uZ1xuIiwgbik7CisJICBwcmludGYgKCIgIGdvdCAgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCByKTsgcHJpbnRmKCJcbiIpOworCSAgcHJpbnRmICgiICB3YW50ICIpOyBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgZik7IHByaW50ZigiXG4iKTsKKwkgIGFib3J0ICgpOworCX0KKworICAgICAgaWYgKGlzcHJpbWUgKCsrbikpCisJbXB6X211bF91aSAoZiwgZiwgbik7ICAvKiBwIyA9IChwLTEpIyAqIChwKSAqLworICAgICAgaWYgKG4lMTYgPT0gMCkgeyBtcHpfY2xlYXIgKHIpOyBtcHpfaW5pdCAocik7IH0KKyAgICB9IHdoaWxlIChuIDwgbGltaXQpOworCisgIG4gPSAwOyBsaW1pdCA9MTsKKyAgbXB6X2luaXQgKGJzKTsKKyAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGksIGQ7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAyMSk7CisgICAgICBpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDkpOworICAgICAgZCA9IG1wel9nZXRfdWkgKGJzKSArIDMqNjQ7CisgICAgICBtcHpfcHJpbW9yaWFsX3VpIChmLCBpKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKGYpOworICAgICAgbXB6X3ByaW1vcmlhbF91aSAociwgaStkKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHIpOworCisgICAgICBkbyB7CisJaWYgKGlzcHJpbWUgKCsraSkpCisJICBtcHpfbXVsX3VpIChmLCBmLCBpKTsKKyAgICAgIH0gd2hpbGUgKC0tZCAhPSAwKTsKKworICAgICAgaWYgKG1wel9jbXAgKGYsIHIpICE9IDApCisJeworCSAgcHJpbnRmICgibXB6X3ByaW1vcmlhbF91aSglbHUpIHdyb25nXG4iLCBpKTsKKwkgIHByaW50ZiAoIiAgZ290ICAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHIpOyBwcmludGYoIlxuIik7CisJICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBmKTsgcHJpbnRmKCJcbiIpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0gd2hpbGUgKCsrbiA8IGxpbWl0KTsKKyAgLyogQ2hlY2ggYSBzaW5nbGUgImJpZyIgdmFsdWUsIG1vZHVsbyBhIGxhcmdlciBwcmltZSAqLworICBuID0gMjA5NTYzNzsKKyAgbXB6X3ByaW1vcmlhbF91aSAociwgbik7CisgIG1wel9zZXRfdWkgKGYsIDEzKTsKKyAgbXB6X3NldGJpdCAoZiwgNjQpOyAvKiBmID0gMl42NCArIDEzICovCisgIG1wel90ZGl2X3IgKHIsIHIsIGYpOworICBtcHpfc2V0X3N0ciAoZiwgIkJBRkNCRjNDOTVCMjE3RDUiLCAxNik7CisKKyAgaWYgKG1wel9jbXAgKGYsIHIpICE9IDApCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3ByaW1vcmlhbF91aSglbHUpIHdyb25nXG4iLCBuKTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAiKTsgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHIpOyBwcmludGYoIlxuIik7CisgICAgICBwcmludGYgKCIgIHdhbnQgIik7IG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBmKTsgcHJpbnRmKCJcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKGYpOworICBtcHpfY2xlYXIgKHIpOworCisgIHRlc3RzX2VuZCAoKTsKKworICBleGl0ICgwKTsKK30KKworc3RhdGljIGludAoraXNwcmltZSAodW5zaWduZWQgbG9uZyBpbnQgdCkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcSwgciwgZDsKKworICBpZiAodCA8IDMgfHwgKHQgJiAxKSA9PSAwKQorICAgIHJldHVybiB0ID09IDI7CisKKyAgZm9yIChkID0gMywgciA9IDE7IHIgIT0gMDsgZCArPSAyKQorICAgIHsKKyAgICAgIHEgPSB0IC8gZDsKKyAgICAgIHIgPSB0IC0gcSAqIGQ7CisgICAgICBpZiAocSA8IGQpCisJcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXJlbW92ZS5jIGIvdGVzdHMvbXB6L3QtcmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiYTkxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXJlbW92ZS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBUZXN0IG1wel9yZW1vdmUuCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxLCAyMDA5LCAyMDEyLCAyMDEzIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZGVidWdfbXAgKG1wel90KTsKK3Vuc2lnbmVkIGxvbmcgaW50IG1wel9yZWZyZW1vdmUgKG1wel90LCBjb25zdCBtcHpfdCwgY29uc3QgbXB6X3QpOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgZXhwOworICBtcHpfdCB0LCBkZXN0LCByZWZkZXN0LCBkaXZpZGVuZCwgZGl2aXNvcjsKKyAgbXBfc2l6ZV90IGRpdmlkZW5kX3NpemUsIGRpdmlzb3Jfc2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcHdyLCByZWZwd3I7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICByYW5kcyA9IFJBTkRTOworCisgIGlmIChhcmdjID09IDIpCisgICAgcmVwcyA9IGF0b2kgKGFyZ3ZbMV0pOworCisgIG1wel9pbml0cyAoYnMsIHQsIGRlc3QsIHJlZmRlc3QsIGRpdmlkZW5kLCBkaXZpc29yLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTggKyAxOyAvKiAxLi41MjQyODggYml0IG9wZXJhbmRzICovCisKKyAgICAgIGRvCisJeworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworCSAgZGl2aXNvcl9zaXplID0gbXB6X2dldF91aSAoYnMpOworCSAgbXB6X3JyYW5kb21iIChkaXZpc29yLCByYW5kcywgZGl2aXNvcl9zaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X3NnbiAoZGl2aXNvcikgPT0gMCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGRpdmlkZW5kX3NpemUgPSBtcHpfZ2V0X3VpIChicykgKyBkaXZpc29yX3NpemU7CisgICAgICBtcHpfcnJhbmRvbWIgKGRpdmlkZW5kLCByYW5kcywgZGl2aWRlbmRfc2l6ZSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBleHAgPSBtcHpfZ2V0X3VpIChicykgJSAoNSArIDEwMDAwIC8gbXB6X3NpemVpbmJhc2UgKGRpdmlzb3IsIDIpKTsKKyAgICAgIGlmIChtcHpfZ2V0X3VpIChicykgJiAyKQorCW1wel9uZWcgKGRpdmlzb3IsIGRpdmlzb3IpOworICAgICAgbXB6X3Bvd191aSAodCwgZGl2aXNvciwgZXhwKTsKKyAgICAgIG1wel9tdWwgKGRpdmlkZW5kLCBkaXZpZGVuZCwgdCk7CisKKyAgICAgIHJlZnB3ciA9IG1wel9yZWZyZW1vdmUgKHJlZmRlc3QsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIHB3ciA9IG1wel9yZW1vdmUgKGRlc3QsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgaWYgKHJlZnB3ciAhPSBwd3IgfHwgbXB6X2NtcCAocmVmZGVzdCwgZGVzdCkgIT0gMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBhZnRlciAlZCB0ZXN0c1xuIiwgaSk7CisJICBmcHJpbnRmIChzdGRlcnIsICJyZWZwb3dlciA9ICVsdVxuIiwgcmVmcHdyKTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiAgIHBvd2VyID0gJWx1XG4iLCBwd3IpOworCSAgZnByaW50ZiAoc3RkZXJyLCAiICAgIG9wMSA9ICIpOyBkZWJ1Z19tcCAoZGl2aWRlbmQpOworCSAgZnByaW50ZiAoc3RkZXJyLCAiICAgIG9wMiA9ICIpOyBkZWJ1Z19tcCAoZGl2aXNvcik7CisJICBmcHJpbnRmIChzdGRlcnIsICJyZWZkZXN0ID0gIik7IGRlYnVnX21wIChyZWZkZXN0KTsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiAgIGRlc3QgPSAiKTsgZGVidWdfbXAgKGRlc3QpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKworICBtcHpfY2xlYXJzIChicywgdCwgZGVzdCwgcmVmZGVzdCwgZGl2aWRlbmQsIGRpdmlzb3IsIE5VTEwpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfcmVmcmVtb3ZlIChtcHpfdCBkZXN0LCBjb25zdCBtcHpfdCBzcmMsIGNvbnN0IG1wel90IGYpCit7CisgIHVuc2lnbmVkIGxvbmcgaW50IHB3cjsKKworICBwd3IgPSAwOworCisgIG1wel9zZXQgKGRlc3QsIHNyYyk7CisgIGlmIChtcHpfY21wYWJzX3VpIChmLCAxKSA+IDApCisgICAgeworICAgICAgbXB6X3QgcmVtLCB4OworCisgICAgICBtcHpfaW5pdCAoeCk7CisgICAgICBtcHpfaW5pdCAocmVtKTsKKworICAgICAgZm9yICg7OyBwd3IrKykKKwl7CisJICBtcHpfdGRpdl9xciAoeCwgcmVtLCBkZXN0LCBmKTsKKwkgIGlmIChtcHpfY21wX3VpIChyZW0sIDApICE9IDApCisJICAgIGJyZWFrOworCSAgbXB6X3N3YXAgKGRlc3QsIHgpOworCX0KKworICAgICAgbXB6X2NsZWFyICh4KTsKKyAgICAgIG1wel9jbGVhciAocmVtKTsKKyAgICB9CisKKyAgcmV0dXJuIHB3cjsKK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgpCit7CisgIHNpemVfdCBzaXogPSBtcHpfc2l6ZWluYmFzZSAoeCwgMTYpOworCisgIGlmIChzaXogPiA2NSkKKyAgICB7CisgICAgICBtcHpfdCBxOworICAgICAgbXB6X2luaXQgKHEpOworICAgICAgbXB6X3RkaXZfcV8yZXhwIChxLCB4LCA0ICogKG1wel9zaXplaW5iYXNlICh4LCAxNikgLSAyNSkpOworICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIiVaWC4uLiIsIHEpOworICAgICAgbXB6X3RkaXZfcl8yZXhwIChxLCB4LCA0ICogMjUpOworICAgICAgZ21wX2ZwcmludGYgKHN0ZGVyciwgIiUwMjVaWCBbJWRdXG4iLCBxLCAoaW50KSBzaXopOworICAgICAgbXB6X2NsZWFyIChxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnbXBfZnByaW50ZiAoc3RkZXJyLCAiJVpYXG4iLCB4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1yb290LmMgYi90ZXN0cy9tcHovdC1yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjZTE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXJvb3QuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogVGVzdCBtcHpfcm9vdCwgbXB6X3Jvb3RyZW0sIGFuZCBtcHpfcGVyZmVjdF9wb3dlcl9wLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMjAwMCwgMjAwMSwgMjAwOSwgMjAxNSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGRlYnVnX21wIChtcHpfdCwgaW50KTsKKwordm9pZAorY2hlY2tfb25lIChtcHpfdCByb290MSwgbXB6X3QgeDIsIHVuc2lnbmVkIGxvbmcgbnRoLCBpbnQgcmVzLCBpbnQgaSkKK3sKKyAgbXB6X3QgdGVtcCwgdGVtcDI7CisgIG1wel90IHJvb3QyLCByZW0yOworCisgIG1wel9pbml0IChyb290Mik7CisgIG1wel9pbml0IChyZW0yKTsKKyAgbXB6X2luaXQgKHRlbXApOworICBtcHpfaW5pdCAodGVtcDIpOworCisgIE1QWl9DSEVDS19GT1JNQVQgKHJvb3QxKTsKKworICBtcHpfcm9vdHJlbSAocm9vdDIsIHJlbTIsIHgyLCBudGgpOworICBNUFpfQ0hFQ0tfRk9STUFUIChyb290Mik7CisgIE1QWl9DSEVDS19GT1JNQVQgKHJlbTIpOworCisgIG1wel9wb3dfdWkgKHRlbXAsIHJvb3QxLCBudGgpOworICBNUFpfQ0hFQ0tfRk9STUFUICh0ZW1wKTsKKworICBtcHpfYWRkICh0ZW1wMiwgdGVtcCwgcmVtMik7CisKKyAgLyogSXMgcG93ZXIgb2YgcmVzdWx0ID4gYXJndW1lbnQ/ICAqLworICBpZiAobXB6X2NtcCAocm9vdDEsIHJvb3QyKSAhPSAwIHx8IG1wel9jbXAgKHgyLCB0ZW1wMikgIT0gMCB8fCBtcHpfY21wYWJzICh0ZW1wLCB4MikgPiAwIHx8IHJlcyA9PSBtcHpfY21wX3VpIChyZW0yLCAwKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBhZnRlciB0ZXN0ICVkXG4iLCBpKTsKKyAgICAgIGRlYnVnX21wICh4MiwgMTApOworICAgICAgZGVidWdfbXAgKHJvb3QxLCAxMCk7CisgICAgICBkZWJ1Z19tcCAocm9vdDIsIDEwKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm50aDogJWx1ICxyZXM6ICVpXG4iLCBudGgsIHJlcyk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKG50aCA+IDEgJiYgbXB6X2NtcF91aSAodGVtcCwgMUwpID4gMCAmJiAhIG1wel9wZXJmZWN0X3Bvd2VyX3AgKHRlbXApKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SIGluIG1wel9wZXJmZWN0X3Bvd2VyX3AgYWZ0ZXIgdGVzdCAlZFxuIiwgaSk7CisgICAgICBkZWJ1Z19tcCAodGVtcCwgMTApOworICAgICAgZGVidWdfbXAgKHJvb3QxLCAxMCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJudGg6ICVsdVxuIiwgbnRoKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBpZiAobnRoIDw9IDEwMDAwICYmIG1wel9zZ24oeDIpID4gMCkJCS8qIHNraXAgdG9vIGV4cGVuc2l2ZSB0ZXN0ICovCisgICAgeworICAgICAgbXB6X2FkZF91aSAodGVtcDIsIHJvb3QxLCAxTCk7CisgICAgICBtcHpfcG93X3VpICh0ZW1wMiwgdGVtcDIsIG50aCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0ZW1wMik7CisKKyAgICAgIC8qIElzIHNxdWFyZSBvZiAocmVzdWx0ICsgMSkgPD0gYXJndW1lbnQ/ICAqLworICAgICAgaWYgKG1wel9jbXAgKHRlbXAyLCB4MikgPD0gMCkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUiBhZnRlciB0ZXN0ICVkXG4iLCBpKTsKKwkgIGRlYnVnX21wICh4MiwgMTApOworCSAgZGVidWdfbXAgKHJvb3QxLCAxMCk7CisJICBmcHJpbnRmIChzdGRlcnIsICJudGg6ICVsdVxuIiwgbnRoKTsKKwkgIGFib3J0ICgpOworCX0KKyAgICB9CisKKyAgbXB6X2NsZWFyIChyb290Mik7CisgIG1wel9jbGVhciAocmVtMik7CisgIG1wel9jbGVhciAodGVtcCk7CisgIG1wel9jbGVhciAodGVtcDIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgeDI7CisgIG1wel90IHJvb3QxOworICBtcF9zaXplX3QgeDJfc2l6ZTsKKyAgaW50IGksIHJlczsKKyAgaW50IHJlcHMgPSA1MDA7CisgIHVuc2lnbmVkIGxvbmcgbnRoOworICBnbXBfcmFuZHN0YXRlX3B0ciByYW5kczsKKyAgbXB6X3QgYnM7CisgIHVuc2lnbmVkIGxvbmcgYnNpLCBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKHgyKTsKKyAgbXB6X2luaXQgKHJvb3QxKTsKKworICAvKiBUaGlzIHRyaWdnZXJzIGEgZ2NjIDQuMy4yIGJ1ZyAqLworICBtcHpfc2V0X3N0ciAoeDIsICJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIiLCAxNik7CisgIHJlcyA9IG1wel9yb290IChyb290MSwgeDIsIDIpOworICBjaGVja19vbmUgKHJvb3QxLCB4MiwgMiwgcmVzLCAtMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJlcHM7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMzIpOworICAgICAgc2l6ZV9yYW5nZSA9IG1wel9nZXRfdWkgKGJzKSAlIDE3ICsgMjsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgeDJfc2l6ZSA9IG1wel9nZXRfdWkgKGJzKSArIDEwOworICAgICAgbXB6X3JyYW5kb21iICh4MiwgcmFuZHMsIHgyX3NpemUpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGJzLCByYW5kcywgMTUpOworICAgICAgbnRoID0gbXB6X2dldGxpbWJuIChicywgMCkgJSBtcHpfc2l6ZWluYmFzZSAoeDIsIDIpICsgMjsKKworICAgICAgcmVzID0gbXB6X3Jvb3QgKHJvb3QxLCB4MiwgbnRoKTsKKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDQpOworICAgICAgYnNpID0gbXB6X2dldF91aSAoYnMpOworICAgICAgaWYgKChic2kgJiAxKSAhPSAwKQorCXsKKwkgIC8qIFdpdGggNTAlIHByb2JhYmlsaXR5LCBzZXQgeDIgbmVhciBhIHBlcmZlY3QgcG93ZXIuICAqLworCSAgbXB6X3Bvd191aSAoeDIsIHJvb3QxLCBudGgpOworCSAgaWYgKChic2kgJiAyKSAhPSAwKQorCSAgICB7CisJICAgICAgbXB6X3N1Yl91aSAoeDIsIHgyLCBic2kgPj4gMik7CisJICAgICAgbXB6X2FicyAoeDIsIHgyKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBtcHpfYWRkX3VpICh4MiwgeDIsIGJzaSA+PiAyKTsKKwkgIHJlcyA9IG1wel9yb290IChyb290MSwgeDIsIG50aCk7CisJfQorCisgICAgICBjaGVja19vbmUgKHJvb3QxLCB4MiwgbnRoLCByZXMsIGkpOworCisgICAgICBpZiAoKChudGggJiAxKSAhPSAwKSAmJiAoKGJzaSAmIDIpICE9IDApKQorCXsKKwkgIG1wel9uZWcgKHgyLCB4Mik7CisJICBtcHpfbmVnIChyb290MSwgcm9vdDEpOworCSAgY2hlY2tfb25lIChyb290MSwgeDIsIG50aCwgcmVzLCBpKTsKKwl9CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKHgyKTsKKyAgbXB6X2NsZWFyIChyb290MSk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KKwordm9pZAorZGVidWdfbXAgKG1wel90IHgsIGludCBiYXNlKQoreworICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBiYXNlLCB4KTsgZnB1dGMgKCdcbicsIHN0ZGVycik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1zY2FuLmMgYi90ZXN0cy9tcHovdC1zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYmNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXNjYW4uYwpAQCAtMCwwICsxLDEzMSBAQAorLyogVGVzdHMgb2YgbXB6X3NjYW4wIGFuZCBtcHpfc2NhbjEuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit1bnNpZ25lZCBsb25nCityZWZtcHpfc2NhbiAobXB6X3NyY3B0ciB6LCB1bnNpZ25lZCBsb25nIGksIGludCBzb3VnaHQpCit7CisgIHVuc2lnbmVkIGxvbmcgIHpfYml0cyA9ICh1bnNpZ25lZCBsb25nKSBBQlNJWih6KSAqIEdNUF9OVU1CX0JJVFM7CisKKyAgZG8KKyAgICB7CisgICAgICBpZiAobXB6X3RzdGJpdCAoeiwgaSkgPT0gc291Z2h0KQorICAgICAgICByZXR1cm4gaTsKKyAgICAgIGkrKzsKKyAgICB9CisgIHdoaWxlIChpIDw9IHpfYml0cyk7CisKKyAgcmV0dXJuIFVMT05HX01BWDsKK30KKwordW5zaWduZWQgbG9uZworcmVmbXB6X3NjYW4wIChtcHpfc3JjcHRyIHosIHVuc2lnbmVkIGxvbmcgc3RhcnRpbmdfYml0KQoreworICByZXR1cm4gcmVmbXB6X3NjYW4gKHosIHN0YXJ0aW5nX2JpdCwgMCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK3JlZm1wel9zY2FuMSAobXB6X3NyY3B0ciB6LCB1bnNpZ25lZCBsb25nIHN0YXJ0aW5nX2JpdCkKK3sKKyAgcmV0dXJuIHJlZm1wel9zY2FuICh6LCBzdGFydGluZ19iaXQsIDEpOworfQorCisKK3ZvaWQKK2NoZWNrX3JlZiAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGludCBvZmZzZXRbXSA9IHsKKyAgICAtMiwgLTEsIDAsIDEsIDIsIDMKKyAgfTsKKworICBtcHpfdCAgICAgICAgICB6OworICBpbnQgICAgICAgICAgICB0ZXN0LCBuZWcsIHNvdWdodCwgb2luZGV4LCBvOworICBtcF9zaXplX3QgICAgICBzaXplLCBpc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyAgc3RhcnQsIGdvdCwgd2FudDsKKworICBtcHpfaW5pdCAoeik7CisgIGZvciAodGVzdCA9IDA7IHRlc3QgPCA1OyB0ZXN0KyspCisgICAgeworICAgICAgZm9yIChzaXplID0gMDsgc2l6ZSA8IDU7IHNpemUrKykKKyAgICAgICAgeworICAgICAgICAgIG1wel9yYW5kb20yICh6LCBzaXplKTsKKworICAgICAgICAgIGZvciAobmVnID0gMDsgbmVnIDw9IDE7IG5lZysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAobmVnKQorICAgICAgICAgICAgICAgIG1wel9uZWcgKHosIHopOworCisgICAgICAgICAgICAgIGZvciAoaXNpemUgPSAwOyBpc2l6ZSA8PSBzaXplOyBpc2l6ZSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGZvciAob2luZGV4ID0gMDsgb2luZGV4IDwgbnVtYmVyb2YgKG9mZnNldCk7IG9pbmRleCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbyA9IG9mZnNldFtvaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KSBpc2l6ZSpHTVBfTlVNQl9CSVRTIDwgLW8pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIHN0YXJ0IHdvdWxkIGJlIG5lZ2F0aXZlICovCisKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGlzaXplKkdNUF9OVU1CX0JJVFMgKyBvOworCisgICAgICAgICAgICAgICAgICAgICAgZm9yIChzb3VnaHQgPSAwOyBzb3VnaHQgPD0gMTsgc291Z2h0KyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VnaHQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSBtcHpfc2NhbjAgKHosIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgPSByZWZtcHpfc2NhbjAgKHosIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSBtcHpfc2NhbjEgKHosIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgPSByZWZtcHpfc2NhbjEgKHosIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdvdCAhPSB3YW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIndyb25nIGF0IHRlc3Q9JWQsIHNpemU9JWxkLCBuZWc9JWQsIHN0YXJ0PSVsdSwgc291Z2h0PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LCBzaXplLCBuZWcsIHN0YXJ0LCBzb3VnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICAgeiAweCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgLTE2LCB6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIgICBnb3Q9JWx1LCB3YW50PSVsdVxuIiwgZ290LCB3YW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgbXB6X2NsZWFyICh6KTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX3JlZiAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3Qtc2V0X2QuYyBiL3Rlc3RzL21wei90LXNldF9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkZmMwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXNldF9kLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIFRlc3QgbXB6X3NldF9kIGFuZCBtcHpfaW5pdF9zZXRfZC4KKworQ29weXJpZ2h0IDIwMDAtMjAwMywgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGRvdWJsZSAgICAgZDsKKyAgICBtcF9zaXplX3QgIHdhbnRfc2l6ZTsKKyAgICBtcF9saW1iX3QgIHdhbnRfZGF0YVsyXTsKKyAgfSBkYXRhW10gPSB7CisKKyAgICB7ICAwLjAsICAwIH0sCisgICAgeyAgMS4wLCAgMSwgeyAxIH0gfSwKKyAgICB7IC0xLjAsIC0xLCB7IDEgfSB9LAorCisgICAgeyAgMTIzLjAsICAxLCB7IDEyMyB9IH0sCisgICAgeyAtMTIzLjAsIC0xLCB7IDEyMyB9IH0sCisKKyAgICB7IDFlLTEsIDAsIHsgMCB9IH0sCisgICAgeyAtMWUtMSwgMCwgeyAwIH0gfSwKKyAgICB7IDIuMzI4MzA2NDM2NTM4Njk2ZS0xMCwgMCwgeyAwIH0gfSwKKyAgICB7IC0yLjMyODMwNjQzNjUzODY5NmUtMTAsIDAsIHsgMCB9IH0sCisgICAgeyA1LjQyMTAxMDg2MjQyNzUyMmUtMjAsIDAsIHsgMCB9IH0sCisgICAgeyAtNS40MjEwMTA4NjI0Mjc1MjJlLTIwLCAwLCB7IDAgfSB9LAorICAgIHsgMi45Mzg3MzU4NzcwNTU3MTllLTM5LCAwLCB7IDAgfSB9LAorICAgIHsgLTIuOTM4NzM1ODc3MDU1NzE5ZS0zOSwgMCwgeyAwIH0gfSwKKyAgfTsKKworICBtcHpfdCAgejsKKyAgaW50ICAgIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9pbml0ICh6KTsKKyAgICAgIG1wel9zZXRfZCAoeiwgZGF0YVtpXS5kKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHopOworICAgICAgaWYgKHotPl9tcF9zaXplICE9IGRhdGFbaV0ud2FudF9zaXplCisgICAgICAgICAgfHwgcmVmbXBuX2NtcF9hbGxvd3plcm8gKHotPl9tcF9kLCBkYXRhW2ldLndhbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcHpfc2V0X2Qgd3Jvbmcgb24gZGF0YVslZF1cbiIsIGkpOworICAgICAgICBiYWQ6CisgICAgICAgICAgZF90cmFjZSAgICgiICBkICAiLCBkYXRhW2ldLmQpOworICAgICAgICAgIHByaW50ZiAgICAoIiAgZ290ICBzaXplICVsZFxuIiwgKGxvbmcpIHotPl9tcF9zaXplKTsKKyAgICAgICAgICBwcmludGYgICAgKCIgIHdhbnQgc2l6ZSAlbGRcbiIsIChsb25nKSBkYXRhW2ldLndhbnRfc2l6ZSk7CisgICAgICAgICAgbXBuX3RyYWNlICgiICBnb3QgIHoiLCB6LT5fbXBfZCwgei0+X21wX3NpemUpOworICAgICAgICAgIG1wbl90cmFjZSAoIiAgd2FudCB6IiwgZGF0YVtpXS53YW50X2RhdGEsIGRhdGFbaV0ud2FudF9zaXplKTsKKyAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICBtcHpfY2xlYXIgKHopOworCisgICAgICBtcHpfaW5pdF9zZXRfZCAoeiwgZGF0YVtpXS5kKTsKKyAgICAgIE1QWl9DSEVDS19GT1JNQVQgKHopOworICAgICAgaWYgKHotPl9tcF9zaXplICE9IGRhdGFbaV0ud2FudF9zaXplCisgICAgICAgICAgfHwgcmVmbXBuX2NtcF9hbGxvd3plcm8gKHotPl9tcF9kLCBkYXRhW2ldLndhbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTIChkYXRhW2ldLndhbnRfc2l6ZSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJtcHpfaW5pdF9zZXRfZCB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgIG1wel9jbGVhciAoeik7CisgICAgfQorfQorCisvKiBUcnkgbXB6X3NldF9kIG9uIHZhbHVlcyAyXmkrMSwgd2hpbGUgc3VjaCBhIHZhbHVlIGZpdHMgYSBkb3VibGUuICovCit2b2lkCitjaGVja18ybl9wbHVzXzEgKHZvaWQpCit7CisgIHZvbGF0aWxlIGRvdWJsZSAgcCwgZCwgZGlmZjsKKyAgbXB6X3QgIHdhbnQsIGdvdDsKKyAgaW50ICAgIGk7CisKKyAgbXB6X2luaXQgKHdhbnQpOworICBtcHpfaW5pdCAoZ290KTsKKworICBwID0gMS4wOworICBtcHpfc2V0X3VpICh3YW50LCAyTCk7ICAvKiBnaXZlcyAzIG9uIGZpcnN0IHN0ZXAgKi8KKworICBmb3IgKGkgPSAxOyBpIDwgNTAwOyBpKyspCisgICAgeworICAgICAgbXB6X211bF8yZXhwICh3YW50LCB3YW50LCAxTCk7CisgICAgICBtcHpfc3ViX3VpICh3YW50LCB3YW50LCAxTCk7ICAgLyogd2FudCA9IDJeaSsxICovCisKKyAgICAgIHAgKj0gMi4wOyAgLyogcCA9IDJeaSAqLworICAgICAgZCA9IHAgKyAxLjA7CisgICAgICBkaWZmID0gZCAtIHA7CisgICAgICBpZiAoZGlmZiAhPSAxLjApCisgICAgICAgIGJyZWFrOyAgIC8qIHJvdW5kaW5nIG9jY3VycmVkLCBzdG9wIG5vdyAqLworCisgICAgICBtcHpfc2V0X2QgKGdvdCwgZCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworICAgICAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9zZXRfZCB3cm9uZyBvbiAyXiVkKzFcbiIsIGkpOworICAgICAgICAgIGRfdHJhY2UgICAoIiAgZCAiLCBkKTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgIGdvdCAgIiwgZ290KTsKKyAgICAgICAgICBtcHpfdHJhY2UgKCIgIHdhbnQgIiwgd2FudCk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbXB6X2NsZWFyICh3YW50KTsKKyAgbXB6X2NsZWFyIChnb3QpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX2RhdGEgKCk7CisgIGNoZWNrXzJuX3BsdXNfMSAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3Qtc2V0X2YuYyBiL3Rlc3RzL21wei90LXNldF9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3MWE4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXNldF9mLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIFRlc3QgbXB6X3NldF9mLgorCitDb3B5cmlnaHQgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX29uZSAobXB6X3NyY3B0ciB6KQoreworICBzdGF0aWMgY29uc3QgaW50IHNoaWZ0W10gPSB7CisgICAgMCwgMSwgR01QX0xJTUJfQklUUywgMipHTVBfTElNQl9CSVRTLCA1KkdNUF9MSU1CX0JJVFMKKyAgfTsKKworICBpbnQgICAgc2gsIHNobmVnLCBuZWc7CisgIG1wZl90ICBmOworICBtcHpfdCAgZ290LCB3YW50OworCisgIG1wZl9pbml0MiAoZiwgbXB6X3NpemVpbmJhc2UoeiwyKSk7CisgIG1wel9pbml0IChnb3QpOworICBtcHpfaW5pdCAod2FudCk7CisKKyAgZm9yIChzaCA9IDA7IHNoIDwgbnVtYmVyb2Yoc2hpZnQpOyBzaCsrKQorICAgIHsKKyAgICAgIGZvciAoc2huZWcgPSAwOyBzaG5lZyA8PSAxOyBzaG5lZysrKQorCXsKKwkgIGZvciAobmVnID0gMDsgbmVnIDw9IDE7IG5lZysrKQorCSAgICB7CisJICAgICAgbXBmX3NldF96IChmLCB6KTsKKwkgICAgICBtcHpfc2V0ICh3YW50LCB6KTsKKworCSAgICAgIGlmIChuZWcpCisJCXsKKwkJICBtcGZfbmVnIChmLCBmKTsKKwkJICBtcHpfbmVnICh3YW50LCB3YW50KTsKKwkJfQorCisJICAgICAgaWYgKHNobmVnKQorCQl7CisJCSAgbXB6X3RkaXZfcV8yZXhwICh3YW50LCB3YW50LCBzaGlmdFtzaF0pOworCQkgIG1wZl9kaXZfMmV4cCAoZiwgZiwgc2hpZnRbc2hdKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIG1wel9tdWxfMmV4cCAod2FudCwgd2FudCwgc2hpZnRbc2hdKTsKKwkJICBtcGZfbXVsXzJleHAgKGYsIGYsIHNoaWZ0W3NoXSk7CisJCX0KKworCSAgICAgIG1wel9zZXRfZiAoZ290LCBmKTsKKwkgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworCisJICAgICAgaWYgKG1wel9jbXAgKGdvdCwgd2FudCkgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoIndyb25nIHJlc3VsdFxuIik7CisJCSAgcHJpbnRmICgiICBzaGlmdCAgJWRcbiIsIHNobmVnID8gLXNoaWZ0W3NoXSA6IHNoaWZ0W3NoXSk7CisJCSAgcHJpbnRmICgiICBuZWcgICAgJWRcbiIsIG5lZyk7CisJCSAgbXBmX3RyYWNlICgiICAgICBmIiwgZik7CisJCSAgbXB6X3RyYWNlICgiICAgZ290IiwgZ290KTsKKwkJICBtcHpfdHJhY2UgKCIgIHdhbnQiLCB3YW50KTsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBtcGZfY2xlYXIgKGYpOworICBtcHpfY2xlYXIgKGdvdCk7CisgIG1wel9jbGVhciAod2FudCk7Cit9CisKKwordm9pZAorY2hlY2tfdmFyaW91cyAodm9pZCkKK3sKKyAgbXB6X3QgIHo7CisKKyAgbXB6X2luaXQgKHopOworCisgIG1wel9zZXRfdWkgKHosIDBMKTsKKyAgY2hlY2tfb25lICh6KTsKKworICBtcHpfc2V0X3NpICh6LCAxMjNMKTsKKyAgY2hlY2tfb25lICh6KTsKKworICBtcHpfcnJhbmRvbWIgKHosIFJBTkRTLCAyKkdNUF9MSU1CX0JJVFMpOworICBjaGVja19vbmUgKHopOworCisgIG1wel9ycmFuZG9tYiAoeiwgUkFORFMsIDUqR01QX0xJTUJfQklUUyk7CisgIGNoZWNrX29uZSAoeik7CisKKyAgbXB6X2NsZWFyICh6KTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgR01QX05BSUxfQklUUyA9PSAwCisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gMTY7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisjZW5kaWYKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1zZXRfc2kuYyBiL3Rlc3RzL21wei90LXNldF9zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOGVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1zZXRfc2kuYwpAQCAtMCwwICsxLDk2IEBACisvKiBUZXN0IG1wel9zZXRfc2kgYW5kIG1wel9pbml0X3NldF9zaS4KKworQ29weXJpZ2h0IDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisjaWYgR01QX05VTUJfQklUUyA8PSBCSVRTX1BFUl9VTE9ORworI2RlZmluZSBFTlRSWShuKSAgIHsgbiwgeyBuLCAwIH0gfQorI2Vsc2UKKyNkZWZpbmUgRU5UUlkobikgICB7IG4sIHsgKG4pICYgR01QX05VTUJfTUFTSywgKG4pID4+IEdNUF9OVU1CX0JJVFMgfSB9CisjZW5kaWYKKworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBsb25nICAgICAgIG47CisgICAgbXBfc2l6ZV90ICB3YW50X3NpemU7CisgICAgbXBfbGltYl90ICB3YW50X2RhdGFbMl07CisgIH0gZGF0YVtdID0geworCisgICAgeyAgMEwsICAwIH0sCisgICAgeyAgMUwsICAxLCB7IDEgfSB9LAorICAgIHsgLTFMLCAtMSwgeyAxIH0gfSwKKworI2lmIEdNUF9OVU1CX0JJVFMgPj0gQklUU19QRVJfVUxPTkcKKyAgICB7IExPTkdfTUFYLCAgMSwgeyBMT05HX01BWCwgMCB9IH0sCisgICAgeyAtTE9OR19NQVgsICAtMSwgeyBMT05HX01BWCwgMCB9IH0sCisgICAgeyBMT05HX0hJR0hCSVQsICAtMSwgeyBVTE9OR19ISUdIQklULCAwIH0gfSwKKyNlbHNlCisgICAgeyBMT05HX01BWCwgIDIsIHsgTE9OR19NQVggJiBHTVBfTlVNQl9NQVNLLCBMT05HX01BWCA+PiBHTVBfTlVNQl9CSVRTIH0gfSwKKyAgICB7IC1MT05HX01BWCwgIC0yLCB7IExPTkdfTUFYICYgR01QX05VTUJfTUFTSywgTE9OR19NQVggPj4gR01QX05VTUJfQklUUyB9fSwKKyAgICB7IExPTkdfSElHSEJJVCwgIC0yLCB7IDAsIFVMT05HX0hJR0hCSVQgPj4gR01QX05VTUJfQklUUyB9IH0sCisjZW5kaWYKKyAgfTsKKworICBtcHpfdCAgbjsKKyAgaW50ICAgIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIG1wel9pbml0IChuKTsKKyAgICAgIG1wel9zZXRfc2kgKG4sIGRhdGFbaV0ubik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChuKTsKKyAgICAgIGlmIChuLT5fbXBfc2l6ZSAhPSBkYXRhW2ldLndhbnRfc2l6ZQorICAgICAgICAgIHx8IHJlZm1wbl9jbXBfYWxsb3d6ZXJvIChuLT5fbXBfZCwgZGF0YVtpXS53YW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAoZGF0YVtpXS53YW50X3NpemUpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgibXB6X3NldF9zaSB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgbXB6X2NsZWFyIChuKTsKKworICAgICAgbXB6X2luaXRfc2V0X3NpIChuLCBkYXRhW2ldLm4pOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAobik7CisgICAgICBpZiAobi0+X21wX3NpemUgIT0gZGF0YVtpXS53YW50X3NpemUKKyAgICAgICAgICB8fCByZWZtcG5fY21wX2FsbG93emVybyAobi0+X21wX2QsIGRhdGFbaV0ud2FudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgKGRhdGFbaV0ud2FudF9zaXplKSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIm1wel9pbml0X3NldF9zaSB3cm9uZyBvbiBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgbXB6X2NsZWFyIChuKTsKKyAgICB9Cit9CisKKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjaGVja19kYXRhICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tcHovdC1zZXRfc3RyLmMgYi90ZXN0cy9tcHovdC1zZXRfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMzZkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wei90LXNldF9zdHIuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogVGVzdCBtcHpfc2V0X3N0ci4KKworQ29weXJpZ2h0IDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCit2b2lkCitjaGVja19vbmUgKG1wel9zcmNwdHIgd2FudCwgaW50IGZhaWwsIGludCBiYXNlLCBjb25zdCBjaGFyICpzdHIpCit7CisgIG1wel90ICAgZ290OworCisgIE1QWl9DSEVDS19GT1JNQVQgKHdhbnQpOworICBtcF90cmFjZV9iYXNlID0gKGJhc2UgPT0gMCA/IDE2IDogYmFzZSk7CisKKyAgbXB6X2luaXQgKGdvdCk7CisKKyAgaWYgKG1wel9zZXRfc3RyIChnb3QsIHN0ciwgYmFzZSkgIT0gZmFpbCkKKyAgICB7CisgICAgICBwcmludGYgKCJtcHpfc2V0X3N0ciB1bmV4cGVjdGVkbHkgZmFpbGVkXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgYmFzZSAlZFxuIiwgYmFzZSk7CisgICAgICBwcmludGYgKCIgIHN0ciAgXCIlc1wiXG4iLCBzdHIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBNUFpfQ0hFQ0tfRk9STUFUIChnb3QpOworCisgIGlmIChmYWlsID09IDAgJiYgbXB6X2NtcCAoZ290LCB3YW50KSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIm1wel9zZXRfc3RyIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgYmFzZSAlZFxuIiwgYmFzZSk7CisgICAgICBwcmludGYgKCIgIHN0ciAgXCIlc1wiXG4iLCBzdHIpOworICAgICAgbXB6X3RyYWNlICgiZ290ICIsIGdvdCk7CisgICAgICBtcHpfdHJhY2UgKCJ3YW50Iiwgd2FudCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChnb3QpOworfQorCit2b2lkCitjaGVja19zYW1wbGVzICh2b2lkKQoreworICBtcHpfdCAgejsKKworICBtcHpfaW5pdCAoeik7CisKKyAgbXB6X3NldF91aSAoeiwgMEwpOworICBjaGVja19vbmUgKHosIDAsIDAsICIwICIpOworICBjaGVja19vbmUgKHosIDAsIDAsICIgMCAwIDAgIik7CisgIGNoZWNrX29uZSAoeiwgMCwgMCwgIiAtMEIgMCAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAwLCAiICAwWCAwICIpOworICBjaGVja19vbmUgKHosIDAsIDEwLCAiMCAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAxMCwgIi0wICAgIik7CisgIGNoZWNrX29uZSAoeiwgMCwgMTAsICIgMCAwMDAgMDAwICAgICIpOworCisgIG1wel9zZXRfdWkgKHosIDEyM0wpOworICBjaGVja19vbmUgKHosIDAsIDAsICIxMjMgIik7CisgIGNoZWNrX29uZSAoeiwgMCwgMCwgIjEyMyAgICAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAwLCAiMDE3MyAgICIpOworICBjaGVja19vbmUgKHosIDAsIDAsICIgMGIgMSAxMSAxMCAxMSAgIik7CisgIGNoZWNrX29uZSAoeiwgMCwgMCwgIiAweCA3YiAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAwLCAiMHg3QiIpOworICBjaGVja19vbmUgKHosIDAsIDEwLCAiMTIzICIpOworICBjaGVja19vbmUgKHosIDAsIDEwLCAiMTIzICAgICIpOworICBjaGVja19vbmUgKHosIDAsIDAsICIgMTIzICIpOworICBjaGVja19vbmUgKHosIDAsIDAsICIgIDEyMyAgICAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAxMCwgIiAgMDAwMDEyMyAiKTsKKyAgY2hlY2tfb25lICh6LCAwLCAxMCwgIiAgMTIzICAgICIpOworICBjaGVja19vbmUgKHosLTEsIDEwLCAiMSUiKTsKKyAgY2hlY2tfb25lICh6LC0xLCAwLCAiMyEiKTsKKyAgY2hlY2tfb25lICh6LC0xLCAwLCAiMDEyMzQ1Njc4OSIpOworICBjaGVja19vbmUgKHosLTEsIDAsICIxMzU3OUJERiIpOworICBjaGVja19vbmUgKHosLTEsIDAsICIwYjAxMDIiKTsKKyAgY2hlY2tfb25lICh6LC0xLCAwLCAiMHgwMTBHIik7CisgIGNoZWNrX29uZSAoeiwtMSwgMzcsIjB4MDEwRyIpOworICBjaGVja19vbmUgKHosLTEsIDk5LCIweDAxMEciKTsKKworICBtcHpfY2xlYXIgKHopOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGNoZWNrX3NhbXBsZXMgKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21wei90LXNpemVpbmJhc2UuYyBiL3Rlc3RzL21wei90LXNpemVpbmJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZmMmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXB6L3Qtc2l6ZWluYmFzZS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIFRlc3QgbXB6X3NpemVpbmJhc2UuCisKK0NvcHlyaWdodCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKworI2lmIDAKKyAgLyogRGlzYWJsZWQgZHVlIHRvIHRoZSBib2dvc2l0eSBvZiB0cnlpbmcgdG8gZmFrZSBhbiBfbXBfZCBwb2ludGVyIHRvCisgICAgIGJlbG93IGFuIG9iamVjdC4gIEhhcyBiZWVuIHNlZW4gdG8gZmFpbCBvbiBhIGhwcGEgc3lzdGVtIGFuZCBvbiBpYTY0LiAgKi8KKworCisvKiBDcmVhdGUgYSBmYWtlIG1weiBjb25zaXN0aW5nIG9mIGp1c3QgYSBzaW5nbGUgMSBiaXQsIHdpdGggdG90Yml0cyBiZWluZworICAgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzLCBpbmNsdXNpdmUgb2YgdGhhdCAxIGJpdC4gICovCit2b2lkCittcHpfZmFrZV9iaXRzIChtcHpfcHRyIHosIHVuc2lnbmVkIGxvbmcgdG90Yml0cykKK3sKKyAgc3RhdGljIG1wX2xpbWJfdCAgbjsKKyAgdW5zaWduZWQgbG9uZyAgICAgemVyb19iaXRzLCB6ZXJvX2xpbWJzOworCisgIHplcm9fYml0cyA9IHRvdGJpdHMgLSAxOworICB6ZXJvX2xpbWJzID0gemVyb19iaXRzIC8gR01QX05VTUJfQklUUzsKKyAgemVyb19iaXRzICU9IEdNUF9OVU1CX0JJVFM7CisKKyAgU0laKHopID0gemVyb19saW1icyArIDE7CisgIFBUUih6KSA9ICgmbikgLSAoU0laKHopIC0gMSk7CisgIG4gPSBDTlNUX0xJTUIoMSkgPDwgemVyb19iaXRzOworCisgIEFTU0VSVF9BTFdBWVMgKG1wel9zaXplaW5iYXNlICh6LCAyKSA9PSB0b3RiaXRzKTsKK30KKworCisvKiBUaGlzIHdhcyBzZWVuIHRvIGZhaWwgb24gYSBHTlUvTGludXggcG93ZXJwYzMyIHdpdGggZ2NjIDIuOTUuMiwKKyAgIGFwcGFyZW50bHkgZHVlIHRvIGEgZG91YnRmdWwgdmFsdWUgb2YgbXBfYmFzZXNbMTBdLmNoYXJzX3Blcl9iaXRfZXhhY3RseQorICAgKDBYMS4zNDQxMzUwOUY3OUZEUC0yIHdoZXJlYXMgMFgxLjM0NDEzNTA5Rjc5RkZQLTIgaXMgYmVsaWV2ZWQgY29ycmVjdCkuCisgICBQcmVzdW1hYmx5IHRoaXMgaXMgYSBnbGliYyBwcm9ibGVtIHdoZW4gZ2NjIGNvbnZlcnRzIHRoZSBkZWNpbWFsIHN0cmluZworICAgaW4gbXBfYmFzZXMuYywgb3IgbWF5YmUgaXQncyBvbmx5IGEgZnVuY3Rpb24gb2YgdGhlIHJvdW5kaW5nIG1vZGUgZHVyaW5nCisgICBjb21waWxhdGlvbi4gICovCit2b2lkCitjaGVja19zYW1wbGUgKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgIHRvdGJpdHMgPSAxOTgwOTY0NjU7CisgIGludCAgICAgICAgYmFzZSA9IDEwOworICBzaXplX3QgICAgIHdhbnQgPSA1OTYzMjk3OTsKKyAgc2l6ZV90ICAgICBnb3Q7CisgIG1wel90ICAgICAgejsKKworICBtcHpfZmFrZV9iaXRzICh6LCB0b3RiaXRzKTsKKyAgZ290ID0gbXB6X3NpemVpbmJhc2UgKHosIGJhc2UpOworICBpZiAoZ290ICE9IHdhbnQpCisgICAgeworICAgICAgcHJpbnRmICgibXB6X3NpemVpbmJhc2VcbiIpOworICAgICAgcHJpbnRmICgiICBiYXNlICAgICVkXG4iLCAgYmFzZSk7CisgICAgICBwcmludGYgKCIgIHRvdGJpdHMgJWx1XG4iLCB0b3RiaXRzKTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAgICAldVxuIiwgIGdvdCk7CisgICAgICBwcmludGYgKCIgIHdhbnQgICAgJXVcbiIsICB3YW50KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKyNlbmRpZgorCitpbnQKK21haW4gKHZvaWQpCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIC8qIGNoZWNrX3NhbXBsZSAoKTsgKi8KKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3Qtc3FydHJlbS5jIGIvdGVzdHMvbXB6L3Qtc3FydHJlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjhhNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC1zcXJ0cmVtLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIFRlc3QgbXB6X2FkZCwgbXB6X2FkZF91aSwgbXB6X2NtcCwgbXB6X2NtcCwgbXB6X211bCwgbXB6X3NxcnRyZW0uCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCit2b2lkIGR1bXBfYWJvcnQgKG1wel90LCBtcHpfdCwgbXB6X3QpOwordm9pZCBkZWJ1Z19tcCAobXB6X3QsIGludCk7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBtcHpfdCB4MjsKKyAgbXB6X3QgeCwgcmVtOworICBtcHpfdCB0ZW1wLCB0ZW1wMjsKKyAgbXBfc2l6ZV90IHgyX3NpemU7CisgIGludCBpOworICBpbnQgcmVwcyA9IDEwMDA7CisgIGdtcF9yYW5kc3RhdGVfcHRyIHJhbmRzOworICBtcHpfdCBiczsKKyAgdW5zaWduZWQgbG9uZyBzaXplX3JhbmdlOworCisgIHRlc3RzX3N0YXJ0ICgpOworICBURVNUU19SRVBTIChyZXBzLCBhcmd2LCBhcmdjKTsKKworICByYW5kcyA9IFJBTkRTOworCisgIG1wel9pbml0IChicyk7CisKKyAgbXB6X2luaXQgKHgyKTsKKyAgbXB6X2luaXQgKHgpOworICBtcHpfaW5pdCAocmVtKTsKKyAgbXB6X2luaXQgKHRlbXApOworICBtcHpfaW5pdCAodGVtcDIpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxNyArIDI7IC8qIDAuLjI2MjE0NCBiaXQgb3BlcmFuZHMgKi8KKworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworICAgICAgeDJfc2l6ZSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIG1wel9ycmFuZG9tYiAoeDIsIHJhbmRzLCB4Ml9zaXplKTsKKworICAgICAgLyogcHJpbnRmICgiJWxkXG4iLCBTSVogKHgyKSk7ICovCisKKyAgICAgIG1wel9zcXJ0ICh0ZW1wLCB4Mik7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUICh0ZW1wKTsKKworICAgICAgbXB6X3NxcnRyZW0gKHgsIHJlbSwgeDIpOworICAgICAgTVBaX0NIRUNLX0ZPUk1BVCAoeCk7CisgICAgICBNUFpfQ0hFQ0tfRk9STUFUIChyZW0pOworCisgICAgICAvKiBBcmUgcmVzdWx0cyBkaWZmZXJlbnQ/ICAqLworICAgICAgaWYgKG1wel9jbXAgKHRlbXAsIHgpICE9IDApCisJZHVtcF9hYm9ydCAoeDIsIHgsIHJlbSk7CisKKyAgICAgIG1wel9tdWwgKHRlbXAsIHgsIHgpOworCisgICAgICAvKiBJcyBzcXVhcmUgb2YgcmVzdWx0ID4gYXJndW1lbnQ/ICAqLworICAgICAgaWYgKG1wel9jbXAgKHRlbXAsIHgyKSA+IDApCisJZHVtcF9hYm9ydCAoeDIsIHgsIHJlbSk7CisKKyAgICAgIG1wel9hZGRfdWkgKHRlbXAyLCB4LCAxKTsKKyAgICAgIG1wel9tdWwgKHRlbXAyLCB0ZW1wMiwgdGVtcDIpOworCisgICAgICAvKiBJcyBzcXVhcmUgb2YgKHJlc3VsdCArIDEpIDw9IGFyZ3VtZW50PyAgKi8KKyAgICAgIGlmIChtcHpfY21wICh0ZW1wMiwgeDIpIDw9IDApCisJZHVtcF9hYm9ydCAoeDIsIHgsIHJlbSk7CisKKyAgICAgIG1wel9hZGQgKHRlbXAyLCB0ZW1wLCByZW0pOworCisgICAgICAvKiBJcyB0aGUgcmVtYWluZGVyIHdyb25nPyAgKi8KKyAgICAgIGlmIChtcHpfY21wICh4MiwgdGVtcDIpICE9IDApCisJZHVtcF9hYm9ydCAoeDIsIHgsIHJlbSk7CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKHgyKTsKKyAgbXB6X2NsZWFyICh4KTsKKyAgbXB6X2NsZWFyIChyZW0pOworICBtcHpfY2xlYXIgKHRlbXApOworICBtcHpfY2xlYXIgKHRlbXAyKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCit2b2lkCitkdW1wX2Fib3J0IChtcHpfdCB4MiwgbXB6X3QgeCwgbXB6X3QgcmVtKQoreworICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIngyICAgICAgICA9ICIpOyBkZWJ1Z19tcCAoeDIsIC0xNik7CisgIGZwcmludGYgKHN0ZGVyciwgInggICAgICAgICA9ICIpOyBkZWJ1Z19tcCAoeCwgLTE2KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAicmVtYWluZGVyID0gIik7IGRlYnVnX21wIChyZW0sIC0xNik7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZGVyciwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtdGRpdi5jIGIvdGVzdHMvbXB6L3QtdGRpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmViMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC10ZGl2LmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIFRlc3QgbXB6X2FicywgbXB6X2FkZCwgbXB6X2NtcCwgbXB6X2NtcF91aSwgbXB6X3RkaXZfcXIsIG1wel90ZGl2X3EsCisgICBtcHpfdGRpdl9yLCBtcHpfbXVsLgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZHVtcF9hYm9ydCAobXB6X3QsIG1wel90KTsKK3ZvaWQgZGVidWdfbXAgKG1wel90LCBpbnQpOworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgbXB6X3QgZGl2aWRlbmQsIGRpdmlzb3I7CisgIG1wel90IHF1b3RpZW50LCByZW1haW5kZXI7CisgIG1wel90IHF1b3RpZW50MiwgcmVtYWluZGVyMjsKKyAgbXB6X3QgdGVtcDsKKyAgbXBfc2l6ZV90IGRpdmlkZW5kX3NpemUsIGRpdmlzb3Jfc2l6ZTsKKyAgaW50IGk7CisgIGludCByZXBzID0gMTAwMDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgVEVTVFNfUkVQUyAocmVwcywgYXJndiwgYXJnYyk7CisKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworCisgIG1wel9pbml0IChkaXZpZGVuZCk7CisgIG1wel9pbml0IChkaXZpc29yKTsKKyAgbXB6X2luaXQgKHF1b3RpZW50KTsKKyAgbXB6X2luaXQgKHJlbWFpbmRlcik7CisgIG1wel9pbml0IChxdW90aWVudDIpOworICBtcHpfaW5pdCAocmVtYWluZGVyMik7CisgIG1wel9pbml0ICh0ZW1wKTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmVwczsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAzMik7CisgICAgICBzaXplX3JhbmdlID0gbXB6X2dldF91aSAoYnMpICUgMTggKyAyOyAvKiAwLi41MjQyODggYml0IG9wZXJhbmRzICovCisKKyAgICAgIGRvCisJeworCSAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIHNpemVfcmFuZ2UpOworCSAgZGl2aXNvcl9zaXplID0gbXB6X2dldF91aSAoYnMpOworCSAgbXB6X3JyYW5kb21iIChkaXZpc29yLCByYW5kcywgZGl2aXNvcl9zaXplKTsKKwl9CisgICAgICB3aGlsZSAobXB6X3NnbiAoZGl2aXNvcikgPT0gMCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGRpdmlkZW5kX3NpemUgPSBtcHpfZ2V0X3VpIChicykgKyBkaXZpc29yX3NpemU7CisgICAgICBtcHpfcnJhbmRvbWIgKGRpdmlkZW5kLCByYW5kcywgZGl2aWRlbmRfc2l6ZSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAyKTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChkaXZpZGVuZCwgZGl2aWRlbmQpOworICAgICAgaWYgKChic2kgJiAyKSAhPSAwKQorCW1wel9uZWcgKGRpdmlzb3IsIGRpdmlzb3IpOworCisgICAgICAvKiBwcmludGYgKCIlbGQgJWxkXG4iLCBTSVogKGRpdmlkZW5kKSwgU0laIChkaXZpc29yKSk7ICovCisKKyAgICAgIG1wel90ZGl2X3FyIChxdW90aWVudCwgcmVtYWluZGVyLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBtcHpfdGRpdl9xIChxdW90aWVudDIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIG1wel90ZGl2X3IgKHJlbWFpbmRlcjIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogRmlyc3QgZGV0ZXJtaW5lIHRoYXQgdGhlIHF1b3RpZW50cyBhbmQgcmVtYWluZGVycyBjb21wdXRlZAorCSB3aXRoIGRpZmZlcmVudCBmdW5jdGlvbnMgYXJlIGVxdWFsLiAgKi8KKyAgICAgIGlmIChtcHpfY21wIChxdW90aWVudCwgcXVvdGllbnQyKSAhPSAwKQorCWR1bXBfYWJvcnQgKGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIGlmIChtcHpfY21wIChyZW1haW5kZXIsIHJlbWFpbmRlcjIpICE9IDApCisJZHVtcF9hYm9ydCAoZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgc2lnbiBvZiB0aGUgcXVvdGllbnQgaXMgY29ycmVjdC4gICovCisgICAgICBpZiAobXB6X2NtcF91aSAocXVvdGllbnQsIDApICE9IDApCisJaWYgKChtcHpfY21wX3VpIChxdW90aWVudCwgMCkgPCAwKQorCSAgICAhPSAoKG1wel9jbXBfdWkgKGRpdmlkZW5kLCAwKSBeIG1wel9jbXBfdWkgKGRpdmlzb3IsIDApKSA8IDApKQorCWR1bXBfYWJvcnQgKGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIHJlbWFpbmRlciBoYXMgdGhlIHNhbWUgc2lnbiBhcyB0aGUgZGl2aWRlbmQKKwkgKHF1b3RpZW50IHJvdW5kZWQgdG93YXJkcyAwKS4gICovCisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCAwKSAhPSAwKQorCWlmICgobXB6X2NtcF91aSAocmVtYWluZGVyLCAwKSA8IDApICE9IChtcHpfY21wX3VpIChkaXZpZGVuZCwgMCkgPCAwKSkKKwkgIGR1bXBfYWJvcnQgKGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgbXB6X211bCAodGVtcCwgcXVvdGllbnQsIGRpdmlzb3IpOworICAgICAgbXB6X2FkZCAodGVtcCwgdGVtcCwgcmVtYWluZGVyKTsKKyAgICAgIGlmIChtcHpfY21wICh0ZW1wLCBkaXZpZGVuZCkgIT0gMCkKKwlkdW1wX2Fib3J0IChkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIG1wel9hYnMgKHRlbXAsIGRpdmlzb3IpOworICAgICAgbXB6X2FicyAocmVtYWluZGVyLCByZW1haW5kZXIpOworICAgICAgaWYgKG1wel9jbXAgKHJlbWFpbmRlciwgdGVtcCkgPj0gMCkKKwlkdW1wX2Fib3J0IChkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgfQorCisgIG1wel9jbGVhciAoYnMpOworICBtcHpfY2xlYXIgKGRpdmlkZW5kKTsKKyAgbXB6X2NsZWFyIChkaXZpc29yKTsKKyAgbXB6X2NsZWFyIChxdW90aWVudCk7CisgIG1wel9jbGVhciAocmVtYWluZGVyKTsKKyAgbXB6X2NsZWFyIChxdW90aWVudDIpOworICBtcHpfY2xlYXIgKHJlbWFpbmRlcjIpOworICBtcHpfY2xlYXIgKHRlbXApOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CisKK3ZvaWQKK2R1bXBfYWJvcnQgKG1wel90IGRpdmlkZW5kLCBtcHpfdCBkaXZpc29yKQoreworICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgImRpdmlkZW5kID0gIik7IGRlYnVnX21wIChkaXZpZGVuZCwgLTE2KTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGl2aXNvciAgPSAiKTsgZGVidWdfbXAgKGRpdmlzb3IsIC0xNik7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZGVyciwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbXB6L3QtdGRpdl91aS5jIGIvdGVzdHMvbXB6L3QtdGRpdl91aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmI5NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcHovdC10ZGl2X3VpLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIFRlc3QgbXB6X2FicywgbXB6X2FkZCwgbXB6X2NtcCwgbXB6X2NtcF91aSwgbXB6X3RkaXZfcXJfdWksIG1wel90ZGl2X3FfdWksCisgICBtcHpfdGRpdl9yX3VpLCBtcHpfdGRpdl91aSwgbXB6X211bF91aS4KKworQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQgZHVtcF9hYm9ydCAoY29uc3QgY2hhciAqLCBtcHpfdCwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIGRlYnVnX21wIChtcHpfdCwgaW50KTsKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIG1wel90IGRpdmlkZW5kOworICBtcHpfdCBxdW90aWVudCwgcmVtYWluZGVyOworICBtcHpfdCBxdW90aWVudDIsIHJlbWFpbmRlcjI7CisgIG1wel90IHRlbXA7CisgIG1wX3NpemVfdCBkaXZpZGVuZF9zaXplOworICB1bnNpZ25lZCBsb25nIGRpdmlzb3I7CisgIGludCBpOworICBpbnQgcmVwcyA9IDIwMDAwMDsKKyAgZ21wX3JhbmRzdGF0ZV9wdHIgcmFuZHM7CisgIG1wel90IGJzOworICB1bnNpZ25lZCBsb25nIGJzaSwgc2l6ZV9yYW5nZTsKKyAgdW5zaWduZWQgbG9uZyByX3JxLCByX3EsIHJfciwgcjsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgcmFuZHMgPSBSQU5EUzsKKworICBtcHpfaW5pdCAoYnMpOworCisgIGlmIChhcmdjID09IDIpCisgICAgIHJlcHMgPSBhdG9pIChhcmd2WzFdKTsKKworICBtcHpfaW5pdCAoZGl2aWRlbmQpOworICBtcHpfaW5pdCAocXVvdGllbnQpOworICBtcHpfaW5pdCAocmVtYWluZGVyKTsKKyAgbXB6X2luaXQgKHF1b3RpZW50Mik7CisgIG1wel9pbml0IChyZW1haW5kZXIyKTsKKyAgbXB6X2luaXQgKHRlbXApOworCisgIGZvciAoaSA9IDA7IGkgPCByZXBzOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChicywgcmFuZHMsIDMyKTsKKyAgICAgIHNpemVfcmFuZ2UgPSBtcHpfZ2V0X3VpIChicykgJSAxMCArIDI7IC8qIDAuLjIwNDcgYml0IG9wZXJhbmRzICovCisKKyAgICAgIGRvCisJeworCSAgbXB6X3JyYW5kb21iIChicywgcmFuZHMsIDY0KTsKKwkgIGRpdmlzb3IgPSBtcHpfZ2V0X3VpIChicyk7CisJfQorICAgICAgd2hpbGUgKGRpdmlzb3IgPT0gMCk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCBzaXplX3JhbmdlKTsKKyAgICAgIGRpdmlkZW5kX3NpemUgPSBtcHpfZ2V0X3VpIChicyk7CisgICAgICBtcHpfcnJhbmRvbWIgKGRpdmlkZW5kLCByYW5kcywgZGl2aWRlbmRfc2l6ZSk7CisKKyAgICAgIG1wel91cmFuZG9tYiAoYnMsIHJhbmRzLCAyKTsKKyAgICAgIGJzaSA9IG1wel9nZXRfdWkgKGJzKTsKKyAgICAgIGlmICgoYnNpICYgMSkgIT0gMCkKKwltcHpfbmVnIChkaXZpZGVuZCwgZGl2aWRlbmQpOworCisgICAgICAvKiBwcmludGYgKCIlbGRcbiIsIFNJWiAoZGl2aWRlbmQpKTsgKi8KKworICAgICAgcl9ycSA9IG1wel90ZGl2X3FyX3VpIChxdW90aWVudCwgcmVtYWluZGVyLCBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICByX3EgPSBtcHpfdGRpdl9xX3VpIChxdW90aWVudDIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIHJfciA9IG1wel90ZGl2X3JfdWkgKHJlbWFpbmRlcjIsIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIHIgPSBtcHpfdGRpdl91aSAoZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhhdCB0aGUgcXVvdGllbnRzIGFuZCByZW1haW5kZXJzIGNvbXB1dGVkCisJIHdpdGggZGlmZmVyZW50IGZ1bmN0aW9ucyBhcmUgZXF1YWwuICAqLworICAgICAgaWYgKG1wel9jbXAgKHF1b3RpZW50LCBxdW90aWVudDIpICE9IDApCisJZHVtcF9hYm9ydCAoInF1b3RpZW50cyBmcm9tIG1wel90ZGl2X3FyX3VpIGFuZCBtcHpfdGRpdl9xX3VpIGRpZmZlciIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBpZiAobXB6X2NtcCAocmVtYWluZGVyLCByZW1haW5kZXIyKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXJzIGZyb20gbXB6X3RkaXZfcXJfdWkgYW5kIG1wel90ZGl2X3JfdWkgZGlmZmVyIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIHNpZ24gb2YgdGhlIHF1b3RpZW50IGlzIGNvcnJlY3QuICAqLworICAgICAgaWYgKG1wel9jbXBfdWkgKHF1b3RpZW50LCAwKSAhPSAwKQorCWlmICgobXB6X2NtcF91aSAocXVvdGllbnQsIDApIDwgMCkKKwkgICAgIT0gKG1wel9jbXBfdWkgKGRpdmlkZW5kLCAwKSA8IDApKQorCWR1bXBfYWJvcnQgKCJxdW90aWVudCBzaWduIHdyb25nIiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkaXZpZGVuZAorCSAocXVvdGllbnQgcm91bmRlZCB0b3dhcmRzIDApLiAgKi8KKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIDApICE9IDApCisJaWYgKChtcHpfY21wX3VpIChyZW1haW5kZXIsIDApIDwgMCkgIT0gKG1wel9jbXBfdWkgKGRpdmlkZW5kLCAwKSA8IDApKQorCSAgZHVtcF9hYm9ydCAoInJlbWFpbmRlciBzaWduIHdyb25nIiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICBtcHpfbXVsX3VpICh0ZW1wLCBxdW90aWVudCwgZGl2aXNvcik7CisgICAgICBtcHpfYWRkICh0ZW1wLCB0ZW1wLCByZW1haW5kZXIpOworICAgICAgaWYgKG1wel9jbXAgKHRlbXAsIGRpdmlkZW5kKSAhPSAwKQorCWR1bXBfYWJvcnQgKCJuIG1vZCBkICE9IG4gLSBbbi9kXSpkIiwgZGl2aWRlbmQsIGRpdmlzb3IpOworCisgICAgICBtcHpfYWJzIChyZW1haW5kZXIsIHJlbWFpbmRlcik7CisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCBkaXZpc29yKSA+PSAwKQorCWR1bXBfYWJvcnQgKCJyZW1haW5kZXIgZ3JlYXRlciB0aGFuIGRpdmlzb3IiLCBkaXZpZGVuZCwgZGl2aXNvcik7CisKKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIHJfcnEpICE9IDApCisJZHVtcF9hYm9ydCAoInJlbWFpbmRlciByZXR1cm5lZCBmcm9tIG1wel90ZGl2X3FyX3VpIGlzIHdyb25nIiwKKwkJICAgIGRpdmlkZW5kLCBkaXZpc29yKTsKKyAgICAgIGlmIChtcHpfY21wX3VpIChyZW1haW5kZXIsIHJfcSkgIT0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVyIHJldHVybmVkIGZyb20gbXB6X3RkaXZfcV91aSBpcyB3cm9uZyIsCisJCSAgICBkaXZpZGVuZCwgZGl2aXNvcik7CisgICAgICBpZiAobXB6X2NtcF91aSAocmVtYWluZGVyLCByX3IpICE9IDApCisJZHVtcF9hYm9ydCAoInJlbWFpbmRlciByZXR1cm5lZCBmcm9tIG1wel90ZGl2X3JfdWkgaXMgd3JvbmciLAorCQkgICAgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgICAgaWYgKG1wel9jbXBfdWkgKHJlbWFpbmRlciwgcikgIT0gMCkKKwlkdW1wX2Fib3J0ICgicmVtYWluZGVyIHJldHVybmVkIGZyb20gbXB6X3RkaXZfdWkgaXMgd3JvbmciLAorCQkgICAgZGl2aWRlbmQsIGRpdmlzb3IpOworICAgIH0KKworICBtcHpfY2xlYXIgKGJzKTsKKyAgbXB6X2NsZWFyIChkaXZpZGVuZCk7CisgIG1wel9jbGVhciAocXVvdGllbnQpOworICBtcHpfY2xlYXIgKHJlbWFpbmRlcik7CisgIG1wel9jbGVhciAocXVvdGllbnQyKTsKKyAgbXB6X2NsZWFyIChyZW1haW5kZXIyKTsKKyAgbXB6X2NsZWFyICh0ZW1wKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQorCit2b2lkCitkdW1wX2Fib3J0IChjb25zdCBjaGFyICpzdHIsIG1wel90IGRpdmlkZW5kLCB1bnNpZ25lZCBsb25nIGRpdmlzb3IpCit7CisgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiAlc1xuIiwgc3RyKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiZGl2aWRlbmQgPSAiKTsgZGVidWdfbXAgKGRpdmlkZW5kLCAtMTYpOworICBmcHJpbnRmIChzdGRlcnIsICJkaXZpc29yICA9ICVsWFxuIiwgZGl2aXNvcik7CisgIGFib3J0KCk7Cit9CisKK3ZvaWQKK2RlYnVnX21wIChtcHpfdCB4LCBpbnQgYmFzZSkKK3sKKyAgbXB6X291dF9zdHIgKHN0ZGVyciwgYmFzZSwgeCk7IGZwdXRjICgnXG4nLCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZC9maW5kbGMuYyBiL3Rlc3RzL3JhbmQvZmluZGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYjEyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JhbmQvZmluZGxjLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCitDb3B5cmlnaHQgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImdtcHN0YXQuaCIKKworI2RlZmluZSBSQ1NJRChtc2cpIFwKK3N0YXRpYyAvKiovY29uc3QgY2hhciAqY29uc3QgcmNzaWRbXSA9IHsgKGNoYXIgKilyY3NpZCwgIlwxMDAoIykiIG1zZyB9CisKK1JDU0lEKCIkSWQkIik7CisKK2ludCBnX2RlYnVnID0gMDsKKworc3RhdGljIG1wel90IGE7CisKK3N0YXRpYyB2b2lkCitzaF9zdGF0dXMgKGludCBzaWcpCit7CisgIHByaW50ZiAoInNoX3N0YXR1czogc2lnbmFsICVkIGNhdWdodC4gZHVtcGluZyBzdGF0dXMuXG4iLCBzaWcpOworCisgIHByaW50ZiAoIiAgYSA9ICIpOworICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgYSk7CisgIHByaW50ZiAoIlxuIik7CisgIGZmbHVzaCAoc3Rkb3V0KTsKKworICBpZiAoU0lHU0VHViA9PSBzaWcpCQkvKiByZW1vdmUgU0VHViBoYW5kbGVyICovCisgICAgc2lnbmFsIChTSUdTRUdWLCBTSUdfREZMKTsKK30KKworLyogSW5wdXQgaXMgYSBtb2R1bHVzIChtKS4gIFdlIHNoYWxsIGZpbmQgbXVsdGlwbGllciAoYSkgYW5kIGFkZGVyIChjKQorICAgY29uZm9ybWluZyB0byB0aGUgcnVsZXMgZm91bmQgaW4gdGhlIGZpcnN0IGNvbW1lbnQgYmxvY2sgaW4gZmlsZQorICAgbXB6L3VyYW5kb20uYy4KKworICAgVGhlbiBydW4gYSBzcGVjdHJhbCB0ZXN0IG9uIHRoZSBnZW5lcmF0b3IgYW5kIGRpc2NhcmQgYW55CisgICBtdWx0aXBsaWVycyBub3QgcGFzc2luZy4gICovCisKKy8qIFRPRE86CisKKyAgIC4gZmluZCBhIGJldHRlciBhbGdvcml0aG0gdGhhbiBhKz04OyBiaWdnZXIganVtcHMgcGVyaGFwcz8KKworKi8KKwordm9pZAorbXB6X3RydWVfcmFuZG9tIChtcHpfdCBzLCB1bnNpZ25lZCBsb25nIGludCBuYml0cykKK3sKKyNpZiBfX0ZyZWVCU0RfXworICBGSUxFICpmczsKKyAgY2hhciBjWzFdOworICBpbnQgaTsKKworICBtcHpfc2V0X3VpIChzLCAwKTsKKyAgZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpICs9IDgpCisgICAgeworICAgICAgZm9yICg7OykKKwl7CisJICBpbnQgbnJlYWQ7CisJICBmcyA9IGZvcGVuICgiL2Rldi9yYW5kb20iLCAiciIpOworCSAgbnJlYWQgPSBmcmVhZCAoYywgMSwgMSwgZnMpOworCSAgZmNsb3NlIChmcyk7CisJICBpZiAobnJlYWQgIT0gMCkKKwkgICAgYnJlYWs7CisJICBzbGVlcCAoMSk7CisJfQorICAgICAgbXB6X211bF8yZXhwIChzLCBzLCA4KTsKKyAgICAgIG1wel9hZGRfdWkgKHMsIHMsICgodW5zaWduZWQgbG9uZyBpbnQpIGNbMF0pICYgMHhmZik7CisgICAgICBwcmludGYgKCIlZCByYW5kb20gYml0c1xuIiwgaSArIDgpOworICAgIH0KKyAgaWYgKG5iaXRzICUgOCAhPSAwKQorICAgIG1wel9tb2RfMmV4cCAocywgcywgbmJpdHMpOworI2VuZGlmCit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY29uc3QgY2hhciB1c2FnZVtdID0gInVzYWdlOiBmaW5kbGMgWy1kdl0gbTJleHAgW2xvd19tZXJpdCBbaGlnaF9tZXJpdF1dXG4iOworICBpbnQgZjsKKyAgaW50IHZfbG9zZSwgbV9sb3NlLCB2X2Jlc3QsIG1fYmVzdDsKKyAgaW50IGM7CisgIGludCBkZWJ1ZyA9IDE7CisgIGludCBjbnRfaGlnaF9tZXJpdDsKKyAgbXB6X3QgbTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbTJleHA7CisjZGVmaW5lIERJTVMgNgkJCS8qIGRpbWVuc2lvbnMgcnVuIGluIHNwZWN0cmFsIHRlc3QgKi8KKyAgbXBmX3QgdltESU1TLTFdOwkJLyogc3BlY3RyYWwgdGVzdCByZXN1bHQgKHRoZXJlJ3Mgbm8gdgorCQkJCSAgIGZvciAxc3QgZGltZW5zaW9uICovCisgIG1wZl90IGZfbWVyaXQsIGxvd19tZXJpdCwgaGlnaF9tZXJpdDsKKyAgbXB6X3QgYWNjLCBtaW51czg7CisgIG1wel90IG1pbiwgbWF4OworICBtcHpfdCBzOworCisKKyAgbXB6X2luaXQgKG0pOworICBtcHpfaW5pdCAoYSk7CisgIGZvciAoZiA9IDA7IGYgPCBESU1TLTE7IGYrKykKKyAgICBtcGZfaW5pdCAodltmXSk7CisgIG1wZl9pbml0IChmX21lcml0KTsKKyAgbXBmX2luaXRfc2V0X2QgKGxvd19tZXJpdCwgLjEpOworICBtcGZfaW5pdF9zZXRfZCAoaGlnaF9tZXJpdCwgLjEpOworCisgIHdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgImE6ZGk6aHYiKSkgIT0gLTEpCisgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSAnZCc6CQkJLyogZGVidWcgKi8KKwlnX2RlYnVnKys7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJ3YnOgkJCS8qIHByaW50IHZlcnNpb24gKi8KKwlwdXRzIChyY3NpZFsxXSk7CisJZXhpdCAoMCk7CisKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgY2FzZSAnPyc6CisgICAgICBkZWZhdWx0OgorCWZwdXRzICh1c2FnZSwgc3RkZXJyKTsKKwlleGl0ICgxKTsKKyAgICAgIH0KKworICBhcmdjIC09IG9wdGluZDsKKyAgYXJndiArPSBvcHRpbmQ7CisKKyAgaWYgKGFyZ2MgPCAxKQorICAgIHsKKyAgICAgIGZwdXRzICh1c2FnZSwgc3RkZXJyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBJbnN0YWxsIHNpZ25hbCBoYW5kbGVyLiAqLworICBpZiAoU0lHX0VSUiA9PSBzaWduYWwgKFNJR1NFR1YsIHNoX3N0YXR1cykpCisgICAgeworICAgICAgcGVycm9yICgic2lnbmFsIChTSUdTRUdWKSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBpZiAoU0lHX0VSUiA9PSBzaWduYWwgKFNJR0hVUCwgc2hfc3RhdHVzKSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJzaWduYWwgKFNJR0hVUCkiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBwcmludGYgKCJmaW5kbGM6IHZlcnNpb246ICVzXG4iLCByY3NpZFsxXSk7CisgIG0yZXhwID0gYXRvbCAoYXJndlswXSk7CisgIG1wel9pbml0X3NldF91aSAobSwgMSk7CisgIG1wel9tdWxfMmV4cCAobSwgbSwgbTJleHApOworICBwcmludGYgKCJtID0gMHgiKTsKKyAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTYsIG0pOworICBwdXRzICgiIik7CisKKyAgaWYgKGFyZ2MgPiAxKQkJCS8qIGhhdmUgbG93X21lcml0ICovCisgICAgbXBmX3NldF9zdHIgKGxvd19tZXJpdCwgYXJndlsxXSwgMCk7CisgIGlmIChhcmdjID4gMikJCQkvKiBoYXZlIGhpZ2hfbWVyaXQgKi8KKyAgICBtcGZfc2V0X3N0ciAoaGlnaF9tZXJpdCwgYXJndlsyXSwgMCk7CisKKyAgaWYgKGRlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImxvd19tZXJpdCA9ICIpOworICAgICAgbXBmX291dF9zdHIgKHN0ZGVyciwgMTAsIDIsIGxvd19tZXJpdCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICI7IGhpZ2hfbWVyaXQgPSAiKTsKKyAgICAgIG1wZl9vdXRfc3RyIChzdGRlcnIsIDEwLCAyLCBoaWdoX21lcml0KTsKKyAgICAgIGZwdXRzICgiXG4iLCBzdGRlcnIpOworICAgIH0KKworICBtcHpfaW5pdCAobWludXM4KTsKKyAgbXB6X3NldF9zaSAobWludXM4LCAtOEwpOworICBtcHpfaW5pdF9zZXRfdWkgKGFjYywgMCk7CisgIG1wel9pbml0IChzKTsKKyAgbXB6X2luaXRfc2V0X2QgKG1pbiwgMC4wMSAqIHBvdyAoMi4wLCAoZG91YmxlKSBtMmV4cCkpOworICBtcHpfaW5pdF9zZXRfZCAobWF4LCAwLjk5ICogcG93ICgyLjAsIChkb3VibGUpIG0yZXhwKSk7CisKKyAgbXB6X3RydWVfcmFuZG9tIChzLCBtMmV4cCk7CS8qIFN0YXJ0LiAgKi8KKyAgbXB6X3NldGJpdCAocywgMCk7CQkvKiBNYWtlIGl0IG9kZC4gICovCisKKyAgdl9iZXN0ID0gbV9iZXN0ID0gMiooRElNUy0xKTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBtcHpfYWRkIChhY2MsIGFjYywgcyk7CisgICAgICBtcHpfbW9kXzJleHAgKGFjYywgYWNjLCBtMmV4cCk7CisjaWYgbGF0ZXIKKyAgICAgIG1wel9hbmRfc2kgKGEsIGFjYywgLThMKTsKKyNlbHNlCisgICAgICBtcHpfYW5kIChhLCBhY2MsIG1pbnVzOCk7CisjZW5kaWYKKyAgICAgIG1wel9hZGRfdWkgKGEsIGEsIDUpOworICAgICAgaWYgKG1wel9jbXAgKGEsIG1pbikgPD0gMCB8fCBtcHpfY21wIChhLCBtYXgpID49IDApCisJY29udGludWU7CisKKyAgICAgIHNwZWN0cmFsX3Rlc3QgKHYsIERJTVMsIGEsIG0pOworICAgICAgZm9yIChmID0gMCwgdl9sb3NlID0gbV9sb3NlID0gMCwgY250X2hpZ2hfbWVyaXQgPSBESU1TLTE7CisJICAgZiA8IERJTVMtMTsgZisrKQorCXsKKwkgIG1lcml0IChmX21lcml0LCBmICsgMiwgdltmXSwgbSk7CisKKwkgIGlmIChtcGZfY21wX3VpICh2W2ZdLCAxIDw8ICgzMCAvIChmICsgMikgKyAoZiA9PSAyKSkpIDwgMCkKKwkgICAgdl9sb3NlKys7CisKKwkgIGlmIChtcGZfY21wIChmX21lcml0LCBsb3dfbWVyaXQpIDwgMCkKKwkgICAgbV9sb3NlKys7CisKKwkgIGlmIChtcGZfY21wIChmX21lcml0LCBoaWdoX21lcml0KSA+PSAwKQorCSAgICBjbnRfaGlnaF9tZXJpdC0tOworCX0KKworICAgICAgaWYgKDAgPT0gdl9sb3NlICYmIDAgPT0gbV9sb3NlKQorCXsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBhKTsgcHV0cyAoIiIpOyBmZmx1c2ggKHN0ZG91dCk7CisJICBpZiAoMCA9PSBjbnRfaGlnaF9tZXJpdCkKKwkgICAgYnJlYWs7CQkvKiBsZWF2ZSBsb29wICovCisJfQorICAgICAgaWYgKHZfbG9zZSA8IHZfYmVzdCkKKwl7CisJICB2X2Jlc3QgPSB2X2xvc2U7CisJICBwcmludGYgKCJiZXN0ICh2X2xvc2U9JWQ7IG1fbG9zZT0lZCk6ICIsIHZfbG9zZSwgbV9sb3NlKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBhKTsgcHV0cyAoIiIpOyBmZmx1c2ggKHN0ZG91dCk7CisJfQorICAgICAgaWYgKG1fbG9zZSA8IG1fYmVzdCkKKwl7CisJICBtX2Jlc3QgPSBtX2xvc2U7CisJICBwcmludGYgKCJiZXN0ICh2X2xvc2U9JWQ7IG1fbG9zZT0lZCk6ICIsIHZfbG9zZSwgbV9sb3NlKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBhKTsgcHV0cyAoIiIpOyBmZmx1c2ggKHN0ZG91dCk7CisJfQorICAgIH0KKworICBtcHpfY2xlYXIgKG0pOworICBtcHpfY2xlYXIgKGEpOworICBmb3IgKGYgPSAwOyBmIDwgRElNUy0xOyBmKyspCisgICAgbXBmX2NsZWFyICh2W2ZdKTsKKyAgbXBmX2NsZWFyIChmX21lcml0KTsKKyAgbXBmX2NsZWFyIChsb3dfbWVyaXQpOworICBtcGZfY2xlYXIgKGhpZ2hfbWVyaXQpOworCisgIHByaW50ZiAoImRvbmUuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYW5kL2dlbi5jIGIvdGVzdHMvcmFuZC9nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU2YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC9nZW4uYwpAQCAtMCwwICsxLDQ4MCBAQAorLyogZ2VuLmMgLS0gR2VuZXJhdGUgcHNldWRvcmFuZG9tIG51bWJlcnMuCisKK0NvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBFeGFtcGxlczoKKworICAkIGdlbiAxMAorMTAgaW50ZWdlcnMgMCA8PSBYIDwgMl4zMiBnZW5lcmF0ZWQgYnkgbXB6X3VyYW5kb21iKCkKKworICAkIGdlbiAtZiBtcGZfdXJhbmRvbWIgMTAKKzEwIHJlYWwgbnVtYmVycyAwIDw9IFggPCAxCisKKyAgJCBnZW4gLXogMTI3IDEwCisxMCBpbnRlZ2VycyAwIDw9IFggPCAyXjEyNworCisgICQgZ2VuIC1mIG1wZl91cmFuZG9tYiAteCAuOSwxIDEwCisxMCByZWFsIG51bWJlcnMgMCA8PSBYIDwgLjkKKworICAkIGdlbiAtcyAxIDEwCisxMCBpbnRlZ2Vycywgc2VxdWVuY2Ugc2VlZGVkIHdpdGggMQorCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmICFIQVZFX0RFQ0xfT1BUQVJHCitleHRlcm4gY2hhciAqb3B0YXJnOworZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVycjsKKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworaW50IG1haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGNvbnN0IGNoYXIgdXNhZ2VbXSA9CisgICAgInVzYWdlOiBnZW4gWy1iaHBxXSBbLWEgbl0gWy1jIGEsYyxtMmV4cF0gWy1DIGEsYyxtXSBbLWYgZnVuY10gWy1nIGFsZ10gWy1tIG5dIFstcyBuXSAiIFwKKyAgICAiWy14IGYsdF0gWy16IG5dIFtuXVxuIiBcCisgICAgIiAgbiAgICAgICAgbnVtYmVyIG9mIHJhbmRvbSBudW1iZXJzIHRvIGdlbmVyYXRlXG4iIFwKKyAgICAiICAtYSBuICAgICBBU0NJSSBvdXRwdXQgaW4gcmFkaXggbiAoZGVmYXVsdCwgd2l0aCBuPTEwKVxuIiBcCisgICAgIiAgLWIgICAgICAgYmluYXJ5IG91dHB1dFxuIiBcCisgICAgIiAgLWMgYSxjLG0yZXhwIHVzZSBzdXBwbGllZCBMQyBzY2hlbWVcbiIgXAorICAgICIgIC1mIGZ1bmMgIHJhbmRvbSBmdW5jdGlvbiwgb25lIG9mXG4iIFwKKyAgICAiICAgICAgICAgICBtcHpfdXJhbmRvbWIgKGRlZmF1bHQpLCBtcHpfdXJhbmRvbW0sIG1wZl91cmFuZG9tYiwgcmFuZCwgcmFuZG9tXG4iIFwKKyAgICAiICAtZyBhbGcgICBhbGdvcml0aG0sIG9uZSBvZiBtdCAoZGVmYXVsdCksIGxjXG4iIFwKKyAgICAiICAtaCAgICAgICBwcmludCB0aGlzIHRleHQgYW5kIGV4aXRcbiIgXAorICAgICIgIC1tIG4gICAgIG1heGltdW0gc2l6ZSBvZiBnZW5lcmF0ZWQgbnVtYmVyIHBsdXMgMSAoMDw9IFggPCBuKSBmb3IgbXB6X3VyYW5kb21tXG4iIFwKKyAgICAiICAtcCAgICAgICBwcmludCB1c2VkIHNlZWQgb24gc3RkZXJyXG4iIFwKKyAgICAiICAtcSAgICAgICBxdWlldCwgbm8gb3V0cHV0XG4iIFwKKyAgICAiICAtcyBuICAgICBpbml0aWFsIHNlZWQgKGRlZmF1bHQ6IG91dHB1dCBmcm9tIHRpbWUoMykpXG4iIFwKKyAgICAiICAteCBmLHQgICBleGNsdWRlIGFsbCBudW1iZXJzIGYgPD0geCA8PSB0XG4iIFwKKyAgICAiICAteiBuICAgICBzaXplIGluIGJpdHMgb2YgZ2VuZXJhdGVkIG51bWJlcnMgKDA8PSBYIDwyXm4pIChkZWZhdWx0IDMyKVxuIiBcCisgICAgIiI7CisKKyAgdW5zaWduZWQgbG9uZyBpbnQgZjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbiA9IDA7CisgIHVuc2lnbmVkIGxvbmcgaW50IHNlZWQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IG0yZXhwID0gMDsKKyAgdW5zaWduZWQgaW50IHNpemUgPSAzMjsKKyAgaW50IHNlZWRfZnJvbV91c2VyID0gMDsKKyAgaW50IGFzY291dCA9IDEsIGJpbm91dCA9IDAsIHByaW50c2VlZCA9IDA7CisgIGludCBvdXRwdXRfcmFkaXggPSAxMDsKKyAgaW50IGxjX3NjaGVtZV9mcm9tX3VzZXIgPSAwOworICBpbnQgcXVpZXRfZmxhZyA9IDA7CisgIG1wel90IHpfc2VlZDsKKyAgbXB6X3QgejE7CisgIG1wZl90IGYxOworICBnbXBfcmFuZHN0YXRlX3QgcnN0YXRlOworICBpbnQgYywgaTsKKyAgZG91YmxlIGRyYW5kOworICBsb25nIGxyYW5kOworICBpbnQgZG9fZXhjbHVkZSA9IDA7CisgIG1wZl90IGZfeGYsIGZfeHQ7CQkvKiBudW1iZXJzIHRvIGV4Y2x1ZGUgZnJvbSBzZXF1ZW5jZSAqLworICBjaGFyICpzdHJfeGYsICpzdHJfeHQ7CS8qIG51bWJlcnMgdG8gZXhjbHVkZSBmcm9tIHNlcXVlbmNlICovCisgIGNoYXIgKnN0cl9hLCAqc3RyX2FkZGVyLCAqc3RyX207CisgIG1wel90IHpfYSwgel9tLCB6X21tYXg7CisgIHVuc2lnbmVkIGxvbmcgaW50IHVsX2FkZGVyOworCisgIGVudW0KKyAgeworICAgIFJGVU5DX21wel91cmFuZG9tYiA9IDAsCisgICAgUkZVTkNfbXB6X3VyYW5kb21tLAorICAgIFJGVU5DX21wZl91cmFuZG9tYiwKKyAgICBSRlVOQ19yYW5kLAorICAgIFJGVU5DX3JhbmRvbSwKKyAgfSByZnVuYyA9IFJGVU5DX21wel91cmFuZG9tYjsKKyAgY2hhciAqcmZ1bmNfc3RyW10gPSAgeyAibXB6X3VyYW5kb21iIiwgIm1wel91cmFuZG9tbSIsICJtcGZfdXJhbmRvbWIiLAorCQkJICJyYW5kIiwgInJhbmRvbSIgfTsKKyAgZW51bQorICB7CisgICAgUk5HX01UID0gMCwKKyAgICBSTkdfTEMKKyAgfTsKKyAgZ21wX3JhbmRhbGdfdCByYWxnID0gUk5HX01UOworICAvKiBUZXh0cyBmb3IgdGhlIGFsZ29yaXRobXMuICBUaGUgaW5kZXggb2YgZWFjaCBtdXN0IG1hdGNoIHRoZQorICAgICBjb3JyZXNwb25kaW5nIGFsZ29yaXRobSBpbiB0aGUgZW51bSBhYm92ZS4gICovCisgIGNoYXIgKnJhbGdfc3RyW10gPSB7ICJtdCIsICJsYyIgfTsKKworICBtcGZfaW5pdCAoZl94Zik7CisgIG1wZl9pbml0IChmX3h0KTsKKyAgbXBmX2luaXQgKGYxKTsKKyAgbXB6X2luaXQgKHoxKTsKKyAgbXB6X2luaXQgKHpfc2VlZCk7CisgIG1wel9pbml0X3NldF91aSAoel9tbWF4LCAwKTsKKworCisgIHdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgImE6YmM6ZjpnOmhtOm46cHFzOno6eDoiKSkgIT0gLTEpCisgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSAnYSc6CisJYXNjb3V0ID0gMTsKKwliaW5vdXQgPSAwOworCW91dHB1dF9yYWRpeCA9IGF0b2kgKG9wdGFyZyk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJ2InOgorCWFzY291dCA9IDA7CisJYmlub3V0ID0gMTsKKwlicmVhazsKKworICAgICAgY2FzZSAnYyc6CQkJLyogVXNlciBzdXBwbGllZCBMQyBzY2hlbWU6IGEsYyxtMmV4cCAqLworCWlmIChOVUxMID09IChzdHJfYSA9IHN0cnRvayAob3B0YXJnLCAiLCIpKQorCSAgICB8fCBOVUxMID09IChzdHJfYWRkZXIgPSBzdHJ0b2sgKE5VTEwsICIsIikpCisJICAgIHx8IE5VTEwgPT0gKHN0cl9tID0gc3RydG9rIChOVUxMLCAiLCIpKSkKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiBiYWQgTEMgc2NoZW1lIHBhcmFtZXRlcnM6ICVzXG4iLCBvcHRhcmcpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKyNpZmRlZiBIQVZFX1NUUlRPVUwKKwl1bF9hZGRlciA9IHN0cnRvdWwgKHN0cl9hZGRlciwgTlVMTCwgMCk7CisjZWxpZiBIQVZFX1NUUlRPTAorCXVsX2FkZGVyID0gKHVuc2lnbmVkIGxvbmcgaW50KSBzdHJ0b2wgKHN0cl9hZGRlciwgTlVMTCwgMCk7CisjZWxzZQorCXVsX2FkZGVyID0gKHVuc2lnbmVkIGxvbmcgaW50KSBhdG9pIChzdHJfYWRkZXIpOworI2VuZGlmCisKKwlpZiAobXB6X2luaXRfc2V0X3N0ciAoel9hLCBzdHJfYSwgMCkpCisJICB7CisJICAgIGZwcmludGYgKHN0ZGVyciwgImdlbjogYmFkIExDIHNjaGVtZSBwYXJhbWV0ZXIgYGEnOiAlc1xuIiwgc3RyX2EpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwlpZiAoVUxPTkdfTUFYID09IHVsX2FkZGVyKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICJnZW46IGJhZCBMQyBzY2hlbWUgcGFyYW1ldGVyIGBjJzogJXNcbiIsCisJCSAgICAgc3RyX2FkZGVyKTsKKwkgICAgZXhpdCAoMSk7CisJICB9CisJbTJleHAgPSBhdG9sIChzdHJfbSk7CisKKwlsY19zY2hlbWVfZnJvbV91c2VyID0gMTsKKwlicmVhazsKKworCisgICAgICBjYXNlICdmJzoKKwlyZnVuYyA9IC0xOworCWZvciAoZiA9IDA7IGYgPCBzaXplb2YgKHJmdW5jX3N0cikgLyBzaXplb2YgKCpyZnVuY19zdHIpOyBmKyspCisJICAgIGlmICghc3RyY21wIChvcHRhcmcsIHJmdW5jX3N0cltmXSkpCisJICAgICAgeworCQlyZnVuYyA9IGY7CisJCWJyZWFrOworCSAgICAgIH0KKwlpZiAocmZ1bmMgPT0gLTEpCisJICB7CisJICAgIGZwdXRzICh1c2FnZSwgc3RkZXJyKTsKKwkgICAgZXhpdCAoMSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJ2cnOgkJCS8qIGFsZ29yaXRobSAqLworCXJhbGcgPSAtMTsKKwlmb3IgKGYgPSAwOyBmIDwgc2l6ZW9mIChyYWxnX3N0cikgLyBzaXplb2YgKCpyYWxnX3N0cik7IGYrKykKKwkgICAgaWYgKCFzdHJjbXAgKG9wdGFyZywgcmFsZ19zdHJbZl0pKQorCSAgICAgIHsKKwkJcmFsZyA9IGY7CisJCWJyZWFrOworCSAgICAgIH0KKwlpZiAocmFsZyA9PSAtMSkKKwkgIHsKKwkgICAgZnB1dHMgKHVzYWdlLCBzdGRlcnIpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSAnbSc6CQkJLyogbWF4IGZvciBtcHpfdXJhbmRvbW0oKSAqLworCWlmIChtcHpfc2V0X3N0ciAoel9tbWF4LCBvcHRhcmcsIDApKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICJnZW46IGJhZCBtYXggdmFsdWU6ICVzXG4iLCBvcHRhcmcpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSAncCc6CQkJLyogcHJpbnQgc2VlZCBvbiBzdGRlcnIgKi8KKwlwcmludHNlZWQgPSAxOworCWJyZWFrOworCisgICAgICBjYXNlICdxJzoJCQkvKiBxdWlldCAqLworCXF1aWV0X2ZsYWcgPSAxOworCWJyZWFrOworCisgICAgICBjYXNlICdzJzoJCQkvKiB1c2VyIHByb3ZpZGVkIHNlZWQgKi8KKwlpZiAobXB6X3NldF9zdHIgKHpfc2VlZCwgb3B0YXJnLCAwKSkKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiBiYWQgc2VlZCBhcmd1bWVudCAlc1xuIiwgb3B0YXJnKTsKKwkgICAgZXhpdCAoMSk7CisJICB9CisJc2VlZF9mcm9tX3VzZXIgPSAxOworCWJyZWFrOworCisgICAgICBjYXNlICd6JzoKKwlzaXplID0gYXRvaSAob3B0YXJnKTsKKwlpZiAoc2l6ZSA8IDEpCisJICB7CisJICAgIGZwcmludGYgKHN0ZGVyciwgImdlbjogYmFkIHNpemUgYXJndW1lbnQgKC16ICV1KVxuIiwgc2l6ZSk7CisJICAgIGV4aXQgKDEpOworCSAgfQorCWJyZWFrOworCisgICAgICBjYXNlICd4JzoJCQkvKiBFeGNsdWRlLiBmcm9tLHRvICovCisJc3RyX3hmID0gb3B0YXJnOworCXN0cl94dCA9IHN0cmNociAob3B0YXJnLCAnLCcpOworCWlmIChOVUxMID09IHN0cl94dCkKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiBiYWQgZXhjbHVzaW9uIHBhcmFtZXRlcnM6ICVzXG4iLCBvcHRhcmcpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwkqc3RyX3h0KysgPSAnXDAnOworCWRvX2V4Y2x1ZGUgPSAxOworCWJyZWFrOworCisgICAgICBjYXNlICdoJzoKKyAgICAgIGNhc2UgJz8nOgorICAgICAgZGVmYXVsdDoKKwlmcHV0cyAodXNhZ2UsIHN0ZGVycik7CisJZXhpdCAoMSk7CisgICAgICB9CisgIGFyZ2MgLT0gb3B0aW5kOworICBhcmd2ICs9IG9wdGluZDsKKworICBpZiAoISBzZWVkX2Zyb21fdXNlcikKKyAgICBtcHpfc2V0X3VpICh6X3NlZWQsICh1bnNpZ25lZCBsb25nIGludCkgdGltZSAoTlVMTCkpOworICBzZWVkID0gbXB6X2dldF91aSAoel9zZWVkKTsKKyAgaWYgKHByaW50c2VlZCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJnZW46IHNlZWQgdXNlZDogIik7CisgICAgICBtcHpfb3V0X3N0ciAoc3RkZXJyLCBvdXRwdXRfcmFkaXgsIHpfc2VlZCk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKworICBtcGZfc2V0X3ByZWMgKGYxLCBzaXplKTsKKworICAvKiBpbml0IHJhbmRvbSBzdGF0ZSBhbmQgcGxhbnQgc2VlZCAqLworICBzd2l0Y2ggKHJmdW5jKQorICAgIHsKKyAgICBjYXNlIFJGVU5DX21wZl91cmFuZG9tYjoKKyNpZiAwCisgICAgICAvKiBEb24ndCBpbml0IGEgdG9vIHNtYWxsIGdlbmVyYXRvci4gICovCisgICAgICBzaXplID0gUFJFQyAoZjEpICogR01QX0xJTUJfQklUUzsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisjZW5kaWYKKyAgICBjYXNlIFJGVU5DX21wel91cmFuZG9tYjoKKyAgICBjYXNlIFJGVU5DX21wel91cmFuZG9tbToKKyAgICAgIHN3aXRjaCAocmFsZykKKwl7CisJY2FzZSBSTkdfTVQ6CisJICBnbXBfcmFuZGluaXRfbXQgKHJzdGF0ZSk7CisJICBicmVhazsKKworCWNhc2UgUk5HX0xDOgorCSAgaWYgKCEgbGNfc2NoZW1lX2Zyb21fdXNlcikKKwkgICAgZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZSAocnN0YXRlLCBNSU4gKDEyOCwgc2l6ZSkpOworCSAgZWxzZQorCSAgICBnbXBfcmFuZGluaXRfbGNfMmV4cCAocnN0YXRlLCB6X2EsIHVsX2FkZGVyLCBtMmV4cCk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBmcHJpbnRmIChzdGRlcnIsICJnZW46IHVuc3VwcG9ydGVkIGFsZ29yaXRobVxuIik7CisJICBleGl0ICgxKTsKKwl9CisKKyAgICAgIGdtcF9yYW5kc2VlZCAocnN0YXRlLCB6X3NlZWQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJGVU5DX3JhbmQ6CisgICAgICBzcmFuZCAoc2VlZCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkZVTkNfcmFuZG9tOgorI2lmZGVmIF9fRnJlZUJTRF9fCQkvKiBGSVhNRSAqLworICAgICAgaWYgKHNlZWRfZnJvbV91c2VyKQorCXNyYW5kb20gKHNlZWQpOworICAgICAgZWxzZQorCXNyYW5kb21kZXYgKCk7CisjZWxzZQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiB1bnN1cHBvcnRlZCBhbGdvcml0aG1cbiIpOworI2VuZGlmCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJnZW46IHJhbmRvbSBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIHNldCB1cCBleGNsdWRlcyAqLworICBpZiAoZG9fZXhjbHVkZSkKKyAgICBzd2l0Y2ggKHJmdW5jKQorICAgICAgeworICAgICAgY2FzZSBSRlVOQ19tcGZfdXJhbmRvbWI6CisKKwlpZiAobXBmX3NldF9zdHIgKGZfeGYsIHN0cl94ZiwgMTApIHx8CisJICAgIG1wZl9zZXRfc3RyIChmX3h0LCBzdHJfeHQsIDEwKSkKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiBiYWQgZXhjbHVzaW9uLWZyb20gKFwiJXNcIikgIiBcCisJCSAgICAgIm9yIGV4Y2x1c2lvbi10byAoXCIlc1wiKSBzdHJpbmcuICBubyBleGNsdXNpb24gZG9uZS5cbiIsCisJCSAgICAgc3RyX3hmLCBzdHJfeHQpOworCSAgICBkb19leGNsdWRlID0gMDsKKwkgIH0KKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwlmcHJpbnRmIChzdGRlcnIsICJnZW46IGV4Y2x1c2lvbiBub3QgaW1wbGVtZW50ZWQgZm9yIGNob3NlbiAiIFwKKwkJICJyYW5kb21pemF0aW9uIGZ1bmN0aW9uLiAgYWxsIG51bWJlcnMgaW5jbHVkZWQgaW4gc2VxdWVuY2UuXG4iKTsKKyAgICAgIH0KKworICAvKiBnZW5lcmF0ZSBhbmQgcHJpbnQgKi8KKyAgaWYgKGFyZ2MgPiAwKQorICAgIHsKKyNpZiBIQVZFX1NUUlRPVUwKKyAgICAgIG4gPSBzdHJ0b3VsIChhcmd2WzBdLCAoY2hhciAqKikgTlVMTCwgMTApOworI2VsaWYgSEFWRV9TVFJUT0wKKyAgICAgIG4gPSAodW5zaWduZWQgbG9uZyBpbnQpIHN0cnRvbCAoYXJndlswXSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKKyNlbHNlCisgICAgICBuID0gKHVuc2lnbmVkIGxvbmcgaW50KSBhdG9pIChhcmd2WzBdKTsKKyNlbmRpZgorICAgIH0KKworICBmb3IgKGYgPSAwOyBuID09IDAgfHwgZiA8IG47IGYrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKHJmdW5jKQorCXsKKwljYXNlIFJGVU5DX21wel91cmFuZG9tYjoKKwkgIG1wel91cmFuZG9tYiAoejEsIHJzdGF0ZSwgc2l6ZSk7CisJICBpZiAocXVpZXRfZmxhZykKKwkgICAgYnJlYWs7CisJICBpZiAoYmlub3V0KQorCSAgICB7CisJICAgICAgLypmd3JpdGUgKCh1bnNpZ25lZCBpbnQgKikgejEtPl9tcF9kLCA0LCAxLCBzdGRvdXQpOyovCisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiBiaW5hcnkgb3V0cHV0IGZvciBtcHpfdXJhbmRvbSogaXMgYnJva2VuXG4iKTsKKwkgICAgICBleGl0ICgxKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgb3V0cHV0X3JhZGl4LCB6MSk7CisJICAgICAgcHV0cyAoIiIpOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgUkZVTkNfbXB6X3VyYW5kb21tOgorCSAgbXB6X3VyYW5kb21tICh6MSwgcnN0YXRlLCB6X21tYXgpOworCSAgaWYgKHF1aWV0X2ZsYWcpCisJICAgIGJyZWFrOworCSAgaWYgKGJpbm91dCkKKwkgICAgeworCSAgICAgIC8qZndyaXRlICgodW5zaWduZWQgaW50ICopIHoxLT5fbXBfZCwgNCwgMSwgc3Rkb3V0KTsqLworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgImdlbjogYmluYXJ5IG91dHB1dCBmb3IgbXB6X3VyYW5kb20qIGlzIGJyb2tlblxuIik7CisJICAgICAgZXhpdCAoMSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIG91dHB1dF9yYWRpeCwgejEpOworCSAgICAgIHB1dHMgKCIiKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlIFJGVU5DX21wZl91cmFuZG9tYjoKKwkgIG1wZl91cmFuZG9tYiAoZjEsIHJzdGF0ZSwgc2l6ZSk7CisJICBpZiAoZG9fZXhjbHVkZSkKKwkgICAgaWYgKG1wZl9jbXAgKGYxLCBmX3hmKSA+PSAwICYmIG1wZl9jbXAgKGYxLCBmX3h0KSA8PSAwKQorCQlicmVhazsKKwkgIGlmIChxdWlldF9mbGFnKQorCSAgICBicmVhazsKKwkgIGlmIChiaW5vdXQpCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJnZW46IGJpbmFyeSBvdXRwdXQgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgIlwKKwkJICAgICAgICJub3QgaW1wbGVtZW50ZWRcbiIpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtcGZfb3V0X3N0ciAoc3Rkb3V0LCBvdXRwdXRfcmFkaXgsIDAsIGYxKTsKKwkgICAgICBwdXRzICgiIik7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBSRlVOQ19yYW5kOgorCSAgaSA9IHJhbmQgKCk7CisjaWZkZWYgRkxPQVRfT1VUUFVUCisJICBpZiAoaSkKKwkgICAgZHJhbmQgPSAoZG91YmxlKSBpIC8gKGRvdWJsZSkgUkFORF9NQVg7CisJICBlbHNlCisJICAgIGRyYW5kID0gMC4wOworCSAgaWYgKHF1aWV0X2ZsYWcpCisJICAgIGJyZWFrOworCSAgaWYgKGJpbm91dCkKKwkgICAgZndyaXRlICgmZHJhbmQsIHNpemVvZiAoZHJhbmQpLCAxLCBzdGRvdXQpOworCSAgZWxzZQorCSAgICBwcmludGYgKCIlZVxuIiwgZHJhbmQpOworI2Vsc2UKKwkgIGlmIChxdWlldF9mbGFnKQorCSAgICBicmVhazsKKwkgIGlmIChiaW5vdXQpCisJICAgIGZ3cml0ZSAoJmksIHNpemVvZiAoaSksIDEsIHN0ZG91dCk7CisJICBlbHNlCisJICAgIHByaW50ZiAoIiVkXG4iLCBpKTsKKyNlbmRpZgorCSAgYnJlYWs7CisKKwljYXNlIFJGVU5DX3JhbmRvbToKKwkgIGxyYW5kID0gcmFuZG9tICgpOworCSAgaWYgKGxyYW5kKQorCSAgICBkcmFuZCA9IChkb3VibGUpIGxyYW5kIC8gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKwkgIGVsc2UKKwkgICAgZHJhbmQgPSAwOworCSAgaWYgKHF1aWV0X2ZsYWcpCisJICAgIGJyZWFrOworCSAgaWYgKGJpbm91dCkKKwkgICAgZndyaXRlICgmZHJhbmQsIHNpemVvZiAoZHJhbmQpLCAxLCBzdGRvdXQpOworCSAgZWxzZQorCSAgICBwcmludGYgKCIlZVxuIiwgZHJhbmQpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZnByaW50ZiAoc3RkZXJyLCAiZ2VuOiByYW5kb20gZnVuY3Rpb24gbm90IGltcGxlbWVudGVkXG4iKTsKKwkgIGV4aXQgKDEpOworCX0KKworICAgIH0KKworICAvKiBjbGVhbiB1cCAqLworICBzd2l0Y2ggKHJmdW5jKQorICAgIHsKKyAgICBjYXNlIFJGVU5DX21wel91cmFuZG9tYjoKKyAgICBjYXNlIFJGVU5DX21wZl91cmFuZG9tYjoKKyAgICAgIGdtcF9yYW5kY2xlYXIgKHJzdGF0ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICBtcGZfY2xlYXIgKGYxKTsKKyAgbXBmX2NsZWFyIChmX3hmKTsKKyAgbXBmX2NsZWFyIChmX3h0KTsKKyAgbXB6X2NsZWFyICh6MSk7CisgIG1wel9jbGVhciAoel9zZWVkKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKmRlYnVnX2R1bW15eiA9IG1wel9kdW1wOworc3RhdGljIHZvaWQgKmRlYnVnX2R1bW15ZiA9IG1wZl9kdW1wOwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZC9nbXBzdGF0LmggYi90ZXN0cy9yYW5kL2dtcHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM1Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC9nbXBzdGF0LmgKQEAgLTAsMCArMSw3NSBAQAorLyogZ21wc3RhdC5oICovCisKKy8qCitDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyogVGhpcyBmaWxlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpbGVzOiBnbXAuaCAqLworCisjaWZuZGVmCV9fR01QU1RBVF9IX18KKyNkZWZpbmUJX19HTVBTVEFUX0hfXworCisvKiBHbG9iYWwgZGVidWcgZmxhZy4gIEZJWE1FOiBSZW1vdmUuICovCitleHRlcm4gaW50IGdfZGVidWc7CisjZGVmaW5lIERFQlVHXzEgMAorI2RlZmluZSBERUJVR18yIDEKKworLyogTWF4IG51bWJlciBvZiBkaW1lbnNpb25zIGluIHNwZWN0cmFsIHRlc3QuICBGSVhNRTogTWFrdyBkeW5hbWljLiAqLworI2RlZmluZSBHTVBfU1BFQ1RfTUFYVCAxMAorCit2b2lkCittcGZfZnJlcXQgKG1wZl90IEtwLAorCSAgIG1wZl90IEttLAorCSAgIG1wZl90IFhbXSwKKwkgICBjb25zdCB1bnNpZ25lZCBsb25nIGludCBuKTsKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfZnJlcXQgKG1wZl90IFYsCisJICAgbXB6X3QgWFtdLAorCSAgIHVuc2lnbmVkIGludCBpbWF4LAorCSAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IG4pOworCisvKiBMb3cgbGV2ZWwgZnVuY3Rpb25zLiAqLwordm9pZAora3MgKG1wZl90IEtwLAorICAgIG1wZl90IEttLAorICAgIG1wZl90IFhbXSwKKyAgICB2b2lkIChQKSAobXBmX3QsIG1wZl90KSwKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIGludCBuKTsKKwordm9pZAora3NfdGFibGUgKG1wZl90IHAsIG1wZl90IHZhbCwgY29uc3QgdW5zaWduZWQgaW50IG4pOworCit2b2lkCit4Ml90YWJsZSAoZG91YmxlIHRbXSwKKwkgIHVuc2lnbmVkIGludCB2KTsKKwordm9pZAorc3BlY3RyYWxfdGVzdCAobXBmX3Qgcm9wW10sIHVuc2lnbmVkIGludCBULCBtcHpfdCBhLCBtcHpfdCBtKTsKK3ZvaWQKK3Z6X2RvdCAobXB6X3Qgcm9wLCBtcHpfdCBWMVtdLCBtcHpfdCBWMltdLCB1bnNpZ25lZCBpbnQgbik7Cit2b2lkCitmX2Zsb29yIChtcGZfdCByb3AsIG1wZl90IG9wKTsKKwordm9pZAorbWVyaXQgKG1wZl90IHJvcCwgdW5zaWduZWQgaW50IHQsIG1wZl90IHYsIG1wel90IG0pOworZG91YmxlCittZXJpdF91ICh1bnNpZ25lZCBpbnQgdCwgbXBmX3QgdiwgbXB6X3QgbSk7CisKKy8qIEZyb20gc2VwYXJhdGUgc291cmNlIGZpbGVzOiAqLwordm9pZCB6ZGl2X3JvdW5kIChtcHpfdCByb3AsIG1wel90IG4sIG1wel90IGQpOworCisjZW5kaWYgLyogIV9fR01QU1RBVF9IX18gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3JhbmQvc3BlY3QuYyBiL3Rlc3RzL3JhbmQvc3BlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRlNWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC9zcGVjdC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBzcGVjdC5jIC0tIHRoZSBzcGVjdHJhbCB0ZXN0ICovCisKKy8qCitDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyogVCBpcyB1cHBlciBkaW1lbnNpb24uICBaX0EgaXMgdGhlIExDIG11bHRpcGxpZXIsIHdoaWNoIGlzCisgICByZWxhdGl2ZWx5IHByaW1lIHRvIFpfTSwgdGhlIExDIG1vZHVsdXMuICBUaGUgcmVzdWx0IGlzIHB1dCBpbgorICAgcm9wW10gd2l0aCB2W3RdIGluIHJvcFt0LTJdLiAqLworCisvKiBCVUdTOiBEdWUgdG8gbGF6eSBhbGxvY2F0aW9uIHNjaGVtZSwgbWF4aW11bSBUIGlzIGhhcmQgY29kZWQgdG8gTUFYVC4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ21wc3RhdC5oIgorCitpbnQgZ19kZWJ1ZyA9IDA7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY29uc3QgY2hhciB1c2FnZVtdID0gInVzYWdlOiBzcGVjdCBbLWRdIGEgbSBuXG4iOworICBpbnQgYzsKKyAgdW5zaWduZWQgaW50IG47CisgIG1wel90IGEsIG07CisgIG1wZl90IHJlc1tHTVBfU1BFQ1RfTUFYVF0sIHJlc19taW5bR01QX1NQRUNUX01BWFRdLCBmX3RtcDsKKyAgaW50IGY7CisKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9pbml0IChtKTsKKyAgZm9yIChmID0gMDsgZiA8IEdNUF9TUEVDVF9NQVhUOyBmKyspCisgICAgeworICAgICAgbXBmX2luaXQgKHJlc1tmXSk7CisgICAgICBtcGZfaW5pdCAocmVzX21pbltmXSk7CisgICAgfQorICBtcGZfaW5pdCAoZl90bXApOworICBtcGZfc2V0X3VpIChyZXNfbWluWzBdLCAzMjc2OCk7IC8qIDJeMTUgKi8KKyAgbXBmX3NldF91aSAocmVzX21pblsxXSwgMTAyNCk7IC8qIDJeMTAgKi8KKyAgbXBmX3NldF91aSAocmVzX21pblsyXSwgMjU2KTsgLyogMl44ICovCisgIG1wZl9zZXRfdWkgKHJlc19taW5bM10sIDY0KTsgLyogMl42ICovCisgIG1wZl9zZXRfdWkgKHJlc19taW5bNF0sIDMyKTsgLyogMl41ICovCisKKyAgd2hpbGUgKChjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiZGgiKSkgIT0gLTEpCisgICAgc3dpdGNoIChjKQorICAgICAgeworICAgICAgY2FzZSAnZCc6CQkJLyogZGVidWcgKi8KKwlnX2RlYnVnKys7CisJYnJlYWs7CisgICAgICBjYXNlICdoJzoKKyAgICAgIGRlZmF1bHQ6CisJZnB1dHMgKHVzYWdlLCBzdGRlcnIpOworCWV4aXQgKDEpOworICAgICAgfQorICBhcmdjIC09IG9wdGluZDsKKyAgYXJndiArPSBvcHRpbmQ7CisKKyAgaWYgKGFyZ2MgPCAzKQorICAgIHsKKyAgICAgIGZwdXRzICh1c2FnZSwgc3RkZXJyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBtcHpfc2V0X3N0ciAoYSwgYXJndlswXSwgMCk7CisgIG1wel9zZXRfc3RyIChtLCBhcmd2WzFdLCAwKTsKKyAgbiA9ICh1bnNpZ25lZCBpbnQpIGF0b2kgKGFyZ3ZbMl0pOworICBpZiAobiArIDEgPiBHTVBfU1BFQ1RfTUFYVCkKKyAgICBuID0gR01QX1NQRUNUX01BWFQgKyAxOworCisgIHNwZWN0cmFsX3Rlc3QgKHJlcywgbiwgYSwgbSk7CisKKyAgZm9yIChmID0gMDsgZiA8IG4gLSAxOyBmKyspCisgICAgeworICAgICAgLyogcHJpbnQgdiAqLworICAgICAgcHJpbnRmICgiJWQ6IHYgPSAiLCBmICsgMik7CisgICAgICBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgNCwgcmVzW2ZdKTsKKworI2lmZGVmIFBSSU5UX1JBSVNFRF9CWV9UV09fQVNfV0VMTAorICAgICAgcHJpbnRmICgiICheMiA9ICIpOworICAgICAgbXBmX211bCAoZl90bXAsIHJlc1tmXSwgcmVzW2ZdKTsKKyAgICAgIG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCA0LCBmX3RtcCk7CisgICAgICBwcmludGYgKCIpIik7CisjZW5kaWYgLyogUFJJTlRfUkFJU0VEX0JZX1RXT19BU19XRUxMICovCisKKyAgICAgIC8qIHByaW50IG1lcml0ICovCisgICAgICBwcmludGYgKCIgbSA9ICIpOworICAgICAgbWVyaXQgKGZfdG1wLCBmICsgMiwgcmVzW2ZdLCBtKTsKKyAgICAgIG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCA0LCBmX3RtcCk7CisKKyAgICAgIGlmIChtcGZfY21wIChyZXNbZl0sIHJlc19taW5bZl0pIDwgMCkKKwlwcmludGYgKCJcdCoqKiB2IHRvbyBsb3cgKioqIik7CisgICAgICBpZiAobXBmX2dldF9kIChmX3RtcCkgPCAuMSkKKwlwcmludGYgKCJcdCoqKiBtZXJpdCB0b28gbG93ICoqKiIpOworCisgICAgICBwdXRzICgiIik7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAobSk7CisgIGZvciAoZiA9IDA7IGYgPCBHTVBfU1BFQ1RfTUFYVDsgZisrKQorICAgIHsKKyAgICAgIG1wZl9jbGVhciAocmVzW2ZdKTsKKyAgICAgIG1wZl9jbGVhciAocmVzX21pbltmXSk7CisgICAgfQorICBtcGZfY2xlYXIgKGZfdG1wKTsKKworICByZXR1cm4gMDsKK30KKworCit2b2lkCitkZWJ1Z19mb28oKQoreworICBpZiAoMCkKKyAgICB7CisgICAgICBtcHpfZHVtcCAoMCk7CisgICAgICBtcGZfZHVtcCAoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZC9zdGF0LmMgYi90ZXN0cy9yYW5kL3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTA2ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC9zdGF0LmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qIHN0YXQuYyAtLSBzdGF0aXN0aWNhbCB0ZXN0cyBvZiByYW5kb20gbnVtYmVyIHNlcXVlbmNlcy4gKi8KKworLyoKK0NvcHlyaWdodCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisvKiBFeGFtcGxlczoKKworICAkIGdlbiAxMDAwIHwgc3RhdAorVGVzdCAxMDAwIHJlYWwgbnVtYmVycy4KKworICAkIGdlbiAzMDAwMCB8IHN0YXQgLTIgMTAwMAorVGVzdCAxMDAwIHJlYWwgbnVtYmVycyAzMCB0aW1lcyBhbmQgdGhlbiB0ZXN0IHRoZSAzMCByZXN1bHRzIGluIGEKK2Bgc2Vjb25kIGxldmVsJycuCisKKyAgJCBnZW4gLWYgbXB6X3VyYW5kb21iIDEwMDAgfCBzdGF0IC1pIDB4ZmZmZmZmZmYKK1Rlc3QgMTAwMCBpbnRlZ2VycyAwIDw9IFggPD0gMl4zMi0xLgorCisgICQgZ2VuIC1mIG1wel91cmFuZG9tYiAteiAzNCAxMDAwIHwgc3RhdCAtaSAweDNmZmZmZmZmZgorVGVzdCAxMDAwIGludGVnZXJzIDAgPD0gWCA8PSAyXjM0LTEuCisKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJnbXBzdGF0LmgiCisKKyNpZiAhSEFWRV9ERUNMX09QVEFSRworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKK2V4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnI7CisjZW5kaWYKKworI2RlZmluZSBGVkVDU0laICgxMDAwMDBMKQorCitpbnQgZ19kZWJ1ZyA9IDA7CisKK3N0YXRpYyB2b2lkCitwcmludF9rc19yZXN1bHRzIChtcGZfdCBmX3AsIG1wZl90IGZfcF9wcm9iLAorCQkgIG1wZl90IGZfbSwgbXBmX3QgZl9tX3Byb2IsCisJCSAgRklMRSAqZnApCit7CisgIGRvdWJsZSBwLCBwcCwgbSwgbXA7CisKKyAgcCA9IG1wZl9nZXRfZCAoZl9wKTsKKyAgbSA9IG1wZl9nZXRfZCAoZl9tKTsKKyAgcHAgPSBtcGZfZ2V0X2QgKGZfcF9wcm9iKTsKKyAgbXAgPSBtcGZfZ2V0X2QgKGZfbV9wcm9iKTsKKworICBmcHJpbnRmIChmcCwgIiUuNGYgKCUuMGYlJSlcdCIsIHAsIHBwICogMTAwLjApOworICBmcHJpbnRmIChmcCwgIiUuNGYgKCUuMGYlJSlcbiIsIG0sIG1wICogMTAwLjApOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfeDJfdGFibGUgKHVuc2lnbmVkIGludCB2LCBGSUxFICpmcCkKK3sKKyAgZG91YmxlIHRbN107CisgIGludCBmOworCisKKyAgZnByaW50ZiAoZnAsICJDaGktc3F1YXJlIHRhYmxlIGZvciB2PSV1XG4iLCB2KTsKKyAgZnByaW50ZiAoZnAsICIxJSVcdDUlJVx0MjUlJVx0NTAlJVx0NzUlJVx0OTUlJVx0OTklJVxuIik7CisgIHgyX3RhYmxlICh0LCB2KTsKKyAgZm9yIChmID0gMDsgZiA8IDc7IGYrKykKKyAgICBmcHJpbnRmIChmcCwgIiUuMmZcdCIsIHRbZl0pOworICBmcHV0cyAoIlxuIiwgZnApOworfQorCisKKworLyogUGtzICgpIC0tIERpc3RyaWJ1dGlvbiBmdW5jdGlvbiBmb3IgS1MgcmVzdWx0cyB3aXRoIGEgYmlnIG4gKGxpa2UgMTAwMAorICAgb3Igc28pOiAgRih4KSA9IDEgLSBwb3coZSwgLTIqeF4yKSBbS251dGgsIHZvbCAyLCBwLjUxXS4gKi8KKy8qIGdudXBsb3Q6IHBsb3QgWzA6MV0gUGtzKHgpLCBQa3MoeCkgPSAxLWV4cCgtMip4KioyKSAgKi8KKworc3RhdGljIHZvaWQKK1BrcyAobXBmX3QgcCwgbXBmX3QgeCkKK3sKKyAgZG91YmxlIGR0OwkJCS8qIHRlbXAgZG91YmxlICovCisKKyAgbXBmX3NldCAocCwgeCk7CisgIG1wZl9tdWwgKHAsIHAsIHApOwkJLyogcCA9IHheMiAqLworICBtcGZfbXVsX3VpIChwLCBwLCAyKTsJCS8qIHAgPSAyKnheMiAqLworICBtcGZfbmVnIChwLCBwKTsJCS8qIHAgPSAtMip4XjIgKi8KKyAgLyogTm8gcG93KCkgaW4gZ21wLiAgVXNlIGRvdWJsZXMuICovCisgIC8qIEZJWE1FOiBVc2UgZXhwKCk/ICovCisgIGR0ID0gcG93IChNX0UsIG1wZl9nZXRfZCAocCkpOworICBtcGZfc2V0X2QgKHAsIGR0KTsKKyAgbXBmX3VpX3N1YiAocCwgMSwgcCk7Cit9CisKKy8qIGZfZnJlcSgpIC0tIGZyZXF1ZW5jeSB0ZXN0IG9uIHJlYWwgbnVtYmVycyAwPD1mPDEqLworc3RhdGljIHZvaWQKK2ZfZnJlcSAoY29uc3QgdW5zaWduZWQgbDFydW5zLCBjb25zdCB1bnNpZ25lZCBsMnJ1bnMsCisJbXBmX3QgZnZlY1tdLCBjb25zdCB1bnNpZ25lZCBsb25nIG4pCit7CisgIHVuc2lnbmVkIGY7CisgIG1wZl90IGZfcCwgZl9wX3Byb2I7CisgIG1wZl90IGZfbSwgZl9tX3Byb2I7CisgIG1wZl90ICpsMXJlczsJCQkvKiBsZXZlbCAxIHJlc3VsdCBhcnJheSAqLworCisgIG1wZl9pbml0IChmX3ApOyAgbXBmX2luaXQgKGZfbSk7CisgIG1wZl9pbml0IChmX3BfcHJvYik7ICBtcGZfaW5pdCAoZl9tX3Byb2IpOworCisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIDFzdCBsZXZlbCByZXN1bHRzLiAqLworICBsMXJlcyA9IChtcGZfdCAqKSBtYWxsb2MgKGwycnVucyAqIDIgKiBzaXplb2YgKG1wZl90KSk7CisgIGlmIChOVUxMID09IGwxcmVzKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgInN0YXQ6IG1hbGxvYyBmYWlsdXJlXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBwcmludGYgKCJcbkVxdWlkaXN0cmlidXRpb24vRnJlcXVlbmN5IHRlc3Qgb24gcmVhbCBudW1iZXJzICgwPD1YPDEpOlxuIik7CisgIHByaW50ZiAoIlx0S3BcdFx0S21cbiIpOworCisgIGZvciAoZiA9IDA7IGYgPCBsMnJ1bnM7IGYrKykKKyAgICB7CisgICAgICAvKiAgZl9wcmludHZlYyAoZnZlYywgbik7ICovCisgICAgICBtcGZfZnJlcXQgKGZfcCwgZl9tLCBmdmVjICsgZiAqIG4sIG4pOworCisgICAgICAvKiB3aGF0J3MgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgdGhlc2UgcmVzdWx0cz8gKi8KKyAgICAgIGtzX3RhYmxlIChmX3BfcHJvYiwgZl9wLCBuKTsKKyAgICAgIGtzX3RhYmxlIChmX21fcHJvYiwgZl9tLCBuKTsKKworICAgICAgaWYgKGwxcnVucyA9PSAwKQorCXsKKwkgIC8qcHJpbnRmICgiJXU6XHQiLCBmICsgMSk7Ki8KKwkgIHByaW50X2tzX3Jlc3VsdHMgKGZfcCwgZl9wX3Byb2IsIGZfbSwgZl9tX3Byb2IsIHN0ZG91dCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHNhdmUgcmVzdWx0ICovCisJICBtcGZfaW5pdF9zZXQgKGwxcmVzW2ZdLCBmX3ApOworCSAgbXBmX2luaXRfc2V0IChsMXJlc1tmICsgbDJydW5zXSwgZl9tKTsKKwl9CisgICAgfQorCisgIC8qIE5vdywgYXBwbHkgdGhlIEtTIHRlc3Qgb24gdGhlIHJlc3VsdHMgZnJvbSB0aGUgMXN0IGxldmVsIHJvdW5kcworICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24KKyAgICAgRih4KSA9IDEgLSBwb3coZSwgLTIqeF4yKQlbS251dGgsIHZvbCAyLCBwLjUxXSAqLworCisgIGlmIChsMXJ1bnMgIT0gMCkKKyAgICB7CisgICAgICAvKnByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyovCisKKyAgICAgIC8qIFRoZSBLcCdzLiAqLworICAgICAga3MgKGZfcCwgZl9tLCBsMXJlcywgUGtzLCBsMnJ1bnMpOworICAgICAga3NfdGFibGUgKGZfcF9wcm9iLCBmX3AsIGwycnVucyk7CisgICAgICBrc190YWJsZSAoZl9tX3Byb2IsIGZfbSwgbDJydW5zKTsKKyAgICAgIHByaW50ZiAoIktwOlx0Iik7CisgICAgICBwcmludF9rc19yZXN1bHRzIChmX3AsIGZfcF9wcm9iLCBmX20sIGZfbV9wcm9iLCBzdGRvdXQpOworCisgICAgICAvKiBUaGUgS20ncy4gKi8KKyAgICAgIGtzIChmX3AsIGZfbSwgbDFyZXMgKyBsMnJ1bnMsIFBrcywgbDJydW5zKTsKKyAgICAgIGtzX3RhYmxlIChmX3BfcHJvYiwgZl9wLCBsMnJ1bnMpOworICAgICAga3NfdGFibGUgKGZfbV9wcm9iLCBmX20sIGwycnVucyk7CisgICAgICBwcmludGYgKCJLbTpcdCIpOworICAgICAgcHJpbnRfa3NfcmVzdWx0cyAoZl9wLCBmX3BfcHJvYiwgZl9tLCBmX21fcHJvYiwgc3Rkb3V0KTsKKyAgICB9CisKKyAgbXBmX2NsZWFyIChmX3ApOyAgbXBmX2NsZWFyIChmX20pOworICBtcGZfY2xlYXIgKGZfcF9wcm9iKTsgIG1wZl9jbGVhciAoZl9tX3Byb2IpOworICBmcmVlIChsMXJlcyk7Cit9CisKKy8qIHpfZnJlcShsMXJ1bnMsIGwycnVucywgenZlYywgbiwgbWF4KSAtLSBmcmVxdWVuY3kgdGVzdCBvbiBpbnRlZ2VycworICAgMDw9ejw9TUFYICovCitzdGF0aWMgdm9pZAorel9mcmVxIChjb25zdCB1bnNpZ25lZCBsMXJ1bnMsCisJY29uc3QgdW5zaWduZWQgbDJydW5zLAorCW1wel90IHp2ZWNbXSwKKwljb25zdCB1bnNpZ25lZCBsb25nIG4sCisJdW5zaWduZWQgaW50IG1heCkKK3sKKyAgbXBmX3QgVjsJCQkvKiByZXN1bHQgKi8KKyAgZG91YmxlIGRfVjsJCQkvKiByZXN1bHQgYXMgYSBkb3VibGUgKi8KKworICBtcGZfaW5pdCAoVik7CisKKworICBwcmludGYgKCJcbkVxdWlkaXN0cmlidXRpb24vRnJlcXVlbmN5IHRlc3Qgb24gaW50ZWdlcnMgKDA8PVg8PSV1KTpcbiIsIG1heCk7CisgIHByaW50X3gyX3RhYmxlIChtYXgsIHN0ZG91dCk7CisKKyAgbXB6X2ZyZXF0IChWLCB6dmVjLCBtYXgsIG4pOworCisgIGRfViA9IG1wZl9nZXRfZCAoVik7CisgIHByaW50ZiAoIlYgPSAlLjJmIChuID0gJWx1KVxuIiwgZF9WLCBuKTsKKworICBtcGZfY2xlYXIgKFYpOworfQorCit1bnNpZ25lZCBpbnQgc3RhdF9kZWJ1ZyA9IDA7CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgY29uc3QgY2hhciB1c2FnZVtdID0KKyAgICAidXNhZ2U6IHN0YXQgWy1kXSBbLTIgcnVuc10gWy1pIG1heCB8IC1yIG1heF0gW2ZpbGVdXG4iIFwKKyAgICAiICAgICAgIGZpbGUgICAgIGZpbGVuYW1lXG4iIFwKKyAgICAiICAgICAgIC0yIHJ1bnMgIHBlcmZvcm0gMi1sZXZlbCB0ZXN0IHdpdGggUlVOUyBydW5zIG9uIDFzdCBsZXZlbFxuIiBcCisgICAgIiAgICAgICAtZCAgICAgICBpbmNyZWFzZSBkZWJ1Z2dpbmcgbGV2ZWxcbiIgXAorICAgICIgICAgICAgLWkgbWF4ICAgaW5wdXQgaXMgaW50ZWdlcnMgMCA8PSBaIDw9IE1BWFxuIiBcCisgICAgIiAgICAgICAtciBtYXggICBpbnB1dCBpcyByZWFsIG51bWJlcnMgMCA8PSBSIDwgMSBhbmQgdXNlIE1BWCBhc1xuIiBcCisgICAgIiAgICAgICAgICAgICAgICBtYXhpbXVtIHZhbHVlIHdoZW4gY29udmVydGluZyByZWFsIG51bWJlcnMgdG8gaW50ZWdlcnNcbiIgXAorICAgICIiOworCisgIG1wZl90IGZ2ZWNbRlZFQ1NJWl07CisgIG1wel90IHp2ZWNbRlZFQ1NJWl07CisgIHVuc2lnbmVkIGxvbmcgaW50IGYsIG4sIHZlY2VudHJpZXM7CisgIGNoYXIgKmZpbGVuOworICBGSUxFICpmcDsKKyAgaW50IGM7CisgIGludCBvbWl0b3V0cHV0ID0gMDsKKyAgaW50IHJlYWxpbnB1dCA9IC0xOwkJLyogMTogaW5wdXQgaXMgcmVhbCBudW1iZXJzIDA8PVI8MTsKKwkJCQkgICAwOiBpbnB1dCBpcyBpbnRlZ2VycyAwIDw9IFogPD0gTUFYLiAqLworICBsb25nIGwxcnVucyA9IDAsCQkvKiAxc3QgbGV2ZWwgcnVucyAqLworICAgIGwycnVucyA9IDE7CQkJLyogMm5kIGxldmVsIHJ1bnMgKi8KKyAgbXBmX3QgZl90ZW1wOworICBtcHpfdCB6X2ltYXg7CQkJLyogbWF4IHZhbHVlIHdoZW4gY29udmVydGluZyBiZXR3ZWVuCisJCQkJICAgcmVhbCBudW1iZXIgYW5kIGludGVnZXIuICovCisgIG1wZl90IGZfaW1heF9wbHVzMTsJCS8qIGZfaW1heCArIDEgc3RvcmVkIGluIGFuIG1wZl90IGZvcgorCQkJCSAgIGNvbnZlbmllbmNlICovCisgIG1wZl90IGZfaW1heF9taW51czE7CQkvKiBmX2ltYXggLSAxIHN0b3JlZCBpbiBhbiBtcGZfdCBmb3IKKwkJCQkgICBjb252ZW5pZW5jZSAqLworCisKKyAgbXBmX2luaXQgKGZfdGVtcCk7CisgIG1wel9pbml0X3NldF91aSAoel9pbWF4LCAweDdmZmZmZmZmKTsKKyAgbXBmX2luaXQgKGZfaW1heF9wbHVzMSk7CisgIG1wZl9pbml0IChmX2ltYXhfbWludXMxKTsKKworICB3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJkMjppOnI6IikpICE9IC0xKQorICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgJzInOgorCWwxcnVucyA9IGF0b2wgKG9wdGFyZyk7CisJbDJydW5zID0gLTE7CQkvKiBzZXQgbGF0ZXIgb24gKi8KKwlicmVhazsKKyAgICAgIGNhc2UgJ2QnOgkJCS8qIGluY3JlYXNlIGRlYnVnIGxldmVsICovCisJc3RhdF9kZWJ1ZysrOworCWJyZWFrOworICAgICAgY2FzZSAnaSc6CisJaWYgKDEgPT0gcmVhbGlucHV0KQorCSAgeworCSAgICBmcHV0cyAoInN0YXQ6IG9wdGlvbnMgLWkgYW5kIC1yIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcbiIsIHN0ZGVycik7CisJICAgIGV4aXQgKDEpOworCSAgfQorCWlmIChtcHpfc2V0X3N0ciAoel9pbWF4LCBvcHRhcmcsIDApKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0OiBiYWQgbWF4IHZhbHVlICVzXG4iLCBvcHRhcmcpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwlyZWFsaW5wdXQgPSAwOworCWJyZWFrOworICAgICAgY2FzZSAncic6CisJaWYgKDAgPT0gcmVhbGlucHV0KQorCSAgeworCSAgICBmcHV0cyAoInN0YXQ6IG9wdGlvbnMgLWkgYW5kIC1yIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcbiIsIHN0ZGVycik7CisJICAgIGV4aXQgKDEpOworCSAgfQorCWlmIChtcHpfc2V0X3N0ciAoel9pbWF4LCBvcHRhcmcsIDApKQorCSAgeworCSAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0OiBiYWQgbWF4IHZhbHVlICVzXG4iLCBvcHRhcmcpOworCSAgICBleGl0ICgxKTsKKwkgIH0KKwlyZWFsaW5wdXQgPSAxOworCWJyZWFrOworICAgICAgY2FzZSAnbyc6CisJb21pdG91dHB1dCA9IGF0b2kgKG9wdGFyZyk7CisJYnJlYWs7CisgICAgICBjYXNlICc/JzoKKyAgICAgIGRlZmF1bHQ6CisJZnB1dHMgKHVzYWdlLCBzdGRlcnIpOworCWV4aXQgKDEpOworICAgICAgfQorICBhcmdjIC09IG9wdGluZDsKKyAgYXJndiArPSBvcHRpbmQ7CisKKyAgaWYgKGFyZ2MgPCAxKQorICAgIGZwID0gc3RkaW47CisgIGVsc2UKKyAgICBmaWxlbiA9IGFyZ3ZbMF07CisKKyAgaWYgKGZwICE9IHN0ZGluKQorICAgIGlmIChOVUxMID09IChmcCA9IGZvcGVuIChmaWxlbiwgInIiKSkpCisgICAgICB7CisJcGVycm9yIChmaWxlbik7CisJZXhpdCAoMSk7CisgICAgICB9CisKKyAgaWYgKC0xID09IHJlYWxpbnB1dCkKKyAgICByZWFsaW5wdXQgPSAxOwkJLyogZGVmYXVsdCBpcyByZWFsIG51bWJlcnMgKi8KKworICAvKiByZWFkIGZpbGUgYW5kIGZpbGwgYXBwcm9wcmlhdGUgdmVjICovCisgIGlmICgxID09IHJlYWxpbnB1dCkJCS8qIHJlYWwgaW5wdXQgKi8KKyAgICB7CisgICAgICBmb3IgKGYgPSAwOyBmIDwgRlZFQ1NJWiA7IGYrKykKKwl7CisJICBtcGZfaW5pdCAoZnZlY1tmXSk7CisJICBpZiAoIW1wZl9pbnBfc3RyIChmdmVjW2ZdLCBmcCwgMTApKQorCSAgICBicmVhazsKKwl9CisgICAgfQorICBlbHNlCQkJCS8qIGludGVnZXIgaW5wdXQgKi8KKyAgICB7CisgICAgICBmb3IgKGYgPSAwOyBmIDwgRlZFQ1NJWiA7IGYrKykKKwl7CisJICBtcHpfaW5pdCAoenZlY1tmXSk7CisJICBpZiAoIW1wel9pbnBfc3RyICh6dmVjW2ZdLCBmcCwgMTApKQorCSAgICBicmVhazsKKwl9CisgICAgfQorICB2ZWNlbnRyaWVzID0gbiA9IGY7CQkvKiBudW1iZXIgb2YgZW50cmllcyByZWFkICovCisgIGZjbG9zZSAoZnApOworCisgIGlmIChGVkVDU0laID09IGYpCisgICAgZnByaW50ZiAoc3RkZXJyLCAic3RhdDogd2FybmluZzogZGlzY2FyZGluZyBpbnB1dCBkdWUgdG8gbGF6eSBhbGxvY2F0aW9uICJcCisJICAgICAib2Ygb25seSAlbGQgZW50cmllcy4gIHNvcnJ5LlxuIiwgRlZFQ1NJWik7CisKKyAgcHJpbnRmICgiR290ICVsdSBudW1iZXJzLlxuIiwgbik7CisKKyAgLyogY29udmVydCBhbmQgZmlsbCB0aGUgb3RoZXIgdmVjICovCisgIC8qIHNpbmNlIGZ2ZWNbXSBjb250YWlucyAwPD1mPDEgYW5kIHdlIHdhbnQgaXZlY1tdIHRvIGNvbnRhaW4KKyAgICAgMDw9ejw9aW1heCBhbmQgd2UgYXJlIHRydW5jYXRpbmcgYWxsIGZyYWN0aW9ucyB3aGVuCisgICAgIGNvbnZlcnRpbmcgZmxvYXQgdG8gaW50LCB3ZSBoYXZlIHRvIGFkZCAxIHRvIGltYXguKi8KKyAgbXBmX3NldF96IChmX2ltYXhfcGx1czEsIHpfaW1heCk7CisgIG1wZl9hZGRfdWkgKGZfaW1heF9wbHVzMSwgZl9pbWF4X3BsdXMxLCAxKTsKKyAgaWYgKDEgPT0gcmVhbGlucHV0KQkJLyogZmlsbCB6dmVjW10gKi8KKyAgICB7CisgICAgICBmb3IgKGYgPSAwOyBmIDwgbjsgZisrKQorCXsKKwkgIG1wZl9tdWwgKGZfdGVtcCwgZnZlY1tmXSwgZl9pbWF4X3BsdXMxKTsKKwkgIG1wel9pbml0ICh6dmVjW2ZdKTsKKwkgIG1wel9zZXRfZiAoenZlY1tmXSwgZl90ZW1wKTsgLyogdHJ1bmNhdGluZyBmcmFjdGlvbiAqLworCSAgaWYgKHN0YXRfZGVidWcgPiAxKQorCSAgICB7CisJICAgICAgbXB6X291dF9zdHIgKHN0ZGVyciwgMTAsIHp2ZWNbZl0pOworCSAgICAgIGZwdXRzICgiXG4iLCBzdGRlcnIpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQkJCQkvKiBpbnRlZ2VyIGlucHV0OyBmaWxsIGZ2ZWNbXSAqLworICAgIHsKKyAgICAgIC8qICAgIG1wZl9zZXRfeiAoZl9pbWF4X21pbnVzMSwgel9pbWF4KTsKKwkgICAgbXBmX3N1Yl91aSAoZl9pbWF4X21pbnVzMSwgZl9pbWF4X21pbnVzMSwgMSk7Ki8KKyAgICAgIGZvciAoZiA9IDA7IGYgPCBuOyBmKyspCisJeworCSAgbXBmX2luaXQgKGZ2ZWNbZl0pOworCSAgbXBmX3NldF96IChmdmVjW2ZdLCB6dmVjW2ZdKTsKKwkgIG1wZl9kaXYgKGZ2ZWNbZl0sIGZ2ZWNbZl0sIGZfaW1heF9wbHVzMSk7CisJICBpZiAoc3RhdF9kZWJ1ZyA+IDEpCisJICAgIHsKKwkgICAgICBtcGZfb3V0X3N0ciAoc3RkZXJyLCAxMCwgMCwgZnZlY1tmXSk7CisJICAgICAgZnB1dHMgKCJcbiIsIHN0ZGVycik7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIDIgbGV2ZWxzPyAqLworICBpZiAoMSAhPSBsMnJ1bnMpCisgICAgeworICAgICAgbDJydW5zID0gbiAvIGwxcnVuczsKKyAgICAgIHByaW50ZiAoIkRvaW5nICVsZCBzZWNvbmQgbGV2ZWwgcm91bmRzICJcCisJICAgICAgIndpdGggJWxkIGVudHJpZXMgaW4gZWFjaCByb3VuZCIsIGwycnVucywgbDFydW5zKTsKKyAgICAgIGlmIChuICUgbDFydW5zKQorCXByaW50ZiAoIiAoZGlzY2FyZGluZyAlbGQgZW50ciVzKSIsIG4gJSBsMXJ1bnMsCisJCW4gJSBsMXJ1bnMgPT0gMSA/ICJ5IiA6ICJpZXMiKTsKKyAgICAgIHB1dHMgKCIuIik7CisgICAgICBuID0gbDFydW5zOworICAgIH0KKworI2lmbmRlZiBET05UX0ZGUkVRCisgIGZfZnJlcSAobDFydW5zLCBsMnJ1bnMsIGZ2ZWMsIG4pOworI2VuZGlmCisjaWZkZWYgRE9fWkZSRVEKKyAgel9mcmVxIChsMXJ1bnMsIGwycnVucywgenZlYywgbiwgbXB6X2dldF91aSAoel9pbWF4KSk7CisjZW5kaWYKKworICBtcGZfY2xlYXIgKGZfdGVtcCk7IG1wel9jbGVhciAoel9pbWF4KTsKKyAgbXBmX2NsZWFyIChmX2ltYXhfcGx1czEpOworICBtcGZfY2xlYXIgKGZfaW1heF9taW51czEpOworICBmb3IgKGYgPSAwOyBmIDwgdmVjZW50cmllczsgZisrKQorICAgIHsKKyAgICAgIG1wZl9jbGVhciAoZnZlY1tmXSk7CisgICAgICBtcHpfY2xlYXIgKHp2ZWNbZl0pOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JhbmQvc3RhdGxpYi5jIGIvdGVzdHMvcmFuZC9zdGF0bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwNTM4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JhbmQvc3RhdGxpYi5jCkBAIC0wLDAgKzEsODM2IEBACisvKiBzdGF0bGliLmMgLS0gU3RhdGlzdGljYWwgZnVuY3Rpb25zIGZvciB0ZXN0aW5nIHRoZSByYW5kb21uZXNzIG9mCisgICBudW1iZXIgc2VxdWVuY2VzLiAqLworCisvKgorQ29weXJpZ2h0IDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKy8qIFRoZSB0aGVvcmllcyBmb3IgdGhlc2UgZnVuY3Rpb25zIGFyZSB0YWtlbiBmcm9tIEQuIEtudXRoJ3MgIlRoZSBBcnQKK29mIENvbXB1dGVyIFByb2dyYW1taW5nOiBWb2x1bWUgMiwgU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zIiwgVGhpcmQKK0VkaXRpb24sIEFkZGlzb24gV2VzbGV5LCAxOTk4LiAqLworCisvKiBJbXBsZW1lbnRhdGlvbiBub3Rlcy4KKworVGhlIEtvbG1vZ29yb3YtU21pcm5vdiB0ZXN0LgorCitFcS4gKDEzKSBpbiBLbnV0aCwgcC4gNTAsIHNheXMgdGhhdCBpZiBYMSwgWDIsIC4uLiwgWG4gYXJlIGluZGVwZW5kZW50CitvYnNlcnZhdGlvbnMgYXJyYW5nZWQgaW50byBhc2NlbmRpbmcgb3JkZXIKKworCUtwID0gc3FyKG4pICogbWF4KGovbiAtIEYoWGopKQkJZm9yIGFsbCAxPD1qPD1uCisJS20gPSBzcXIobikgKiBtYXgoRihYaikgLSAoai0xKS9uKSkJZm9yIGFsbCAxPD1qPD1uCisKK3doZXJlIEYoeCkgPSBQcihYIDw9IHgpID0gcHJvYmFiaWxpdHkgdGhhdCAoWCA8PSB4KSwgd2hpY2ggZm9yIGEKK3VuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiB6ZXJvIGFuZCBvbmUgaXMKK2V4YWN0bHkgdGhlIG51bWJlciBpdHNlbGYgKHgpLgorCisKK1RoZSBhbnN3ZXIgdG8gZXhlcmNpc2UgMjMgZ2l2ZXMgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKK2RvZXNuJ3QgbmVlZCB0aGUgb2JzZXJ2YXRpb25zIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXI6CisKK2ZvciAoayA9IDA7IGsgPCBtOyBrKyspCisJYVtrXSA9IDEuMAorCWJba10gPSAwLjAKKwljW2tdID0gMAorCitmb3IgKGVhY2ggb2JzZXJ2YXRpb24gWGopCisJWSA9IEYoWGopCisJayA9IGZsb29yIChtICogWSkKKwlhW2tdID0gbWluIChhW2tdLCBZKQorCWJba10gPSBtYXggKGJba10sIFkpCisJY1trXSArPSAxCisKKwlqID0gMAorCXJwID0gcm0gPSAwCisJZm9yIChrID0gMDsgayA8IG07IGsrKykKKwkJaWYgKGNba10gPiAwKQorCQkJcm0gPSBtYXggKHJtLCBhW2tdIC0gai9uKQorCQkJaiArPSBjW2tdCisJCQlycCA9IG1heCAocnAsIGovbiAtIGJba10pCisKK0twID0gc3FyIChuKSAqIHJwCitLbSA9IHNxciAobikgKiBybQorCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnbXBzdGF0LmgiCisKKy8qIGtzIChLcCwgS20sIFgsIFAsIG4pIC0tIFBlcmZvcm0gYSBLb2xtb2dvcm92LVNtaXJub3YgdGVzdCBvbiB0aGUgTgorICAgcmVhbCBudW1iZXJzIGJldHdlZW4gemVybyBhbmQgb25lIGluIHZlY3RvciBYLiAgUCBpcyB0aGUKKyAgIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiwgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIFgsIHdoaWNoIHNob3VsZAorICAgY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBYIGJlaW5nIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbnkKKyAgIG51bWJlciBpbiB0aGUgc2VxdWVuY2UuICAoRm9yIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHNlcXVlbmNlIG9mCisgICByZWFsIG51bWJlcnMgYmV0d2VlbiB6ZXJvIGFuZCBvbmUsIHRoaXMgaXMgc2ltcGx5IGVxdWFsIHRvIFguKSAgVGhlCisgICByZXN1bHQgaXMgcHV0IGluIEtwIGFuZCBLbS4gICovCisKK3ZvaWQKK2tzIChtcGZfdCBLcCwKKyAgICBtcGZfdCBLbSwKKyAgICBtcGZfdCBYW10sCisgICAgdm9pZCAoUCkgKG1wZl90LCBtcGZfdCksCisgICAgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgbXBmX3QgS3Q7CQkJLyogdGVtcCAqLworICBtcGZfdCBmX3g7CisgIG1wZl90IGZfajsJCQkvKiBqICovCisgIG1wZl90IGZfam5xOwkJCS8qIGovbiBvciAoai0xKS9uICovCisgIHVuc2lnbmVkIGxvbmcgaW50IGo7CisKKyAgLyogU29ydCB0aGUgdmVjdG9yIGluIGFzY2VuZGluZyBvcmRlci4gKi8KKyAgcXNvcnQgKFgsIG4sIHNpemVvZiAoX19tcGZfc3RydWN0KSwgbXBmX2NtcCk7CisKKyAgLyogSy1TIHRlc3QuICovCisgIC8qCUtwID0gc3FyKG4pICogbWF4KGovbiAtIEYoWGopKQkJZm9yIGFsbCAxPD1qPD1uCisJS20gPSBzcXIobikgKiBtYXgoRihYaikgLSAoai0xKS9uKSkJZm9yIGFsbCAxPD1qPD1uCisgICovCisKKyAgbXBmX2luaXQgKEt0KTsgbXBmX2luaXQgKGZfeCk7IG1wZl9pbml0IChmX2opOyBtcGZfaW5pdCAoZl9qbnEpOworICBtcGZfc2V0X3VpIChLcCwgMCk7ICBtcGZfc2V0X3VpIChLbSwgMCk7CisgIGZvciAoaiA9IDE7IGogPD0gbjsgaisrKQorICAgIHsKKyAgICAgIFAgKGZfeCwgWFtqLTFdKTsKKyAgICAgIG1wZl9zZXRfdWkgKGZfaiwgaik7CisKKyAgICAgIG1wZl9kaXZfdWkgKGZfam5xLCBmX2osIG4pOworICAgICAgbXBmX3N1YiAoS3QsIGZfam5xLCBmX3gpOworICAgICAgaWYgKG1wZl9jbXAgKEt0LCBLcCkgPiAwKQorCW1wZl9zZXQgKEtwLCBLdCk7CisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJeworCSAgcHJpbnRmICgiaj0lbHUgIiwgaik7CisJICBwcmludGYgKCJQKCk9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAyLCBmX3gpOyBwcmludGYgKCJcdCIpOworCisJICBwcmludGYgKCJqbnE9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAyLCBmX2pucSk7IHByaW50ZiAoIiAiKTsKKwkgIHByaW50ZiAoImRpZmY9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAyLCBLdCk7IHByaW50ZiAoIiAiKTsKKwkgIHByaW50ZiAoIktwPSIpOyBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgMiwgS3ApOyBwcmludGYgKCJcdCIpOworCX0KKyAgICAgIG1wZl9zdWJfdWkgKGZfaiwgZl9qLCAxKTsKKyAgICAgIG1wZl9kaXZfdWkgKGZfam5xLCBmX2osIG4pOworICAgICAgbXBmX3N1YiAoS3QsIGZfeCwgZl9qbnEpOworICAgICAgaWYgKG1wZl9jbXAgKEt0LCBLbSkgPiAwKQorCW1wZl9zZXQgKEttLCBLdCk7CisKKyAgICAgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwl7CisJICBwcmludGYgKCJqbnE9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAyLCBmX2pucSk7IHByaW50ZiAoIiAiKTsKKwkgIHByaW50ZiAoImRpZmY9Iik7IG1wZl9vdXRfc3RyIChzdGRvdXQsIDEwLCAyLCBLdCk7IHByaW50ZiAoIiAiKTsKKwkgIHByaW50ZiAoIkttPSIpOyBtcGZfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgMiwgS20pOyBwcmludGYgKCIgIik7CisJICBwcmludGYgKCJcbiIpOworCX0KKyAgICB9CisgIG1wZl9zcXJ0X3VpIChLdCwgbik7CisgIG1wZl9tdWwgKEtwLCBLcCwgS3QpOworICBtcGZfbXVsIChLbSwgS20sIEt0KTsKKworICBtcGZfY2xlYXIgKEt0KTsgbXBmX2NsZWFyIChmX3gpOyBtcGZfY2xlYXIgKGZfaik7IG1wZl9jbGVhciAoZl9qbnEpOworfQorCisvKiBrc190YWJsZSh2YWwsIG4pIC0tIGNhbGN1bGF0ZSBwcm9iYWJpbGl0eSBmb3IgS3AvS20gbGVzcyB0aGFuIG9yCisgICBlcXVhbCB0byBWQUwgd2l0aCBOIG9ic2VydmF0aW9ucy4gIFNlZSBbS251dGggc2VjdGlvbiAzLjMuMV0gKi8KKwordm9pZAora3NfdGFibGUgKG1wZl90IHAsIG1wZl90IHZhbCwgY29uc3QgdW5zaWduZWQgaW50IG4pCit7CisgIC8qIFdlIHVzZSBFcS4gKDI3KSwgS251dGggcC41OCwgc2tpcHBpbmcgTygxL24pIGZvciBzaW1wbGljaXR5LgorICAgICBUaGlzIHNob3J0Y3V0IHdpbGwgcmVzdWx0IGluIHRvbyBoaWdoIHByb2JhYmlsaXRpZXMsIGVzcGVjaWFsbHkKKyAgICAgd2hlbiBuIGlzIHNtYWxsLgorCisgICAgIFByKEtwKG4pIDw9IHMpID0gMSAtIHBvdyhlLCAtMipzXjIpICogKDEgLSAyLzMqcy9zcXJ0KG4pICsgTygxL24pKSAqLworCisgIC8qIFdlIGhhdmUgJ3MnIGluIHZhcmlhYmxlIFZBTCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBQLiAqLworCisgIG1wZl90IHQxLCB0MjsKKworICBtcGZfaW5pdCAodDEpOyBtcGZfaW5pdCAodDIpOworCisgIC8qIHQxID0gMSAtIDIvMyAqIHMvc3FydChuKSAqLworICBtcGZfc3FydF91aSAodDEsIG4pOworICBtcGZfZGl2ICh0MSwgdmFsLCB0MSk7CisgIG1wZl9tdWxfdWkgKHQxLCB0MSwgMik7CisgIG1wZl9kaXZfdWkgKHQxLCB0MSwgMyk7CisgIG1wZl91aV9zdWIgKHQxLCAxLCB0MSk7CisKKyAgLyogdDIgPSBwb3coZSwgLTIqc14yKSAqLworI2lmbmRlZiBPTERHTVAKKyAgbXBmX3Bvd191aSAodDIsIHZhbCwgMik7CS8qIHQyID0gc14yICovCisgIG1wZl9zZXRfZCAodDIsIGV4cCAoLSgyLjAgKiBtcGZfZ2V0X2QgKHQyKSkpKTsKKyNlbHNlCisgIC8qIGhtbW0sIGdtcCBkb2Vzbid0IGhhdmUgcG93KCkgZm9yIGZsb2F0cy4gIHVzZSBkb3VibGVzLiAqLworICBtcGZfc2V0X2QgKHQyLCBwb3cgKE1fRSwgLSgyICogcG93IChtcGZfZ2V0X2QgKHZhbCksIDIpKSkpOworI2VuZGlmCisKKyAgLyogcCA9IDEgLSB0MSAqIHQyICovCisgIG1wZl9tdWwgKHQxLCB0MSwgdDIpOworICBtcGZfdWlfc3ViIChwLCAxLCB0MSk7CisKKyAgbXBmX2NsZWFyICh0MSk7IG1wZl9jbGVhciAodDIpOworfQorCitzdGF0aWMgZG91YmxlIHgyX3RhYmxlX1hbXVs3XSA9IHsKKyAgeyAtMi4zMywgLTEuNjQsIC0uNjc0LCAwLjAsIDAuNjc0LCAxLjY0LCAyLjMzIH0sIC8qIHggKi8KKyAgeyA1LjQyODksIDIuNjg5NiwgLjQ1NDI3NiwgMC4wLCAuNDU0Mjc2LCAyLjY4OTYsIDUuNDI4OX0gLyogeF4yICovCit9OworCisjZGVmaW5lIF8yRDMgKChkb3VibGUpIC42NjY2NjY2NjY2KQorCisvKiB4Ml90YWJsZSAodCwgdiwgbikgLS0gcmV0dXJuIGNoaS1zcXVhcmUgdGFibGUgcm93IGZvciBWIGluIFRbXS4gKi8KK3ZvaWQKK3gyX3RhYmxlIChkb3VibGUgdFtdLAorCSAgdW5zaWduZWQgaW50IHYpCit7CisgIGludCBmOworCisKKyAgLyogRklYTUU6IERvIGEgdGFibGUgbG9va3VwIGZvciB2IDw9IDMwIHNpbmNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYQorICAgICBbS251dGgsIHZvbCAyLCAzLjMuMV0gaXMgb25seSBnb29kIGZvciB2ID4gMzAuICovCisKKyAgLyogdmFsdWUgPSB2ICsgc3FydCgyKnYpICogWFtwXSArICgyLzMpICogWFtwXV4yIC0gMi8zICsgTygxL3NxcnQodCkgKi8KKyAgLyogTk9URTogVGhlIE8oKSB0ZXJtIGlzIGlnbm9yZWQgZm9yIHNpbXBsaWNpdHkuICovCisKKyAgZm9yIChmID0gMDsgZiA8IDc7IGYrKykKKyAgICAgIHRbZl0gPQorCXYgKworCXNxcnQgKDIgKiB2KSAqIHgyX3RhYmxlX1hbMF1bZl0gKworCV8yRDMgKiB4Ml90YWJsZV9YWzFdW2ZdIC0gXzJEMzsKK30KKworCisvKiBQKHAsIHgpIC0tIERpc3RyaWJ1dGlvbiBmdW5jdGlvbi4gIENhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgb2YgWAorYmVpbmcgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFueSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLiAgRm9yIGEKK3JhbmRvbSByZWFsIG51bWJlciBiZXR3ZWVuIHplcm8gYW5kIG9uZSBnaXZlbiBieSBhIHVuaWZvcm1seQorZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsIHRoaXMgaXMgc2ltcGx5IGVxdWFsIHRvIFguICovCisKK3N0YXRpYyB2b2lkCitQIChtcGZfdCBwLCBtcGZfdCB4KQoreworICBtcGZfc2V0IChwLCB4KTsKK30KKworLyogbXBmX2ZyZXF0KCkgLS0gRnJlcXVlbmN5IHRlc3QgdXNpbmcgS1Mgb24gTiByZWFsIG51bWJlcnMgYmV0d2VlbiB6ZXJvCisgICBhbmQgb25lLiAgU2VlIFtLbnV0aCB2b2wgMiwgcC42MV0uICovCit2b2lkCittcGZfZnJlcXQgKG1wZl90IEtwLAorCSAgIG1wZl90IEttLAorCSAgIG1wZl90IFhbXSwKKwkgICBjb25zdCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICBrcyAoS3AsIEttLCBYLCBQLCBuKTsKK30KKworCisvKiBUaGUgQ2hpLXNxdWFyZSB0ZXN0LiAgRXEuICg4KSBpbiBLbnV0aCB2b2wuIDIgc2F5cyB0aGF0IGlmIFlbXQorICAgaG9sZHMgdGhlIG9ic2VydmF0aW9ucyBhbmQgcFtdIGlzIHRoZSBwcm9iYWJpbGl0eSBmb3IuLiAodG8gYmUKKyAgIGNvbnRpbnVlZCEpCisKKyAgIFYgPSAxL24gKiBzdW0oKHM9MSB0byBrKSBZW3NdXjIgLyBwW3NdKSAtIG4gKi8KKwordm9pZAoreDIgKG1wZl90IFYsCQkJLyogcmVzdWx0ICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgWFtdLAkvKiBkYXRhICovCisgICAgdW5zaWduZWQgaW50IGssCQkvKiAjb2YgY2F0ZWdvcmllcyAqLworICAgIHZvaWQgKFApIChtcGZfdCwgdW5zaWduZWQgbG9uZyBpbnQsIHZvaWQgKiksIC8qIHByb2JhYmlsaXR5IGZ1bmMgKi8KKyAgICB2b2lkICp4LAkJCS8qIGV4dHJhIHVzZXIgZGF0YSBwYXNzZWQgdG8gUCgpICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgbikJLyogI29mIHNhbXBsZXMgKi8KK3sKKyAgdW5zaWduZWQgaW50IGY7CisgIG1wZl90IGZfdCwgZl90MjsJCS8qIHRlbXAgZmxvYXRzICovCisKKyAgbXBmX2luaXQgKGZfdCk7IG1wZl9pbml0IChmX3QyKTsKKworCisgIG1wZl9zZXRfdWkgKFYsIDApOworICBmb3IgKGYgPSAwOyBmIDwgazsgZisrKQorICAgIHsKKyAgICAgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwlmcHJpbnRmIChzdGRlcnIsICIldTogUCgpPSIsIGYpOworICAgICAgbXBmX3NldF91aSAoZl90LCBYW2ZdKTsKKyAgICAgIG1wZl9tdWwgKGZfdCwgZl90LCBmX3QpOwkvKiBmX3QgPSBYW2ZdXjIgKi8KKyAgICAgIFAgKGZfdDIsIGYsIHgpOwkJLyogZl90MiA9IFByKGYpICovCisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJbXBmX291dF9zdHIgKHN0ZGVyciwgMTAsIDIsIGZfdDIpOworICAgICAgbXBmX2RpdiAoZl90LCBmX3QsIGZfdDIpOworICAgICAgbXBmX2FkZCAoViwgViwgZl90KTsKKyAgICAgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICJcdFY9Iik7CisJICBtcGZfb3V0X3N0ciAoc3RkZXJyLCAxMCwgMiwgVik7CisJICBmcHJpbnRmIChzdGRlcnIsICJcdCIpOworCX0KKyAgICB9CisgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICBtcGZfZGl2X3VpIChWLCBWLCBuKTsKKyAgbXBmX3N1Yl91aSAoViwgViwgbik7CisKKyAgbXBmX2NsZWFyIChmX3QpOyBtcGZfY2xlYXIgKGZfdDIpOworfQorCisvKiBQemYocCwgcywgeCkgLS0gUHJvYmFiaWxpdHkgZm9yIGNhdGVnb3J5IFMgaW4gbXB6X2ZyZXF0KCkuICBJdCdzCisgICAxL2QgZm9yIGFsbCBTLiAgWCBpcyBhIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgaW50IGhvbGRpbmcgJ2QnLiAqLworc3RhdGljIHZvaWQKK1B6ZiAobXBmX3QgcCwgdW5zaWduZWQgbG9uZyBpbnQgcywgdm9pZCAqeCkKK3sKKyAgbXBmX3NldF91aSAocCwgMSk7CisgIG1wZl9kaXZfdWkgKHAsIHAsICooKHVuc2lnbmVkIGludCAqKSB4KSk7Cit9CisKKy8qIG1wel9mcmVxdChWLCBYLCBpbWF4LCBuKSAtLSBGcmVxdWVuY3kgdGVzdCBvbiBpbnRlZ2Vycy4gIFtLbnV0aCwKKyAgIHZvbCAyLCAzLjMuMl0uICBLZWVwIElNQVggbG93IG9uIHRoaXMgb25lLCBzaW5jZSB3ZSBsb29wIGZyb20gMCB0bworICAgSU1BWC4gIDEyOCBvciAyNTYgY291bGQgYmUgbmljZS4KKworICAgWFtdIG11c3Qgbm90IGNvbnRhaW4gbnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZSAwIDw9IFggPD0gSU1BWC4KKworICAgUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgYWN0dWFsbHkgdXNlZCwgYWZ0ZXIKKyAgIGRpc2NhcmRpbmcgZW50cmllcyBvdXQgb2YgcmFuZ2UuCisKKyAgIFNpbmNlIFhbXSBjb250YWlucyBpbnRlZ2VycyBiZXR3ZWVuIHplcm8gYW5kIElNQVgsIGluY2x1c2l2ZSwgd2UKKyAgIGhhdmUgSU1BWCsxIGNhdGVnb3JpZXMuCisKKyAgIE5vdGUgdGhhdCBOIHNob3VsZCBiZSBhdCBsZWFzdCA1KklNQVguICBSZXN1bHQgaXMgcHV0IGluIFYgYW5kIGNhbgorICAgYmUgY29tcGFyZWQgdG8gb3V0cHV0IGZyb20geDJfdGFibGUgKHY9SU1BWCkuICovCisKK3Vuc2lnbmVkIGxvbmcgaW50CittcHpfZnJlcXQgKG1wZl90IFYsCisJICAgbXB6X3QgWFtdLAorCSAgIHVuc2lnbmVkIGludCBpbWF4LAorCSAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHVuc2lnbmVkIGxvbmcgaW50ICp2OwkJLyogcmVzdWx0ICovCisgIHVuc2lnbmVkIGludCBmOworICB1bnNpZ25lZCBpbnQgZDsJCS8qIG51bWJlciBvZiBjYXRlZ29yaWVzID0gaW1heCsxICovCisgIHVuc2lnbmVkIGludCB1aXRlbXA7CisgIHVuc2lnbmVkIGxvbmcgaW50IHVzZWRuOworCisKKyAgZCA9IGltYXggKyAxOworCisgIHYgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgY2FsbG9jIChpbWF4ICsgMSwgc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOworICBpZiAoTlVMTCA9PSB2KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIm1wel9mcmVxdCgpOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBjb3VudCAqLworICB1c2VkbiA9IG47CQkJLyogYWN0dWFsIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgKi8KKyAgZm9yIChmID0gMDsgZiA8IG47IGYrKykKKyAgICB7CisgICAgICB1aXRlbXAgPSBtcHpfZ2V0X3VpKFhbZl0pOworICAgICAgaWYgKHVpdGVtcCA+IGltYXgpCS8qIHNhbml0eSBjaGVjayAqLworCXsKKwkgIGlmIChnX2RlYnVnKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJtcHpfZnJlcXQoKTogd2FybmluZzogaW5wdXQgaW5zYW5pdHk6ICV1LCAiXAorCQkgICAgICJpZ25vcmVkLlxuIiwgdWl0ZW1wKTsKKwkgIHVzZWRuLS07CisJICBjb250aW51ZTsKKwl9CisgICAgICB2W3VpdGVtcF0rKzsKKyAgICB9CisKKyAgaWYgKGdfZGVidWcgPiBERUJVR18yKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImNvdW50czpcbiIpOworICAgICAgZm9yIChmID0gMDsgZiA8PSBpbWF4OyBmKyspCisJZnByaW50ZiAoc3RkZXJyLCAiJXU6XHQlbHVcbiIsIGYsIHZbZl0pOworICAgIH0KKworICAvKiBjaGktc3F1YXJlIHdpdGggaz1pbWF4KzEgYW5kIFAoeCk9MS8oaW1heCsxKSBmb3IgYWxsIHguKi8KKyAgeDIgKFYsIHYsIGQsIFB6ZiwgKHZvaWQgKikgJmQsIHVzZWRuKTsKKworICBmcmVlICh2KTsKKyAgcmV0dXJuICh1c2Vkbik7Cit9CisKKy8qIGRlYnVnIGR1bW15IHRvIGRyYWcgaW4gZHVtcCBmdW5jcyAqLwordm9pZAorZm9vX2RlYnVnICgpCit7CisgIGlmICgwKQorICAgIHsKKyAgICAgIG1wZl9kdW1wICgwKTsKKyNpZm5kZWYgT0xER01QCisgICAgICBtcHpfZHVtcCAoMCk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIG1lcml0IChyb3AsIHQsIHYsIG0pIC0tIGNhbGN1bGF0ZSBtZXJpdCBmb3Igc3BlY3RyYWwgdGVzdCByZXN1bHQgaW4KKyAgIGRpbWVuc2lvbiBULCBzZWUgS251dGggcC4gMTA1LiAgQlVHUzogT25seSB2YWxpZCBmb3IgMiA8PSBUIDw9CisgICA2LiAqLwordm9pZAorbWVyaXQgKG1wZl90IHJvcCwgdW5zaWduZWQgaW50IHQsIG1wZl90IHYsIG1wel90IG0pCit7CisgIGludCBmOworICBtcGZfdCBmX20sIGZfY29uc3QsIGZfcGk7CisKKyAgbXBmX2luaXQgKGZfbSk7CisgIG1wZl9zZXRfeiAoZl9tLCBtKTsKKyAgbXBmX2luaXRfc2V0X2QgKGZfY29uc3QsIE1fUEkpOworICBtcGZfaW5pdF9zZXRfZCAoZl9waSwgTV9QSSk7CisKKyAgc3dpdGNoICh0KQorICAgIHsKKyAgICBjYXNlIDI6CQkJLyogUEkgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoJCQkvKiBQSSAqIDQvMyAqLworICAgICAgbXBmX211bF91aSAoZl9jb25zdCwgZl9jb25zdCwgNCk7CisgICAgICBtcGZfZGl2X3VpIChmX2NvbnN0LCBmX2NvbnN0LCAzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoJCQkvKiBQSV4yICogMS8yICovCisgICAgICBtcGZfbXVsIChmX2NvbnN0LCBmX2NvbnN0LCBmX3BpKTsKKyAgICAgIG1wZl9kaXZfdWkgKGZfY29uc3QsIGZfY29uc3QsIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgkJCS8qIFBJXjIgKiA4LzE1ICovCisgICAgICBtcGZfbXVsIChmX2NvbnN0LCBmX2NvbnN0LCBmX3BpKTsKKyAgICAgIG1wZl9tdWxfdWkgKGZfY29uc3QsIGZfY29uc3QsIDgpOworICAgICAgbXBmX2Rpdl91aSAoZl9jb25zdCwgZl9jb25zdCwgMTUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgkJCS8qIFBJXjMgKiAxLzYgKi8KKyAgICAgIG1wZl9tdWwgKGZfY29uc3QsIGZfY29uc3QsIGZfcGkpOworICAgICAgbXBmX211bCAoZl9jb25zdCwgZl9jb25zdCwgZl9waSk7CisgICAgICBtcGZfZGl2X3VpIChmX2NvbnN0LCBmX2NvbnN0LCA2KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgICJzcGVjdCAobWVyaXQpOiBjYW4ndCBjYWxjdWxhdGUgbWVyaXQgZm9yIGRpbWVuc2lvbnMgPiA2XG4iKTsKKyAgICAgIG1wZl9zZXRfdWkgKGZfY29uc3QsIDApOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIHJvcCA9IHZedCAqLworICBtcGZfc2V0IChyb3AsIHYpOworICBmb3IgKGYgPSAxOyBmIDwgdDsgZisrKQorICAgIG1wZl9tdWwgKHJvcCwgcm9wLCB2KTsKKyAgbXBmX211bCAocm9wLCByb3AsIGZfY29uc3QpOworICBtcGZfZGl2IChyb3AsIHJvcCwgZl9tKTsKKworICBtcGZfY2xlYXIgKGZfbSk7CisgIG1wZl9jbGVhciAoZl9jb25zdCk7CisgIG1wZl9jbGVhciAoZl9waSk7Cit9CisKK2RvdWJsZQorbWVyaXRfdSAodW5zaWduZWQgaW50IHQsIG1wZl90IHYsIG1wel90IG0pCit7CisgIG1wZl90IHJvcDsKKyAgZG91YmxlIHJlczsKKworICBtcGZfaW5pdCAocm9wKTsKKyAgbWVyaXQgKHJvcCwgdCwgdiwgbSk7CisgIHJlcyA9IG1wZl9nZXRfZCAocm9wKTsKKyAgbXBmX2NsZWFyIChyb3ApOworICByZXR1cm4gcmVzOworfQorCisvKiBmX2Zsb29yIChyb3AsIG9wKSAtLSBTZXQgcm9wID0gZmxvb3IgKG9wKS4gKi8KK3ZvaWQKK2ZfZmxvb3IgKG1wZl90IHJvcCwgbXBmX3Qgb3ApCit7CisgIG1wel90IHo7CisKKyAgbXB6X2luaXQgKHopOworCisgIC8qIE5vIG1wZl9mbG9vcigpLiAgQ29udmVydCB0byBtcHogYW5kIGJhY2suICovCisgIG1wel9zZXRfZiAoeiwgb3ApOworICBtcGZfc2V0X3ogKHJvcCwgeik7CisKKyAgbXB6X2NsZWFyICh6KTsKK30KKworCisvKiB2el9kb3QgKHJvcCwgdjEsIHYyLCBuZWxlbSkgLS0gY29tcHV0ZSBkb3QgcHJvZHVjdCBvZiB6LXZlY3RvcnMgVjEsCisgICBWMi4gIE4gaXMgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHZlY3RvcnMgVjEgYW5kIFYyLiAqLworCit2b2lkCit2el9kb3QgKG1wel90IHJvcCwgbXB6X3QgVjFbXSwgbXB6X3QgVjJbXSwgdW5zaWduZWQgaW50IG4pCit7CisgIG1wel90IHQ7CisKKyAgbXB6X2luaXQgKHQpOworICBtcHpfc2V0X3VpIChyb3AsIDApOworICB3aGlsZSAobi0tKQorICAgIHsKKyAgICAgIG1wel9tdWwgKHQsIFYxW25dLCBWMltuXSk7CisgICAgICBtcHpfYWRkIChyb3AsIHJvcCwgdCk7CisgICAgfQorCisgIG1wel9jbGVhciAodCk7Cit9CisKK3ZvaWQKK3NwZWN0cmFsX3Rlc3QgKG1wZl90IHJvcFtdLCB1bnNpZ25lZCBpbnQgVCwgbXB6X3QgYSwgbXB6X3QgbSkKK3sKKyAgLyogS251dGggIlNlbWludW1lcmljYWwgQWxnb3JpdGhtcywgVGhpcmQgRWRpdGlvbiIsIHNlY3Rpb24gMy4zLjQKKyAgICAgKHBwLiAxMDEtMTAzKS4gKi8KKworICAvKiB2W3RdID0gbWluIHsgc3FydCAoeFsxXV4yICsgLi4uICsgeFt0XV4yKSB8CisgICAgIHhbMV0gKyBhKnhbMl0gKyAuLi4gKyBwb3cgKGEsIHQtMSkgKiB4W3RdIGlzIGNvbmdydWVudCB0byAwIChtb2QgbSkgfSAqLworCisKKyAgLyogVmFyaWFibGVzLiAqLworICB1bnNpZ25lZCBpbnQgdWlfdDsKKyAgdW5zaWduZWQgaW50IHVpX2ksIHVpX2osIHVpX2ssIHVpX2w7CisgIG1wZl90IGZfdG1wMSwgZl90bXAyOworICBtcHpfdCB0bXAxLCB0bXAyLCB0bXAzOworICBtcHpfdCBVW0dNUF9TUEVDVF9NQVhUXVtHTVBfU1BFQ1RfTUFYVF0sCisgICAgVltHTVBfU1BFQ1RfTUFYVF1bR01QX1NQRUNUX01BWFRdLAorICAgIFhbR01QX1NQRUNUX01BWFRdLAorICAgIFlbR01QX1NQRUNUX01BWFRdLAorICAgIFpbR01QX1NQRUNUX01BWFRdOworICBtcHpfdCBoLCBocCwgciwgcywgcCwgcHAsIHEsIHUsIHY7CisKKyAgLyogR01QIGluaXRzLiAqLworICBtcGZfaW5pdCAoZl90bXAxKTsKKyAgbXBmX2luaXQgKGZfdG1wMik7CisgIGZvciAodWlfaSA9IDA7IHVpX2kgPCBHTVBfU1BFQ1RfTUFYVDsgdWlfaSsrKQorICAgIHsKKyAgICAgIGZvciAodWlfaiA9IDA7IHVpX2ogPCBHTVBfU1BFQ1RfTUFYVDsgdWlfaisrKQorCXsKKwkgIG1wel9pbml0X3NldF91aSAoVVt1aV9pXVt1aV9qXSwgMCk7CisJICBtcHpfaW5pdF9zZXRfdWkgKFZbdWlfaV1bdWlfal0sIDApOworCX0KKyAgICAgIG1wel9pbml0X3NldF91aSAoWFt1aV9pXSwgMCk7CisgICAgICBtcHpfaW5pdF9zZXRfdWkgKFlbdWlfaV0sIDApOworICAgICAgbXB6X2luaXQgKFpbdWlfaV0pOworICAgIH0KKyAgbXB6X2luaXQgKHRtcDEpOworICBtcHpfaW5pdCAodG1wMik7CisgIG1wel9pbml0ICh0bXAzKTsKKyAgbXB6X2luaXQgKGgpOworICBtcHpfaW5pdCAoaHApOworICBtcHpfaW5pdCAocik7CisgIG1wel9pbml0IChzKTsKKyAgbXB6X2luaXQgKHApOworICBtcHpfaW5pdCAocHApOworICBtcHpfaW5pdCAocSk7CisgIG1wel9pbml0ICh1KTsKKyAgbXB6X2luaXQgKHYpOworCisgIC8qIEltcGxlbWVudGF0aW9uIGluaXRzLiAqLworICBpZiAoVCA+IEdNUF9TUEVDVF9NQVhUKQorICAgIFQgPSBHTVBfU1BFQ1RfTUFYVDsJCQkvKiBGSVhNRTogTGF6eS4gKi8KKworICAvKiBTMSBbSW5pdGlhbGl6ZS5dICovCisgIHVpX3QgPSAyIC0gMTsJCQkvKiBOT1RFOiBgdCcgaW4gZGVzY3JpcHRpb24gPT0gdWlfdCArIDEKKwkJCQkgICBmb3IgZWFzeSBpbmRleGluZyAqLworICBtcHpfc2V0IChoLCBhKTsKKyAgbXB6X3NldCAoaHAsIG0pOworICBtcHpfc2V0X3VpIChwLCAxKTsKKyAgbXB6X3NldF91aSAocHAsIDApOworICBtcHpfc2V0IChyLCBhKTsKKyAgbXB6X3Bvd191aSAocywgYSwgMik7CisgIG1wel9hZGRfdWkgKHMsIHMsIDEpOwkJLyogcyA9IDEgKyBhXjIgKi8KKworICAvKiBTMiBbRXVjbGlkZWFuIHN0ZXAuXSAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzEpCisJeworCSAgbXB6X211bCAodG1wMSwgaCwgcHApOworCSAgbXB6X211bCAodG1wMiwgaHAsIHApOworCSAgbXB6X3N1YiAodG1wMSwgdG1wMSwgdG1wMik7CisJICBpZiAobXB6X2NtcGFicyAobSwgdG1wMSkpCisJICAgIHsKKwkgICAgICBwcmludGYgKCIqKipCVUcqKio6IGgqcHAgLSBocCpwID0gIik7CisJICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIHRtcDEpOworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgIH0KKwl9CisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJeworCSAgcHJpbnRmICgiaHAgPSAiKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBocCk7CisJICBwcmludGYgKCJcbmggPSAiKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBoKTsKKwkgIHByaW50ZiAoIlxuIik7CisJICBmZmx1c2ggKHN0ZG91dCk7CisJfQorCisgICAgICBpZiAobXB6X3NnbiAoaCkpCisJbXB6X3RkaXZfcSAocSwgaHAsIGgpOwkvKiBxID0gZmxvb3IoaHAvaCkgKi8KKyAgICAgIGVsc2UKKwltcHpfc2V0X3VpIChxLCAxKTsKKworICAgICAgaWYgKGdfZGVidWcgPiBERUJVR18yKQorCXsKKwkgIHByaW50ZiAoInEgPSAiKTsKKwkgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBxKTsKKwkgIHByaW50ZiAoIlxuIik7CisJICBmZmx1c2ggKHN0ZG91dCk7CisJfQorCisgICAgICBtcHpfbXVsICh0bXAxLCBxLCBoKTsKKyAgICAgIG1wel9zdWIgKHUsIGhwLCB0bXAxKTsJLyogdSA9IGhwIC0gcSpoICovCisKKyAgICAgIG1wel9tdWwgKHRtcDEsIHEsIHApOworICAgICAgbXB6X3N1YiAodiwgcHAsIHRtcDEpOwkvKiB2ID0gcHAgLSBxKnAgKi8KKworICAgICAgbXB6X3Bvd191aSAodG1wMSwgdSwgMik7CisgICAgICBtcHpfcG93X3VpICh0bXAyLCB2LCAyKTsKKyAgICAgIG1wel9hZGQgKHRtcDEsIHRtcDEsIHRtcDIpOworICAgICAgaWYgKG1wel9jbXAgKHRtcDEsIHMpIDwgMCkKKwl7CisJICBtcHpfc2V0IChzLCB0bXAxKTsJLyogcyA9IHVeMiArIHZeMiAqLworCSAgbXB6X3NldCAoaHAsIGgpOwkvKiBocCA9IGggKi8KKwkgIG1wel9zZXQgKGgsIHUpOwkvKiBoID0gdSAqLworCSAgbXB6X3NldCAocHAsIHApOwkvKiBwcCA9IHAgKi8KKwkgIG1wel9zZXQgKHAsIHYpOwkvKiBwID0gdiAqLworCX0KKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisKKyAgLyogUzMgW0NvbXB1dGUgdjIuXSAqLworICBtcHpfc3ViICh1LCB1LCBoKTsKKyAgbXB6X3N1YiAodiwgdiwgcCk7CisKKyAgbXB6X3Bvd191aSAodG1wMSwgdSwgMik7CisgIG1wel9wb3dfdWkgKHRtcDIsIHYsIDIpOworICBtcHpfYWRkICh0bXAxLCB0bXAxLCB0bXAyKTsKKyAgaWYgKG1wel9jbXAgKHRtcDEsIHMpIDwgMCkKKyAgICB7CisgICAgICBtcHpfc2V0IChzLCB0bXAxKTsJLyogcyA9IHVeMiArIHZeMiAqLworICAgICAgbXB6X3NldCAoaHAsIHUpOworICAgICAgbXB6X3NldCAocHAsIHYpOworICAgIH0KKyAgbXBmX3NldF96IChmX3RtcDEsIHMpOworICBtcGZfc3FydCAocm9wW3VpX3QgLSAxXSwgZl90bXAxKTsKKworICAvKiBTNCBbQWR2YW5jZSB0Ll0gKi8KKyAgbXB6X25lZyAoVVswXVswXSwgaCk7CisgIG1wel9zZXQgKFVbMF1bMV0sIHApOworICBtcHpfbmVnIChVWzFdWzBdLCBocCk7CisgIG1wel9zZXQgKFVbMV1bMV0sIHBwKTsKKworICBtcHpfc2V0IChWWzBdWzBdLCBwcCk7CisgIG1wel9zZXQgKFZbMF1bMV0sIGhwKTsKKyAgbXB6X25lZyAoVlsxXVswXSwgcCk7CisgIG1wel9uZWcgKFZbMV1bMV0sIGgpOworICBpZiAobXB6X2NtcF91aSAocHAsIDApID4gMCkKKyAgICB7CisgICAgICBtcHpfbmVnIChWWzBdWzBdLCBWWzBdWzBdKTsKKyAgICAgIG1wel9uZWcgKFZbMF1bMV0sIFZbMF1bMV0pOworICAgICAgbXB6X25lZyAoVlsxXVswXSwgVlsxXVswXSk7CisgICAgICBtcHpfbmVnIChWWzFdWzFdLCBWWzFdWzFdKTsKKyAgICB9CisKKyAgd2hpbGUgKHVpX3QgKyAxICE9IFQpCQkvKiBTNCBsb29wICovCisgICAgeworICAgICAgdWlfdCsrOworICAgICAgbXB6X211bCAociwgYSwgcik7CisgICAgICBtcHpfbW9kIChyLCByLCBtKTsKKworICAgICAgLyogQWRkIG5ldyByb3cgYW5kIGNvbHVtbiB0byBVIGFuZCBWLiAgVGhleSBhcmUgaW5pdGlhbGl6ZWQgd2l0aAorCSBhbGwgZWxlbWVudHMgc2V0IHRvIHplcm8sIHNvIGNsZWFyaW5nIGlzIG5vdCBuZWNlc3NhcnkuICovCisKKyAgICAgIG1wel9uZWcgKFVbdWlfdF1bMF0sIHIpOyAvKiBVOiBGaXJzdCBjb2wgaW4gbmV3IHJvdy4gKi8KKyAgICAgIG1wel9zZXRfdWkgKFVbdWlfdF1bdWlfdF0sIDEpOyAvKiBVOiBMYXN0IGNvbCBpbiBuZXcgcm93LiAqLworCisgICAgICBtcHpfc2V0IChWW3VpX3RdW3VpX3RdLCBtKTsgLyogVjogTGFzdCBjb2wgaW4gbmV3IHJvdy4gKi8KKworICAgICAgLyogIkZpbmFsbHksIGZvciAxIDw9IGkgPCB0LAorCSAgIHNldCBxID0gcm91bmQgKHZpMSAqIHIgLyBtKSwKKwkgICB2aXQgPSB2aTEqciAtIHEqbSwKKwkgICBhbmQgVXQ9VXQrcSpVaSAqLworCisgICAgICBmb3IgKHVpX2kgPSAwOyB1aV9pIDwgdWlfdDsgdWlfaSsrKQorCXsKKwkgIG1wel9tdWwgKHRtcDEsIFZbdWlfaV1bMF0sIHIpOyAvKiB0bXAxPXZpMSpyICovCisJICB6ZGl2X3JvdW5kIChxLCB0bXAxLCBtKTsgLyogcT1yb3VuZCh2aTEqci9tKSAqLworCSAgbXB6X211bCAodG1wMiwgcSwgbSk7CS8qIHRtcDI9cSptICovCisJICBtcHpfc3ViIChWW3VpX2ldW3VpX3RdLCB0bXAxLCB0bXAyKTsKKworCSAgZm9yICh1aV9qID0gMDsgdWlfaiA8PSB1aV90OyB1aV9qKyspIC8qIFVbdF0gPSBVW3RdICsgcSpVW2ldICovCisJICAgIHsKKwkgICAgICBtcHpfbXVsICh0bXAxLCBxLCBVW3VpX2ldW3VpX2pdKTsJLyogdG1wPXEqdWlqICovCisJICAgICAgbXB6X2FkZCAoVVt1aV90XVt1aV9qXSwgVVt1aV90XVt1aV9qXSwgdG1wMSk7IC8qIHV0aiA9IHV0aiArIHEqdWlqICovCisJICAgIH0KKwl9CisKKyAgICAgIC8qIHMgPSBtaW4gKHMsIHpkb3QgKFVbdF0sIFVbdF0pICovCisgICAgICB2el9kb3QgKHRtcDEsIFVbdWlfdF0sIFVbdWlfdF0sIHVpX3QgKyAxKTsKKyAgICAgIGlmIChtcHpfY21wICh0bXAxLCBzKSA8IDApCisJbXB6X3NldCAocywgdG1wMSk7CisKKyAgICAgIHVpX2sgPSB1aV90OworICAgICAgdWlfaiA9IDA7CQkJLyogV0FSTklORzogdWlfaiBubyBsb25nZXIgYSB0ZW1wLiAqLworCisgICAgICAvKiBTNSBbVHJhbnNmb3JtLl0gKi8KKyAgICAgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwlwcmludGYgKCIodCwgaywgaiwgcTEsIHEyLCAuLi4pXG4iKTsKKyAgICAgIGRvCisJeworCSAgaWYgKGdfZGVidWcgPiBERUJVR18yKQorCSAgICBwcmludGYgKCIoJXUsICV1LCAldSIsIHVpX3QgKyAxLCB1aV9rICsgMSwgdWlfaiArIDEpOworCisJICBmb3IgKHVpX2kgPSAwOyB1aV9pIDw9IHVpX3Q7IHVpX2krKykKKwkgICAgeworCSAgICAgIGlmICh1aV9pICE9IHVpX2opCisJCXsKKwkJICB2el9kb3QgKHRtcDEsIFZbdWlfaV0sIFZbdWlfal0sIHVpX3QgKyAxKTsgLyogdG1wMT1kb3QoVmksVmopLiAqLworCQkgIG1wel9hYnMgKHRtcDIsIHRtcDEpOworCQkgIG1wel9tdWxfdWkgKHRtcDIsIHRtcDIsIDIpOyAvKiB0bXAyID0gMiphYnMoZG90KFZpLFZqKSAqLworCQkgIHZ6X2RvdCAodG1wMywgVlt1aV9qXSwgVlt1aV9qXSwgdWlfdCArIDEpOyAvKiB0bXAzPWRvdChWaixWaikuICovCisKKwkJICBpZiAobXB6X2NtcCAodG1wMiwgdG1wMykgPiAwKQorCQkgICAgeworCQkgICAgICB6ZGl2X3JvdW5kIChxLCB0bXAxLCB0bXAzKTsgLyogcT1yb3VuZChWaS5Wai9Wai5WaikgKi8KKwkJICAgICAgaWYgKGdfZGVidWcgPiBERUJVR18yKQorCQkJeworCQkJICBwcmludGYgKCIsICIpOworCQkJICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCAxMCwgcSk7CisJCQl9CisKKwkJICAgICAgZm9yICh1aV9sID0gMDsgdWlfbCA8PSB1aV90OyB1aV9sKyspCisJCQl7CisJCQkgIG1wel9tdWwgKHRtcDEsIHEsIFZbdWlfal1bdWlfbF0pOworCQkJICBtcHpfc3ViIChWW3VpX2ldW3VpX2xdLCBWW3VpX2ldW3VpX2xdLCB0bXAxKTsgLyogVmk9VmktcSpWaiAqLworCQkJICBtcHpfbXVsICh0bXAxLCBxLCBVW3VpX2ldW3VpX2xdKTsKKwkJCSAgbXB6X2FkZCAoVVt1aV9qXVt1aV9sXSwgVVt1aV9qXVt1aV9sXSwgdG1wMSk7IC8qIFVqPVVqK3EqVWkgKi8KKwkJCX0KKworCQkgICAgICB2el9kb3QgKHRtcDEsIFVbdWlfal0sIFVbdWlfal0sIHVpX3QgKyAxKTsgLyogdG1wMT1kb3QoVWosVWopICovCisJCSAgICAgIGlmIChtcHpfY21wICh0bXAxLCBzKSA8IDApIC8qIHMgPSBtaW4ocyxkb3QoVWosVWopKSAqLworCQkJbXB6X3NldCAocywgdG1wMSk7CisJCSAgICAgIHVpX2sgPSB1aV9qOworCQkgICAgfQorCQkgIGVsc2UgaWYgKGdfZGVidWcgPiBERUJVR18yKQorCQkgICAgcHJpbnRmICgiLCAjIik7IC8qIDJ8VmkuVmp8IDw9IFZqLlZqICovCisJCX0KKwkgICAgICBlbHNlIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwkJcHJpbnRmICgiLCAqIik7CS8qIGkgPT0gaiAqLworCSAgICB9CisKKwkgIGlmIChnX2RlYnVnID4gREVCVUdfMikKKwkgICAgcHJpbnRmICgiKVxuIik7CisKKwkgIC8qIFM2IFtBZHZhbmNlIGouXSAqLworCSAgaWYgKHVpX2ogPT0gdWlfdCkKKwkgICAgdWlfaiA9IDA7CisJICBlbHNlCisJICAgIHVpX2orKzsKKwl9CisgICAgICB3aGlsZSAodWlfaiAhPSB1aV9rKTsJLyogUzUgKi8KKworICAgICAgLyogRnJvbSBLbnV0aCBwLiAxMDQ6ICJUaGUgZXhoYXVzdGl2ZSBzZWFyY2ggaW4gc3RlcHMgUzgtUzEwCisJIHJlZHVjZXMgdGhlIHZhbHVlIG9mIHMgb25seSByYXJlbHkuIiAqLworI2lmZGVmIERPX1NFQVJDSAorICAgICAgLyogUzcgW1ByZXBhcmUgZm9yIHNlYXJjaC5dICovCisgICAgICAvKiBGaW5kIG1pbmltdW0gaW4gKHhbMV0sIC4uLiwgeFt0XSkgc2F0aXNmeWluZyBjb25kaXRpb24KKwkgeFtrXV4yIDw9IGYoeVsxXSwgLi4uLHlbdF0pICogZG90KFZba10sVltrXSkgKi8KKworICAgICAgdWlfayA9IHVpX3Q7CisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJeworCSAgcHJpbnRmICgic2VhcmNoaW5nLi4uIik7CisJICAvKmZvciAoZiA9IDA7IGYgPCB1aV90Ki8KKwkgIGZmbHVzaCAoc3Rkb3V0KTsKKwl9CisKKyAgICAgIC8qIFpbaV0gPSBmbG9vciAoc3FydCAoZmxvb3IgKGRvdChWW2ldLFZbaV0pICogcyAvIG1eMikpKTsgKi8KKyAgICAgIG1wel9wb3dfdWkgKHRtcDEsIG0sIDIpOworICAgICAgbXBmX3NldF96IChmX3RtcDEsIHRtcDEpOworICAgICAgbXBmX3NldF96IChmX3RtcDIsIHMpOworICAgICAgbXBmX2RpdiAoZl90bXAxLCBmX3RtcDIsIGZfdG1wMSk7CS8qIGZfdG1wMSA9IHMvbV4yICovCisgICAgICBmb3IgKHVpX2kgPSAwOyB1aV9pIDw9IHVpX3Q7IHVpX2krKykKKwl7CisJICB2el9kb3QgKHRtcDEsIFZbdWlfaV0sIFZbdWlfaV0sIHVpX3QgKyAxKTsKKwkgIG1wZl9zZXRfeiAoZl90bXAyLCB0bXAxKTsKKwkgIG1wZl9tdWwgKGZfdG1wMiwgZl90bXAyLCBmX3RtcDEpOworCSAgZl9mbG9vciAoZl90bXAyLCBmX3RtcDIpOworCSAgbXBmX3NxcnQgKGZfdG1wMiwgZl90bXAyKTsKKwkgIG1wel9zZXRfZiAoWlt1aV9pXSwgZl90bXAyKTsKKwl9CisKKyAgICAgIC8qIFM4IFtBZHZhbmNlIFhba10uXSAqLworICAgICAgZG8KKwl7CisJICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJYWyV1XSA9ICIsIHVpX2spOworCSAgICAgIG1wel9vdXRfc3RyIChzdGRvdXQsIDEwLCBYW3VpX2tdKTsKKwkgICAgICBwcmludGYgKCJcdFpbJXVdID0gIiwgdWlfayk7CisJICAgICAgbXB6X291dF9zdHIgKHN0ZG91dCwgMTAsIFpbdWlfa10pOworCSAgICAgIHByaW50ZiAoIlxuIik7CisJICAgICAgZmZsdXNoIChzdGRvdXQpOworCSAgICB9CisKKwkgIGlmIChtcHpfY21wIChYW3VpX2tdLCBaW3VpX2tdKSkKKwkgICAgeworCSAgICAgIG1wel9hZGRfdWkgKFhbdWlfa10sIFhbdWlfa10sIDEpOworCSAgICAgIGZvciAodWlfaSA9IDA7IHVpX2kgPD0gdWlfdDsgdWlfaSsrKQorCQltcHpfYWRkIChZW3VpX2ldLCBZW3VpX2ldLCBVW3VpX2tdW3VpX2ldKTsKKworCSAgICAgIC8qIFM5IFtBZHZhbmNlIGsuXSAqLworCSAgICAgIHdoaWxlICgrK3VpX2sgPD0gdWlfdCkKKwkJeworCQkgIG1wel9uZWcgKFhbdWlfa10sIFpbdWlfa10pOworCQkgIG1wel9tdWxfdWkgKHRtcDEsIFpbdWlfa10sIDIpOworCQkgIGZvciAodWlfaSA9IDA7IHVpX2kgPD0gdWlfdDsgdWlfaSsrKQorCQkgICAgeworCQkgICAgICBtcHpfbXVsICh0bXAyLCB0bXAxLCBVW3VpX2tdW3VpX2ldKTsKKwkJICAgICAgbXB6X3N1YiAoWVt1aV9pXSwgWVt1aV9pXSwgdG1wMik7CisJCSAgICB9CisJCX0KKwkgICAgICB2el9kb3QgKHRtcDEsIFksIFksIHVpX3QgKyAxKTsKKwkgICAgICBpZiAobXB6X2NtcCAodG1wMSwgcykgPCAwKQorCQltcHpfc2V0IChzLCB0bXAxKTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlICgtLXVpX2spOworI2VuZGlmIC8qIERPX1NFQVJDSCAqLworICAgICAgbXBmX3NldF96IChmX3RtcDEsIHMpOworICAgICAgbXBmX3NxcnQgKHJvcFt1aV90IC0gMV0sIGZfdG1wMSk7CisjaWZkZWYgRE9fU0VBUkNICisgICAgICBpZiAoZ19kZWJ1ZyA+IERFQlVHXzIpCisJcHJpbnRmICgiZG9uZS5cbiIpOworI2VuZGlmIC8qIERPX1NFQVJDSCAqLworICAgIH0gLyogUzQgbG9vcCAqLworCisgIC8qIENsZWFyIEdNUCB2YXJpYWJsZXMuICovCisKKyAgbXBmX2NsZWFyIChmX3RtcDEpOworICBtcGZfY2xlYXIgKGZfdG1wMik7CisgIGZvciAodWlfaSA9IDA7IHVpX2kgPCBHTVBfU1BFQ1RfTUFYVDsgdWlfaSsrKQorICAgIHsKKyAgICAgIGZvciAodWlfaiA9IDA7IHVpX2ogPCBHTVBfU1BFQ1RfTUFYVDsgdWlfaisrKQorCXsKKwkgIG1wel9jbGVhciAoVVt1aV9pXVt1aV9qXSk7CisJICBtcHpfY2xlYXIgKFZbdWlfaV1bdWlfal0pOworCX0KKyAgICAgIG1wel9jbGVhciAoWFt1aV9pXSk7CisgICAgICBtcHpfY2xlYXIgKFlbdWlfaV0pOworICAgICAgbXB6X2NsZWFyIChaW3VpX2ldKTsKKyAgICB9CisgIG1wel9jbGVhciAodG1wMSk7CisgIG1wel9jbGVhciAodG1wMik7CisgIG1wel9jbGVhciAodG1wMyk7CisgIG1wel9jbGVhciAoaCk7CisgIG1wel9jbGVhciAoaHApOworICBtcHpfY2xlYXIgKHIpOworICBtcHpfY2xlYXIgKHMpOworICBtcHpfY2xlYXIgKHApOworICBtcHpfY2xlYXIgKHBwKTsKKyAgbXB6X2NsZWFyIChxKTsKKyAgbXB6X2NsZWFyICh1KTsKKyAgbXB6X2NsZWFyICh2KTsKKworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYW5kL3QtaXNldC5jIGIvdGVzdHMvcmFuZC90LWlzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQyMjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC90LWlzZXQuYwpAQCAtMCwwICsxLDY3IEBACisvKiBUZXN0IGdtcF9yYW5kaW5pdF9zZXQuCisKK0NvcHlyaWdodCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKy8qIGV4cGVjdCBhZnRlciBhIGdtcF9yYW5kaW5pdF9zZXQgdGhhdCB0aGUgbmV3IGFuZCBvbGQgZ2VuZXJhdG9ycyB3aWxsCisgICBwcm9kdWNlIHRoZSBzYW1lIHNlcXVlbmNlIG9mIG51bWJlcnMgKi8KK3ZvaWQKK2NoZWNrX29uZSAoY29uc3QgY2hhciAqbmFtZSwgZ21wX3JhbmRzdGF0ZV9wdHIgc3JjKQoreworICBnbXBfcmFuZHN0YXRlX3QgZHN0OworICBtcHpfdCAgc3osIGR6OworICBpbnQgICAgaTsKKworICBnbXBfcmFuZGluaXRfc2V0IChkc3QsIHNyYyk7CisgIG1wel9pbml0IChzeik7CisgIG1wel9pbml0IChkeik7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisgICAgeworICAgICAgbXB6X3VyYW5kb21iIChzeiwgc3JjLCAxMjMpOworICAgICAgbXB6X3VyYW5kb21iIChkeiwgZHN0LCAxMjMpOworCisgICAgICBpZiAobXB6X2NtcCAoc3osIGR6KSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICAoImdtcF9yYW5kaW5pdF9zZXQgZGlkbid0IGR1cGxpY2F0ZSByYW5kc3RhdGVcbiIpOworICAgICAgICAgIHByaW50ZiAgICAgKCIgIGFsZ29yaXRobTogJXNcbiIsIG5hbWUpOworICAgICAgICAgIGdtcF9wcmludGYgKCIgIGZyb20gc3JjOiAgJSNaeFxuIiwgc3opOworICAgICAgICAgIGdtcF9wcmludGYgKCIgIGZyb20gZHN0OiAgJSNaeFxuIiwgZHopOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wel9jbGVhciAoc3opOworICBtcHpfY2xlYXIgKGR6KTsKKyAgZ21wX3JhbmRjbGVhciAoZHN0KTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0ZXN0c19zdGFydCAoKTsKKworICBjYWxsX3JhbmRfYWxncyAoY2hlY2tfb25lKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZC90LWxjMmV4cC5jIGIvdGVzdHMvcmFuZC90LWxjMmV4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjY5MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yYW5kL3QtbGMyZXhwLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qIEV4ZXJjaXNlIHRoZSBsYzJleHAgcmFuZG9tIGZ1bmN0aW9ucy4KKworQ29weXJpZ2h0IDIwMDIsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBhPTAgYW5kIGM9MCBwcm9kdWNlcyB6ZXJvIHJlc3VsdHMgYWx3YXlzLiAqLwordm9pZAorY2hlY2tfemVybyAodW5zaWduZWQgbG9uZyBtMmV4cCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV90ICByOworICBtcHpfdCAgICAgICAgICAgIGE7CisgIHVuc2lnbmVkIGxvbmcgICAgYzsKKyAgaW50ICAgICAgICAgICAgICBpOworCisgIG1wel9pbml0X3NldF91aSAoYSwgMEwpOworICBjID0gMEw7CisKKyAgZ21wX3JhbmRpbml0X2xjXzJleHAgKHIsIGEsIGMsIG0yZXhwKTsKKyAgZ21wX3JhbmRzZWVkX3VpIChyLCAwTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGEsIHIsIDEyM0wpOworICAgICAgaWYgKG1wel9zZ24gKGEpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJjaGVja196ZXJvIG0yZXhwPSVsdTogZGlkbid0IGdldCB6ZXJvXG4iLCBtMmV4cCk7CisgICAgICAgICAgZ21wX3ByaW50ZiAoIiAgcmFuZD0lI1p4XG4iLCBhKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworICBnbXBfcmFuZGNsZWFyIChyKTsKK30KKworLyogbmVnYXRpdmUgYSAqLwordm9pZAorY2hlY2tfbmVnYSAodm9pZCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV90ICByOworICBtcHpfdCAgICAgICAgICAgIGE7CisgIHVuc2lnbmVkIGxvbmcgICAgYywgbTJleHA7CisgIGludCAgICAgICAgICAgICAgaTsKKworICBtcHpfaW5pdCAoYSk7CisgIG1wel9zZXRiaXQgKGEsIDEwMDBMKTsKKyAgbXB6X25lZyAoYSwgYSk7CisgIGMgPSAwTDsKKyAgbTJleHAgPSA0NUw7CisKKyAgZ21wX3JhbmRpbml0X2xjXzJleHAgKHIsIGEsIGMsIG0yZXhwKTsKKyAgZ21wX3JhbmRzZWVkX3VpIChyLCAwTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICBtcHpfdXJhbmRvbWIgKGEsIHIsIDEyM0wpOworICAgICAgaWYgKG1wel9zZ24gKGEpICE9IDApCisgICAgICAgIHByaW50ZiAoImNoZWNrX25lZ2EgbTJleHA9JWx1OiBkaWRuJ3QgZ2V0IHplcm9cbiIsIG0yZXhwKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgZ21wX3JhbmRjbGVhciAocik7Cit9CisKK3ZvaWQKK2NoZWNrX2JpZ2MgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfdCAgcjsKKyAgbXB6X3QgICAgICAgICAgICBhOworICB1bnNpZ25lZCBsb25nICAgIGMsIG0yZXhwLCBiaXRzOworICBpbnQgICAgICAgICAgICAgIGk7CisKKyAgbXB6X2luaXRfc2V0X3VpIChhLCAwTCk7CisgIGMgPSBVTE9OR19NQVg7CisgIG0yZXhwID0gODsKKworICBnbXBfcmFuZGluaXRfbGNfMmV4cCAociwgYSwgYywgbTJleHApOworICBnbXBfcmFuZHNlZWRfdWkgKHIsIDBMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICB7CisgICAgICBiaXRzID0gMTIzTDsKKyAgICAgIG1wel91cmFuZG9tYiAoYSwgciwgYml0cyk7CisgICAgICBpZiAobXB6X3NnbiAoYSkgPCAwIHx8IG1wel9zaXplaW5iYXNlIChhLCAyKSA+IGJpdHMpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgICAgICgiY2hlY2tfYmlnYzogbXB6X3VyYW5kb21iIG91dCBvZiByYW5nZVxuIik7CisgICAgICAgICAgcHJpbnRmICAgICAoIiAgIG0yZXhwPSVsdVxuIiwgbTJleHApOworICAgICAgICAgIGdtcF9wcmludGYgKCIgICByYW5kPSUjWlhcbiIsIGEpOworICAgICAgICAgIGdtcF9wcmludGYgKCIgICBzaXplaW5iYXNlMj0ldVxuIiwgbXB6X3NpemVpbmJhc2UgKGEsIDIpKTsKKwkgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIGdtcF9yYW5kY2xlYXIgKHIpOworfQorCit2b2lkCitjaGVja19iaWdjMSAodm9pZCkKK3sKKyAgZ21wX3JhbmRzdGF0ZV90ICByOworICBtcHpfdCAgICAgICAgICAgIGE7CisgIHVuc2lnbmVkIGxvbmcgICAgYywgbTJleHA7CisgIGludCAgICAgICAgICAgICAgaTsKKworICBtcHpfaW5pdF9zZXRfdWkgKGEsIDBMKTsKKyAgYyA9IFVMT05HX01BWDsKKyAgbTJleHAgPSAyOworCisgIGdtcF9yYW5kaW5pdF9sY18yZXhwIChyLCBhLCBjLCBtMmV4cCk7CisgIGdtcF9yYW5kc2VlZF91aSAociwgMEwpOworCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorICAgIHsKKyAgICAgIG1wel91cmFuZG9tYiAoYSwgciwgMUwpOworICAgICAgaWYgKG1wel9jbXBfdWkgKGEsIDFMKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICAgICAoImNoZWNrX2JpZ2MxOiBtcHpfdXJhbmRvbWIgZGlkbid0IGdpdmUgMVxuIik7CisgICAgICAgICAgcHJpbnRmICAgICAoIiAgIG0yZXhwPSVsdVxuIiwgbTJleHApOworICAgICAgICAgIGdtcF9wcmludGYgKCIgICBnb3QgcmFuZD0lI1pYXG4iLCBhKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KKworICBtcHpfY2xlYXIgKGEpOworICBnbXBfcmFuZGNsZWFyIChyKTsKK30KKworLyogQ2hlY2tzIHBhcmFtZXRlcnMgd2hpY2ggdHJpZ2dlcmVkIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluIHRoZSBwYXN0LgorICAgSGFwcGVuZWQgd2hlbiBsaW1icyhhKStsaW1icyhjKSA8IGJpdHNfdG9fbGltYnMobTJleHApLiAgKi8KK3ZvaWQKK2NoZWNrX2JpZ20gKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfdCByc3RhdGU7CisgIG1wel90IGE7CisKKyAgbXB6X2luaXRfc2V0X3VpIChhLCA1TCk7CisgIGdtcF9yYW5kaW5pdF9sY18yZXhwIChyc3RhdGUsIGEsIDFMLCAzODRMKTsKKworICBtcHpfdXJhbmRvbWIgKGEsIHJzdGF0ZSwgMjBMKTsKKworICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworICBtcHpfY2xlYXIgKGEpOworfQorCisvKiBDaGVja3MgZm9yIHNlZWRzIGJpZ2dlciB0aGFuIHRoZSBtb2R1bHVzLiAgKi8KK3ZvaWQKK2NoZWNrX2JpZ3MgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfdCByc3RhdGU7CisgIG1wel90IHNkLCBhOworICBpbnQgaTsKKworICBtcHpfaW5pdCAoc2QpOworICBtcHpfc2V0Yml0IChzZCwgMzAwTCk7CisgIG1wel9zdWJfdWkgKHNkLCBzZCwgMUwpOworICBtcHpfY2xyYml0IChzZCwgMTNMKTsKKyAgbXB6X2luaXRfc2V0X3VpIChhLCAxMjM0NTY3ODlMKTsKKworICBnbXBfcmFuZGluaXRfbGNfMmV4cCAocnN0YXRlLCBhLCA1TCwgNjRMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICB7CisgICAgICBtcHpfbmVnIChzZCwgc2QpOworICAgICAgZ21wX3JhbmRzZWVkIChyc3RhdGUsIHNkKTsKKyAgICAgIG1wel9tdWxfdWkgKHNkLCBzZCwgN0wpOworCisgICAgICBtcHpfdXJhbmRvbWIgKGEsIHJzdGF0ZSwgODBMKTsKKyAgICB9CisKKyAgZ21wX3JhbmRjbGVhciAocnN0YXRlKTsKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChzZCk7Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2hlY2tfemVybyAoMkwpOworICBjaGVja196ZXJvICg3TCk7CisgIGNoZWNrX3plcm8gKDMyTCk7CisgIGNoZWNrX3plcm8gKDY0TCk7CisgIGNoZWNrX3plcm8gKDEwMDBMKTsKKworICBjaGVja19uZWdhICgpOworICBjaGVja19iaWdjICgpOworICBjaGVja19iaWdjMSAoKTsKKworICBjaGVja19iaWdtICgpOworICBjaGVja19iaWdzICgpOworCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYW5kL3QtbXQuYyBiL3Rlc3RzL3JhbmQvdC1tdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YmE3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yYW5kL3QtbXQuYwpAQCAtMCwwICsxLDgyIEBACisvKiBUZXN0IHRoZSBNZXJzZW5uZSBUd2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorCitDb3B5cmlnaHQgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAoMSkKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAoMCkKKyNlbmRpZgorCisvKiBUZXN0IHRoYXQgdGhlIHNlcXVlbmNlIHdpdGhvdXQgc2VlZGluZyBlcXVhbHMgdGhlIHNlcXVlbmNlIHdpdGggdGhlCisgICBkZWZhdWx0IHNlZWQuICAqLworaW50CitjaGtfZGVmYXVsdF9zZWVkICh2b2lkKQoreworICBnbXBfcmFuZHN0YXRlX3QgcjEsIHIyOworICBtcHpfdCBhLCBiOworICBpbnQgaTsKKyAgaW50IG9rID0gVFJVRTsKKworICBtcHpfaW5pdDIgKGEsIDE5OTM2TCk7CisgIG1wel9pbml0MiAoYiwgMTk5MzZMKTsKKworICBnbXBfcmFuZGluaXRfbXQgKHIxKTsKKyAgZ21wX3JhbmRpbml0X210IChyMik7CisgIGdtcF9yYW5kc2VlZF91aSAocjIsIDU0ODlMKTsgLyogTXVzdCBtYXRjaCBERUZBVUxUX1NFRUQgaW4gcmFuZG10LmMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICAvKiBFeHRyYWN0IG9uZSB3aG9sZSBidWZmZXIgcGVyIGl0ZXJhdGlvbi4gICovCisgICAgICBtcHpfdXJhbmRvbWIgKGEsIHIxLCAxOTkzNkwpOworICAgICAgbXB6X3VyYW5kb21iIChiLCByMiwgMTk5MzZMKTsKKyAgICAgIGlmIChtcHpfY21wIChhLCBiKSAhPSAwKQorCXsKKwkgIG9rID0gRkFMU0U7CisJICBwcmludGYgKCJEZWZhdWx0IHNlZWQgZmFpbHMgaW4gaXRlcmF0aW9uICVkXG4iLCBpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGdtcF9yYW5kY2xlYXIgKHIxKTsKKyAgZ21wX3JhbmRjbGVhciAocjIpOworCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYik7CisgIHJldHVybiBvazsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgb2s7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgb2sgPSBjaGtfZGVmYXVsdF9zZWVkICgpOworCisgIHRlc3RzX2VuZCAoKTsKKworICBpZiAob2spCisgICAgcmV0dXJuIDA7IC8qIHBhc3MgKi8KKyAgZWxzZQorICAgIHJldHVybiAxOyAvKiBmYWlsICovCit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYW5kL3QtcmFuZC5jIGIvdGVzdHMvcmFuZC90LXJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjY1YTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC90LXJhbmQuYwpAQCAtMCwwICsxLDI5MCBAQAorLyogdC1yYW5kIC0tIFRlc3QgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLiAgKi8KKworLyoKK0NvcHlyaWdodCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJnbXAuaCIKKworI2RlZmluZSBTRUVEIDEKKyNkZWZpbmUgQkFTRSAxNgorI2RlZmluZSBFTlRTIDEwCQkJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXJyYXkgd2hlbgorCQkJCSAgIHByaW50aW5nLiAgKi8KKworLyogVGhlc2Ugd2VyZSBnZW5lcmF0ZWQgYnkgdGhpcyB2ZXJ5IHByb2dyYW0uICBEbyBub3QgZWRpdCEgICovCisvKiBJbnRlZ2Vycy4gICovCitjb25zdCBjaGFyICp6MVtFTlRTXSA9IHsiMCIsICIxIiwgIjEiLCAiMSIsICIxIiwgIjAiLCAiMSIsICIxIiwgIjEiLCAiMSJ9OworY29uc3QgY2hhciAqejJbRU5UU10gPSB7IjAiLCAiMyIsICIxIiwgIjMiLCAiMyIsICIwIiwgIjMiLCAiMyIsICIzIiwgIjEifTsKK2NvbnN0IGNoYXIgKnozW0VOVFNdID0geyI0IiwgIjMiLCAiMSIsICI3IiwgIjMiLCAiMCIsICIzIiwgIjMiLCAiMyIsICIxIn07Citjb25zdCBjaGFyICp6NFtFTlRTXSA9IHsiYyIsICIzIiwgIjEiLCAiZiIsICJiIiwgIjgiLCAiMyIsICIzIiwgIjMiLCAiMSJ9OworY29uc3QgY2hhciAqejVbRU5UU10gPSB7IjFjIiwgIjEzIiwgIjExIiwgIjFmIiwgImIiLCAiMTgiLCAiMyIsICIxMyIsICIzIiwgIjEifTsKKworY29uc3QgY2hhciAqejEwW0VOVFNdID0geyIyOWMiLCAiMjEzIiwgImYxIiwgIjE3ZiIsICIxMmIiLCAiMTc4IiwgIjM4MyIsICJkMyIsICIzYTMiLCAiMjgxIn07CisKK2NvbnN0IGNoYXIgKnoxNVtFTlRTXSA9IHsiMjljIiwgIjFhMTMiLCAiNzRmMSIsICIyNTdmIiwgIjU5MmIiLCAiNDk3OCIsICI0NzgzIiwgIjdjZDMiLCAiNWJhMyIsICI0NjgxIn07Citjb25zdCBjaGFyICp6MTZbRU5UU10gPSB7IjI5YyIsICI5YTEzIiwgIjc0ZjEiLCAiYTU3ZiIsICJkOTJiIiwgIjQ5NzgiLCAiYzc4MyIsICJmY2QzIiwgIjViYTMiLCAiYzY4MSJ9OworY29uc3QgY2hhciAqejE3W0VOVFNdID0geyI1MWUiLCAiZjE3YSIsICI1NGZmIiwgIjFhMzM1IiwgImNmNjUiLCAiNWQ2ZiIsICI1ODNmIiwgIjYxOGYiLCAiMWJjNiIsICI5OGZmIn07CisKK2NvbnN0IGNoYXIgKnozMVtFTlRTXSA9IHsiM2FlY2Q1MTUiLCAiMTNhZThlYzYiLCAiNTE4YzgwOTAiLCAiODFjYTA3NyIsICI3MGI3MTM0IiwgIjdlZTc4ZDcxIiwgIjMyM2E3NjM2IiwgIjIxMjJjYjFhIiwgIjE5ODExOTQxIiwgIjQxZmQ2MDUifTsKK2NvbnN0IGNoYXIgKnozMltFTlRTXSA9IHsiYmFlY2Q1MTUiLCAiMTNhZThlYzYiLCAiNTE4YzgwOTAiLCAiODgxY2EwNzciLCAiODcwYjcxMzQiLCAiN2VlNzhkNzEiLCAiMzIzYTc2MzYiLCAiYTEyMmNiMWEiLCAiOTk4MTE5NDEiLCAiODQxZmQ2MDUifTsKK2NvbnN0IGNoYXIgKnozM1tFTlRTXSA9IHsiMWZhZjRjY2EiLCAiMTVkNmVmODNiIiwgIjkwOTVmZTcyIiwgIjFiNmEzZGZmNiIsICJiMTdjYmRkZCIsICIxNmU1MjA5ZDQiLCAiNmY2NWIxMmMiLCAiNDkzYmJiYzYiLCAiYWJmMmE1ZDUiLCAiNmQ0OTFhM2MifTsKKworY29uc3QgY2hhciAqejYzW0VOVFNdID0geyI0OGE3NGYzNjdmYTdiNWM4IiwgIjNiYTllOWRjMWIyNjMwNzYiLCAiMWUwYWM4NGU3Njc4ZTBmYiIsICIxMTQxNjU4MTcyOGIzZTM1IiwgIjM2YWI2MTA1MjNmMGYxZjciLCAiM2U1NDBlOGU5NWMwZWI0YiIsICI0MzlhZTE2MDU3ZGJjOWQzIiwgIjczNGZiMjYwZGIyNDM5NTAiLCAiN2QzYTMxN2VmZmMyODliZiIsICIxZDgwMzAxZmIzZDFhMGQxIn07Citjb25zdCBjaGFyICp6NjRbRU5UU10gPSB7IjQ4YTc0ZjM2N2ZhN2I1YzgiLCAiYmJhOWU5ZGMxYjI2MzA3NiIsICI5ZTBhYzg0ZTc2NzhlMGZiIiwgIjExNDE2NTgxNzI4YjNlMzUiLCAiYjZhYjYxMDUyM2YwZjFmNyIsICJiZTU0MGU4ZTk1YzBlYjRiIiwgIjQzOWFlMTYwNTdkYmM5ZDMiLCAiZjM0ZmIyNjBkYjI0Mzk1MCIsICJmZDNhMzE3ZWZmYzI4OWJmIiwgIjFkODAzMDFmYjNkMWEwZDEifTsKK2NvbnN0IGNoYXIgKno2NVtFTlRTXSA9IHsiMWZmNzc3MTBkODQ2ZDQ5ZjAiLCAiMWIxNDExNzAxZDcwOWVlMTAiLCAiMzFmZmE4MWEyMDhiNmFmNCIsICI0NDY2MzhkNDMxZDNjNjgxIiwgImRmNWM1NjlkNWJhYThiNTUiLCAiMTk3ZDk5ZWE5YmYyOGU1YTAiLCAiMTkxYWRlMDllZGQ5NGNmYWUiLCAiMTk0YWNlZmE2ZGRlNWUxOGQiLCAiMWFmYzExNjdjNTYyNzJkOTIiLCAiZDA5Mjk5NGRhNzJmMjA2ZiJ9OworCitjb25zdCBjaGFyICp6MTI3W0VOVFNdID0geyIyZjY2YmE5MzJhYWY1OGEwNzFmZDhmMDc0MmE5OWEwYyIsICI3M2NmYTNjNjY0YzljMTc1MzUwN2NhNjBlYzZiODQyNSIsICI1M2VhMDc0Y2ExMzFkZWMxMmNkNjhiOGFhOGUyMDI3OCIsICIzY2Y1YWM4YzM0MzUzMmY4YTUzY2MwZWI0NzU4MWY3MyIsICI1MGMxMWQ1ODY5ZTIwOGFhMWI5YWEzMTdiOGMyZDBhOSIsICJiMjMxNjNjODkyODc2NDcyYjFlZjE5NjQyZWFjZTA5IiwgIjQ4OWY0YzAzZDQxZjg3NTA5YzhkNmM5MGNlNjc0Zjk1IiwgIjJhYjg3NDhjOTZhYTY3NjJlYTE5MzJiNDRjOWQ3MTY0IiwgIjk4Y2I1NTkxZmMwNWFkMzFhZmJiYzFkNjdiOTBlZGQiLCAiNzc4NDhiYjk5MWZkMGJlMzMxYWRjZjE0NTdmYmM2NzIifTsKK2NvbnN0IGNoYXIgKnoxMjhbRU5UU10gPSB7ImFmNjZiYTkzMmFhZjU4YTA3MWZkOGYwNzQyYTk5YTBjIiwgIjczY2ZhM2M2NjRjOWMxNzUzNTA3Y2E2MGVjNmI4NDI1IiwgIjUzZWEwNzRjYTEzMWRlYzEyY2Q2OGI4YWE4ZTIwMjc4IiwgIjNjZjVhYzhjMzQzNTMyZjhhNTNjYzBlYjQ3NTgxZjczIiwgIjUwYzExZDU4NjllMjA4YWExYjlhYTMxN2I4YzJkMGE5IiwgIjhiMjMxNjNjODkyODc2NDcyYjFlZjE5NjQyZWFjZTA5IiwgIjQ4OWY0YzAzZDQxZjg3NTA5YzhkNmM5MGNlNjc0Zjk1IiwgImFhYjg3NDhjOTZhYTY3NjJlYTE5MzJiNDRjOWQ3MTY0IiwgIjk4Y2I1NTkxZmMwNWFkMzFhZmJiYzFkNjdiOTBlZGQiLCAiZjc4NDhiYjk5MWZkMGJlMzMxYWRjZjE0NTdmYmM2NzIifTsKKworLyogRmxvYXRzLiAgKi8KK2NvbnN0IGNoYXIgKmYxW0VOVFNdID0geyIwLkAwIiwgIjAuOEAwIiwgIjAuOEAwIiwgIjAuOEAwIiwgIjAuOEAwIiwgIjAuQDAiLCAiMC44QDAiLCAiMC44QDAiLCAiMC44QDAiLCAiMC44QDAifTsKK2NvbnN0IGNoYXIgKmYyW0VOVFNdID0geyIwLkAwIiwgIjAuY0AwIiwgIjAuNEAwIiwgIjAuY0AwIiwgIjAuY0AwIiwgIjAuQDAiLCAiMC5jQDAiLCAiMC5jQDAiLCAiMC5jQDAiLCAiMC40QDAifTsKK2NvbnN0IGNoYXIgKmYzW0VOVFNdID0geyIwLjhAMCIsICIwLjZAMCIsICIwLjJAMCIsICIwLmVAMCIsICIwLjZAMCIsICIwLkAwIiwgIjAuNkAwIiwgIjAuNkAwIiwgIjAuNkAwIiwgIjAuMkAwIn07Citjb25zdCBjaGFyICpmNFtFTlRTXSA9IHsiMC5jQDAiLCAiMC4zQDAiLCAiMC4xQDAiLCAiMC5mQDAiLCAiMC5iQDAiLCAiMC44QDAiLCAiMC4zQDAiLCAiMC4zQDAiLCAiMC4zQDAiLCAiMC4xQDAifTsKK2NvbnN0IGNoYXIgKmY1W0VOVFNdID0geyIwLmVAMCIsICIwLjk4QDAiLCAiMC44OEAwIiwgIjAuZjhAMCIsICIwLjU4QDAiLCAiMC5jQDAiLCAiMC4xOEAwIiwgIjAuOThAMCIsICIwLjE4QDAiLCAiMC44QC0xIn07CisKK2NvbnN0IGNoYXIgKmYxMFtFTlRTXSA9IHsiMC5hN0AwIiwgIjAuODRjQDAiLCAiMC4zYzRAMCIsICIwLjVmY0AwIiwgIjAuNGFjQDAiLCAiMC41ZUAwIiwgIjAuZTBjQDAiLCAiMC4zNGNAMCIsICIwLmU4Y0AwIiwgIjAuYTA0QDAifTsKKworY29uc3QgY2hhciAqZjE1W0VOVFNdID0geyIwLjUzOEAtMSIsICIwLjM0MjZAMCIsICIwLmU5ZTJAMCIsICIwLjRhZmVAMCIsICIwLmIyNTZAMCIsICIwLjkyZkAwIiwgIjAuOGYwNkAwIiwgIjAuZjlhNkAwIiwgIjAuYjc0NkAwIiwgIjAuOGQwMkAwIn07Citjb25zdCBjaGFyICpmMTZbRU5UU10gPSB7IjAuMjljQC0xIiwgIjAuOWExM0AwIiwgIjAuNzRmMUAwIiwgIjAuYTU3ZkAwIiwgIjAuZDkyYkAwIiwgIjAuNDk3OEAwIiwgIjAuYzc4M0AwIiwgIjAuZmNkM0AwIiwgIjAuNWJhM0AwIiwgIjAuYzY4MUAwIn07Citjb25zdCBjaGFyICpmMTdbRU5UU10gPSB7IjAuMjhmQC0xIiwgIjAuNzhiZEAwIiwgIjAuMmE3ZjhAMCIsICIwLmQxOWE4QDAiLCAiMC42N2IyOEAwIiwgIjAuMmViNzhAMCIsICIwLjJjMWY4QDAiLCAiMC4zMGM3OEAwIiwgIjAuZGUzQC0xIiwgIjAuNGM3ZjhAMCJ9OworCitjb25zdCBjaGFyICpmMzFbRU5UU10gPSB7IjAuNzVkOWFhMmFAMCIsICIwLjI3NWQxZDhjQDAiLCAiMC5hMzE5MDEyQDAiLCAiMC4xMDM5NDBlZUAwIiwgIjAuZTE2ZTI2OEAtMSIsICIwLmZkY2YxYWUyQDAiLCAiMC42NDc0ZWM2Y0AwIiwgIjAuNDI0NTk2MzRAMCIsICIwLjMzMDIzMjgyQDAiLCAiMC44M2ZhYzBhQC0xIn07Citjb25zdCBjaGFyICpmMzJbRU5UU10gPSB7IjAuYmFlY2Q1MTVAMCIsICIwLjEzYWU4ZWM2QDAiLCAiMC41MThjODA5QDAiLCAiMC44ODFjYTA3N0AwIiwgIjAuODcwYjcxMzRAMCIsICIwLjdlZTc4ZDcxQDAiLCAiMC4zMjNhNzYzNkAwIiwgIjAuYTEyMmNiMWFAMCIsICIwLjk5ODExOTQxQDAiLCAiMC44NDFmZDYwNUAwIn07Citjb25zdCBjaGFyICpmMzNbRU5UU10gPSB7IjAuZmQ3YTY2NUAtMSIsICIwLmFlYjc3YzFkOEAwIiwgIjAuNDg0YWZmMzlAMCIsICIwLmRiNTFlZmZiQDAiLCAiMC41OGJlNWVlZThAMCIsICIwLmI3MjkwNGVhQDAiLCAiMC4zN2IyZDg5NkAwIiwgIjAuMjQ5ZGRkZTNAMCIsICIwLjU1Zjk1MmVhOEAwIiwgIjAuMzZhNDhkMWVAMCJ9OworCitjb25zdCBjaGFyICpmNjNbRU5UU10gPSB7IjAuOTE0ZTllNmNmZjRmNmI5QDAiLCAiMC43NzUzZDNiODM2NGM2MGVjQDAiLCAiMC4zYzE1OTA5Y2VjZjFjMWY2QDAiLCAiMC4yMjgyY2IwMmU1MTY3YzZhQDAiLCAiMC42ZDU2YzIwYTQ3ZTFlM2VlQDAiLCAiMC43Y2E4MWQxZDJiODFkNjk2QDAiLCAiMC44NzM1YzJjMGFmYjc5M2E2QDAiLCAiMC5lNjlmNjRjMWI2NDg3MmFAMCIsICIwLmZhNzQ2MmZkZmY4NTEzN2VAMCIsICIwLjNiMDA2MDNmNjdhMzQxYTJAMCJ9OworY29uc3QgY2hhciAqZjY0W0VOVFNdID0geyIwLjQ4YTc0ZjM2N2ZhN2I1YzhAMCIsICIwLmJiYTllOWRjMWIyNjMwNzZAMCIsICIwLjllMGFjODRlNzY3OGUwZmJAMCIsICIwLjExNDE2NTgxNzI4YjNlMzVAMCIsICIwLmI2YWI2MTA1MjNmMGYxZjdAMCIsICIwLmJlNTQwZThlOTVjMGViNGJAMCIsICIwLjQzOWFlMTYwNTdkYmM5ZDNAMCIsICIwLmYzNGZiMjYwZGIyNDM5NUAwIiwgIjAuZmQzYTMxN2VmZmMyODliZkAwIiwgIjAuMWQ4MDMwMWZiM2QxYTBkMUAwIn07Citjb25zdCBjaGFyICpmNjVbRU5UU10gPSB7IjAuZmZiYmI4ODZjMjM2YTRmOEAwIiwgIjAuZDhhMDhiODBlYjg0ZjcwOEAwIiwgIjAuMThmZmQ0MGQxMDQ1YjU3YUAwIiwgIjAuMjIzMzFjNmExOGU5ZTM0MDhAMCIsICIwLjZmYWUyYjRlYWRkNTQ1YWE4QDAiLCAiMC5jYmVjY2Y1NGRmOTQ3MmRAMCIsICIwLmM4ZDZmMDRmNmVjYTY3ZDdAMCIsICIwLmNhNTY3N2QzNmVmMmYwYzY4QDAiLCAiMC5kN2UwOGIzZTJiMTM5NmM5QDAiLCAiMC42ODQ5NGNhNmQzOTc5MDM3OEAwIn07CisKK2NvbnN0IGNoYXIgKmYxMjdbRU5UU10gPSB7IjAuNWVjZDc1MjY1NTVlYjE0MGUzZmIxZTBlODU1MzM0MThAMCIsICIwLmU3OWY0NzhjYzk5MzgyZWE2YTBmOTRjMWQ4ZDcwODRhQDAiLCAiMC5hN2Q0MGU5OTQyNjNiZDgyNTlhZDE3MTU1MWM0MDRmQDAiLCAiMC43OWViNTkxODY4NmE2NWYxNGE3OTgxZDY4ZWIwM2VlNkAwIiwgIjAuYTE4MjNhYjBkM2M0MTE1NDM3MzU0NjJmNzE4NWExNTJAMCIsICIwLjE2NDYyYzc5MTI1MGVjOGU1NjNkZTMyYzg1ZDU5YzEyQDAiLCAiMC45MTNlOTgwN2E4M2YwZWExMzkxYWQ5MjE5Y2NlOWYyYUAwIiwgIjAuNTU3MGU5MTkyZDU0Y2VjNWQ0MzI2NTY4OTkzYWUyYzhAMCIsICIwLjEzMTk2YWIyM2Y4MGI1YTYzNWY3NzgzYWNmNzIxZGJhQDAiLCAiMC5lZjA5MTc3MzIzZmExN2M2NjM1YjllMjhhZmY3OGNlNEAwIn07Citjb25zdCBjaGFyICpmMTI4W0VOVFNdID0geyIwLmFmNjZiYTkzMmFhZjU4YTA3MWZkOGYwNzQyYTk5YTBjQDAiLCAiMC43M2NmYTNjNjY0YzljMTc1MzUwN2NhNjBlYzZiODQyNUAwIiwgIjAuNTNlYTA3NGNhMTMxZGVjMTJjZDY4YjhhYThlMjAyNzhAMCIsICIwLjNjZjVhYzhjMzQzNTMyZjhhNTNjYzBlYjQ3NTgxZjczQDAiLCAiMC41MGMxMWQ1ODY5ZTIwOGFhMWI5YWEzMTdiOGMyZDBhOUAwIiwgIjAuOGIyMzE2M2M4OTI4NzY0NzJiMWVmMTk2NDJlYWNlMDlAMCIsICIwLjQ4OWY0YzAzZDQxZjg3NTA5YzhkNmM5MGNlNjc0Zjk1QDAiLCAiMC5hYWI4NzQ4Yzk2YWE2NzYyZWExOTMyYjQ0YzlkNzE2NEAwIiwgIjAuOThjYjU1OTFmYzA1YWQzMWFmYmJjMWQ2N2I5MGVkZEAtMSIsICIwLmY3ODQ4YmI5OTFmZDBiZTMzMWFkY2YxNDU3ZmJjNjcyQDAifTsKKworCitzdHJ1Y3QgcnQKK3sKKyAgY29uc3QgY2hhciAqKnM7CisgIGludCBuYml0czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnQgemFycltdID0KK3sKKyAge3oxLCAxfSwKKyAge3oyLCAyfSwKKyAge3ozLCAzfSwKKyAge3o0LCA0fSwKKyAge3o1LCA1fSwKKyAge3oxMCwgMTB9LAorICB7ejE1LCAxNX0sCisgIHt6MTYsIDE2fSwKKyAge3oxNywgMTd9LAorICB7ejMxLCAzMX0sCisgIHt6MzIsIDMyfSwKKyAge3ozMywgMzN9LAorICB7ejYzLCA2M30sCisgIHt6NjQsIDY0fSwKKyAge3o2NSwgNjV9LAorICB7ejEyNywgMTI3fSwKKyAge3oxMjgsIDEyOH0sCisgIHtOVUxMLCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBydCBmYXJyW10gPQoreworICB7ZjEsIDF9LAorICB7ZjIsIDJ9LAorICB7ZjMsIDN9LAorICB7ZjQsIDR9LAorICB7ZjUsIDV9LAorICB7ZjEwLCAxMH0sCisgIHtmMTUsIDE1fSwKKyAge2YxNiwgMTZ9LAorICB7ZjE3LCAxN30sCisgIHtmMzEsIDMxfSwKKyAge2YzMiwgMzJ9LAorICB7ZjMzLCAzM30sCisgIHtmNjMsIDYzfSwKKyAge2Y2NCwgNjR9LAorICB7ZjY1LCA2NX0sCisgIHtmMTI3LCAxMjd9LAorICB7ZjEyOCwgMTI4fSwKKyAge05VTEwsIDB9Cit9OworCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgc3RhdGljIGNoYXIgdXNhZ2VbXSA9ICJcCit1c2FnZTogdC1yYW5kIFtmdW5jdGlvbiBuYml0c11cblwKKyAgZnVuY3Rpb24gaXMgb25lIG9mIHosIGZcblwKKyAgbmJpdHMgaXMgbnVtYmVyIG9mIGJpdHNcblwKKyI7CisgIGdtcF9yYW5kc3RhdGVfdCByc3RhdGU7CisgIG1wel90IHosIHJ6OworICBtcGZfdCBmLCByZjsKKyAgZW51bSB7IFosIEYgfSBmdW5jID0gWjsKKyAgaW50IG5iaXRzID0gMTsKKyAgaW50IHZlcmlmeV9tb2RlX2ZsYWcgPSAxOworICBpbnQgaTsKKyAgc3RydWN0IHJ0ICphOworCisKKyAgaWYgKGFyZ2MgPiAxKQorICAgIHsKKyAgICAgIGlmIChhcmdjIDwgMykKKwl7CisJICBmcHV0cyAodXNhZ2UsIHN0ZGVycik7CisJICBleGl0ICgxKTsKKwl9CisgICAgICB2ZXJpZnlfbW9kZV9mbGFnID0gMDsKKyAgICAgIGlmICgqYXJndlsxXSA9PSAneicpCisJZnVuYyA9IFo7CisgICAgICBpZiAoKmFyZ3ZbMV0gPT0gJ2YnKQorCWZ1bmMgPSBGOworICAgICAgbmJpdHMgPSBhdG9pIChhcmd2WzJdKTsKKyAgICB9CisKKyAgbXB6X2luaXQgKHJ6KTsKKworICBpZiAodmVyaWZ5X21vZGVfZmxhZykKKyAgICB7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmICgiJXM6IHZlcmlmeWluZyByYW5kb20gbnVtYmVyczogIiwgYXJndlswXSk7CisjZW5kaWYKKworICAgICAgLyogVGVzdCB6LiAgKi8KKyAgICAgIG1wel9pbml0ICh6KTsKKyAgICAgIGZvciAoYSA9IHphcnI7IGEtPnMgIT0gTlVMTDsgYSsrKQorCXsKKwkgIGdtcF9yYW5kaW5pdCAocnN0YXRlLCBHTVBfUkFORF9BTEdfTEMsIGEtPm5iaXRzKTsKKwkgIGlmIChnbXBfZXJybm8gIT0gR01QX0VSUk9SX05PTkUpCisJICAgIGV4aXQgKDEpOworCSAgZ21wX3JhbmRzZWVkX3VpIChyc3RhdGUsIFNFRUQpOworCisJICBmb3IgKGkgPSAwOyBpIDwgRU5UUzsgaSsrKQorCSAgICB7CisJICAgICAgbXB6X3VyYW5kb21iIChyeiwgcnN0YXRlLCBhLT5uYml0cyk7CisJICAgICAgbXB6X3NldF9zdHIgKHosIGEtPnNbaV0sIEJBU0UpOworCSAgICAgIGlmIChtcHpfY21wICh6LCByeikgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoInolZDogIiwgYS0+bmJpdHMpOworCQkgIG1wel9vdXRfc3RyIChzdGRvdXQsIEJBU0UsIHJ6KTsKKwkJICBwcmludGYgKCIgc2hvdWxkIGJlICIpOworCQkgIG1wel9vdXRfc3RyIChzdGRvdXQsIEJBU0UsIHopOworCQkgIHB1dHMgKCIiKTsKKwkJICBleGl0ICgxKTsKKwkJfQorCSAgICB9CisjaWZkZWYgVkVSQk9TRQorCSAgcHJpbnRmICgieiVkICIsIGEtPm5iaXRzKTsKKyNlbmRpZgorCSAgZ21wX3JhbmRjbGVhciAocnN0YXRlKTsKKwl9CisgICAgICBtcHpfY2xlYXIgKHopOworCisKKyAgICAgIC8qIFRlc3QgZi4gICovCisgICAgICBmb3IgKGEgPSBmYXJyOyBhLT5zICE9IE5VTEw7IGErKykKKwl7CisJICBnbXBfcmFuZGluaXQgKHJzdGF0ZSwgR01QX1JBTkRfQUxHX0xDLCBhLT5uYml0cyk7CisJICBpZiAoZ21wX2Vycm5vICE9IEdNUF9FUlJPUl9OT05FKQorCSAgICBleGl0ICgxKTsKKwkgIGdtcF9yYW5kc2VlZF91aSAocnN0YXRlLCBTRUVEKTsKKworCSAgbXBmX2luaXQyIChmLCBhLT5uYml0cyk7CisJICBtcGZfaW5pdDIgKHJmLCBhLT5uYml0cyk7CisJICBmb3IgKGkgPSAwOyBpIDwgRU5UUzsgaSsrKQorCSAgICB7CisJICAgICAgbXBmX3VyYW5kb21iIChyZiwgcnN0YXRlLCBhLT5uYml0cyk7CisJICAgICAgbXBmX3NldF9zdHIgKGYsIGEtPnNbaV0sIEJBU0UpOworCSAgICAgIGlmIChtcGZfY21wIChmLCByZikgIT0gMCkKKwkJeworCQkgIHByaW50ZiAoImYlZDogIiwgYS0+bmJpdHMpOworCQkgIG1wZl9vdXRfc3RyIChzdGRvdXQsIEJBU0UsIGEtPm5iaXRzLCByZik7CisJCSAgcHJpbnRmICgiIHNob3VsZCBiZSAiKTsKKwkJICBtcGZfb3V0X3N0ciAoc3Rkb3V0LCBCQVNFLCBhLT5uYml0cywgZik7CisJCSAgcHV0cyAoIiIpOworCQkgIGV4aXQgKDEpOworCQl9CisJICAgIH0KKyNpZmRlZiBWRVJCT1NFCisJICBwcmludGYgKCJmJWQgIiwgYS0+bmJpdHMpOworI2VuZGlmCisJICBnbXBfcmFuZGNsZWFyIChyc3RhdGUpOworCSAgbXBmX2NsZWFyIChmKTsKKwkgIG1wZl9jbGVhciAocmYpOworCX0KKworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHB1dHMgKCIiKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQkJCQkvKiBQcmludCBtb2RlLiAgKi8KKyAgICB7CisgICAgICBnbXBfcmFuZGluaXQgKHJzdGF0ZSwgR01QX1JBTkRfQUxHX0xDLCBuYml0cyk7CisgICAgICBpZiAoZ21wX2Vycm5vICE9IEdNUF9FUlJPUl9OT05FKQorCWV4aXQgKDEpOworICAgICAgZ21wX3JhbmRzZWVkX3VpIChyc3RhdGUsIFNFRUQpOworCisgICAgICBzd2l0Y2ggKGZ1bmMpCisJeworCWNhc2UgWjoKKwkgIHByaW50ZiAoImNoYXIgKnolZFtFTlRTXSA9IHsiLCBuYml0cyk7CisJICBmb3IgKGkgPSAwOyBpIDwgRU5UUzsgaSsrKQorCSAgICB7CisJICAgICAgbXB6X3VyYW5kb21iIChyeiwgcnN0YXRlLCBuYml0cyk7CisJICAgICAgcHJpbnRmICgiXCIiKTsKKwkgICAgICBtcHpfb3V0X3N0ciAoc3Rkb3V0LCBCQVNFLCByeik7CisJICAgICAgcHJpbnRmICgiXCIiKTsKKwkgICAgICBpZiAoaSAhPSBFTlRTIC0gMSkKKwkJcHJpbnRmICgiLCAiKTsKKwkgICAgfQorCSAgcHJpbnRmICgifTtcbiIpOworCSAgcHJpbnRmICgiICB7eiVkLCAlZH0sXG4iLCBuYml0cywgbmJpdHMpOworCSAgYnJlYWs7CisKKwljYXNlIEY6CisJICBwcmludGYgKCJjaGFyICpmJWRbRU5UU10gPSB7IiwgbmJpdHMpOworCSAgbXBmX2luaXQyIChyZiwgbmJpdHMpOworCSAgZm9yIChpID0gMDsgaSA8IEVOVFM7IGkrKykKKwkgICAgeworCSAgICAgIG1wZl91cmFuZG9tYiAocmYsIHJzdGF0ZSwgbmJpdHMpOworCSAgICAgIHByaW50ZiAoIlwiIik7CisJICAgICAgbXBmX291dF9zdHIgKHN0ZG91dCwgQkFTRSwgbmJpdHMsIHJmKTsKKwkgICAgICBwcmludGYgKCJcIiIpOworCSAgICAgIGlmIChpICE9IEVOVFMgLSAxKQorCQlwcmludGYgKCIsICIpOworCSAgICB9CisJICBwcmludGYgKCJ9O1xuIik7CisJICBwcmludGYgKCIgIHtmJWQsICVkfSxcbiIsIG5iaXRzLCBuYml0cyk7CisJICBtcGZfY2xlYXIgKHJmKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGV4aXQgKDEpOworCX0KKworICAgICAgZ21wX3JhbmRjbGVhciAocnN0YXRlKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChyeik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yYW5kL3QtdXJidWkuYyBiL3Rlc3RzL3JhbmQvdC11cmJ1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmY1MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yYW5kL3QtdXJidWkuYwpAQCAtMCwwICsxLDY0IEBACisvKiBUZXN0IGdtcF91cmFuZG9tYl91aS4KKworQ29weXJpZ2h0IDIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworLyogRXhwZWN0IG51bWJlcnMgZ2VuZXJhdGVkIGJ5IHJzdGF0ZSB0byBvYmV5IHRoZSBudW1iZXIgb2YgYml0cyByZXF1ZXN0ZWQuCisgICBObyBwb2ludCB0ZXN0aW5nIGJpdHM9PUJJVFNfUEVSX1VMT05HLCBzaW5jZSBhbnkgcmV0dXJuIGlzIGFjY2VwdGFibGUgaW4KKyAgIHRoYXQgY2FzZS4gICovCit2b2lkCitjaGVja19vbmUgKGNvbnN0IGNoYXIgKm5hbWUsIGdtcF9yYW5kc3RhdGVfcHRyIHJzdGF0ZSkKK3sKKyAgdW5zaWduZWQgbG9uZyAgYml0cywgbGltaXQsIGdvdDsKKyAgaW50ICAgIGk7CisKKyAgZm9yIChiaXRzID0gMDsgYml0cyA8IEJJVFNfUEVSX1VMT05HOyBiaXRzKyspCisgICAgeworICAgICAgLyogd2lsbCBkZW1hbmQgZ290IDwgbGltaXQgKi8KKyAgICAgIGxpbWl0ID0gKDFVTCA8PCBiaXRzKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGdvdCA9IGdtcF91cmFuZG9tYl91aSAocnN0YXRlLCBiaXRzKTsKKyAgICAgICAgICBpZiAoZ290ID49IGxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGYgKCJSZXR1cm4gdmFsdWUgb3V0IG9mIHJhbmdlOlxuIik7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgYWxnb3JpdGhtOiAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgYml0czogICVsdVxuIiwgYml0cyk7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgbGltaXQ6ICUjbHhcbiIsIGxpbWl0KTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICBnb3Q6ICAgJSNseFxuIiwgZ290KTsKKyAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2FsbF9yYW5kX2FsZ3MgKGNoZWNrX29uZSk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JhbmQvdC11cm11aS5jIGIvdGVzdHMvcmFuZC90LXVybXVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4ZmVkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JhbmQvdC11cm11aS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFRlc3QgZ21wX3VyYW5kb21tX3VpLgorCitDb3B5cmlnaHQgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisvKiBFeHBlY3QgbnVtYmVycyBnZW5lcmF0ZWQgYnkgcnN0YXRlIHRvIG9iZXkgdGhlIGxpbWl0IHJlcXVlc3RlZC4gKi8KK3ZvaWQKK2NoZWNrX29uZSAoY29uc3QgY2hhciAqbmFtZSwgZ21wX3JhbmRzdGF0ZV9wdHIgcnN0YXRlKQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyAgbl90YWJsZVtdID0geworICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsCisgICAgMTIzLCA0NTYsIDc4OSwKKworICAgIDI1NSwgMjU2LCAyNTcsCisgICAgMTAyMywgMTAyNCwgMTAyNSwKKyAgICAzMjc2NywgMzI3NjgsIDMyNzY5LAorCisgICAgVUxPTkdfTUFYLzItMiwgVUxPTkdfTUFYLzItMSwgVUxPTkdfTUFYLzIsIFVMT05HX01BWC8yKzEsIFVMT05HX01BWC8yKzIsCisKKyAgICBVTE9OR19NQVgtMiwgVUxPTkdfTUFYLTEsIFVMT05HX01BWCwKKyAgfTsKKworICB1bnNpZ25lZCBsb25nICBnb3QsIG47CisgIGludCAgICBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJvZiAobl90YWJsZSk7IGkrKykKKyAgICB7CisgICAgICBuID0gbl90YWJsZVtpXTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IDU7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGdvdCA9IGdtcF91cmFuZG9tbV91aSAocnN0YXRlLCBuKTsKKyAgICAgICAgICBpZiAoZ290ID49IG4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZiAoIlJldHVybiB2YWx1ZSBvdXQgb2YgcmFuZ2U6XG4iKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICBhbGdvcml0aG06ICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgcHJpbnRmICgiICBuOiAgICAgJSNseFxuIiwgbik7CisgICAgICAgICAgICAgIHByaW50ZiAoIiAgZ290OiAgICUjbHhcbiIsIGdvdCk7CisgICAgICAgICAgICAgIGFib3J0ICgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgY2FsbF9yYW5kX2FsZ3MgKGNoZWNrX29uZSk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JhbmQvdC11cm5kbW0uYyBiL3Rlc3RzL3JhbmQvdC11cm5kbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcwMGRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC90LXVybmRtbS5jCkBAIC0wLDAgKzEsMTU4IEBACisvKiBUZXN0IG1wel91cmFuZG9tbS4KKworQ29weXJpZ2h0IDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgKDEpCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgKDApCisjZW5kaWYKKworaW50CitjaGVja19wYXJhbXMgKHZvaWQpCit7CisgIGdtcF9yYW5kc3RhdGVfdCByMSwgcjI7CisgIG1wel90IGEsIGIsIG07CisgIGludCBpOworICBpbnQgcmVzdWx0OworCisgIHJlc3VsdCA9IFRSVUU7CisKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIG1wel9pbml0IChtKTsKKworICBpZiAocmVzdWx0KQorICAgIHsKKyAgICAgIC8qIFRlc3QgdGhlIGNvbnNpc3RlbmN5IGJldHdlZW4gdXJhbmRvbW0gYW5kIHVyYW5kb21iLiAqLworICAgICAgZ21wX3JhbmRpbml0X2RlZmF1bHQgKHIxKTsKKyAgICAgIGdtcF9yYW5kaW5pdF9kZWZhdWx0IChyMik7CisgICAgICBnbXBfcmFuZHNlZWRfdWkgKHIxLCA4NUwpOworICAgICAgZ21wX3JhbmRzZWVkX3VpIChyMiwgODVMKTsKKyAgICAgIG1wel9zZXRfdWkgKG0sIDBMKTsKKyAgICAgIG1wel9zZXRiaXQgKG0sIDgwTCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJeworCSAgbXB6X3VyYW5kb21tIChhLCByMSwgbSk7CisJICBtcHpfdXJhbmRvbWIgKGIsIHIyLCA4MEwpOworCSAgaWYgKG1wel9jbXAgKGEsIGIpICE9IDApCisJICAgIHsKKwkgICAgICByZXN1bHQgPSBGQUxTRTsKKwkgICAgICBwcmludGYgKCJtcHpfdXJhbmRvbW0gIT0gbXB6X3VyYW5kb21iXG4iKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGdtcF9yYW5kY2xlYXIgKHIxKTsKKyAgICAgIGdtcF9yYW5kY2xlYXIgKHIyKTsKKyAgICB9CisKKyAgaWYgKHJlc3VsdCkKKyAgICB7CisgICAgICAvKiBUZXN0IHRoYXQgbXB6X3VyYW5kb21tIHJldHVybnMgdGhlIGNvcnJlY3QgcmVzdWx0IHdpdGggYQorCSBicm9rZW4gTEMuICAqLworICAgICAgbXB6X3NldF91aSAoYSwgMEwpOworICAgICAgZ21wX3JhbmRpbml0X2xjXzJleHAgKHIxLCBhLCAweGZmTCwgOEwpOworICAgICAgbXB6X3NldF91aSAobSwgNUwpOworICAgICAgLyogV2FybmluZzogVGhpcyBjb2RlIGhhbmdzIGluIGdtcCA0LjEgYW5kIGJlbG93ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJeworCSAgbXB6X3VyYW5kb21tIChhLCByMSwgbSk7CisJICBpZiAobXB6X2NtcF91aSAoYSwgMkwpICE9IDApCisJICAgIHsKKwkgICAgICByZXN1bHQgPSBGQUxTRTsKKwkgICAgICBnbXBfcHJpbnRmICgibXB6X3VyYW5kb21tIHJldHVybnMgJVpkIGluc3RlYWQgb2YgMlxuIiwgYSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBnbXBfcmFuZGNsZWFyIChyMSk7CisgICAgfQorCisgIGlmIChyZXN1bHQpCisgICAgeworICAgICAgLyogVGVzdCB0aGF0IHRoZSByZXN1bHRzIGFyZSBhbHdheXMgaW4gcmFuZ2UgZm9yIGVpdGhlcgorICAgICAgICAgcG9zaXRpdmUgb3IgbmVnYXRpdmUgdmFsdWVzIG9mIG0uICAqLworICAgICAgZ21wX3JhbmRpbml0X2RlZmF1bHQgKHIxKTsKKyAgICAgIG1wel9zZXRfdWkgKG0sIDVMKTsKKyAgICAgIG1wel9zZXRfc2kgKGIsIC01TCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJeworCSAgbXB6X3VyYW5kb21tIChhLCByMSwgbSk7CisJICBpZiAobXB6X2NtcF91aSAoYSwgNUwpID49IDAgfHwgbXB6X3NnbiAoYSkgPCAwKQorCSAgICB7CisJICAgICAgcmVzdWx0ID0gRkFMU0U7CisJICAgICAgZ21wX3ByaW50ZiAoIk91dC1vZi1yYW5nZSBvciBub24tcG9zaXRpdmUgdmFsdWU6ICVaZFxuIiwgYSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIG1wel91cmFuZG9tbSAoYSwgcjEsIGIpOworCSAgaWYgKG1wel9jbXBfdWkgKGEsIDVMKSA+PSAwIHx8IG1wel9zZ24gKGEpIDwgMCkKKwkgICAgeworCSAgICAgIHJlc3VsdCA9IEZBTFNFOworCSAgICAgIGdtcF9wcmludGYgKCJPdXQtb2YtcmFuZ2Ugb3Igbm9uLXBvc2l0aXZlIHZhbHVlIChmcm9tIG5lZ2F0aXZlIG1vZHVsdXMpOiAlWmRcbiIsIGEpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgZ21wX3JhbmRjbGVhciAocjEpOworICAgIH0KKworICBpZiAocmVzdWx0KQorICAgIHsKKyAgICAgIC8qIFRlc3QgdGhhdCBtPTEgZm9yY2VzIGFsd2F5cyByZXN1bHQ9MC4gICovCisgICAgICBnbXBfcmFuZGluaXRfZGVmYXVsdCAocjEpOworICAgICAgbXB6X3NldF91aSAobSwgMUwpOworICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorCXsKKwkgIG1wel91cmFuZG9tbSAoYSwgcjEsIG0pOworCSAgaWYgKG1wel9zZ24gKGEpICE9IDApCisJICAgIHsKKwkgICAgICByZXN1bHQgPSBGQUxTRTsKKwkgICAgICBnbXBfcHJpbnRmICgibXB6X3VyYW5kb21tIGZhaWxzIHdpdGggbT0xIChyZXN1bHQ9JVpkKVxuIiwgYSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBnbXBfcmFuZGNsZWFyIChyMSk7CisgICAgfQorCisgIG1wel9jbGVhciAoYSk7CisgIG1wel9jbGVhciAoYik7CisgIG1wel9jbGVhciAobSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJlc3VsdCA9IFRSVUU7CisKKyAgdGVzdHNfc3RhcnQgKCk7CisKKyAgaWYgKHJlc3VsdCkKKyAgICBpZiAoIWNoZWNrX3BhcmFtcyAoKSkKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworCisgIHRlc3RzX2VuZCAoKTsKKworICBpZiAocmVzdWx0KQorICAgIHJldHVybiAwOyAvKiBwYXNzICovCisgIGVsc2UKKyAgICByZXR1cm4gMTsgLyogZmFpbCAqLworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmFuZC96ZGl2X3JvdW5kLmMgYi90ZXN0cy9yYW5kL3pkaXZfcm91bmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDJlNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmFuZC96ZGl2X3JvdW5kLmMKQEAgLTAsMCArMSw0MyBAQAorLyogemRpdl9yb3VuZCgpIC0tIGRpdmlkZSBpbnRlZ2Vycywgcm91bmQgdG8gbmVhcmVzdCAqLworCisvKgorQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKwordm9pZAoremRpdl9yb3VuZCAobXB6X3Qgcm9wLCBtcHpfdCBuLCBtcHpfdCBkKQoreworICBtcGZfdCBmX24sIGZfZDsKKworICBtcGZfaW5pdCAoZl9uKTsKKyAgbXBmX2luaXQgKGZfZCk7CisKKyAgbXBmX3NldF96IChmX2QsIGQpOworICBtcGZfc2V0X3ogKGZfbiwgbik7CisKKyAgbXBmX2RpdiAoZl9uLCBmX24sIGZfZCk7CisgIG1wZl9zZXRfZCAoZl9kLCAuNSk7CisgIGlmIChtcGZfc2duIChmX24pIDwgMCkKKyAgICBtcGZfbmVnIChmX2QsIGZfZCk7CisgIG1wZl9hZGQgKGZfbiwgZl9uLCBmX2QpOworICBtcHpfc2V0X2YgKHJvcCwgZl9uKTsKKworICBtcGZfY2xlYXIgKGZfbik7CisgIG1wZl9jbGVhciAoZl9kKTsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmbXBmLmMgYi90ZXN0cy9yZWZtcGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk1NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmbXBmLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIFJlZmVyZW5jZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcy4KKworQ29weXJpZ2h0IDE5OTYsIDIwMDEsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK3JlZm1wZl9hZGQgKG1wZl9wdHIgdywgbXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYpCit7CisgIG1wX3NpemVfdCBoaSwgbG8sIHNpemU7CisgIG1wX3B0ciB1dCwgdnQsIHd0OworICBpbnQgbmVnOworICBtcF9leHBfdCBleHA7CisgIG1wX2xpbWJfdCBjeTsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisKKyAgaWYgKFNJWiAodSkgPT0gMCkKKyAgICB7CisgICAgICBzaXplID0gQUJTSVogKHYpOworICAgICAgd3QgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAxKTsKKyAgICAgIE1QTl9DT1BZICh3dCwgUFRSICh2KSwgc2l6ZSk7CisgICAgICBleHAgPSBFWFAgKHYpOworICAgICAgbmVnID0gU0laICh2KSA8IDA7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICBpZiAoU0laICh2KSA9PSAwKQorICAgIHsKKyAgICAgIHNpemUgPSBBQlNJWiAodSk7CisgICAgICB3dCA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSArIDEpOworICAgICAgTVBOX0NPUFkgKHd0LCBQVFIgKHUpLCBzaXplKTsKKyAgICAgIGV4cCA9IEVYUCAodSk7CisgICAgICBuZWcgPSBTSVogKHUpIDwgMDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIGlmICgoU0laICh1KSBeIFNJWiAodikpIDwgMCkKKyAgICB7CisgICAgICBtcGZfdCB0bXA7CisgICAgICBTSVogKHRtcCkgPSAtU0laICh2KTsKKyAgICAgIEVYUCAodG1wKSA9IEVYUCAodik7CisgICAgICBQVFIgKHRtcCkgPSBQVFIgKHYpOworICAgICAgcmVmbXBmX3N1YiAodywgdSwgdG1wKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIG5lZyA9IFNJWiAodSkgPCAwOworCisgIC8qIENvbXB1dGUgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgaGkgYW5kIGxvIGVuZCBvZiB0aGUgcmVzdWx0LiAgKi8KKyAgaGkgPSBNQVggKEVYUCAodSksIEVYUCAodikpOworICBsbyA9IE1JTiAoRVhQICh1KSAtIEFCU0laICh1KSwgRVhQICh2KSAtIEFCU0laICh2KSk7CisgIHNpemUgPSBoaSAtIGxvOworICB1dCA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSArIDEpOworICB2dCA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSArIDEpOworICB3dCA9IFRNUF9BTExPQ19MSU1CUyAoc2l6ZSArIDEpOworICBNUE5fWkVSTyAodXQsIHNpemUpOworICBNUE5fWkVSTyAodnQsIHNpemUpOworICB7aW50IG9mZjsKKyAgb2ZmID0gc2l6ZSArIChFWFAgKHUpIC0gaGkpIC0gQUJTSVogKHUpOworICBNUE5fQ09QWSAodXQgKyBvZmYsIFBUUiAodSksIEFCU0laICh1KSk7CisgIG9mZiA9IHNpemUgKyAoRVhQICh2KSAtIGhpKSAtIEFCU0laICh2KTsKKyAgTVBOX0NPUFkgKHZ0ICsgb2ZmLCBQVFIgKHYpLCBBQlNJWiAodikpOworICB9CisKKyAgY3kgPSBtcG5fYWRkX24gKHd0LCB1dCwgdnQsIHNpemUpOworICB3dFtzaXplXSA9IGN5OworICBzaXplICs9IGN5OworICBleHAgPSBoaSArIGN5OworCitkb25lOgorICBpZiAoc2l6ZSA+IFBSRUMgKHcpKQorICAgIHsKKyAgICAgIHd0ICs9IHNpemUgLSBQUkVDICh3KTsKKyAgICAgIHNpemUgPSBQUkVDICh3KTsKKyAgICB9CisgIE1QTl9DT1BZIChQVFIgKHcpLCB3dCwgc2l6ZSk7CisgIFNJWiAodykgPSBuZWcgPT0gMCA/IHNpemUgOiAtc2l6ZTsKKyAgRVhQICh3KSA9IGV4cDsKKyAgVE1QX0ZSRUU7Cit9CisKKworLyogQWRkIDEgInVuaXQgaW4gbGFzdCBwbGFjZSIgKGllLiBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYikgdG8gZi4KKyAgIGYgY2Fubm90IGJlIHplcm8sIHNpbmNlIHRoYXQgaGFzIG5vIHdlbGwtZGVmaW5lZCAibGFzdCBwbGFjZSIuCisKKyAgIFRoaXMgcm91dGluZSBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIGNhc2VzIHdoZXJlIHdlIHBheSBjbG9zZSBhdHRlbnRpb24gdG8KKyAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIHZhbHVlIGFuZCBhcmUgdXNpbmcgdGhhdCAoYW5kIHRoZSBleHBvbmVudCkgdG8KKyAgIGluZGljYXRlIHRoZSBhY2N1cmF0ZSBwYXJ0IG9mIGEgcmVzdWx0LCBvciBzaW1pbGFyLiAgRm9yIHRoaXMgcmVhc29uLCBpZgorICAgdGhlcmUncyBhIGNhcnJ5IG91dCB3ZSBkb24ndCBzdG9yZSAxIGFuZCBhZGp1c3QgdGhlIGV4cG9uZW50LCB3ZSBqdXN0CisgICBsZWF2ZSAxMDAuLjAwLiAgV2UgZG9uJ3QgZXZlbiBhZGp1c3QgaWYgdGhlcmUncyBhIGNhcnJ5IG91dCBvZiBwcmVjKzEKKyAgIGxpbWJzLCBidXQgaW5zdGVhZCBnaXZlIHVwIGluIHRoYXQgY2FzZSAod2hpY2ggd2UgaW50ZW5kIHNob3VsZG4ndCBhcmlzZQorICAgaW4gbm9ybWFsIGNpcmN1bXN0YW5jZXMpLiAgKi8KKwordm9pZAorcmVmbXBmX2FkZF91bHAgKG1wZl9wdHIgZikKK3sKKyAgbXBfcHRyICAgICBmcCA9IFBUUihmKTsKKyAgbXBfc2l6ZV90ICBmc2l6ZSA9IFNJWihmKTsKKyAgbXBfc2l6ZV90ICBhYnNfZnNpemUgPSBBQlNJWihmKTsKKyAgbXBfbGltYl90ICBjOworCisgIGlmIChmc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk9vcHMsIHJlZm1wZl9hZGRfdWxwIGNhbGxlZCB3aXRoIGY9PTBcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIGMgPSByZWZtcG5fYWRkXzEgKGZwLCBmcCwgYWJzX2ZzaXplLCBDTlNUX0xJTUIoMSkpOworICBpZiAoYyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChhYnNfZnNpemUgPj0gUFJFQyhmKSArIDEpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJPb3BzLCByZWZtcGZfYWRkX3VscCBjYXJyaWVkIG91dCBvZiBwcmVjKzEgbGltYnNcbiIpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisKKyAgICAgIGZwW2Fic19mc2l6ZV0gPSBjOworICAgICAgYWJzX2ZzaXplKys7CisgICAgICBTSVooZikgPSAoZnNpemUgPiAwID8gYWJzX2ZzaXplIDogLSBhYnNfZnNpemUpOworICAgICAgRVhQKGYpKys7CisgICAgfQorfQorCisvKiBGaWxsIGYgd2l0aCBzaXplIGxpbWJzIG9mIHRoZSBnaXZlbiB2YWx1ZSwgc2V0dXAgYXMgYW4gaW50ZWdlci4gKi8KK3ZvaWQKK3JlZm1wZl9maWxsIChtcGZfcHRyIGYsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgdmFsdWUpCit7CisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgc2l6ZSA9IE1JTiAoUFJFQyhmKSArIDEsIHNpemUpOworICBTSVooZikgPSBzaXplOworICBFWFAoZikgPSBzaXplOworICByZWZtcG5fZmlsbCAoUFRSKGYpLCBzaXplLCB2YWx1ZSk7Cit9CisKKy8qIFN0cmlwIGhpZ2ggemVybyBsaW1icyBmcm9tIHRoZSBmIGRhdGEsIGFkanVzdGluZyBleHBvbmVudCBhY2NvcmRpbmdseS4gKi8KK3ZvaWQKK3JlZm1wZl9ub3JtYWxpemUgKG1wZl9wdHIgZikKK3sKKyAgd2hpbGUgKFNJWihmKSAhPSAwICYmIFBUUihmKVtBQlNJWihmKS0xXSA9PSAwKQorICAgIHsKKyAgICAgIFNJWihmKSA9IChTSVooZikgPj0gMCA/IFNJWihmKS0xIDogU0laKGYpKzEpOworICAgICAgRVhQKGYpIC0tOworICAgIH0KKyAgaWYgKFNJWihmKSA9PSAwKQorICAgIEVYUChmKSA9IDA7Cit9CisKKy8qIHJlZm1wZl9zZXRfb3ZlcmxhcCBzZXRzIHVwIGRzdCBhcyBhIGNvcHkgb2Ygc3JjLCBidXQgd2l0aCBQUkVDKGRzdCkKKyAgIHVuY2hhbmdlZCwgaW4gcHJlcGFyYXRpb24gZm9yIGFuIG92ZXJsYXAgdGVzdC4KKworICAgVGhlIGZ1bGwgdmFsdWUgb2Ygc3JjIGlzIGNvcGllZCwgYW5kIHRoZSBzcGFjZSBhdCBQVFIoZHN0KSBpcyBleHRlbmRlZCBhcworICAgbmVjZXNzYXJ5LiAgVGhlIHdheSBQUkVDKGRzdCkgaXMgdW5jaGFuZ2VkIGlzIGFzIHBlciBhbiBtcGZfc2V0X3ByZWNfcmF3LgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbmV3IFBUUihkc3QpIHNwYWNlIHByZWNpc2lvbiwgaW4gYml0cywgcmVhZHkgZm9yCisgICBhIHJlc3RvcmluZyBtcGZfc2V0X3ByZWNfcmF3IGJlZm9yZSBtcGZfY2xlYXIuICAqLworCit1bnNpZ25lZCBsb25nCityZWZtcGZfc2V0X292ZXJsYXAgKG1wZl9wdHIgZHN0LCBtcGZfc3JjcHRyIHNyYykKK3sKKyAgbXBfc2l6ZV90ICBkcHJlYyA9IFBSRUMoZHN0KTsKKyAgbXBfc2l6ZV90ICBzc2l6ZSA9IEFCU0laKHNyYyk7CisgIHVuc2lnbmVkIGxvbmcgIHJldDsKKworICByZWZtcGZfc2V0X3ByZWNfbGltYnMgKGRzdCwgKHVuc2lnbmVkIGxvbmcpIE1BWCAoZHByZWMsIHNzaXplKSk7CisgIG1wZl9zZXQgKGRzdCwgc3JjKTsKKworICByZXQgPSBtcGZfZ2V0X3ByZWMgKGRzdCk7CisgIFBSRUMoZHN0KSA9IGRwcmVjOworICByZXR1cm4gcmV0OworfQorCisvKiBMaWtlIG1wZl9zZXRfcHJlYywgYnV0IHRha2luZyBhIHByZWNpc2lvbiBpbiBsaW1icy4KKyAgIFBSRUMoZikgZW5kcyB1cCBhcyB0aGUgZ2l2ZW4gInByZWMiIHZhbHVlLiAgKi8KK3ZvaWQKK3JlZm1wZl9zZXRfcHJlY19saW1icyAobXBmX3B0ciBmLCB1bnNpZ25lZCBsb25nIHByZWMpCit7CisgIG1wZl9zZXRfcHJlYyAoZiwgX19HTVBGX1BSRUNfVE9fQklUUyAocHJlYykpOworfQorCisKK3ZvaWQKK3JlZm1wZl9zdWIgKG1wZl9wdHIgdywgbXBmX3NyY3B0ciB1LCBtcGZfc3JjcHRyIHYpCit7CisgIG1wX3NpemVfdCBoaSwgbG8sIHNpemU7CisgIG1wX3B0ciB1dCwgdnQsIHd0OworICBpbnQgbmVnOworICBtcF9leHBfdCBleHA7CisgIFRNUF9ERUNMOworCisgIFRNUF9NQVJLOworCisgIGlmIChTSVogKHUpID09IDApCisgICAgeworICAgICAgc2l6ZSA9IEFCU0laICh2KTsKKyAgICAgIHd0ID0gVE1QX0FMTE9DX0xJTUJTIChzaXplICsgMSk7CisgICAgICBNUE5fQ09QWSAod3QsIFBUUiAodiksIHNpemUpOworICAgICAgZXhwID0gRVhQICh2KTsKKyAgICAgIG5lZyA9IFNJWiAodikgPiAwOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgaWYgKFNJWiAodikgPT0gMCkKKyAgICB7CisgICAgICBzaXplID0gQUJTSVogKHUpOworICAgICAgd3QgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAxKTsKKyAgICAgIE1QTl9DT1BZICh3dCwgUFRSICh1KSwgc2l6ZSk7CisgICAgICBleHAgPSBFWFAgKHUpOworICAgICAgbmVnID0gU0laICh1KSA8IDA7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICBpZiAoKFNJWiAodSkgXiBTSVogKHYpKSA8IDApCisgICAgeworICAgICAgbXBmX3QgdG1wOworICAgICAgU0laICh0bXApID0gLVNJWiAodik7CisgICAgICBFWFAgKHRtcCkgPSBFWFAgKHYpOworICAgICAgUFRSICh0bXApID0gUFRSICh2KTsKKyAgICAgIHJlZm1wZl9hZGQgKHcsIHUsIHRtcCk7CisgICAgICBpZiAoU0laICh1KSA8IDApCisJbXBmX25lZyAodywgdyk7CisgICAgICByZXR1cm47CisgICAgfQorICBuZWcgPSBTSVogKHUpIDwgMDsKKworICAvKiBDb21wdXRlIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIGhpIGFuZCBsbyBlbmQgb2YgdGhlIHJlc3VsdC4gICovCisgIGhpID0gTUFYIChFWFAgKHUpLCBFWFAgKHYpKTsKKyAgbG8gPSBNSU4gKEVYUCAodSkgLSBBQlNJWiAodSksIEVYUCAodikgLSBBQlNJWiAodikpOworICBzaXplID0gaGkgLSBsbzsKKyAgdXQgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAxKTsKKyAgdnQgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAxKTsKKyAgd3QgPSBUTVBfQUxMT0NfTElNQlMgKHNpemUgKyAxKTsKKyAgTVBOX1pFUk8gKHV0LCBzaXplKTsKKyAgTVBOX1pFUk8gKHZ0LCBzaXplKTsKKyAge2ludCBvZmY7CisgIG9mZiA9IHNpemUgKyAoRVhQICh1KSAtIGhpKSAtIEFCU0laICh1KTsKKyAgTVBOX0NPUFkgKHV0ICsgb2ZmLCBQVFIgKHUpLCBBQlNJWiAodSkpOworICBvZmYgPSBzaXplICsgKEVYUCAodikgLSBoaSkgLSBBQlNJWiAodik7CisgIE1QTl9DT1BZICh2dCArIG9mZiwgUFRSICh2KSwgQUJTSVogKHYpKTsKKyAgfQorCisgIGlmIChtcG5fY21wICh1dCwgdnQsIHNpemUpID49IDApCisgICAgbXBuX3N1Yl9uICh3dCwgdXQsIHZ0LCBzaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIG1wbl9zdWJfbiAod3QsIHZ0LCB1dCwgc2l6ZSk7CisgICAgICBuZWcgXj0gMTsKKyAgICB9CisgIGV4cCA9IGhpOworICB3aGlsZSAoc2l6ZSAhPSAwICYmIHd0W3NpemUgLSAxXSA9PSAwKQorICAgIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGV4cC0tOworICAgIH0KKworZG9uZToKKyAgaWYgKHNpemUgPiBQUkVDICh3KSkKKyAgICB7CisgICAgICB3dCArPSBzaXplIC0gUFJFQyAodyk7CisgICAgICBzaXplID0gUFJFQyAodyk7CisgICAgfQorICBNUE5fQ09QWSAoUFRSICh3KSwgd3QsIHNpemUpOworICBTSVogKHcpID0gbmVnID09IDAgPyBzaXplIDogLXNpemU7CisgIEVYUCAodykgPSBleHA7CisgIFRNUF9GUkVFOworfQorCisKKy8qIFZhbGlkYXRlIGdvdCBieSBjb21wYXJpbmcgdG8gd2FudC4gIFJldHVybiAxIGlmIGdvb2QsIDAgaWYgYmFkLgorCisgICBUaGUgZGF0YSBpbiBnb3QgaXMgY29tcGFyZWQgdG8gdGhhdCBpbiB3YW50LCB1cCB0byBlaXRoZXIgUFJFQyhnb3QpIGxpbWJzCisgICBvciB0aGUgc2l6ZSBvZiBnb3QsIHdoaWNoZXZlciBpcyBiaWdnZXIuICBDbGVhcmx5IHdlIGFsd2F5cyBkZW1hbmQKKyAgIFBSRUMoZ290KSBvZiBhY2N1cmFjeSwgYnV0IHdlIGdvIGZ1cnRoZXIgYW5kIHNheSB0aGF0IGlmIGdvdCBpcyBiaWdnZXIKKyAgIHRoZW4gYW55IGV4dHJhIG11c3QgYmUgY29ycmVjdCB0b28uCisKKyAgIHdhbnQgbmVlZHMgdG8gaGF2ZSBlbm91Z2ggZGF0YSB0byBhbGxvdyB0aGlzIGNvbXBhcmlzb24uICBUaGUgc2l6ZSBpbgorICAgd2FudCBkb2Vzbid0IGhhdmUgdG8gYmUgdGhhdCBiaWcgdGhvdWdoLCBpZiBpdCdzIHNtYWxsZXIgdGhlbiBmdXJ0aGVyIGxvdworICAgbGltYnMgYXJlIHRha2VuIHRvIGJlIHplcm8uCisKKyAgIFRoaXMgdmFsaWRhdGlvbiBhcHByb2FjaCBpcyBkZXNpZ25lZCB0byBhbGxvdyBzb21lIGZsZXhpYmlsaXR5IGluIGV4YWN0bHkKKyAgIGhvdyBtdWNoIGRhdGEgaXMgZ2VuZXJhdGVkIGJ5IGFuIG1wZiBmdW5jdGlvbiwgaWUuIGVpdGhlciBwcmVjIG9yIHByZWMrMQorICAgbGltYnMuICBXZSBkb24ndCB0cnkgdG8gbWFrZSBhIHJlZmVyZW5jZSBmdW5jdGlvbiB0aGF0IGVtdWxhdGVzIHRoYXQgc2FtZQorICAgc2l6ZSBkZWNpc2lvbiwgaW5zdGVhZCB0aGUgaWRlYSBpcyBmb3IgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRvIGdlbmVyYXRlCisgICBhdCBsZWFzdCBhcyBtdWNoIGRhdGEgYXMgdGhlIHJlYWwgZnVuY3Rpb24sIHRoZW4gY29tcGFyZS4gICovCisKK2ludAorcmVmbXBmX3ZhbGlkYXRlIChjb25zdCBjaGFyICpuYW1lLCBtcGZfc3JjcHRyIGdvdCwgbXBmX3NyY3B0ciB3YW50KQoreworICBpbnQgIGJhZCA9IDA7CisgIG1wX3NpemVfdCAgZ3NpemUsIHdzaXplLCBjbXBzaXplLCBpOworICBtcF9zcmNwdHIgIGdwLCB3cDsKKyAgbXBfbGltYl90ICBnbGltYiwgd2xpbWI7CisKKyAgTVBGX0NIRUNLX0ZPUk1BVCAoZ290KTsKKworICBpZiAoRVhQIChnb3QpICE9IEVYUCAod2FudCkpCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IHdyb25nIGV4cG9uZW50XG4iLCBuYW1lKTsKKyAgICAgIGJhZCA9IDE7CisgICAgfQorCisgIGdzaXplID0gU0laIChnb3QpOworICB3c2l6ZSA9IFNJWiAod2FudCk7CisgIGlmICgoZ3NpemUgPCAwICYmIHdzaXplID4gMCkgfHwgKGdzaXplID4gMCAmJiB3c2l6ZSA8IDApKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVzOiB3cm9uZyBzaWduXG4iLCBuYW1lKTsKKyAgICAgIGJhZCA9IDE7CisgICAgfQorCisgIGdzaXplID0gQUJTIChnc2l6ZSk7CisgIHdzaXplID0gQUJTICh3c2l6ZSk7CisKKyAgLyogbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHJlc3BlY3RpdmUgZGF0YSAqLworICBncCA9IFBUUiAoZ290KSArIGdzaXplIC0gMTsKKyAgd3AgPSBQVFIgKHdhbnQpICsgd3NpemUgLSAxOworCisgIC8qIGNvbXBhcmUgbGltYiBkYXRhICovCisgIGNtcHNpemUgPSBNQVggKFBSRUMgKGdvdCksIGdzaXplKTsKKyAgZm9yIChpID0gMDsgaSA8IGNtcHNpemU7IGkrKykKKyAgICB7CisgICAgICBnbGltYiA9IChpIDwgZ3NpemUgPyBncFstaV0gOiAwKTsKKyAgICAgIHdsaW1iID0gKGkgPCB3c2l6ZSA/IHdwWy1pXSA6IDApOworCisgICAgICBpZiAoZ2xpbWIgIT0gd2xpbWIpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCIlczogd3JvbmcgZGF0YSBzdGFydGluZyBhdCBpbmRleCAlbGQgZnJvbSB0b3BcbiIsCisgICAgICAgICAgICAgICAgICBuYW1lLCAobG9uZykgaSk7CisgICAgICAgICAgYmFkID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoYmFkKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgcHJlYyAgICAgICAlZFxuIiwgUFJFQyhnb3QpKTsKKyAgICAgIHByaW50ZiAoIiAgZXhwIGdvdCAgICAlbGRcbiIsIChsb25nKSBFWFAoZ290KSk7CisgICAgICBwcmludGYgKCIgIGV4cCB3YW50ICAgJWxkXG4iLCAobG9uZykgRVhQKHdhbnQpKTsKKyAgICAgIHByaW50ZiAoIiAgc2l6ZSBnb3QgICAlZFxuIiwgU0laKGdvdCkpOworICAgICAgcHJpbnRmICgiICBzaXplIHdhbnQgICVkXG4iLCBTSVood2FudCkpOworICAgICAgcHJpbnRmICgiICBsaW1icyAoaGlnaCB0byBsb3cpXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgIGdvdCAgIik7CisgICAgICBmb3IgKGkgPSBBQlNJWihnb3QpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgZ21wX3ByaW50ZiAoIiVNWCIsIFBUUihnb3QpW2ldKTsKKyAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgcHJpbnRmICgiLCIpOworICAgICAgICB9CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiICAgd2FudCAiKTsKKyAgICAgIGZvciAoaSA9IEFCU0laKHdhbnQpLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgZ21wX3ByaW50ZiAoIiVNWCIsIFBUUih3YW50KVtpXSk7CisgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHByaW50ZiAoIiwiKTsKKyAgICAgICAgfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworCitpbnQKK3JlZm1wZl92YWxpZGF0ZV9kaXZpc2lvbiAoY29uc3QgY2hhciAqbmFtZSwgbXBmX3NyY3B0ciBnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZl9zcmNwdHIgbiwgbXBmX3NyY3B0ciBkKQoreworICBtcF9zaXplX3QgIG5zaXplLCBkc2l6ZSwgc2lnbiwgcHJlYywgcXNpemUsIHRzaXplOworICBtcF9zcmNwdHIgIG5wLCBkcDsKKyAgbXBfcHRyICAgICB0cCwgcXAsIHJwOworICBtcGZfdCAgICAgIHdhbnQ7CisgIGludCAgICAgICAgcmV0OworCisgIG5zaXplID0gU0laIChuKTsKKyAgZHNpemUgPSBTSVogKGQpOworICBBU1NFUlRfQUxXQVlTIChkc2l6ZSAhPSAwKTsKKworICBzaWduID0gbnNpemUgXiBkc2l6ZTsKKyAgbnNpemUgPSBBQlMgKG5zaXplKTsKKyAgZHNpemUgPSBBQlMgKGRzaXplKTsKKworICBucCA9IFBUUiAobik7CisgIGRwID0gUFRSIChkKTsKKyAgcHJlYyA9IFBSRUMgKGdvdCk7CisKKyAgRVhQICh3YW50KSA9IEVYUCAobikgLSBFWFAgKGQpICsgMTsKKworICBxc2l6ZSA9IHByZWMgKyAyOyAgICAgICAgICAgIC8qIGF0IGxlYXN0IHByZWMrMSBsaW1icywgYWZ0ZXIgaGlnaCB6ZXJvICovCisgIHRzaXplID0gcXNpemUgKyBkc2l6ZSAtIDE7ICAgLyogZGl2aWRlbmQgc2l6ZSB0byBnaXZlIGRlc2lyZWQgcXNpemUgKi8KKworICAvKiBkaXZpZGVuZCBuLCBleHRlbmRlZCBvciB0cnVuY2F0ZWQgKi8KKyAgdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzICh0c2l6ZSk7CisgIHJlZm1wbl9jb3B5X2V4dGVuZCAodHAsIHRzaXplLCBucCwgbnNpemUpOworCisgIHFwID0gcmVmbXBuX21hbGxvY19saW1icyAocXNpemUpOworICBycCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKGRzaXplKTsgIC8qIHJlbWFpbmRlciwgdW51c2VkICovCisKKyAgQVNTRVJUX0FMV0FZUyAocXNpemUgPT0gdHNpemUgLSBkc2l6ZSArIDEpOworICByZWZtcG5fdGRpdl9xciAocXAsIHJwLCAobXBfc2l6ZV90KSAwLCB0cCwgdHNpemUsIGRwLCBkc2l6ZSk7CisKKyAgUFRSICh3YW50KSA9IHFwOworICBTSVogKHdhbnQpID0gKHNpZ24gPj0gMCA/IHFzaXplIDogLXFzaXplKTsKKyAgcmVmbXBmX25vcm1hbGl6ZSAod2FudCk7CisKKyAgcmV0ID0gcmVmbXBmX3ZhbGlkYXRlIChuYW1lLCBnb3QsIHdhbnQpOworCisgIGZyZWUgKHRwKTsKKyAgZnJlZSAocXApOworICBmcmVlIChycCk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZm1wbi5jIGIvdGVzdHMvcmVmbXBuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiYjQxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZm1wbi5jCkBAIC0wLDAgKzEsMjYzMCBAQAorLyogUmVmZXJlbmNlIG1wbiBmdW5jdGlvbnMsIGRlc2lnbmVkIHRvIGJlIHNpbXBsZSwgcG9ydGFibGUgYW5kIGluZGVwZW5kZW50CisgICBvZiB0aGUgbm9ybWFsIGdtcCBjb2RlLiAgU3BlZWQgaXNuJ3QgYSBjb25zaWRlcmF0aW9uLgorCitDb3B5cmlnaHQgMTk5Ni0yMDA5LCAyMDExLTIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyogTW9zdCByb3V0aW5lcyBoYXZlIGFzc2VydGlvbnMgcmVwcmVzZW50aW5nIHdoYXQgdGhlIG1wbiByb3V0aW5lcyBhcmUKKyAgIHN1cHBvc2VkIHRvIGFjY2VwdC4gIE1hbnkgb2YgdGhlc2UgcmVmZXJlbmNlIHJvdXRpbmVzIGRvIHNlbnNpYmxlIHRoaW5ncworICAgb3V0c2lkZSB0aGVzZSByYW5nZXMgKGVnLiBmb3Igc2l6ZT09MCksIGJ1dCB0aGUgYXNzZXJ0aW9ucyBhcmUgcHJlc2VudCB0bworICAgcGljayB1cCBiYWQgcGFyYW1ldGVycyBwYXNzZWQgaGVyZSB0aGF0IGFyZSBhYm91dCB0byBiZSBwYXNzZWQgdGhlIHNhbWUKKyAgIHRvIGEgcmVhbCBtcG4gcm91dGluZSBiZWluZyBjb21wYXJlZC4gICovCisKKy8qIGFsd2F5cyBkbyBhc3NlcnRpb24gY2hlY2tpbmcgKi8KKyNkZWZpbmUgV0FOVF9BU1NFUlQgIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgTlVMTCAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAvKiBmb3IgbWFsbG9jICovCisKKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHJlZ2lvbnMge3hwLHhzaXplfSBhbmQge3lwLHlzaXplfSBvdmVybGFwLCB3aXRoIHNpemVzCisgICBpbiBieXRlcy4gKi8KK2ludAorYnl0ZV9vdmVybGFwX3AgKGNvbnN0IHZvaWQgKnZfeHAsIG1wX3NpemVfdCB4c2l6ZSwKKwkJY29uc3Qgdm9pZCAqdl95cCwgbXBfc2l6ZV90IHlzaXplKQoreworICBjb25zdCBjaGFyICp4cCA9IChjb25zdCBjaGFyICopIHZfeHA7CisgIGNvbnN0IGNoYXIgKnlwID0gKGNvbnN0IGNoYXIgKikgdl95cDsKKworICBBU1NFUlQgKHhzaXplID49IDApOworICBBU1NFUlQgKHlzaXplID49IDApOworCisgIC8qIG5vIHdyYXBhcm91bmRzICovCisgIEFTU0VSVCAoeHAreHNpemUgPj0geHApOworICBBU1NFUlQgKHlwK3lzaXplID49IHlwKTsKKworICBpZiAoeHAgKyB4c2l6ZSA8PSB5cCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoeXAgKyB5c2l6ZSA8PSB4cCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIGxpbWIgcmVnaW9ucyB7eHAseHNpemV9IGFuZCB7eXAseXNpemV9IG92ZXJsYXAuICovCitpbnQKK3JlZm1wbl9vdmVybGFwX3AgKG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IHhzaXplLCBtcF9zcmNwdHIgeXAsIG1wX3NpemVfdCB5c2l6ZSkKK3sKKyAgcmV0dXJuIGJ5dGVfb3ZlcmxhcF9wICh4cCwgeHNpemUgKiBHTVBfTElNQl9CWVRFUywKKwkJCSB5cCwgeXNpemUgKiBHTVBfTElNQl9CWVRFUyk7Cit9CisKKy8qIENoZWNrIG92ZXJsYXAgZm9yIGEgcm91dGluZSBkZWZpbmVkIHRvIHdvcmsgbG93IHRvIGhpZ2guICovCitpbnQKK3JlZm1wbl9vdmVybGFwX2xvd190b19oaWdoX3AgKG1wX3NyY3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreworICByZXR1cm4gKGRzdCA8PSBzcmMgfHwgISByZWZtcG5fb3ZlcmxhcF9wIChkc3QsIHNpemUsIHNyYywgc2l6ZSkpOworfQorCisvKiBDaGVjayBvdmVybGFwIGZvciBhIHJvdXRpbmUgZGVmaW5lZCB0byB3b3JrIGhpZ2ggdG8gbG93LiAqLworaW50CityZWZtcG5fb3ZlcmxhcF9oaWdoX3RvX2xvd19wIChtcF9zcmNwdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIChkc3QgPj0gc3JjIHx8ICEgcmVmbXBuX292ZXJsYXBfcCAoZHN0LCBzaXplLCBzcmMsIHNpemUpKTsKK30KKworLyogQ2hlY2sgb3ZlcmxhcCBmb3IgYSBzdGFuZGFyZCByb3V0aW5lIHJlcXVpcmluZyBlcXVhbCBvciBzZXBhcmF0ZS4gKi8KK2ludAorcmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAobXBfc3JjcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiAoZHN0ID09IHNyYyB8fCAhIHJlZm1wbl9vdmVybGFwX3AgKGRzdCwgc2l6ZSwgc3JjLCBzaXplKSk7Cit9CitpbnQKK3JlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3R3b19wIChtcF9zcmNwdHIgZHN0LCBtcF9zcmNwdHIgc3JjMSwgbXBfc3JjcHRyIHNyYzIsCisJCQkgICAgICAgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAoZHN0LCBzcmMxLCBzaXplKQorCSAgJiYgcmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAoZHN0LCBzcmMyLCBzaXplKSk7Cit9CisKKworbXBfcHRyCityZWZtcG5fbWFsbG9jX2xpbWJzIChtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICBwOworICBBU1NFUlQgKHNpemUgPj0gMCk7CisgIGlmIChzaXplID09IDApCisgICAgc2l6ZSA9IDE7CisgIHAgPSAobXBfcHRyKSBtYWxsb2MgKChzaXplX3QpIChzaXplICogR01QX0xJTUJfQllURVMpKTsKKyAgQVNTRVJUIChwICE9IE5VTEwpOworICByZXR1cm4gcDsKK30KKworLyogRnJlZSBsaW1icyBhbGxvY2F0ZWQgYnkgcmVmbXBuX21hbGxvY19saW1icy4gTk9URTogQ2FuJ3QgZnJlZQorICogbWVtb3J5IGFsbG9jYXRlZCBieSByZWZtcG5fbWFsbG9jX2xpbWJzX2FsaWduZWQuICovCit2b2lkCityZWZtcG5fZnJlZV9saW1icyAobXBfcHRyIHApCit7CisgIGZyZWUgKHApOworfQorCittcF9wdHIKK3JlZm1wbl9tZW1kdXBfbGltYnMgKG1wX3NyY3B0ciBwdHIsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9wdHIgIHA7CisgIHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChzaXplKTsKKyAgcmVmbXBuX2NvcHlpIChwLCBwdHIsIHNpemUpOworICByZXR1cm4gcDsKK30KKworLyogbWFsbG9jIG4gbGltYnMgb24gYSBtdWx0aXBsZSBvZiBtIGJ5dGVzIGJvdW5kYXJ5ICovCittcF9wdHIKK3JlZm1wbl9tYWxsb2NfbGltYnNfYWxpZ25lZCAobXBfc2l6ZV90IG4sIHNpemVfdCBtKQoreworICByZXR1cm4gKG1wX3B0cikgYWxpZ25fcG9pbnRlciAocmVmbXBuX21hbGxvY19saW1icyAobiArIG0tMSksIG0pOworfQorCisKK3ZvaWQKK3JlZm1wbl9maWxsIChtcF9wdHIgcHRyLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IHZhbHVlKQoreworICBtcF9zaXplX3QgIGk7CisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBwdHJbaV0gPSB2YWx1ZTsKK30KKwordm9pZAorcmVmbXBuX3plcm8gKG1wX3B0ciBwdHIsIG1wX3NpemVfdCBzaXplKQoreworICByZWZtcG5fZmlsbCAocHRyLCBzaXplLCBDTlNUX0xJTUIoMCkpOworfQorCit2b2lkCityZWZtcG5femVyb19leHRlbmQgKG1wX3B0ciBwdHIsIG1wX3NpemVfdCBvbGRzaXplLCBtcF9zaXplX3QgbmV3c2l6ZSkKK3sKKyAgQVNTRVJUIChuZXdzaXplID49IG9sZHNpemUpOworICByZWZtcG5femVybyAocHRyK29sZHNpemUsIG5ld3NpemUtb2xkc2l6ZSk7Cit9CisKK2ludAorcmVmbXBuX3plcm9fcCAobXBfc3JjcHRyIHB0ciwgbXBfc2l6ZV90IHNpemUpCit7CisgIG1wX3NpemVfdCAgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBpZiAocHRyW2ldICE9IDApCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK21wX3NpemVfdAorcmVmbXBuX25vcm1hbGl6ZSAobXBfc3JjcHRyIHB0ciwgbXBfc2l6ZV90IHNpemUpCit7CisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgd2hpbGUgKHNpemUgPiAwICYmIHB0cltzaXplLTFdID09IDApCisgICAgc2l6ZS0tOworICByZXR1cm4gc2l6ZTsKK30KKworLyogdGhlIGhpZ2hlc3Qgb25lIGJpdCBpbiB4ICovCittcF9saW1iX3QKK3JlZm1wbl9tc2JvbmUgKG1wX2xpbWJfdCB4KQoreworICBtcF9saW1iX3QgIG4gPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTLTEpOworCisgIHdoaWxlIChuICE9IDApCisgICAgeworICAgICAgaWYgKHggJiBuKQorCWJyZWFrOworICAgICAgbiA+Pj0gMTsKKyAgICB9CisgIHJldHVybiBuOworfQorCisvKiBhIG1hc2sgb2YgdGhlIGhpZ2hlc3Qgb25lIGJpdCBwbHVzIGFuZCBhbGwgYml0cyBiZWxvdyAqLworbXBfbGltYl90CityZWZtcG5fbXNib25lX21hc2sgKG1wX2xpbWJfdCB4KQoreworICBpZiAoeCA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiAocmVmbXBuX21zYm9uZSAoeCkgPDwgMSkgLSAxOworfQorCisvKiBIb3cgbWFueSBkaWdpdHMgaW4gdGhlIGdpdmVuIGJhc2Ugd2lsbCBmaXQgaW4gYSBsaW1iLgorICAgTm90aWNlIHRoYXQgdGhlIHByb2R1Y3QgYiBpcyBhbGxvd2VkIHRvIGJlIGVxdWFsIHRvIHRoZSBsaW1pdAorICAgMl5HTVBfTlVNQl9CSVRTLCB0aGlzIGVuc3VyZXMgdGhlIHJlc3VsdCBmb3IgYmFzZT09MiB3aWxsIGJlCisgICBHTVBfTlVNQl9CSVRTIChhbmQgc2ltaWxhcmx5IG90aGVyIHBvd2VycyBvZiAyKS4gICovCitpbnQKK3JlZm1wbl9jaGFyc19wZXJfbGltYiAoaW50IGJhc2UpCit7CisgIG1wX2xpbWJfdCAgbGltaXRbMl0sIGJbMl07CisgIGludCAgICAgICAgY2hhcnNfcGVyX2xpbWI7CisKKyAgQVNTRVJUIChiYXNlID49IDIpOworCisgIGxpbWl0WzBdID0gMDsgIC8qIGxpbWl0ID0gMl5HTVBfTlVNQl9CSVRTICovCisgIGxpbWl0WzFdID0gMTsKKyAgYlswXSA9IDE7ICAgICAgLyogYiA9IDEgKi8KKyAgYlsxXSA9IDA7CisKKyAgY2hhcnNfcGVyX2xpbWIgPSAwOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChyZWZtcG5fbXVsXzEgKGIsIGIsIChtcF9zaXplX3QpIDIsIChtcF9saW1iX3QpIGJhc2UpKQorCWJyZWFrOworICAgICAgaWYgKHJlZm1wbl9jbXAgKGIsIGxpbWl0LCAobXBfc2l6ZV90KSAyKSA+IDApCisJYnJlYWs7CisgICAgICBjaGFyc19wZXJfbGltYisrOworICAgIH0KKyAgcmV0dXJuIGNoYXJzX3Blcl9saW1iOworfQorCisvKiBUaGUgYmlnZ2VzdCB2YWx1ZSBiYXNlKipuIHdoaWNoIGZpdHMgaW4gR01QX05VTUJfQklUUy4gKi8KK21wX2xpbWJfdAorcmVmbXBuX2JpZ19iYXNlIChpbnQgYmFzZSkKK3sKKyAgaW50ICAgICAgICBjaGFyc19wZXJfbGltYiA9IHJlZm1wbl9jaGFyc19wZXJfbGltYiAoYmFzZSk7CisgIGludCAgICAgICAgaTsKKyAgbXBfbGltYl90ICBiYjsKKworICBBU1NFUlQgKGJhc2UgPj0gMik7CisgIGJiID0gMTsKKyAgZm9yIChpID0gMDsgaSA8IGNoYXJzX3Blcl9saW1iOyBpKyspCisgICAgYmIgKj0gYmFzZTsKKyAgcmV0dXJuIGJiOworfQorCisKK3ZvaWQKK3JlZm1wbl9zZXRiaXQgKG1wX3B0ciBwdHIsIHVuc2lnbmVkIGxvbmcgYml0KQoreworICBwdHJbYml0L0dNUF9OVU1CX0JJVFNdIHw9IENOU1RfTElNQigxKSA8PCAoYml0JUdNUF9OVU1CX0JJVFMpOworfQorCit2b2lkCityZWZtcG5fY2xyYml0IChtcF9wdHIgcHRyLCB1bnNpZ25lZCBsb25nIGJpdCkKK3sKKyAgcHRyW2JpdC9HTVBfTlVNQl9CSVRTXSAmPSB+IChDTlNUX0xJTUIoMSkgPDwgKGJpdCVHTVBfTlVNQl9CSVRTKSk7Cit9CisKKyNkZWZpbmUgUkVGTVBOX1RTVEJJVChwdHIsYml0KSBcCisgICgoKHB0cilbKGJpdCkvR01QX05VTUJfQklUU10gJiAoQ05TVF9MSU1CKDEpIDw8ICgoYml0KSVHTVBfTlVNQl9CSVRTKSkpICE9IDApCisKK2ludAorcmVmbXBuX3RzdGJpdCAobXBfc3JjcHRyIHB0ciwgdW5zaWduZWQgbG9uZyBiaXQpCit7CisgIHJldHVybiBSRUZNUE5fVFNUQklUIChwdHIsIGJpdCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK3JlZm1wbl9zY2FuMCAobXBfc3JjcHRyIHB0ciwgdW5zaWduZWQgbG9uZyBiaXQpCit7CisgIHdoaWxlIChSRUZNUE5fVFNUQklUIChwdHIsIGJpdCkgIT0gMCkKKyAgICBiaXQrKzsKKyAgcmV0dXJuIGJpdDsKK30KKwordW5zaWduZWQgbG9uZworcmVmbXBuX3NjYW4xIChtcF9zcmNwdHIgcHRyLCB1bnNpZ25lZCBsb25nIGJpdCkKK3sKKyAgd2hpbGUgKFJFRk1QTl9UU1RCSVQgKHB0ciwgYml0KSA9PSAwKQorICAgIGJpdCsrOworICByZXR1cm4gYml0OworfQorCit2b2lkCityZWZtcG5fY29weSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplKQoreworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzcCwgc2l6ZSkpOworICByZWZtcG5fY29weWkgKHJwLCBzcCwgc2l6ZSk7Cit9CisKK3ZvaWQKK3JlZm1wbl9jb3B5aSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9zaXplX3QgaTsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2xvd190b19oaWdoX3AgKHJwLCBzcCwgc2l6ZSkpOworICBBU1NFUlQgKHNpemUgPj0gMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBycFtpXSA9IHNwW2ldOworfQorCit2b2lkCityZWZtcG5fY29weWQgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90IGk7CisKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9oaWdoX3RvX2xvd19wIChycCwgc3AsIHNpemUpKTsKKyAgQVNTRVJUIChzaXplID49IDApOworCisgIGZvciAoaSA9IHNpemUtMTsgaSA+PSAwOyBpLS0pCisgICAgcnBbaV0gPSBzcFtpXTsKK30KKworLyogQ29weSB7eHAseHNpemV9IHRvIHt3cCx3c2l6ZX0uICBJZiB4IGlzIHNob3J0ZXIsIHRoZW4gcGFkIHcgd2l0aCBsb3cKKyAgIHplcm9zIHRvIHdzaXplLiAgSWYgeCBpcyBsb25nZXIsIHRoZW4gY29weSBqdXN0IHRoZSBoaWdoIHdzaXplIGxpbWJzLiAgKi8KK3ZvaWQKK3JlZm1wbl9jb3B5X2V4dGVuZCAobXBfcHRyIHdwLCBtcF9zaXplX3Qgd3NpemUsIG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IHhzaXplKQoreworICBBU1NFUlQgKHdzaXplID49IDApOworICBBU1NFUlQgKHhzaXplID49IDApOworCisgIC8qIGhpZ2ggcGFydCBvZiB4IGlmIHggYmlnZ2VyIHRoYW4gdyAqLworICBpZiAoeHNpemUgPiB3c2l6ZSkKKyAgICB7CisgICAgICB4cCArPSB4c2l6ZSAtIHdzaXplOworICAgICAgeHNpemUgPSB3c2l6ZTsKKyAgICB9CisKKyAgcmVmbXBuX2NvcHkgKHdwICsgd3NpemUteHNpemUsIHhwLCB4c2l6ZSk7CisgIHJlZm1wbl96ZXJvICh3cCwgd3NpemUteHNpemUpOworfQorCitpbnQKK3JlZm1wbl9jbXAgKG1wX3NyY3B0ciB4cCwgbXBfc3JjcHRyIHlwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90ICBpOworCisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKyAgQVNTRVJUX01QTiAoeHAsIHNpemUpOworICBBU1NFUlRfTVBOICh5cCwgc2l6ZSk7CisKKyAgZm9yIChpID0gc2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBpZiAoeHBbaV0gPiB5cFtpXSkgIHJldHVybiAxOworICAgICAgaWYgKHhwW2ldIDwgeXBbaV0pICByZXR1cm4gLTE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworaW50CityZWZtcG5fY21wX2FsbG93emVybyAobXBfc3JjcHRyIHhwLCBtcF9zcmNwdHIgeXAsIG1wX3NpemVfdCBzaXplKQoreworICBpZiAoc2l6ZSA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIHJlZm1wbl9jbXAgKHhwLCB5cCwgc2l6ZSk7Cit9CisKK2ludAorcmVmbXBuX2NtcF90d29zaXplcyAobXBfc3JjcHRyIHhwLCBtcF9zaXplX3QgeHNpemUsCisJCSAgICAgbXBfc3JjcHRyIHlwLCBtcF9zaXplX3QgeXNpemUpCit7CisgIGludCAgb3BwLCBjbXA7CisKKyAgQVNTRVJUX01QTiAoeHAsIHhzaXplKTsKKyAgQVNTRVJUX01QTiAoeXAsIHlzaXplKTsKKworICBvcHAgPSAoeHNpemUgPCB5c2l6ZSk7CisgIGlmIChvcHApCisgICAgTVBOX1NSQ1BUUl9TV0FQICh4cCx4c2l6ZSwgeXAseXNpemUpOworCisgIGlmICghIHJlZm1wbl96ZXJvX3AgKHhwK3lzaXplLCB4c2l6ZS15c2l6ZSkpCisgICAgY21wID0gMTsKKyAgZWxzZQorICAgIGNtcCA9IHJlZm1wbl9jbXAgKHhwLCB5cCwgeXNpemUpOworCisgIHJldHVybiAob3BwID8gLWNtcCA6IGNtcCk7Cit9CisKK2ludAorcmVmbXBuX2VxdWFsX2FueW5haWwgKG1wX3NyY3B0ciB4cCwgbXBfc3JjcHRyIHlwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90ICBpOworICBBU1NFUlQgKHNpemUgPj0gMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgIGlmICh4cFtpXSAhPSB5cFtpXSkKKwlyZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKworI2RlZmluZSBMT0dPUFMob3BlcmF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfdHdvX3AgKHJwLCBzMXAsIHMycCwgc2l6ZSkpOyAgICAgICAgXAorICAgIEFTU0VSVCAoc2l6ZSA+PSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9NUE4gKHMxcCwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9NUE4gKHMycCwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcnBbaV0gPSBvcGVyYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3ZvaWQKK3JlZm1wbl9hbmRfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgTE9HT1BTIChzMXBbaV0gJiBzMnBbaV0pOworfQordm9pZAorcmVmbXBuX2FuZG5fbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgTE9HT1BTIChzMXBbaV0gJiB+czJwW2ldKTsKK30KK3ZvaWQKK3JlZm1wbl9uYW5kX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwgbXBfc2l6ZV90IHNpemUpCit7CisgIExPR09QUyAoKHMxcFtpXSAmIHMycFtpXSkgXiBHTVBfTlVNQl9NQVNLKTsKK30KK3ZvaWQKK3JlZm1wbl9pb3JfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgTE9HT1BTIChzMXBbaV0gfCBzMnBbaV0pOworfQordm9pZAorcmVmbXBuX2lvcm5fbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgTE9HT1BTIChzMXBbaV0gfCAoczJwW2ldIF4gR01QX05VTUJfTUFTSykpOworfQordm9pZAorcmVmbXBuX25pb3JfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgTE9HT1BTICgoczFwW2ldIHwgczJwW2ldKSBeIEdNUF9OVU1CX01BU0spOworfQordm9pZAorcmVmbXBuX3hvcl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBzaXplKQoreworICBMT0dPUFMgKHMxcFtpXSBeIHMycFtpXSk7Cit9Cit2b2lkCityZWZtcG5feG5vcl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBzaXplKQoreworICBMT0dPUFMgKChzMXBbaV0gXiBzMnBbaV0pIF4gR01QX05VTUJfTUFTSyk7Cit9CisKKworLyogc2V0ICpkaCwqZGwgdG8gbWg6bWwgLSBzaDpzbCwgaW4gZnVsbCBsaW1icyAqLwordm9pZAorcmVmbXBuX3N1Yl9kZG1tc3MgKG1wX2xpbWJfdCAqZGgsIG1wX2xpbWJfdCAqZGwsCisJCSAgIG1wX2xpbWJfdCBtaCwgbXBfbGltYl90IG1sLCBtcF9saW1iX3Qgc2gsIG1wX2xpbWJfdCBzbCkKK3sKKyAgKmRsID0gbWwgLSBzbDsKKyAgKmRoID0gbWggLSBzaCAtIChtbCA8IHNsKTsKK30KKworCisvKiBzZXQgKncgdG8geCt5LCByZXR1cm4gMCBvciAxIGNhcnJ5ICovCittcF9saW1iX3QKK3JlZl9hZGRjX2xpbWIgKG1wX2xpbWJfdCAqdywgbXBfbGltYl90IHgsIG1wX2xpbWJfdCB5KQoreworICBtcF9saW1iX3QgIHN1bSwgY3k7CisKKyAgQVNTRVJUX0xJTUIgKHgpOworICBBU1NFUlRfTElNQiAoeSk7CisKKyAgc3VtID0geCArIHk7CisjaWYgR01QX05BSUxfQklUUyA9PSAwCisgICp3ID0gc3VtOworICBjeSA9IChzdW0gPCB4KTsKKyNlbHNlCisgICp3ID0gc3VtICYgR01QX05VTUJfTUFTSzsKKyAgY3kgPSAoc3VtID4+IEdNUF9OVU1CX0JJVFMpOworI2VuZGlmCisgIHJldHVybiBjeTsKK30KKworLyogc2V0ICp3IHRvIHgteSwgcmV0dXJuIDAgb3IgMSBib3Jyb3cgKi8KK21wX2xpbWJfdAorcmVmX3N1YmNfbGltYiAobXBfbGltYl90ICp3LCBtcF9saW1iX3QgeCwgbXBfbGltYl90IHkpCit7CisgIG1wX2xpbWJfdCAgZGlmZiwgY3k7CisKKyAgQVNTRVJUX0xJTUIgKHgpOworICBBU1NFUlRfTElNQiAoeSk7CisKKyAgZGlmZiA9IHggLSB5OworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorICAqdyA9IGRpZmY7CisgIGN5ID0gKGRpZmYgPiB4KTsKKyNlbHNlCisgICp3ID0gZGlmZiAmIEdNUF9OVU1CX01BU0s7CisgIGN5ID0gKGRpZmYgPj4gR01QX05VTUJfQklUUykgJiAxOworI2VuZGlmCisgIHJldHVybiBjeTsKK30KKworLyogc2V0ICp3IHRvIHgreStjICh3aGVyZSBjIGlzIDAgb3IgMSksIHJldHVybiAwIG9yIDEgY2FycnkgKi8KK21wX2xpbWJfdAorYWRjIChtcF9saW1iX3QgKncsIG1wX2xpbWJfdCB4LCBtcF9saW1iX3QgeSwgbXBfbGltYl90IGMpCit7CisgIG1wX2xpbWJfdCAgcjsKKworICBBU1NFUlRfTElNQiAoeCk7CisgIEFTU0VSVF9MSU1CICh5KTsKKyAgQVNTRVJUIChjID09IDAgfHwgYyA9PSAxKTsKKworICByID0gcmVmX2FkZGNfbGltYiAodywgeCwgeSk7CisgIHJldHVybiByICsgcmVmX2FkZGNfbGltYiAodywgKncsIGMpOworfQorCisvKiBzZXQgKncgdG8geC15LWMgKHdoZXJlIGMgaXMgMCBvciAxKSwgcmV0dXJuIDAgb3IgMSBib3Jyb3cgKi8KK21wX2xpbWJfdAorc2JiIChtcF9saW1iX3QgKncsIG1wX2xpbWJfdCB4LCBtcF9saW1iX3QgeSwgbXBfbGltYl90IGMpCit7CisgIG1wX2xpbWJfdCAgcjsKKworICBBU1NFUlRfTElNQiAoeCk7CisgIEFTU0VSVF9MSU1CICh5KTsKKyAgQVNTRVJUIChjID09IDAgfHwgYyA9PSAxKTsKKworICByID0gcmVmX3N1YmNfbGltYiAodywgeCwgeSk7CisgIHJldHVybiByICsgcmVmX3N1YmNfbGltYiAodywgKncsIGMpOworfQorCisKKyNkZWZpbmUgQU9SU18xKG9wZXJhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90ICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQlcCisgICAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV9wIChycCwgc3AsIHNpemUpKTsgIFwKKyAgICBBU1NFUlQgKHNpemUgPj0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9NUE4gKHNwLCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUX0xJTUIgKG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQlcCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG4gPSBvcGVyYXRpb24gKCZycFtpXSwgc3BbaV0sIG4pOyAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworbXBfbGltYl90CityZWZtcG5fYWRkXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IG4pCit7CisgIEFPUlNfMSAocmVmX2FkZGNfbGltYik7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgbikKK3sKKyAgQU9SU18xIChyZWZfc3ViY19saW1iKTsKK30KKworI2RlZmluZSBBT1JTX05DKG9wZXJhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfdHdvX3AgKHJwLCBzMXAsIHMycCwgc2l6ZSkpOyAgICAgICAgXAorICAgIEFTU0VSVCAoY2FycnkgPT0gMCB8fCBjYXJyeSA9PSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVCAoc2l6ZSA+PSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9NUE4gKHMxcCwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTU0VSVF9NUE4gKHMycCwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FycnkgPSBvcGVyYXRpb24gKCZycFtpXSwgczFwW2ldLCBzMnBbaV0sIGNhcnJ5KTsgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBjYXJyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK21wX2xpbWJfdAorcmVmbXBuX2FkZF9uYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSwKKwkgICAgICAgbXBfbGltYl90IGNhcnJ5KQoreworICBBT1JTX05DIChhZGMpOworfQorbXBfbGltYl90CityZWZtcG5fc3ViX25jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBzaXplLAorCSAgICAgICBtcF9saW1iX3QgY2FycnkpCit7CisgIEFPUlNfTkMgKHNiYik7Cit9CisKKworbXBfbGltYl90CityZWZtcG5fYWRkX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiByZWZtcG5fYWRkX25jIChycCwgczFwLCBzMnAsIHNpemUsIENOU1RfTElNQigwKSk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJfbmMgKHJwLCBzMXAsIHMycCwgc2l6ZSwgQ05TVF9MSU1CKDApKTsKK30KKworbXBfbGltYl90CityZWZtcG5fY25kX2FkZF9uIChtcF9saW1iX3QgY25kLCBtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBzaXplKQoreworICBpZiAoY25kICE9IDApCisgICAgcmV0dXJuIHJlZm1wbl9hZGRfbiAocnAsIHMxcCwgczJwLCBzaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZm1wbl9jb3B5aSAocnAsIHMxcCwgc2l6ZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CittcF9saW1iX3QKK3JlZm1wbl9jbmRfc3ViX24gKG1wX2xpbWJfdCBjbmQsIG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwgbXBfc2l6ZV90IHNpemUpCit7CisgIGlmIChjbmQgIT0gMCkKKyAgICByZXR1cm4gcmVmbXBuX3N1Yl9uIChycCwgczFwLCBzMnAsIHNpemUpOworICBlbHNlCisgICAgeworICAgICAgcmVmbXBuX2NvcHlpIChycCwgczFwLCBzaXplKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCisjZGVmaW5lIEFPUlNfRVJSMV9OKG9wZXJhdGlvbikJCQkJCQlcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90ICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90IGNhcnJ5MjsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAocnAsIHMxcCwgc2l6ZSkpOwkJCVwKKyAgICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzMnAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHJwLCBzaXplLCB5cCwgc2l6ZSkpOwkJCVwKKyAgICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAoZXAsIDIsIHMxcCwgc2l6ZSkpOwkJCVwKKyAgICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAoZXAsIDIsIHMycCwgc2l6ZSkpOwkJCVwKKyAgICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAoZXAsIDIsIHlwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgMiwgcnAsIHNpemUpKTsJCQlcCisJCQkJCQkJCQlcCisgICAgQVNTRVJUIChjYXJyeSA9PSAwIHx8IGNhcnJ5ID09IDEpOwkJCQkJXAorICAgIEFTU0VSVCAoc2l6ZSA+PSAxKTsJCQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHMxcCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHMycCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHlwLCBzaXplKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgZXBbMF0gPSBlcFsxXSA9IENOU1RfTElNQigwKTsJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQlcCisJY2FycnkgPSBvcGVyYXRpb24gKCZycFtpXSwgczFwW2ldLCBzMnBbaV0sIGNhcnJ5KTsJCVwKKwlpZiAoY2FycnkgPT0gMSkJCQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBjYXJyeTIgPSByZWZfYWRkY19saW1iICgmZXBbMF0sIGVwWzBdLCB5cFtzaXplIC0gMSAtIGldKTsJXAorCSAgICBjYXJyeTIgPSByZWZfYWRkY19saW1iICgmZXBbMV0sIGVwWzFdLCBjYXJyeTIpOwkJXAorCSAgICBBU1NFUlQgKGNhcnJ5MiA9PSAwKTsJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgcmV0dXJuIGNhcnJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworbXBfbGltYl90CityZWZtcG5fYWRkX2VycjFfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLAorCQkgICBtcF9wdHIgZXAsIG1wX3NyY3B0ciB5cCwKKwkJICAgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgQU9SU19FUlIxX04gKGFkYyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJfZXJyMV9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsCisJCSAgIG1wX3B0ciBlcCwgbXBfc3JjcHRyIHlwLAorCQkgICBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGNhcnJ5KQoreworICBBT1JTX0VSUjFfTiAoc2JiKTsKK30KKworCisjZGVmaW5lIEFPUlNfRVJSMl9OKG9wZXJhdGlvbikJCQkJCQlcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfc2l6ZV90ICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXBfbGltYl90IGNhcnJ5MjsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAocnAsIHMxcCwgc2l6ZSkpOwkJCVwKKyAgICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzMnAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHJwLCBzaXplLCB5MXAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHJwLCBzaXplLCB5MnAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGVwLCA0LCBzMXAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGVwLCA0LCBzMnAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGVwLCA0LCB5MXAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGVwLCA0LCB5MnAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGVwLCA0LCBycCwgc2l6ZSkpOwkJCVwKKwkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKGNhcnJ5ID09IDAgfHwgY2FycnkgPT0gMSk7CQkJCQlcCisgICAgQVNTRVJUIChzaXplID49IDEpOwkJCQkJCQlcCisgICAgQVNTRVJUX01QTiAoczFwLCBzaXplKTsJCQkJCQlcCisgICAgQVNTRVJUX01QTiAoczJwLCBzaXplKTsJCQkJCQlcCisgICAgQVNTRVJUX01QTiAoeTFwLCBzaXplKTsJCQkJCQlcCisgICAgQVNTRVJUX01QTiAoeTJwLCBzaXplKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgZXBbMF0gPSBlcFsxXSA9IENOU1RfTElNQigwKTsJCQkJCVwKKyAgICBlcFsyXSA9IGVwWzNdID0gQ05TVF9MSU1CKDApOwkJCQkJXAorCQkJCQkJCQkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgewkJCQkJCQkJCVwKKwljYXJyeSA9IG9wZXJhdGlvbiAoJnJwW2ldLCBzMXBbaV0sIHMycFtpXSwgY2FycnkpOwkJXAorCWlmIChjYXJyeSA9PSAxKQkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIGNhcnJ5MiA9IHJlZl9hZGRjX2xpbWIgKCZlcFswXSwgZXBbMF0sIHkxcFtzaXplIC0gMSAtIGldKTsJXAorCSAgICBjYXJyeTIgPSByZWZfYWRkY19saW1iICgmZXBbMV0sIGVwWzFdLCBjYXJyeTIpOwkJXAorCSAgICBBU1NFUlQgKGNhcnJ5MiA9PSAwKTsJCQkJCVwKKwkgICAgY2FycnkyID0gcmVmX2FkZGNfbGltYiAoJmVwWzJdLCBlcFsyXSwgeTJwW3NpemUgLSAxIC0gaV0pOwlcCisJICAgIGNhcnJ5MiA9IHJlZl9hZGRjX2xpbWIgKCZlcFszXSwgZXBbM10sIGNhcnJ5Mik7CQlcCisJICAgIEFTU0VSVCAoY2FycnkyID09IDApOwkJCQkJXAorCSAgfQkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICByZXR1cm4gY2Fycnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCittcF9saW1iX3QKK3JlZm1wbl9hZGRfZXJyMl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsCisJCSAgIG1wX3B0ciBlcCwgbXBfc3JjcHRyIHkxcCwgbXBfc3JjcHRyIHkycCwKKwkJICAgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgQU9SU19FUlIyX04gKGFkYyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJfZXJyMl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzMXAsIG1wX3NyY3B0ciBzMnAsCisJCSAgIG1wX3B0ciBlcCwgbXBfc3JjcHRyIHkxcCwgbXBfc3JjcHRyIHkycCwKKwkJICAgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgQU9SU19FUlIyX04gKHNiYik7Cit9CisKKworI2RlZmluZSBBT1JTX0VSUjNfTihvcGVyYXRpb24pCQkJCQkJXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCBjYXJyeTI7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzMXAsIHNpemUpKTsJCQlcCisgICAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV9wIChycCwgczJwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChycCwgc2l6ZSwgeTFwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChycCwgc2l6ZSwgeTJwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChycCwgc2l6ZSwgeTNwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgczFwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgczJwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgeTFwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgeTJwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgeTNwLCBzaXplKSk7CQkJXAorICAgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChlcCwgNiwgcnAsIHNpemUpKTsJCQlcCisJCQkJCQkJCQlcCisgICAgQVNTRVJUIChjYXJyeSA9PSAwIHx8IGNhcnJ5ID09IDEpOwkJCQkJXAorICAgIEFTU0VSVCAoc2l6ZSA+PSAxKTsJCQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHMxcCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHMycCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHkxcCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHkycCwgc2l6ZSk7CQkJCQkJXAorICAgIEFTU0VSVF9NUE4gKHkzcCwgc2l6ZSk7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgIGVwWzBdID0gZXBbMV0gPSBDTlNUX0xJTUIoMCk7CQkJCQlcCisgICAgZXBbMl0gPSBlcFszXSA9IENOU1RfTElNQigwKTsJCQkJCVwKKyAgICBlcFs0XSA9IGVwWzVdID0gQ05TVF9MSU1CKDApOwkJCQkJXAorCQkJCQkJCQkJXAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgewkJCQkJCQkJCVwKKwljYXJyeSA9IG9wZXJhdGlvbiAoJnJwW2ldLCBzMXBbaV0sIHMycFtpXSwgY2FycnkpOwkJXAorCWlmIChjYXJyeSA9PSAxKQkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIGNhcnJ5MiA9IHJlZl9hZGRjX2xpbWIgKCZlcFswXSwgZXBbMF0sIHkxcFtzaXplIC0gMSAtIGldKTsJXAorCSAgICBjYXJyeTIgPSByZWZfYWRkY19saW1iICgmZXBbMV0sIGVwWzFdLCBjYXJyeTIpOwkJXAorCSAgICBBU1NFUlQgKGNhcnJ5MiA9PSAwKTsJCQkJCVwKKwkgICAgY2FycnkyID0gcmVmX2FkZGNfbGltYiAoJmVwWzJdLCBlcFsyXSwgeTJwW3NpemUgLSAxIC0gaV0pOwlcCisJICAgIGNhcnJ5MiA9IHJlZl9hZGRjX2xpbWIgKCZlcFszXSwgZXBbM10sIGNhcnJ5Mik7CQlcCisJICAgIEFTU0VSVCAoY2FycnkyID09IDApOwkJCQkJXAorCSAgICBjYXJyeTIgPSByZWZfYWRkY19saW1iICgmZXBbNF0sIGVwWzRdLCB5M3Bbc2l6ZSAtIDEgLSBpXSk7CVwKKwkgICAgY2FycnkyID0gcmVmX2FkZGNfbGltYiAoJmVwWzVdLCBlcFs1XSwgY2FycnkyKTsJCVwKKwkgICAgQVNTRVJUIChjYXJyeTIgPT0gMCk7CQkJCQlcCisJICB9CQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHJldHVybiBjYXJyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK21wX2xpbWJfdAorcmVmbXBuX2FkZF9lcnIzX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwKKwkJICAgbXBfcHRyIGVwLCBtcF9zcmNwdHIgeTFwLCBtcF9zcmNwdHIgeTJwLCBtcF9zcmNwdHIgeTNwLAorCQkgICBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGNhcnJ5KQoreworICBBT1JTX0VSUjNfTiAoYWRjKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1Yl9lcnIzX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwKKwkJICAgbXBfcHRyIGVwLCBtcF9zcmNwdHIgeTFwLCBtcF9zcmNwdHIgeTJwLCBtcF9zcmNwdHIgeTNwLAorCQkgICBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGNhcnJ5KQoreworICBBT1JTX0VSUjNfTiAoc2JiKTsKK30KKworCittcF9saW1iX3QKK3JlZm1wbl9hZGRsc2hfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwKKwkJIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgcykKK3sKKyAgbXBfbGltYl90IGN5OworICBtcF9wdHIgdHA7CisKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV90d29fcCAocnAsIHVwLCB2cCwgbikpOworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9NUE4gKHZwLCBuKTsKKworICB0cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG4pOworICBjeSAgPSByZWZtcG5fbHNoaWZ0ICh0cCwgdnAsIG4sIHMpOworICBjeSArPSByZWZtcG5fYWRkX24gKHJwLCB1cCwgdHAsIG4pOworICBmcmVlICh0cCk7CisgIHJldHVybiBjeTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZGxzaDFfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4pCit7CisgIHJldHVybiByZWZtcG5fYWRkbHNoX24gKHJwLCB1cCwgdnAsIG4sIDEpOworfQorbXBfbGltYl90CityZWZtcG5fYWRkbHNoMl9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRsc2hfbiAocnAsIHVwLCB2cCwgbiwgMik7Cit9CittcF9saW1iX3QKK3JlZm1wbl9hZGRsc2hfbl9pcDEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgdW5zaWduZWQgaW50IHMpCit7CisgIHJldHVybiByZWZtcG5fYWRkbHNoX24gKHJwLCBycCwgdnAsIG4sIHMpOworfQorbXBfbGltYl90CityZWZtcG5fYWRkbHNoMV9uX2lwMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX2FkZGxzaF9uIChycCwgcnAsIHZwLCBuLCAxKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZGxzaDJfbl9pcDEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRsc2hfbiAocnAsIHJwLCB2cCwgbiwgMik7Cit9CittcF9saW1iX3QKK3JlZm1wbl9hZGRsc2hfbl9pcDIgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgdW5zaWduZWQgaW50IHMpCit7CisgIHJldHVybiByZWZtcG5fYWRkbHNoX24gKHJwLCB2cCwgcnAsIG4sIHMpOworfQorbXBfbGltYl90CityZWZtcG5fYWRkbHNoMV9uX2lwMiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX2FkZGxzaF9uIChycCwgdnAsIHJwLCBuLCAxKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZGxzaDJfbl9pcDIgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRsc2hfbiAocnAsIHZwLCBycCwgbiwgMik7Cit9CittcF9saW1iX3QKK3JlZm1wbl9hZGRsc2hfbmMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsCisJCSAgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9saW1iX3QgY2FycnkpCit7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlQgKGNhcnJ5IDw9IChDTlNUX0xJTUIoMSkgPDwgcykpOworCisgIGN5ID0gcmVmbXBuX2FkZGxzaF9uIChycCwgdXAsIHZwLCBuLCBzKTsKKyAgY3kgKz0gcmVmbXBuX2FkZF8xIChycCwgcnAsIG4sIGNhcnJ5KTsKKyAgcmV0dXJuIGN5OworfQorbXBfbGltYl90CityZWZtcG5fYWRkbHNoMV9uYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRsc2hfbmMgKHJwLCB1cCwgdnAsIG4sIDEsIGNhcnJ5KTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZGxzaDJfbmMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgY2FycnkpCit7CisgIHJldHVybiByZWZtcG5fYWRkbHNoX25jIChycCwgdXAsIHZwLCBuLCAyLCBjYXJyeSk7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX3N1YmxzaF9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLAorCQkgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzKQoreworICBtcF9saW1iX3QgY3k7CisgIG1wX3B0ciB0cDsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3R3b19wIChycCwgdXAsIHZwLCBuKSk7CisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUICgwIDwgcyAmJiBzIDwgR01QX05VTUJfQklUUyk7CisgIEFTU0VSVF9NUE4gKHVwLCBuKTsKKyAgQVNTRVJUX01QTiAodnAsIG4pOworCisgIHRwID0gcmVmbXBuX21hbGxvY19saW1icyAobik7CisgIGN5ICA9IG1wbl9sc2hpZnQgKHRwLCB2cCwgbiwgcyk7CisgIGN5ICs9IG1wbl9zdWJfbiAocnAsIHVwLCB0cCwgbik7CisgIGZyZWUgKHRwKTsKKyAgcmV0dXJuIGN5OworfQorbXBfbGltYl90CityZWZtcG5fc3VibHNoMV9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJsc2hfbiAocnAsIHVwLCB2cCwgbiwgMSk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJsc2gyX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX3N1YmxzaF9uIChycCwgdXAsIHZwLCBuLCAyKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1YmxzaF9uX2lwMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgcykKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJsc2hfbiAocnAsIHJwLCB2cCwgbiwgcyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJsc2gxX25faXAxIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4pCit7CisgIHJldHVybiByZWZtcG5fc3VibHNoX24gKHJwLCBycCwgdnAsIG4sIDEpOworfQorbXBfbGltYl90CityZWZtcG5fc3VibHNoMl9uX2lwMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX3N1YmxzaF9uIChycCwgcnAsIHZwLCBuLCAyKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1YmxzaF9uX2lwMiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuLCB1bnNpZ25lZCBpbnQgcykKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJsc2hfbiAocnAsIHZwLCBycCwgbiwgcyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJsc2gxX25faXAyIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4pCit7CisgIHJldHVybiByZWZtcG5fc3VibHNoX24gKHJwLCB2cCwgcnAsIG4sIDEpOworfQorbXBfbGltYl90CityZWZtcG5fc3VibHNoMl9uX2lwMiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX3N1YmxzaF9uIChycCwgdnAsIHJwLCBuLCAyKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1YmxzaF9uYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwKKwkJICBtcF9zaXplX3QgbiwgdW5zaWduZWQgaW50IHMsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgbXBfbGltYl90IGN5OworCisgIEFTU0VSVCAoY2FycnkgPD0gKENOU1RfTElNQigxKSA8PCBzKSk7CisKKyAgY3kgPSByZWZtcG5fc3VibHNoX24gKHJwLCB1cCwgdnAsIG4sIHMpOworICBjeSArPSByZWZtcG5fc3ViXzEgKHJwLCBycCwgbiwgY2FycnkpOworICByZXR1cm4gY3k7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJsc2gxX25jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgbXBfbGltYl90IGNhcnJ5KQoreworICByZXR1cm4gcmVmbXBuX3N1YmxzaF9uYyAocnAsIHVwLCB2cCwgbiwgMSwgY2FycnkpOworfQorbXBfbGltYl90CityZWZtcG5fc3VibHNoMl9uYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4sIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJsc2hfbmMgKHJwLCB1cCwgdnAsIG4sIDIsIGNhcnJ5KTsKK30KKworbXBfbGltYl9zaWduZWRfdAorcmVmbXBuX3JzYmxzaF9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLAorCQkgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzKQoreworICBtcF9saW1iX3NpZ25lZF90IGN5OworICBtcF9wdHIgdHA7CisKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV90d29fcCAocnAsIHVwLCB2cCwgbikpOworICBBU1NFUlQgKG4gPj0gMSk7CisgIEFTU0VSVCAoMCA8IHMgJiYgcyA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9NUE4gKHZwLCBuKTsKKworICB0cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG4pOworICBjeSAgPSBtcG5fbHNoaWZ0ICh0cCwgdnAsIG4sIHMpOworICBjeSAtPSBtcG5fc3ViX24gKHJwLCB0cCwgdXAsIG4pOworICBmcmVlICh0cCk7CisgIHJldHVybiBjeTsKK30KK21wX2xpbWJfc2lnbmVkX3QKK3JlZm1wbl9yc2Jsc2gxX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX3JzYmxzaF9uIChycCwgdXAsIHZwLCBuLCAxKTsKK30KK21wX2xpbWJfc2lnbmVkX3QKK3JlZm1wbl9yc2Jsc2gyX24gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuKQoreworICByZXR1cm4gcmVmbXBuX3JzYmxzaF9uIChycCwgdXAsIHZwLCBuLCAyKTsKK30KK21wX2xpbWJfc2lnbmVkX3QKK3JlZm1wbl9yc2Jsc2hfbmMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsCisJCSAgbXBfc2l6ZV90IG4sIHVuc2lnbmVkIGludCBzLCBtcF9saW1iX3NpZ25lZF90IGNhcnJ5KQoreworICBtcF9saW1iX3NpZ25lZF90IGN5OworCisgIEFTU0VSVCAoY2FycnkgPT0gLTEgfHwgKGNhcnJ5ID4+IHMpID09IDApOworCisgIGN5ID0gcmVmbXBuX3JzYmxzaF9uIChycCwgdXAsIHZwLCBuLCBzKTsKKyAgaWYgKGNhcnJ5ID4gMCkKKyAgICBjeSArPSByZWZtcG5fYWRkXzEgKHJwLCBycCwgbiwgY2FycnkpOworICBlbHNlCisgICAgY3kgLT0gcmVmbXBuX3N1Yl8xIChycCwgcnAsIG4sIC1jYXJyeSk7CisgIHJldHVybiBjeTsKK30KK21wX2xpbWJfc2lnbmVkX3QKK3JlZm1wbl9yc2Jsc2gxX25jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgbXBfbGltYl9zaWduZWRfdCBjYXJyeSkKK3sKKyAgcmV0dXJuIHJlZm1wbl9yc2Jsc2hfbmMgKHJwLCB1cCwgdnAsIG4sIDEsIGNhcnJ5KTsKK30KK21wX2xpbWJfc2lnbmVkX3QKK3JlZm1wbl9yc2Jsc2gyX25jIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbiwgbXBfbGltYl9zaWduZWRfdCBjYXJyeSkKK3sKKyAgcmV0dXJuIHJlZm1wbl9yc2Jsc2hfbmMgKHJwLCB1cCwgdnAsIG4sIDIsIGNhcnJ5KTsKK30KKworbXBfbGltYl90CityZWZtcG5fcnNoMWFkZF9uIChtcF9wdHIgcnAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgbikKK3sKKyAgbXBfbGltYl90IGN5YSwgY3lzOworCisgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfdHdvX3AgKHJwLCB1cCwgdnAsIG4pKTsKKyAgQVNTRVJUIChuID49IDEpOworICBBU1NFUlRfTVBOICh1cCwgbik7CisgIEFTU0VSVF9NUE4gKHZwLCBuKTsKKworICBjeWEgPSBtcG5fYWRkX24gKHJwLCB1cCwgdnAsIG4pOworICBjeXMgPSBtcG5fcnNoaWZ0IChycCwgcnAsIG4sIDEpID4+IChHTVBfTlVNQl9CSVRTIC0gMSk7CisgIHJwW24gLSAxXSB8PSBjeWEgPDwgKEdNUF9OVU1CX0JJVFMgLSAxKTsKKyAgcmV0dXJuIGN5czsKK30KK21wX2xpbWJfdAorcmVmbXBuX3JzaDFzdWJfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4pCit7CisgIG1wX2xpbWJfdCBjeWEsIGN5czsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3R3b19wIChycCwgdXAsIHZwLCBuKSk7CisgIEFTU0VSVCAobiA+PSAxKTsKKyAgQVNTRVJUX01QTiAodXAsIG4pOworICBBU1NFUlRfTVBOICh2cCwgbik7CisKKyAgY3lhID0gbXBuX3N1Yl9uIChycCwgdXAsIHZwLCBuKTsKKyAgY3lzID0gbXBuX3JzaGlmdCAocnAsIHJwLCBuLCAxKSA+PiAoR01QX05VTUJfQklUUyAtIDEpOworICBycFtuIC0gMV0gfD0gY3lhIDw8IChHTVBfTlVNQl9CSVRTIC0gMSk7CisgIHJldHVybiBjeXM7Cit9CisKKy8qIFR3b3MgY29tcGxlbWVudCwgcmV0dXJuIGJvcnJvdy4gKi8KK21wX2xpbWJfdAorcmVmbXBuX25lZyAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUpCit7CisgIG1wX3B0ciAgICAgemVyb3M7CisgIG1wX2xpbWJfdCAgcmV0OworCisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKworICB6ZXJvcyA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUpOworICByZWZtcG5fZmlsbCAoemVyb3MsIHNpemUsIENOU1RfTElNQigwKSk7CisgIHJldCA9IHJlZm1wbl9zdWJfbiAoZHN0LCB6ZXJvcywgc3JjLCBzaXplKTsKKyAgZnJlZSAoemVyb3MpOworICByZXR1cm4gcmV0OworfQorCisKKyNkZWZpbmUgQU9SUyhhb3JzX24sIGFvcnNfMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU1NFUlQgKHMxc2l6ZSA+PSBzMnNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNTRVJUIChzMnNpemUgPj0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMgPSBhb3JzX24gKHJwLCBzMXAsIHMycCwgczJzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoczFzaXplLXMyc2l6ZSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjID0gYW9yc18xIChycCtzMnNpemUsIHMxcCtzMnNpemUsIHMxc2l6ZS1zMnNpemUsIGMpOyAgICAgXAorICAgIHJldHVybiBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorbXBfbGltYl90CityZWZtcG5fYWRkIChtcF9wdHIgcnAsCisJICAgIG1wX3NyY3B0ciBzMXAsIG1wX3NpemVfdCBzMXNpemUsCisJICAgIG1wX3NyY3B0ciBzMnAsIG1wX3NpemVfdCBzMnNpemUpCit7CisgIEFPUlMgKHJlZm1wbl9hZGRfbiwgcmVmbXBuX2FkZF8xKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1YiAobXBfcHRyIHJwLAorCSAgICBtcF9zcmNwdHIgczFwLCBtcF9zaXplX3QgczFzaXplLAorCSAgICBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3QgczJzaXplKQoreworICBBT1JTIChyZWZtcG5fc3ViX24sIHJlZm1wbl9zdWJfMSk7Cit9CisKKworI2RlZmluZSBTSElGVEhJR0goeCkgKCh4KSA8PCBHTVBfTElNQl9CSVRTLzIpCisjZGVmaW5lIFNISUZUTE9XKHgpICAoKHgpID4+IEdNUF9MSU1CX0JJVFMvMikKKworI2RlZmluZSBMT1dNQVNLICAgKCgobXBfbGltYl90KSAxIDw8IEdNUF9MSU1CX0JJVFMvMiktMSkKKyNkZWZpbmUgSElHSE1BU0sgIFNISUZUSElHSChMT1dNQVNLKQorCisjZGVmaW5lIExPV1BBUlQoeCkgICAoKHgpICYgTE9XTUFTSykKKyNkZWZpbmUgSElHSFBBUlQoeCkgIFNISUZUTE9XKCh4KSAmIEhJR0hNQVNLKQorCisvKiBTZXQgcmV0dXJuOipsbyB0byB4KnksIHVzaW5nIGZ1bGwgbGltYnMgbm90IG5haWxzLiAqLworbXBfbGltYl90CityZWZtcG5fdW11bF9wcG1tIChtcF9saW1iX3QgKmxvLCBtcF9saW1iX3QgeCwgbXBfbGltYl90IHkpCit7CisgIG1wX2xpbWJfdCAgaGksIHM7CisKKyAgKmxvID0gTE9XUEFSVCh4KSAqIExPV1BBUlQoeSk7CisgIGhpID0gSElHSFBBUlQoeCkgKiBISUdIUEFSVCh5KTsKKworICBzID0gTE9XUEFSVCh4KSAqIEhJR0hQQVJUKHkpOworICBoaSArPSBISUdIUEFSVChzKTsKKyAgcyA9IFNISUZUSElHSChMT1dQQVJUKHMpKTsKKyAgKmxvICs9IHM7CisgIGhpICs9ICgqbG8gPCBzKTsKKworICBzID0gSElHSFBBUlQoeCkgKiBMT1dQQVJUKHkpOworICBoaSArPSBISUdIUEFSVChzKTsKKyAgcyA9IFNISUZUSElHSChMT1dQQVJUKHMpKTsKKyAgKmxvICs9IHM7CisgIGhpICs9ICgqbG8gPCBzKTsKKworICByZXR1cm4gaGk7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX3VtdWxfcHBtbV9yIChtcF9saW1iX3QgeCwgbXBfbGltYl90IHksIG1wX2xpbWJfdCAqbG8pCit7CisgIHJldHVybiByZWZtcG5fdW11bF9wcG1tIChsbywgeCwgeSk7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX211bF8xYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgbXVsdGlwbGllciwKKwkgICAgICAgbXBfbGltYl90IGNhcnJ5KQoreworICBtcF9zaXplX3QgIGk7CisgIG1wX2xpbWJfdCAgaGksIGxvOworCisgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfbG93X3RvX2hpZ2hfcCAocnAsIHNwLCBzaXplKSk7CisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKyAgQVNTRVJUX01QTiAoc3AsIHNpemUpOworICBBU1NFUlRfTElNQiAobXVsdGlwbGllcik7CisgIEFTU0VSVF9MSU1CIChjYXJyeSk7CisKKyAgbXVsdGlwbGllciA8PD0gR01QX05BSUxfQklUUzsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBoaSA9IHJlZm1wbl91bXVsX3BwbW0gKCZsbywgc3BbaV0sIG11bHRpcGxpZXIpOworICAgICAgbG8gPj49IEdNUF9OQUlMX0JJVFM7CisgICAgICBBU1NFUlRfTk9DQVJSWSAocmVmX2FkZGNfbGltYiAoJmhpLCBoaSwgcmVmX2FkZGNfbGltYiAoJmxvLCBsbywgY2FycnkpKSk7CisgICAgICBycFtpXSA9IGxvOworICAgICAgY2FycnkgPSBoaTsKKyAgICB9CisgIHJldHVybiBjYXJyeTsKK30KKworbXBfbGltYl90CityZWZtcG5fbXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IG11bHRpcGxpZXIpCit7CisgIHJldHVybiByZWZtcG5fbXVsXzFjIChycCwgc3AsIHNpemUsIG11bHRpcGxpZXIsIENOU1RfTElNQigwKSk7Cit9CisKKworbXBfbGltYl90CityZWZtcG5fbXVsX04gKG1wX3B0ciBkc3QsIG1wX3NyY3B0ciBzcmMsIG1wX3NpemVfdCBzaXplLAorCSAgICAgIG1wX3NyY3B0ciBtdWx0LCBtcF9zaXplX3QgbXNpemUpCit7CisgIG1wX3B0ciAgICAgc3JjX2NvcHk7CisgIG1wX2xpbWJfdCAgcmV0OworICBtcF9zaXplX3QgIGk7CisKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV9wIChkc3QsIHNyYywgc2l6ZSkpOworICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAoZHN0LCBzaXplK21zaXplLTEsIG11bHQsIG1zaXplKSk7CisgIEFTU0VSVCAoc2l6ZSA+PSBtc2l6ZSk7CisgIEFTU0VSVF9NUE4gKG11bHQsIG1zaXplKTsKKworICAvKiBpbiBjYXNlIGRzdD09c3JjICovCisgIHNyY19jb3B5ID0gcmVmbXBuX21hbGxvY19saW1icyAoc2l6ZSk7CisgIHJlZm1wbl9jb3B5aSAoc3JjX2NvcHksIHNyYywgc2l6ZSk7CisgIHNyYyA9IHNyY19jb3B5OworCisgIGRzdFtzaXplXSA9IHJlZm1wbl9tdWxfMSAoZHN0LCBzcmMsIHNpemUsIG11bHRbMF0pOworICBmb3IgKGkgPSAxOyBpIDwgbXNpemUtMTsgaSsrKQorICAgIGRzdFtzaXplK2ldID0gcmVmbXBuX2FkZG11bF8xIChkc3QraSwgc3JjLCBzaXplLCBtdWx0W2ldKTsKKyAgcmV0ID0gcmVmbXBuX2FkZG11bF8xIChkc3QraSwgc3JjLCBzaXplLCBtdWx0W2ldKTsKKworICBmcmVlIChzcmNfY29weSk7CisgIHJldHVybiByZXQ7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX211bF8yIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX3NyY3B0ciBtdWx0KQoreworICByZXR1cm4gcmVmbXBuX211bF9OIChycCwgc3AsIHNpemUsIG11bHQsIChtcF9zaXplX3QpIDIpOworfQorbXBfbGltYl90CityZWZtcG5fbXVsXzMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfc3JjcHRyIG11bHQpCit7CisgIHJldHVybiByZWZtcG5fbXVsX04gKHJwLCBzcCwgc2l6ZSwgbXVsdCwgKG1wX3NpemVfdCkgMyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9tdWxfNCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9zcmNwdHIgbXVsdCkKK3sKKyAgcmV0dXJuIHJlZm1wbl9tdWxfTiAocnAsIHNwLCBzaXplLCBtdWx0LCAobXBfc2l6ZV90KSA0KTsKK30KK21wX2xpbWJfdAorcmVmbXBuX211bF81IChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX3NyY3B0ciBtdWx0KQoreworICByZXR1cm4gcmVmbXBuX211bF9OIChycCwgc3AsIHNpemUsIG11bHQsIChtcF9zaXplX3QpIDUpOworfQorbXBfbGltYl90CityZWZtcG5fbXVsXzYgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfc3JjcHRyIG11bHQpCit7CisgIHJldHVybiByZWZtcG5fbXVsX04gKHJwLCBzcCwgc2l6ZSwgbXVsdCwgKG1wX3NpemVfdCkgNik7Cit9CisKKyNkZWZpbmUgQU9SU01VTF8xQyhvcGVyYXRpb25fbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3B0ciAgICAgcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCVwKKyAgICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzcCwgc2l6ZSkpOyAgICAgICAgICBcCisJCQkJCQkJCVwKKyAgICBwID0gcmVmbXBuX21hbGxvY19saW1icyAoc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gcmVmbXBuX211bF8xYyAocCwgc3AsIHNpemUsIG11bHRpcGxpZXIsIGNhcnJ5KTsgICAgICAgXAorICAgIHJldCArPSBvcGVyYXRpb25fbiAocnAsIHJwLCBwLCBzaXplKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJXAorICAgIGZyZWUgKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworbXBfbGltYl90CityZWZtcG5fYWRkbXVsXzFjIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsCisJCSAgbXBfbGltYl90IG11bHRpcGxpZXIsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgQU9SU01VTF8xQyAocmVmbXBuX2FkZF9uKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX3N1Ym11bF8xYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLAorCQkgIG1wX2xpbWJfdCBtdWx0aXBsaWVyLCBtcF9saW1iX3QgY2FycnkpCit7CisgIEFPUlNNVUxfMUMgKHJlZm1wbl9zdWJfbik7Cit9CisKKworbXBfbGltYl90CityZWZtcG5fYWRkbXVsXzEgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IG11bHRpcGxpZXIpCit7CisgIHJldHVybiByZWZtcG5fYWRkbXVsXzFjIChycCwgc3AsIHNpemUsIG11bHRpcGxpZXIsIENOU1RfTElNQigwKSk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9zdWJtdWxfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgbXVsdGlwbGllcikKK3sKKyAgcmV0dXJuIHJlZm1wbl9zdWJtdWxfMWMgKHJwLCBzcCwgc2l6ZSwgbXVsdGlwbGllciwgQ05TVF9MSU1CKDApKTsKK30KKworCittcF9saW1iX3QKK3JlZm1wbl9hZGRtdWxfTiAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUsCisJCSBtcF9zcmNwdHIgbXVsdCwgbXBfc2l6ZV90IG1zaXplKQoreworICBtcF9wdHIgICAgIHNyY19jb3B5OworICBtcF9saW1iX3QgIHJldDsKKyAgbXBfc2l6ZV90ICBpOworCisgIEFTU0VSVCAoZHN0ID09IHNyYyB8fCAhIHJlZm1wbl9vdmVybGFwX3AgKGRzdCwgc2l6ZSttc2l6ZS0xLCBzcmMsIHNpemUpKTsKKyAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKGRzdCwgc2l6ZSttc2l6ZS0xLCBtdWx0LCBtc2l6ZSkpOworICBBU1NFUlQgKHNpemUgPj0gbXNpemUpOworICBBU1NFUlRfTVBOIChtdWx0LCBtc2l6ZSk7CisKKyAgLyogaW4gY2FzZSBkc3Q9PXNyYyAqLworICBzcmNfY29weSA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUpOworICByZWZtcG5fY29weWkgKHNyY19jb3B5LCBzcmMsIHNpemUpOworICBzcmMgPSBzcmNfY29weTsKKworICBmb3IgKGkgPSAwOyBpIDwgbXNpemUtMTsgaSsrKQorICAgIGRzdFtzaXplK2ldID0gcmVmbXBuX2FkZG11bF8xIChkc3QraSwgc3JjLCBzaXplLCBtdWx0W2ldKTsKKyAgcmV0ID0gcmVmbXBuX2FkZG11bF8xIChkc3QraSwgc3JjLCBzaXplLCBtdWx0W2ldKTsKKworICBmcmVlIChzcmNfY29weSk7CisgIHJldHVybiByZXQ7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2FkZG11bF8yIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX3NyY3B0ciBtdWx0KQoreworICByZXR1cm4gcmVmbXBuX2FkZG11bF9OIChycCwgc3AsIHNpemUsIG11bHQsIChtcF9zaXplX3QpIDIpOworfQorbXBfbGltYl90CityZWZtcG5fYWRkbXVsXzMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfc3JjcHRyIG11bHQpCit7CisgIHJldHVybiByZWZtcG5fYWRkbXVsX04gKHJwLCBzcCwgc2l6ZSwgbXVsdCwgKG1wX3NpemVfdCkgMyk7Cit9CittcF9saW1iX3QKK3JlZm1wbl9hZGRtdWxfNCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9zcmNwdHIgbXVsdCkKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRtdWxfTiAocnAsIHNwLCBzaXplLCBtdWx0LCAobXBfc2l6ZV90KSA0KTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZG11bF81IChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX3NyY3B0ciBtdWx0KQoreworICByZXR1cm4gcmVmbXBuX2FkZG11bF9OIChycCwgc3AsIHNpemUsIG11bHQsIChtcF9zaXplX3QpIDUpOworfQorbXBfbGltYl90CityZWZtcG5fYWRkbXVsXzYgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfc3JjcHRyIG11bHQpCit7CisgIHJldHVybiByZWZtcG5fYWRkbXVsX04gKHJwLCBzcCwgc2l6ZSwgbXVsdCwgKG1wX3NpemVfdCkgNik7Cit9CittcF9saW1iX3QKK3JlZm1wbl9hZGRtdWxfNyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9zcmNwdHIgbXVsdCkKK3sKKyAgcmV0dXJuIHJlZm1wbl9hZGRtdWxfTiAocnAsIHNwLCBzaXplLCBtdWx0LCAobXBfc2l6ZV90KSA3KTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2FkZG11bF84IChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX3NyY3B0ciBtdWx0KQoreworICByZXR1cm4gcmVmbXBuX2FkZG11bF9OIChycCwgc3AsIHNpemUsIG11bHQsIChtcF9zaXplX3QpIDgpOworfQorCittcF9saW1iX3QKK3JlZm1wbl9hZGRfbl9zdWJfbmMgKG1wX3B0ciByMXAsIG1wX3B0ciByMnAsCisJCSAgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwgbXBfc2l6ZV90IHNpemUsCisJCSAgbXBfbGltYl90IGNhcnJ5KQoreworICBtcF9wdHIgcDsKKyAgbXBfbGltYl90IGFjeSwgc2N5OworCisgIC8qIERlc3RpbmF0aW9ucyBjYW4ndCBvdmVybGFwLiAqLworICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAocjFwLCBzaXplLCByMnAsIHNpemUpKTsKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV90d29fcCAocjFwLCBzMXAsIHMycCwgc2l6ZSkpOworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3R3b19wIChyMnAsIHMxcCwgczJwLCBzaXplKSk7CisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKworICAvKiBpbiBjYXNlIHIxcD09czFwIG9yIHIxcD09czJwICovCisgIHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChzaXplKTsKKworICBhY3kgPSByZWZtcG5fYWRkX25jIChwLCBzMXAsIHMycCwgc2l6ZSwgY2FycnkgPj4gMSk7CisgIHNjeSA9IHJlZm1wbl9zdWJfbmMgKHIycCwgczFwLCBzMnAsIHNpemUsIGNhcnJ5ICYgMSk7CisgIHJlZm1wbl9jb3B5aSAocjFwLCBwLCBzaXplKTsKKworICBmcmVlIChwKTsKKyAgcmV0dXJuIDIgKiBhY3kgKyBzY3k7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2FkZF9uX3N1Yl9uIChtcF9wdHIgcjFwLCBtcF9wdHIgcjJwLAorCQkgbXBfc3JjcHRyIHMxcCwgbXBfc3JjcHRyIHMycCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiByZWZtcG5fYWRkX25fc3ViX25jIChyMXAsIHIycCwgczFwLCBzMnAsIHNpemUsIENOU1RfTElNQigwKSk7Cit9CisKKworLyogUmlnaHQgc2hpZnQgaGksbG8gYW5kIHJldHVybiB0aGUgbG93IGxpbWIgb2YgdGhlIHJlc3VsdC4KKyAgIE5vdGUgYSBzaGlmdCBieSBHTVBfTElNQl9CSVRTIGlzbid0IGFzc3VtZWQgdG8gd29yayAoZG9lc24ndCBvbiB4ODYpLiAqLworbXBfbGltYl90Cityc2hpZnRfbWFrZSAobXBfbGltYl90IGhpLCBtcF9saW1iX3QgbG8sIHVuc2lnbmVkIHNoaWZ0KQoreworICBBU1NFUlQgKHNoaWZ0IDwgR01QX05VTUJfQklUUyk7CisgIGlmIChzaGlmdCA9PSAwKQorICAgIHJldHVybiBsbzsKKyAgZWxzZQorICAgIHJldHVybiAoKGhpIDw8IChHTVBfTlVNQl9CSVRTLXNoaWZ0KSkgfCAobG8gPj4gc2hpZnQpKSAmIEdNUF9OVU1CX01BU0s7Cit9CisKKy8qIExlZnQgc2hpZnQgaGksbG8gYW5kIHJldHVybiB0aGUgaGlnaCBsaW1iIG9mIHRoZSByZXN1bHQuCisgICBOb3RlIGEgc2hpZnQgYnkgR01QX0xJTUJfQklUUyBpc24ndCBhc3N1bWVkIHRvIHdvcmsgKGRvZXNuJ3Qgb24geDg2KS4gKi8KK21wX2xpbWJfdAorbHNoaWZ0X21ha2UgKG1wX2xpbWJfdCBoaSwgbXBfbGltYl90IGxvLCB1bnNpZ25lZCBzaGlmdCkKK3sKKyAgQVNTRVJUIChzaGlmdCA8IEdNUF9OVU1CX0JJVFMpOworICBpZiAoc2hpZnQgPT0gMCkKKyAgICByZXR1cm4gaGk7CisgIGVsc2UKKyAgICByZXR1cm4gKChoaSA8PCBzaGlmdCkgfCAobG8gPj4gKEdNUF9OVU1CX0JJVFMtc2hpZnQpKSkgJiBHTVBfTlVNQl9NQVNLOworfQorCisKK21wX2xpbWJfdAorcmVmbXBuX3JzaGlmdCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCB1bnNpZ25lZCBzaGlmdCkKK3sKKyAgbXBfbGltYl90ICByZXQ7CisgIG1wX3NpemVfdCAgaTsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2xvd190b19oaWdoX3AgKHJwLCBzcCwgc2l6ZSkpOworICBBU1NFUlQgKHNpemUgPj0gMSk7CisgIEFTU0VSVCAoc2hpZnQgPj0gMSAmJiBzaGlmdCA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlRfTVBOIChzcCwgc2l6ZSk7CisKKyAgcmV0ID0gcnNoaWZ0X21ha2UgKHNwWzBdLCBDTlNUX0xJTUIoMCksIHNoaWZ0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspCisgICAgcnBbaV0gPSByc2hpZnRfbWFrZSAoc3BbaSsxXSwgc3BbaV0sIHNoaWZ0KTsKKworICBycFtpXSA9IHJzaGlmdF9tYWtlIChDTlNUX0xJTUIoMCksIHNwW2ldLCBzaGlmdCk7CisgIHJldHVybiByZXQ7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2xzaGlmdCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCB1bnNpZ25lZCBzaGlmdCkKK3sKKyAgbXBfbGltYl90ICByZXQ7CisgIG1wX3NpemVfdCAgaTsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2hpZ2hfdG9fbG93X3AgKHJwLCBzcCwgc2l6ZSkpOworICBBU1NFUlQgKHNpemUgPj0gMSk7CisgIEFTU0VSVCAoc2hpZnQgPj0gMSAmJiBzaGlmdCA8IEdNUF9OVU1CX0JJVFMpOworICBBU1NFUlRfTVBOIChzcCwgc2l6ZSk7CisKKyAgcmV0ID0gbHNoaWZ0X21ha2UgKENOU1RfTElNQigwKSwgc3Bbc2l6ZS0xXSwgc2hpZnQpOworCisgIGZvciAoaSA9IHNpemUtMjsgaSA+PSAwOyBpLS0pCisgICAgcnBbaSsxXSA9IGxzaGlmdF9tYWtlIChzcFtpKzFdLCBzcFtpXSwgc2hpZnQpOworCisgIHJwW2krMV0gPSBsc2hpZnRfbWFrZSAoc3BbaSsxXSwgQ05TVF9MSU1CKDApLCBzaGlmdCk7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3JlZm1wbl9jb20gKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfc2l6ZV90IGk7CisKKyAgLyogV2Ugd29yayBkb3dud2FyZHMgc2luY2UgbXBuX2xzaGlmdGMgbmVlZHMgdGhhdC4gKi8KKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9oaWdoX3RvX2xvd19wIChycCwgc3AsIHNpemUpKTsKKworICBmb3IgKGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgcnBbaV0gPSAofnNwW2ldKSAmIEdNUF9OVU1CX01BU0s7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2xzaGlmdGMgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgdW5zaWduZWQgc2hpZnQpCit7CisgIG1wX2xpbWJfdCByZXM7CisKKyAgLyogTm8gYXNzZXJ0cyBoZXJlLCByZWZtcG5fbHNoaWZ0IHdpbGwgYXNzZXJ0IHdoYXQgd2UgbmVlZC4gKi8KKworICByZXMgPSByZWZtcG5fbHNoaWZ0IChycCwgc3AsIHNpemUsIHNoaWZ0KTsKKyAgcmVmbXBuX2NvbSAocnAsIHJwLCBzaXplKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyogYWNjZXB0aW5nIHNoaWZ0PT0wIGFuZCBkb2luZyBhIHBsYWluIGNvcHlpIG9yIGNvcHlkIGluIHRoYXQgY2FzZSAqLworbXBfbGltYl90CityZWZtcG5fcnNoaWZ0X29yX2NvcHkgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgdW5zaWduZWQgc2hpZnQpCit7CisgIGlmIChzaGlmdCA9PSAwKQorICAgIHsKKyAgICAgIHJlZm1wbl9jb3B5aSAocnAsIHNwLCBzaXplKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiByZWZtcG5fcnNoaWZ0IChycCwgc3AsIHNpemUsIHNoaWZ0KTsKKyAgICB9Cit9CittcF9saW1iX3QKK3JlZm1wbl9sc2hpZnRfb3JfY29weSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCB1bnNpZ25lZCBzaGlmdCkKK3sKKyAgaWYgKHNoaWZ0ID09IDApCisgICAgeworICAgICAgcmVmbXBuX2NvcHlkIChycCwgc3AsIHNpemUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIHJlZm1wbl9sc2hpZnQgKHJwLCBzcCwgc2l6ZSwgc2hpZnQpOworICAgIH0KK30KKworLyogYWNjZXB0aW5nIHNpemU9PTAgdG9vICovCittcF9saW1iX3QKK3JlZm1wbl9yc2hpZnRfb3JfY29weV9hbnkgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwKKwkJCSAgIHVuc2lnbmVkIHNoaWZ0KQoreworICByZXR1cm4gKHNpemUgPT0gMCA/IDAgOiByZWZtcG5fcnNoaWZ0X29yX2NvcHkgKHJwLCBzcCwgc2l6ZSwgc2hpZnQpKTsKK30KK21wX2xpbWJfdAorcmVmbXBuX2xzaGlmdF9vcl9jb3B5X2FueSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLAorCQkJICAgdW5zaWduZWQgc2hpZnQpCit7CisgIHJldHVybiAoc2l6ZSA9PSAwID8gMCA6IHJlZm1wbl9sc2hpZnRfb3JfY29weSAocnAsIHNwLCBzaXplLCBzaGlmdCkpOworfQorCisvKiBEaXZpZGUgaCxsIGJ5IGQsIHJldHVybiBxdW90aWVudCwgc3RvcmUgcmVtYWluZGVyIHRvICpycC4KKyAgIE9wZXJhdGVzIG9uIGZ1bGwgbGltYnMsIG5vdCBuYWlscy4KKyAgIE11c3QgaGF2ZSBoIDwgZC4KKyAgIF9fdWRpdl9xcm5uZF9jIGlzbid0IHNpbXBsZSwgYW5kIGl0J3MgYSBiaXQgc2xvdywgYnV0IGl0IHdvcmtzLiAqLworbXBfbGltYl90CityZWZtcG5fdWRpdl9xcm5uZCAobXBfbGltYl90ICpycCwgbXBfbGltYl90IGgsIG1wX2xpbWJfdCBsLCBtcF9saW1iX3QgZCkKK3sKKyAgbXBfbGltYl90ICBxLCByOworICBpbnQgIG47CisKKyAgQVNTRVJUIChkICE9IDApOworICBBU1NFUlQgKGggPCBkKTsKKworI2lmIDAKKyAgdWRpdl9xcm5uZCAocSwgciwgaCwgbCwgZCk7CisgICpycCA9IHI7CisgIHJldHVybiBxOworI2VuZGlmCisKKyAgbiA9IHJlZm1wbl9jb3VudF9sZWFkaW5nX3plcm9zIChkKTsKKyAgZCA8PD0gbjsKKworICBpZiAobiAhPSAwKQorICAgIHsKKyAgICAgIGggPSAoaCA8PCBuKSB8IChsID4+IChHTVBfTElNQl9CSVRTIC0gbikpOworICAgICAgbCA8PD0gbjsKKyAgICB9CisKKyAgX191ZGl2X3Fybm5kX2MgKHEsIHIsIGgsIGwsIGQpOworICByID4+PSBuOworICAqcnAgPSByOworICByZXR1cm4gcTsKK30KKworbXBfbGltYl90CityZWZtcG5fdWRpdl9xcm5uZF9yIChtcF9saW1iX3QgaCwgbXBfbGltYl90IGwsIG1wX2xpbWJfdCBkLCBtcF9saW1iX3QgKnJwKQoreworICByZXR1cm4gcmVmbXBuX3VkaXZfcXJubmQgKHJwLCBoLCBsLCBkKTsKK30KKworLyogVGhpcyBsaXR0bGUgc3Vicm91dGluZSBhdm9pZHMgc29tZSBiYWQgY29kZSBnZW5lcmF0aW9uIGZyb20gaTM4NiBnY2MgMy4wCisgICAtZlBJQyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgKCVlYnAgYmVpbmcgdXNlZCB1bmluaXRpYWxpemVkKS4gICovCitzdGF0aWMgbXBfbGltYl90CityZWZtcG5fZGl2bW9kXzFjX3dvcmthcm91bmQgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwKKwkJCSAgICAgbXBfbGltYl90IGRpdmlzb3IsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgbXBfc2l6ZV90ICBpOworICBtcF9saW1iX3QgcmVtWzFdOworICBmb3IgKGkgPSBzaXplLTE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIHJwW2ldID0gcmVmbXBuX3VkaXZfcXJubmQgKHJlbSwgY2FycnksCisJCQkJIHNwW2ldIDw8IEdNUF9OQUlMX0JJVFMsCisJCQkJIGRpdmlzb3IgPDwgR01QX05BSUxfQklUUyk7CisgICAgICBjYXJyeSA9ICpyZW0gPj4gR01QX05BSUxfQklUUzsKKyAgICB9CisgIHJldHVybiBjYXJyeTsKK30KKworbXBfbGltYl90CityZWZtcG5fZGl2bW9kXzFjIChtcF9wdHIgcnAsIG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsCisJCSAgbXBfbGltYl90IGRpdmlzb3IsIG1wX2xpbWJfdCBjYXJyeSkKK3sKKyAgbXBfcHRyICAgICBzcF9vcmlnOworICBtcF9wdHIgICAgIHByb2Q7CisgIG1wX2xpbWJfdCAgY2Fycnlfb3JpZzsKKworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKHJwLCBzcCwgc2l6ZSkpOworICBBU1NFUlQgKHNpemUgPj0gMCk7CisgIEFTU0VSVCAoY2FycnkgPCBkaXZpc29yKTsKKyAgQVNTRVJUX01QTiAoc3AsIHNpemUpOworICBBU1NFUlRfTElNQiAoZGl2aXNvcik7CisgIEFTU0VSVF9MSU1CIChjYXJyeSk7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm4gY2Fycnk7CisKKyAgc3Bfb3JpZyA9IHJlZm1wbl9tZW1kdXBfbGltYnMgKHNwLCBzaXplKTsKKyAgcHJvZCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUpOworICBjYXJyeV9vcmlnID0gY2Fycnk7CisKKyAgY2FycnkgPSByZWZtcG5fZGl2bW9kXzFjX3dvcmthcm91bmQgKHJwLCBzcCwgc2l6ZSwgZGl2aXNvciwgY2FycnkpOworCisgIC8qIGNoZWNrIGJ5IG11bHRpcGx5aW5nIGJhY2sgKi8KKyNpZiAwCisgIHByaW50ZiAoInNpemU9JWxkIGRpdmlzb3I9MHglbFggY2Fycnk9MHglbFggcmVtYWluZGVyPTB4JWxYXG4iLAorCSAgc2l6ZSwgZGl2aXNvciwgY2Fycnlfb3JpZywgY2FycnkpOworICBtcG5fdHJhY2UoInMiLHNwX2NvcHksc2l6ZSk7CisgIG1wbl90cmFjZSgiciIscnAsc2l6ZSk7CisgIHByaW50ZiAoIm11bF8xYyAlbFhcbiIsIHJlZm1wbl9tdWxfMWMgKHByb2QsIHJwLCBzaXplLCBkaXZpc29yLCBjYXJyeSkpOworICBtcG5fdHJhY2UoInAiLHByb2Qsc2l6ZSk7CisjZW5kaWYKKyAgQVNTRVJUIChyZWZtcG5fbXVsXzFjIChwcm9kLCBycCwgc2l6ZSwgZGl2aXNvciwgY2FycnkpID09IGNhcnJ5X29yaWcpOworICBBU1NFUlQgKHJlZm1wbl9jbXAgKHByb2QsIHNwX29yaWcsIHNpemUpID09IDApOworICBmcmVlIChzcF9vcmlnKTsKKyAgZnJlZSAocHJvZCk7CisKKyAgcmV0dXJuIGNhcnJ5OworfQorCittcF9saW1iX3QKK3JlZm1wbl9kaXZtb2RfMSAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgZGl2aXNvcikKK3sKKyAgcmV0dXJuIHJlZm1wbl9kaXZtb2RfMWMgKHJwLCBzcCwgc2l6ZSwgZGl2aXNvciwgQ05TVF9MSU1CKDApKTsKK30KKworCittcF9saW1iX3QKK3JlZm1wbl9tb2RfMWMgKG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBkaXZpc29yLAorCSAgICAgICBtcF9saW1iX3QgY2FycnkpCit7CisgIG1wX3B0ciAgcCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUpOworICBjYXJyeSA9IHJlZm1wbl9kaXZtb2RfMWMgKHAsIHNwLCBzaXplLCBkaXZpc29yLCBjYXJyeSk7CisgIGZyZWUgKHApOworICByZXR1cm4gY2Fycnk7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX21vZF8xIChtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgZGl2aXNvcikKK3sKKyAgcmV0dXJuIHJlZm1wbl9tb2RfMWMgKHNwLCBzaXplLCBkaXZpc29yLCBDTlNUX0xJTUIoMCkpOworfQorCittcF9saW1iX3QKK3JlZm1wbl9wcmVpbnZfbW9kXzEgKG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUsIG1wX2xpbWJfdCBkaXZpc29yLAorCQkgICAgIG1wX2xpbWJfdCBpbnZlcnNlKQoreworICBBU1NFUlQgKGRpdmlzb3IgJiBHTVBfTlVNQl9ISUdIQklUKTsKKyAgQVNTRVJUIChpbnZlcnNlID09IHJlZm1wbl9pbnZlcnRfbGltYiAoZGl2aXNvcikpOworICByZXR1cm4gcmVmbXBuX21vZF8xIChzcCwgc2l6ZSwgZGl2aXNvcik7Cit9CisKKy8qIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBiZSByYXRoZXIgc2xvdywgYnV0IGhhcyB0aGUgYWR2YW50YWdlIG9mIGJlaW5nCisgICBpbiBhIGRpZmZlcmVudCBzdHlsZSB0aGFuIHRoZSBsaWJnbXAgdmVyc2lvbnMuICAqLworbXBfbGltYl90CityZWZtcG5fbW9kXzM0bHN1YjEgKG1wX3NyY3B0ciBwLCBtcF9zaXplX3QgbikKK3sKKyAgQVNTRVJUICgoR01QX05VTUJfQklUUyAlIDQpID09IDApOworICByZXR1cm4gbXBuX21vZF8xIChwLCBuLCAoQ05TVF9MSU1CKDEpIDw8ICgzICogR01QX05VTUJfQklUUyAvIDQpKSAtIDEpOworfQorCisKK21wX2xpbWJfdAorcmVmbXBuX2RpdnJlbV8xYyAobXBfcHRyIHJwLCBtcF9zaXplX3QgeHNpemUsCisJCSAgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRpdmlzb3IsCisJCSAgbXBfbGltYl90IGNhcnJ5KQoreworICBtcF9wdHIgIHo7CisKKyAgeiA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHhzaXplKTsKKyAgcmVmbXBuX2ZpbGwgKHosIHhzaXplLCBDTlNUX0xJTUIoMCkpOworCisgIGNhcnJ5ID0gcmVmbXBuX2Rpdm1vZF8xYyAocnAreHNpemUsIHNwLCBzaXplLCBkaXZpc29yLCBjYXJyeSk7CisgIGNhcnJ5ID0gcmVmbXBuX2Rpdm1vZF8xYyAocnAsIHosIHhzaXplLCBkaXZpc29yLCBjYXJyeSk7CisKKyAgZnJlZSAoeik7CisgIHJldHVybiBjYXJyeTsKK30KKworbXBfbGltYl90CityZWZtcG5fZGl2cmVtXzEgKG1wX3B0ciBycCwgbXBfc2l6ZV90IHhzaXplLAorCQkgbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwgbXBfbGltYl90IGRpdmlzb3IpCit7CisgIHJldHVybiByZWZtcG5fZGl2cmVtXzFjIChycCwgeHNpemUsIHNwLCBzaXplLCBkaXZpc29yLCBDTlNUX0xJTUIoMCkpOworfQorCittcF9saW1iX3QKK3JlZm1wbl9wcmVpbnZfZGl2cmVtXzEgKG1wX3B0ciBycCwgbXBfc2l6ZV90IHhzaXplLAorCQkJbXBfc3JjcHRyIHNwLCBtcF9zaXplX3Qgc2l6ZSwKKwkJCW1wX2xpbWJfdCBkaXZpc29yLCBtcF9saW1iX3QgaW52ZXJzZSwgdW5zaWduZWQgc2hpZnQpCit7CisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgQVNTRVJUIChzaGlmdCA9PSByZWZtcG5fY291bnRfbGVhZGluZ196ZXJvcyAoZGl2aXNvcikpOworICBBU1NFUlQgKGludmVyc2UgPT0gcmVmbXBuX2ludmVydF9saW1iIChkaXZpc29yIDw8IHNoaWZ0KSk7CisKKyAgcmV0dXJuIHJlZm1wbl9kaXZyZW1fMSAocnAsIHhzaXplLCBzcCwgc2l6ZSwgZGl2aXNvcik7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2RpdnJlbV8yIChtcF9wdHIgcXAsIG1wX3NpemVfdCBxeG4sCisJCSBtcF9wdHIgbnAsIG1wX3NpemVfdCBubiwKKwkJIG1wX3NyY3B0ciBkcCkKK3sKKyAgbXBfcHRyIHRwOworICBtcF9saW1iX3QgcWg7CisKKyAgdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzIChubiArIHF4bik7CisgIHJlZm1wbl96ZXJvICh0cCwgcXhuKTsKKyAgcmVmbXBuX2NvcHlpICh0cCArIHF4biwgbnAsIG5uKTsKKyAgcWggPSByZWZtcG5fc2JfZGl2X3FyIChxcCwgdHAsIG5uICsgcXhuLCBkcCwgMik7CisgIHJlZm1wbl9jb3B5aSAobnAsIHRwLCAyKTsKKyAgZnJlZSAodHApOworICByZXR1cm4gcWg7Cit9CisKKy8qIEludmVyc2UgaXMgZmxvb3IoKGIqKGItZCktMSkgLyBkKSwgcGVyIGRpdmlzaW9uIGJ5IGludmFyaWFudCBpbnRlZ2VycworICAgcGFwZXIsIGZpZ3VyZSA4LjEgbScsIHdoZXJlIGI9Ml5HTVBfTElNQl9CSVRTLiAgTm90ZSB0aGF0IC1kLTEgPCBkCisgICBzaW5jZSBkIGhhcyB0aGUgaGlnaCBiaXQgc2V0LiAqLworCittcF9saW1iX3QKK3JlZm1wbl9pbnZlcnRfbGltYiAobXBfbGltYl90IGQpCit7CisgIG1wX2xpbWJfdCByOworICBBU1NFUlQgKGQgJiBHTVBfTElNQl9ISUdIQklUKTsKKyAgcmV0dXJuIHJlZm1wbl91ZGl2X3Fybm5kICgmciwgLWQtMSwgTVBfTElNQl9UX01BWCwgZCk7Cit9CisKK3ZvaWQKK3JlZm1wbl9pbnZlcnQgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgbiwgbXBfcHRyIHNjcmF0Y2gpCit7CisgIG1wX3B0ciBxcCwgdHA7CisgIFRNUF9ERUNMOworICBUTVBfTUFSSzsKKworICB0cCA9IFRNUF9BTExPQ19MSU1CUyAoMiAqIG4pOworICBxcCA9IFRNUF9BTExPQ19MSU1CUyAobiArIDEpOworCisgIE1QTl9aRVJPICh0cCwgMiAqIG4pOyAgbXBuX3N1Yl8xICh0cCwgdHAsIDIgKiBuLCAxKTsKKworICByZWZtcG5fdGRpdl9xciAocXAsIHJwLCAwLCB0cCwgMiAqIG4sIHVwLCBuKTsKKyAgcmVmbXBuX2NvcHlpIChycCwgcXAsIG4pOworCisgIFRNUF9GUkVFOworfQorCit2b2lkCityZWZtcG5fYmludmVydCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCBuLCBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgbXBfcHRyIHRwOworICBtcF9saW1iX3QgYmludjsKKyAgVE1QX0RFQ0w7CisgIFRNUF9NQVJLOworCisgIC8qIFdlIHVzZSB0aGUgbGlicmFyeSBtcG5fc2JwaTFfYmRpdl9xIGhlcmUsIHdoaWNoIGlzbid0IGtvc2hlciBpbiB0ZXN0aW5nCisgICAgIGNvZGUuICBUbyBtYWtlIHVwIGZvciBpdCwgd2UgY2hlY2sgdGhhdCB0aGUgaW52ZXJzZSBpcyBjb3JyZWN0IHVzaW5nIGEKKyAgICAgbXVsdGlwbHkuICAqLworCisgIHRwID0gVE1QX0FMTE9DX0xJTUJTICgyICogbik7CisKKyAgTVBOX1pFUk8gKHRwLCBuKTsKKyAgdHBbMF0gPSAxOworICBiaW52ZXJ0X2xpbWIgKGJpbnYsIHVwWzBdKTsKKyAgbXBuX3NicGkxX2JkaXZfcSAocnAsIHRwLCBuLCB1cCwgbiwgLWJpbnYpOworCisgIHJlZm1wbl9tdWxfbiAodHAsIHJwLCB1cCwgbik7CisgIEFTU0VSVF9BTFdBWVMgKHRwWzBdID09IDEgJiYgbXBuX3plcm9fcCAodHAgKyAxLCBuIC0gMSkpOworCisgIFRNUF9GUkVFOworfQorCisvKiBUaGUgYWltIGlzIHRvIHByb2R1Y2UgYSBkc3QgcXVvdGllbnQgYW5kIHJldHVybiBhIHJlbWFpbmRlciBjLCBzYXRpc2Z5aW5nCisgICBjKmJebiArIHNyYy1pID09IDMqZHN0LCB3aGVyZSBpIGlzIHRoZSBpbmNvbWluZyBjYXJyeS4KKworICAgU29tZSB2YWx1ZSBjPT0wLCBjPT0xIG9yIGM9PTIgd2lsbCBzYXRpc2Z5LCBzbyBqdXN0IHRyeSBlYWNoLgorCisgICBJZiBHTVBfTlVNQl9CSVRTIGlzIGV2ZW4gdGhlbiAyXkdNUF9OVU1CX0JJVFM9PTFtb2QzIGFuZCBhIG5vbi16ZXJvCisgICByZW1haW5kZXIgZnJvbSB0aGUgZmlyc3QgZGl2aXNpb24gYXR0ZW1wdCBkZXRlcm1pbmVzIHRoZSBjb3JyZWN0CisgICByZW1haW5kZXIgKDMtYyksIGJ1dCBkb24ndCBib3RoZXIgd2l0aCB0aGF0LCBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUKKyAgIGFueXRoaW5nIGFib3V0IEdNUF9OVU1CX0JJVFMgd2hlbiB1c2luZyBuYWlscy4KKworICAgSWYgdGhlIGluaXRpYWwgc3JjLWkgcHJvZHVjZXMgYSBib3Jyb3cgdGhlbiByZWZtcG5fc3ViXzEgbGVhdmVzIGEgdHdvcworICAgY29tcGxlbWVudCBuZWdhdGl2ZSwgaWUuIGJebithLWksIGFuZCB0aGUgY2FsY3VsYXRpb24gcHJvZHVjZXMgYzEKKyAgIHNhdGlzZnlpbmcgYzEqYl5uICsgYl5uK3NyYy1pID09IDMqZHN0LCBmcm9tIHdoaWNoIGNsZWFybHkgYz1jMSsxLiAgVGhpcworICAgbWVhbnMgaXQncyBlbm91Z2ggdG8ganVzdCBhZGQgYW55IGJvcnJvdyBiYWNrIGF0IHRoZSBlbmQuCisKKyAgIEEgYm9ycm93IG9ubHkgb2NjdXJzIHdoZW4gYT09MCBvciBhPT0xLCBhbmQsIGJ5IHRoZSBzYW1lIHJlYXNvbmluZyBhcyBpbgorICAgbXBuL2dlbmVyaWMvZGl2ZWJ5My5jLCB0aGUgYzEgdGhhdCByZXN1bHRzIGluIHRob3NlIGNhc2VzIHdpbGwgb25seSBiZSAwCisgICBvciAxIHJlc3BlY3RpdmVseSwgc28gd2l0aCAxIGFkZGVkIHRoZSBmaW5hbCByZXR1cm4gdmFsdWUgaXMgc3RpbGwgaW4gdGhlCisgICBwcmVzY3JpYmVkIHJhbmdlIDAgdG8gMi4gKi8KKworbXBfbGltYl90CityZWZtcG5fZGl2ZXhhY3RfYnkzYyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplLCBtcF9saW1iX3QgY2FycnkpCit7CisgIG1wX3B0ciAgICAgc3Bjb3B5OworICBtcF9saW1iX3QgIGMsIGNzOworCisgIEFTU0VSVCAocmVmbXBuX292ZXJsYXBfZnVsbG9ubHlfcCAocnAsIHNwLCBzaXplKSk7CisgIEFTU0VSVCAoc2l6ZSA+PSAxKTsKKyAgQVNTRVJUIChjYXJyeSA8PSAyKTsKKyAgQVNTRVJUX01QTiAoc3AsIHNpemUpOworCisgIHNwY29weSA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHNpemUpOworICBjcyA9IHJlZm1wbl9zdWJfMSAoc3Bjb3B5LCBzcCwgc2l6ZSwgY2FycnkpOworCisgIGZvciAoYyA9IDA7IGMgPD0gMjsgYysrKQorICAgIGlmIChyZWZtcG5fZGl2bW9kXzFjIChycCwgc3Bjb3B5LCBzaXplLCBDTlNUX0xJTUIoMyksIGMpID09IDApCisgICAgICBnb3RvIGRvbmU7CisgIEFTU0VSVF9GQUlMIChubyB2YWx1ZSBvZiBjIHNhdGlzZmllcyk7CisKKyBkb25lOgorICBjICs9IGNzOworICBBU1NFUlQgKGMgPD0gMik7CisKKyAgZnJlZSAoc3Bjb3B5KTsKKyAgcmV0dXJuIGM7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2RpdmV4YWN0X2J5MyAobXBfcHRyIHJwLCBtcF9zcmNwdHIgc3AsIG1wX3NpemVfdCBzaXplKQoreworICByZXR1cm4gcmVmbXBuX2RpdmV4YWN0X2J5M2MgKHJwLCBzcCwgc2l6ZSwgQ05TVF9MSU1CKDApKTsKK30KKworCisvKiBUaGUgc2FtZSBhcyBtcG4vZ2VuZXJpYy9tdWxfYmFzZWNhc2UuYywgYnV0IHVzaW5nIHJlZm1wbiBmdW5jdGlvbnMuICovCit2b2lkCityZWZtcG5fbXVsX2Jhc2VjYXNlIChtcF9wdHIgcHJvZHAsCisJCSAgICAgbXBfc3JjcHRyIHVwLCBtcF9zaXplX3QgdXNpemUsCisJCSAgICAgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3QgdnNpemUpCit7CisgIG1wX3NpemVfdCBpOworCisgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChwcm9kcCwgdXNpemUrdnNpemUsIHVwLCB1c2l6ZSkpOworICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAocHJvZHAsIHVzaXplK3ZzaXplLCB2cCwgdnNpemUpKTsKKyAgQVNTRVJUICh1c2l6ZSA+PSB2c2l6ZSk7CisgIEFTU0VSVCAodnNpemUgPj0gMSk7CisgIEFTU0VSVF9NUE4gKHVwLCB1c2l6ZSk7CisgIEFTU0VSVF9NUE4gKHZwLCB2c2l6ZSk7CisKKyAgcHJvZHBbdXNpemVdID0gcmVmbXBuX211bF8xIChwcm9kcCwgdXAsIHVzaXplLCB2cFswXSk7CisgIGZvciAoaSA9IDE7IGkgPCB2c2l6ZTsgaSsrKQorICAgIHByb2RwW3VzaXplK2ldID0gcmVmbXBuX2FkZG11bF8xIChwcm9kcCtpLCB1cCwgdXNpemUsIHZwW2ldKTsKK30KKworCisvKiBUaGUgc2FtZSBhcyBtcG4vZ2VuZXJpYy9tdWxtaWRfYmFzZWNhc2UuYywgYnV0IHVzaW5nIHJlZm1wbiBmdW5jdGlvbnMuICovCit2b2lkCityZWZtcG5fbXVsbWlkX2Jhc2VjYXNlIChtcF9wdHIgcnAsCisJCQltcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwKKwkJCW1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IHZuKQoreworICBtcF9saW1iX3QgY3k7CisgIG1wX3NpemVfdCBpOworCisgIEFTU0VSVCAodW4gPj0gdm4pOworICBBU1NFUlQgKHZuID49IDEpOworICBBU1NFUlQgKCEgcmVmbXBuX292ZXJsYXBfcCAocnAsIHVuIC0gdm4gKyAzLCB1cCwgdW4pKTsKKyAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHJwLCB1biAtIHZuICsgMywgdnAsIHZuKSk7CisgIEFTU0VSVF9NUE4gKHVwLCB1bik7CisgIEFTU0VSVF9NUE4gKHZwLCB2bik7CisKKyAgcnBbdW4gLSB2biArIDFdID0gcmVmbXBuX211bF8xIChycCwgdXAgKyB2biAtIDEsIHVuIC0gdm4gKyAxLCB2cFswXSk7CisgIHJwW3VuIC0gdm4gKyAyXSA9IENOU1RfTElNQiAoMCk7CisgIGZvciAoaSA9IDE7IGkgPCB2bjsgaSsrKQorICAgIHsKKyAgICAgIGN5ID0gcmVmbXBuX2FkZG11bF8xIChycCwgdXAgKyB2biAtIGkgLSAxLCB1biAtIHZuICsgMSwgdnBbaV0pOworICAgICAgY3kgPSByZWZfYWRkY19saW1iICgmcnBbdW4gLSB2biArIDFdLCBycFt1biAtIHZuICsgMV0sIGN5KTsKKyAgICAgIGN5ID0gcmVmX2FkZGNfbGltYiAoJnJwW3VuIC0gdm4gKyAyXSwgcnBbdW4gLSB2biArIDJdLCBjeSk7CisgICAgICBBU1NFUlQgKGN5ID09IDApOworICAgIH0KK30KKwordm9pZAorcmVmbXBuX3Rvb200Ml9tdWxtaWQgKG1wX3B0ciBycCwgbXBfc3JjcHRyIHVwLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCBuLAorCQkgICAgICBtcF9wdHIgc2NyYXRjaCkKK3sKKyAgcmVmbXBuX211bG1pZF9iYXNlY2FzZSAocnAsIHVwLCAyKm4gLSAxLCB2cCwgbik7Cit9CisKK3ZvaWQKK3JlZm1wbl9tdWxtaWRfbiAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NyY3B0ciB2cCwgbXBfc2l6ZV90IG4pCit7CisgIC8qIEZJWE1FOiB0aGlzIGNvdWxkIGJlIG1hZGUgZmFzdGVyIGJ5IHVzaW5nIHJlZm1wbl9tdWwgYW5kIHRoZW4gc3VidHJhY3RpbmcKKyAgICAgb2ZmIHByb2R1Y3RzIG5lYXIgdGhlIG1pZGRsZSBwcm9kdWN0IHJlZ2lvbiBib3VuZGFyeSAqLworICByZWZtcG5fbXVsbWlkX2Jhc2VjYXNlIChycCwgdXAsIDIqbiAtIDEsIHZwLCBuKTsKK30KKwordm9pZAorcmVmbXBuX211bG1pZCAobXBfcHRyIHJwLCBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1biwKKwkgICAgICAgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3Qgdm4pCit7CisgIC8qIEZJWE1FOiB0aGlzIGNvdWxkIGJlIG1hZGUgZmFzdGVyIGJ5IHVzaW5nIHJlZm1wbl9tdWwgYW5kIHRoZW4gc3VidHJhY3RpbmcKKyAgICAgb2ZmIHByb2R1Y3RzIG5lYXIgdGhlIG1pZGRsZSBwcm9kdWN0IHJlZ2lvbiBib3VuZGFyeSAqLworICByZWZtcG5fbXVsbWlkX2Jhc2VjYXNlIChycCwgdXAsIHVuLCB2cCwgdm4pOworfQorCisKKworI2RlZmluZSBUT09NM19USFJFU0hPTEQgKE1BWCAoTVVMX1RPT00zM19USFJFU0hPTEQsIFNRUl9UT09NM19USFJFU0hPTEQpKQorI2RlZmluZSBUT09NNF9USFJFU0hPTEQgKE1BWCAoTVVMX1RPT000NF9USFJFU0hPTEQsIFNRUl9UT09NNF9USFJFU0hPTEQpKQorI2RlZmluZSBUT09NNl9USFJFU0hPTEQgKE1BWCAoTVVMX1RPT002SF9USFJFU0hPTEQsIFNRUl9UT09NNl9USFJFU0hPTEQpKQorI2lmIFdBTlRfRkZUCisjZGVmaW5lIEZGVF9USFJFU0hPTEQgKE1BWCAoTVVMX0ZGVF9USFJFU0hPTEQsIFNRUl9GRlRfVEhSRVNIT0xEKSkKKyNlbHNlCisjZGVmaW5lIEZGVF9USFJFU0hPTEQgTVBfU0laRV9UX01BWCAvKiBkb24ndCB1c2UgdG9vbTQ0IGhlcmUgKi8KKyNlbmRpZgorCit2b2lkCityZWZtcG5fbXVsIChtcF9wdHIgd3AsIG1wX3NyY3B0ciB1cCwgbXBfc2l6ZV90IHVuLCBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCB2bikKK3sKKyAgbXBfcHRyIHRwLCBycDsKKyAgbXBfc2l6ZV90IHRuOworCisgIGlmICh2biA8IFRPT00zX1RIUkVTSE9MRCkKKyAgICB7CisgICAgICAvKiBJbiB0aGUgbXBuX211bF9iYXNlY2FzZSBhbmQgdG9vbTIgcmFuZ2VzLCB1c2Ugb3VyIG93biBtdWxfYmFzZWNhc2UuICovCisgICAgICBpZiAodm4gIT0gMCkKKwlyZWZtcG5fbXVsX2Jhc2VjYXNlICh3cCwgdXAsIHVuLCB2cCwgdm4pOworICAgICAgZWxzZQorCU1QTl9aRVJPICh3cCwgdW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBNUE5fWkVSTyAod3AsIHZuKTsKKyAgcnAgPSByZWZtcG5fbWFsbG9jX2xpbWJzICgyICogdm4pOworCisgIGlmICh2biA8IFRPT000X1RIUkVTSE9MRCkKKyAgICB0biA9IG1wbl90b29tMjJfbXVsX2l0Y2ggKHZuLCB2bik7CisgIGVsc2UgaWYgKHZuIDwgVE9PTTZfVEhSRVNIT0xEKQorICAgIHRuID0gbXBuX3Rvb20zM19tdWxfaXRjaCAodm4sIHZuKTsKKyAgZWxzZSBpZiAodm4gPCBGRlRfVEhSRVNIT0xEKQorICAgIHRuID0gbXBuX3Rvb200NF9tdWxfaXRjaCAodm4sIHZuKTsKKyAgZWxzZQorICAgIHRuID0gbXBuX3Rvb202aF9tdWxfaXRjaCAodm4sIHZuKTsKKyAgdHAgPSByZWZtcG5fbWFsbG9jX2xpbWJzICh0bik7CisKKyAgd2hpbGUgKHVuID49IHZuKQorICAgIHsKKyAgICAgIGlmICh2biA8IFRPT000X1RIUkVTSE9MRCkKKwkvKiBJbiB0aGUgdG9vbTMgcmFuZ2UsIHVzZSBtcG5fdG9vbTIyX211bC4gICovCisJbXBuX3Rvb20yMl9tdWwgKHJwLCB1cCwgdm4sIHZwLCB2biwgdHApOworICAgICAgZWxzZSBpZiAodm4gPCBUT09NNl9USFJFU0hPTEQpCisJLyogSW4gdGhlIHRvb200IHJhbmdlLCB1c2UgbXBuX3Rvb20zM19tdWwuICAqLworCW1wbl90b29tMzNfbXVsIChycCwgdXAsIHZuLCB2cCwgdm4sIHRwKTsKKyAgICAgIGVsc2UgaWYgKHZuIDwgRkZUX1RIUkVTSE9MRCkKKwkvKiBJbiB0aGUgdG9vbTYgcmFuZ2UsIHVzZSBtcG5fdG9vbTQ0X211bC4gICovCisJbXBuX3Rvb200NF9tdWwgKHJwLCB1cCwgdm4sIHZwLCB2biwgdHApOworICAgICAgZWxzZQorCS8qIEZvciB0aGUgbGFyZ2VzdCBvcGVyYW5kcywgdXNlIG1wbl90b29tNmhfbXVsLiAgKi8KKwltcG5fdG9vbTZoX211bCAocnAsIHVwLCB2biwgdnAsIHZuLCB0cCk7CisKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChyZWZtcG5fYWRkICh3cCwgcnAsIDIgKiB2biwgd3AsIHZuKSk7CisgICAgICB3cCArPSB2bjsKKworICAgICAgdXAgKz0gdm47CisgICAgICB1biAtPSB2bjsKKyAgICB9CisKKyAgZnJlZSAodHApOworCisgIGlmICh1biAhPSAwKQorICAgIHsKKyAgICAgIHJlZm1wbl9tdWwgKHJwLCB2cCwgdm4sIHVwLCB1bik7CisgICAgICBBU1NFUlRfTk9DQVJSWSAocmVmbXBuX2FkZCAod3AsIHJwLCB1biArIHZuLCB3cCwgdm4pKTsKKyAgICB9CisgIGZyZWUgKHJwKTsKK30KKwordm9pZAorcmVmbXBuX211bF9uIChtcF9wdHIgcHJvZHAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmVmbXBuX211bCAocHJvZHAsIHVwLCBzaXplLCB2cCwgc2l6ZSk7Cit9CisKK3ZvaWQKK3JlZm1wbl9tdWxsb19uIChtcF9wdHIgcHJvZHAsIG1wX3NyY3B0ciB1cCwgbXBfc3JjcHRyIHZwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyIHRwID0gcmVmbXBuX21hbGxvY19saW1icyAoMipzaXplKTsKKyAgcmVmbXBuX211bCAodHAsIHVwLCBzaXplLCB2cCwgc2l6ZSk7CisgIHJlZm1wbl9jb3B5aSAocHJvZHAsIHRwLCBzaXplKTsKKyAgZnJlZSAodHApOworfQorCit2b2lkCityZWZtcG5fc3FyIChtcF9wdHIgZHN0LCBtcF9zcmNwdHIgc3JjLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgcmVmbXBuX211bCAoZHN0LCBzcmMsIHNpemUsIHNyYywgc2l6ZSk7Cit9CisKK3ZvaWQKK3JlZm1wbl9zcXJsbyAobXBfcHRyIGRzdCwgbXBfc3JjcHRyIHNyYywgbXBfc2l6ZV90IHNpemUpCit7CisgIHJlZm1wbl9tdWxsb19uIChkc3QsIHNyYywgc3JjLCBzaXplKTsKK30KKworLyogQWxsb3dpbmcgdXNpemU8dnNpemUsIHVzaXplPT0wIG9yIHZzaXplPT0wLiAqLwordm9pZAorcmVmbXBuX211bF9hbnkgKG1wX3B0ciBwcm9kcCwKKwkJICAgICBtcF9zcmNwdHIgdXAsIG1wX3NpemVfdCB1c2l6ZSwKKwkJICAgICBtcF9zcmNwdHIgdnAsIG1wX3NpemVfdCB2c2l6ZSkKK3sKKyAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHByb2RwLCB1c2l6ZSt2c2l6ZSwgdXAsIHVzaXplKSk7CisgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wIChwcm9kcCwgdXNpemUrdnNpemUsIHZwLCB2c2l6ZSkpOworICBBU1NFUlQgKHVzaXplID49IDApOworICBBU1NFUlQgKHZzaXplID49IDApOworICBBU1NFUlRfTVBOICh1cCwgdXNpemUpOworICBBU1NFUlRfTVBOICh2cCwgdnNpemUpOworCisgIGlmICh1c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHJlZm1wbl9maWxsIChwcm9kcCwgdnNpemUsIENOU1RfTElNQigwKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh2c2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHJlZm1wbl9maWxsIChwcm9kcCwgdXNpemUsIENOU1RfTElNQigwKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICh1c2l6ZSA+PSB2c2l6ZSkKKyAgICByZWZtcG5fbXVsIChwcm9kcCwgdXAsIHVzaXplLCB2cCwgdnNpemUpOworICBlbHNlCisgICAgcmVmbXBuX211bCAocHJvZHAsIHZwLCB2c2l6ZSwgdXAsIHVzaXplKTsKK30KKworCittcF9saW1iX3QKK3JlZm1wbl9nY2RfMTEgKG1wX2xpbWJfdCB4LCBtcF9saW1iX3QgeSkKK3sKKyAgLyogVGhlIG5vbi1yZWYgZnVuY3Rpb24gYWxzbyByZXF1aXJlcyBpbnB1dCBvcGVyYW5kcyB0byBiZSBvZGQsIGJ1dAorICAgICBiZWxvdyByZWZtcG5fZ2NkXzEgZG9lc24ndCBndWFyYW50ZWUgdGhhdC4gKi8KKyAgQVNTRVJUICh4ID4gMCk7CisgIEFTU0VSVCAoeSA+IDApOworICBkbworICAgIHsKKyAgICAgIHdoaWxlICgoeCAmIDEpID09IDApICB4ID4+PSAxOworICAgICAgd2hpbGUgKCh5ICYgMSkgPT0gMCkgIHkgPj49IDE7CisKKyAgICAgIGlmICh4IDwgeSkKKwlNUF9MSU1CX1RfU1dBUCAoeCwgeSk7CisKKyAgICAgIHggLT0geTsKKyAgICB9CisgIHdoaWxlICh4ICE9IDApOworCisgIHJldHVybiB5OworfQorCittcF9kb3VibGVfbGltYl90CityZWZtcG5fZ2NkXzIyIChtcF9saW1iX3QgeDEsIG1wX2xpbWJfdCB4MCwgbXBfbGltYl90IHkxLCBtcF9saW1iX3QgeTApCit7CisgIEFTU0VSVCAoKHgwICYgMSkgIT0gMCk7CisgIEFTU0VSVCAoKHkwICYgMSkgIT0gMCk7CisgIG1wX2RvdWJsZV9saW1iX3QgZzsKKyAgbXBfbGltYl90IGN5OworCisgIGRvCisgICAgeworICAgICAgd2hpbGUgKCh4MCAmIDEpID09IDApCisJeworCSAgeDAgPSAoeDEgPDwgKEdNUF9OVU1CX0JJVFMgLSAxKSkgfCAoeDAgPj4gMSk7CisJICB4MSA+Pj0gMTsKKwl9CisgICAgICB3aGlsZSAoKHkwICYgMSkgPT0gMCkKKwl7CisJICB5MCA9ICh5MSA8PCAoR01QX05VTUJfQklUUyAtIDEpKSB8ICh5MCA+PiAxKTsKKwkgIHkxID4+PSAxOworCX0KKworCisgICAgICBpZiAoeDEgPCB5MSB8fCAoeDEgPT0geTEgJiYgeDAgPCB5MCkpCisJeworCSAgbXBfbGltYl90IHQ7CisJICB0ID0geDE7IHgxID0geTE7IHkxID0gdDsKKwkgIHQgPSB4MDsgeDAgPSB5MDsgeTAgPSB0OworCX0KKworICAgICAgY3kgPSAoeDAgPCB5MCk7CisgICAgICB4MCAtPSB5MDsKKyAgICAgIHgxIC09IHkxICsgY3k7CisgICAgfQorICB3aGlsZSAoKHgxIHwgeDApICE9IDApOworCisgIGcuZDEgPSB5MTsKKyAgZy5kMCA9IHkwOworICByZXR1cm4gZzsKK30KKworbXBfbGltYl90CityZWZtcG5fZ2NkXzEgKG1wX3NyY3B0ciB4cCwgbXBfc2l6ZV90IHhzaXplLCBtcF9saW1iX3QgeSkKK3sKKyAgbXBfbGltYl90ICB4OworICBpbnQgIHR3b3M7CisKKyAgQVNTRVJUICh5ICE9IDApOworICBBU1NFUlQgKCEgcmVmbXBuX3plcm9fcCAoeHAsIHhzaXplKSk7CisgIEFTU0VSVF9NUE4gKHhwLCB4c2l6ZSk7CisgIEFTU0VSVF9MSU1CICh5KTsKKworICB4ID0gcmVmbXBuX21vZF8xICh4cCwgeHNpemUsIHkpOworICBpZiAoeCA9PSAwKQorICAgIHJldHVybiB5OworCisgIHR3b3MgPSAwOworICB3aGlsZSAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkKKyAgICB7CisgICAgICB4ID4+PSAxOworICAgICAgeSA+Pj0gMTsKKyAgICAgIHR3b3MrKzsKKyAgICB9CisKKyAgcmV0dXJuIHJlZm1wbl9nY2RfMTEgKHgsIHkpIDw8IHR3b3M7Cit9CisKKworLyogQmFzZWQgb24gdGhlIGZ1bGwgbGltYiB4LCBub3QgbmFpbHMuICovCit1bnNpZ25lZAorcmVmbXBuX2NvdW50X2xlYWRpbmdfemVyb3MgKG1wX2xpbWJfdCB4KQoreworICB1bnNpZ25lZCAgbiA9IDA7CisKKyAgQVNTRVJUICh4ICE9IDApOworCisgIHdoaWxlICgoeCAmIEdNUF9MSU1CX0hJR0hCSVQpID09IDApCisgICAgeworICAgICAgeCA8PD0gMTsKKyAgICAgIG4rKzsKKyAgICB9CisgIHJldHVybiBuOworfQorCisvKiBGdWxsIGxpbWJzIGFsbG93ZWQsIG5vdCBsaW1pdGVkIHRvIG5haWxzLiAqLwordW5zaWduZWQKK3JlZm1wbl9jb3VudF90cmFpbGluZ196ZXJvcyAobXBfbGltYl90IHgpCit7CisgIHVuc2lnbmVkICBuID0gMDsKKworICBBU1NFUlQgKHggIT0gMCk7CisgIEFTU0VSVF9MSU1CICh4KTsKKworICB3aGlsZSAoKHggJiAxKSA9PSAwKQorICAgIHsKKyAgICAgIHggPj49IDE7CisgICAgICBuKys7CisgICAgfQorICByZXR1cm4gbjsKK30KKworLyogU3RyaXAgZmFjdG9ycyBvZiB0d28gKGxvdyB6ZXJvIGJpdHMpIGZyb20ge3Asc2l6ZX0gYnkgcmlnaHQgc2hpZnRpbmcuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdHdvcyBzdHJpcHBlZC4gICovCittcF9zaXplX3QKK3JlZm1wbl9zdHJpcF90d29zIChtcF9wdHIgcCwgbXBfc2l6ZV90IHNpemUpCit7CisgIG1wX3NpemVfdCAgbGltYnM7CisgIHVuc2lnbmVkICAgc2hpZnQ7CisKKyAgQVNTRVJUIChzaXplID49IDEpOworICBBU1NFUlQgKCEgcmVmbXBuX3plcm9fcCAocCwgc2l6ZSkpOworICBBU1NFUlRfTVBOIChwLCBzaXplKTsKKworICBmb3IgKGxpbWJzID0gMDsgcFswXSA9PSAwOyBsaW1icysrKQorICAgIHsKKyAgICAgIHJlZm1wbl9jb3B5aSAocCwgcCsxLCBzaXplLTEpOworICAgICAgcFtzaXplLTFdID0gMDsKKyAgICB9CisKKyAgc2hpZnQgPSByZWZtcG5fY291bnRfdHJhaWxpbmdfemVyb3MgKHBbMF0pOworICBpZiAoc2hpZnQpCisgICAgcmVmbXBuX3JzaGlmdCAocCwgcCwgc2l6ZSwgc2hpZnQpOworCisgIHJldHVybiBsaW1icypHTVBfTlVNQl9CSVRTICsgc2hpZnQ7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX2djZCAobXBfcHRyIGdwLCBtcF9wdHIgeHAsIG1wX3NpemVfdCB4c2l6ZSwgbXBfcHRyIHlwLCBtcF9zaXplX3QgeXNpemUpCit7CisgIGludCAgICAgICBjbXA7CisKKyAgQVNTRVJUICh5c2l6ZSA+PSAxKTsKKyAgQVNTRVJUICh4c2l6ZSA+PSB5c2l6ZSk7CisgIEFTU0VSVCAoKHhwWzBdICYgMSkgIT0gMCk7CisgIEFTU0VSVCAoKHlwWzBdICYgMSkgIT0gMCk7CisgIC8qIEFTU0VSVCAoeHBbeHNpemUtMV0gIT0gMCk7ICovICAvKiBkb24ndCB0aGluayB4IG5lZWRzIHRvIGJlIG9kZCAqLworICBBU1NFUlQgKHlwW3lzaXplLTFdICE9IDApOworICBBU1NFUlQgKHJlZm1wbl9vdmVybGFwX2Z1bGxvbmx5X3AgKGdwLCB4cCwgeHNpemUpKTsKKyAgQVNTRVJUIChyZWZtcG5fb3ZlcmxhcF9mdWxsb25seV9wIChncCwgeXAsIHlzaXplKSk7CisgIEFTU0VSVCAoISByZWZtcG5fb3ZlcmxhcF9wICh4cCwgeHNpemUsIHlwLCB5c2l6ZSkpOworICBpZiAoeHNpemUgPT0geXNpemUpCisgICAgQVNTRVJUIChyZWZtcG5fbXNib25lICh4cFt4c2l6ZS0xXSkgPj0gcmVmbXBuX21zYm9uZSAoeXBbeXNpemUtMV0pKTsKKyAgQVNTRVJUX01QTiAoeHAsIHhzaXplKTsKKyAgQVNTRVJUX01QTiAoeXAsIHlzaXplKTsKKworICByZWZtcG5fc3RyaXBfdHdvcyAoeHAsIHhzaXplKTsKKyAgTVBOX05PUk1BTElaRSAoeHAsIHhzaXplKTsKKyAgTVBOX05PUk1BTElaRSAoeXAsIHlzaXplKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGNtcCA9IHJlZm1wbl9jbXBfdHdvc2l6ZXMgKHhwLCB4c2l6ZSwgeXAsIHlzaXplKTsKKyAgICAgIGlmIChjbXAgPT0gMCkKKwlicmVhazsKKyAgICAgIGlmIChjbXAgPCAwKQorCU1QTl9QVFJfU1dBUCAoeHAseHNpemUsIHlwLHlzaXplKTsKKworICAgICAgQVNTRVJUX05PQ0FSUlkgKHJlZm1wbl9zdWIgKHhwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSkpOworCisgICAgICByZWZtcG5fc3RyaXBfdHdvcyAoeHAsIHhzaXplKTsKKyAgICAgIE1QTl9OT1JNQUxJWkUgKHhwLCB4c2l6ZSk7CisgICAgfQorCisgIHJlZm1wbl9jb3B5aSAoZ3AsIHhwLCB4c2l6ZSk7CisgIHJldHVybiB4c2l6ZTsKK30KKwordW5zaWduZWQgbG9uZworcmVmX3BvcGNfbGltYiAobXBfbGltYl90IHNyYykKK3sKKyAgdW5zaWduZWQgbG9uZyAgY291bnQ7CisgIGludCAgaTsKKworICBjb3VudCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBHTVBfTElNQl9CSVRTOyBpKyspCisgICAgeworICAgICAgY291bnQgKz0gKHNyYyAmIDEpOworICAgICAgc3JjID4+PSAxOworICAgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCit1bnNpZ25lZCBsb25nCityZWZtcG5fcG9wY291bnQgKG1wX3NyY3B0ciBzcCwgbXBfc2l6ZV90IHNpemUpCit7CisgIHVuc2lnbmVkIGxvbmcgIGNvdW50ID0gMDsKKyAgbXBfc2l6ZV90ICBpOworCisgIEFTU0VSVCAoc2l6ZSA+PSAwKTsKKyAgQVNTRVJUX01QTiAoc3AsIHNpemUpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgY291bnQgKz0gcmVmX3BvcGNfbGltYiAoc3BbaV0pOworICByZXR1cm4gY291bnQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcKK3JlZm1wbl9oYW1kaXN0IChtcF9zcmNwdHIgczFwLCBtcF9zcmNwdHIgczJwLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgbXBfcHRyICBkOworICB1bnNpZ25lZCBsb25nICBjb3VudDsKKworICBBU1NFUlQgKHNpemUgPj0gMCk7CisgIEFTU0VSVF9NUE4gKHMxcCwgc2l6ZSk7CisgIEFTU0VSVF9NUE4gKHMycCwgc2l6ZSk7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBkID0gcmVmbXBuX21hbGxvY19saW1icyAoc2l6ZSk7CisgIHJlZm1wbl94b3JfbiAoZCwgczFwLCBzMnAsIHNpemUpOworICBjb3VudCA9IHJlZm1wbl9wb3Bjb3VudCAoZCwgc2l6ZSk7CisgIGZyZWUgKGQpOworICByZXR1cm4gY291bnQ7Cit9CisKKworLyogc2V0IHIgdG8gYSVkICovCit2b2lkCityZWZtcG5fbW9kMiAobXBfbGltYl90IHJbMl0sIGNvbnN0IG1wX2xpbWJfdCBhWzJdLCBjb25zdCBtcF9saW1iX3QgZFsyXSkKK3sKKyAgbXBfbGltYl90ICBEWzJdOworICBpbnQgICAgICAgIG47CisKKyAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHIsIChtcF9zaXplX3QpIDIsIGQsIChtcF9zaXplX3QpIDIpKTsKKyAgQVNTRVJUX01QTiAoYSwgMik7CisgIEFTU0VSVF9NUE4gKGQsIDIpOworCisgIERbMV0gPSBkWzFdLCBEWzBdID0gZFswXTsKKyAgclsxXSA9IGFbMV0sIHJbMF0gPSBhWzBdOworICBuID0gMDsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChEWzFdICYgR01QX05VTUJfSElHSEJJVCkKKwlicmVhazsKKyAgICAgIGlmIChyZWZtcG5fY21wIChyLCBELCAobXBfc2l6ZV90KSAyKSA8PSAwKQorCWJyZWFrOworICAgICAgcmVmbXBuX2xzaGlmdCAoRCwgRCwgKG1wX3NpemVfdCkgMiwgMSk7CisgICAgICBuKys7CisgICAgICBBU1NFUlQgKG4gPD0gR01QX05VTUJfQklUUyk7CisgICAgfQorCisgIHdoaWxlIChuID49IDApCisgICAgeworICAgICAgaWYgKHJlZm1wbl9jbXAgKHIsIEQsIChtcF9zaXplX3QpIDIpID49IDApCisJQVNTRVJUX05PQ0FSUlkgKHJlZm1wbl9zdWJfbiAociwgciwgRCwgKG1wX3NpemVfdCkgMikpOworICAgICAgcmVmbXBuX3JzaGlmdCAoRCwgRCwgKG1wX3NpemVfdCkgMiwgMSk7CisgICAgICBuLS07CisgICAgfQorCisgIEFTU0VSVCAocmVmbXBuX2NtcCAociwgZCwgKG1wX3NpemVfdCkgMikgPCAwKTsKK30KKworCisKKy8qIFNpbWlsYXIgdG8gdGhlIG9sZCBtcG4vZ2VuZXJpYy9zYl9kaXZyZW1fbW4uYywgYnV0IHNvbWV3aGF0IHNpbXBsaWZpZWQsIGluCisgICBwYXJ0aWN1bGFyIHRoZSB0cmlhbCBxdW90aWVudCBpcyBhbGxvd2VkIHRvIGJlIDIgdG9vIGJpZy4gKi8KK21wX2xpbWJfdAorcmVmbXBuX3NiX2Rpdl9xciAobXBfcHRyIHFwLAorCQkgIG1wX3B0ciBucCwgbXBfc2l6ZV90IG5zaXplLAorCQkgIG1wX3NyY3B0ciBkcCwgbXBfc2l6ZV90IGRzaXplKQoreworICBtcF9saW1iX3QgIHJldHZhbCA9IDA7CisgIG1wX3NpemVfdCAgaTsKKyAgbXBfbGltYl90ICBkMSA9IGRwW2RzaXplLTFdOworICBtcF9wdHIgICAgIG5wX29yaWcgPSByZWZtcG5fbWVtZHVwX2xpbWJzIChucCwgbnNpemUpOworCisgIEFTU0VSVCAobnNpemUgPj0gZHNpemUpOworICAvKiBBU1NFUlQgKGRzaXplID4gMik7ICovCisgIEFTU0VSVCAoZHNpemUgPj0gMik7CisgIEFTU0VSVCAoZHBbZHNpemUtMV0gJiBHTVBfTlVNQl9ISUdIQklUKTsKKyAgQVNTRVJUICghIHJlZm1wbl9vdmVybGFwX3AgKHFwLCBuc2l6ZS1kc2l6ZSwgbnAsIG5zaXplKSB8fCBxcCtkc2l6ZSA+PSBucCk7CisgIEFTU0VSVF9NUE4gKG5wLCBuc2l6ZSk7CisgIEFTU0VSVF9NUE4gKGRwLCBkc2l6ZSk7CisKKyAgaSA9IG5zaXplLWRzaXplOworICBpZiAocmVmbXBuX2NtcCAobnAraSwgZHAsIGRzaXplKSA+PSAwKQorICAgIHsKKyAgICAgIEFTU0VSVF9OT0NBUlJZIChyZWZtcG5fc3ViX24gKG5wK2ksIG5wK2ksIGRwLCBkc2l6ZSkpOworICAgICAgcmV0dmFsID0gMTsKKyAgICB9CisKKyAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG1wX2xpbWJfdCAgbjAgPSBucFtpK2RzaXplXTsKKyAgICAgIG1wX2xpbWJfdCAgbjEgPSBucFtpK2RzaXplLTFdOworICAgICAgbXBfbGltYl90ICBxLCBkdW1teV9yOworCisgICAgICBBU1NFUlQgKG4wIDw9IGQxKTsKKyAgICAgIGlmIChuMCA9PSBkMSkKKwlxID0gR01QX05VTUJfTUFYOworICAgICAgZWxzZQorCXEgPSByZWZtcG5fdWRpdl9xcm5uZCAoJmR1bW15X3IsIG4wLCBuMSA8PCBHTVBfTkFJTF9CSVRTLAorCQkJICAgICAgIGQxIDw8IEdNUF9OQUlMX0JJVFMpOworCisgICAgICBuMCAtPSByZWZtcG5fc3VibXVsXzEgKG5wK2ksIGRwLCBkc2l6ZSwgcSk7CisgICAgICBBU1NFUlQgKG4wID09IDAgfHwgbjAgPT0gTVBfTElNQl9UX01BWCk7CisgICAgICBpZiAobjApCisJeworCSAgcS0tOworCSAgaWYgKCEgcmVmbXBuX2FkZF9uIChucCtpLCBucCtpLCBkcCwgZHNpemUpKQorCSAgICB7CisJICAgICAgcS0tOworCSAgICAgIEFTU0VSVF9DQVJSWSAocmVmbXBuX2FkZF9uIChucCtpLCBucCtpLCBkcCwgZHNpemUpKTsKKwkgICAgfQorCX0KKyAgICAgIG5wW2krZHNpemVdID0gMDsKKworICAgICAgcXBbaV0gPSBxOworICAgIH0KKworICAvKiByZW1haW5kZXIgPCBkaXZpc29yICovCisjaWYgMAkJLyogQVNTRVJUIHRyaWdnZXJzIGdjYyA0LjIuMSBidWcgKi8KKyAgQVNTRVJUIChyZWZtcG5fY21wIChucCwgZHAsIGRzaXplKSA8IDApOworI2VuZGlmCisKKyAgLyogbXVsdGlwbHkgYmFjayB0byBvcmlnaW5hbCAqLworICB7CisgICAgbXBfcHRyICBtcCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKG5zaXplKTsKKworICAgIHJlZm1wbl9tdWxfYW55IChtcCwgcXAsIG5zaXplLWRzaXplLCBkcCwgZHNpemUpOworICAgIGlmIChyZXR2YWwpCisgICAgICBBU1NFUlRfTk9DQVJSWSAocmVmbXBuX2FkZF9uIChtcCtuc2l6ZS1kc2l6ZSxtcCtuc2l6ZS1kc2l6ZSwgZHAsIGRzaXplKSk7CisgICAgQVNTRVJUX05PQ0FSUlkgKHJlZm1wbl9hZGQgKG1wLCBtcCwgbnNpemUsIG5wLCBkc2l6ZSkpOworICAgIEFTU0VSVCAocmVmbXBuX2NtcCAobXAsIG5wX29yaWcsIG5zaXplKSA9PSAwKTsKKworICAgIGZyZWUgKG1wKTsKKyAgfQorCisgIGZyZWUgKG5wX29yaWcpOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBTaW1pbGFyIHRvIHRoZSBvbGQgbXBuL2dlbmVyaWMvc2JfZGl2cmVtX21uLmMsIGJ1dCBzb21ld2hhdCBzaW1wbGlmaWVkLCBpbgorICAgcGFydGljdWxhciB0aGUgdHJpYWwgcXVvdGllbnQgaXMgYWxsb3dlZCB0byBiZSAyIHRvbyBiaWcuICovCit2b2lkCityZWZtcG5fdGRpdl9xciAobXBfcHRyIHFwLCBtcF9wdHIgcnAsIG1wX3NpemVfdCBxeG4sCisJCW1wX3B0ciBucCwgbXBfc2l6ZV90IG5zaXplLAorCQltcF9zcmNwdHIgZHAsIG1wX3NpemVfdCBkc2l6ZSkKK3sKKyAgQVNTRVJUIChxeG4gPT0gMCk7CisgIEFTU0VSVF9NUE4gKG5wLCBuc2l6ZSk7CisgIEFTU0VSVF9NUE4gKGRwLCBkc2l6ZSk7CisgIEFTU0VSVCAoZHNpemUgPiAwKTsKKyAgQVNTRVJUIChkcFtkc2l6ZS0xXSAhPSAwKTsKKworICBpZiAoZHNpemUgPT0gMSkKKyAgICB7CisgICAgICBycFswXSA9IHJlZm1wbl9kaXZtb2RfMSAocXAsIG5wLCBuc2l6ZSwgZHBbMF0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1wX3B0ciAgbjJwID0gcmVmbXBuX21hbGxvY19saW1icyAobnNpemUrMSk7CisgICAgICBtcF9wdHIgIGQycCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKGRzaXplKTsKKyAgICAgIGludCAgICAgbm9ybSA9IHJlZm1wbl9jb3VudF9sZWFkaW5nX3plcm9zIChkcFtkc2l6ZS0xXSkgLSBHTVBfTkFJTF9CSVRTOworCisgICAgICBuMnBbbnNpemVdID0gcmVmbXBuX2xzaGlmdF9vcl9jb3B5IChuMnAsIG5wLCBuc2l6ZSwgbm9ybSk7CisgICAgICBBU1NFUlRfTk9DQVJSWSAocmVmbXBuX2xzaGlmdF9vcl9jb3B5IChkMnAsIGRwLCBkc2l6ZSwgbm9ybSkpOworCisgICAgICByZWZtcG5fc2JfZGl2X3FyIChxcCwgbjJwLCBuc2l6ZSsxLCBkMnAsIGRzaXplKTsKKyAgICAgIHJlZm1wbl9yc2hpZnRfb3JfY29weSAocnAsIG4ycCwgZHNpemUsIG5vcm0pOworCisgICAgICAvKiBBU1NFUlQgKHJlZm1wbl96ZXJvX3AgKHRwK2RzaXplLCBuc2l6ZS1kc2l6ZSkpOyAqLworICAgICAgZnJlZSAobjJwKTsKKyAgICAgIGZyZWUgKGQycCk7CisgICAgfQorfQorCittcF9saW1iX3QKK3JlZm1wbl9yZWRjXzEgKG1wX3B0ciBycCwgbXBfcHRyIHVwLCBtcF9zcmNwdHIgbXAsIG1wX3NpemVfdCBuLCBtcF9saW1iX3QgaW52bSkKK3sKKyAgbXBfc2l6ZV90IGo7CisgIG1wX2xpbWJfdCBjeTsKKworICBBU1NFUlRfTVBOICh1cCwgMipuKTsKKyAgLyogQVNTRVJUIGFib3V0IGRpcmVjdGVkIG92ZXJsYXAgcnAsIHVwICovCisgIC8qIEFTU0VSVCBhYm91dCBvdmVybGFwIHJwLCBtcCAqLworICAvKiBBU1NFUlQgYWJvdXQgb3ZlcmxhcCB1cCwgbXAgKi8KKworICBmb3IgKGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pCisgICAgeworICAgICAgdXBbMF0gPSByZWZtcG5fYWRkbXVsXzEgKHVwLCBtcCwgbiwgKHVwWzBdICogaW52bSkgJiBHTVBfTlVNQl9NQVNLKTsKKyAgICAgIHVwKys7CisgICAgfQorICBjeSA9IG1wbl9hZGRfbiAocnAsIHVwLCB1cCAtIG4sIG4pOworICByZXR1cm4gY3k7Cit9CisKK3NpemVfdAorcmVmbXBuX2dldF9zdHIgKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGJhc2UsIG1wX3B0ciBzcmMsIG1wX3NpemVfdCBzaXplKQoreworICB1bnNpZ25lZCBjaGFyICAqZDsKKyAgc2l6ZV90ICBkc2l6ZTsKKworICBBU1NFUlQgKHNpemUgPj0gMCk7CisgIEFTU0VSVCAoYmFzZSA+PSAyKTsKKyAgQVNTRVJUIChiYXNlIDwgbnVtYmVyb2YgKG1wX2Jhc2VzKSk7CisgIEFTU0VSVCAoc2l6ZSA9PSAwIHx8IHNyY1tzaXplLTFdICE9IDApOworICBBU1NFUlRfTVBOIChzcmMsIHNpemUpOworCisgIE1QTl9TSVpFSU5CQVNFIChkc2l6ZSwgc3JjLCBzaXplLCBiYXNlKTsKKyAgQVNTRVJUIChkc2l6ZSA+PSAxKTsKKyAgQVNTRVJUICghIGJ5dGVfb3ZlcmxhcF9wIChkc3QsIChtcF9zaXplX3QpIGRzaXplLCBzcmMsIHNpemUgKiBHTVBfTElNQl9CWVRFUykpOworCisgIGlmIChzaXplID09IDApCisgICAgeworICAgICAgZHN0WzBdID0gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBkb24ndCBjbG9iYmVyIGlucHV0IGZvciBwb3dlciBvZiAyIGJhc2VzICovCisgIGlmIChQT1cyX1AgKGJhc2UpKQorICAgIHNyYyA9IHJlZm1wbl9tZW1kdXBfbGltYnMgKHNyYywgc2l6ZSk7CisKKyAgZCA9IGRzdCArIGRzaXplOworICBkbworICAgIHsKKyAgICAgIGQtLTsKKyAgICAgIEFTU0VSVCAoZCA+PSBkc3QpOworICAgICAgKmQgPSByZWZtcG5fZGl2cmVtXzEgKHNyYywgKG1wX3NpemVfdCkgMCwgc3JjLCBzaXplLCAobXBfbGltYl90KSBiYXNlKTsKKyAgICAgIHNpemUgLT0gKHNyY1tzaXplLTFdID09IDApOworICAgIH0KKyAgd2hpbGUgKHNpemUgIT0gMCk7CisKKyAgLyogTW92ZSByZXN1bHQgYmFjayBhbmQgZGVjcmVtZW50IGRzaXplIGlmIHdlIGRpZG4ndCBnZW5lcmF0ZQorICAgICB0aGUgbWF4aW11bSBwb3NzaWJsZSBkaWdpdHMuICAqLworICBpZiAoZCAhPSBkc3QpCisgICAgeworICAgICAgc2l6ZV90IGk7CisgICAgICBkc2l6ZSAtPSBkIC0gZHN0OworICAgICAgZm9yIChpID0gMDsgaSA8IGRzaXplOyBpKyspCisJZHN0W2ldID0gZFtpXTsKKyAgICB9CisKKyAgaWYgKFBPVzJfUCAoYmFzZSkpCisgICAgZnJlZSAoc3JjKTsKKworICByZXR1cm4gZHNpemU7Cit9CisKKworbXBfbGltYl90CityZWZfYnN3YXBfbGltYiAobXBfbGltYl90IHNyYykKK3sKKyAgbXBfbGltYl90ICBkc3Q7CisgIGludCAgICAgICAgaTsKKworICBkc3QgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgR01QX0xJTUJfQllURVM7IGkrKykKKyAgICB7CisgICAgICBkc3QgPSAoZHN0IDw8IDgpICsgKHNyYyAmIDB4RkYpOworICAgICAgc3JjID4+PSA4OworICAgIH0KKyAgcmV0dXJuIGRzdDsKK30KKworCisvKiBUaGVzZSByYW5kb20gZnVuY3Rpb25zIGFyZSBtb3N0bHkgZm9yIHRyYW5zaXRpb25hbCBwdXJwb3NlcyB3aGlsZSBhZGRpbmcKKyAgIG5haWwgc3VwcG9ydCwgc2luY2UgdGhleSdyZSBpbmRlcGVuZGVudCBvZiB0aGUgbm9ybWFsIG1wbiByb3V0aW5lcy4gIFRoZXkKKyAgIGNhbiBwcm9iYWJseSBiZSByZW1vdmVkIHdoZW4gdGhvc2Ugbm9ybWFsIHJvdXRpbmVzIGFyZSByZWxpYWJsZSwgdGhvdWdoCisgICBwZXJoYXBzIHNvbWV0aGluZyBpbmRlcGVuZGVudCB3b3VsZCBzdGlsbCBiZSB1c2VmdWwgYXQgdGltZXMuICAqLworCisjaWYgR01QX0xJTUJfQklUUyA9PSAzMgorI2RlZmluZSBSQU5EX0EgIENOU1RfTElNQigweDI5Q0Y1MzUpCisjZW5kaWYKKyNpZiBHTVBfTElNQl9CSVRTID09IDY0CisjZGVmaW5lIFJBTkRfQSAgQ05TVF9MSU1CKDB4QkFFQ0Q1MTVEQUYwQjQ5RCkKKyNlbmRpZgorCittcF9saW1iX3QgIHJlZm1wbl9yYW5kb21fc2VlZDsKKworbXBfbGltYl90CityZWZtcG5fcmFuZG9tX2hhbGYgKHZvaWQpCit7CisgIHJlZm1wbl9yYW5kb21fc2VlZCA9IHJlZm1wbl9yYW5kb21fc2VlZCAqIFJBTkRfQSArIDE7CisgIHJldHVybiAocmVmbXBuX3JhbmRvbV9zZWVkID4+IEdNUF9MSU1CX0JJVFMvMik7Cit9CisKK21wX2xpbWJfdAorcmVmbXBuX3JhbmRvbV9saW1iICh2b2lkKQoreworICByZXR1cm4gKChyZWZtcG5fcmFuZG9tX2hhbGYgKCkgPDwgKEdNUF9MSU1CX0JJVFMvMikpCisJICAgfCByZWZtcG5fcmFuZG9tX2hhbGYgKCkpICYgR01QX05VTUJfTUFTSzsKK30KKwordm9pZAorcmVmbXBuX3JhbmRvbSAobXBfcHRyIHB0ciwgbXBfc2l6ZV90IHNpemUpCit7CisgIG1wX3NpemVfdCAgaTsKKyAgaWYgKEdNUF9OQUlMX0JJVFMgPT0gMCkKKyAgICB7CisgICAgICBtcG5fcmFuZG9tIChwdHIsIHNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHB0cltpXSA9IHJlZm1wbl9yYW5kb21fbGltYiAoKTsKK30KKwordm9pZAorcmVmbXBuX3JhbmRvbTIgKG1wX3B0ciBwdHIsIG1wX3NpemVfdCBzaXplKQoreworICBtcF9zaXplX3QgIGk7CisgIG1wX2xpbWJfdCAgYml0LCBtYXNrLCBsaW1iOworICBpbnQgICAgICAgIHJ1bjsKKworICBpZiAoR01QX05BSUxfQklUUyA9PSAwKQorICAgIHsKKyAgICAgIG1wbl9yYW5kb20yIChwdHIsIHNpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2RlZmluZSBSVU5fTU9EVUxVUyAgMzIKKworICAvKiBzdGFydCB3aXRoIG9uZXMgYXQgYSByYW5kb20gcG9zIGluIHRoZSBoaWdoIGxpbWIgKi8KKyAgYml0ID0gQ05TVF9MSU1CKDEpIDw8IChyZWZtcG5fcmFuZG9tX2hhbGYgKCkgJSBHTVBfTlVNQl9CSVRTKTsKKyAgbWFzayA9IDA7CisgIHJ1biA9IDA7CisKKyAgZm9yIChpID0gc2l6ZS0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBsaW1iID0gMDsKKyAgICAgIGRvCisJeworCSAgaWYgKHJ1biA9PSAwKQorCSAgICB7CisJICAgICAgcnVuID0gKHJlZm1wbl9yYW5kb21faGFsZiAoKSAlIFJVTl9NT0RVTFVTKSArIDE7CisJICAgICAgbWFzayA9IH5tYXNrOworCSAgICB9CisKKwkgIGxpbWIgfD0gKGJpdCAmIG1hc2spOworCSAgYml0ID4+PSAxOworCSAgcnVuLS07CisJfQorICAgICAgd2hpbGUgKGJpdCAhPSAwKTsKKworICAgICAgcHRyW2ldID0gbGltYjsKKyAgICAgIGJpdCA9IEdNUF9OVU1CX0hJR0hCSVQ7CisgICAgfQorfQorCisvKiBUaGlzIGlzIGEgc2ltcGxlIGJpdHdpc2UgYWxnb3JpdGhtIHdvcmtpbmcgaGlnaCB0byBsb3cgYWNyb3NzICJzIiBhbmQKKyAgIHRlc3RpbmcgZWFjaCB0aW1lIHdoZXRoZXIgc2V0dGluZyB0aGUgYml0IHdvdWxkIG1ha2Ugc14yIGV4Y2VlZCBuLiAgKi8KK21wX3NpemVfdAorcmVmbXBuX3NxcnRyZW0gKG1wX3B0ciBzcCwgbXBfcHRyIHJwLCBtcF9zcmNwdHIgbnAsIG1wX3NpemVfdCBuc2l6ZSkKK3sKKyAgbXBfcHRyICAgICB0cCwgZHA7CisgIG1wX3NpemVfdCAgc3NpemUsIHRhbGxvYywgdHNpemUsIGRzaXplLCByZXQsIGlsaW1iczsKKyAgdW5zaWduZWQgICBpYml0OworICBsb25nICAgICAgIGk7CisgIG1wX2xpbWJfdCAgYzsKKworICBBU1NFUlQgKG5zaXplID49IDApOworCisgIC8qIElmIG49PTAsIHRoZW4gcz0wIGFuZCByPTAuICAqLworICBpZiAobnNpemUgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBBU1NFUlQgKG5wW25zaXplIC0gMV0gIT0gMCk7CisgIEFTU0VSVCAocnAgPT0gTlVMTCB8fCBNUE5fU0FNRV9PUl9TRVBBUkFURV9QIChucCwgcnAsIG5zaXplKSk7CisgIEFTU0VSVCAocnAgPT0gTlVMTCB8fCAhIE1QTl9PVkVSTEFQX1AgKHNwLCAobnNpemUgKyAxKSAvIDIsIHJwLCBuc2l6ZSkpOworICBBU1NFUlQgKCEgTVBOX09WRVJMQVBfUCAoc3AsIChuc2l6ZSArIDEpIC8gMiwgbnAsIG5zaXplKSk7CisKKyAgLyogcm9vdCAqLworICBzc2l6ZSA9IChuc2l6ZSsxKS8yOworICByZWZtcG5femVybyAoc3AsIHNzaXplKTsKKworICAvKiB0aGUgcmVtYWluZGVyIHNvIGZhciAqLworICBkcCA9IHJlZm1wbl9tZW1kdXBfbGltYnMgKG5wLCBuc2l6ZSk7CisgIGRzaXplID0gbnNpemU7CisKKyAgLyogdGVtcG9yYXJ5ICovCisgIHRhbGxvYyA9IDIqc3NpemUgKyAxOworICB0cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHRhbGxvYyk7CisKKyAgZm9yIChpID0gR01QX05VTUJfQklUUyAqIHNzaXplIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgLyogdCA9IDIqcyoyXmkgKyAyXigyKmkpLCBiZWluZyB0aGUgYW1vdW50IHNeMiB3aWxsIGluY3JlYXNlIGJ5IGlmIDJeaQorCSBpcyBhZGRlZCB0byBpdCAqLworCisgICAgICBpbGltYnMgPSAoaSsxKSAvIEdNUF9OVU1CX0JJVFM7CisgICAgICBpYml0ID0gKGkrMSkgJSBHTVBfTlVNQl9CSVRTOworICAgICAgcmVmbXBuX3plcm8gKHRwLCBpbGltYnMpOworICAgICAgYyA9IHJlZm1wbl9sc2hpZnRfb3JfY29weSAodHAraWxpbWJzLCBzcCwgc3NpemUsIGliaXQpOworICAgICAgdHNpemUgPSBpbGltYnMgKyBzc2l6ZTsKKyAgICAgIHRwW3RzaXplXSA9IGM7CisgICAgICB0c2l6ZSArPSAoYyAhPSAwKTsKKworICAgICAgaWxpbWJzID0gKDIqaSkgLyBHTVBfTlVNQl9CSVRTOworICAgICAgaWJpdCA9ICgyKmkpICUgR01QX05VTUJfQklUUzsKKyAgICAgIGlmIChpbGltYnMgKyAxID4gdHNpemUpCisJeworCSAgcmVmbXBuX3plcm9fZXh0ZW5kICh0cCwgdHNpemUsIGlsaW1icyArIDEpOworCSAgdHNpemUgPSBpbGltYnMgKyAxOworCX0KKyAgICAgIGMgPSByZWZtcG5fYWRkXzEgKHRwK2lsaW1icywgdHAraWxpbWJzLCB0c2l6ZS1pbGltYnMsCisJCQlDTlNUX0xJTUIoMSkgPDwgaWJpdCk7CisgICAgICBBU1NFUlQgKHRzaXplIDwgdGFsbG9jKTsKKyAgICAgIHRwW3RzaXplXSA9IGM7CisgICAgICB0c2l6ZSArPSAoYyAhPSAwKTsKKworICAgICAgaWYgKHJlZm1wbl9jbXBfdHdvc2l6ZXMgKGRwLCBkc2l6ZSwgdHAsIHRzaXplKSA+PSAwKQorCXsKKwkgIC8qIHNldCB0aGlzIGJpdCBpbiBzIGFuZCBzdWJ0cmFjdCBmcm9tIHRoZSByZW1haW5kZXIgKi8KKwkgIHJlZm1wbl9zZXRiaXQgKHNwLCBpKTsKKworCSAgQVNTRVJUX05PQ0FSUlkgKHJlZm1wbl9zdWJfbiAoZHAsIGRwLCB0cCwgZHNpemUpKTsKKwkgIGRzaXplID0gcmVmbXBuX25vcm1hbGl6ZSAoZHAsIGRzaXplKTsKKwl9CisgICAgfQorCisgIGlmIChycCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldCA9ICEgcmVmbXBuX3plcm9fcCAoZHAsIGRzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBBU1NFUlQgKGRzaXplID09IDAgfHwgZHBbZHNpemUtMV0gIT0gMCk7CisgICAgICByZWZtcG5fY29weSAocnAsIGRwLCBkc2l6ZSk7CisgICAgICByZXQgPSBkc2l6ZTsKKyAgICB9CisKKyAgZnJlZSAoZHApOworICBmcmVlICh0cCk7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9yZWZtcHEuYyBiL3Rlc3RzL3JlZm1wcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmZjN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWZtcHEuYwpAQCAtMCwwICsxLDQwIEBACisvKiBSZWZlcmVuY2UgcmF0aW9uYWwgcm91dGluZXMuCisKK0NvcHlyaWdodCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK3JlZm1wcV9hZGQgKG1wcV9wdHIgdywgbXBxX3NyY3B0ciB4LCBtcHFfc3JjcHRyIHkpCit7CisgIG1wel9tdWwgICAgKG1wcV9udW1yZWYodyksIG1wcV9udW1yZWYoeCksIG1wcV9kZW5yZWYoeSkpOworICBtcHpfYWRkbXVsIChtcHFfbnVtcmVmKHcpLCBtcHFfZGVucmVmKHgpLCBtcHFfbnVtcmVmKHkpKTsKKyAgbXB6X211bCAgICAobXBxX2RlbnJlZih3KSwgbXBxX2RlbnJlZih4KSwgbXBxX2RlbnJlZih5KSk7CisgIG1wcV9jYW5vbmljYWxpemUgKHcpOworfQorCit2b2lkCityZWZtcHFfc3ViIChtcHFfcHRyIHcsIG1wcV9zcmNwdHIgeCwgbXBxX3NyY3B0ciB5KQoreworICBtcHpfbXVsICAgIChtcHFfbnVtcmVmKHcpLCBtcHFfbnVtcmVmKHgpLCBtcHFfZGVucmVmKHkpKTsKKyAgbXB6X3N1Ym11bCAobXBxX251bXJlZih3KSwgbXBxX2RlbnJlZih4KSwgbXBxX251bXJlZih5KSk7CisgIG1wel9tdWwgICAgKG1wcV9kZW5yZWYodyksIG1wcV9kZW5yZWYoeCksIG1wcV9kZW5yZWYoeSkpOworICBtcHFfY2Fub25pY2FsaXplICh3KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZm1wei5jIGIvdGVzdHMvcmVmbXB6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3Nzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZm1wei5jCkBAIC0wLDAgKzEsMzQzIEBACisvKiBSZWZlcmVuY2UgbXB6IGZ1bmN0aW9ucy4KKworQ29weXJpZ2h0IDE5OTcsIDE5OTktMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworLyogYWx3YXlzIGRvIGFzc2VydGlvbiBjaGVja2luZyAqLworI2RlZmluZSBXQU5UX0FTU0VSVCAgMQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gLyogZm9yIGZyZWUgKi8KKyNpbmNsdWRlICJnbXAtaW1wbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBDaGFuZ2UgdGhpcyB0byAiI2RlZmluZSBUUkFDRSh4KSB4IiBmb3Igc29tZSB0cmFjZXMuICovCisjZGVmaW5lIFRSQUNFKHgpCisKKworLyogRklYTUU6IFNob3VsZG4ndCB1c2UgcGxhaW4gbXB6IGZ1bmN0aW9ucyBpbiBhIHJlZmVyZW5jZSByb3V0aW5lLiAqLwordm9pZAorcmVmbXB6X2NvbWJpdCAobXB6X3B0ciByLCB1bnNpZ25lZCBsb25nIGJpdCkKK3sKKyAgaWYgKG1wel90c3RiaXQgKHIsIGJpdCkpCisgICAgbXB6X2NscmJpdCAociwgYml0KTsKKyAgZWxzZQorICAgIG1wel9zZXRiaXQgKHIsIGJpdCk7Cit9CisKKwordW5zaWduZWQgbG9uZworcmVmbXB6X2hhbWRpc3QgKG1wel9zcmNwdHIgeCwgbXB6X3NyY3B0ciB5KQoreworICBtcF9zaXplX3QgICAgICB4c2l6ZSwgeXNpemUsIHRzaXplOworICBtcF9wdHIgICAgICAgICB4cCwgeXA7CisgIHVuc2lnbmVkIGxvbmcgIHJldDsKKworICBpZiAoKFNJWih4KSA8IDAgJiYgU0laKHkpID49IDApCisgICAgICB8fCAoU0laKHkpIDwgMCAmJiBTSVooeCkgPj0gMCkpCisgICAgcmV0dXJuIFVMT05HX01BWDsKKworICB4c2l6ZSA9IEFCU0laKHgpOworICB5c2l6ZSA9IEFCU0laKHkpOworICB0c2l6ZSA9IE1BWCAoeHNpemUsIHlzaXplKTsKKworICB4cCA9IHJlZm1wbl9tYWxsb2NfbGltYnMgKHRzaXplKTsKKyAgcmVmbXBuX3plcm8gKHhwLCB0c2l6ZSk7CisgIHJlZm1wbl9jb3B5ICh4cCwgUFRSKHgpLCB4c2l6ZSk7CisKKyAgeXAgPSByZWZtcG5fbWFsbG9jX2xpbWJzICh0c2l6ZSk7CisgIHJlZm1wbl96ZXJvICh5cCwgdHNpemUpOworICByZWZtcG5fY29weSAoeXAsIFBUUih5KSwgeXNpemUpOworCisgIGlmIChTSVooeCkgPCAwKQorICAgIHJlZm1wbl9uZWcgKHhwLCB4cCwgdHNpemUpOworCisgIGlmIChTSVooeCkgPCAwKQorICAgIHJlZm1wbl9uZWcgKHlwLCB5cCwgdHNpemUpOworCisgIHJldCA9IHJlZm1wbl9oYW1kaXN0ICh4cCwgeXAsIHRzaXplKTsKKworICBmcmVlICh4cCk7CisgIGZyZWUgKHlwKTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorcmVmbXB6X2djZCAobXB6X3B0ciBnLCBtcHpfc3JjcHRyIGFfb3JpZywgbXB6X3NyY3B0ciBiX29yaWcpCit7CisgIG1wX2JpdGNudF90IGFfdHdvcywgYl90d29zLCBjb21tb25fdHdvczsKKyAgbXB6X3QgYTsKKyAgbXB6X3QgYjsKKyAgbXB6X2luaXQgKGEpOworICBtcHpfaW5pdCAoYik7CisgIG1wel9hYnMgKGEsIGFfb3JpZyk7CisgIG1wel9hYnMgKGIsIGJfb3JpZyk7CisKKyAgaWYgKG1wel9zZ24gKGEpID09IDApCisgICAgeworICAgICAgbXB6X3NldCAoZywgYik7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAobXB6X3NnbiAoYikgPT0gMCkKKyAgICB7CisgICAgICBtcHpfc2V0IChnLCBhKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGFfdHdvcyA9IG1wel9zY2FuMSAoYSwgMCk7CisgIG1wel90ZGl2X3FfMmV4cCAoYSwgYSwgYV90d29zKTsKKworICBiX3R3b3MgPSBtcHpfc2NhbjEgKGIsIDApOworICBtcHpfdGRpdl9xXzJleHAgKGIsIGIsIGJfdHdvcyk7CisKKyAgY29tbW9uX3R3b3MgPSBNSU4oYV90d29zLCBiX3R3b3MpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBjOworICAgICAgbXBfYml0Y250X3QgdHdvczsKKyAgICAgIGMgPSBtcHpfY21wIChhLCBiKTsKKyAgICAgIGlmIChjID09IDApCisJYnJlYWs7CisgICAgICBpZiAoYyA8IDApCisJbXB6X3N3YXAgKGEsIGIpOworICAgICAgbXB6X3N1YiAoYSwgYSwgYik7CisgICAgICB0d29zID0gbXB6X3NjYW4xIChhLCAwKTsKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAoYSwgYSwgdHdvcyk7CisgICAgfQorICBtcHpfbXVsXzJleHAgKGcsIGEsIGNvbW1vbl90d29zKTsKKworICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGIpOworfQorCisvKiAoMC9iKSwgd2l0aCBtcHogYjsgaXMgMSBpZiBiPSsvLTEsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIEpBQ09CSV8wWihiKSAgSkFDT0JJXzBMUyAoUFRSKGIpWzBdLCBTSVooYikpCisKKy8qIChhL2IpIGVmZmVjdCBkdWUgdG8gc2lnbiBvZiBiOiBtcHovbXB6ICovCisjZGVmaW5lIEpBQ09CSV9CU0dOX1paX0JJVDEoYSwgYikgICBKQUNPQklfQlNHTl9TU19CSVQxIChTSVooYSksIFNJWihiKSkKKworLyogKGEvYikgZWZmZWN0IGR1ZSB0byBzaWduIG9mIGE6IG1wei91bnNpZ25lZC1tcHosIGIgb2RkOworICAgaXMgKC0xL2IpIGlmIGE8MCwgb3IgKzEgaWYgYT49MCAqLworI2RlZmluZSBKQUNPQklfQVNHTl9aWlVfQklUMShhLCBiKSAgSkFDT0JJX0FTR05fU1VfQklUMSAoU0laKGEpLCBQVFIoYilbMF0pCisKK2ludAorcmVmbXB6X2tyb25lY2tlciAobXB6X3NyY3B0ciBhX29yaWcsIG1wel9zcmNwdHIgYl9vcmlnKQoreworICB1bnNpZ25lZCBsb25nICB0d29zOworICBtcHpfdCAgYSwgYjsKKyAgaW50ICAgIHJlc3VsdF9iaXQxID0gMDsKKworICBpZiAobXB6X3NnbiAoYl9vcmlnKSA9PSAwKQorICAgIHJldHVybiBKQUNPQklfWjAgKGFfb3JpZyk7ICAvKiAoYS8wKSAqLworCisgIGlmIChtcHpfc2duIChhX29yaWcpID09IDApCisgICAgcmV0dXJuIEpBQ09CSV8wWiAoYl9vcmlnKTsgIC8qICgwL2IpICovCisKKyAgaWYgKG1wel9ldmVuX3AgKGFfb3JpZykgJiYgbXB6X2V2ZW5fcCAoYl9vcmlnKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobXB6X2NtcF91aSAoYl9vcmlnLCAxKSA9PSAwKQorICAgIHJldHVybiAxOworCisgIG1wel9pbml0X3NldCAoYSwgYV9vcmlnKTsKKyAgbXB6X2luaXRfc2V0IChiLCBiX29yaWcpOworCisgIGlmIChtcHpfc2duIChiKSA8IDApCisgICAgeworICAgICAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX0JTR05fWlpfQklUMSAoYSwgYik7CisgICAgICBtcHpfbmVnIChiLCBiKTsKKyAgICB9CisgIGlmIChtcHpfZXZlbl9wIChiKSkKKyAgICB7CisgICAgICB0d29zID0gbXB6X3NjYW4xIChiLCAwTCk7CisgICAgICBtcHpfdGRpdl9xXzJleHAgKGIsIGIsIHR3b3MpOworICAgICAgcmVzdWx0X2JpdDEgXj0gSkFDT0JJX1RXT1NfVV9CSVQxICh0d29zLCBQVFIoYSlbMF0pOworICAgIH0KKworICBpZiAobXB6X3NnbiAoYSkgPCAwKQorICAgIHsKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9OMUJfQklUMSAoUFRSKGIpWzBdKTsKKyAgICAgIG1wel9uZWcgKGEsIGEpOworICAgIH0KKyAgaWYgKG1wel9ldmVuX3AgKGEpKQorICAgIHsKKyAgICAgIHR3b3MgPSBtcHpfc2NhbjEgKGEsIDBMKTsKKyAgICAgIG1wel90ZGl2X3FfMmV4cCAoYSwgYSwgdHdvcyk7CisgICAgICByZXN1bHRfYml0MSBePSBKQUNPQklfVFdPU19VX0JJVDEgKHR3b3MsIFBUUihiKVswXSk7CisgICAgfQorCisgIGZvciAoOzspCisgICAgeworICAgICAgQVNTRVJUIChtcHpfb2RkX3AgKGEpKTsKKyAgICAgIEFTU0VSVCAobXB6X29kZF9wIChiKSk7CisgICAgICBBU1NFUlQgKG1wel9zZ24gKGEpID4gMCk7CisgICAgICBBU1NFUlQgKG1wel9zZ24gKGIpID4gMCk7CisKKyAgICAgIFRSQUNFIChwcmludGYgKCJ0b3BcbiIpOworCSAgICAgbXB6X3RyYWNlICgiIGEiLCBhKTsKKwkgICAgIG1wel90cmFjZSAoIiBiIiwgYikpOworCisgICAgICBpZiAobXB6X2NtcCAoYSwgYikgPCAwKQorCXsKKwkgIFRSQUNFIChwcmludGYgKCJzd2FwXG4iKSk7CisJICBtcHpfc3dhcCAoYSwgYik7CisJICByZXN1bHRfYml0MSBePSBKQUNPQklfUkVDSVBfVVVfQklUMSAoUFRSKGEpWzBdLCBQVFIoYilbMF0pOworCX0KKworICAgICAgaWYgKG1wel9jbXBfdWkgKGIsIDEpID09IDApCisJYnJlYWs7CisKKyAgICAgIG1wel9zdWIgKGEsIGEsIGIpOworICAgICAgVFJBQ0UgKHByaW50ZiAoInN1YlxuIik7CisJICAgICBtcHpfdHJhY2UgKCIgYSIsIGEpKTsKKyAgICAgIGlmIChtcHpfc2duIChhKSA9PSAwKQorCWdvdG8gemVybzsKKworICAgICAgdHdvcyA9IG1wel9zY2FuMSAoYSwgMEwpOworICAgICAgbXB6X2ZkaXZfcV8yZXhwIChhLCBhLCB0d29zKTsKKyAgICAgIFRSQUNFIChwcmludGYgKCJ0d29zICVsdVxuIiwgdHdvcyk7CisJICAgICBtcHpfdHJhY2UgKCIgYSIsIGEpKTsKKyAgICAgIHJlc3VsdF9iaXQxIF49IEpBQ09CSV9UV09TX1VfQklUMSAodHdvcywgUFRSKGIpWzBdKTsKKyAgICB9CisKKyAgbXB6X2NsZWFyIChhKTsKKyAgbXB6X2NsZWFyIChiKTsKKyAgcmV0dXJuIEpBQ09CSV9CSVQxX1RPX1BOIChyZXN1bHRfYml0MSk7CisKKyB6ZXJvOgorICBtcHpfY2xlYXIgKGEpOworICBtcHpfY2xlYXIgKGIpOworICByZXR1cm4gMDsKK30KKworLyogU2FtZSBhcyBtcHpfa3JvbmVja2VyLCBidXQgaWdub3JpbmcgZmFjdG9ycyBvZiAyIG9uIGIgKi8KK2ludAorcmVmbXB6X2phY29iaSAobXB6X3NyY3B0ciBhLCBtcHpfc3JjcHRyIGIpCit7CisgIEFTU0VSVF9BTFdBWVMgKG1wel9zZ24gKGIpID4gMCk7CisgIEFTU0VSVF9BTFdBWVMgKG1wel9vZGRfcCAoYikpOworCisgIHJldHVybiByZWZtcHpfa3JvbmVja2VyIChhLCBiKTsKK30KKworLyogTGVnZW5kcmUgc3ltYm9sIHZpYSBwb3dtLiBwIG11c3QgYmUgYW4gb2RkIHByaW1lLiAqLworaW50CityZWZtcHpfbGVnZW5kcmUgKG1wel9zcmNwdHIgYSwgbXB6X3NyY3B0ciBwKQoreworICBpbnQgcmVzOworCisgIG1wel90IHI7CisgIG1wel90IGU7CisKKyAgQVNTRVJUX0FMV0FZUyAobXB6X3NnbiAocCkgPiAwKTsKKyAgQVNTRVJUX0FMV0FZUyAobXB6X29kZF9wIChwKSk7CisKKyAgbXB6X2luaXQgKHIpOworICBtcHpfaW5pdCAoZSk7CisKKyAgbXB6X2ZkaXZfciAociwgYSwgcCk7CisKKyAgbXB6X3NldCAoZSwgcCk7CisgIG1wel9zdWJfdWkgKGUsIGUsIDEpOworICBtcHpfZmRpdl9xXzJleHAgKGUsIGUsIDEpOworICBtcHpfcG93bSAociwgciwgZSwgcCk7CisKKyAgLyogTm9ybWFsaXplIHRvIGEgbW9yZSBvciBsZXNzIHN5bW1ldHJpYyByYW5nZSBhcm91bmQgemVybyAqLworICBpZiAobXB6X2NtcCAociwgZSkgPiAwKQorICAgIG1wel9zdWIgKHIsIHIsIHApOworCisgIEFTU0VSVF9BTFdBWVMgKG1wel9jbXBhYnNfdWkgKHIsIDEpIDw9IDApOworCisgIHJlcyA9IG1wel9zZ24gKHIpOworCisgIG1wel9jbGVhciAocik7CisgIG1wel9jbGVhciAoZSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworCitpbnQKK3JlZm1wel9rcm9uZWNrZXJfdWkgKG1wel9zcmNwdHIgYSwgdW5zaWduZWQgbG9uZyBiKQoreworICBtcHpfdCAgYno7CisgIGludCAgICByZXQ7CisgIG1wel9pbml0X3NldF91aSAoYnosIGIpOworICByZXQgPSByZWZtcHpfa3JvbmVja2VyIChhLCBieik7CisgIG1wel9jbGVhciAoYnopOworICByZXR1cm4gcmV0OworfQorCitpbnQKK3JlZm1wel9rcm9uZWNrZXJfc2kgKG1wel9zcmNwdHIgYSwgbG9uZyBiKQoreworICBtcHpfdCAgYno7CisgIGludCAgICByZXQ7CisgIG1wel9pbml0X3NldF9zaSAoYnosIGIpOworICByZXQgPSByZWZtcHpfa3JvbmVja2VyIChhLCBieik7CisgIG1wel9jbGVhciAoYnopOworICByZXR1cm4gcmV0OworfQorCitpbnQKK3JlZm1wel91aV9rcm9uZWNrZXIgKHVuc2lnbmVkIGxvbmcgYSwgbXB6X3NyY3B0ciBiKQoreworICBtcHpfdCAgYXo7CisgIGludCAgICByZXQ7CisgIG1wel9pbml0X3NldF91aSAoYXosIGEpOworICByZXQgPSByZWZtcHpfa3JvbmVja2VyIChheiwgYik7CisgIG1wel9jbGVhciAoYXopOworICByZXR1cm4gcmV0OworfQorCitpbnQKK3JlZm1wel9zaV9rcm9uZWNrZXIgKGxvbmcgYSwgbXB6X3NyY3B0ciBiKQoreworICBtcHpfdCAgYXo7CisgIGludCAgICByZXQ7CisgIG1wel9pbml0X3NldF9zaSAoYXosIGEpOworICByZXQgPSByZWZtcHpfa3JvbmVja2VyIChheiwgYik7CisgIG1wel9jbGVhciAoYXopOworICByZXR1cm4gcmV0OworfQorCisKK3ZvaWQKK3JlZm1wel9wb3dfdWkgKG1wel9wdHIgdywgbXB6X3NyY3B0ciBiLCB1bnNpZ25lZCBsb25nIGUpCit7CisgIG1wel90ICAgICAgICAgIHMsIHQ7CisgIHVuc2lnbmVkIGxvbmcgIGk7CisKKyAgbXB6X2luaXRfc2V0X3VpICh0LCAxTCk7CisgIG1wel9pbml0X3NldCAocywgYik7CisKKyAgaWYgKChlICYgMSkgIT0gMCkKKyAgICBtcHpfbXVsICh0LCB0LCBzKTsKKworICBmb3IgKGkgPSAyOyBpIDw9IGU7IGkgPDw9IDEpCisgICAgeworICAgICAgbXB6X211bCAocywgcywgcyk7CisgICAgICBpZiAoKGkgJiBlKSAhPSAwKQorCW1wel9tdWwgKHQsIHQsIHMpOworICAgIH0KKworICBtcHpfc2V0ICh3LCB0KTsKKworICBtcHpfY2xlYXIgKHMpOworICBtcHpfY2xlYXIgKHQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3Bpbm5lci5jIGIvdGVzdHMvc3Bpbm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDQ4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zcGlubmVyLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIEEgc3R1cGlkIGxpdHRsZSBzcGlubmluZyB3aGVlbCBkZXNpZ25lZCB0byBtYWtlIGl0IGxvb2sgbGlrZSB1c2VmdWwgd29yaworICAgaXMgYmVpbmcgZG9uZS4KKworQ29weXJpZ2h0IDE5OTktMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBmb3IgaXNhdHR5ICovCisjZW5kaWYKKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qICJhbGFybSIgaXMgbm90IGF2YWlsYWJsZSBvbiBtaW5ndzMyLCBhbmQgdGhlIFNJR0FMUk0gY29uc3RhbnQgaXMgbm90CisgICBkZWZpbmVkLiAgRG9uJ3QgYm90aGVyIHdpdGggYSBzcGlubmVyIGluIHRoaXMgY2FzZS4gICovCisjaWYgISBIQVZFX0FMQVJNIHx8ICEgZGVmaW5lZCAoU0lHQUxSTSkKKyNkZWZpbmUgYWxhcm0obikgICAgICAgICAgYWJvcnQoKQorI2RlZmluZSBzaWduYWwoc2lnLGZ1bmMpICBTSUdfRVJSCisjZW5kaWYKKworCisvKiBBbiBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHRoaXMgdG8gZ2V0IGEgY291bnQgcHJpbnRlZCB3aXRoIHRoZSBzcGlubmVyLgorICAgSWYgbGVmdCBhdCAwLCBubyBjb3VudCBpcyBwcmludGVkLiAqLworCit1bnNpZ25lZCBsb25nICBzcGlubmVyX2NvdW50ID0gMDsKKworCitpbnQgIHNwaW5uZXJfd2FudGVkID0gLTE7ICAvKiAtMSB1bmluaXRpYWxpemVkLCAxIHdhbnRlZCwgMCBub3QgKi8KK2ludCAgc3Bpbm5lcl90aWNrID0gMTsgICAgIC8qIDEgcmVhZHkgdG8gcHJpbnQsIDAgbm90ICovCisKKworLypBUkdTVVNFRCovCitSRVRTSUdUWVBFCitzcGlubmVyX3NpZ25hbCAoaW50IHNpZ251bSkKK3sKKyAgc3Bpbm5lcl90aWNrID0gMTsKKworICBpZiAoc2lnbmFsIChTSUdBTFJNLCBzcGlubmVyX3NpZ25hbCkgPT0gU0lHX0VSUikKKyAgICB7CisgICAgICBwcmludGYgKCJzcGlubmVyX3NpZ25hbCgpOiBPb3BzLCBjYW5ub3QgcmVpbnN0YWxsIFNJR0FMUk1cbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorICBhbGFybSAoMSk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgc3Bpbm5lci4KKworICAgVGhpcyBpcyBkb25lIHRoZSBmaXJzdCB0aW1lIHNwaW5uZXIoKSBpcyBjYWxsZWQsIHNvIGFuIGFwcGxpY2F0aW9uCisgICBkb2Vzbid0IG5lZWQgdG8gY2FsbCB0aGlzIGRpcmVjdGx5LgorCisgICBUaGUgc3Bpbm5lciBpcyBvbmx5IHdhbnRlZCBpZiB0aGUgb3V0cHV0IGlzIGEgdHR5LiAgKi8KKworI2RlZmluZSBTUElOTkVSX1dBTlRFRF9JTklUKCkgXAorICBpZiAoc3Bpbm5lcl93YW50ZWQgPCAwKSBzcGlubmVyX2luaXQgKCkKKwordm9pZAorc3Bpbm5lcl9pbml0ICh2b2lkKQoreworICBzcGlubmVyX3dhbnRlZCA9IGlzYXR0eSAoU1RET1VUX0ZJTEVOTyk7CisgIGlmIChzcGlubmVyX3dhbnRlZCA9PSAtMSkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoIXNwaW5uZXJfd2FudGVkKQorICAgIHJldHVybjsKKworICBpZiAoc2lnbmFsIChTSUdBTFJNLCBzcGlubmVyX3NpZ25hbCkgPT0gU0lHX0VSUikKKyAgICB7CisgICAgICBwcmludGYgKCIobm8gc3Bpbm5lcilcciIpOworICAgICAgc3Bpbm5lcl90aWNrID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGFsYXJtICgxKTsKKworICAvKiB1bmJ1ZmZlcmVkIG91dHB1dCBzbyB0aGUgc3Bpbm5lciB3aWxsIHNob3cgdXAgKi8KKyAgc2V0YnVmIChzdGRvdXQsIE5VTEwpOworfQorCisKK3ZvaWQKK3NwaW5uZXIgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICBkYXRhW10gPSB7ICd8JywgJy8nLCAnLScsICdcXCcgfTsKKyAgc3RhdGljIGludCAgICAgICAgIHBvcyA9IDA7CisKKyAgY2hhciAgYnVmWzEyOF07CisKKyAgU1BJTk5FUl9XQU5URURfSU5JVCAoKTsKKworICBpZiAoc3Bpbm5lcl90aWNrKQorICAgIHsKKyAgICAgIGJ1ZlswXSA9IGRhdGFbcG9zXTsKKyAgICAgIHBvcyA9IChwb3MgKyAxKSAlIG51bWJlcm9mIChkYXRhKTsKKyAgICAgIHNwaW5uZXJfdGljayA9IDA7CisKKyAgICAgIGlmIChzcGlubmVyX2NvdW50ICE9IDApCisJeworCSAgc3ByaW50ZiAoYnVmKzEsICIgJWx1XHIiLCBzcGlubmVyX2NvdW50KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYnVmWzFdID0gJ1xyJzsKKwkgIGJ1ZlsyXSA9ICdcMCc7CisJfQorICAgICAgZnB1dHMgKGJ1Ziwgc3Rkb3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90LWJzd2FwLmMgYi90ZXN0cy90LWJzd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3QtYnN3YXAuYwpAQCAtMCwwICsxLDcwIEBACisvKiBUZXN0IEJTV0FQX0xJTUIuCisKK0NvcHlyaWdodCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIG1wX2xpbWJfdCAgc3JjLCB3YW50LCBnb3Q7CisgIGludCAgICAgICAgaTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgIG1wbl9yYW5kb20gKCZzcmMsIChtcF9zaXplX3QpIDEpOworCisgICAgICB3YW50ID0gcmVmX2Jzd2FwX2xpbWIgKHNyYyk7CisKKyAgICAgIEJTV0FQX0xJTUIgKGdvdCwgc3JjKTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIkJTV0FQX0xJTUIgd3JvbmcgcmVzdWx0XG4iKTsKKyAgICAgICAgZXJyb3I6CisgICAgICAgICAgbXBuX3RyYWNlICgiICBzcmMgIiwgJnNyYywgIChtcF9zaXplX3QpIDEpOworICAgICAgICAgIG1wbl90cmFjZSAoIiAgd2FudCIsICZ3YW50LCAobXBfc2l6ZV90KSAxKTsKKyAgICAgICAgICBtcG5fdHJhY2UgKCIgIGdvdCAiLCAmZ290LCAgKG1wX3NpemVfdCkgMSk7CisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIH0KKworICAgICAgQlNXQVBfTElNQl9GRVRDSCAoZ290LCAmc3JjKTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiAoIkJTV0FQX0xJTUJfRkVUQ0ggd3JvbmcgcmVzdWx0XG4iKTsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgIEJTV0FQX0xJTUJfU1RPUkUgKCZnb3QsIHNyYyk7CisgICAgICBpZiAoZ290ICE9IHdhbnQpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJCU1dBUF9MSU1CX1NUT1JFIHdyb25nIHJlc3VsdFxuIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdC1jb25zdGFudHMuYyBiL3Rlc3RzL3QtY29uc3RhbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3MTRjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3QtY29uc3RhbnRzLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qIENoZWNrIHRoZSB2YWx1ZXMgb2Ygc29tZSBjb25zdGFudHMuCisKK0NvcHlyaWdodCAyMDAwLTIwMDMsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisjaWZkZWYgVUxPTkdfTUFYCitjb25zdCBjaGFyICp1bG9uZ19tYXhfZGVmID0gImRlZmluZWQiOworI2Vsc2UKK2NvbnN0IGNoYXIgKnVsb25nX21heF9kZWYgPSAibm90IGRlZmluZWQiOworI2VuZGlmCisjaWZkZWYgTE9OR19NQVgKK2NvbnN0IGNoYXIgKmxvbmdfbWF4X2RlZiA9ICJkZWZpbmVkIjsKKyNlbHNlCitjb25zdCBjaGFyICpsb25nX21heF9kZWYgPSAibm90IGRlZmluZWQiOworI2VuZGlmCisKKyNpZmRlZiBVSU5UX01BWAorY29uc3QgY2hhciAqdWludF9tYXhfZGVmID0gImRlZmluZWQiOworI2Vsc2UKK2NvbnN0IGNoYXIgKnVpbnRfbWF4X2RlZiA9ICJub3QgZGVmaW5lZCI7CisjZW5kaWYKKyNpZmRlZiBJTlRfTUFYCitjb25zdCBjaGFyICppbnRfbWF4X2RlZiA9ICJkZWZpbmVkIjsKKyNlbHNlCitjb25zdCBjaGFyICppbnRfbWF4X2RlZiA9ICJub3QgZGVmaW5lZCI7CisjZW5kaWYKKworI2lmZGVmIFVTSFJUX01BWAorY29uc3QgY2hhciAqdXNocnRfbWF4X2RlZiA9ICJkZWZpbmVkIjsKKyNlbHNlCitjb25zdCBjaGFyICp1c2hydF9tYXhfZGVmID0gIm5vdCBkZWZpbmVkIjsKKyNlbmRpZgorI2lmZGVmIFNIUlRfTUFYCitjb25zdCBjaGFyICpzaHJ0X21heF9kZWYgPSAiZGVmaW5lZCI7CisjZWxzZQorY29uc3QgY2hhciAqc2hydF9tYXhfZGVmID0gIm5vdCBkZWZpbmVkIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisKKyNpZmRlZiBfTE9OR19MT05HX0xJTUIKKyNkZWZpbmUgTEwobCxsbCkgIGxsCisjZWxzZQorI2RlZmluZSBMTChsLGxsKSAgbAorI2VuZGlmCisKKyNpZiBfX0dNUF9NUF9TSVpFX1RfSU5UCisjZGVmaW5lIFNTKGksbCkgICBpCisjZWxzZQorI2RlZmluZSBTUyhpLGwpICAgbAorI2VuZGlmCisKKworI2RlZmluZSBDSEVDS19MSU1CX1MoeCwgeG5hbWUsIHksIHluYW1lKSAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHgpICE9ICh5KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZiAoTEwoIiVzID09ICVseCwgYnV0ICVzID09ICVseFxuIiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAiJXMgPT0gJWxseCwgYnV0ICVzID09ICVsbHhcbiIpLCAgICAgXAorICAgICAgICAgICAgICAgIHhuYW1lLCB4LCB5bmFtZSwgeSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIENIRUNLX0lOVF9TKHgsIHhuYW1lLCB5LCB5bmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCh4KSAhPSAoeSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZiAoIiVzID09ICVkLCBidXQgJXMgPT0gJWRcbiIsIHhuYW1lLCB4LCB5bmFtZSwgeSk7ICAgICAgICBcCisgICAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworCisjZGVmaW5lIENIRUNLX0NPTkRJVElPTl9TKHgsIHhuYW1lKSAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZiAoIiVzIGlzIGZhbHNlXG4iLCB4bmFtZSk7ICAgICAgICBcCisgICAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogSG93IG1hbnkgYml0cyBzZWVtIHRvIHdvcmsgaW4gdGhlIGdpdmVuIHR5cGUuICovCisjZGVmaW5lIENBTENfQklUUyhyZXN1bHQsIHR5cGUpIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIG4gPSAxOyAgICAgICAgICAgICAgICBcCisgICAgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAobiAhPSAwKSAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG4gPDw9IDE7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzdWx0Kys7ICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hFQ0tfQklUU19TKGNvbnN0YW50LCBjb25zdGFudF9uYW1lLCB0eXBlKSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgY2FsY3VsYXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxDX0JJVFMgKGNhbGN1bGF0ZWQsIHR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjYWxjdWxhdGVkICE9IGNvbnN0YW50KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRmICgiJXMgPT0gJWQsIGJ1dCBjYWxjdWxhdGVkICVkXG4iLCAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0YW50X25hbWUsIGNvbnN0YW50LCBjYWxjdWxhdGVkKTsgICBcCisgICAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQ0hFQ0tfSElHSEJJVF9TKHZhbHVlLCB2YWx1ZV9uYW1lLCB0eXBlLCBmb3JtYXQpICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIG4gPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobiA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIlcyA9PSAwXG4iLCB2YWx1ZV9uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXJyb3IgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG4gPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobiAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIlcyA8PCAxID0gIiwgdmFsdWVfbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRmIChmb3JtYXQsIG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZiAoIiAhPSAwXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworI2RlZmluZSBDSEVDS19NQVhfUyhtYXhfdmFsLCBtYXhfbmFtZSwgbWluX3ZhbCwgbWluX25hbWUsIHR5cGUsIGZvcm1hdCkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIG1heHZhbCA9IG1heF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIG1pbnZhbCA9IG1pbl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgIG4gPSBtYXh2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuICE9IG1pbnZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIlcyArIDEgPSAiLCBtYXhfbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKGZvcm1hdCwgbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIgIT0gJXMgPSAiLCBtaW5fbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKGZvcm1hdCwgbWludmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChtYXh2YWwgPD0gbWludmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIlcyA9ICIsIG1heF9uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKGZvcm1hdCwgbWF4dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCIgPD0gJXMgPSAiLCBtaW5fbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKGZvcm1hdCwgbWludmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGYgKCJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnJvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQ0hFQ0tfTElNQih4LHkpICAgICAgQ0hFQ0tfTElNQl9TICh4LCAjeCwgeSwgI3kpCisjZGVmaW5lIENIRUNLX0lOVCh4LHkpICAgICAgIENIRUNLX0lOVF9TICh4LCAjeCwgeSwgI3kpCisjZGVmaW5lIENIRUNLX0NPTkRJVElPTih4KSAgIENIRUNLX0NPTkRJVElPTl9TICh4LCAjeCkKKyNkZWZpbmUgQ0hFQ0tfQklUUyhjLHQpICAgICAgQ0hFQ0tfQklUU19TIChjLCAjYywgdCkKKyNkZWZpbmUgQ0hFQ0tfTUFYKG0sbix0LGYpICAgQ0hFQ0tfTUFYX1MgKG0sICNtLCBuLCAjbiwgdCwgZikKKyNkZWZpbmUgQ0hFQ0tfSElHSEJJVChuLHQsZikgQ0hFQ0tfSElHSEJJVF9TIChuLCAjbiwgdCwgZikKKworCisvKiBUaGUgdGVzdHMgYmVsb3cgbWFya2VkICJCYWQhIiBmYWlsIG9uIENyYXkgVDkwIHN5c3RlbXMsIHdoZXJlIGludCwgc2hvcnQKKyAgIGFuZCBtcF9zaXplX3QgYXJlIDQ4IGJpdHMgb3Igc29tZSBzdWNoIGJ1dCBkb24ndCB3cmFwYXJvdW5kIGluIGEgcGxhaW4KKyAgIHR3b3MgY29tcGxlbWVudCBmYXNoaW9uLiAgSW4gcGFydGljdWxhciwKKworICAgICAgIElOVF9ISUdIQklUIDw8IDEgPSAweEZGRkZDMDAwMDAwMDAwMDAgIT0gMAorICAgICAgIElOVF9NQVggKyAxID0gMzUxODQzNzIwODg4MzIgIT0gSU5UX01JTiA9IC0zNTE4NDM3MjA4ODgzMgorCisgICBUaGlzIGlzIGEgYml0IGJpemFycmUsIGJ1dCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIEdNUCBkb2Vzbid0IHJlbHkgb24gYW55CisgICBwYXJ0aWN1bGFyIG92ZXJmbG93IGJlaGF2aW91ciBmb3IgaW50IG9yIHNob3J0LCBvbmx5IGZvciBtcF9saW1iX3QuICAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCAgZXJyb3IgPSAwOworCisgIENIRUNLX0lOVCAoR01QX0xJTUJfQllURVMsIChpbnQpIHNpemVvZihtcF9saW1iX3QpKTsKKyAgQ0hFQ0tfSU5UIChtcF9iaXRzX3Blcl9saW1iLCBHTVBfTElNQl9CSVRTKTsKKworICBDSEVDS19CSVRTIChHTVBfTElNQl9CSVRTLCBtcF9saW1iX3QpOworICBDSEVDS19CSVRTIChCSVRTX1BFUl9VTE9ORywgdW5zaWduZWQgbG9uZyk7CisKKyAgQ0hFQ0tfSElHSEJJVCAoR01QX0xJTUJfSElHSEJJVCwgbXBfbGltYl90LCAgICAgIExMKCIweCVsWCIsIjB4JWxsWCIpKTsKKyAgQ0hFQ0tfSElHSEJJVCAoVUxPTkdfSElHSEJJVCwgICAgIHVuc2lnbmVkIGxvbmcsICAiMHglbFgiKTsKKyAgQ0hFQ0tfSElHSEJJVCAoVUlOVF9ISUdIQklULCAgICAgIHVuc2lnbmVkIGludCwgICAiMHglWCIpOworICBDSEVDS19ISUdIQklUIChVU0hSVF9ISUdIQklULCAgICAgdW5zaWduZWQgc2hvcnQsICIweCVoWCIpOworI2lmIDAgLyogQmFkISAqLworICBDSEVDS19ISUdIQklUIChMT05HX0hJR0hCSVQsICAgICAgbG9uZywgICAgICAgICAgICIweCVsWCIpOworICBDSEVDS19ISUdIQklUIChJTlRfSElHSEJJVCwgICAgICAgaW50LCAgICAgICAgICAgICIweCVYIik7CisgIENIRUNLX0hJR0hCSVQgKFNIUlRfSElHSEJJVCwgICAgICBzaG9ydCwgICAgICAgICAgIjB4JWhYIik7CisjZW5kaWYKKworI2lmIDAgLyogQmFkISAqLworICBDSEVDS19NQVggKExPTkdfTUFYLCAgICAgIExPTkdfTUlOLCAgICAgIGxvbmcsICAgICAgICAgICAiJWxkIik7CisgIENIRUNLX01BWCAoSU5UX01BWCwgICAgICAgSU5UX01JTiwgICAgICAgaW50LCAgICAgICAgICAgICIlZCIpOworICBDSEVDS19NQVggKFNIUlRfTUFYLCAgICAgIFNIUlRfTUlOLCAgICAgIHNob3J0LCAgICAgICAgICAiJWhkIik7CisjZW5kaWYKKyAgQ0hFQ0tfTUFYIChVTE9OR19NQVgsICAgICAwLCAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCAgIiVsdSIpOworICBDSEVDS19NQVggKFVJTlRfTUFYLCAgICAgIDAsICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgICAiJXUiKTsKKyAgQ0hFQ0tfTUFYIChVU0hSVF9NQVgsICAgICAwLCAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCwgIiVodSIpOworI2lmIDAgLyogQmFkISAqLworICBDSEVDS19NQVggKE1QX1NJWkVfVF9NQVgsIE1QX1NJWkVfVF9NSU4sIG1wX3NpemVfdCwgICAgICBTUygiJWQiLCIlbGQiKSk7CisjZW5kaWYKKworICAvKiBVSFd0eXBlIHNob3VsZCBoYXZlIGF0IGxlYXN0IGVub3VnaCBiaXRzIGZvciBoYWxmIGEgVVd0eXBlICovCisgIHsKKyAgICBpbnQgIGJpdHNfcGVyX1VXdHlwZSwgYml0c19wZXJfVUhXdHlwZTsKKyAgICBDQUxDX0JJVFMgKGJpdHNfcGVyX1VXdHlwZSwgIFVXdHlwZSk7CisgICAgQ0FMQ19CSVRTIChiaXRzX3Blcl9VSFd0eXBlLCBVSFd0eXBlKTsKKyAgICBDSEVDS19DT05ESVRJT04gKDIqYml0c19wZXJfVUhXdHlwZSA+PSBiaXRzX3Blcl9VV3R5cGUpOworICB9CisKKyAgQVNTRVJUX0FMV0FZU19MSU1CIChNT0RMSU1CX0lOVkVSU0VfMyk7CisgIHsKKyAgICBtcF9saW1iX3QgIG1vZGxpbWJfaW52ZXJzZV8zX2NhbGM7CisgICAgYmludmVydF9saW1iIChtb2RsaW1iX2ludmVyc2VfM19jYWxjLCBDTlNUX0xJTUIoMykpOworICAgIEFTU0VSVF9BTFdBWVNfTElNQiAobW9kbGltYl9pbnZlcnNlXzNfY2FsYyk7CisgICAgQ0hFQ0tfTElNQiAoTU9ETElNQl9JTlZFUlNFXzMsIG1vZGxpbWJfaW52ZXJzZV8zX2NhbGMpOworICB9CisgIHsKKyAgICBtcF9saW1iX3QgIE1PRExJTUJfSU5WRVJTRV8zX3RpbWVzXzMKKyAgICAgID0gKE1PRExJTUJfSU5WRVJTRV8zICogQ05TVF9MSU1CKDMpKSAmIEdNUF9OVU1CX01BU0s7CisgICAgQ0hFQ0tfTElNQiAoTU9ETElNQl9JTlZFUlNFXzNfdGltZXNfMywgQ05TVF9MSU1CKDEpKTsKKyAgfQorCisgIHsKKyAgICBtcF9saW1iX3QgIGhpLCBsbzsKKyAgICBoaSA9IHJlZm1wbl91bXVsX3BwbW0gKCZsbywgR01QX05VTUJfQ0VJTF9NQVhfRElWMy0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ05TVF9MSU1CKDMpIDw8IEdNUF9OQUlMX0JJVFMpOworICAgIGlmICghIChoaSA8IDEpKQorICAgICAgeworICAgICAgICBwcmludGYgKCJHTVBfTlVNQl9DRUlMX01BWF9ESVYzIHRvbyBiaWdcbiIpOworICAgICAgICBlcnJvciA9IDE7CisgICAgICB9CisgICAgaGkgPSByZWZtcG5fdW11bF9wcG1tICgmbG8sIEdNUF9OVU1CX0NFSUxfTUFYX0RJVjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDTlNUX0xJTUIoMykgPDwgR01QX05BSUxfQklUUyk7CisgICAgaWYgKCEgKGhpID49IDEpKQorICAgICAgeworICAgICAgICBwcmludGYgKCJHTVBfTlVNQl9DRUlMX01BWF9ESVYzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgIH0KKyAgfQorCisgIHsKKyAgICBtcF9saW1iX3QgIGhpLCBsbzsKKyAgICBoaSA9IHJlZm1wbl91bXVsX3BwbW0gKCZsbywgR01QX05VTUJfQ0VJTF8yTUFYX0RJVjMtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENOU1RfTElNQigzKSA8PCBHTVBfTkFJTF9CSVRTKTsKKyAgICBpZiAoISAoaGkgPCAyKSkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmICgiR01QX05VTUJfQ0VJTF8yTUFYX0RJVjMgdG9vIGJpZ1xuIik7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgIH0KKyAgICBoaSA9IHJlZm1wbl91bXVsX3BwbW0gKCZsbywgR01QX05VTUJfQ0VJTF8yTUFYX0RJVjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDTlNUX0xJTUIoMykgPDwgR01QX05BSUxfQklUUyk7CisgICAgaWYgKCEgKGhpID49IDIpKQorICAgICAgeworICAgICAgICBwcmludGYgKCJHTVBfTlVNQl9DRUlMXzJNQVhfRElWMyB0b28gc21hbGxcbiIpOworICAgICAgICBlcnJvciA9IDE7CisgICAgICB9CisgIH0KKworI2lmZGVmIFBQX0lOVkVSVEVECisgIHsKKyAgICBtcF9saW1iX3QgIHBwX2ludmVydGVkX2NhbGM7CisgICAgaW52ZXJ0X2xpbWIgKHBwX2ludmVydGVkX2NhbGMsIFBQKTsKKyAgICBDSEVDS19MSU1CIChQUF9JTlZFUlRFRCwgcHBfaW52ZXJ0ZWRfY2FsYyk7CisgIH0KKyNlbmRpZgorCisgIGlmIChhcmdjID49IDIgfHwgZXJyb3IpCisgICAgeworICAgICAgaW50ICBiaXRzOworCisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiQWZ0ZXIgZ21wLmgsXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgVUxPTkdfTUFYICAlc1xuIiwgdWxvbmdfbWF4X2RlZik7CisgICAgICBwcmludGYgKCIgIExPTkdfTUFYICAgJXNcbiIsIGxvbmdfbWF4X2RlZik7CisgICAgICBwcmludGYgKCIgIFVJTlRfTUFYICAgJXNcbiIsIHVpbnRfbWF4X2RlZik7CisgICAgICBwcmludGYgKCIgIElOVF9NQVggICAgJXNcbiIsIGludF9tYXhfZGVmKTsKKyAgICAgIHByaW50ZiAoIiAgVVNIUlRfTUFYICAlc1xuIiwgdXNocnRfbWF4X2RlZik7CisgICAgICBwcmludGYgKCIgIFNIUlRfTUFYICAgJXNcbiIsIHNocnRfbWF4X2RlZik7CisgICAgICBwcmludGYgKCJcbiIpOworCisjaWZkZWYgX0NSQVkKKyAgICAgIHByaW50ZiAoIl9DUkFZIGlzIGRlZmluZWQsIHNvIGxpbWl0cy5oIGlzIGJlaW5nIHVzZWRcbiIpOworI2VuZGlmCisKKyAgICAgIHByaW50ZiAoIlVMT05HX01BWCAgICAgICVsWFxuIiwgVUxPTkdfTUFYKTsKKyAgICAgIHByaW50ZiAoIlVMT05HX0hJR0hCSVQgICVsWFxuIiwgVUxPTkdfSElHSEJJVCk7CisgICAgICBwcmludGYgKCJMT05HX01BWCAgICAgICAlbFhcbiIsIExPTkdfTUFYKTsKKyAgICAgIHByaW50ZiAoIkxPTkdfTUlOICAgICAgICVsWFxuIiwgTE9OR19NSU4pOworCisgICAgICBwcmludGYgKCJVSU5UX01BWCAgICAgICAlWFxuIiwgVUlOVF9NQVgpOworICAgICAgcHJpbnRmICgiVUlOVF9ISUdIQklUICAgJVhcbiIsIFVJTlRfSElHSEJJVCk7CisgICAgICBwcmludGYgKCJJTlRfTUFYICAgICAgICAlWFxuIiwgSU5UX01BWCk7CisgICAgICBwcmludGYgKCJJTlRfTUlOICAgICAgICAlWFxuIiwgSU5UX01JTik7CisKKyAgICAgIHByaW50ZiAoIlVTSFJUX01BWCAgICAgICVYXG4iLCBVU0hSVF9NQVgpOworICAgICAgcHJpbnRmICgiVVNIUlRfSElHSEJJVCAgJVhcbiIsIFVTSFJUX0hJR0hCSVQpOworICAgICAgcHJpbnRmICgiU0hSVF9NQVggICAgICAgJVhcbiIsIFNIUlRfTUFYKTsKKyAgICAgIHByaW50ZiAoIlNIUlRfTUlOICAgICAgICVYXG4iLCBTSFJUX01JTik7CisKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCJCaXRzXG4iKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgbG9uZyk7ICAgICAgICAgICBwcmludGYgKCIgIGxvbmcgICAgICAgICAgICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgaW50KTsgICAgICAgICAgICBwcmludGYgKCIgIGludCAgICAgICAgICAgICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgc2hvcnQpOyAgICAgICAgICBwcmludGYgKCIgIHNob3J0ICAgICAgICAgICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgdW5zaWduZWQgbG9uZyk7ICBwcmludGYgKCIgIHVuc2lnbmVkIGxvbmcgICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgdW5zaWduZWQgaW50KTsgICBwcmludGYgKCIgIHVuc2lnbmVkIGludCAgICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgdW5zaWduZWQgc2hvcnQpOyBwcmludGYgKCIgIHVuc2lnbmVkIHNob3J0ICVkXG4iLCBiaXRzKTsKKyAgICAgIENBTENfQklUUyAoYml0cywgbXBfc2l6ZV90KTsgICAgICBwcmludGYgKCIgIG1wX3NpemVfdCAgICAgICVkXG4iLCBiaXRzKTsKKyAgICB9CisKKyAgaWYgKGVycm9yKQorICAgIGFib3J0ICgpOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdC1jb3VudF96ZXJvcy5jIGIvdGVzdHMvdC1jb3VudF96ZXJvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjI0M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90LWNvdW50X3plcm9zLmMKQEAgLTAsMCArMSw4NiBAQAorLyogVGVzdCBjb3VudF9sZWFkaW5nX3plcm9zIGFuZCBjb3VudF90cmFpbGluZ196ZXJvcy4KKworQ29weXJpZ2h0IDIwMDEtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKK3ZvaWQKK2NoZWNrX2NseiAoaW50IHdhbnQsIG1wX2xpbWJfdCBuKQoreworICBpbnQgIGdvdDsKKyAgY291bnRfbGVhZGluZ196ZXJvcyAoZ290LCBuKTsKKyAgaWYgKGdvdCAhPSB3YW50KQorICAgIHsKKyAgICAgIHByaW50ZiAgICAgICAgKCJjb3VudF9sZWFkaW5nX3plcm9zIHdyb25nXG4iKTsKKyAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIG4gICAgIiwgbik7CisgICAgICBwcmludGYgICAgICAgICgiICB3YW50ICVkXG4iLCB3YW50KTsKKyAgICAgIHByaW50ZiAgICAgICAgKCIgIGdvdCAgJWRcbiIsIGdvdCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK2NoZWNrX2N0eiAoaW50IHdhbnQsIG1wX2xpbWJfdCBuKQoreworICBpbnQgIGdvdDsKKyAgY291bnRfdHJhaWxpbmdfemVyb3MgKGdvdCwgbik7CisgIGlmIChnb3QgIT0gd2FudCkKKyAgICB7CisgICAgICBwcmludGYgKCJjb3VudF90cmFpbGluZ196ZXJvcyB3cm9uZ1xuIik7CisgICAgICBtcG5fdHJhY2UgKCIgIG4gICAgIiwgJm4sIChtcF9zaXplX3QpIDEpOworICAgICAgcHJpbnRmICAgICgiICB3YW50ICVkXG4iLCB3YW50KTsKKyAgICAgIHByaW50ZiAgICAoIiAgZ290ICAlZFxuIiwgZ290KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfdmFyaW91cyAodm9pZCkKK3sKKyAgaW50ICAgICAgICBpOworCisjaWZkZWYgQ09VTlRfTEVBRElOR19aRVJPU18wCisgIGNoZWNrX2NseiAoQ09VTlRfTEVBRElOR19aRVJPU18wLCBDTlNUX0xJTUIoMCkpOworI2VuZGlmCisKKyAgZm9yIChpPTA7IGkgPCBHTVBfTElNQl9CSVRTOyBpKyspCisgICAgeworICAgICAgY2hlY2tfY2x6IChpLCBDTlNUX0xJTUIoMSkgPDwgKEdNUF9MSU1CX0JJVFMtMS1pKSk7CisgICAgICBjaGVja19jdHogKGksIENOU1RfTElNQigxKSA8PCBpKTsKKworICAgICAgY2hlY2tfY3R6IChpLCBNUF9MSU1CX1RfTUFYIDw8IGkpOworICAgICAgY2hlY2tfY2x6IChpLCBNUF9MSU1CX1RfTUFYID4+IGkpOworICAgIH0KK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gMTY7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdC1oaWdodG9tYXNrLmMgYi90ZXN0cy90LWhpZ2h0b21hc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY1ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdC1oaWdodG9tYXNrLmMKQEAgLTAsMCArMSw0MiBAQAorLyogVGVzdCBMSU1CX0hJR0hCSVRfVE9fTUFTSy4KKworQ29weXJpZ2h0IDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIFRoZXJlJ3MgdmVyeSBsaXR0bGUgdG8gdGhlc2UgdGVzdHMsIGJ1dCBpdCdzIG5pY2UgdG8gaGF2ZSB0aGVtIHNpbmNlIGlmCisgICBzb21ldGhpbmcgaGFzIGdvbmUgd3Jvbmcgd2l0aCB0aGUgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBidXNpbmVzcyBpbgorICAgTElNQl9ISUdIQklUX1RPX01BU0sgdGhlbiB0aGUgb25seSBzeW1wdG9tIGlzIGxpa2VseSB0byBiZSBmYWlsdXJlcyBpbgorICAgdWRpdl9xcm5uZF9wcmVpbnYsIHdoaWNoIHdvdWxkIG5vdCBiZSBlYXN5IHRvIGRpYWdub3NlLiAgKi8KKworaW50CittYWluICh2b2lkKQoreworICBBU1NFUlRfQUxXQVlTIChMSU1CX0hJR0hCSVRfVE9fTUFTSyAoMCkgPT0gMCk7CisgIEFTU0VSVF9BTFdBWVMgKExJTUJfSElHSEJJVF9UT19NQVNLIChHTVBfTElNQl9ISUdIQklUKSA9PSBNUF9MSU1CX1RfTUFYKTsKKyAgQVNTRVJUX0FMV0FZUyAoTElNQl9ISUdIQklUX1RPX01BU0sgKE1QX0xJTUJfVF9NQVgpID09IE1QX0xJTUJfVF9NQVgpOworICBBU1NFUlRfQUxXQVlTIChMSU1CX0hJR0hCSVRfVE9fTUFTSyAoR01QX0xJTUJfSElHSEJJVCA+PiAxKSA9PSAwKTsKKyAgQVNTRVJUX0FMV0FZUyAoTElNQl9ISUdIQklUX1RPX01BU0sgKE1QX0xJTUJfVF9NQVggPj4gMSkgPT0gMCk7CisKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90LW1vZGxpbnYuYyBiL3Rlc3RzL3QtbW9kbGludi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90LW1vZGxpbnYuYwpAQCAtMCwwICsxLDgzIEBACisvKiBUZXN0IGJpbnZlcnRfbGltYi4KKworQ29weXJpZ2h0IDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CithbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLAorb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCit1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorI2luY2x1ZGUgInRlc3RzLmgiCisKKwordm9pZAorb25lIChtcF9saW1iX3QgbikKK3sKKyAgbXBfbGltYl90ICBpbnYsIHByb2Q7CisKKyAgYmludmVydF9saW1iIChpbnYsIG4pOworICBwcm9kID0gKGludiAqIG4pICYgR01QX05VTUJfTUFTSzsKKyAgaWYgKHByb2QgIT0gMSkKKyAgICB7CisgICAgICBwcmludGYgKCJiaW52ZXJ0X2xpbWIgd3JvbmdcbiIpOworICAgICAgbXBfbGltYl90cmFjZSAoIiAgbiAgICAgICAiLCBuKTsKKyAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIGdvdCAgICAgIiwgaW52KTsKKyAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIHByb2R1Y3QgIiwgcHJvZCk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NvbWUgKHZvaWQpCit7CisgIGludCAgaTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspCisgICAgb25lIChyZWZtcG5fcmFuZG9tX2xpbWIgKCkgfCAxKTsKK30KKwordm9pZAorYWxsICh2b2lkKQoreworICBtcF9saW1iX3QgIG47CisKKyAgbiA9IDE7CisgIGRvIHsKKyAgICBvbmUgKG4pOworICAgIG4gKz0gMjsKKyAgfSB3aGlsZSAobiAhPSAxKTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworCisgIGlmIChhcmdjID49IDIgJiYgc3RyY21wIChhcmd2WzFdLCAiLWEiKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIGl0J3MgZmVhc2libGUgdG8gcnVuIGFsbCB2YWx1ZXMgb24gYSAzMi1iaXQgbGltYiwgYnV0IG5vdCBhIDY0LWJpdCAqLworICAgICAgYWxsICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNvbWUgKCk7CisgICAgfQorCisgIHRlc3RzX2VuZCAoKTsKKyAgZXhpdCAoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy90LXBhcml0eS5jIGIvdGVzdHMvdC1wYXJpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYyMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdC1wYXJpdHkuYwpAQCAtMCwwICsxLDY2IEBACisvKiBUZXN0IFVMT05HX1BBUklUWS4KKworQ29weXJpZ2h0IDIwMDIsIDIwMTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKwordm9pZAorY2hlY2tfb25lIChpbnQgd2FudCwgdW5zaWduZWQgbG9uZyBuKQoreworICBpbnQgIGdvdDsKKyAgVUxPTkdfUEFSSVRZIChnb3QsIG4pOworICBpZiAoZ290ICE9IHdhbnQpCisgICAgeworICAgICAgcHJpbnRmICgiVUxPTkdfUEFSSVRZIHdyb25nXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgbiAgICAlbFhcbiIsIG4pOworICAgICAgcHJpbnRmICgiICB3YW50ICVkXG4iLCB3YW50KTsKKyAgICAgIHByaW50ZiAoIiAgZ290ICAlZFxuIiwgZ290KTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwordm9pZAorY2hlY2tfdmFyaW91cyAodm9pZCkKK3sKKyAgaW50ICBpOworCisgIGNoZWNrX29uZSAoMCwgMEwpOworICBjaGVja19vbmUgKEJJVFNfUEVSX1VMT05HICYgMSwgVUxPTkdfTUFYKTsKKyAgY2hlY2tfb25lICgwLCAweDExTCk7CisgIGNoZWNrX29uZSAoMSwgMHgxMTFMKTsKKyAgY2hlY2tfb25lICgxLCAweDMxMTFMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgQklUU19QRVJfVUxPTkc7IGkrKykKKyAgICBjaGVja19vbmUgKDEsIDFVTCA8PCBpKTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHRlc3RzX3N0YXJ0ICgpOworICBtcF90cmFjZV9iYXNlID0gMTY7CisKKyAgY2hlY2tfdmFyaW91cyAoKTsKKworICB0ZXN0c19lbmQgKCk7CisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdC1wb3BjLmMgYi90ZXN0cy90LXBvcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFkNGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdC1wb3BjLmMKQEAgLTAsMCArMSw3OSBAQAorLyogVGVzdCBwb3BjX2xpbWIuCisKK0NvcHlyaWdodCAyMDAyLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCitpbnQKK21haW4gKHZvaWQpCit7CisgIG1wX2xpbWJfdCAgc3JjLCB3YW50LCBnb3Q7CisgIGludCAgICAgICAgaTsKKworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBmb3IgKGkgPSAwOyBpIDwgR01QX0xJTUJfQklUUzsgaSsrKQorICAgIHsKKyAgICAgIHNyYyA9IENOU1RfTElNQigxKSA8PCBpOworICAgICAgd2FudCA9IDE7CisKKyAgICAgIHBvcGNfbGltYiAoZ290LCBzcmMpOworICAgICAgaWYgKGdvdCAhPSB3YW50KQorICAgICAgICB7CisgICAgICAgIGVycm9yOgorICAgICAgICAgIHByaW50ZiAoInBvcGNfbGltYiB3cm9uZyByZXN1bHRcbiIpOworICAgICAgICAgIG1wbl90cmFjZSAoIiAgc3JjICIsICZzcmMsICAobXBfc2l6ZV90KSAxKTsKKyAgICAgICAgICBtcG5fdHJhY2UgKCIgIHdhbnQiLCAmd2FudCwgKG1wX3NpemVfdCkgMSk7CisgICAgICAgICAgbXBuX3RyYWNlICgiICBnb3QgIiwgJmdvdCwgIChtcF9zaXplX3QpIDEpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorCisgIHNyYyA9IDA7CisgIHdhbnQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgR01QX0xJTUJfQklUUzsgaSsrKQorICAgIHsKKyAgICAgIHNyYyArPSBDTlNUX0xJTUIoMSkgPDwgaTsKKyAgICAgIHdhbnQgKz0gMTsKKworICAgICAgcG9wY19saW1iIChnb3QsIHNyYyk7CisgICAgICBpZiAoZ290ICE9IHdhbnQpCisgICAgICAgIHsKKwkgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHsKKyAgICAgIG1wbl9yYW5kb20yICgmc3JjLCAobXBfc2l6ZV90KSAxKTsKKyAgICAgIHdhbnQgPSByZWZfcG9wY19saW1iIChzcmMpOworCisgICAgICBwb3BjX2xpbWIgKGdvdCwgc3JjKTsKKyAgICAgIGlmIChnb3QgIT0gd2FudCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Qtc3ViLmMgYi90ZXN0cy90LXN1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTZkNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90LXN1Yi5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBUZXN0IHN1Yl9kZG1tc3MuCisKK0NvcHlyaWdodCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4KKworVGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKK2FuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsCitvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK3VzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLiAgSWYgbm90LCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKK3ZvaWQKK2NoZWNrX2RhdGEgKHZvaWQpCit7CisjZGVmaW5lIE0gIE1QX0xJTUJfVF9NQVgKKworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBtcF9saW1iX3QgIHdhbnRfZGgsd2FudF9kbCwgbWgsbWwsIHNoLHNsOworICB9IGRhdGFbXSA9IHsKKyAgICB7IDAsMCwgIDAsMCwgIDAsMCB9LAorICAgIHsgMCwwLCAgMCwxLCAgMCwxIH0sCisgICAgeyAwLDAsICAxLDIsICAxLDIgfSwKKworICAgIHsgMCwxLCAgMCwyLCAgMCwxIH0sCisgICAgeyAwLE0sICAxLDAsICAwLDEgfSwKKyAgICB7IE0sTSwgIDAsMCwgIDAsMSB9LAorCisgICAgeyBNLE0sICAwLE0tMSwgIDAsTSB9LAorICAgIHsgMCwwLCAgMCxNLTEsICAwLE0tMSB9LAorICAgIHsgMCwxLCAgMCxNLTEsICAwLE0tMiB9LAorICB9OworICBpbnQgIGk7CisgIG1wX2xpbWJfdCAgZ290X2RoLCBnb3RfZGw7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWJlcm9mIChkYXRhKTsgaSsrKQorICAgIHsKKyAgICAgIHN1Yl9kZG1tc3MgKGdvdF9kaCxnb3RfZGwsIGRhdGFbaV0ubWgsZGF0YVtpXS5tbCwgZGF0YVtpXS5zaCxkYXRhW2ldLnNsKTsKKyAgICAgIGlmIChnb3RfZGggIT0gZGF0YVtpXS53YW50X2RoIHx8IGdvdF9kbCAhPSBkYXRhW2ldLndhbnRfZGwpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYgKCJjaGVja19kYXRhIHdyb25nIGF0IGRhdGFbJWRdXG4iLCBpKTsKKyAgICAgICAgICBtcF9saW1iX3RyYWNlICgiICBtaCIsIGRhdGFbaV0ubWgpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIG1sIiwgZGF0YVtpXS5tbCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgc2giLCBkYXRhW2ldLnNoKTsKKyAgICAgICAgICBtcF9saW1iX3RyYWNlICgiICBzbCIsIGRhdGFbaV0uc2wpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIHdhbnQgZGgiLCBkYXRhW2ldLndhbnRfZGgpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIHdhbnQgZGwiLCBkYXRhW2ldLndhbnRfZGwpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIGdvdCBkaCAiLCBnb3RfZGgpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIGdvdCBkbCAiLCBnb3RfZGwpOworICAgICAgICAgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkCitjaGVja19yYW5kb20gKHZvaWQpCit7CisgIG1wX2xpbWJfdCAgd2FudF9kaCx3YW50X2RsLCBnb3RfZGgsZ290X2RsLCBtaCxtbCwgc2gsc2w7CisgIGludCAgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICB7CisgICAgICBtaCA9IHVyYW5kb20gKCk7CisgICAgICBtbCA9IHVyYW5kb20gKCk7CisgICAgICBzaCA9IHVyYW5kb20gKCk7CisgICAgICBzbCA9IHVyYW5kb20gKCk7CisKKyAgICAgIHJlZm1wbl9zdWJfZGRtbXNzICgmd2FudF9kaCwmd2FudF9kbCwgbWgsbWwsIHNoLHNsKTsKKworICAgICAgc3ViX2RkbW1zcyAoZ290X2RoLGdvdF9kbCwgbWgsbWwsIHNoLHNsKTsKKworICAgICAgaWYgKGdvdF9kaCAhPSB3YW50X2RoIHx8IGdvdF9kbCAhPSB3YW50X2RsKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmICgiY2hlY2tfZGF0YSB3cm9uZyBhdCBkYXRhWyVkXVxuIiwgaSk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgbWgiLCBtaCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgbWwiLCBtbCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgc2giLCBzaCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgc2wiLCBzbCk7CisgICAgICAgICAgbXBfbGltYl90cmFjZSAoIiAgd2FudCBkaCIsIHdhbnRfZGgpOworICAgICAgICAgIG1wX2xpbWJfdHJhY2UgKCIgIHdhbnQgZGwiLCB3YW50X2RsKTsKKyAgICAgICAgICBtcF9saW1iX3RyYWNlICgiICBnb3QgZGggIiwgZ290X2RoKTsKKyAgICAgICAgICBtcF9saW1iX3RyYWNlICgiICBnb3QgZGwgIiwgZ290X2RsKTsKKyAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0c19zdGFydCAoKTsKKyAgbXBfdHJhY2VfYmFzZSA9IC0xNjsKKworICBjaGVja19kYXRhICgpOworICBjaGVja19yYW5kb20gKCk7CisKKyAgdGVzdHNfZW5kICgpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RzLmggYi90ZXN0cy90ZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmM2MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0cy5oCkBAIC0wLDAgKzEsNDQ3IEBACisvKiBUZXN0cyBzdXBwb3J0IHByb3RvdHlwZXMgZXRjLgorCitDb3B5cmlnaHQgMjAwMC0yMDA0LCAyMDA4LTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworI2lmbmRlZiBfX1RFU1RTX0hfXworI2RlZmluZSBfX1RFU1RTX0hfXworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4gIC8qIGZvciBqbXBfYnVmICovCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEFOWUFSR1MgIC4uLgorI2Vsc2UKKyNkZWZpbmUgQU5ZQVJHUworI2VuZGlmCisKKwordm9pZCB0ZXN0c19zdGFydCAodm9pZCk7Cit2b2lkIHRlc3RzX2VuZCAodm9pZCk7CisKK3ZvaWQgdGVzdHNfbWVtb3J5X3N0YXJ0ICh2b2lkKTsKK3ZvaWQgdGVzdHNfbWVtb3J5X2VuZCAodm9pZCk7Cit2b2lkICp0ZXN0c19hbGxvY2F0ZSAoc2l6ZV90KTsKK3ZvaWQgKnRlc3RzX3JlYWxsb2NhdGUgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOwordm9pZCB0ZXN0c19mcmVlICh2b2lkICosIHNpemVfdCk7Cit2b2lkIHRlc3RzX2ZyZWVfbm9zaXplICh2b2lkICopOworaW50IHRlc3RzX21lbW9yeV92YWxpZCAodm9pZCAqKTsKKwordm9pZCB0ZXN0c19yYW5kX3N0YXJ0ICh2b2lkKTsKK3ZvaWQgdGVzdHNfcmFuZF9lbmQgKHZvaWQpOworCitkb3VibGUgdGVzdHNfaW5maW5pdHlfZCAoKTsKK2ludCB0ZXN0c19oYXJkd2FyZV9nZXRyb3VuZCAodm9pZCk7CitpbnQgdGVzdHNfaGFyZHdhcmVfc2V0cm91bmQgKGludCk7CitpbnQgdGVzdHNfaXNpbmYgKGRvdWJsZSk7CitpbnQgdGVzdHNfZGJsX21hbnRfYml0cyAodm9pZCk7CisKK3ZvaWQgeDg2X2ZsZGN3ICh1bnNpZ25lZCBzaG9ydCk7Cit1bnNpZ25lZCBzaG9ydCB4ODZfZnN0Y3cgKHZvaWQpOworCisKKy8qIHRlc3RzX3NldGptcF9zaWdmcGUgaXMgbGlrZSBhIHNldGptcCwgZXN0YWJsaXNoaW5nIGEgdHJhcCBmb3IgU0lHRlBFLgorICAgVGhlIGluaXRpYWwgcmV0dXJuIGlzIDAsIGlmIFNJR0ZQRSBpcyB0cmFwcGVkIGV4ZWN1dGlvbiBnb2VzIGJhY2sgdGhlcmUKKyAgIHdpdGggcmV0dXJuIHZhbHVlIDEuCisKKyAgIHRlc3RzX3NpZ2ZwZV9kb25lIHB1dHMgU0lHRlBFIGJhY2sgdG8gU0lHX0RGTCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgb25jZQorICAgdGhlIHNldGptcCBwb2ludCBpcyBvdXQgb2Ygc2NvcGUsIHNvIGEgbGF0ZXIgU0lHRlBFIHdvbid0IHRyeSB0byBnbyBiYWNrCisgICB0aGVyZS4gICovCisKKyNkZWZpbmUgdGVzdHNfc2V0am1wX3NpZ2ZwZSgpICAgICAgICAgICAgICAgICAgIFwKKyAgKHNpZ25hbCAoU0lHRlBFLCB0ZXN0c19zaWdmcGVfaGFuZGxlciksICAgICAgIFwKKyAgIHNldGptcCAodGVzdHNfc2lnZnBlX3RhcmdldCkpCisKK1JFVFNJR1RZUEUgdGVzdHNfc2lnZnBlX2hhbmRsZXIgKGludCk7Cit2b2lkIHRlc3RzX3NpZ2ZwZV9kb25lICh2b2lkKTsKK2V4dGVybiBqbXBfYnVmICB0ZXN0c19zaWdmcGVfdGFyZ2V0OworCisKKyNpZiBIQVZFX0NBTExJTkdfQ09OVkVOVElPTlMKK2V4dGVybiBtcF9saW1iX3QgKCpjYWxsaW5nX2NvbnZlbnRpb25zX2Z1bmN0aW9uKSAoQU5ZQVJHUyk7CittcF9saW1iX3QgY2FsbGluZ19jb252ZW50aW9ucyAoQU5ZQVJHUyk7CitpbnQgY2FsbGluZ19jb252ZW50aW9uc19jaGVjayAodm9pZCk7CisjZGVmaW5lIENBTExJTkdfQ09OVkVOVElPTlMoZnVuY3Rpb24pIFwKKyAgKGNhbGxpbmdfY29udmVudGlvbnNfZnVuY3Rpb24gPSAoZnVuY3Rpb24pLCBjYWxsaW5nX2NvbnZlbnRpb25zKQorI2RlZmluZSBDQUxMSU5HX0NPTlZFTlRJT05TX0NIRUNLKCkgICAgKGNhbGxpbmdfY29udmVudGlvbnNfY2hlY2soKSkKKyNlbHNlCisjZGVmaW5lIENBTExJTkdfQ09OVkVOVElPTlMoZnVuY3Rpb24pICAoZnVuY3Rpb24pCisjZGVmaW5lIENBTExJTkdfQ09OVkVOVElPTlNfQ0hFQ0soKSAgICAxIC8qIGFsd2F5cyBvayAqLworI2VuZGlmCisKKworZXh0ZXJuIGludCBtcF90cmFjZV9iYXNlOwordm9pZCBtcF9saW1iX3RyYWNlIChjb25zdCBjaGFyICosIG1wX2xpbWJfdCk7Cit2b2lkIG1wbl90cmFjZSAoY29uc3QgY2hhciAqLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIG1wbl90cmFjZWEgKGNvbnN0IGNoYXIgKiwgY29uc3QgbXBfcHRyICosIGludCwgbXBfc2l6ZV90KTsKK3ZvaWQgbXBuX3RyYWNlbiAoY29uc3QgY2hhciAqLCBpbnQsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgbXBuX3RyYWNlX2ZpbGUgKGNvbnN0IGNoYXIgKiwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOwordm9pZCBtcG5fdHJhY2VhX2ZpbGUgKGNvbnN0IGNoYXIgKiwgY29uc3QgbXBfcHRyICosIGludCwgbXBfc2l6ZV90KTsKK3ZvaWQgbXBmX3RyYWNlIChjb25zdCBjaGFyICosIG1wZl9zcmNwdHIpOwordm9pZCBtcHFfdHJhY2UgKGNvbnN0IGNoYXIgKiwgbXBxX3NyY3B0cik7Cit2b2lkIG1wel90cmFjZSAoY29uc3QgY2hhciAqLCBtcHpfc3JjcHRyKTsKK3ZvaWQgbXB6X3RyYWNlbiAoY29uc3QgY2hhciAqLCBpbnQsIG1wel9zcmNwdHIpOwordm9pZCBieXRlX3RyYWNlIChjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgbXBfc2l6ZV90KTsKK3ZvaWQgYnl0ZV90cmFjZW4gKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCB2b2lkICosIG1wX3NpemVfdCk7Cit2b2lkIGRfdHJhY2UgKGNvbnN0IGNoYXIgKiwgZG91YmxlKTsKKworCit2b2lkIHNwaW5uZXIgKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgIHNwaW5uZXJfY291bnQ7CitleHRlcm4gaW50ICBzcGlubmVyX3dhbnRlZDsKK2V4dGVybiBpbnQgIHNwaW5uZXJfdGljazsKKworCit2b2lkICphbGlnbl9wb2ludGVyICh2b2lkICosIHNpemVfdCk7Cit2b2lkICpfX2dtcF9hbGxvY2F0ZV9mdW5jX2FsaWduZWQgKHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgKl9fZ21wX2FsbG9jYXRlX29yX3JlYWxsb2NhdGUgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOworY2hhciAqX19nbXBfYWxsb2NhdGVfc3RyZHVwIChjb25zdCBjaGFyICopOworY2hhciAqc3RydG91cHBlciAoY2hhciAqKTsKK21wX2xpbWJfdCB1cmFuZG9tICh2b2lkKTsKK3ZvaWQgY2FsbF9yYW5kX2FsZ3MgKHZvaWQgKCpmdW5jKSAoY29uc3QgY2hhciAqLCBnbXBfcmFuZHN0YXRlX3QpKTsKKworCit2b2lkIG1wZl9zZXRfc3RyX29yX2Fib3J0IChtcGZfcHRyLCBjb25zdCBjaGFyICosIGludCk7CisKKwordm9pZCBtcHFfc2V0X3N0cl9vcl9hYm9ydCAobXBxX3B0ciwgY29uc3QgY2hhciAqLCBpbnQpOworCisKK3ZvaWQgbXB6X2VyYW5kb21iIChtcHpfcHRyLCBnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBtcHpfZXJhbmRvbWJfbm9uemVybyAobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgbXB6X2VycmFuZG9tYiAobXB6X3B0ciwgZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgbXB6X2VycmFuZG9tYl9ub256ZXJvIChtcHpfcHRyLCBnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBtcHpfaW5pdF9zZXRfbiAobXB6X3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOwordm9pZCBtcHpfbmVncmFuZG9tIChtcHpfcHRyLCBnbXBfcmFuZHN0YXRlX3QpOworaW50IG1wel9wb3cyYWJzX3AgKG1wel9zcmNwdHIpIF9fR01QX0FUVFJJQlVURV9QVVJFOwordm9pZCBtcHpfc2V0X24gKG1wel9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgbXB6X3NldF9zdHJfb3JfYWJvcnQgKG1wel9wdHIsIGNvbnN0IGNoYXIgKiwgaW50KTsKK3ZvaWQgbXB6X2Nsb2JiZXIobXB6X3B0cik7CisKK21wX3NpemVfdCBtcG5fZGlmZl9oaWdoZXN0IChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKK21wX3NpemVfdCBtcG5fZGlmZl9sb3dlc3QgKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpIF9fR01QX0FUVFJJQlVURV9QVVJFOworbXBfc2l6ZV90IGJ5dGVfZGlmZl9oaWdoZXN0IChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgbXBfc2l6ZV90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKK21wX3NpemVfdCBieXRlX2RpZmZfbG93ZXN0IChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgbXBfc2l6ZV90KSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworCittcF9saW1iX3QgcmVmX2FkZGNfbGltYiAobXBfbGltYl90ICosIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZfYnN3YXBfbGltYiAobXBfbGltYl90KTsKK3Vuc2lnbmVkIGxvbmcgcmVmX3BvcGNfbGltYiAobXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZfc3ViY19saW1iIChtcF9saW1iX3QgKiwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCisKK3ZvaWQgcmVmbXBmX2FkZCAobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cik7Cit2b2lkIHJlZm1wZl9hZGRfdWxwIChtcGZfcHRyICk7Cit2b2lkIHJlZm1wZl9maWxsIChtcGZfcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7Cit2b2lkIHJlZm1wZl9ub3JtYWxpemUgKG1wZl9wdHIpOwordm9pZCByZWZtcGZfc2V0X3ByZWNfbGltYnMgKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgbG9uZyByZWZtcGZfc2V0X292ZXJsYXAgKG1wZl9wdHIsIG1wZl9zcmNwdHIpOwordm9pZCByZWZtcGZfc3ViIChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKTsKK2ludCByZWZtcGZfdmFsaWRhdGUgKGNvbnN0IGNoYXIgKiwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cik7CitpbnQgcmVmbXBmX3ZhbGlkYXRlX2RpdmlzaW9uIChjb25zdCBjaGFyICosIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpOworCisKK21wX2xpbWJfdCByZWZtcG5fY25kX2FkZF9uIChtcF9saW1iX3QsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2NuZF9zdWJfbiAobXBfbGltYl90LCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgcmVmbXBuX2FkZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9hZGRfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkX2VycjFfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkX2VycjJfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9hZGRfZXJyM19uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZF9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9hZGRsc2gxX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZGxzaDJfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbHNoX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQpOworbXBfbGltYl90IHJlZm1wbl9hZGRsc2gxX25faXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbHNoMl9uX2lwMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZGxzaF9uX2lwMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQpOworbXBfbGltYl90IHJlZm1wbl9hZGRsc2gxX25faXAyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbHNoMl9uX2lwMiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZGxzaF9uX2lwMiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQpOworbXBfbGltYl90IHJlZm1wbl9hZGRsc2gxX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZGxzaDJfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbHNoX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkLCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9hZGRtdWxfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbXVsXzFjIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZG11bF8yIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworbXBfbGltYl90IHJlZm1wbl9hZGRtdWxfMyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbXVsXzQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CittcF9saW1iX3QgcmVmbXBuX2FkZG11bF81IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworbXBfbGltYl90IHJlZm1wbl9hZGRtdWxfNiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKK21wX2xpbWJfdCByZWZtcG5fYWRkbXVsXzcgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CittcF9saW1iX3QgcmVmbXBuX2FkZG11bF84IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworCittcF9saW1iX3QgcmVmbXBuX2FkZF9uX3N1Yl9uIChtcF9wdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX2FkZF9uX3N1Yl9uYyAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CisKK3ZvaWQgcmVmbXBuX2FuZF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOwordm9pZCByZWZtcG5fYW5kbl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgcmVmbXBuX2JpZ19iYXNlIChpbnQpOworCitpbnQgcmVmbXBuX2NoYXJzX3Blcl9saW1iIChpbnQpOwordm9pZCByZWZtcG5fY2xyYml0IChtcF9wdHIsIHVuc2lnbmVkIGxvbmcpOworaW50IHJlZm1wbl9jbXAgKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworaW50IHJlZm1wbl9jbXBfYWxsb3d6ZXJvIChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK2ludCByZWZtcG5fY21wX3R3b3NpemVzIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCit2b2lkIHJlZm1wbl9jb20gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOwordm9pZCByZWZtcG5fY29weSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9jb3B5aSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9jb3B5ZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9jb3B5X2V4dGVuZCAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKwordW5zaWduZWQgcmVmbXBuX2NvdW50X2xlYWRpbmdfemVyb3MgKG1wX2xpbWJfdCk7Cit1bnNpZ25lZCByZWZtcG5fY291bnRfdHJhaWxpbmdfemVyb3MgKG1wX2xpbWJfdCk7CisKK21wX2xpbWJfdCByZWZtcG5fZGl2ZXhhY3RfYnkzIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fZGl2ZXhhY3RfYnkzYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKKworbXBfbGltYl90IHJlZm1wbl9kaXZtb2RfMSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fZGl2bW9kXzFjIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2RpdnJlbV8xIChtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2RpdnJlbV8xYyAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2RpdnJlbV8yIChtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CisKK2ludCByZWZtcG5fZXF1YWxfYW55bmFpbCAobXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKK3ZvaWQgcmVmbXBuX2ZpbGwgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworCittcF9saW1iX3QgcmVmbXBuX2djZF8xMSAobXBfbGltYl90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9nY2RfMSAobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9kb3VibGVfbGltYl90IHJlZm1wbl9nY2RfMjIgKG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX2djZCAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QpOworCitzaXplX3QgcmVmbXBuX2dldF9zdHIgKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBtcF9wdHIsIG1wX3NpemVfdCk7CisKK3Vuc2lnbmVkIGxvbmcgcmVmbXBuX2hhbWRpc3QgKG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgcmVmbXBuX2ludmVydF9saW1iIChtcF9saW1iX3QpOwordm9pZCByZWZtcG5faW9yX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9pb3JuX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CisKK21wX2xpbWJfdCByZWZtcG5fbHNoaWZ0IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCk7CittcF9saW1iX3QgcmVmbXBuX2xzaGlmdF9vcl9jb3B5IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCk7CittcF9saW1iX3QgcmVmbXBuX2xzaGlmdF9vcl9jb3B5X2FueSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQpOworbXBfbGltYl90IHJlZm1wbl9sc2hpZnRjIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCk7Cit2b2lkIHJlZm1wbl9jb20gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9wdHIgcmVmbXBuX21hbGxvY19saW1icyAobXBfc2l6ZV90KTsKK21wX3B0ciByZWZtcG5fbWFsbG9jX2xpbWJzX2FsaWduZWQgKG1wX3NpemVfdCwgc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX2ZyZWVfbGltYnMgKG1wX3B0cik7CittcF9saW1iX3QgcmVmbXBuX21zYm9uZSAobXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fbXNib25lX21hc2sgKG1wX2xpbWJfdCk7CittcF9wdHIgcmVmbXBuX21lbWR1cF9saW1icyAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgcmVmbXBuX21vZF8xIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fbW9kXzFjIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9tb2RfMzRsc3ViMSAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCittcF9saW1iX3QgcmVmbXBuX211bF8xIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9tdWxfMWMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fbXVsXzIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CittcF9saW1iX3QgcmVmbXBuX211bF8zIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworbXBfbGltYl90IHJlZm1wbl9tdWxfNCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyKTsKK21wX2xpbWJfdCByZWZtcG5fbXVsXzUgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cik7CittcF9saW1iX3QgcmVmbXBuX211bF82IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpOworCit2b2lkIHJlZm1wbl9tdWxfYmFzZWNhc2UgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX211bG1pZF9iYXNlY2FzZSAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOwordm9pZCByZWZtcG5fdG9vbTQyX211bG1pZCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOwordm9pZCByZWZtcG5fbXVsbWlkX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9tdWxtaWQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX211bGxvX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9tdWxfYW55IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9tdWxfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX211bCAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCit2b2lkIHJlZm1wbl9uYW5kX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl9uaW9yX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX25lZyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9zaXplX3QgcmVmbXBuX25vcm1hbGl6ZSAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCit1bnNpZ25lZCBsb25nIHJlZm1wbl9wb3Bjb3VudCAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9wcmVpbnZfZGl2cmVtXzEgKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QsIHVuc2lnbmVkKTsKK21wX2xpbWJfdCByZWZtcG5fcHJlaW52X21vZF8xIChtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCit2b2lkIHJlZm1wbl9yYW5kb20gKG1wX3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX3JhbmRvbTIgKG1wX3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fcmFuZG9tX2xpbWIgKHZvaWQpOworCittcF9saW1iX3QgcmVmbXBuX3JzaDFhZGRfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fcnNoMXN1Yl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9yc2hpZnQgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkKTsKK21wX2xpbWJfdCByZWZtcG5fcnNoaWZ0X29yX2NvcHkgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkKTsKK21wX2xpbWJfdCByZWZtcG5fcnNoaWZ0X29yX2NvcHlfYW55IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCk7CisKK21wX2xpbWJfdCByZWZtcG5fc2JfZGl2X3FyIChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7Cit1bnNpZ25lZCBsb25nIHJlZm1wbl9zY2FuMCAobXBfc3JjcHRyLCB1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgcmVmbXBuX3NjYW4xIChtcF9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpOwordm9pZCByZWZtcG5fc2V0Yml0IChtcF9wdHIsIHVuc2lnbmVkIGxvbmcpOwordm9pZCByZWZtcG5fc3FyIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX3NxcmxvIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX3NpemVfdCByZWZtcG5fc3FydHJlbSAobXBfcHRyLCBtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKKwordm9pZCByZWZtcG5fc3ViX2RkbW1zcyAobXBfbGltYl90ICosIG1wX2xpbWJfdCAqLCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworbXBfbGltYl90IHJlZm1wbl9zdWIgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fc3ViXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1Yl9lcnIxX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1Yl9lcnIyX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fc3ViX2VycjNfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1Yl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9zdWJfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fc3VibHNoMV9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9zdWJsc2gyX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1YmxzaF9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCk7CittcF9saW1iX3QgcmVmbXBuX3N1YmxzaDFfbl9pcDEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworbXBfbGltYl90IHJlZm1wbl9zdWJsc2gyX25faXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK21wX2xpbWJfdCByZWZtcG5fc3VibHNoX25faXAxIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworbXBfbGltYl90IHJlZm1wbl9zdWJsc2gxX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1YmxzaDJfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fc3VibHNoX25jIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIHVuc2lnbmVkIGludCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fc3VibXVsXzEgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCk7CittcF9saW1iX3QgcmVmbXBuX3N1Ym11bF8xYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90LCBtcF9saW1iX3QpOworCittcF9saW1iX3NpZ25lZF90IHJlZm1wbl9yc2Jsc2gxX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3NpZ25lZF90IHJlZm1wbl9yc2Jsc2gyX24gKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCk7CittcF9saW1iX3NpZ25lZF90IHJlZm1wbl9yc2Jsc2hfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworbXBfbGltYl9zaWduZWRfdCByZWZtcG5fcnNibHNoMV9uYyAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3NpZ25lZF90KTsKK21wX2xpbWJfc2lnbmVkX3QgcmVmbXBuX3JzYmxzaDJfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl9zaWduZWRfdCk7CittcF9saW1iX3NpZ25lZF90IHJlZm1wbl9yc2Jsc2hfbmMgKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50LCBtcF9saW1iX3NpZ25lZF90KTsKKwordm9pZCByZWZtcG5fdGRpdl9xciAobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK2ludCByZWZtcG5fdHN0Yml0IChtcF9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpOworCittcF9saW1iX3QgcmVmbXBuX3VkaXZfcXJubmQgKG1wX2xpbWJfdCAqLCBtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fdWRpdl9xcm5uZF9yIChtcF9saW1iX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QgKik7CittcF9saW1iX3QgcmVmbXBuX3VtdWxfcHBtbSAobXBfbGltYl90ICosIG1wX2xpbWJfdCwgbXBfbGltYl90KTsKK21wX2xpbWJfdCByZWZtcG5fdW11bF9wcG1tX3IgKG1wX2xpbWJfdCwgbXBfbGltYl90LCBtcF9saW1iX3QgKik7CisKK3ZvaWQgcmVmbXBuX3hub3JfbiAobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KTsKK3ZvaWQgcmVmbXBuX3hvcl9uIChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpOworCit2b2lkIHJlZm1wbl96ZXJvIChtcF9wdHIsIG1wX3NpemVfdCk7Cit2b2lkIHJlZm1wbl96ZXJvX2V4dGVuZCAobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NpemVfdCk7CitpbnQgcmVmbXBuX3plcm9fcCAobXBfc3JjcHRyLCBtcF9zaXplX3QpOworCit2b2lkIHJlZm1wbl9iaW52ZXJ0IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOwordm9pZCByZWZtcG5faW52ZXJ0IChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIpOworCisKK3ZvaWQgcmVmbXBxX2FkZCAobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cik7Cit2b2lkIHJlZm1wcV9zdWIgKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpOworCisKK3ZvaWQgcmVmbXB6X2NvbWJpdCAobXB6X3B0ciwgdW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBsb25nIHJlZm1wel9oYW1kaXN0IChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKK3ZvaWQgcmVmbXB6X2djZCAobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CitpbnQgcmVmbXB6X2tyb25lY2tlciAobXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CitpbnQgcmVmbXB6X2phY29iaSAobXB6X3NyY3B0ciwgbXB6X3NyY3B0cik7CitpbnQgcmVmbXB6X2xlZ2VuZHJlIChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKTsKK2ludCByZWZtcHpfa3JvbmVja2VyX3NpIChtcHpfc3JjcHRyLCBsb25nKTsKK2ludCByZWZtcHpfa3JvbmVja2VyX3VpIChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKTsKK2ludCByZWZtcHpfc2lfa3JvbmVja2VyIChsb25nLCBtcHpfc3JjcHRyKTsKK2ludCByZWZtcHpfdWlfa3JvbmVja2VyICh1bnNpZ25lZCBsb25nLCBtcHpfc3JjcHRyKTsKKwordm9pZCByZWZtcHpfcG93X3VpIChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKTsKKworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworCisvKiBFc3RhYmxpc2ggb3N0cmluZ3N0cmVhbSBhbmQgaXN0cmluZ3N0cmVhbS4gIERvIHRoaXMgaGVyZSBzbyBhcyB0byBoaWRlCisgICB0aGUgY29uZGl0aW9uYWxzLCByYXRoZXIgdGhhbiBwdXR0aW5nIHN0dWZmIGluIGVhY2ggdGVzdCBwcm9ncmFtLgorCisgICBPbGRpc2ggdmVyc2lvbnMgb2YgZysrLCBsaWtlIDIuOTUuMiwgZG9uJ3QgaGF2ZSA8c3N0cmVhbT4sIG9ubHkKKyAgIDxzdHJzdHJlYW0+LiAgRmFrZSB1cCBvc3RyaW5nc3RyZWFtIGFuZCBpc3RyaW5nc3RyZWFtIGNsYXNzZXMsIGJ1dCBub3QgYQorICAgZnVsbCBpbXBsZW1lbnRhdGlvbiwganVzdCBlbm91Z2ggZm9yIG91ciBwdXJwb3Nlcy4gICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2lmIDEgfHwgSEFWRV9TU1RSRUFNCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNlbHNlIC8qICEgSEFWRV9TU1RSRUFNICovCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cnN0cmVhbT4KK2NsYXNzCitvc3RyaW5nc3RyZWFtIDogcHVibGljIHN0ZDo6b3N0cnN0cmVhbSB7CisgcHVibGljOgorICBzdHJpbmcgc3RyKCkgeworICAgIGludCAgcGNvdW50ID0gb3N0cnN0cmVhbTo6cGNvdW50ICgpOworICAgIGNoYXIgKnMgPSAoY2hhciAqKSAoKl9fZ21wX2FsbG9jYXRlX2Z1bmMpIChwY291bnQgKyAxKTsKKyAgICBtZW1jcHkgKHMsIG9zdHJzdHJlYW06OnN0cigpLCBwY291bnQpOworICAgIHNbcGNvdW50XSA9ICdcMCc7CisgICAgc3RyaW5nIHJldCA9IHN0cmluZyhzKTsKKyAgICAoKl9fZ21wX2ZyZWVfZnVuYykgKHMsIHBjb3VudCArIDEpOworICAgIHJldHVybiByZXQ7IH0KK307CitjbGFzcworaXN0cmluZ3N0cmVhbSA6IHB1YmxpYyBzdGQ6OmlzdHJzdHJlYW0geworIHB1YmxpYzoKKyAgaXN0cmluZ3N0cmVhbSAoY29uc3QgY2hhciAqcykgOiBpc3Ryc3RyZWFtIChzKSB7IH07Cit9OworI2VuZGlmIC8qICEgSEFWRV9TU1RSRUFNICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisjZGVmaW5lIFRFU1RTX1JFUFMoY291bnQsIGFyZ3YsIGFyZ2MpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgIGNoYXIgKmVudnZhbCwgKmVuZDsJCQkJCQkJXAorICBkb3VibGUgcmVwZmFjdG9yOwkJCQkJCQlcCisgIGludCByZXBzX25vbmRlZmF1bHQgPSAwOwkJCQkJCVwKKyAgaWYgKGFyZ2MgPiAxKQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBjb3VudCA9IHN0cnRvbCAoYXJndlsxXSwgJmVuZCwgMCk7CQkJCVwKKyAgICAgIGlmICgqZW5kIHx8IGNvdW50IDw9IDApCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgdGVzdCBjb3VudDogJXMuXG4iLCBhcmd2WzFdKTsJXAorCSAgZXhpdCAoMSk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgICBhcmd2Kys7CQkJCQkJCQlcCisgICAgICBhcmdjLS07CQkJCQkJCQlcCisgICAgICByZXBzX25vbmRlZmF1bHQgPSAxOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICBlbnZ2YWwgPSBnZXRlbnYgKCJHTVBfQ0hFQ0tfUkVQRkFDVE9SIik7CQkJCVwKKyAgaWYgKGVudnZhbCAhPSBOVUxMKQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIHJlcGZhY3RvciA9IHN0cnRvZCAoZW52dmFsLCAmZW5kKTsJCQkJXAorICAgICAgaWYgKCplbmQgfHwgcmVwZmFjdG9yIDw9IDApCQkJCQlcCisJewkJCQkJCQkJXAorCSAgZnByaW50ZiAoc3RkZXJyLCAiSW52YWxpZCByZXBmYWN0b3I6ICVmLlxuIiwgcmVwZmFjdG9yKTsJXAorCSAgZXhpdCAoMSk7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgICBjb3VudCAqPSByZXBmYWN0b3I7CQkJCQkJXAorICAgICAgY291bnQgPSBNQVggKGNvdW50LCAxKTsJCQkJCQlcCisgICAgICByZXBzX25vbmRlZmF1bHQgPSAxOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICBpZiAocmVwc19ub25kZWZhdWx0KQkJCQkJCQlcCisgICAgcHJpbnRmICgiUnVubmluZyB0ZXN0IHdpdGggJWxkIHJlcGV0aXRpb25zIChpbmNsdWRlIHRoaXMgaW4gYnVnIHJlcG9ydHMpXG4iLFwKKwkgICAgKGxvbmcpIGNvdW50KTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworI2VuZGlmIC8qIF9fVEVTVFNfSF9fICovCmRpZmYgLS1naXQgYS90ZXN0cy90cmFjZS5jIGIvdGVzdHMvdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTM5N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdHJhY2UuYwpAQCAtMCwwICsxLDMxNyBAQAorLyogU3VwcG9ydCBmb3IgZGlhZ25vc3RpYyB0cmFjZXMuCisKK0NvcHlyaWdodCAxOTk5LTIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKworLyogRnV0dXJlOiBXb3VsZCBsaWtlIGNvbW1hcyBwcmludGVkIGJldHdlZW4gbGltYnMgaW4gaGV4IG9yIGJpbmFyeSwgYnV0CisgICBwZXJoYXBzIG5vdCBhbHdheXMgc2luY2UgaXQgbWlnaHQgdXBzZXQgY3V0dGluZyBhbmQgcGFzdGluZyBpbnRvIGJjIG9yCisgICB3aGF0ZXZlci4gICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIGZvciBzdHJsZW4gKi8KKworI2luY2x1ZGUgImdtcC1pbXBsLmgiCisKKyNpbmNsdWRlICJ0ZXN0cy5oIgorCisKKy8qIE51bWJlciBiYXNlIGZvciB0aGUgdmFyaW91cyB0cmFjZSBwcmludGluZyByb3V0aW5lcy4KKyAgIFNldCB0aGlzIGluIG1haW4oKSBvciB3aXRoIHRoZSBkZWJ1Z2dlci4KKyAgIElmIGhleGFkZWNpbWFsIGlzIGdvaW5nIHRvIGJlIGZlZCBpbnRvIEdOVSBiYywgcmVtZW1iZXIgdG8gdXNlIC0xNgorICAgYmVjYXVzZSBiYyByZXF1aXJlcyB1cHBlciBjYXNlLiAgKi8KKworaW50ICBtcF90cmFjZV9iYXNlID0gMTA7CisKKwordm9pZAorbXBfdHJhY2Vfc3RhcnQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIGlmIChuYW1lICE9IE5VTEwgJiYgbmFtZVswXSAhPSAnXDAnKQorICAgIHByaW50ZiAoIiVzPSIsIG5hbWUpOworCisgIHN3aXRjaCAoQUJTIChtcF90cmFjZV9iYXNlKSkgeworICBjYXNlICAyOiBwcmludGYgKCJiaW46Iik7ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICBjYXNlICA4OiBwcmludGYgKCJvY3Q6Iik7ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICBjYXNlIDEwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICBjYXNlIDE2OiBwcmludGYgKCIweCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICBkZWZhdWx0OiBwcmludGYgKCJiYXNlJWQ6IiwgQUJTIChtcF90cmFjZV9iYXNlKSk7IGJyZWFrOworICB9Cit9CisKKy8qIFByaW50ICJuYW1lPXZhbHVlXG4iIHRvIHN0ZG91dCBmb3IgYW4gbXBxX3QgdmFsdWUuICAqLwordm9pZAorbXBxX3RyYWNlIChjb25zdCBjaGFyICpuYW1lLCBtcHFfc3JjcHRyIHEpCit7CisgIG1wX3RyYWNlX3N0YXJ0IChuYW1lKTsKKyAgaWYgKHEgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGYgKCJOVUxMXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbXBxX291dF9zdHIgKHN0ZG91dCwgbXBfdHJhY2VfYmFzZSwgcSk7CisgIHByaW50ZiAoIlxuIik7Cit9CisKKworLyogUHJpbnQgIm5hbWU9dmFsdWVcbiIgdG8gc3Rkb3V0IGZvciBhbiBtcHpfdCB2YWx1ZS4gICovCit2b2lkCittcHpfdHJhY2UgKGNvbnN0IGNoYXIgKm5hbWUsIG1wel9zcmNwdHIgeikKK3sKKyAgbXBxX3QgICAgICBxOworICBtcF9saW1iX3QgIG9uZTsKKworICBpZiAoeiA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1wcV90cmFjZSAobmFtZSwgTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHEtPl9tcF9udW0uX21wX2FsbG9jID0gQUxMT0Moeik7CisgIHEtPl9tcF9udW0uX21wX3NpemUgPSBTSVooeik7CisgIHEtPl9tcF9udW0uX21wX2QgPSBQVFIoeik7CisKKyAgb25lID0gMTsKKyAgcS0+X21wX2Rlbi5fbXBfYWxsb2MgPSAxOworICBxLT5fbXBfZGVuLl9tcF9zaXplID0gMTsKKyAgcS0+X21wX2Rlbi5fbXBfZCA9ICZvbmU7CisKKyAgbXBxX3RyYWNlKG5hbWUsIHEpOworfQorCisKKy8qIFByaW50ICJuYW1lPXZhbHVlXG4iIHRvIHN0ZG91dCBmb3IgYW4gbXBmX3QgdmFsdWUuICovCit2b2lkCittcGZfdHJhY2UgKGNvbnN0IGNoYXIgKm5hbWUsIG1wZl9zcmNwdHIgZikKK3sKKyAgbXBfdHJhY2Vfc3RhcnQgKG5hbWUpOworICBpZiAoZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZiAoIk5VTExcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtcGZfb3V0X3N0ciAoc3Rkb3V0LCBBQlMgKG1wX3RyYWNlX2Jhc2UpLCAwLCBmKTsKKyAgcHJpbnRmICgiXG4iKTsKK30KKworCisvKiBQcmludCAibmFtZW51bT12YWx1ZVxuIiB0byBzdGRvdXQgZm9yIGFuIG1wel90IHZhbHVlLgorICAgIm5hbWUiIHNob3VsZCBoYXZlIGEgIiVkIiB0byBnZXQgdGhlIG51bWJlci4gKi8KK3ZvaWQKK21wel90cmFjZW4gKGNvbnN0IGNoYXIgKm5hbWUsIGludCBudW0sIG1wel9zcmNwdHIgeikKK3sKKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiBuYW1lWzBdICE9ICdcMCcpCisgICAgeworICAgICAgcHJpbnRmIChuYW1lLCBudW0pOworICAgICAgcHV0Y2hhciAoJz0nKTsKKyAgICB9CisgIG1wel90cmFjZSAoTlVMTCwgeik7Cit9CisKKworLyogUHJpbnQgIm5hbWU9dmFsdWVcbiIgdG8gc3Rkb3V0IGZvciBhbiBtcG4gc3R5bGUgcHRyLHNpemUuICovCit2b2lkCittcG5fdHJhY2UgKGNvbnN0IGNoYXIgKm5hbWUsIG1wX3NyY3B0ciBwdHIsIG1wX3NpemVfdCBzaXplKQoreworICBtcHpfdCAgejsKKyAgaWYgKHB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIG1wel90cmFjZSAobmFtZSwgTlVMTCk7CisgICAgICByZXR1cm47CisgICAgfQorICBNUE5fTk9STUFMSVpFIChwdHIsIHNpemUpOworICBQVFIoeikgPSAobXBfcHRyKSBwdHI7CisgIFNJWih6KSA9IHNpemU7CisgIEFMTE9DKHopID0gc2l6ZTsKKyAgbXB6X3RyYWNlIChuYW1lLCB6KTsKK30KKworLyogUHJpbnQgIm5hbWU9dmFsdWVcbiIgdG8gc3Rkb3V0IGZvciBhIGxpbWIsIG5haWwgZG9lc24ndCBoYXZlIHRvIGJlIHplcm8uICovCit2b2lkCittcF9saW1iX3RyYWNlIChjb25zdCBjaGFyICpuYW1lLCBtcF9saW1iX3QgbikKK3sKKyNpZiBHTVBfTkFJTF9CSVRTICE9IDAKKyAgbXBfbGltYl90ICBhWzJdOworICBhWzBdID0gbiAmIEdNUF9OVU1CX01BU0s7CisgIGFbMV0gPSBuID4+IEdNUF9OVU1CX0JJVFM7CisgIG1wbl90cmFjZSAobmFtZSwgYSwgKG1wX3NpemVfdCkgMik7CisjZWxzZQorICBtcG5fdHJhY2UgKG5hbWUsICZuLCAobXBfc2l6ZV90KSAxKTsKKyNlbmRpZgorfQorCisKKy8qIFByaW50ICJuYW1lbnVtPXZhbHVlXG4iIHRvIHN0ZG91dCBmb3IgYW4gbXBuIHN0eWxlIHB0cixzaXplLgorICAgIm5hbWUiIHNob3VsZCBoYXZlIGEgIiVkIiB0byBnZXQgdGhlIG51bWJlci4gICovCit2b2lkCittcG5fdHJhY2VuIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbnVtLCBtcF9zcmNwdHIgcHRyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiBuYW1lWzBdICE9ICdcMCcpCisgICAgeworICAgICAgcHJpbnRmIChuYW1lLCBudW0pOworICAgICAgcHV0Y2hhciAoJz0nKTsKKyAgICB9CisgIG1wbl90cmFjZSAoTlVMTCwgcHRyLCBzaXplKTsKK30KKworCisvKiBQcmludCAibmFtZW51bT12YWx1ZVxuIiB0byBzdGRvdXQgZm9yIGFuIGFycmF5IG9mIG1wbiBzdHlsZSBwdHIsc2l6ZS4KKworICAgImEiIGlzIGFuIGFycmF5IG9mIHBvaW50ZXJzLCBlYWNoIGFbaV0gaXMgYSBwb2ludGVyIHRvICJzaXplIiBtYW55IGxpbWJzLgorICAgVGhlIGZvcm1hbCBwYXJhbWV0ZXIgaXNuJ3QgbXBfc3JjcHRyIGJlY2F1c2UgdGhhdCBjYXVzZXMgY29tcGlsZXIKKyAgIHdhcm5pbmdzLCBidXQgdGhlIHZhbHVlcyBhcmVuJ3QgbW9kaWZpZWQuCisKKyAgICJuYW1lIiBzaG91bGQgaGF2ZSBhIHByaW50ZiBzdHlsZSAiJWQiIHRvIGdldCB0aGUgYXJyYXkgaW5kZXguICAqLworCit2b2lkCittcG5fdHJhY2VhIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBtcF9wdHIgKmEsIGludCBjb3VudCwgbXBfc2l6ZV90IHNpemUpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICBtcG5fdHJhY2VuIChuYW1lLCBpLCBhW2ldLCBzaXplKTsKK30KKworCisvKiBQcmludCAidmFsdWVcbiIgdG8gYSBmaWxlIGZvciBhbiBtcHpfdCB2YWx1ZS4gIEFueSBwcmV2aW91cyBjb250ZW50cyBvZgorICAgdGhlIGZpbGUgYXJlIG92ZXJ3cml0dGVuLCBzbyB5b3UgbmVlZCBkaWZmZXJlbnQgZmlsZSBuYW1lcyBlYWNoIHRpbWUgdGhpcworICAgaXMgY2FsbGVkLgorCisgICBPdmVyd3JpdGluZyB0aGUgZmlsZSBpcyBhIGZlYXR1cmUsIGl0IG1lYW5zIHlvdSBnZXQgb2xkIGRhdGEgcmVwbGFjZWQKKyAgIHdoZW4geW91IHJ1biBhIHRlc3QgcHJvZ3JhbSByZXBlYXRlZGx5LiAgKi8KKwordm9pZAorbXBuX3RyYWNlX2ZpbGUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBtcF9zcmNwdHIgcHRyLCBtcF9zaXplX3Qgc2l6ZSkKK3sKKyAgRklMRSAgICpmcDsKKyAgbXB6X3QgIHo7CisKKyAgZnAgPSBmb3BlbiAoZmlsZW5hbWUsICJ3Iik7CisgIGlmIChmcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBlcnJvciAoImZvcGVuIik7CisgICAgICBhYm9ydCgpOworICAgIH0KKworICBNUE5fTk9STUFMSVpFIChwdHIsIHNpemUpOworICBQVFIoeikgPSAobXBfcHRyKSBwdHI7CisgIFNJWih6KSA9IChpbnQpIHNpemU7CisKKyAgbXB6X291dF9zdHIgKGZwLCBtcF90cmFjZV9iYXNlLCB6KTsKKyAgZnByaW50ZiAoZnAsICJcbiIpOworCisgIGlmIChmZXJyb3IgKGZwKSB8fCBmY2xvc2UgKGZwKSAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoImVycm9yIHdyaXRpbmcgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorfQorCisKKy8qIFByaW50ICJ2YWx1ZVxuIiB0byBhIHNldCBvZiBmaWxlcywgb25lIGZpbGUgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgZ2l2ZW4KKyAgIGFycmF5IG9mIG1wbiBzdHlsZSBwdHIsc2l6ZS4gIEFueSBwcmV2aW91cyBjb250ZW50cyBvZiB0aGUgZmlsZXMgYXJlCisgICBvdmVyd3JpdHRlbiwgc28geW91IG5lZWQgZGlmZmVyZW50IGZpbGUgbmFtZXMgZWFjaCB0aW1lIHRoaXMgaXMgY2FsbGVkLgorICAgRWFjaCBmaWxlIGlzICJmaWxlbmFtZU4iIHdoZXJlIE4gaXMgMCB0byBjb3VudC0xLgorCisgICAiYSIgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMsIGVhY2ggYVtpXSBpcyBhIHBvaW50ZXIgdG8gInNpemUiIG1hbnkgbGltYnMuCisgICBUaGUgZm9ybWFsIHBhcmFtZXRlciBpc24ndCBtcF9zcmNwdHIgYmVjYXVzZSB0aGF0IGNhdXNlcyBjb21waWxlcgorICAgd2FybmluZ3MsIGJ1dCB0aGUgdmFsdWVzIGFyZW4ndCBtb2RpZmllZC4KKworICAgT3ZlcndyaXRpbmcgdGhlIGZpbGVzIGlzIGEgZmVhdHVyZSwgaXQgbWVhbnMgeW91IGdldCBvbGQgZGF0YSByZXBsYWNlZAorICAgd2hlbiB5b3UgcnVuIGEgdGVzdCBwcm9ncmFtIHJlcGVhdGVkbHkuICBUaGUgb3V0cHV0IHN0eWxlIGlzbid0CisgICBwYXJ0aWN1bGFybHkgcHJldHR5LCBidXQgYXQgbGVhc3QgaXQgZ2V0cyBzb21ldGhpbmcgb3V0LCBhbmQgeW91IGNhbiBjYXQKKyAgIHRoZSBmaWxlcyBpbnRvIGJjLCBvciB3aGF0ZXZlci4gKi8KKwordm9pZAorbXBuX3RyYWNlYV9maWxlIChjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgbXBfcHRyICphLCBpbnQgY291bnQsIG1wX3NpemVfdCBzaXplKQoreworICBjaGFyICAqczsKKyAgaW50ICAgaTsKKyAgVE1QX0RFQ0w7CisKKyAgVE1QX01BUks7CisgIHMgPSAoY2hhciAqKSBUTVBfQUxMT0MgKHN0cmxlbiAoZmlsZW5hbWUpICsgNTApOworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHNwcmludGYgKHMsICIlcyVkIiwgZmlsZW5hbWUsIGkpOworICAgICAgbXBuX3RyYWNlX2ZpbGUgKHMsIGFbaV0sIHNpemUpOworICAgIH0KKworICBUTVBfRlJFRTsKK30KKworCit2b2lkCitieXRlX3RyYWNlIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpwdHIsIG1wX3NpemVfdCBzaXplKQoreworICBjb25zdCBjaGFyICpmbXQ7CisgIG1wX3NpemVfdCAgaTsKKworICBtcF90cmFjZV9zdGFydCAobmFtZSk7CisKKyAgc3dpdGNoIChtcF90cmFjZV9iYXNlKSB7CisgIGNhc2UgICA4OiBmbXQgPSAiICVvIjsgYnJlYWs7CisgIGNhc2UgIDEwOiBmbXQgPSAiICVkIjsgYnJlYWs7CisgIGNhc2UgIDE2OiBmbXQgPSAiICV4IjsgYnJlYWs7CisgIGNhc2UgLTE2OiBmbXQgPSAiICVYIjsgYnJlYWs7CisgIGRlZmF1bHQ6IHByaW50ZiAoIk9vcHMsIHVuc3VwcG9ydGVkIGJhc2UgaW4gYnl0ZV90cmFjZVxuIik7IGFib3J0ICgpOyBicmVhazsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgcHJpbnRmIChmbXQsIChpbnQpICgodW5zaWduZWQgY2hhciAqKSBwdHIpW2ldKTsKKyAgcHJpbnRmICgiXG4iKTsKK30KKwordm9pZAorYnl0ZV90cmFjZW4gKGNvbnN0IGNoYXIgKm5hbWUsIGludCBudW0sIGNvbnN0IHZvaWQgKnB0ciwgbXBfc2l6ZV90IHNpemUpCit7CisgIGlmIChuYW1lICE9IE5VTEwgJiYgbmFtZVswXSAhPSAnXDAnKQorICAgIHsKKyAgICAgIHByaW50ZiAobmFtZSwgbnVtKTsKKyAgICAgIHB1dGNoYXIgKCc9Jyk7CisgICAgfQorICBieXRlX3RyYWNlIChOVUxMLCBwdHIsIHNpemUpOworfQorCisKK3ZvaWQKK2RfdHJhY2UgKGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSBkKQoreworICB1bmlvbiB7CisgICAgZG91YmxlICAgICAgICAgZDsKKyAgICB1bnNpZ25lZCBjaGFyICBiW3NpemVvZihkb3VibGUpXTsKKyAgfSB1OworICBpbnQgIGk7CisKKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiBuYW1lWzBdICE9ICdcMCcpCisgICAgcHJpbnRmICgiJXM9IiwgbmFtZSk7CisKKyAgdS5kID0gZDsKKyAgcHJpbnRmICgiWyIpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh1LmIpOyBpKyspCisgICAgeworICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgcHJpbnRmICgiICIpOworICAgICAgcHJpbnRmICgiJTAyWCIsIChpbnQpIHUuYltpXSk7CisgICAgfQorICBwcmludGYgKCJdICUuMjBnXG4iLCBkKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3g4NmNhbGwuYXNtIGIvdGVzdHMveDg2Y2FsbC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5Zjc4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3g4NmNhbGwuYXNtCkBAIC0wLDAgKzEsMTU0IEBACitkbmwgIHg4NiBjYWxsaW5nIGNvbnZlbnRpb25zIGNoZWNraW5nLgorCitkbmwgIENvcHlyaWdodCAyMDAwLCAyMDAzLCAyMDEwLCAyMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitkbmwgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitkbmwgIFRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CitkbmwgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworZG5sICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUKK2RubCAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworZG5sICBUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKK2RubCAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorZG5sICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsCitkbmwgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK2RubCAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK2RubCAgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZS4gIElmIG5vdCwgc2VlCitkbmwgIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorCisKK2RubCAgVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgY29kZSBhdHRlbXB0cyB0byBrZWVwIHRoZSBjYWxsL3JldHVybgorZG5sICBwcmVkaWN0aW9uIHN0YWNrIHZhbGlkLCBidXQgbWF0Y2hpbmcgY2FsbHMgYW5kIHJldHVybnMuCisKK2luY2x1ZGUoYGNvbmZpZy5tNCcpCisKKworQyB2b2lkIHg4Nl9mbGRjdyAodW5zaWduZWQgc2hvcnQgY3cpOworQworQyBFeGVjdXRlIGFuIGZsZGN3LCBzZXR0aW5nIHRoZSB4ODcgY29udHJvbCB3b3JkIHRvIGN3LgorCitQUk9MT0dVRSh4ODZfZmxkY3cpCisJZmxkY3cJNCglZXNwKQorCXJldAorRVBJTE9HVUUoKQorCisKK0MgdW5zaWduZWQgc2hvcnQgeDg2X2ZzdGN3ICh2b2lkKTsKK0MKK0MgRXhlY3V0ZSBhbiBmc3RjdywgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHg4NyBjb250cm9sIHdvcmQuCisKK1BST0xPR1VFKHg4Nl9mc3RjdykKKwl4b3IJJWVheCwgJWVheAorCXB1c2gJJWVheAorCWZzdGN3CSglZXNwKQorCXBvcAklZWF4CisJcmV0CitFUElMT0dVRSgpCisKKworZG5sICBJbnN0cnVtZW50ZWQgcHJvZmlsaW5nIGRvZXNuJ3QgY29tZSBvdXQgcXVpdGUgcmlnaHQgYmVsb3csIHNpbmNlIHdlIGRvbid0CitkbmwgIGRvIGFuIGFjdHVhbCAicmV0Ii4gIFRoZXJlJ3Mgb25seSBhIGZldyBpbnN0cnVjdGlvbnMgaGVyZSwgc28gdGhlcmUncyBubworZG5sICBncmVhdCBuZWVkIHRvIGdldCB0aGVtIHNlcGFyYXRlbHkgYWNjb3VudGVkLCBqdXN0IGxldCB0aGVtIGdldCBhdHRyaWJ1dGVkCitkbmwgIHRvIHRoZSBjYWxsZXIuICBGSVhNRSB0aGlzIGNvbW1lbnQgbWlnaHQgbm8gbG9uZ2VyIGJlIHRydWUuCisKK2lmZWxzZShXQU5UX1BST0ZJTElORyxpbnN0cnVtZW50LAorYGRlZmluZShgV0FOVF9QUk9GSUxJTkcnLG5vKScpCisKKworQyBpbnQgY2FsbGluZ19jb252ZW50aW9ucyAoLi4uKTsKK0MKK0MgVGhlIGdsb2JhbCB2YXJpYWJsZSAiY2FsbGluZ19jb252ZW50aW9uc19mdW5jdGlvbiIgaXMgdGhlIGZ1bmN0aW9uIHRvCitDIGNhbGwsIHdpdGggdGhlIGFyZ3VtZW50cyBhcyBwYXNzZWQgaGVyZS4KK0MKK0MgUGVyaGFwcyB0aGUgZmluaXQgc2hvdWxkIGJlIGRvbmUgb25seSBpZiB0aGUgdGFncyB3b3JkIGlzbid0IGNsZWFyLCBidXQKK0Mgbm90aGluZyB1c2VzIHRoZSByb3VuZGluZyBtb2RlIG9yIGFueXRoaW5nIGF0IHRoZSBtb21lbnQuCisKK2RlZmluZShgV0FOVF9FQlgnLCBldmFsKDQqMCkoJDEpKQorZGVmaW5lKGBXQU5UX0VCUCcsIGV2YWwoNCoxKSgkMSkpCitkZWZpbmUoYFdBTlRfRVNJJywgZXZhbCg0KjIpKCQxKSkKK2RlZmluZShgV0FOVF9FREknLCBldmFsKDQqMykoJDEpKQorCitkZWZpbmUoYEpVTktfRUFYJywgZXZhbCg0KjQpKCQxKSkKK2RlZmluZShgSlVOS19FQ1gnLCBldmFsKDQqNSkoJDEpKQorZGVmaW5lKGBKVU5LX0VEWCcsIGV2YWwoNCo2KSgkMSkpCisKK2RlZmluZShgU0FWRV9FQlgnLCBldmFsKDQqNykoJDEpKQorZGVmaW5lKGBTQVZFX0VCUCcsIGV2YWwoNCo4KSgkMSkpCitkZWZpbmUoYFNBVkVfRVNJJywgZXZhbCg0KjkpKCQxKSkKK2RlZmluZShgU0FWRV9FREknLCBldmFsKDQqMTApKCQxKSkKKworZGVmaW5lKGBSRVRBRERSJywgIGV2YWwoNCoxMSkoJDEpKQorCitkZWZpbmUoYEVCWCcsCSAgIGV2YWwoNCoxMikoJDEpKQorZGVmaW5lKGBFQlAnLAkgICBldmFsKDQqMTMpKCQxKSkKK2RlZmluZShgRVNJJywJICAgZXZhbCg0KjE0KSgkMSkpCitkZWZpbmUoYEVESScsCSAgIGV2YWwoNCoxNSkoJDEpKQorZGVmaW5lKGBFRkxBR1MnLCAgIGV2YWwoNCoxNikoJDEpKQorCisKK2RlZmluZShHLAorbTRfYXNzZXJ0X251bWFyZ3MoMSkKK2BHU1lNX1BSRUZJWGAnJDEnKQorCisJVEVYVAorCUFMSUdOKDgpCitQUk9MT0dVRShjYWxsaW5nX2NvbnZlbnRpb25zKQorCUxFQSgJRyhjYWxsaW5nX2NvbnZlbnRpb25zX3ZhbHVlcyksICVlY3gpCisJcG9wCVJFVEFERFIoJWVjeCkKKworCW1vdgklZWJ4LCBTQVZFX0VCWCglZWN4KQorCW1vdgklZWJwLCBTQVZFX0VCUCglZWN4KQorCW1vdgklZXNpLCBTQVZFX0VTSSglZWN4KQorCW1vdgklZWRpLCBTQVZFX0VESSglZWN4KQorCisJQyBWYWx1ZXMgd2UgZXhwZWN0IHRvIHNlZSB1bmNoYW5nZWQsIGFzIHBlciBhbWQ2NGNoZWNrLmMKKwltb3YJV0FOVF9FQlgoJWVjeCksICVlYngKKwltb3YJV0FOVF9FQlAoJWVjeCksICVlYnAKKwltb3YJV0FOVF9FU0koJWVjeCksICVlc2kKKwltb3YJV0FOVF9FREkoJWVjeCksICVlZGkKKworCUMgVHJ5IHRvIHByb3Zva2UgYSBwcm9ibGVtIGJ5IHN0YXJ0aW5nIHdpdGgganVuayBpbiB0aGUgY2FsbGVyLXNhdmVzCisJQyByZWdpc3RlcnMsIGVzcGVjaWFsbHkgaW4gJWVheCBhbmQgJWVkeCB3aGljaCB3aWxsIGJlIHJldHVybiB2YWx1ZXMKKwltb3YJSlVOS19FQVgoJWVjeCksICVlYXgKKwltb3YJSlVOS19FRFgoJWVjeCksICVlZHgKK0MJbW92CUpVTktfRUNYKCVlY3gpLCAlZWN4CisKK2lmZGVmKGBQSUMnLGAKKwlMRUEoCUcoY2FsbGluZ19jb252ZW50aW9uc19mdW5jdGlvbiksICVlY3gpCisJY2FsbAkqKCVlY3gpCisnLGAKKwljYWxsCSpHKGNhbGxpbmdfY29udmVudGlvbnNfZnVuY3Rpb24pCisnKQorCisJTEVBKAlHKGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzKSwgJWVjeCkKKworCW1vdgklZWJ4LCBFQlgoJWVjeCkKKwltb3YJJWVicCwgRUJQKCVlY3gpCisJbW92CSVlc2ksIEVTSSglZWN4KQorCW1vdgklZWRpLCBFREkoJWVjeCkKKworCXB1c2hmCisJcG9wCSVlYngKKwltb3YJJWVieCwgRUZMQUdTKCVlY3gpCisKKwltb3YJU0FWRV9FQlgoJWVjeCksICVlYngKKwltb3YJU0FWRV9FU0koJWVjeCksICVlc2kKKwltb3YJU0FWRV9FREkoJWVjeCksICVlZGkKKwltb3YJU0FWRV9FQlAoJWVjeCksICVlYnAKKworCXB1c2gJUkVUQUREUiglZWN4KQorCitpZmRlZihgUElDJyxgCisJTEVBKAlHKGNhbGxpbmdfY29udmVudGlvbnNfZmVudiksICVlY3gpCisJZnN0ZW52CSglZWN4KQorJyxgCisJZnN0ZW52CUcoY2FsbGluZ19jb252ZW50aW9uc19mZW52KQorJykKKwlmaW5pdAorCisJcmV0CisKK0VQSUxPR1VFKCkKK0FTTV9FTkQoKQpkaWZmIC0tZ2l0IGEvdGVzdHMveDg2Y2hlY2suYyBiL3Rlc3RzL3g4NmNoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlYTViNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3g4NmNoZWNrLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIHg4NiBjYWxsaW5nIGNvbnZlbnRpb25zIGNoZWNraW5nLiAqLworCisvKgorQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlLgorCitUaGUgR05VIE1QIExpYnJhcnkgdGVzdCBzdWl0ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdAorYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwKK29yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVAgTGlicmFyeSB0ZXN0IHN1aXRlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQordXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhlIEdOVSBNUCBMaWJyYXJ5IHRlc3Qgc3VpdGUuICBJZiBub3QsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdtcC1pbXBsLmgiCisjaW5jbHVkZSAidGVzdHMuaCIKKworCisvKiBWZWN0b3IgaWYgY29uc3RhbnRzIGFuZCByZWdpc3RlciB2YWx1ZXMuICBXZSB1c2Ugb25lIHZlY3RvciB0byBhbGxvdyBhY2Nlc3MKKyAgIHZpYSBhIGJhc2UgcG9pbnRlciwgdmVyeSBiZW5lZmljaWFsIGZvciB0aGUgUElDLWVuYWJsZWQgYW1kNjRjYWxsLmFzbS4gICovCittcF9saW1iX3QgY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXNbMTddID0KK3sKKyAgQ05TVF9MSU1CKDB4MTIzNDU2NzgpLAkvKiB3YW50X2VieCAqLworICBDTlNUX0xJTUIoMHg4OUFCQ0RFRiksCS8qIHdhbnRfZWJwICovCisgIENOU1RfTElNQigweERFQURCRUVGKSwJLyogd2FudF9lc2kgKi8KKyAgQ05TVF9MSU1CKDB4RkZFRUREQ0MpLAkvKiB3YW50X2VkaSAqLworCisgIENOU1RfTElNQigweEZFRURBQkJBKSwJLyogSlVOS19FQVggKi8KKyAgQ05TVF9MSU1CKDB4QUI3OERFODkpLAkvKiBKVU5LX0VDWCAqLworICBDTlNUX0xJTUIoMHgxMjM4OTAxOCkJCS8qIEpVTktfRURYICovCisKKyAgLyogcmVzdCBvZiBhcnJheSB1c2VkIGZvciBkeW5hbWljIHZhbHVlcy4gICovCit9OworCisvKiBJbmRleCBzdGFydHMgZm9yIHZhcmlvdXMgcmVnaW9ucyBpbiBhYm92ZSB2ZWN0b3IuICAqLworI2RlZmluZSBXQU5UCTAKKyNkZWZpbmUgSlVOSwk0CisjZGVmaW5lIFNBVkUJNworI2RlZmluZSBSRVRBRERSCTExCisjZGVmaW5lIFZBTAkxMgorI2RlZmluZSBFRkxBR1MJMTYKKworCisvKiB2YWx1ZXMgdG8gY2hlY2sgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3N0cnVjdCB7CisgIHVuc2lnbmVkICBjb250cm9sOworICB1bnNpZ25lZCAgc3RhdHVzOworICB1bnNpZ25lZCAgdGFnOworICB1bnNpZ25lZCAgb3RoZXJbNF07Cit9IGNhbGxpbmdfY29udmVudGlvbnNfZmVudjsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIGV4cGVjdGVkIHZhbHVlcywgYXMgcGVyIHg4NmNhbGwuYXNtICovCisjZGVmaW5lIFZBTFVFX0VCWCAgIDB4MDEyMzQ1NjcKKyNkZWZpbmUgVkFMVUVfRVNJICAgMHg4OUFCQ0RFRgorI2RlZmluZSBWQUxVRV9FREkgICAweEZFRENCQTk4CisjZGVmaW5lIFZBTFVFX0VCUCAgIDB4NzY1NDMyMTAKKworCitjb25zdCBjaGFyICpyZWduYW1lW10gPSB7ImVieCIsICJlYnAiLCAiZXNpIiwgImVkaSJ9OworCisjZGVmaW5lIERJUl9CSVQoZWZsYWdzKSAgICgoKGVmbGFncykgJiAoMTw8MTApKSAhPSAwKQorCisKKy8qIFJldHVybiAxIGlmIG9rLCAwIGlmIG5vdCAqLworCitpbnQKK2NhbGxpbmdfY29udmVudGlvbnNfY2hlY2sgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgICpoZWFkZXIgPSAiVmlvbGF0ZWQgY2FsbGluZyBjb252ZW50aW9uczpcbiI7CisgIGludCAgcmV0ID0gMTsKKyAgaW50IGk7CisKKyNkZWZpbmUgQ0hFQ0soY2FsbHJlZywgcmVnc3RyLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgXAorICBpZiAoY2FsbHJlZyAhPSB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZiAoIiVzICAgJXMgIGdvdCAweCUwOFggd2FudCAweCUwOFhcbiIsICAgICAgXAorICAgICAgICAgICAgICBoZWFkZXIsIHJlZ3N0ciwgY2FsbHJlZywgdmFsdWUpOyAgICAgICAgICBcCisgICAgICBoZWFkZXIgPSAiIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgIENIRUNLIChjYWxsaW5nX2NvbnZlbnRpb25zX3ZhbHVlc1tWQUwraV0sIHJlZ25hbWVbaV0sIGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzW1dBTlQraV0pOworICAgIH0KKworICBpZiAoRElSX0JJVCAoY2FsbGluZ19jb252ZW50aW9uc192YWx1ZXNbRUZMQUdTXSkgIT0gMCkKKyAgICB7CisgICAgICBwcmludGYgKCIlcyAgIGVmbGFncyBkaXIgYml0ICBnb3QgJWQgd2FudCAwXG4iLAorICAgICAgICAgICAgICBoZWFkZXIsIERJUl9CSVQgKGNhbGxpbmdfY29udmVudGlvbnNfdmFsdWVzW0VGTEFHU10pKTsKKyAgICAgIGhlYWRlciA9ICIiOworICAgICAgcmV0ID0gMDsKKyAgICB9CisKKyAgaWYgKChjYWxsaW5nX2NvbnZlbnRpb25zX2ZlbnYudGFnICYgMHhGRkZGKSAhPSAweEZGRkYpCisgICAgeworICAgICAgcHJpbnRmICgiJXMgICBmcHUgdGFncyAgZ290IDB4JVggd2FudCAweEZGRkZcbiIsCisgICAgICAgICAgICAgIGhlYWRlciwgY2FsbGluZ19jb252ZW50aW9uc19mZW52LnRhZyAmIDB4RkZGRik7CisgICAgICBoZWFkZXIgPSAiIjsKKyAgICAgIHJldCA9IDA7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS92ZXJzaW9uLmMgYi92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3YzMyYQotLS0gL2Rldi9udWxsCisrKyBiL3ZlcnNpb24uYwpAQCAtMCwwICsxLDMzIEBACisvKiBnbXBfdmVyc2lvbiAtLSB2ZXJzaW9uIG51bWJlciBjb21waWxlZCBpbnRvIHRoZSBsaWJyYXJ5LgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OS0yMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyOgorCisgICogdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK29yCisKKyAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgICBsYXRlciB2ZXJzaW9uLgorCitvciBib3RoIGluIHBhcmFsbGVsLCBhcyBoZXJlLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQgdGhlCitHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIE1QIExpYnJhcnkuICBJZiBub3QsCitzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaW5jbHVkZSAiZ21wLWltcGwuaCIKKworY29uc3QgY2hhciAqIGNvbnN0IGdtcF92ZXJzaW9uID0gVkVSU0lPTjsK